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