1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /* Copyright 2015 QLogic Corporation */
23 
24 /*
25  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
26  */
27 
28 #ifndef	_QL_IOCB_H
29 #define	_QL_IOCB_H
30 
31 /*
32  * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
33  *
34  * ***********************************************************************
35  * *									**
36  * *				NOTICE					**
37  * *		COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION		**
38  * *			ALL RIGHTS RESERVED				**
39  * *									**
40  * ***********************************************************************
41  *
42  */
43 
44 #ifdef	__cplusplus
45 extern "C" {
46 #endif
47 
48 typedef struct ql_64bit_data_seg {
49 	uint32_t	address[2];
50 	uint32_t	length;
51 } ql_64bit_data_seg_t;
52 
53 typedef struct ql_32bit_data_seg {
54 	uint32_t	address;
55 	uint32_t	length;
56 } ql_32bit_data_seg_t;
57 
58 #define	ABORTED_ENTRY_TYPE	0
59 
60 /*
61  * ISP queue -	32-Bit DMA addressing command with extended LUN support
62  *		entry structure definition.
63  */
64 #define	IOCB_CMD_TYPE_2		0x11	/* Command entry */
65 #define	MAX_CMDSZ		16	/* SCSI maximum CDB size. */
66 #define	CMD_TYPE_2_DATA_SEGMENTS	3	/* Number of data segments. */
67 typedef struct cmd_entry {
68 	uint8_t entry_type;		/* Entry type. */
69 	uint8_t entry_count;		/* Entry count. */
70 	uint8_t sys_define;		/* System defined. */
71 	uint8_t entry_status;		/* Entry Status. */
72 	uint32_t handle;		/* System handle */
73 	uint8_t target_l;		/* SCSI ID - LSB */
74 	uint8_t target_h;		/* SCSI ID - MSB */
75 	uint8_t lun_l;			/* SCSI LUN - LSB */
76 	uint8_t lun_h;			/* SCSI LUN - MSB */
77 	uint8_t control_flags_l;	/* Control flags - LSB. */
78 	uint8_t control_flags_h;	/* Control flags - MSB. */
79 	uint8_t reserved_1[2];
80 	uint16_t timeout;		/* Command timeout. */
81 	uint16_t dseg_count;		/* Data segment count - LSB. */
82 	uint8_t scsi_cdb[MAX_CMDSZ];	/* SCSI command words. */
83 	uint32_t byte_count;		/* Total byte count. */
84 	ql_32bit_data_seg_t	dseg[3];	/* Data segments. */
85 } cmd_entry_t, request_t;
86 
87 /*
88  * Command entry control flags least significant byte.
89  */
90 #define	CF_HTAG		BIT_1
91 #define	CF_OTAG		BIT_2
92 #define	CF_STAG		BIT_3
93 #define	CF_DATA_IN	BIT_5
94 #define	CF_DATA_OUT	BIT_6
95 
96 /*
97  * ISP24xx queue - Command IOCB structure definition.
98  */
99 #define	IOCB_CMD_TYPE_7		0x18
100 #define	CMD_TYPE_7_DATA_SEGMENTS 1	/* Number of 64 bit data segments. */
101 typedef struct cmd7_24xx_entry {
102 	uint8_t entry_type;		/* Entry type. */
103 	uint8_t entry_count;		/* Entry count. */
104 	uint8_t sys_define;		/* System defined. */
105 	uint8_t entry_status;		/* Entry Status. */
106 	uint32_t handle;		/* System handle */
107 	uint16_t n_port_hdl;
108 	uint16_t timeout;		/* Command timeout. */
109 	uint16_t dseg_count;
110 	uint8_t reserved_1[2];
111 	uint8_t fcp_lun[8];		/* SCSI LUN ID. */
112 	uint8_t control_flags;
113 	uint8_t task_mgmt;		/* Task management flags. */
114 	uint8_t task;			/* Task Attributes Values. */
115 	uint8_t crn;			/* Command reference number. */
116 	uint8_t scsi_cdb[MAX_CMDSZ];	/* SCSI command bytes. */
117 	uint32_t total_byte_count;
118 	uint8_t target_id[3];		/* SCSI Target ID */
119 	uint8_t vp_index;
120 	ql_64bit_data_seg_t	dseg;		/* Data segments. */
121 } cmd7_24xx_entry_t;
122 
123 /*
124  * ISP24xx queue - Command IOCB structure definition.
125  */
126 #define	IOCB_CMD_TYPE_6		0x48
127 #define	CMD_TYPE_6_DATA_SEGMENTS 1	/* Number of 64 bit data segments. */
128 typedef struct cmd6_24xx_entry {
129 	uint8_t entry_type;		/* Entry type. */
130 	uint8_t entry_count;		/* Entry count. */
131 	uint8_t sys_define;		/* System defined. */
132 	uint8_t entry_status;		/* Entry Status. */
133 	uint32_t handle;		/* System handle */
134 	uint16_t n_port_hdl;
135 	uint16_t timeout;		/* Command timeout. */
136 	uint16_t dseg_count;
137 	uint16_t rsp_length;
138 	uint8_t fcp_lun[8];		/* SCSI LUN ID. */
139 	uint16_t control_flags;
140 	uint16_t cmnd_length;
141 	uint32_t cmnd_address[2];
142 	uint32_t rsp_address[2];	/* Data segment 0 address. */
143 	uint32_t total_byte_count;
144 	uint8_t target_id[3];		/* SCSI Target ID */
145 	uint8_t vp_index;
146 	ql_64bit_data_seg_t	dseg;		/* Data segments. */
147 } cmd6_24xx_entry_t;
148 
149 typedef struct fcp_cmnd {
150 	uint8_t		fcp_lun[8];		/* SCSI LUN ID. */
151 	uint8_t		crn;			/* Command reference number. */
152 	uint8_t		task;			/* Task Attributes Values. */
153 	uint8_t		task_mgmt;		/* Task management flags. */
154 	uint8_t		control_flags;		/* Plus additional cdb length */
155 	uint8_t		scsi_cdb[MAX_CMDSZ];
156 	uint32_t	dl;
157 } fcp_cmnd_t;
158 
159 typedef struct cmd6_2400_dma {
160 	fcp_cmnd_t	cmd;
161 	uint32_t	cookie_list[QL_DMA_SG_LIST_LENGTH + 1][3];
162 } cmd6_2400_dma_t;
163 
164 /*
165  * Task Management Flags.
166  */
167 #define	TF_TARGET_RESET		BIT_13
168 #define	TF_LUN_RESET		BIT_12
169 #define	TF_CLEAR_TASK_SET	BIT_10
170 #define	TF_ABORT_TASK_SET	BIT_9
171 
172 /*
173  * Task Attributes Values.
174  */
175 #define	TA_STAG		0
176 #define	TA_HTAG		1
177 #define	TA_OTAG		2
178 #define	TA_ACA		4
179 #define	TA_UNTAGGED	5
180 
181 /*
182  * Control Flags.
183  */
184 #define	CF_DSD_PTR	BIT_2
185 #define	CF_RD		BIT_1
186 #define	CF_WR		BIT_0
187 
188 /*
189  * ISP queue -	64-Bit DMA addressing command with extended LUN support
190  *		entry structure definition.
191  */
192 #define	IOCB_CMD_TYPE_3		0x19	/* Command Type 3 entry (64 bit) */
193 #define	CMD_TYPE_3_DATA_SEGMENTS 2	/* Number of 64 bit data segments. */
194 typedef struct cmd_3_entry {
195 	uint8_t entry_type;		/* Entry type. */
196 	uint8_t entry_count;		/* Entry count. */
197 	uint8_t sys_define;		/* System defined. */
198 	uint8_t entry_status;		/* Entry Status. */
199 	uint32_t handle;		/* System handle */
200 	uint8_t target_l;		/* SCSI ID - LSB */
201 	uint8_t target_h;		/* SCSI ID - MSB */
202 	uint8_t lun_l;			/* SCSI LUN - LSB */
203 	uint8_t lun_h;			/* SCSI LUN - MSB */
204 	uint8_t control_flags_l;	/* Control flags - LSB. */
205 	uint8_t control_flags_h;	/* Control flags - MSB. */
206 	uint8_t reserved_1[2];
207 	uint16_t timeout;		/* Command timeout. */
208 	uint16_t dseg_count;		/* Data segment count - LSB. */
209 	uint8_t scsi_cdb[MAX_CMDSZ];	/* SCSI command words. */
210 	uint32_t byte_count;		/* Total byte count. */
211 	ql_64bit_data_seg_t	dseg[2];	/* Data segments. */
212 } cmd_3_entry_t;
213 
214 /*
215  * ISP queue -	Command type 4 DSD list pointer structure definition.
216  */
217 #define	COMMAND_CHAINING_TYPE	0x15
218 typedef struct cmd_chaining_entry {
219 	uint8_t entry_type;		/* Entry type. */
220 	uint8_t entry_count;		/* Entry count. */
221 	uint8_t sys_define;		/* System defined. */
222 	uint8_t entry_status;		/* Entry Status. */
223 	uint32_t handle;		/* System handle */
224 	uint8_t reserved;
225 	uint8_t target;		/* SCSI ID */
226 	uint8_t lun_l;			/* SCSI LUN - LSB */
227 	uint8_t lun_h;			/* SCSI LUN - MSB */
228 	uint8_t control_flags_l;	/* Control flags - LSB. */
229 	uint8_t control_flags_h;	/* Control flags - MSB. */
230 	uint8_t crn;
231 	uint8_t vp_index;
232 	uint8_t timeout_l;		/* Command timeout - LSB. */
233 	uint8_t timeout_h;		/* Command timeout - MSB. */
234 	uint8_t dseg_count_l;		/* Data segment count - LSB. */
235 	uint8_t dseg_count_h;		/* Data segment count - MSB. */
236 	uint8_t scsi_cdb[MAX_CMDSZ];	/* SCSI command words. */
237 	uint32_t byte_count;		/* Total byte count. */
238 	uint16_t list_type;		/* 0 = 32bit, 1 = 64bit. */
239 	uint16_t base_address[2];
240 	uint16_t list_address[4];
241 	uint8_t reserved_2[10];
242 } cmd_chaining_entry_t;
243 
244 /*
245  * ISP queue - continuation entry structure definition.
246  */
247 #define	CONTINUATION_TYPE_0	0x02	/* Continuation entry. */
248 #define	CONT_TYPE_0_DATA_SEGMENTS 7	/* Number of 32 bit data segments. */
249 typedef struct cont_entry {
250 	uint8_t entry_type;		/* Entry type. */
251 	uint8_t entry_count;		/* Entry count. */
252 	uint8_t sys_define;		/* System defined. */
253 	uint8_t entry_status;		/* Entry Status. */
254 	uint32_t reserved;
255 	ql_32bit_data_seg_t	dseg[7];	/* Data segments. */
256 } cont_entry_t;
257 
258 /*
259  * ISP queue - 64-Bit addressing, continuation entry structure definition.
260  */
261 #define	CONTINUATION_TYPE_1	0x0A	/* Continuation Type 1 entry. */
262 #define	CONT_TYPE_1_DATA_SEGMENTS 5	/* Number of 64 bit data segments. */
263 typedef struct cont_type_1_entry {
264 	uint8_t entry_type;		/* Entry type. */
265 	uint8_t entry_count;		/* Entry count. */
266 	uint8_t sys_define;		/* System defined. */
267 	uint8_t entry_status;		/* Entry Status. */
268 	ql_64bit_data_seg_t	dseg[5];	/* Data segments. */
269 } cont_type_1_entry_t;
270 
271 /*
272  * ISP queue - status entry structure definition.
273  */
274 #define	STATUS_TYPE	0x03		/* Status entry. */
275 typedef struct sts_entry {
276 	uint8_t entry_type;		/* Entry type. */
277 	uint8_t entry_count;		/* Entry count. */
278 	uint8_t sys_define;		/* System defined. */
279 	uint8_t entry_status;		/* Entry Status. */
280 	uint32_t handle;		/* System handle. */
281 	uint8_t scsi_status_l;		/* SCSI status - LSB. */
282 	uint8_t scsi_status_h;		/* SCSI status - MSB. */
283 	uint16_t comp_status;		/* Completion status. */
284 	uint8_t state_flags_l;		/* State flags - LSB. */
285 	uint8_t state_flags_h;		/* State flags. */
286 	uint8_t status_flags_l;	/* Status flags. */
287 	uint8_t status_flags_h;	/* Status flags - MSB. */
288 	uint16_t rsp_info_length;	/* Response Info Length. */
289 	uint16_t req_sense_length;	/* Request sense data length. */
290 	uint32_t residual_length;	/* Residual transfer length. */
291 	uint8_t rsp_info[8];		/* FCP response information. */
292 	uint8_t req_sense_data[32];	/* Request sense data. */
293 } sts_entry_t, response_t;
294 
295 /*
296  * Status entry entry status
297  */
298 #define	RF_INV_E_ORDER	BIT_5		/* Invalid entry order. */
299 #define	RF_INV_E_COUNT	BIT_4		/* Invalid entry count. */
300 #define	RF_INV_E_PARAM	BIT_3		/* Invalid entry parameter. */
301 #define	RF_INV_E_TYPE	BIT_2		/* Invalid entry type. */
302 #define	RF_BUSY		BIT_1		/* Busy */
303 
304 /*
305  * Status entry SCSI status most significant byte.
306  */
307 #define	FCP_CONF_REQ		BIT_4
308 #define	FCP_RESID_UNDER		BIT_3
309 #define	FCP_RESID_OVER		BIT_2
310 #define	FCP_SNS_LEN_VALID	BIT_1
311 #define	FCP_RSP_LEN_VALID	BIT_0
312 #define	FCP_RSP_MASK		(FCP_RESID_UNDER | FCP_RESID_OVER | \
313 				FCP_RSP_LEN_VALID)
314 
315 /*
316  * Status entry state flag most significant byte.
317  * Not used in by ISP24xx
318  */
319 #define	SF_ARQ_DONE		BIT_5
320 #define	SF_GOT_STATUS		BIT_4
321 #define	SF_XFERRED_DATA		BIT_3
322 #define	SF_SENT_CMD		BIT_2
323 #define	SF_GOT_TARGET		BIT_1
324 #define	SF_GOT_BUS		BIT_0
325 
326 /*
327  * Status entry state flag least significant byte.
328  * Not used in by ISP24xx
329  */
330 #define	SF_NO_FAST_POST		BIT_7
331 #define	SF_DATA_OUT		BIT_6
332 #define	SF_DATA_IN		BIT_5
333 
334 #define	SF_SIMPLE_Q		BIT_3
335 #define	SF_ORDERED_Q		BIT_2
336 #define	SF_HEAD_OF_Q		BIT_1
337 #define	SF_ACA_Q		BIT_0
338 
339 /*
340  * Status entry completion status definitions.
341  */
342 #define	CS_COMPLETE		0x0	/* No errors */
343 #define	CS_INCOMPLETE		0x1	/* Incomplete transfer of cmd. */
344 #define	CS_DMA_ERROR		0x2	/* A DMA direction error. */
345 #define	CS_PORT_ID_CHANGE	0x2	/* The port ID has changed. */
346 #define	CS_TRANSPORT		0x3	/* Transport error. */
347 #define	CS_RESET		0x4	/* SCSI bus reset occurred */
348 #define	CS_ABORTED		0x5	/* System aborted command. */
349 #define	CS_TIMEOUT		0x6	/* Timeout error. */
350 #define	CS_DATA_OVERRUN		0x7	/* Data overrun. */
351 #define	CS_INVALID_RX_ID	0x8	/* Invalid RX_ID. */
352 #define	CS_DATA_REASSEM_ERROR	0x11	/* Data reassembly error. */
353 #define	CS_ABTS_REC		0x13	/* ABTS from target. */
354 #define	CS_DATA_UNDERRUN	0x15	/* Data Underrun. */
355 #define	CS_QUEUE_FULL		0x1C	/* Queue Full. */
356 #define	CS_PORT_UNAVAILABLE	0x28	/* Port unavailable */
357 					/* (selection timeout) */
358 #define	CS_PORT_LOGGED_OUT	0x29	/* Port Logged Out */
359 #define	CS_PORT_CONFIG_CHG	0x2A	/* Port Configuration Changed */
360 #define	CS_PORT_BUSY		0x2B	/* Port Busy */
361 #define	CS_RESOUCE_UNAVAILABLE	0x2C	/* Frimware resource unavailable. */
362 #define	CS_TASK_MGMT_OVERRUN	0x30	/* Task management overrun. */
363 #define	CS_LOGIN_LOGOUT_ERROR	0x31	/* login/logout IOCB error. */
364 #define	CS_SEQ_COMPLETE		0x40	/* Sequence Complete. */
365 #define	CS_ABORTED_SEQ_REC	0x47	/* Abort sequence was received. */
366 #define	CS_DEV_NOT_READY	0x81	/* Device not ready */
367 #define	CS_INVALID_PARAMETER	0x102	/* IP invalid_parameter. */
368 #define	CS_ERROR_RESOURCE	0x103	/* IP insufficient resources. */
369 #define	CS_IP_NOT_INITIALIZED	0x104	/* IP not_initialized. */
370 
371 #define	CS_BAD_PAYLOAD		0x180	/* Driver defined */
372 #define	CS_UNKNOWN		0x181	/* Driver defined */
373 #define	CS_CMD_FAILED		0x182	/* Driver defined */
374 #define	CS_LOOP_DOWN_ABORT	0x183	/* Driver defined */
375 #define	CS_FCP_RESPONSE_ERROR	0x184	/* Driver defined */
376 #define	CS_DEVICE_UNAVAILABLE	0x185	/* Driver defined */
377 /*
378  * ISP24xx queue - Status IOCB structure definition.
379  */
380 typedef struct sts_24xx_entry {
381 	uint8_t entry_type;		/* Entry type. */
382 	uint8_t entry_count;		/* Entry count. */
383 	uint8_t sys_define;		/* System defined. */
384 	uint8_t entry_status;		/* Entry Status. */
385 	uint32_t handle;		/* System handle. */
386 	uint16_t comp_status;		/* Completion status. */
387 	uint16_t ox_id;
388 	uint32_t residual_length;	/* Residual transfer length. */
389 	uint16_t reserved;
390 	uint8_t	 state_flags_l;		/* State flags. */
391 	uint8_t	 state_flags_h;
392 	uint16_t reserved_1;
393 	uint8_t scsi_status_l;		/* SCSI status - LSB. */
394 	uint8_t scsi_status_h;		/* SCSI status - MSB. */
395 	uint32_t fcp_rsp_residual_count;
396 	uint32_t fcp_sense_length;
397 	uint32_t fcp_rsp_data_length;	/* Response Info Length. */
398 	uint8_t rsp_sense_data[28];	/* FCP response and/or sense data. */
399 } sts_24xx_entry_t;
400 
401 /*
402  * ISP queue - status continuation entry structure definition.
403  */
404 #define	STATUS_CONT_TYPE	0x10	/* Status continuation entry. */
405 typedef struct sts_cont_entry {
406 	uint8_t entry_type;		/* Entry type. */
407 	uint8_t entry_count;		/* Entry count. */
408 	uint8_t sys_define;		/* System defined. */
409 	uint8_t entry_status;		/* Entry Status. */
410 	uint8_t req_sense_data[60];	/* Request sense data. */
411 } sts_cont_entry_t;
412 
413 /*
414  * ISP queue -	marker with extended LUN support
415  *		entry structure definition.
416  */
417 #define	MARKER_TYPE	0x04		/* Marker entry. */
418 typedef struct mrk_entry {
419 	uint8_t entry_type;		/* Entry type. */
420 	uint8_t entry_count;		/* Entry count. */
421 	uint8_t sys_define;		/* System defined. */
422 	uint8_t entry_status;		/* Entry Status. */
423 	uint32_t sys_define_2;		/* System defined. */
424 	uint8_t target_l;		/* SCSI ID - LSB */
425 	uint8_t target_h;		/* SCSI ID - MSB */
426 	uint8_t modifier;		/* Modifier (7-0). */
427 	uint8_t reserved_1;
428 	uint8_t sequence_number[2];	/* Sequence number of event. */
429 	uint8_t lun_l;			/* SCSI LUN - LSB */
430 	uint8_t lun_h;			/* SCSI LUN - MSB */
431 	uint8_t reserved_2[48];
432 } mrk_entry_t;
433 
434 /*
435  * Marker modifiers
436  */
437 #define	MK_SYNC_ID_LUN	0		/* Synchronize ID/LUN */
438 #define	MK_SYNC_ID	1		/* Synchronize ID */
439 #define	MK_SYNC_ALL	2		/* Synchronize all ID/LUN */
440 #define	MK_SYNC_LIP	3		/* Synchronize all ID/LUN, */
441 					/* clear port changed, */
442 					/* use sequence number. */
443 /*
444  * ISP24xx queue - Marker IOCB structure definition.
445  */
446 typedef struct marker_24xx_entry {
447 	uint8_t entry_type;		/* Entry type. */
448 	uint8_t entry_count;		/* Entry count. */
449 	uint8_t sys_define;		/* System defined. */
450 	uint8_t entry_status;		/* Entry Status. */
451 	uint32_t handle;		/* System handle */
452 	uint16_t n_port_hdl;
453 	uint8_t modifier;		/* Modifier */
454 	uint8_t reserved[2];
455 	uint8_t vp_index;
456 	uint8_t reserved_1[2];
457 	uint8_t fcp_lun[8];		/* SCSI LUN ID. */
458 	uint8_t reserved_2[40];
459 } marker_24xx_entry_t;
460 
461 /*
462  * ISP queue -	Management Server entry structure definition.
463  */
464 #define	MS_TYPE			0x29
465 #define	MS_DATA_SEGMENTS	1	/* Number of data segments. */
466 typedef struct ms_entry {
467 	uint8_t entry_type;		/* Entry type. */
468 	uint8_t entry_count;		/* Entry count. */
469 	uint8_t sys_define;		/* System defined. */
470 	uint8_t entry_status;		/* Entry Status. */
471 	uint32_t handle;		/* System handle */
472 	uint8_t loop_id_l;		/* device id - LSB */
473 	uint8_t loop_id_h;		/* device id - MSB */
474 	uint16_t comp_status;		/* Completion status */
475 	uint8_t control_flags_l;	/* Control flags - LSB. */
476 	uint8_t control_flags_h;	/* Control flags - MSB. */
477 	uint8_t reserved_1[2];
478 	uint16_t timeout;		/* Command timeout. */
479 	uint8_t cmd_dseg_count_l;	/* CMD segment count - LSB. */
480 	uint8_t cmd_dseg_count_h;	/* CMD segment count - MSB. */
481 	uint16_t total_dseg_count;	/* CMD + RESP segment count. */
482 	uint8_t	 reserved_2[10];
483 	uint32_t resp_byte_count;	/* Response byte count */
484 	uint32_t cmd_byte_count;	/* Command byte count */
485 	ql_64bit_data_seg_t	dseg[2];	/* Data segments. */
486 } ms_entry_t;
487 
488 #define	CF_ELS_PASSTHROUGH	BIT_7	/* MSB */
489 
490 /*
491  * ISP24xx queue - CT Pass-Through IOCB structure definition.
492  */
493 #define	CT_PASSTHRU_TYPE		0x29
494 #define	CT_PASSTHRU_DATA_SEGMENTS	1	/* Number of data segments. */
495 typedef struct ct_passthru_entry {
496 	uint8_t entry_type;		/* Entry type. */
497 	uint8_t entry_count;		/* Entry count. */
498 	uint8_t sys_define;		/* System defined. */
499 	uint8_t entry_status;		/* Entry Status. */
500 	uint32_t handle;		/* System handle */
501 	uint16_t status;
502 	uint16_t n_port_hdl;
503 	uint16_t cmd_dseg_count;
504 	uint8_t vp_index;
505 	uint8_t reserved;
506 	uint16_t timeout;
507 	uint16_t reserved_1;
508 	uint16_t resp_dseg_count;
509 	uint8_t reserved_2[10];
510 	uint32_t resp_byte_count;
511 	uint32_t cmd_byte_count;
512 	ql_64bit_data_seg_t	dseg[2];	/* Data segments. */
513 } ct_passthru_entry_t;
514 
515 /*
516  * ISP24xx queue - ELS Pass-Through IOCB structure definition.
517  */
518 #define	ELS_PASSTHRU_TYPE		0x53
519 typedef struct els_passthru_entry {
520 	uint8_t entry_type;		/* Entry type. */
521 	uint8_t entry_count;		/* Entry count. */
522 	uint8_t sys_define;		/* System defined. */
523 	uint8_t entry_status;		/* Entry Status. */
524 	uint32_t handle;		/* System handle */
525 	uint16_t reserved_8_9;
526 	uint16_t n_port_hdl;
527 	uint16_t xmt_dseg_count;	/* Only one allowed */
528 	uint8_t vp_index;
529 	uint8_t sof_type;
530 	uint32_t rcv_exch_address;
531 	uint16_t rcv_dseg_count;
532 	uint8_t els_cmd_opcode;
533 	uint8_t reserved_17;
534 	uint8_t d_id_7_0;
535 	uint8_t d_id_15_8;
536 	uint8_t d_id_23_16;
537 	uint8_t s_id_23_16;
538 	uint8_t s_id_7_0;
539 	uint8_t s_id_15_8;
540 	uint16_t control_flags;
541 	uint32_t rcv_payld_data_bcnt;
542 	uint32_t xmt_payld_data_bcnt;
543 	ql_64bit_data_seg_t	dseg[2];	/* Data segments. */
544 } els_passthru_entry_t;
545 
546 /*
547  * ISP24x queue - ELS Pass-Through IOCB response.
548  */
549 typedef struct els_passthru_entry_rsp {
550 	uint8_t entry_type;		/* Entry type. */
551 	uint8_t entry_count;		/* Entry count. */
552 	uint8_t sys_define;		/* System defined. */
553 	uint8_t entry_status;		/* Entry Status. */
554 	uint32_t handle;		/* System handle */
555 	uint16_t comp_status;
556 	uint16_t n_port_hdl;
557 	uint16_t reserved_c_d;
558 	uint8_t vp_index;
559 	uint8_t sof_type;
560 	uint32_t rcv_exch_addr;
561 	uint16_t reserved_14_15;
562 	uint8_t els_cmd_opcode;
563 	uint8_t reserved_17;
564 	uint8_t d_id_7_0;
565 	uint8_t d_id_15_8;
566 	uint8_t d_id_23_16;
567 	uint8_t s_id_23_16;
568 	uint8_t s_id_7_0;
569 	uint8_t s_id_15_8;
570 	uint16_t control_flags;
571 	uint32_t total_data_bcnt;
572 	uint32_t error_subcode1;
573 	uint32_t error_subcode2;
574 	uint8_t reserved_2c_3f[20];
575 } els_passthru_entry_rsp_t;
576 
577 /*
578  * ISP24xx queue - Task Management IOCB structure definition.
579  */
580 #define	TASK_MGMT_TYPE		0x14
581 typedef struct task_mgmt_entry {
582 	uint8_t entry_type;		/* Entry type. */
583 	uint8_t entry_count;		/* Entry count. */
584 	uint8_t sys_define;		/* System defined. */
585 	uint8_t entry_status;		/* Entry Status. */
586 	uint32_t handle;		/* System handle */
587 	uint16_t n_port_hdl;
588 	uint16_t reserved;
589 	uint16_t delay;
590 	uint16_t timeout;
591 	uint8_t fcp_lun[8];		/* SCSI LUN ID. */
592 	uint32_t control_flags;
593 	uint8_t reserved_1[20];
594 	uint8_t target_id[3];		/* SCSI Target ID */
595 	uint8_t vp_index;
596 	uint8_t reserved_2[12];
597 } task_mgmt_entry_t;
598 
599 /*
600  * Control Flags.
601  */
602 #define	CF_DO_NOT_SEND		BIT_31
603 #define	CF_LUN_RESET		BIT_4
604 #define	CF_ABORT_TASK_SET	BIT_3
605 #define	CF_CLEAR_TASK_SET	BIT_2
606 #define	CF_TARGET_RESET		BIT_1
607 #define	CF_CLEAR_ACA		BIT_0
608 
609 /*
610  * ISP24xx queue - Abort I/O IOCB structure definition.
611  */
612 #define	ABORT_CMD_TYPE		0x33
613 typedef struct abort_cmd_entry {
614 	uint8_t entry_type;		/* Entry type. */
615 	uint8_t entry_count;		/* Entry count. */
616 	uint8_t sys_define;		/* System defined. */
617 	uint8_t entry_status;		/* Entry Status. */
618 	uint32_t handle;		/* System handle */
619 	uint16_t n_port_hdl;		/* also comp_status */
620 	uint8_t options;
621 	uint8_t options_h;
622 	uint32_t cmd_handle;
623 	uint8_t reserved[32];
624 	uint8_t target_id[3];		/* Port ID */
625 	uint8_t vp_index;
626 	uint8_t reserved_1[12];
627 } abort_cmd_entry_t;
628 
629 /*
630  * Option Flags.
631  */
632 #define	AF_NO_ABTS		BIT_0
633 
634 /*
635  * ISP24xx queue - Login/Logout Port IOCB structure definition.
636  */
637 #define	LOG_TYPE		0x52
638 typedef struct log_entry {
639 	uint8_t entry_type;		/* Entry type. */
640 	uint8_t entry_count;		/* Entry count. */
641 	uint8_t sys_define;		/* System defined. */
642 	uint8_t entry_status;		/* Entry Status. */
643 	uint32_t handle;		/* System handle */
644 	uint16_t status;
645 	uint16_t n_port_hdl;
646 	uint16_t control_flags;
647 	uint8_t vp_index;
648 	uint8_t reserved;
649 	uint8_t port_id[3];
650 	uint8_t rsp_size;
651 	uint32_t io_param[11];
652 } log_entry_t;
653 
654 /*
655  * ISP24xx control flag commands
656  */
657 #define	CF_CMD_PLOGI	0x00
658 #define	CF_CMD_PRLI	0x01
659 #define	CF_CMD_PDISC	0x02
660 #define	CF_CMD_ADISC	0x03
661 #define	CF_CMD_LOGO	0x08
662 #define	CF_CMD_PRLO	0x09
663 #define	CF_CMD_TPRLO	0x0A
664 
665 /*
666  * ISP24xx control flag command options
667  */
668 #define	CFO_COND_PLOGI		BIT_4
669 #define	CFO_SKIP_PRLI		BIT_5
670 #define	CFO_COMMON_FEATURES	BIT_7
671 #define	CFO_CLASS_2		BIT_8
672 #define	CFO_FCP_2_OVR		BIT_9
673 
674 #define	CFO_IMPLICIT_LOGO	BIT_4
675 #define	CFO_IMPLICIT_LOGO_ALL	BIT_5
676 #define	CFO_EXPLICIT_LOGO	BIT_6
677 #define	CFO_FREE_N_PORT_HANDLE	BIT_7
678 
679 #define	CFO_IMPLICIT_PRLO	BIT_4
680 
681 /*
682  * ISP24xx Login/Logout Status Sub Codes in in I/O Parameter 0 field.
683  */
684 #define	CS0_NO_LINK			0x01
685 #define	CS0_NO_IOCB			0x02
686 #define	CS0_NO_EXCH_CTRL_BLK		0x03
687 #define	CS0_COMMAND_FAILED		0x04
688 #define	CS0_NO_FABRIC_PRESENT		0x05
689 #define	CS0_FIRMWARE_NOT_READY		0x07
690 #define	CS0_PORT_NOT_LOGGED_IN		0x09
691 #define	CS0_NO_PCB_ALLOCATED		0x0A
692 #define	CS0_ELS_REJECT_RECEIVED		0x18
693 #define	CS0_CMD_PARAMETER_ERROR		0x19
694 #define	CS0_PORT_ID_USED		0x1A
695 #define	CS0_N_PORT_HANDLE_USED		0x1B
696 #define	CS0_NO_N_PORT_HANDLE_AVAILABLE	0x1C
697 #define	CS0_NO_FLOGI_ACC		0x1F
698 
699 /*
700  * ISP24xx Login/Logout Status Sub Codes in in I/O Parameter 1 field.
701  */
702 #define	CS1_PLOGI_FAILED		0x02
703 #define	CS1_PLOGI_RESPONSE_FAILED	0x03
704 #define	CS1_PRLI_FAILED			0x04
705 #define	CS1_PRLI_RESPONSE_FAILED	0x05
706 #define	CS1_COMMAND_LOGGED_OUT		0x07
707 
708 /*
709  * ISP queue -	Enable LUN with extended LUN support
710  *		entry structure definition.
711  */
712 #define	ENABLE_LUN_TYPE	0xB		/* Enable LUN entry */
713 typedef struct enable_lun_entry {
714 	uint8_t entry_type;		/* Entry type. */
715 	uint8_t entry_count;		/* Entry count. */
716 	uint8_t sys_define;		/* System defined. */
717 	uint8_t entry_status;		/* Entry Status. */
718 	uint32_t handle;		/* System handle */
719 	uint8_t reserved[8];
720 	uint8_t status;
721 	uint8_t reserved_1;
722 	uint8_t command_count;
723 	uint8_t immediate_notify_count;
724 	uint8_t reserved_2[2];
725 	uint8_t timeout_l;		/* Timeout - LSB. */
726 	uint8_t timeout_h;		/* Timeout - MSB. */
727 	uint8_t reserved_3[40];
728 } enable_lun_entry_t;
729 
730 /*
731  * ISP queue -	Modify LUN with extended LUN support
732  *		entry structure definition.
733  */
734 #define	MODIFY_LUN_TYPE	0xC		/* Modify LUN entry */
735 typedef struct modify_lun_entry {
736 	uint8_t entry_type;		/* Entry type. */
737 	uint8_t entry_count;		/* Entry count. */
738 	uint8_t sys_define;		/* System defined. */
739 	uint8_t entry_status;		/* Entry Status. */
740 	uint32_t handle;		/* System handle */
741 	uint8_t reserved[2];
742 	uint8_t operators;
743 	uint8_t reserved_1[5];
744 	uint8_t status;
745 	uint8_t reserved_2;
746 	uint8_t command_count;
747 	uint8_t immediate_notify_count;
748 	uint8_t reserved_3[2];
749 	uint8_t timeout_l;		/* Timeout - LSB. */
750 	uint8_t timeout_h;		/* Timeout - MSB. */
751 	uint8_t reserved_4[40];
752 } modify_lun_entry_t;
753 
754 /*
755  * ISP queue -	Immediate Notify with extended LUN support
756  *		entry structure definition.
757  */
758 #define	IMMEDIATE_NOTIFY_TYPE	0xD	/* Immediate notify entry */
759 typedef struct immediate_notify_entry {
760 	uint8_t entry_type;		/* Entry type. */
761 	uint8_t entry_count;		/* Entry count. */
762 	uint8_t sys_define;		/* System defined. */
763 	uint8_t entry_status;		/* Entry Status. */
764 	uint32_t handle;		/* System handle */
765 	uint8_t initiator_id_l;
766 	uint8_t initiator_id_h;
767 	uint8_t lun_l;
768 	uint8_t lun_h;
769 	uint8_t reserved_1[4];
770 	uint16_t status;
771 	uint8_t task_flags_l;
772 	uint8_t task_flags_h;
773 	uint16_t sequence_id;
774 	uint8_t reserved_3[40];
775 	uint16_t ox_id;
776 } immediate_notify_entry_t;
777 
778 /*
779  * ISP24xx queue - Immediate Notify IOCB structure definition.
780  */
781 typedef struct immd_notify_24xx_entry {
782 	uint8_t entry_type;		/* Entry type. */
783 	uint8_t entry_count;		/* Entry count. */
784 	uint8_t sys_define;		/* System defined. */
785 	uint8_t entry_status;		/* Entry Status. */
786 	uint32_t reserved;
787 	uint16_t n_port_hdl;
788 	uint16_t reserved_1;
789 	uint16_t flags;
790 	uint16_t srr_rx_id;
791 	uint16_t status;
792 	uint8_t status_subcode;
793 	uint8_t reserved_2;
794 	uint32_t receive_exchange_address;
795 	uint32_t srr_relative_offset;
796 	uint16_t srr_iu;
797 	uint16_t srr_ox_id;
798 	uint8_t reserved_3[19];
799 	uint8_t vp_index;
800 	uint8_t reserved_4[10];
801 	uint16_t ox_id;
802 } immd_notify_24xx_entry_t;
803 
804 /*
805  * ISP queue -	Notify Acknowledge extended LUN support
806  *		entry structure definition.
807  */
808 #define	NOTIFY_ACKNOWLEDGE_TYPE	0xE	/* Immediate notify entry */
809 typedef struct notify_acknowledge_entry {
810 	uint8_t entry_type;		/* Entry type. */
811 	uint8_t entry_count;		/* Entry count. */
812 	uint8_t sys_define;		/* System defined. */
813 	uint8_t entry_status;		/* Entry Status. */
814 	uint32_t handle;		/* System handle */
815 	uint8_t initiator_id_l;
816 	uint8_t initiator_id_h;
817 	uint8_t reserved_1[2];
818 	uint8_t flags_l;
819 	uint8_t flags_h;
820 	uint8_t reserved_2[2];
821 	uint16_t status;
822 	uint8_t task_flags_l;
823 	uint8_t task_flags_h;
824 	uint16_t sequence_id;
825 	uint8_t reserved_3[42];
826 } notify_acknowledge_entry_t;
827 
828 /*
829  * ISP24xx queue - Notify Acknowledge IOCB structure definition.
830  */
831 typedef struct notify_ack_24xx_entry {
832 	uint8_t entry_type;		/* Entry type. */
833 	uint8_t entry_count;		/* Entry count. */
834 	uint8_t sys_define;		/* System defined. */
835 	uint8_t entry_status;		/* Entry Status. */
836 	uint32_t handle;
837 	uint16_t n_port_hdl;
838 	uint16_t reserved_1;
839 	uint16_t flags;
840 	uint16_t srr_rx_id;
841 	uint16_t status;
842 	uint8_t status_subcode;
843 	uint8_t reserved_2;
844 	uint32_t receive_exchange_address;
845 	uint32_t srr_relative_offset;
846 	uint16_t srr_iu;
847 	uint16_t srr_flags;
848 	uint8_t reserved_3[19];
849 	uint8_t vp_index;
850 	uint8_t srr_reject_vendor_unique;
851 	uint8_t srr_reject_code_explanation;
852 	uint8_t srr_reject_code;
853 	uint8_t reserved_4[7];
854 	uint16_t ox_id;
855 } notify_ack_24xx_entry_t;
856 
857 /*
858  * ISP queue -	Accept Target I/O with extended LUN support
859  *		entry structure definition.
860  */
861 #define	ATIO_TYPE	0x16			/* ATIO entry */
862 typedef struct atio_entry {
863 	uint8_t		entry_type;		/* Entry type. */
864 	uint8_t		entry_count;		/* Entry count. */
865 	uint8_t		sys_define;		/* System defined. */
866 	uint8_t		entry_status;		/* Entry Status. */
867 	uint32_t	handle;			/* System handle */
868 	uint8_t		initiator_id_l;
869 	uint8_t		initiator_id_h;
870 	uint16_t	rx_id;
871 	uint8_t		flags_l;
872 	uint8_t		flags_h;
873 	uint16_t	status;
874 	uint8_t		reserved_1;
875 	uint8_t		task_codes : 3,
876 			reserved_2 : 5;
877 	uint8_t		task_flags;
878 	uint8_t		execution_codes;
879 	uint8_t		cdb[MAX_CMDSZ];
880 	uint32_t	data_length;
881 	uint8_t		lun_l;
882 	uint8_t		lun_h;
883 	uint8_t		reserved_3[20];
884 	uint16_t	ox_id;
885 } atio_entry_t;
886 
887 /*
888  * ISP24xx queue - Accept Target I/O IOCB structure definition.
889  */
890 #define	ATIO_24xx_TYPE		0x06
891 typedef struct atio_24xx_entry {
892 	uint8_t entry_type;		/* Entry type. */
893 	uint8_t entry_count;		/* Entry count. */
894 	uint16_t len_attr;		/* System defined. */
895 	uint32_t receive_exchange_address;
896 	uint8_t frame_hdr[24];
897 	uint8_t payload[32];
898 } atio_24xx_entry_t;
899 
900 /*
901  * ISP queue -	Continue Target I/O with extended LUN support
902  *		entry structure definition.
903  */
904 #define	CTIO_TYPE_2	0x17
905 #define	CTIO_TYPE_3	0x1F
906 typedef struct ctio_entry {
907 	uint8_t entry_type;		/* Entry type. */
908 	uint8_t entry_count;		/* Entry count. */
909 	uint8_t sys_define;		/* System defined. */
910 	uint8_t entry_status;		/* Entry Status. */
911 	uint32_t handle;		/* System handle */
912 	uint8_t initiator_id_l;
913 	uint8_t initiator_id_h;
914 	uint16_t rx_id;
915 	uint8_t flags_l;
916 	uint8_t flags_h;
917 	uint16_t status;
918 	uint16_t timeout;
919 	uint8_t dseg_count_l;
920 	uint8_t dseg_count_h;
921 	uint32_t relative_offset;
922 	uint32_t residual_transfer_length;
923 	uint8_t reserved_1[4];
924 
925 	union {
926 		struct {
927 			uint8_t reserved_2[2];
928 			uint8_t scsi_status_l;
929 			uint8_t scsi_status_h;
930 			uint32_t byte_count;
931 			ql_32bit_data_seg_t	dseg[3];
932 		}s0_32bit;
933 
934 		struct {
935 			uint8_t reserved_3[2];
936 			uint8_t scsi_status_l;
937 			uint8_t scsi_status_h;
938 			uint32_t byte_count;
939 			ql_64bit_data_seg_t	dseg[2];
940 		}s0_64bit;
941 
942 		struct {
943 			uint8_t sense_length_l;
944 			uint8_t sense_length_h;
945 			uint8_t scsi_status_l;
946 			uint8_t scsi_status_h;
947 			uint8_t response_length_l;
948 			uint8_t response_length_h;
949 			uint8_t response_info[26];
950 		}s1;
951 
952 		struct {
953 			uint8_t reserved_4[2];
954 			uint32_t response_length;
955 			uint32_t response_pointer;
956 			uint8_t reserved[16];
957 		}s2;
958 	}type;
959 } ctio_entry_t;
960 
961 /*
962  * ISP24xx queue -	Continue Target I/O IOCBs from the System
963  *		Target Driver structure definition.
964  */
965 #define	CTIO_24xx_TYPE		0x12
966 typedef struct ctio_snd_entry {
967 	uint8_t entry_type;		/* Entry type. */
968 	uint8_t entry_count;		/* Entry count. */
969 	uint8_t sys_define;		/* System defined. */
970 	uint8_t entry_status;		/* Entry Status. */
971 	uint32_t handle;
972 	uint16_t n_port_hdl;
973 	uint16_t timeout;
974 	uint16_t dseg_count;
975 	uint8_t vp_index;
976 	uint8_t flags;
977 	uint8_t initiator_id[3];
978 	uint8_t reserved_1;
979 	uint32_t receive_exchange_address;
980 
981 	union {
982 		struct {
983 			uint16_t reserved_2;
984 			uint16_t flags;
985 			uint32_t residual_length;
986 			uint16_t ox_id;
987 			uint16_t scsi_status;
988 			uint32_t relative_offset;
989 			uint32_t reserved_3;
990 			uint32_t transfer_length;
991 			uint32_t reserved_4;
992 			ql_64bit_data_seg_t	dseg;
993 		}s0;
994 
995 		struct {
996 			uint16_t sense_length;
997 			uint16_t flags;
998 			uint32_t residual_length;
999 			uint16_t ox_id;
1000 			uint16_t scsi_status;
1001 			uint16_t response_length;
1002 			uint16_t reserved_2;
1003 			uint8_t rsp_sense_data[24];
1004 		}s1;
1005 
1006 		struct {
1007 			uint16_t reserved_2;
1008 			uint16_t flags;
1009 			uint32_t residual_length;
1010 			uint16_t ox_id;
1011 			uint8_t reserved_3[10];
1012 			uint32_t transfer_length;
1013 			uint32_t reserved_4;
1014 			ql_64bit_data_seg_t	dseg;
1015 		}s2;
1016 	}type;
1017 } ctio_snd_entry_t;
1018 
1019 /*
1020  * ISP24xx queue -	Continue Target I/O IOCBs from the ISP24xx
1021  *		Firmware structure definition.
1022  */
1023 typedef struct ctio_rcv_entry {
1024 	uint8_t entry_type;		/* Entry type. */
1025 	uint8_t entry_count;		/* Entry count. */
1026 	uint8_t sys_define;		/* System defined. */
1027 	uint8_t entry_status;		/* Entry Status. */
1028 	uint32_t handle;
1029 	uint16_t status;
1030 	uint16_t timeout;
1031 	uint16_t dseg_count;
1032 	uint8_t reserved[6];
1033 
1034 	uint8_t vp_index;
1035 	uint8_t flags;
1036 	uint8_t initiator_id[3];
1037 	uint8_t reserved_1;
1038 	uint32_t receive_exchange_address;
1039 
1040 	union {
1041 		struct {
1042 			uint16_t reserved_2;
1043 			uint16_t flags;
1044 			uint32_t residual_length;
1045 			uint16_t ox_id;
1046 			uint16_t scsi_status;
1047 			uint32_t relative_offset;
1048 			uint32_t reserved_3;
1049 			uint32_t transfer_length;
1050 			uint32_t reserved_4;
1051 			ql_64bit_data_seg_t	dseg;
1052 		}s0;
1053 
1054 		struct {
1055 			uint16_t sense_length;
1056 			uint16_t flags;
1057 			uint32_t residual_length;
1058 			uint16_t ox_id;
1059 			uint16_t scsi_status;
1060 			uint16_t response_length;
1061 			uint16_t reserved_2;
1062 			uint8_t rsp_sense_data[24];
1063 		}s1;
1064 
1065 		struct {
1066 			uint16_t reserved_2;
1067 			uint16_t flags;
1068 			uint32_t residual_length;
1069 			uint16_t ox_id;
1070 			uint8_t reserved_3[10];
1071 			uint32_t transfer_length;
1072 			uint32_t reserved_4;
1073 			ql_64bit_data_seg_t	dseg;
1074 		}s2;
1075 	}type;
1076 } ctio_rcv_entry_t;
1077 
1078 /*
1079  * ISP queue -	32-Bit DMA addressing IP entry structure definition.
1080  */
1081 #define	IP_TYPE			0x13
1082 #define	IP_DATA_SEGMENTS	3	/* Number of data segments. */
1083 typedef struct ip_entry {
1084 	uint8_t entry_type;		/* Entry type. */
1085 	uint8_t entry_count;		/* Entry count. */
1086 	uint8_t sys_define;		/* System defined. */
1087 	uint8_t entry_status;		/* Entry Status. */
1088 	uint32_t handle;		/* System handle */
1089 	uint8_t loop_id_l;		/* device id - LSB */
1090 	uint8_t loop_id_h;		/* device id - MSB */
1091 	uint16_t comp_status;		/* Completion status. */
1092 	uint8_t control_flags_l;	/* Control flags - LSB. */
1093 	uint8_t control_flags_h;	/* Control flags - MSB. */
1094 	uint8_t reserved_1[2];
1095 	uint16_t timeout;		/* Command timeout. */
1096 	uint16_t dseg_count;		/* Data segment count. */
1097 	uint8_t reserved_2[16];
1098 	uint32_t byte_count;		/* Total byte count. */
1099 	ql_32bit_data_seg_t	dseg[3];	/* Data segments. */
1100 } ip_entry_t;
1101 
1102 /*
1103  * ISP queue -	64-Bit DMA addressing IP entry structure definition.
1104  */
1105 #define	IP_A64_TYPE		0x1B
1106 #define	IP_A64_DATA_SEGMENTS	2	/* Number of data segments. */
1107 typedef struct ip_a64_entry {
1108 	uint8_t entry_type;		/* Entry type. */
1109 	uint8_t entry_count;		/* Entry count. */
1110 	uint8_t sys_define;		/* System defined. */
1111 	uint8_t entry_status;		/* Entry Status. */
1112 	uint32_t handle;		/* System handle */
1113 	uint8_t reserved;
1114 	uint8_t loop_id;		/* Loop ID */
1115 	uint16_t comp_status;		/* Completion status. */
1116 	uint8_t control_flags_l;	/* Control flags - LSB. */
1117 	uint8_t control_flags_h;	/* Control flags - MSB. */
1118 	uint8_t reserved_1[2];
1119 	uint16_t timeout;		/* Command timeout. */
1120 	uint16_t dseg_count;		/* Data segment count. */
1121 	uint8_t reserved_2[16];
1122 	uint32_t byte_count;		/* Total byte count. */
1123 	ql_64bit_data_seg_t	dseg[2];	/* Data segments. */
1124 } ip_a64_entry_t;
1125 
1126 /*
1127  * ISP24xx queue - IP command entry structure definition.
1128  */
1129 #define	IP_CMD_TYPE		0x3B
1130 #define	IP_CMD_DATA_SEGMENTS	1
1131 typedef struct ip_cmd_entry {
1132 	uint8_t entry_type;		/* Entry type. */
1133 	uint8_t entry_count;		/* Entry count. */
1134 	uint8_t sys_define;		/* System defined. */
1135 	uint8_t entry_status;		/* Entry Status. */
1136 	uint32_t handle;		/* System handle. */
1137 	uint16_t hdl_status;		/* N_port hdl or Completion status */
1138 	uint16_t timeout_hdl;		/* N_port hdl or Command timeout */
1139 	uint16_t dseg_count;		/* Data segment count. */
1140 	uint8_t reserved_1[6];
1141 	uint32_t exch_addr;
1142 	uint16_t control_flags;
1143 	uint16_t frame_hdr_cntrl_flgs;
1144 	uint8_t reserved_2[12];
1145 	uint32_t sys_define_2;
1146 	uint32_t byte_count;		/* Total byte count. */
1147 	uint8_t reserved_3[4];
1148 	ql_64bit_data_seg_t	dseg;	/* Data segments. */
1149 } ip_cmd_entry_t;
1150 
1151 /*
1152  * IP command Control Flags.
1153  */
1154 #define	IPCF_TERMINATE_EXCH	BIT_1
1155 /*
1156  * IP command Frame Header Control Flags.
1157  */
1158 #define	IPCF_FIRST_SEQ		BIT_5
1159 #define	IPCF_LAST_SEQ		BIT_4
1160 
1161 /*
1162  * ISP queue - Receive IP buffer entry structure definition.
1163  */
1164 #define	IP_RCVBUF_HANDLES	24	/* Buffer handles in entry. */
1165 #define	IP_RECEIVE_TYPE		0x23	/* IP receive entry */
1166 typedef struct ip_rcv_entry {
1167 	uint8_t entry_type;		/* Entry type. */
1168 	uint8_t entry_count;		/* Entry count. */
1169 	uint8_t segment_count;		/* Segment count. */
1170 	uint8_t entry_status;		/* Entry Status. */
1171 	uint8_t s_id[3];		/* Source ID. */
1172 	uint8_t reserved[2];
1173 	uint8_t loop_id;		/* Loop ID */
1174 	uint16_t comp_status;		/* Completion status. */
1175 	uint8_t class_of_srv_l;	/* Class of service - LSB. */
1176 	uint8_t class_of_srv_h;	/* Class of service - MSB. */
1177 	uint16_t seq_length;		/* Sequence length. */
1178 	uint16_t buffer_handle[IP_RCVBUF_HANDLES]; /* Buffer handles. */
1179 } ip_rcv_entry_t;
1180 
1181 /*
1182  * ISP queue - Receive IP buffer continuation entry structure definition.
1183  */
1184 #define	IP_RCVBUF_CONT_HANDLES	30	/* Buffer handles in entry. */
1185 #define	IP_RECEIVE_CONT_TYPE	0x2B	/* IP receive continuation entry */
1186 typedef struct ip_rcv_cont_entry {
1187 	uint8_t entry_type;		/* Entry type. */
1188 	uint8_t entry_count;		/* Entry count. */
1189 	uint8_t reserved;
1190 	uint8_t entry_status;		/* Entry Status. */
1191 	uint16_t buffer_handle[IP_RCVBUF_CONT_HANDLES]; /* Buf handles */
1192 } ip_rcv_cont_entry_t;
1193 
1194 /*
1195  * ISP24xx queue - Receive IP buffer entry structure definition.
1196  */
1197 #define	IP_24XX_RCVBUF_HANDLES	4
1198 #define	IP_24XX_RECEIVE_TYPE	0x3c
1199 typedef struct ip_rcv_24xx_entry {
1200 	uint8_t entry_type;		/* Entry type. */
1201 	uint8_t entry_count;		/* Entry count. */
1202 	uint8_t segment_count;		/* Segment count. */
1203 	uint8_t entry_status;		/* Entry Status. */
1204 	uint8_t s_id[3];		/* Source ID. */
1205 	uint8_t reserved[1];
1206 	uint16_t comp_status;		/* Completion status. */
1207 	uint16_t n_port_hdl;		/* Loop ID */
1208 	uint8_t class_of_srv_l;	/* Class of service - LSB. */
1209 	uint8_t class_of_srv_h;	/* Class of service - MSB. */
1210 	uint16_t seq_length;		/* Sequence length. */
1211 	uint16_t buffer_handle[IP_24XX_RCVBUF_HANDLES]; /* Buffer handles. */
1212 } ip_rcv_24xx_entry_t;
1213 
1214 /*
1215  * ISP receive buffer container structure definition.
1216  */
1217 typedef struct rcvbuf {
1218 	uint32_t bufp[2];		/* Buffer pointer. */
1219 	uint16_t handle;		/* Buffer handle. */
1220 	uint16_t reserved;
1221 } rcvbuf_t;
1222 
1223 /*
1224  * ISP24xx queue - IP Load Buffer Pool entry structure definition.
1225  */
1226 #define	IP_POOL_BUFFERS		4
1227 #define	IP_BUF_POOL_TYPE	0x3d
1228 typedef struct ip_buf_pool_entry {
1229 	uint8_t entry_type;		/* Entry type. */
1230 	uint8_t entry_count;		/* Entry count. */
1231 	uint8_t sys_define;		/* System defined. */
1232 	uint8_t entry_status;		/* Entry Status. */
1233 	uint32_t handle;		/* System handle */
1234 	uint16_t status;
1235 	uint16_t buffer_pool_id;
1236 	uint16_t option;
1237 	uint8_t buffer_count;
1238 	uint8_t buffer_count_h;
1239 	rcvbuf_t buffers[IP_POOL_BUFFERS];
1240 } ip_buf_pool_entry_t;
1241 /*
1242  * ISP2400 queue - Virtual Port Modify IOCB structure definition.
1243  */
1244 #define	VP_MODIFY_TYPE		0x31
1245 typedef struct vp_modify_entry {
1246 	uint8_t entry_type;		/* Entry type. */
1247 	uint8_t entry_count;		/* Entry count. */
1248 	uint8_t sys_define;		/* System defined. */
1249 	uint8_t entry_status;		/* Entry Status. */
1250 	uint32_t handle;		/* System handle */
1251 	uint16_t reserved;
1252 	uint16_t status;
1253 	uint8_t command;
1254 	uint8_t vp_count;
1255 	uint8_t first_vp_index;
1256 	uint8_t second_vp_index;
1257 	uint8_t first_options;
1258 	uint8_t first_hard_prev_addr;
1259 	uint8_t reserved_2[2];
1260 	uint8_t first_port_name[8];
1261 	uint8_t first_node_name[8];
1262 	uint8_t second_options;
1263 	uint8_t second_hard_prev_addr;
1264 	uint8_t reserved_3[2];
1265 	uint8_t second_port_name[8];
1266 	uint8_t second_node_name[8];
1267 	uint8_t reserved_4[6];
1268 	uint16_t fcf_index;
1269 } vp_modify_entry_t;
1270 
1271 /*
1272  * ISP2400 VP modify commands
1273  */
1274 #define	VPM_MODIFY		0x0
1275 #define	VPM_MODIFY_ENABLE	0x1
1276 
1277 /*
1278  * ISP2400 queue - Virtual Port Control IOCB structure definition.
1279  */
1280 #define	VP_CONTROL_TYPE		0x30
1281 typedef struct vp_control_entry {
1282 	uint8_t entry_type;		/* Entry type. */
1283 	uint8_t entry_count;		/* Entry count. */
1284 	uint8_t sys_define;		/* System defined. */
1285 	uint8_t entry_status;		/* Entry Status. */
1286 	uint32_t handle;		/* System handle */
1287 	uint16_t vp_index_failed;
1288 	uint16_t status;
1289 	uint8_t command;
1290 	uint8_t command_h;
1291 	uint8_t vp_count;
1292 	uint8_t vp_count_h;
1293 	uint8_t vp_index[16];
1294 	uint8_t reserved[30];
1295 	uint16_t fcf_index;
1296 } vp_control_entry_t;
1297 
1298 /*
1299  * ISP2400 VP control commands
1300  */
1301 #define	VPC_ENABLE		0x0
1302 #define	VPC_DISABLE		0x8
1303 #define	VPC_DISABLE_INIT	0x9	/* Only 2400 & 2500 */
1304 #define	VPC_DISABLE_LOGOUT	0xa
1305 #define	VPC_DISABLE_LOGOUT_ALL	0xb
1306 
1307 /*
1308  * ISP2400 queue - Report ID Acquisition IOCB structure definition.
1309  */
1310 #define	REPORT_ID_TYPE		0x32
1311 typedef struct report_id_0 {
1312 	uint8_t entry_type;		/* Entry type. */
1313 	uint8_t entry_count;		/* Entry count. */
1314 	uint8_t sys_define;		/* System defined. */
1315 	uint8_t entry_status;		/* Entry Status. */
1316 	uint32_t handle;		/* System handle */
1317 	uint8_t vp_acquired;
1318 	uint8_t vp_setup;
1319 	uint8_t reserved[2];
1320 	uint8_t port_id[3];
1321 	uint8_t format;
1322 	uint8_t vp_index[16];
1323 	uint8_t reserved_1[32];
1324 } report_id_0_t;
1325 
1326 typedef struct report_id_1 {
1327 	uint8_t entry_type;		/* Entry type. */
1328 	uint8_t entry_count;		/* Entry count. */
1329 	uint8_t sys_define;		/* System defined. */
1330 	uint8_t entry_status;		/* Entry Status. */
1331 	uint32_t handle;		/* System handle */
1332 	uint16_t vp_count;
1333 	uint8_t vp_index;
1334 	uint8_t vp_status;
1335 	uint8_t port_id[3];
1336 	uint8_t format;
1337 	uint8_t reserved[48];
1338 } report_id_1_t;
1339 
1340 typedef struct report_id_acq {
1341 	uint8_t entry_type;		/* Entry type. */
1342 	uint8_t entry_count;		/* Entry count. */
1343 	uint8_t sys_define;		/* System defined. */
1344 	uint8_t entry_status;		/* Entry Status. */
1345 	uint32_t handle;		/* System handle */
1346 	uint8_t vp_acquired;
1347 	uint8_t vp_setup;
1348 	uint8_t vp_index;
1349 	uint8_t vp_status;
1350 	uint8_t port_id[3];
1351 	uint8_t format;
1352 	uint8_t status_subcode;
1353 	uint8_t flags;
1354 	uint16_t fip_flags;
1355 	uint16_t fcf_index;
1356 	uint16_t mac[3];
1357 	uint8_t reserved[4];
1358 	uint8_t ls_rjt_subcode;
1359 	uint8_t ls_rjt_explanation;
1360 	uint8_t ls_rjt_reason_code;
1361 	uint8_t reserved_1[29];
1362 } report_id_acq_t;
1363 
1364 /*
1365  * ISP2400 queue - Verify Menlo FW entry structure definition.
1366  */
1367 #define	VERIFY_MENLO_TYPE	0x1b
1368 typedef struct vfy_menlo_entry {
1369 	uint8_t entry_type;		/* Entry type. */
1370 	uint8_t entry_count;		/* Entry count. */
1371 	uint8_t sys_define;		/* System defined. */
1372 	uint8_t entry_status;		/* Entry Status. */
1373 	uint32_t handle;		/* System handle */
1374 	uint16_t options_status;
1375 	uint16_t failure_code;
1376 	uint16_t dseg_count;
1377 	uint16_t reserved_1[3];
1378 	uint32_t fw_version;
1379 	uint32_t exch_addr;
1380 	uint32_t reserved_2[3];
1381 	uint32_t fw_size;
1382 	uint32_t fw_sequence_size;
1383 	uint32_t relative_offset;
1384 	ql_64bit_data_seg_t	dseg;	/* Data segments. */
1385 } vfy_menlo_entry_t;
1386 
1387 /*
1388  * Option Flags.
1389  */
1390 #define	VMO_DSD_CHAINING	BIT_15
1391 #define	VM_END_OF_DATA		BIT_14
1392 #define	VMF_DIAGNOSTIC_FW	BIT_3
1393 #define	VMF_DO_NOT_RESET	BIT_2
1394 #define	VMF_FORCE_UPDATE_FW	BIT_1
1395 #define	VMF_DO_NOT_UPDATE_FW	BIT_0
1396 
1397 /*
1398  * ISP2400 queue - Access Menlo Data entry structure definition.
1399  */
1400 #define	MENLO_DATA_TYPE		0x2b
1401 typedef struct menlo_data_entry {
1402 	uint8_t entry_type;		/* Entry type. */
1403 	uint8_t entry_count;		/* Entry count. */
1404 	uint8_t sys_define;		/* System defined. */
1405 	uint8_t entry_status;		/* Entry Status. */
1406 	uint32_t handle;		/* System handle */
1407 	uint16_t options_status;
1408 	uint16_t failure_code;
1409 	uint16_t dseg_count;
1410 	uint16_t reserved_1[3];
1411 	uint32_t parameter_1;
1412 	uint32_t parameter_2;
1413 	uint32_t parameter_3;
1414 	uint32_t reserved_2[3];
1415 	uint32_t total_byte_count;
1416 	uint32_t reserved_3;
1417 	ql_64bit_data_seg_t	dseg;	/* Data segments. */
1418 } menlo_data_entry_t;
1419 
1420 /*
1421  * Mailbox IOCB.
1422  */
1423 typedef union ql_mbx_iocb {
1424 	cmd_entry_t		cmd;
1425 	cmd_3_entry_t		cmd3;
1426 	cmd7_24xx_entry_t	cmd24;
1427 	ms_entry_t		ms;
1428 	ct_passthru_entry_t	ms24;
1429 	abort_cmd_entry_t	abo;
1430 	task_mgmt_entry_t	mgmt;
1431 	sts_entry_t		sts;
1432 	sts_24xx_entry_t	sts24;
1433 	log_entry_t		log;
1434 	vp_control_entry_t	vpc;
1435 	vp_modify_entry_t	vpm;
1436 	vfy_menlo_entry_t	mvfy;
1437 	menlo_data_entry_t	mdata;
1438 	els_passthru_entry_t	els;
1439 } ql_mbx_iocb_t;
1440 
1441 /*
1442  * Global Data in ql_iocb.c source file.
1443  */
1444 
1445 /*
1446  * Global Function Prototypes in ql_iocb.c source file.
1447  */
1448 void ql_start_iocb(ql_adapter_state_t *, ql_srb_t *);
1449 int ql_marker(ql_adapter_state_t *, uint16_t, ql_lun_t *lq, uint8_t);
1450 void ql_isp_rcvbuf(ql_adapter_state_t *);
1451 void ql_command_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
1452     void *);
1453 void ql_ms_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *, void *);
1454 void ql_ip_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *, void *);
1455 void ql_command_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
1456     void *);
1457 void ql_ms_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
1458     void *);
1459 void ql_ip_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
1460     void *);
1461 
1462 #ifdef	__cplusplus
1463 }
1464 #endif
1465 
1466 #endif /* _QL_IOCB_H */
1467