From: Bruce Allan Date: Fri, 13 May 2011 07:20:03 +0000 (+0000) Subject: e1000e: do not schedule the Tx queue until ready X-Git-Tag: v2.6.39-400.9.0~619^2~65 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=53ab75690b0e1b5d57421f9c75ff185cf3c1123b;p=users%2Fjedix%2Flinux-maple.git 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 Signed-off-by: Jeff Kirsher (cherry picked from commit 400484fa65ead1bbc3e86ea79e7505182a31bce1) Signed-off-by: Joe Jin --- diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index f5c1469f219a..da3fff664f27 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c @@ -3346,7 +3346,7 @@ int e1000e_up(struct e1000_adapter *adapter) e1000_configure_msix(adapter); e1000_irq_enable(adapter); - netif_wake_queue(adapter->netdev); + netif_start_queue(adapter->netdev); /* fire a link change interrupt to start the watchdog */ if (adapter->msix_entries) @@ -3413,17 +3413,16 @@ void e1000e_down(struct e1000_adapter *adapter) e1000e_update_stats(adapter); spin_unlock(&adapter->stats64_lock); + e1000e_flush_descriptors(adapter); + e1000_clean_tx_ring(adapter); + e1000_clean_rx_ring(adapter); + adapter->link_speed = 0; adapter->link_duplex = 0; if (!pci_channel_offline(adapter->pdev)) e1000e_reset(adapter); - e1000e_flush_descriptors(adapter); - - e1000_clean_tx_ring(adapter); - e1000_clean_rx_ring(adapter); - /* * TODO: for power management, we could drop the link and * pci_disable_device here.