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:34:12 +0000 (15:34 +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 d197aa1..d489cc1 100644 (file)
@@ -2707,6 +2707,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
@@ -2812,6 +2813,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)
@@ -3364,6 +3373,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
@@ -3480,6 +3490,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.
         */