]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: Refactor HCA cap 2 setting
authorMark Bloch <mbloch@nvidia.com>
Thu, 23 Oct 2025 09:16:59 +0000 (12:16 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 28 Oct 2025 10:11:27 +0000 (11:11 +0100)
Refactor HCA capability 2 setting logic to be more structured and
conditional. Move the sw_vhca_id_valid setting inside proper conditional
checks and prepare the function for additional capability settings.

The refactoring:
- Always copy current capabilities to set_hca_cap buffer.
- Apply sw_vhca_id_valid setting only when conditions are met.
- Improve code readability and maintainability.

This cleanup prepares the handle_hca_cap_2() function for the upcoming
balance ID capability setting.

Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/1761211020-925651-5-git-send-email-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/main.c

index 70c156591b0ba9c61dd99818043003e50e177590..563267acf386fcb4982fb9768eaabbb3d0726ef0 100644 (file)
@@ -553,6 +553,7 @@ EXPORT_SYMBOL(mlx5_is_roce_on);
 
 static int handle_hca_cap_2(struct mlx5_core_dev *dev, void *set_ctx)
 {
+       bool do_set = false;
        void *set_hca_cap;
        int err;
 
@@ -563,17 +564,22 @@ static int handle_hca_cap_2(struct mlx5_core_dev *dev, void *set_ctx)
        if (err)
                return err;
 
-       if (!MLX5_CAP_GEN_2_MAX(dev, sw_vhca_id_valid) ||
-           !(dev->priv.sw_vhca_id > 0))
-               return 0;
-
        set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx,
                                   capability);
        memcpy(set_hca_cap, dev->caps.hca[MLX5_CAP_GENERAL_2]->cur,
               MLX5_ST_SZ_BYTES(cmd_hca_cap_2));
-       MLX5_SET(cmd_hca_cap_2, set_hca_cap, sw_vhca_id_valid, 1);
 
-       return set_caps(dev, set_ctx, MLX5_CAP_GENERAL_2);
+       if (MLX5_CAP_GEN_2_MAX(dev, sw_vhca_id_valid) &&
+           dev->priv.sw_vhca_id > 0) {
+               MLX5_SET(cmd_hca_cap_2, set_hca_cap, sw_vhca_id_valid, 1);
+               do_set = true;
+       }
+
+       /* some FW versions that support querying MLX5_CAP_GENERAL_2
+        * capabilities but don't support setting them.
+        * Skip unnecessary update to hca_cap_2 when no changes were introduced
+        */
+       return do_set ? set_caps(dev, set_ctx, MLX5_CAP_GENERAL_2) : 0;
 }
 
 static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)