[SCSI] lpfc 8.3.20: Updates to FC discovery commands
[deliverable/linux.git] / drivers / scsi / lpfc / lpfc_hbadisc.c
index 91fa65906173ff6c3391dd28827e4dd411c733b7..f9f160ab2ee9184e1623b5a7495b4f377e42df93 100644 (file)
@@ -3102,8 +3102,8 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
                ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
 
-       if (ndlp->nlp_flag &  NLP_IGNR_REG_CMPL ||
-               ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) {
+       if (ndlp->nlp_flag & NLP_IGNR_REG_CMPL ||
+           ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) {
                /* We rcvd a rscn after issuing this
                 * mbox reg login, we may have cycled
                 * back through the state and be
@@ -3115,10 +3115,6 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
                spin_lock_irq(shost->host_lock);
                ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
                spin_unlock_irq(shost->host_lock);
-               if (phba->sli_rev == LPFC_SLI_REV4)
-                       lpfc_sli4_free_rpi(phba,
-                               pmb->u.mb.un.varRegLogin.rpi);
-
        } else
                /* Good status, call state machine */
                lpfc_disc_state_machine(vport, ndlp, pmb,
@@ -3428,7 +3424,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        }
 
        ndlp->nlp_rpi = mb->un.varWords[0];
-       ndlp->nlp_flag |= NLP_RPI_VALID;
+       ndlp->nlp_flag |= NLP_RPI_REGISTERED;
        ndlp->nlp_type |= NLP_FABRIC;
        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
 
@@ -3502,7 +3498,7 @@ out:
        }
 
        ndlp->nlp_rpi = mb->un.varWords[0];
-       ndlp->nlp_flag |= NLP_RPI_VALID;
+       ndlp->nlp_flag |= NLP_RPI_REGISTERED;
        ndlp->nlp_type |= NLP_FABRIC;
        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
 
@@ -3835,6 +3831,8 @@ lpfc_initialize_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
        NLP_INT_NODE_ACT(ndlp);
        atomic_set(&ndlp->cmd_pending, 0);
        ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth;
+       if (vport->phba->sli_rev == LPFC_SLI_REV4)
+               ndlp->nlp_rpi = lpfc_sli4_alloc_rpi(vport->phba);
 }
 
 struct lpfc_nodelist *
@@ -4048,7 +4046,7 @@ lpfc_no_rpi(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
         * by firmware with a no rpi error.
         */
        psli = &phba->sli;
-       if (ndlp->nlp_flag & NLP_RPI_VALID) {
+       if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
                /* Now process each ring */
                for (i = 0; i < psli->num_rings; i++) {
                        pring = &psli->ring[i];
@@ -4096,7 +4094,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
        LPFC_MBOXQ_t    *mbox;
        int rc;
 
-       if (ndlp->nlp_flag & NLP_RPI_VALID) {
+       if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
                mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
                if (mbox) {
                        lpfc_unreg_login(phba, vport->vpi, ndlp->nlp_rpi, mbox);
@@ -4108,8 +4106,9 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
                }
                lpfc_no_rpi(phba, ndlp);
 
-               ndlp->nlp_rpi = 0;
-               ndlp->nlp_flag &= ~NLP_RPI_VALID;
+               if (phba->sli_rev != LPFC_SLI_REV4)
+                       ndlp->nlp_rpi = 0;
+               ndlp->nlp_flag &= ~NLP_RPI_REGISTERED;
                ndlp->nlp_flag &= ~NLP_NPR_ADISC;
                return 1;
        }
@@ -4141,7 +4140,7 @@ lpfc_unreg_hba_rpis(struct lpfc_hba *phba)
                shost = lpfc_shost_from_vport(vports[i]);
                spin_lock_irq(shost->host_lock);
                list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) {
-                       if (ndlp->nlp_flag & NLP_RPI_VALID) {
+                       if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
                                /* The mempool_alloc might sleep */
                                spin_unlock_irq(shost->host_lock);
                                lpfc_unreg_rpi(vports[i], ndlp);
@@ -4270,9 +4269,6 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
                                kfree(mp);
                        }
                        list_del(&mb->list);
-                       if (phba->sli_rev == LPFC_SLI_REV4)
-                               lpfc_sli4_free_rpi(phba,
-                                        mb->u.mb.un.varRegLogin.rpi);
                        mempool_free(mb, phba->mbox_mem_pool);
                        /* We shall not invoke the lpfc_nlp_put to decrement
                         * the ndlp reference count as we are in the process
@@ -4314,15 +4310,15 @@ lpfc_nlp_remove(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
 
        lpfc_cancel_retry_delay_tmo(vport, ndlp);
        if ((ndlp->nlp_flag & NLP_DEFER_RM) &&
-               !(ndlp->nlp_flag & NLP_REG_LOGIN_SEND) &&
-           !(ndlp->nlp_flag & NLP_RPI_VALID)) {
+           !(ndlp->nlp_flag & NLP_REG_LOGIN_SEND) &&
+           !(ndlp->nlp_flag & NLP_RPI_REGISTERED)) {
                /* For this case we need to cleanup the default rpi
                 * allocated by the firmware.
                 */
                if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))
                        != NULL) {
                        rc = lpfc_reg_rpi(phba, vport->vpi, ndlp->nlp_DID,
-                           (uint8_t *) &vport->fc_sparam, mbox, 0);
+                           (uint8_t *) &vport->fc_sparam, mbox, ndlp->nlp_rpi);
                        if (rc) {
                                mempool_free(mbox, phba->mbox_mem_pool);
                        }
@@ -5060,7 +5056,7 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        pmb->context2 = NULL;
 
        ndlp->nlp_rpi = mb->un.varWords[0];
-       ndlp->nlp_flag |= NLP_RPI_VALID;
+       ndlp->nlp_flag |= NLP_RPI_REGISTERED;
        ndlp->nlp_type |= NLP_FABRIC;
        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
 
@@ -5184,6 +5180,8 @@ lpfc_nlp_release(struct kref *kref)
        spin_lock_irqsave(&phba->ndlp_lock, flags);
        NLP_CLR_NODE_ACT(ndlp);
        spin_unlock_irqrestore(&phba->ndlp_lock, flags);
+       if (phba->sli_rev == LPFC_SLI_REV4)
+               lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi);
 
        /* free ndlp memory for final ndlp release */
        if (NLP_CHK_FREE_REQ(ndlp)) {
@@ -5354,7 +5352,7 @@ lpfc_fcf_inuse(struct lpfc_hba *phba)
                                        "logged in\n",
                                        ndlp->nlp_rpi, ndlp->nlp_DID,
                                        ndlp->nlp_flag);
-                               if (ndlp->nlp_flag & NLP_RPI_VALID)
+                               if (ndlp->nlp_flag & NLP_RPI_REGISTERED)
                                        ret = 1;
                        }
                }
This page took 0.029432 seconds and 5 git commands to generate.