diff options
| author | Michael Guralnik <michaelgur@mellanox.com> | 2018-11-21 15:03:54 +0200 | 
|---|---|---|
| committer | Jason Gunthorpe <jgg@mellanox.com> | 2018-11-21 14:18:02 -0700 | 
| commit | db7a691a1551a748cb92d9c89c6b190ea87e28d5 (patch) | |
| tree | 7a890cef03239feca4ea8047fa0ae88ffdd1ad49 | |
| parent | 13f8d9c16693afb908ead3d2a758adbe6a79eccd (diff) | |
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: 1b5daf11b015 ("IB/mlx5: Avoid using the MAD_IFC command under ISSI > 0 mode")
Signed-off-by: Michael Guralnik <michaelgur@mellanox.com>
Reviewed-by: Majd Dibbiny <majd@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
| -rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 29 | 
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index e9c428071df3..3569fda07e07 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -1094,31 +1094,26 @@ enum mlx5_ib_width {  	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)  {  	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; -	} else if (active_width & MLX5_IB_WIDTH_2X) { -		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) { +	else if (active_width & MLX5_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; -	} else if (active_width & MLX5_IB_WIDTH_12X) { +	else if (active_width & MLX5_IB_WIDTH_12X)  		*ib_width = IB_WIDTH_12X; -	} else { -		mlx5_ib_dbg(dev, "Invalid active_width %d\n", +	else { +		mlx5_ib_dbg(dev, "Invalid active_width %d, setting width to default value: 4x\n",  			    (int)active_width); -		err = -EINVAL; +		*ib_width = IB_WIDTH_4X;  	} -	return err; +	return;  }  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,  	if (err)  		goto out; -	err = translate_active_width(ibdev, ib_link_width_oper, -				     &props->active_width); -	if (err) -		goto out; +	translate_active_width(ibdev, ib_link_width_oper, &props->active_width); +  	err = mlx5_query_port_ib_proto_oper(mdev, &props->active_speed, port);  	if (err)  		goto out;  | 
