Skip to content

Commit

Permalink
igb: check for packets on all tx rings when link is down
Browse files Browse the repository at this point in the history
We were previously only checking the first tx ring to see if it had any
packets in it when the link when down.  However we should be checking all
of the rings so this patch makes it so that all of the rings are now being
checked.

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>
  • Loading branch information
Alexander Duyck authored and David S. Miller committed Nov 14, 2009
1 parent 971d1d3 commit dbabb06
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions drivers/net/igb/igb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2943,7 +2943,6 @@ static void igb_watchdog_task(struct work_struct *work)
watchdog_task);
struct e1000_hw *hw = &adapter->hw;
struct net_device *netdev = adapter->netdev;
struct igb_ring *tx_ring = adapter->tx_ring;
u32 link;
int i;

Expand Down Expand Up @@ -3013,22 +3012,24 @@ static void igb_watchdog_task(struct work_struct *work)
igb_update_stats(adapter);
igb_update_adaptive(hw);

if (!netif_carrier_ok(netdev)) {
if (igb_desc_unused(tx_ring) + 1 < tx_ring->count) {
for (i = 0; i < adapter->num_tx_queues; i++) {
struct igb_ring *tx_ring = &adapter->tx_ring[i];
if (!netif_carrier_ok(netdev)) {
/* We've lost link, so the controller stops DMA,
* but we've got queued Tx work that's never going
* to get done, so reset controller to flush Tx.
* (Do the reset outside of interrupt context). */
adapter->tx_timeout_count++;
schedule_work(&adapter->reset_task);
/* return immediately since reset is imminent */
return;
if (igb_desc_unused(tx_ring) + 1 < tx_ring->count) {
adapter->tx_timeout_count++;
schedule_work(&adapter->reset_task);
/* return immediately since reset is imminent */
return;
}
}
}

/* 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;
/* Force detection of hung controller every watchdog period */
tx_ring->detect_tx_hung = true;
}

/* Cause software interrupt to ensure rx ring is cleaned */
if (adapter->msix_entries) {
Expand Down

0 comments on commit dbabb06

Please sign in to comment.