Skip to content

Commit

Permalink
e1000e: Make speed detection on hotplugging cable more reliable
Browse files Browse the repository at this point in the history
After hot plugging an 1Gbps Ethernet cable with 1Gbps link partner, the
MII_BMSR may report 10Mbps, renders the network rather slow.

The issue has much lower fail rate after commit 59653e6 ("e1000e:
Make watchdog use delayed work"), which essentially introduces some
delay before running the watchdog task.

But there's still a chance that the hot plugging event and the queued
watchdog task gets run at the same time, then the original issue can be
observed once again.

So let's use mod_delayed_work() to add a deterministic 1 second delay
before running watchdog task, after an interrupt.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
  • Loading branch information
Kai-Heng Feng authored and Jeff Kirsher committed Sep 9, 2019
1 parent d7cb9da commit dee2359
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions drivers/net/ethernet/intel/e1000e/netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1780,8 +1780,8 @@ static irqreturn_t e1000_intr_msi(int __always_unused irq, void *data)
}
/* guard against interrupt when we're going down */
if (!test_bit(__E1000_DOWN, &adapter->state))
queue_delayed_work(adapter->e1000_workqueue,
&adapter->watchdog_task, 1);
mod_delayed_work(adapter->e1000_workqueue,
&adapter->watchdog_task, HZ);
}

/* Reset on uncorrectable ECC error */
Expand Down Expand Up @@ -1861,8 +1861,8 @@ static irqreturn_t e1000_intr(int __always_unused irq, void *data)
}
/* guard against interrupt when we're going down */
if (!test_bit(__E1000_DOWN, &adapter->state))
queue_delayed_work(adapter->e1000_workqueue,
&adapter->watchdog_task, 1);
mod_delayed_work(adapter->e1000_workqueue,
&adapter->watchdog_task, HZ);
}

/* Reset on uncorrectable ECC error */
Expand Down Expand Up @@ -1907,8 +1907,8 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)
hw->mac.get_link_status = true;
/* guard against interrupt when we're going down */
if (!test_bit(__E1000_DOWN, &adapter->state))
queue_delayed_work(adapter->e1000_workqueue,
&adapter->watchdog_task, 1);
mod_delayed_work(adapter->e1000_workqueue,
&adapter->watchdog_task, HZ);
}

if (!test_bit(__E1000_DOWN, &adapter->state))
Expand Down

0 comments on commit dee2359

Please sign in to comment.