Skip to content

Commit b032ae5

Browse files
vmordanPaolo Abeni
authored andcommitted
marvell: pxa168_eth: fix call balance of pep->clk handling routines
If the clock pep->clk was not enabled in pxa168_eth_probe, it should not be disabled in any path. Conversely, if it was enabled in pxa168_eth_probe, it must be disabled in all error paths to ensure proper cleanup. Use the devm_clk_get_enabled helper function to ensure proper call balance for pep->clk. Found by Linux Verification Center (linuxtesting.org) with Klever. Fixes: a49f37e ("net: add Fast Ethernet driver for PXA168.") Signed-off-by: Vitalii Mordan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
1 parent 9cc8d0e commit b032ae5

File tree

1 file changed

+4
-10
lines changed

1 file changed

+4
-10
lines changed

drivers/net/ethernet/marvell/pxa168_eth.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,18 +1394,15 @@ static int pxa168_eth_probe(struct platform_device *pdev)
13941394

13951395
printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
13961396

1397-
clk = devm_clk_get(&pdev->dev, NULL);
1397+
clk = devm_clk_get_enabled(&pdev->dev, NULL);
13981398
if (IS_ERR(clk)) {
1399-
dev_err(&pdev->dev, "Fast Ethernet failed to get clock\n");
1399+
dev_err(&pdev->dev, "Fast Ethernet failed to get and enable clock\n");
14001400
return -ENODEV;
14011401
}
1402-
clk_prepare_enable(clk);
14031402

14041403
dev = alloc_etherdev(sizeof(struct pxa168_eth_private));
1405-
if (!dev) {
1406-
err = -ENOMEM;
1407-
goto err_clk;
1408-
}
1404+
if (!dev)
1405+
return -ENOMEM;
14091406

14101407
platform_set_drvdata(pdev, dev);
14111408
pep = netdev_priv(dev);
@@ -1523,8 +1520,6 @@ static int pxa168_eth_probe(struct platform_device *pdev)
15231520
mdiobus_free(pep->smi_bus);
15241521
err_netdev:
15251522
free_netdev(dev);
1526-
err_clk:
1527-
clk_disable_unprepare(clk);
15281523
return err;
15291524
}
15301525

@@ -1542,7 +1537,6 @@ static void pxa168_eth_remove(struct platform_device *pdev)
15421537
if (dev->phydev)
15431538
phy_disconnect(dev->phydev);
15441539

1545-
clk_disable_unprepare(pep->clk);
15461540
mdiobus_unregister(pep->smi_bus);
15471541
mdiobus_free(pep->smi_bus);
15481542
unregister_netdev(dev);

0 commit comments

Comments
 (0)