aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/e1000e/netdev.c31
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
3347static 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
3347void e1000e_down(struct e1000_adapter *adapter) 3362void 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]