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