scsi: lpfc: Change VMID registration to be based on fabric parameters
authorJames Smart <jsmart2021@gmail.com>
Fri, 6 May 2022 03:55:15 +0000 (20:55 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 May 2022 02:12:03 +0000 (22:12 -0400)
Currently, VMID registration is configured via module parameters.  This
could lead to VMID compatibility issues if two ports are connected to
different brands of switches, as the two brands implement VMID differently.

Make logical changes so that VMID registration is based on common service
parameters from FLOGI_ACC with fabric rather than module parameters.

Link: https://lore.kernel.org/r/20220506035519.50908-9-jsmart2021@gmail.com
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli.c

index 405c8a8dd7956731312227026918e993f1ef220e..f8f5b4a2d5239ded3a2234657293e4bfa5d18767 100644 (file)
@@ -714,6 +714,7 @@ struct lpfc_vport {
 #define LPFC_VMID_QFPA_CMPL            0x4
 #define LPFC_VMID_QOS_ENABLED          0x8
 #define LPFC_VMID_TIMER_ENBLD          0x10
+#define LPFC_VMID_TYPE_PRIO            0x20
        struct fc_qfpa_res *qfpa_res;
 
        struct fc_vport *fc_vport;
index 3671e0f8e041acf22c6de5a810c72e9c17ad88b8..33fac4401e8f11cc23e6dc56e6e7a6a05025b4c3 100644 (file)
@@ -1105,7 +1105,8 @@ stop_rr_fcf_flogi:
                         sp->cmn.priority_tagging, kref_read(&ndlp->kref));
 
        if (sp->cmn.priority_tagging)
-               vport->vmid_flag |= LPFC_VMID_ISSUE_QFPA;
+               vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA |
+                                                 LPFC_VMID_TYPE_PRIO);
 
        if (vport->port_state == LPFC_FLOGI) {
                /*
index 1959c58d22f8efe989b54a4795e955130d679138..1d134a01ff3eca589857a1538287c6ef37862e66 100644 (file)
@@ -5344,9 +5344,9 @@ static void lpfc_vmid_update_entry(struct lpfc_vport *vport, struct scsi_cmnd
 {
        u64 *lta;
 
-       if (vport->vmid_priority_tagging)
+       if (vport->phba->pport->vmid_flag & LPFC_VMID_TYPE_PRIO)
                tag->cs_ctl_vmid = vmp->un.cs_ctl_vmid;
-       else
+       else if (vport->phba->cfg_vmid_app_header)
                tag->app_id = vmp->un.app_id;
 
        if (cmd->sc_data_direction == DMA_TO_DEVICE)
@@ -5391,11 +5391,12 @@ static int lpfc_vmid_get_appid(struct lpfc_vport *vport, char *uuid, struct
                               scsi_cmnd * cmd, union lpfc_vmid_io_tag *tag)
 {
        struct lpfc_vmid *vmp = NULL;
-       int hash, len, rc, i;
+       int hash, len, rc = -EPERM, i;
 
        /* check if QFPA is complete */
-       if (lpfc_vmid_is_type_priority_tag(vport) && !(vport->vmid_flag &
-             LPFC_VMID_QFPA_CMPL)) {
+       if (lpfc_vmid_is_type_priority_tag(vport) &&
+           !(vport->vmid_flag & LPFC_VMID_QFPA_CMPL) &&
+           (vport->vmid_flag & LPFC_VMID_ISSUE_QFPA)) {
                vport->work_port_events |= WORKER_CHECK_VMID_ISSUE_QFPA;
                return -EAGAIN;
        }
@@ -5469,7 +5470,7 @@ static int lpfc_vmid_get_appid(struct lpfc_vport *vport, char *uuid, struct
                        vport->vmid_inactivity_timeout ? 1 : 0;
 
                /* if type priority tag, get next available VMID */
-               if (lpfc_vmid_is_type_priority_tag(vport))
+               if (vport->phba->pport->vmid_flag & LPFC_VMID_TYPE_PRIO)
                        lpfc_vmid_assign_cs_ctl(vport, vmp);
 
                /* allocate the per cpu variable for holding */
@@ -5488,9 +5489,9 @@ static int lpfc_vmid_get_appid(struct lpfc_vport *vport, char *uuid, struct
                write_unlock(&vport->vmid_lock);
 
                /* complete transaction with switch */
-               if (lpfc_vmid_is_type_priority_tag(vport))
+               if (vport->phba->pport->vmid_flag & LPFC_VMID_TYPE_PRIO)
                        rc = lpfc_vmid_uvem(vport, vmp, true);
-               else
+               else if (vport->phba->cfg_vmid_app_header)
                        rc = lpfc_vmid_cmd(vport, SLI_CTAS_RAPP_IDENT, vmp);
                if (!rc) {
                        write_lock(&vport->vmid_lock);
index 573526f08baf861f9bc2d51152b54da4da07b88a..79d2ef5f0f05df9c0b7cfeb248725ee7f12c8ea9 100644 (file)
@@ -10377,11 +10377,11 @@ lpfc_prep_embed_io(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd)
 
        /* add the VMID tags as per switch response */
        if (unlikely(piocb->cmd_flag & LPFC_IO_VMID)) {
-               if (phba->pport->vmid_priority_tagging) {
+               if (phba->pport->vmid_flag & LPFC_VMID_TYPE_PRIO) {
                        bf_set(wqe_ccpe, &wqe->fcp_iwrite.wqe_com, 1);
                        bf_set(wqe_ccp, &wqe->fcp_iwrite.wqe_com,
                                        (piocb->vmid_tag.cs_ctl_vmid));
-               } else {
+               } else if (phba->cfg_vmid_app_header) {
                        bf_set(wqe_appid, &wqe->fcp_iwrite.wqe_com, 1);
                        bf_set(wqe_wqes, &wqe->fcp_iwrite.wqe_com, 1);
                        wqe->words[31] = piocb->vmid_tag.app_id;