diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2008-08-26 07:25:03 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-08-27 05:16:27 -0400 |
commit | 7a6ea550f2f7592742ac765e5a3b4b5d1461e0bd (patch) | |
tree | 4f347f2054987626af467cd2031af5517bf7d81f /drivers | |
parent | a866bbf6aacf95f849810079442a20be118ce905 (diff) |
igb: force all queues to interrupt once every 2 seconds
Set the EICS bit for each of the RX queues at least once every 2 seconds to
prevent the rx queues from stalling.
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
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; |