net/mlx5e: IPoIB, Show unknown speed instead of error
authorDragos Tatulea <dtatulea@nvidia.com>
Mon, 23 Jan 2023 14:06:32 +0000 (16:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Feb 2023 18:11:47 +0000 (19:11 +0100)
[ Upstream commit 8aa5f171d51c1cb69e5e3106df4dd1a446102823 ]

ethtool is returning an error for unknown speeds for the IPoIB interface:

$ ethtool ib0
netlink error: failed to retrieve link settings
netlink error: Invalid argument
netlink error: failed to retrieve link settings
netlink error: Invalid argument
Settings for ib0:
Link detected: no

After this change, ethtool will return success and show "unknown speed":

$ ethtool ib0
Settings for ib0:
Supported ports: [  ]
Supported link modes:   Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes:  Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: Unknown!
Duplex: Full
Auto-negotiation: off
Port: Other
PHYAD: 0
Transceiver: internal
Link detected: no

Fixes: eb234ee9d541 ("net/mlx5e: IPoIB, Add support for get_link_ksettings in ethtool")
Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ethtool.c

index eff92dc..e09518f 100644 (file)
@@ -189,16 +189,16 @@ static inline int mlx5_ptys_rate_enum_to_int(enum mlx5_ptys_rate rate)
        }
 }
 
-static int mlx5i_get_speed_settings(u16 ib_link_width_oper, u16 ib_proto_oper)
+static u32 mlx5i_get_speed_settings(u16 ib_link_width_oper, u16 ib_proto_oper)
 {
        int rate, width;
 
        rate = mlx5_ptys_rate_enum_to_int(ib_proto_oper);
        if (rate < 0)
-               return -EINVAL;
+               return SPEED_UNKNOWN;
        width = mlx5_ptys_width_enum_to_int(ib_link_width_oper);
        if (width < 0)
-               return -EINVAL;
+               return SPEED_UNKNOWN;
 
        return rate * width;
 }
@@ -221,16 +221,13 @@ static int mlx5i_get_link_ksettings(struct net_device *netdev,
        ethtool_link_ksettings_zero_link_mode(link_ksettings, advertising);
 
        speed = mlx5i_get_speed_settings(ib_link_width_oper, ib_proto_oper);
-       if (speed < 0)
-               return -EINVAL;
+       link_ksettings->base.speed = speed;
+       link_ksettings->base.duplex = speed == SPEED_UNKNOWN ? DUPLEX_UNKNOWN : DUPLEX_FULL;
 
-       link_ksettings->base.duplex = DUPLEX_FULL;
        link_ksettings->base.port = PORT_OTHER;
 
        link_ksettings->base.autoneg = AUTONEG_DISABLE;
 
-       link_ksettings->base.speed = speed;
-
        return 0;
 }