aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/igb/igb_main.c
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2009-10-27 19:48:51 -0400
committerDavid S. Miller <davem@davemloft.net>2009-10-28 06:25:47 -0400
commitf7ba205e823f32e634712323a221b42bfea06efa (patch)
treeb82f4c54b3a8e9dfe2c96a55766d29ac1861e88b /drivers/net/igb/igb_main.c
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>
Diffstat (limited to 'drivers/net/igb/igb_main.c')
-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:
3002 } 3002 }
3003 } 3003 }
3004 3004
3005 /* Force detection of hung controller every watchdog period */
3006 for (i = 0; i < adapter->num_tx_queues; i++)
3007 adapter->tx_ring[i].detect_tx_hung = true;
3008
3005 /* Cause software interrupt to ensure rx ring is cleaned */ 3009 /* Cause software interrupt to ensure rx ring is cleaned */
3006 if (adapter->msix_entries) { 3010 if (adapter->msix_entries) {
3007 u32 eics = 0; 3011 u32 eics = 0;
@@ -3014,9 +3018,6 @@ link_up:
3014 wr32(E1000_ICS, E1000_ICS_RXDMT0); 3018 wr32(E1000_ICS, E1000_ICS_RXDMT0);
3015 } 3019 }
3016 3020
3017 /* Force detection of hung controller every watchdog period */
3018 tx_ring->detect_tx_hung = true;
3019
3020 /* Reset the timer */ 3021 /* Reset the timer */
3021 if (!test_bit(__IGB_DOWN, &adapter->state)) 3022 if (!test_bit(__IGB_DOWN, &adapter->state))
3022 mod_timer(&adapter->watchdog_timer, 3023 mod_timer(&adapter->watchdog_timer,
@@ -3667,6 +3668,7 @@ static void igb_tx_timeout(struct net_device *netdev)
3667 3668
3668 /* Do the reset outside of interrupt context */ 3669 /* Do the reset outside of interrupt context */
3669 adapter->tx_timeout_count++; 3670 adapter->tx_timeout_count++;
3671
3670 schedule_work(&adapter->reset_task); 3672 schedule_work(&adapter->reset_task);
3671 wr32(E1000_EICS, 3673 wr32(E1000_EICS,
3672 (adapter->eims_enable_mask & ~adapter->eims_other)); 3674 (adapter->eims_enable_mask & ~adapter->eims_other));
@@ -4804,7 +4806,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
4804 readl(tx_ring->tail), 4806 readl(tx_ring->tail),
4805 tx_ring->next_to_use, 4807 tx_ring->next_to_use,
4806 tx_ring->next_to_clean, 4808 tx_ring->next_to_clean,
4807 tx_ring->buffer_info[i].time_stamp, 4809 tx_ring->buffer_info[eop].time_stamp,
4808 eop, 4810 eop,
4809 jiffies, 4811 jiffies,
4810 eop_desc->wb.status); 4812 eop_desc->wb.status);