net/mlx5e: ethtool, Fix restriction of autoneg with 56G
authorAya Levin <ayal@nvidia.com>
Sun, 27 Dec 2020 14:33:19 +0000 (16:33 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 7 Jan 2021 20:22:50 +0000 (12:22 -0800)
Prior to this patch, configuring speed to 50G with autoneg off over
devices supporting 50G per lane failed.
Support for 50G per lane introduced a new set of link-modes, on which
driver always performed a speed validation as if only legacy link-modes
were configured. Fix driver speed validation to force setting autoneg
over 56G only if in legacy link-mode.

Fixes: 3d7cadae51f1 ("net/mlx5e: ethtool, Fix analysis of speed setting")
Signed-off-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Eran Ben Elisha <eranbe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

index d9076d5..2d37742 100644 (file)
@@ -1010,6 +1010,22 @@ static int mlx5e_get_link_ksettings(struct net_device *netdev,
        return mlx5e_ethtool_get_link_ksettings(priv, link_ksettings);
 }
 
+static int mlx5e_speed_validate(struct net_device *netdev, bool ext,
+                               const unsigned long link_modes, u8 autoneg)
+{
+       /* Extended link-mode has no speed limitations. */
+       if (ext)
+               return 0;
+
+       if ((link_modes & MLX5E_PROT_MASK(MLX5E_56GBASE_R4)) &&
+           autoneg != AUTONEG_ENABLE) {
+               netdev_err(netdev, "%s: 56G link speed requires autoneg enabled\n",
+                          __func__);
+               return -EINVAL;
+       }
+       return 0;
+}
+
 static u32 mlx5e_ethtool2ptys_adver_link(const unsigned long *link_modes)
 {
        u32 i, ptys_modes = 0;
@@ -1103,13 +1119,9 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
        link_modes = autoneg == AUTONEG_ENABLE ? ethtool2ptys_adver_func(adver) :
                mlx5e_port_speed2linkmodes(mdev, speed, !ext);
 
-       if ((link_modes & MLX5E_PROT_MASK(MLX5E_56GBASE_R4)) &&
-           autoneg != AUTONEG_ENABLE) {
-               netdev_err(priv->netdev, "%s: 56G link speed requires autoneg enabled\n",
-                          __func__);
-               err = -EINVAL;
+       err = mlx5e_speed_validate(priv->netdev, ext, link_modes, autoneg);
+       if (err)
                goto out;
-       }
 
        link_modes = link_modes & eproto.cap;
        if (!link_modes) {