Skip to content

Commit dd1b9e0

Browse files
ayalevin123Saeed Mahameed
authored andcommitted
net/mlx5: ethtool, Allow legacy link-modes configuration via non-extended ptys
Allow configuration of legacy link-modes even when extended link-modes are supported. This requires reading of legacy advertisement even when extended link-modes are supported. Since legacy and extended advertisement are mutually excluded, wait for empty reply from extended advertisement before reading legacy advertisement. Fixes: 6a89737 ("net/mlx5: ethtool, Add ethtool support for 50Gbps per lane link modes") Signed-off-by: Aya Levin <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 8d047bf commit dd1b9e0

File tree

2 files changed

+31
-19
lines changed

2 files changed

+31
-19
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,6 @@ int mlx5_port_query_eth_proto(struct mlx5_core_dev *dev, u8 port, bool ext,
9696
if (!eproto)
9797
return -EINVAL;
9898

99-
if (ext != MLX5_CAP_PCAM_FEATURE(dev, ptys_extended_ethernet))
100-
return -EOPNOTSUPP;
101-
10299
err = mlx5_query_port_ptys(dev, out, sizeof(out), MLX5_PTYS_EN, port);
103100
if (err)
104101
return err;

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

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -603,16 +603,18 @@ static void ptys2ethtool_supported_link(struct mlx5_core_dev *mdev,
603603
__ETHTOOL_LINK_MODE_MASK_NBITS);
604604
}
605605

606-
static void ptys2ethtool_adver_link(struct mlx5_core_dev *mdev,
607-
unsigned long *advertising_modes,
608-
u32 eth_proto_cap)
606+
static void ptys2ethtool_adver_link(unsigned long *advertising_modes,
607+
u32 eth_proto_cap, bool ext)
609608
{
610609
unsigned long proto_cap = eth_proto_cap;
611610
struct ptys2ethtool_config *table;
612611
u32 max_size;
613612
int proto;
614613

615-
mlx5e_ethtool_get_speed_arr(mdev, &table, &max_size);
614+
table = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table;
615+
max_size = ext ? ARRAY_SIZE(ptys2ext_ethtool_table) :
616+
ARRAY_SIZE(ptys2legacy_ethtool_table);
617+
616618
for_each_set_bit(proto, &proto_cap, max_size)
617619
bitmap_or(advertising_modes, advertising_modes,
618620
table[proto].advertised,
@@ -794,12 +796,12 @@ static void get_supported(struct mlx5_core_dev *mdev, u32 eth_proto_cap,
794796
ethtool_link_ksettings_add_link_mode(link_ksettings, supported, Pause);
795797
}
796798

797-
static void get_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_cap,
798-
u8 tx_pause, u8 rx_pause,
799-
struct ethtool_link_ksettings *link_ksettings)
799+
static void get_advertising(u32 eth_proto_cap, u8 tx_pause, u8 rx_pause,
800+
struct ethtool_link_ksettings *link_ksettings,
801+
bool ext)
800802
{
801803
unsigned long *advertising = link_ksettings->link_modes.advertising;
802-
ptys2ethtool_adver_link(mdev, advertising, eth_proto_cap);
804+
ptys2ethtool_adver_link(advertising, eth_proto_cap, ext);
803805

804806
if (rx_pause)
805807
ethtool_link_ksettings_add_link_mode(link_ksettings, advertising, Pause);
@@ -854,8 +856,9 @@ static void get_lp_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_lp,
854856
struct ethtool_link_ksettings *link_ksettings)
855857
{
856858
unsigned long *lp_advertising = link_ksettings->link_modes.lp_advertising;
859+
bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
857860

858-
ptys2ethtool_adver_link(mdev, lp_advertising, eth_proto_lp);
861+
ptys2ethtool_adver_link(lp_advertising, eth_proto_lp, ext);
859862
}
860863

861864
int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
@@ -872,6 +875,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
872875
u8 an_disable_admin;
873876
u8 an_status;
874877
u8 connector_type;
878+
bool admin_ext;
875879
bool ext;
876880
int err;
877881

@@ -886,6 +890,19 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
886890
eth_proto_capability);
887891
eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
888892
eth_proto_admin);
893+
/* Fields: eth_proto_admin and ext_eth_proto_admin are
894+
* mutually exclusive. Hence try reading legacy advertising
895+
* when extended advertising is zero.
896+
* admin_ext indicates how eth_proto_admin should be
897+
* interpreted
898+
*/
899+
admin_ext = ext;
900+
if (ext && !eth_proto_admin) {
901+
eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, false,
902+
eth_proto_admin);
903+
admin_ext = false;
904+
}
905+
889906
eth_proto_oper = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
890907
eth_proto_oper);
891908
eth_proto_lp = MLX5_GET(ptys_reg, out, eth_proto_lp_advertise);
@@ -899,7 +916,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
899916
ethtool_link_ksettings_zero_link_mode(link_ksettings, advertising);
900917

901918
get_supported(mdev, eth_proto_cap, link_ksettings);
902-
get_advertising(mdev, eth_proto_admin, tx_pause, rx_pause, link_ksettings);
919+
get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings,
920+
admin_ext);
903921
get_speed_duplex(priv->netdev, eth_proto_oper, link_ksettings);
904922

905923
eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
@@ -1001,16 +1019,13 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
10011019
MLX5E_PTYS_EXT ||
10021020
link_ksettings->link_modes.advertising[1]);
10031021
ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
1004-
1005-
/*when ptys_extended_ethernet is set legacy link modes are deprecated */
1006-
if (ext_requested != ext_supported)
1007-
return -EPROTONOSUPPORT;
1022+
ext_requested &= ext_supported;
10081023

10091024
speed = link_ksettings->base.speed;
10101025
ethtool2ptys_adver_func = ext_requested ?
10111026
mlx5e_ethtool2ptys_ext_adver_link :
10121027
mlx5e_ethtool2ptys_adver_link;
1013-
err = mlx5_port_query_eth_proto(mdev, 1, ext_supported, &eproto);
1028+
err = mlx5_port_query_eth_proto(mdev, 1, ext_requested, &eproto);
10141029
if (err) {
10151030
netdev_err(priv->netdev, "%s: query port eth proto failed: %d\n",
10161031
__func__, err);
@@ -1038,7 +1053,7 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
10381053
if (!an_changes && link_modes == eproto.admin)
10391054
goto out;
10401055

1041-
mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_supported);
1056+
mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_requested);
10421057
mlx5_toggle_port_link(mdev);
10431058

10441059
out:

0 commit comments

Comments
 (0)