|
@@ -1163,6 +1163,12 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
|
|
|
skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);
|
|
|
dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
|
|
|
adapter->tx_hwtstamp_skb = NULL;
|
|
|
+ } else if (time_after(jiffies, adapter->tx_hwtstamp_start
|
|
|
+ + adapter->tx_timeout_factor * HZ)) {
|
|
|
+ dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
|
|
|
+ adapter->tx_hwtstamp_skb = NULL;
|
|
|
+ adapter->tx_hwtstamp_timeouts++;
|
|
|
+ e_warn("clearing Tx timestamp hang");
|
|
|
} else {
|
|
|
/* reschedule to check later */
|
|
|
schedule_work(&adapter->tx_hwtstamp_work);
|
|
@@ -5567,6 +5573,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
|
|
|
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
|
|
tx_flags |= E1000_TX_FLAGS_HWTSTAMP;
|
|
|
adapter->tx_hwtstamp_skb = skb_get(skb);
|
|
|
+ adapter->tx_hwtstamp_start = jiffies;
|
|
|
schedule_work(&adapter->tx_hwtstamp_work);
|
|
|
} else {
|
|
|
skb_tx_timestamp(skb);
|