Skip to content

Commit d5ea3a4

Browse files
vmordangregkh
authored andcommitted
eth: bcmsysport: fix call balance of priv->clk handling routines
[ Upstream commit b255ef4 ] Check the return value of clk_prepare_enable to ensure that priv->clk has been successfully enabled. If priv->clk was not enabled during bcm_sysport_probe, bcm_sysport_resume, or bcm_sysport_open, it must not be disabled in any subsequent execution paths. Fixes: 31bc72d ("net: systemport: fetch and use clock resources") Signed-off-by: Vitalii Mordan <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 930f2f9 commit d5ea3a4

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

drivers/net/ethernet/broadcom/bcmsysport.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1967,7 +1967,11 @@ static int bcm_sysport_open(struct net_device *dev)
19671967
unsigned int i;
19681968
int ret;
19691969

1970-
clk_prepare_enable(priv->clk);
1970+
ret = clk_prepare_enable(priv->clk);
1971+
if (ret) {
1972+
netdev_err(dev, "could not enable priv clock\n");
1973+
return ret;
1974+
}
19711975

19721976
/* Reset UniMAC */
19731977
umac_reset(priv);
@@ -2625,7 +2629,11 @@ static int bcm_sysport_probe(struct platform_device *pdev)
26252629
goto err_deregister_notifier;
26262630
}
26272631

2628-
clk_prepare_enable(priv->clk);
2632+
ret = clk_prepare_enable(priv->clk);
2633+
if (ret) {
2634+
dev_err(&pdev->dev, "could not enable priv clock\n");
2635+
goto err_deregister_netdev;
2636+
}
26292637

26302638
priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;
26312639
dev_info(&pdev->dev,
@@ -2639,6 +2647,8 @@ static int bcm_sysport_probe(struct platform_device *pdev)
26392647

26402648
return 0;
26412649

2650+
err_deregister_netdev:
2651+
unregister_netdev(dev);
26422652
err_deregister_notifier:
26432653
unregister_netdevice_notifier(&priv->netdev_notifier);
26442654
err_deregister_fixed_link:
@@ -2810,7 +2820,12 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)
28102820
if (!netif_running(dev))
28112821
return 0;
28122822

2813-
clk_prepare_enable(priv->clk);
2823+
ret = clk_prepare_enable(priv->clk);
2824+
if (ret) {
2825+
netdev_err(dev, "could not enable priv clock\n");
2826+
return ret;
2827+
}
2828+
28142829
if (priv->wolopts)
28152830
clk_disable_unprepare(priv->wol_clk);
28162831

0 commit comments

Comments
 (0)