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

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: 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 dbc64a8e
...@@ -1058,15 +1058,12 @@ static void fec_enet_work(struct work_struct *work) ...@@ -1058,15 +1058,12 @@ static void fec_enet_work(struct work_struct *work)
fep->delay_work.timeout = false; fep->delay_work.timeout = false;
rtnl_lock(); rtnl_lock();
if (netif_device_present(ndev) || netif_running(ndev)) { if (netif_device_present(ndev) || netif_running(ndev)) {
netif_device_detach(ndev);
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_disable(ndev);
netif_tx_lock_bh(ndev); netif_tx_lock_bh(ndev);
fec_restart(ndev, fep->full_duplex); fec_restart(ndev, fep->full_duplex);
netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev); netif_wake_queue(ndev);
netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi); napi_enable(&fep->napi);
netif_device_attach(ndev);
} }
rtnl_unlock(); rtnl_unlock();
} }
...@@ -1524,15 +1521,12 @@ static void fec_enet_adjust_link(struct net_device *ndev) ...@@ -1524,15 +1521,12 @@ static void fec_enet_adjust_link(struct net_device *ndev)
/* if any of the above changed restart the FEC */ /* if any of the above changed restart the FEC */
if (status_change) { if (status_change) {
netif_device_detach(ndev);
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_disable(ndev);
netif_tx_lock_bh(ndev); netif_tx_lock_bh(ndev);
fec_restart(ndev, phy_dev->duplex); fec_restart(ndev, phy_dev->duplex);
netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev); netif_wake_queue(ndev);
netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi); napi_enable(&fep->napi);
netif_device_attach(ndev);
} }
} else { } else {
if (fep->link) { if (fep->link) {
...@@ -1919,15 +1913,12 @@ static int fec_enet_set_pauseparam(struct net_device *ndev, ...@@ -1919,15 +1913,12 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
phy_start_aneg(fep->phy_dev); phy_start_aneg(fep->phy_dev);
} }
if (netif_running(ndev)) { if (netif_running(ndev)) {
netif_device_detach(ndev);
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_disable(ndev);
netif_tx_lock_bh(ndev); netif_tx_lock_bh(ndev);
fec_restart(ndev, fep->full_duplex); fec_restart(ndev, fep->full_duplex);
netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev); netif_wake_queue(ndev);
netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi); napi_enable(&fep->napi);
netif_device_attach(ndev);
} }
return 0; return 0;
...@@ -2371,15 +2362,12 @@ static int fec_set_features(struct net_device *netdev, ...@@ -2371,15 +2362,12 @@ static int fec_set_features(struct net_device *netdev,
if (netif_running(netdev)) { if (netif_running(netdev)) {
fec_stop(netdev); fec_stop(netdev);
netif_device_detach(netdev);
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_disable(netdev);
netif_tx_lock_bh(netdev); netif_tx_lock_bh(netdev);
fec_restart(netdev, fep->phy_dev->duplex); fec_restart(netdev, fep->phy_dev->duplex);
netif_tx_unlock_bh(netdev);
netif_wake_queue(netdev); netif_wake_queue(netdev);
netif_tx_unlock_bh(netdev);
napi_enable(&fep->napi); napi_enable(&fep->napi);
netif_device_attach(netdev);
} }
} }
...@@ -2747,15 +2735,13 @@ fec_resume(struct device *dev) ...@@ -2747,15 +2735,13 @@ fec_resume(struct device *dev)
rtnl_lock(); rtnl_lock();
if (netif_running(ndev)) { if (netif_running(ndev)) {
netif_device_detach(ndev);
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_disable(ndev);
netif_tx_lock_bh(ndev); netif_tx_lock_bh(ndev);
fec_restart(ndev, fep->full_duplex); fec_restart(ndev, fep->full_duplex);
netif_device_attach(ndev);
netif_tx_unlock_bh(ndev); netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev);
napi_enable(&fep->napi);
netif_device_attach(ndev); netif_device_attach(ndev);
napi_enable(&fep->napi);
phy_start(fep->phy_dev); phy_start(fep->phy_dev);
} }
rtnl_unlock(); rtnl_unlock();
......
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