1 | /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
2 | /* QLogic qed NIC Driver |
3 | * Copyright (c) 2015-2017 QLogic Corporation |
4 | * Copyright (c) 2019-2020 Marvell International Ltd. |
5 | */ |
6 | |
7 | #ifndef _QED_IWARP_H |
8 | #define _QED_IWARP_H |
9 | |
10 | enum qed_iwarp_qp_state { |
11 | QED_IWARP_QP_STATE_IDLE, |
12 | QED_IWARP_QP_STATE_RTS, |
13 | QED_IWARP_QP_STATE_TERMINATE, |
14 | QED_IWARP_QP_STATE_CLOSING, |
15 | QED_IWARP_QP_STATE_ERROR, |
16 | }; |
17 | |
18 | enum qed_iwarp_qp_state qed_roce2iwarp_state(enum qed_roce_qp_state state); |
19 | |
20 | #define QED_IWARP_PREALLOC_CNT (256) |
21 | |
22 | #define QED_IWARP_LL2_SYN_TX_SIZE (128) |
23 | #define QED_IWARP_LL2_SYN_RX_SIZE (256) |
24 | |
25 | #define QED_IWARP_LL2_OOO_DEF_TX_SIZE (256) |
26 | #define QED_IWARP_MAX_OOO (16) |
27 | #define QED_IWARP_LL2_OOO_MAX_RX_SIZE (16384) |
28 | |
29 | #define QED_IWARP_HANDLE_INVAL (0xff) |
30 | |
31 | struct qed_iwarp_ll2_buff { |
32 | struct qed_iwarp_ll2_buff *piggy_buf; |
33 | void *data; |
34 | dma_addr_t data_phys_addr; |
35 | u32 buff_size; |
36 | }; |
37 | |
38 | struct qed_iwarp_ll2_mpa_buf { |
39 | struct list_head list_entry; |
40 | struct qed_iwarp_ll2_buff *ll2_buf; |
41 | struct unaligned_opaque_data data; |
42 | u16 tcp_payload_len; |
43 | u8 placement_offset; |
44 | }; |
45 | |
46 | /* In some cases a fpdu will arrive with only one byte of the header, in this |
47 | * case the fpdu_length will be partial (contain only higher byte and |
48 | * incomplete bytes will contain the invalid value |
49 | */ |
50 | #define QED_IWARP_INVALID_INCOMPLETE_BYTES 0xffff |
51 | |
52 | struct qed_iwarp_fpdu { |
53 | struct qed_iwarp_ll2_buff *mpa_buf; |
54 | void *mpa_frag_virt; |
55 | dma_addr_t mpa_frag; |
56 | dma_addr_t pkt_hdr; |
57 | u16 mpa_frag_len; |
58 | u16 fpdu_length; |
59 | u16 incomplete_bytes; |
60 | u8 pkt_hdr_size; |
61 | }; |
62 | |
63 | struct qed_iwarp_info { |
64 | struct list_head listen_list; /* qed_iwarp_listener */ |
65 | struct list_head ep_list; /* qed_iwarp_ep */ |
66 | struct list_head ep_free_list; /* pre-allocated ep's */ |
67 | struct list_head mpa_buf_list; /* list of mpa_bufs */ |
68 | struct list_head mpa_buf_pending_list; |
69 | spinlock_t iw_lock; /* for iwarp resources */ |
70 | spinlock_t qp_lock; /* for teardown races */ |
71 | u32 rcv_wnd_scale; |
72 | u16 rcv_wnd_size; |
73 | u16 max_mtu; |
74 | u8 mac_addr[ETH_ALEN]; |
75 | u8 crc_needed; |
76 | u8 tcp_flags; |
77 | u8 ll2_syn_handle; |
78 | u8 ll2_ooo_handle; |
79 | u8 ll2_mpa_handle; |
80 | u8 peer2peer; |
81 | enum mpa_negotiation_mode mpa_rev; |
82 | enum mpa_rtr_type rtr_type; |
83 | struct qed_iwarp_fpdu *partial_fpdus; |
84 | struct qed_iwarp_ll2_mpa_buf *mpa_bufs; |
85 | u8 *mpa_intermediate_buf; |
86 | u16 max_num_partial_fpdus; |
87 | }; |
88 | |
89 | enum qed_iwarp_ep_state { |
90 | QED_IWARP_EP_INIT, |
91 | QED_IWARP_EP_MPA_REQ_RCVD, |
92 | QED_IWARP_EP_MPA_OFFLOADED, |
93 | QED_IWARP_EP_ESTABLISHED, |
94 | QED_IWARP_EP_CLOSED |
95 | }; |
96 | |
97 | union async_output { |
98 | struct iwarp_eqe_data_mpa_async_completion mpa_response; |
99 | struct iwarp_eqe_data_tcp_async_completion mpa_request; |
100 | }; |
101 | |
102 | #define QED_MAX_PRIV_DATA_LEN (512) |
103 | struct qed_iwarp_ep_memory { |
104 | u8 in_pdata[QED_MAX_PRIV_DATA_LEN]; |
105 | u8 out_pdata[QED_MAX_PRIV_DATA_LEN]; |
106 | union async_output async_output; |
107 | }; |
108 | |
109 | /* Endpoint structure represents a TCP connection. This connection can be |
110 | * associated with a QP or not (in which case QP==NULL) |
111 | */ |
112 | struct qed_iwarp_ep { |
113 | struct list_head list_entry; |
114 | struct qed_rdma_qp *qp; |
115 | struct qed_iwarp_ep_memory *ep_buffer_virt; |
116 | dma_addr_t ep_buffer_phys; |
117 | enum qed_iwarp_ep_state state; |
118 | int sig; |
119 | struct qed_iwarp_cm_info cm_info; |
120 | enum tcp_connect_mode connect_mode; |
121 | enum mpa_rtr_type rtr_type; |
122 | enum mpa_negotiation_mode mpa_rev; |
123 | u32 tcp_cid; |
124 | u32 cid; |
125 | u16 mss; |
126 | u8 remote_mac_addr[6]; |
127 | u8 local_mac_addr[6]; |
128 | bool mpa_reply_processed; |
129 | |
130 | /* For Passive side - syn packet related data */ |
131 | u16 syn_ip_payload_length; |
132 | struct qed_iwarp_ll2_buff *syn; |
133 | dma_addr_t syn_phy_addr; |
134 | |
135 | /* The event_cb function is called for asynchrounous events associated |
136 | * with the ep. It is initialized at different entry points depending |
137 | * on whether the ep is the tcp connection active side or passive side |
138 | * The cb_context is passed to the event_cb function. |
139 | */ |
140 | iwarp_event_handler event_cb; |
141 | void *cb_context; |
142 | }; |
143 | |
144 | struct qed_iwarp_listener { |
145 | struct list_head list_entry; |
146 | |
147 | /* The event_cb function is called for connection requests. |
148 | * The cb_context is passed to the event_cb function. |
149 | */ |
150 | iwarp_event_handler event_cb; |
151 | void *cb_context; |
152 | u32 max_backlog; |
153 | u32 ip_addr[4]; |
154 | u16 port; |
155 | u16 vlan; |
156 | u8 ip_version; |
157 | }; |
158 | |
159 | int qed_iwarp_alloc(struct qed_hwfn *p_hwfn); |
160 | |
161 | int qed_iwarp_setup(struct qed_hwfn *p_hwfn, |
162 | struct qed_rdma_start_in_params *params); |
163 | |
164 | void qed_iwarp_init_fw_ramrod(struct qed_hwfn *p_hwfn, |
165 | struct iwarp_init_func_ramrod_data *p_ramrod); |
166 | |
167 | int qed_iwarp_stop(struct qed_hwfn *p_hwfn); |
168 | |
169 | void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn); |
170 | |
171 | void qed_iwarp_init_devinfo(struct qed_hwfn *p_hwfn); |
172 | |
173 | void qed_iwarp_init_hw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
174 | |
175 | int qed_iwarp_create_qp(struct qed_hwfn *p_hwfn, |
176 | struct qed_rdma_qp *qp, |
177 | struct qed_rdma_create_qp_out_params *out_params); |
178 | |
179 | int qed_iwarp_modify_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp, |
180 | enum qed_iwarp_qp_state new_state, bool internal); |
181 | |
182 | int qed_iwarp_destroy_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp); |
183 | |
184 | int qed_iwarp_fw_destroy(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp); |
185 | |
186 | void qed_iwarp_query_qp(struct qed_rdma_qp *qp, |
187 | struct qed_rdma_query_qp_out_params *out_params); |
188 | |
189 | int |
190 | qed_iwarp_connect(void *rdma_cxt, |
191 | struct qed_iwarp_connect_in *iparams, |
192 | struct qed_iwarp_connect_out *oparams); |
193 | |
194 | int |
195 | qed_iwarp_create_listen(void *rdma_cxt, |
196 | struct qed_iwarp_listen_in *iparams, |
197 | struct qed_iwarp_listen_out *oparams); |
198 | |
199 | int qed_iwarp_accept(void *rdma_cxt, struct qed_iwarp_accept_in *iparams); |
200 | |
201 | int qed_iwarp_reject(void *rdma_cxt, struct qed_iwarp_reject_in *iparams); |
202 | int qed_iwarp_destroy_listen(void *rdma_cxt, void *handle); |
203 | |
204 | int qed_iwarp_send_rtr(void *rdma_cxt, struct qed_iwarp_send_rtr_in *iparams); |
205 | |
206 | #endif |
207 | |