igb: make tx hang check multiqueue, check eop descriptor
authorAlexander Duyck <alexander.h.duyck@intel.com>
Tue, 27 Oct 2009 23:48:51 +0000 (23:48 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Oct 2009 10:25:47 +0000 (03:25 -0700)
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>
drivers/net/igb/igb_main.c

index 7f322115fd1fdb67cff0a4d84814bb6229b795a4..f75f90ff813809660616728d0b8ec5cb7c37d9da 100644 (file)
@@ -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);