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 */