]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5: Refactor mlx5_set_msix_vec_count() SET_HCA_CAP
authorMoshe Shemesh <moshe@nvidia.com>
Mon, 18 May 2026 07:13:54 +0000 (10:13 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 21 May 2026 10:12:00 +0000 (12:12 +0200)
Use mlx5_vport_set_other_func_general_cap() instead of open-coding the
SET_HCA_CAP command. This removes redundant buffer allocation and
ensures consistent use of vport-based function addressing.

mlx5_vport_set_other_func_general_cap() supports both function_id and
vhca_id based addressing, so this also enables SET_HCA_CAP for vhca_id
indexed functions which was not supported before.

Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260518071356.345723-7-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/pci_irq.c

index e051b9a939ee00d53af2d3b21f5418b9bebf6cac..0f5b8bc7861eb206760fc3898784a07fd30cd217 100644 (file)
@@ -87,9 +87,8 @@ int mlx5_set_msix_vec_count(struct mlx5_core_dev *dev, int function_id,
                            int msix_vec_count)
 {
        int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
-       int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
-       void *hca_cap = NULL, *query_cap = NULL, *cap;
        int num_vf_msix, min_msix, max_msix;
+       void *query_cap, *hca_caps;
        bool ec_vf_function;
        int vport;
        int ret;
@@ -111,11 +110,8 @@ int mlx5_set_msix_vec_count(struct mlx5_core_dev *dev, int function_id,
                return -EOVERFLOW;
 
        query_cap = kvzalloc(query_sz, GFP_KERNEL);
-       hca_cap = kvzalloc(set_sz, GFP_KERNEL);
-       if (!hca_cap || !query_cap) {
-               ret = -ENOMEM;
-               goto out;
-       }
+       if (!query_cap)
+               return -ENOMEM;
 
        ec_vf_function = mlx5_core_ec_sriov_enabled(dev);
        vport = mlx5_core_func_to_vport(dev, function_id, ec_vf_function);
@@ -123,21 +119,12 @@ int mlx5_set_msix_vec_count(struct mlx5_core_dev *dev, int function_id,
        if (ret)
                goto out;
 
-       cap = MLX5_ADDR_OF(set_hca_cap_in, hca_cap, capability);
-       memcpy(cap, MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability),
-              MLX5_UN_SZ_BYTES(hca_cap_union));
-       MLX5_SET(cmd_hca_cap, cap, dynamic_msix_table_size, msix_vec_count);
-
-       MLX5_SET(set_hca_cap_in, hca_cap, opcode, MLX5_CMD_OP_SET_HCA_CAP);
-       MLX5_SET(set_hca_cap_in, hca_cap, other_function, 1);
-       MLX5_SET(set_hca_cap_in, hca_cap, ec_vf_function, ec_vf_function);
-       MLX5_SET(set_hca_cap_in, hca_cap, function_id, function_id);
+       hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability);
+       MLX5_SET(cmd_hca_cap, hca_caps, dynamic_msix_table_size,
+                msix_vec_count);
 
-       MLX5_SET(set_hca_cap_in, hca_cap, op_mod,
-                MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE << 1);
-       ret = mlx5_cmd_exec_in(dev, set_hca_cap, hca_cap);
+       ret = mlx5_vport_set_other_func_general_cap(dev, hca_caps, vport);
 out:
-       kvfree(hca_cap);
        kvfree(query_cap);
        return ret;
 }