qla2xxx: Restore physical port WWPN only, when port down detected for FA-WWPN port.
authorSawan Chandak <sawan.chandak@qlogic.com>
Thu, 9 Apr 2015 19:00:07 +0000 (15:00 -0400)
committerJames Bottomley <JBottomley@Odin.com>
Fri, 10 Apr 2015 15:43:07 +0000 (08:43 -0700)
For FA-WWPN is enabled port, if NPIV created on that port and,
if port link is brought down, then WWPN was restored from flash for both
physical and NPIV port. This will result in NPIV port and physical port
sharing same WWPN. Any application refreshing ports information  will
not be able to scan NPIV port because of this behavior. So while restoring WWPN,
only restore physical port WWPN.

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_isr.c

index 72dfbc162856ea565b9beba31c47ab93749c5b4b..6dc14cd782b2a5d7d6b96ff3eb1167cfde261893 100644 (file)
@@ -756,14 +756,23 @@ skip_rio:
                        /*
                         * In case of loop down, restore WWPN from
                         * NVRAM in case of FA-WWPN capable ISP
+                        * Restore for Physical Port only
                         */
-                       if (ha->flags.fawwpn_enabled) {
-                               void *wwpn = ha->init_cb->port_name;
+                       if (!vha->vp_idx) {
+                               if (ha->flags.fawwpn_enabled) {
+                                       void *wwpn = ha->init_cb->port_name;
+                                       memcpy(vha->port_name, wwpn, WWN_SIZE);
+                                       fc_host_port_name(vha->host) =
+                                           wwn_to_u64(vha->port_name);
+                                       ql_dbg(ql_dbg_init + ql_dbg_verbose,
+                                           vha, 0x0144, "LOOP DOWN detected,"
+                                           "restore WWPN %016llx\n",
+                                           wwn_to_u64(vha->port_name));
+                               }
 
-                               memcpy(vha->port_name, wwpn, WWN_SIZE);
+                               clear_bit(VP_CONFIG_OK, &vha->vp_flags);
                        }
 
-                       clear_bit(VP_CONFIG_OK, &vha->vp_flags);
                        vha->device_flags |= DFLG_NO_CABLE;
                        qla2x00_mark_all_devices_lost(vha, 1);
                }