scsi: lpfc: Fix vports not logging into target
authorJames Smart <jsmart2021@gmail.com>
Fri, 2 Jun 2017 04:07:08 +0000 (21:07 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 01:37:31 +0000 (21:37 -0400)
vports cannot login to target.

For vports, lpfc_nodelist is allocated for targets only on completion of
GFF_ID command. Driver checks if lpfc_nodelist exists for target before
sending GFF_ID. So, GFF_ID and PLOGI are not sent.

As mentioned by the comment in lpfc_prep_node_fc4type() routine, do not
send GFF_ID only if this NPortID is previously identified as FCP
target. Send GFF_ID if it is a newly identified remote port from GID_FT
response.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_ct.c

index 24ce96dcc94d4ce0fffd8109e89a80193b71bb16..9c0c1463057d5a781295976789ac27f6089b02ab 100644 (file)
@@ -503,26 +503,23 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
                                Did, vport->fc_flag, vport->fc_rscn_id_cnt);
 
                        /*
-                        * This NPortID was previously a FCP target,
+                        * This NPortID was previously a FCP/NVMe target,
                         * Don't even bother to send GFF_ID.
                         */
                        ndlp = lpfc_findnode_did(vport, Did);
-                       if (ndlp && NLP_CHK_NODE_ACT(ndlp))
-                               ndlp->nlp_fc4_type = fc4_type;
-
-                       if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
-                               ndlp->nlp_fc4_type = fc4_type;
-
-                               if (ndlp->nlp_type & NLP_FCP_TARGET)
-                                       lpfc_setup_disc_node(vport, Did);
-
-                               else if (lpfc_ns_cmd(vport, SLI_CTNS_GFF_ID,
-                                                       0, Did) == 0)
-                                       vport->num_disc_nodes++;
-
-                               else
-                                       lpfc_setup_disc_node(vport, Did);
-                       }
+                       if (ndlp && NLP_CHK_NODE_ACT(ndlp) &&
+                           (ndlp->nlp_type &
+                           (NLP_FCP_TARGET | NLP_NVME_TARGET))) {
+                               if (fc4_type == FC_TYPE_FCP)
+                                       ndlp->nlp_fc4_type |= NLP_FC4_FCP;
+                               if (fc4_type == FC_TYPE_NVME)
+                                       ndlp->nlp_fc4_type |= NLP_FC4_NVME;
+                               lpfc_setup_disc_node(vport, Did);
+                       } else if (lpfc_ns_cmd(vport, SLI_CTNS_GFF_ID,
+                                  0, Did) == 0)
+                               vport->num_disc_nodes++;
+                       else
+                               lpfc_setup_disc_node(vport, Did);
                } else {
                        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
                                "Skip2 GID_FTrsp: did:x%x flg:x%x cnt:%d",