[PATCH RFC 18/30] net: fec: remove inappropriate calls around fec_restart()

fugang.duan at freescale.com fugang.duan at freescale.com
Sat Jun 21 23:54:28 PDT 2014


From: Russell King <rmk at arm.linux.org.uk> Data: Friday, June 20, 2014 8:13 PM
>To: linux-arm-kernel at lists.infradead.org
>Cc: Duan Fugang-B38611; netdev at vger.kernel.org
>Subject: [PATCH RFC 18/30] 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.
>
>Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
>---
> drivers/net/ethernet/freescale/fec_main.c | 26 ++++++--------------------
> 1 file changed, 6 insertions(+), 20 deletions(-)
>
>diff --git a/drivers/net/ethernet/freescale/fec_main.c
>b/drivers/net/ethernet/freescale/fec_main.c
>index 4a295b4bfb94..49c154af6da2 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;
>@@ -2372,15 +2363,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);
> 		}
> 	}
>
>@@ -2748,15 +2736,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();
>--
Patch #17 anc #18 can merge to one patch.

Thanks,
Andy



More information about the linux-arm-kernel mailing list