net/mlx5: SF, Stop waiting for FW as teardown was called
authorMoshe Shemesh <moshe@nvidia.com>
Thu, 25 Jan 2024 12:24:09 +0000 (14:24 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 6 Feb 2024 00:45:51 +0000 (16:45 -0800)
When PF/VF teardown is called the driver sets the flag
MLX5_BREAK_FW_WAIT to stop waiting for FW loading and initializing. Same
should be applied to SF driver teardown to cut waiting time. On
mlx5_sf_dev_remove() set the flag before draining health WQ as recovery
flow may also wait for FW reloading while it is not relevant anymore.

Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Aya Levin <ayal@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c

index 169c2c68ed5c254b45e33ee324abe1647d328a6e..bc863e1f062e6bd316f6b54f87850e11123bbfea 100644 (file)
@@ -95,24 +95,29 @@ mdev_err:
 static void mlx5_sf_dev_remove(struct auxiliary_device *adev)
 {
        struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);
-       struct devlink *devlink = priv_to_devlink(sf_dev->mdev);
+       struct mlx5_core_dev *mdev = sf_dev->mdev;
+       struct devlink *devlink;
 
-       mlx5_drain_health_wq(sf_dev->mdev);
+       devlink = priv_to_devlink(mdev);
+       set_bit(MLX5_BREAK_FW_WAIT, &mdev->intf_state);
+       mlx5_drain_health_wq(mdev);
        devlink_unregister(devlink);
-       if (mlx5_dev_is_lightweight(sf_dev->mdev))
-               mlx5_uninit_one_light(sf_dev->mdev);
+       if (mlx5_dev_is_lightweight(mdev))
+               mlx5_uninit_one_light(mdev);
        else
-               mlx5_uninit_one(sf_dev->mdev);
-       iounmap(sf_dev->mdev->iseg);
-       mlx5_mdev_uninit(sf_dev->mdev);
+               mlx5_uninit_one(mdev);
+       iounmap(mdev->iseg);
+       mlx5_mdev_uninit(mdev);
        mlx5_devlink_free(devlink);
 }
 
 static void mlx5_sf_dev_shutdown(struct auxiliary_device *adev)
 {
        struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);
+       struct mlx5_core_dev *mdev = sf_dev->mdev;
 
-       mlx5_unload_one(sf_dev->mdev, false);
+       set_bit(MLX5_BREAK_FW_WAIT, &mdev->intf_state);
+       mlx5_unload_one(mdev, false);
 }
 
 static const struct auxiliary_device_id mlx5_sf_dev_id_table[] = {