* ----------------------------------------------------------------------
  * |             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 |
 
 
                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
 
                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);
 
                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);
                }