qla2xxx: Fix virtual port configuration, when switch port is disabled/enabled.
authorSawan Chandak <sawan.chandak@qlogic.com>
Thu, 9 Apr 2015 19:00:06 +0000 (15:00 -0400)
committerJames Bottomley <JBottomley@Odin.com>
Fri, 10 Apr 2015 15:42:58 +0000 (08:42 -0700)
On some vendor switches, when switch port is toggled (down /up),
then in some condition driver tries to configure virtual port,
before FW is actually in ready state to process any commands on wire.
At this time, configuring virtual port can fail. Add fix in driver
to make driver wait, for FW to be ready state before

Signed-off-by: Sawan Chandak <sawan.chandak@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mid.c

index 9a8aa11cd15fc2a8645af29538a0340ee4c9b039..e86201d3b8c6d9eccbd1132e96cffb08310b7988 100644 (file)
@@ -3590,6 +3590,7 @@ typedef struct scsi_qla_host {
 #define VP_BIND_NEEDED         2
 #define VP_DELETE_NEEDED       3
 #define VP_SCR_NEEDED          4       /* State Change Request registration */
+#define VP_CONFIG_OK           5       /* Flag to cfg VP, if FW is ready */
        atomic_t                vp_state;
 #define VP_OFFLINE             0
 #define VP_ACTIVE              1
index a04a1b1f7f32d39e64856a04500b79c9d13bb52a..72dfbc162856ea565b9beba31c47ab93749c5b4b 100644 (file)
@@ -763,6 +763,7 @@ skip_rio:
                                memcpy(vha->port_name, wwpn, WWN_SIZE);
                        }
 
+                       clear_bit(VP_CONFIG_OK, &vha->vp_flags);
                        vha->device_flags |= DFLG_NO_CABLE;
                        qla2x00_mark_all_devices_lost(vha, 1);
                }
@@ -947,6 +948,7 @@ skip_rio:
 
                set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
+               set_bit(VP_CONFIG_OK, &vha->vp_flags);
 
                qlt_async_event(mb[0], vha, mb);
                break;
index 5c2e0317f1c0a31e408f89788536352c19c4c7fa..8f458efc125a022f4742c575325df5bf1caa530e 100644 (file)
@@ -306,19 +306,25 @@ qla2x00_vp_abort_isp(scsi_qla_host_t *vha)
 static int
 qla2x00_do_dpc_vp(scsi_qla_host_t *vha)
 {
+       struct qla_hw_data *ha = vha->hw;
+       scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
        ql_dbg(ql_dbg_dpc + ql_dbg_verbose, vha, 0x4012,
            "Entering %s vp_flags: 0x%lx.\n", __func__, vha->vp_flags);
 
        qla2x00_do_work(vha);
 
-       if (test_and_clear_bit(VP_IDX_ACQUIRED, &vha->vp_flags)) {
-               /* VP acquired. complete port configuration */
-               ql_dbg(ql_dbg_dpc, vha, 0x4014,
-                   "Configure VP scheduled.\n");
-               qla24xx_configure_vp(vha);
-               ql_dbg(ql_dbg_dpc, vha, 0x4015,
-                   "Configure VP end.\n");
-               return 0;
+       /* Check if Fw is ready to configure VP first */
+       if (test_bit(VP_CONFIG_OK, &base_vha->vp_flags)) {
+               if (test_and_clear_bit(VP_IDX_ACQUIRED, &vha->vp_flags)) {
+                       /* VP acquired. complete port configuration */
+                       ql_dbg(ql_dbg_dpc, vha, 0x4014,
+                           "Configure VP scheduled.\n");
+                       qla24xx_configure_vp(vha);
+                       ql_dbg(ql_dbg_dpc, vha, 0x4015,
+                           "Configure VP end.\n");
+                       return 0;
+               }
        }
 
        if (test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) {