1 /*- 2 * Copyright (c) 2000 Michael Smith 3 * Copyright (c) 2000-2001 Scott Long 4 * Copyright (c) 2000 BSDi 5 * Copyright (c) 2001 Adaptec, Inc. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $FreeBSD$ 30 */ 31 32 /* 33 * Data structures defining the interface between the driver and the Adaptec 34 * 'FSA' adapters. Note that many field names and comments here are taken 35 * verbatim from the Adaptec driver source in order to make comparing the 36 * two slightly easier. 37 */ 38 39 /* 40 * Misc. magic numbers. 41 */ 42 #define AAC_MAX_CONTAINERS 64 43 #define AAC_BLOCK_SIZE 512 44 45 /* 46 * Communications interface. 47 * 48 * Where datastructure layouts are closely parallel to the Adaptec sample code, 49 * retain their naming conventions (for now) to aid in cross-referencing. 50 */ 51 52 /* 53 * We establish 4 command queues and matching response queues. Queues must 54 * be 16-byte aligned, and are sized as follows: 55 */ 56 #define AAC_HOST_NORM_CMD_ENTRIES 8 /* command adapter->host, 57 * normal priority */ 58 #define AAC_HOST_HIGH_CMD_ENTRIES 4 /* command adapter->host, 59 * high priority */ 60 #define AAC_ADAP_NORM_CMD_ENTRIES 512 /* command host->adapter, 61 * normal priority */ 62 #define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* command host->adapter, 63 * high priority */ 64 #define AAC_HOST_NORM_RESP_ENTRIES 512 /* response, adapter->host, 65 * normal priority */ 66 #define AAC_HOST_HIGH_RESP_ENTRIES 4 /* response, adapter->host, 67 * high priority */ 68 #define AAC_ADAP_NORM_RESP_ENTRIES 8 /* response, host->adapter, 69 * normal priority */ 70 #define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* response, host->adapter, 71 * high priority */ 72 73 #define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \ 74 AAC_HOST_NORM_CMD_ENTRIES + \ 75 AAC_ADAP_HIGH_CMD_ENTRIES + \ 76 AAC_ADAP_NORM_CMD_ENTRIES + \ 77 AAC_HOST_HIGH_RESP_ENTRIES + \ 78 AAC_HOST_NORM_RESP_ENTRIES + \ 79 AAC_ADAP_HIGH_RESP_ENTRIES + \ 80 AAC_ADAP_NORM_RESP_ENTRIES) 81 #define AAC_QUEUE_COUNT 8 82 #define AAC_QUEUE_ALIGN 16 83 84 struct aac_queue_entry { 85 u_int32_t aq_fib_size; /* FIB size in bytes */ 86 u_int32_t aq_fib_addr; /* receiver-space address of the FIB */ 87 } __packed; 88 89 #define AAC_PRODUCER_INDEX 0 90 #define AAC_CONSUMER_INDEX 1 91 92 /* 93 * Table of queue indices and queues used to communicate with the 94 * controller. This structure must be aligned to AAC_QUEUE_ALIGN 95 */ 96 struct aac_queue_table { 97 /* queue consumer/producer indexes (layout mandated by adapter) */ 98 u_int32_t qt_qindex[AAC_QUEUE_COUNT][2]; 99 100 /* queue entry structures (layout mandated by adapter) */ 101 struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES]; 102 struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES]; 103 struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES]; 104 struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES]; 105 struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES]; 106 struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES]; 107 struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES]; 108 struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES]; 109 } __packed; 110 111 /* 112 * Queue names 113 * 114 * Note that we base these at 0 in order to use them as array indices. Adaptec 115 * used base 1 for some unknown reason, and sorted them in a different order. 116 */ 117 #define AAC_HOST_NORM_CMD_QUEUE 0 118 #define AAC_HOST_HIGH_CMD_QUEUE 1 119 #define AAC_ADAP_NORM_CMD_QUEUE 2 120 #define AAC_ADAP_HIGH_CMD_QUEUE 3 121 #define AAC_HOST_NORM_RESP_QUEUE 4 122 #define AAC_HOST_HIGH_RESP_QUEUE 5 123 #define AAC_ADAP_NORM_RESP_QUEUE 6 124 #define AAC_ADAP_HIGH_RESP_QUEUE 7 125 126 /* 127 * List structure used to chain FIBs (used by the adapter - we hang FIBs off 128 * our private command structure and don't touch these) 129 */ 130 struct aac_fib_list_entry { 131 u_int32_t Flink; 132 u_int32_t Blink; 133 } __packed; 134 135 /* 136 * FIB (FSA Interface Block?); this is the datastructure passed between the host 137 * and adapter. 138 */ 139 struct aac_fib_header { 140 u_int32_t XferState; 141 u_int16_t Command; 142 u_int8_t StructType; 143 u_int8_t Flags; 144 u_int16_t Size; 145 u_int16_t SenderSize; 146 u_int32_t SenderFibAddress; 147 u_int32_t ReceiverFibAddress; 148 u_int32_t SenderData; 149 union { 150 struct { 151 u_int32_t ReceiverTimeStart; 152 u_int32_t ReceiverTimeDone; 153 } _s; 154 struct aac_fib_list_entry FibLinks; 155 } _u; 156 } __packed; 157 158 #define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header)) 159 160 struct aac_fib { 161 struct aac_fib_header Header; 162 u_int8_t data[AAC_FIB_DATASIZE]; 163 } __packed; 164 165 /* 166 * FIB commands 167 */ 168 typedef enum { 169 TestCommandResponse = 1, 170 TestAdapterCommand = 2, 171 172 /* lowlevel and comm commands */ 173 LastTestCommand = 100, 174 ReinitHostNormCommandQueue = 101, 175 ReinitHostHighCommandQueue = 102, 176 ReinitHostHighRespQueue = 103, 177 ReinitHostNormRespQueue = 104, 178 ReinitAdapNormCommandQueue = 105, 179 ReinitAdapHighCommandQueue = 107, 180 ReinitAdapHighRespQueue = 108, 181 ReinitAdapNormRespQueue = 109, 182 InterfaceShutdown = 110, 183 DmaCommandFib = 120, 184 StartProfile = 121, 185 TermProfile = 122, 186 SpeedTest = 123, 187 TakeABreakPt = 124, 188 RequestPerfData = 125, 189 SetInterruptDefTimer= 126, 190 SetInterruptDefCount= 127, 191 GetInterruptDefStatus= 128, 192 LastCommCommand = 129, 193 194 /* filesystem commands */ 195 NuFileSystem = 300, 196 UFS = 301, 197 HostFileSystem = 302, 198 LastFileSystemCommand = 303, 199 200 /* Container Commands */ 201 ContainerCommand = 500, 202 ContainerCommand64 = 501, 203 RawIo = 502, 204 205 /* Cluster Commands */ 206 ClusterCommand = 550, 207 208 /* Scsi Port commands (scsi passthrough) */ 209 ScsiPortCommand = 600, 210 ScsiPortCommandU64 = 601, 211 SataPortCommandU64 = 602, 212 SasSmpPassThrough = 603, 213 SasRequestPhyInfo = 612, 214 215 /* misc house keeping and generic adapter initiated commands */ 216 AifRequest = 700, 217 CheckRevision = 701, 218 FsaHostShutdown = 702, 219 RequestAdapterInfo = 703, 220 IsAdapterPaused = 704, 221 SendHostTime = 705, 222 RequestSupplementAdapterInfo = 706, /* Supp. Info for set in UCC 223 * use only if supported 224 * (RequestAdapterInfo first) */ 225 LastMiscCommand = 707, 226 227 OnLineDiagnostic = 800, 228 FduAdapterTest = 801, 229 RequestCompatibilityId = 802, 230 AdapterEnvironmentInfo = 803, /* temp. sensors */ 231 NvsramEventLog = 900, 232 ResetNvsramEventLogPointers = 901, 233 EnableEventLog = 902, 234 DisableEventLog = 903, 235 EncryptedKeyTransportFIB= 904, 236 KeyableFeaturesFIB= 905 237 } AAC_FibCommands; 238 239 /* 240 * FIB types 241 */ 242 #define AAC_FIBTYPE_TFIB 1 243 #define AAC_FIBTYPE_TQE 2 244 #define AAC_FIBTYPE_TCTPERF 3 245 246 /* 247 * FIB transfer state 248 */ 249 #define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */ 250 #define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */ 251 #define AAC_FIBSTATE_INITIALISED (1<<2) /* initialised */ 252 #define AAC_FIBSTATE_EMPTY (1<<3) /* empty */ 253 #define AAC_FIBSTATE_FROMPOOL (1<<4) /* allocated from pool */ 254 #define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */ 255 #define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */ 256 #define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */ 257 #define AAC_FIBSTATE_RNOTEXPECTED (1<<8) /* response is not expected */ 258 #define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */ 259 #define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */ 260 #define AAC_FIBSTATE_HIGH (1<<11) /* high priority */ 261 #define AAC_FIBSTATE_NORM (1<<12) /* normal priority */ 262 #define AAC_FIBSTATE_ASYNC (1<<13) 263 #define AAC_FIBSTATE_ASYNCIO (1<<13) /* to be removed */ 264 #define AAC_FIBSTATE_PAGEFILEIO (1<<14) /* to be removed */ 265 #define AAC_FIBSTATE_SHUTDOWN (1<<15) 266 #define AAC_FIBSTATE_LAZYWRITE (1<<16) /* to be removed */ 267 #define AAC_FIBSTATE_ADAPMICROFIB (1<<17) 268 #define AAC_FIBSTATE_BIOSFIB (1<<18) 269 #define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */ 270 #define AAC_FIBSTATE_APIFIB (1<<20) 271 272 /* 273 * FIB error values 274 */ 275 #define AAC_ERROR_NORMAL 0x00 276 #define AAC_ERROR_PENDING 0x01 277 #define AAC_ERROR_FATAL 0x02 278 #define AAC_ERROR_INVALID_QUEUE 0x03 279 #define AAC_ERROR_NOENTRIES 0x04 280 #define AAC_ERROR_SENDFAILED 0x05 281 #define AAC_ERROR_INVALID_QUEUE_PRIORITY 0x06 282 #define AAC_ERROR_FIB_ALLOCATION_FAILED 0x07 283 #define AAC_ERROR_FIB_DEALLOCATION_FAILED 0x08 284 285 /* 286 * Adapter Init Structure: this is passed to the adapter with the 287 * AAC_MONKER_INITSTRUCT command to point it at our control structures. 288 */ 289 struct aac_adapter_init { 290 u_int32_t InitStructRevision; 291 #define AAC_INIT_STRUCT_REVISION 3 292 #define AAC_INIT_STRUCT_REVISION_4 4 293 u_int32_t MiniPortRevision; 294 #define AAC_INIT_STRUCT_MINIPORT_REVISION 1 295 u_int32_t FilesystemRevision; 296 u_int32_t CommHeaderAddress; 297 u_int32_t FastIoCommAreaAddress; 298 u_int32_t AdapterFibsPhysicalAddress; 299 u_int32_t AdapterFibsVirtualAddress; 300 u_int32_t AdapterFibsSize; 301 u_int32_t AdapterFibAlign; 302 u_int32_t PrintfBufferAddress; 303 u_int32_t PrintfBufferSize; 304 #define AAC_PAGE_SIZE 4096 305 u_int32_t HostPhysMemPages; 306 u_int32_t HostElapsedSeconds; 307 /* ADAPTER_INIT_STRUCT_REVISION_4 begins here */ 308 u_int32_t InitFlags; /* flags for supported features */ 309 #define AAC_INITFLAGS_NEW_COMM_SUPPORTED 1 310 #define AAC_INITFLAGS_DRIVER_USES_UTC_TIME 0x10 311 #define AAC_INITFLAGS_DRIVER_SUPPORTS_PM 0x20 312 u_int32_t MaxIoCommands; /* max outstanding commands */ 313 u_int32_t MaxIoSize; /* largest I/O command */ 314 u_int32_t MaxFibSize; /* largest FIB to adapter */ 315 } __packed; 316 317 /* 318 * Shared data types 319 */ 320 /* 321 * Container types 322 */ 323 typedef enum { 324 CT_NONE = 0, 325 CT_VOLUME, 326 CT_MIRROR, 327 CT_STRIPE, 328 CT_RAID5, 329 CT_SSRW, 330 CT_SSRO, 331 CT_MORPH, 332 CT_PASSTHRU, 333 CT_RAID4, 334 CT_RAID10, /* stripe of mirror */ 335 CT_RAID00, /* stripe of stripe */ 336 CT_VOLUME_OF_MIRRORS, /* volume of mirror */ 337 CT_PSEUDO_RAID3, /* really raid4 */ 338 CT_RAID50, /* stripe of raid5 */ 339 CT_RAID5D, /* raid5 distributed hot-sparing */ 340 CT_RAID5D0, 341 CT_RAID1E, /* extended raid1 mirroring */ 342 CT_RAID6, 343 CT_RAID60, 344 } AAC_FSAVolType; 345 346 /* 347 * Host-addressable object types 348 */ 349 typedef enum { 350 FT_REG = 1, /* regular file */ 351 FT_DIR, /* directory */ 352 FT_BLK, /* "block" device - reserved */ 353 FT_CHR, /* "character special" device - reserved */ 354 FT_LNK, /* symbolic link */ 355 FT_SOCK, /* socket */ 356 FT_FIFO, /* fifo */ 357 FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */ 358 FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */ 359 FT_SLICE, /* virtual disk - raw volume - slice */ 360 FT_PARTITION, /* FSA partition - carved out of a slice - building 361 * block for containers */ 362 FT_VOLUME, /* Container - Volume Set */ 363 FT_STRIPE, /* Container - Stripe Set */ 364 FT_MIRROR, /* Container - Mirror Set */ 365 FT_RAID5, /* Container - Raid 5 Set */ 366 FT_DATABASE /* Storage object with "foreign" content manager */ 367 } AAC_FType; 368 369 /* 370 * Host-side scatter/gather list for 32-bit commands. 371 */ 372 struct aac_sg_entry { 373 u_int32_t SgAddress; 374 u_int32_t SgByteCount; 375 } __packed; 376 377 struct aac_sg_entry64 { 378 u_int64_t SgAddress; 379 u_int32_t SgByteCount; 380 } __packed; 381 382 struct aac_sg_entryraw { 383 u_int32_t Next; /* reserved for FW use */ 384 u_int32_t Prev; /* reserved for FW use */ 385 u_int64_t SgAddress; 386 u_int32_t SgByteCount; 387 u_int32_t Flags; /* reserved for FW use */ 388 } __packed; 389 390 struct aac_sg_table { 391 u_int32_t SgCount; 392 struct aac_sg_entry SgEntry[0]; 393 } __packed; 394 395 /* 396 * Host-side scatter/gather list for 64-bit commands. 397 */ 398 struct aac_sg_table64 { 399 u_int32_t SgCount; 400 struct aac_sg_entry64 SgEntry64[0]; 401 } __packed; 402 403 /* 404 * s/g list for raw commands 405 */ 406 struct aac_sg_tableraw { 407 u_int32_t SgCount; 408 struct aac_sg_entryraw SgEntryRaw[0]; 409 } __packed; 410 411 /* 412 * Container creation data 413 */ 414 struct aac_container_creation { 415 u_int8_t ViaBuildNumber; 416 u_int8_t MicroSecond; 417 u_int8_t Via; /* 1 = FSU, 2 = API, etc. */ 418 u_int8_t YearsSince1900; 419 u_int32_t Month:4; /* 1-12 */ 420 u_int32_t Day:6; /* 1-32 */ 421 u_int32_t Hour:6; /* 0-23 */ 422 u_int32_t Minute:6; /* 0-59 */ 423 u_int32_t Second:6; /* 0-59 */ 424 u_int64_t ViaAdapterSerialNumber; 425 } __packed; 426 427 /* 428 * Revision number handling 429 */ 430 431 typedef enum { 432 RevApplication = 1, 433 RevDkiCli, 434 RevNetService, 435 RevApi, 436 RevFileSysDriver, 437 RevMiniportDriver, 438 RevAdapterSW, 439 RevMonitor, 440 RevRemoteApi 441 } RevComponent; 442 443 struct FsaRevision { 444 union { 445 struct { 446 u_int8_t dash; 447 u_int8_t type; 448 u_int8_t minor; 449 u_int8_t major; 450 } comp; 451 u_int32_t ul; 452 } external; 453 u_int32_t buildNumber; 454 } __packed; 455 456 /* 457 * Adapter Information 458 */ 459 460 typedef enum { 461 CPU_NTSIM = 1, 462 CPU_I960, 463 CPU_ARM, 464 CPU_SPARC, 465 CPU_POWERPC, 466 CPU_ALPHA, 467 CPU_P7, 468 CPU_I960_RX, 469 CPU_MIPS, 470 CPU_XSCALE, 471 CPU__last 472 } AAC_CpuType; 473 474 typedef enum { 475 CPUI960_JX = 1, 476 CPUI960_CX, 477 CPUI960_HX, 478 CPUI960_RX, 479 CPUARM_SA110, 480 CPUARM_xxx, 481 CPUPPC_603e, 482 CPUPPC_xxx, 483 CPUI960_80303, 484 CPU_XSCALE_80321, 485 CPU_MIPS_4KC, 486 CPU_MIPS_5KC, 487 CPUSUBTYPE__last 488 } AAC_CpuSubType; 489 490 typedef enum { 491 PLAT_NTSIM = 1, 492 PLAT_V3ADU, 493 PLAT_CYCLONE, 494 PLAT_CYCLONE_HD, 495 PLAT_BATBOARD, 496 PLAT_BATBOARD_HD, 497 PLAT_YOLO, 498 PLAT_COBRA, 499 PLAT_ANAHEIM, 500 PLAT_JALAPENO, 501 PLAT_QUEENS, 502 PLAT_JALAPENO_DELL, 503 PLAT_POBLANO, 504 PLAT_POBLANO_OPAL, 505 PLAT_POBLANO_SL0, 506 PLAT_POBLANO_SL1, 507 PLAT_POBLANO_SL2, 508 PLAT_POBLANO_XXX, 509 PLAT_JALAPENO_P2, 510 PLAT_HABANERO, 511 PLAT_VULCAN, 512 PLAT_CRUSADER, 513 PLAT_LANCER, 514 PLAT_HARRIER, 515 PLAT_TERMINATOR, 516 PLAT_SKYHAWK, 517 PLAT_CORSAIR, 518 PLAT_JAGUAR, 519 PLAT_SATAHAWK, 520 PLAT_SATANATOR, 521 PLAT_PROWLER, 522 PLAT_BLACKBIRD, 523 PLAT_SABREEXPRESS, 524 PLAT_INTRUDER, 525 PLAT__last 526 } AAC_Platform; 527 528 typedef enum { 529 OEM_FLAVOR_ADAPTEC = 1, 530 OEM_FLAVOR_DELL, 531 OEM_FLAVOR_HP, 532 OEM_FLAVOR_IBM, 533 OEM_FLAVOR_CPQ, 534 OEM_FLAVOR_FSC, 535 OEM_FLAVOR_DWS, 536 OEM_FLAVOR_BRAND_Z, 537 OEM_FLAVOR_LEGEND, 538 OEM_FLAVOR_HITACHI, 539 OEM_FLAVOR_ESG, 540 OEM_FLAVOR_ICP, 541 OEM_FLAVOR_SCM, 542 OEM_FLAVOR__last 543 } AAC_OemFlavor; 544 545 /* 546 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT 547 */ 548 typedef enum 549 { 550 PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */ 551 PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */ 552 PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */ 553 PLATFORM_BAT_OPT_NOTPRESENT, /* BATTERY OPTIONAL AND NOT PRESENT */ 554 PLATFORM_BAT_NOT_SUPPORTED /* BATTERY NOT SUPPORTED */ 555 } AAC_BatteryPlatform; 556 557 /* 558 * options supported by this board 559 * there has to be a one to one mapping of these defines and the ones in 560 * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT 561 */ 562 #define AAC_SUPPORTED_SNAPSHOT 0x01 563 #define AAC_SUPPORTED_CLUSTERS 0x02 564 #define AAC_SUPPORTED_WRITE_CACHE 0x04 565 #define AAC_SUPPORTED_64BIT_DATA 0x08 566 #define AAC_SUPPORTED_HOST_TIME_FIB 0x10 567 #define AAC_SUPPORTED_RAID50 0x20 568 #define AAC_SUPPORTED_4GB_WINDOW 0x40 569 #define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80 570 #define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100 571 #define AAC_SUPPORTED_NOT_RECONDITION 0x200 572 #define AAC_SUPPORTED_SGMAP_HOST64 0x400 573 #define AAC_SUPPORTED_ALARM 0x800 574 #define AAC_SUPPORTED_NONDASD 0x1000 575 #define AAC_SUPPORTED_SCSI_MANAGED 0x2000 576 #define AAC_SUPPORTED_RAID_SCSI_MODE 0x4000 577 #define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO 0x10000 578 #define AAC_SUPPORTED_NEW_COMM 0x20000 579 #define AAC_SUPPORTED_64BIT_ARRAYSIZE 0x40000 580 #define AAC_SUPPORTED_HEAT_SENSOR 0x80000 581 582 /* 583 * Structure used to respond to a RequestAdapterInfo fib. 584 */ 585 struct aac_adapter_info { 586 AAC_Platform PlatformBase; /* adapter type */ 587 AAC_CpuType CpuArchitecture; /* adapter CPU type */ 588 AAC_CpuSubType CpuVariant; /* adapter CPU subtype */ 589 u_int32_t ClockSpeed; /* adapter CPU clockspeed */ 590 u_int32_t ExecutionMem; /* adapter Execution Memory 591 * size */ 592 u_int32_t BufferMem; /* adapter Data Memory */ 593 u_int32_t TotalMem; /* adapter Total Memory */ 594 struct FsaRevision KernelRevision; /* adapter Kernel Software 595 * Revision */ 596 struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic 597 * Software Revision */ 598 struct FsaRevision HardwareRevision;/* TBD */ 599 struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ 600 u_int32_t ClusteringEnabled; 601 u_int32_t ClusterChannelMask; 602 u_int64_t SerialNumber; 603 AAC_BatteryPlatform batteryPlatform; 604 u_int32_t SupportedOptions; /* supported features of this 605 * controller */ 606 AAC_OemFlavor OemVariant; 607 } __packed; 608 609 /* 610 * Structure used to respond to a RequestSupplementAdapterInfo fib. 611 */ 612 struct vpd_info { 613 u_int8_t AssemblyPn[8]; 614 u_int8_t FruPn[8]; 615 u_int8_t BatteryFruPn[8]; 616 u_int8_t EcVersionString[8]; 617 u_int8_t Tsid[12]; 618 } __packed; 619 620 #define MFG_PCBA_SERIAL_NUMBER_WIDTH 12 621 #define MFG_WWN_WIDTH 8 622 623 struct aac_supplement_adapter_info { 624 /* The assigned Adapter Type Text, extra byte for null termination */ 625 int8_t AdapterTypeText[17+1]; 626 /* Pad for the text above */ 627 int8_t Pad[2]; 628 /* Size in bytes of the memory that is flashed */ 629 u_int32_t FlashMemoryByteSize; 630 /* The assigned IMAGEID_xxx for this adapter */ 631 u_int32_t FlashImageId; 632 /* 633 * The maximum number of Phys available on a SATA/SAS 634 * Controller, 0 otherwise 635 */ 636 u_int32_t MaxNumberPorts; 637 /* Version of expansion area */ 638 u_int32_t Version; 639 u_int32_t FeatureBits; 640 u_int8_t SlotNumber; 641 u_int8_t ReservedPad0[3]; 642 u_int8_t BuildDate[12]; 643 /* The current number of Ports on a SAS controller, 0 otherwise */ 644 u_int32_t CurrentNumberPorts; 645 646 struct vpd_info VpdInfo; 647 648 /* Firmware Revision (Vmaj.min-dash.) */ 649 struct FsaRevision FlashFirmwareRevision; 650 u_int32_t RaidTypeMorphOptions; 651 /* Firmware's boot code Revision (Vmaj.min-dash.) */ 652 struct FsaRevision FlashFirmwareBootRevision; 653 /* PCBA serial no. from th MFG sector */ 654 u_int8_t MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH]; 655 /* WWN from the MFG sector */ 656 u_int8_t MfgWWNName[MFG_WWN_WIDTH]; 657 /* Growth Area for future expansion ((7*4) - 12 - 8)/4 = 2 words */ 658 u_int32_t ReservedGrowth[2]; 659 } __packed; 660 661 /* 662 * Monitor/Kernel interface. 663 */ 664 665 /* 666 * Synchronous commands to the monitor/kernel. 667 */ 668 #define AAC_MONKER_BREAKPOINT 0x04 669 #define AAC_MONKER_INITSTRUCT 0x05 670 #define AAC_MONKER_SYNCFIB 0x0c 671 #define AAC_MONKER_GETKERNVER 0x11 672 #define AAC_MONKER_POSTRESULTS 0x14 673 #define AAC_MONKER_GETINFO 0x19 674 #define AAC_MONKER_GETDRVPROP 0x23 675 #define AAC_MONKER_RCVTEMP 0x25 676 #define AAC_MONKER_GETCOMMPREF 0x26 677 #define AAC_MONKER_REINIT 0xee 678 679 /* 680 * Adapter Status Register 681 * 682 * Phase Staus mailbox is 32bits: 683 * <31:16> = Phase Status 684 * <15:0> = Phase 685 * 686 * The adapter reports its present state through the phase. Only 687 * a single phase should be ever be set. Each phase can have multiple 688 * phase status bits to provide more detailed information about the 689 * state of the adapter. 690 */ 691 #define AAC_SELF_TEST_FAILED 0x00000004 692 #define AAC_MONITOR_PANIC 0x00000020 693 #define AAC_UP_AND_RUNNING 0x00000080 694 #define AAC_KERNEL_PANIC 0x00000100 695 696 /* 697 * Data types relating to control and monitoring of the NVRAM/WriteCache 698 * subsystem. 699 */ 700 701 #define AAC_NFILESYS 24 /* maximum number of filesystems */ 702 703 /* 704 * NVRAM/Write Cache subsystem states 705 */ 706 typedef enum { 707 NVSTATUS_DISABLED = 0, /* present, clean, not being used */ 708 NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */ 709 NVSTATUS_ERROR, /* present, dirty, contains dirty data */ 710 NVSTATUS_BATTERY, /* present, bad or low battery, may contain 711 * dirty data */ 712 NVSTATUS_UNKNOWN /* for bad/missing device */ 713 } AAC_NVSTATUS; 714 715 /* 716 * NVRAM/Write Cache subsystem battery component states 717 * 718 */ 719 typedef enum { 720 NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */ 721 NVBATTSTATUS_LOW, /* battery is low on power */ 722 NVBATTSTATUS_OK, /* battery is okay - normal operation possible 723 * only in this state */ 724 NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning 725 * in process */ 726 } AAC_NVBATTSTATUS; 727 728 /* 729 * Battery transition type 730 */ 731 typedef enum { 732 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not 733 * present */ 734 NVBATT_TRANSITION_LOW, /* battery is now low on power */ 735 NVBATT_TRANSITION_OK /* battery is now okay - normal 736 * operation possible only in this 737 * state */ 738 } AAC_NVBATT_TRANSITION; 739 740 /* 741 * NVRAM Info structure returned for NVRAM_GetInfo call 742 */ 743 struct aac_nvramdevinfo { 744 u_int32_t NV_Enabled; /* write caching enabled */ 745 u_int32_t NV_Error; /* device in error state */ 746 u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */ 747 u_int32_t NV_NActive; /* count of NVRAM buffers being 748 * written */ 749 } __packed; 750 751 struct aac_nvraminfo { 752 AAC_NVSTATUS NV_Status; /* nvram subsystem status */ 753 AAC_NVBATTSTATUS NV_BattStatus; /* battery status */ 754 u_int32_t NV_Size; /* size of WriteCache NVRAM in 755 * bytes */ 756 u_int32_t NV_BufSize; /* size of NVRAM buffers in 757 * bytes */ 758 u_int32_t NV_NBufs; /* number of NVRAM buffers */ 759 u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */ 760 u_int32_t NV_NClean; /* Num clean NVRAM buffers */ 761 u_int32_t NV_NActive; /* Num NVRAM buffers being 762 * written */ 763 u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */ 764 struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device 765 * info */ 766 u_int32_t NV_BattNeedsReconditioning; /* boolean */ 767 u_int32_t NV_TotalSize; /* size of all non-volatile 768 * memories in bytes */ 769 } __packed; 770 771 /* 772 * Data types relating to adapter-initiated FIBs 773 * 774 * Based on types and structures in <aifstruc.h> 775 */ 776 777 /* 778 * Progress Reports 779 */ 780 typedef enum { 781 AifJobStsSuccess = 1, 782 AifJobStsFinished, 783 AifJobStsAborted, 784 AifJobStsFailed, 785 AifJobStsLastReportMarker = 100, /* All prior mean last report */ 786 AifJobStsSuspended, 787 AifJobStsRunning 788 } AAC_AifJobStatus; 789 790 typedef enum { 791 AifJobScsiMin = 1, /* Minimum value for Scsi operation */ 792 AifJobScsiZero, /* SCSI device clear operation */ 793 AifJobScsiVerify, /* SCSI device Verify operation NO 794 * REPAIR */ 795 AifJobScsiExercise, /* SCSI device Exercise operation */ 796 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH 797 * repair */ 798 AifJobScsiWritePattern, /* write pattern */ 799 AifJobScsiMax = 99, /* Max Scsi value */ 800 AifJobCtrMin, /* Min Ctr op value */ 801 AifJobCtrZero, /* Container clear operation */ 802 AifJobCtrCopy, /* Container copy operation */ 803 AifJobCtrCreateMirror, /* Container Create Mirror operation */ 804 AifJobCtrMergeMirror, /* Container Merge Mirror operation */ 805 AifJobCtrScrubMirror, /* Container Scrub Mirror operation */ 806 AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */ 807 AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */ 808 AifJobCtrMorph, /* Container morph operation */ 809 AifJobCtrPartCopy, /* Container Partition copy operation */ 810 AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */ 811 AifJobCtrCrazyCache, /* crazy cache */ 812 AifJobCtrCopyback, /* Container Copyback operation */ 813 AifJobCtrCompactRaid5D, /* Container Compaction operation */ 814 AifJobCtrExpandRaid5D, /* Container Expansion operation */ 815 AifJobCtrRebuildRaid6, /* Container Rebuild Raid6 operation */ 816 AifJobCtrScrubRaid6, /* Container Scrub Raid6 operation */ 817 AifJobCtrSSBackup, /* Container snapshot backup task */ 818 AifJobCtrMax = 199, /* Max Ctr type operation */ 819 AifJobFsMin, /* Min Fs type operation */ 820 AifJobFsCreate, /* File System Create operation */ 821 AifJobFsVerify, /* File System Verify operation */ 822 AifJobFsExtend, /* File System Extend operation */ 823 AifJobFsMax = 299, /* Max Fs type operation */ 824 AifJobApiFormatNTFS, /* Format a drive to NTFS */ 825 AifJobApiFormatFAT, /* Format a drive to FAT */ 826 AifJobApiUpdateSnapshot, /* update the read/write half of a 827 * snapshot */ 828 AifJobApiFormatFAT32, /* Format a drive to FAT32 */ 829 AifJobApiMax = 399, /* Max API type operation */ 830 AifJobCtlContinuousCtrVerify, /* Adapter operation */ 831 AifJobCtlMax = 499 /* Max Adapter type operation */ 832 } AAC_AifJobType; 833 834 struct aac_AifContainers { 835 u_int32_t src; /* from/master */ 836 u_int32_t dst; /* to/slave */ 837 } __packed; 838 839 union aac_AifJobClient { 840 struct aac_AifContainers container; /* For Container and 841 * filesystem progress 842 * ops; */ 843 int32_t scsi_dh; /* For SCSI progress 844 * ops */ 845 }; 846 847 struct aac_AifJobDesc { 848 u_int32_t jobID; /* DO NOT FILL IN! Will be 849 * filled in by AIF */ 850 AAC_AifJobType type; /* Operation that is being 851 * performed */ 852 union aac_AifJobClient client; /* Details */ 853 } __packed; 854 855 struct aac_AifJobProgressReport { 856 struct aac_AifJobDesc jd; 857 AAC_AifJobStatus status; 858 u_int32_t finalTick; 859 u_int32_t currentTick; 860 u_int32_t jobSpecificData1; 861 u_int32_t jobSpecificData2; 862 } __packed; 863 864 /* 865 * Event Notification 866 */ 867 typedef enum { 868 /* General application notifies start here */ 869 AifEnGeneric = 1, /* Generic notification */ 870 AifEnTaskComplete, /* Task has completed */ 871 AifEnConfigChange, /* Adapter config change occurred */ 872 AifEnContainerChange, /* Adapter specific container 873 * configuration change */ 874 AifEnDeviceFailure, /* SCSI device failed */ 875 AifEnMirrorFailover, /* Mirror failover started */ 876 AifEnContainerEvent, /* Significant container event */ 877 AifEnFileSystemChange, /* File system changed */ 878 AifEnConfigPause, /* Container pause event */ 879 AifEnConfigResume, /* Container resume event */ 880 AifEnFailoverChange, /* Failover space assignment changed */ 881 AifEnRAID5RebuildDone, /* RAID5 rebuild finished */ 882 AifEnEnclosureManagement, /* Enclosure management event */ 883 AifEnBatteryEvent, /* Significant NV battery event */ 884 AifEnAddContainer, /* A new container was created. */ 885 AifEnDeleteContainer, /* A container was deleted. */ 886 AifEnSMARTEvent, /* SMART Event */ 887 AifEnBatteryNeedsRecond, /* The battery needs reconditioning */ 888 AifEnClusterEvent, /* Some cluster event */ 889 AifEnDiskSetEvent, /* A disk set event occurred. */ 890 AifEnContainerScsiEvent, /* a container event with no. and scsi id */ 891 AifEnPicBatteryEvent, /* An event gen. by pic_battery.c for an ABM */ 892 AifEnExpEvent, /* Exp. Event Type to replace CTPopUp messages */ 893 AifEnRAID6RebuildDone, /* RAID6 rebuild finished */ 894 AifEnSensorOverHeat, /* Heat Sensor indicate overheat */ 895 AifEnSensorCoolDown, /* Heat Sensor ind. cooled down after overheat */ 896 AifFeatureKeysModified, /* notif. of updated feature keys */ 897 AifApplicationExpirationEvent, /* notif. on app. expiration status */ 898 AifEnBackgroundConsistencyCheck,/* BCC notif. for NEC - DDTS 94700 */ 899 AifEnAddJBOD, /* A new JBOD type drive was created (30) */ 900 AifEnDeleteJBOD, /* A JBOD type drive was deleted (31) */ 901 AifDriverNotifyStart=199, /* Notifies for host driver go here */ 902 /* Host driver notifications start here */ 903 AifDenMorphComplete, /* A morph operation completed */ 904 AifDenVolumeExtendComplete /* Volume expand operation completed */ 905 } AAC_AifEventNotifyType; 906 907 struct aac_AifEnsGeneric { 908 char text[132]; /* Generic text */ 909 } __packed; 910 911 struct aac_AifEnsDeviceFailure { 912 u_int32_t deviceHandle; /* SCSI device handle */ 913 } __packed; 914 915 struct aac_AifEnsMirrorFailover { 916 u_int32_t container; /* Container with failed element */ 917 u_int32_t failedSlice; /* Old slice which failed */ 918 u_int32_t creatingSlice; /* New slice used for auto-create */ 919 } __packed; 920 921 struct aac_AifEnsContainerChange { 922 u_int32_t container[2]; /* container that changed, -1 if no 923 * container */ 924 } __packed; 925 926 struct aac_AifEnsContainerEvent { 927 u_int32_t container; /* container number */ 928 u_int32_t eventType; /* event type */ 929 } __packed; 930 931 struct aac_AifEnsEnclosureEvent { 932 u_int32_t empID; /* enclosure management proc number */ 933 u_int32_t unitID; /* unitId, fan id, power supply id, 934 * slot id, tempsensor id. */ 935 u_int32_t eventType; /* event type */ 936 } __packed; 937 938 typedef enum { 939 AIF_EM_DRIVE_INSERTION=31, 940 AIF_EM_DRIVE_REMOVAL 941 } aac_AifEMEventType; 942 943 struct aac_AifEnsBatteryEvent { 944 AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */ 945 AAC_NVBATTSTATUS current_state; /* current batt state */ 946 AAC_NVBATTSTATUS prior_state; /* prev batt state */ 947 } __packed; 948 949 struct aac_AifEnsDiskSetEvent { 950 u_int32_t eventType; 951 u_int64_t DsNum; 952 u_int64_t CreatorId; 953 } __packed; 954 955 typedef enum { 956 CLUSTER_NULL_EVENT = 0, 957 CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or 958 * adaptername from NULL to non-NULL */ 959 /* (partner's agent may be up) */ 960 CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or 961 * adaptername from non-null to NULL */ 962 /* (partner has rebooted) */ 963 } AAC_ClusterAifEvent; 964 965 struct aac_AifEnsClusterEvent { 966 AAC_ClusterAifEvent eventType; 967 } __packed; 968 969 struct aac_AifEventNotify { 970 AAC_AifEventNotifyType type; 971 union { 972 struct aac_AifEnsGeneric EG; 973 struct aac_AifEnsDeviceFailure EDF; 974 struct aac_AifEnsMirrorFailover EMF; 975 struct aac_AifEnsContainerChange ECC; 976 struct aac_AifEnsContainerEvent ECE; 977 struct aac_AifEnsEnclosureEvent EEE; 978 struct aac_AifEnsBatteryEvent EBE; 979 struct aac_AifEnsDiskSetEvent EDS; 980 /* struct aac_AifEnsSMARTEvent ES;*/ 981 struct aac_AifEnsClusterEvent ECLE; 982 } data; 983 } __packed; 984 985 /* 986 * Adapter Initiated FIB command structures. Start with the adapter 987 * initiated FIBs that really come from the adapter, and get responded 988 * to by the host. 989 */ 990 #define AAC_AIF_REPORT_MAX_SIZE 64 991 992 typedef enum { 993 AifCmdEventNotify = 1, /* Notify of event */ 994 AifCmdJobProgress, /* Progress report */ 995 AifCmdAPIReport, /* Report from other user of API */ 996 AifCmdDriverNotify, /* Notify host driver of event */ 997 AifReqJobList = 100, /* Gets back complete job list */ 998 AifReqJobsForCtr, /* Gets back jobs for specific container */ 999 AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */ 1000 AifReqJobReport, /* Gets back a specific job report or list */ 1001 AifReqTerminateJob, /* Terminates job */ 1002 AifReqSuspendJob, /* Suspends a job */ 1003 AifReqResumeJob, /* Resumes a job */ 1004 AifReqSendAPIReport, /* API generic report requests */ 1005 AifReqAPIJobStart, /* Start a job from the API */ 1006 AifReqAPIJobUpdate, /* Update a job report from the API */ 1007 AifReqAPIJobFinish /* Finish a job from the API */ 1008 } AAC_AifCommand; 1009 1010 struct aac_aif_command { 1011 AAC_AifCommand command; /* Tell host what type of 1012 * notify this is */ 1013 u_int32_t seqNumber; /* To allow ordering of 1014 * reports (if necessary) */ 1015 union { 1016 struct aac_AifEventNotify EN; /* Event notify */ 1017 struct aac_AifJobProgressReport PR[1]; /* Progress report */ 1018 u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE]; 1019 u_int8_t data[AAC_FIB_DATASIZE - 8]; 1020 } data; 1021 } __packed; 1022 1023 /* 1024 * Filesystem commands/data 1025 * 1026 * The adapter has a very complex filesystem interface, most of which we ignore. 1027 * (And which seems not to be implemented, anyway.) 1028 */ 1029 1030 /* 1031 * FSA commands 1032 * (not used?) 1033 */ 1034 typedef enum { 1035 Null = 0, 1036 GetAttributes, 1037 SetAttributes, 1038 Lookup, 1039 ReadLink, 1040 Read, 1041 Write, 1042 Create, 1043 MakeDirectory, 1044 SymbolicLink, 1045 MakeNode, 1046 Removex, 1047 RemoveDirectory, 1048 Rename, 1049 Link, 1050 ReadDirectory, 1051 ReadDirectoryPlus, 1052 FileSystemStatus, 1053 FileSystemInfo, 1054 PathConfigure, 1055 Commit, 1056 Mount, 1057 UnMount, 1058 Newfs, 1059 FsCheck, 1060 FsSync, 1061 SimReadWrite, 1062 SetFileSystemStatus, 1063 BlockRead, 1064 BlockWrite, 1065 NvramIoctl, 1066 FsSyncWait, 1067 ClearArchiveBit, 1068 SetAcl, 1069 GetAcl, 1070 AssignAcl, 1071 FaultInsertion, 1072 CrazyCache 1073 } AAC_FSACommand; 1074 1075 /* 1076 * Command status values 1077 */ 1078 typedef enum { 1079 ST_OK = 0, 1080 ST_PERM = 1, 1081 ST_NOENT = 2, 1082 ST_IO = 5, 1083 ST_NXIO = 6, 1084 ST_E2BIG = 7, 1085 ST_ACCES = 13, 1086 ST_EXIST = 17, 1087 ST_XDEV = 18, 1088 ST_NODEV = 19, 1089 ST_NOTDIR = 20, 1090 ST_ISDIR = 21, 1091 ST_INVAL = 22, 1092 ST_FBIG = 27, 1093 ST_NOSPC = 28, 1094 ST_ROFS = 30, 1095 ST_MLINK = 31, 1096 ST_WOULDBLOCK = 35, 1097 ST_NAMETOOLONG = 63, 1098 ST_NOTEMPTY = 66, 1099 ST_DQUOT = 69, 1100 ST_STALE = 70, 1101 ST_REMOTE = 71, 1102 ST_NOT_READY = 72, 1103 ST_BADHANDLE = 10001, 1104 ST_NOT_SYNC = 10002, 1105 ST_BAD_COOKIE = 10003, 1106 ST_NOTSUPP = 10004, 1107 ST_TOOSMALL = 10005, 1108 ST_SERVERFAULT = 10006, 1109 ST_BADTYPE = 10007, 1110 ST_JUKEBOX = 10008, 1111 ST_NOTMOUNTED = 10009, 1112 ST_MAINTMODE = 10010, 1113 ST_STALEACL = 10011, 1114 ST_BUS_RESET = 20001 1115 } AAC_FSAStatus; 1116 1117 /* 1118 * Volume manager commands 1119 */ 1120 typedef enum _VM_COMMANDS { 1121 VM_Null = 0, 1122 VM_NameServe, 1123 VM_ContainerConfig, 1124 VM_Ioctl, 1125 VM_FilesystemIoctl, 1126 VM_CloseAll, 1127 VM_CtBlockRead, 1128 VM_CtBlockWrite, 1129 VM_SliceBlockRead, /* raw access to configured storage objects */ 1130 VM_SliceBlockWrite, 1131 VM_DriveBlockRead, /* raw access to physical devices */ 1132 VM_DriveBlockWrite, 1133 VM_EnclosureMgt, /* enclosure management */ 1134 VM_Unused, /* used to be diskset management */ 1135 VM_CtBlockVerify, 1136 VM_CtPerf, /* performance test */ 1137 VM_CtBlockRead64, 1138 VM_CtBlockWrite64, 1139 VM_CtBlockVerify64, 1140 VM_CtHostRead64, 1141 VM_CtHostWrite64, 1142 VM_DrvErrTblLog, /* drive error table/log type of command */ 1143 VM_NameServe64 1144 } AAC_VMCommand; 1145 1146 /* 1147 * "mountable object" 1148 */ 1149 struct aac_mntobj { 1150 u_int32_t ObjectId; 1151 char FileSystemName[16]; 1152 struct aac_container_creation CreateInfo; 1153 u_int32_t Capacity; 1154 u_int32_t VolType; 1155 u_int32_t ObjType; 1156 u_int32_t ContentState; 1157 #define FSCS_READONLY 0x0002 /* XXX need more information 1158 * than this */ 1159 union { 1160 u_int32_t pad[8]; 1161 } ObjExtension; 1162 u_int32_t AlterEgoId; 1163 u_int32_t CapacityHigh; 1164 } __packed; 1165 1166 struct aac_mntinfo { 1167 u_int32_t Command; 1168 u_int32_t MntType; 1169 u_int32_t MntCount; 1170 } __packed; 1171 1172 struct aac_mntinforesp { 1173 u_int32_t Status; 1174 u_int32_t MntType; 1175 u_int32_t MntRespCount; 1176 struct aac_mntobj MntTable[1]; 1177 } __packed; 1178 1179 /* 1180 * Container shutdown command. 1181 */ 1182 struct aac_closecommand { 1183 u_int32_t Command; 1184 u_int32_t ContainerId; 1185 } __packed; 1186 1187 /* 1188 * Container Config Command 1189 */ 1190 #define CT_GET_SCSI_METHOD 64 1191 struct aac_ctcfg { 1192 u_int32_t Command; 1193 u_int32_t cmd; 1194 u_int32_t param; 1195 } __packed; 1196 1197 struct aac_ctcfg_resp { 1198 u_int32_t Status; 1199 u_int32_t resp; 1200 u_int32_t param; 1201 } __packed; 1202 1203 /* 1204 * 'Ioctl' commads 1205 */ 1206 #define AAC_SCSI_MAX_PORTS 10 1207 #define AAC_BUS_NO_EXIST 0 1208 #define AAC_BUS_VALID 1 1209 #define AAC_BUS_FAULTED 2 1210 #define AAC_BUS_DISABLED 3 1211 #define GetBusInfo 0x9 1212 1213 struct aac_getbusinf { 1214 u_int32_t ProbeComplete; 1215 u_int32_t BusCount; 1216 u_int32_t TargetsPerBus; 1217 u_int8_t InitiatorBusId[AAC_SCSI_MAX_PORTS]; 1218 u_int8_t BusValid[AAC_SCSI_MAX_PORTS]; 1219 } __packed; 1220 1221 struct aac_vmioctl { 1222 u_int32_t Command; 1223 u_int32_t ObjType; 1224 u_int32_t MethId; 1225 u_int32_t ObjId; 1226 u_int32_t IoctlCmd; 1227 u_int32_t IoctlBuf[1]; /* Placeholder? */ 1228 } __packed; 1229 1230 struct aac_vmi_businf_resp { 1231 u_int32_t Status; 1232 u_int32_t ObjType; 1233 u_int32_t MethId; 1234 u_int32_t ObjId; 1235 u_int32_t IoctlCmd; 1236 struct aac_getbusinf BusInf; 1237 } __packed; 1238 1239 #if 0 1240 #define AAC_BTL_TO_HANDLE(b, t, l) \ 1241 (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf)) 1242 #else 1243 #define AAC_BTL_TO_HANDLE(b, t, l) \ 1244 ((((u_int32_t)b & 0x0f) << 24) | \ 1245 (((u_int32_t)l & 0xff) << 16) | \ 1246 ((u_int32_t)t & 0xffff)) 1247 #endif 1248 #define GetDeviceProbeInfo 0x5 1249 1250 struct aac_vmi_devinfo_resp { 1251 u_int32_t Status; 1252 u_int32_t ObjType; 1253 u_int32_t MethId; 1254 u_int32_t ObjId; 1255 u_int32_t IoctlCmd; 1256 u_int8_t VendorId[8]; 1257 u_int8_t ProductId[16]; 1258 u_int8_t ProductRev[4]; 1259 u_int32_t Inquiry7; 1260 u_int32_t align1; 1261 u_int32_t Inquiry0; 1262 u_int32_t align2; 1263 u_int32_t Inquiry1; 1264 u_int32_t align3; 1265 u_int32_t reserved[2]; 1266 u_int8_t VendorSpecific[20]; 1267 u_int32_t Smart:1; 1268 u_int32_t AAC_Managed:1; 1269 u_int32_t align4; 1270 u_int32_t reserved2:6; 1271 u_int32_t Bus; 1272 u_int32_t Target; 1273 u_int32_t Lun; 1274 u_int32_t ultraEnable:1, 1275 disconnectEnable:1, 1276 fast20EnabledW:1, 1277 scamDevice:1, 1278 scamTolerant:1, 1279 setForSync:1, 1280 setForWide:1, 1281 syncDevice:1, 1282 wideDevice:1, 1283 reserved1:7, 1284 ScsiRate:8, 1285 ScsiOffset:8; 1286 }; /* Do not pack */ 1287 1288 #define ResetBus 0x16 1289 struct aac_resetbus { 1290 u_int32_t BusNumber; 1291 }; 1292 1293 /* 1294 * Write 'stability' options. 1295 */ 1296 typedef enum { 1297 CSTABLE = 1, 1298 CUNSTABLE 1299 } AAC_CacheLevel; 1300 1301 /* 1302 * Commit level response for a write request. 1303 */ 1304 typedef enum { 1305 CMFILE_SYNC_NVRAM = 1, 1306 CMDATA_SYNC_NVRAM, 1307 CMFILE_SYNC, 1308 CMDATA_SYNC, 1309 CMUNSTABLE 1310 } AAC_CommitLevel; 1311 1312 /* 1313 * Block read/write operations. 1314 * These structures are packed into the 'data' area in the FIB. 1315 */ 1316 1317 struct aac_blockread { 1318 u_int32_t Command; /* not FSACommand! */ 1319 u_int32_t ContainerId; 1320 u_int32_t BlockNumber; 1321 u_int32_t ByteCount; 1322 struct aac_sg_table SgMap; /* variable size */ 1323 } __packed; 1324 1325 struct aac_blockread64 { 1326 u_int32_t Command; 1327 u_int16_t ContainerId; 1328 u_int16_t SectorCount; 1329 u_int32_t BlockNumber; 1330 u_int16_t Pad; 1331 u_int16_t Flags; 1332 struct aac_sg_table64 SgMap64; 1333 } __packed; 1334 1335 struct aac_blockread_response { 1336 u_int32_t Status; 1337 u_int32_t ByteCount; 1338 } __packed; 1339 1340 struct aac_blockwrite { 1341 u_int32_t Command; /* not FSACommand! */ 1342 u_int32_t ContainerId; 1343 u_int32_t BlockNumber; 1344 u_int32_t ByteCount; 1345 u_int32_t Stable; 1346 struct aac_sg_table SgMap; /* variable size */ 1347 } __packed; 1348 1349 struct aac_blockwrite64 { 1350 u_int32_t Command; /* not FSACommand! */ 1351 u_int16_t ContainerId; 1352 u_int16_t SectorCount; 1353 u_int32_t BlockNumber; 1354 u_int16_t Pad; 1355 u_int16_t Flags; 1356 struct aac_sg_table64 SgMap64; /* variable size */ 1357 } __packed; 1358 1359 struct aac_blockwrite_response { 1360 u_int32_t Status; 1361 u_int32_t ByteCount; 1362 u_int32_t Committed; 1363 } __packed; 1364 1365 struct aac_raw_io { 1366 u_int64_t BlockNumber; 1367 u_int32_t ByteCount; 1368 u_int16_t ContainerId; 1369 u_int16_t Flags; /* 0: W, 1: R */ 1370 u_int16_t BpTotal; /* reserved for FW use */ 1371 u_int16_t BpComplete; /* reserved for FW use */ 1372 struct aac_sg_tableraw SgMapRaw; /* variable size */ 1373 } __packed; 1374 1375 /* 1376 * Container shutdown command. 1377 */ 1378 struct aac_close_command { 1379 u_int32_t Command; 1380 u_int32_t ContainerId; 1381 }; 1382 1383 /* 1384 * SCSI Passthrough structures 1385 */ 1386 struct aac_srb { 1387 u_int32_t function; 1388 u_int32_t bus; 1389 u_int32_t target; 1390 u_int32_t lun; 1391 u_int32_t timeout; 1392 u_int32_t flags; 1393 u_int32_t data_len; 1394 u_int32_t retry_limit; 1395 u_int32_t cdb_len; 1396 u_int8_t cdb[16]; 1397 struct aac_sg_table sg_map; 1398 }; 1399 1400 enum { 1401 AAC_SRB_FUNC_EXECUTE_SCSI = 0x00, 1402 AAC_SRB_FUNC_CLAIM_DEVICE, 1403 AAC_SRB_FUNC_IO_CONTROL, 1404 AAC_SRB_FUNC_RECEIVE_EVENT, 1405 AAC_SRB_FUNC_RELEASE_QUEUE, 1406 AAC_SRB_FUNC_ATTACH_DEVICE, 1407 AAC_SRB_FUNC_RELEASE_DEVICE, 1408 AAC_SRB_FUNC_SHUTDOWN, 1409 AAC_SRB_FUNC_FLUSH, 1410 AAC_SRB_FUNC_ABORT_COMMAND = 0x10, 1411 AAC_SRB_FUNC_RELEASE_RECOVERY, 1412 AAC_SRB_FUNC_RESET_BUS, 1413 AAC_SRB_FUNC_RESET_DEVICE, 1414 AAC_SRB_FUNC_TERMINATE_IO, 1415 AAC_SRB_FUNC_FLUSH_QUEUE, 1416 AAC_SRB_FUNC_REMOVE_DEVICE, 1417 AAC_SRB_FUNC_DOMAIN_VALIDATION 1418 }; 1419 1420 #define AAC_SRB_FLAGS_NO_DATA_XFER 0x0000 1421 #define AAC_SRB_FLAGS_DISABLE_DISCONNECT 0x0004 1422 #define AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER 0x0008 1423 #define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x0010 1424 #define AAC_SRB_FLAGS_DISABLE_AUTOSENSE 0x0020 1425 #define AAC_SRB_FLAGS_DATA_IN 0x0040 1426 #define AAC_SRB_FLAGS_DATA_OUT 0x0080 1427 #define AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \ 1428 (AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT) 1429 1430 #define AAC_HOST_SENSE_DATA_MAX 30 1431 1432 struct aac_srb_response { 1433 u_int32_t fib_status; 1434 u_int32_t srb_status; 1435 u_int32_t scsi_status; 1436 u_int32_t data_len; 1437 u_int32_t sense_len; 1438 u_int8_t sense[AAC_HOST_SENSE_DATA_MAX]; 1439 }; 1440 1441 /* 1442 * Status codes for SCSI passthrough commands. Since they are based on ASPI, 1443 * they also exactly match CAM status codes in both enumeration and meaning. 1444 * They seem to also be used as status codes for synchronous FIBs. 1445 */ 1446 enum { 1447 AAC_SRB_STS_PENDING = 0x00, 1448 AAC_SRB_STS_SUCCESS, 1449 AAC_SRB_STS_ABORTED, 1450 AAC_SRB_STS_ABORT_FAILED, 1451 AAC_SRB_STS_ERROR, 1452 AAC_SRB_STS_BUSY, 1453 AAC_SRB_STS_INVALID_REQUEST, 1454 AAC_SRB_STS_INVALID_PATH_ID, 1455 AAC_SRB_STS_NO_DEVICE, 1456 AAC_SRB_STS_TIMEOUT, 1457 AAC_SRB_STS_SELECTION_TIMEOUT, 1458 AAC_SRB_STS_COMMAND_TIMEOUT, 1459 AAC_SRB_STS_MESSAGE_REJECTED = 0x0D, 1460 AAC_SRB_STS_BUS_RESET, 1461 AAC_SRB_STS_PARITY_ERROR, 1462 AAC_SRB_STS_REQUEST_SENSE_FAILED, 1463 AAC_SRB_STS_NO_HBA, 1464 AAC_SRB_STS_DATA_OVERRUN, 1465 AAC_SRB_STS_UNEXPECTED_BUS_FREE, 1466 AAC_SRB_STS_PHASE_SEQUENCE_FAILURE, 1467 AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH, 1468 AAC_SRB_STS_REQUEST_FLUSHED, 1469 AAC_SRB_STS_INVALID_LUN = 0x20, 1470 AAC_SRB_STS_INVALID_TARGET_ID, 1471 AAC_SRB_STS_BAD_FUNCTION, 1472 AAC_SRB_STS_ERROR_RECOVERY 1473 }; 1474 1475 /* 1476 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based 1477 * on the SA110 'StrongArm'. 1478 */ 1479 1480 #define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */ 1481 #define AAC_SA_DOORBELL0_SET 0x9c 1482 #define AAC_SA_DOORBELL0 0x9c 1483 #define AAC_SA_MASK0_CLEAR 0xa0 1484 #define AAC_SA_MASK0_SET 0xa4 1485 1486 #define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */ 1487 #define AAC_SA_DOORBELL1_SET 0x9e 1488 #define AAC_SA_DOORBELL1 0x9e 1489 #define AAC_SA_MASK1_CLEAR 0xa2 1490 #define AAC_SA_MASK1_SET 0xa6 1491 1492 #define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */ 1493 #define AAC_SA_FWSTATUS 0xc4 1494 1495 /* 1496 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx, 1497 * and other related adapters. 1498 */ 1499 1500 #define AAC_RX_OMR0 0x18 /* outbound message register 0 */ 1501 #define AAC_RX_OMR1 0x1c /* outbound message register 1 */ 1502 #define AAC_RX_IDBR 0x20 /* inbound doorbell register */ 1503 #define AAC_RX_IISR 0x24 /* inbound interrupt status register */ 1504 #define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */ 1505 #define AAC_RX_ODBR 0x2c /* outbound doorbell register */ 1506 #define AAC_RX_OISR 0x30 /* outbound interrupt status register */ 1507 #define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */ 1508 #define AAC_RX_IQUE 0x40 /* inbound queue */ 1509 #define AAC_RX_OQUE 0x44 /* outbound queue */ 1510 1511 #define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */ 1512 #define AAC_RX_FWSTATUS 0x6c 1513 1514 /* 1515 * Register definitions for the Adaptec 'Rocket' RAID-On-Chip adapters. 1516 * Unsurprisingly, it's quite similar to the i960! 1517 */ 1518 1519 #define AAC_RKT_OMR0 0x18 /* outbound message register 0 */ 1520 #define AAC_RKT_OMR1 0x1c /* outbound message register 1 */ 1521 #define AAC_RKT_IDBR 0x20 /* inbound doorbell register */ 1522 #define AAC_RKT_IISR 0x24 /* inbound interrupt status register */ 1523 #define AAC_RKT_IIMR 0x28 /* inbound interrupt mask register */ 1524 #define AAC_RKT_ODBR 0x2c /* outbound doorbell register */ 1525 #define AAC_RKT_OISR 0x30 /* outbound interrupt status register */ 1526 #define AAC_RKT_OIMR 0x34 /* outbound interrupt mask register */ 1527 #define AAC_RKT_IQUE 0x40 /* inbound queue */ 1528 #define AAC_RKT_OQUE 0x44 /* outbound queue */ 1529 1530 #define AAC_RKT_MAILBOX 0x1000 /* mailbox */ 1531 #define AAC_RKT_FWSTATUS 0x101c /* Firmware Status (mailbox 7) */ 1532 1533 /* 1534 * Common bit definitions for the doorbell registers. 1535 */ 1536 1537 /* 1538 * Status bits in the doorbell registers. 1539 */ 1540 #define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */ 1541 #define AAC_DB_COMMAND_READY (1<<1) /* posted one or more commands */ 1542 #define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands complete */ 1543 #define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */ 1544 #define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */ 1545 1546 /* 1547 * The adapter can request the host print a message by setting the 1548 * DB_PRINTF flag in DOORBELL0. The driver responds by collecting the 1549 * message from the printf buffer, clearing the DB_PRINTF flag in 1550 * DOORBELL0 and setting it in DOORBELL1. 1551 * (ODBR and IDBR respectively for the i960Rx adapters) 1552 */ 1553 #define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */ 1554 #define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */ 1555 1556 /* 1557 * Mask containing the interrupt bits we care about. We don't anticipate (or 1558 * want) interrupts not in this mask. 1559 */ 1560 #define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \ 1561 AAC_DB_RESPONSE_READY | \ 1562 AAC_DB_PRINTF) 1563 #define AAC_DB_INT_NEW_COMM 0x08 1564 1565