]> Pileus Git - ~andy/linux/commitdiff
[SCSI] lpfc 8.3.36: Update DIF support for passthru/strip/insert
authorJames Smart <james.smart@emulex.com>
Wed, 31 Oct 2012 18:44:49 +0000 (14:44 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Tue, 27 Nov 2012 04:59:44 +0000 (08:59 +0400)
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/lpfc/lpfc_sli.h

index 2cdeb5434fb7760457761bab3f6c40607fc7d0f6..a47cfbdd05f28d4497ea6eab982cd13d86dde803 100644 (file)
@@ -3219,6 +3219,9 @@ struct wqe_common {
 #define wqe_dif_SHIFT         0
 #define wqe_dif_MASK          0x00000003
 #define wqe_dif_WORD          word7
+#define LPFC_WQE_DIF_PASSTHRU  1
+#define LPFC_WQE_DIF_STRIP     2
+#define LPFC_WQE_DIF_INSERT    3
 #define wqe_ct_SHIFT          2
 #define wqe_ct_MASK           0x00000003
 #define wqe_ct_WORD           word7
index fd2ff5a9e18c1c0d8697818c897a527b4b257ba1..60e5a177644ce4215e84d417dc27df2e5937b1d0 100644 (file)
@@ -3227,6 +3227,21 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
                }
        }
 
+       switch (scsi_get_prot_op(scsi_cmnd)) {
+       case SCSI_PROT_WRITE_STRIP:
+       case SCSI_PROT_READ_STRIP:
+               lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF_STRIP;
+               break;
+       case SCSI_PROT_WRITE_INSERT:
+       case SCSI_PROT_READ_INSERT:
+               lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF_INSERT;
+               break;
+       case SCSI_PROT_WRITE_PASS:
+       case SCSI_PROT_READ_PASS:
+               lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF_PASS;
+               break;
+       }
+
        fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd);
 
        fcp_cmnd->fcpDl = be32_to_cpu(fcpdl);
@@ -3236,7 +3251,6 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
         * we need to set word 4 of IOCB here
         */
        iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
-       lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF;
 
        return 0;
 err:
index d7f3313ef8869d2d72a975b47c4cb5987a48f43d..624eab370396d8bfc0bf8dea421f5370646d6087 100644 (file)
@@ -8068,10 +8068,6 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
                       LPFC_WQE_LENLOC_WORD4);
                bf_set(wqe_ebde_cnt, &wqe->fcp_iwrite.wqe_com, 0);
                bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpPU);
-               if (iocbq->iocb_flag & LPFC_IO_DIF) {
-                       iocbq->iocb_flag &= ~LPFC_IO_DIF;
-                       bf_set(wqe_dif, &wqe->generic.wqe_com, 1);
-               }
                bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 1);
                break;
        case CMD_FCP_IREAD64_CR:
@@ -8091,10 +8087,6 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
                       LPFC_WQE_LENLOC_WORD4);
                bf_set(wqe_ebde_cnt, &wqe->fcp_iread.wqe_com, 0);
                bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpPU);
-               if (iocbq->iocb_flag & LPFC_IO_DIF) {
-                       iocbq->iocb_flag &= ~LPFC_IO_DIF;
-                       bf_set(wqe_dif, &wqe->generic.wqe_com, 1);
-               }
                bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 1);
                break;
        case CMD_FCP_ICMND64_CR:
@@ -8304,6 +8296,14 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
                break;
        }
 
+       if (iocbq->iocb_flag & LPFC_IO_DIF_PASS)
+               bf_set(wqe_dif, &wqe->generic.wqe_com, LPFC_WQE_DIF_PASSTHRU);
+       else if (iocbq->iocb_flag & LPFC_IO_DIF_STRIP)
+               bf_set(wqe_dif, &wqe->generic.wqe_com, LPFC_WQE_DIF_STRIP);
+       else if (iocbq->iocb_flag & LPFC_IO_DIF_INSERT)
+               bf_set(wqe_dif, &wqe->generic.wqe_com, LPFC_WQE_DIF_INSERT);
+       iocbq->iocb_flag &= ~(LPFC_IO_DIF_PASS | LPFC_IO_DIF_STRIP |
+                             LPFC_IO_DIF_INSERT);
        bf_set(wqe_xri_tag, &wqe->generic.wqe_com, xritag);
        bf_set(wqe_reqtag, &wqe->generic.wqe_com, iocbq->iotag);
        wqe->generic.wqe_com.abort_tag = abort_tag;
index 2f48d000a3b430f5db5da07eb188ac8ba1c02b72..9d2e0c6fe3342f7027bc5e8fbf50ec6e3a411e5a 100644 (file)
@@ -69,7 +69,9 @@ struct lpfc_iocbq {
 #define LPFC_USE_FCPWQIDX      0x80    /* Submit to specified FCPWQ index */
 #define DSS_SECURITY_OP                0x100   /* security IO */
 #define LPFC_IO_ON_TXCMPLQ     0x200   /* The IO is still on the TXCMPLQ */
-#define LPFC_IO_DIF            0x400   /* T10 DIF IO */
+#define LPFC_IO_DIF_PASS       0x400   /* T10 DIF IO pass-thru prot */
+#define LPFC_IO_DIF_STRIP      0x800   /* T10 DIF IO strip prot */
+#define LPFC_IO_DIF_INSERT     0x1000  /* T10 DIF IO insert prot */
 
 #define LPFC_FIP_ELS_ID_MASK   0xc000  /* ELS_ID range 0-3, non-shifted mask */
 #define LPFC_FIP_ELS_ID_SHIFT  14