1897e87a1SShai Malin /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2897e87a1SShai Malin /* Copyright 2021 Marvell. All rights reserved. */
3897e87a1SShai Malin 
4897e87a1SShai Malin #ifndef _QED_NVMETCP_H
5897e87a1SShai Malin #define _QED_NVMETCP_H
6897e87a1SShai Malin 
7897e87a1SShai Malin #include <linux/types.h>
8897e87a1SShai Malin #include <linux/list.h>
9897e87a1SShai Malin #include <linux/slab.h>
10897e87a1SShai Malin #include <linux/spinlock.h>
11897e87a1SShai Malin #include <linux/qed/tcp_common.h>
12897e87a1SShai Malin #include <linux/qed/qed_nvmetcp_if.h>
13897e87a1SShai Malin #include <linux/qed/qed_chain.h>
14897e87a1SShai Malin #include "qed.h"
15897e87a1SShai Malin #include "qed_hsi.h"
16897e87a1SShai Malin #include "qed_mcp.h"
17897e87a1SShai Malin #include "qed_sp.h"
18897e87a1SShai Malin 
19897e87a1SShai Malin #define QED_NVMETCP_FW_CQ_SIZE (4 * 1024)
20897e87a1SShai Malin 
21897e87a1SShai Malin /* tcp parameters */
22*76684ab8SShai Malin #define QED_TCP_FLOW_LABEL 0
23897e87a1SShai Malin #define QED_TCP_TWO_MSL_TIMER 4000
24897e87a1SShai Malin #define QED_TCP_HALF_WAY_CLOSE_TIMEOUT 10
25897e87a1SShai Malin #define QED_TCP_MAX_FIN_RT 2
26897e87a1SShai Malin #define QED_TCP_SWS_TIMER 5000
27897e87a1SShai Malin 
28897e87a1SShai Malin struct qed_nvmetcp_info {
29897e87a1SShai Malin 	spinlock_t lock; /* Connection resources. */
30897e87a1SShai Malin 	struct list_head free_list;
31897e87a1SShai Malin 	u16 max_num_outstanding_tasks;
32897e87a1SShai Malin 	void *event_context;
33897e87a1SShai Malin 	nvmetcp_event_cb_t event_cb;
34897e87a1SShai Malin };
35897e87a1SShai Malin 
36*76684ab8SShai Malin struct qed_hash_nvmetcp_con {
37*76684ab8SShai Malin 	struct hlist_node node;
38*76684ab8SShai Malin 	struct qed_nvmetcp_conn *con;
39*76684ab8SShai Malin };
40*76684ab8SShai Malin 
41*76684ab8SShai Malin struct qed_nvmetcp_conn {
42*76684ab8SShai Malin 	struct list_head list_entry;
43*76684ab8SShai Malin 	bool free_on_delete;
44*76684ab8SShai Malin 	u16 conn_id;
45*76684ab8SShai Malin 	u32 icid;
46*76684ab8SShai Malin 	u32 fw_cid;
47*76684ab8SShai Malin 	u8 layer_code;
48*76684ab8SShai Malin 	u8 offl_flags;
49*76684ab8SShai Malin 	u8 connect_mode;
50*76684ab8SShai Malin 	dma_addr_t sq_pbl_addr;
51*76684ab8SShai Malin 	struct qed_chain r2tq;
52*76684ab8SShai Malin 	struct qed_chain xhq;
53*76684ab8SShai Malin 	struct qed_chain uhq;
54*76684ab8SShai Malin 	u8 local_mac[6];
55*76684ab8SShai Malin 	u8 remote_mac[6];
56*76684ab8SShai Malin 	u8 ip_version;
57*76684ab8SShai Malin 	u8 ka_max_probe_cnt;
58*76684ab8SShai Malin 	u16 vlan_id;
59*76684ab8SShai Malin 	u16 tcp_flags;
60*76684ab8SShai Malin 	u32 remote_ip[4];
61*76684ab8SShai Malin 	u32 local_ip[4];
62*76684ab8SShai Malin 	u32 flow_label;
63*76684ab8SShai Malin 	u32 ka_timeout;
64*76684ab8SShai Malin 	u32 ka_interval;
65*76684ab8SShai Malin 	u32 max_rt_time;
66*76684ab8SShai Malin 	u8 ttl;
67*76684ab8SShai Malin 	u8 tos_or_tc;
68*76684ab8SShai Malin 	u16 remote_port;
69*76684ab8SShai Malin 	u16 local_port;
70*76684ab8SShai Malin 	u16 mss;
71*76684ab8SShai Malin 	u8 rcv_wnd_scale;
72*76684ab8SShai Malin 	u32 rcv_wnd;
73*76684ab8SShai Malin 	u32 cwnd;
74*76684ab8SShai Malin 	u8 update_flag;
75*76684ab8SShai Malin 	u8 default_cq;
76*76684ab8SShai Malin 	u8 abortive_dsconnect;
77*76684ab8SShai Malin 	u32 max_seq_size;
78*76684ab8SShai Malin 	u32 max_recv_pdu_length;
79*76684ab8SShai Malin 	u32 max_send_pdu_length;
80*76684ab8SShai Malin 	u32 first_seq_length;
81*76684ab8SShai Malin 	u16 physical_q0;
82*76684ab8SShai Malin 	u16 physical_q1;
83*76684ab8SShai Malin 	u16 nvmetcp_cccid_max_range;
84*76684ab8SShai Malin 	dma_addr_t nvmetcp_cccid_itid_table_addr;
85*76684ab8SShai Malin };
86*76684ab8SShai Malin 
87897e87a1SShai Malin #if IS_ENABLED(CONFIG_QED_NVMETCP)
88897e87a1SShai Malin int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn);
89897e87a1SShai Malin void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn);
90897e87a1SShai Malin void qed_nvmetcp_free(struct qed_hwfn *p_hwfn);
91897e87a1SShai Malin 
92897e87a1SShai Malin #else /* IS_ENABLED(CONFIG_QED_NVMETCP) */
qed_nvmetcp_alloc(struct qed_hwfn * p_hwfn)93897e87a1SShai Malin static inline int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn)
94897e87a1SShai Malin {
95897e87a1SShai Malin 	return -EINVAL;
96897e87a1SShai Malin }
97897e87a1SShai Malin 
qed_nvmetcp_setup(struct qed_hwfn * p_hwfn)98897e87a1SShai Malin static inline void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn) {}
qed_nvmetcp_free(struct qed_hwfn * p_hwfn)99897e87a1SShai Malin static inline void qed_nvmetcp_free(struct qed_hwfn *p_hwfn) {}
100897e87a1SShai Malin 
101897e87a1SShai Malin #endif /* IS_ENABLED(CONFIG_QED_NVMETCP) */
102897e87a1SShai Malin 
103897e87a1SShai Malin #endif
104