summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-07-08 12:40:18 +0100
committerDavid S. Miller <davem@davemloft.net>2014-07-08 20:02:58 -0700
commit6af42d420bcfa0c837911bd5b518fd4a3cfa4fe4 (patch)
treeba0fbdfbd8a2421675dfb08b51e1d0b4213a2888
parentdbc64a8ea231271c580b5a570bc48cf42203fe0e (diff)
net: fec: remove inappropriate calls around fec_restart()
This is the second stage to "move calls to quiesce/resume packet processing out of fec_restart()", where we remove calls which are not appropriate to the call site. In the majority of cases, there is no need to detach and reattach the interface as we are holding the queue xmit lock across the reset. The exception to that is in fec_resume(), where we are already detached by the suspend function. Here, we can remove the call to detach the interface. We also do not need to stop the transmit queue. Holding the xmit lock is enough to ensure that the transmit packet processing is not running while we perform our task. However, since fec_restart() always cleans the rings, we call netif_wake_queue() (or netif_device_attach() in the case of resume) just before dropping the xmit lock. This prevents the watchdog firing. Lastly, always call napi_enable() after the device has been reattached in the resume path so that we know that the transmit packet processing is already in an enabled state, so we don't call netif_wake_queue() while detached. Acked-by: Fugang Duan <B38611@freescale.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index b71b7491f38f..25a9f7fb30da 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1058,15 +1058,12 @@ static void fec_enet_work(struct work_struct *work)
fep->delay_work.timeout = false;
rtnl_lock();
if (netif_device_present(ndev) || netif_running(ndev)) {
- netif_device_detach(ndev);
napi_disable(&fep->napi);
- netif_tx_disable(ndev);
netif_tx_lock_bh(ndev);
fec_restart(ndev, fep->full_duplex);
- netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev);
+ netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi);
- netif_device_attach(ndev);
}
rtnl_unlock();
}
@@ -1524,15 +1521,12 @@ static void fec_enet_adjust_link(struct net_device *ndev)
/* if any of the above changed restart the FEC */
if (status_change) {
- netif_device_detach(ndev);
napi_disable(&fep->napi);
- netif_tx_disable(ndev);
netif_tx_lock_bh(ndev);
fec_restart(ndev, phy_dev->duplex);
- netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev);
+ netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi);
- netif_device_attach(ndev);
}
} else {
if (fep->link) {
@@ -1919,15 +1913,12 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
phy_start_aneg(fep->phy_dev);
}
if (netif_running(ndev)) {
- netif_device_detach(ndev);
napi_disable(&fep->napi);
- netif_tx_disable(ndev);
netif_tx_lock_bh(ndev);
fec_restart(ndev, fep->full_duplex);
- netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev);
+ netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi);
- netif_device_attach(ndev);
}
return 0;
@@ -2371,15 +2362,12 @@ static int fec_set_features(struct net_device *netdev,
if (netif_running(netdev)) {
fec_stop(netdev);
- netif_device_detach(netdev);
napi_disable(&fep->napi);
- netif_tx_disable(netdev);
netif_tx_lock_bh(netdev);
fec_restart(netdev, fep->phy_dev->duplex);
- netif_tx_unlock_bh(netdev);
netif_wake_queue(netdev);
+ netif_tx_unlock_bh(netdev);
napi_enable(&fep->napi);
- netif_device_attach(netdev);
}
}
@@ -2747,15 +2735,13 @@ fec_resume(struct device *dev)
rtnl_lock();
if (netif_running(ndev)) {
- netif_device_detach(ndev);
napi_disable(&fep->napi);
- netif_tx_disable(ndev);
netif_tx_lock_bh(ndev);
fec_restart(ndev, fep->full_duplex);
+ netif_device_attach(ndev);
netif_tx_unlock_bh(ndev);
- netif_wake_queue(ndev);
- napi_enable(&fep->napi);
netif_device_attach(ndev);
+ napi_enable(&fep->napi);
phy_start(fep->phy_dev);
}
rtnl_unlock();