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