diff options
| -rw-r--r-- | drivers/net/e1000e/netdev.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 174633c93325..3fa110ddb041 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -3344,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter) | |||
| 3344 | return 0; | 3344 | return 0; |
| 3345 | } | 3345 | } |
| 3346 | 3346 | ||
| 3347 | static void e1000e_flush_descriptors(struct e1000_adapter *adapter) | ||
| 3348 | { | ||
| 3349 | struct e1000_hw *hw = &adapter->hw; | ||
| 3350 | |||
| 3351 | if (!(adapter->flags2 & FLAG2_DMA_BURST)) | ||
| 3352 | return; | ||
| 3353 | |||
| 3354 | /* flush pending descriptor writebacks to memory */ | ||
| 3355 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
| 3356 | ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD); | ||
| 3357 | |||
| 3358 | /* execute the writes immediately */ | ||
| 3359 | e1e_flush(); | ||
| 3360 | } | ||
| 3361 | |||
| 3347 | void e1000e_down(struct e1000_adapter *adapter) | 3362 | void e1000e_down(struct e1000_adapter *adapter) |
| 3348 | { | 3363 | { |
| 3349 | struct net_device *netdev = adapter->netdev; | 3364 | struct net_device *netdev = adapter->netdev; |
| @@ -3383,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
| 3383 | 3398 | ||
| 3384 | if (!pci_channel_offline(adapter->pdev)) | 3399 | if (!pci_channel_offline(adapter->pdev)) |
| 3385 | e1000e_reset(adapter); | 3400 | e1000e_reset(adapter); |
| 3401 | |||
| 3402 | e1000e_flush_descriptors(adapter); | ||
| 3403 | |||
| 3386 | e1000_clean_tx_ring(adapter); | 3404 | e1000_clean_tx_ring(adapter); |
| 3387 | e1000_clean_rx_ring(adapter); | 3405 | e1000_clean_rx_ring(adapter); |
| 3388 | 3406 | ||
| @@ -4354,19 +4372,12 @@ link_up: | |||
| 4354 | else | 4372 | else |
| 4355 | ew32(ICS, E1000_ICS_RXDMT0); | 4373 | ew32(ICS, E1000_ICS_RXDMT0); |
| 4356 | 4374 | ||
| 4375 | /* flush pending descriptors to memory before detecting Tx hang */ | ||
| 4376 | e1000e_flush_descriptors(adapter); | ||
| 4377 | |||
| 4357 | /* Force detection of hung controller every watchdog period */ | 4378 | /* Force detection of hung controller every watchdog period */ |
| 4358 | adapter->detect_tx_hung = 1; | 4379 | adapter->detect_tx_hung = 1; |
| 4359 | 4380 | ||
| 4360 | /* flush partial descriptors to memory before detecting Tx hang */ | ||
| 4361 | if (adapter->flags2 & FLAG2_DMA_BURST) { | ||
| 4362 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
| 4363 | ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD); | ||
| 4364 | /* | ||
| 4365 | * no need to flush the writes because the timeout code does | ||
| 4366 | * an er32 first thing | ||
| 4367 | */ | ||
| 4368 | } | ||
| 4369 | |||
| 4370 | /* | 4381 | /* |
| 4371 | * With 82571 controllers, LAA may be overwritten due to controller | 4382 | * With 82571 controllers, LAA may be overwritten due to controller |
| 4372 | * reset from the other port. Set the appropriate LAA in RAR[0] | 4383 | * reset from the other port. Set the appropriate LAA in RAR[0] |
