aacreg.h revision 82527
1/*- 2 * Copyright (c) 2000 Michael Smith 3 * Copyright (c) 2000-2001 Scott Long 4 * Copyright (c) 2000 BSDi 5 * Copyright (c) 2001 Adaptec, Inc. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $FreeBSD: head/sys/dev/aac/aacreg.h 82527 2001-08-29 23:34:05Z scottl $ 30 */ 31 32/* 33 * Data structures defining the interface between the driver and the Adaptec 34 * 'FSA' adapters. Note that many field names and comments here are taken 35 * verbatim from the Adaptec driver source in order to make comparing the 36 * two slightly easier. 37 */ 38 39/****************************************************************************** 40 * Misc. magic numbers. 41 */ 42#define AAC_MAX_CONTAINERS 64 43#define AAC_BLOCK_SIZE 512 44 45/****************************************************************************** 46 * Communications interface. 47 * 48 * Where datastructure layouts are closely parallel to the Adaptec sample code, 49 * retain their naming conventions (for now) to aid in cross-referencing. 50 */ 51 52/* 53 * We establish 4 command queues and matching response queues. Queues must 54 * be 16-byte aligned, and are sized as follows: 55 */ 56#define AAC_HOST_NORM_CMD_ENTRIES 8 /* command adapter->host, 57 * normal priority */ 58#define AAC_HOST_HIGH_CMD_ENTRIES 4 /* command adapter->host, 59 * high priority */ 60#define AAC_ADAP_NORM_CMD_ENTRIES 512 /* command host->adapter, 61 * normal priority */ 62#define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* command host->adapter, 63 * high priority */ 64#define AAC_HOST_NORM_RESP_ENTRIES 512 /* response, adapter->host, 65 * normal priority */ 66#define AAC_HOST_HIGH_RESP_ENTRIES 4 /* response, adapter->host, 67 * high priority */ 68#define AAC_ADAP_NORM_RESP_ENTRIES 8 /* response, host->adapter, 69 * normal priority */ 70#define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* response, host->adapter, 71 * high priority */ 72 73#define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \ 74 AAC_HOST_NORM_CMD_ENTRIES + \ 75 AAC_ADAP_HIGH_CMD_ENTRIES + \ 76 AAC_ADAP_NORM_CMD_ENTRIES + \ 77 AAC_HOST_HIGH_RESP_ENTRIES + \ 78 AAC_HOST_NORM_RESP_ENTRIES + \ 79 AAC_ADAP_HIGH_RESP_ENTRIES + \ 80 AAC_ADAP_NORM_RESP_ENTRIES) 81#define AAC_QUEUE_COUNT 8 82#define AAC_QUEUE_ALIGN 16 83 84struct aac_queue_entry { 85 u_int32_t aq_fib_size; /* FIB size in bytes */ 86 u_int32_t aq_fib_addr; /* receiver-space address of the FIB */ 87} __attribute__ ((packed)); 88 89#define AAC_PRODUCER_INDEX 0 90#define AAC_CONSUMER_INDEX 1 91 92/* 93 * Table of queue indices and queues used to communicate with the 94 * controller. This structure must be aligned to AAC_QUEUE_ALIGN 95 */ 96struct aac_queue_table { 97 /* queue consumer/producer indexes (layout mandated by adapter) */ 98 u_int32_t qt_qindex[AAC_QUEUE_COUNT][2]; 99 100 /* queue entry structures (layout mandated by adapter) */ 101 struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES]; 102 struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES]; 103 struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES]; 104 struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES]; 105 struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES]; 106 struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES]; 107 struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES]; 108 struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES]; 109} __attribute__ ((packed)); 110 111/* 112 * Queue names 113 * 114 * Note that we base these at 0 in order to use them as array indices. Adaptec 115 * used base 1 for some unknown reason, and sorted them in a different order. 116 */ 117#define AAC_HOST_NORM_CMD_QUEUE 0 118#define AAC_HOST_HIGH_CMD_QUEUE 1 119#define AAC_ADAP_NORM_CMD_QUEUE 2 120#define AAC_ADAP_HIGH_CMD_QUEUE 3 121#define AAC_HOST_NORM_RESP_QUEUE 4 122#define AAC_HOST_HIGH_RESP_QUEUE 5 123#define AAC_ADAP_NORM_RESP_QUEUE 6 124#define AAC_ADAP_HIGH_RESP_QUEUE 7 125 126/* 127 * List structure used to chain FIBs (used by the adapter - we hang FIBs off 128 * our private command structure and don't touch these) 129 */ 130struct aac_fib_list_entry { 131 struct fib_list_entry *Flink; 132 struct fib_list_entry *Blink; 133} __attribute__ ((packed)); 134 135/* 136 * FIB (FSA Interface Block?); this is the datastructure passed between the host 137 * and adapter. 138 */ 139struct aac_fib_header { 140 u_int32_t XferState; 141 u_int16_t Command; 142 u_int8_t StructType; 143 u_int8_t Flags; 144 u_int16_t Size; 145 u_int16_t SenderSize; 146 u_int32_t SenderFibAddress; 147 u_int32_t ReceiverFibAddress; 148 u_int32_t SenderData; 149 union { 150 struct { 151 u_int32_t ReceiverTimeStart; 152 u_int32_t ReceiverTimeDone; 153 } _s; 154 struct aac_fib_list_entry FibLinks; 155 } _u; 156} __attribute__ ((packed)); 157 158#define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header)) 159 160struct aac_fib { 161 struct aac_fib_header Header; 162 u_int8_t data[AAC_FIB_DATASIZE]; 163} __attribute__ ((packed)); 164 165/* 166 * FIB commands 167 */ 168typedef enum { 169 TestCommandResponse = 1, 170 TestAdapterCommand = 2, 171 172 /* lowlevel and comm commands */ 173 LastTestCommand = 100, 174 ReinitHostNormCommandQueue = 101, 175 ReinitHostHighCommandQueue = 102, 176 ReinitHostHighRespQueue = 103, 177 ReinitHostNormRespQueue = 104, 178 ReinitAdapNormCommandQueue = 105, 179 ReinitAdapHighCommandQueue = 107, 180 ReinitAdapHighRespQueue = 108, 181 ReinitAdapNormRespQueue = 109, 182 InterfaceShutdown = 110, 183 DmaCommandFib = 120, 184 StartProfile = 121, 185 TermProfile = 122, 186 SpeedTest = 123, 187 TakeABreakPt = 124, 188 RequestPerfData = 125, 189 SetInterruptDefTimer= 126, 190 SetInterruptDefCount= 127, 191 GetInterruptDefStatus= 128, 192 LastCommCommand = 129, 193 194 /* filesystem commands */ 195 NuFileSystem = 300, 196 UFS = 301, 197 HostFileSystem = 302, 198 LastFileSystemCommand = 303, 199 200 /* Container Commands */ 201 ContainerCommand = 500, 202 ContainerCommand64 = 501, 203 204 /* Cluster Commands */ 205 ClusterCommand = 550, 206 207 /* Scsi Port commands (scsi passthrough) */ 208 ScsiPortCommand = 600, 209 210 /* misc house keeping and generic adapter initiated commands */ 211 AifRequest = 700, 212 CheckRevision = 701, 213 FsaHostShutdown = 702, 214 RequestAdapterInfo = 703, 215 IsAdapterPaused = 704, 216 SendHostTime = 705, 217 LastMiscCommand = 706 218} AAC_FibCommands; 219 220/* 221 * FIB types 222 */ 223#define AAC_FIBTYPE_TFIB 1 224#define AAC_FIBTYPE_TQE 2 225#define AAC_FIBTYPE_TCTPERF 3 226 227/* 228 * FIB transfer state 229 */ 230#define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */ 231#define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */ 232#define AAC_FIBSTATE_INITIALISED (1<<2) /* initialised */ 233#define AAC_FIBSTATE_EMPTY (1<<3) /* empty */ 234#define AAC_FIBSTATE_FROMPOOL (1<<4) /* allocated from pool */ 235#define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */ 236#define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */ 237#define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */ 238#define AAC_FIBSTATE_RNOTEXPECTED (1<<8) /* response is not expected */ 239#define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */ 240#define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */ 241#define AAC_FIBSTATE_HIGH (1<<11) /* high priority */ 242#define AAC_FIBSTATE_NORM (1<<12) /* normal priority */ 243#define AAC_FIBSTATE_ASYNC (1<<13) 244#define AAC_FIBSTATE_ASYNCIO (1<<13) /* to be removed */ 245#define AAC_FIBSTATE_PAGEFILEIO (1<<14) /* to be removed */ 246#define AAC_FIBSTATE_SHUTDOWN (1<<15) 247#define AAC_FIBSTATE_LAZYWRITE (1<<16) /* to be removed */ 248#define AAC_FIBSTATE_ADAPMICROFIB (1<<17) 249#define AAC_FIBSTATE_BIOSFIB (1<<18) 250#define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */ 251#define AAC_FIBSTATE_APIFIB (1<<20) 252 253/* 254 * FIB error values 255 */ 256#define AAC_ERROR_NORMAL 0x00 257#define AAC_ERROR_PENDING 0x01 258#define AAC_ERROR_FATAL 0x02 259#define AAC_ERROR_INVALID_QUEUE 0x03 260#define AAC_ERROR_NOENTRIES 0x04 261#define AAC_ERROR_SENDFAILED 0x05 262#define AAC_ERROR_INVALID_QUEUE_PRIORITY 0x06 263#define AAC_ERROR_FIB_ALLOCATION_FAILED 0x07 264#define AAC_ERROR_FIB_DEALLOCATION_FAILED 0x08 265 266/* 267 * Adapter Init Structure: this is passed to the adapter with the 268 * AAC_MONKER_INITSTRUCT command to point it at our control structures. 269 */ 270struct aac_adapter_init { 271 u_int32_t InitStructRevision; 272#define AAC_INIT_STRUCT_REVISION 3 273 u_int32_t MiniPortRevision; 274 u_int32_t FilesystemRevision; 275 u_int32_t CommHeaderAddress; 276 u_int32_t FastIoCommAreaAddress; 277 u_int32_t AdapterFibsPhysicalAddress; 278 void *AdapterFibsVirtualAddress; 279 u_int32_t AdapterFibsSize; 280 u_int32_t AdapterFibAlign; 281 u_int32_t PrintfBufferAddress; 282 u_int32_t PrintfBufferSize; 283 u_int32_t HostPhysMemPages; 284 u_int32_t HostElapsedSeconds; 285} __attribute__ ((packed)); 286 287/****************************************************************************** 288 * Shared data types 289 */ 290/* 291 * Container types 292 */ 293typedef enum { 294 CT_NONE = 0, 295 CT_VOLUME, 296 CT_MIRROR, 297 CT_STRIPE, 298 CT_RAID5, 299 CT_SSRW, 300 CT_SSRO, 301 CT_MORPH, 302 CT_PASSTHRU, 303 CT_RAID4, 304 CT_RAID10, /* stripe of mirror */ 305 CT_RAID00, /* stripe of stripe */ 306 CT_VOLUME_OF_MIRRORS, /* volume of mirror */ 307 CT_PSEUDO_RAID3, /* really raid4 */ 308} AAC_FSAVolType; 309 310/* 311 * Host-addressable object types 312 */ 313typedef enum { 314 FT_REG = 1, /* regular file */ 315 FT_DIR, /* directory */ 316 FT_BLK, /* "block" device - reserved */ 317 FT_CHR, /* "character special" device - reserved */ 318 FT_LNK, /* symbolic link */ 319 FT_SOCK, /* socket */ 320 FT_FIFO, /* fifo */ 321 FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */ 322 FT_DRIVE, /* physical disk - addressable in scsi by bus/target/lun */ 323 FT_SLICE, /* virtual disk - raw volume - slice */ 324 FT_PARTITION, /* FSA partition - carved out of a slice - building block 325 * for containers */ 326 FT_VOLUME, /* Container - Volume Set */ 327 FT_STRIPE, /* Container - Stripe Set */ 328 FT_MIRROR, /* Container - Mirror Set */ 329 FT_RAID5, /* Container - Raid 5 Set */ 330 FT_DATABASE /* Storage object with "foreign" content manager */ 331} AAC_FType; 332 333/* 334 * Host-side scatter/gather list for 32-bit commands. 335 */ 336struct aac_sg_entry { 337 u_int32_t SgAddress; 338 u_int32_t SgByteCount; 339} __attribute__ ((packed)); 340 341struct aac_sg_table { 342 u_int32_t SgCount; 343 struct aac_sg_entry SgEntry[0]; 344} __attribute__ ((packed)); 345 346/* 347 * Host-side scatter/gather list for 64-bit commands. 348 */ 349struct aac_sg_table64 { 350 u_int8_t SgCount; 351 u_int8_t SgSectorsPerPage; 352 u_int16_t SgByteOffset; 353 u_int64_t SgEntry[0]; 354} __attribute__ ((packed)); 355 356/* 357 * Container creation data 358 */ 359struct aac_container_creation { 360 u_int8_t ViaBuildNumber; 361 u_int8_t MicroSecond; 362 u_int8_t Via; /* 1 = FSU, 2 = API, etc. */ 363 u_int8_t YearsSince1900; 364 u_int32_t Month:4; /* 1-12 */ 365 u_int32_t Day:6; /* 1-32 */ 366 u_int32_t Hour:6; /* 0-23 */ 367 u_int32_t Minute:6; /* 0-59 */ 368 u_int32_t Second:6; /* 0-59 */ 369 u_int64_t ViaAdapterSerialNumber; 370} __attribute__ ((packed)); 371 372/****************************************************************************** 373 * Revision number handling 374 */ 375 376typedef enum { 377 RevApplication = 1, 378 RevDkiCli, 379 RevNetService, 380 RevApi, 381 RevFileSysDriver, 382 RevMiniportDriver, 383 RevAdapterSW, 384 RevMonitor, 385 RevRemoteApi 386} RevComponent; 387 388struct FsaRevision { 389 union { 390 struct { 391 u_int8_t dash; 392 u_int8_t type; 393 u_int8_t minor; 394 u_int8_t major; 395 } comp; 396 u_int32_t ul; 397 } external; 398 u_int32_t buildNumber; 399} __attribute__ ((packed)); 400 401/****************************************************************************** 402 * Adapter Information 403 */ 404 405typedef enum { 406 CPU_NTSIM = 1, 407 CPU_I960, 408 CPU_ARM, 409 CPU_SPARC, 410 CPU_POWERPC, 411 CPU_ALPHA, 412 CPU_P7, 413 CPU_I960_RX, 414 CPU__last 415} AAC_CpuType; 416 417typedef enum { 418 CPUI960_JX = 1, 419 CPUI960_CX, 420 CPUI960_HX, 421 CPUI960_RX, 422 CPUARM_SA110, 423 CPUARM_xxx, 424 CPUPPC_603e, 425 CPUPPC_xxx, 426 CPUSUBTYPE__last 427} AAC_CpuSubType; 428 429typedef enum { 430 PLAT_NTSIM = 1, 431 PLAT_V3ADU, 432 PLAT_CYCLONE, 433 PLAT_CYCLONE_HD, 434 PLAT_BATBOARD, 435 PLAT_BATBOARD_HD, 436 PLAT_YOLO, 437 PLAT_COBRA, 438 PLAT_ANAHEIM, 439 PLAT_JALAPENO, 440 PLAT_QUEENS, 441 PLAT_JALAPENO_DELL, 442 PLAT_POBLANO, 443 PLAT_POBLANO_OPAL, 444 PLAT_POBLANO_SL0, 445 PLAT_POBLANO_SL1, 446 PLAT_POBLANO_SL2, 447 PLAT_POBLANO_XXX, 448 PLAT_JALAPENO_P2, 449 PLAT_HABANERO, 450 PLAT__last 451} AAC_Platform; 452 453typedef enum { 454 OEM_FLAVOR_ADAPTEC = 1, 455 OEM_FLAVOR_DELL, 456 OEM_FLAVOR_HP, 457 OEM_FLAVOR_IBM, 458 OEM_FLAVOR_CPQ, 459 OEM_FLAVOR_BRAND_X, 460 OEM_FLAVOR_BRAND_Y, 461 OEM_FLAVOR_BRAND_Z, 462 OEM_FLAVOR__last 463} AAC_OemFlavor; 464 465/* 466 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT 467 */ 468typedef enum 469{ 470 PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */ 471 PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */ 472 PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */ 473 PLATFORM_BAT_OPT_NOTPRESENT, /* BATTERY OPTIONAL AND NOT PRESENT */ 474 PLATFORM_BAT_NOT_SUPPORTED /* BATTERY NOT SUPPORTED */ 475} AAC_BatteryPlatform; 476 477/* 478 * options supported by this board 479 * there has to be a one to one mapping of these defines and the ones in 480 * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT 481 */ 482#define AAC_SUPPORTED_SNAPSHOT 0x01 483#define AAC_SUPPORTED_CLUSTERS 0x02 484#define AAC_SUPPORTED_WRITE_CACHE 0x04 485#define AAC_SUPPORTED_64BIT_DATA 0x08 486#define AAC_SUPPORTED_HOST_TIME_FIB 0x10 487#define AAC_SUPPORTED_RAID50 0x20 488 489/* 490 * Structure used to respond to a RequestAdapterInfo fib. 491 */ 492struct aac_adapter_info { 493 AAC_Platform PlatformBase; /* adapter type */ 494 AAC_CpuType CpuArchitecture; /* adapter CPU type */ 495 AAC_CpuSubType CpuVariant; /* adapter CPU subtype */ 496 u_int32_t ClockSpeed; /* adapter CPU clockspeed */ 497 u_int32_t ExecutionMem; /* adapter Execution Memory size */ 498 u_int32_t BufferMem; /* adapter Data Memory */ 499 u_int32_t TotalMem; /* adapter Total Memory */ 500 struct FsaRevision KernelRevision; /* adapter Kernel Software Revision */ 501 struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic 502 * Software Revision */ 503 struct FsaRevision HardwareRevision;/* TBD */ 504 struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ 505 u_int32_t ClusteringEnabled; 506 u_int32_t ClusterChannelMask; 507 u_int64_t SerialNumber; 508 AAC_BatteryPlatform batteryPlatform; 509 u_int32_t SupportedOptions; /* supported features of this 510 * controller */ 511 AAC_OemFlavor OemVariant; 512} __attribute__ ((packed)); 513 514/****************************************************************************** 515 * Monitor/Kernel interface. 516 */ 517 518/* 519 * Synchronous commands to the monitor/kernel. 520 */ 521#define AAC_MONKER_INITSTRUCT 0x05 522#define AAC_MONKER_SYNCFIB 0x0c 523 524/* 525 * Adapter Status Register 526 * 527 * Phase Staus mailbox is 32bits: 528 * <31:16> = Phase Status 529 * <15:0> = Phase 530 * 531 * The adapter reports its present state through the phase. Only 532 * a single phase should be ever be set. Each phase can have multiple 533 * phase status bits to provide more detailed information about the 534 * state of the adapter. 535 */ 536#define AAC_SELF_TEST_FAILED 0x00000004 537#define AAC_UP_AND_RUNNING 0x00000080 538#define AAC_KERNEL_PANIC 0x00000100 539 540/****************************************************************************** 541 * Data types relating to control and monitoring of the NVRAM/WriteCache 542 * subsystem. 543 */ 544 545#define AAC_NFILESYS 24 /* maximum number of filesystems */ 546 547/* 548 * NVRAM/Write Cache subsystem states 549 */ 550typedef enum { 551 NVSTATUS_DISABLED = 0, /* present, clean, not being used */ 552 NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */ 553 NVSTATUS_ERROR, /* present, dirty, contains dirty data */ 554 /* for bad/missing device */ 555 NVSTATUS_BATTERY, /* present, bad or low battery, may contain dirty data */ 556 /* for bad/missing device */ 557 NVSTATUS_UNKNOWN 558} AAC_NVSTATUS; 559 560/* 561 * NVRAM/Write Cache subsystem battery component states 562 * 563 */ 564typedef enum { 565 NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */ 566 NVBATTSTATUS_LOW, /* battery is low on power */ 567 NVBATTSTATUS_OK, /* battery is okay - normal operation possible only in this state */ 568 NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning in process */ 569} AAC_NVBATTSTATUS; 570 571/* 572 * Battery transition type 573 */ 574typedef enum { 575 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not present */ 576 NVBATT_TRANSITION_LOW, /* battery is now low on power */ 577 NVBATT_TRANSITION_OK /* battery is now okay - normal operation possible only in this state */ 578} AAC_NVBATT_TRANSITION; 579 580/* 581 * NVRAM Info structure returned for NVRAM_GetInfo call 582 */ 583struct aac_nvramdevinfo { 584 u_int32_t NV_Enabled; /* write caching enabled */ 585 u_int32_t NV_Error; /* device in error state */ 586 u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */ 587 u_int32_t NV_NActive; /* count of NVRAM buffers being written */ 588} __attribute__ ((packed)); 589 590struct aac_nvraminfo { 591 AAC_NVSTATUS NV_Status; /* nvram subsystem status */ 592 AAC_NVBATTSTATUS NV_BattStatus; /* battery status */ 593 u_int32_t NV_Size; /* size of WriteCache NVRAM in 594 * bytes */ 595 u_int32_t NV_BufSize; /* size of NVRAM buffers in 596 * bytes */ 597 u_int32_t NV_NBufs; /* number of NVRAM buffers */ 598 u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */ 599 u_int32_t NV_NClean; /* Num clean NVRAM buffers */ 600 u_int32_t NV_NActive; /* Num NVRAM buffers being 601 * written */ 602 u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */ 603 struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device 604 * info */ 605 u_int32_t NV_BattNeedsReconditioning; /* boolean */ 606 u_int32_t NV_TotalSize; /* size of all non-volatile 607 * memories in bytes */ 608} __attribute__ ((packed)); 609 610/****************************************************************************** 611 * Data types relating to adapter-initiated FIBs 612 * 613 * Based on types and structures in <aifstruc.h> 614 */ 615 616/* 617 * Progress Reports 618 */ 619typedef enum { 620 AifJobStsSuccess = 1, 621 AifJobStsFinished, 622 AifJobStsAborted, 623 AifJobStsFailed, 624 AifJobStsLastReportMarker = 100, /* All before mean last report */ 625 AifJobStsSuspended, 626 AifJobStsRunning 627} AAC_AifJobStatus; 628 629typedef enum { 630 AifJobScsiMin = 1, /* Minimum value for Scsi operation */ 631 AifJobScsiZero, /* SCSI device clear operation */ 632 AifJobScsiVerify, /* SCSI device Verify operation NO 633 * REPAIR */ 634 AifJobScsiExercise, /* SCSI device Exercise operation */ 635 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH 636 * repair */ 637 AifJobScsiMax = 99, /* Max Scsi value */ 638 AifJobCtrMin, /* Min Ctr op value */ 639 AifJobCtrZero, /* Container clear operation */ 640 AifJobCtrCopy, /* Container copy operation */ 641 AifJobCtrCreateMirror, /* Container Create Mirror operation */ 642 AifJobCtrMergeMirror, /* Container Merge Mirror operation */ 643 AifJobCtrScrubMirror, /* Container Scrub Mirror operation */ 644 AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */ 645 AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */ 646 AifJobCtrMorph, /* Container morph operation */ 647 AifJobCtrPartCopy, /* Container Partition copy operation */ 648 AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */ 649 AifJobCtrCrazyCache, /* crazy cache */ 650 AifJobCtrMax = 199, /* Max Ctr type operation */ 651 AifJobFsMin, /* Min Fs type operation */ 652 AifJobFsCreate, /* File System Create operation */ 653 AifJobFsVerify, /* File System Verify operation */ 654 AifJobFsExtend, /* File System Extend operation */ 655 AifJobFsMax = 299, /* Max Fs type operation */ 656 AifJobApiFormatNTFS, /* Format a drive to NTFS */ 657 AifJobApiFormatFAT, /* Format a drive to FAT */ 658 AifJobApiUpdateSnapshot, /* update the read/write half of a 659 * snapshot */ 660 AifJobApiFormatFAT32, /* Format a drive to FAT32 */ 661 AifJobApiMax = 399, /* Max API type operation */ 662 AifJobCtlContinuousCtrVerify, /* Adapter operation */ 663 AifJobCtlMax = 499 /* Max Adapter type operation */ 664} AAC_AifJobType; 665 666struct aac_AifContainers { 667 u_int32_t src; /* from/master */ 668 u_int32_t dst; /* to/slave */ 669} __attribute__ ((packed)); 670 671union aac_AifJobClient { 672 struct aac_AifContainers container; /* For Container and file 673 * system progress ops; */ 674 int32_t scsi_dh; /* For SCSI progress ops */ 675}; 676 677struct aac_AifJobDesc { 678 u_int32_t jobID; /* DO NOT FILL IN! Will be 679 * filled in by AIF */ 680 AAC_AifJobType type; /* Operation that is being 681 * performed */ 682 union aac_AifJobClient client; /* Details */ 683} __attribute__ ((packed)); 684 685struct aac_AifJobProgressReport { 686 struct aac_AifJobDesc jd; 687 AAC_AifJobStatus status; 688 u_int32_t finalTick; 689 u_int32_t currentTick; 690 u_int32_t jobSpecificData1; 691 u_int32_t jobSpecificData2; 692} __attribute__ ((packed)); 693 694/* 695 * Event Notification 696 */ 697typedef enum { 698 /* General application notifies start here */ 699 AifEnGeneric = 1, /* Generic notification */ 700 AifEnTaskComplete, /* Task has completed */ 701 AifEnConfigChange, /* Adapter config change occurred */ 702 AifEnContainerChange, /* Adapter specific container 703 * configuration change */ 704 AifEnDeviceFailure, /* SCSI device failed */ 705 AifEnMirrorFailover, /* Mirror failover started */ 706 AifEnContainerEvent, /* Significant container event */ 707 AifEnFileSystemChange, /* File system changed */ 708 AifEnConfigPause, /* Container pause event */ 709 AifEnConfigResume, /* Container resume event */ 710 AifEnFailoverChange, /* Failover space assignment changed */ 711 AifEnRAID5RebuildDone, /* RAID5 rebuild finished */ 712 AifEnEnclosureManagement, /* Enclosure management event */ 713 AifEnBatteryEvent, /* Significant NV battery event */ 714 AifEnAddContainer, /* A new container was created. */ 715 AifEnDeleteContainer, /* A container was deleted. */ 716 AifEnSMARTEvent, /* SMART Event */ 717 AifEnBatteryNeedsRecond, /* The battery needs reconditioning */ 718 AifEnClusterEvent, /* Some cluster event */ 719 AifEnDiskSetEvent, /* A disk set event occured. */ 720 AifDriverNotifyStart=199, /* Notifies for host driver go here */ 721 /* Host driver notifications start here */ 722 AifDenMorphComplete, /* A morph operation completed */ 723 AifDenVolumeExtendComplete /* A volume expand operation completed */ 724} AAC_AifEventNotifyType; 725 726struct aac_AifEnsGeneric { 727 char text[132]; /* Generic text */ 728} __attribute__ ((packed)); 729 730struct aac_AifEnsDeviceFailure { 731 u_int32_t deviceHandle; /* SCSI device handle */ 732} __attribute__ ((packed)); 733 734struct aac_AifEnsMirrorFailover { 735 u_int32_t container; /* Container with failed element */ 736 u_int32_t failedSlice; /* Old slice which failed */ 737 u_int32_t creatingSlice; /* New slice used for auto-create */ 738} __attribute__ ((packed)); 739 740struct aac_AifEnsContainerChange { 741 u_int32_t container[2]; /* container that changed, -1 if no 742 * container */ 743} __attribute__ ((packed)); 744 745struct aac_AifEnsContainerEvent { 746 u_int32_t container; /* container number */ 747 u_int32_t eventType; /* event type */ 748} __attribute__ ((packed)); 749 750struct aac_AifEnsEnclosureEvent { 751 u_int32_t empID; /* enclosure management proc number */ 752 u_int32_t unitID; /* unitId, fan id, power supply id, 753 * slot id, tempsensor id. */ 754 u_int32_t eventType; /* event type */ 755} __attribute__ ((packed)); 756 757struct aac_AifEnsBatteryEvent { 758 AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */ 759 AAC_NVBATTSTATUS current_state; /* current batt state */ 760 AAC_NVBATTSTATUS prior_state; /* prev batt state */ 761} __attribute__ ((packed)); 762 763struct aac_AifEnsDiskSetEvent { 764 u_int32_t eventType; 765 u_int64_t DsNum; 766 u_int64_t CreatorId; 767} __attribute__ ((packed)); 768 769typedef enum { 770 CLUSTER_NULL_EVENT = 0, 771 CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or 772 * adaptername from NULL to non-NULL */ 773 /* (partner's agent may be up) */ 774 CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or 775 * adaptername from non-null to NULL */ 776 /* (partner has rebooted) */ 777} AAC_ClusterAifEvent; 778 779struct aac_AifEnsClusterEvent { 780 AAC_ClusterAifEvent eventType; 781} __attribute__ ((packed)); 782 783struct aac_AifEventNotify { 784 AAC_AifEventNotifyType type; 785 union { 786 struct aac_AifEnsGeneric EG; 787 struct aac_AifEnsDeviceFailure EDF; 788 struct aac_AifEnsMirrorFailover EMF; 789 struct aac_AifEnsContainerChange ECC; 790 struct aac_AifEnsContainerEvent ECE; 791 struct aac_AifEnsEnclosureEvent EEE; 792 struct aac_AifEnsBatteryEvent EBE; 793 struct aac_AifEnsDiskSetEvent EDS; 794/* struct aac_AifEnsSMARTEvent ES;*/ 795 struct aac_AifEnsClusterEvent ECLE; 796 } data; 797} __attribute__ ((packed)); 798 799/* 800 * Adapter Initiated FIB command structures. Start with the adapter 801 * initiated FIBs that really come from the adapter, and get responded 802 * to by the host. 803 */ 804#define AAC_AIF_REPORT_MAX_SIZE 64 805 806typedef enum { 807 AifCmdEventNotify = 1, /* Notify of event */ 808 AifCmdJobProgress, /* Progress report */ 809 AifCmdAPIReport, /* Report from other user of API */ 810 AifCmdDriverNotify, /* Notify host driver of event */ 811 AifReqJobList = 100, /* Gets back complete job list */ 812 AifReqJobsForCtr, /* Gets back jobs for specific container */ 813 AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */ 814 AifReqJobReport, /* Gets back a specific job report or list */ 815 AifReqTerminateJob, /* Terminates job */ 816 AifReqSuspendJob, /* Suspends a job */ 817 AifReqResumeJob, /* Resumes a job */ 818 AifReqSendAPIReport, /* API generic report requests */ 819 AifReqAPIJobStart, /* Start a job from the API */ 820 AifReqAPIJobUpdate, /* Update a job report from the API */ 821 AifReqAPIJobFinish /* Finish a job from the API */ 822} AAC_AifCommand; 823 824struct aac_aif_command { 825 AAC_AifCommand command; /* Tell host what type of 826 * notify this is */ 827 u_int32_t seqNumber; /* To allow ordering of 828 * reports (if necessary) */ 829 union { 830 struct aac_AifEventNotify EN; /* Event notify structure */ 831 struct aac_AifJobProgressReport PR[1]; /* Progress report */ 832 u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE]; 833 } data; 834} __attribute__ ((packed)); 835 836/****************************************************************************** 837 * Filesystem commands/data 838 * 839 * The adapter has a very complex filesystem interface, most of which we ignore. 840 * (And which seems not to be implemented, anyway.) 841 */ 842 843/* 844 * FSA commands 845 * (not used?) 846 */ 847typedef enum { 848 Null = 0, 849 GetAttributes, 850 SetAttributes, 851 Lookup, 852 ReadLink, 853 Read, 854 Write, 855 Create, 856 MakeDirectory, 857 SymbolicLink, 858 MakeNode, 859 Removex, 860 RemoveDirectory, 861 Rename, 862 Link, 863 ReadDirectory, 864 ReadDirectoryPlus, 865 FileSystemStatus, 866 FileSystemInfo, 867 PathConfigure, 868 Commit, 869 Mount, 870 UnMount, 871 Newfs, 872 FsCheck, 873 FsSync, 874 SimReadWrite, 875 SetFileSystemStatus, 876 BlockRead, 877 BlockWrite, 878 NvramIoctl, 879 FsSyncWait, 880 ClearArchiveBit, 881 SetAcl, 882 GetAcl, 883 AssignAcl, 884 FaultInsertion, 885 CrazyCache 886} AAC_FSACommand; 887 888/* 889 * Command status values 890 */ 891typedef enum { 892 ST_OK = 0, 893 ST_PERM = 1, 894 ST_NOENT = 2, 895 ST_IO = 5, 896 ST_NXIO = 6, 897 ST_E2BIG = 7, 898 ST_ACCES = 13, 899 ST_EXIST = 17, 900 ST_XDEV = 18, 901 ST_NODEV = 19, 902 ST_NOTDIR = 20, 903 ST_ISDIR = 21, 904 ST_INVAL = 22, 905 ST_FBIG = 27, 906 ST_NOSPC = 28, 907 ST_ROFS = 30, 908 ST_MLINK = 31, 909 ST_WOULDBLOCK = 35, 910 ST_NAMETOOLONG = 63, 911 ST_NOTEMPTY = 66, 912 ST_DQUOT = 69, 913 ST_STALE = 70, 914 ST_REMOTE = 71, 915 ST_BADHANDLE = 10001, 916 ST_NOT_SYNC = 10002, 917 ST_BAD_COOKIE = 10003, 918 ST_NOTSUPP = 10004, 919 ST_TOOSMALL = 10005, 920 ST_SERVERFAULT = 10006, 921 ST_BADTYPE = 10007, 922 ST_JUKEBOX = 10008, 923 ST_NOTMOUNTED = 10009, 924 ST_MAINTMODE = 10010, 925 ST_STALEACL = 10011 926} AAC_FSAStatus; 927 928/* 929 * Volume manager commands 930 */ 931typedef enum _VM_COMMANDS { 932 VM_Null = 0, 933 VM_NameServe, 934 VM_ContainerConfig, 935 VM_Ioctl, 936 VM_FilesystemIoctl, 937 VM_CloseAll, 938 VM_CtBlockRead, 939 VM_CtBlockWrite, 940 VM_SliceBlockRead, /* raw access to configured "storage objects" */ 941 VM_SliceBlockWrite, 942 VM_DriveBlockRead, /* raw access to physical devices */ 943 VM_DriveBlockWrite, 944 VM_EnclosureMgt, /* enclosure management */ 945 VM_Unused, /* used to be diskset management */ 946 VM_CtBlockVerify, 947 VM_CtPerf, /* performance test */ 948 VM_CtBlockRead64, 949 VM_CtBlockWrite64, 950 VM_CtBlockVerify64, 951} AAC_VMCommand; 952 953/* 954 * "mountable object" 955 */ 956struct aac_mntobj { 957 u_int32_t ObjectId; 958 char FileSystemName[16]; 959 struct aac_container_creation CreateInfo; 960 u_int32_t Capacity; 961 AAC_FSAVolType VolType; 962 AAC_FType ObjType; 963 u_int32_t ContentState; 964#define FSCS_READONLY 0x0002 /* XXX need more information 965 * than this */ 966 union { 967 u_int32_t pad[8]; 968 } ObjExtension; 969 u_int32_t AlterEgoId; 970} __attribute__ ((packed)); 971 972struct aac_mntinfo { 973 AAC_VMCommand Command; 974 AAC_FType MntType; 975 u_int32_t MntCount; 976} __attribute__ ((packed)); 977 978struct aac_mntinforesponse { 979 AAC_FSAStatus Status; 980 AAC_FType MntType; 981 u_int32_t MntRespCount; 982 struct aac_mntobj MntTable[1]; 983} __attribute__ ((packed)); 984 985/* 986 * Container shutdown command. 987 */ 988struct aac_closecommand { 989 u_int32_t Command; 990 u_int32_t ContainerId; 991} __attribute__ ((packed)); 992 993/* 994 * Write 'stability' options. 995 */ 996typedef enum { 997 CSTABLE = 1, 998 CUNSTABLE 999} AAC_CacheLevel; 1000 1001/* 1002 * Commit level response for a write request. 1003 */ 1004typedef enum { 1005 CMFILE_SYNC_NVRAM = 1, 1006 CMDATA_SYNC_NVRAM, 1007 CMFILE_SYNC, 1008 CMDATA_SYNC, 1009 CMUNSTABLE 1010} AAC_CommitLevel; 1011 1012/* 1013 * Block read/write operations. 1014 * These structures are packed into the 'data' area in the FIB. 1015 */ 1016 1017struct aac_blockread { 1018 AAC_VMCommand Command; /* not FSACommand! */ 1019 u_int32_t ContainerId; 1020 u_int32_t BlockNumber; 1021 u_int32_t ByteCount; 1022 struct aac_sg_table SgMap; /* variable size */ 1023} __attribute__ ((packed)); 1024 1025struct aac_blockread_response { 1026 AAC_FSAStatus Status; 1027 u_int32_t ByteCount; 1028} __attribute__ ((packed)); 1029 1030struct aac_blockwrite { 1031 AAC_VMCommand Command; /* not FSACommand! */ 1032 u_int32_t ContainerId; 1033 u_int32_t BlockNumber; 1034 u_int32_t ByteCount; 1035 AAC_CacheLevel Stable; 1036 struct aac_sg_table SgMap; /* variable size */ 1037} __attribute__ ((packed)); 1038 1039struct aac_blockwrite_response { 1040 AAC_FSAStatus Status; 1041 u_int32_t ByteCount; 1042 AAC_CommitLevel Committed; 1043} __attribute__ ((packed)); 1044 1045/* 1046 * Container shutdown command. 1047 */ 1048struct aac_close_command { 1049 AAC_VMCommand Command; 1050 u_int32_t ContainerId; 1051}; 1052 1053/****************************************************************************** 1054 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based 1055 * on the SA110 'StrongArm'. 1056 */ 1057 1058#define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */ 1059#define AAC_SA_DOORBELL0_SET 0x9c 1060#define AAC_SA_DOORBELL0 0x9c 1061#define AAC_SA_MASK0_CLEAR 0xa0 1062#define AAC_SA_MASK0_SET 0xa4 1063 1064#define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */ 1065#define AAC_SA_DOORBELL1_SET 0x9e 1066#define AAC_SA_MASK1_CLEAR 0xa2 1067#define AAC_SA_MASK1_SET 0xa6 1068 1069#define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */ 1070#define AAC_SA_FWSTATUS 0xc4 1071 1072/****************************************************************************** 1073 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx, 1074 * and other related adapters. 1075 */ 1076 1077#define AAC_RX_IDBR 0x20 /* inbound doorbell register */ 1078#define AAC_RX_IISR 0x24 /* inbound interrupt status register */ 1079#define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */ 1080#define AAC_RX_ODBR 0x2c /* outbound doorbell register */ 1081#define AAC_RX_OISR 0x30 /* outbound interrupt status register */ 1082#define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */ 1083 1084#define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */ 1085#define AAC_RX_FWSTATUS 0x6c 1086 1087/****************************************************************************** 1088 * Common bit definitions for the doorbell registers. 1089 */ 1090 1091/* 1092 * Status bits in the doorbell registers. 1093 */ 1094#define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */ 1095#define AAC_DB_COMMAND_READY (1<<1) /* posted one or more commands */ 1096#define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands complete */ 1097#define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */ 1098#define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */ 1099 1100/* 1101 * The adapter can request the host print a message by setting the 1102 * DB_PRINTF flag in DOORBELL0. The driver responds by collecting the 1103 * message from the printf buffer, clearing the DB_PRINTF flag in 1104 * DOORBELL0 and setting it in DOORBELL1. 1105 * (ODBR and IDBR respectively for the i960Rx adapters) 1106 */ 1107#define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */ 1108 1109/* 1110 * Mask containing the interrupt bits we care about. We don't anticipate (or 1111 * want) interrupts not in this mask. 1112 */ 1113#define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | AAC_DB_RESPONSE_READY | AAC_DB_PRINTF) 1114