aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2011-05-13 03:20:03 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2011-06-09 23:33:08 -0400
commit400484fa65ead1bbc3e86ea79e7505182a31bce1 (patch)
tree2358926e54a42d08b92a39a980788783024d23f4 /drivers/net/e1000e
parentc5caf4825b22957e4ad70fd94316e91ce8cfb51c (diff)
e1000e: do not schedule the Tx queue until ready
Start the Tx queue when the interface is brought up in e1000e_up() but do not schedule the queue until link is up as detected in the watchdog task which sets netif_carrier_on. Also flush the descriptors and clean the Tx and Rx rings before resetting the hardware when bringing the interface down otherwise there is a small window where the watchdog task can be triggered with netif_carrier_off and the Tx ring not yet empty which causes an additional and unnecessary reset. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r--drivers/net/e1000e/netdev.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index c4a23c7ac170..bc99458e0398 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -3347,7 +3347,7 @@ int e1000e_up(struct e1000_adapter *adapter)
3347 e1000_configure_msix(adapter); 3347 e1000_configure_msix(adapter);
3348 e1000_irq_enable(adapter); 3348 e1000_irq_enable(adapter);
3349 3349
3350 netif_wake_queue(adapter->netdev); 3350 netif_start_queue(adapter->netdev);
3351 3351
3352 /* fire a link change interrupt to start the watchdog */ 3352 /* fire a link change interrupt to start the watchdog */
3353 if (adapter->msix_entries) 3353 if (adapter->msix_entries)
@@ -3414,17 +3414,16 @@ void e1000e_down(struct e1000_adapter *adapter)
3414 e1000e_update_stats(adapter); 3414 e1000e_update_stats(adapter);
3415 spin_unlock(&adapter->stats64_lock); 3415 spin_unlock(&adapter->stats64_lock);
3416 3416
3417 e1000e_flush_descriptors(adapter);
3418 e1000_clean_tx_ring(adapter);
3419 e1000_clean_rx_ring(adapter);
3420
3417 adapter->link_speed = 0; 3421 adapter->link_speed = 0;
3418 adapter->link_duplex = 0; 3422 adapter->link_duplex = 0;
3419 3423
3420 if (!pci_channel_offline(adapter->pdev)) 3424 if (!pci_channel_offline(adapter->pdev))
3421 e1000e_reset(adapter); 3425 e1000e_reset(adapter);
3422 3426
3423 e1000e_flush_descriptors(adapter);
3424
3425 e1000_clean_tx_ring(adapter);
3426 e1000_clean_rx_ring(adapter);
3427
3428 /* 3427 /*
3429 * TODO: for power management, we could drop the link and 3428 * TODO: for power management, we could drop the link and
3430 * pci_disable_device here. 3429 * pci_disable_device here.