diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2011-05-13 03:20:03 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-06-09 23:33:08 -0400 |
commit | 400484fa65ead1bbc3e86ea79e7505182a31bce1 (patch) | |
tree | 2358926e54a42d08b92a39a980788783024d23f4 /drivers/net/e1000e | |
parent | c5caf4825b22957e4ad70fd94316e91ce8cfb51c (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.c | 11 |
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. |