diff options
| author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2025-09-23 12:26:19 +0100 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-09-24 17:40:23 -0700 |
| commit | db299a0c09e98e5fc7e7b181d7f2b94560330a8c (patch) | |
| tree | 27a2447e47087a08eb85e633742d8bcbdefb0a09 | |
| parent | bae62989a31bde4018dc007b01d7cb408ccc91d7 (diff) | |
net: stmmac: move PHY handling out of __stmmac_open()/release()
Move the PHY attachment/detachment from the network driver out of
__stmmac_open() and __stmmac_release() into stmmac_open() and
stmmac_release() where these actions will only happen when the
interface is administratively brought up or down. It does not make
sense to detach and re-attach the PHY during a change of MTU.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/E1v11A3-0000000774G-3PKY@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 4acd180d2da8..4844d563e291 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3937,10 +3937,6 @@ static int __stmmac_open(struct net_device *dev, u32 chan; int ret; - ret = stmmac_init_phy(dev); - if (ret) - return ret; - for (int i = 0; i < MTL_MAX_TX_QUEUES; i++) if (priv->dma_conf.tx_queue[i].tbs & STMMAC_TBS_EN) dma_conf->tx_queue[i].tbs = priv->dma_conf.tx_queue[i].tbs; @@ -3990,7 +3986,6 @@ irq_error: stmmac_release_ptp(priv); init_error: - phylink_disconnect_phy(priv->phylink); return ret; } @@ -4010,18 +4005,28 @@ static int stmmac_open(struct net_device *dev) ret = pm_runtime_resume_and_get(priv->device); if (ret < 0) - goto err; + goto err_dma_resources; + + ret = stmmac_init_phy(dev); + if (ret) + goto err_runtime_pm; ret = __stmmac_open(dev, dma_conf); - if (ret) { - pm_runtime_put(priv->device); -err: - free_dma_desc_resources(priv, dma_conf); - } + if (ret) + goto err_disconnect_phy; kfree(dma_conf); return ret; + +err_disconnect_phy: + phylink_disconnect_phy(priv->phylink); +err_runtime_pm: + pm_runtime_put(priv->device); +err_dma_resources: + free_dma_desc_resources(priv, dma_conf); + kfree(dma_conf); + return ret; } static void __stmmac_release(struct net_device *dev) @@ -4038,7 +4043,6 @@ static void __stmmac_release(struct net_device *dev) /* Stop and disconnect the PHY */ phylink_stop(priv->phylink); - phylink_disconnect_phy(priv->phylink); stmmac_disable_all_queues(priv); @@ -4078,6 +4082,7 @@ static int stmmac_release(struct net_device *dev) __stmmac_release(dev); + phylink_disconnect_phy(priv->phylink); pm_runtime_put(priv->device); return 0; |
