1/* 57xx_iscsi_hsi.h: QLogic NetXtreme II iSCSI HSI.
2 *
3 * Copyright (c) 2006 - 2013 Broadcom Corporation
4 * Copyright (c) 2014, QLogic Corporation
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation.
9 *
10 * Written by: Anil Veerabhadrappa (anilgv@broadcom.com)
11 * Previously Maintained by: Eddie Wai (eddie.wai@broadcom.com)
12 * Maintained by: QLogic-Storage-Upstream@qlogic.com
13 */
14#ifndef __57XX_ISCSI_HSI_LINUX_LE__
15#define __57XX_ISCSI_HSI_LINUX_LE__
16
17/*
18 * iSCSI Async CQE
19 */
20struct bnx2i_async_msg {
21#if defined(__BIG_ENDIAN)
22	u8 op_code;
23	u8 reserved1;
24	u16 reserved0;
25#elif defined(__LITTLE_ENDIAN)
26	u16 reserved0;
27	u8 reserved1;
28	u8 op_code;
29#endif
30	u32 reserved2;
31	u32 exp_cmd_sn;
32	u32 max_cmd_sn;
33	u32 reserved3[2];
34#if defined(__BIG_ENDIAN)
35	u16 reserved5;
36	u8 err_code;
37	u8 reserved4;
38#elif defined(__LITTLE_ENDIAN)
39	u8 reserved4;
40	u8 err_code;
41	u16 reserved5;
42#endif
43	u32 reserved6;
44	u32 lun[2];
45#if defined(__BIG_ENDIAN)
46	u8 async_event;
47	u8 async_vcode;
48	u16 param1;
49#elif defined(__LITTLE_ENDIAN)
50	u16 param1;
51	u8 async_vcode;
52	u8 async_event;
53#endif
54#if defined(__BIG_ENDIAN)
55	u16 param2;
56	u16 param3;
57#elif defined(__LITTLE_ENDIAN)
58	u16 param3;
59	u16 param2;
60#endif
61	u32 reserved7[3];
62	u32 cq_req_sn;
63};
64
65
66/*
67 * iSCSI Buffer Descriptor (BD)
68 */
69struct iscsi_bd {
70	u32 buffer_addr_hi;
71	u32 buffer_addr_lo;
72#if defined(__BIG_ENDIAN)
73	u16 reserved0;
74	u16 buffer_length;
75#elif defined(__LITTLE_ENDIAN)
76	u16 buffer_length;
77	u16 reserved0;
78#endif
79#if defined(__BIG_ENDIAN)
80	u16 reserved3;
81	u16 flags;
82#define ISCSI_BD_RESERVED1 (0x3F<<0)
83#define ISCSI_BD_RESERVED1_SHIFT 0
84#define ISCSI_BD_LAST_IN_BD_CHAIN (0x1<<6)
85#define ISCSI_BD_LAST_IN_BD_CHAIN_SHIFT 6
86#define ISCSI_BD_FIRST_IN_BD_CHAIN (0x1<<7)
87#define ISCSI_BD_FIRST_IN_BD_CHAIN_SHIFT 7
88#define ISCSI_BD_RESERVED2 (0xFF<<8)
89#define ISCSI_BD_RESERVED2_SHIFT 8
90#elif defined(__LITTLE_ENDIAN)
91	u16 flags;
92#define ISCSI_BD_RESERVED1 (0x3F<<0)
93#define ISCSI_BD_RESERVED1_SHIFT 0
94#define ISCSI_BD_LAST_IN_BD_CHAIN (0x1<<6)
95#define ISCSI_BD_LAST_IN_BD_CHAIN_SHIFT 6
96#define ISCSI_BD_FIRST_IN_BD_CHAIN (0x1<<7)
97#define ISCSI_BD_FIRST_IN_BD_CHAIN_SHIFT 7
98#define ISCSI_BD_RESERVED2 (0xFF<<8)
99#define ISCSI_BD_RESERVED2_SHIFT 8
100	u16 reserved3;
101#endif
102};
103
104
105/*
106 * iSCSI Cleanup SQ WQE
107 */
108struct bnx2i_cleanup_request {
109#if defined(__BIG_ENDIAN)
110	u8 op_code;
111	u8 reserved1;
112	u16 reserved0;
113#elif defined(__LITTLE_ENDIAN)
114	u16 reserved0;
115	u8 reserved1;
116	u8 op_code;
117#endif
118	u32 reserved2[3];
119#if defined(__BIG_ENDIAN)
120	u16 reserved3;
121	u16 itt;
122#define ISCSI_CLEANUP_REQUEST_INDEX (0x3FFF<<0)
123#define ISCSI_CLEANUP_REQUEST_INDEX_SHIFT 0
124#define ISCSI_CLEANUP_REQUEST_TYPE (0x3<<14)
125#define ISCSI_CLEANUP_REQUEST_TYPE_SHIFT 14
126#elif defined(__LITTLE_ENDIAN)
127	u16 itt;
128#define ISCSI_CLEANUP_REQUEST_INDEX (0x3FFF<<0)
129#define ISCSI_CLEANUP_REQUEST_INDEX_SHIFT 0
130#define ISCSI_CLEANUP_REQUEST_TYPE (0x3<<14)
131#define ISCSI_CLEANUP_REQUEST_TYPE_SHIFT 14
132	u16 reserved3;
133#endif
134	u32 reserved4[10];
135#if defined(__BIG_ENDIAN)
136	u8 cq_index;
137	u8 reserved6;
138	u16 reserved5;
139#elif defined(__LITTLE_ENDIAN)
140	u16 reserved5;
141	u8 reserved6;
142	u8 cq_index;
143#endif
144};
145
146
147/*
148 * iSCSI Cleanup CQE
149 */
150struct bnx2i_cleanup_response {
151#if defined(__BIG_ENDIAN)
152	u8 op_code;
153	u8 status;
154	u16 reserved0;
155#elif defined(__LITTLE_ENDIAN)
156	u16 reserved0;
157	u8 status;
158	u8 op_code;
159#endif
160	u32 reserved1[3];
161	u32 reserved2[2];
162#if defined(__BIG_ENDIAN)
163	u16 reserved4;
164	u8 err_code;
165	u8 reserved3;
166#elif defined(__LITTLE_ENDIAN)
167	u8 reserved3;
168	u8 err_code;
169	u16 reserved4;
170#endif
171	u32 reserved5[7];
172#if defined(__BIG_ENDIAN)
173	u16 reserved6;
174	u16 itt;
175#define ISCSI_CLEANUP_RESPONSE_INDEX (0x3FFF<<0)
176#define ISCSI_CLEANUP_RESPONSE_INDEX_SHIFT 0
177#define ISCSI_CLEANUP_RESPONSE_TYPE (0x3<<14)
178#define ISCSI_CLEANUP_RESPONSE_TYPE_SHIFT 14
179#elif defined(__LITTLE_ENDIAN)
180	u16 itt;
181#define ISCSI_CLEANUP_RESPONSE_INDEX (0x3FFF<<0)
182#define ISCSI_CLEANUP_RESPONSE_INDEX_SHIFT 0
183#define ISCSI_CLEANUP_RESPONSE_TYPE (0x3<<14)
184#define ISCSI_CLEANUP_RESPONSE_TYPE_SHIFT 14
185	u16 reserved6;
186#endif
187	u32 cq_req_sn;
188};
189
190
191/*
192 * SCSI read/write SQ WQE
193 */
194struct bnx2i_cmd_request {
195#if defined(__BIG_ENDIAN)
196	u8 op_code;
197	u8 op_attr;
198#define ISCSI_CMD_REQUEST_TASK_ATTR (0x7<<0)
199#define ISCSI_CMD_REQUEST_TASK_ATTR_SHIFT 0
200#define ISCSI_CMD_REQUEST_RESERVED1 (0x3<<3)
201#define ISCSI_CMD_REQUEST_RESERVED1_SHIFT 3
202#define ISCSI_CMD_REQUEST_WRITE (0x1<<5)
203#define ISCSI_CMD_REQUEST_WRITE_SHIFT 5
204#define ISCSI_CMD_REQUEST_READ (0x1<<6)
205#define ISCSI_CMD_REQUEST_READ_SHIFT 6
206#define ISCSI_CMD_REQUEST_FINAL (0x1<<7)
207#define ISCSI_CMD_REQUEST_FINAL_SHIFT 7
208	u16 reserved0;
209#elif defined(__LITTLE_ENDIAN)
210	u16 reserved0;
211	u8 op_attr;
212#define ISCSI_CMD_REQUEST_TASK_ATTR (0x7<<0)
213#define ISCSI_CMD_REQUEST_TASK_ATTR_SHIFT 0
214#define ISCSI_CMD_REQUEST_RESERVED1 (0x3<<3)
215#define ISCSI_CMD_REQUEST_RESERVED1_SHIFT 3
216#define ISCSI_CMD_REQUEST_WRITE (0x1<<5)
217#define ISCSI_CMD_REQUEST_WRITE_SHIFT 5
218#define ISCSI_CMD_REQUEST_READ (0x1<<6)
219#define ISCSI_CMD_REQUEST_READ_SHIFT 6
220#define ISCSI_CMD_REQUEST_FINAL (0x1<<7)
221#define ISCSI_CMD_REQUEST_FINAL_SHIFT 7
222	u8 op_code;
223#endif
224#if defined(__BIG_ENDIAN)
225	u16 ud_buffer_offset;
226	u16 sd_buffer_offset;
227#elif defined(__LITTLE_ENDIAN)
228	u16 sd_buffer_offset;
229	u16 ud_buffer_offset;
230#endif
231	u32 lun[2];
232#if defined(__BIG_ENDIAN)
233	u16 reserved2;
234	u16 itt;
235#define ISCSI_CMD_REQUEST_INDEX (0x3FFF<<0)
236#define ISCSI_CMD_REQUEST_INDEX_SHIFT 0
237#define ISCSI_CMD_REQUEST_TYPE (0x3<<14)
238#define ISCSI_CMD_REQUEST_TYPE_SHIFT 14
239#elif defined(__LITTLE_ENDIAN)
240	u16 itt;
241#define ISCSI_CMD_REQUEST_INDEX (0x3FFF<<0)
242#define ISCSI_CMD_REQUEST_INDEX_SHIFT 0
243#define ISCSI_CMD_REQUEST_TYPE (0x3<<14)
244#define ISCSI_CMD_REQUEST_TYPE_SHIFT 14
245	u16 reserved2;
246#endif
247	u32 total_data_transfer_length;
248	u32 cmd_sn;
249	u32 reserved3;
250	u32 cdb[4];
251	u32 zero_fill;
252	u32 bd_list_addr_lo;
253	u32 bd_list_addr_hi;
254#if defined(__BIG_ENDIAN)
255	u8 cq_index;
256	u8 sd_start_bd_index;
257	u8 ud_start_bd_index;
258	u8 num_bds;
259#elif defined(__LITTLE_ENDIAN)
260	u8 num_bds;
261	u8 ud_start_bd_index;
262	u8 sd_start_bd_index;
263	u8 cq_index;
264#endif
265};
266
267
268/*
269 * task statistics for write response
270 */
271struct bnx2i_write_resp_task_stat {
272#if defined(__BIG_ENDIAN)
273	u16 num_r2ts;
274	u16 num_data_outs;
275#elif defined(__LITTLE_ENDIAN)
276	u16 num_data_outs;
277	u16 num_r2ts;
278#endif
279};
280
281/*
282 * task statistics for read response
283 */
284struct bnx2i_read_resp_task_stat {
285#if defined(__BIG_ENDIAN)
286	u16 reserved;
287	u16 num_data_ins;
288#elif defined(__LITTLE_ENDIAN)
289	u16 num_data_ins;
290	u16 reserved;
291#endif
292};
293
294/*
295 * task statistics for iSCSI cmd response
296 */
297union bnx2i_cmd_resp_task_stat {
298	struct bnx2i_write_resp_task_stat write_stat;
299	struct bnx2i_read_resp_task_stat read_stat;
300};
301
302/*
303 * SCSI Command CQE
304 */
305struct bnx2i_cmd_response {
306#if defined(__BIG_ENDIAN)
307	u8 op_code;
308	u8 response_flags;
309#define ISCSI_CMD_RESPONSE_RESERVED0 (0x1<<0)
310#define ISCSI_CMD_RESPONSE_RESERVED0_SHIFT 0
311#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW (0x1<<1)
312#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW_SHIFT 1
313#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW (0x1<<2)
314#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW_SHIFT 2
315#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW (0x1<<3)
316#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW_SHIFT 3
317#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW (0x1<<4)
318#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW_SHIFT 4
319#define ISCSI_CMD_RESPONSE_RESERVED1 (0x7<<5)
320#define ISCSI_CMD_RESPONSE_RESERVED1_SHIFT 5
321	u8 response;
322	u8 status;
323#elif defined(__LITTLE_ENDIAN)
324	u8 status;
325	u8 response;
326	u8 response_flags;
327#define ISCSI_CMD_RESPONSE_RESERVED0 (0x1<<0)
328#define ISCSI_CMD_RESPONSE_RESERVED0_SHIFT 0
329#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW (0x1<<1)
330#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW_SHIFT 1
331#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW (0x1<<2)
332#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW_SHIFT 2
333#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW (0x1<<3)
334#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW_SHIFT 3
335#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW (0x1<<4)
336#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW_SHIFT 4
337#define ISCSI_CMD_RESPONSE_RESERVED1 (0x7<<5)
338#define ISCSI_CMD_RESPONSE_RESERVED1_SHIFT 5
339	u8 op_code;
340#endif
341	u32 data_length;
342	u32 exp_cmd_sn;
343	u32 max_cmd_sn;
344	u32 reserved2;
345	u32 residual_count;
346#if defined(__BIG_ENDIAN)
347	u16 reserved4;
348	u8 err_code;
349	u8 reserved3;
350#elif defined(__LITTLE_ENDIAN)
351	u8 reserved3;
352	u8 err_code;
353	u16 reserved4;
354#endif
355	u32 reserved5[5];
356	union bnx2i_cmd_resp_task_stat task_stat;
357	u32 reserved6;
358#if defined(__BIG_ENDIAN)
359	u16 reserved7;
360	u16 itt;
361#define ISCSI_CMD_RESPONSE_INDEX (0x3FFF<<0)
362#define ISCSI_CMD_RESPONSE_INDEX_SHIFT 0
363#define ISCSI_CMD_RESPONSE_TYPE (0x3<<14)
364#define ISCSI_CMD_RESPONSE_TYPE_SHIFT 14
365#elif defined(__LITTLE_ENDIAN)
366	u16 itt;
367#define ISCSI_CMD_RESPONSE_INDEX (0x3FFF<<0)
368#define ISCSI_CMD_RESPONSE_INDEX_SHIFT 0
369#define ISCSI_CMD_RESPONSE_TYPE (0x3<<14)
370#define ISCSI_CMD_RESPONSE_TYPE_SHIFT 14
371	u16 reserved7;
372#endif
373	u32 cq_req_sn;
374};
375
376
377
378/*
379 * firmware middle-path request SQ WQE
380 */
381struct bnx2i_fw_mp_request {
382#if defined(__BIG_ENDIAN)
383	u8 op_code;
384	u8 op_attr;
385	u16 hdr_opaque1;
386#elif defined(__LITTLE_ENDIAN)
387	u16 hdr_opaque1;
388	u8 op_attr;
389	u8 op_code;
390#endif
391	u32 data_length;
392	u32 hdr_opaque2[2];
393#if defined(__BIG_ENDIAN)
394	u16 reserved0;
395	u16 itt;
396#define ISCSI_FW_MP_REQUEST_INDEX (0x3FFF<<0)
397#define ISCSI_FW_MP_REQUEST_INDEX_SHIFT 0
398#define ISCSI_FW_MP_REQUEST_TYPE (0x3<<14)
399#define ISCSI_FW_MP_REQUEST_TYPE_SHIFT 14
400#elif defined(__LITTLE_ENDIAN)
401	u16 itt;
402#define ISCSI_FW_MP_REQUEST_INDEX (0x3FFF<<0)
403#define ISCSI_FW_MP_REQUEST_INDEX_SHIFT 0
404#define ISCSI_FW_MP_REQUEST_TYPE (0x3<<14)
405#define ISCSI_FW_MP_REQUEST_TYPE_SHIFT 14
406	u16 reserved0;
407#endif
408	u32 hdr_opaque3[4];
409	u32 resp_bd_list_addr_lo;
410	u32 resp_bd_list_addr_hi;
411	u32 resp_buffer;
412#define ISCSI_FW_MP_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0)
413#define ISCSI_FW_MP_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0
414#define ISCSI_FW_MP_REQUEST_NUM_RESP_BDS (0xFF<<24)
415#define ISCSI_FW_MP_REQUEST_NUM_RESP_BDS_SHIFT 24
416#if defined(__BIG_ENDIAN)
417	u16 reserved4;
418	u8 reserved3;
419	u8 flags;
420#define ISCSI_FW_MP_REQUEST_RESERVED1 (0x1<<0)
421#define ISCSI_FW_MP_REQUEST_RESERVED1_SHIFT 0
422#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION (0x1<<1)
423#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION_SHIFT 1
424#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2)
425#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2
426#define ISCSI_FW_MP_REQUEST_RESERVED2 (0x1F<<3)
427#define ISCSI_FW_MP_REQUEST_RESERVED2_SHIFT 3
428#elif defined(__LITTLE_ENDIAN)
429	u8 flags;
430#define ISCSI_FW_MP_REQUEST_RESERVED1 (0x1<<0)
431#define ISCSI_FW_MP_REQUEST_RESERVED1_SHIFT 0
432#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION (0x1<<1)
433#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION_SHIFT 1
434#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2)
435#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2
436#define ISCSI_FW_MP_REQUEST_RESERVED2 (0x1F<<3)
437#define ISCSI_FW_MP_REQUEST_RESERVED2_SHIFT 3
438	u8 reserved3;
439	u16 reserved4;
440#endif
441	u32 bd_list_addr_lo;
442	u32 bd_list_addr_hi;
443#if defined(__BIG_ENDIAN)
444	u8 cq_index;
445	u8 reserved6;
446	u8 reserved5;
447	u8 num_bds;
448#elif defined(__LITTLE_ENDIAN)
449	u8 num_bds;
450	u8 reserved5;
451	u8 reserved6;
452	u8 cq_index;
453#endif
454};
455
456
457/*
458 * firmware response - CQE: used only by firmware
459 */
460struct bnx2i_fw_response {
461	u32 hdr_dword1[2];
462	u32 hdr_exp_cmd_sn;
463	u32 hdr_max_cmd_sn;
464	u32 hdr_ttt;
465	u32 hdr_res_cnt;
466	u32 cqe_flags;
467#define ISCSI_FW_RESPONSE_RESERVED2 (0xFF<<0)
468#define ISCSI_FW_RESPONSE_RESERVED2_SHIFT 0
469#define ISCSI_FW_RESPONSE_ERR_CODE (0xFF<<8)
470#define ISCSI_FW_RESPONSE_ERR_CODE_SHIFT 8
471#define ISCSI_FW_RESPONSE_RESERVED3 (0xFFFF<<16)
472#define ISCSI_FW_RESPONSE_RESERVED3_SHIFT 16
473	u32 stat_sn;
474	u32 hdr_dword2[2];
475	u32 hdr_dword3[2];
476	u32 task_stat;
477	u32 reserved0;
478	u32 hdr_itt;
479	u32 cq_req_sn;
480};
481
482
483/*
484 * iSCSI KCQ CQE parameters
485 */
486union iscsi_kcqe_params {
487	u32 reserved0[4];
488};
489
490/*
491 * iSCSI KCQ CQE
492 */
493struct iscsi_kcqe {
494	u32 iscsi_conn_id;
495	u32 completion_status;
496	u32 iscsi_conn_context_id;
497	union iscsi_kcqe_params params;
498#if defined(__BIG_ENDIAN)
499	u8 flags;
500#define ISCSI_KCQE_RESERVED0 (0xF<<0)
501#define ISCSI_KCQE_RESERVED0_SHIFT 0
502#define ISCSI_KCQE_LAYER_CODE (0x7<<4)
503#define ISCSI_KCQE_LAYER_CODE_SHIFT 4
504#define ISCSI_KCQE_RESERVED1 (0x1<<7)
505#define ISCSI_KCQE_RESERVED1_SHIFT 7
506	u8 op_code;
507	u16 qe_self_seq;
508#elif defined(__LITTLE_ENDIAN)
509	u16 qe_self_seq;
510	u8 op_code;
511	u8 flags;
512#define ISCSI_KCQE_RESERVED0 (0xF<<0)
513#define ISCSI_KCQE_RESERVED0_SHIFT 0
514#define ISCSI_KCQE_LAYER_CODE (0x7<<4)
515#define ISCSI_KCQE_LAYER_CODE_SHIFT 4
516#define ISCSI_KCQE_RESERVED1 (0x1<<7)
517#define ISCSI_KCQE_RESERVED1_SHIFT 7
518#endif
519};
520
521
522
523/*
524 * iSCSI KWQE header
525 */
526struct iscsi_kwqe_header {
527#if defined(__BIG_ENDIAN)
528	u8 flags;
529#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0)
530#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0
531#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4)
532#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4
533#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7)
534#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7
535	u8 op_code;
536#elif defined(__LITTLE_ENDIAN)
537	u8 op_code;
538	u8 flags;
539#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0)
540#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0
541#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4)
542#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4
543#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7)
544#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7
545#endif
546};
547
548/*
549 * iSCSI firmware init request 1
550 */
551struct iscsi_kwqe_init1 {
552#if defined(__BIG_ENDIAN)
553	struct iscsi_kwqe_header hdr;
554	u8 reserved0;
555	u8 num_cqs;
556#elif defined(__LITTLE_ENDIAN)
557	u8 num_cqs;
558	u8 reserved0;
559	struct iscsi_kwqe_header hdr;
560#endif
561	u32 dummy_buffer_addr_lo;
562	u32 dummy_buffer_addr_hi;
563#if defined(__BIG_ENDIAN)
564	u16 num_ccells_per_conn;
565	u16 num_tasks_per_conn;
566#elif defined(__LITTLE_ENDIAN)
567	u16 num_tasks_per_conn;
568	u16 num_ccells_per_conn;
569#endif
570#if defined(__BIG_ENDIAN)
571	u16 sq_wqes_per_page;
572	u16 sq_num_wqes;
573#elif defined(__LITTLE_ENDIAN)
574	u16 sq_num_wqes;
575	u16 sq_wqes_per_page;
576#endif
577#if defined(__BIG_ENDIAN)
578	u8 cq_log_wqes_per_page;
579	u8 flags;
580#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0)
581#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0
582#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4)
583#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4
584#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5)
585#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5
586#define ISCSI_KWQE_INIT1_TIME_STAMPS_ENABLE (0x1<<6)
587#define ISCSI_KWQE_INIT1_TIME_STAMPS_ENABLE_SHIFT 6
588#define ISCSI_KWQE_INIT1_RESERVED1 (0x1<<7)
589#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 7
590	u16 cq_num_wqes;
591#elif defined(__LITTLE_ENDIAN)
592	u16 cq_num_wqes;
593	u8 flags;
594#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0)
595#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0
596#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4)
597#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4
598#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5)
599#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5
600#define ISCSI_KWQE_INIT1_TIME_STAMPS_ENABLE (0x1<<6)
601#define ISCSI_KWQE_INIT1_TIME_STAMPS_ENABLE_SHIFT 6
602#define ISCSI_KWQE_INIT1_RESERVED1 (0x1<<7)
603#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 7
604	u8 cq_log_wqes_per_page;
605#endif
606#if defined(__BIG_ENDIAN)
607	u16 cq_num_pages;
608	u16 sq_num_pages;
609#elif defined(__LITTLE_ENDIAN)
610	u16 sq_num_pages;
611	u16 cq_num_pages;
612#endif
613#if defined(__BIG_ENDIAN)
614	u16 rq_buffer_size;
615	u16 rq_num_wqes;
616#elif defined(__LITTLE_ENDIAN)
617	u16 rq_num_wqes;
618	u16 rq_buffer_size;
619#endif
620};
621
622/*
623 * iSCSI firmware init request 2
624 */
625struct iscsi_kwqe_init2 {
626#if defined(__BIG_ENDIAN)
627	struct iscsi_kwqe_header hdr;
628	u16 max_cq_sqn;
629#elif defined(__LITTLE_ENDIAN)
630	u16 max_cq_sqn;
631	struct iscsi_kwqe_header hdr;
632#endif
633	u32 error_bit_map[2];
634	u32 reserved1[5];
635};
636
637/*
638 * Initial iSCSI connection offload request 1
639 */
640struct iscsi_kwqe_conn_offload1 {
641#if defined(__BIG_ENDIAN)
642	struct iscsi_kwqe_header hdr;
643	u16 iscsi_conn_id;
644#elif defined(__LITTLE_ENDIAN)
645	u16 iscsi_conn_id;
646	struct iscsi_kwqe_header hdr;
647#endif
648	u32 sq_page_table_addr_lo;
649	u32 sq_page_table_addr_hi;
650	u32 cq_page_table_addr_lo;
651	u32 cq_page_table_addr_hi;
652	u32 reserved0[3];
653};
654
655/*
656 * iSCSI Page Table Entry (PTE)
657 */
658struct iscsi_pte {
659	u32 hi;
660	u32 lo;
661};
662
663/*
664 * Initial iSCSI connection offload request 2
665 */
666struct iscsi_kwqe_conn_offload2 {
667#if defined(__BIG_ENDIAN)
668	struct iscsi_kwqe_header hdr;
669	u16 reserved0;
670#elif defined(__LITTLE_ENDIAN)
671	u16 reserved0;
672	struct iscsi_kwqe_header hdr;
673#endif
674	u32 rq_page_table_addr_lo;
675	u32 rq_page_table_addr_hi;
676	struct iscsi_pte sq_first_pte;
677	struct iscsi_pte cq_first_pte;
678	u32 num_additional_wqes;
679};
680
681
682/*
683 * Initial iSCSI connection offload request 3
684 */
685struct iscsi_kwqe_conn_offload3 {
686#if defined(__BIG_ENDIAN)
687	struct iscsi_kwqe_header hdr;
688	u16 reserved0;
689#elif defined(__LITTLE_ENDIAN)
690	u16 reserved0;
691	struct iscsi_kwqe_header hdr;
692#endif
693	u32 reserved1;
694	struct iscsi_pte qp_first_pte[3];
695};
696
697
698/*
699 * iSCSI connection update request
700 */
701struct iscsi_kwqe_conn_update {
702#if defined(__BIG_ENDIAN)
703	struct iscsi_kwqe_header hdr;
704	u16 reserved0;
705#elif defined(__LITTLE_ENDIAN)
706	u16 reserved0;
707	struct iscsi_kwqe_header hdr;
708#endif
709#if defined(__BIG_ENDIAN)
710	u8 session_error_recovery_level;
711	u8 max_outstanding_r2ts;
712	u8 reserved2;
713	u8 conn_flags;
714#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0)
715#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0
716#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1)
717#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1
718#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2)
719#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2
720#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3)
721#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3
722#define ISCSI_KWQE_CONN_UPDATE_OOO_SUPPORT_MODE (0x3<<4)
723#define ISCSI_KWQE_CONN_UPDATE_OOO_SUPPORT_MODE_SHIFT 4
724#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0x3<<6)
725#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 6
726#elif defined(__LITTLE_ENDIAN)
727	u8 conn_flags;
728#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0)
729#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0
730#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1)
731#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1
732#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2)
733#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2
734#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3)
735#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3
736#define ISCSI_KWQE_CONN_UPDATE_OOO_SUPPORT_MODE (0x3<<4)
737#define ISCSI_KWQE_CONN_UPDATE_OOO_SUPPORT_MODE_SHIFT 4
738#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0x3<<6)
739#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 6
740	u8 reserved2;
741	u8 max_outstanding_r2ts;
742	u8 session_error_recovery_level;
743#endif
744	u32 context_id;
745	u32 max_send_pdu_length;
746	u32 max_recv_pdu_length;
747	u32 first_burst_length;
748	u32 max_burst_length;
749	u32 exp_stat_sn;
750};
751
752/*
753 * iSCSI destroy connection request
754 */
755struct iscsi_kwqe_conn_destroy {
756#if defined(__BIG_ENDIAN)
757	struct iscsi_kwqe_header hdr;
758	u16 reserved0;
759#elif defined(__LITTLE_ENDIAN)
760	u16 reserved0;
761	struct iscsi_kwqe_header hdr;
762#endif
763	u32 context_id;
764	u32 reserved1[6];
765};
766
767/*
768 * iSCSI KWQ WQE
769 */
770union iscsi_kwqe {
771	struct iscsi_kwqe_init1 init1;
772	struct iscsi_kwqe_init2 init2;
773	struct iscsi_kwqe_conn_offload1 conn_offload1;
774	struct iscsi_kwqe_conn_offload2 conn_offload2;
775	struct iscsi_kwqe_conn_update conn_update;
776	struct iscsi_kwqe_conn_destroy conn_destroy;
777};
778
779/*
780 * iSCSI Login SQ WQE
781 */
782struct bnx2i_login_request {
783#if defined(__BIG_ENDIAN)
784	u8 op_code;
785	u8 op_attr;
786#define ISCSI_LOGIN_REQUEST_NEXT_STAGE (0x3<<0)
787#define ISCSI_LOGIN_REQUEST_NEXT_STAGE_SHIFT 0
788#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE (0x3<<2)
789#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE_SHIFT 2
790#define ISCSI_LOGIN_REQUEST_RESERVED0 (0x3<<4)
791#define ISCSI_LOGIN_REQUEST_RESERVED0_SHIFT 4
792#define ISCSI_LOGIN_REQUEST_CONT (0x1<<6)
793#define ISCSI_LOGIN_REQUEST_CONT_SHIFT 6
794#define ISCSI_LOGIN_REQUEST_TRANSIT (0x1<<7)
795#define ISCSI_LOGIN_REQUEST_TRANSIT_SHIFT 7
796	u8 version_max;
797	u8 version_min;
798#elif defined(__LITTLE_ENDIAN)
799	u8 version_min;
800	u8 version_max;
801	u8 op_attr;
802#define ISCSI_LOGIN_REQUEST_NEXT_STAGE (0x3<<0)
803#define ISCSI_LOGIN_REQUEST_NEXT_STAGE_SHIFT 0
804#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE (0x3<<2)
805#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE_SHIFT 2
806#define ISCSI_LOGIN_REQUEST_RESERVED0 (0x3<<4)
807#define ISCSI_LOGIN_REQUEST_RESERVED0_SHIFT 4
808#define ISCSI_LOGIN_REQUEST_CONT (0x1<<6)
809#define ISCSI_LOGIN_REQUEST_CONT_SHIFT 6
810#define ISCSI_LOGIN_REQUEST_TRANSIT (0x1<<7)
811#define ISCSI_LOGIN_REQUEST_TRANSIT_SHIFT 7
812	u8 op_code;
813#endif
814	u32 data_length;
815	u32 isid_lo;
816#if defined(__BIG_ENDIAN)
817	u16 isid_hi;
818	u16 tsih;
819#elif defined(__LITTLE_ENDIAN)
820	u16 tsih;
821	u16 isid_hi;
822#endif
823#if defined(__BIG_ENDIAN)
824	u16 reserved2;
825	u16 itt;
826#define ISCSI_LOGIN_REQUEST_INDEX (0x3FFF<<0)
827#define ISCSI_LOGIN_REQUEST_INDEX_SHIFT 0
828#define ISCSI_LOGIN_REQUEST_TYPE (0x3<<14)
829#define ISCSI_LOGIN_REQUEST_TYPE_SHIFT 14
830#elif defined(__LITTLE_ENDIAN)
831	u16 itt;
832#define ISCSI_LOGIN_REQUEST_INDEX (0x3FFF<<0)
833#define ISCSI_LOGIN_REQUEST_INDEX_SHIFT 0
834#define ISCSI_LOGIN_REQUEST_TYPE (0x3<<14)
835#define ISCSI_LOGIN_REQUEST_TYPE_SHIFT 14
836	u16 reserved2;
837#endif
838#if defined(__BIG_ENDIAN)
839	u16 cid;
840	u16 reserved3;
841#elif defined(__LITTLE_ENDIAN)
842	u16 reserved3;
843	u16 cid;
844#endif
845	u32 cmd_sn;
846	u32 exp_stat_sn;
847	u32 reserved4;
848	u32 resp_bd_list_addr_lo;
849	u32 resp_bd_list_addr_hi;
850	u32 resp_buffer;
851#define ISCSI_LOGIN_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0)
852#define ISCSI_LOGIN_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0
853#define ISCSI_LOGIN_REQUEST_NUM_RESP_BDS (0xFF<<24)
854#define ISCSI_LOGIN_REQUEST_NUM_RESP_BDS_SHIFT 24
855#if defined(__BIG_ENDIAN)
856	u16 reserved8;
857	u8 reserved7;
858	u8 flags;
859#define ISCSI_LOGIN_REQUEST_RESERVED5 (0x3<<0)
860#define ISCSI_LOGIN_REQUEST_RESERVED5_SHIFT 0
861#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2)
862#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2
863#define ISCSI_LOGIN_REQUEST_RESERVED6 (0x1F<<3)
864#define ISCSI_LOGIN_REQUEST_RESERVED6_SHIFT 3
865#elif defined(__LITTLE_ENDIAN)
866	u8 flags;
867#define ISCSI_LOGIN_REQUEST_RESERVED5 (0x3<<0)
868#define ISCSI_LOGIN_REQUEST_RESERVED5_SHIFT 0
869#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2)
870#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2
871#define ISCSI_LOGIN_REQUEST_RESERVED6 (0x1F<<3)
872#define ISCSI_LOGIN_REQUEST_RESERVED6_SHIFT 3
873	u8 reserved7;
874	u16 reserved8;
875#endif
876	u32 bd_list_addr_lo;
877	u32 bd_list_addr_hi;
878#if defined(__BIG_ENDIAN)
879	u8 cq_index;
880	u8 reserved10;
881	u8 reserved9;
882	u8 num_bds;
883#elif defined(__LITTLE_ENDIAN)
884	u8 num_bds;
885	u8 reserved9;
886	u8 reserved10;
887	u8 cq_index;
888#endif
889};
890
891
892/*
893 * iSCSI Login CQE
894 */
895struct bnx2i_login_response {
896#if defined(__BIG_ENDIAN)
897	u8 op_code;
898	u8 response_flags;
899#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE (0x3<<0)
900#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE_SHIFT 0
901#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE (0x3<<2)
902#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE_SHIFT 2
903#define ISCSI_LOGIN_RESPONSE_RESERVED0 (0x3<<4)
904#define ISCSI_LOGIN_RESPONSE_RESERVED0_SHIFT 4
905#define ISCSI_LOGIN_RESPONSE_CONT (0x1<<6)
906#define ISCSI_LOGIN_RESPONSE_CONT_SHIFT 6
907#define ISCSI_LOGIN_RESPONSE_TRANSIT (0x1<<7)
908#define ISCSI_LOGIN_RESPONSE_TRANSIT_SHIFT 7
909	u8 version_max;
910	u8 version_active;
911#elif defined(__LITTLE_ENDIAN)
912	u8 version_active;
913	u8 version_max;
914	u8 response_flags;
915#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE (0x3<<0)
916#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE_SHIFT 0
917#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE (0x3<<2)
918#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE_SHIFT 2
919#define ISCSI_LOGIN_RESPONSE_RESERVED0 (0x3<<4)
920#define ISCSI_LOGIN_RESPONSE_RESERVED0_SHIFT 4
921#define ISCSI_LOGIN_RESPONSE_CONT (0x1<<6)
922#define ISCSI_LOGIN_RESPONSE_CONT_SHIFT 6
923#define ISCSI_LOGIN_RESPONSE_TRANSIT (0x1<<7)
924#define ISCSI_LOGIN_RESPONSE_TRANSIT_SHIFT 7
925	u8 op_code;
926#endif
927	u32 data_length;
928	u32 exp_cmd_sn;
929	u32 max_cmd_sn;
930	u32 reserved1[2];
931#if defined(__BIG_ENDIAN)
932	u16 reserved3;
933	u8 err_code;
934	u8 reserved2;
935#elif defined(__LITTLE_ENDIAN)
936	u8 reserved2;
937	u8 err_code;
938	u16 reserved3;
939#endif
940	u32 stat_sn;
941	u32 isid_lo;
942#if defined(__BIG_ENDIAN)
943	u16 isid_hi;
944	u16 tsih;
945#elif defined(__LITTLE_ENDIAN)
946	u16 tsih;
947	u16 isid_hi;
948#endif
949#if defined(__BIG_ENDIAN)
950	u8 status_class;
951	u8 status_detail;
952	u16 reserved4;
953#elif defined(__LITTLE_ENDIAN)
954	u16 reserved4;
955	u8 status_detail;
956	u8 status_class;
957#endif
958	u32 reserved5[3];
959#if defined(__BIG_ENDIAN)
960	u16 reserved6;
961	u16 itt;
962#define ISCSI_LOGIN_RESPONSE_INDEX (0x3FFF<<0)
963#define ISCSI_LOGIN_RESPONSE_INDEX_SHIFT 0
964#define ISCSI_LOGIN_RESPONSE_TYPE (0x3<<14)
965#define ISCSI_LOGIN_RESPONSE_TYPE_SHIFT 14
966#elif defined(__LITTLE_ENDIAN)
967	u16 itt;
968#define ISCSI_LOGIN_RESPONSE_INDEX (0x3FFF<<0)
969#define ISCSI_LOGIN_RESPONSE_INDEX_SHIFT 0
970#define ISCSI_LOGIN_RESPONSE_TYPE (0x3<<14)
971#define ISCSI_LOGIN_RESPONSE_TYPE_SHIFT 14
972	u16 reserved6;
973#endif
974	u32 cq_req_sn;
975};
976
977
978/*
979 * iSCSI Logout SQ WQE
980 */
981struct bnx2i_logout_request {
982#if defined(__BIG_ENDIAN)
983	u8 op_code;
984	u8 op_attr;
985#define ISCSI_LOGOUT_REQUEST_REASON (0x7F<<0)
986#define ISCSI_LOGOUT_REQUEST_REASON_SHIFT 0
987#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE (0x1<<7)
988#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE_SHIFT 7
989	u16 reserved0;
990#elif defined(__LITTLE_ENDIAN)
991	u16 reserved0;
992	u8 op_attr;
993#define ISCSI_LOGOUT_REQUEST_REASON (0x7F<<0)
994#define ISCSI_LOGOUT_REQUEST_REASON_SHIFT 0
995#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE (0x1<<7)
996#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE_SHIFT 7
997	u8 op_code;
998#endif
999	u32 data_length;
1000	u32 reserved1[2];
1001#if defined(__BIG_ENDIAN)
1002	u16 reserved2;
1003	u16 itt;
1004#define ISCSI_LOGOUT_REQUEST_INDEX (0x3FFF<<0)
1005#define ISCSI_LOGOUT_REQUEST_INDEX_SHIFT 0
1006#define ISCSI_LOGOUT_REQUEST_TYPE (0x3<<14)
1007#define ISCSI_LOGOUT_REQUEST_TYPE_SHIFT 14
1008#elif defined(__LITTLE_ENDIAN)
1009	u16 itt;
1010#define ISCSI_LOGOUT_REQUEST_INDEX (0x3FFF<<0)
1011#define ISCSI_LOGOUT_REQUEST_INDEX_SHIFT 0
1012#define ISCSI_LOGOUT_REQUEST_TYPE (0x3<<14)
1013#define ISCSI_LOGOUT_REQUEST_TYPE_SHIFT 14
1014	u16 reserved2;
1015#endif
1016#if defined(__BIG_ENDIAN)
1017	u16 cid;
1018	u16 reserved3;
1019#elif defined(__LITTLE_ENDIAN)
1020	u16 reserved3;
1021	u16 cid;
1022#endif
1023	u32 cmd_sn;
1024	u32 reserved4[5];
1025	u32 zero_fill;
1026	u32 bd_list_addr_lo;
1027	u32 bd_list_addr_hi;
1028#if defined(__BIG_ENDIAN)
1029	u8 cq_index;
1030	u8 reserved6;
1031	u8 reserved5;
1032	u8 num_bds;
1033#elif defined(__LITTLE_ENDIAN)
1034	u8 num_bds;
1035	u8 reserved5;
1036	u8 reserved6;
1037	u8 cq_index;
1038#endif
1039};
1040
1041
1042/*
1043 * iSCSI Logout CQE
1044 */
1045struct bnx2i_logout_response {
1046#if defined(__BIG_ENDIAN)
1047	u8 op_code;
1048	u8 reserved1;
1049	u8 response;
1050	u8 reserved0;
1051#elif defined(__LITTLE_ENDIAN)
1052	u8 reserved0;
1053	u8 response;
1054	u8 reserved1;
1055	u8 op_code;
1056#endif
1057	u32 reserved2;
1058	u32 exp_cmd_sn;
1059	u32 max_cmd_sn;
1060	u32 reserved3[2];
1061#if defined(__BIG_ENDIAN)
1062	u16 reserved5;
1063	u8 err_code;
1064	u8 reserved4;
1065#elif defined(__LITTLE_ENDIAN)
1066	u8 reserved4;
1067	u8 err_code;
1068	u16 reserved5;
1069#endif
1070	u32 reserved6[3];
1071#if defined(__BIG_ENDIAN)
1072	u16 time_to_wait;
1073	u16 time_to_retain;
1074#elif defined(__LITTLE_ENDIAN)
1075	u16 time_to_retain;
1076	u16 time_to_wait;
1077#endif
1078	u32 reserved7[3];
1079#if defined(__BIG_ENDIAN)
1080	u16 reserved8;
1081	u16 itt;
1082#define ISCSI_LOGOUT_RESPONSE_INDEX (0x3FFF<<0)
1083#define ISCSI_LOGOUT_RESPONSE_INDEX_SHIFT 0
1084#define ISCSI_LOGOUT_RESPONSE_TYPE (0x3<<14)
1085#define ISCSI_LOGOUT_RESPONSE_TYPE_SHIFT 14
1086#elif defined(__LITTLE_ENDIAN)
1087	u16 itt;
1088#define ISCSI_LOGOUT_RESPONSE_INDEX (0x3FFF<<0)
1089#define ISCSI_LOGOUT_RESPONSE_INDEX_SHIFT 0
1090#define ISCSI_LOGOUT_RESPONSE_TYPE (0x3<<14)
1091#define ISCSI_LOGOUT_RESPONSE_TYPE_SHIFT 14
1092	u16 reserved8;
1093#endif
1094	u32 cq_req_sn;
1095};
1096
1097
1098/*
1099 * iSCSI Nop-In CQE
1100 */
1101struct bnx2i_nop_in_msg {
1102#if defined(__BIG_ENDIAN)
1103	u8 op_code;
1104	u8 reserved1;
1105	u16 reserved0;
1106#elif defined(__LITTLE_ENDIAN)
1107	u16 reserved0;
1108	u8 reserved1;
1109	u8 op_code;
1110#endif
1111	u32 data_length;
1112	u32 exp_cmd_sn;
1113	u32 max_cmd_sn;
1114	u32 ttt;
1115	u32 reserved2;
1116#if defined(__BIG_ENDIAN)
1117	u16 reserved4;
1118	u8 err_code;
1119	u8 reserved3;
1120#elif defined(__LITTLE_ENDIAN)
1121	u8 reserved3;
1122	u8 err_code;
1123	u16 reserved4;
1124#endif
1125	u32 reserved5;
1126	u32 lun[2];
1127	u32 reserved6[4];
1128#if defined(__BIG_ENDIAN)
1129	u16 reserved7;
1130	u16 itt;
1131#define ISCSI_NOP_IN_MSG_INDEX (0x3FFF<<0)
1132#define ISCSI_NOP_IN_MSG_INDEX_SHIFT 0
1133#define ISCSI_NOP_IN_MSG_TYPE (0x3<<14)
1134#define ISCSI_NOP_IN_MSG_TYPE_SHIFT 14
1135#elif defined(__LITTLE_ENDIAN)
1136	u16 itt;
1137#define ISCSI_NOP_IN_MSG_INDEX (0x3FFF<<0)
1138#define ISCSI_NOP_IN_MSG_INDEX_SHIFT 0
1139#define ISCSI_NOP_IN_MSG_TYPE (0x3<<14)
1140#define ISCSI_NOP_IN_MSG_TYPE_SHIFT 14
1141	u16 reserved7;
1142#endif
1143	u32 cq_req_sn;
1144};
1145
1146
1147/*
1148 * iSCSI NOP-OUT SQ WQE
1149 */
1150struct bnx2i_nop_out_request {
1151#if defined(__BIG_ENDIAN)
1152	u8 op_code;
1153	u8 op_attr;
1154#define ISCSI_NOP_OUT_REQUEST_RESERVED1 (0x7F<<0)
1155#define ISCSI_NOP_OUT_REQUEST_RESERVED1_SHIFT 0
1156#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE (0x1<<7)
1157#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE_SHIFT 7
1158	u16 reserved0;
1159#elif defined(__LITTLE_ENDIAN)
1160	u16 reserved0;
1161	u8 op_attr;
1162#define ISCSI_NOP_OUT_REQUEST_RESERVED1 (0x7F<<0)
1163#define ISCSI_NOP_OUT_REQUEST_RESERVED1_SHIFT 0
1164#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE (0x1<<7)
1165#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE_SHIFT 7
1166	u8 op_code;
1167#endif
1168	u32 data_length;
1169	u32 lun[2];
1170#if defined(__BIG_ENDIAN)
1171	u16 reserved2;
1172	u16 itt;
1173#define ISCSI_NOP_OUT_REQUEST_INDEX (0x3FFF<<0)
1174#define ISCSI_NOP_OUT_REQUEST_INDEX_SHIFT 0
1175#define ISCSI_NOP_OUT_REQUEST_TYPE (0x3<<14)
1176#define ISCSI_NOP_OUT_REQUEST_TYPE_SHIFT 14
1177#elif defined(__LITTLE_ENDIAN)
1178	u16 itt;
1179#define ISCSI_NOP_OUT_REQUEST_INDEX (0x3FFF<<0)
1180#define ISCSI_NOP_OUT_REQUEST_INDEX_SHIFT 0
1181#define ISCSI_NOP_OUT_REQUEST_TYPE (0x3<<14)
1182#define ISCSI_NOP_OUT_REQUEST_TYPE_SHIFT 14
1183	u16 reserved2;
1184#endif
1185	u32 ttt;
1186	u32 cmd_sn;
1187	u32 reserved3[2];
1188	u32 resp_bd_list_addr_lo;
1189	u32 resp_bd_list_addr_hi;
1190	u32 resp_buffer;
1191#define ISCSI_NOP_OUT_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0)
1192#define ISCSI_NOP_OUT_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0
1193#define ISCSI_NOP_OUT_REQUEST_NUM_RESP_BDS (0xFF<<24)
1194#define ISCSI_NOP_OUT_REQUEST_NUM_RESP_BDS_SHIFT 24
1195#if defined(__BIG_ENDIAN)
1196	u16 reserved7;
1197	u8 reserved6;
1198	u8 flags;
1199#define ISCSI_NOP_OUT_REQUEST_RESERVED4 (0x1<<0)
1200#define ISCSI_NOP_OUT_REQUEST_RESERVED4_SHIFT 0
1201#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION (0x1<<1)
1202#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION_SHIFT 1
1203#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL (0x3F<<2)
1204#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL_SHIFT 2
1205#elif defined(__LITTLE_ENDIAN)
1206	u8 flags;
1207#define ISCSI_NOP_OUT_REQUEST_RESERVED4 (0x1<<0)
1208#define ISCSI_NOP_OUT_REQUEST_RESERVED4_SHIFT 0
1209#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION (0x1<<1)
1210#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION_SHIFT 1
1211#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL (0x3F<<2)
1212#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL_SHIFT 2
1213	u8 reserved6;
1214	u16 reserved7;
1215#endif
1216	u32 bd_list_addr_lo;
1217	u32 bd_list_addr_hi;
1218#if defined(__BIG_ENDIAN)
1219	u8 cq_index;
1220	u8 reserved9;
1221	u8 reserved8;
1222	u8 num_bds;
1223#elif defined(__LITTLE_ENDIAN)
1224	u8 num_bds;
1225	u8 reserved8;
1226	u8 reserved9;
1227	u8 cq_index;
1228#endif
1229};
1230
1231/*
1232 * iSCSI Reject CQE
1233 */
1234struct bnx2i_reject_msg {
1235#if defined(__BIG_ENDIAN)
1236	u8 op_code;
1237	u8 reserved1;
1238	u8 reason;
1239	u8 reserved0;
1240#elif defined(__LITTLE_ENDIAN)
1241	u8 reserved0;
1242	u8 reason;
1243	u8 reserved1;
1244	u8 op_code;
1245#endif
1246	u32 data_length;
1247	u32 exp_cmd_sn;
1248	u32 max_cmd_sn;
1249	u32 reserved2[2];
1250#if defined(__BIG_ENDIAN)
1251	u16 reserved4;
1252	u8 err_code;
1253	u8 reserved3;
1254#elif defined(__LITTLE_ENDIAN)
1255	u8 reserved3;
1256	u8 err_code;
1257	u16 reserved4;
1258#endif
1259	u32 reserved5[8];
1260	u32 cq_req_sn;
1261};
1262
1263/*
1264 * bnx2i iSCSI TMF SQ WQE
1265 */
1266struct bnx2i_tmf_request {
1267#if defined(__BIG_ENDIAN)
1268	u8 op_code;
1269	u8 op_attr;
1270#define ISCSI_TMF_REQUEST_FUNCTION (0x7F<<0)
1271#define ISCSI_TMF_REQUEST_FUNCTION_SHIFT 0
1272#define ISCSI_TMF_REQUEST_ALWAYS_ONE (0x1<<7)
1273#define ISCSI_TMF_REQUEST_ALWAYS_ONE_SHIFT 7
1274	u16 reserved0;
1275#elif defined(__LITTLE_ENDIAN)
1276	u16 reserved0;
1277	u8 op_attr;
1278#define ISCSI_TMF_REQUEST_FUNCTION (0x7F<<0)
1279#define ISCSI_TMF_REQUEST_FUNCTION_SHIFT 0
1280#define ISCSI_TMF_REQUEST_ALWAYS_ONE (0x1<<7)
1281#define ISCSI_TMF_REQUEST_ALWAYS_ONE_SHIFT 7
1282	u8 op_code;
1283#endif
1284	u32 data_length;
1285	u32 lun[2];
1286#if defined(__BIG_ENDIAN)
1287	u16 reserved1;
1288	u16 itt;
1289#define ISCSI_TMF_REQUEST_INDEX (0x3FFF<<0)
1290#define ISCSI_TMF_REQUEST_INDEX_SHIFT 0
1291#define ISCSI_TMF_REQUEST_TYPE (0x3<<14)
1292#define ISCSI_TMF_REQUEST_TYPE_SHIFT 14
1293#elif defined(__LITTLE_ENDIAN)
1294	u16 itt;
1295#define ISCSI_TMF_REQUEST_INDEX (0x3FFF<<0)
1296#define ISCSI_TMF_REQUEST_INDEX_SHIFT 0
1297#define ISCSI_TMF_REQUEST_TYPE (0x3<<14)
1298#define ISCSI_TMF_REQUEST_TYPE_SHIFT 14
1299	u16 reserved1;
1300#endif
1301	u32 ref_itt;
1302	u32 cmd_sn;
1303	u32 reserved2;
1304	u32 ref_cmd_sn;
1305	u32 reserved3[3];
1306	u32 zero_fill;
1307	u32 bd_list_addr_lo;
1308	u32 bd_list_addr_hi;
1309#if defined(__BIG_ENDIAN)
1310	u8 cq_index;
1311	u8 reserved5;
1312	u8 reserved4;
1313	u8 num_bds;
1314#elif defined(__LITTLE_ENDIAN)
1315	u8 num_bds;
1316	u8 reserved4;
1317	u8 reserved5;
1318	u8 cq_index;
1319#endif
1320};
1321
1322/*
1323 * iSCSI Text SQ WQE
1324 */
1325struct bnx2i_text_request {
1326#if defined(__BIG_ENDIAN)
1327	u8 op_code;
1328	u8 op_attr;
1329#define ISCSI_TEXT_REQUEST_RESERVED1 (0x3F<<0)
1330#define ISCSI_TEXT_REQUEST_RESERVED1_SHIFT 0
1331#define ISCSI_TEXT_REQUEST_CONT (0x1<<6)
1332#define ISCSI_TEXT_REQUEST_CONT_SHIFT 6
1333#define ISCSI_TEXT_REQUEST_FINAL (0x1<<7)
1334#define ISCSI_TEXT_REQUEST_FINAL_SHIFT 7
1335	u16 reserved0;
1336#elif defined(__LITTLE_ENDIAN)
1337	u16 reserved0;
1338	u8 op_attr;
1339#define ISCSI_TEXT_REQUEST_RESERVED1 (0x3F<<0)
1340#define ISCSI_TEXT_REQUEST_RESERVED1_SHIFT 0
1341#define ISCSI_TEXT_REQUEST_CONT (0x1<<6)
1342#define ISCSI_TEXT_REQUEST_CONT_SHIFT 6
1343#define ISCSI_TEXT_REQUEST_FINAL (0x1<<7)
1344#define ISCSI_TEXT_REQUEST_FINAL_SHIFT 7
1345	u8 op_code;
1346#endif
1347	u32 data_length;
1348	u32 lun[2];
1349#if defined(__BIG_ENDIAN)
1350	u16 reserved3;
1351	u16 itt;
1352#define ISCSI_TEXT_REQUEST_INDEX (0x3FFF<<0)
1353#define ISCSI_TEXT_REQUEST_INDEX_SHIFT 0
1354#define ISCSI_TEXT_REQUEST_TYPE (0x3<<14)
1355#define ISCSI_TEXT_REQUEST_TYPE_SHIFT 14
1356#elif defined(__LITTLE_ENDIAN)
1357	u16 itt;
1358#define ISCSI_TEXT_REQUEST_INDEX (0x3FFF<<0)
1359#define ISCSI_TEXT_REQUEST_INDEX_SHIFT 0
1360#define ISCSI_TEXT_REQUEST_TYPE (0x3<<14)
1361#define ISCSI_TEXT_REQUEST_TYPE_SHIFT 14
1362	u16 reserved3;
1363#endif
1364	u32 ttt;
1365	u32 cmd_sn;
1366	u32 reserved4[2];
1367	u32 resp_bd_list_addr_lo;
1368	u32 resp_bd_list_addr_hi;
1369	u32 resp_buffer;
1370#define ISCSI_TEXT_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0)
1371#define ISCSI_TEXT_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0
1372#define ISCSI_TEXT_REQUEST_NUM_RESP_BDS (0xFF<<24)
1373#define ISCSI_TEXT_REQUEST_NUM_RESP_BDS_SHIFT 24
1374	u32 zero_fill;
1375	u32 bd_list_addr_lo;
1376	u32 bd_list_addr_hi;
1377#if defined(__BIG_ENDIAN)
1378	u8 cq_index;
1379	u8 reserved7;
1380	u8 reserved6;
1381	u8 num_bds;
1382#elif defined(__LITTLE_ENDIAN)
1383	u8 num_bds;
1384	u8 reserved6;
1385	u8 reserved7;
1386	u8 cq_index;
1387#endif
1388};
1389
1390/*
1391 * iSCSI SQ WQE
1392 */
1393union iscsi_request {
1394	struct bnx2i_cmd_request cmd;
1395	struct bnx2i_tmf_request tmf;
1396	struct bnx2i_nop_out_request nop_out;
1397	struct bnx2i_login_request login_req;
1398	struct bnx2i_text_request text;
1399	struct bnx2i_logout_request logout_req;
1400	struct bnx2i_cleanup_request cleanup;
1401};
1402
1403
1404/*
1405 * iSCSI TMF CQE
1406 */
1407struct bnx2i_tmf_response {
1408#if defined(__BIG_ENDIAN)
1409	u8 op_code;
1410	u8 reserved1;
1411	u8 response;
1412	u8 reserved0;
1413#elif defined(__LITTLE_ENDIAN)
1414	u8 reserved0;
1415	u8 response;
1416	u8 reserved1;
1417	u8 op_code;
1418#endif
1419	u32 reserved2;
1420	u32 exp_cmd_sn;
1421	u32 max_cmd_sn;
1422	u32 reserved3[2];
1423#if defined(__BIG_ENDIAN)
1424	u16 reserved5;
1425	u8 err_code;
1426	u8 reserved4;
1427#elif defined(__LITTLE_ENDIAN)
1428	u8 reserved4;
1429	u8 err_code;
1430	u16 reserved5;
1431#endif
1432	u32 reserved6[7];
1433#if defined(__BIG_ENDIAN)
1434	u16 reserved7;
1435	u16 itt;
1436#define ISCSI_TMF_RESPONSE_INDEX (0x3FFF<<0)
1437#define ISCSI_TMF_RESPONSE_INDEX_SHIFT 0
1438#define ISCSI_TMF_RESPONSE_TYPE (0x3<<14)
1439#define ISCSI_TMF_RESPONSE_TYPE_SHIFT 14
1440#elif defined(__LITTLE_ENDIAN)
1441	u16 itt;
1442#define ISCSI_TMF_RESPONSE_INDEX (0x3FFF<<0)
1443#define ISCSI_TMF_RESPONSE_INDEX_SHIFT 0
1444#define ISCSI_TMF_RESPONSE_TYPE (0x3<<14)
1445#define ISCSI_TMF_RESPONSE_TYPE_SHIFT 14
1446	u16 reserved7;
1447#endif
1448	u32 cq_req_sn;
1449};
1450
1451/*
1452 * iSCSI Text CQE
1453 */
1454struct bnx2i_text_response {
1455#if defined(__BIG_ENDIAN)
1456	u8 op_code;
1457	u8 response_flags;
1458#define ISCSI_TEXT_RESPONSE_RESERVED1 (0x3F<<0)
1459#define ISCSI_TEXT_RESPONSE_RESERVED1_SHIFT 0
1460#define ISCSI_TEXT_RESPONSE_CONT (0x1<<6)
1461#define ISCSI_TEXT_RESPONSE_CONT_SHIFT 6
1462#define ISCSI_TEXT_RESPONSE_FINAL (0x1<<7)
1463#define ISCSI_TEXT_RESPONSE_FINAL_SHIFT 7
1464	u16 reserved0;
1465#elif defined(__LITTLE_ENDIAN)
1466	u16 reserved0;
1467	u8 response_flags;
1468#define ISCSI_TEXT_RESPONSE_RESERVED1 (0x3F<<0)
1469#define ISCSI_TEXT_RESPONSE_RESERVED1_SHIFT 0
1470#define ISCSI_TEXT_RESPONSE_CONT (0x1<<6)
1471#define ISCSI_TEXT_RESPONSE_CONT_SHIFT 6
1472#define ISCSI_TEXT_RESPONSE_FINAL (0x1<<7)
1473#define ISCSI_TEXT_RESPONSE_FINAL_SHIFT 7
1474	u8 op_code;
1475#endif
1476	u32 data_length;
1477	u32 exp_cmd_sn;
1478	u32 max_cmd_sn;
1479	u32 ttt;
1480	u32 reserved2;
1481#if defined(__BIG_ENDIAN)
1482	u16 reserved4;
1483	u8 err_code;
1484	u8 reserved3;
1485#elif defined(__LITTLE_ENDIAN)
1486	u8 reserved3;
1487	u8 err_code;
1488	u16 reserved4;
1489#endif
1490	u32 reserved5;
1491	u32 lun[2];
1492	u32 reserved6[4];
1493#if defined(__BIG_ENDIAN)
1494	u16 reserved7;
1495	u16 itt;
1496#define ISCSI_TEXT_RESPONSE_INDEX (0x3FFF<<0)
1497#define ISCSI_TEXT_RESPONSE_INDEX_SHIFT 0
1498#define ISCSI_TEXT_RESPONSE_TYPE (0x3<<14)
1499#define ISCSI_TEXT_RESPONSE_TYPE_SHIFT 14
1500#elif defined(__LITTLE_ENDIAN)
1501	u16 itt;
1502#define ISCSI_TEXT_RESPONSE_INDEX (0x3FFF<<0)
1503#define ISCSI_TEXT_RESPONSE_INDEX_SHIFT 0
1504#define ISCSI_TEXT_RESPONSE_TYPE (0x3<<14)
1505#define ISCSI_TEXT_RESPONSE_TYPE_SHIFT 14
1506	u16 reserved7;
1507#endif
1508	u32 cq_req_sn;
1509};
1510
1511/*
1512 * iSCSI CQE
1513 */
1514union iscsi_response {
1515	struct bnx2i_cmd_response cmd;
1516	struct bnx2i_tmf_response tmf;
1517	struct bnx2i_login_response login_resp;
1518	struct bnx2i_text_response text;
1519	struct bnx2i_logout_response logout_resp;
1520	struct bnx2i_cleanup_response cleanup;
1521	struct bnx2i_reject_msg reject;
1522	struct bnx2i_async_msg async;
1523	struct bnx2i_nop_in_msg nop_in;
1524};
1525
1526#endif /* __57XX_ISCSI_HSI_LINUX_LE__ */
1527