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
32static 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
48static 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
119static 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
145static 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
159static 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
167static 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
192static 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
247static 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
266static 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
356static 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
393static 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
422static 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
446static 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
452static 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
508nomem:
509	qed_chain_free(p_hwfn->cdev, &p_conn->uhq);
510nomem_uhq:
511	qed_chain_free(p_hwfn->cdev, &p_conn->r2tq);
512nomem_r2tq:
513	kfree(p_conn);
514
515	return -ENOMEM;
516}
517
518static 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
549static 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
558static 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
567int 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
581void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn)
582{
583	spin_lock_init(&p_hwfn->p_nvmetcp_info->lock);
584}
585
586void 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
606static 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
639static 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
658static 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
723static 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
761static 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
777static 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
796static 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
820const struct qed_nvmetcp_ops *qed_get_nvmetcp_ops(void)
821{
822	return &qed_nvmetcp_ops_pass;
823}
824EXPORT_SYMBOL(qed_get_nvmetcp_ops);
825
826void qed_put_nvmetcp_ops(void)
827{
828}
829EXPORT_SYMBOL(qed_put_nvmetcp_ops);
830