]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/qlnx/qlnxe/ecore_iwarp.h
Update tcsh to git revision 83c5be0 bringing in a number of bug fixes.
[FreeBSD/FreeBSD.git] / sys / dev / qlnx / qlnxe / ecore_iwarp.h
1 /*
2  * Copyright (c) 2018-2019 Cavium, Inc.
3  * All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions
7  *  are met:
8  *
9  *  1. Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  *  2. Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  *  POSSIBILITY OF SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29
30 #ifndef __ECORE_IWARP_H__
31 #define __ECORE_IWARP_H__
32
33 enum ecore_iwarp_qp_state {
34         ECORE_IWARP_QP_STATE_IDLE,
35         ECORE_IWARP_QP_STATE_RTS,
36         ECORE_IWARP_QP_STATE_TERMINATE,
37         ECORE_IWARP_QP_STATE_CLOSING,
38         ECORE_IWARP_QP_STATE_ERROR,
39 };
40
41 enum ecore_iwarp_listener_state {
42         ECORE_IWARP_LISTENER_STATE_ACTIVE,
43         ECORE_IWARP_LISTENER_STATE_UNPAUSE,
44         ECORE_IWARP_LISTENER_STATE_PAUSE,
45         ECORE_IWARP_LISTENER_STATE_DESTROYING,
46 };
47
48 enum ecore_iwarp_qp_state
49 ecore_roce2iwarp_state(enum ecore_roce_qp_state state);
50
51 #ifdef CONFIG_ECORE_IWARP
52
53 #define ECORE_IWARP_PREALLOC_CNT        ECORE_IWARP_MAX_LIS_BACKLOG
54
55 #define ECORE_IWARP_LL2_SYN_TX_SIZE     (128)
56 #define ECORE_IWARP_LL2_SYN_RX_SIZE     (256)
57 #define ECORE_IWARP_MAX_SYN_PKT_SIZE    (128)
58
59 #define ECORE_IWARP_LL2_OOO_DEF_TX_SIZE (256)
60 #define ECORE_MAX_OOO                   (16)
61 #define ECORE_IWARP_LL2_OOO_MAX_RX_SIZE (16384)
62
63 #define ECORE_IWARP_HANDLE_INVAL        (0xff)
64
65 struct ecore_iwarp_ll2_buff {
66         struct ecore_iwarp_ll2_buff     *piggy_buf;
67         void                            *data;
68         dma_addr_t                      data_phys_addr;
69         u32                             buff_size;
70 };
71
72 struct ecore_iwarp_ll2_mpa_buf {
73         osal_list_entry_t               list_entry;
74         struct ecore_iwarp_ll2_buff     *ll2_buf;
75         struct unaligned_opaque_data    data;
76         u16                             tcp_payload_len;
77         u8                              placement_offset;
78 };
79
80 /* In some cases a fpdu will arrive with only one byte of the header, in this
81  * case the fpdu_length will be partial ( contain only higher byte and
82  * incomplete bytes will contain the invalid value
83  */
84 #define ECORE_IWARP_INVALID_INCOMPLETE_BYTES 0xffff
85
86 struct ecore_iwarp_fpdu {
87         struct ecore_iwarp_ll2_buff     *mpa_buf;
88         dma_addr_t                      pkt_hdr;
89         u8                              pkt_hdr_size;
90         dma_addr_t                      mpa_frag;
91         void                            *mpa_frag_virt;
92         u16                             mpa_frag_len;
93         u16                             fpdu_length;
94         u16                             incomplete_bytes;
95 };
96
97 struct ecore_iwarp_info {
98         osal_list_t                     listen_list; /* ecore_iwarp_listener */
99         osal_list_t                     ep_list;     /* ecore_iwarp_ep */
100         osal_list_t                     ep_free_list;/* pre-allocated ep's */
101         osal_list_t                     mpa_buf_list;/* list of mpa_bufs */
102         osal_list_t                     mpa_buf_pending_list;
103         osal_spinlock_t                 iw_lock;
104         osal_spinlock_t                 qp_lock; /* for teardown races */
105         struct iwarp_rxmit_stats_drv    stats;
106         u32                             rcv_wnd_scale;
107         u16                             rcv_wnd_size;
108         u16                             max_mtu;
109         u16                             num_ooo_rx_bufs;
110         u8                              mac_addr[ETH_ALEN];
111         u8                              crc_needed;
112         u8                              tcp_flags;
113         u8                              ll2_syn_handle;
114         u8                              ll2_ooo_handle;
115         u8                              ll2_mpa_handle;
116         u8                              peer2peer;
117         u8                              _pad;
118         enum mpa_negotiation_mode       mpa_rev;
119         enum mpa_rtr_type               rtr_type;
120         struct ecore_iwarp_fpdu         *partial_fpdus;
121         struct ecore_iwarp_ll2_mpa_buf  *mpa_bufs;
122         u8                              *mpa_intermediate_buf;
123         u16                             max_num_partial_fpdus;
124
125         /* MPA statistics */
126         u64                             unalign_rx_comp;
127 };
128
129 enum ecore_iwarp_ep_state {
130         ECORE_IWARP_EP_INIT,
131         ECORE_IWARP_EP_MPA_REQ_RCVD,
132         ECORE_IWARP_EP_MPA_OFFLOADED,
133         ECORE_IWARP_EP_ESTABLISHED,
134         ECORE_IWARP_EP_CLOSED,
135         ECORE_IWARP_EP_ABORTING
136 };
137
138 union async_output {
139         struct iwarp_eqe_data_mpa_async_completion mpa_response;
140         struct iwarp_eqe_data_tcp_async_completion mpa_request;
141 };
142
143 #define ECORE_MAX_PRIV_DATA_LEN (512)
144 struct ecore_iwarp_ep_memory {
145         u8                      in_pdata[ECORE_MAX_PRIV_DATA_LEN];
146         u8                      out_pdata[ECORE_MAX_PRIV_DATA_LEN];
147         union async_output      async_output;
148 };
149
150 /* Endpoint structure represents a TCP connection. This connection can be
151  * associated with a QP or not (in which case QP==NULL)
152  */
153 struct ecore_iwarp_ep {
154         osal_list_entry_t               list_entry;
155         int                             sig;
156         struct ecore_rdma_qp            *qp;
157         enum ecore_iwarp_ep_state       state;
158
159         /* This contains entire buffer required for ep memories. This is the
160          * only one actually allocated and freed. The rest are pointers into
161          * this buffer
162          */
163         struct ecore_iwarp_ep_memory    *ep_buffer_virt;
164         dma_addr_t                      ep_buffer_phys;
165
166         struct ecore_iwarp_cm_info      cm_info;
167         struct ecore_iwarp_listener     *listener;
168         enum tcp_connect_mode           connect_mode;
169         enum mpa_rtr_type               rtr_type;
170         enum mpa_negotiation_mode       mpa_rev;
171         u32                             tcp_cid;
172         u32                             cid;
173         u8                              remote_mac_addr[6];
174         u8                              local_mac_addr[6];
175         u16                             mss;
176         bool                            mpa_reply_processed;
177
178         /* The event_cb function is called for asynchrounous events associated
179          * with the ep. It is initialized at different entry points depending
180          * on whether the ep is the tcp connection active side or passive side
181          * The cb_context is passed to the event_cb function.
182          */
183         iwarp_event_handler             event_cb;
184         void                            *cb_context;
185
186         /* For Passive side - syn packet related data */
187         struct ecore_iwarp_ll2_buff     *syn;
188         u16                             syn_ip_payload_length;
189         dma_addr_t                      syn_phy_addr;
190 };
191
192 struct ecore_iwarp_listener {
193         osal_list_entry_t       list_entry;
194
195         /* The event_cb function is called for connection requests.
196          * The cb_context is passed to the event_cb function.
197          */
198         iwarp_event_handler     event_cb;
199         void                    *cb_context;
200         osal_list_t             ep_list;
201         osal_spinlock_t         lock;
202         u32                     max_backlog;
203         u8                      ip_version;
204         u32                     ip_addr[4];
205         u16                     port;
206         u16                     vlan;
207         bool                    drop;
208         bool                    done;
209         enum                    ecore_iwarp_listener_state state;
210 };
211
212 enum _ecore_status_t
213 ecore_iwarp_alloc(struct ecore_hwfn *p_hwfn);
214
215 enum _ecore_status_t
216 ecore_iwarp_setup(struct ecore_hwfn *p_hwfn,
217                   struct ecore_rdma_start_in_params *params);
218
219 void
220 ecore_iwarp_init_fw_ramrod(struct ecore_hwfn *p_hwfn,
221                            struct iwarp_init_func_ramrod_data *p_ramrod);
222
223 enum _ecore_status_t
224 ecore_iwarp_stop(struct ecore_hwfn *p_hwfn);
225
226 void
227 ecore_iwarp_resc_free(struct ecore_hwfn *p_hwfn);
228
229 void
230 ecore_iwarp_init_devinfo(struct ecore_hwfn *p_hwfn);
231
232 enum _ecore_status_t
233 ecore_iwarp_init_hw(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
234
235 enum _ecore_status_t
236 ecore_iwarp_create_qp(struct ecore_hwfn *p_hwfn,
237                       struct ecore_rdma_qp *qp,
238                       struct ecore_rdma_create_qp_out_params *out_params);
239
240 enum _ecore_status_t
241 ecore_iwarp_modify_qp(struct ecore_hwfn *p_hwfn,
242                       struct ecore_rdma_qp *qp,
243                       enum ecore_iwarp_qp_state new_state,
244                       bool internal);
245
246 enum _ecore_status_t
247 ecore_iwarp_destroy_qp(struct ecore_hwfn *p_hwfn,
248                        struct ecore_rdma_qp *qp);
249
250 enum _ecore_status_t
251 ecore_iwarp_fw_destroy(struct ecore_hwfn *p_hwfn,
252                        struct ecore_rdma_qp *qp);
253
254 enum _ecore_status_t
255 ecore_iwarp_query_qp(struct ecore_rdma_qp *qp,
256                      struct ecore_rdma_query_qp_out_params *out_params);
257
258 #else
259
260 static OSAL_INLINE enum _ecore_status_t
261 ecore_iwarp_alloc(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
262 {
263         return ECORE_SUCCESS;
264 }
265
266 static OSAL_INLINE enum _ecore_status_t
267 ecore_iwarp_setup(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
268                   struct ecore_rdma_start_in_params OSAL_UNUSED *params)
269 {
270         return ECORE_SUCCESS;
271 }
272
273 static OSAL_INLINE void
274 ecore_iwarp_init_fw_ramrod(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
275                            struct iwarp_init_func_ramrod_data OSAL_UNUSED *p_ramrod)
276 {
277 }
278
279 static OSAL_INLINE enum _ecore_status_t
280 ecore_iwarp_stop(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
281 {
282         return ECORE_SUCCESS;
283 }
284
285 static OSAL_INLINE void
286 ecore_iwarp_resc_free(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
287 {
288 }
289
290 static OSAL_INLINE void
291 ecore_iwarp_init_devinfo(struct ecore_hwfn OSAL_UNUSED *p_hwfn)
292 {
293 }
294
295 static OSAL_INLINE enum _ecore_status_t
296 ecore_iwarp_init_hw(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
297                     struct ecore_ptt OSAL_UNUSED *p_ptt)
298 {
299         return ECORE_SUCCESS;
300 }
301
302 static OSAL_INLINE enum _ecore_status_t
303 ecore_iwarp_create_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
304                       struct ecore_rdma_qp OSAL_UNUSED *qp,
305                       struct ecore_rdma_create_qp_out_params OSAL_UNUSED *out_params)
306 {
307         return ECORE_SUCCESS;
308 }
309
310 static OSAL_INLINE enum _ecore_status_t
311 ecore_iwarp_modify_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
312                       struct ecore_rdma_qp OSAL_UNUSED *qp,
313                       enum ecore_iwarp_qp_state OSAL_UNUSED new_state,
314                       bool OSAL_UNUSED internal)
315 {
316         return ECORE_SUCCESS;
317 }
318
319 static OSAL_INLINE enum _ecore_status_t
320 ecore_iwarp_destroy_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
321                        struct ecore_rdma_qp OSAL_UNUSED *qp)
322 {
323         return ECORE_SUCCESS;
324 }
325
326 static OSAL_INLINE enum _ecore_status_t
327 ecore_iwarp_fw_destroy(struct ecore_hwfn OSAL_UNUSED *p_hwfn,
328                        struct ecore_rdma_qp OSAL_UNUSED *qp)
329 {
330         return ECORE_SUCCESS;
331 }
332
333 static OSAL_INLINE enum _ecore_status_t
334 ecore_iwarp_query_qp(struct ecore_rdma_qp OSAL_UNUSED *qp,
335                      struct ecore_rdma_query_qp_out_params OSAL_UNUSED *out_params)
336 {
337         return ECORE_SUCCESS;
338 }
339
340 #endif
341 #endif