Commit 0ffc5646 authored by Yanir Lubetkin's avatar Yanir Lubetkin Committed by Jeff Kirsher

e1000e: i219 execute unit hang fix on every reset or power state transition

After testing various cases, the conclusion is that the fix MUST be
executed BEFORE any event that the HW is reset or transition to D3.
To fix that I moved the execution to the relevant places but per
Alexander Duyck's review, ensure now that the DMA is valid and was not
freed before manipulating the ring.
Signed-off-by: default avatarYanir Lubetkin <yanirx.lubetkin@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent ad851fbb
...@@ -4043,6 +4043,8 @@ void e1000e_reset(struct e1000_adapter *adapter) ...@@ -4043,6 +4043,8 @@ void e1000e_reset(struct e1000_adapter *adapter)
} }
} }
if (hw->mac.type == e1000_pch_spt)
e1000_flush_desc_rings(adapter);
/* Allow time for pending master requests to run */ /* Allow time for pending master requests to run */
mac->ops.reset_hw(hw); mac->ops.reset_hw(hw);
...@@ -4215,10 +4217,6 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset) ...@@ -4215,10 +4217,6 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset)
spin_unlock(&adapter->stats64_lock); spin_unlock(&adapter->stats64_lock);
e1000e_flush_descriptors(adapter); e1000e_flush_descriptors(adapter);
if (hw->mac.type == e1000_pch_spt)
e1000_flush_desc_rings(adapter);
e1000_clean_tx_ring(adapter->tx_ring);
e1000_clean_rx_ring(adapter->rx_ring);
adapter->link_speed = 0; adapter->link_speed = 0;
adapter->link_duplex = 0; adapter->link_duplex = 0;
...@@ -4229,8 +4227,14 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset) ...@@ -4229,8 +4227,14 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset)
e1000_lv_jumbo_workaround_ich8lan(hw, false)) e1000_lv_jumbo_workaround_ich8lan(hw, false))
e_dbg("failed to disable jumbo frame workaround mode\n"); e_dbg("failed to disable jumbo frame workaround mode\n");
if (reset && !pci_channel_offline(adapter->pdev)) if (!pci_channel_offline(adapter->pdev)) {
e1000e_reset(adapter); if (reset)
e1000e_reset(adapter);
else if (hw->mac.type == e1000_pch_spt)
e1000_flush_desc_rings(adapter);
}
e1000_clean_tx_ring(adapter->tx_ring);
e1000_clean_rx_ring(adapter->rx_ring);
} }
void e1000e_reinit_locked(struct e1000_adapter *adapter) void e1000e_reinit_locked(struct e1000_adapter *adapter)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment