Commit 8324a02c authored by Gavin Li's avatar Gavin Li Committed by Saeed Mahameed

net/mlx5: Add exit route when waiting for FW

Currently, removing a device needs to get the driver interface lock before
doing any cleanup. If the driver is waiting in a loop for FW init, there
is no way to cancel the wait, instead the device cleanup waits for the
loop to conclude and release the lock.

To allow immediate response to remove device commands, check the TEARDOWN
flag while waiting for FW init, and exit the loop if it has been set.
Signed-off-by: default avatarGavin Li <gavinl@nvidia.com>
Reviewed-by: default avatarMoshe Shemesh <moshe@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 9eab75d4
...@@ -189,7 +189,8 @@ static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili, ...@@ -189,7 +189,8 @@ static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili,
fw_initializing = ioread32be(&dev->iseg->initializing); fw_initializing = ioread32be(&dev->iseg->initializing);
if (!(fw_initializing >> 31)) if (!(fw_initializing >> 31))
break; break;
if (time_after(jiffies, end)) { if (time_after(jiffies, end) ||
test_and_clear_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state)) {
err = -EBUSY; err = -EBUSY;
break; break;
} }
...@@ -1602,6 +1603,7 @@ static void remove_one(struct pci_dev *pdev) ...@@ -1602,6 +1603,7 @@ static void remove_one(struct pci_dev *pdev)
struct mlx5_core_dev *dev = pci_get_drvdata(pdev); struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
struct devlink *devlink = priv_to_devlink(dev); struct devlink *devlink = priv_to_devlink(dev);
set_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state);
devlink_unregister(devlink); devlink_unregister(devlink);
mlx5_sriov_disable(pdev); mlx5_sriov_disable(pdev);
mlx5_crdump_disable(dev); mlx5_crdump_disable(dev);
...@@ -1785,6 +1787,7 @@ static void shutdown(struct pci_dev *pdev) ...@@ -1785,6 +1787,7 @@ static void shutdown(struct pci_dev *pdev)
int err; int err;
mlx5_core_info(dev, "Shutdown was called\n"); mlx5_core_info(dev, "Shutdown was called\n");
set_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state);
err = mlx5_try_fast_unload(dev); err = mlx5_try_fast_unload(dev);
if (err) if (err)
mlx5_unload_one(dev); mlx5_unload_one(dev);
......
...@@ -632,6 +632,7 @@ enum mlx5_device_state { ...@@ -632,6 +632,7 @@ enum mlx5_device_state {
enum mlx5_interface_state { enum mlx5_interface_state {
MLX5_INTERFACE_STATE_UP = BIT(0), MLX5_INTERFACE_STATE_UP = BIT(0),
MLX5_BREAK_FW_WAIT = BIT(1),
}; };
enum mlx5_pci_status { enum mlx5_pci_status {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment