summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2025-09-28 16:31:55 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2025-09-29 10:14:16 +0100
commit45d9675e072e3f5e016343e5c620ba3fd8264a43 (patch)
tree9c4329523873b60b0224580dcacb173430b59365
parentbf64b46aac774d78aa59b982d0adae4ac03c6fb8 (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.c29
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 3e5a4ff07d2c..5cf4e37e8e1e 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;