mirror of
https://github.com/torvalds/linux.git
synced 2026-09-13 15:40:03 +02:00
Merge branch 'net-mlx5e-rs-fec-variant-fixes'
Tariq Toukan says: ==================== net/mlx5e: RS FEC variant fixes This series by Shahar fixes three related bugs in the RS FEC handling for mlx5e, all stemming from incomplete coverage of the three RS FEC hardware variants: RS_528_514 (bit 2), RS_544_514_INTERLEAVED_QUAD (bit 4), and RS_544_514 (bit 7). ==================== Link: https://patch.msgid.link/20260902164634.3657606-1-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
502381cf73
|
|
@ -557,6 +557,7 @@ int mlx5e_set_fec_mode(struct mlx5_core_dev *dev, u16 fec_policy)
|
|||
u32 in[MLX5_ST_SZ_DW(pplm_reg)] = {};
|
||||
int sz = MLX5_ST_SZ_BYTES(pplm_reg);
|
||||
u16 fec_policy_auto = 0;
|
||||
bool fec_set = false;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
|
|
@ -569,9 +570,6 @@ int mlx5e_set_fec_mode(struct mlx5_core_dev *dev, u16 fec_policy)
|
|||
if (fec_policy >= (1 << MLX5E_FEC_LLRS_272_257_1) && !fec_50g_per_lane)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (fec_policy && !mlx5e_fec_in_caps(dev, fec_policy))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
MLX5_SET(pplm_reg, in, local_port, 1);
|
||||
err = mlx5_core_access_reg(dev, in, sz, out, sz, MLX5_REG_PPLM, 0, 0);
|
||||
if (err)
|
||||
|
|
@ -591,12 +589,17 @@ int mlx5e_set_fec_mode(struct mlx5_core_dev *dev, u16 fec_policy)
|
|||
mlx5e_get_fec_cap_field(out, &fec_caps, i);
|
||||
|
||||
/* policy supported for link speed */
|
||||
if (fec_caps & conf_fec)
|
||||
if (fec_caps & conf_fec) {
|
||||
mlx5e_fec_admin_field(out, &conf_fec, 1, i);
|
||||
else
|
||||
/* set FEC to auto*/
|
||||
fec_set = true;
|
||||
} else {
|
||||
/* set FEC to auto */
|
||||
mlx5e_fec_admin_field(out, &fec_policy_auto, 1, i);
|
||||
}
|
||||
}
|
||||
|
||||
if (fec_policy && !fec_set)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return mlx5_core_access_reg(dev, out, sz, out, sz, MLX5_REG_PPLM, 0, 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,4 +66,8 @@ enum {
|
|||
MLX5E_FEC_LLRS_272_257_1 = 9,
|
||||
};
|
||||
|
||||
#define MLX5E_FEC_RS_MASK (BIT(MLX5E_FEC_RS_528_514) | \
|
||||
BIT(MLX5E_FEC_RS_544_514_INTERLEAVED_QUAD) | \
|
||||
BIT(MLX5E_FEC_RS_544_514))
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1002,9 +1002,9 @@ static u32 pplm2ethtool_fec(u_long fec_mode, unsigned long size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define MLX5E_ADVERTISE_SUPPORTED_FEC(mlx5_fec, ethtool_fec) \
|
||||
#define MLX5E_ADVERTISE_SUPPORTED_FEC(fec_mask, ethtool_fec) \
|
||||
do { \
|
||||
if (mlx5e_fec_in_caps(dev, 1 << (mlx5_fec))) \
|
||||
if (mlx5e_fec_in_caps(dev, fec_mask)) \
|
||||
__set_bit(ethtool_fec, \
|
||||
link_ksettings->link_modes.supported);\
|
||||
} while (0)
|
||||
|
|
@ -1013,6 +1013,7 @@ static const u32 pplm_fec_2_ethtool_linkmodes[] = {
|
|||
[MLX5E_FEC_NOFEC] = ETHTOOL_LINK_MODE_FEC_NONE_BIT,
|
||||
[MLX5E_FEC_FIRECODE] = ETHTOOL_LINK_MODE_FEC_BASER_BIT,
|
||||
[MLX5E_FEC_RS_528_514] = ETHTOOL_LINK_MODE_FEC_RS_BIT,
|
||||
[MLX5E_FEC_RS_544_514_INTERLEAVED_QUAD] = ETHTOOL_LINK_MODE_FEC_RS_BIT,
|
||||
[MLX5E_FEC_RS_544_514] = ETHTOOL_LINK_MODE_FEC_RS_BIT,
|
||||
[MLX5E_FEC_LLRS_272_257_1] = ETHTOOL_LINK_MODE_FEC_LLRS_BIT,
|
||||
};
|
||||
|
|
@ -1029,13 +1030,13 @@ static int get_fec_supported_advertised(struct mlx5_core_dev *dev,
|
|||
if (err)
|
||||
return (err == -EOPNOTSUPP) ? 0 : err;
|
||||
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(MLX5E_FEC_NOFEC,
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(BIT(MLX5E_FEC_NOFEC),
|
||||
ETHTOOL_LINK_MODE_FEC_NONE_BIT);
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(MLX5E_FEC_FIRECODE,
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(BIT(MLX5E_FEC_FIRECODE),
|
||||
ETHTOOL_LINK_MODE_FEC_BASER_BIT);
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(MLX5E_FEC_RS_528_514,
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(MLX5E_FEC_RS_MASK,
|
||||
ETHTOOL_LINK_MODE_FEC_RS_BIT);
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(MLX5E_FEC_LLRS_272_257_1,
|
||||
MLX5E_ADVERTISE_SUPPORTED_FEC(BIT(MLX5E_FEC_LLRS_272_257_1),
|
||||
ETHTOOL_LINK_MODE_FEC_LLRS_BIT);
|
||||
|
||||
active_fec_long = active_fec;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user