qla2xxx: Delay driver unload if there is any pending activity going on.
authorSawan Chandak <sawan.chandak@qlogic.com>
Fri, 11 Apr 2014 20:54:38 +0000 (16:54 -0400)
committerChristoph Hellwig <hch@lst.de>
Mon, 19 May 2014 11:31:04 +0000 (13:31 +0200)
Signed-off-by: Sawan Chandak <sawan.chandak@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/qla2xxx/qla_os.c

index d1a76a6da6e2f6ec1267bcb56660ae084cb13792..575404fbcbeceab1751d42086c10f17127afb0af 100644 (file)
@@ -843,6 +843,28 @@ qla2x00_wait_for_hba_online(scsi_qla_host_t *vha)
        return (return_status);
 }
 
+/*
+ * qla2x00_wait_for_hba_ready
+ * Wait till the HBA is ready before doing driver unload
+ *
+ * Input:
+ *     ha - pointer to host adapter structure
+ *
+ * Note:
+ *    Does context switching-Release SPIN_LOCK
+ *    (if any) before calling this routine.
+ *
+ */
+static void
+qla2x00_wait_for_hba_ready(scsi_qla_host_t *vha)
+{
+       struct qla_hw_data *ha = vha->hw;
+
+       while ((!(vha->flags.online) || ha->dpc_active ||
+           ha->flags.mbox_busy))
+               msleep(1000);
+}
+
 /*
  * qla2x00_wait_for_reset_ready
  *    Wait till the HBA is online after going through
@@ -3161,6 +3183,8 @@ qla2x00_remove_one(struct pci_dev *pdev)
        base_vha = pci_get_drvdata(pdev);
        ha = base_vha->hw;
 
+       qla2x00_wait_for_hba_ready(base_vha);
+
        set_bit(UNLOADING, &base_vha->dpc_flags);
 
        if (IS_QLAFX00(ha))