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