aacreg.h revision 213272
1193323Sed/*- 2193323Sed * Copyright (c) 2000 Michael Smith 3193323Sed * Copyright (c) 2000-2001 Scott Long 4193323Sed * Copyright (c) 2000 BSDi 5193323Sed * Copyright (c) 2001 Adaptec, Inc. 6193323Sed * All rights reserved. 7193323Sed * 8193323Sed * Redistribution and use in source and binary forms, with or without 9193323Sed * modification, are permitted provided that the following conditions 10193323Sed * are met: 11193323Sed * 1. Redistributions of source code must retain the above copyright 12193323Sed * notice, this list of conditions and the following disclaimer. 13193323Sed * 2. Redistributions in binary form must reproduce the above copyright 14193323Sed * notice, this list of conditions and the following disclaimer in the 15193323Sed * documentation and/or other materials provided with the distribution. 16193323Sed * 17193323Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18193323Sed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19193323Sed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20193323Sed * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21193323Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22193323Sed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23193323Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24193323Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25193323Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26193323Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27193323Sed * SUCH DAMAGE. 28193323Sed * 29193323Sed * $FreeBSD: head/sys/dev/aac/aacreg.h 213272 2010-09-29 14:22:00Z emaste $ 30195340Sed */ 31212904Sdim 32193323Sed/* 33224145Sdim * Data structures defining the interface between the driver and the Adaptec 34223017Sdim * 'FSA' adapters. Note that many field names and comments here are taken 35193323Sed * verbatim from the Adaptec driver source in order to make comparing the 36218893Sdim * two slightly easier. 37218893Sdim */ 38193323Sed 39193323Sed/* 40193323Sed * Misc. magic numbers. 41218893Sdim */ 42218893Sdim#define AAC_MAX_CONTAINERS 64 43193323Sed#define AAC_BLOCK_SIZE 512 44198090Srdivacky 45193323Sed/* 46193323Sed * Communications interface. 47193323Sed * 48198090Srdivacky * Where datastructure layouts are closely parallel to the Adaptec sample code, 49218893Sdim * retain their naming conventions (for now) to aid in cross-referencing. 50193323Sed */ 51193323Sed 52193323Sed/* 53193323Sed * We establish 4 command queues and matching response queues. Queues must 54193323Sed * be 16-byte aligned, and are sized as follows: 55193323Sed */ 56218893Sdim#define AAC_HOST_NORM_CMD_ENTRIES 8 /* command adapter->host, 57193323Sed * normal priority */ 58193323Sed#define AAC_HOST_HIGH_CMD_ENTRIES 4 /* command adapter->host, 59193323Sed * high priority */ 60193323Sed#define AAC_ADAP_NORM_CMD_ENTRIES 512 /* command host->adapter, 61198090Srdivacky * normal priority */ 62218893Sdim#define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* command host->adapter, 63218893Sdim * high priority */ 64193323Sed#define AAC_HOST_NORM_RESP_ENTRIES 512 /* response, adapter->host, 65193323Sed * normal priority */ 66193323Sed#define AAC_HOST_HIGH_RESP_ENTRIES 4 /* response, adapter->host, 67193323Sed * high priority */ 68193323Sed#define AAC_ADAP_NORM_RESP_ENTRIES 8 /* response, host->adapter, 69193323Sed * normal priority */ 70193323Sed#define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* response, host->adapter, 71193323Sed * high priority */ 72193323Sed 73193323Sed#define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \ 74193323Sed AAC_HOST_NORM_CMD_ENTRIES + \ 75193323Sed AAC_ADAP_HIGH_CMD_ENTRIES + \ 76218893Sdim AAC_ADAP_NORM_CMD_ENTRIES + \ 77193323Sed AAC_HOST_HIGH_RESP_ENTRIES + \ 78218893Sdim AAC_HOST_NORM_RESP_ENTRIES + \ 79201360Srdivacky AAC_ADAP_HIGH_RESP_ENTRIES + \ 80201360Srdivacky AAC_ADAP_NORM_RESP_ENTRIES) 81201360Srdivacky#define AAC_QUEUE_COUNT 8 82201360Srdivacky#define AAC_QUEUE_ALIGN 16 83193323Sed 84193323Sedstruct aac_queue_entry { 85193323Sed u_int32_t aq_fib_size; /* FIB size in bytes */ 86193323Sed u_int32_t aq_fib_addr; /* receiver-space address of the FIB */ 87218893Sdim} __packed; 88218893Sdim 89218893Sdim#define AAC_PRODUCER_INDEX 0 90218893Sdim#define AAC_CONSUMER_INDEX 1 91218893Sdim 92218893Sdim/* 93218893Sdim * Table of queue indices and queues used to communicate with the 94193323Sed * controller. This structure must be aligned to AAC_QUEUE_ALIGN 95193323Sed */ 96218893Sdimstruct aac_queue_table { 97193323Sed /* queue consumer/producer indexes (layout mandated by adapter) */ 98193323Sed u_int32_t qt_qindex[AAC_QUEUE_COUNT][2]; 99193323Sed 100193323Sed /* queue entry structures (layout mandated by adapter) */ 101193323Sed struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES]; 102193323Sed struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES]; 103218893Sdim struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES]; 104218893Sdim struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES]; 105218893Sdim struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES]; 106218893Sdim struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES]; 107218893Sdim struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES]; 108218893Sdim struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES]; 109218893Sdim} __packed; 110218893Sdim 111218893Sdim/* 112218893Sdim * Queue names 113218893Sdim * 114218893Sdim * Note that we base these at 0 in order to use them as array indices. Adaptec 115218893Sdim * used base 1 for some unknown reason, and sorted them in a different order. 116193323Sed */ 117218893Sdim#define AAC_HOST_NORM_CMD_QUEUE 0 118193323Sed#define AAC_HOST_HIGH_CMD_QUEUE 1 119193323Sed#define AAC_ADAP_NORM_CMD_QUEUE 2 120218893Sdim#define AAC_ADAP_HIGH_CMD_QUEUE 3 121218893Sdim#define AAC_HOST_NORM_RESP_QUEUE 4 122218893Sdim#define AAC_HOST_HIGH_RESP_QUEUE 5 123218893Sdim#define AAC_ADAP_NORM_RESP_QUEUE 6 124193323Sed#define AAC_ADAP_HIGH_RESP_QUEUE 7 125202878Srdivacky 126193323Sed/* 127218893Sdim * List structure used to chain FIBs (used by the adapter - we hang FIBs off 128218893Sdim * our private command structure and don't touch these) 129218893Sdim */ 130218893Sdimstruct aac_fib_list_entry { 131218893Sdim u_int32_t Flink; 132218893Sdim u_int32_t Blink; 133218893Sdim} __packed; 134201360Srdivacky 135201360Srdivacky/* 136201360Srdivacky * FIB (FSA Interface Block?); this is the datastructure passed between the host 137218893Sdim * and adapter. 138218893Sdim */ 139198892Srdivackystruct aac_fib_header { 140201360Srdivacky u_int32_t XferState; 141218893Sdim u_int16_t Command; 142201360Srdivacky u_int8_t StructType; 143201360Srdivacky u_int8_t Flags; 144201360Srdivacky u_int16_t Size; 145201360Srdivacky u_int16_t SenderSize; 146201360Srdivacky u_int32_t SenderFibAddress; 147201360Srdivacky u_int32_t ReceiverFibAddress; 148201360Srdivacky u_int32_t SenderData; 149198892Srdivacky union { 150193323Sed struct { 151198892Srdivacky u_int32_t ReceiverTimeStart; 152193323Sed u_int32_t ReceiverTimeDone; 153198892Srdivacky } _s; 154193323Sed struct aac_fib_list_entry FibLinks; 155218893Sdim } _u; 156224145Sdim} __packed; 157224145Sdim 158193323Sed#define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header)) 159218893Sdim 160218893Sdimstruct aac_fib { 161218893Sdim struct aac_fib_header Header; 162218893Sdim u_int8_t data[AAC_FIB_DATASIZE]; 163218893Sdim} __packed; 164218893Sdim 165218893Sdim/* 166218893Sdim * FIB commands 167218893Sdim */ 168218893Sdimtypedef enum { 169218893Sdim TestCommandResponse = 1, 170218893Sdim TestAdapterCommand = 2, 171218893Sdim 172218893Sdim /* lowlevel and comm commands */ 173218893Sdim LastTestCommand = 100, 174218893Sdim ReinitHostNormCommandQueue = 101, 175218893Sdim ReinitHostHighCommandQueue = 102, 176218893Sdim ReinitHostHighRespQueue = 103, 177218893Sdim ReinitHostNormRespQueue = 104, 178218893Sdim ReinitAdapNormCommandQueue = 105, 179218893Sdim ReinitAdapHighCommandQueue = 107, 180218893Sdim ReinitAdapHighRespQueue = 108, 181218893Sdim ReinitAdapNormRespQueue = 109, 182218893Sdim InterfaceShutdown = 110, 183218893Sdim DmaCommandFib = 120, 184218893Sdim StartProfile = 121, 185218893Sdim TermProfile = 122, 186218893Sdim SpeedTest = 123, 187218893Sdim TakeABreakPt = 124, 188218893Sdim RequestPerfData = 125, 189218893Sdim SetInterruptDefTimer= 126, 190218893Sdim SetInterruptDefCount= 127, 191193323Sed GetInterruptDefStatus= 128, 192193323Sed LastCommCommand = 129, 193218893Sdim 194218893Sdim /* filesystem commands */ 195193323Sed NuFileSystem = 300, 196218893Sdim UFS = 301, 197218893Sdim HostFileSystem = 302, 198218893Sdim LastFileSystemCommand = 303, 199218893Sdim 200218893Sdim /* Container Commands */ 201218893Sdim ContainerCommand = 500, 202218893Sdim ContainerCommand64 = 501, 203218893Sdim RawIo = 502, 204218893Sdim 205218893Sdim /* Cluster Commands */ 206218893Sdim ClusterCommand = 550, 207193323Sed 208218893Sdim /* Scsi Port commands (scsi passthrough) */ 209218893Sdim ScsiPortCommand = 600, 210218893Sdim ScsiPortCommandU64 = 601, 211218893Sdim SataPortCommandU64 = 602, 212218893Sdim SasSmpPassThrough = 603, 213193323Sed SasRequestPhyInfo = 612, 214193323Sed 215193323Sed /* misc house keeping and generic adapter initiated commands */ 216207618Srdivacky AifRequest = 700, 217207618Srdivacky CheckRevision = 701, 218207618Srdivacky FsaHostShutdown = 702, 219207618Srdivacky RequestAdapterInfo = 703, 220207618Srdivacky IsAdapterPaused = 704, 221207618Srdivacky SendHostTime = 705, 222207618Srdivacky RequestSupplementAdapterInfo = 706, /* Supp. Info for set in UCC 223207618Srdivacky * use only if supported 224207618Srdivacky * (RequestAdapterInfo first) */ 225221345Sdim LastMiscCommand = 707, 226207618Srdivacky 227207618Srdivacky OnLineDiagnostic = 800, 228218893Sdim FduAdapterTest = 801, 229207618Srdivacky RequestCompatibilityId = 802, 230207618Srdivacky AdapterEnvironmentInfo = 803, /* temp. sensors */ 231207618Srdivacky NvsramEventLog = 900, 232218893Sdim ResetNvsramEventLogPointers = 901, 233224145Sdim EnableEventLog = 902, 234224145Sdim DisableEventLog = 903, 235224145Sdim EncryptedKeyTransportFIB= 904, 236224145Sdim KeyableFeaturesFIB= 905 237224145Sdim} AAC_FibCommands; 238224145Sdim 239224145Sdim/* 240224145Sdim * FIB types 241224145Sdim */ 242224145Sdim#define AAC_FIBTYPE_TFIB 1 243224145Sdim#define AAC_FIBTYPE_TQE 2 244224145Sdim#define AAC_FIBTYPE_TCTPERF 3 245224145Sdim 246224145Sdim/* 247224145Sdim * FIB transfer state 248224145Sdim */ 249224145Sdim#define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */ 250224145Sdim#define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */ 251224145Sdim#define AAC_FIBSTATE_INITIALISED (1<<2) /* initialised */ 252224145Sdim#define AAC_FIBSTATE_EMPTY (1<<3) /* empty */ 253207618Srdivacky#define AAC_FIBSTATE_FROMPOOL (1<<4) /* allocated from pool */ 254207618Srdivacky#define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */ 255207618Srdivacky#define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */ 256224145Sdim#define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */ 257218893Sdim#define AAC_FIBSTATE_RNOTEXPECTED (1<<8) /* response is not expected */ 258221345Sdim#define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */ 259221345Sdim#define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */ 260221345Sdim#define AAC_FIBSTATE_HIGH (1<<11) /* high priority */ 261221345Sdim#define AAC_FIBSTATE_NORM (1<<12) /* normal priority */ 262221345Sdim#define AAC_FIBSTATE_ASYNC (1<<13) 263207618Srdivacky#define AAC_FIBSTATE_ASYNCIO (1<<13) /* to be removed */ 264207618Srdivacky#define AAC_FIBSTATE_PAGEFILEIO (1<<14) /* to be removed */ 265224145Sdim#define AAC_FIBSTATE_SHUTDOWN (1<<15) 266224145Sdim#define AAC_FIBSTATE_LAZYWRITE (1<<16) /* to be removed */ 267218893Sdim#define AAC_FIBSTATE_ADAPMICROFIB (1<<17) 268207618Srdivacky#define AAC_FIBSTATE_BIOSFIB (1<<18) 269218893Sdim#define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */ 270207618Srdivacky#define AAC_FIBSTATE_APIFIB (1<<20) 271207618Srdivacky 272224145Sdim/* 273221345Sdim * FIB error values 274207618Srdivacky */ 275218893Sdim#define AAC_ERROR_NORMAL 0x00 276207618Srdivacky#define AAC_ERROR_PENDING 0x01 277207618Srdivacky#define AAC_ERROR_FATAL 0x02 278207618Srdivacky#define AAC_ERROR_INVALID_QUEUE 0x03 279207618Srdivacky#define AAC_ERROR_NOENTRIES 0x04 280207618Srdivacky#define AAC_ERROR_SENDFAILED 0x05 281207618Srdivacky#define AAC_ERROR_INVALID_QUEUE_PRIORITY 0x06 282207618Srdivacky#define AAC_ERROR_FIB_ALLOCATION_FAILED 0x07 283212904Sdim#define AAC_ERROR_FIB_DEALLOCATION_FAILED 0x08 284207618Srdivacky 285207618Srdivacky/* 286207618Srdivacky * Adapter Init Structure: this is passed to the adapter with the 287207618Srdivacky * AAC_MONKER_INITSTRUCT command to point it at our control structures. 288207618Srdivacky */ 289207618Srdivackystruct aac_adapter_init { 290207618Srdivacky u_int32_t InitStructRevision; 291207618Srdivacky#define AAC_INIT_STRUCT_REVISION 3 292218893Sdim#define AAC_INIT_STRUCT_REVISION_4 4 293224145Sdim u_int32_t MiniPortRevision; 294224145Sdim#define AAC_INIT_STRUCT_MINIPORT_REVISION 1 295224145Sdim u_int32_t FilesystemRevision; 296224145Sdim u_int32_t CommHeaderAddress; 297224145Sdim u_int32_t FastIoCommAreaAddress; 298224145Sdim u_int32_t AdapterFibsPhysicalAddress; 299224145Sdim u_int32_t AdapterFibsVirtualAddress; 300224145Sdim u_int32_t AdapterFibsSize; 301224145Sdim u_int32_t AdapterFibAlign; 302224145Sdim u_int32_t PrintfBufferAddress; 303207618Srdivacky u_int32_t PrintfBufferSize; 304207618Srdivacky#define AAC_PAGE_SIZE 4096 305207618Srdivacky u_int32_t HostPhysMemPages; 306207618Srdivacky u_int32_t HostElapsedSeconds; 307207618Srdivacky /* ADAPTER_INIT_STRUCT_REVISION_4 begins here */ 308207618Srdivacky u_int32_t InitFlags; /* flags for supported features */ 309207618Srdivacky#define AAC_INITFLAGS_NEW_COMM_SUPPORTED 1 310224145Sdim#define AAC_INITFLAGS_DRIVER_USES_UTC_TIME 0x10 311224145Sdim#define AAC_INITFLAGS_DRIVER_SUPPORTS_PM 0x20 312207618Srdivacky u_int32_t MaxIoCommands; /* max outstanding commands */ 313207618Srdivacky u_int32_t MaxIoSize; /* largest I/O command */ 314207618Srdivacky u_int32_t MaxFibSize; /* largest FIB to adapter */ 315207618Srdivacky} __packed; 316221345Sdim 317224145Sdim/* 318224145Sdim * Shared data types 319221345Sdim */ 320221345Sdim/* 321207618Srdivacky * Container types 322207618Srdivacky */ 323221345Sdimtypedef enum { 324207618Srdivacky CT_NONE = 0, 325207618Srdivacky CT_VOLUME, 326207618Srdivacky CT_MIRROR, 327207618Srdivacky CT_STRIPE, 328207618Srdivacky CT_RAID5, 329207618Srdivacky CT_SSRW, 330224145Sdim CT_SSRO, 331224145Sdim CT_MORPH, 332224145Sdim CT_PASSTHRU, 333207618Srdivacky CT_RAID4, 334221345Sdim CT_RAID10, /* stripe of mirror */ 335207618Srdivacky CT_RAID00, /* stripe of stripe */ 336207618Srdivacky CT_VOLUME_OF_MIRRORS, /* volume of mirror */ 337207618Srdivacky CT_PSEUDO_RAID3, /* really raid4 */ 338207618Srdivacky CT_RAID50, /* stripe of raid5 */ 339221345Sdim CT_RAID5D, /* raid5 distributed hot-sparing */ 340221345Sdim CT_RAID5D0, 341221345Sdim CT_RAID1E, /* extended raid1 mirroring */ 342221345Sdim CT_RAID6, 343221345Sdim CT_RAID60, 344207618Srdivacky} AAC_FSAVolType; 345207618Srdivacky 346207618Srdivacky/* 347224145Sdim * Host-addressable object types 348224145Sdim */ 349207618Srdivackytypedef enum { 350207618Srdivacky FT_REG = 1, /* regular file */ 351224145Sdim FT_DIR, /* directory */ 352207618Srdivacky FT_BLK, /* "block" device - reserved */ 353218893Sdim FT_CHR, /* "character special" device - reserved */ 354207618Srdivacky FT_LNK, /* symbolic link */ 355207618Srdivacky FT_SOCK, /* socket */ 356207618Srdivacky FT_FIFO, /* fifo */ 357207618Srdivacky FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */ 358207618Srdivacky FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */ 359221345Sdim FT_SLICE, /* virtual disk - raw volume - slice */ 360207618Srdivacky FT_PARTITION, /* FSA partition - carved out of a slice - building 361207618Srdivacky * block for containers */ 362207618Srdivacky FT_VOLUME, /* Container - Volume Set */ 363207618Srdivacky FT_STRIPE, /* Container - Stripe Set */ 364221345Sdim FT_MIRROR, /* Container - Mirror Set */ 365221345Sdim FT_RAID5, /* Container - Raid 5 Set */ 366221345Sdim FT_DATABASE /* Storage object with "foreign" content manager */ 367224145Sdim} AAC_FType; 368221345Sdim 369221345Sdim/* 370207618Srdivacky * Host-side scatter/gather list for 32-bit commands. 371207618Srdivacky */ 372207618Srdivackystruct aac_sg_entry { 373223017Sdim u_int32_t SgAddress; 374223017Sdim u_int32_t SgByteCount; 375221345Sdim} __packed; 376224145Sdim 377207618Srdivackystruct aac_sg_entry64 { 378221345Sdim u_int64_t SgAddress; 379221345Sdim u_int32_t SgByteCount; 380221345Sdim} __packed; 381224145Sdim 382221345Sdimstruct aac_sg_entryraw { 383221345Sdim u_int32_t Next; /* reserved for FW use */ 384221345Sdim u_int32_t Prev; /* reserved for FW use */ 385221345Sdim u_int64_t SgAddress; 386221345Sdim u_int32_t SgByteCount; 387221345Sdim u_int32_t Flags; /* reserved for FW use */ 388207618Srdivacky} __packed; 389207618Srdivacky 390218893Sdimstruct aac_sg_table { 391207618Srdivacky u_int32_t SgCount; 392207618Srdivacky struct aac_sg_entry SgEntry[0]; 393224145Sdim} __packed; 394207618Srdivacky 395207618Srdivacky/* 396224145Sdim * Host-side scatter/gather list for 64-bit commands. 397224145Sdim */ 398221345Sdimstruct aac_sg_table64 { 399221345Sdim u_int32_t SgCount; 400221345Sdim struct aac_sg_entry64 SgEntry64[0]; 401221345Sdim} __packed; 402221345Sdim 403221345Sdim/* 404221345Sdim * s/g list for raw commands 405221345Sdim */ 406221345Sdimstruct aac_sg_tableraw { 407221345Sdim u_int32_t SgCount; 408221345Sdim struct aac_sg_entryraw SgEntryRaw[0]; 409221345Sdim} __packed; 410221345Sdim 411224145Sdim/* 412221345Sdim * Container creation data 413221345Sdim */ 414221345Sdimstruct aac_container_creation { 415221345Sdim u_int8_t ViaBuildNumber; 416224145Sdim u_int8_t MicroSecond; 417221345Sdim u_int8_t Via; /* 1 = FSU, 2 = API, etc. */ 418221345Sdim u_int8_t YearsSince1900; 419221345Sdim u_int32_t Month:4; /* 1-12 */ 420224145Sdim u_int32_t Day:6; /* 1-32 */ 421224145Sdim u_int32_t Hour:6; /* 0-23 */ 422221345Sdim u_int32_t Minute:6; /* 0-59 */ 423224145Sdim u_int32_t Second:6; /* 0-59 */ 424221345Sdim u_int64_t ViaAdapterSerialNumber; 425224145Sdim} __packed; 426224145Sdim 427221345Sdim/* 428221345Sdim * Revision number handling 429221345Sdim */ 430221345Sdim 431221345Sdimtypedef enum { 432221345Sdim RevApplication = 1, 433221345Sdim RevDkiCli, 434221345Sdim RevNetService, 435221345Sdim RevApi, 436221345Sdim RevFileSysDriver, 437221345Sdim RevMiniportDriver, 438221345Sdim RevAdapterSW, 439221345Sdim RevMonitor, 440221345Sdim RevRemoteApi 441221345Sdim} RevComponent; 442221345Sdim 443221345Sdimstruct FsaRevision { 444221345Sdim union { 445221345Sdim struct { 446221345Sdim u_int8_t dash; 447221345Sdim u_int8_t type; 448221345Sdim u_int8_t minor; 449221345Sdim u_int8_t major; 450221345Sdim } comp; 451221345Sdim u_int32_t ul; 452221345Sdim } external; 453221345Sdim u_int32_t buildNumber; 454221345Sdim} __packed; 455221345Sdim 456221345Sdim/* 457221345Sdim * Adapter Information 458221345Sdim */ 459221345Sdim 460221345Sdimtypedef enum { 461224145Sdim CPU_NTSIM = 1, 462221345Sdim CPU_I960, 463221345Sdim CPU_ARM, 464221345Sdim CPU_SPARC, 465221345Sdim CPU_POWERPC, 466221345Sdim CPU_ALPHA, 467221345Sdim CPU_P7, 468207618Srdivacky CPU_I960_RX, 469207618Srdivacky CPU_MIPS, 470207618Srdivacky CPU_XSCALE, 471207618Srdivacky CPU__last 472207618Srdivacky} AAC_CpuType; 473207618Srdivacky 474207618Srdivackytypedef enum { 475207618Srdivacky CPUI960_JX = 1, 476207618Srdivacky CPUI960_CX, 477207618Srdivacky CPUI960_HX, 478207618Srdivacky CPUI960_RX, 479207618Srdivacky CPUARM_SA110, 480218893Sdim CPUARM_xxx, 481207618Srdivacky CPUPPC_603e, 482207618Srdivacky CPUPPC_xxx, 483207618Srdivacky CPUI960_80303, 484207618Srdivacky CPU_XSCALE_80321, 485218893Sdim CPU_MIPS_4KC, 486218893Sdim CPU_MIPS_5KC, 487218893Sdim CPUSUBTYPE__last 488221345Sdim} AAC_CpuSubType; 489224145Sdim 490207618Srdivackytypedef enum { 491207618Srdivacky PLAT_NTSIM = 1, 492218893Sdim PLAT_V3ADU, 493207618Srdivacky PLAT_CYCLONE, 494207618Srdivacky PLAT_CYCLONE_HD, 495207618Srdivacky PLAT_BATBOARD, 496218893Sdim PLAT_BATBOARD_HD, 497218893Sdim PLAT_YOLO, 498218893Sdim PLAT_COBRA, 499221345Sdim PLAT_ANAHEIM, 500224145Sdim PLAT_JALAPENO, 501207618Srdivacky PLAT_QUEENS, 502207618Srdivacky PLAT_JALAPENO_DELL, 503218893Sdim PLAT_POBLANO, 504207618Srdivacky PLAT_POBLANO_OPAL, 505207618Srdivacky PLAT_POBLANO_SL0, 506207618Srdivacky PLAT_POBLANO_SL1, 507207618Srdivacky PLAT_POBLANO_SL2, 508207618Srdivacky PLAT_POBLANO_XXX, 509207618Srdivacky PLAT_JALAPENO_P2, 510207618Srdivacky PLAT_HABANERO, 511207618Srdivacky PLAT_VULCAN, 512207618Srdivacky PLAT_CRUSADER, 513207618Srdivacky PLAT_LANCER, 514207618Srdivacky PLAT_HARRIER, 515218893Sdim PLAT_TERMINATOR, 516207618Srdivacky PLAT_SKYHAWK, 517207618Srdivacky PLAT_CORSAIR, 518207618Srdivacky PLAT_JAGUAR, 519207618Srdivacky PLAT_SATAHAWK, 520207618Srdivacky PLAT_SATANATOR, 521207618Srdivacky PLAT_PROWLER, 522207618Srdivacky PLAT_BLACKBIRD, 523207618Srdivacky PLAT_SABREEXPRESS, 524221345Sdim PLAT_INTRUDER, 525207618Srdivacky PLAT__last 526207618Srdivacky} AAC_Platform; 527207618Srdivacky 528207618Srdivackytypedef enum { 529207618Srdivacky OEM_FLAVOR_ADAPTEC = 1, 530207618Srdivacky OEM_FLAVOR_DELL, 531224145Sdim OEM_FLAVOR_HP, 532224145Sdim OEM_FLAVOR_IBM, 533207618Srdivacky OEM_FLAVOR_CPQ, 534224145Sdim OEM_FLAVOR_FSC, 535224145Sdim OEM_FLAVOR_DWS, 536224145Sdim OEM_FLAVOR_BRAND_Z, 537224145Sdim OEM_FLAVOR_LEGEND, 538224145Sdim OEM_FLAVOR_HITACHI, 539224145Sdim OEM_FLAVOR_ESG, 540224145Sdim OEM_FLAVOR_ICP, 541224145Sdim OEM_FLAVOR_SCM, 542224145Sdim OEM_FLAVOR__last 543224145Sdim} AAC_OemFlavor; 544224145Sdim 545224145Sdim/* 546224145Sdim * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT 547207618Srdivacky */ 548221345Sdimtypedef enum 549207618Srdivacky{ 550207618Srdivacky PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */ 551207618Srdivacky PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */ 552207618Srdivacky PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */ 553207618Srdivacky PLATFORM_BAT_OPT_NOTPRESENT, /* BATTERY OPTIONAL AND NOT PRESENT */ 554207618Srdivacky PLATFORM_BAT_NOT_SUPPORTED /* BATTERY NOT SUPPORTED */ 555207618Srdivacky} AAC_BatteryPlatform; 556207618Srdivacky 557207618Srdivacky/* 558218893Sdim * options supported by this board 559207618Srdivacky * there has to be a one to one mapping of these defines and the ones in 560207618Srdivacky * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT 561207618Srdivacky */ 562218893Sdim#define AAC_SUPPORTED_SNAPSHOT 0x01 563207618Srdivacky#define AAC_SUPPORTED_CLUSTERS 0x02 564207618Srdivacky#define AAC_SUPPORTED_WRITE_CACHE 0x04 565207618Srdivacky#define AAC_SUPPORTED_64BIT_DATA 0x08 566218893Sdim#define AAC_SUPPORTED_HOST_TIME_FIB 0x10 567207618Srdivacky#define AAC_SUPPORTED_RAID50 0x20 568207618Srdivacky#define AAC_SUPPORTED_4GB_WINDOW 0x40 569207618Srdivacky#define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80 570207618Srdivacky#define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100 571207618Srdivacky#define AAC_SUPPORTED_NOT_RECONDITION 0x200 572207618Srdivacky#define AAC_SUPPORTED_SGMAP_HOST64 0x400 573207618Srdivacky#define AAC_SUPPORTED_ALARM 0x800 574207618Srdivacky#define AAC_SUPPORTED_NONDASD 0x1000 575207618Srdivacky#define AAC_SUPPORTED_SCSI_MANAGED 0x2000 576207618Srdivacky#define AAC_SUPPORTED_RAID_SCSI_MODE 0x4000 577207618Srdivacky#define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO 0x10000 578207618Srdivacky#define AAC_SUPPORTED_NEW_COMM 0x20000 579207618Srdivacky#define AAC_SUPPORTED_64BIT_ARRAYSIZE 0x40000 580207618Srdivacky#define AAC_SUPPORTED_HEAT_SENSOR 0x80000 581207618Srdivacky 582207618Srdivacky/* 583207618Srdivacky * Structure used to respond to a RequestAdapterInfo fib. 584207618Srdivacky */ 585207618Srdivackystruct aac_adapter_info { 586207618Srdivacky AAC_Platform PlatformBase; /* adapter type */ 587207618Srdivacky AAC_CpuType CpuArchitecture; /* adapter CPU type */ 588207618Srdivacky AAC_CpuSubType CpuVariant; /* adapter CPU subtype */ 589207618Srdivacky u_int32_t ClockSpeed; /* adapter CPU clockspeed */ 590207618Srdivacky u_int32_t ExecutionMem; /* adapter Execution Memory 591207618Srdivacky * size */ 592207618Srdivacky u_int32_t BufferMem; /* adapter Data Memory */ 593207618Srdivacky u_int32_t TotalMem; /* adapter Total Memory */ 594207618Srdivacky struct FsaRevision KernelRevision; /* adapter Kernel Software 595207618Srdivacky * Revision */ 596207618Srdivacky struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic 597218893Sdim * Software Revision */ 598218893Sdim struct FsaRevision HardwareRevision;/* TBD */ 599218893Sdim struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ 600207618Srdivacky u_int32_t ClusteringEnabled; 601207618Srdivacky u_int32_t ClusterChannelMask; 602207618Srdivacky u_int64_t SerialNumber; 603207618Srdivacky AAC_BatteryPlatform batteryPlatform; 604207618Srdivacky u_int32_t SupportedOptions; /* supported features of this 605207618Srdivacky * controller */ 606207618Srdivacky AAC_OemFlavor OemVariant; 607207618Srdivacky} __packed; 608207618Srdivacky 609218893Sdim/* 610207618Srdivacky * Structure used to respond to a RequestSupplementAdapterInfo fib. 611207618Srdivacky */ 612207618Srdivackystruct vpd_info { 613207618Srdivacky u_int8_t AssemblyPn[8]; 614207618Srdivacky u_int8_t FruPn[8]; 615207618Srdivacky u_int8_t BatteryFruPn[8]; 616207618Srdivacky u_int8_t EcVersionString[8]; 617218893Sdim u_int8_t Tsid[12]; 618207618Srdivacky} __packed; 619207618Srdivacky 620207618Srdivacky#define MFG_PCBA_SERIAL_NUMBER_WIDTH 12 621207618Srdivacky#define MFG_WWN_WIDTH 8 622207618Srdivacky 623207618Srdivackystruct aac_supplement_adapter_info { 624218893Sdim /* The assigned Adapter Type Text, extra byte for null termination */ 625207618Srdivacky int8_t AdapterTypeText[17+1]; 626207618Srdivacky /* Pad for the text above */ 627207618Srdivacky int8_t Pad[2]; 628207618Srdivacky /* Size in bytes of the memory that is flashed */ 629207618Srdivacky u_int32_t FlashMemoryByteSize; 630207618Srdivacky /* The assigned IMAGEID_xxx for this adapter */ 631207618Srdivacky u_int32_t FlashImageId; 632218893Sdim /* 633207618Srdivacky * The maximum number of Phys available on a SATA/SAS 634207618Srdivacky * Controller, 0 otherwise 635207618Srdivacky */ 636207618Srdivacky u_int32_t MaxNumberPorts; 637207618Srdivacky /* Version of expansion area */ 638207618Srdivacky u_int32_t Version; 639207618Srdivacky u_int32_t FeatureBits; 640218893Sdim u_int8_t SlotNumber; 641207618Srdivacky u_int8_t ReservedPad0[3]; 642207618Srdivacky u_int8_t BuildDate[12]; 643207618Srdivacky /* The current number of Ports on a SAS controller, 0 otherwise */ 644207618Srdivacky u_int32_t CurrentNumberPorts; 645207618Srdivacky 646218893Sdim struct vpd_info VpdInfo; 647207618Srdivacky 648207618Srdivacky /* Firmware Revision (Vmaj.min-dash.) */ 649207618Srdivacky struct FsaRevision FlashFirmwareRevision; 650218893Sdim u_int32_t RaidTypeMorphOptions; 651207618Srdivacky /* Firmware's boot code Revision (Vmaj.min-dash.) */ 652207618Srdivacky struct FsaRevision FlashFirmwareBootRevision; 653207618Srdivacky /* PCBA serial no. from th MFG sector */ 654207618Srdivacky u_int8_t MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH]; 655207618Srdivacky /* WWN from the MFG sector */ 656207618Srdivacky u_int8_t MfgWWNName[MFG_WWN_WIDTH]; 657207618Srdivacky /* Growth Area for future expansion ((7*4) - 12 - 8)/4 = 2 words */ 658207618Srdivacky u_int32_t ReservedGrowth[2]; 659207618Srdivacky} __packed; 660218893Sdim 661207618Srdivacky/* 662207618Srdivacky * Monitor/Kernel interface. 663207618Srdivacky */ 664218893Sdim 665218893Sdim/* 666218893Sdim * Synchronous commands to the monitor/kernel. 667207618Srdivacky */ 668207618Srdivacky#define AAC_MONKER_BREAKPOINT 0x04 669207618Srdivacky#define AAC_MONKER_INITSTRUCT 0x05 670207618Srdivacky#define AAC_MONKER_SYNCFIB 0x0c 671218893Sdim#define AAC_MONKER_GETKERNVER 0x11 672218893Sdim#define AAC_MONKER_POSTRESULTS 0x14 673218893Sdim#define AAC_MONKER_GETINFO 0x19 674218893Sdim#define AAC_MONKER_GETDRVPROP 0x23 675218893Sdim#define AAC_MONKER_RCVTEMP 0x25 676218893Sdim#define AAC_MONKER_GETCOMMPREF 0x26 677218893Sdim#define AAC_MONKER_REINIT 0xee 678218893Sdim 679207618Srdivacky/* 680207618Srdivacky * Adapter Status Register 681207618Srdivacky * 682218893Sdim * Phase Staus mailbox is 32bits: 683207618Srdivacky * <31:16> = Phase Status 684207618Srdivacky * <15:0> = Phase 685207618Srdivacky * 686207618Srdivacky * The adapter reports its present state through the phase. Only 687207618Srdivacky * a single phase should be ever be set. Each phase can have multiple 688218893Sdim * phase status bits to provide more detailed information about the 689218893Sdim * state of the adapter. 690218893Sdim */ 691218893Sdim#define AAC_SELF_TEST_FAILED 0x00000004 692218893Sdim#define AAC_MONITOR_PANIC 0x00000020 693218893Sdim#define AAC_UP_AND_RUNNING 0x00000080 694218893Sdim#define AAC_KERNEL_PANIC 0x00000100 695218893Sdim 696207618Srdivacky/* 697207618Srdivacky * Data types relating to control and monitoring of the NVRAM/WriteCache 698207618Srdivacky * subsystem. 699207618Srdivacky */ 700207618Srdivacky 701207618Srdivacky#define AAC_NFILESYS 24 /* maximum number of filesystems */ 702207618Srdivacky 703207618Srdivacky/* 704207618Srdivacky * NVRAM/Write Cache subsystem states 705218893Sdim */ 706207618Srdivackytypedef enum { 707207618Srdivacky NVSTATUS_DISABLED = 0, /* present, clean, not being used */ 708207618Srdivacky NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */ 709207618Srdivacky NVSTATUS_ERROR, /* present, dirty, contains dirty data */ 710221345Sdim NVSTATUS_BATTERY, /* present, bad or low battery, may contain 711221345Sdim * dirty data */ 712221345Sdim NVSTATUS_UNKNOWN /* for bad/missing device */ 713221345Sdim} AAC_NVSTATUS; 714221345Sdim 715221345Sdim/* 716221345Sdim * NVRAM/Write Cache subsystem battery component states 717221345Sdim * 718221345Sdim */ 719221345Sdimtypedef enum { 720221345Sdim NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */ 721221345Sdim NVBATTSTATUS_LOW, /* battery is low on power */ 722221345Sdim NVBATTSTATUS_OK, /* battery is okay - normal operation possible 723221345Sdim * only in this state */ 724221345Sdim NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning 725221345Sdim * in process */ 726221345Sdim} AAC_NVBATTSTATUS; 727221345Sdim 728221345Sdim/* 729221345Sdim * Battery transition type 730221345Sdim */ 731221345Sdimtypedef enum { 732221345Sdim NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not 733221345Sdim * present */ 734221345Sdim NVBATT_TRANSITION_LOW, /* battery is now low on power */ 735221345Sdim NVBATT_TRANSITION_OK /* battery is now okay - normal 736221345Sdim * operation possible only in this 737221345Sdim * state */ 738221345Sdim} AAC_NVBATT_TRANSITION; 739221345Sdim 740221345Sdim/* 741221345Sdim * NVRAM Info structure returned for NVRAM_GetInfo call 742221345Sdim */ 743221345Sdimstruct aac_nvramdevinfo { 744221345Sdim u_int32_t NV_Enabled; /* write caching enabled */ 745221345Sdim u_int32_t NV_Error; /* device in error state */ 746221345Sdim u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */ 747221345Sdim u_int32_t NV_NActive; /* count of NVRAM buffers being 748221345Sdim * written */ 749221345Sdim} __packed; 750221345Sdim 751221345Sdimstruct aac_nvraminfo { 752221345Sdim AAC_NVSTATUS NV_Status; /* nvram subsystem status */ 753221345Sdim AAC_NVBATTSTATUS NV_BattStatus; /* battery status */ 754221345Sdim u_int32_t NV_Size; /* size of WriteCache NVRAM in 755221345Sdim * bytes */ 756221345Sdim u_int32_t NV_BufSize; /* size of NVRAM buffers in 757221345Sdim * bytes */ 758221345Sdim u_int32_t NV_NBufs; /* number of NVRAM buffers */ 759221345Sdim u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */ 760221345Sdim u_int32_t NV_NClean; /* Num clean NVRAM buffers */ 761221345Sdim u_int32_t NV_NActive; /* Num NVRAM buffers being 762221345Sdim * written */ 763221345Sdim u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */ 764221345Sdim struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device 765221345Sdim * info */ 766221345Sdim u_int32_t NV_BattNeedsReconditioning; /* boolean */ 767207618Srdivacky u_int32_t NV_TotalSize; /* size of all non-volatile 768207618Srdivacky * memories in bytes */ 769207618Srdivacky} __packed; 770207618Srdivacky 771207618Srdivacky/* 772207618Srdivacky * Data types relating to adapter-initiated FIBs 773207618Srdivacky * 774207618Srdivacky * Based on types and structures in <aifstruc.h> 775207618Srdivacky */ 776207618Srdivacky 777207618Srdivacky/* 778207618Srdivacky * Progress Reports 779207618Srdivacky */ 780207618Srdivackytypedef enum { 781221345Sdim AifJobStsSuccess = 1, 782221345Sdim AifJobStsFinished, 783207618Srdivacky AifJobStsAborted, 784207618Srdivacky AifJobStsFailed, 785207618Srdivacky AifJobStsLastReportMarker = 100, /* All prior mean last report */ 786207618Srdivacky AifJobStsSuspended, 787221345Sdim AifJobStsRunning 788223017Sdim} AAC_AifJobStatus; 789221345Sdim 790223017Sdimtypedef enum { 791221345Sdim AifJobScsiMin = 1, /* Minimum value for Scsi operation */ 792221345Sdim AifJobScsiZero, /* SCSI device clear operation */ 793221345Sdim AifJobScsiVerify, /* SCSI device Verify operation NO 794221345Sdim * REPAIR */ 795221345Sdim AifJobScsiExercise, /* SCSI device Exercise operation */ 796221345Sdim AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH 797221345Sdim * repair */ 798221345Sdim AifJobScsiWritePattern, /* write pattern */ 799221345Sdim AifJobScsiMax = 99, /* Max Scsi value */ 800221345Sdim AifJobCtrMin, /* Min Ctr op value */ 801207618Srdivacky AifJobCtrZero, /* Container clear operation */ 802223017Sdim AifJobCtrCopy, /* Container copy operation */ 803221345Sdim AifJobCtrCreateMirror, /* Container Create Mirror operation */ 804221345Sdim AifJobCtrMergeMirror, /* Container Merge Mirror operation */ 805221345Sdim AifJobCtrScrubMirror, /* Container Scrub Mirror operation */ 806221345Sdim AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */ 807221345Sdim AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */ 808223017Sdim AifJobCtrMorph, /* Container morph operation */ 809221345Sdim AifJobCtrPartCopy, /* Container Partition copy operation */ 810221345Sdim AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */ 811221345Sdim AifJobCtrCrazyCache, /* crazy cache */ 812221345Sdim AifJobCtrCopyback, /* Container Copyback operation */ 813221345Sdim AifJobCtrCompactRaid5D, /* Container Compaction operation */ 814221345Sdim AifJobCtrExpandRaid5D, /* Container Expansion operation */ 815221345Sdim AifJobCtrRebuildRaid6, /* Container Rebuild Raid6 operation */ 816221345Sdim AifJobCtrScrubRaid6, /* Container Scrub Raid6 operation */ 817221345Sdim AifJobCtrSSBackup, /* Container snapshot backup task */ 818221345Sdim AifJobCtrMax = 199, /* Max Ctr type operation */ 819221345Sdim AifJobFsMin, /* Min Fs type operation */ 820221345Sdim AifJobFsCreate, /* File System Create operation */ 821221345Sdim AifJobFsVerify, /* File System Verify operation */ 822221345Sdim AifJobFsExtend, /* File System Extend operation */ 823207618Srdivacky AifJobFsMax = 299, /* Max Fs type operation */ 824207618Srdivacky AifJobApiFormatNTFS, /* Format a drive to NTFS */ 825207618Srdivacky AifJobApiFormatFAT, /* Format a drive to FAT */ 826207618Srdivacky AifJobApiUpdateSnapshot, /* update the read/write half of a 827207618Srdivacky * snapshot */ 828207618Srdivacky AifJobApiFormatFAT32, /* Format a drive to FAT32 */ 829207618Srdivacky AifJobApiMax = 399, /* Max API type operation */ 830207618Srdivacky AifJobCtlContinuousCtrVerify, /* Adapter operation */ 831207618Srdivacky AifJobCtlMax = 499 /* Max Adapter type operation */ 832207618Srdivacky} AAC_AifJobType; 833207618Srdivacky 834207618Srdivackystruct aac_AifContainers { 835207618Srdivacky u_int32_t src; /* from/master */ 836207618Srdivacky u_int32_t dst; /* to/slave */ 837218893Sdim} __packed; 838207618Srdivacky 839207618Srdivackyunion aac_AifJobClient { 840207618Srdivacky struct aac_AifContainers container; /* For Container and 841207618Srdivacky * filesystem progress 842207618Srdivacky * ops; */ 843207618Srdivacky int32_t scsi_dh; /* For SCSI progress 844207618Srdivacky * ops */ 845207618Srdivacky}; 846207618Srdivacky 847207618Srdivackystruct aac_AifJobDesc { 848207618Srdivacky u_int32_t jobID; /* DO NOT FILL IN! Will be 849207618Srdivacky * filled in by AIF */ 850207618Srdivacky AAC_AifJobType type; /* Operation that is being 851218893Sdim * performed */ 852207618Srdivacky union aac_AifJobClient client; /* Details */ 853207618Srdivacky} __packed; 854207618Srdivacky 855207618Srdivackystruct aac_AifJobProgressReport { 856207618Srdivacky struct aac_AifJobDesc jd; 857207618Srdivacky AAC_AifJobStatus status; 858207618Srdivacky u_int32_t finalTick; 859207618Srdivacky u_int32_t currentTick; 860207618Srdivacky u_int32_t jobSpecificData1; 861207618Srdivacky u_int32_t jobSpecificData2; 862207618Srdivacky} __packed; 863207618Srdivacky 864207618Srdivacky/* 865207618Srdivacky * Event Notification 866207618Srdivacky */ 867207618Srdivackytypedef enum { 868207618Srdivacky /* General application notifies start here */ 869207618Srdivacky AifEnGeneric = 1, /* Generic notification */ 870207618Srdivacky AifEnTaskComplete, /* Task has completed */ 871207618Srdivacky AifEnConfigChange, /* Adapter config change occurred */ 872207618Srdivacky AifEnContainerChange, /* Adapter specific container 873207618Srdivacky * configuration change */ 874207618Srdivacky AifEnDeviceFailure, /* SCSI device failed */ 875207618Srdivacky AifEnMirrorFailover, /* Mirror failover started */ 876207618Srdivacky AifEnContainerEvent, /* Significant container event */ 877207618Srdivacky AifEnFileSystemChange, /* File system changed */ 878207618Srdivacky AifEnConfigPause, /* Container pause event */ 879207618Srdivacky AifEnConfigResume, /* Container resume event */ 880207618Srdivacky AifEnFailoverChange, /* Failover space assignment changed */ 881207618Srdivacky AifEnRAID5RebuildDone, /* RAID5 rebuild finished */ 882207618Srdivacky AifEnEnclosureManagement, /* Enclosure management event */ 883207618Srdivacky AifEnBatteryEvent, /* Significant NV battery event */ 884207618Srdivacky AifEnAddContainer, /* A new container was created. */ 885207618Srdivacky AifEnDeleteContainer, /* A container was deleted. */ 886207618Srdivacky AifEnSMARTEvent, /* SMART Event */ 887218893Sdim AifEnBatteryNeedsRecond, /* The battery needs reconditioning */ 888207618Srdivacky AifEnClusterEvent, /* Some cluster event */ 889207618Srdivacky AifEnDiskSetEvent, /* A disk set event occured. */ 890207618Srdivacky AifEnContainerScsiEvent, /* a container event with no. and scsi id */ 891207618Srdivacky AifEnPicBatteryEvent, /* An event gen. by pic_battery.c for an ABM */ 892207618Srdivacky AifEnExpEvent, /* Exp. Event Type to replace CTPopUp messages */ 893207618Srdivacky AifEnRAID6RebuildDone, /* RAID6 rebuild finished */ 894207618Srdivacky AifEnSensorOverHeat, /* Heat Sensor indicate overheat */ 895218893Sdim AifEnSensorCoolDown, /* Heat Sensor ind. cooled down after overheat */ 896207618Srdivacky AifFeatureKeysModified, /* notif. of updated feature keys */ 897207618Srdivacky AifApplicationExpirationEvent, /* notif. on app. expiration status */ 898207618Srdivacky AifEnBackgroundConsistencyCheck,/* BCC notif. for NEC - DDTS 94700 */ 899218893Sdim AifEnAddJBOD, /* A new JBOD type drive was created (30) */ 900207618Srdivacky AifEnDeleteJBOD, /* A JBOD type drive was deleted (31) */ 901207618Srdivacky AifDriverNotifyStart=199, /* Notifies for host driver go here */ 902207618Srdivacky /* Host driver notifications start here */ 903207618Srdivacky AifDenMorphComplete, /* A morph operation completed */ 904207618Srdivacky AifDenVolumeExtendComplete /* Volume expand operation completed */ 905207618Srdivacky} AAC_AifEventNotifyType; 906207618Srdivacky 907207618Srdivackystruct aac_AifEnsGeneric { 908207618Srdivacky char text[132]; /* Generic text */ 909207618Srdivacky} __packed; 910207618Srdivacky 911207618Srdivackystruct aac_AifEnsDeviceFailure { 912207618Srdivacky u_int32_t deviceHandle; /* SCSI device handle */ 913207618Srdivacky} __packed; 914207618Srdivacky 915207618Srdivackystruct aac_AifEnsMirrorFailover { 916207618Srdivacky u_int32_t container; /* Container with failed element */ 917207618Srdivacky u_int32_t failedSlice; /* Old slice which failed */ 918207618Srdivacky u_int32_t creatingSlice; /* New slice used for auto-create */ 919207618Srdivacky} __packed; 920207618Srdivacky 921207618Srdivackystruct aac_AifEnsContainerChange { 922207618Srdivacky u_int32_t container[2]; /* container that changed, -1 if no 923207618Srdivacky * container */ 924207618Srdivacky} __packed; 925207618Srdivacky 926207618Srdivackystruct aac_AifEnsContainerEvent { 927207618Srdivacky u_int32_t container; /* container number */ 928207618Srdivacky u_int32_t eventType; /* event type */ 929207618Srdivacky} __packed; 930207618Srdivacky 931207618Srdivackystruct aac_AifEnsEnclosureEvent { 932207618Srdivacky u_int32_t empID; /* enclosure management proc number */ 933207618Srdivacky u_int32_t unitID; /* unitId, fan id, power supply id, 934207618Srdivacky * slot id, tempsensor id. */ 935207618Srdivacky u_int32_t eventType; /* event type */ 936218893Sdim} __packed; 937207618Srdivacky 938207618Srdivackytypedef enum { 939221345Sdim AIF_EM_DRIVE_INSERTION=31, 940221345Sdim AIF_EM_DRIVE_REMOVAL 941221345Sdim} aac_AifEMEventType; 942221345Sdim 943221345Sdimstruct aac_AifEnsBatteryEvent { 944221345Sdim AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */ 945221345Sdim AAC_NVBATTSTATUS current_state; /* current batt state */ 946221345Sdim AAC_NVBATTSTATUS prior_state; /* prev batt state */ 947221345Sdim} __packed; 948221345Sdim 949221345Sdimstruct aac_AifEnsDiskSetEvent { 950207618Srdivacky u_int32_t eventType; 951221345Sdim u_int64_t DsNum; 952221345Sdim u_int64_t CreatorId; 953221345Sdim} __packed; 954207618Srdivacky 955221345Sdimtypedef enum { 956221345Sdim CLUSTER_NULL_EVENT = 0, 957221345Sdim CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or 958221345Sdim * adaptername from NULL to non-NULL */ 959221345Sdim /* (partner's agent may be up) */ 960221345Sdim CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or 961221345Sdim * adaptername from non-null to NULL */ 962221345Sdim /* (partner has rebooted) */ 963221345Sdim} AAC_ClusterAifEvent; 964221345Sdim 965221345Sdimstruct aac_AifEnsClusterEvent { 966221345Sdim AAC_ClusterAifEvent eventType; 967221345Sdim} __packed; 968221345Sdim 969221345Sdimstruct aac_AifEventNotify { 970221345Sdim AAC_AifEventNotifyType type; 971221345Sdim union { 972221345Sdim struct aac_AifEnsGeneric EG; 973221345Sdim struct aac_AifEnsDeviceFailure EDF; 974221345Sdim struct aac_AifEnsMirrorFailover EMF; 975207618Srdivacky struct aac_AifEnsContainerChange ECC; 976221345Sdim struct aac_AifEnsContainerEvent ECE; 977221345Sdim struct aac_AifEnsEnclosureEvent EEE; 978207618Srdivacky struct aac_AifEnsBatteryEvent EBE; 979221345Sdim struct aac_AifEnsDiskSetEvent EDS; 980207618Srdivacky/* struct aac_AifEnsSMARTEvent ES;*/ 981207618Srdivacky struct aac_AifEnsClusterEvent ECLE; 982207618Srdivacky } data; 983218893Sdim} __packed; 984207618Srdivacky 985207618Srdivacky/* 986207618Srdivacky * Adapter Initiated FIB command structures. Start with the adapter 987207618Srdivacky * initiated FIBs that really come from the adapter, and get responded 988207618Srdivacky * to by the host. 989218893Sdim */ 990207618Srdivacky#define AAC_AIF_REPORT_MAX_SIZE 64 991207618Srdivacky 992207618Srdivackytypedef enum { 993207618Srdivacky AifCmdEventNotify = 1, /* Notify of event */ 994207618Srdivacky AifCmdJobProgress, /* Progress report */ 995218893Sdim AifCmdAPIReport, /* Report from other user of API */ 996207618Srdivacky AifCmdDriverNotify, /* Notify host driver of event */ 997207618Srdivacky AifReqJobList = 100, /* Gets back complete job list */ 998207618Srdivacky AifReqJobsForCtr, /* Gets back jobs for specific container */ 999207618Srdivacky AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */ 1000207618Srdivacky AifReqJobReport, /* Gets back a specific job report or list */ 1001207618Srdivacky AifReqTerminateJob, /* Terminates job */ 1002207618Srdivacky AifReqSuspendJob, /* Suspends a job */ 1003207618Srdivacky AifReqResumeJob, /* Resumes a job */ 1004207618Srdivacky AifReqSendAPIReport, /* API generic report requests */ 1005207618Srdivacky AifReqAPIJobStart, /* Start a job from the API */ 1006207618Srdivacky AifReqAPIJobUpdate, /* Update a job report from the API */ 1007207618Srdivacky AifReqAPIJobFinish /* Finish a job from the API */ 1008207618Srdivacky} AAC_AifCommand; 1009207618Srdivacky 1010207618Srdivackystruct aac_aif_command { 1011207618Srdivacky AAC_AifCommand command; /* Tell host what type of 1012207618Srdivacky * notify this is */ 1013207618Srdivacky u_int32_t seqNumber; /* To allow ordering of 1014207618Srdivacky * reports (if necessary) */ 1015207618Srdivacky union { 1016207618Srdivacky struct aac_AifEventNotify EN; /* Event notify */ 1017207618Srdivacky struct aac_AifJobProgressReport PR[1]; /* Progress report */ 1018207618Srdivacky u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE]; 1019207618Srdivacky u_int8_t data[AAC_FIB_DATASIZE - 8]; 1020207618Srdivacky } data; 1021207618Srdivacky} __packed; 1022207618Srdivacky 1023207618Srdivacky/* 1024207618Srdivacky * Filesystem commands/data 1025207618Srdivacky * 1026207618Srdivacky * The adapter has a very complex filesystem interface, most of which we ignore. 1027207618Srdivacky * (And which seems not to be implemented, anyway.) 1028207618Srdivacky */ 1029207618Srdivacky 1030207618Srdivacky/* 1031207618Srdivacky * FSA commands 1032207618Srdivacky * (not used?) 1033207618Srdivacky */ 1034207618Srdivackytypedef enum { 1035207618Srdivacky Null = 0, 1036207618Srdivacky GetAttributes, 1037207618Srdivacky SetAttributes, 1038207618Srdivacky Lookup, 1039207618Srdivacky ReadLink, 1040207618Srdivacky Read, 1041207618Srdivacky Write, 1042207618Srdivacky Create, 1043207618Srdivacky MakeDirectory, 1044207618Srdivacky SymbolicLink, 1045207618Srdivacky MakeNode, 1046207618Srdivacky Removex, 1047207618Srdivacky RemoveDirectory, 1048207618Srdivacky Rename, 1049207618Srdivacky Link, 1050207618Srdivacky ReadDirectory, 1051207618Srdivacky ReadDirectoryPlus, 1052207618Srdivacky FileSystemStatus, 1053207618Srdivacky FileSystemInfo, 1054207618Srdivacky PathConfigure, 1055207618Srdivacky Commit, 1056207618Srdivacky Mount, 1057207618Srdivacky UnMount, 1058207618Srdivacky Newfs, 1059207618Srdivacky FsCheck, 1060207618Srdivacky FsSync, 1061207618Srdivacky SimReadWrite, 1062207618Srdivacky SetFileSystemStatus, 1063207618Srdivacky BlockRead, 1064207618Srdivacky BlockWrite, 1065207618Srdivacky NvramIoctl, 1066207618Srdivacky FsSyncWait, 1067207618Srdivacky ClearArchiveBit, 1068207618Srdivacky SetAcl, 1069207618Srdivacky GetAcl, 1070207618Srdivacky AssignAcl, 1071207618Srdivacky FaultInsertion, 1072207618Srdivacky CrazyCache 1073193323Sed} AAC_FSACommand; 1074198090Srdivacky 1075198090Srdivacky/* 1076193323Sed * Command status values 1077198090Srdivacky */ 1078198090Srdivackytypedef enum { 1079198090Srdivacky ST_OK = 0, 1080198090Srdivacky ST_PERM = 1, 1081198090Srdivacky ST_NOENT = 2, 1082198090Srdivacky ST_IO = 5, 1083198090Srdivacky ST_NXIO = 6, 1084193323Sed ST_E2BIG = 7, 1085193323Sed ST_ACCES = 13, 1086193323Sed ST_EXIST = 17, 1087193323Sed ST_XDEV = 18, 1088193323Sed ST_NODEV = 19, 1089193323Sed ST_NOTDIR = 20, 1090193323Sed ST_ISDIR = 21, 1091193323Sed ST_INVAL = 22, 1092193323Sed ST_FBIG = 27, 1093193323Sed ST_NOSPC = 28, 1094193323Sed ST_ROFS = 30, 1095218893Sdim ST_MLINK = 31, 1096218893Sdim ST_WOULDBLOCK = 35, 1097218893Sdim ST_NAMETOOLONG = 63, 1098224145Sdim ST_NOTEMPTY = 66, 1099224145Sdim ST_DQUOT = 69, 1100224145Sdim ST_STALE = 70, 1101218893Sdim ST_REMOTE = 71, 1102223017Sdim ST_NOT_READY = 72, 1103224145Sdim ST_BADHANDLE = 10001, 1104224145Sdim ST_NOT_SYNC = 10002, 1105218893Sdim ST_BAD_COOKIE = 10003, 1106218893Sdim ST_NOTSUPP = 10004, 1107218893Sdim ST_TOOSMALL = 10005, 1108218893Sdim ST_SERVERFAULT = 10006, 1109224145Sdim ST_BADTYPE = 10007, 1110224145Sdim ST_JUKEBOX = 10008, 1111224145Sdim ST_NOTMOUNTED = 10009, 1112224145Sdim ST_MAINTMODE = 10010, 1113224145Sdim ST_STALEACL = 10011, 1114224145Sdim ST_BUS_RESET = 20001 1115224145Sdim} AAC_FSAStatus; 1116224145Sdim 1117218893Sdim/* 1118218893Sdim * Volume manager commands 1119224145Sdim */ 1120224145Sdimtypedef enum _VM_COMMANDS { 1121224145Sdim VM_Null = 0, 1122224145Sdim VM_NameServe, 1123224145Sdim VM_ContainerConfig, 1124224145Sdim VM_Ioctl, 1125224145Sdim VM_FilesystemIoctl, 1126224145Sdim VM_CloseAll, 1127224145Sdim VM_CtBlockRead, 1128224145Sdim VM_CtBlockWrite, 1129218893Sdim VM_SliceBlockRead, /* raw access to configured storage objects */ 1130218893Sdim VM_SliceBlockWrite, 1131218893Sdim VM_DriveBlockRead, /* raw access to physical devices */ 1132218893Sdim VM_DriveBlockWrite, 1133218893Sdim VM_EnclosureMgt, /* enclosure management */ 1134218893Sdim VM_Unused, /* used to be diskset management */ 1135218893Sdim VM_CtBlockVerify, 1136218893Sdim VM_CtPerf, /* performance test */ 1137224145Sdim VM_CtBlockRead64, 1138224145Sdim VM_CtBlockWrite64, 1139224145Sdim VM_CtBlockVerify64, 1140224145Sdim VM_CtHostRead64, 1141224145Sdim VM_CtHostWrite64, 1142224145Sdim VM_DrvErrTblLog, /* drive error table/log type of command */ 1143224145Sdim VM_NameServe64 1144224145Sdim} AAC_VMCommand; 1145224145Sdim 1146224145Sdim/* 1147224145Sdim * "mountable object" 1148224145Sdim */ 1149224145Sdimstruct aac_mntobj { 1150224145Sdim u_int32_t ObjectId; 1151224145Sdim char FileSystemName[16]; 1152224145Sdim struct aac_container_creation CreateInfo; 1153224145Sdim u_int32_t Capacity; 1154224145Sdim u_int32_t VolType; 1155224145Sdim u_int32_t ObjType; 1156224145Sdim u_int32_t ContentState; 1157224145Sdim#define FSCS_READONLY 0x0002 /* XXX need more information 1158224145Sdim * than this */ 1159224145Sdim union { 1160224145Sdim u_int32_t pad[8]; 1161224145Sdim } ObjExtension; 1162224145Sdim u_int32_t AlterEgoId; 1163224145Sdim u_int32_t CapacityHigh; 1164224145Sdim} __packed; 1165224145Sdim 1166224145Sdimstruct aac_mntinfo { 1167224145Sdim u_int32_t Command; 1168224145Sdim u_int32_t MntType; 1169224145Sdim u_int32_t MntCount; 1170224145Sdim} __packed; 1171224145Sdim 1172224145Sdimstruct aac_mntinforesp { 1173224145Sdim u_int32_t Status; 1174224145Sdim u_int32_t MntType; 1175224145Sdim u_int32_t MntRespCount; 1176218893Sdim struct aac_mntobj MntTable[1]; 1177218893Sdim} __packed; 1178193323Sed 1179218893Sdim/* 1180218893Sdim * Container shutdown command. 1181218893Sdim */ 1182218893Sdimstruct aac_closecommand { 1183218893Sdim u_int32_t Command; 1184218893Sdim u_int32_t ContainerId; 1185218893Sdim} __packed; 1186218893Sdim 1187218893Sdim/* 1188218893Sdim * Container Config Command 1189218893Sdim */ 1190218893Sdim#define CT_GET_SCSI_METHOD 64 1191218893Sdimstruct aac_ctcfg { 1192218893Sdim u_int32_t Command; 1193218893Sdim u_int32_t cmd; 1194218893Sdim u_int32_t param; 1195218893Sdim} __packed; 1196218893Sdim 1197218893Sdimstruct aac_ctcfg_resp { 1198218893Sdim u_int32_t Status; 1199218893Sdim u_int32_t resp; 1200218893Sdim u_int32_t param; 1201218893Sdim} __packed; 1202218893Sdim 1203218893Sdim/* 1204218893Sdim * 'Ioctl' commads 1205218893Sdim */ 1206218893Sdim#define AAC_SCSI_MAX_PORTS 10 1207218893Sdim#define AAC_BUS_NO_EXIST 0 1208218893Sdim#define AAC_BUS_VALID 1 1209218893Sdim#define AAC_BUS_FAULTED 2 1210218893Sdim#define AAC_BUS_DISABLED 3 1211218893Sdim#define GetBusInfo 0x9 1212218893Sdim 1213218893Sdimstruct aac_getbusinf { 1214218893Sdim u_int32_t ProbeComplete; 1215218893Sdim u_int32_t BusCount; 1216218893Sdim u_int32_t TargetsPerBus; 1217218893Sdim u_int8_t InitiatorBusId[AAC_SCSI_MAX_PORTS]; 1218218893Sdim u_int8_t BusValid[AAC_SCSI_MAX_PORTS]; 1219218893Sdim} __packed; 1220218893Sdim 1221218893Sdimstruct aac_vmioctl { 1222218893Sdim u_int32_t Command; 1223218893Sdim u_int32_t ObjType; 1224218893Sdim u_int32_t MethId; 1225218893Sdim u_int32_t ObjId; 1226218893Sdim u_int32_t IoctlCmd; 1227218893Sdim u_int32_t IoctlBuf[1]; /* Placeholder? */ 1228218893Sdim} __packed; 1229218893Sdim 1230218893Sdimstruct aac_vmi_businf_resp { 1231218893Sdim u_int32_t Status; 1232218893Sdim u_int32_t ObjType; 1233218893Sdim u_int32_t MethId; 1234218893Sdim u_int32_t ObjId; 1235218893Sdim u_int32_t IoctlCmd; 1236218893Sdim struct aac_getbusinf BusInf; 1237218893Sdim} __packed; 1238218893Sdim 1239218893Sdim#if 0 1240218893Sdim#define AAC_BTL_TO_HANDLE(b, t, l) \ 1241218893Sdim (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf)) 1242218893Sdim#else 1243218893Sdim#define AAC_BTL_TO_HANDLE(b, t, l) \ 1244218893Sdim ((((u_int32_t)b & 0x0f) << 24) | \ 1245218893Sdim (((u_int32_t)l & 0xff) << 16) | \ 1246218893Sdim ((u_int32_t)t & 0xffff)) 1247218893Sdim#endif 1248218893Sdim#define GetDeviceProbeInfo 0x5 1249218893Sdim 1250218893Sdimstruct aac_vmi_devinfo_resp { 1251218893Sdim u_int32_t Status; 1252218893Sdim u_int32_t ObjType; 1253218893Sdim u_int32_t MethId; 1254218893Sdim u_int32_t ObjId; 1255218893Sdim u_int32_t IoctlCmd; 1256218893Sdim u_int8_t VendorId[8]; 1257218893Sdim u_int8_t ProductId[16]; 1258218893Sdim u_int8_t ProductRev[4]; 1259218893Sdim u_int32_t Inquiry7; 1260218893Sdim u_int32_t align1; 1261218893Sdim u_int32_t Inquiry0; 1262218893Sdim u_int32_t align2; 1263218893Sdim u_int32_t Inquiry1; 1264218893Sdim u_int32_t align3; 1265218893Sdim u_int32_t reserved[2]; 1266218893Sdim u_int8_t VendorSpecific[20]; 1267218893Sdim u_int32_t Smart:1; 1268218893Sdim u_int32_t AAC_Managed:1; 1269218893Sdim u_int32_t align4; 1270218893Sdim u_int32_t reserved2:6; 1271218893Sdim u_int32_t Bus; 1272218893Sdim u_int32_t Target; 1273218893Sdim u_int32_t Lun; 1274218893Sdim u_int32_t ultraEnable:1, 1275218893Sdim disconnectEnable:1, 1276218893Sdim fast20EnabledW:1, 1277218893Sdim scamDevice:1, 1278218893Sdim scamTolerant:1, 1279218893Sdim setForSync:1, 1280218893Sdim setForWide:1, 1281218893Sdim syncDevice:1, 1282218893Sdim wideDevice:1, 1283218893Sdim reserved1:7, 1284218893Sdim ScsiRate:8, 1285218893Sdim ScsiOffset:8; 1286218893Sdim}; /* Do not pack */ 1287218893Sdim 1288218893Sdim#define ResetBus 0x16 1289218893Sdimstruct aac_resetbus { 1290218893Sdim u_int32_t BusNumber; 1291218893Sdim}; 1292218893Sdim 1293218893Sdim/* 1294218893Sdim * Write 'stability' options. 1295218893Sdim */ 1296218893Sdimtypedef enum { 1297218893Sdim CSTABLE = 1, 1298218893Sdim CUNSTABLE 1299218893Sdim} AAC_CacheLevel; 1300218893Sdim 1301218893Sdim/* 1302218893Sdim * Commit level response for a write request. 1303218893Sdim */ 1304218893Sdimtypedef enum { 1305218893Sdim CMFILE_SYNC_NVRAM = 1, 1306218893Sdim CMDATA_SYNC_NVRAM, 1307218893Sdim CMFILE_SYNC, 1308218893Sdim CMDATA_SYNC, 1309218893Sdim CMUNSTABLE 1310218893Sdim} AAC_CommitLevel; 1311218893Sdim 1312218893Sdim/* 1313218893Sdim * Block read/write operations. 1314218893Sdim * These structures are packed into the 'data' area in the FIB. 1315218893Sdim */ 1316218893Sdim 1317218893Sdimstruct aac_blockread { 1318218893Sdim u_int32_t Command; /* not FSACommand! */ 1319218893Sdim u_int32_t ContainerId; 1320218893Sdim u_int32_t BlockNumber; 1321218893Sdim u_int32_t ByteCount; 1322218893Sdim struct aac_sg_table SgMap; /* variable size */ 1323218893Sdim} __packed; 1324218893Sdim 1325218893Sdimstruct aac_blockread64 { 1326218893Sdim u_int32_t Command; 1327218893Sdim u_int16_t ContainerId; 1328218893Sdim u_int16_t SectorCount; 1329218893Sdim u_int32_t BlockNumber; 1330218893Sdim u_int16_t Pad; 1331218893Sdim u_int16_t Flags; 1332218893Sdim struct aac_sg_table64 SgMap64; 1333218893Sdim} __packed; 1334218893Sdim 1335218893Sdimstruct aac_blockread_response { 1336218893Sdim u_int32_t Status; 1337218893Sdim u_int32_t ByteCount; 1338218893Sdim} __packed; 1339218893Sdim 1340218893Sdimstruct aac_blockwrite { 1341218893Sdim u_int32_t Command; /* not FSACommand! */ 1342218893Sdim u_int32_t ContainerId; 1343218893Sdim u_int32_t BlockNumber; 1344218893Sdim u_int32_t ByteCount; 1345218893Sdim u_int32_t Stable; 1346218893Sdim struct aac_sg_table SgMap; /* variable size */ 1347218893Sdim} __packed; 1348218893Sdim 1349218893Sdimstruct aac_blockwrite64 { 1350218893Sdim u_int32_t Command; /* not FSACommand! */ 1351218893Sdim u_int16_t ContainerId; 1352218893Sdim u_int16_t SectorCount; 1353218893Sdim u_int32_t BlockNumber; 1354218893Sdim u_int16_t Pad; 1355218893Sdim u_int16_t Flags; 1356218893Sdim struct aac_sg_table64 SgMap64; /* variable size */ 1357218893Sdim} __packed; 1358218893Sdim 1359218893Sdimstruct aac_blockwrite_response { 1360218893Sdim u_int32_t Status; 1361218893Sdim u_int32_t ByteCount; 1362218893Sdim u_int32_t Committed; 1363218893Sdim} __packed; 1364218893Sdim 1365218893Sdimstruct aac_raw_io { 1366218893Sdim u_int64_t BlockNumber; 1367224145Sdim u_int32_t ByteCount; 1368218893Sdim u_int16_t ContainerId; 1369218893Sdim u_int16_t Flags; /* 0: W, 1: R */ 1370218893Sdim u_int16_t BpTotal; /* reserved for FW use */ 1371218893Sdim u_int16_t BpComplete; /* reserved for FW use */ 1372218893Sdim struct aac_sg_tableraw SgMapRaw; /* variable size */ 1373218893Sdim} __packed; 1374218893Sdim 1375218893Sdim/* 1376218893Sdim * Container shutdown command. 1377218893Sdim */ 1378218893Sdimstruct aac_close_command { 1379218893Sdim u_int32_t Command; 1380218893Sdim u_int32_t ContainerId; 1381218893Sdim}; 1382218893Sdim 1383218893Sdim/* 1384218893Sdim * SCSI Passthrough structures 1385218893Sdim */ 1386218893Sdimstruct aac_srb { 1387218893Sdim u_int32_t function; 1388218893Sdim u_int32_t bus; 1389218893Sdim u_int32_t target; 1390218893Sdim u_int32_t lun; 1391218893Sdim u_int32_t timeout; 1392218893Sdim u_int32_t flags; 1393218893Sdim u_int32_t data_len; 1394218893Sdim u_int32_t retry_limit; 1395218893Sdim u_int32_t cdb_len; 1396218893Sdim u_int8_t cdb[16]; 1397221345Sdim struct aac_sg_table sg_map; 1398221345Sdim}; 1399218893Sdim 1400218893Sdimenum { 1401218893Sdim AAC_SRB_FUNC_EXECUTE_SCSI = 0x00, 1402218893Sdim AAC_SRB_FUNC_CLAIM_DEVICE, 1403218893Sdim AAC_SRB_FUNC_IO_CONTROL, 1404218893Sdim AAC_SRB_FUNC_RECEIVE_EVENT, 1405218893Sdim AAC_SRB_FUNC_RELEASE_QUEUE, 1406218893Sdim AAC_SRB_FUNC_ATTACH_DEVICE, 1407218893Sdim AAC_SRB_FUNC_RELEASE_DEVICE, 1408218893Sdim AAC_SRB_FUNC_SHUTDOWN, 1409218893Sdim AAC_SRB_FUNC_FLUSH, 1410218893Sdim AAC_SRB_FUNC_ABORT_COMMAND = 0x10, 1411218893Sdim AAC_SRB_FUNC_RELEASE_RECOVERY, 1412218893Sdim AAC_SRB_FUNC_RESET_BUS, 1413218893Sdim AAC_SRB_FUNC_RESET_DEVICE, 1414218893Sdim AAC_SRB_FUNC_TERMINATE_IO, 1415218893Sdim AAC_SRB_FUNC_FLUSH_QUEUE, 1416218893Sdim AAC_SRB_FUNC_REMOVE_DEVICE, 1417218893Sdim AAC_SRB_FUNC_DOMAIN_VALIDATION 1418218893Sdim}; 1419218893Sdim 1420218893Sdim#define AAC_SRB_FLAGS_NO_DATA_XFER 0x0000 1421218893Sdim#define AAC_SRB_FLAGS_DISABLE_DISCONNECT 0x0004 1422218893Sdim#define AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER 0x0008 1423218893Sdim#define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x0010 1424218893Sdim#define AAC_SRB_FLAGS_DISABLE_AUTOSENSE 0x0020 1425218893Sdim#define AAC_SRB_FLAGS_DATA_IN 0x0040 1426218893Sdim#define AAC_SRB_FLAGS_DATA_OUT 0x0080 1427218893Sdim#define AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \ 1428218893Sdim (AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT) 1429218893Sdim 1430218893Sdim#define AAC_HOST_SENSE_DATA_MAX 30 1431218893Sdim 1432218893Sdimstruct aac_srb_response { 1433218893Sdim u_int32_t fib_status; 1434218893Sdim u_int32_t srb_status; 1435218893Sdim u_int32_t scsi_status; 1436218893Sdim u_int32_t data_len; 1437218893Sdim u_int32_t sense_len; 1438193323Sed u_int8_t sense[AAC_HOST_SENSE_DATA_MAX]; 1439193323Sed}; 1440218893Sdim 1441218893Sdim/* 1442218893Sdim * Status codes for SCSI passthrough commands. Since they are based on ASPI, 1443193323Sed * they also exactly match CAM status codes in both enumeration and meaning. 1444193323Sed * They seem to also be used as status codes for synchronous FIBs. 1445224145Sdim */ 1446193323Sedenum { 1447218893Sdim AAC_SRB_STS_PENDING = 0x00, 1448193323Sed AAC_SRB_STS_SUCCESS, 1449193323Sed AAC_SRB_STS_ABORTED, 1450193323Sed AAC_SRB_STS_ABORT_FAILED, 1451193323Sed AAC_SRB_STS_ERROR, 1452193323Sed AAC_SRB_STS_BUSY, 1453193323Sed AAC_SRB_STS_INVALID_REQUEST, 1454193323Sed AAC_SRB_STS_INVALID_PATH_ID, 1455218893Sdim AAC_SRB_STS_NO_DEVICE, 1456193323Sed AAC_SRB_STS_TIMEOUT, 1457193323Sed AAC_SRB_STS_SELECTION_TIMEOUT, 1458193323Sed AAC_SRB_STS_COMMAND_TIMEOUT, 1459193323Sed AAC_SRB_STS_MESSAGE_REJECTED = 0x0D, 1460218893Sdim AAC_SRB_STS_BUS_RESET, 1461218893Sdim AAC_SRB_STS_PARITY_ERROR, 1462218893Sdim AAC_SRB_STS_REQUEST_SENSE_FAILED, 1463218893Sdim AAC_SRB_STS_NO_HBA, 1464218893Sdim AAC_SRB_STS_DATA_OVERRUN, 1465218893Sdim AAC_SRB_STS_UNEXPECTED_BUS_FREE, 1466218893Sdim AAC_SRB_STS_PHASE_SEQUENCE_FAILURE, 1467218893Sdim AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH, 1468218893Sdim AAC_SRB_STS_REQUEST_FLUSHED, 1469218893Sdim AAC_SRB_STS_INVALID_LUN = 0x20, 1470218893Sdim AAC_SRB_STS_INVALID_TARGET_ID, 1471224145Sdim AAC_SRB_STS_BAD_FUNCTION, 1472218893Sdim AAC_SRB_STS_ERROR_RECOVERY 1473218893Sdim}; 1474218893Sdim 1475193323Sed/* 1476193323Sed * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based 1477193323Sed * on the SA110 'StrongArm'. 1478193323Sed */ 1479193323Sed 1480193323Sed#define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */ 1481193323Sed#define AAC_SA_DOORBELL0_SET 0x9c 1482207618Srdivacky#define AAC_SA_DOORBELL0 0x9c 1483203954Srdivacky#define AAC_SA_MASK0_CLEAR 0xa0 1484203954Srdivacky#define AAC_SA_MASK0_SET 0xa4 1485203954Srdivacky 1486203954Srdivacky#define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */ 1487203954Srdivacky#define AAC_SA_DOORBELL1_SET 0x9e 1488193323Sed#define AAC_SA_DOORBELL1 0x9e 1489203954Srdivacky#define AAC_SA_MASK1_CLEAR 0xa2 1490203954Srdivacky#define AAC_SA_MASK1_SET 0xa6 1491203954Srdivacky 1492203954Srdivacky#define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */ 1493203954Srdivacky#define AAC_SA_FWSTATUS 0xc4 1494203954Srdivacky 1495193323Sed/* 1496193323Sed * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx, 1497207618Srdivacky * and other related adapters. 1498193323Sed */ 1499224145Sdim 1500224145Sdim#define AAC_RX_OMR0 0x18 /* outbound message register 0 */ 1501193323Sed#define AAC_RX_OMR1 0x1c /* outbound message register 1 */ 1502193323Sed#define AAC_RX_IDBR 0x20 /* inbound doorbell register */ 1503198892Srdivacky#define AAC_RX_IISR 0x24 /* inbound interrupt status register */ 1504193323Sed#define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */ 1505207618Srdivacky#define AAC_RX_ODBR 0x2c /* outbound doorbell register */ 1506193323Sed#define AAC_RX_OISR 0x30 /* outbound interrupt status register */ 1507193323Sed#define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */ 1508198892Srdivacky#define AAC_RX_IQUE 0x40 /* inbound queue */ 1509193323Sed#define AAC_RX_OQUE 0x44 /* outbound queue */ 1510193323Sed 1511193323Sed#define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */ 1512193323Sed#define AAC_RX_FWSTATUS 0x6c 1513193323Sed 1514198892Srdivacky/* 1515193323Sed * Register definitions for the Adaptec 'Rocket' RAID-On-Chip adapters. 1516218893Sdim * Unsurprisingly, it's quite similar to the i960! 1517193323Sed */ 1518193323Sed 1519193323Sed#define AAC_RKT_OMR0 0x18 /* outbound message register 0 */ 1520193323Sed#define AAC_RKT_OMR1 0x1c /* outbound message register 1 */ 1521207618Srdivacky#define AAC_RKT_IDBR 0x20 /* inbound doorbell register */ 1522193323Sed#define AAC_RKT_IISR 0x24 /* inbound interrupt status register */ 1523193323Sed#define AAC_RKT_IIMR 0x28 /* inbound interrupt mask register */ 1524193323Sed#define AAC_RKT_ODBR 0x2c /* outbound doorbell register */ 1525193323Sed#define AAC_RKT_OISR 0x30 /* outbound interrupt status register */ 1526193323Sed#define AAC_RKT_OIMR 0x34 /* outbound interrupt mask register */ 1527193323Sed#define AAC_RKT_IQUE 0x40 /* inbound queue */ 1528218893Sdim#define AAC_RKT_OQUE 0x44 /* outbound queue */ 1529193323Sed 1530193323Sed#define AAC_RKT_MAILBOX 0x1000 /* mailbox */ 1531193323Sed#define AAC_RKT_FWSTATUS 0x101c /* Firmware Status (mailbox 7) */ 1532193323Sed 1533193323Sed/* 1534224145Sdim * Common bit definitions for the doorbell registers. 1535224145Sdim */ 1536202375Srdivacky 1537224145Sdim/* 1538224145Sdim * Status bits in the doorbell registers. 1539224145Sdim */ 1540224145Sdim#define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */ 1541198090Srdivacky#define AAC_DB_COMMAND_READY (1<<1) /* posted one or more commands */ 1542224145Sdim#define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands complete */ 1543193323Sed#define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */ 1544193323Sed#define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */ 1545193323Sed 1546193323Sed/* 1547193323Sed * The adapter can request the host print a message by setting the 1548218893Sdim * DB_PRINTF flag in DOORBELL0. The driver responds by collecting the 1549193323Sed * message from the printf buffer, clearing the DB_PRINTF flag in 1550193323Sed * DOORBELL0 and setting it in DOORBELL1. 1551193323Sed * (ODBR and IDBR respectively for the i960Rx adapters) 1552193323Sed */ 1553193323Sed#define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */ 1554193323Sed#define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */ 1555198090Srdivacky 1556198090Srdivacky/* 1557218893Sdim * Mask containing the interrupt bits we care about. We don't anticipate (or 1558207618Srdivacky * want) interrupts not in this mask. 1559207618Srdivacky */ 1560218893Sdim#define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \ 1561203954Srdivacky AAC_DB_RESPONSE_READY | \ 1562203954Srdivacky AAC_DB_PRINTF) 1563203954Srdivacky#define AAC_DB_INT_NEW_COMM 0x08 1564203954Srdivacky 1565203954Srdivacky