|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
From 09357b00255c233705b1cf6d76a8d147340545b8 Mon Sep 17 00:00:00 2001
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Date: Fri, 18 Nov 2011 14:25:00 +0000
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Subject: [PATCH] e1000e: Avoid wrong check on TX hang
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Based on the original patch submitted my Michael Wang
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
<wangyun@linux.vnet.ibm.com>.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Descriptors may not be write-back while checking TX hang with flag
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
FLAG2_DMA_BURST on.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
So when we detect hang, we just flush the descriptor and detect
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
again for once.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
-v2 change 1 to true and 0 to false and remove extra ()
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
CC: Michael Wang <wangyun@linux.vnet.ibm.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
CC: Flavio Leitner <fbl@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Acked-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
---
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
drivers/net/ethernet/intel/e1000e/e1000.h | 1 +
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
drivers/net/ethernet/intel/e1000e/netdev.c | 23 ++++++++++++++++++++---
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
2 files changed, 21 insertions(+), 3 deletions(-)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
index 9fe18d1..f478a22 100644
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
--- a/drivers/net/ethernet/intel/e1000e/e1000.h
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+++ b/drivers/net/ethernet/intel/e1000e/e1000.h
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
@@ -309,6 +309,7 @@ struct e1000_adapter {
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
u32 txd_cmd;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
bool detect_tx_hung;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ bool tx_hang_recheck;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
u8 tx_timeout_factor;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
u32 tx_int_delay;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
index c6e9763..c12df69 100644
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
@@ -1014,6 +1014,7 @@ static void e1000_print_hw_hang(struct work_struct *work)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
struct e1000_adapter *adapter = container_of(work,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
struct e1000_adapter,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
print_hang_task);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ struct net_device *netdev = adapter->netdev;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
struct e1000_ring *tx_ring = adapter->tx_ring;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
unsigned int i = tx_ring->next_to_clean;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
unsigned int eop = tx_ring->buffer_info[i].next_to_watch;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
@@ -1025,6 +1026,21 @@ static void e1000_print_hw_hang(struct work_struct *work)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
if (test_bit(__E1000_DOWN, &adapter->state))
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
return;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ if (!adapter->tx_hang_recheck &&
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ (adapter->flags2 & FLAG2_DMA_BURST)) {
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ /* May be block on write-back, flush and detect again
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ * flush pending descriptor writebacks to memory
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ */
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ /* execute the writes immediately */
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ e1e_flush();
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ adapter->tx_hang_recheck = true;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ return;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ /* Real hang detected */
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ adapter->tx_hang_recheck = false;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ netif_stop_queue(netdev);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
e1e_rphy(hw, PHY_STATUS, &phy_status);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
@@ -1145,10 +1161,10 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
if (tx_ring->buffer_info[i].time_stamp &&
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
time_after(jiffies, tx_ring->buffer_info[i].time_stamp
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ (adapter->tx_timeout_factor * HZ)) &&
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
- !(er32(STATUS) & E1000_STATUS_TXOFF)) {
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ !(er32(STATUS) & E1000_STATUS_TXOFF))
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
schedule_work(&adapter->print_hang_task);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
- netif_stop_queue(netdev);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
- }
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ else
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ adapter->tx_hang_recheck = false;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
}
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
adapter->total_tx_bytes += total_tx_bytes;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
adapter->total_tx_packets += total_tx_packets;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
@@ -3838,6 +3854,7 @@ static int e1000_open(struct net_device *netdev)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
e1000_irq_enable(adapter);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
+ adapter->tx_hang_recheck = false;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
netif_start_queue(netdev);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
adapter->idle_check = true;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
--
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
1.7.9
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
71aea6e |
|