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