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 | } |