scsi: lpfc: Fix dif and first burst use in write commands
authorJames Smart <jsmart2021@gmail.com>
Fri, 30 Nov 2018 00:09:40 +0000 (16:09 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2019 14:37:08 +0000 (15:37 +0100)
[ Upstream commit 7c4042a4d0b7532cfbc90478fd3084b2dab5849e ]

When dif and first burst is used in a write command wqe, the driver was not
properly setting fields in the io command request. This resulted in no dif
bytes being sent and invalid xfer_rdy's, resulting in the io being aborted
by the hardware.

Correct the wqe initializaton when both dif and first burst are used.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc_scsi.c

index 07cb671bb8550e15c4f00cf873177765c1ee5129..2eba0c39ac1c4be15bd673e6f8390698e462588b 100644 (file)
@@ -2714,6 +2714,7 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba,
        int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction;
        int prot_group_type = 0;
        int fcpdl;
+       struct lpfc_vport *vport = phba->pport;
 
        /*
         * Start the lpfc command prep by bumping the bpl beyond fcp_cmnd
@@ -2819,6 +2820,14 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba,
         */
        iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
 
+       /*
+        * For First burst, we may need to adjust the initial transfer
+        * length for DIF
+        */
+       if (iocb_cmd->un.fcpi.fcpi_XRdy &&
+           (fcpdl < vport->cfg_first_burst_size))
+               iocb_cmd->un.fcpi.fcpi_XRdy = fcpdl;
+
        return 0;
 err:
        if (lpfc_cmd->seg_cnt)
@@ -3371,6 +3380,7 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
        int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction;
        int prot_group_type = 0;
        int fcpdl;
+       struct lpfc_vport *vport = phba->pport;
 
        /*
         * Start the lpfc command prep by bumping the sgl beyond fcp_cmnd
@@ -3486,6 +3496,14 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
         */
        iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
 
+       /*
+        * For First burst, we may need to adjust the initial transfer
+        * length for DIF
+        */
+       if (iocb_cmd->un.fcpi.fcpi_XRdy &&
+           (fcpdl < vport->cfg_first_burst_size))
+               iocb_cmd->un.fcpi.fcpi_XRdy = fcpdl;
+
        /*
         * If the OAS driver feature is enabled and the lun is enabled for
         * OAS, set the oas iocb related flags.