sfc: Workaround flush failures on Falcon B0
authorSteve Hodgson <shodgson@solarflare.com>
Tue, 1 Jun 2010 11:17:51 +0000 (11:17 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Jun 2010 09:21:06 +0000 (02:21 -0700)
commitfd371e32fe53f137a0f940d61772bda92180007b
treec2ce5d564aae698ecc643d8af42696e374a60728
parent319ba649af30321ea221740833785b46e1fe6af3
sfc: Workaround flush failures on Falcon B0

Under certain conditions a PHY may backpressure Falcon B0
in such a way that flushes timeout. In normal circumstances
the phy poller would fix the PHY, and the flush could complete.

But efx_nic_flush_queues() is always called after efx_stop_all(),
so the poller has been stopped. Even if this weren't the case,
how long would we have to wait for the poller to fix this? And
several callers of efx_nic_flush_queues() are about to reset
the device anyway - so we don't need to do anything.

Work around this bug by scheduling a reset. Ensure that the
MAC is never rewired back into the datapath before the reset
runs (we already ignore all rx events anyway).

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/efx.c
drivers/net/sfc/falcon.c
drivers/net/sfc/nic.c
drivers/net/sfc/workarounds.h