linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: rmk+kernel@arm.linux.org.uk (Russell King)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH B 06/10] net: fec: quiesce packet processing before stopping device in fec_suspend()
Date: Tue, 08 Jul 2014 12:40:23 +0100	[thread overview]
Message-ID: <E1X4Tl1-0005oD-6z@rmk-PC.arm.linux.org.uk> (raw)
In-Reply-To: <20140708113911.GH21766@n2100.arm.linux.org.uk>

fec_suspend() calls fec_stop() to stop the transmit ring while the
transmit packet processing is still active.  This can lead to the
transmit queue being restarted by an intervening packet queued for
transmission, or by the tx quirk timer expiring.

Fix this by disabling NAPI first, which will ensure that the NAPI
handlers are not running.  Then, take the transmit lock before
detaching the netif device.  This ensures that there are no races
with the transmit path - and also ensures that the watchdog won't
fire.

We can then safely stop the ethernet device itself, knowing that the
rest of the driver is safely shut down.

On resume, we bring the device back up in reverse order - we restart
the device, reattach the device (under the tx lock), and then enable
the NAPI handlers.

We also need to adjust the close function to cope with this new
sequence, so that it's possible to cleanly close down the driver
after the hardware fails to resume (eg, due to the regulator_enable()
or pinctrl calls in the resume path returning an error.)

Acked-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
 drivers/net/ethernet/freescale/fec_main.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 25a9f7fb30da..fc9f6f465e7a 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2211,10 +2211,11 @@ fec_enet_close(struct net_device *ndev)
 
 	phy_stop(fep->phy_dev);
 
-	napi_disable(&fep->napi);
-	netif_tx_disable(ndev);
-	if (netif_device_present(ndev))
+	if (netif_device_present(ndev)) {
+		napi_disable(&fep->napi);
+		netif_tx_disable(ndev);
 		fec_stop(ndev);
+	}
 
 	phy_disconnect(fep->phy_dev);
 	fep->phy_dev = NULL;
@@ -2701,8 +2702,11 @@ fec_suspend(struct device *dev)
 	rtnl_lock();
 	if (netif_running(ndev)) {
 		phy_stop(fep->phy_dev);
-		fec_stop(ndev);
+		napi_disable(&fep->napi);
+		netif_tx_lock_bh(ndev);
 		netif_device_detach(ndev);
+		netif_tx_unlock_bh(ndev);
+		fec_stop(ndev);
 	}
 	rtnl_unlock();
 
@@ -2735,12 +2739,10 @@ fec_resume(struct device *dev)
 
 	rtnl_lock();
 	if (netif_running(ndev)) {
-		napi_disable(&fep->napi);
-		netif_tx_lock_bh(ndev);
 		fec_restart(ndev, fep->full_duplex);
+		netif_tx_lock_bh(ndev);
 		netif_device_attach(ndev);
 		netif_tx_unlock_bh(ndev);
-		netif_device_attach(ndev);
 		napi_enable(&fep->napi);
 		phy_start(fep->phy_dev);
 	}
-- 
1.8.3.1

  parent reply	other threads:[~2014-07-08 11:40 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-08 11:39 [PATCH B 00/10] Freescale ethernet driver updates (part 2) Russell King - ARM Linux
2014-07-08 11:39 ` [PATCH B 01/10] net: fec: improve safety of suspend/resume/transmit timeout paths Russell King
2014-07-08 11:40 ` [PATCH B 02/10] net: fec: ensure fec_enet_close() copes with resume failure Russell King
2014-07-08 11:40 ` [PATCH B 03/10] net: fec: only restart or stop the device if it is present and running Russell King
2014-07-08 11:40 ` [PATCH B 04/10] net: fec: move calls to quiesce/resume packet processing out of fec_restart() Russell King
2014-07-08 11:40 ` [PATCH B 05/10] net: fec: remove inappropriate calls around fec_restart() Russell King
2014-07-08 11:40 ` Russell King [this message]
2014-07-08 11:40 ` [PATCH B 07/10] net: fec: quiesce packet processing before stopping device in fec_set_features() Russell King
2014-07-08 11:40 ` [PATCH B 08/10] net: fec: quiesce packet processing before changing features Russell King
2014-07-08 11:40 ` [PATCH B 09/10] net: fec: quiesce packet processing when taking link down in fec_enet_adjust_link() Russell King
2014-07-08 11:40 ` [PATCH B 10/10] net: fec: clean up duplex mode handling Russell King
2014-07-09  3:03 ` [PATCH B 00/10] Freescale ethernet driver updates (part 2) David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1X4Tl1-0005oD-6z@rmk-PC.arm.linux.org.uk \
    --to=rmk+kernel@arm.linux.org.uk \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).