]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: add state tracking for legacy serdes power state
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 3 Feb 2026 10:01:19 +0000 (10:01 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 5 Feb 2026 04:51:37 +0000 (20:51 -0800)
Avoid calling the serdes_powerdown() method if we have not had a
preceeding successful call to the serdes_powerup() method. This
avoids unbalancing refcounted resources that may be used in the
these platform glue serdes methods.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vnDDj-00000007Xx3-2xZ0@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 012b0a477255df73b2e145b62e09eeb2133e827a..5bd97aaaba867b3e9b1b08893d9d2d369323b990 100644 (file)
@@ -303,6 +303,7 @@ struct stmmac_priv {
        bool eee_enabled;
        bool eee_active;
        bool eee_sw_timer_en;
+       bool legacy_serdes_is_powered;
        unsigned int mode;
        unsigned int chain_mode;
        int extend_desc;
index 93d18709bc13b58371233ee717521234f3089093..9efdde9152292882336c83e40d47b2b162cbf938 100644 (file)
@@ -884,8 +884,10 @@ static void stmmac_release_ptp(struct stmmac_priv *priv)
 
 static void stmmac_legacy_serdes_power_down(struct stmmac_priv *priv)
 {
-       if (priv->plat->serdes_powerdown)
+       if (priv->plat->serdes_powerdown && priv->legacy_serdes_is_powered)
                priv->plat->serdes_powerdown(priv->dev, priv->plat->bsp_priv);
+
+       priv->legacy_serdes_is_powered = false;
 }
 
 static int stmmac_legacy_serdes_power_up(struct stmmac_priv *priv)
@@ -898,6 +900,8 @@ static int stmmac_legacy_serdes_power_up(struct stmmac_priv *priv)
        ret = priv->plat->serdes_powerup(priv->dev, priv->plat->bsp_priv);
        if (ret < 0)
                netdev_err(priv->dev, "SerDes powerup failed\n");
+       else
+               priv->legacy_serdes_is_powered = true;
 
        return ret;
 }