aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/e1000e/netdev.c
diff options
context:
space:
mode:
authorJakub Kicinski <kubakici@wp.pl>2014-03-15 10:55:00 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-03-28 09:54:01 -0400
commit59c871c5f0540c974db85eaa77f518de26940c1f (patch)
tree0dfcd92ddb191648b8cc2578ddade2e5dbdd7b92 /drivers/net/ethernet/intel/e1000e/netdev.c
parent13c2884f155bc524c5e94482216030de480fea60 (diff)
e1000e: add timeout for TX HW time stamping work
Hardware may fail to report time stamp e.g.: - when hardware time stamping is not enabled - when time stamp is requested shortly after ifup Timeout time stamp reading work to prevent it from scheduling itself indefinitely. Report timeout events via system log and device stats. Signed-off-by: Jakub Kicinski <kubakici@wp.pl> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
-rw-r--r--drivers/net/ethernet/intel/e1000e/netdev.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index 6bd1832e3f3e..b8d252fcad18 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -1163,6 +1163,12 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
1163 skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps); 1163 skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);
1164 dev_kfree_skb_any(adapter->tx_hwtstamp_skb); 1164 dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
1165 adapter->tx_hwtstamp_skb = NULL; 1165 adapter->tx_hwtstamp_skb = NULL;
1166 } else if (time_after(jiffies, adapter->tx_hwtstamp_start
1167 + adapter->tx_timeout_factor * HZ)) {
1168 dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
1169 adapter->tx_hwtstamp_skb = NULL;
1170 adapter->tx_hwtstamp_timeouts++;
1171 e_warn("clearing Tx timestamp hang");
1166 } else { 1172 } else {
1167 /* reschedule to check later */ 1173 /* reschedule to check later */
1168 schedule_work(&adapter->tx_hwtstamp_work); 1174 schedule_work(&adapter->tx_hwtstamp_work);
@@ -5567,6 +5573,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
5567 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; 5573 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
5568 tx_flags |= E1000_TX_FLAGS_HWTSTAMP; 5574 tx_flags |= E1000_TX_FLAGS_HWTSTAMP;
5569 adapter->tx_hwtstamp_skb = skb_get(skb); 5575 adapter->tx_hwtstamp_skb = skb_get(skb);
5576 adapter->tx_hwtstamp_start = jiffies;
5570 schedule_work(&adapter->tx_hwtstamp_work); 5577 schedule_work(&adapter->tx_hwtstamp_work);
5571 } else { 5578 } else {
5572 skb_tx_timestamp(skb); 5579 skb_tx_timestamp(skb);