Commit 37e738b6 authored by Karol Kolacinski's avatar Karol Kolacinski Committed by Tony Nguyen

ice: Don't put stale timestamps in the skb

The driver has to check if it does not accidentally put the timestamp in
the SKB before previous timestamp gets overwritten.
Timestamp values in the PHY are read only and do not get cleared except
at hardware reset or when a new timestamp value is captured.
The cached_tstamp field is used to detect the case where a new timestamp
has not yet been captured, ensuring that we avoid sending stale
timestamp data to the stack.

Fixes: ea9b847c ("ice: enable transmit timestamps for E810 devices")
Signed-off-by: default avatarKarol Kolacinski <karol.kolacinski@intel.com>
Tested-by: default avatarGurucharan G <gurucharanx.g@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 0013881c
...@@ -1540,19 +1540,16 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work) ...@@ -1540,19 +1540,16 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work)
if (err) if (err)
continue; continue;
/* Check if the timestamp is valid */ /* Check if the timestamp is invalid or stale */
if (!(raw_tstamp & ICE_PTP_TS_VALID)) if (!(raw_tstamp & ICE_PTP_TS_VALID) ||
raw_tstamp == tx->tstamps[idx].cached_tstamp)
continue; continue;
/* clear the timestamp register, so that it won't show valid
* again when re-used.
*/
ice_clear_phy_tstamp(hw, tx->quad, phy_idx);
/* The timestamp is valid, so we'll go ahead and clear this /* The timestamp is valid, so we'll go ahead and clear this
* index and then send the timestamp up to the stack. * index and then send the timestamp up to the stack.
*/ */
spin_lock(&tx->lock); spin_lock(&tx->lock);
tx->tstamps[idx].cached_tstamp = raw_tstamp;
clear_bit(idx, tx->in_use); clear_bit(idx, tx->in_use);
skb = tx->tstamps[idx].skb; skb = tx->tstamps[idx].skb;
tx->tstamps[idx].skb = NULL; tx->tstamps[idx].skb = NULL;
......
...@@ -55,15 +55,21 @@ struct ice_perout_channel { ...@@ -55,15 +55,21 @@ struct ice_perout_channel {
* struct ice_tx_tstamp - Tracking for a single Tx timestamp * struct ice_tx_tstamp - Tracking for a single Tx timestamp
* @skb: pointer to the SKB for this timestamp request * @skb: pointer to the SKB for this timestamp request
* @start: jiffies when the timestamp was first requested * @start: jiffies when the timestamp was first requested
* @cached_tstamp: last read timestamp
* *
* This structure tracks a single timestamp request. The SKB pointer is * This structure tracks a single timestamp request. The SKB pointer is
* provided when initiating a request. The start time is used to ensure that * provided when initiating a request. The start time is used to ensure that
* we discard old requests that were not fulfilled within a 2 second time * we discard old requests that were not fulfilled within a 2 second time
* window. * window.
* Timestamp values in the PHY are read only and do not get cleared except at
* hardware reset or when a new timestamp value is captured. The cached_tstamp
* field is used to detect the case where a new timestamp has not yet been
* captured, ensuring that we avoid sending stale timestamp data to the stack.
*/ */
struct ice_tx_tstamp { struct ice_tx_tstamp {
struct sk_buff *skb; struct sk_buff *skb;
unsigned long start; unsigned long start;
u64 cached_tstamp;
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment