]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
eth: bcmsysport: fix call balance of priv->clk handling routines
authorVitalii Mordan <mordan@ispras.ru>
Fri, 27 Dec 2024 12:30:07 +0000 (15:30 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2025 12:28:46 +0000 (13:28 +0100)
[ Upstream commit b255ef45fcc2141c1bf98456796abb956d843a27 ]

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: 31bc72d97656 ("net: systemport: fetch and use clock resources")
Signed-off-by: Vitalii Mordan <mordan@ispras.ru>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20241227123007.2333397-1-mordan@ispras.ru
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/broadcom/bcmsysport.c

index 8962bd6349d4b9826f5111a55ab4c301d69ad681..fa140c5175a65922166776bb7bf39f6aa74d81b8 100644 (file)
@@ -1956,7 +1956,11 @@ static int bcm_sysport_open(struct net_device *dev)
        unsigned int i;
        int ret;
 
-       clk_prepare_enable(priv->clk);
+       ret = clk_prepare_enable(priv->clk);
+       if (ret) {
+               netdev_err(dev, "could not enable priv clock\n");
+               return ret;
+       }
 
        /* Reset UniMAC */
        umac_reset(priv);
@@ -2618,7 +2622,11 @@ static int bcm_sysport_probe(struct platform_device *pdev)
                goto err_deregister_notifier;
        }
 
-       clk_prepare_enable(priv->clk);
+       ret = clk_prepare_enable(priv->clk);
+       if (ret) {
+               dev_err(&pdev->dev, "could not enable priv clock\n");
+               goto err_deregister_netdev;
+       }
 
        priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;
        dev_info(&pdev->dev,
@@ -2632,6 +2640,8 @@ static int bcm_sysport_probe(struct platform_device *pdev)
 
        return 0;
 
+err_deregister_netdev:
+       unregister_netdev(dev);
 err_deregister_notifier:
        unregister_netdevice_notifier(&priv->netdev_notifier);
 err_deregister_fixed_link:
@@ -2803,7 +2813,12 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)
        if (!netif_running(dev))
                return 0;
 
-       clk_prepare_enable(priv->clk);
+       ret = clk_prepare_enable(priv->clk);
+       if (ret) {
+               netdev_err(dev, "could not enable priv clock\n");
+               return ret;
+       }
+
        if (priv->wolopts)
                clk_disable_unprepare(priv->wol_clk);