[SCSI] lpfc 8.3.30: Fixed missing CVL event causing FCF failover
authorJames Smart <james.smart@emulex.com>
Fri, 2 Mar 2012 03:35:45 +0000 (22:35 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Tue, 27 Mar 2012 07:26:30 +0000 (08:26 +0100)
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_hbadisc.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli.c

index 5fc044ff656eb75f85bf61ec2666aa2465c35f02..7dcfbece8ebbe480d94b3a74d2a35e2d7eade345 100644 (file)
@@ -908,6 +908,8 @@ struct lpfc_hba {
        atomic_t fast_event_count;
        uint32_t fcoe_eventtag;
        uint32_t fcoe_eventtag_at_fcf_scan;
+       uint32_t fcoe_cvl_eventtag;
+       uint32_t fcoe_cvl_eventtag_attn;
        struct lpfc_fcf fcf;
        uint8_t fc_map[3];
        uint8_t valid_vlan;
index 8db2fb3b45ec13a40fd36ad3aa4c48cf9659b37c..86edc015554cc6431704c42205c670faaee424ec 100644 (file)
@@ -925,9 +925,17 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
                 * due to new FCF discovery
                 */
                if ((phba->hba_flag & HBA_FIP_SUPPORT) &&
-                   (phba->fcf.fcf_flag & FCF_DISCOVERY) &&
-                   !((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
-                    (irsp->un.ulpWord[4] == IOERR_SLI_ABORTED))) {
+                   (phba->fcf.fcf_flag & FCF_DISCOVERY)) {
+                       if (phba->link_state < LPFC_LINK_UP)
+                               goto stop_rr_fcf_flogi;
+                       if ((phba->fcoe_cvl_eventtag_attn ==
+                            phba->fcoe_cvl_eventtag) &&
+                           (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
+                           (irsp->un.ulpWord[4] == IOERR_SLI_ABORTED))
+                               goto stop_rr_fcf_flogi;
+                       else
+                               phba->fcoe_cvl_eventtag_attn =
+                                       phba->fcoe_cvl_eventtag;
                        lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS,
                                        "2611 FLOGI failed on FCF (x%x), "
                                        "status:x%x/x%x, tmo:x%x, perform "
@@ -943,6 +951,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
                                goto out;
                }
 
+stop_rr_fcf_flogi:
                /* FLOGI failure */
                lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
                                "2858 FLOGI failure Status:x%x/x%x TMO:x%x\n",
index 343d87ba4df8f2e58cb2685c02bd86909d64e793..e6daaa6b06ef6b2207bf0dcc40d7f53226d1cf26 100644 (file)
@@ -5673,14 +5673,13 @@ lpfc_fcf_inuse(struct lpfc_hba *phba)
                                ret = 1;
                                spin_unlock_irq(shost->host_lock);
                                goto out;
-                       } else {
+                       } else if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
+                               ret = 1;
                                lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
-                                       "2624 RPI %x DID %x flg %x still "
-                                       "logged in\n",
-                                       ndlp->nlp_rpi, ndlp->nlp_DID,
-                                       ndlp->nlp_flag);
-                               if (ndlp->nlp_flag & NLP_RPI_REGISTERED)
-                                       ret = 1;
+                                               "2624 RPI %x DID %x flag %x "
+                                               "still logged in\n",
+                                               ndlp->nlp_rpi, ndlp->nlp_DID,
+                                               ndlp->nlp_flag);
                        }
                }
                spin_unlock_irq(shost->host_lock);
index d8e8270b1584683300ab275104334f909bb0e04b..1afa50f54b8723823789f1109cf1ef6bc8db2a35 100644 (file)
@@ -3725,6 +3725,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
                break;
 
        case LPFC_FIP_EVENT_TYPE_FCF_DEAD:
+               phba->fcoe_cvl_eventtag = acqe_fip->event_tag;
                lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
                        "2549 FCF (x%x) disconnected from network, "
                        "tag:x%x\n", acqe_fip->index, acqe_fip->event_tag);
@@ -3786,6 +3787,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
                }
                break;
        case LPFC_FIP_EVENT_TYPE_CVL:
+               phba->fcoe_cvl_eventtag = acqe_fip->event_tag;
                lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
                        "2718 Clear Virtual Link Received for VPI 0x%x"
                        " tag 0x%x\n", acqe_fip->index, acqe_fip->event_tag);
index ec1b6b2e2132804ef0993b0e753e62c2fab1dd06..421e0a36041c62380893c211bc77a13a0e294e8b 100644 (file)
@@ -15052,6 +15052,7 @@ lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index)
        LPFC_MBOXQ_t *mboxq;
 
        phba->fcoe_eventtag_at_fcf_scan = phba->fcoe_eventtag;
+       phba->fcoe_cvl_eventtag_attn = phba->fcoe_cvl_eventtag;
        mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
        if (!mboxq) {
                lpfc_printf_log(phba, KERN_ERR, LOG_INIT,