1*826da486SShai Malin // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2*826da486SShai Malin /* Copyright 2021 Marvell. All rights reserved. */
3*826da486SShai Malin 
4*826da486SShai Malin #include <linux/kernel.h>
5*826da486SShai Malin #include <linux/module.h>
6*826da486SShai Malin #include <linux/pci.h>
7*826da486SShai Malin #include <linux/list.h>
8*826da486SShai Malin #include <linux/mm.h>
9*826da486SShai Malin #include <linux/types.h>
10*826da486SShai Malin #include <asm/byteorder.h>
11*826da486SShai Malin #include <linux/qed/common_hsi.h>
12*826da486SShai Malin #include <linux/qed/storage_common.h>
13*826da486SShai Malin #include <linux/qed/nvmetcp_common.h>
14*826da486SShai Malin #include <linux/qed/qed_nvmetcp_if.h>
15*826da486SShai Malin #include "qed_nvmetcp_fw_funcs.h"
16*826da486SShai Malin 
17*826da486SShai Malin #define NVMETCP_NUM_SGES_IN_CACHE 0x4
18*826da486SShai Malin 
nvmetcp_is_slow_sgl(u16 num_sges,bool small_mid_sge)19*826da486SShai Malin bool nvmetcp_is_slow_sgl(u16 num_sges, bool small_mid_sge)
20*826da486SShai Malin {
21*826da486SShai Malin 	return (num_sges > SCSI_NUM_SGES_SLOW_SGL_THR && small_mid_sge);
22*826da486SShai Malin }
23*826da486SShai Malin 
init_scsi_sgl_context(struct scsi_sgl_params * ctx_sgl_params,struct scsi_cached_sges * ctx_data_desc,struct storage_sgl_task_params * sgl_params)24*826da486SShai Malin void init_scsi_sgl_context(struct scsi_sgl_params *ctx_sgl_params,
25*826da486SShai Malin 			   struct scsi_cached_sges *ctx_data_desc,
26*826da486SShai Malin 			   struct storage_sgl_task_params *sgl_params)
27*826da486SShai Malin {
28*826da486SShai Malin 	u8 num_sges_to_init = (u8)(sgl_params->num_sges > NVMETCP_NUM_SGES_IN_CACHE ?
29*826da486SShai Malin 				   NVMETCP_NUM_SGES_IN_CACHE : sgl_params->num_sges);
30*826da486SShai Malin 	u8 sge_index;
31*826da486SShai Malin 
32*826da486SShai Malin 	/* sgl params */
33*826da486SShai Malin 	ctx_sgl_params->sgl_addr.lo = cpu_to_le32(sgl_params->sgl_phys_addr.lo);
34*826da486SShai Malin 	ctx_sgl_params->sgl_addr.hi = cpu_to_le32(sgl_params->sgl_phys_addr.hi);
35*826da486SShai Malin 	ctx_sgl_params->sgl_total_length = cpu_to_le32(sgl_params->total_buffer_size);
36*826da486SShai Malin 	ctx_sgl_params->sgl_num_sges = cpu_to_le16(sgl_params->num_sges);
37*826da486SShai Malin 
38*826da486SShai Malin 	for (sge_index = 0; sge_index < num_sges_to_init; sge_index++) {
39*826da486SShai Malin 		ctx_data_desc->sge[sge_index].sge_addr.lo =
40*826da486SShai Malin 			cpu_to_le32(sgl_params->sgl[sge_index].sge_addr.lo);
41*826da486SShai Malin 		ctx_data_desc->sge[sge_index].sge_addr.hi =
42*826da486SShai Malin 			cpu_to_le32(sgl_params->sgl[sge_index].sge_addr.hi);
43*826da486SShai Malin 		ctx_data_desc->sge[sge_index].sge_len =
44*826da486SShai Malin 			cpu_to_le32(sgl_params->sgl[sge_index].sge_len);
45*826da486SShai Malin 	}
46*826da486SShai Malin }
47*826da486SShai Malin 
calc_rw_task_size(struct nvmetcp_task_params * task_params,enum nvmetcp_task_type task_type)48*826da486SShai Malin static inline u32 calc_rw_task_size(struct nvmetcp_task_params *task_params,
49*826da486SShai Malin 				    enum nvmetcp_task_type task_type)
50*826da486SShai Malin {
51*826da486SShai Malin 	u32 io_size;
52*826da486SShai Malin 
53*826da486SShai Malin 	if (task_type == NVMETCP_TASK_TYPE_HOST_WRITE)
54*826da486SShai Malin 		io_size = task_params->tx_io_size;
55*826da486SShai Malin 	else
56*826da486SShai Malin 		io_size = task_params->rx_io_size;
57*826da486SShai Malin 
58*826da486SShai Malin 	if (unlikely(!io_size))
59*826da486SShai Malin 		return 0;
60*826da486SShai Malin 
61*826da486SShai Malin 	return io_size;
62*826da486SShai Malin }
63*826da486SShai Malin 
init_sqe(struct nvmetcp_task_params * task_params,struct storage_sgl_task_params * sgl_task_params,enum nvmetcp_task_type task_type)64*826da486SShai Malin static inline void init_sqe(struct nvmetcp_task_params *task_params,
65*826da486SShai Malin 			    struct storage_sgl_task_params *sgl_task_params,
66*826da486SShai Malin 			    enum nvmetcp_task_type task_type)
67*826da486SShai Malin {
68*826da486SShai Malin 	if (!task_params->sqe)
69*826da486SShai Malin 		return;
70*826da486SShai Malin 
71*826da486SShai Malin 	memset(task_params->sqe, 0, sizeof(*task_params->sqe));
72*826da486SShai Malin 	task_params->sqe->task_id = cpu_to_le16(task_params->itid);
73*826da486SShai Malin 
74*826da486SShai Malin 	switch (task_type) {
75*826da486SShai Malin 	case NVMETCP_TASK_TYPE_HOST_WRITE: {
76*826da486SShai Malin 		u32 buf_size = 0;
77*826da486SShai Malin 		u32 num_sges = 0;
78*826da486SShai Malin 
79*826da486SShai Malin 		SET_FIELD(task_params->sqe->contlen_cdbsize,
80*826da486SShai Malin 			  NVMETCP_WQE_CDB_SIZE_OR_NVMETCP_CMD, 1);
81*826da486SShai Malin 		SET_FIELD(task_params->sqe->flags, NVMETCP_WQE_WQE_TYPE,
82*826da486SShai Malin 			  NVMETCP_WQE_TYPE_NORMAL);
83*826da486SShai Malin 		if (task_params->tx_io_size) {
84*826da486SShai Malin 			if (task_params->send_write_incapsule)
85*826da486SShai Malin 				buf_size = calc_rw_task_size(task_params, task_type);
86*826da486SShai Malin 
87*826da486SShai Malin 			if (nvmetcp_is_slow_sgl(sgl_task_params->num_sges,
88*826da486SShai Malin 						sgl_task_params->small_mid_sge))
89*826da486SShai Malin 				num_sges = NVMETCP_WQE_NUM_SGES_SLOWIO;
90*826da486SShai Malin 			else
91*826da486SShai Malin 				num_sges = min((u16)sgl_task_params->num_sges,
92*826da486SShai Malin 					       (u16)SCSI_NUM_SGES_SLOW_SGL_THR);
93*826da486SShai Malin 		}
94*826da486SShai Malin 		SET_FIELD(task_params->sqe->flags, NVMETCP_WQE_NUM_SGES, num_sges);
95*826da486SShai Malin 		SET_FIELD(task_params->sqe->contlen_cdbsize, NVMETCP_WQE_CONT_LEN, buf_size);
96*826da486SShai Malin 	} break;
97*826da486SShai Malin 
98*826da486SShai Malin 	case NVMETCP_TASK_TYPE_HOST_READ: {
99*826da486SShai Malin 		SET_FIELD(task_params->sqe->flags, NVMETCP_WQE_WQE_TYPE,
100*826da486SShai Malin 			  NVMETCP_WQE_TYPE_NORMAL);
101*826da486SShai Malin 		SET_FIELD(task_params->sqe->contlen_cdbsize,
102*826da486SShai Malin 			  NVMETCP_WQE_CDB_SIZE_OR_NVMETCP_CMD, 1);
103*826da486SShai Malin 	} break;
104*826da486SShai Malin 
105*826da486SShai Malin 	case NVMETCP_TASK_TYPE_INIT_CONN_REQUEST: {
106*826da486SShai Malin 		SET_FIELD(task_params->sqe->flags, NVMETCP_WQE_WQE_TYPE,
107*826da486SShai Malin 			  NVMETCP_WQE_TYPE_MIDDLE_PATH);
108*826da486SShai Malin 
109*826da486SShai Malin 		if (task_params->tx_io_size) {
110*826da486SShai Malin 			SET_FIELD(task_params->sqe->contlen_cdbsize, NVMETCP_WQE_CONT_LEN,
111*826da486SShai Malin 				  task_params->tx_io_size);
112*826da486SShai Malin 			SET_FIELD(task_params->sqe->flags, NVMETCP_WQE_NUM_SGES,
113*826da486SShai Malin 				  min((u16)sgl_task_params->num_sges,
114*826da486SShai Malin 				      (u16)SCSI_NUM_SGES_SLOW_SGL_THR));
115*826da486SShai Malin 		}
116*826da486SShai Malin 	} break;
117*826da486SShai Malin 
118*826da486SShai Malin 	case NVMETCP_TASK_TYPE_CLEANUP:
119*826da486SShai Malin 		SET_FIELD(task_params->sqe->flags, NVMETCP_WQE_WQE_TYPE,
120*826da486SShai Malin 			  NVMETCP_WQE_TYPE_TASK_CLEANUP);
121*826da486SShai Malin 
122*826da486SShai Malin 	default:
123*826da486SShai Malin 		break;
124*826da486SShai Malin 	}
125*826da486SShai Malin }
126*826da486SShai Malin 
127*826da486SShai Malin /* The following function initializes of NVMeTCP task params */
128*826da486SShai Malin static inline void
init_nvmetcp_task_params(struct e5_nvmetcp_task_context * context,struct nvmetcp_task_params * task_params,enum nvmetcp_task_type task_type)129*826da486SShai Malin init_nvmetcp_task_params(struct e5_nvmetcp_task_context *context,
130*826da486SShai Malin 			 struct nvmetcp_task_params *task_params,
131*826da486SShai Malin 			 enum nvmetcp_task_type task_type)
132*826da486SShai Malin {
133*826da486SShai Malin 	context->ystorm_st_context.state.cccid = task_params->host_cccid;
134*826da486SShai Malin 	SET_FIELD(context->ustorm_st_context.error_flags, USTORM_NVMETCP_TASK_ST_CTX_NVME_TCP, 1);
135*826da486SShai Malin 	context->ustorm_st_context.nvme_tcp_opaque_lo = cpu_to_le32(task_params->opq.lo);
136*826da486SShai Malin 	context->ustorm_st_context.nvme_tcp_opaque_hi = cpu_to_le32(task_params->opq.hi);
137*826da486SShai Malin }
138*826da486SShai Malin 
139*826da486SShai Malin /* The following function initializes default values to all tasks */
140*826da486SShai Malin static inline void
init_default_nvmetcp_task(struct nvmetcp_task_params * task_params,void * pdu_header,void * nvme_cmd,enum nvmetcp_task_type task_type)141*826da486SShai Malin init_default_nvmetcp_task(struct nvmetcp_task_params *task_params,
142*826da486SShai Malin 			  void *pdu_header, void *nvme_cmd,
143*826da486SShai Malin 			  enum nvmetcp_task_type task_type)
144*826da486SShai Malin {
145*826da486SShai Malin 	struct e5_nvmetcp_task_context *context = task_params->context;
146*826da486SShai Malin 	const u8 val_byte = context->mstorm_ag_context.cdu_validation;
147*826da486SShai Malin 	u8 dw_index;
148*826da486SShai Malin 
149*826da486SShai Malin 	memset(context, 0, sizeof(*context));
150*826da486SShai Malin 	init_nvmetcp_task_params(context, task_params,
151*826da486SShai Malin 				 (enum nvmetcp_task_type)task_type);
152*826da486SShai Malin 
153*826da486SShai Malin 	/* Swapping requirements used below, will be removed in future FW versions */
154*826da486SShai Malin 	if (task_type == NVMETCP_TASK_TYPE_HOST_WRITE ||
155*826da486SShai Malin 	    task_type == NVMETCP_TASK_TYPE_HOST_READ) {
156*826da486SShai Malin 		for (dw_index = 0;
157*826da486SShai Malin 		     dw_index < QED_NVMETCP_CMN_HDR_SIZE / sizeof(u32);
158*826da486SShai Malin 		     dw_index++)
159*826da486SShai Malin 			context->ystorm_st_context.pdu_hdr.task_hdr.reg[dw_index] =
160*826da486SShai Malin 				cpu_to_le32(__swab32(((u32 *)pdu_header)[dw_index]));
161*826da486SShai Malin 
162*826da486SShai Malin 		for (dw_index = QED_NVMETCP_CMN_HDR_SIZE / sizeof(u32);
163*826da486SShai Malin 		     dw_index < QED_NVMETCP_CMD_HDR_SIZE / sizeof(u32);
164*826da486SShai Malin 		     dw_index++)
165*826da486SShai Malin 			context->ystorm_st_context.pdu_hdr.task_hdr.reg[dw_index] =
166*826da486SShai Malin 				cpu_to_le32(__swab32(((u32 *)nvme_cmd)[dw_index - 2]));
167*826da486SShai Malin 	} else {
168*826da486SShai Malin 		for (dw_index = 0;
169*826da486SShai Malin 		     dw_index < QED_NVMETCP_NON_IO_HDR_SIZE / sizeof(u32);
170*826da486SShai Malin 		     dw_index++)
171*826da486SShai Malin 			context->ystorm_st_context.pdu_hdr.task_hdr.reg[dw_index] =
172*826da486SShai Malin 				cpu_to_le32(__swab32(((u32 *)pdu_header)[dw_index]));
173*826da486SShai Malin 	}
174*826da486SShai Malin 
175*826da486SShai Malin 	/* M-Storm Context: */
176*826da486SShai Malin 	context->mstorm_ag_context.cdu_validation = val_byte;
177*826da486SShai Malin 	context->mstorm_st_context.task_type = (u8)(task_type);
178*826da486SShai Malin 	context->mstorm_ag_context.task_cid = cpu_to_le16(task_params->conn_icid);
179*826da486SShai Malin 
180*826da486SShai Malin 	/* Ustorm Context: */
181*826da486SShai Malin 	SET_FIELD(context->ustorm_ag_context.flags1, E5_USTORM_NVMETCP_TASK_AG_CTX_R2T2RECV, 1);
182*826da486SShai Malin 	context->ustorm_st_context.task_type = (u8)(task_type);
183*826da486SShai Malin 	context->ustorm_st_context.cq_rss_number = task_params->cq_rss_number;
184*826da486SShai Malin 	context->ustorm_ag_context.icid = cpu_to_le16(task_params->conn_icid);
185*826da486SShai Malin }
186*826da486SShai Malin 
187*826da486SShai Malin /* The following function initializes the U-Storm Task Contexts */
188*826da486SShai Malin static inline void
init_ustorm_task_contexts(struct ustorm_nvmetcp_task_st_ctx * ustorm_st_context,struct e5_ustorm_nvmetcp_task_ag_ctx * ustorm_ag_context,u32 remaining_recv_len,u32 expected_data_transfer_len,u8 num_sges,bool tx_dif_conn_err_en)189*826da486SShai Malin init_ustorm_task_contexts(struct ustorm_nvmetcp_task_st_ctx *ustorm_st_context,
190*826da486SShai Malin 			  struct e5_ustorm_nvmetcp_task_ag_ctx *ustorm_ag_context,
191*826da486SShai Malin 			  u32 remaining_recv_len,
192*826da486SShai Malin 			  u32 expected_data_transfer_len, u8 num_sges,
193*826da486SShai Malin 			  bool tx_dif_conn_err_en)
194*826da486SShai Malin {
195*826da486SShai Malin 	/* Remaining data to be received in bytes. Used in validations*/
196*826da486SShai Malin 	ustorm_st_context->rem_rcv_len = cpu_to_le32(remaining_recv_len);
197*826da486SShai Malin 	ustorm_ag_context->exp_data_acked = cpu_to_le32(expected_data_transfer_len);
198*826da486SShai Malin 	ustorm_st_context->exp_data_transfer_len = cpu_to_le32(expected_data_transfer_len);
199*826da486SShai Malin 	SET_FIELD(ustorm_st_context->reg1_map, REG1_NUM_SGES, num_sges);
200*826da486SShai Malin 	SET_FIELD(ustorm_ag_context->flags2, E5_USTORM_NVMETCP_TASK_AG_CTX_DIF_ERROR_CF_EN,
201*826da486SShai Malin 		  tx_dif_conn_err_en ? 1 : 0);
202*826da486SShai Malin }
203*826da486SShai Malin 
204*826da486SShai Malin /* The following function initializes Local Completion Contexts: */
205*826da486SShai Malin static inline void
set_local_completion_context(struct e5_nvmetcp_task_context * context)206*826da486SShai Malin set_local_completion_context(struct e5_nvmetcp_task_context *context)
207*826da486SShai Malin {
208*826da486SShai Malin 	SET_FIELD(context->ystorm_st_context.state.flags,
209*826da486SShai Malin 		  YSTORM_NVMETCP_TASK_STATE_LOCAL_COMP, 1);
210*826da486SShai Malin 	SET_FIELD(context->ustorm_st_context.flags,
211*826da486SShai Malin 		  USTORM_NVMETCP_TASK_ST_CTX_LOCAL_COMP, 1);
212*826da486SShai Malin }
213*826da486SShai Malin 
214*826da486SShai Malin /* Common Fastpath task init function: */
215*826da486SShai Malin static inline void
init_rw_nvmetcp_task(struct nvmetcp_task_params * task_params,enum nvmetcp_task_type task_type,void * pdu_header,void * nvme_cmd,struct storage_sgl_task_params * sgl_task_params)216*826da486SShai Malin init_rw_nvmetcp_task(struct nvmetcp_task_params *task_params,
217*826da486SShai Malin 		     enum nvmetcp_task_type task_type,
218*826da486SShai Malin 		     void *pdu_header, void *nvme_cmd,
219*826da486SShai Malin 		     struct storage_sgl_task_params *sgl_task_params)
220*826da486SShai Malin {
221*826da486SShai Malin 	struct e5_nvmetcp_task_context *context = task_params->context;
222*826da486SShai Malin 	u32 task_size = calc_rw_task_size(task_params, task_type);
223*826da486SShai Malin 	bool slow_io = false;
224*826da486SShai Malin 	u8 num_sges = 0;
225*826da486SShai Malin 
226*826da486SShai Malin 	init_default_nvmetcp_task(task_params, pdu_header, nvme_cmd, task_type);
227*826da486SShai Malin 
228*826da486SShai Malin 	/* Tx/Rx: */
229*826da486SShai Malin 	if (task_params->tx_io_size) {
230*826da486SShai Malin 		/* if data to transmit: */
231*826da486SShai Malin 		init_scsi_sgl_context(&context->ystorm_st_context.state.sgl_params,
232*826da486SShai Malin 				      &context->ystorm_st_context.state.data_desc,
233*826da486SShai Malin 				      sgl_task_params);
234*826da486SShai Malin 		slow_io = nvmetcp_is_slow_sgl(sgl_task_params->num_sges,
235*826da486SShai Malin 					      sgl_task_params->small_mid_sge);
236*826da486SShai Malin 		num_sges =
237*826da486SShai Malin 			(u8)(!slow_io ? min((u32)sgl_task_params->num_sges,
238*826da486SShai Malin 					    (u32)SCSI_NUM_SGES_SLOW_SGL_THR) :
239*826da486SShai Malin 					    NVMETCP_WQE_NUM_SGES_SLOWIO);
240*826da486SShai Malin 		if (slow_io) {
241*826da486SShai Malin 			SET_FIELD(context->ystorm_st_context.state.flags,
242*826da486SShai Malin 				  YSTORM_NVMETCP_TASK_STATE_SLOW_IO, 1);
243*826da486SShai Malin 		}
244*826da486SShai Malin 	} else if (task_params->rx_io_size) {
245*826da486SShai Malin 		/* if data to receive: */
246*826da486SShai Malin 		init_scsi_sgl_context(&context->mstorm_st_context.sgl_params,
247*826da486SShai Malin 				      &context->mstorm_st_context.data_desc,
248*826da486SShai Malin 				      sgl_task_params);
249*826da486SShai Malin 		num_sges =
250*826da486SShai Malin 			(u8)(!nvmetcp_is_slow_sgl(sgl_task_params->num_sges,
251*826da486SShai Malin 						  sgl_task_params->small_mid_sge) ?
252*826da486SShai Malin 						  min((u32)sgl_task_params->num_sges,
253*826da486SShai Malin 						      (u32)SCSI_NUM_SGES_SLOW_SGL_THR) :
254*826da486SShai Malin 						      NVMETCP_WQE_NUM_SGES_SLOWIO);
255*826da486SShai Malin 		context->mstorm_st_context.rem_task_size = cpu_to_le32(task_size);
256*826da486SShai Malin 	}
257*826da486SShai Malin 
258*826da486SShai Malin 	/* Ustorm context: */
259*826da486SShai Malin 	init_ustorm_task_contexts(&context->ustorm_st_context,
260*826da486SShai Malin 				  &context->ustorm_ag_context,
261*826da486SShai Malin 				  /* Remaining Receive length is the Task Size */
262*826da486SShai Malin 				  task_size,
263*826da486SShai Malin 				  /* The size of the transmitted task */
264*826da486SShai Malin 				  task_size,
265*826da486SShai Malin 				  /* num_sges */
266*826da486SShai Malin 				  num_sges,
267*826da486SShai Malin 				  false);
268*826da486SShai Malin 
269*826da486SShai Malin 	/* Set exp_data_acked */
270*826da486SShai Malin 	if (task_type == NVMETCP_TASK_TYPE_HOST_WRITE) {
271*826da486SShai Malin 		if (task_params->send_write_incapsule)
272*826da486SShai Malin 			context->ustorm_ag_context.exp_data_acked = task_size;
273*826da486SShai Malin 		else
274*826da486SShai Malin 			context->ustorm_ag_context.exp_data_acked = 0;
275*826da486SShai Malin 	} else if (task_type == NVMETCP_TASK_TYPE_HOST_READ) {
276*826da486SShai Malin 		context->ustorm_ag_context.exp_data_acked = 0;
277*826da486SShai Malin 	}
278*826da486SShai Malin 
279*826da486SShai Malin 	context->ustorm_ag_context.exp_cont_len = 0;
280*826da486SShai Malin 	init_sqe(task_params, sgl_task_params, task_type);
281*826da486SShai Malin }
282*826da486SShai Malin 
283*826da486SShai Malin static void
init_common_initiator_read_task(struct nvmetcp_task_params * task_params,struct nvme_tcp_cmd_pdu * cmd_pdu_header,struct nvme_command * nvme_cmd,struct storage_sgl_task_params * sgl_task_params)284*826da486SShai Malin init_common_initiator_read_task(struct nvmetcp_task_params *task_params,
285*826da486SShai Malin 				struct nvme_tcp_cmd_pdu *cmd_pdu_header,
286*826da486SShai Malin 				struct nvme_command *nvme_cmd,
287*826da486SShai Malin 				struct storage_sgl_task_params *sgl_task_params)
288*826da486SShai Malin {
289*826da486SShai Malin 	init_rw_nvmetcp_task(task_params, NVMETCP_TASK_TYPE_HOST_READ,
290*826da486SShai Malin 			     cmd_pdu_header, nvme_cmd, sgl_task_params);
291*826da486SShai Malin }
292*826da486SShai Malin 
init_nvmetcp_host_read_task(struct nvmetcp_task_params * task_params,struct nvme_tcp_cmd_pdu * cmd_pdu_header,struct nvme_command * nvme_cmd,struct storage_sgl_task_params * sgl_task_params)293*826da486SShai Malin void init_nvmetcp_host_read_task(struct nvmetcp_task_params *task_params,
294*826da486SShai Malin 				 struct nvme_tcp_cmd_pdu *cmd_pdu_header,
295*826da486SShai Malin 				 struct nvme_command *nvme_cmd,
296*826da486SShai Malin 				 struct storage_sgl_task_params *sgl_task_params)
297*826da486SShai Malin {
298*826da486SShai Malin 	init_common_initiator_read_task(task_params, (void *)cmd_pdu_header,
299*826da486SShai Malin 					(void *)nvme_cmd, sgl_task_params);
300*826da486SShai Malin }
301*826da486SShai Malin 
302*826da486SShai Malin static void
init_common_initiator_write_task(struct nvmetcp_task_params * task_params,struct nvme_tcp_cmd_pdu * cmd_pdu_header,struct nvme_command * nvme_cmd,struct storage_sgl_task_params * sgl_task_params)303*826da486SShai Malin init_common_initiator_write_task(struct nvmetcp_task_params *task_params,
304*826da486SShai Malin 				 struct nvme_tcp_cmd_pdu *cmd_pdu_header,
305*826da486SShai Malin 				 struct nvme_command *nvme_cmd,
306*826da486SShai Malin 				 struct storage_sgl_task_params *sgl_task_params)
307*826da486SShai Malin {
308*826da486SShai Malin 	init_rw_nvmetcp_task(task_params, NVMETCP_TASK_TYPE_HOST_WRITE,
309*826da486SShai Malin 			     cmd_pdu_header, nvme_cmd, sgl_task_params);
310*826da486SShai Malin }
311*826da486SShai Malin 
init_nvmetcp_host_write_task(struct nvmetcp_task_params * task_params,struct nvme_tcp_cmd_pdu * cmd_pdu_header,struct nvme_command * nvme_cmd,struct storage_sgl_task_params * sgl_task_params)312*826da486SShai Malin void init_nvmetcp_host_write_task(struct nvmetcp_task_params *task_params,
313*826da486SShai Malin 				  struct nvme_tcp_cmd_pdu *cmd_pdu_header,
314*826da486SShai Malin 				  struct nvme_command *nvme_cmd,
315*826da486SShai Malin 				  struct storage_sgl_task_params *sgl_task_params)
316*826da486SShai Malin {
317*826da486SShai Malin 	init_common_initiator_write_task(task_params, (void *)cmd_pdu_header,
318*826da486SShai Malin 					 (void *)nvme_cmd, sgl_task_params);
319*826da486SShai Malin }
320*826da486SShai Malin 
321*826da486SShai Malin static void
init_common_login_request_task(struct nvmetcp_task_params * task_params,void * login_req_pdu_header,struct storage_sgl_task_params * tx_sgl_task_params,struct storage_sgl_task_params * rx_sgl_task_params)322*826da486SShai Malin init_common_login_request_task(struct nvmetcp_task_params *task_params,
323*826da486SShai Malin 			       void *login_req_pdu_header,
324*826da486SShai Malin 			       struct storage_sgl_task_params *tx_sgl_task_params,
325*826da486SShai Malin 			       struct storage_sgl_task_params *rx_sgl_task_params)
326*826da486SShai Malin {
327*826da486SShai Malin 	struct e5_nvmetcp_task_context *context = task_params->context;
328*826da486SShai Malin 
329*826da486SShai Malin 	init_default_nvmetcp_task(task_params, (void *)login_req_pdu_header, NULL,
330*826da486SShai Malin 				  NVMETCP_TASK_TYPE_INIT_CONN_REQUEST);
331*826da486SShai Malin 
332*826da486SShai Malin 	/* Ustorm Context: */
333*826da486SShai Malin 	init_ustorm_task_contexts(&context->ustorm_st_context,
334*826da486SShai Malin 				  &context->ustorm_ag_context,
335*826da486SShai Malin 
336*826da486SShai Malin 				  /* Remaining Receive length is the Task Size */
337*826da486SShai Malin 				  task_params->rx_io_size ?
338*826da486SShai Malin 				  rx_sgl_task_params->total_buffer_size : 0,
339*826da486SShai Malin 
340*826da486SShai Malin 				  /* The size of the transmitted task */
341*826da486SShai Malin 				  task_params->tx_io_size ?
342*826da486SShai Malin 				  tx_sgl_task_params->total_buffer_size : 0,
343*826da486SShai Malin 				  0, /* num_sges */
344*826da486SShai Malin 				  0); /* tx_dif_conn_err_en */
345*826da486SShai Malin 
346*826da486SShai Malin 	/* SGL context: */
347*826da486SShai Malin 	if (task_params->tx_io_size)
348*826da486SShai Malin 		init_scsi_sgl_context(&context->ystorm_st_context.state.sgl_params,
349*826da486SShai Malin 				      &context->ystorm_st_context.state.data_desc,
350*826da486SShai Malin 				      tx_sgl_task_params);
351*826da486SShai Malin 	if (task_params->rx_io_size)
352*826da486SShai Malin 		init_scsi_sgl_context(&context->mstorm_st_context.sgl_params,
353*826da486SShai Malin 				      &context->mstorm_st_context.data_desc,
354*826da486SShai Malin 				      rx_sgl_task_params);
355*826da486SShai Malin 
356*826da486SShai Malin 	context->mstorm_st_context.rem_task_size =
357*826da486SShai Malin 		cpu_to_le32(task_params->rx_io_size ?
358*826da486SShai Malin 				 rx_sgl_task_params->total_buffer_size : 0);
359*826da486SShai Malin 	init_sqe(task_params, tx_sgl_task_params, NVMETCP_TASK_TYPE_INIT_CONN_REQUEST);
360*826da486SShai Malin }
361*826da486SShai Malin 
362*826da486SShai Malin /* The following function initializes Login task in Host mode: */
init_nvmetcp_init_conn_req_task(struct nvmetcp_task_params * task_params,struct nvme_tcp_icreq_pdu * init_conn_req_pdu_hdr,struct storage_sgl_task_params * tx_sgl_task_params,struct storage_sgl_task_params * rx_sgl_task_params)363*826da486SShai Malin void init_nvmetcp_init_conn_req_task(struct nvmetcp_task_params *task_params,
364*826da486SShai Malin 				     struct nvme_tcp_icreq_pdu *init_conn_req_pdu_hdr,
365*826da486SShai Malin 				     struct storage_sgl_task_params *tx_sgl_task_params,
366*826da486SShai Malin 				     struct storage_sgl_task_params *rx_sgl_task_params)
367*826da486SShai Malin {
368*826da486SShai Malin 	init_common_login_request_task(task_params, init_conn_req_pdu_hdr,
369*826da486SShai Malin 				       tx_sgl_task_params, rx_sgl_task_params);
370*826da486SShai Malin }
371*826da486SShai Malin 
init_cleanup_task_nvmetcp(struct nvmetcp_task_params * task_params)372*826da486SShai Malin void init_cleanup_task_nvmetcp(struct nvmetcp_task_params *task_params)
373*826da486SShai Malin {
374*826da486SShai Malin 	init_sqe(task_params, NULL, NVMETCP_TASK_TYPE_CLEANUP);
375*826da486SShai Malin }
376