Skip to content

Commit 6a1cf4e

Browse files
ayalevin123Saeed Mahameed
authored andcommitted
net/mlx5e: Fix 50G per lane indication
Some released FW versions mistakenly don't set the capability that 50G per lane link-modes are supported for VFs (ptys_extended_ethernet capability bit). When the capability is unset, read PTYS.ext_eth_proto_capability (always reliable). If PTYS.ext_eth_proto_capability is valid (has a non-zero value) conclude that the HCA supports 50G per lane. Otherwise, conclude that the HCA doesn't support 50G per lane. Fixes: a08b4ed ("net/mlx5: Add support to ext_* fields introduced in Port Type and Speed register") Signed-off-by: Aya Levin <[email protected]> Reviewed-by: Eran Ben Elisha <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent f4aebbf commit 6a1cf4e

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/port.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,26 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = {
7878
[MLX5E_400GAUI_8] = 400000,
7979
};
8080

81+
bool mlx5e_ptys_ext_supported(struct mlx5_core_dev *mdev)
82+
{
83+
struct mlx5e_port_eth_proto eproto;
84+
int err;
85+
86+
if (MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet))
87+
return true;
88+
89+
err = mlx5_port_query_eth_proto(mdev, 1, true, &eproto);
90+
if (err)
91+
return false;
92+
93+
return !!eproto.cap;
94+
}
95+
8196
static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev,
8297
const u32 **arr, u32 *size,
8398
bool force_legacy)
8499
{
85-
bool ext = force_legacy ? false : MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
100+
bool ext = force_legacy ? false : mlx5e_ptys_ext_supported(mdev);
86101

87102
*size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) :
88103
ARRAY_SIZE(mlx5e_link_speed);
@@ -177,7 +192,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
177192
bool ext;
178193
int err;
179194

180-
ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
195+
ext = mlx5e_ptys_ext_supported(mdev);
181196
err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
182197
if (err)
183198
goto out;
@@ -205,7 +220,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
205220
int err;
206221
int i;
207222

208-
ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
223+
ext = mlx5e_ptys_ext_supported(mdev);
209224
err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
210225
if (err)
211226
return err;

drivers/net/ethernet/mellanox/mlx5/core/en/port.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
5454
int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
5555
u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,
5656
bool force_legacy);
57-
57+
bool mlx5e_ptys_ext_supported(struct mlx5_core_dev *mdev);
5858
int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out);
5959
int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in);
6060
int mlx5e_port_query_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer);

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void mlx5e_ethtool_get_speed_arr(struct mlx5_core_dev *mdev,
200200
struct ptys2ethtool_config **arr,
201201
u32 *size)
202202
{
203-
bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
203+
bool ext = mlx5e_ptys_ext_supported(mdev);
204204

205205
*arr = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table;
206206
*size = ext ? ARRAY_SIZE(ptys2ext_ethtool_table) :
@@ -883,7 +883,7 @@ static void get_lp_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_lp,
883883
struct ethtool_link_ksettings *link_ksettings)
884884
{
885885
unsigned long *lp_advertising = link_ksettings->link_modes.lp_advertising;
886-
bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
886+
bool ext = mlx5e_ptys_ext_supported(mdev);
887887

888888
ptys2ethtool_adver_link(lp_advertising, eth_proto_lp, ext);
889889
}
@@ -913,7 +913,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
913913
__func__, err);
914914
goto err_query_regs;
915915
}
916-
ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
916+
ext = !!MLX5_GET_ETH_PROTO(ptys_reg, out, true, eth_proto_capability);
917917
eth_proto_cap = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
918918
eth_proto_capability);
919919
eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
@@ -1066,7 +1066,7 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
10661066
autoneg = link_ksettings->base.autoneg;
10671067
speed = link_ksettings->base.speed;
10681068

1069-
ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
1069+
ext_supported = mlx5e_ptys_ext_supported(mdev);
10701070
ext = ext_requested(autoneg, adver, ext_supported);
10711071
if (!ext_supported && ext)
10721072
return -EOPNOTSUPP;

0 commit comments

Comments
 (0)