scsi: lpfc: Extend RDP support
authorDick Kennedy <dick.kennedy@broadcom.com>
Sat, 30 Sep 2017 00:34:44 +0000 (17:34 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 3 Oct 2017 02:46:41 +0000 (22:46 -0400)
Support RDP and Multiple Frames

If the remote Nport is not logged in, the driver would not populate all
the descriptors in the RDP response payload. Doing so would create a
payload length that requires multiple frames due to exceeding the
default rx buffer size without an explicit login. Currently FC-LS
explicitly states the RDP response must be a single frame sequence.
Thus we did not violate the standard.

Recently, a modification to FC-LS was accepted which allows multi-frame
sequences and all vendors have indicated they are interoperable with the
change. As such, extend RDP support with the additional fields and send
a multi-frame sequence.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_els.c

index 3ebf6ccba6e63c588e7a6d2d771e158f85a3def1..b14f7c5653cd06b5ee64cb71a23e8d3422e60710 100644 (file)
@@ -5394,10 +5394,6 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
                                        (len + pcmd), vport, ndlp);
        len += lpfc_rdp_res_fec_desc((struct fc_fec_rdp_desc *)(len + pcmd),
                        &rdp_context->link_stat);
-       /* Check if nport is logged, BZ190632 */
-       if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED))
-               goto lpfc_skip_descriptor;
-
        len += lpfc_rdp_res_bbc_desc((struct fc_rdp_bbc_desc *)(len + pcmd),
                                     &rdp_context->link_stat, vport);
        len += lpfc_rdp_res_oed_temp_desc(phba,
@@ -5418,7 +5414,6 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
        len += lpfc_rdp_res_opd_desc((struct fc_rdp_opd_sfp_desc *)(len + pcmd),
                                     rdp_context->page_a0, vport);
 
-lpfc_skip_descriptor:
        rdp_res->length = cpu_to_be32(len - 8);
        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
 
@@ -5540,7 +5535,6 @@ lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
        rdp_req = (struct fc_rdp_req_frame *) pcmd->virt;
 
-
        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
                         "2422 ELS RDP Request "
                         "dec len %d tag x%x port_id %d len %d\n",
@@ -5549,12 +5543,6 @@ lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
                         be32_to_cpu(rdp_req->nport_id_desc.nport_id),
                         be32_to_cpu(rdp_req->nport_id_desc.length));
 
-       if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED) &&
-           !phba->cfg_enable_SmartSAN) {
-               rjt_err = LSRJT_UNABLE_TPC;
-               rjt_expl = LSEXP_PORT_LOGIN_REQ;
-               goto error;
-       }
        if (sizeof(struct fc_rdp_nport_desc) !=
                        be32_to_cpu(rdp_req->rdp_des_length))
                goto rjt_logerr;