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