Message ID | 20220420122302.574-1-michal.michalik@intel.com |
---|---|
State | Accepted |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | [net,v2] ice: fix PTP stale Tx timestamps cleanup | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Michal Michalik > Sent: Wednesday, April 20, 2022 5:53 PM > To: intel-wired-lan@lists.osuosl.org > Cc: Michalik, Michal <michal.michalik@intel.com> > Subject: [Intel-wired-lan] [PATCH net v2] ice: fix PTP stale Tx timestamps > cleanup > > Read stale PTP Tx timestamps from PHY on cleanup. > > After running out of Tx timestamps request handlers, hardware (HW) stops > reporting finished requests. Function ice_ptp_tx_tstamp_cleanup() used to > only clean up stale handlers in driver and was leaving the hardware registers > not read. Not reading stale PTP Tx timestamps prevents next interrupts from > arriving and makes timestamping unusable. > > v2: > - update commit message, > - added a comment to ice_read_phy_tstamp() call to clarify intentions. > > v1[1] > > [1] https://patchwork.ozlabs.org/project/intel-wired- > lan/patch/20220414102358.13486-1-michal.michalik@intel.com/#2876713 > > Fixes: ea9b847cda64 ("ice: enable transmit timestamps for E810 devices") > Signed-off-by: Michal Michalik <michal.michalik@intel.com> > Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> > Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> > --- > drivers/net/ethernet/intel/ice/ice_ptp.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c index a1cd332..da025c2 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -2287,6 +2287,7 @@ ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx) /** * ice_ptp_tx_tstamp_cleanup - Cleanup old timestamp requests that got dropped + * @hw: pointer to the hw struct * @tx: PTP Tx tracker to clean up * * Loop through the Tx timestamp requests and see if any of them have been @@ -2295,7 +2296,7 @@ ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx) * timestamp will never be captured. This might happen if the packet gets * discarded before it reaches the PHY timestamping block. */ -static void ice_ptp_tx_tstamp_cleanup(struct ice_ptp_tx *tx) +static void ice_ptp_tx_tstamp_cleanup(struct ice_hw *hw, struct ice_ptp_tx *tx) { u8 idx; @@ -2304,11 +2305,16 @@ static void ice_ptp_tx_tstamp_cleanup(struct ice_ptp_tx *tx) for_each_set_bit(idx, tx->in_use, tx->len) { struct sk_buff *skb; + u64 raw_tstamp; /* Check if this SKB has been waiting for too long */ if (time_is_after_jiffies(tx->tstamps[idx].start + 2 * HZ)) continue; + /* Read tstamp to be able to use this register again */ + ice_read_phy_tstamp(hw, tx->quad, idx + tx->quad_offset, + &raw_tstamp); + spin_lock(&tx->lock); skb = tx->tstamps[idx].skb; tx->tstamps[idx].skb = NULL; @@ -2330,7 +2336,7 @@ static void ice_ptp_periodic_work(struct kthread_work *work) ice_ptp_update_cached_phctime(pf); - ice_ptp_tx_tstamp_cleanup(&pf->ptp.port.tx); + ice_ptp_tx_tstamp_cleanup(&pf->hw, &pf->ptp.port.tx); /* Run twice a second */ kthread_queue_delayed_work(ptp->kworker, &ptp->work,