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