diff options
| author | yzhu1 <yanjun.zhu@windriver.com> | 2013-11-23 02:07:40 -0500 |
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-11-30 02:49:05 -0500 |
| commit | 6a7d64e3e09e11181a07a2e8cd6af5d6355133be (patch) | |
| tree | 0ef4b84399d23e585d740aea769cd9ed37361f58 | |
| parent | 42ce4126d8bc2e128e1f207cf79bb0623fac498f (diff) | |
e1000: prevent oops when adapter is being closed and reset simultaneously
This change is based on a similar change made to e1000e support in
commit bb9e44d0d0f4 ("e1000e: prevent oops when adapter is being closed
and reset simultaneously"). The same issue has also been observed
on the older e1000 cards.
Here, we have increased the RESET_COUNT value to 50 because there are too
many accesses to e1000 nic on stress tests to e1000 nic, it is not enough
to set RESET_COUT 25. Experimentation has shown that it is enough to set
RESET_COUNT 50.
Signed-off-by: yzhu1 <yanjun.zhu@windriver.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
| -rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 9 |
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000.h b/drivers/net/ethernet/intel/e1000/e1000.h index 58c147271a36..e4093d1f64cb 100644 --- a/drivers/net/ethernet/intel/e1000/e1000.h +++ b/drivers/net/ethernet/intel/e1000/e1000.h | |||
| @@ -83,6 +83,11 @@ struct e1000_adapter; | |||
| 83 | 83 | ||
| 84 | #define E1000_MAX_INTR 10 | 84 | #define E1000_MAX_INTR 10 |
| 85 | 85 | ||
| 86 | /* | ||
| 87 | * Count for polling __E1000_RESET condition every 10-20msec. | ||
| 88 | */ | ||
| 89 | #define E1000_CHECK_RESET_COUNT 50 | ||
| 90 | |||
| 86 | /* TX/RX descriptor defines */ | 91 | /* TX/RX descriptor defines */ |
| 87 | #define E1000_DEFAULT_TXD 256 | 92 | #define E1000_DEFAULT_TXD 256 |
| 88 | #define E1000_MAX_TXD 256 | 93 | #define E1000_MAX_TXD 256 |
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index e38622825fa7..c0f52174e4c8 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |||
| @@ -1440,6 +1440,10 @@ static int e1000_close(struct net_device *netdev) | |||
| 1440 | { | 1440 | { |
| 1441 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1441 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1442 | struct e1000_hw *hw = &adapter->hw; | 1442 | struct e1000_hw *hw = &adapter->hw; |
| 1443 | int count = E1000_CHECK_RESET_COUNT; | ||
| 1444 | |||
| 1445 | while (test_bit(__E1000_RESETTING, &adapter->flags) && count--) | ||
| 1446 | usleep_range(10000, 20000); | ||
| 1443 | 1447 | ||
| 1444 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); | 1448 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); |
| 1445 | e1000_down(adapter); | 1449 | e1000_down(adapter); |
| @@ -4963,6 +4967,11 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) | |||
| 4963 | netif_device_detach(netdev); | 4967 | netif_device_detach(netdev); |
| 4964 | 4968 | ||
| 4965 | if (netif_running(netdev)) { | 4969 | if (netif_running(netdev)) { |
| 4970 | int count = E1000_CHECK_RESET_COUNT; | ||
| 4971 | |||
| 4972 | while (test_bit(__E1000_RESETTING, &adapter->flags) && count--) | ||
| 4973 | usleep_range(10000, 20000); | ||
| 4974 | |||
| 4966 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); | 4975 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); |
| 4967 | e1000_down(adapter); | 4976 | e1000_down(adapter); |
| 4968 | } | 4977 | } |
