]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5: Start health poll after enable hca
authorMoshe Shemesh <moshe@nvidia.com>
Tue, 18 Mar 2025 20:51:17 +0000 (22:51 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 24 Mar 2025 22:22:57 +0000 (15:22 -0700)
The health poll mechanism performs periodic checks to detect firmware
errors. One of the checks verifies the function is still enabled on
firmware side, but the function is enabled only after enable_hca command
completed. Start health poll after enable_hca command to avoid a race
between function enabled and first health polling.

Fixes: 9b98d395b85d ("net/mlx5: Start health poll at earlier stage of driver load")
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Link: https://patch.msgid.link/1742331077-102038-3-git-send-email-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/main.c

index ec956c4bcebdbaf2546862d072b7844b177de243..7c3312d6aed9b2fad5b82c6dcc87ee104dc16c9b 100644 (file)
@@ -1205,24 +1205,24 @@ static int mlx5_function_enable(struct mlx5_core_dev *dev, bool boot, u64 timeou
        dev->caps.embedded_cpu = mlx5_read_embedded_cpu(dev);
        mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_UP);
 
-       mlx5_start_health_poll(dev);
-
        err = mlx5_core_enable_hca(dev, 0);
        if (err) {
                mlx5_core_err(dev, "enable hca failed\n");
-               goto stop_health_poll;
+               goto err_cmd_cleanup;
        }
 
+       mlx5_start_health_poll(dev);
+
        err = mlx5_core_set_issi(dev);
        if (err) {
                mlx5_core_err(dev, "failed to set issi\n");
-               goto err_disable_hca;
+               goto stop_health_poll;
        }
 
        err = mlx5_satisfy_startup_pages(dev, 1);
        if (err) {
                mlx5_core_err(dev, "failed to allocate boot pages\n");
-               goto err_disable_hca;
+               goto stop_health_poll;
        }
 
        err = mlx5_tout_query_dtor(dev);
@@ -1235,10 +1235,9 @@ static int mlx5_function_enable(struct mlx5_core_dev *dev, bool boot, u64 timeou
 
 reclaim_boot_pages:
        mlx5_reclaim_startup_pages(dev);
-err_disable_hca:
-       mlx5_core_disable_hca(dev, 0);
 stop_health_poll:
        mlx5_stop_health_poll(dev, boot);
+       mlx5_core_disable_hca(dev, 0);
 err_cmd_cleanup:
        mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_DOWN);
        mlx5_cmd_disable(dev);
@@ -1249,8 +1248,8 @@ err_cmd_cleanup:
 static void mlx5_function_disable(struct mlx5_core_dev *dev, bool boot)
 {
        mlx5_reclaim_startup_pages(dev);
-       mlx5_core_disable_hca(dev, 0);
        mlx5_stop_health_poll(dev, boot);
+       mlx5_core_disable_hca(dev, 0);
        mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_DOWN);
        mlx5_cmd_disable(dev);
 }