|
|
@@ -1183,6 +1183,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
|
|
|
if (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) {
|
|
|
+ struct sk_buff *skb = adapter->tx_hwtstamp_skb;
|
|
|
struct skb_shared_hwtstamps shhwtstamps;
|
|
|
u64 txstmp;
|
|
|
|
|
|
@@ -1191,9 +1192,14 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
|
|
|
|
|
|
e1000e_systim_to_hwtstamp(adapter, &shhwtstamps, txstmp);
|
|
|
|
|
|
- skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);
|
|
|
- dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
|
|
|
+ /* Clear the global tx_hwtstamp_skb pointer and force writes
|
|
|
+ * prior to notifying the stack of a Tx timestamp.
|
|
|
+ */
|
|
|
adapter->tx_hwtstamp_skb = NULL;
|
|
|
+ wmb(); /* force write prior to skb_tstamp_tx */
|
|
|
+
|
|
|
+ skb_tstamp_tx(skb, &shhwtstamps);
|
|
|
+ dev_kfree_skb_any(skb);
|
|
|
} else if (time_after(jiffies, adapter->tx_hwtstamp_start
|
|
|
+ adapter->tx_timeout_factor * HZ)) {
|
|
|
dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
|