diff options
author | Jakub Kicinski <kubakici@wp.pl> | 2014-03-15 10:55:00 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-03-28 09:54:01 -0400 |
commit | 59c871c5f0540c974db85eaa77f518de26940c1f (patch) | |
tree | 0dfcd92ddb191648b8cc2578ddade2e5dbdd7b92 /drivers/net/ethernet/intel/e1000e/netdev.c | |
parent | 13c2884f155bc524c5e94482216030de480fea60 (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.c | 7 |
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); |