]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
IB/mlx5: Fix port speed query for representors
authorOr Har-Toov <ohartoov@nvidia.com>
Thu, 15 Jan 2026 12:26:45 +0000 (14:26 +0200)
committerLeon Romanovsky <leon@kernel.org>
Sun, 18 Jan 2026 16:36:59 +0000 (11:36 -0500)
When querying speed information for a representor in switchdev mode,
the code previously used the first device in the eswitch, which may not
match the device that actually owns the representor. In setups such as
multi-port eswitch or LAG, this led to incorrect port attributes being
reported.

Fix this by retrieving the correct core device from the representor's
eswitch before querying its port attributes.

Fixes: 27f9e0ccb6da ("net/mlx5: Lag, Add single RDMA device in multiport mode")
Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
Link: https://patch.msgid.link/20260115-port-speed-query-fix-v2-1-3bde6a3c78e7@nvidia.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/mlx5/main.c

index e83a5f12e6bcd63d90120cfc6750eadaec662aac..eba023b7af0fa44279a65f59be3e1eaa4791b9b7 100644 (file)
@@ -561,12 +561,20 @@ static int mlx5_query_port_roce(struct ib_device *device, u32 port_num,
         * of an error it will still be zeroed out.
         * Use native port in case of reps
         */
-       if (dev->is_rep)
-               err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN,
-                                          1, 0);
-       else
-               err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN,
-                                          mdev_port_num, 0);
+       if (dev->is_rep) {
+               struct mlx5_eswitch_rep *rep;
+
+               rep = dev->port[port_num - 1].rep;
+               if (rep) {
+                       mdev = mlx5_eswitch_get_core_dev(rep->esw);
+                       WARN_ON(!mdev);
+               }
+               mdev_port_num = 1;
+       }
+
+       err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN,
+                                  mdev_port_num, 0);
+
        if (err)
                goto out;
        ext = !!MLX5_GET_ETH_PROTO(ptys_reg, out, true, eth_proto_capability);