]> www.infradead.org Git - users/hch/misc.git/commitdiff
net/mlx5e: Report RS-FEC histogram statistics via ethtool
authorCarolina Jubran <cjubran@nvidia.com>
Wed, 24 Sep 2025 12:40:36 +0000 (12:40 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 26 Sep 2025 23:49:27 +0000 (16:49 -0700)
Add support for reporting RS-FEC histogram counters by reading them
from the RS_FEC_HISTOGRAM_GROUP in the PPCNT register.

Co-developed-by: Yael Chemla <ychemla@nvidia.com>
Signed-off-by: Yael Chemla <ychemla@nvidia.com>
Signed-off-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Yael Chemla <ychemla@nvidia.com>
Link: https://patch.msgid.link/20250924124037.1508846-5-vadim.fedorenko@linux.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c

index f1887b9afa3d6019646a615ba8a817d3bc5ea066..7c029a7d0fd7e668c9bf2e5b8cae5a21c9818df8 100644 (file)
@@ -1555,15 +1555,47 @@ fec_rs_histogram_fill_ranges(struct mlx5e_priv *priv, int mode,
        return num_of_bins;
 }
 
+static void fec_rs_histogram_fill_stats(struct mlx5e_priv *priv,
+                                       u8 num_of_bins,
+                                       struct ethtool_fec_hist *hist)
+{
+       struct mlx5_core_dev *mdev = priv->mdev;
+       u32 out[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
+       u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
+       int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
+       void *rs_histogram_cntrs;
+
+       MLX5_SET(ppcnt_reg, in, local_port, 1);
+       MLX5_SET(ppcnt_reg, in, grp, MLX5_RS_FEC_HISTOGRAM_GROUP);
+       if (mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0))
+               return;
+
+       rs_histogram_cntrs = MLX5_ADDR_OF(ppcnt_reg, out,
+                                         counter_set.rs_histogram_cntrs);
+       /* Guaranteed that num_of_bins is less than MLX5E_FEC_RS_HIST_MAX
+        * by fec_rs_histogram_fill_ranges().
+        */
+       for (int i = 0; i < num_of_bins; i++)
+               hist->values[i].sum = MLX5_GET64(rs_histogram_cntrs,
+                                                rs_histogram_cntrs,
+                                                hist[i]);
+}
+
 static void fec_set_histograms_stats(struct mlx5e_priv *priv, int mode,
                                     struct ethtool_fec_hist *hist)
 {
+       u8 num_of_bins;
+
        switch (mode) {
        case MLX5E_FEC_RS_528_514:
        case MLX5E_FEC_RS_544_514:
        case MLX5E_FEC_LLRS_272_257_1:
        case MLX5E_FEC_RS_544_514_INTERLEAVED_QUAD:
-               fec_rs_histogram_fill_ranges(priv, mode, &hist->ranges);
+               num_of_bins =
+                       fec_rs_histogram_fill_ranges(priv, mode, &hist->ranges);
+               if (num_of_bins)
+                       return fec_rs_histogram_fill_stats(priv, num_of_bins,
+                                                          hist);
                break;
        default:
                return;