mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
net/mlx5: Use max_num_eqs_24b when setting max_io_eqs
Due a bug in the device max_num_eqs doesn't always reflect a written
value. As a result, setting max_io_eqs may not work but appear
successful. Instead write max_num_eqs_24b, which reflects correct
value.
Fixes: 93197c7c50
("mlx5/core: Support max_io_eqs for a function")
Signed-off-by: Daniel Jurgens <danielj@nvidia.com>
Reviewed-by: Parav Pandit <parav@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
29c6a562bf
commit
5dbf647367
@ -4600,20 +4600,26 @@ mlx5_devlink_port_fn_max_io_eqs_get(struct devlink_port *port, u32 *max_io_eqs,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!MLX5_CAP_GEN_2(esw->dev, max_num_eqs_24b)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Device doesn't support getting the max number of EQs");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
|
||||
if (!query_ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&esw->state_lock);
|
||||
err = mlx5_vport_get_other_func_cap(esw->dev, vport_num, query_ctx,
|
||||
MLX5_CAP_GENERAL);
|
||||
MLX5_CAP_GENERAL_2);
|
||||
if (err) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Failed getting HCA caps");
|
||||
goto out;
|
||||
}
|
||||
|
||||
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
|
||||
max_eqs = MLX5_GET(cmd_hca_cap, hca_caps, max_num_eqs);
|
||||
max_eqs = MLX5_GET(cmd_hca_cap_2, hca_caps, max_num_eqs_24b);
|
||||
if (max_eqs < MLX5_ESW_MAX_CTRL_EQS)
|
||||
*max_io_eqs = 0;
|
||||
else
|
||||
@ -4644,6 +4650,12 @@ mlx5_devlink_port_fn_max_io_eqs_set(struct devlink_port *port, u32 max_io_eqs,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!MLX5_CAP_GEN_2(esw->dev, max_num_eqs_24b)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Device doesn't support changing the max number of EQs");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (check_add_overflow(max_io_eqs, MLX5_ESW_MAX_CTRL_EQS, &max_eqs)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Supplied value out of range");
|
||||
return -EINVAL;
|
||||
@ -4655,17 +4667,17 @@ mlx5_devlink_port_fn_max_io_eqs_set(struct devlink_port *port, u32 max_io_eqs,
|
||||
|
||||
mutex_lock(&esw->state_lock);
|
||||
err = mlx5_vport_get_other_func_cap(esw->dev, vport_num, query_ctx,
|
||||
MLX5_CAP_GENERAL);
|
||||
MLX5_CAP_GENERAL_2);
|
||||
if (err) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Failed getting HCA caps");
|
||||
goto out;
|
||||
}
|
||||
|
||||
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
|
||||
MLX5_SET(cmd_hca_cap, hca_caps, max_num_eqs, max_eqs);
|
||||
MLX5_SET(cmd_hca_cap_2, hca_caps, max_num_eqs_24b, max_eqs);
|
||||
|
||||
err = mlx5_vport_set_other_func_cap(esw->dev, hca_caps, vport_num,
|
||||
MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
|
||||
MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2);
|
||||
if (err)
|
||||
NL_SET_ERR_MSG_MOD(extack, "Failed setting HCA caps");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user