aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2009-10-27 23:48:51 +0000
committerDavid S. Miller <davem@davemloft.net>2009-10-28 03:25:47 -0700
commitf7ba205e823f32e634712323a221b42bfea06efa (patch)
treeb82f4c54b3a8e9dfe2c96a55766d29ac1861e88b
parent4337e993e13eb2f2e05dd65a3ab25b57c2f89d56 (diff)
igb: make tx hang check multiqueue, check eop descriptor
This change makes the tx hang check run over all tx queues instead of just queue 0. Also have hang display info on EOP descriptor instead of the descriptor at the start of the chain. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/igb/igb_main.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 7f322115fd1..f75f90ff813 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -3002,6 +3002,10 @@ link_up:
}
}
+ /* Force detection of hung controller every watchdog period */
+ for (i = 0; i < adapter->num_tx_queues; i++)
+ adapter->tx_ring[i].detect_tx_hung = true;
+
/* Cause software interrupt to ensure rx ring is cleaned */
if (adapter->msix_entries) {
u32 eics = 0;
@@ -3014,9 +3018,6 @@ link_up:
wr32(E1000_ICS, E1000_ICS_RXDMT0);
}
- /* Force detection of hung controller every watchdog period */
- tx_ring->detect_tx_hung = true;
-
/* Reset the timer */
if (!test_bit(__IGB_DOWN, &adapter->state))
mod_timer(&adapter->watchdog_timer,
@@ -3667,6 +3668,7 @@ static void igb_tx_timeout(struct net_device *netdev)
/* Do the reset outside of interrupt context */
adapter->tx_timeout_count++;
+
schedule_work(&adapter->reset_task);
wr32(E1000_EICS,
(adapter->eims_enable_mask & ~adapter->eims_other));
@@ -4804,7 +4806,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
readl(tx_ring->tail),
tx_ring->next_to_use,
tx_ring->next_to_clean,
- tx_ring->buffer_info[i].time_stamp,
+ tx_ring->buffer_info[eop].time_stamp,
eop,
jiffies,
eop_desc->wb.status);