diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/igb/igb_main.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 8f66e15ec8d6..465a810b670a 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -2290,7 +2290,9 @@ static void igb_watchdog_task(struct work_struct *work) | |||
2290 | struct igb_ring *tx_ring = adapter->tx_ring; | 2290 | struct igb_ring *tx_ring = adapter->tx_ring; |
2291 | struct e1000_mac_info *mac = &adapter->hw.mac; | 2291 | struct e1000_mac_info *mac = &adapter->hw.mac; |
2292 | u32 link; | 2292 | u32 link; |
2293 | u32 eics = 0; | ||
2293 | s32 ret_val; | 2294 | s32 ret_val; |
2295 | int i; | ||
2294 | 2296 | ||
2295 | if ((netif_carrier_ok(netdev)) && | 2297 | if ((netif_carrier_ok(netdev)) && |
2296 | (rd32(E1000_STATUS) & E1000_STATUS_LU)) | 2298 | (rd32(E1000_STATUS) & E1000_STATUS_LU)) |
@@ -2392,7 +2394,13 @@ link_up: | |||
2392 | } | 2394 | } |
2393 | 2395 | ||
2394 | /* Cause software interrupt to ensure rx ring is cleaned */ | 2396 | /* Cause software interrupt to ensure rx ring is cleaned */ |
2395 | wr32(E1000_ICS, E1000_ICS_RXDMT0); | 2397 | if (adapter->msix_entries) { |
2398 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
2399 | eics |= adapter->rx_ring[i].eims_value; | ||
2400 | wr32(E1000_EICS, eics); | ||
2401 | } else { | ||
2402 | wr32(E1000_ICS, E1000_ICS_RXDMT0); | ||
2403 | } | ||
2396 | 2404 | ||
2397 | /* Force detection of hung controller every watchdog period */ | 2405 | /* Force detection of hung controller every watchdog period */ |
2398 | tx_ring->detect_tx_hung = true; | 2406 | tx_ring->detect_tx_hung = true; |