]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Fixed missing CVL event causing round-robin FCF failover process to stop (CR 123367)
authorVaios Papadimitriou <vaios.papadimitriou@emulex.com>
Tue, 8 May 2012 22:01:27 +0000 (17:01 -0500)
committerMaxim Uvarov <maxim.uvarov@oracle.com>
Wed, 9 May 2012 00:01:27 +0000 (17:01 -0700)
It was found during virtual fabric testing that a virtual link mismatch was
created. This is because after a CVL was causing the driver to stop the FCF
failover process. The driver will now not break out of the failover process
if the flogi fails and the CVL event is expected.

commit id: 80c17849209e8773de122e58512c16c3fae3e29a

Signed-off-by: Maxim Uvarov <maxim.uvarov@oracle.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 ec73e99440a881ea85b479a672dff3f4dfe2b704..a8939917f23ceb39baba340154dd8c2127b90945 100644 (file)
@@ -901,6 +901,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 f49a604e9011cebee52c38dc63aa21249a2cf9e6..aa79d00b4567d57cd4169322421edae626fb259d 100644 (file)
@@ -3705,6 +3705,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);
@@ -3766,6 +3767,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 3af6aa86b2af4e7ef6748313d5440768b607683a..28836d6eeaaf6bb0be6b62b644eaa3224406177e 100644 (file)
@@ -15027,6 +15027,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,