Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'net-stmmac-fix-serdes-power-methods'

Russell King says:

====================
net: stmmac: fix serdes power methods

The stmmac serdes powerup/powerdown methods are not guaranteed to be
called in a balancing fashion, but these are used to call the generic
PHY subsystem's phy_power_up() and phy_power_down() methods which do
require balanced calls.

This series addresses this by making the stmmac serdes methods balanced.
====================

Link: https://patch.msgid.link/aYHHWm5UkD1JVa7D@shell.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+41 -25
+1
drivers/net/ethernet/stmicro/stmmac/stmmac.h
··· 303 303 bool eee_enabled; 304 304 bool eee_active; 305 305 bool eee_sw_timer_en; 306 + bool legacy_serdes_is_powered; 306 307 unsigned int mode; 307 308 unsigned int chain_mode; 308 309 int extend_desc;
+40 -25
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 882 882 clk_disable_unprepare(priv->plat->clk_ptp_ref); 883 883 } 884 884 885 + static void stmmac_legacy_serdes_power_down(struct stmmac_priv *priv) 886 + { 887 + if (priv->plat->serdes_powerdown && priv->legacy_serdes_is_powered) 888 + priv->plat->serdes_powerdown(priv->dev, priv->plat->bsp_priv); 889 + 890 + priv->legacy_serdes_is_powered = false; 891 + } 892 + 893 + static int stmmac_legacy_serdes_power_up(struct stmmac_priv *priv) 894 + { 895 + int ret; 896 + 897 + if (!priv->plat->serdes_powerup) 898 + return 0; 899 + 900 + ret = priv->plat->serdes_powerup(priv->dev, priv->plat->bsp_priv); 901 + if (ret < 0) 902 + netdev_err(priv->dev, "SerDes powerup failed\n"); 903 + else 904 + priv->legacy_serdes_is_powered = true; 905 + 906 + return ret; 907 + } 908 + 885 909 /** 886 910 * stmmac_mac_flow_ctrl - Configure flow control in all queues 887 911 * @priv: driver private structure ··· 1005 981 u32 old_ctrl, ctrl; 1006 982 int ret; 1007 983 1008 - if ((priv->plat->flags & STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP) && 1009 - priv->plat->serdes_powerup) 1010 - priv->plat->serdes_powerup(priv->dev, priv->plat->bsp_priv); 984 + if (priv->plat->flags & STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP) 985 + stmmac_legacy_serdes_power_up(priv); 1011 986 1012 987 old_ctrl = readl(priv->ioaddr + MAC_CTRL_REG); 1013 988 ctrl = old_ctrl & ~priv->hw->link.speed_mask; ··· 4134 4111 4135 4112 stmmac_reset_queues_param(priv); 4136 4113 4137 - if (!(priv->plat->flags & STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP) && 4138 - priv->plat->serdes_powerup) { 4139 - ret = priv->plat->serdes_powerup(dev, priv->plat->bsp_priv); 4140 - if (ret < 0) { 4141 - netdev_err(priv->dev, "%s: Serdes powerup failed\n", 4142 - __func__); 4143 - goto init_error; 4144 - } 4145 - } 4146 - 4147 4114 ret = stmmac_hw_setup(dev); 4148 4115 if (ret < 0) { 4149 4116 netdev_err(priv->dev, "%s: Hw setup failed\n", __func__); ··· 4189 4176 if (ret) 4190 4177 goto err_runtime_pm; 4191 4178 4179 + if (!(priv->plat->flags & STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP)) { 4180 + ret = stmmac_legacy_serdes_power_up(priv); 4181 + if (ret < 0) 4182 + goto err_disconnect_phy; 4183 + } 4184 + 4192 4185 ret = __stmmac_open(dev, dma_conf); 4193 4186 if (ret) 4194 - goto err_disconnect_phy; 4187 + goto err_serdes; 4195 4188 4196 4189 kfree(dma_conf); 4197 4190 ··· 4206 4187 4207 4188 return ret; 4208 4189 4190 + err_serdes: 4191 + stmmac_legacy_serdes_power_down(priv); 4209 4192 err_disconnect_phy: 4210 4193 phylink_disconnect_phy(priv->phylink); 4211 4194 err_runtime_pm: ··· 4242 4221 /* Release and free the Rx/Tx resources */ 4243 4222 free_dma_desc_resources(priv, &priv->dma_conf); 4244 4223 4245 - /* Powerdown Serdes if there is */ 4246 - if (priv->plat->serdes_powerdown) 4247 - priv->plat->serdes_powerdown(dev, priv->plat->bsp_priv); 4248 - 4249 4224 stmmac_release_ptp(priv); 4250 4225 4251 4226 if (stmmac_fpe_supported(priv)) ··· 4267 4250 4268 4251 __stmmac_release(dev); 4269 4252 4253 + stmmac_legacy_serdes_power_down(priv); 4270 4254 phylink_disconnect_phy(priv->phylink); 4271 4255 pm_runtime_put(priv->device); 4272 4256 ··· 8148 8130 /* Stop TX/RX DMA */ 8149 8131 stmmac_stop_all_dma(priv); 8150 8132 8151 - if (priv->plat->serdes_powerdown) 8152 - priv->plat->serdes_powerdown(ndev, priv->plat->bsp_priv); 8133 + stmmac_legacy_serdes_power_down(priv); 8153 8134 8154 8135 /* Enable Power down mode by programming the PMT regs */ 8155 8136 if (priv->wolopts) { ··· 8250 8233 stmmac_mdio_reset(priv->mii); 8251 8234 } 8252 8235 8253 - if (!(priv->plat->flags & STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP) && 8254 - priv->plat->serdes_powerup) { 8255 - ret = priv->plat->serdes_powerup(ndev, 8256 - priv->plat->bsp_priv); 8257 - 8236 + if (!(priv->plat->flags & STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP)) { 8237 + ret = stmmac_legacy_serdes_power_up(priv); 8258 8238 if (ret < 0) 8259 8239 return ret; 8260 8240 } ··· 8273 8259 ret = stmmac_hw_setup(ndev); 8274 8260 if (ret < 0) { 8275 8261 netdev_err(priv->dev, "%s: Hw setup failed\n", __func__); 8262 + stmmac_legacy_serdes_power_down(priv); 8276 8263 mutex_unlock(&priv->lock); 8277 8264 rtnl_unlock(); 8278 8265 return ret;