1 /* QLogic qed NIC Driver
2 * Copyright (c) 2015-2017 QLogic Corporation
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and /or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 enum qed_iwarp_qp_state
{
36 QED_IWARP_QP_STATE_IDLE
,
37 QED_IWARP_QP_STATE_RTS
,
38 QED_IWARP_QP_STATE_TERMINATE
,
39 QED_IWARP_QP_STATE_CLOSING
,
40 QED_IWARP_QP_STATE_ERROR
,
43 enum qed_iwarp_qp_state
qed_roce2iwarp_state(enum qed_roce_qp_state state
);
45 #define QED_IWARP_PREALLOC_CNT (256)
47 #define QED_IWARP_LL2_SYN_TX_SIZE (128)
48 #define QED_IWARP_LL2_SYN_RX_SIZE (256)
49 #define QED_IWARP_MAX_SYN_PKT_SIZE (128)
51 #define QED_IWARP_LL2_OOO_DEF_TX_SIZE (256)
52 #define QED_IWARP_MAX_OOO (16)
53 #define QED_IWARP_LL2_OOO_MAX_RX_SIZE (16384)
55 #define QED_IWARP_HANDLE_INVAL (0xff)
57 struct qed_iwarp_ll2_buff
{
58 struct qed_iwarp_ll2_buff
*piggy_buf
;
60 dma_addr_t data_phys_addr
;
64 struct qed_iwarp_ll2_mpa_buf
{
65 struct list_head list_entry
;
66 struct qed_iwarp_ll2_buff
*ll2_buf
;
67 struct unaligned_opaque_data data
;
72 /* In some cases a fpdu will arrive with only one byte of the header, in this
73 * case the fpdu_length will be partial (contain only higher byte and
74 * incomplete bytes will contain the invalid value
76 #define QED_IWARP_INVALID_INCOMPLETE_BYTES 0xffff
78 struct qed_iwarp_fpdu
{
79 struct qed_iwarp_ll2_buff
*mpa_buf
;
89 struct qed_iwarp_info
{
90 struct list_head listen_list
; /* qed_iwarp_listener */
91 struct list_head ep_list
; /* qed_iwarp_ep */
92 struct list_head ep_free_list
; /* pre-allocated ep's */
93 struct list_head mpa_buf_list
; /* list of mpa_bufs */
94 struct list_head mpa_buf_pending_list
;
95 spinlock_t iw_lock
; /* for iwarp resources */
96 spinlock_t qp_lock
; /* for teardown races */
100 u8 mac_addr
[ETH_ALEN
];
107 enum mpa_negotiation_mode mpa_rev
;
108 enum mpa_rtr_type rtr_type
;
109 struct qed_iwarp_fpdu
*partial_fpdus
;
110 struct qed_iwarp_ll2_mpa_buf
*mpa_bufs
;
111 u8
*mpa_intermediate_buf
;
112 u16 max_num_partial_fpdus
;
115 enum qed_iwarp_ep_state
{
117 QED_IWARP_EP_MPA_REQ_RCVD
,
118 QED_IWARP_EP_MPA_OFFLOADED
,
119 QED_IWARP_EP_ESTABLISHED
,
124 struct iwarp_eqe_data_mpa_async_completion mpa_response
;
125 struct iwarp_eqe_data_tcp_async_completion mpa_request
;
128 #define QED_MAX_PRIV_DATA_LEN (512)
129 struct qed_iwarp_ep_memory
{
130 u8 in_pdata
[QED_MAX_PRIV_DATA_LEN
];
131 u8 out_pdata
[QED_MAX_PRIV_DATA_LEN
];
132 union async_output async_output
;
135 /* Endpoint structure represents a TCP connection. This connection can be
136 * associated with a QP or not (in which case QP==NULL)
138 struct qed_iwarp_ep
{
139 struct list_head list_entry
;
140 struct qed_rdma_qp
*qp
;
141 struct qed_iwarp_ep_memory
*ep_buffer_virt
;
142 dma_addr_t ep_buffer_phys
;
143 enum qed_iwarp_ep_state state
;
145 struct qed_iwarp_cm_info cm_info
;
146 enum tcp_connect_mode connect_mode
;
147 enum mpa_rtr_type rtr_type
;
148 enum mpa_negotiation_mode mpa_rev
;
152 u8 remote_mac_addr
[6];
153 u8 local_mac_addr
[6];
154 bool mpa_reply_processed
;
156 /* For Passive side - syn packet related data */
157 u16 syn_ip_payload_length
;
158 struct qed_iwarp_ll2_buff
*syn
;
159 dma_addr_t syn_phy_addr
;
161 /* The event_cb function is called for asynchrounous events associated
162 * with the ep. It is initialized at different entry points depending
163 * on whether the ep is the tcp connection active side or passive side
164 * The cb_context is passed to the event_cb function.
166 iwarp_event_handler event_cb
;
170 struct qed_iwarp_listener
{
171 struct list_head list_entry
;
173 /* The event_cb function is called for connection requests.
174 * The cb_context is passed to the event_cb function.
176 iwarp_event_handler event_cb
;
185 int qed_iwarp_alloc(struct qed_hwfn
*p_hwfn
);
187 int qed_iwarp_setup(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
,
188 struct qed_rdma_start_in_params
*params
);
190 void qed_iwarp_init_fw_ramrod(struct qed_hwfn
*p_hwfn
,
191 struct iwarp_init_func_ramrod_data
*p_ramrod
);
193 int qed_iwarp_stop(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
);
195 void qed_iwarp_resc_free(struct qed_hwfn
*p_hwfn
);
197 void qed_iwarp_init_devinfo(struct qed_hwfn
*p_hwfn
);
199 void qed_iwarp_init_hw(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
);
201 int qed_iwarp_create_qp(struct qed_hwfn
*p_hwfn
,
202 struct qed_rdma_qp
*qp
,
203 struct qed_rdma_create_qp_out_params
*out_params
);
205 int qed_iwarp_modify_qp(struct qed_hwfn
*p_hwfn
, struct qed_rdma_qp
*qp
,
206 enum qed_iwarp_qp_state new_state
, bool internal
);
208 int qed_iwarp_destroy_qp(struct qed_hwfn
*p_hwfn
, struct qed_rdma_qp
*qp
);
210 int qed_iwarp_fw_destroy(struct qed_hwfn
*p_hwfn
, struct qed_rdma_qp
*qp
);
212 void qed_iwarp_query_qp(struct qed_rdma_qp
*qp
,
213 struct qed_rdma_query_qp_out_params
*out_params
);
216 qed_iwarp_connect(void *rdma_cxt
,
217 struct qed_iwarp_connect_in
*iparams
,
218 struct qed_iwarp_connect_out
*oparams
);
221 qed_iwarp_create_listen(void *rdma_cxt
,
222 struct qed_iwarp_listen_in
*iparams
,
223 struct qed_iwarp_listen_out
*oparams
);
225 int qed_iwarp_accept(void *rdma_cxt
, struct qed_iwarp_accept_in
*iparams
);
227 int qed_iwarp_reject(void *rdma_cxt
, struct qed_iwarp_reject_in
*iparams
);
228 int qed_iwarp_destroy_listen(void *rdma_cxt
, void *handle
);
230 int qed_iwarp_send_rtr(void *rdma_cxt
, struct qed_iwarp_send_rtr_in
*iparams
);