diff options
| author | Carolina Jubran <cjubran@nvidia.com> | 2025-09-24 15:40:36 +0300 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-09-27 02:49:27 +0300 | 
| commit | ca80036839eb9556b08f62d4c655885c6670c2cc (patch) | |
| tree | 6c8feda6a5aab75ad4a258bb4cfead37fbdfb5bb | |
| parent | 44907e7c8fd0dec2d17ba8011bb7da443a9e4585 (diff) | |
| download | linux-ca80036839eb9556b08f62d4c655885c6670c2cc.tar.xz | |
net/mlx5e: Report RS-FEC histogram statistics via ethtool
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>
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | 34 | 
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c index f1887b9afa3d..7c029a7d0fd7 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c @@ -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;  | 
