1336695Sdavidcs/*
2336695Sdavidcs * Copyright (c) 2018-2019 Cavium, Inc.
3336695Sdavidcs * All rights reserved.
4336695Sdavidcs *
5336695Sdavidcs *  Redistribution and use in source and binary forms, with or without
6336695Sdavidcs *  modification, are permitted provided that the following conditions
7336695Sdavidcs *  are met:
8336695Sdavidcs *
9336695Sdavidcs *  1. Redistributions of source code must retain the above copyright
10336695Sdavidcs *     notice, this list of conditions and the following disclaimer.
11336695Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12336695Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13336695Sdavidcs *     documentation and/or other materials provided with the distribution.
14336695Sdavidcs *
15336695Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16336695Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17336695Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18336695Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19336695Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20336695Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21336695Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22336695Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23336695Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24336695Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25336695Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26336695Sdavidcs *
27336695Sdavidcs * $FreeBSD: stable/11/sys/dev/qlnx/qlnxe/ecore_iwarp.h 337517 2018-08-09 01:17:35Z davidcs $
28336695Sdavidcs */
29336695Sdavidcs
30336695Sdavidcs#ifndef __ECORE_IWARP_H__
31336695Sdavidcs#define __ECORE_IWARP_H__
32336695Sdavidcs
33336695Sdavidcsenum ecore_iwarp_qp_state {
34336695Sdavidcs	ECORE_IWARP_QP_STATE_IDLE,
35336695Sdavidcs	ECORE_IWARP_QP_STATE_RTS,
36336695Sdavidcs	ECORE_IWARP_QP_STATE_TERMINATE,
37336695Sdavidcs	ECORE_IWARP_QP_STATE_CLOSING,
38336695Sdavidcs	ECORE_IWARP_QP_STATE_ERROR,
39336695Sdavidcs};
40336695Sdavidcs
41336695Sdavidcsenum ecore_iwarp_listener_state {
42336695Sdavidcs	ECORE_IWARP_LISTENER_STATE_ACTIVE,
43336695Sdavidcs	ECORE_IWARP_LISTENER_STATE_UNPAUSE,
44336695Sdavidcs	ECORE_IWARP_LISTENER_STATE_PAUSE,
45336695Sdavidcs	ECORE_IWARP_LISTENER_STATE_DESTROYING,
46336695Sdavidcs};
47336695Sdavidcs
48336695Sdavidcsenum ecore_iwarp_qp_state
49336695Sdavidcsecore_roce2iwarp_state(enum ecore_roce_qp_state state);
50336695Sdavidcs
51336695Sdavidcs#ifdef CONFIG_ECORE_IWARP
52336695Sdavidcs
53336695Sdavidcs#define ECORE_IWARP_PREALLOC_CNT	ECORE_IWARP_MAX_LIS_BACKLOG
54336695Sdavidcs
55336695Sdavidcs#define ECORE_IWARP_LL2_SYN_TX_SIZE	(128)
56336695Sdavidcs#define ECORE_IWARP_LL2_SYN_RX_SIZE	(256)
57336695Sdavidcs#define ECORE_IWARP_MAX_SYN_PKT_SIZE	(128)
58336695Sdavidcs
59336695Sdavidcs#define ECORE_IWARP_LL2_OOO_DEF_TX_SIZE	(256)
60336695Sdavidcs#define ECORE_MAX_OOO			(16)
61336695Sdavidcs#define ECORE_IWARP_LL2_OOO_MAX_RX_SIZE	(16384)
62336695Sdavidcs
63336695Sdavidcs#define ECORE_IWARP_HANDLE_INVAL	(0xff)
64336695Sdavidcs
65336695Sdavidcsstruct ecore_iwarp_ll2_buff {
66336695Sdavidcs	struct ecore_iwarp_ll2_buff	*piggy_buf;
67336695Sdavidcs	void 				*data;
68336695Sdavidcs	dma_addr_t			data_phys_addr;
69336695Sdavidcs	u32				buff_size;
70336695Sdavidcs};
71336695Sdavidcs
72336695Sdavidcsstruct ecore_iwarp_ll2_mpa_buf {
73336695Sdavidcs	osal_list_entry_t		list_entry;
74336695Sdavidcs	struct ecore_iwarp_ll2_buff	*ll2_buf;
75336695Sdavidcs	struct unaligned_opaque_data	data;
76336695Sdavidcs	u16				tcp_payload_len;
77336695Sdavidcs	u8				placement_offset;
78336695Sdavidcs};
79336695Sdavidcs
80336695Sdavidcs/* In some cases a fpdu will arrive with only one byte of the header, in this
81336695Sdavidcs * case the fpdu_length will be partial ( contain only higher byte and
82336695Sdavidcs * incomplete bytes will contain the invalid value
83336695Sdavidcs */
84336695Sdavidcs#define ECORE_IWARP_INVALID_INCOMPLETE_BYTES 0xffff
85336695Sdavidcs
86336695Sdavidcsstruct ecore_iwarp_fpdu {
87336695Sdavidcs	struct ecore_iwarp_ll2_buff 	*mpa_buf;
88336695Sdavidcs	dma_addr_t			pkt_hdr;
89336695Sdavidcs	u8				pkt_hdr_size;
90336695Sdavidcs	dma_addr_t			mpa_frag;
91336695Sdavidcs	void				*mpa_frag_virt;
92336695Sdavidcs	u16				mpa_frag_len;
93336695Sdavidcs	u16				fpdu_length;
94336695Sdavidcs	u16				incomplete_bytes;
95336695Sdavidcs};
96336695Sdavidcs
97336695Sdavidcsstruct ecore_iwarp_info {
98336695Sdavidcs	osal_list_t			listen_list; /* ecore_iwarp_listener */
99336695Sdavidcs	osal_list_t			ep_list;     /* ecore_iwarp_ep */
100336695Sdavidcs	osal_list_t			ep_free_list;/* pre-allocated ep's */
101336695Sdavidcs	osal_list_t			mpa_buf_list;/* list of mpa_bufs */
102336695Sdavidcs	osal_list_t			mpa_buf_pending_list;
103336695Sdavidcs	osal_spinlock_t			iw_lock;
104336695Sdavidcs	osal_spinlock_t			qp_lock; /* for teardown races */
105336695Sdavidcs	struct iwarp_rxmit_stats_drv	stats;
106336695Sdavidcs	u32				rcv_wnd_scale;
107336695Sdavidcs	u16				rcv_wnd_size;
108336695Sdavidcs	u16				max_mtu;
109336695Sdavidcs	u16				num_ooo_rx_bufs;
110336695Sdavidcs	u8				mac_addr[ETH_ALEN];
111336695Sdavidcs	u8				crc_needed;
112336695Sdavidcs	u8				tcp_flags;
113336695Sdavidcs	u8				ll2_syn_handle;
114336695Sdavidcs	u8				ll2_ooo_handle;
115336695Sdavidcs	u8				ll2_mpa_handle;
116336695Sdavidcs	u8				peer2peer;
117336695Sdavidcs	u8				_pad;
118336695Sdavidcs	enum mpa_negotiation_mode	mpa_rev;
119336695Sdavidcs	enum mpa_rtr_type		rtr_type;
120336695Sdavidcs	struct ecore_iwarp_fpdu		*partial_fpdus;
121336695Sdavidcs	struct ecore_iwarp_ll2_mpa_buf  *mpa_bufs;
122336695Sdavidcs	u8				*mpa_intermediate_buf;
123336695Sdavidcs	u16				max_num_partial_fpdus;
124336695Sdavidcs
125336695Sdavidcs	/* MPA statistics */
126336695Sdavidcs	u64				unalign_rx_comp;
127336695Sdavidcs};
128336695Sdavidcs
129336695Sdavidcsenum ecore_iwarp_ep_state {
130336695Sdavidcs	ECORE_IWARP_EP_INIT,
131336695Sdavidcs	ECORE_IWARP_EP_MPA_REQ_RCVD,
132336695Sdavidcs	ECORE_IWARP_EP_MPA_OFFLOADED,
133336695Sdavidcs	ECORE_IWARP_EP_ESTABLISHED,
134336695Sdavidcs	ECORE_IWARP_EP_CLOSED,
135336695Sdavidcs	ECORE_IWARP_EP_ABORTING
136336695Sdavidcs};
137336695Sdavidcs
138336695Sdavidcsunion async_output {
139336695Sdavidcs	struct iwarp_eqe_data_mpa_async_completion mpa_response;
140336695Sdavidcs	struct iwarp_eqe_data_tcp_async_completion mpa_request;
141336695Sdavidcs};
142336695Sdavidcs
143336695Sdavidcs#define ECORE_MAX_PRIV_DATA_LEN (512)
144336695Sdavidcsstruct ecore_iwarp_ep_memory {
145336695Sdavidcs	u8			in_pdata[ECORE_MAX_PRIV_DATA_LEN];
146336695Sdavidcs	u8			out_pdata[ECORE_MAX_PRIV_DATA_LEN];
147336695Sdavidcs	union async_output	async_output;
148336695Sdavidcs};
149336695Sdavidcs
150336695Sdavidcs/* Endpoint structure represents a TCP connection. This connection can be
151336695Sdavidcs * associated with a QP or not (in which case QP==NULL)
152336695Sdavidcs */
153336695Sdavidcsstruct ecore_iwarp_ep {
154336695Sdavidcs	osal_list_entry_t		list_entry;
155336695Sdavidcs	int				sig;
156336695Sdavidcs	struct ecore_rdma_qp		*qp;
157336695Sdavidcs	enum ecore_iwarp_ep_state	state;
158336695Sdavidcs
159336695Sdavidcs	/* This contains entire buffer required for ep memories. This is the
160336695Sdavidcs	 * only one actually allocated and freed. The rest are pointers into
161336695Sdavidcs	 * this buffer
162336695Sdavidcs	 */
163336695Sdavidcs	struct ecore_iwarp_ep_memory    *ep_buffer_virt;
164336695Sdavidcs	dma_addr_t			ep_buffer_phys;
165336695Sdavidcs
166336695Sdavidcs	struct ecore_iwarp_cm_info	cm_info;
167336695Sdavidcs	struct ecore_iwarp_listener	*listener;
168336695Sdavidcs	enum tcp_connect_mode		connect_mode;
169336695Sdavidcs	enum mpa_rtr_type		rtr_type;
170336695Sdavidcs	enum mpa_negotiation_mode	mpa_rev;
171336695Sdavidcs	u32				tcp_cid;
172336695Sdavidcs	u32				cid;
173336695Sdavidcs	u8				remote_mac_addr[6];
174336695Sdavidcs	u8				local_mac_addr[6];
175336695Sdavidcs	u16				mss;
176336695Sdavidcs	bool				mpa_reply_processed;
177336695Sdavidcs
178336695Sdavidcs	/* The event_cb function is called for asynchrounous events associated
179336695Sdavidcs	 * with the ep. It is initialized at different entry points depending
180336695Sdavidcs	 * on whether the ep is the tcp connection active side or passive side
181336695Sdavidcs	 * The cb_context is passed to the event_cb function.
182336695Sdavidcs	 */
183336695Sdavidcs	iwarp_event_handler		event_cb;
184336695Sdavidcs	void				*cb_context;
185336695Sdavidcs
186336695Sdavidcs	/* For Passive side - syn packet related data */
187336695Sdavidcs	struct ecore_iwarp_ll2_buff	*syn;
188336695Sdavidcs	u16				syn_ip_payload_length;
189336695Sdavidcs	dma_addr_t			syn_phy_addr;
190336695Sdavidcs};
191336695Sdavidcs
192336695Sdavidcsstruct ecore_iwarp_listener {
193336695Sdavidcs	osal_list_entry_t	list_entry;
194336695Sdavidcs
195336695Sdavidcs	/* The event_cb function is called for connection requests.
196336695Sdavidcs	 * The cb_context is passed to the event_cb function.
197336695Sdavidcs	 */
198336695Sdavidcs	iwarp_event_handler	event_cb;
199336695Sdavidcs	void			*cb_context;
200336695Sdavidcs	osal_list_t		ep_list;
201336695Sdavidcs	osal_spinlock_t		lock;
202336695Sdavidcs	u32			max_backlog;
203336695Sdavidcs	u8			ip_version;
204336695Sdavidcs	u32			ip_addr[4];
205336695Sdavidcs	u16			port;
206336695Sdavidcs	u16			vlan;
207336695Sdavidcs	bool			drop;
208336695Sdavidcs	bool			done;
209336695Sdavidcs	enum			ecore_iwarp_listener_state state;
210336695Sdavidcs};
211336695Sdavidcs
212336695Sdavidcsenum _ecore_status_t
213336695Sdavidcsecore_iwarp_alloc(struct ecore_hwfn *p_hwfn);
214336695Sdavidcs
215336695Sdavidcsenum _ecore_status_t
216336695Sdavidcsecore_iwarp_setup(struct ecore_hwfn *p_hwfn,
217336695Sdavidcs		  struct ecore_rdma_start_in_params *params);
218336695Sdavidcs
219336695Sdavidcsvoid
220336695Sdavidcsecore_iwarp_init_fw_ramrod(struct ecore_hwfn *p_hwfn,
221336695Sdavidcs			   struct iwarp_init_func_ramrod_data *p_ramrod);
222336695Sdavidcs
223336695Sdavidcsenum _ecore_status_t
224336695Sdavidcsecore_iwarp_stop(struct ecore_hwfn *p_hwfn);
225336695Sdavidcs
226336695Sdavidcsvoid
227336695Sdavidcsecore_iwarp_resc_free(struct ecore_hwfn *p_hwfn);
228336695Sdavidcs
229336695Sdavidcsvoid
230336695Sdavidcsecore_iwarp_init_devinfo(struct ecore_hwfn *p_hwfn);
231336695Sdavidcs
232336695Sdavidcsenum _ecore_status_t
233336695Sdavidcsecore_iwarp_init_hw(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
234336695Sdavidcs
235336695Sdavidcsenum _ecore_status_t
236336695Sdavidcsecore_iwarp_create_qp(struct ecore_hwfn *p_hwfn,
237336695Sdavidcs		      struct ecore_rdma_qp *qp,
238336695Sdavidcs		      struct ecore_rdma_create_qp_out_params *out_params);
239336695Sdavidcs
240336695Sdavidcsenum _ecore_status_t
241336695Sdavidcsecore_iwarp_modify_qp(struct ecore_hwfn *p_hwfn,
242336695Sdavidcs		      struct ecore_rdma_qp *qp,
243336695Sdavidcs		      enum ecore_iwarp_qp_state new_state,
244336695Sdavidcs		      bool internal);
245336695Sdavidcs
246336695Sdavidcsenum _ecore_status_t
247336695Sdavidcsecore_iwarp_destroy_qp(struct ecore_hwfn *p_hwfn,
248336695Sdavidcs		       struct ecore_rdma_qp *qp);
249336695Sdavidcs
250336695Sdavidcsenum _ecore_status_t
251336695Sdavidcsecore_iwarp_fw_destroy(struct ecore_hwfn *p_hwfn,
252336695Sdavidcs		       struct ecore_rdma_qp *qp);
253336695Sdavidcs
254336695Sdavidcsenum _ecore_status_t
255336695Sdavidcsecore_iwarp_query_qp(struct ecore_rdma_qp *qp,
256336695Sdavidcs		     struct ecore_rdma_query_qp_out_params *out_params);
257336695Sdavidcs
258336695Sdavidcs#else
259336695Sdavidcs
260336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
261336695Sdavidcsecore_iwarp_alloc(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
262336695Sdavidcs{
263336695Sdavidcs	return ECORE_SUCCESS;
264336695Sdavidcs}
265336695Sdavidcs
266336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
267336695Sdavidcsecore_iwarp_setup(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
268336695Sdavidcs		  struct ecore_rdma_start_in_params OSAL_UNUSED *params)
269336695Sdavidcs{
270336695Sdavidcs	return ECORE_SUCCESS;
271336695Sdavidcs}
272336695Sdavidcs
273336695Sdavidcsstatic OSAL_INLINE void
274336695Sdavidcsecore_iwarp_init_fw_ramrod(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
275336695Sdavidcs			   struct iwarp_init_func_ramrod_data OSAL_UNUSED *p_ramrod)
276336695Sdavidcs{
277336695Sdavidcs}
278336695Sdavidcs
279336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
280336695Sdavidcsecore_iwarp_stop(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
281336695Sdavidcs{
282336695Sdavidcs	return ECORE_SUCCESS;
283336695Sdavidcs}
284336695Sdavidcs
285336695Sdavidcsstatic OSAL_INLINE void
286336695Sdavidcsecore_iwarp_resc_free(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
287336695Sdavidcs{
288336695Sdavidcs}
289336695Sdavidcs
290336695Sdavidcsstatic OSAL_INLINE void
291336695Sdavidcsecore_iwarp_init_devinfo(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
292336695Sdavidcs{
293336695Sdavidcs}
294336695Sdavidcs
295336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
296336695Sdavidcsecore_iwarp_init_hw(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
297336695Sdavidcs		    struct ecore_ptt OSAL_UNUSED *p_ptt)
298336695Sdavidcs{
299336695Sdavidcs	return ECORE_SUCCESS;
300336695Sdavidcs}
301336695Sdavidcs
302336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
303336695Sdavidcsecore_iwarp_create_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
304336695Sdavidcs		      struct ecore_rdma_qp OSAL_UNUSED *qp,
305336695Sdavidcs		      struct ecore_rdma_create_qp_out_params OSAL_UNUSED *out_params)
306336695Sdavidcs{
307336695Sdavidcs	return ECORE_SUCCESS;
308336695Sdavidcs}
309336695Sdavidcs
310336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
311336695Sdavidcsecore_iwarp_modify_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
312336695Sdavidcs		      struct ecore_rdma_qp OSAL_UNUSED *qp,
313336695Sdavidcs		      enum ecore_iwarp_qp_state OSAL_UNUSED new_state,
314336695Sdavidcs		      bool OSAL_UNUSED internal)
315336695Sdavidcs{
316336695Sdavidcs	return ECORE_SUCCESS;
317336695Sdavidcs}
318336695Sdavidcs
319336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
320336695Sdavidcsecore_iwarp_destroy_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
321336695Sdavidcs		       struct ecore_rdma_qp OSAL_UNUSED *qp)
322336695Sdavidcs{
323336695Sdavidcs	return ECORE_SUCCESS;
324336695Sdavidcs}
325336695Sdavidcs
326336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
327336695Sdavidcsecore_iwarp_fw_destroy(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
328336695Sdavidcs		       struct ecore_rdma_qp OSAL_UNUSED *qp)
329336695Sdavidcs{
330336695Sdavidcs	return ECORE_SUCCESS;
331336695Sdavidcs}
332336695Sdavidcs
333336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t
334336695Sdavidcsecore_iwarp_query_qp(struct ecore_rdma_qp OSAL_UNUSED *qp,
335336695Sdavidcs		     struct ecore_rdma_query_qp_out_params OSAL_UNUSED *out_params)
336336695Sdavidcs{
337336695Sdavidcs	return ECORE_SUCCESS;
338336695Sdavidcs}
339336695Sdavidcs
340336695Sdavidcs#endif
341336695Sdavidcs#endif
342