xref: /freebsd/sys/dev/qlnx/qlnxe/ecore_iscsi_api.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1 /*
2  * Copyright (c) 2017-2018 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  */
28 
29 #ifndef __ECORE_ISCSI_API_H__
30 #define __ECORE_ISCSI_API_H__
31 
32 #ifndef __EXTRACT__LINUX__IF__
33 typedef enum _ecore_status_t (*iscsi_event_cb_t)(void *context,
34 						 u8 fw_event_code,
35 						 void *fw_handle);
36 
37 struct ecore_iscsi_stats
38 {
39 	u64 iscsi_rx_bytes_cnt;
40 	u64 iscsi_rx_packet_cnt;
41 	u64 iscsi_rx_new_ooo_isle_events_cnt;
42 	u32 iscsi_cmdq_threshold_cnt;
43 	u32 iscsi_rq_threshold_cnt;
44 	u32 iscsi_immq_threshold_cnt;
45 
46 	u64 iscsi_rx_dropped_pdus_task_not_valid;
47 
48 	u64 iscsi_rx_data_pdu_cnt;
49 	u64 iscsi_rx_r2t_pdu_cnt;
50 	u64 iscsi_rx_total_pdu_cnt;
51 
52 	u64 iscsi_tx_go_to_slow_start_event_cnt;
53 	u64 iscsi_tx_fast_retransmit_event_cnt;
54 
55 	u64 iscsi_tx_data_pdu_cnt;
56 	u64 iscsi_tx_r2t_pdu_cnt;
57 	u64 iscsi_tx_total_pdu_cnt;
58 
59 	u64 iscsi_tx_bytes_cnt;
60 	u64 iscsi_tx_packet_cnt;
61 
62 	u64 iscsi_rx_tcp_payload_bytes_cnt;
63 	u64 iscsi_rx_tcp_pkt_cnt;
64 	u64 iscsi_rx_pure_ack_cnt;
65 
66 	u64 iscsi_rx_dup_ack_cnt;
67 
68 	u64 iscsi_tx_pure_ack_cnt;
69 	u64 iscsi_tx_delayed_ack_cnt;
70 
71 	u64 iscsi_tx_tcp_payload_bytes_cnt;
72 	u64 iscsi_tx_tcp_pkt_cnt;
73 };
74 
75 struct ecore_iscsi_tcp_stats
76 {
77 	u64 iscsi_tcp_tx_packets_cnt;
78 	u64 iscsi_tcp_tx_bytes_cnt;
79 	u64 iscsi_tcp_tx_rxmit_cnt;
80 	u64 iscsi_tcp_rx_packets_cnt;
81 	u64 iscsi_tcp_rx_bytes_cnt;
82 	u64 iscsi_tcp_rx_dup_ack_cnt;
83 	u32 iscsi_tcp_rx_chksum_err_cnt;
84 };
85 #endif
86 
87 #ifndef __EXTRACT__LINUX__C__
88 struct ecore_iscsi_conn {
89 	osal_list_entry_t	list_entry;
90 	bool			free_on_delete;
91 
92 	u16			conn_id;
93 	u32			icid;
94 	u32			fw_cid;
95 
96 	u8			layer_code;
97 	u8			offl_flags;
98 	u8			connect_mode;
99 	u32			initial_ack;
100 	dma_addr_t		sq_pbl_addr;
101 	struct ecore_chain	r2tq;
102 	struct ecore_chain	xhq;
103 	struct ecore_chain	uhq;
104 
105 	struct tcp_upload_params *tcp_upload_params_virt_addr;
106 	dma_addr_t		tcp_upload_params_phys_addr;
107 	struct iscsi_conn_stats_params *conn_stats_params_virt_addr;
108 	dma_addr_t		conn_stats_params_phys_addr;
109 	struct scsi_terminate_extra_params *queue_cnts_virt_addr;
110 	dma_addr_t		queue_cnts_phys_addr;
111 	dma_addr_t		syn_phy_addr;
112 
113 	u16			syn_ip_payload_length;
114 	u8			local_mac[6];
115 	u8			remote_mac[6];
116 	u16			vlan_id;
117 	u16			tcp_flags;
118 	u8			ip_version;
119 	u32			remote_ip[4];
120 	u32			local_ip[4];
121 	u8			ka_max_probe_cnt;
122 	u8			dup_ack_theshold;
123 	u32			rcv_next;
124 	u32			snd_una;
125 	u32			snd_next;
126 	u32			snd_max;
127 	u32			snd_wnd;
128 	u32			rcv_wnd;
129 	u32			snd_wl1;
130 	u32			cwnd;
131 	u32			ss_thresh;
132 	u16			srtt;
133 	u16			rtt_var;
134 	u32			ts_recent;
135 	u32			ts_recent_age;
136 	u32			total_rt;
137 	u32			ka_timeout_delta;
138 	u32			rt_timeout_delta;
139 	u8			dup_ack_cnt;
140 	u8			snd_wnd_probe_cnt;
141 	u8			ka_probe_cnt;
142 	u8			rt_cnt;
143 	u32			flow_label;
144 	u32			ka_timeout;
145 	u32			ka_interval;
146 	u32			max_rt_time;
147 	u32			initial_rcv_wnd;
148 	u8			ttl;
149 	u8			tos_or_tc;
150 	u16			remote_port;
151 	u16			local_port;
152 	u16			mss;
153 	u8			snd_wnd_scale;
154 	u8			rcv_wnd_scale;
155 	u16			da_timeout_value;
156 	u8			ack_frequency;
157 
158 	u8			update_flag;
159 #define	ECORE_ISCSI_CONN_HD_EN		0x01
160 #define	ECORE_ISCSI_CONN_DD_EN		0x02
161 #define	ECORE_ISCSI_CONN_INITIAL_R2T	0x04
162 #define	ECORE_ISCSI_CONN_IMMEDIATE_DATA	0x08
163 
164 	u8			default_cq;
165 	u32			max_seq_size;
166 	u32			max_recv_pdu_length;
167 	u32			max_send_pdu_length;
168 	u32			first_seq_length;
169 	u32			exp_stat_sn;
170 	u32			stat_sn;
171 	u16			physical_q0;
172 	u16			physical_q1;
173 	u8			abortive_dsconnect;
174 	u8			dif_on_immediate;
175 #define ECORE_ISCSI_CONN_DIF_ON_IMM_DIS		0
176 #define ECORE_ISCSI_CONN_DIF_ON_IMM_DEFAULT	1
177 #define ECORE_ISCSI_CONN_DIF_ON_IMM_LUN_MAPPER	2
178 
179 	dma_addr_t		lun_mapper_phys_addr;
180 	u32			initial_ref_tag;
181 	u16			application_tag;
182 	u16			application_tag_mask;
183 	u8			validate_guard;
184 	u8			validate_app_tag;
185 	u8			validate_ref_tag;
186 	u8			forward_guard;
187 	u8			forward_app_tag;
188 	u8			forward_ref_tag;
189 	u8			interval_size;		/* 0=512B, 1=4KB */
190 	u8			network_interface;	/* 0=None, 1=DIF */
191 	u8			host_interface;		/* 0=None, 1=DIF, 2=DIX */
192 	u8			ref_tag_mask;		/* mask for refernce tag handling */
193 	u8			forward_app_tag_with_mask;
194 	u8			forward_ref_tag_with_mask;
195 
196 	u8			ignore_app_tag;
197 	u8			initial_ref_tag_is_valid;
198 	u8			host_guard_type;	/* 0 = IP checksum, 1 = CRC */
199 	u8			protection_type;	/* 1/2/3 - Protection Type */
200 	u8			crc_seed;		/* 0=0x0000, 1=0xffff */
201 	u8			keep_ref_tag_const;
202 };
203 #endif
204 
205 /**
206  * @brief ecore_iscsi_acquire_connection - allocate resources,
207  *        provides connecion handle (CID)as out parameter.
208  *
209  * @param p_path
210  * @param p_conn  partially initialized incoming container of
211  *                iSCSI connection data
212  * @return enum _ecore_status_t
213  */
214 enum _ecore_status_t
215 ecore_iscsi_acquire_connection(struct ecore_hwfn *p_hwfn,
216 			       struct ecore_iscsi_conn *p_in_conn,
217 			       struct ecore_iscsi_conn **p_out_conn);
218 
219 /**
220  * @brief ecore_iscsi_setup_connection- initialize connection data.
221  *
222  * @param p_conn  container of iSCSI connection data
223  * @return enum _ecore_status_t
224  */
225 enum _ecore_status_t
226 ecore_iscsi_setup_connection(struct ecore_iscsi_conn *p_conn);
227 
228 void OSAL_IOMEM *ecore_iscsi_get_db_addr(struct ecore_hwfn *p_hwfn,
229 					 u32 cid);
230 
231 void OSAL_IOMEM *ecore_iscsi_get_global_cmdq_cons(struct ecore_hwfn *p_hwfn,
232 						  u8 relative_q_id);
233 
234 void OSAL_IOMEM *ecore_iscsi_get_primary_bdq_prod(struct ecore_hwfn *p_hwfn,
235 						  u8 bdq_id);
236 
237 void OSAL_IOMEM *ecore_iscsi_get_secondary_bdq_prod(struct ecore_hwfn *p_hwfn,
238 						    u8 bdq_id);
239 
240 /**
241  * @brief ecore_iscsi_offload_connection - offload previously
242  *        allocated iSCSI connection
243  *
244  * @param p_path
245  * @param p_conn  container of iSCSI connection data
246  *
247  * @return enum _ecore_status_t
248  */
249 enum _ecore_status_t
250 ecore_iscsi_offload_connection(struct ecore_hwfn *p_hwfn,
251 			       struct ecore_iscsi_conn *p_conn);
252 
253 /**
254  * @brief ecore_iscsi_release_connection - deletes connecton
255  *        resources (incliding container of iSCSI connection
256  *        data)
257  *
258  * @param p_path
259  * @param p_conn  container of iSCSI connection data
260  */
261 void ecore_iscsi_release_connection(struct ecore_hwfn *p_hwfn,
262 				    struct ecore_iscsi_conn *p_conn);
263 
264 /**
265  * @brief ecore_iscsi_terminate_connection - destroys previously
266  *        offloaded iSCSI connection
267  *
268  * @param p_path
269  * @param p_conn  container of iSCSI connection data
270  *
271  * @return enum _ecore_status_t
272  */
273 enum _ecore_status_t
274 ecore_iscsi_terminate_connection(struct ecore_hwfn *p_hwfn,
275 				 struct ecore_iscsi_conn *p_conn);
276 
277 /**
278  * @brief ecore_iscsi_update_connection - updates previously
279  *        offloaded iSCSI connection
280  *
281  *
282  * @param p_path
283  * @param p_conn  container of iSCSI connection data
284  *
285  * @return enum _ecore_status_t
286  */
287 enum _ecore_status_t
288 ecore_iscsi_update_connection(struct ecore_hwfn *p_hwfn,
289 			      struct ecore_iscsi_conn *p_conn);
290 
291 /**
292  * @brief ecore_iscsi_mac_update_connection - updates remote MAC for previously
293  *        offloaded iSCSI connection
294  *
295  *
296  * @param p_path
297  * @param p_conn  container of iSCSI connection data
298  *
299  * @return enum _ecore_status_t
300  */
301 enum _ecore_status_t
302 ecore_iscsi_update_remote_mac(struct ecore_hwfn *p_hwfn,
303 			      struct ecore_iscsi_conn *p_conn);
304 
305 /**
306  * @brief ecore_iscsi_get_tcp_stats - get and optionally reset TCP statistics
307  *        of offloaded iSCSI connection
308  *
309  *
310  * @param p_path
311  * @param p_conn  container of iSCSI connection data
312  * @param p_stats - buffer to place extracted stats
313  * @param reset - 1 - for reset stats (after extraction of accumulated
314  *                statistics in optionally provided buffer)
315  * @return enum _ecore_status_t
316  */
317 enum _ecore_status_t
318 ecore_iscsi_get_tcp_stats(struct ecore_hwfn *p_hwfn,
319 			  struct ecore_iscsi_conn *p_conn,
320 			  struct ecore_iscsi_tcp_stats *p_stats,
321 			  u8 reset);
322 
323 /**
324  * @brief ecore_iscsi_clear_connection_sq - clear SQ
325  *        offloaded iSCSI connection
326  *
327  *
328  * @param p_path
329  * @param p_conn  container of iSCSI connection data
330  *
331  * @return enum _ecore_status_t
332  */
333 enum _ecore_status_t
334 ecore_iscsi_clear_connection_sq(struct ecore_hwfn *p_hwfn,
335 				struct ecore_iscsi_conn *p_conn);
336 
337 /**
338  * @brief ecore_sp_iscsi_func_start
339  *
340  * This ramrod inits iSCSI functionality in FW
341  *
342  * @param p_path
343  * @param comp_mode
344  * @param comp_addr
345  *
346  * @return enum _ecore_status_t
347  */
348 enum _ecore_status_t
349 ecore_sp_iscsi_func_start(struct ecore_hwfn *p_hwfn,
350 			  enum spq_mode comp_mode,
351 			  struct ecore_spq_comp_cb *p_comp_addr,
352 			  void *async_event_context,
353 			  iscsi_event_cb_t async_event_cb);
354 
355 enum _ecore_status_t
356 ecore_sp_iscsi_func_stop(struct ecore_hwfn *p_hwfn,
357 			 enum spq_mode comp_mode,
358 			 struct ecore_spq_comp_cb *p_comp_addr);
359 
360 enum _ecore_status_t
361 ecore_iscsi_get_stats(struct ecore_hwfn *p_hwfn,
362 		      struct ecore_iscsi_stats *stats);
363 
364 #endif
365