From: Quinn Tran <qut...@marvell.com>

During driver unload, the remove flag will be set for all
scsi_qla_host/NPIV. This allows each NPIV to see the flag
instead of reaching for base_vha to search for it.

Signed-off-by: Quinn Tran <qut...@marvell.com>
Signed-off-by: Himanshu Madhani <hmadh...@marvell.com>
---
 drivers/scsi/qla2xxx/qla_os.c | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index c2ec8ee5df79..6e627e521562 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -3480,6 +3480,29 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct 
pci_device_id *id)
        return ret;
 }
 
+static void __qla_set_remove_flag(scsi_qla_host_t *base_vha)
+{
+       scsi_qla_host_t *vp;
+       unsigned long flags;
+       struct qla_hw_data *ha;
+
+       if (!base_vha)
+               return;
+
+       ha = base_vha->hw;
+
+       spin_lock_irqsave(&ha->vport_slock, flags);
+       list_for_each_entry(vp, &ha->vp_list, list)
+               set_bit(PFLG_DRIVER_REMOVING, &vp->pci_flags);
+
+       /*
+        * Indicate device removal to prevent future board_disable
+        * and wait until any pending board_disable has completed.
+        */
+       set_bit(PFLG_DRIVER_REMOVING, &base_vha->pci_flags);
+       spin_unlock_irqrestore(&ha->vport_slock, flags);
+}
+
 static void
 qla2x00_shutdown(struct pci_dev *pdev)
 {
@@ -3496,7 +3519,7 @@ qla2x00_shutdown(struct pci_dev *pdev)
         * Prevent future board_disable and wait
         * until any pending board_disable has completed.
         */
-       set_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags);
+       __qla_set_remove_flag(vha);
        cancel_work_sync(&ha->board_disable);
 
        if (!atomic_read(&pdev->enable_cnt))
@@ -3652,10 +3675,7 @@ qla2x00_remove_one(struct pci_dev *pdev)
        ha = base_vha->hw;
        ql_log(ql_log_info, base_vha, 0xb079,
            "Removing driver\n");
-
-       /* Indicate device removal to prevent future board_disable and wait
-        * until any pending board_disable has completed. */
-       set_bit(PFLG_DRIVER_REMOVING, &base_vha->pci_flags);
+       __qla_set_remove_flag(base_vha);
        cancel_work_sync(&ha->board_disable);
 
        /*
-- 
2.12.0

Reply via email to