net/mlx5e: Do not use non-EXT link modes in EXT mode
authorEran Ben Elisha <eranbe@mellanox.com>
Sun, 17 Nov 2019 13:17:05 +0000 (15:17 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 20 Nov 2019 20:33:05 +0000 (12:33 -0800)
On some old Firmwares, connector type value was not supported, and value
read from FW was 0. For those, driver used link mode in order to set
connector type in link_ksetting.

After FW exposed the connector type, driver translated the value to ethtool
definitions. However, as 0 is a valid value, before returning PORT_OTHER,
driver run the check of link mode in order to maintain backward
compatibility.

Cited patch added support to EXT mode.  With both features (connector type
and EXT link modes) ,if connector_type read from FW is 0 and EXT mode is
set, driver mistakenly compare EXT link modes to non-EXT link mode.
Fixed that by skipping this comparison if we are in EXT mode, as connector
type value is valid in this scenario.

Fixes: 6a897372417e ("net/mlx5: ethtool, Add ethtool support for 50Gbps per lane link modes")
Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
Reviewed-by: Aya Levin <ayal@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

index 327c93a7bd55a843dfb16bf27ccdacf61e69efc0..95601269fa2eff5a8dcc2f68c754c11573dee745 100644 (file)
@@ -708,9 +708,9 @@ static int get_fec_supported_advertised(struct mlx5_core_dev *dev,
 
 static void ptys2ethtool_supported_advertised_port(struct ethtool_link_ksettings *link_ksettings,
                                                   u32 eth_proto_cap,
-                                                  u8 connector_type)
+                                                  u8 connector_type, bool ext)
 {
-       if (!connector_type || connector_type >= MLX5E_CONNECTOR_TYPE_NUMBER) {
+       if ((!connector_type && !ext) || connector_type >= MLX5E_CONNECTOR_TYPE_NUMBER) {
                if (eth_proto_cap & (MLX5E_PROT_MASK(MLX5E_10GBASE_CR)
                                   | MLX5E_PROT_MASK(MLX5E_10GBASE_SR)
                                   | MLX5E_PROT_MASK(MLX5E_40GBASE_CR4)
@@ -842,9 +842,9 @@ static int ptys2connector_type[MLX5E_CONNECTOR_TYPE_NUMBER] = {
                [MLX5E_PORT_OTHER]              = PORT_OTHER,
        };
 
-static u8 get_connector_port(u32 eth_proto, u8 connector_type)
+static u8 get_connector_port(u32 eth_proto, u8 connector_type, bool ext)
 {
-       if (connector_type && connector_type < MLX5E_CONNECTOR_TYPE_NUMBER)
+       if ((connector_type || ext) && connector_type < MLX5E_CONNECTOR_TYPE_NUMBER)
                return ptys2connector_type[connector_type];
 
        if (eth_proto &
@@ -945,9 +945,9 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
        eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
 
        link_ksettings->base.port = get_connector_port(eth_proto_oper,
-                                                      connector_type);
+                                                      connector_type, ext);
        ptys2ethtool_supported_advertised_port(link_ksettings, eth_proto_admin,
-                                              connector_type);
+                                              connector_type, ext);
        get_lp_advertising(mdev, eth_proto_lp, link_ksettings);
 
        if (an_status == MLX5_AN_COMPLETE)