Skip to content

Commit 09f012e

Browse files
andy-shevdavem330
authored andcommitted
stmmac: intel: Fix clock handling on error and remove paths
clk_prepare_enable() might fail, we have to check its returned value. Besides that we have to call clk_disable_unprepare() on the error and remove paths. Do above in the dwmac-intel driver. While at it, remove leftover in stmmac_pci and remove unneeded condition for NULL-aware clk_unregister_fixed_rate() call. Fixes: 58da0cf ("net: stmmac: create dwmac-intel.c to contain all Intel platform") Cc: Voon Weifeng <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 801eb05 commit 09f012e

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ static void common_default_data(struct plat_stmmacenet_data *plat)
252252
static int intel_mgbe_common_data(struct pci_dev *pdev,
253253
struct plat_stmmacenet_data *plat)
254254
{
255+
int ret;
255256
int i;
256257

257258
plat->clk_csr = 5;
@@ -324,7 +325,12 @@ static int intel_mgbe_common_data(struct pci_dev *pdev,
324325
dev_warn(&pdev->dev, "Fail to register stmmac-clk\n");
325326
plat->stmmac_clk = NULL;
326327
}
327-
clk_prepare_enable(plat->stmmac_clk);
328+
329+
ret = clk_prepare_enable(plat->stmmac_clk);
330+
if (ret) {
331+
clk_unregister_fixed_rate(plat->stmmac_clk);
332+
return ret;
333+
}
328334

329335
/* Set default value for multicast hash bins */
330336
plat->multicast_filter_bins = HASH_TABLE_SIZE;
@@ -657,7 +663,13 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
657663
res.wol_irq = pdev->irq;
658664
res.irq = pdev->irq;
659665

660-
return stmmac_dvr_probe(&pdev->dev, plat, &res);
666+
ret = stmmac_dvr_probe(&pdev->dev, plat, &res);
667+
if (ret) {
668+
clk_disable_unprepare(plat->stmmac_clk);
669+
clk_unregister_fixed_rate(plat->stmmac_clk);
670+
}
671+
672+
return ret;
661673
}
662674

663675
/**
@@ -675,8 +687,8 @@ static void intel_eth_pci_remove(struct pci_dev *pdev)
675687

676688
stmmac_dvr_remove(&pdev->dev);
677689

678-
if (priv->plat->stmmac_clk)
679-
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
690+
clk_disable_unprepare(priv->plat->stmmac_clk);
691+
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
680692

681693
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
682694
if (pci_resource_len(pdev, i) == 0)

drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,10 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
217217
*/
218218
static void stmmac_pci_remove(struct pci_dev *pdev)
219219
{
220-
struct net_device *ndev = dev_get_drvdata(&pdev->dev);
221-
struct stmmac_priv *priv = netdev_priv(ndev);
222220
int i;
223221

224222
stmmac_dvr_remove(&pdev->dev);
225223

226-
if (priv->plat->stmmac_clk)
227-
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
228-
229224
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
230225
if (pci_resource_len(pdev, i) == 0)
231226
continue;

0 commit comments

Comments
 (0)