mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 01:11:51 -04:00
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
bae62989a3
commit
db299a0c09
@@ -3937,10 +3937,6 @@ static int __stmmac_open(struct net_device *dev,
|
|||||||
u32 chan;
|
u32 chan;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = stmmac_init_phy(dev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
for (int i = 0; i < MTL_MAX_TX_QUEUES; i++)
|
for (int i = 0; i < MTL_MAX_TX_QUEUES; i++)
|
||||||
if (priv->dma_conf.tx_queue[i].tbs & STMMAC_TBS_EN)
|
if (priv->dma_conf.tx_queue[i].tbs & STMMAC_TBS_EN)
|
||||||
dma_conf->tx_queue[i].tbs = priv->dma_conf.tx_queue[i].tbs;
|
dma_conf->tx_queue[i].tbs = priv->dma_conf.tx_queue[i].tbs;
|
||||||
@@ -3990,7 +3986,6 @@ static int __stmmac_open(struct net_device *dev,
|
|||||||
|
|
||||||
stmmac_release_ptp(priv);
|
stmmac_release_ptp(priv);
|
||||||
init_error:
|
init_error:
|
||||||
phylink_disconnect_phy(priv->phylink);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4010,18 +4005,28 @@ static int stmmac_open(struct net_device *dev)
|
|||||||
|
|
||||||
ret = pm_runtime_resume_and_get(priv->device);
|
ret = pm_runtime_resume_and_get(priv->device);
|
||||||
if (ret < 0)
|
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);
|
ret = __stmmac_open(dev, dma_conf);
|
||||||
if (ret) {
|
if (ret)
|
||||||
pm_runtime_put(priv->device);
|
goto err_disconnect_phy;
|
||||||
err:
|
|
||||||
free_dma_desc_resources(priv, dma_conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(dma_conf);
|
kfree(dma_conf);
|
||||||
|
|
||||||
return ret;
|
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)
|
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 */
|
/* Stop and disconnect the PHY */
|
||||||
phylink_stop(priv->phylink);
|
phylink_stop(priv->phylink);
|
||||||
phylink_disconnect_phy(priv->phylink);
|
|
||||||
|
|
||||||
stmmac_disable_all_queues(priv);
|
stmmac_disable_all_queues(priv);
|
||||||
|
|
||||||
@@ -4078,6 +4082,7 @@ static int stmmac_release(struct net_device *dev)
|
|||||||
|
|
||||||
__stmmac_release(dev);
|
__stmmac_release(dev);
|
||||||
|
|
||||||
|
phylink_disconnect_phy(priv->phylink);
|
||||||
pm_runtime_put(priv->device);
|
pm_runtime_put(priv->device);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user