xref: /linux/drivers/net/ethernet/qlogic/qed/qed_nvmetcp.c (revision 6beeaf48db6c548fcfc2ad32739d33af2fef3a5b)
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2 /* Copyright 2021 Marvell. All rights reserved. */
3 
4 #include <linux/types.h>
5 #include <asm/byteorder.h>
6 #include <asm/param.h>
7 #include <linux/delay.h>
8 #include <linux/dma-mapping.h>
9 #include <linux/etherdevice.h>
10 #include <linux/kernel.h>
11 #include <linux/log2.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 #include <linux/stddef.h>
15 #include <linux/string.h>
16 #include <linux/errno.h>
17 #include <linux/list.h>
18 #include <linux/qed/qed_nvmetcp_if.h>
19 #include "qed.h"
20 #include "qed_cxt.h"
21 #include "qed_dev_api.h"
22 #include "qed_hsi.h"
23 #include "qed_hw.h"
24 #include "qed_int.h"
25 #include "qed_nvmetcp.h"
26 #include "qed_ll2.h"
27 #include "qed_mcp.h"
28 #include "qed_sp.h"
29 #include "qed_reg_addr.h"
30 #include "qed_nvmetcp_fw_funcs.h"
31 
32 static int qed_nvmetcp_async_event(struct qed_hwfn *p_hwfn, u8 fw_event_code,
33 				   u16 echo, union event_ring_data *data,
34 				   u8 fw_return_code)
35 {
36 	if (p_hwfn->p_nvmetcp_info->event_cb) {
37 		struct qed_nvmetcp_info *p_nvmetcp = p_hwfn->p_nvmetcp_info;
38 
39 		return p_nvmetcp->event_cb(p_nvmetcp->event_context,
40 					 fw_event_code, data);
41 	} else {
42 		DP_NOTICE(p_hwfn, "nvmetcp async completion is not set\n");
43 
44 		return -EINVAL;
45 	}
46 }
47 
48 static int qed_sp_nvmetcp_func_start(struct qed_hwfn *p_hwfn,
49 				     enum spq_mode comp_mode,
50 				     struct qed_spq_comp_cb *p_comp_addr,
51 				     void *event_context,
52 				     nvmetcp_event_cb_t async_event_cb)
53 {
54 	struct nvmetcp_init_ramrod_params *p_ramrod = NULL;
55 	struct qed_nvmetcp_pf_params *p_params = NULL;
56 	struct scsi_init_func_queues *p_queue = NULL;
57 	struct nvmetcp_spe_func_init *p_init = NULL;
58 	struct qed_sp_init_data init_data = {};
59 	struct qed_spq_entry *p_ent = NULL;
60 	int rc = 0;
61 	u16 val;
62 	u8 i;
63 
64 	/* Get SPQ entry */
65 	init_data.cid = qed_spq_get_cid(p_hwfn);
66 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
67 	init_data.comp_mode = comp_mode;
68 	init_data.p_comp_data = p_comp_addr;
69 	rc = qed_sp_init_request(p_hwfn, &p_ent,
70 				 NVMETCP_RAMROD_CMD_ID_INIT_FUNC,
71 				 PROTOCOLID_TCP_ULP, &init_data);
72 	if (rc)
73 		return rc;
74 
75 	p_ramrod = &p_ent->ramrod.nvmetcp_init;
76 	p_init = &p_ramrod->nvmetcp_init_spe;
77 	p_params = &p_hwfn->pf_params.nvmetcp_pf_params;
78 	p_queue = &p_init->q_params;
79 	p_init->num_sq_pages_in_ring = p_params->num_sq_pages_in_ring;
80 	p_init->num_r2tq_pages_in_ring = p_params->num_r2tq_pages_in_ring;
81 	p_init->num_uhq_pages_in_ring = p_params->num_uhq_pages_in_ring;
82 	p_init->ll2_rx_queue_id = RESC_START(p_hwfn, QED_LL2_RAM_QUEUE) +
83 					p_params->ll2_ooo_queue_id;
84 	SET_FIELD(p_init->flags, NVMETCP_SPE_FUNC_INIT_NVMETCP_MODE, 1);
85 	p_init->func_params.log_page_size = ilog2(PAGE_SIZE);
86 	p_init->func_params.num_tasks = cpu_to_le16(p_params->num_tasks);
87 	p_init->debug_flags = p_params->debug_mode;
88 	DMA_REGPAIR_LE(p_queue->glbl_q_params_addr,
89 		       p_params->glbl_q_params_addr);
90 	p_queue->cq_num_entries = cpu_to_le16(QED_NVMETCP_FW_CQ_SIZE);
91 	p_queue->num_queues = p_params->num_queues;
92 	val = RESC_START(p_hwfn, QED_CMDQS_CQS);
93 	p_queue->queue_relative_offset = cpu_to_le16((u16)val);
94 	p_queue->cq_sb_pi = p_params->gl_rq_pi;
95 
96 	for (i = 0; i < p_params->num_queues; i++) {
97 		val = qed_get_igu_sb_id(p_hwfn, i);
98 		p_queue->cq_cmdq_sb_num_arr[i] = cpu_to_le16(val);
99 	}
100 
101 	SET_FIELD(p_queue->q_validity,
102 		  SCSI_INIT_FUNC_QUEUES_CMD_VALID, 0);
103 	p_queue->cmdq_num_entries = 0;
104 	p_queue->bdq_resource_id = (u8)RESC_START(p_hwfn, QED_BDQ);
105 	p_ramrod->tcp_init.two_msl_timer = cpu_to_le32(QED_TCP_TWO_MSL_TIMER);
106 	p_ramrod->tcp_init.tx_sws_timer = cpu_to_le16(QED_TCP_SWS_TIMER);
107 	p_init->half_way_close_timeout = cpu_to_le16(QED_TCP_HALF_WAY_CLOSE_TIMEOUT);
108 	p_ramrod->tcp_init.max_fin_rt = QED_TCP_MAX_FIN_RT;
109 	SET_FIELD(p_ramrod->nvmetcp_init_spe.params,
110 		  NVMETCP_SPE_FUNC_INIT_MAX_SYN_RT, QED_TCP_MAX_FIN_RT);
111 	p_hwfn->p_nvmetcp_info->event_context = event_context;
112 	p_hwfn->p_nvmetcp_info->event_cb = async_event_cb;
113 	qed_spq_register_async_cb(p_hwfn, PROTOCOLID_TCP_ULP,
114 				  qed_nvmetcp_async_event);
115 
116 	return qed_spq_post(p_hwfn, p_ent, NULL);
117 }
118 
119 static int qed_sp_nvmetcp_func_stop(struct qed_hwfn *p_hwfn,
120 				    enum spq_mode comp_mode,
121 				    struct qed_spq_comp_cb *p_comp_addr)
122 {
123 	struct qed_spq_entry *p_ent = NULL;
124 	struct qed_sp_init_data init_data;
125 	int rc;
126 
127 	/* Get SPQ entry */
128 	memset(&init_data, 0, sizeof(init_data));
129 	init_data.cid = qed_spq_get_cid(p_hwfn);
130 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
131 	init_data.comp_mode = comp_mode;
132 	init_data.p_comp_data = p_comp_addr;
133 	rc = qed_sp_init_request(p_hwfn, &p_ent,
134 				 NVMETCP_RAMROD_CMD_ID_DESTROY_FUNC,
135 				 PROTOCOLID_TCP_ULP, &init_data);
136 	if (rc)
137 		return rc;
138 
139 	rc = qed_spq_post(p_hwfn, p_ent, NULL);
140 	qed_spq_unregister_async_cb(p_hwfn, PROTOCOLID_TCP_ULP);
141 
142 	return rc;
143 }
144 
145 static int qed_fill_nvmetcp_dev_info(struct qed_dev *cdev,
146 				     struct qed_dev_nvmetcp_info *info)
147 {
148 	struct qed_hwfn *hwfn = QED_AFFIN_HWFN(cdev);
149 	int rc;
150 
151 	memset(info, 0, sizeof(*info));
152 	rc = qed_fill_dev_info(cdev, &info->common);
153 	info->port_id = MFW_PORT(hwfn);
154 	info->num_cqs = FEAT_NUM(hwfn, QED_NVMETCP_CQ);
155 
156 	return rc;
157 }
158 
159 static void qed_register_nvmetcp_ops(struct qed_dev *cdev,
160 				     struct qed_nvmetcp_cb_ops *ops,
161 				     void *cookie)
162 {
163 	cdev->protocol_ops.nvmetcp = ops;
164 	cdev->ops_cookie = cookie;
165 }
166 
167 static int qed_nvmetcp_stop(struct qed_dev *cdev)
168 {
169 	int rc;
170 
171 	if (!(cdev->flags & QED_FLAG_STORAGE_STARTED)) {
172 		DP_NOTICE(cdev, "nvmetcp already stopped\n");
173 
174 		return 0;
175 	}
176 
177 	if (!hash_empty(cdev->connections)) {
178 		DP_NOTICE(cdev,
179 			  "Can't stop nvmetcp - not all connections were returned\n");
180 
181 		return -EINVAL;
182 	}
183 
184 	/* Stop the nvmetcp */
185 	rc = qed_sp_nvmetcp_func_stop(QED_AFFIN_HWFN(cdev), QED_SPQ_MODE_EBLOCK,
186 				      NULL);
187 	cdev->flags &= ~QED_FLAG_STORAGE_STARTED;
188 
189 	return rc;
190 }
191 
192 static int qed_nvmetcp_start(struct qed_dev *cdev,
193 			     struct qed_nvmetcp_tid *tasks,
194 			     void *event_context,
195 			     nvmetcp_event_cb_t async_event_cb)
196 {
197 	struct qed_tid_mem *tid_info;
198 	int rc;
199 
200 	if (cdev->flags & QED_FLAG_STORAGE_STARTED) {
201 		DP_NOTICE(cdev, "nvmetcp already started;\n");
202 
203 		return 0;
204 	}
205 
206 	rc = qed_sp_nvmetcp_func_start(QED_AFFIN_HWFN(cdev),
207 				       QED_SPQ_MODE_EBLOCK, NULL,
208 				       event_context, async_event_cb);
209 	if (rc) {
210 		DP_NOTICE(cdev, "Failed to start nvmetcp\n");
211 
212 		return rc;
213 	}
214 
215 	cdev->flags |= QED_FLAG_STORAGE_STARTED;
216 	hash_init(cdev->connections);
217 
218 	if (!tasks)
219 		return 0;
220 
221 	tid_info = kzalloc(sizeof(*tid_info), GFP_KERNEL);
222 	if (!tid_info) {
223 		qed_nvmetcp_stop(cdev);
224 
225 		return -ENOMEM;
226 	}
227 
228 	rc = qed_cxt_get_tid_mem_info(QED_AFFIN_HWFN(cdev), tid_info);
229 	if (rc) {
230 		DP_NOTICE(cdev, "Failed to gather task information\n");
231 		qed_nvmetcp_stop(cdev);
232 		kfree(tid_info);
233 
234 		return rc;
235 	}
236 
237 	/* Fill task information */
238 	tasks->size = tid_info->tid_size;
239 	tasks->num_tids_per_block = tid_info->num_tids_per_block;
240 	memcpy(tasks->blocks, tid_info->blocks,
241 	       MAX_TID_BLOCKS_NVMETCP * sizeof(u8 *));
242 	kfree(tid_info);
243 
244 	return 0;
245 }
246 
247 static struct qed_hash_nvmetcp_con *qed_nvmetcp_get_hash(struct qed_dev *cdev,
248 							 u32 handle)
249 {
250 	struct qed_hash_nvmetcp_con *hash_con = NULL;
251 
252 	if (!(cdev->flags & QED_FLAG_STORAGE_STARTED))
253 		return NULL;
254 
255 	hash_for_each_possible(cdev->connections, hash_con, node, handle) {
256 		if (hash_con->con->icid == handle)
257 			break;
258 	}
259 
260 	if (!hash_con || hash_con->con->icid != handle)
261 		return NULL;
262 
263 	return hash_con;
264 }
265 
266 static int qed_sp_nvmetcp_conn_offload(struct qed_hwfn *p_hwfn,
267 				       struct qed_nvmetcp_conn *p_conn,
268 				       enum spq_mode comp_mode,
269 				       struct qed_spq_comp_cb *p_comp_addr)
270 {
271 	struct nvmetcp_spe_conn_offload *p_ramrod = NULL;
272 	struct tcp_offload_params_opt2 *p_tcp = NULL;
273 	struct qed_sp_init_data init_data = { 0 };
274 	struct qed_spq_entry *p_ent = NULL;
275 	dma_addr_t r2tq_pbl_addr;
276 	dma_addr_t xhq_pbl_addr;
277 	dma_addr_t uhq_pbl_addr;
278 	u16 physical_q;
279 	int rc = 0;
280 	u8 i;
281 
282 	/* Get SPQ entry */
283 	init_data.cid = p_conn->icid;
284 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
285 	init_data.comp_mode = comp_mode;
286 	init_data.p_comp_data = p_comp_addr;
287 	rc = qed_sp_init_request(p_hwfn, &p_ent,
288 				 NVMETCP_RAMROD_CMD_ID_OFFLOAD_CONN,
289 				 PROTOCOLID_TCP_ULP, &init_data);
290 	if (rc)
291 		return rc;
292 
293 	p_ramrod = &p_ent->ramrod.nvmetcp_conn_offload;
294 
295 	/* Transmission PQ is the first of the PF */
296 	physical_q = qed_get_cm_pq_idx(p_hwfn, PQ_FLAGS_OFLD);
297 	p_conn->physical_q0 = cpu_to_le16(physical_q);
298 	p_ramrod->nvmetcp.physical_q0 = cpu_to_le16(physical_q);
299 
300 	/* nvmetcp Pure-ACK PQ */
301 	physical_q = qed_get_cm_pq_idx(p_hwfn, PQ_FLAGS_ACK);
302 	p_conn->physical_q1 = cpu_to_le16(physical_q);
303 	p_ramrod->nvmetcp.physical_q1 = cpu_to_le16(physical_q);
304 	p_ramrod->conn_id = cpu_to_le16(p_conn->conn_id);
305 	DMA_REGPAIR_LE(p_ramrod->nvmetcp.sq_pbl_addr, p_conn->sq_pbl_addr);
306 	r2tq_pbl_addr = qed_chain_get_pbl_phys(&p_conn->r2tq);
307 	DMA_REGPAIR_LE(p_ramrod->nvmetcp.r2tq_pbl_addr, r2tq_pbl_addr);
308 	xhq_pbl_addr = qed_chain_get_pbl_phys(&p_conn->xhq);
309 	DMA_REGPAIR_LE(p_ramrod->nvmetcp.xhq_pbl_addr, xhq_pbl_addr);
310 	uhq_pbl_addr = qed_chain_get_pbl_phys(&p_conn->uhq);
311 	DMA_REGPAIR_LE(p_ramrod->nvmetcp.uhq_pbl_addr, uhq_pbl_addr);
312 	p_ramrod->nvmetcp.flags = p_conn->offl_flags;
313 	p_ramrod->nvmetcp.default_cq = p_conn->default_cq;
314 	p_ramrod->nvmetcp.initial_ack = 0;
315 	DMA_REGPAIR_LE(p_ramrod->nvmetcp.nvmetcp.cccid_itid_table_addr,
316 		       p_conn->nvmetcp_cccid_itid_table_addr);
317 	p_ramrod->nvmetcp.nvmetcp.cccid_max_range =
318 		 cpu_to_le16(p_conn->nvmetcp_cccid_max_range);
319 	p_tcp = &p_ramrod->tcp;
320 	qed_set_fw_mac_addr(&p_tcp->remote_mac_addr_hi,
321 			    &p_tcp->remote_mac_addr_mid,
322 			    &p_tcp->remote_mac_addr_lo, p_conn->remote_mac);
323 	qed_set_fw_mac_addr(&p_tcp->local_mac_addr_hi,
324 			    &p_tcp->local_mac_addr_mid,
325 			    &p_tcp->local_mac_addr_lo, p_conn->local_mac);
326 	p_tcp->vlan_id = cpu_to_le16(p_conn->vlan_id);
327 	p_tcp->flags = cpu_to_le16(p_conn->tcp_flags);
328 	p_tcp->ip_version = p_conn->ip_version;
329 	if (p_tcp->ip_version == TCP_IPV6) {
330 		for (i = 0; i < 4; i++) {
331 			p_tcp->remote_ip[i] = cpu_to_le32(p_conn->remote_ip[i]);
332 			p_tcp->local_ip[i] = cpu_to_le32(p_conn->local_ip[i]);
333 		}
334 	} else {
335 		p_tcp->remote_ip[0] = cpu_to_le32(p_conn->remote_ip[0]);
336 		p_tcp->local_ip[0] = cpu_to_le32(p_conn->local_ip[0]);
337 	}
338 
339 	p_tcp->flow_label = cpu_to_le32(p_conn->flow_label);
340 	p_tcp->ttl = p_conn->ttl;
341 	p_tcp->tos_or_tc = p_conn->tos_or_tc;
342 	p_tcp->remote_port = cpu_to_le16(p_conn->remote_port);
343 	p_tcp->local_port = cpu_to_le16(p_conn->local_port);
344 	p_tcp->mss = cpu_to_le16(p_conn->mss);
345 	p_tcp->rcv_wnd_scale = p_conn->rcv_wnd_scale;
346 	p_tcp->connect_mode = p_conn->connect_mode;
347 	p_tcp->cwnd = cpu_to_le32(p_conn->cwnd);
348 	p_tcp->ka_max_probe_cnt = p_conn->ka_max_probe_cnt;
349 	p_tcp->ka_timeout = cpu_to_le32(p_conn->ka_timeout);
350 	p_tcp->max_rt_time = cpu_to_le32(p_conn->max_rt_time);
351 	p_tcp->ka_interval = cpu_to_le32(p_conn->ka_interval);
352 
353 	return qed_spq_post(p_hwfn, p_ent, NULL);
354 }
355 
356 static int qed_sp_nvmetcp_conn_update(struct qed_hwfn *p_hwfn,
357 				      struct qed_nvmetcp_conn *p_conn,
358 				      enum spq_mode comp_mode,
359 				      struct qed_spq_comp_cb *p_comp_addr)
360 {
361 	struct nvmetcp_conn_update_ramrod_params *p_ramrod = NULL;
362 	struct qed_spq_entry *p_ent = NULL;
363 	struct qed_sp_init_data init_data;
364 	int rc = -EINVAL;
365 	u32 dval;
366 
367 	/* Get SPQ entry */
368 	memset(&init_data, 0, sizeof(init_data));
369 	init_data.cid = p_conn->icid;
370 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
371 	init_data.comp_mode = comp_mode;
372 	init_data.p_comp_data = p_comp_addr;
373 
374 	rc = qed_sp_init_request(p_hwfn, &p_ent,
375 				 NVMETCP_RAMROD_CMD_ID_UPDATE_CONN,
376 				 PROTOCOLID_TCP_ULP, &init_data);
377 	if (rc)
378 		return rc;
379 
380 	p_ramrod = &p_ent->ramrod.nvmetcp_conn_update;
381 	p_ramrod->conn_id = cpu_to_le16(p_conn->conn_id);
382 	p_ramrod->flags = p_conn->update_flag;
383 	p_ramrod->max_seq_size = cpu_to_le32(p_conn->max_seq_size);
384 	dval = p_conn->max_recv_pdu_length;
385 	p_ramrod->max_recv_pdu_length = cpu_to_le32(dval);
386 	dval = p_conn->max_send_pdu_length;
387 	p_ramrod->max_send_pdu_length = cpu_to_le32(dval);
388 	p_ramrod->first_seq_length = cpu_to_le32(p_conn->first_seq_length);
389 
390 	return qed_spq_post(p_hwfn, p_ent, NULL);
391 }
392 
393 static int qed_sp_nvmetcp_conn_terminate(struct qed_hwfn *p_hwfn,
394 					 struct qed_nvmetcp_conn *p_conn,
395 					 enum spq_mode comp_mode,
396 					 struct qed_spq_comp_cb *p_comp_addr)
397 {
398 	struct nvmetcp_spe_conn_termination *p_ramrod = NULL;
399 	struct qed_spq_entry *p_ent = NULL;
400 	struct qed_sp_init_data init_data;
401 	int rc = -EINVAL;
402 
403 	/* Get SPQ entry */
404 	memset(&init_data, 0, sizeof(init_data));
405 	init_data.cid = p_conn->icid;
406 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
407 	init_data.comp_mode = comp_mode;
408 	init_data.p_comp_data = p_comp_addr;
409 	rc = qed_sp_init_request(p_hwfn, &p_ent,
410 				 NVMETCP_RAMROD_CMD_ID_TERMINATION_CONN,
411 				 PROTOCOLID_TCP_ULP, &init_data);
412 	if (rc)
413 		return rc;
414 
415 	p_ramrod = &p_ent->ramrod.nvmetcp_conn_terminate;
416 	p_ramrod->conn_id = cpu_to_le16(p_conn->conn_id);
417 	p_ramrod->abortive = p_conn->abortive_dsconnect;
418 
419 	return qed_spq_post(p_hwfn, p_ent, NULL);
420 }
421 
422 static int qed_sp_nvmetcp_conn_clear_sq(struct qed_hwfn *p_hwfn,
423 					struct qed_nvmetcp_conn *p_conn,
424 					enum spq_mode comp_mode,
425 					struct qed_spq_comp_cb *p_comp_addr)
426 {
427 	struct qed_spq_entry *p_ent = NULL;
428 	struct qed_sp_init_data init_data;
429 	int rc = -EINVAL;
430 
431 	/* Get SPQ entry */
432 	memset(&init_data, 0, sizeof(init_data));
433 	init_data.cid = p_conn->icid;
434 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
435 	init_data.comp_mode = comp_mode;
436 	init_data.p_comp_data = p_comp_addr;
437 	rc = qed_sp_init_request(p_hwfn, &p_ent,
438 				 NVMETCP_RAMROD_CMD_ID_CLEAR_SQ,
439 				 PROTOCOLID_TCP_ULP, &init_data);
440 	if (rc)
441 		return rc;
442 
443 	return qed_spq_post(p_hwfn, p_ent, NULL);
444 }
445 
446 static void __iomem *qed_nvmetcp_get_db_addr(struct qed_hwfn *p_hwfn, u32 cid)
447 {
448 	return (u8 __iomem *)p_hwfn->doorbells +
449 			     qed_db_addr(cid, DQ_DEMS_LEGACY);
450 }
451 
452 static int qed_nvmetcp_allocate_connection(struct qed_hwfn *p_hwfn,
453 					   struct qed_nvmetcp_conn **p_out_conn)
454 {
455 	struct qed_chain_init_params params = {
456 		.mode		= QED_CHAIN_MODE_PBL,
457 		.intended_use	= QED_CHAIN_USE_TO_CONSUME_PRODUCE,
458 		.cnt_type	= QED_CHAIN_CNT_TYPE_U16,
459 	};
460 	struct qed_nvmetcp_pf_params *p_params = NULL;
461 	struct qed_nvmetcp_conn *p_conn = NULL;
462 	int rc = 0;
463 
464 	/* Try finding a free connection that can be used */
465 	spin_lock_bh(&p_hwfn->p_nvmetcp_info->lock);
466 	if (!list_empty(&p_hwfn->p_nvmetcp_info->free_list))
467 		p_conn = list_first_entry(&p_hwfn->p_nvmetcp_info->free_list,
468 					  struct qed_nvmetcp_conn, list_entry);
469 	if (p_conn) {
470 		list_del(&p_conn->list_entry);
471 		spin_unlock_bh(&p_hwfn->p_nvmetcp_info->lock);
472 		*p_out_conn = p_conn;
473 
474 		return 0;
475 	}
476 	spin_unlock_bh(&p_hwfn->p_nvmetcp_info->lock);
477 
478 	/* Need to allocate a new connection */
479 	p_params = &p_hwfn->pf_params.nvmetcp_pf_params;
480 	p_conn = kzalloc(sizeof(*p_conn), GFP_KERNEL);
481 	if (!p_conn)
482 		return -ENOMEM;
483 
484 	params.num_elems = p_params->num_r2tq_pages_in_ring *
485 			   QED_CHAIN_PAGE_SIZE / sizeof(struct nvmetcp_wqe);
486 	params.elem_size = sizeof(struct nvmetcp_wqe);
487 	rc = qed_chain_alloc(p_hwfn->cdev, &p_conn->r2tq, &params);
488 	if (rc)
489 		goto nomem_r2tq;
490 
491 	params.num_elems = p_params->num_uhq_pages_in_ring *
492 			   QED_CHAIN_PAGE_SIZE / sizeof(struct iscsi_uhqe);
493 	params.elem_size = sizeof(struct iscsi_uhqe);
494 	rc = qed_chain_alloc(p_hwfn->cdev, &p_conn->uhq, &params);
495 	if (rc)
496 		goto nomem_uhq;
497 
498 	params.elem_size = sizeof(struct iscsi_xhqe);
499 	rc = qed_chain_alloc(p_hwfn->cdev, &p_conn->xhq, &params);
500 	if (rc)
501 		goto nomem;
502 
503 	p_conn->free_on_delete = true;
504 	*p_out_conn = p_conn;
505 
506 	return 0;
507 
508 nomem:
509 	qed_chain_free(p_hwfn->cdev, &p_conn->uhq);
510 nomem_uhq:
511 	qed_chain_free(p_hwfn->cdev, &p_conn->r2tq);
512 nomem_r2tq:
513 	kfree(p_conn);
514 
515 	return -ENOMEM;
516 }
517 
518 static int qed_nvmetcp_acquire_connection(struct qed_hwfn *p_hwfn,
519 					  struct qed_nvmetcp_conn **p_out_conn)
520 {
521 	struct qed_nvmetcp_conn *p_conn = NULL;
522 	int rc = 0;
523 	u32 icid;
524 
525 	spin_lock_bh(&p_hwfn->p_nvmetcp_info->lock);
526 	rc = qed_cxt_acquire_cid(p_hwfn, PROTOCOLID_TCP_ULP, &icid);
527 	spin_unlock_bh(&p_hwfn->p_nvmetcp_info->lock);
528 
529 	if (rc)
530 		return rc;
531 
532 	rc = qed_nvmetcp_allocate_connection(p_hwfn, &p_conn);
533 	if (rc) {
534 		spin_lock_bh(&p_hwfn->p_nvmetcp_info->lock);
535 		qed_cxt_release_cid(p_hwfn, icid);
536 		spin_unlock_bh(&p_hwfn->p_nvmetcp_info->lock);
537 
538 		return rc;
539 	}
540 
541 	p_conn->icid = icid;
542 	p_conn->conn_id = (u16)icid;
543 	p_conn->fw_cid = (p_hwfn->hw_info.opaque_fid << 16) | icid;
544 	*p_out_conn = p_conn;
545 
546 	return rc;
547 }
548 
549 static void qed_nvmetcp_release_connection(struct qed_hwfn *p_hwfn,
550 					   struct qed_nvmetcp_conn *p_conn)
551 {
552 	spin_lock_bh(&p_hwfn->p_nvmetcp_info->lock);
553 	list_add_tail(&p_conn->list_entry, &p_hwfn->p_nvmetcp_info->free_list);
554 	qed_cxt_release_cid(p_hwfn, p_conn->icid);
555 	spin_unlock_bh(&p_hwfn->p_nvmetcp_info->lock);
556 }
557 
558 static void qed_nvmetcp_free_connection(struct qed_hwfn *p_hwfn,
559 					struct qed_nvmetcp_conn *p_conn)
560 {
561 	qed_chain_free(p_hwfn->cdev, &p_conn->xhq);
562 	qed_chain_free(p_hwfn->cdev, &p_conn->uhq);
563 	qed_chain_free(p_hwfn->cdev, &p_conn->r2tq);
564 	kfree(p_conn);
565 }
566 
567 int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn)
568 {
569 	struct qed_nvmetcp_info *p_nvmetcp_info;
570 
571 	p_nvmetcp_info = kzalloc(sizeof(*p_nvmetcp_info), GFP_KERNEL);
572 	if (!p_nvmetcp_info)
573 		return -ENOMEM;
574 
575 	INIT_LIST_HEAD(&p_nvmetcp_info->free_list);
576 	p_hwfn->p_nvmetcp_info = p_nvmetcp_info;
577 
578 	return 0;
579 }
580 
581 void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn)
582 {
583 	spin_lock_init(&p_hwfn->p_nvmetcp_info->lock);
584 }
585 
586 void qed_nvmetcp_free(struct qed_hwfn *p_hwfn)
587 {
588 	struct qed_nvmetcp_conn *p_conn = NULL;
589 
590 	if (!p_hwfn->p_nvmetcp_info)
591 		return;
592 
593 	while (!list_empty(&p_hwfn->p_nvmetcp_info->free_list)) {
594 		p_conn = list_first_entry(&p_hwfn->p_nvmetcp_info->free_list,
595 					  struct qed_nvmetcp_conn, list_entry);
596 		if (p_conn) {
597 			list_del(&p_conn->list_entry);
598 			qed_nvmetcp_free_connection(p_hwfn, p_conn);
599 		}
600 	}
601 
602 	kfree(p_hwfn->p_nvmetcp_info);
603 	p_hwfn->p_nvmetcp_info = NULL;
604 }
605 
606 static int qed_nvmetcp_acquire_conn(struct qed_dev *cdev,
607 				    u32 *handle,
608 				    u32 *fw_cid, void __iomem **p_doorbell)
609 {
610 	struct qed_hash_nvmetcp_con *hash_con;
611 	int rc;
612 
613 	/* Allocate a hashed connection */
614 	hash_con = kzalloc(sizeof(*hash_con), GFP_ATOMIC);
615 	if (!hash_con)
616 		return -ENOMEM;
617 
618 	/* Acquire the connection */
619 	rc = qed_nvmetcp_acquire_connection(QED_AFFIN_HWFN(cdev),
620 					    &hash_con->con);
621 	if (rc) {
622 		DP_NOTICE(cdev, "Failed to acquire Connection\n");
623 		kfree(hash_con);
624 
625 		return rc;
626 	}
627 
628 	/* Added the connection to hash table */
629 	*handle = hash_con->con->icid;
630 	*fw_cid = hash_con->con->fw_cid;
631 	hash_add(cdev->connections, &hash_con->node, *handle);
632 	if (p_doorbell)
633 		*p_doorbell = qed_nvmetcp_get_db_addr(QED_AFFIN_HWFN(cdev),
634 						      *handle);
635 
636 	return 0;
637 }
638 
639 static int qed_nvmetcp_release_conn(struct qed_dev *cdev, u32 handle)
640 {
641 	struct qed_hash_nvmetcp_con *hash_con;
642 
643 	hash_con = qed_nvmetcp_get_hash(cdev, handle);
644 	if (!hash_con) {
645 		DP_NOTICE(cdev, "Failed to find connection for handle %d\n",
646 			  handle);
647 
648 		return -EINVAL;
649 	}
650 
651 	hlist_del(&hash_con->node);
652 	qed_nvmetcp_release_connection(QED_AFFIN_HWFN(cdev), hash_con->con);
653 	kfree(hash_con);
654 
655 	return 0;
656 }
657 
658 static int qed_nvmetcp_offload_conn(struct qed_dev *cdev, u32 handle,
659 				    struct qed_nvmetcp_params_offload *conn_info)
660 {
661 	struct qed_hash_nvmetcp_con *hash_con;
662 	struct qed_nvmetcp_conn *con;
663 
664 	hash_con = qed_nvmetcp_get_hash(cdev, handle);
665 	if (!hash_con) {
666 		DP_NOTICE(cdev, "Failed to find connection for handle %d\n",
667 			  handle);
668 
669 		return -EINVAL;
670 	}
671 
672 	/* Update the connection with information from the params */
673 	con = hash_con->con;
674 
675 	/* FW initializations */
676 	con->layer_code = NVMETCP_SLOW_PATH_LAYER_CODE;
677 	con->sq_pbl_addr = conn_info->sq_pbl_addr;
678 	con->nvmetcp_cccid_max_range = conn_info->nvmetcp_cccid_max_range;
679 	con->nvmetcp_cccid_itid_table_addr = conn_info->nvmetcp_cccid_itid_table_addr;
680 	con->default_cq = conn_info->default_cq;
681 	SET_FIELD(con->offl_flags, NVMETCP_CONN_OFFLOAD_PARAMS_TARGET_MODE, 0);
682 	SET_FIELD(con->offl_flags, NVMETCP_CONN_OFFLOAD_PARAMS_NVMETCP_MODE, 1);
683 	SET_FIELD(con->offl_flags, NVMETCP_CONN_OFFLOAD_PARAMS_TCP_ON_CHIP_1B, 1);
684 
685 	/* Networking and TCP stack initializations */
686 	ether_addr_copy(con->local_mac, conn_info->src.mac);
687 	ether_addr_copy(con->remote_mac, conn_info->dst.mac);
688 	memcpy(con->local_ip, conn_info->src.ip, sizeof(con->local_ip));
689 	memcpy(con->remote_ip, conn_info->dst.ip, sizeof(con->remote_ip));
690 	con->local_port = conn_info->src.port;
691 	con->remote_port = conn_info->dst.port;
692 	con->vlan_id = conn_info->vlan_id;
693 
694 	if (conn_info->timestamp_en)
695 		SET_FIELD(con->tcp_flags, TCP_OFFLOAD_PARAMS_OPT2_TS_EN, 1);
696 
697 	if (conn_info->delayed_ack_en)
698 		SET_FIELD(con->tcp_flags, TCP_OFFLOAD_PARAMS_OPT2_DA_EN, 1);
699 
700 	if (conn_info->tcp_keep_alive_en)
701 		SET_FIELD(con->tcp_flags, TCP_OFFLOAD_PARAMS_OPT2_KA_EN, 1);
702 
703 	if (conn_info->ecn_en)
704 		SET_FIELD(con->tcp_flags, TCP_OFFLOAD_PARAMS_OPT2_ECN_EN, 1);
705 
706 	con->ip_version = conn_info->ip_version;
707 	con->flow_label = QED_TCP_FLOW_LABEL;
708 	con->ka_max_probe_cnt = conn_info->ka_max_probe_cnt;
709 	con->ka_timeout = conn_info->ka_timeout;
710 	con->ka_interval = conn_info->ka_interval;
711 	con->max_rt_time = conn_info->max_rt_time;
712 	con->ttl = conn_info->ttl;
713 	con->tos_or_tc = conn_info->tos_or_tc;
714 	con->mss = conn_info->mss;
715 	con->cwnd = conn_info->cwnd;
716 	con->rcv_wnd_scale = conn_info->rcv_wnd_scale;
717 	con->connect_mode = 0;
718 
719 	return qed_sp_nvmetcp_conn_offload(QED_AFFIN_HWFN(cdev), con,
720 					 QED_SPQ_MODE_EBLOCK, NULL);
721 }
722 
723 static int qed_nvmetcp_update_conn(struct qed_dev *cdev,
724 				   u32 handle,
725 				   struct qed_nvmetcp_params_update *conn_info)
726 {
727 	struct qed_hash_nvmetcp_con *hash_con;
728 	struct qed_nvmetcp_conn *con;
729 
730 	hash_con = qed_nvmetcp_get_hash(cdev, handle);
731 	if (!hash_con) {
732 		DP_NOTICE(cdev, "Failed to find connection for handle %d\n",
733 			  handle);
734 
735 		return -EINVAL;
736 	}
737 
738 	/* Update the connection with information from the params */
739 	con = hash_con->con;
740 	SET_FIELD(con->update_flag,
741 		  ISCSI_CONN_UPDATE_RAMROD_PARAMS_INITIAL_R2T, 0);
742 	SET_FIELD(con->update_flag,
743 		  ISCSI_CONN_UPDATE_RAMROD_PARAMS_IMMEDIATE_DATA, 1);
744 	if (conn_info->hdr_digest_en)
745 		SET_FIELD(con->update_flag, ISCSI_CONN_UPDATE_RAMROD_PARAMS_HD_EN, 1);
746 
747 	if (conn_info->data_digest_en)
748 		SET_FIELD(con->update_flag, ISCSI_CONN_UPDATE_RAMROD_PARAMS_DD_EN, 1);
749 
750 	/* Placeholder - initialize pfv, cpda, hpda */
751 
752 	con->max_seq_size = conn_info->max_io_size;
753 	con->max_recv_pdu_length = conn_info->max_recv_pdu_length;
754 	con->max_send_pdu_length = conn_info->max_send_pdu_length;
755 	con->first_seq_length = conn_info->max_io_size;
756 
757 	return qed_sp_nvmetcp_conn_update(QED_AFFIN_HWFN(cdev), con,
758 					QED_SPQ_MODE_EBLOCK, NULL);
759 }
760 
761 static int qed_nvmetcp_clear_conn_sq(struct qed_dev *cdev, u32 handle)
762 {
763 	struct qed_hash_nvmetcp_con *hash_con;
764 
765 	hash_con = qed_nvmetcp_get_hash(cdev, handle);
766 	if (!hash_con) {
767 		DP_NOTICE(cdev, "Failed to find connection for handle %d\n",
768 			  handle);
769 
770 		return -EINVAL;
771 	}
772 
773 	return qed_sp_nvmetcp_conn_clear_sq(QED_AFFIN_HWFN(cdev), hash_con->con,
774 					    QED_SPQ_MODE_EBLOCK, NULL);
775 }
776 
777 static int qed_nvmetcp_destroy_conn(struct qed_dev *cdev,
778 				    u32 handle, u8 abrt_conn)
779 {
780 	struct qed_hash_nvmetcp_con *hash_con;
781 
782 	hash_con = qed_nvmetcp_get_hash(cdev, handle);
783 	if (!hash_con) {
784 		DP_NOTICE(cdev, "Failed to find connection for handle %d\n",
785 			  handle);
786 
787 		return -EINVAL;
788 	}
789 
790 	hash_con->con->abortive_dsconnect = abrt_conn;
791 
792 	return qed_sp_nvmetcp_conn_terminate(QED_AFFIN_HWFN(cdev), hash_con->con,
793 					   QED_SPQ_MODE_EBLOCK, NULL);
794 }
795 
796 static const struct qed_nvmetcp_ops qed_nvmetcp_ops_pass = {
797 	.common = &qed_common_ops_pass,
798 	.ll2 = &qed_ll2_ops_pass,
799 	.fill_dev_info = &qed_fill_nvmetcp_dev_info,
800 	.register_ops = &qed_register_nvmetcp_ops,
801 	.start = &qed_nvmetcp_start,
802 	.stop = &qed_nvmetcp_stop,
803 	.acquire_conn = &qed_nvmetcp_acquire_conn,
804 	.release_conn = &qed_nvmetcp_release_conn,
805 	.offload_conn = &qed_nvmetcp_offload_conn,
806 	.update_conn = &qed_nvmetcp_update_conn,
807 	.destroy_conn = &qed_nvmetcp_destroy_conn,
808 	.clear_sq = &qed_nvmetcp_clear_conn_sq,
809 	.add_src_tcp_port_filter = &qed_llh_add_src_tcp_port_filter,
810 	.remove_src_tcp_port_filter = &qed_llh_remove_src_tcp_port_filter,
811 	.add_dst_tcp_port_filter = &qed_llh_add_dst_tcp_port_filter,
812 	.remove_dst_tcp_port_filter = &qed_llh_remove_dst_tcp_port_filter,
813 	.clear_all_filters = &qed_llh_clear_all_filters,
814 	.init_read_io = &init_nvmetcp_host_read_task,
815 	.init_write_io = &init_nvmetcp_host_write_task,
816 	.init_icreq_exchange = &init_nvmetcp_init_conn_req_task,
817 	.init_task_cleanup = &init_cleanup_task_nvmetcp
818 };
819 
820 const struct qed_nvmetcp_ops *qed_get_nvmetcp_ops(void)
821 {
822 	return &qed_nvmetcp_ops_pass;
823 }
824 EXPORT_SYMBOL(qed_get_nvmetcp_ops);
825 
826 void qed_put_nvmetcp_ops(void)
827 {
828 }
829 EXPORT_SYMBOL(qed_put_nvmetcp_ops);
830