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 */
20struct be_sge {
21	__le32 pa_lo;
22	__le32 pa_hi;
23	__le32 len;
24};
25
26struct 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
77struct 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
147struct be_async_event_trailer {
148	u32 code;
149};
150
151enum {
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 */
160struct 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 */
189struct be_async_event_sli {
190	u32 event_data1;
191	u32 event_data2;
192	u32 reserved;
193	u32 trailer;
194} __packed;
195
196struct 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
253struct 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
264struct 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
271struct phys_addr {
272	u32 lo;
273	u32 hi;
274};
275
276struct 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 */
288struct 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
313struct 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
321struct 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
327struct be_set_eqd {
328	u32 eq_id;
329	u32 phase;
330	u32 delay_multiplier;
331} __packed;
332
333struct 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
345struct mgmt_auth_method_format {
346	u8	auth_method_type;
347	u8	padding[3];
348	struct	mgmt_chap_format chap;
349} __packed;
350
351struct be_cmd_req_logout_fw_sess {
352	struct be_cmd_req_hdr hdr;	/* dw[4] */
353	uint32_t session_handle;
354} __packed;
355
356struct 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
362struct 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
374struct 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
390struct 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
404struct 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
416struct 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
430struct be_cmd_get_session_req {
431	struct be_cmd_req_hdr hdr;
432	u32 session_handle;
433} __packed;
434
435struct be_cmd_get_session_resp {
436	struct be_cmd_resp_hdr hdr;
437	struct mgmt_session_info session_info;
438} __packed;
439
440struct mac_addr {
441	u16 size_of_structure;
442	u8 addr[ETH_ALEN];
443} __packed;
444
445struct be_cmd_get_boot_target_req {
446	struct be_cmd_req_hdr hdr;
447} __packed;
448
449struct 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
460struct 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
470struct be_cmd_reopen_session_resp {
471	struct be_cmd_resp_hdr hdr;
472	u32 rsvd;
473	u32 session_handle;
474} __packed;
475
476
477struct 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
484struct be_cmd_get_mac_resp {
485	struct be_cmd_resp_hdr hdr;
486	struct mac_addr mac;
487};
488
489struct 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
498struct be_cmd_get_if_info_req {
499	struct be_cmd_req_hdr hdr;
500	u32 interface_hndl;
501	u32 ip_type;
502} __packed;
503
504struct 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
513struct 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
520struct be_ip_addr_record_params {
521	u32 record_entry_count;
522	struct be_ip_addr_record ip_record;
523} __packed;
524
525struct 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
531struct 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
539struct be_cmd_rel_dhcp_req {
540	struct be_cmd_req_hdr hdr;
541	u32 interface_hndl;
542	u32 ip_type;
543} __packed;
544
545struct 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
551struct be_cmd_get_def_gateway_req {
552	struct be_cmd_req_hdr hdr;
553	u32 ip_type;
554} __packed;
555
556struct 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
562struct 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 */
572struct 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
595struct 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
612struct 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
621struct 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 */
632struct 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
647struct 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
656struct 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 */
664enum {
665	QTYPE_EQ = 1,
666	QTYPE_CQ,
667	QTYPE_MCCQ,
668	QTYPE_WRBQ,
669	QTYPE_DPDUQ,
670	QTYPE_SGL
671};
672
673struct 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
679struct macaddr {
680	u8 byte[ETH_ALEN];
681};
682
683struct 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
691static inline void *embedded_payload(struct be_mcc_wrb *wrb)
692{
693	return wrb->payload.embedded_payload;
694}
695
696static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
697{
698	return &wrb->payload.sgl[0];
699}
700
701/******************** Modify EQ Delay *******************/
702struct 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
714struct 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
727struct 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
739struct be_sethost_req {
740	u32 param_id;
741	u32 param_len;
742	u32 param_data[32];
743};
744
745struct be_sethost_resp {
746	u32 rsvd0;
747};
748
749struct 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
763struct be_uer_req {
764	u32 uer;
765	u32 rsvd;
766};
767
768struct be_uer_resp {
769	u32 uer;
770	u16 ue2rp;
771	u16 ue2sr;
772};
773
774struct 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
788int beiscsi_cmd_function_reset(struct beiscsi_hba *phba);
789
790int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load);
791
792int beiscsi_check_fw_rdy(struct beiscsi_hba *phba);
793
794int beiscsi_init_sliport(struct beiscsi_hba *phba);
795
796int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num);
797
798int beiscsi_detect_ue(struct beiscsi_hba *phba);
799
800int beiscsi_detect_tpe(struct beiscsi_hba *phba);
801
802int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
803			  struct be_queue_info *eq, int eq_delay);
804
805int 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
810int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
811			  int type);
812int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
813			struct be_queue_info *mccq,
814			struct be_queue_info *cq);
815
816void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag);
817
818int beiscsi_modify_eq_delay(struct beiscsi_hba *phba, struct be_set_eqd *,
819			    int num);
820int 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);
824int __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);
828struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem);
829void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag);
830struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
831				 unsigned int *ref_tag);
832void beiscsi_process_async_event(struct beiscsi_hba *phba,
833				struct be_mcc_compl *compl);
834int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
835			      struct be_mcc_compl *compl);
836
837int 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
843int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
844				    struct be_dma_mem *q_mem);
845
846int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl);
847
848int 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
852int 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 */
858int be_cmd_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag);
859
860int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl,
861			       struct beiscsi_hba *phba);
862
863int beiscsi_get_fw_config(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
864
865int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
866
867int beiscsi_set_uer_feature(struct beiscsi_hba *phba);
868int beiscsi_set_host_data(struct beiscsi_hba *phba);
869
870struct be_default_pdu_context {
871	u32 dw[4];
872} __packed;
873
874struct 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
892struct 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
904struct 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
915struct 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
925struct 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
936struct be_remove_template_pages_req {
937	struct be_cmd_req_hdr hdr;
938	u16 type;
939	u16 rsvd0;
940} __packed;
941
942struct 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
951struct 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
959struct 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
981struct sol_cqe {
982	u32 dw[4];
983};
984
985struct 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
1001struct 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
1016struct 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
1033struct 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 ***/
1047struct 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
1058struct 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
1082struct fragnum_bits_for_sgl_cra_in {
1083	struct be_cmd_req_hdr hdr;
1084	u32 num_bits;
1085} __packed;
1086
1087struct 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
1094struct 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
1104struct eq_delay {
1105	u32 eq_id;
1106	u32 phase;
1107	u32 delay_multiplier;
1108} __packed;
1109
1110struct 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
1116struct 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
1130struct 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
1150struct 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
1164struct 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
1175struct be_invalidate_connection_params_out {
1176	u32 session_handle;
1177	u16 cid;
1178	u16 unused;
1179} __packed;
1180
1181union be_invalidate_connection_params {
1182	struct be_invalidate_connection_params_in req;
1183	struct be_invalidate_connection_params_out resp;
1184} __packed;
1185
1186struct 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
1200struct be_tcp_upload_params_out {
1201	u32 dw[32];
1202} __packed;
1203
1204union be_tcp_upload_params {
1205	struct be_tcp_upload_params_in request;
1206	struct be_tcp_upload_params_out response;
1207} __packed;
1208
1209struct 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
1226struct be_ulp_chain_icd {
1227	u32 chain_base;
1228	u32 chain_count;
1229};
1230
1231struct 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
1248struct 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
1254struct 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	(sizeof_field(_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
1456void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len,
1457			bool embedded, u8 sge_cnt);
1458
1459void 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