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