1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright 2017 Broadcom. All Rights Reserved.
4  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
5  *
6  * Contact Information:
7  * linux-drivers@broadcom.com
8  */
9 
10 #ifndef BEISCSI_CMDS_H
11 #define BEISCSI_CMDS_H
12 
13 /**
14  * The driver sends configuration and managements command requests to the
15  * firmware in the BE. These requests are communicated to the processor
16  * using Work Request Blocks (WRBs) submitted to the MCC-WRB ring or via one
17  * WRB inside a MAILBOX.
18  * The commands are serviced by the ARM processor in the OneConnect's MPU.
19  */
20 struct be_sge {
21 	__le32 pa_lo;
22 	__le32 pa_hi;
23 	__le32 len;
24 };
25 
26 struct be_mcc_wrb {
27 	u32 emb_sgecnt_special;	/* dword 0 */
28 	/* bits 0 - embedded    */
29 	/* bits 1 - 2 reserved	*/
30 	/* bits 3 - 7 sge count	*/
31 	/* bits 8 - 23 reserved	*/
32 	/* bits 24 - 31 special	*/
33 #define MCC_WRB_EMBEDDED_MASK 1
34 #define MCC_WRB_SGE_CNT_SHIFT 3
35 #define MCC_WRB_SGE_CNT_MASK 0x1F
36 	u32 payload_length;	/* dword 1 */
37 	u32 tag0;		/* dword 2 */
38 	u32 tag1;		/* dword 3 */
39 	u32 rsvd;		/* dword 4 */
40 	union {
41 #define EMBED_MBX_MAX_PAYLOAD_SIZE  220
42 		u8 embedded_payload[236];	/* used by embedded cmds */
43 		struct be_sge sgl[19];	/* used by non-embedded cmds */
44 	} payload;
45 };
46 
47 #define CQE_FLAGS_VALID_MASK (1 << 31)
48 #define CQE_FLAGS_ASYNC_MASK (1 << 30)
49 #define CQE_FLAGS_COMPLETED_MASK	(1 << 28)
50 #define CQE_FLAGS_CONSUMED_MASK		(1 << 27)
51 
52 /* Completion Status */
53 #define MCC_STATUS_SUCCESS 0x0
54 #define MCC_STATUS_FAILED 0x1
55 #define MCC_STATUS_ILLEGAL_REQUEST 0x2
56 #define MCC_STATUS_ILLEGAL_FIELD 0x3
57 #define MCC_STATUS_INSUFFICIENT_BUFFER 0x4
58 #define MCC_STATUS_INVALID_LENGTH 0x74
59 
60 #define CQE_STATUS_COMPL_MASK	0xFFFF
61 #define CQE_STATUS_COMPL_SHIFT	0		/* bits 0 - 15 */
62 #define CQE_STATUS_EXTD_MASK	0xFFFF
63 #define CQE_STATUS_EXTD_SHIFT	16		/* bits 31 - 16 */
64 #define CQE_STATUS_ADDL_MASK	0xFF00
65 #define CQE_STATUS_ADDL_SHIFT	8
66 #define CQE_STATUS_MASK		0xFF
67 #define CQE_STATUS_WRB_MASK	0xFF0000
68 #define CQE_STATUS_WRB_SHIFT	16
69 
70 #define BEISCSI_HOST_MBX_TIMEOUT (110 * 1000)
71 #define BEISCSI_FW_MBX_TIMEOUT	100
72 
73 /* MBOX Command VER */
74 #define MBX_CMD_VER1	0x01
75 #define MBX_CMD_VER2	0x02
76 
77 struct be_mcc_compl {
78 	u32 status;		/* dword 0 */
79 	u32 tag0;		/* dword 1 */
80 	u32 tag1;		/* dword 2 */
81 	u32 flags;		/* dword 3 */
82 };
83 
84 /********* Mailbox door bell *************/
85 /**
86  * Used for driver communication with the FW.
87  * The software must write this register twice to post any command. First,
88  * it writes the register with hi=1 and the upper bits of the physical address
89  * for the MAILBOX structure. Software must poll the ready bit until this
90  * is acknowledged. Then, sotware writes the register with hi=0 with the lower
91  * bits in the address. It must poll the ready bit until the command is
92  * complete. Upon completion, the MAILBOX will contain a valid completion
93  * queue entry.
94  */
95 #define MPU_MAILBOX_DB_OFFSET	0x160
96 #define MPU_MAILBOX_DB_RDY_MASK	0x1	/* bit 0 */
97 #define MPU_MAILBOX_DB_HI_MASK	0x2	/* bit 1 */
98 
99 /********** MPU semphore: used for SH & BE ******************/
100 #define SLIPORT_SOFTRESET_OFFSET		0x5c	/* CSR BAR offset */
101 #define SLIPORT_SEMAPHORE_OFFSET_BEx		0xac	/* CSR BAR offset */
102 #define SLIPORT_SEMAPHORE_OFFSET_SH		0x94	/* PCI-CFG offset */
103 #define POST_STAGE_MASK				0x0000FFFF
104 #define POST_ERROR_BIT				0x80000000
105 #define POST_ERR_RECOVERY_CODE_MASK		0xF000
106 
107 /* Soft Reset register masks */
108 #define SLIPORT_SOFTRESET_SR_MASK		0x00000080	/* SR bit */
109 
110 /* MPU semphore POST stage values */
111 #define POST_STAGE_AWAITING_HOST_RDY	0x1 /* FW awaiting goahead from host */
112 #define POST_STAGE_HOST_RDY		0x2 /* Host has given go-ahed to FW */
113 #define POST_STAGE_BE_RESET		0x3 /* Host wants to reset chip */
114 #define POST_STAGE_ARMFW_RDY		0xC000 /* FW is done with POST */
115 #define POST_STAGE_RECOVERABLE_ERR	0xE000 /* Recoverable err detected */
116 
117 /********** MCC door bell ************/
118 #define DB_MCCQ_OFFSET 0x140
119 #define DB_MCCQ_RING_ID_MASK 0xFFFF		/* bits 0 - 15 */
120 /* Number of entries posted */
121 #define DB_MCCQ_NUM_POSTED_SHIFT 16		/* bits 16 - 29 */
122 
123 /**
124  * When the async bit of mcc_compl is set, the last 4 bytes of
125  * mcc_compl is interpreted as follows:
126  */
127 #define ASYNC_TRAILER_EVENT_CODE_SHIFT	8	/* bits 8 - 15 */
128 #define ASYNC_TRAILER_EVENT_CODE_MASK	0xFF
129 #define ASYNC_EVENT_CODE_LINK_STATE	0x1
130 #define ASYNC_EVENT_CODE_ISCSI		0x4
131 #define ASYNC_EVENT_CODE_SLI		0x11
132 
133 #define ASYNC_TRAILER_EVENT_TYPE_SHIFT	16	/* bits 16 - 23 */
134 #define ASYNC_TRAILER_EVENT_TYPE_MASK	0xFF
135 
136 /* iSCSI events */
137 #define ASYNC_EVENT_NEW_ISCSI_TGT_DISC	0x4
138 #define ASYNC_EVENT_NEW_ISCSI_CONN	0x5
139 #define ASYNC_EVENT_NEW_TCP_CONN	0x7
140 
141 /* SLI events */
142 #define ASYNC_SLI_EVENT_TYPE_MISCONFIGURED	0x9
143 #define ASYNC_SLI_LINK_EFFECT_VALID(le)		(le & 0x80)
144 #define ASYNC_SLI_LINK_EFFECT_SEV(le)		((le >> 1)  & 0x03)
145 #define ASYNC_SLI_LINK_EFFECT_STATE(le)		(le & 0x01)
146 
147 struct be_async_event_trailer {
148 	u32 code;
149 };
150 
151 enum {
152 	ASYNC_EVENT_LINK_DOWN = 0x0,
153 	ASYNC_EVENT_LINK_UP = 0x1,
154 };
155 
156 /**
157  * When the event code of an async trailer is link-state, the mcc_compl
158  * must be interpreted as follows
159  */
160 struct be_async_event_link_state {
161 	u8 physical_port;
162 	u8 port_link_status;
163 /**
164  * ASYNC_EVENT_LINK_DOWN		0x0
165  * ASYNC_EVENT_LINK_UP			0x1
166  * ASYNC_EVENT_LINK_LOGICAL_DOWN	0x2
167  * ASYNC_EVENT_LINK_LOGICAL_UP		0x3
168  */
169 #define BE_ASYNC_LINK_UP_MASK		0x01
170 	u8 port_duplex;
171 	u8 port_speed;
172 /* BE2ISCSI_LINK_SPEED_ZERO	0x00 - no link */
173 #define BE2ISCSI_LINK_SPEED_10MBPS	0x01
174 #define BE2ISCSI_LINK_SPEED_100MBPS	0x02
175 #define BE2ISCSI_LINK_SPEED_1GBPS	0x03
176 #define BE2ISCSI_LINK_SPEED_10GBPS	0x04
177 #define BE2ISCSI_LINK_SPEED_25GBPS	0x06
178 #define BE2ISCSI_LINK_SPEED_40GBPS	0x07
179 	u8 port_fault;
180 	u8 event_reason;
181 	u16 qos_link_speed;
182 	u32 event_tag;
183 	struct be_async_event_trailer trailer;
184 } __packed;
185 
186 /**
187  * When async-trailer is SLI event, mcc_compl is interpreted as
188  */
189 struct be_async_event_sli {
190 	u32 event_data1;
191 	u32 event_data2;
192 	u32 reserved;
193 	u32 trailer;
194 } __packed;
195 
196 struct be_mcc_mailbox {
197 	struct be_mcc_wrb wrb;
198 	struct be_mcc_compl compl;
199 };
200 
201 /* Type of subsystems supported by FW */
202 #define CMD_SUBSYSTEM_COMMON    0x1
203 #define CMD_SUBSYSTEM_ISCSI     0x2
204 #define CMD_SUBSYSTEM_ETH       0x3
205 #define CMD_SUBSYSTEM_ISCSI_INI 0x6
206 #define CMD_COMMON_TCP_UPLOAD   0x1
207 
208 /**
209  * List of common opcodes subsystem  CMD_SUBSYSTEM_COMMON
210  * These opcodes are unique for each subsystem defined above
211  */
212 #define OPCODE_COMMON_CQ_CREATE				12
213 #define OPCODE_COMMON_EQ_CREATE				13
214 #define OPCODE_COMMON_MCC_CREATE			21
215 #define OPCODE_COMMON_MCC_CREATE_EXT			90
216 #define OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS	24
217 #define OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS	25
218 #define OPCODE_COMMON_GET_CNTL_ATTRIBUTES		32
219 #define OPCODE_COMMON_GET_FW_VERSION			35
220 #define OPCODE_COMMON_MODIFY_EQ_DELAY			41
221 #define OPCODE_COMMON_FIRMWARE_CONFIG			42
222 #define OPCODE_COMMON_MCC_DESTROY			53
223 #define OPCODE_COMMON_CQ_DESTROY			54
224 #define OPCODE_COMMON_EQ_DESTROY			55
225 #define OPCODE_COMMON_QUERY_FIRMWARE_CONFIG		58
226 #define OPCODE_COMMON_FUNCTION_RESET			61
227 #define OPCODE_COMMON_GET_PORT_NAME			77
228 #define OPCODE_COMMON_SET_HOST_DATA			93
229 #define OPCODE_COMMON_SET_FEATURES			191
230 
231 /**
232  * LIST of opcodes that are common between Initiator and Target
233  * used by CMD_SUBSYSTEM_ISCSI
234  * These opcodes are unique for each subsystem defined above
235  */
236 #define OPCODE_COMMON_ISCSI_CFG_POST_SGL_PAGES		2
237 #define OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES        3
238 #define OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG		7
239 #define OPCODE_COMMON_ISCSI_NTWK_SET_VLAN		14
240 #define OPCODE_COMMON_ISCSI_NTWK_CONFIG_STATELESS_IP_ADDR	17
241 #define OPCODE_COMMON_ISCSI_NTWK_REL_STATELESS_IP_ADDR	18
242 #define OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR		21
243 #define OPCODE_COMMON_ISCSI_NTWK_GET_DEFAULT_GATEWAY	22
244 #define OPCODE_COMMON_ISCSI_NTWK_MODIFY_DEFAULT_GATEWAY 23
245 #define OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID		24
246 #define OPCODE_COMMON_ISCSI_NTWK_GET_IF_INFO		25
247 #define OPCODE_COMMON_ISCSI_SET_FRAGNUM_BITS_FOR_SGL_CRA 61
248 #define OPCODE_COMMON_ISCSI_DEFQ_CREATE                 64
249 #define OPCODE_COMMON_ISCSI_DEFQ_DESTROY		65
250 #define OPCODE_COMMON_ISCSI_WRBQ_CREATE			66
251 #define OPCODE_COMMON_ISCSI_WRBQ_DESTROY		67
252 
253 struct be_cmd_req_hdr {
254 	u8 opcode;		/* dword 0 */
255 	u8 subsystem;		/* dword 0 */
256 	u8 port_number;		/* dword 0 */
257 	u8 domain;		/* dword 0 */
258 	u32 timeout;		/* dword 1 */
259 	u32 request_length;	/* dword 2 */
260 	u8 version;		/* dword 3 */
261 	u8 rsvd0[3];		/* dword 3 */
262 };
263 
264 struct be_cmd_resp_hdr {
265 	u32 info;		/* dword 0 */
266 	u32 status;		/* dword 1 */
267 	u32 response_length;	/* dword 2 */
268 	u32 actual_resp_len;	/* dword 3 */
269 };
270 
271 struct phys_addr {
272 	u32 lo;
273 	u32 hi;
274 };
275 
276 struct virt_addr {
277 	u32 lo;
278 	u32 hi;
279 };
280 /**************************
281  * BE Command definitions *
282  **************************/
283 
284 /**
285  * Pseudo amap definition in which each bit of the actual structure is defined
286  * as a byte - used to calculate offset/shift/mask of each field
287  */
288 struct amap_eq_context {
289 	u8 cidx[13];		/* dword 0 */
290 	u8 rsvd0[3];		/* dword 0 */
291 	u8 epidx[13];		/* dword 0 */
292 	u8 valid;		/* dword 0 */
293 	u8 rsvd1;		/* dword 0 */
294 	u8 size;		/* dword 0 */
295 	u8 pidx[13];		/* dword 1 */
296 	u8 rsvd2[3];		/* dword 1 */
297 	u8 pd[10];		/* dword 1 */
298 	u8 count[3];		/* dword 1 */
299 	u8 solevent;		/* dword 1 */
300 	u8 stalled;		/* dword 1 */
301 	u8 armed;		/* dword 1 */
302 	u8 rsvd3[4];		/* dword 2 */
303 	u8 func[8];		/* dword 2 */
304 	u8 rsvd4;		/* dword 2 */
305 	u8 delaymult[10];	/* dword 2 */
306 	u8 rsvd5[2];		/* dword 2 */
307 	u8 phase[2];		/* dword 2 */
308 	u8 nodelay;		/* dword 2 */
309 	u8 rsvd6[4];		/* dword 2 */
310 	u8 rsvd7[32];		/* dword 3 */
311 } __packed;
312 
313 struct be_cmd_req_eq_create {
314 	struct be_cmd_req_hdr hdr;	/* dw[4] */
315 	u16 num_pages;		/* sword */
316 	u16 rsvd0;		/* sword */
317 	u8 context[sizeof(struct amap_eq_context) / 8];	/* dw[4] */
318 	struct phys_addr pages[8];
319 } __packed;
320 
321 struct be_cmd_resp_eq_create {
322 	struct be_cmd_resp_hdr resp_hdr;
323 	u16 eq_id;		/* sword */
324 	u16 rsvd0;		/* sword */
325 } __packed;
326 
327 struct be_set_eqd {
328 	u32 eq_id;
329 	u32 phase;
330 	u32 delay_multiplier;
331 } __packed;
332 
333 struct mgmt_chap_format {
334 	u32 flags;
335 	u8  intr_chap_name[256];
336 	u8  intr_secret[16];
337 	u8  target_chap_name[256];
338 	u8  target_secret[16];
339 	u16 intr_chap_name_length;
340 	u16 intr_secret_length;
341 	u16 target_chap_name_length;
342 	u16 target_secret_length;
343 } __packed;
344 
345 struct mgmt_auth_method_format {
346 	u8	auth_method_type;
347 	u8	padding[3];
348 	struct	mgmt_chap_format chap;
349 } __packed;
350 
351 struct be_cmd_req_logout_fw_sess {
352 	struct be_cmd_req_hdr hdr;	/* dw[4] */
353 	uint32_t session_handle;
354 } __packed;
355 
356 struct be_cmd_resp_logout_fw_sess {
357 	struct be_cmd_resp_hdr hdr;	/* dw[4] */
358 	uint32_t session_status;
359 #define BE_SESS_STATUS_CLOSE		0x20
360 } __packed;
361 
362 struct mgmt_conn_login_options {
363 	u8 flags;
364 	u8 header_digest;
365 	u8 data_digest;
366 	u8 rsvd0;
367 	u32 max_recv_datasegment_len_ini;
368 	u32 max_recv_datasegment_len_tgt;
369 	u32 tcp_mss;
370 	u32 tcp_window_size;
371 	struct	mgmt_auth_method_format auth_data;
372 } __packed;
373 
374 struct ip_addr_format {
375 	u16 size_of_structure;
376 	u8 reserved;
377 	u8 ip_type;
378 #define BEISCSI_IP_TYPE_V4		0x1
379 #define BEISCSI_IP_TYPE_STATIC_V4	0x3
380 #define BEISCSI_IP_TYPE_DHCP_V4		0x5
381 /* type v4 values < type v6 values */
382 #define BEISCSI_IP_TYPE_V6		0x10
383 #define BEISCSI_IP_TYPE_ROUTABLE_V6	0x30
384 #define BEISCSI_IP_TYPE_LINK_LOCAL_V6	0x50
385 #define BEISCSI_IP_TYPE_AUTO_V6		0x90
386 	u8 addr[16];
387 	u32 rsvd0;
388 } __packed;
389 
390 struct mgmt_conn_info {
391 	u32	connection_handle;
392 	u32	connection_status;
393 	u16	src_port;
394 	u16	dest_port;
395 	u16	dest_port_redirected;
396 	u16	cid;
397 	u32	estimated_throughput;
398 	struct	ip_addr_format	src_ipaddr;
399 	struct	ip_addr_format	dest_ipaddr;
400 	struct	ip_addr_format	dest_ipaddr_redirected;
401 	struct	mgmt_conn_login_options	negotiated_login_options;
402 } __packed;
403 
404 struct mgmt_session_login_options {
405 	u8	flags;
406 	u8	error_recovery_level;
407 	u16	rsvd0;
408 	u32	first_burst_length;
409 	u32	max_burst_length;
410 	u16	max_connections;
411 	u16	max_outstanding_r2t;
412 	u16	default_time2wait;
413 	u16	default_time2retain;
414 } __packed;
415 
416 struct mgmt_session_info {
417 	u32	session_handle;
418 	u32	status;
419 	u8	isid[6];
420 	u16	tsih;
421 	u32	session_flags;
422 	u16	conn_count;
423 	u16	pad;
424 	u8	target_name[224];
425 	u8	initiator_iscsiname[224];
426 	struct	mgmt_session_login_options negotiated_login_options;
427 	struct	mgmt_conn_info	conn_list[1];
428 } __packed;
429 
430 struct be_cmd_get_session_req {
431 	struct be_cmd_req_hdr hdr;
432 	u32 session_handle;
433 } __packed;
434 
435 struct be_cmd_get_session_resp {
436 	struct be_cmd_resp_hdr hdr;
437 	struct mgmt_session_info session_info;
438 } __packed;
439 
440 struct mac_addr {
441 	u16 size_of_structure;
442 	u8 addr[ETH_ALEN];
443 } __packed;
444 
445 struct be_cmd_get_boot_target_req {
446 	struct be_cmd_req_hdr hdr;
447 } __packed;
448 
449 struct be_cmd_get_boot_target_resp {
450 	struct be_cmd_resp_hdr hdr;
451 	u32 boot_session_count;
452 	u32 boot_session_handle;
453 /**
454  * FW returns 0xffffffff if it couldn't establish connection with
455  * configured boot target.
456  */
457 #define BE_BOOT_INVALID_SHANDLE	0xffffffff
458 };
459 
460 struct be_cmd_reopen_session_req {
461 	struct be_cmd_req_hdr hdr;
462 #define BE_REOPEN_ALL_SESSIONS  0x00
463 #define BE_REOPEN_BOOT_SESSIONS 0x01
464 #define BE_REOPEN_A_SESSION     0x02
465 	u16 reopen_type;
466 	u16 rsvd;
467 	u32 session_handle;
468 } __packed;
469 
470 struct be_cmd_reopen_session_resp {
471 	struct be_cmd_resp_hdr hdr;
472 	u32 rsvd;
473 	u32 session_handle;
474 } __packed;
475 
476 
477 struct be_cmd_mac_query_req {
478 	struct be_cmd_req_hdr hdr;
479 	u8 type;
480 	u8 permanent;
481 	u16 if_id;
482 } __packed;
483 
484 struct be_cmd_get_mac_resp {
485 	struct be_cmd_resp_hdr hdr;
486 	struct mac_addr mac;
487 };
488 
489 struct be_ip_addr_subnet_format {
490 	u16 size_of_structure;
491 	u8 ip_type;
492 	u8 ipv6_prefix_length;
493 	u8 addr[16];
494 	u8 subnet_mask[16];
495 	u32 rsvd0;
496 } __packed;
497 
498 struct be_cmd_get_if_info_req {
499 	struct be_cmd_req_hdr hdr;
500 	u32 interface_hndl;
501 	u32 ip_type;
502 } __packed;
503 
504 struct be_cmd_get_if_info_resp {
505 	struct be_cmd_req_hdr hdr;
506 	u32 interface_hndl;
507 	u32 vlan_priority;
508 	u32 ip_addr_count;
509 	u32 dhcp_state;
510 	struct be_ip_addr_subnet_format ip_addr;
511 } __packed;
512 
513 struct be_ip_addr_record {
514 	u32 action;
515 	u32 interface_hndl;
516 	struct be_ip_addr_subnet_format ip_addr;
517 	u32 status;
518 } __packed;
519 
520 struct be_ip_addr_record_params {
521 	u32 record_entry_count;
522 	struct be_ip_addr_record ip_record;
523 } __packed;
524 
525 struct be_cmd_set_ip_addr_req {
526 	struct be_cmd_req_hdr hdr;
527 	struct be_ip_addr_record_params ip_params;
528 } __packed;
529 
530 
531 struct be_cmd_set_dhcp_req {
532 	struct be_cmd_req_hdr hdr;
533 	u32 interface_hndl;
534 	u32 ip_type;
535 	u32 flags;
536 	u32 retry_count;
537 } __packed;
538 
539 struct be_cmd_rel_dhcp_req {
540 	struct be_cmd_req_hdr hdr;
541 	u32 interface_hndl;
542 	u32 ip_type;
543 } __packed;
544 
545 struct be_cmd_set_def_gateway_req {
546 	struct be_cmd_req_hdr hdr;
547 	u32 action;
548 	struct ip_addr_format ip_addr;
549 } __packed;
550 
551 struct be_cmd_get_def_gateway_req {
552 	struct be_cmd_req_hdr hdr;
553 	u32 ip_type;
554 } __packed;
555 
556 struct be_cmd_get_def_gateway_resp {
557 	struct be_cmd_req_hdr hdr;
558 	struct ip_addr_format ip_addr;
559 } __packed;
560 
561 #define BEISCSI_VLAN_DISABLE	0xFFFF
562 struct be_cmd_set_vlan_req {
563 	struct be_cmd_req_hdr hdr;
564 	u32 interface_hndl;
565 	u32 vlan_priority;
566 } __packed;
567 /******************** Create CQ ***************************/
568 /**
569  * Pseudo amap definition in which each bit of the actual structure is defined
570  * as a byte - used to calculate offset/shift/mask of each field
571  */
572 struct amap_cq_context {
573 	u8 cidx[11];		/* dword 0 */
574 	u8 rsvd0;		/* dword 0 */
575 	u8 coalescwm[2];	/* dword 0 */
576 	u8 nodelay;		/* dword 0 */
577 	u8 epidx[11];		/* dword 0 */
578 	u8 rsvd1;		/* dword 0 */
579 	u8 count[2];		/* dword 0 */
580 	u8 valid;		/* dword 0 */
581 	u8 solevent;		/* dword 0 */
582 	u8 eventable;		/* dword 0 */
583 	u8 pidx[11];		/* dword 1 */
584 	u8 rsvd2;		/* dword 1 */
585 	u8 pd[10];		/* dword 1 */
586 	u8 eqid[8];		/* dword 1 */
587 	u8 stalled;		/* dword 1 */
588 	u8 armed;		/* dword 1 */
589 	u8 rsvd3[4];		/* dword 2 */
590 	u8 func[8];		/* dword 2 */
591 	u8 rsvd4[20];		/* dword 2 */
592 	u8 rsvd5[32];		/* dword 3 */
593 } __packed;
594 
595 struct amap_cq_context_v2 {
596 	u8 rsvd0[12];   /* dword 0 */
597 	u8 coalescwm[2];    /* dword 0 */
598 	u8 nodelay;     /* dword 0 */
599 	u8 rsvd1[12];   /* dword 0 */
600 	u8 count[2];    /* dword 0 */
601 	u8 valid;       /* dword 0 */
602 	u8 rsvd2;       /* dword 0 */
603 	u8 eventable;   /* dword 0 */
604 	u8 eqid[16];    /* dword 1 */
605 	u8 rsvd3[15];   /* dword 1 */
606 	u8 armed;       /* dword 1 */
607 	u8 cqecount[16];/* dword 2 */
608 	u8 rsvd4[16];   /* dword 2 */
609 	u8 rsvd5[32];   /* dword 3 */
610 };
611 
612 struct be_cmd_req_cq_create {
613 	struct be_cmd_req_hdr hdr;
614 	u16 num_pages;
615 	u8 page_size;
616 	u8 rsvd0;
617 	u8 context[sizeof(struct amap_cq_context) / 8];
618 	struct phys_addr pages[4];
619 } __packed;
620 
621 struct be_cmd_resp_cq_create {
622 	struct be_cmd_resp_hdr hdr;
623 	u16 cq_id;
624 	u16 rsvd0;
625 } __packed;
626 
627 /******************** Create MCCQ ***************************/
628 /**
629  * Pseudo amap definition in which each bit of the actual structure is defined
630  * as a byte - used to calculate offset/shift/mask of each field
631  */
632 struct amap_mcc_context {
633 	u8 con_index[14];
634 	u8 rsvd0[2];
635 	u8 ring_size[4];
636 	u8 fetch_wrb;
637 	u8 fetch_r2t;
638 	u8 cq_id[10];
639 	u8 prod_index[14];
640 	u8 fid[8];
641 	u8 pdid[9];
642 	u8 valid;
643 	u8 rsvd1[32];
644 	u8 rsvd2[32];
645 } __packed;
646 
647 struct be_cmd_req_mcc_create_ext {
648 	struct be_cmd_req_hdr hdr;
649 	u16 num_pages;
650 	u16 rsvd0;
651 	u32 async_evt_bitmap;
652 	u8 context[sizeof(struct amap_mcc_context) / 8];
653 	struct phys_addr pages[8];
654 } __packed;
655 
656 struct be_cmd_resp_mcc_create {
657 	struct be_cmd_resp_hdr hdr;
658 	u16 id;
659 	u16 rsvd0;
660 } __packed;
661 
662 /******************** Q Destroy  ***************************/
663 /* Type of Queue to be destroyed */
664 enum {
665 	QTYPE_EQ = 1,
666 	QTYPE_CQ,
667 	QTYPE_MCCQ,
668 	QTYPE_WRBQ,
669 	QTYPE_DPDUQ,
670 	QTYPE_SGL
671 };
672 
673 struct be_cmd_req_q_destroy {
674 	struct be_cmd_req_hdr hdr;
675 	u16 id;
676 	u16 bypass_flush;	/* valid only for rx q destroy */
677 } __packed;
678 
679 struct macaddr {
680 	u8 byte[ETH_ALEN];
681 };
682 
683 struct be_cmd_req_mcast_mac_config {
684 	struct be_cmd_req_hdr hdr;
685 	u16 num_mac;
686 	u8 promiscuous;
687 	u8 interface_id;
688 	struct macaddr mac[32];
689 } __packed;
690 
embedded_payload(struct be_mcc_wrb * wrb)691 static inline void *embedded_payload(struct be_mcc_wrb *wrb)
692 {
693 	return wrb->payload.embedded_payload;
694 }
695 
nonembedded_sgl(struct be_mcc_wrb * wrb)696 static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
697 {
698 	return &wrb->payload.sgl[0];
699 }
700 
701 /******************** Modify EQ Delay *******************/
702 struct be_cmd_req_modify_eq_delay {
703 	struct be_cmd_req_hdr hdr;
704 	__le32 num_eq;
705 	struct {
706 		__le32 eq_id;
707 		__le32 phase;
708 		__le32 delay_multiplier;
709 	} delay[MAX_CPUS];
710 } __packed;
711 
712 /******************** Get MAC ADDR *******************/
713 
714 struct be_cmd_get_nic_conf_resp {
715 	struct be_cmd_resp_hdr hdr;
716 	u32 nic_port_count;
717 	u32 speed;
718 	u32 max_speed;
719 	u32 link_state;
720 	u32 max_frame_size;
721 	u16 size_of_structure;
722 	u8 mac_address[ETH_ALEN];
723 } __packed;
724 
725 /******************** Get HBA NAME *******************/
726 
727 struct be_cmd_hba_name {
728 	struct be_cmd_req_hdr hdr;
729 	u16 flags;
730 	u16 rsvd0;
731 	u8 initiator_name[ISCSI_NAME_LEN];
732 #define BE_INI_ALIAS_LEN 32
733 	u8 initiator_alias[BE_INI_ALIAS_LEN];
734 } __packed;
735 
736 /******************** COMMON SET HOST DATA *******************/
737 #define BE_CMD_SET_HOST_PARAM_ID	0x2
738 #define BE_CMD_MAX_DRV_VERSION		0x30
739 struct be_sethost_req {
740 	u32 param_id;
741 	u32 param_len;
742 	u32 param_data[32];
743 };
744 
745 struct be_sethost_resp {
746 	u32 rsvd0;
747 };
748 
749 struct be_cmd_set_host_data {
750 	union {
751 		struct be_cmd_req_hdr req_hdr;
752 		struct be_cmd_resp_hdr resp_hdr;
753 	} h;
754 	union {
755 		struct be_sethost_req req;
756 		struct be_sethost_resp resp;
757 	} param;
758 } __packed;
759 
760 /******************** COMMON SET Features *******************/
761 #define BE_CMD_SET_FEATURE_UER	0x10
762 #define BE_CMD_UER_SUPP_BIT	0x1
763 struct be_uer_req {
764 	u32 uer;
765 	u32 rsvd;
766 };
767 
768 struct be_uer_resp {
769 	u32 uer;
770 	u16 ue2rp;
771 	u16 ue2sr;
772 };
773 
774 struct be_cmd_set_features {
775 	union {
776 		struct be_cmd_req_hdr req_hdr;
777 		struct be_cmd_resp_hdr resp_hdr;
778 	} h;
779 	u32 feature;
780 	u32 param_len;
781 	union {
782 		struct be_uer_req req;
783 		struct be_uer_resp resp;
784 		u32 rsvd[2];
785 	} param;
786 } __packed;
787 
788 int beiscsi_cmd_function_reset(struct beiscsi_hba *phba);
789 
790 int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load);
791 
792 int beiscsi_check_fw_rdy(struct beiscsi_hba *phba);
793 
794 int beiscsi_init_sliport(struct beiscsi_hba *phba);
795 
796 int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num);
797 
798 int beiscsi_detect_ue(struct beiscsi_hba *phba);
799 
800 int beiscsi_detect_tpe(struct beiscsi_hba *phba);
801 
802 int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
803 			  struct be_queue_info *eq, int eq_delay);
804 
805 int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl,
806 			  struct be_queue_info *cq, struct be_queue_info *eq,
807 			  bool sol_evts, bool no_delay,
808 			  int num_cqe_dma_coalesce);
809 
810 int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
811 			  int type);
812 int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
813 			struct be_queue_info *mccq,
814 			struct be_queue_info *cq);
815 
816 void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag);
817 
818 int beiscsi_modify_eq_delay(struct beiscsi_hba *phba, struct be_set_eqd *,
819 			    int num);
820 int beiscsi_mccq_compl_wait(struct beiscsi_hba *phba,
821 			    unsigned int tag,
822 			    struct be_mcc_wrb **wrb,
823 			    struct be_dma_mem *mbx_cmd_mem);
824 int __beiscsi_mcc_compl_status(struct beiscsi_hba *phba,
825 			       unsigned int tag,
826 			       struct be_mcc_wrb **wrb,
827 			       struct be_dma_mem *mbx_cmd_mem);
828 struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem);
829 void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag);
830 struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
831 				 unsigned int *ref_tag);
832 void beiscsi_process_async_event(struct beiscsi_hba *phba,
833 				struct be_mcc_compl *compl);
834 int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
835 			      struct be_mcc_compl *compl);
836 
837 int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl,
838 				    struct be_queue_info *cq,
839 				    struct be_queue_info *dq, int length,
840 				    int entry_size, uint8_t is_header,
841 				    uint8_t ulp_num);
842 
843 int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
844 				    struct be_dma_mem *q_mem);
845 
846 int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl);
847 
848 int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl,
849 				struct be_dma_mem *q_mem, u32 page_offset,
850 				u32 num_pages);
851 
852 int be_cmd_wrbq_create(struct be_ctrl_info *ctrl, struct be_dma_mem *q_mem,
853 		       struct be_queue_info *wrbq,
854 		       struct hwi_wrb_context *pwrb_context,
855 		       uint8_t ulp_num);
856 
857 /* Configuration Functions */
858 int be_cmd_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag);
859 
860 int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl,
861 			       struct beiscsi_hba *phba);
862 
863 int beiscsi_get_fw_config(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
864 
865 int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
866 
867 int beiscsi_set_uer_feature(struct beiscsi_hba *phba);
868 int beiscsi_set_host_data(struct beiscsi_hba *phba);
869 
870 struct be_default_pdu_context {
871 	u32 dw[4];
872 } __packed;
873 
874 struct amap_be_default_pdu_context {
875 	u8 dbuf_cindex[13];	/* dword 0 */
876 	u8 rsvd0[3];		/* dword 0 */
877 	u8 ring_size[4];	/* dword 0 */
878 	u8 ring_state[4];	/* dword 0 */
879 	u8 rsvd1[8];		/* dword 0 */
880 	u8 dbuf_pindex[13];	/* dword 1 */
881 	u8 rsvd2;		/* dword 1 */
882 	u8 pci_func_id[8];	/* dword 1 */
883 	u8 rx_pdid[9];		/* dword 1 */
884 	u8 rx_pdid_valid;	/* dword 1 */
885 	u8 default_buffer_size[16];	/* dword 2 */
886 	u8 cq_id_recv[10];	/* dword 2 */
887 	u8 rx_pdid_not_valid;	/* dword 2 */
888 	u8 rsvd3[5];		/* dword 2 */
889 	u8 rsvd4[32];		/* dword 3 */
890 } __packed;
891 
892 struct amap_default_pdu_context_ext {
893 	u8 rsvd0[16];   /* dword 0 */
894 	u8 ring_size[4];    /* dword 0 */
895 	u8 rsvd1[12];   /* dword 0 */
896 	u8 rsvd2[22];   /* dword 1 */
897 	u8 rx_pdid[9];  /* dword 1 */
898 	u8 rx_pdid_valid;   /* dword 1 */
899 	u8 default_buffer_size[16]; /* dword 2 */
900 	u8 cq_id_recv[16];  /* dword 2 */
901 	u8 rsvd3[32];   /* dword 3 */
902 } __packed;
903 
904 struct be_defq_create_req {
905 	struct be_cmd_req_hdr hdr;
906 	u16 num_pages;
907 	u8 ulp_num;
908 #define BEISCSI_DUAL_ULP_AWARE_BIT	0	/* Byte 3 - Bit 0 */
909 #define BEISCSI_BIND_Q_TO_ULP_BIT	1	/* Byte 3 - Bit 1 */
910 	u8 dua_feature;
911 	struct be_default_pdu_context context;
912 	struct phys_addr pages[8];
913 } __packed;
914 
915 struct be_defq_create_resp {
916 	struct be_cmd_req_hdr hdr;
917 	u16 id;
918 	u8 rsvd0;
919 	u8 ulp_num;
920 	u32 doorbell_offset;
921 	u16 register_set;
922 	u16 doorbell_format;
923 } __packed;
924 
925 struct be_post_template_pages_req {
926 	struct be_cmd_req_hdr hdr;
927 	u16 num_pages;
928 #define BEISCSI_TEMPLATE_HDR_TYPE_ISCSI	0x1
929 	u16 type;
930 	struct phys_addr scratch_pa;
931 	struct virt_addr scratch_va;
932 	struct virt_addr pages_va;
933 	struct phys_addr pages[16];
934 } __packed;
935 
936 struct be_remove_template_pages_req {
937 	struct be_cmd_req_hdr hdr;
938 	u16 type;
939 	u16 rsvd0;
940 } __packed;
941 
942 struct be_post_sgl_pages_req {
943 	struct be_cmd_req_hdr hdr;
944 	u16 num_pages;
945 	u16 page_offset;
946 	u32 rsvd0;
947 	struct phys_addr pages[26];
948 	u32 rsvd1;
949 } __packed;
950 
951 struct be_wrbq_create_req {
952 	struct be_cmd_req_hdr hdr;
953 	u16 num_pages;
954 	u8 ulp_num;
955 	u8 dua_feature;
956 	struct phys_addr pages[8];
957 } __packed;
958 
959 struct be_wrbq_create_resp {
960 	struct be_cmd_resp_hdr resp_hdr;
961 	u16 cid;
962 	u8 rsvd0;
963 	u8 ulp_num;
964 	u32 doorbell_offset;
965 	u16 register_set;
966 	u16 doorbell_format;
967 } __packed;
968 
969 #define SOL_CID_MASK		0x0000FFC0
970 #define SOL_CODE_MASK		0x0000003F
971 #define SOL_WRB_INDEX_MASK	0x00FF0000
972 #define SOL_CMD_WND_MASK	0xFF000000
973 #define SOL_RES_CNT_MASK	0x7FFFFFFF
974 #define SOL_EXP_CMD_SN_MASK	0xFFFFFFFF
975 #define SOL_HW_STS_MASK		0x000000FF
976 #define SOL_STS_MASK		0x0000FF00
977 #define SOL_RESP_MASK		0x00FF0000
978 #define SOL_FLAGS_MASK		0x7F000000
979 #define SOL_S_MASK		0x80000000
980 
981 struct sol_cqe {
982 	u32 dw[4];
983 };
984 
985 struct amap_sol_cqe {
986 	u8 hw_sts[8];		/* dword 0 */
987 	u8 i_sts[8];		/* dword 0 */
988 	u8 i_resp[8];		/* dword 0 */
989 	u8 i_flags[7];		/* dword 0 */
990 	u8 s;			/* dword 0 */
991 	u8 i_exp_cmd_sn[32];	/* dword 1 */
992 	u8 code[6];		/* dword 2 */
993 	u8 cid[10];		/* dword 2 */
994 	u8 wrb_index[8];	/* dword 2 */
995 	u8 i_cmd_wnd[8];	/* dword 2 */
996 	u8 i_res_cnt[31];	/* dword 3 */
997 	u8 valid;		/* dword 3 */
998 } __packed;
999 
1000 #define SOL_ICD_INDEX_MASK	0x0003FFC0
1001 struct amap_sol_cqe_ring {
1002 	u8 hw_sts[8];		/* dword 0 */
1003 	u8 i_sts[8];		/* dword 0 */
1004 	u8 i_resp[8];		/* dword 0 */
1005 	u8 i_flags[7];		/* dword 0 */
1006 	u8 s;			/* dword 0 */
1007 	u8 i_exp_cmd_sn[32];	/* dword 1 */
1008 	u8 code[6];		/* dword 2 */
1009 	u8 icd_index[12];	/* dword 2 */
1010 	u8 rsvd[6];		/* dword 2 */
1011 	u8 i_cmd_wnd[8];	/* dword 2 */
1012 	u8 i_res_cnt[31];	/* dword 3 */
1013 	u8 valid;		/* dword 3 */
1014 } __packed;
1015 
1016 struct amap_sol_cqe_v2 {
1017 	u8 hw_sts[8];   /* dword 0 */
1018 	u8 i_sts[8];    /* dword 0 */
1019 	u8 wrb_index[16];   /* dword 0 */
1020 	u8 i_exp_cmd_sn[32];    /* dword 1 */
1021 	u8 code[6]; /* dword 2 */
1022 	u8 cmd_cmpl;    /* dword 2 */
1023 	u8 rsvd0;   /* dword 2 */
1024 	u8 i_cmd_wnd[8];    /* dword 2 */
1025 	u8 cid[13]; /* dword 2 */
1026 	u8 u;   /* dword 2 */
1027 	u8 o;   /* dword 2 */
1028 	u8 s;   /* dword 2 */
1029 	u8 i_res_cnt[31];   /* dword 3 */
1030 	u8 valid;   /* dword 3 */
1031 } __packed;
1032 
1033 struct common_sol_cqe {
1034 	u32 exp_cmdsn;
1035 	u32 res_cnt;
1036 	u16 wrb_index;
1037 	u16 cid;
1038 	u8 hw_sts;
1039 	u8 cmd_wnd;
1040 	u8 res_flag; /* the s feild of structure */
1041 	u8 i_resp; /* for skh if cmd_complete is set then i_sts is response */
1042 	u8 i_flags; /* for skh or the u and o feilds */
1043 	u8 i_sts; /* for skh if cmd_complete is not-set then i_sts is status */
1044 };
1045 
1046 /*** iSCSI ack/driver message completions ***/
1047 struct amap_it_dmsg_cqe {
1048 	u8 ack_num[32]; /* DWORD 0 */
1049 	u8 pdu_bytes_rcvd[32];  /* DWORD 1 */
1050 	u8 code[6]; /* DWORD 2 */
1051 	u8 cid[10]; /* DWORD 2 */
1052 	u8 wrb_idx[8];  /* DWORD 2 */
1053 	u8 rsvd0[8];    /* DWORD 2*/
1054 	u8 rsvd1[31];   /* DWORD 3*/
1055 	u8 valid;   /* DWORD 3 */
1056 } __packed;
1057 
1058 struct amap_it_dmsg_cqe_v2 {
1059 	u8 ack_num[32]; /* DWORD 0 */
1060 	u8 pdu_bytes_rcvd[32];  /* DWORD 1 */
1061 	u8 code[6]; /* DWORD 2 */
1062 	u8 rsvd0[10];   /* DWORD 2 */
1063 	u8 wrb_idx[16]; /* DWORD 2 */
1064 	u8 rsvd1[16];   /* DWORD 3 */
1065 	u8 cid[13]; /* DWORD 3 */
1066 	u8 rsvd2[2];    /* DWORD 3 */
1067 	u8 valid;   /* DWORD 3 */
1068 } __packed;
1069 
1070 
1071 /**
1072  * Post WRB Queue Doorbell Register used by the host Storage
1073  * stack to notify the
1074  * controller of a posted Work Request Block
1075  */
1076 #define DB_WRB_POST_CID_MASK		0xFFFF	/* bits 0 - 16 */
1077 #define DB_DEF_PDU_WRB_INDEX_MASK	0xFF	/* bits 0 - 9 */
1078 
1079 #define DB_DEF_PDU_WRB_INDEX_SHIFT	16
1080 #define DB_DEF_PDU_NUM_POSTED_SHIFT	24
1081 
1082 struct fragnum_bits_for_sgl_cra_in {
1083 	struct be_cmd_req_hdr hdr;
1084 	u32 num_bits;
1085 } __packed;
1086 
1087 struct iscsi_cleanup_req {
1088 	struct be_cmd_req_hdr hdr;
1089 	u16 chute;
1090 	u8 hdr_ring_id;
1091 	u8 data_ring_id;
1092 } __packed;
1093 
1094 struct iscsi_cleanup_req_v1 {
1095 	struct be_cmd_req_hdr hdr;
1096 	u16 chute;
1097 	u16 rsvd1;
1098 	u16 hdr_ring_id;
1099 	u16 rsvd2;
1100 	u16 data_ring_id;
1101 	u16 rsvd3;
1102 } __packed;
1103 
1104 struct eq_delay {
1105 	u32 eq_id;
1106 	u32 phase;
1107 	u32 delay_multiplier;
1108 } __packed;
1109 
1110 struct be_eq_delay_params_in {
1111 	struct be_cmd_req_hdr hdr;
1112 	u32 num_eq;
1113 	struct eq_delay delay[8];
1114 } __packed;
1115 
1116 struct tcp_connect_and_offload_in {
1117 	struct be_cmd_req_hdr hdr;
1118 	struct ip_addr_format ip_address;
1119 	u16 tcp_port;
1120 	u16 cid;
1121 	u16 cq_id;
1122 	u16 defq_id;
1123 	struct phys_addr dataout_template_pa;
1124 	u16 hdr_ring_id;
1125 	u16 data_ring_id;
1126 	u8 do_offload;
1127 	u8 rsvd0[3];
1128 } __packed;
1129 
1130 struct tcp_connect_and_offload_in_v1 {
1131 	struct be_cmd_req_hdr hdr;
1132 	struct ip_addr_format ip_address;
1133 	u16 tcp_port;
1134 	u16 cid;
1135 	u16 cq_id;
1136 	u16 defq_id;
1137 	struct phys_addr dataout_template_pa;
1138 	u16 hdr_ring_id;
1139 	u16 data_ring_id;
1140 	u8 do_offload;
1141 	u8 ifd_state;
1142 	u8 rsvd0[2];
1143 	u16 tcp_window_size;
1144 	u8 tcp_window_scale_count;
1145 	u8 rsvd1;
1146 	u32 tcp_mss:24;
1147 	u8 rsvd2;
1148 } __packed;
1149 
1150 struct tcp_connect_and_offload_out {
1151 	struct be_cmd_resp_hdr hdr;
1152 	u32 connection_handle;
1153 	u16 cid;
1154 	u16 rsvd0;
1155 
1156 } __packed;
1157 
1158 #define DB_DEF_PDU_RING_ID_MASK	0x3FFF	/* bits 0 - 13 */
1159 #define DB_DEF_PDU_CQPROC_MASK		0x3FFF	/* bits 16 - 29 */
1160 #define DB_DEF_PDU_REARM_SHIFT		14
1161 #define DB_DEF_PDU_EVENT_SHIFT		15
1162 #define DB_DEF_PDU_CQPROC_SHIFT		16
1163 
1164 struct be_invalidate_connection_params_in {
1165 	struct be_cmd_req_hdr hdr;
1166 	u32 session_handle;
1167 	u16 cid;
1168 	u16 unused;
1169 #define BE_CLEANUP_TYPE_INVALIDATE	0x8001
1170 #define BE_CLEANUP_TYPE_ISSUE_TCP_RST	0x8002
1171 	u16 cleanup_type;
1172 	u16 save_cfg;
1173 } __packed;
1174 
1175 struct be_invalidate_connection_params_out {
1176 	u32 session_handle;
1177 	u16 cid;
1178 	u16 unused;
1179 } __packed;
1180 
1181 union be_invalidate_connection_params {
1182 	struct be_invalidate_connection_params_in req;
1183 	struct be_invalidate_connection_params_out resp;
1184 } __packed;
1185 
1186 struct be_tcp_upload_params_in {
1187 	struct be_cmd_req_hdr hdr;
1188 	u16 id;
1189 #define BE_UPLOAD_TYPE_GRACEFUL		1
1190 /* abortive upload with reset */
1191 #define BE_UPLOAD_TYPE_ABORT_RESET	2
1192 /* abortive upload without reset */
1193 #define BE_UPLOAD_TYPE_ABORT		3
1194 /* abortive upload with reset, sequence number by driver */
1195 #define BE_UPLOAD_TYPE_ABORT_WITH_SEQ	4
1196 	u16 upload_type;
1197 	u32 reset_seq;
1198 } __packed;
1199 
1200 struct be_tcp_upload_params_out {
1201 	u32 dw[32];
1202 } __packed;
1203 
1204 union be_tcp_upload_params {
1205 	struct be_tcp_upload_params_in request;
1206 	struct be_tcp_upload_params_out response;
1207 } __packed;
1208 
1209 struct be_ulp_fw_cfg {
1210 #define BEISCSI_ULP_ISCSI_INI_MODE	0x10
1211 	u32 ulp_mode;
1212 	u32 etx_base;
1213 	u32 etx_count;
1214 	u32 sq_base;
1215 	u32 sq_count;
1216 	u32 rq_base;
1217 	u32 rq_count;
1218 	u32 dq_base;
1219 	u32 dq_count;
1220 	u32 lro_base;
1221 	u32 lro_count;
1222 	u32 icd_base;
1223 	u32 icd_count;
1224 };
1225 
1226 struct be_ulp_chain_icd {
1227 	u32 chain_base;
1228 	u32 chain_count;
1229 };
1230 
1231 struct be_fw_cfg {
1232 	struct be_cmd_req_hdr hdr;
1233 	u32 be_config_number;
1234 	u32 asic_revision;
1235 	u32 phys_port;
1236 #define BEISCSI_FUNC_ISCSI_INI_MODE	0x10
1237 #define BEISCSI_FUNC_DUA_MODE	0x800
1238 	u32 function_mode;
1239 	struct be_ulp_fw_cfg ulp[2];
1240 	u32 function_caps;
1241 	u32 cqid_base;
1242 	u32 cqid_count;
1243 	u32 eqid_base;
1244 	u32 eqid_count;
1245 	struct be_ulp_chain_icd chain_icd[2];
1246 } __packed;
1247 
1248 struct be_cmd_get_all_if_id_req {
1249 	struct be_cmd_req_hdr hdr;
1250 	u32 if_count;
1251 	u32 if_hndl_list[1];
1252 } __packed;
1253 
1254 struct be_cmd_get_port_name {
1255 	union {
1256 		struct be_cmd_req_hdr req_hdr;
1257 		struct be_cmd_resp_hdr resp_hdr;
1258 	} h;
1259 	union {
1260 		struct {
1261 			u32 reserved;
1262 		} req;
1263 		struct {
1264 			u32 port_names;
1265 		} resp;
1266 	} p;
1267 } __packed;
1268 
1269 #define ISCSI_OPCODE_SCSI_DATA_OUT		5
1270 #define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5
1271 #define OPCODE_COMMON_MODIFY_EQ_DELAY		41
1272 #define OPCODE_COMMON_ISCSI_CLEANUP		59
1273 #define	OPCODE_COMMON_TCP_UPLOAD		56
1274 #define OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD 70
1275 #define OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS 1
1276 #define OPCODE_ISCSI_INI_CFG_GET_HBA_NAME	6
1277 #define OPCODE_ISCSI_INI_CFG_SET_HBA_NAME	7
1278 #define OPCODE_ISCSI_INI_SESSION_GET_A_SESSION  14
1279 #define OPCODE_ISCSI_INI_SESSION_LOGOUT_TARGET	 24
1280 #define OPCODE_ISCSI_INI_DRIVER_REOPEN_ALL_SESSIONS 36
1281 #define OPCODE_ISCSI_INI_DRIVER_OFFLOAD_SESSION 41
1282 #define OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION 42
1283 #define OPCODE_ISCSI_INI_BOOT_GET_BOOT_TARGET	52
1284 #define OPCODE_COMMON_WRITE_FLASH		96
1285 #define OPCODE_COMMON_READ_FLASH		97
1286 
1287 #define CMD_ISCSI_COMMAND_INVALIDATE		1
1288 
1289 #define INI_WR_CMD			1	/* Initiator write command */
1290 #define INI_TMF_CMD			2	/* Initiator TMF command */
1291 #define INI_NOPOUT_CMD			3	/* Initiator; Send a NOP-OUT */
1292 #define INI_RD_CMD			5	/* Initiator requesting to send
1293 						 * a read command
1294 						 */
1295 #define TGT_CTX_UPDT_CMD		7	/* Target context update */
1296 #define TGT_DM_CMD			11	/* Indicates that the bhs
1297 						 * prepared by driver should not
1298 						 * be touched.
1299 						 */
1300 
1301 /* Returns the number of items in the field array. */
1302 #define BE_NUMBER_OF_FIELD(_type_, _field_)	\
1303 	(FIELD_SIZEOF(_type_, _field_)/sizeof((((_type_ *)0)->_field_[0])))\
1304 
1305 /**
1306  * Different types of iSCSI completions to host driver for both initiator
1307  * and taget mode
1308  * of operation.
1309  */
1310 #define SOL_CMD_COMPLETE		1	/* Solicited command completed
1311 						 * normally
1312 						 */
1313 #define SOL_CMD_KILLED_DATA_DIGEST_ERR  2	/* Solicited command got
1314 						 * invalidated internally due
1315 						 * to Data Digest error
1316 						 */
1317 #define CXN_KILLED_PDU_SIZE_EXCEEDS_DSL 3	/* Connection got invalidated
1318 						 * internally
1319 						 * due to a received PDU
1320 						 * size > DSL
1321 						 */
1322 #define CXN_KILLED_BURST_LEN_MISMATCH   4	/* Connection got invalidated
1323 						 * internally due ti received
1324 						 * PDU sequence size >
1325 						 * FBL/MBL.
1326 						 */
1327 #define CXN_KILLED_AHS_RCVD		5	/* Connection got invalidated
1328 						 * internally due to a received
1329 						 * PDU Hdr that has
1330 						 * AHS */
1331 #define CXN_KILLED_HDR_DIGEST_ERR	6	/* Connection got invalidated
1332 						 * internally due to Hdr Digest
1333 						 * error
1334 						 */
1335 #define CXN_KILLED_UNKNOWN_HDR		7	/* Connection got invalidated
1336 						 *  internally
1337 						 * due to a bad opcode in the
1338 						 * pdu hdr
1339 						 */
1340 #define CXN_KILLED_STALE_ITT_TTT_RCVD	8	/* Connection got invalidated
1341 						 * internally due to a received
1342 						 * ITT/TTT that does not belong
1343 						 * to this Connection
1344 						 */
1345 #define CXN_KILLED_INVALID_ITT_TTT_RCVD 9	/* Connection got invalidated
1346 						 * internally due to received
1347 						 * ITT/TTT value > Max
1348 						 * Supported ITTs/TTTs
1349 						 */
1350 #define CXN_KILLED_RST_RCVD		10	/* Connection got invalidated
1351 						 * internally due to an
1352 						 * incoming TCP RST
1353 						 */
1354 #define CXN_KILLED_TIMED_OUT		11	/* Connection got invalidated
1355 						 * internally due to timeout on
1356 						 * tcp segment 12 retransmit
1357 						 * attempts failed
1358 						 */
1359 #define CXN_KILLED_RST_SENT		12	/* Connection got invalidated
1360 						 * internally due to TCP RST
1361 						 * sent by the Tx side
1362 						 */
1363 #define CXN_KILLED_FIN_RCVD		13	/* Connection got invalidated
1364 						 * internally due to an
1365 						 * incoming TCP FIN.
1366 						 */
1367 #define CXN_KILLED_BAD_UNSOL_PDU_RCVD	14	/* Connection got invalidated
1368 						 * internally due to bad
1369 						 * unsolicited PDU Unsolicited
1370 						 * PDUs are PDUs with
1371 						 * ITT=0xffffffff
1372 						 */
1373 #define CXN_KILLED_BAD_WRB_INDEX_ERROR	15	/* Connection got invalidated
1374 						 * internally due to bad WRB
1375 						 * index.
1376 						 */
1377 #define CXN_KILLED_OVER_RUN_RESIDUAL	16	/* Command got invalidated
1378 						 * internally due to received
1379 						 * command has residual
1380 						 * over run bytes.
1381 						 */
1382 #define CXN_KILLED_UNDER_RUN_RESIDUAL	17	/* Command got invalidated
1383 						 * internally due to received
1384 						 * command has residual under
1385 						 * run bytes.
1386 						 */
1387 #define CMD_KILLED_INVALID_STATSN_RCVD	18	/* Command got invalidated
1388 						 * internally due to a received
1389 						 * PDU has an invalid StatusSN
1390 						 */
1391 #define CMD_KILLED_INVALID_R2T_RCVD	19	/* Command got invalidated
1392 						 * internally due to a received
1393 						 * an R2T with some invalid
1394 						 * fields in it
1395 						 */
1396 #define CMD_CXN_KILLED_LUN_INVALID	20	/* Command got invalidated
1397 						 * internally due to received
1398 						 * PDU has an invalid LUN.
1399 						 */
1400 #define CMD_CXN_KILLED_ICD_INVALID	21	/* Command got invalidated
1401 						 * internally due to the
1402 						 * corresponding ICD not in a
1403 						 * valid state
1404 						 */
1405 #define CMD_CXN_KILLED_ITT_INVALID	22	/* Command got invalidated due
1406 						 *  to received PDU has an
1407 						 *  invalid ITT.
1408 						 */
1409 #define CMD_CXN_KILLED_SEQ_OUTOFORDER	23	/* Command got invalidated due
1410 						 * to received sequence buffer
1411 						 * offset is out of order.
1412 						 */
1413 #define CMD_CXN_KILLED_INVALID_DATASN_RCVD 24	/* Command got invalidated
1414 						 * internally due to a
1415 						 * received PDU has an invalid
1416 						 * DataSN
1417 						 */
1418 #define CXN_INVALIDATE_NOTIFY		25	/* Connection invalidation
1419 						 * completion notify.
1420 						 */
1421 #define CXN_INVALIDATE_INDEX_NOTIFY	26	/* Connection invalidation
1422 						 * completion
1423 						 * with data PDU index.
1424 						 */
1425 #define CMD_INVALIDATED_NOTIFY		27	/* Command invalidation
1426 						 * completionnotifify.
1427 						 */
1428 #define UNSOL_HDR_NOTIFY		28	/* Unsolicited header notify.*/
1429 #define UNSOL_DATA_NOTIFY		29	/* Unsolicited data notify.*/
1430 #define UNSOL_DATA_DIGEST_ERROR_NOTIFY	30	/* Unsolicited data digest
1431 						 * error notify.
1432 						 */
1433 #define DRIVERMSG_NOTIFY		31	/* TCP acknowledge based
1434 						 * notification.
1435 						 */
1436 #define CXN_KILLED_CMND_DATA_NOT_ON_SAME_CONN 32 /* Connection got invalidated
1437 						  * internally due to command
1438 						  * and data are not on same
1439 						  * connection.
1440 						  */
1441 #define SOL_CMD_KILLED_DIF_ERR		33	/* Solicited command got
1442 						 *  invalidated internally due
1443 						 *  to DIF error
1444 						 */
1445 #define CXN_KILLED_SYN_RCVD		34	/* Connection got invalidated
1446 						 * internally due to incoming
1447 						 * TCP SYN
1448 						 */
1449 #define CXN_KILLED_IMM_DATA_RCVD	35	/* Connection got invalidated
1450 						 * internally due to an
1451 						 * incoming Unsolicited PDU
1452 						 * that has immediate data on
1453 						 * the cxn
1454 						 */
1455 
1456 void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len,
1457 			bool embedded, u8 sge_cnt);
1458 
1459 void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
1460 			u8 subsystem, u8 opcode, u32 cmd_len);
1461 #endif /* !BEISCSI_CMDS_H */
1462