diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 7152eb11b7b9..19ab2154802c 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -60,6 +60,11 @@ | |||
60 | char e1000e_driver_name[] = "e1000e"; | 60 | char e1000e_driver_name[] = "e1000e"; |
61 | const char e1000e_driver_version[] = DRV_VERSION; | 61 | const char e1000e_driver_version[] = DRV_VERSION; |
62 | 62 | ||
63 | #define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK) | ||
64 | static int debug = -1; | ||
65 | module_param(debug, int, 0); | ||
66 | MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); | ||
67 | |||
63 | static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state); | 68 | static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state); |
64 | 69 | ||
65 | static const struct e1000_info *e1000_info_tbl[] = { | 70 | static const struct e1000_info *e1000_info_tbl[] = { |
@@ -1054,6 +1059,13 @@ static void e1000_print_hw_hang(struct work_struct *work) | |||
1054 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | 1059 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); |
1055 | /* execute the writes immediately */ | 1060 | /* execute the writes immediately */ |
1056 | e1e_flush(); | 1061 | e1e_flush(); |
1062 | /* | ||
1063 | * Due to rare timing issues, write to TIDV again to ensure | ||
1064 | * the write is successful | ||
1065 | */ | ||
1066 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
1067 | /* execute the writes immediately */ | ||
1068 | e1e_flush(); | ||
1057 | adapter->tx_hang_recheck = true; | 1069 | adapter->tx_hang_recheck = true; |
1058 | return; | 1070 | return; |
1059 | } | 1071 | } |
@@ -3611,6 +3623,16 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter) | |||
3611 | 3623 | ||
3612 | /* execute the writes immediately */ | 3624 | /* execute the writes immediately */ |
3613 | e1e_flush(); | 3625 | e1e_flush(); |
3626 | |||
3627 | /* | ||
3628 | * due to rare timing issues, write to TIDV/RDTR again to ensure the | ||
3629 | * write is successful | ||
3630 | */ | ||
3631 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
3632 | ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD); | ||
3633 | |||
3634 | /* execute the writes immediately */ | ||
3635 | e1e_flush(); | ||
3614 | } | 3636 | } |
3615 | 3637 | ||
3616 | static void e1000e_update_stats(struct e1000_adapter *adapter); | 3638 | static void e1000e_update_stats(struct e1000_adapter *adapter); |
@@ -3963,6 +3985,10 @@ static int e1000_close(struct net_device *netdev) | |||
3963 | { | 3985 | { |
3964 | struct e1000_adapter *adapter = netdev_priv(netdev); | 3986 | struct e1000_adapter *adapter = netdev_priv(netdev); |
3965 | struct pci_dev *pdev = adapter->pdev; | 3987 | struct pci_dev *pdev = adapter->pdev; |
3988 | int count = E1000_CHECK_RESET_COUNT; | ||
3989 | |||
3990 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) | ||
3991 | usleep_range(10000, 20000); | ||
3966 | 3992 | ||
3967 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); | 3993 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); |
3968 | 3994 | ||
@@ -5467,6 +5493,11 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake, | |||
5467 | netif_device_detach(netdev); | 5493 | netif_device_detach(netdev); |
5468 | 5494 | ||
5469 | if (netif_running(netdev)) { | 5495 | if (netif_running(netdev)) { |
5496 | int count = E1000_CHECK_RESET_COUNT; | ||
5497 | |||
5498 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) | ||
5499 | usleep_range(10000, 20000); | ||
5500 | |||
5470 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); | 5501 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); |
5471 | e1000e_down(adapter); | 5502 | e1000e_down(adapter); |
5472 | e1000_free_irq(adapter); | 5503 | e1000_free_irq(adapter); |
@@ -6172,7 +6203,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
6172 | adapter->hw.adapter = adapter; | 6203 | adapter->hw.adapter = adapter; |
6173 | adapter->hw.mac.type = ei->mac; | 6204 | adapter->hw.mac.type = ei->mac; |
6174 | adapter->max_hw_frame_size = ei->max_hw_frame_size; | 6205 | adapter->max_hw_frame_size = ei->max_hw_frame_size; |
6175 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; | 6206 | adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); |
6176 | 6207 | ||
6177 | mmio_start = pci_resource_start(pdev, 0); | 6208 | mmio_start = pci_resource_start(pdev, 0); |
6178 | mmio_len = pci_resource_len(pdev, 0); | 6209 | mmio_len = pci_resource_len(pdev, 0); |