aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Turton <nturton@solarflare.com>2011-04-04 08:46:23 -0400
committerBen Hutchings <bhutchings@solarflare.com>2011-04-12 11:20:25 -0400
commit9d1aea62e45d447e7fc05d4e7f4e90f633e3abfc (patch)
tree19869ff5f97c2b270bde599a7c0ce59bb5afa5f7
parent4a9f65f6304a00f6473e83b19c1e83caa1e42530 (diff)
sfc: Stop the TX queues during loopback self-tests
If the TX queues are running during loopback self tests, host traffic gets looped back which causes the test to fail. Avoid restarting the TX queues after the port reset so that any packets sent by the host get held back until after the tests have completed. [bwh: Also wake all TX queues at the end of self-tests.] Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
-rw-r--r--drivers/net/sfc/efx.c2
-rw-r--r--drivers/net/sfc/selftest.c2
-rw-r--r--drivers/net/sfc/tx.c3
3 files changed, 5 insertions, 2 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
index d890679e4c4d..0dc800b5a4ea 100644
--- a/drivers/net/sfc/efx.c
+++ b/drivers/net/sfc/efx.c
@@ -1436,7 +1436,7 @@ static void efx_start_all(struct efx_nic *efx)
1436 * restart the transmit interface early so the watchdog timer stops */ 1436 * restart the transmit interface early so the watchdog timer stops */
1437 efx_start_port(efx); 1437 efx_start_port(efx);
1438 1438
1439 if (efx_dev_registered(efx)) 1439 if (efx_dev_registered(efx) && !efx->port_inhibited)
1440 netif_tx_wake_all_queues(efx->net_dev); 1440 netif_tx_wake_all_queues(efx->net_dev);
1441 1441
1442 efx_for_each_channel(channel, efx) 1442 efx_for_each_channel(channel, efx)
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c
index a0f49b348d62..845808408924 100644
--- a/drivers/net/sfc/selftest.c
+++ b/drivers/net/sfc/selftest.c
@@ -770,6 +770,8 @@ int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
770 __efx_reconfigure_port(efx); 770 __efx_reconfigure_port(efx);
771 mutex_unlock(&efx->mac_lock); 771 mutex_unlock(&efx->mac_lock);
772 772
773 netif_tx_wake_all_queues(efx->net_dev);
774
773 return rc_test; 775 return rc_test;
774} 776}
775 777
diff --git a/drivers/net/sfc/tx.c b/drivers/net/sfc/tx.c
index 139801908217..d2c85dfdf3bf 100644
--- a/drivers/net/sfc/tx.c
+++ b/drivers/net/sfc/tx.c
@@ -435,7 +435,8 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index)
435 * queue state. */ 435 * queue state. */
436 smp_mb(); 436 smp_mb();
437 if (unlikely(netif_tx_queue_stopped(tx_queue->core_txq)) && 437 if (unlikely(netif_tx_queue_stopped(tx_queue->core_txq)) &&
438 likely(efx->port_enabled)) { 438 likely(efx->port_enabled) &&
439 likely(!efx->port_inhibited)) {
439 fill_level = tx_queue->insert_count - tx_queue->read_count; 440 fill_level = tx_queue->insert_count - tx_queue->read_count;
440 if (fill_level < EFX_TXQ_THRESHOLD(efx)) { 441 if (fill_level < EFX_TXQ_THRESHOLD(efx)) {
441 EFX_BUG_ON_PARANOID(!efx_dev_registered(efx)); 442 EFX_BUG_ON_PARANOID(!efx_dev_registered(efx));