net/mlx5e: Implement ethtool hardware timestamping statistics
authorRahul Rameshbabu <rrameshbabu@nvidia.com>
Wed, 3 Apr 2024 21:28:42 +0000 (14:28 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 6 Apr 2024 05:24:09 +0000 (22:24 -0700)
Feed driver statistics counters related to hardware timestamping to
standardized ethtool hardware timestamping statistics group.

Signed-off-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Link: https://lore.kernel.org/r/20240403212931.128541-5-rrameshbabu@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
drivers/net/ethernet/mellanox/mlx5/core/en_stats.h

index 93a13a478c117d8b15b1563a8b1702ee18eb5033..a4fe164a1c4c28e543a4f65120e929dc7590fb49 100644 (file)
@@ -2387,6 +2387,14 @@ static void mlx5e_get_rmon_stats(struct net_device *netdev,
        mlx5e_stats_rmon_get(priv, rmon_stats, ranges);
 }
 
+static void mlx5e_get_ts_stats(struct net_device *netdev,
+                              struct ethtool_ts_stats *ts_stats)
+{
+       struct mlx5e_priv *priv = netdev_priv(netdev);
+
+       mlx5e_stats_ts_get(priv, ts_stats);
+}
+
 const struct ethtool_ops mlx5e_ethtool_ops = {
        .cap_rss_ctx_supported  = true,
        .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
@@ -2436,5 +2444,6 @@ const struct ethtool_ops mlx5e_ethtool_ops = {
        .get_eth_mac_stats = mlx5e_get_eth_mac_stats,
        .get_eth_ctrl_stats = mlx5e_get_eth_ctrl_stats,
        .get_rmon_stats    = mlx5e_get_rmon_stats,
+       .get_ts_stats      = mlx5e_get_ts_stats,
        .get_link_ext_stats = mlx5e_get_link_ext_stats
 };
index aa1de8bf084102f70557551830dbf07f84e9b287..e211c41cec06a8bd4bc776af80dba5b342f7e3f4 100644 (file)
@@ -1172,6 +1172,51 @@ void mlx5e_stats_rmon_get(struct mlx5e_priv *priv,
        *ranges = mlx5e_rmon_ranges;
 }
 
+void mlx5e_stats_ts_get(struct mlx5e_priv *priv,
+                       struct ethtool_ts_stats *ts_stats)
+{
+       int i, j;
+
+       mutex_lock(&priv->state_lock);
+
+       if (priv->tx_ptp_opened) {
+               struct mlx5e_ptp *ptp = priv->channels.ptp;
+
+               ts_stats->pkts = 0;
+               ts_stats->err = 0;
+               ts_stats->lost = 0;
+
+               /* Aggregate stats across all TCs */
+               for (i = 0; i < ptp->num_tc; i++) {
+                       struct mlx5e_ptp_cq_stats *stats =
+                               ptp->ptpsq[i].cq_stats;
+
+                       ts_stats->pkts += stats->cqe;
+                       ts_stats->err += stats->abort + stats->err_cqe +
+                               stats->late_cqe;
+                       ts_stats->lost += stats->lost_cqe;
+               }
+       } else {
+               /* DMA layer will always successfully timestamp packets. Other
+                * counters do not make sense for this layer.
+                */
+               ts_stats->pkts = 0;
+
+               /* Aggregate stats across all SQs */
+               for (j = 0; j < priv->channels.num; j++) {
+                       struct mlx5e_channel *c = priv->channels.c[j];
+
+                       for (i = 0; i < c->num_tc; i++) {
+                               struct mlx5e_sq_stats *stats = c->sq[i].stats;
+
+                               ts_stats->pkts += stats->timestamps;
+                       }
+               }
+       }
+
+       mutex_unlock(&priv->state_lock);
+}
+
 #define PPORT_PHY_STATISTICAL_OFF(c) \
        MLX5_BYTE_OFF(ppcnt_reg, \
                      counter_set.phys_layer_statistical_cntrs.c##_high)
index b0090ad133aaf9b796229542098675953885c792..9cee4c9472e99f704c16985ebd1b62ffa8ceb29e 100644 (file)
@@ -128,6 +128,8 @@ void mlx5e_stats_eth_ctrl_get(struct mlx5e_priv *priv,
 void mlx5e_stats_rmon_get(struct mlx5e_priv *priv,
                          struct ethtool_rmon_stats *rmon,
                          const struct ethtool_rmon_hist_range **ranges);
+void mlx5e_stats_ts_get(struct mlx5e_priv *priv,
+                       struct ethtool_ts_stats *ts_stats);
 void mlx5e_get_link_ext_stats(struct net_device *dev,
                              struct ethtool_link_ext_stats *stats);