]> 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:25:03 +0000 (13:25 +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 ae1cf2ead9a9688b17cb995aa6d80ccedfe62265..1c6b7808a100da21dd8f7a715de086ef1d2ec6a3 100644 (file)
@@ -1951,7 +1951,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);
@@ -2622,7 +2626,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,
@@ -2636,6 +2644,8 @@ static int bcm_sysport_probe(struct platform_device *pdev)
 
        return 0;
 
+err_deregister_netdev:
+       unregister_netdev(dev);
 err_deregister_notifier:
        unregister_dsa_notifier(&priv->dsa_notifier);
 err_deregister_fixed_link:
@@ -2807,7 +2817,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);