aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/igb/igb_main.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 4d4ab87aeab..9911b3aaed3 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -2943,7 +2943,6 @@ static void igb_watchdog_task(struct work_struct *work)
2943 watchdog_task); 2943 watchdog_task);
2944 struct e1000_hw *hw = &adapter->hw; 2944 struct e1000_hw *hw = &adapter->hw;
2945 struct net_device *netdev = adapter->netdev; 2945 struct net_device *netdev = adapter->netdev;
2946 struct igb_ring *tx_ring = adapter->tx_ring;
2947 u32 link; 2946 u32 link;
2948 int i; 2947 int i;
2949 2948
@@ -3013,22 +3012,24 @@ static void igb_watchdog_task(struct work_struct *work)
3013 igb_update_stats(adapter); 3012 igb_update_stats(adapter);
3014 igb_update_adaptive(hw); 3013 igb_update_adaptive(hw);
3015 3014
3016 if (!netif_carrier_ok(netdev)) { 3015 for (i = 0; i < adapter->num_tx_queues; i++) {
3017 if (igb_desc_unused(tx_ring) + 1 < tx_ring->count) { 3016 struct igb_ring *tx_ring = &adapter->tx_ring[i];
3017 if (!netif_carrier_ok(netdev)) {
3018 /* We've lost link, so the controller stops DMA, 3018 /* We've lost link, so the controller stops DMA,
3019 * but we've got queued Tx work that's never going 3019 * but we've got queued Tx work that's never going
3020 * to get done, so reset controller to flush Tx. 3020 * to get done, so reset controller to flush Tx.
3021 * (Do the reset outside of interrupt context). */ 3021 * (Do the reset outside of interrupt context). */
3022 adapter->tx_timeout_count++; 3022 if (igb_desc_unused(tx_ring) + 1 < tx_ring->count) {
3023 schedule_work(&adapter->reset_task); 3023 adapter->tx_timeout_count++;
3024 /* return immediately since reset is imminent */ 3024 schedule_work(&adapter->reset_task);
3025 return; 3025 /* return immediately since reset is imminent */
3026 return;
3027 }
3026 } 3028 }
3027 }
3028 3029
3029 /* Force detection of hung controller every watchdog period */ 3030 /* Force detection of hung controller every watchdog period */
3030 for (i = 0; i < adapter->num_tx_queues; i++) 3031 tx_ring->detect_tx_hung = true;
3031 adapter->tx_ring[i].detect_tx_hung = true; 3032 }
3032 3033
3033 /* Cause software interrupt to ensure rx ring is cleaned */ 3034 /* Cause software interrupt to ensure rx ring is cleaned */
3034 if (adapter->msix_entries) { 3035 if (adapter->msix_entries) {