Commit f020481b authored by Jacob Keller's avatar Jacob Keller Committed by Tony Nguyen

ice: track Tx timestamp stats similar to other Intel drivers

Several Intel networking drivers which support PTP track when Tx timestamps
are skipped or when they timeout without a timestamp from hardware. The
conditions which could cause these events are rare, but it can be useful to
know when and how often they occur.

Implement similar statistics for the ice driver, tx_hwtstamp_skipped,
tx_hwtstamp_timeouts, and tx_hwtstamp_flushed.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent cf6b82fd
...@@ -136,6 +136,9 @@ static const struct ice_stats ice_gstrings_pf_stats[] = { ...@@ -136,6 +136,9 @@ static const struct ice_stats ice_gstrings_pf_stats[] = {
ICE_PF_STAT("mac_remote_faults.nic", stats.mac_remote_faults), ICE_PF_STAT("mac_remote_faults.nic", stats.mac_remote_faults),
ICE_PF_STAT("fdir_sb_match.nic", stats.fd_sb_match), ICE_PF_STAT("fdir_sb_match.nic", stats.fd_sb_match),
ICE_PF_STAT("fdir_sb_status.nic", stats.fd_sb_status), ICE_PF_STAT("fdir_sb_status.nic", stats.fd_sb_status),
ICE_PF_STAT("tx_hwtstamp_skipped", ptp.tx_hwtstamp_skipped),
ICE_PF_STAT("tx_hwtstamp_timeouts", ptp.tx_hwtstamp_timeouts),
ICE_PF_STAT("tx_hwtstamp_flushed", ptp.tx_hwtstamp_flushed),
}; };
static const u32 ice_regs_dump_list[] = { static const u32 ice_regs_dump_list[] = {
......
...@@ -2219,6 +2219,7 @@ ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) ...@@ -2219,6 +2219,7 @@ ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx)
if (tx->tstamps[idx].skb) { if (tx->tstamps[idx].skb) {
dev_kfree_skb_any(tx->tstamps[idx].skb); dev_kfree_skb_any(tx->tstamps[idx].skb);
tx->tstamps[idx].skb = NULL; tx->tstamps[idx].skb = NULL;
pf->ptp.tx_hwtstamp_flushed++;
} }
clear_bit(idx, tx->in_use); clear_bit(idx, tx->in_use);
spin_unlock(&tx->lock); spin_unlock(&tx->lock);
...@@ -2295,7 +2296,7 @@ ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx) ...@@ -2295,7 +2296,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 * ice_ptp_tx_tstamp_cleanup - Cleanup old timestamp requests that got dropped
* @hw: pointer to the hw struct * @pf: pointer to the PF struct
* @tx: PTP Tx tracker to clean up * @tx: PTP Tx tracker to clean up
* *
* Loop through the Tx timestamp requests and see if any of them have been * Loop through the Tx timestamp requests and see if any of them have been
...@@ -2304,8 +2305,9 @@ ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx) ...@@ -2304,8 +2305,9 @@ 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 * timestamp will never be captured. This might happen if the packet gets
* discarded before it reaches the PHY timestamping block. * discarded before it reaches the PHY timestamping block.
*/ */
static void ice_ptp_tx_tstamp_cleanup(struct ice_hw *hw, struct ice_ptp_tx *tx) static void ice_ptp_tx_tstamp_cleanup(struct ice_pf *pf, struct ice_ptp_tx *tx)
{ {
struct ice_hw *hw = &pf->hw;
u8 idx; u8 idx;
if (!tx->init) if (!tx->init)
...@@ -2329,6 +2331,9 @@ static void ice_ptp_tx_tstamp_cleanup(struct ice_hw *hw, struct ice_ptp_tx *tx) ...@@ -2329,6 +2331,9 @@ static void ice_ptp_tx_tstamp_cleanup(struct ice_hw *hw, struct ice_ptp_tx *tx)
clear_bit(idx, tx->in_use); clear_bit(idx, tx->in_use);
spin_unlock(&tx->lock); spin_unlock(&tx->lock);
/* Count the number of Tx timestamps which have timed out */
pf->ptp.tx_hwtstamp_timeouts++;
/* Free the SKB after we've cleared the bit */ /* Free the SKB after we've cleared the bit */
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} }
...@@ -2345,7 +2350,7 @@ static void ice_ptp_periodic_work(struct kthread_work *work) ...@@ -2345,7 +2350,7 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
err = ice_ptp_update_cached_phctime(pf); err = ice_ptp_update_cached_phctime(pf);
ice_ptp_tx_tstamp_cleanup(&pf->hw, &pf->ptp.port.tx); ice_ptp_tx_tstamp_cleanup(pf, &pf->ptp.port.tx);
/* Run twice a second or reschedule if phc update failed */ /* Run twice a second or reschedule if phc update failed */
kthread_queue_delayed_work(ptp->kworker, &ptp->work, kthread_queue_delayed_work(ptp->kworker, &ptp->work,
......
...@@ -171,6 +171,9 @@ struct ice_ptp_port { ...@@ -171,6 +171,9 @@ struct ice_ptp_port {
* @clock: pointer to registered PTP clock device * @clock: pointer to registered PTP clock device
* @tstamp_config: hardware timestamping configuration * @tstamp_config: hardware timestamping configuration
* @reset_time: kernel time after clock stop on reset * @reset_time: kernel time after clock stop on reset
* @tx_hwtstamp_skipped: number of Tx time stamp requests skipped
* @tx_hwtstamp_timeouts: number of Tx skbs discarded with no time stamp
* @tx_hwtstamp_flushed: number of Tx skbs flushed due to interface closed
*/ */
struct ice_ptp { struct ice_ptp {
struct ice_ptp_port port; struct ice_ptp_port port;
...@@ -185,6 +188,9 @@ struct ice_ptp { ...@@ -185,6 +188,9 @@ struct ice_ptp {
struct ptp_clock *clock; struct ptp_clock *clock;
struct hwtstamp_config tstamp_config; struct hwtstamp_config tstamp_config;
u64 reset_time; u64 reset_time;
u32 tx_hwtstamp_skipped;
u32 tx_hwtstamp_timeouts;
u32 tx_hwtstamp_flushed;
}; };
#define __ptp_port_to_ptp(p) \ #define __ptp_port_to_ptp(p) \
......
...@@ -2255,8 +2255,10 @@ ice_tstamp(struct ice_tx_ring *tx_ring, struct sk_buff *skb, ...@@ -2255,8 +2255,10 @@ ice_tstamp(struct ice_tx_ring *tx_ring, struct sk_buff *skb,
/* Grab an open timestamp slot */ /* Grab an open timestamp slot */
idx = ice_ptp_request_ts(tx_ring->tx_tstamps, skb); idx = ice_ptp_request_ts(tx_ring->tx_tstamps, skb);
if (idx < 0) if (idx < 0) {
tx_ring->vsi->back->ptp.tx_hwtstamp_skipped++;
return; return;
}
off->cd_qw1 |= (u64)(ICE_TX_DESC_DTYPE_CTX | off->cd_qw1 |= (u64)(ICE_TX_DESC_DTYPE_CTX |
(ICE_TX_CTX_DESC_TSYN << ICE_TXD_CTX_QW1_CMD_S) | (ICE_TX_CTX_DESC_TSYN << ICE_TXD_CTX_QW1_CMD_S) |
......
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