diff options
| author | James Smart <james.smart@broadcom.com> | 2020-11-15 11:26:40 -0800 | 
|---|---|---|
| committer | Martin K. Petersen <martin.petersen@oracle.com> | 2020-11-17 00:43:55 -0500 | 
| commit | 840a470181c72f82f8bc9453b47ac0d2e79f6b4a (patch) | |
| tree | 76df8f3f5856a1f78daf3c4389e7545256e54320 /drivers/scsi/lpfc | |
| parent | b101eb27fde072866c6f5bdbcc2c28a6bf2c9bf7 (diff) | |
| download | linux-840a470181c72f82f8bc9453b47ac0d2e79f6b4a.tar.bz2 | |
scsi: lpfc: Enable common wqe_template support for both SCSI and NVMe
The driver is currently using SLI-4 WQE templates only for NVMe.  Refactor
the template and the placement of the service routine so that it can be
used by both SCSI and NVMe.
Link: https://lore.kernel.org/r/20201115192646.12977-12-james.smart@broadcom.com
Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/lpfc')
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 5 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_nvme.c | 133 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 126 | 
4 files changed, 134 insertions, 132 deletions
| diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index 903151aa6f02..03560478f2ce 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h @@ -590,7 +590,7 @@ struct lpfc_io_buf *lpfc_get_io_buf(struct lpfc_hba *phba,  void lpfc_release_io_buf(struct lpfc_hba *phba, struct lpfc_io_buf *ncmd,  			 struct lpfc_sli4_hdw_queue *qp);  void lpfc_io_ktime(struct lpfc_hba *phba, struct lpfc_io_buf *ncmd); -void lpfc_nvme_cmd_template(void); +void lpfc_wqe_cmd_template(void);  void lpfc_nvmet_cmd_template(void);  void lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn);  void lpfc_nvme_prep_abort_wqe(struct lpfc_iocbq *pwqeq, u16 xritag, u8 opt); @@ -598,3 +598,6 @@ extern int lpfc_enable_nvmet_cnt;  extern unsigned long long lpfc_enable_nvmet[];  extern int lpfc_no_hba_reset_cnt;  extern unsigned long lpfc_no_hba_reset[]; +extern union lpfc_wqe128 lpfc_iread_cmd_template; +extern union lpfc_wqe128 lpfc_iwrite_cmd_template; +extern union lpfc_wqe128 lpfc_icmnd_cmd_template; diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 86d9ab4bcebb..f4de75b2f64f 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -14120,7 +14120,7 @@ lpfc_init(void)  		fc_release_transport(lpfc_transport_template);  		goto unregister;  	} -	lpfc_nvme_cmd_template(); +	lpfc_wqe_cmd_template();  	lpfc_nvmet_cmd_template();  	/* Initialize in case vector mapping is needed */ diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c index 1103eb8d929d..2682839108f5 100644 --- a/drivers/scsi/lpfc/lpfc_nvme.c +++ b/drivers/scsi/lpfc/lpfc_nvme.c @@ -62,136 +62,6 @@ lpfc_release_nvme_buf(struct lpfc_hba *, struct lpfc_io_buf *);  static struct nvme_fc_port_template lpfc_nvme_template; -static union lpfc_wqe128 lpfc_iread_cmd_template; -static union lpfc_wqe128 lpfc_iwrite_cmd_template; -static union lpfc_wqe128 lpfc_icmnd_cmd_template; - -/* Setup WQE templates for NVME IOs */ -void -lpfc_nvme_cmd_template(void) -{ -	union lpfc_wqe128 *wqe; - -	/* IREAD template */ -	wqe = &lpfc_iread_cmd_template; -	memset(wqe, 0, sizeof(union lpfc_wqe128)); - -	/* Word 0, 1, 2 - BDE is variable */ - -	/* Word 3 - cmd_buff_len, payload_offset_len is zero */ - -	/* Word 4 - total_xfer_len is variable */ - -	/* Word 5 - is zero */ - -	/* Word 6 - ctxt_tag, xri_tag is variable */ - -	/* Word 7 */ -	bf_set(wqe_cmnd, &wqe->fcp_iread.wqe_com, CMD_FCP_IREAD64_WQE); -	bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, PARM_READ_CHECK); -	bf_set(wqe_class, &wqe->fcp_iread.wqe_com, CLASS3); -	bf_set(wqe_ct, &wqe->fcp_iread.wqe_com, SLI4_CT_RPI); - -	/* Word 8 - abort_tag is variable */ - -	/* Word 9  - reqtag is variable */ - -	/* Word 10 - dbde, wqes is variable */ -	bf_set(wqe_qosd, &wqe->fcp_iread.wqe_com, 0); -	bf_set(wqe_xchg, &wqe->fcp_iread.wqe_com, LPFC_NVME_XCHG); -	bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ); -	bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com, LPFC_WQE_LENLOC_WORD4); -	bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 0); -	bf_set(wqe_wqes, &wqe->fcp_iread.wqe_com, 1); - -	/* Word 11 - pbde is variable */ -	bf_set(wqe_cmd_type, &wqe->fcp_iread.wqe_com, COMMAND_DATA_IN); -	bf_set(wqe_cqid, &wqe->fcp_iread.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); -	bf_set(wqe_pbde, &wqe->fcp_iread.wqe_com, 0); - -	/* Word 12 - is zero */ - -	/* Word 13, 14, 15 - PBDE is variable */ - -	/* IWRITE template */ -	wqe = &lpfc_iwrite_cmd_template; -	memset(wqe, 0, sizeof(union lpfc_wqe128)); - -	/* Word 0, 1, 2 - BDE is variable */ - -	/* Word 3 - cmd_buff_len, payload_offset_len is zero */ - -	/* Word 4 - total_xfer_len is variable */ - -	/* Word 5 - initial_xfer_len is variable */ - -	/* Word 6 - ctxt_tag, xri_tag is variable */ - -	/* Word 7 */ -	bf_set(wqe_cmnd, &wqe->fcp_iwrite.wqe_com, CMD_FCP_IWRITE64_WQE); -	bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, PARM_READ_CHECK); -	bf_set(wqe_class, &wqe->fcp_iwrite.wqe_com, CLASS3); -	bf_set(wqe_ct, &wqe->fcp_iwrite.wqe_com, SLI4_CT_RPI); - -	/* Word 8 - abort_tag is variable */ - -	/* Word 9  - reqtag is variable */ - -	/* Word 10 - dbde, wqes is variable */ -	bf_set(wqe_qosd, &wqe->fcp_iwrite.wqe_com, 0); -	bf_set(wqe_xchg, &wqe->fcp_iwrite.wqe_com, LPFC_NVME_XCHG); -	bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE); -	bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_LENLOC_WORD4); -	bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 0); -	bf_set(wqe_wqes, &wqe->fcp_iwrite.wqe_com, 1); - -	/* Word 11 - pbde is variable */ -	bf_set(wqe_cmd_type, &wqe->fcp_iwrite.wqe_com, COMMAND_DATA_OUT); -	bf_set(wqe_cqid, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); -	bf_set(wqe_pbde, &wqe->fcp_iwrite.wqe_com, 0); - -	/* Word 12 - is zero */ - -	/* Word 13, 14, 15 - PBDE is variable */ - -	/* ICMND template */ -	wqe = &lpfc_icmnd_cmd_template; -	memset(wqe, 0, sizeof(union lpfc_wqe128)); - -	/* Word 0, 1, 2 - BDE is variable */ - -	/* Word 3 - payload_offset_len is variable */ - -	/* Word 4, 5 - is zero */ - -	/* Word 6 - ctxt_tag, xri_tag is variable */ - -	/* Word 7 */ -	bf_set(wqe_cmnd, &wqe->fcp_icmd.wqe_com, CMD_FCP_ICMND64_WQE); -	bf_set(wqe_pu, &wqe->fcp_icmd.wqe_com, 0); -	bf_set(wqe_class, &wqe->fcp_icmd.wqe_com, CLASS3); -	bf_set(wqe_ct, &wqe->fcp_icmd.wqe_com, SLI4_CT_RPI); - -	/* Word 8 - abort_tag is variable */ - -	/* Word 9  - reqtag is variable */ - -	/* Word 10 - dbde, wqes is variable */ -	bf_set(wqe_qosd, &wqe->fcp_icmd.wqe_com, 1); -	bf_set(wqe_xchg, &wqe->fcp_icmd.wqe_com, LPFC_NVME_XCHG); -	bf_set(wqe_iod, &wqe->fcp_icmd.wqe_com, LPFC_WQE_IOD_NONE); -	bf_set(wqe_lenloc, &wqe->fcp_icmd.wqe_com, LPFC_WQE_LENLOC_NONE); -	bf_set(wqe_dbde, &wqe->fcp_icmd.wqe_com, 0); -	bf_set(wqe_wqes, &wqe->fcp_icmd.wqe_com, 1); - -	/* Word 11 */ -	bf_set(wqe_cmd_type, &wqe->fcp_icmd.wqe_com, COMMAND_DATA_IN); -	bf_set(wqe_cqid, &wqe->fcp_icmd.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); -	bf_set(wqe_pbde, &wqe->fcp_icmd.wqe_com, 0); - -	/* Word 12, 13, 14, 15 - is zero */ -} -  /**   * lpfc_nvme_prep_abort_wqe - set up 'abort' work queue entry.   * @pwqeq: Pointer to command iocb. @@ -1400,6 +1270,9 @@ lpfc_nvme_prep_io_cmd(struct lpfc_vport *vport,  	/* Word 9 */  	bf_set(wqe_reqtag, &wqe->generic.wqe_com, pwqeq->iotag); +	/* Word 10 */ +	bf_set(wqe_xchg, &wqe->fcp_iwrite.wqe_com, LPFC_NVME_XCHG); +  	/* Words 13 14 15 are for PBDE support */  	pwqeq->vport = vport; diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 116a6822c201..b1d5b4484015 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -90,12 +90,138 @@ static void __lpfc_sli4_consume_cqe(struct lpfc_hba *phba,  				    struct lpfc_queue *cq,  				    struct lpfc_cqe *cqe); +union lpfc_wqe128 lpfc_iread_cmd_template; +union lpfc_wqe128 lpfc_iwrite_cmd_template; +union lpfc_wqe128 lpfc_icmnd_cmd_template; +  static IOCB_t *  lpfc_get_iocb_from_iocbq(struct lpfc_iocbq *iocbq)  {  	return &iocbq->iocb;  } +/* Setup WQE templates for IOs */ +void lpfc_wqe_cmd_template(void) +{ +	union lpfc_wqe128 *wqe; + +	/* IREAD template */ +	wqe = &lpfc_iread_cmd_template; +	memset(wqe, 0, sizeof(union lpfc_wqe128)); + +	/* Word 0, 1, 2 - BDE is variable */ + +	/* Word 3 - cmd_buff_len, payload_offset_len is zero */ + +	/* Word 4 - total_xfer_len is variable */ + +	/* Word 5 - is zero */ + +	/* Word 6 - ctxt_tag, xri_tag is variable */ + +	/* Word 7 */ +	bf_set(wqe_cmnd, &wqe->fcp_iread.wqe_com, CMD_FCP_IREAD64_WQE); +	bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, PARM_READ_CHECK); +	bf_set(wqe_class, &wqe->fcp_iread.wqe_com, CLASS3); +	bf_set(wqe_ct, &wqe->fcp_iread.wqe_com, SLI4_CT_RPI); + +	/* Word 8 - abort_tag is variable */ + +	/* Word 9  - reqtag is variable */ + +	/* Word 10 - dbde, wqes is variable */ +	bf_set(wqe_qosd, &wqe->fcp_iread.wqe_com, 0); +	bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ); +	bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com, LPFC_WQE_LENLOC_WORD4); +	bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 0); +	bf_set(wqe_wqes, &wqe->fcp_iread.wqe_com, 1); + +	/* Word 11 - pbde is variable */ +	bf_set(wqe_cmd_type, &wqe->fcp_iread.wqe_com, COMMAND_DATA_IN); +	bf_set(wqe_cqid, &wqe->fcp_iread.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); +	bf_set(wqe_pbde, &wqe->fcp_iread.wqe_com, 0); + +	/* Word 12 - is zero */ + +	/* Word 13, 14, 15 - PBDE is variable */ + +	/* IWRITE template */ +	wqe = &lpfc_iwrite_cmd_template; +	memset(wqe, 0, sizeof(union lpfc_wqe128)); + +	/* Word 0, 1, 2 - BDE is variable */ + +	/* Word 3 - cmd_buff_len, payload_offset_len is zero */ + +	/* Word 4 - total_xfer_len is variable */ + +	/* Word 5 - initial_xfer_len is variable */ + +	/* Word 6 - ctxt_tag, xri_tag is variable */ + +	/* Word 7 */ +	bf_set(wqe_cmnd, &wqe->fcp_iwrite.wqe_com, CMD_FCP_IWRITE64_WQE); +	bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, PARM_READ_CHECK); +	bf_set(wqe_class, &wqe->fcp_iwrite.wqe_com, CLASS3); +	bf_set(wqe_ct, &wqe->fcp_iwrite.wqe_com, SLI4_CT_RPI); + +	/* Word 8 - abort_tag is variable */ + +	/* Word 9  - reqtag is variable */ + +	/* Word 10 - dbde, wqes is variable */ +	bf_set(wqe_qosd, &wqe->fcp_iwrite.wqe_com, 0); +	bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE); +	bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_LENLOC_WORD4); +	bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 0); +	bf_set(wqe_wqes, &wqe->fcp_iwrite.wqe_com, 1); + +	/* Word 11 - pbde is variable */ +	bf_set(wqe_cmd_type, &wqe->fcp_iwrite.wqe_com, COMMAND_DATA_OUT); +	bf_set(wqe_cqid, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); +	bf_set(wqe_pbde, &wqe->fcp_iwrite.wqe_com, 0); + +	/* Word 12 - is zero */ + +	/* Word 13, 14, 15 - PBDE is variable */ + +	/* ICMND template */ +	wqe = &lpfc_icmnd_cmd_template; +	memset(wqe, 0, sizeof(union lpfc_wqe128)); + +	/* Word 0, 1, 2 - BDE is variable */ + +	/* Word 3 - payload_offset_len is variable */ + +	/* Word 4, 5 - is zero */ + +	/* Word 6 - ctxt_tag, xri_tag is variable */ + +	/* Word 7 */ +	bf_set(wqe_cmnd, &wqe->fcp_icmd.wqe_com, CMD_FCP_ICMND64_WQE); +	bf_set(wqe_pu, &wqe->fcp_icmd.wqe_com, 0); +	bf_set(wqe_class, &wqe->fcp_icmd.wqe_com, CLASS3); +	bf_set(wqe_ct, &wqe->fcp_icmd.wqe_com, SLI4_CT_RPI); + +	/* Word 8 - abort_tag is variable */ + +	/* Word 9  - reqtag is variable */ + +	/* Word 10 - dbde, wqes is variable */ +	bf_set(wqe_qosd, &wqe->fcp_icmd.wqe_com, 1); +	bf_set(wqe_iod, &wqe->fcp_icmd.wqe_com, LPFC_WQE_IOD_NONE); +	bf_set(wqe_lenloc, &wqe->fcp_icmd.wqe_com, LPFC_WQE_LENLOC_NONE); +	bf_set(wqe_dbde, &wqe->fcp_icmd.wqe_com, 0); +	bf_set(wqe_wqes, &wqe->fcp_icmd.wqe_com, 1); + +	/* Word 11 */ +	bf_set(wqe_cmd_type, &wqe->fcp_icmd.wqe_com, COMMAND_DATA_IN); +	bf_set(wqe_cqid, &wqe->fcp_icmd.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); +	bf_set(wqe_pbde, &wqe->fcp_icmd.wqe_com, 0); + +	/* Word 12, 13, 14, 15 - is zero */ +} +  #if defined(CONFIG_64BIT) && defined(__LITTLE_ENDIAN)  /**   * lpfc_sli4_pcimem_bcopy - SLI4 memory copy function |