diff mbox

[09/17] lpfc: Fix RDP ACC being too long.

Message ID 5671efc0.SB0qVbj8lP/LNAjA%james.smart@avagotech.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

James Smart Dec. 16, 2015, 11:12 p.m. UTC
Fix RDP ACC being too long.

Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
---
 drivers/scsi/lpfc/lpfc_els.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Hannes Reinecke Dec. 17, 2015, 8:25 a.m. UTC | #1
On 12/17/2015 12:12 AM, James Smart wrote:
>
> Fix RDP ACC being too long.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
>   drivers/scsi/lpfc/lpfc_els.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)
>
> diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
> index f7a2967..817cdfc 100644
> --- a/drivers/scsi/lpfc/lpfc_els.c
> +++ b/drivers/scsi/lpfc/lpfc_els.c
> @@ -4824,6 +4824,7 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
>   	struct lpfc_nodelist *ndlp = rdp_context->ndlp;
>   	struct lpfc_vport *vport = ndlp->vport;
>   	struct lpfc_iocbq *elsiocb;
> +	struct ulp_bde64 *bpl;
>   	IOCB_t *icmd;
>   	uint8_t *pcmd;
>   	struct ls_rjt *stat;
> @@ -4833,6 +4834,8 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
>
>   	if (status != SUCCESS)
>   		goto error;
> +
> +	/* This will change once we know the true size of the RDP payload */
>   	cmdsize = sizeof(struct fc_rdp_res_frame);
>
>   	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize,
> @@ -4874,6 +4877,13 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
>   	rdp_res->length = cpu_to_be32(fec_size + RDP_DESC_PAYLOAD_SIZE);
>   	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
>
> +	/* Now that we know the true size of the payload, update the BPL */
> +	bpl = (struct ulp_bde64 *)
> +		(((struct lpfc_dmabuf *)(elsiocb->context3))->virt);
> +	bpl->tus.f.bdeSize = (fec_size + RDP_DESC_PAYLOAD_SIZE + 8);
> +	bpl->tus.f.bdeFlags = 0;
> +	bpl->tus.w = le32_to_cpu(bpl->tus.w);
> +
>   	phba->fc_stat.elsXmitACC++;
>   	rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
>   	if (rc == IOCB_ERROR)
>
Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index f7a2967..817cdfc 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -4824,6 +4824,7 @@  lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
 	struct lpfc_nodelist *ndlp = rdp_context->ndlp;
 	struct lpfc_vport *vport = ndlp->vport;
 	struct lpfc_iocbq *elsiocb;
+	struct ulp_bde64 *bpl;
 	IOCB_t *icmd;
 	uint8_t *pcmd;
 	struct ls_rjt *stat;
@@ -4833,6 +4834,8 @@  lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
 
 	if (status != SUCCESS)
 		goto error;
+
+	/* This will change once we know the true size of the RDP payload */
 	cmdsize = sizeof(struct fc_rdp_res_frame);
 
 	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize,
@@ -4874,6 +4877,13 @@  lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
 	rdp_res->length = cpu_to_be32(fec_size + RDP_DESC_PAYLOAD_SIZE);
 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
 
+	/* Now that we know the true size of the payload, update the BPL */
+	bpl = (struct ulp_bde64 *)
+		(((struct lpfc_dmabuf *)(elsiocb->context3))->virt);
+	bpl->tus.f.bdeSize = (fec_size + RDP_DESC_PAYLOAD_SIZE + 8);
+	bpl->tus.f.bdeFlags = 0;
+	bpl->tus.w = le32_to_cpu(bpl->tus.w);
+
 	phba->fc_stat.elsXmitACC++;
 	rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
 	if (rc == IOCB_ERROR)