Commit d76cfae9 authored by Russell King's avatar Russell King Committed by David S. Miller

net: fec: stop the phy before shutting down the MAC

When the network interface goes down, stop the phy to prevent further
link up status changes before taking the MAC or netif sections down.
This prevents further reception of link up events which could
potentially call fec_restart().

Since phy_stop() takes the mutex which adjust_link() runs under, we
also ensure that adjust_link() will not already be processing a link
up event.

We also need to do this when suspending as well - we don't want a
mis-timed phy state change to restart the MAC after we have stopped
it for suspend, and thus need to restart the phy when resuming.
Acked-by: default avatarFugang Duan <B38611@freescale.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0b146ca8
...@@ -2181,13 +2181,14 @@ fec_enet_close(struct net_device *ndev) ...@@ -2181,13 +2181,14 @@ fec_enet_close(struct net_device *ndev)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
phy_stop(fep->phy_dev);
/* Don't know what to do yet. */ /* Don't know what to do yet. */
napi_disable(&fep->napi); napi_disable(&fep->napi);
fep->opened = 0; fep->opened = 0;
netif_tx_disable(ndev); netif_tx_disable(ndev);
fec_stop(ndev); fec_stop(ndev);
phy_stop(fep->phy_dev);
phy_disconnect(fep->phy_dev); phy_disconnect(fep->phy_dev);
fep->phy_dev = NULL; fep->phy_dev = NULL;
...@@ -2669,6 +2670,7 @@ fec_suspend(struct device *dev) ...@@ -2669,6 +2670,7 @@ fec_suspend(struct device *dev)
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
if (netif_running(ndev)) { if (netif_running(ndev)) {
phy_stop(fep->phy_dev);
fec_stop(ndev); fec_stop(ndev);
netif_device_detach(ndev); netif_device_detach(ndev);
} }
...@@ -2702,6 +2704,7 @@ fec_resume(struct device *dev) ...@@ -2702,6 +2704,7 @@ fec_resume(struct device *dev)
if (netif_running(ndev)) { if (netif_running(ndev)) {
fec_restart(ndev, fep->full_duplex); fec_restart(ndev, fep->full_duplex);
netif_device_attach(ndev); netif_device_attach(ndev);
phy_start(fep->phy_dev);
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment