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 INITFLAGS_NEW_COMM_SUPPORTED 1 310 u_int32_t MaxIoCommands; /* max outstanding commands */ 311 u_int32_t MaxIoSize; /* largest I/O command */ 312 u_int32_t MaxFibSize; /* largest FIB to adapter */ 313 } __packed; 314 315 /* 316 * Shared data types 317 */ 318 /* 319 * Container types 320 */ 321 typedef enum { 322 CT_NONE = 0, 323 CT_VOLUME, 324 CT_MIRROR, 325 CT_STRIPE, 326 CT_RAID5, 327 CT_SSRW, 328 CT_SSRO, 329 CT_MORPH, 330 CT_PASSTHRU, 331 CT_RAID4, 332 CT_RAID10, /* stripe of mirror */ 333 CT_RAID00, /* stripe of stripe */ 334 CT_VOLUME_OF_MIRRORS, /* volume of mirror */ 335 CT_PSEUDO_RAID3, /* really raid4 */ 336 CT_RAID50, /* stripe of raid5 */ 337 CT_RAID5D, /* raid5 distributed hot-sparing */ 338 CT_RAID5D0, 339 CT_RAID1E, /* extended raid1 mirroring */ 340 CT_RAID6, 341 CT_RAID60, 342 } AAC_FSAVolType; 343 344 /* 345 * Host-addressable object types 346 */ 347 typedef enum { 348 FT_REG = 1, /* regular file */ 349 FT_DIR, /* directory */ 350 FT_BLK, /* "block" device - reserved */ 351 FT_CHR, /* "character special" device - reserved */ 352 FT_LNK, /* symbolic link */ 353 FT_SOCK, /* socket */ 354 FT_FIFO, /* fifo */ 355 FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */ 356 FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */ 357 FT_SLICE, /* virtual disk - raw volume - slice */ 358 FT_PARTITION, /* FSA partition - carved out of a slice - building 359 * block for containers */ 360 FT_VOLUME, /* Container - Volume Set */ 361 FT_STRIPE, /* Container - Stripe Set */ 362 FT_MIRROR, /* Container - Mirror Set */ 363 FT_RAID5, /* Container - Raid 5 Set */ 364 FT_DATABASE /* Storage object with "foreign" content manager */ 365 } AAC_FType; 366 367 /* 368 * Host-side scatter/gather list for 32-bit commands. 369 */ 370 struct aac_sg_entry { 371 u_int32_t SgAddress; 372 u_int32_t SgByteCount; 373 } __packed; 374 375 struct aac_sg_entry64 { 376 u_int64_t SgAddress; 377 u_int32_t SgByteCount; 378 } __packed; 379 380 struct aac_sg_entryraw { 381 u_int32_t Next; /* reserved for FW use */ 382 u_int32_t Prev; /* reserved for FW use */ 383 u_int64_t SgAddress; 384 u_int32_t SgByteCount; 385 u_int32_t Flags; /* reserved for FW use */ 386 } __packed; 387 388 struct aac_sg_table { 389 u_int32_t SgCount; 390 struct aac_sg_entry SgEntry[0]; 391 } __packed; 392 393 /* 394 * Host-side scatter/gather list for 64-bit commands. 395 */ 396 struct aac_sg_table64 { 397 u_int32_t SgCount; 398 struct aac_sg_entry64 SgEntry64[0]; 399 } __packed; 400 401 /* 402 * s/g list for raw commands 403 */ 404 struct aac_sg_tableraw { 405 u_int32_t SgCount; 406 struct aac_sg_entryraw SgEntryRaw[0]; 407 } __packed; 408 409 /* 410 * Container creation data 411 */ 412 struct aac_container_creation { 413 u_int8_t ViaBuildNumber; 414 u_int8_t MicroSecond; 415 u_int8_t Via; /* 1 = FSU, 2 = API, etc. */ 416 u_int8_t YearsSince1900; 417 u_int32_t Month:4; /* 1-12 */ 418 u_int32_t Day:6; /* 1-32 */ 419 u_int32_t Hour:6; /* 0-23 */ 420 u_int32_t Minute:6; /* 0-59 */ 421 u_int32_t Second:6; /* 0-59 */ 422 u_int64_t ViaAdapterSerialNumber; 423 } __packed; 424 425 /* 426 * Revision number handling 427 */ 428 429 typedef enum { 430 RevApplication = 1, 431 RevDkiCli, 432 RevNetService, 433 RevApi, 434 RevFileSysDriver, 435 RevMiniportDriver, 436 RevAdapterSW, 437 RevMonitor, 438 RevRemoteApi 439 } RevComponent; 440 441 struct FsaRevision { 442 union { 443 struct { 444 u_int8_t dash; 445 u_int8_t type; 446 u_int8_t minor; 447 u_int8_t major; 448 } comp; 449 u_int32_t ul; 450 } external; 451 u_int32_t buildNumber; 452 } __packed; 453 454 /* 455 * Adapter Information 456 */ 457 458 typedef enum { 459 CPU_NTSIM = 1, 460 CPU_I960, 461 CPU_ARM, 462 CPU_SPARC, 463 CPU_POWERPC, 464 CPU_ALPHA, 465 CPU_P7, 466 CPU_I960_RX, 467 CPU_MIPS, 468 CPU_XSCALE, 469 CPU__last 470 } AAC_CpuType; 471 472 typedef enum { 473 CPUI960_JX = 1, 474 CPUI960_CX, 475 CPUI960_HX, 476 CPUI960_RX, 477 CPUARM_SA110, 478 CPUARM_xxx, 479 CPUPPC_603e, 480 CPUPPC_xxx, 481 CPUI960_80303, 482 CPU_XSCALE_80321, 483 CPU_MIPS_4KC, 484 CPU_MIPS_5KC, 485 CPUSUBTYPE__last 486 } AAC_CpuSubType; 487 488 typedef enum { 489 PLAT_NTSIM = 1, 490 PLAT_V3ADU, 491 PLAT_CYCLONE, 492 PLAT_CYCLONE_HD, 493 PLAT_BATBOARD, 494 PLAT_BATBOARD_HD, 495 PLAT_YOLO, 496 PLAT_COBRA, 497 PLAT_ANAHEIM, 498 PLAT_JALAPENO, 499 PLAT_QUEENS, 500 PLAT_JALAPENO_DELL, 501 PLAT_POBLANO, 502 PLAT_POBLANO_OPAL, 503 PLAT_POBLANO_SL0, 504 PLAT_POBLANO_SL1, 505 PLAT_POBLANO_SL2, 506 PLAT_POBLANO_XXX, 507 PLAT_JALAPENO_P2, 508 PLAT_HABANERO, 509 PLAT_VULCAN, 510 PLAT_CRUSADER, 511 PLAT_LANCER, 512 PLAT_HARRIER, 513 PLAT_TERMINATOR, 514 PLAT_SKYHAWK, 515 PLAT_CORSAIR, 516 PLAT_JAGUAR, 517 PLAT_SATAHAWK, 518 PLAT_SATANATOR, 519 PLAT_PROWLER, 520 PLAT_BLACKBIRD, 521 PLAT_SABREEXPRESS, 522 PLAT_INTRUDER, 523 PLAT__last 524 } AAC_Platform; 525 526 typedef enum { 527 OEM_FLAVOR_ADAPTEC = 1, 528 OEM_FLAVOR_DELL, 529 OEM_FLAVOR_HP, 530 OEM_FLAVOR_IBM, 531 OEM_FLAVOR_CPQ, 532 OEM_FLAVOR_FSC, 533 OEM_FLAVOR_DWS, 534 OEM_FLAVOR_BRAND_Z, 535 OEM_FLAVOR_LEGEND, 536 OEM_FLAVOR_HITACHI, 537 OEM_FLAVOR_ESG, 538 OEM_FLAVOR_ICP, 539 OEM_FLAVOR_SCM, 540 OEM_FLAVOR__last 541 } AAC_OemFlavor; 542 543 /* 544 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT 545 */ 546 typedef enum 547 { 548 PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */ 549 PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */ 550 PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */ 551 PLATFORM_BAT_OPT_NOTPRESENT, /* BATTERY OPTIONAL AND NOT PRESENT */ 552 PLATFORM_BAT_NOT_SUPPORTED /* BATTERY NOT SUPPORTED */ 553 } AAC_BatteryPlatform; 554 555 /* 556 * options supported by this board 557 * there has to be a one to one mapping of these defines and the ones in 558 * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT 559 */ 560 #define AAC_SUPPORTED_SNAPSHOT 0x01 561 #define AAC_SUPPORTED_CLUSTERS 0x02 562 #define AAC_SUPPORTED_WRITE_CACHE 0x04 563 #define AAC_SUPPORTED_64BIT_DATA 0x08 564 #define AAC_SUPPORTED_HOST_TIME_FIB 0x10 565 #define AAC_SUPPORTED_RAID50 0x20 566 #define AAC_SUPPORTED_4GB_WINDOW 0x40 567 #define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80 568 #define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100 569 #define AAC_SUPPORTED_NOT_RECONDITION 0x200 570 #define AAC_SUPPORTED_SGMAP_HOST64 0x400 571 #define AAC_SUPPORTED_ALARM 0x800 572 #define AAC_SUPPORTED_NONDASD 0x1000 573 #define AAC_SUPPORTED_SCSI_MANAGED 0x2000 574 #define AAC_SUPPORTED_RAID_SCSI_MODE 0x4000 575 #define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO 0x10000 576 #define AAC_SUPPORTED_NEW_COMM 0x20000 577 #define AAC_SUPPORTED_64BIT_ARRAYSIZE 0x40000 578 #define AAC_SUPPORTED_HEAT_SENSOR 0x80000 579 580 /* 581 * Structure used to respond to a RequestAdapterInfo fib. 582 */ 583 struct aac_adapter_info { 584 AAC_Platform PlatformBase; /* adapter type */ 585 AAC_CpuType CpuArchitecture; /* adapter CPU type */ 586 AAC_CpuSubType CpuVariant; /* adapter CPU subtype */ 587 u_int32_t ClockSpeed; /* adapter CPU clockspeed */ 588 u_int32_t ExecutionMem; /* adapter Execution Memory 589 * size */ 590 u_int32_t BufferMem; /* adapter Data Memory */ 591 u_int32_t TotalMem; /* adapter Total Memory */ 592 struct FsaRevision KernelRevision; /* adapter Kernel Software 593 * Revision */ 594 struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic 595 * Software Revision */ 596 struct FsaRevision HardwareRevision;/* TBD */ 597 struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ 598 u_int32_t ClusteringEnabled; 599 u_int32_t ClusterChannelMask; 600 u_int64_t SerialNumber; 601 AAC_BatteryPlatform batteryPlatform; 602 u_int32_t SupportedOptions; /* supported features of this 603 * controller */ 604 AAC_OemFlavor OemVariant; 605 } __packed; 606 607 /* 608 * Structure used to respond to a RequestSupplementAdapterInfo fib. 609 */ 610 struct vpd_info { 611 u_int8_t AssemblyPn[8]; 612 u_int8_t FruPn[8]; 613 u_int8_t BatteryFruPn[8]; 614 u_int8_t EcVersionString[8]; 615 u_int8_t Tsid[12]; 616 } __packed; 617 618 #define MFG_PCBA_SERIAL_NUMBER_WIDTH 12 619 #define MFG_WWN_WIDTH 8 620 621 struct aac_supplement_adapter_info { 622 /* The assigned Adapter Type Text, extra byte for null termination */ 623 int8_t AdapterTypeText[17+1]; 624 /* Pad for the text above */ 625 int8_t Pad[2]; 626 /* Size in bytes of the memory that is flashed */ 627 u_int32_t FlashMemoryByteSize; 628 /* The assigned IMAGEID_xxx for this adapter */ 629 u_int32_t FlashImageId; 630 /* 631 * The maximum number of Phys available on a SATA/SAS 632 * Controller, 0 otherwise 633 */ 634 u_int32_t MaxNumberPorts; 635 /* Version of expansion area */ 636 u_int32_t Version; 637 u_int32_t FeatureBits; 638 u_int8_t SlotNumber; 639 u_int8_t ReservedPad0[3]; 640 u_int8_t BuildDate[12]; 641 /* The current number of Ports on a SAS controller, 0 otherwise */ 642 u_int32_t CurrentNumberPorts; 643 644 struct vpd_info VpdInfo; 645 646 /* Firmware Revision (Vmaj.min-dash.) */ 647 struct FsaRevision FlashFirmwareRevision; 648 u_int32_t RaidTypeMorphOptions; 649 /* Firmware's boot code Revision (Vmaj.min-dash.) */ 650 struct FsaRevision FlashFirmwareBootRevision; 651 /* PCBA serial no. from th MFG sector */ 652 u_int8_t MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH]; 653 /* WWN from the MFG sector */ 654 u_int8_t MfgWWNName[MFG_WWN_WIDTH]; 655 /* Growth Area for future expansion ((7*4) - 12 - 8)/4 = 2 words */ 656 u_int32_t ReservedGrowth[2]; 657 } __packed; 658 659 /* 660 * Monitor/Kernel interface. 661 */ 662 663 /* 664 * Synchronous commands to the monitor/kernel. 665 */ 666 #define AAC_MONKER_BREAKPOINT 0x04 667 #define AAC_MONKER_INITSTRUCT 0x05 668 #define AAC_MONKER_SYNCFIB 0x0c 669 #define AAC_MONKER_GETKERNVER 0x11 670 #define AAC_MONKER_POSTRESULTS 0x14 671 #define AAC_MONKER_GETINFO 0x19 672 #define AAC_MONKER_GETDRVPROP 0x23 673 #define AAC_MONKER_RCVTEMP 0x25 674 #define AAC_MONKER_GETCOMMPREF 0x26 675 #define AAC_MONKER_REINIT 0xee 676 677 /* 678 * Adapter Status Register 679 * 680 * Phase Staus mailbox is 32bits: 681 * <31:16> = Phase Status 682 * <15:0> = Phase 683 * 684 * The adapter reports its present state through the phase. Only 685 * a single phase should be ever be set. Each phase can have multiple 686 * phase status bits to provide more detailed information about the 687 * state of the adapter. 688 */ 689 #define AAC_SELF_TEST_FAILED 0x00000004 690 #define AAC_MONITOR_PANIC 0x00000020 691 #define AAC_UP_AND_RUNNING 0x00000080 692 #define AAC_KERNEL_PANIC 0x00000100 693 694 /* 695 * Data types relating to control and monitoring of the NVRAM/WriteCache 696 * subsystem. 697 */ 698 699 #define AAC_NFILESYS 24 /* maximum number of filesystems */ 700 701 /* 702 * NVRAM/Write Cache subsystem states 703 */ 704 typedef enum { 705 NVSTATUS_DISABLED = 0, /* present, clean, not being used */ 706 NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */ 707 NVSTATUS_ERROR, /* present, dirty, contains dirty data */ 708 NVSTATUS_BATTERY, /* present, bad or low battery, may contain 709 * dirty data */ 710 NVSTATUS_UNKNOWN /* for bad/missing device */ 711 } AAC_NVSTATUS; 712 713 /* 714 * NVRAM/Write Cache subsystem battery component states 715 * 716 */ 717 typedef enum { 718 NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */ 719 NVBATTSTATUS_LOW, /* battery is low on power */ 720 NVBATTSTATUS_OK, /* battery is okay - normal operation possible 721 * only in this state */ 722 NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning 723 * in process */ 724 } AAC_NVBATTSTATUS; 725 726 /* 727 * Battery transition type 728 */ 729 typedef enum { 730 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not 731 * present */ 732 NVBATT_TRANSITION_LOW, /* battery is now low on power */ 733 NVBATT_TRANSITION_OK /* battery is now okay - normal 734 * operation possible only in this 735 * state */ 736 } AAC_NVBATT_TRANSITION; 737 738 /* 739 * NVRAM Info structure returned for NVRAM_GetInfo call 740 */ 741 struct aac_nvramdevinfo { 742 u_int32_t NV_Enabled; /* write caching enabled */ 743 u_int32_t NV_Error; /* device in error state */ 744 u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */ 745 u_int32_t NV_NActive; /* count of NVRAM buffers being 746 * written */ 747 } __packed; 748 749 struct aac_nvraminfo { 750 AAC_NVSTATUS NV_Status; /* nvram subsystem status */ 751 AAC_NVBATTSTATUS NV_BattStatus; /* battery status */ 752 u_int32_t NV_Size; /* size of WriteCache NVRAM in 753 * bytes */ 754 u_int32_t NV_BufSize; /* size of NVRAM buffers in 755 * bytes */ 756 u_int32_t NV_NBufs; /* number of NVRAM buffers */ 757 u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */ 758 u_int32_t NV_NClean; /* Num clean NVRAM buffers */ 759 u_int32_t NV_NActive; /* Num NVRAM buffers being 760 * written */ 761 u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */ 762 struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device 763 * info */ 764 u_int32_t NV_BattNeedsReconditioning; /* boolean */ 765 u_int32_t NV_TotalSize; /* size of all non-volatile 766 * memories in bytes */ 767 } __packed; 768 769 /* 770 * Data types relating to adapter-initiated FIBs 771 * 772 * Based on types and structures in <aifstruc.h> 773 */ 774 775 /* 776 * Progress Reports 777 */ 778 typedef enum { 779 AifJobStsSuccess = 1, 780 AifJobStsFinished, 781 AifJobStsAborted, 782 AifJobStsFailed, 783 AifJobStsLastReportMarker = 100, /* All prior mean last report */ 784 AifJobStsSuspended, 785 AifJobStsRunning 786 } AAC_AifJobStatus; 787 788 typedef enum { 789 AifJobScsiMin = 1, /* Minimum value for Scsi operation */ 790 AifJobScsiZero, /* SCSI device clear operation */ 791 AifJobScsiVerify, /* SCSI device Verify operation NO 792 * REPAIR */ 793 AifJobScsiExercise, /* SCSI device Exercise operation */ 794 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH 795 * repair */ 796 AifJobScsiWritePattern, /* write pattern */ 797 AifJobScsiMax = 99, /* Max Scsi value */ 798 AifJobCtrMin, /* Min Ctr op value */ 799 AifJobCtrZero, /* Container clear operation */ 800 AifJobCtrCopy, /* Container copy operation */ 801 AifJobCtrCreateMirror, /* Container Create Mirror operation */ 802 AifJobCtrMergeMirror, /* Container Merge Mirror operation */ 803 AifJobCtrScrubMirror, /* Container Scrub Mirror operation */ 804 AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */ 805 AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */ 806 AifJobCtrMorph, /* Container morph operation */ 807 AifJobCtrPartCopy, /* Container Partition copy operation */ 808 AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */ 809 AifJobCtrCrazyCache, /* crazy cache */ 810 AifJobCtrCopyback, /* Container Copyback operation */ 811 AifJobCtrCompactRaid5D, /* Container Compaction operation */ 812 AifJobCtrExpandRaid5D, /* Container Expansion operation */ 813 AifJobCtrRebuildRaid6, /* Container Rebuild Raid6 operation */ 814 AifJobCtrScrubRaid6, /* Container Scrub Raid6 operation */ 815 AifJobCtrSSBackup, /* Container snapshot backup task */ 816 AifJobCtrMax = 199, /* Max Ctr type operation */ 817 AifJobFsMin, /* Min Fs type operation */ 818 AifJobFsCreate, /* File System Create operation */ 819 AifJobFsVerify, /* File System Verify operation */ 820 AifJobFsExtend, /* File System Extend operation */ 821 AifJobFsMax = 299, /* Max Fs type operation */ 822 AifJobApiFormatNTFS, /* Format a drive to NTFS */ 823 AifJobApiFormatFAT, /* Format a drive to FAT */ 824 AifJobApiUpdateSnapshot, /* update the read/write half of a 825 * snapshot */ 826 AifJobApiFormatFAT32, /* Format a drive to FAT32 */ 827 AifJobApiMax = 399, /* Max API type operation */ 828 AifJobCtlContinuousCtrVerify, /* Adapter operation */ 829 AifJobCtlMax = 499 /* Max Adapter type operation */ 830 } AAC_AifJobType; 831 832 struct aac_AifContainers { 833 u_int32_t src; /* from/master */ 834 u_int32_t dst; /* to/slave */ 835 } __packed; 836 837 union aac_AifJobClient { 838 struct aac_AifContainers container; /* For Container and 839 * filesystem progress 840 * ops; */ 841 int32_t scsi_dh; /* For SCSI progress 842 * ops */ 843 }; 844 845 struct aac_AifJobDesc { 846 u_int32_t jobID; /* DO NOT FILL IN! Will be 847 * filled in by AIF */ 848 AAC_AifJobType type; /* Operation that is being 849 * performed */ 850 union aac_AifJobClient client; /* Details */ 851 } __packed; 852 853 struct aac_AifJobProgressReport { 854 struct aac_AifJobDesc jd; 855 AAC_AifJobStatus status; 856 u_int32_t finalTick; 857 u_int32_t currentTick; 858 u_int32_t jobSpecificData1; 859 u_int32_t jobSpecificData2; 860 } __packed; 861 862 /* 863 * Event Notification 864 */ 865 typedef enum { 866 /* General application notifies start here */ 867 AifEnGeneric = 1, /* Generic notification */ 868 AifEnTaskComplete, /* Task has completed */ 869 AifEnConfigChange, /* Adapter config change occurred */ 870 AifEnContainerChange, /* Adapter specific container 871 * configuration change */ 872 AifEnDeviceFailure, /* SCSI device failed */ 873 AifEnMirrorFailover, /* Mirror failover started */ 874 AifEnContainerEvent, /* Significant container event */ 875 AifEnFileSystemChange, /* File system changed */ 876 AifEnConfigPause, /* Container pause event */ 877 AifEnConfigResume, /* Container resume event */ 878 AifEnFailoverChange, /* Failover space assignment changed */ 879 AifEnRAID5RebuildDone, /* RAID5 rebuild finished */ 880 AifEnEnclosureManagement, /* Enclosure management event */ 881 AifEnBatteryEvent, /* Significant NV battery event */ 882 AifEnAddContainer, /* A new container was created. */ 883 AifEnDeleteContainer, /* A container was deleted. */ 884 AifEnSMARTEvent, /* SMART Event */ 885 AifEnBatteryNeedsRecond, /* The battery needs reconditioning */ 886 AifEnClusterEvent, /* Some cluster event */ 887 AifEnDiskSetEvent, /* A disk set event occured. */ 888 AifDriverNotifyStart=199, /* Notifies for host driver go here */ 889 /* Host driver notifications start here */ 890 AifDenMorphComplete, /* A morph operation completed */ 891 AifDenVolumeExtendComplete /* Volume expand operation completed */ 892 } AAC_AifEventNotifyType; 893 894 struct aac_AifEnsGeneric { 895 char text[132]; /* Generic text */ 896 } __packed; 897 898 struct aac_AifEnsDeviceFailure { 899 u_int32_t deviceHandle; /* SCSI device handle */ 900 } __packed; 901 902 struct aac_AifEnsMirrorFailover { 903 u_int32_t container; /* Container with failed element */ 904 u_int32_t failedSlice; /* Old slice which failed */ 905 u_int32_t creatingSlice; /* New slice used for auto-create */ 906 } __packed; 907 908 struct aac_AifEnsContainerChange { 909 u_int32_t container[2]; /* container that changed, -1 if no 910 * container */ 911 } __packed; 912 913 struct aac_AifEnsContainerEvent { 914 u_int32_t container; /* container number */ 915 u_int32_t eventType; /* event type */ 916 } __packed; 917 918 struct aac_AifEnsEnclosureEvent { 919 u_int32_t empID; /* enclosure management proc number */ 920 u_int32_t unitID; /* unitId, fan id, power supply id, 921 * slot id, tempsensor id. */ 922 u_int32_t eventType; /* event type */ 923 } __packed; 924 925 struct aac_AifEnsBatteryEvent { 926 AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */ 927 AAC_NVBATTSTATUS current_state; /* current batt state */ 928 AAC_NVBATTSTATUS prior_state; /* prev batt state */ 929 } __packed; 930 931 struct aac_AifEnsDiskSetEvent { 932 u_int32_t eventType; 933 u_int64_t DsNum; 934 u_int64_t CreatorId; 935 } __packed; 936 937 typedef enum { 938 CLUSTER_NULL_EVENT = 0, 939 CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or 940 * adaptername from NULL to non-NULL */ 941 /* (partner's agent may be up) */ 942 CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or 943 * adaptername from non-null to NULL */ 944 /* (partner has rebooted) */ 945 } AAC_ClusterAifEvent; 946 947 struct aac_AifEnsClusterEvent { 948 AAC_ClusterAifEvent eventType; 949 } __packed; 950 951 struct aac_AifEventNotify { 952 AAC_AifEventNotifyType type; 953 union { 954 struct aac_AifEnsGeneric EG; 955 struct aac_AifEnsDeviceFailure EDF; 956 struct aac_AifEnsMirrorFailover EMF; 957 struct aac_AifEnsContainerChange ECC; 958 struct aac_AifEnsContainerEvent ECE; 959 struct aac_AifEnsEnclosureEvent EEE; 960 struct aac_AifEnsBatteryEvent EBE; 961 struct aac_AifEnsDiskSetEvent EDS; 962 /* struct aac_AifEnsSMARTEvent ES;*/ 963 struct aac_AifEnsClusterEvent ECLE; 964 } data; 965 } __packed; 966 967 /* 968 * Adapter Initiated FIB command structures. Start with the adapter 969 * initiated FIBs that really come from the adapter, and get responded 970 * to by the host. 971 */ 972 #define AAC_AIF_REPORT_MAX_SIZE 64 973 974 typedef enum { 975 AifCmdEventNotify = 1, /* Notify of event */ 976 AifCmdJobProgress, /* Progress report */ 977 AifCmdAPIReport, /* Report from other user of API */ 978 AifCmdDriverNotify, /* Notify host driver of event */ 979 AifReqJobList = 100, /* Gets back complete job list */ 980 AifReqJobsForCtr, /* Gets back jobs for specific container */ 981 AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */ 982 AifReqJobReport, /* Gets back a specific job report or list */ 983 AifReqTerminateJob, /* Terminates job */ 984 AifReqSuspendJob, /* Suspends a job */ 985 AifReqResumeJob, /* Resumes a job */ 986 AifReqSendAPIReport, /* API generic report requests */ 987 AifReqAPIJobStart, /* Start a job from the API */ 988 AifReqAPIJobUpdate, /* Update a job report from the API */ 989 AifReqAPIJobFinish /* Finish a job from the API */ 990 } AAC_AifCommand; 991 992 struct aac_aif_command { 993 AAC_AifCommand command; /* Tell host what type of 994 * notify this is */ 995 u_int32_t seqNumber; /* To allow ordering of 996 * reports (if necessary) */ 997 union { 998 struct aac_AifEventNotify EN; /* Event notify */ 999 struct aac_AifJobProgressReport PR[1]; /* Progress report */ 1000 u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE]; 1001 u_int8_t data[AAC_FIB_DATASIZE - 8]; 1002 } data; 1003 } __packed; 1004 1005 /* 1006 * Filesystem commands/data 1007 * 1008 * The adapter has a very complex filesystem interface, most of which we ignore. 1009 * (And which seems not to be implemented, anyway.) 1010 */ 1011 1012 /* 1013 * FSA commands 1014 * (not used?) 1015 */ 1016 typedef enum { 1017 Null = 0, 1018 GetAttributes, 1019 SetAttributes, 1020 Lookup, 1021 ReadLink, 1022 Read, 1023 Write, 1024 Create, 1025 MakeDirectory, 1026 SymbolicLink, 1027 MakeNode, 1028 Removex, 1029 RemoveDirectory, 1030 Rename, 1031 Link, 1032 ReadDirectory, 1033 ReadDirectoryPlus, 1034 FileSystemStatus, 1035 FileSystemInfo, 1036 PathConfigure, 1037 Commit, 1038 Mount, 1039 UnMount, 1040 Newfs, 1041 FsCheck, 1042 FsSync, 1043 SimReadWrite, 1044 SetFileSystemStatus, 1045 BlockRead, 1046 BlockWrite, 1047 NvramIoctl, 1048 FsSyncWait, 1049 ClearArchiveBit, 1050 SetAcl, 1051 GetAcl, 1052 AssignAcl, 1053 FaultInsertion, 1054 CrazyCache 1055 } AAC_FSACommand; 1056 1057 /* 1058 * Command status values 1059 */ 1060 typedef enum { 1061 ST_OK = 0, 1062 ST_PERM = 1, 1063 ST_NOENT = 2, 1064 ST_IO = 5, 1065 ST_NXIO = 6, 1066 ST_E2BIG = 7, 1067 ST_ACCES = 13, 1068 ST_EXIST = 17, 1069 ST_XDEV = 18, 1070 ST_NODEV = 19, 1071 ST_NOTDIR = 20, 1072 ST_ISDIR = 21, 1073 ST_INVAL = 22, 1074 ST_FBIG = 27, 1075 ST_NOSPC = 28, 1076 ST_ROFS = 30, 1077 ST_MLINK = 31, 1078 ST_WOULDBLOCK = 35, 1079 ST_NAMETOOLONG = 63, 1080 ST_NOTEMPTY = 66, 1081 ST_DQUOT = 69, 1082 ST_STALE = 70, 1083 ST_REMOTE = 71, 1084 ST_BADHANDLE = 10001, 1085 ST_NOT_SYNC = 10002, 1086 ST_BAD_COOKIE = 10003, 1087 ST_NOTSUPP = 10004, 1088 ST_TOOSMALL = 10005, 1089 ST_SERVERFAULT = 10006, 1090 ST_BADTYPE = 10007, 1091 ST_JUKEBOX = 10008, 1092 ST_NOTMOUNTED = 10009, 1093 ST_MAINTMODE = 10010, 1094 ST_STALEACL = 10011 1095 } AAC_FSAStatus; 1096 1097 /* 1098 * Volume manager commands 1099 */ 1100 typedef enum _VM_COMMANDS { 1101 VM_Null = 0, 1102 VM_NameServe, 1103 VM_ContainerConfig, 1104 VM_Ioctl, 1105 VM_FilesystemIoctl, 1106 VM_CloseAll, 1107 VM_CtBlockRead, 1108 VM_CtBlockWrite, 1109 VM_SliceBlockRead, /* raw access to configured storage objects */ 1110 VM_SliceBlockWrite, 1111 VM_DriveBlockRead, /* raw access to physical devices */ 1112 VM_DriveBlockWrite, 1113 VM_EnclosureMgt, /* enclosure management */ 1114 VM_Unused, /* used to be diskset management */ 1115 VM_CtBlockVerify, 1116 VM_CtPerf, /* performance test */ 1117 VM_CtBlockRead64, 1118 VM_CtBlockWrite64, 1119 VM_CtBlockVerify64, 1120 VM_CtHostRead64, 1121 VM_CtHostWrite64, 1122 VM_DrvErrTblLog, /* drive error table/log type of command */ 1123 VM_NameServe64 1124 } AAC_VMCommand; 1125 1126 /* 1127 * "mountable object" 1128 */ 1129 struct aac_mntobj { 1130 u_int32_t ObjectId; 1131 char FileSystemName[16]; 1132 struct aac_container_creation CreateInfo; 1133 u_int32_t Capacity; 1134 u_int32_t VolType; 1135 u_int32_t ObjType; 1136 u_int32_t ContentState; 1137 #define FSCS_READONLY 0x0002 /* XXX need more information 1138 * than this */ 1139 union { 1140 u_int32_t pad[8]; 1141 } ObjExtension; 1142 u_int32_t AlterEgoId; 1143 } __packed; 1144 1145 struct aac_mntinfo { 1146 u_int32_t Command; 1147 u_int32_t MntType; 1148 u_int32_t MntCount; 1149 } __packed; 1150 1151 struct aac_mntinforesp { 1152 u_int32_t Status; 1153 u_int32_t MntType; 1154 u_int32_t MntRespCount; 1155 struct aac_mntobj MntTable[1]; 1156 } __packed; 1157 1158 /* 1159 * Container shutdown command. 1160 */ 1161 struct aac_closecommand { 1162 u_int32_t Command; 1163 u_int32_t ContainerId; 1164 } __packed; 1165 1166 /* 1167 * Container Config Command 1168 */ 1169 #define CT_GET_SCSI_METHOD 64 1170 struct aac_ctcfg { 1171 u_int32_t Command; 1172 u_int32_t cmd; 1173 u_int32_t param; 1174 } __packed; 1175 1176 struct aac_ctcfg_resp { 1177 u_int32_t Status; 1178 u_int32_t resp; 1179 u_int32_t param; 1180 } __packed; 1181 1182 /* 1183 * 'Ioctl' commads 1184 */ 1185 #define AAC_SCSI_MAX_PORTS 10 1186 #define AAC_BUS_NO_EXIST 0 1187 #define AAC_BUS_VALID 1 1188 #define AAC_BUS_FAULTED 2 1189 #define AAC_BUS_DISABLED 3 1190 #define GetBusInfo 0x9 1191 1192 struct aac_getbusinf { 1193 u_int32_t ProbeComplete; 1194 u_int32_t BusCount; 1195 u_int32_t TargetsPerBus; 1196 u_int8_t InitiatorBusId[AAC_SCSI_MAX_PORTS]; 1197 u_int8_t BusValid[AAC_SCSI_MAX_PORTS]; 1198 } __packed; 1199 1200 struct aac_vmioctl { 1201 u_int32_t Command; 1202 u_int32_t ObjType; 1203 u_int32_t MethId; 1204 u_int32_t ObjId; 1205 u_int32_t IoctlCmd; 1206 u_int32_t IoctlBuf[1]; /* Placeholder? */ 1207 } __packed; 1208 1209 struct aac_vmi_businf_resp { 1210 u_int32_t Status; 1211 u_int32_t ObjType; 1212 u_int32_t MethId; 1213 u_int32_t ObjId; 1214 u_int32_t IoctlCmd; 1215 struct aac_getbusinf BusInf; 1216 } __packed; 1217 1218 #if 0 1219 #define AAC_BTL_TO_HANDLE(b, t, l) \ 1220 (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf)) 1221 #else 1222 #define AAC_BTL_TO_HANDLE(b, t, l) \ 1223 ((((u_int32_t)b & 0x0f) << 24) | \ 1224 (((u_int32_t)l & 0xff) << 16) | \ 1225 ((u_int32_t)t & 0xffff)) 1226 #endif 1227 #define GetDeviceProbeInfo 0x5 1228 1229 struct aac_vmi_devinfo_resp { 1230 u_int32_t Status; 1231 u_int32_t ObjType; 1232 u_int32_t MethId; 1233 u_int32_t ObjId; 1234 u_int32_t IoctlCmd; 1235 u_int8_t VendorId[8]; 1236 u_int8_t ProductId[16]; 1237 u_int8_t ProductRev[4]; 1238 u_int32_t Inquiry7; 1239 u_int32_t align1; 1240 u_int32_t Inquiry0; 1241 u_int32_t align2; 1242 u_int32_t Inquiry1; 1243 u_int32_t align3; 1244 u_int32_t reserved[2]; 1245 u_int8_t VendorSpecific[20]; 1246 u_int32_t Smart:1; 1247 u_int32_t AAC_Managed:1; 1248 u_int32_t align4; 1249 u_int32_t reserved2:6; 1250 u_int32_t Bus; 1251 u_int32_t Target; 1252 u_int32_t Lun; 1253 u_int32_t ultraEnable:1, 1254 disconnectEnable:1, 1255 fast20EnabledW:1, 1256 scamDevice:1, 1257 scamTolerant:1, 1258 setForSync:1, 1259 setForWide:1, 1260 syncDevice:1, 1261 wideDevice:1, 1262 reserved1:7, 1263 ScsiRate:8, 1264 ScsiOffset:8; 1265 }; /* Do not pack */ 1266 1267 #define ResetBus 0x16 1268 struct aac_resetbus { 1269 u_int32_t BusNumber; 1270 }; 1271 1272 /* 1273 * Write 'stability' options. 1274 */ 1275 typedef enum { 1276 CSTABLE = 1, 1277 CUNSTABLE 1278 } AAC_CacheLevel; 1279 1280 /* 1281 * Commit level response for a write request. 1282 */ 1283 typedef enum { 1284 CMFILE_SYNC_NVRAM = 1, 1285 CMDATA_SYNC_NVRAM, 1286 CMFILE_SYNC, 1287 CMDATA_SYNC, 1288 CMUNSTABLE 1289 } AAC_CommitLevel; 1290 1291 /* 1292 * Block read/write operations. 1293 * These structures are packed into the 'data' area in the FIB. 1294 */ 1295 1296 struct aac_blockread { 1297 u_int32_t Command; /* not FSACommand! */ 1298 u_int32_t ContainerId; 1299 u_int32_t BlockNumber; 1300 u_int32_t ByteCount; 1301 struct aac_sg_table SgMap; /* variable size */ 1302 } __packed; 1303 1304 struct aac_blockread64 { 1305 u_int32_t Command; 1306 u_int16_t ContainerId; 1307 u_int16_t SectorCount; 1308 u_int32_t BlockNumber; 1309 u_int16_t Pad; 1310 u_int16_t Flags; 1311 struct aac_sg_table64 SgMap64; 1312 } __packed; 1313 1314 struct aac_blockread_response { 1315 u_int32_t Status; 1316 u_int32_t ByteCount; 1317 } __packed; 1318 1319 struct aac_blockwrite { 1320 u_int32_t Command; /* not FSACommand! */ 1321 u_int32_t ContainerId; 1322 u_int32_t BlockNumber; 1323 u_int32_t ByteCount; 1324 u_int32_t Stable; 1325 struct aac_sg_table SgMap; /* variable size */ 1326 } __packed; 1327 1328 struct aac_blockwrite64 { 1329 u_int32_t Command; /* not FSACommand! */ 1330 u_int16_t ContainerId; 1331 u_int16_t SectorCount; 1332 u_int32_t BlockNumber; 1333 u_int16_t Pad; 1334 u_int16_t Flags; 1335 struct aac_sg_table64 SgMap64; /* variable size */ 1336 } __packed; 1337 1338 struct aac_blockwrite_response { 1339 u_int32_t Status; 1340 u_int32_t ByteCount; 1341 u_int32_t Committed; 1342 } __packed; 1343 1344 struct aac_raw_io { 1345 u_int64_t BlockNumber; 1346 u_int32_t ByteCount; 1347 u_int16_t ContainerId; 1348 u_int16_t Flags; /* 0: W, 1: R */ 1349 u_int16_t BpTotal; /* reserved for FW use */ 1350 u_int16_t BpComplete; /* reserved for FW use */ 1351 struct aac_sg_tableraw SgMapRaw; /* variable size */ 1352 } __packed; 1353 1354 /* 1355 * Container shutdown command. 1356 */ 1357 struct aac_close_command { 1358 u_int32_t Command; 1359 u_int32_t ContainerId; 1360 }; 1361 1362 /* 1363 * SCSI Passthrough structures 1364 */ 1365 struct aac_srb32 { 1366 u_int32_t function; 1367 u_int32_t bus; 1368 u_int32_t target; 1369 u_int32_t lun; 1370 u_int32_t timeout; 1371 u_int32_t flags; 1372 u_int32_t data_len; 1373 u_int32_t retry_limit; 1374 u_int32_t cdb_len; 1375 u_int8_t cdb[16]; 1376 struct aac_sg_table sg_map32; 1377 }; 1378 1379 enum { 1380 AAC_SRB_FUNC_EXECUTE_SCSI = 0x00, 1381 AAC_SRB_FUNC_CLAIM_DEVICE, 1382 AAC_SRB_FUNC_IO_CONTROL, 1383 AAC_SRB_FUNC_RECEIVE_EVENT, 1384 AAC_SRB_FUNC_RELEASE_QUEUE, 1385 AAC_SRB_FUNC_ATTACH_DEVICE, 1386 AAC_SRB_FUNC_RELEASE_DEVICE, 1387 AAC_SRB_FUNC_SHUTDOWN, 1388 AAC_SRB_FUNC_FLUSH, 1389 AAC_SRB_FUNC_ABORT_COMMAND = 0x10, 1390 AAC_SRB_FUNC_RELEASE_RECOVERY, 1391 AAC_SRB_FUNC_RESET_BUS, 1392 AAC_SRB_FUNC_RESET_DEVICE, 1393 AAC_SRB_FUNC_TERMINATE_IO, 1394 AAC_SRB_FUNC_FLUSH_QUEUE, 1395 AAC_SRB_FUNC_REMOVE_DEVICE, 1396 AAC_SRB_FUNC_DOMAIN_VALIDATION 1397 }; 1398 1399 #define AAC_SRB_FLAGS_NO_DATA_XFER 0x0000 1400 #define AAC_SRB_FLAGS_DISABLE_DISCONNECT 0x0004 1401 #define AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER 0x0008 1402 #define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x0010 1403 #define AAC_SRB_FLAGS_DISABLE_AUTOSENSE 0x0020 1404 #define AAC_SRB_FLAGS_DATA_IN 0x0040 1405 #define AAC_SRB_FLAGS_DATA_OUT 0x0080 1406 #define AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \ 1407 (AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT) 1408 1409 #define AAC_HOST_SENSE_DATA_MAX 30 1410 1411 struct aac_srb_response { 1412 u_int32_t fib_status; 1413 u_int32_t srb_status; 1414 u_int32_t scsi_status; 1415 u_int32_t data_len; 1416 u_int32_t sense_len; 1417 u_int8_t sense[AAC_HOST_SENSE_DATA_MAX]; 1418 }; 1419 1420 /* 1421 * Status codes for SCSI passthrough commands. Since they are based on ASPI, 1422 * they also exactly match CAM status codes in both enumeration and meaning. 1423 * They seem to also be used as status codes for synchronous FIBs. 1424 */ 1425 enum { 1426 AAC_SRB_STS_PENDING = 0x00, 1427 AAC_SRB_STS_SUCCESS, 1428 AAC_SRB_STS_ABORTED, 1429 AAC_SRB_STS_ABORT_FAILED, 1430 AAC_SRB_STS_ERROR, 1431 AAC_SRB_STS_BUSY, 1432 AAC_SRB_STS_INVALID_REQUEST, 1433 AAC_SRB_STS_INVALID_PATH_ID, 1434 AAC_SRB_STS_NO_DEVICE, 1435 AAC_SRB_STS_TIMEOUT, 1436 AAC_SRB_STS_SELECTION_TIMEOUT, 1437 AAC_SRB_STS_COMMAND_TIMEOUT, 1438 AAC_SRB_STS_MESSAGE_REJECTED = 0x0D, 1439 AAC_SRB_STS_BUS_RESET, 1440 AAC_SRB_STS_PARITY_ERROR, 1441 AAC_SRB_STS_REQUEST_SENSE_FAILED, 1442 AAC_SRB_STS_NO_HBA, 1443 AAC_SRB_STS_DATA_OVERRUN, 1444 AAC_SRB_STS_UNEXPECTED_BUS_FREE, 1445 AAC_SRB_STS_PHASE_SEQUENCE_FAILURE, 1446 AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH, 1447 AAC_SRB_STS_REQUEST_FLUSHED, 1448 AAC_SRB_STS_INVALID_LUN = 0x20, 1449 AAC_SRB_STS_INVALID_TARGET_ID, 1450 AAC_SRB_STS_BAD_FUNCTION, 1451 AAC_SRB_STS_ERROR_RECOVERY 1452 }; 1453 1454 /* 1455 * Register set for adapters based on the Falcon bridge and PPC core 1456 */ 1457 1458 #define AAC_FA_DOORBELL0_CLEAR 0x00 1459 #define AAC_FA_DOORBELL1_CLEAR 0x02 1460 #define AAC_FA_DOORBELL0 0x04 1461 #define AAC_FA_DOORBELL1 0x06 1462 #define AAC_FA_MASK0_CLEAR 0x08 1463 #define AAC_FA_MASK1_CLEAR 0x0a 1464 #define AAC_FA_MASK0 0x0c 1465 #define AAC_FA_MASK1 0x0e 1466 #define AAC_FA_MAILBOX 0x10 1467 #define AAC_FA_FWSTATUS 0x2c /* Mailbox 7 */ 1468 #define AAC_FA_INTSRC 0x900 1469 1470 #define AAC_FA_HACK(sc) (void)AAC_GETREG4(sc, AAC_FA_INTSRC) 1471 1472 /* 1473 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based 1474 * on the SA110 'StrongArm'. 1475 */ 1476 1477 #define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */ 1478 #define AAC_SA_DOORBELL0_SET 0x9c 1479 #define AAC_SA_DOORBELL0 0x9c 1480 #define AAC_SA_MASK0_CLEAR 0xa0 1481 #define AAC_SA_MASK0_SET 0xa4 1482 1483 #define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */ 1484 #define AAC_SA_DOORBELL1_SET 0x9e 1485 #define AAC_SA_DOORBELL1 0x9e 1486 #define AAC_SA_MASK1_CLEAR 0xa2 1487 #define AAC_SA_MASK1_SET 0xa6 1488 1489 #define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */ 1490 #define AAC_SA_FWSTATUS 0xc4 1491 1492 /* 1493 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx, 1494 * and other related adapters. 1495 */ 1496 1497 #define AAC_RX_IDBR 0x20 /* inbound doorbell register */ 1498 #define AAC_RX_IISR 0x24 /* inbound interrupt status register */ 1499 #define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */ 1500 #define AAC_RX_ODBR 0x2c /* outbound doorbell register */ 1501 #define AAC_RX_OISR 0x30 /* outbound interrupt status register */ 1502 #define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */ 1503 #define AAC_RX_IQUE 0x40 /* inbound queue */ 1504 #define AAC_RX_OQUE 0x44 /* outbound queue */ 1505 1506 #define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */ 1507 #define AAC_RX_FWSTATUS 0x6c 1508 1509 /* 1510 * Register definitions for the Adaptec 'Rocket' RAID-On-Chip adapters. 1511 * Unsurprisingly, it's quite similar to the i960! 1512 */ 1513 1514 #define AAC_RKT_IDBR 0x20 /* inbound doorbell register */ 1515 #define AAC_RKT_IISR 0x24 /* inbound interrupt status register */ 1516 #define AAC_RKT_IIMR 0x28 /* inbound interrupt mask register */ 1517 #define AAC_RKT_ODBR 0x2c /* outbound doorbell register */ 1518 #define AAC_RKT_OISR 0x30 /* outbound interrupt status register */ 1519 #define AAC_RKT_OIMR 0x34 /* outbound interrupt mask register */ 1520 #define AAC_RKT_IQUE 0x40 /* inbound queue */ 1521 #define AAC_RKT_OQUE 0x44 /* outbound queue */ 1522 1523 #define AAC_RKT_MAILBOX 0x1000 /* mailbox */ 1524 #define AAC_RKT_FWSTATUS 0x101c /* Firmware Status (mailbox 7) */ 1525 1526 /* 1527 * Common bit definitions for the doorbell registers. 1528 */ 1529 1530 /* 1531 * Status bits in the doorbell registers. 1532 */ 1533 #define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */ 1534 #define AAC_DB_COMMAND_READY (1<<1) /* posted one or more commands */ 1535 #define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands complete */ 1536 #define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */ 1537 #define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */ 1538 1539 /* 1540 * The adapter can request the host print a message by setting the 1541 * DB_PRINTF flag in DOORBELL0. The driver responds by collecting the 1542 * message from the printf buffer, clearing the DB_PRINTF flag in 1543 * DOORBELL0 and setting it in DOORBELL1. 1544 * (ODBR and IDBR respectively for the i960Rx adapters) 1545 */ 1546 #define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */ 1547 #define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */ 1548 1549 /* 1550 * Mask containing the interrupt bits we care about. We don't anticipate (or 1551 * want) interrupts not in this mask. 1552 */ 1553 #define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \ 1554 AAC_DB_RESPONSE_READY | \ 1555 AAC_DB_PRINTF) 1556 #define AAC_DB_INT_NEW_COMM 0x08 1557 1558