net/mlx5e: Fix number of lanes to UNKNOWN when using data_rate_oper
authorShahar Shitrit <shshitrit@nvidia.com>
Tue, 10 Jun 2025 15:15:14 +0000 (18:15 +0300)
committerJakub Kicinski <kuba@kernel.org>
Wed, 11 Jun 2025 21:41:15 +0000 (14:41 -0700)
When the link is up, either eth_proto_oper or ext_eth_proto_oper
typically reports the active link protocol, from which both speed
and number of lanes can be retrieved. However, in certain cases,
such as when a NIC is connected via a non-standard cable, the
firmware may not report the protocol.

In such scenarios, the speed can still be obtained from the
data_rate_oper field in PTYS register. Since data_rate_oper
provides only speed information and lacks lane details, it is
incorrect to derive the number of lanes from it.

This patch corrects the behavior by setting the number of lanes to
UNKNOWN instead of incorrectly using MAX_LANES when relying on
data_rate_oper.

Fixes: 7e959797f021 ("net/mlx5e: Enable lanes configuration when auto-negotiation is off")
Signed-off-by: Shahar Shitrit <shshitrit@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/20250610151514.1094735-10-mbloch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

index ea078c9f5d154aabb9bbf1b26cce24331ee748cf..3cb8d3bf9044ca7e4baa358f3e15260b73e184e3 100644 (file)
@@ -43,7 +43,6 @@
 #include "en/fs_ethtool.h"
 
 #define LANES_UNKNOWN           0
-#define MAX_LANES               8
 
 void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
                               struct ethtool_drvinfo *drvinfo)
@@ -1098,10 +1097,8 @@ static void get_link_properties(struct net_device *netdev,
                speed = info->speed;
                lanes = info->lanes;
                duplex = DUPLEX_FULL;
-       } else if (data_rate_oper) {
+       } else if (data_rate_oper)
                speed = 100 * data_rate_oper;
-               lanes = MAX_LANES;
-       }
 
 out:
        link_ksettings->base.duplex = duplex;