Commit db7a691a authored by Michael Guralnik's avatar Michael Guralnik Committed by Jason Gunthorpe

IB/mlx5: Avoid load failure due to unknown link width

If the firmware reports a connection width that is not 1x, 4x, 8x or 12x
it causes the driver to fail during initialization.

To prevent this failure every time a new width is introduced to the RDMA
stack, we will set a default 4x width for these widths which ar unknown to
the driver.

This is needed to allow to run old kernels with new firmware.

Cc: <stable@vger.kernel.org> # 4.1
Fixes: 1b5daf11 ("IB/mlx5: Avoid using the MAD_IFC command under ISSI > 0 mode")
Signed-off-by: default avatarMichael Guralnik <michaelgur@mellanox.com>
Reviewed-by: default avatarMajd Dibbiny <majd@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 13f8d9c1
...@@ -1094,31 +1094,26 @@ enum mlx5_ib_width { ...@@ -1094,31 +1094,26 @@ enum mlx5_ib_width {
MLX5_IB_WIDTH_12X = 1 << 4 MLX5_IB_WIDTH_12X = 1 << 4
}; };
static int translate_active_width(struct ib_device *ibdev, u8 active_width, static void translate_active_width(struct ib_device *ibdev, u8 active_width,
u8 *ib_width) u8 *ib_width)
{ {
struct mlx5_ib_dev *dev = to_mdev(ibdev); struct mlx5_ib_dev *dev = to_mdev(ibdev);
int err = 0;
if (active_width & MLX5_IB_WIDTH_1X) { if (active_width & MLX5_IB_WIDTH_1X)
*ib_width = IB_WIDTH_1X; *ib_width = IB_WIDTH_1X;
} else if (active_width & MLX5_IB_WIDTH_2X) { else if (active_width & MLX5_IB_WIDTH_4X)
mlx5_ib_dbg(dev, "active_width %d is not supported by IB spec\n",
(int)active_width);
err = -EINVAL;
} else if (active_width & MLX5_IB_WIDTH_4X) {
*ib_width = IB_WIDTH_4X; *ib_width = IB_WIDTH_4X;
} else if (active_width & MLX5_IB_WIDTH_8X) { else if (active_width & MLX5_IB_WIDTH_8X)
*ib_width = IB_WIDTH_8X; *ib_width = IB_WIDTH_8X;
} else if (active_width & MLX5_IB_WIDTH_12X) { else if (active_width & MLX5_IB_WIDTH_12X)
*ib_width = IB_WIDTH_12X; *ib_width = IB_WIDTH_12X;
} else { else {
mlx5_ib_dbg(dev, "Invalid active_width %d\n", mlx5_ib_dbg(dev, "Invalid active_width %d, setting width to default value: 4x\n",
(int)active_width); (int)active_width);
err = -EINVAL; *ib_width = IB_WIDTH_4X;
} }
return err; return;
} }
static int mlx5_mtu_to_ib_mtu(int mtu) static int mlx5_mtu_to_ib_mtu(int mtu)
...@@ -1225,10 +1220,8 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port, ...@@ -1225,10 +1220,8 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port,
if (err) if (err)
goto out; goto out;
err = translate_active_width(ibdev, ib_link_width_oper, translate_active_width(ibdev, ib_link_width_oper, &props->active_width);
&props->active_width);
if (err)
goto out;
err = mlx5_query_port_ib_proto_oper(mdev, &props->active_speed, port); err = mlx5_query_port_ib_proto_oper(mdev, &props->active_speed, port);
if (err) if (err)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment