[SCSI] qla2xxx: Fix issue with not displaying node name after system reboot.
authorArmen Baloyan <armen.baloyan@qlogic.com>
Wed, 30 Oct 2013 07:38:17 +0000 (03:38 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 19 Dec 2013 15:38:58 +0000 (07:38 -0800)
Signed-off-by: Armen Baloyan <armen.baloyan@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_mr.c
drivers/scsi/qla2xxx/qla_mr.h
drivers/scsi/qla2xxx/qla_os.c

index 149a1b5..66f6597 100644 (file)
@@ -26,7 +26,7 @@
  * |                              |                    | 0x302d,0x3033  |
  * |                              |                    | 0x3036,0x3038  |
  * |                              |                    | 0x303a                |
- * | DPC Thread                   |       0x4022       | 0x4002,0x4013  |
+ * | DPC Thread                   |       0x4023       | 0x4002,0x4013  |
  * | Async Events                 |       0x5087       | 0x502b-0x502f  |
  * |                              |                    | 0x5047,0x5052  |
  * |                              |                    | 0x5084,0x5075 |
index 0fb01e1..ac62bca 100644 (file)
@@ -3370,6 +3370,7 @@ typedef struct scsi_qla_host {
 #define FX00_RESET_RECOVERY    23
 #define FX00_TARGET_SCAN       24
 #define FX00_CRITEMP_RECOVERY  25
+#define FX00_HOST_INFO_RESEND  26
 
        uint32_t        device_flags;
 #define SWITCH_FOUND           BIT_0
index 7c17b92..034f86d 100644 (file)
@@ -1610,6 +1610,22 @@ qlafx00_timer_routine(scsi_qla_host_t *vha)
                        ha->mr.fw_critemp_timer_tick--;
                }
        }
+       if (ha->mr.host_info_resend) {
+               /*
+                * Incomplete host info might be sent to firmware
+                * durinng system boot - info should be resend
+                */
+               if (ha->mr.hinfo_resend_timer_tick == 0) {
+                       ha->mr.host_info_resend = false;
+                       set_bit(FX00_HOST_INFO_RESEND, &vha->dpc_flags);
+                       ha->mr.hinfo_resend_timer_tick =
+                           QLAFX00_HINFO_RESEND_INTERVAL;
+                       qla2xxx_wake_dpc(vha);
+               } else {
+                       ha->mr.hinfo_resend_timer_tick--;
+               }
+       }
+
 }
 
 /*
@@ -1888,6 +1904,8 @@ qlafx00_fx_disc(scsi_qla_host_t *vha, fc_port_t *fcport, uint16_t fx_type)
                            p_sysid->sysname, SYSNAME_LENGTH);
                        strncpy(phost_info->nodename,
                            p_sysid->nodename, NODENAME_LENGTH);
+                       if (!strcmp(phost_info->nodename, "(none)"))
+                               ha->mr.host_info_resend = true;
                        strncpy(phost_info->release,
                            p_sysid->release, RELEASE_LENGTH);
                        strncpy(phost_info->version,
index 79a93c5..a5ddea6 100644 (file)
@@ -511,6 +511,8 @@ struct mr_data_fx00 {
        uint32_t old_aenmbx0_state;
        uint32_t critical_temperature;
        bool extended_io_enabled;
+       bool host_info_resend;
+       uint8_t hinfo_resend_timer_tick;
 };
 
 #define QLAFX00_EXTENDED_IO_EN_MASK    0x20
@@ -537,6 +539,7 @@ struct mr_data_fx00 {
 #define QLAFX00_RESET_INTERVAL         120     /* number of seconds */
 #define QLAFX00_MAX_RESET_INTERVAL     600     /* number of seconds */
 #define QLAFX00_CRITEMP_INTERVAL       60      /* number of seconds */
+#define QLAFX00_HINFO_RESEND_INTERVAL  60      /* number of seconds */
 
 #define QLAFX00_CRITEMP_THRSHLD                80      /* Celsius degrees */
 
index 690b626..4ab9a27 100644 (file)
@@ -2495,6 +2495,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->mr.fw_reset_timer_tick = QLAFX00_RESET_INTERVAL;
                ha->mr.fw_critemp_timer_tick = QLAFX00_CRITEMP_INTERVAL;
                ha->mr.fw_hbt_en = 1;
+               ha->mr.host_info_resend = false;
+               ha->mr.hinfo_resend_timer_tick = QLAFX00_HINFO_RESEND_INTERVAL;
        }
 
        ql_dbg_pci(ql_dbg_init, pdev, 0x001e,
@@ -4867,6 +4869,14 @@ qla2x00_do_dpc(void *data)
                                ql_dbg(ql_dbg_dpc, base_vha, 0x401f,
                                    "ISPFx00 Target Scan End\n");
                        }
+                       if (test_and_clear_bit(FX00_HOST_INFO_RESEND,
+                               &base_vha->dpc_flags)) {
+                               ql_dbg(ql_dbg_dpc, base_vha, 0x4023,
+                                   "ISPFx00 Host Info resend scheduled\n");
+                               qlafx00_fx_disc(base_vha,
+                                   &base_vha->hw->mr.fcport,
+                                   FXDISC_REG_HOST_INFO);
+                       }
                }
 
                if (test_and_clear_bit(ISP_ABORT_NEEDED,