diff options
| author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2026-02-03 10:01:19 +0000 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-02-04 20:51:37 -0800 |
| commit | 9bfcf5460b70161c161ee7041c5bb2ee6a82a219 (patch) | |
| tree | 9b79711709e41e0b236fee65310bbb8906804c47 | |
| parent | 3302126a9b2bf587aa8335c5de6bc2369aae5c46 (diff) | |
net: stmmac: add state tracking for legacy serdes power state
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>
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 6 |
2 files changed, 6 insertions, 1 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 012b0a477255..5bd97aaaba86 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -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; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 93d18709bc13..9efdde915229 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -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; } |
