|
@@ -70,6 +70,7 @@
|
|
|
*/
|
|
|
|
|
|
#define IGB_SYSTIM_OVERFLOW_PERIOD (HZ * 60 * 9)
|
|
|
+#define IGB_PTP_TX_TIMEOUT (HZ * 15)
|
|
|
#define INCPERIOD_82576 (1 << E1000_TIMINCA_16NS_SHIFT)
|
|
|
#define INCVALUE_82576_MASK ((1 << E1000_TIMINCA_16NS_SHIFT) - 1)
|
|
|
#define INCVALUE_82576 (16 << IGB_82576_TSYNC_SHIFT)
|
|
@@ -396,6 +397,15 @@ void igb_ptp_tx_work(struct work_struct *work)
|
|
|
if (!adapter->ptp_tx_skb)
|
|
|
return;
|
|
|
|
|
|
+ if (time_is_before_jiffies(adapter->ptp_tx_start +
|
|
|
+ IGB_PTP_TX_TIMEOUT)) {
|
|
|
+ dev_kfree_skb_any(adapter->ptp_tx_skb);
|
|
|
+ adapter->ptp_tx_skb = NULL;
|
|
|
+ adapter->tx_hwtstamp_timeouts++;
|
|
|
+ dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
tsynctxctl = rd32(E1000_TSYNCTXCTL);
|
|
|
if (tsynctxctl & E1000_TSYNCTXCTL_VALID)
|
|
|
igb_ptp_tx_hwtstamp(adapter);
|