|
@@ -3344,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
|
|
|
+{
|
|
|
+ struct e1000_hw *hw = &adapter->hw;
|
|
|
+
|
|
|
+ if (!(adapter->flags2 & FLAG2_DMA_BURST))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* flush pending descriptor writebacks to memory */
|
|
|
+ ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
|
|
+ ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
|
|
+
|
|
|
+ /* execute the writes immediately */
|
|
|
+ e1e_flush();
|
|
|
+}
|
|
|
+
|
|
|
void e1000e_down(struct e1000_adapter *adapter)
|
|
|
{
|
|
|
struct net_device *netdev = adapter->netdev;
|
|
@@ -3383,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter)
|
|
|
|
|
|
if (!pci_channel_offline(adapter->pdev))
|
|
|
e1000e_reset(adapter);
|
|
|
+
|
|
|
+ e1000e_flush_descriptors(adapter);
|
|
|
+
|
|
|
e1000_clean_tx_ring(adapter);
|
|
|
e1000_clean_rx_ring(adapter);
|
|
|
|
|
@@ -4354,19 +4372,12 @@ link_up:
|
|
|
else
|
|
|
ew32(ICS, E1000_ICS_RXDMT0);
|
|
|
|
|
|
+ /* flush pending descriptors to memory before detecting Tx hang */
|
|
|
+ e1000e_flush_descriptors(adapter);
|
|
|
+
|
|
|
/* Force detection of hung controller every watchdog period */
|
|
|
adapter->detect_tx_hung = 1;
|
|
|
|
|
|
- /* flush partial descriptors to memory before detecting Tx hang */
|
|
|
- if (adapter->flags2 & FLAG2_DMA_BURST) {
|
|
|
- ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
|
|
- ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
|
|
- /*
|
|
|
- * no need to flush the writes because the timeout code does
|
|
|
- * an er32 first thing
|
|
|
- */
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* With 82571 controllers, LAA may be overwritten due to controller
|
|
|
* reset from the other port. Set the appropriate LAA in RAR[0]
|