sandr Loktionov Link: https://patch.msgid.link/20250924124037.1508846-3-vadim.fedorenko@linux.dev Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- 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) \ -- 2.51.0[PATCH AUTOSEL 6.17-6.1] net/mlx5e: Don't query FEC statistics when FEC is disabledSasha Levin undefinedpatches@lists.linux.dev, stable@vger.kernel.org undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined{&