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