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 <[email protected]>
Signed-off-by: James Smart <[email protected]>
---
 drivers/scsi/lpfc/lpfc_scsi.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index e8c6f5de4440..14a62253b099 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -2734,6 +2734,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
@@ -2839,6 +2840,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)
@@ -3403,6 +3412,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
@@ -3519,6 +3529,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.
         */
-- 
2.13.7

Reply via email to