From: Himanshu Madhani <himanshu.madh...@qlogic.com>

For FA-WWPN capable device, ISP2031 and ISP27XX, when loop
dead is detected by a driver, restore WWPN from NVRAM.

Signed-off-by: Himanshu Madhani <himanshu.madh...@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kash...@qlogic.com>
---
 drivers/scsi/qla2xxx/qla_dbg.c  |    3 +--
 drivers/scsi/qla2xxx/qla_def.h  |    3 ++-
 drivers/scsi/qla2xxx/qla_init.c |    5 +++++
 drivers/scsi/qla2xxx/qla_isr.c  |    9 +++++++++
 4 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 1a43228..f3b6570 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -11,8 +11,7 @@
  * ----------------------------------------------------------------------
  * |             Level            |   Last Value Used  |     Holes     |
  * ----------------------------------------------------------------------
- * | Module Init and Probe        |       0x017d       | 0x0141                
|
- * |                              |                    | 0x0144,0x0146 |
+ * | Module Init and Probe        |       0x017d       | 0x0144,0x0146 |
  * |                              |                    | 0x015b-0x0160 |
  * |                              |                    | 0x016e-0x0170 |
  * | Mailbox commands             |       0x118d       | 0x1115-0x1116 |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 03da3eb..509dbd5 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2945,7 +2945,8 @@ struct qla_hw_data {
 
                uint32_t        mr_reset_hdlr_active:1;
                uint32_t        mr_intr_valid:1;
-               /* 34 bits */
+               uint32_t        fawwpn_enabled:1;
+               /* 35 bits */
        } flags;
 
        /* This spinlock is used to protect "io transactions", you must
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 51cabb9..23f12dd 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -2202,6 +2202,11 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
                if (IS_DPORT_CAPABLE(ha))
                        mid_init_cb->init_cb.firmware_options_1 |=
                            cpu_to_le16(BIT_7);
+               /* Enable FA-WWPN */
+               ha->flags.fawwpn_enabled =
+                   (mid_init_cb->init_cb.firmware_options_1 & BIT_6) ? 1 : 0;
+               ql_dbg(ql_dbg_init, vha, 0x0141, "FA-WWPN Support: %s.\n",
+                   (ha->flags.fawwpn_enabled) ? "enabled" : "disabled");
        }
 
        rval = qla2x00_init_firmware(vha, ha->init_cb_size);
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index d67fcaa..cc49157 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -750,6 +750,15 @@ skip_rio:
                if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
                        atomic_set(&vha->loop_state, LOOP_DOWN);
                        atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
+                       /*
+                        * In case of loop down, restore WWPN from
+                        * NVRAM in case of FA-WWPN capable ISP
+                        */
+                       if (ha->flags.fawwpn_enabled) {
+                               void *wwpn = ha->init_cb->port_name;
+                               memcpy(vha->port_name, wwpn, WWN_SIZE);
+                       }
+
                        vha->device_flags |= DFLG_NO_CABLE;
                        qla2x00_mark_all_devices_lost(vha, 1);
                }
-- 
1.7.7

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to