From: Carolina Jubran cjubran@nvidia.com
[ Upstream commit 6b81b8a0b1978284e007566d7a1607b47f92209f ]
Update mlx5e_stats_fec_get() to check the active FEC mode and skip statistics collection when FEC is disabled.
Signed-off-by: Carolina Jubran cjubran@nvidia.com Reviewed-by: Dragos Tatulea dtatulea@nvidia.com Reviewed-by: Yael Chemla ychemla@nvidia.com Signed-off-by: Vadim Fedorenko vadim.fedorenko@linux.dev Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com Link: https://patch.msgid.link/20250924124037.1508846-3-vadim.fedorenko@linux.dev Signed-off-by: Jakub Kicinski kuba@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES - `drivers/net/ethernet/mellanox/mlx5/core/en_stats.c:1611` now checks `mode == MLX5E_FEC_NOFEC` before touching the PPCNT register groups, so the driver stops trying to read FEC statistics when hardware reports that FEC is disabled. Previously `mlx5e_stats_fec_get()` still called `fec_set_corrected_bits_total()` even in that state, so every FEC stats query attempted an unsupported PPCNT access. - Those reads go through `mlx5_core_access_reg()` with `verbose=true` (`drivers/net/ethernet/mellanox/mlx5/core/port.c:36-83`), which means firmware failures get logged and waste command bandwidth. Admins hit this whenever tools poll FEC stats on links running without FEC, so it is a user-visible bug. - Passing the already computed `mode` into `fec_set_block_stats()` (`drivers/net/ethernet/mellanox/mlx5/core/en_stats.c:1448-1471` and `:1616`) keeps the existing per-mode handling while avoiding redundant `fec_active_mode()` calls; no other callers are affected, so the change stays self-contained. - The patch introduces no new features or interfaces—it simply avoids querying counters that do not exist in the “no FEC” configuration—so it satisfies stable rules (clear bug fix, minimal risk, contained to the mlx5e stats code) and should be backported.
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c index c6185ddba04b8..9c45c6e670ebf 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c @@ -1446,16 +1446,13 @@ static void fec_set_rs_stats(struct ethtool_fec_stats *fec_stats, u32 *ppcnt) }
static void fec_set_block_stats(struct mlx5e_priv *priv, + int mode, struct ethtool_fec_stats *fec_stats) { struct mlx5_core_dev *mdev = priv->mdev; u32 out[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); - int mode = fec_active_mode(mdev); - - if (mode == MLX5E_FEC_NOFEC) - return;
MLX5_SET(ppcnt_reg, in, local_port, 1); MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP); @@ -1497,11 +1494,14 @@ static void fec_set_corrected_bits_total(struct mlx5e_priv *priv, void mlx5e_stats_fec_get(struct mlx5e_priv *priv, struct ethtool_fec_stats *fec_stats) { - if (!MLX5_CAP_PCAM_FEATURE(priv->mdev, ppcnt_statistical_group)) + int mode = fec_active_mode(priv->mdev); + + if (mode == MLX5E_FEC_NOFEC || + !MLX5_CAP_PCAM_FEATURE(priv->mdev, ppcnt_statistical_group)) return;
fec_set_corrected_bits_total(priv, fec_stats); - fec_set_block_stats(priv, fec_stats); + fec_set_block_stats(priv, mode, fec_stats); }
#define PPORT_ETH_EXT_OFF(c) \