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