1 /*- 2 * Copyright (c) 2000 Michael Smith 3 * Copyright (c) 2000-2001 Scott Long 4 * Copyright (c) 2000 BSDi 5 * Copyright (c) 2001 Adaptec, Inc. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $FreeBSD$ 30 */ 31 32 /* 33 * Data structures defining the interface between the driver and the Adaptec 34 * 'FSA' adapters. Note that many field names and comments here are taken 35 * verbatim from the Adaptec driver source in order to make comparing the 36 * two slightly easier. 37 */ 38 39 /* 40 * Misc. magic numbers. 41 */ 42 #define AAC_MAX_CONTAINERS 64 43 #define AAC_BLOCK_SIZE 512 44 45 /* 46 * Communications interface. 47 * 48 * Where datastructure layouts are closely parallel to the Adaptec sample code, 49 * retain their naming conventions (for now) to aid in cross-referencing. 50 */ 51 52 /* 53 * We establish 4 command queues and matching response queues. Queues must 54 * be 16-byte aligned, and are sized as follows: 55 */ 56 #define AAC_HOST_NORM_CMD_ENTRIES 8 /* command adapter->host, 57 * normal priority */ 58 #define AAC_HOST_HIGH_CMD_ENTRIES 4 /* command adapter->host, 59 * high priority */ 60 #define AAC_ADAP_NORM_CMD_ENTRIES 512 /* command host->adapter, 61 * normal priority */ 62 #define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* command host->adapter, 63 * high priority */ 64 #define AAC_HOST_NORM_RESP_ENTRIES 512 /* response, adapter->host, 65 * normal priority */ 66 #define AAC_HOST_HIGH_RESP_ENTRIES 4 /* response, adapter->host, 67 * high priority */ 68 #define AAC_ADAP_NORM_RESP_ENTRIES 8 /* response, host->adapter, 69 * normal priority */ 70 #define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* response, host->adapter, 71 * high priority */ 72 73 #define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \ 74 AAC_HOST_NORM_CMD_ENTRIES + \ 75 AAC_ADAP_HIGH_CMD_ENTRIES + \ 76 AAC_ADAP_NORM_CMD_ENTRIES + \ 77 AAC_HOST_HIGH_RESP_ENTRIES + \ 78 AAC_HOST_NORM_RESP_ENTRIES + \ 79 AAC_ADAP_HIGH_RESP_ENTRIES + \ 80 AAC_ADAP_NORM_RESP_ENTRIES) 81 #define AAC_QUEUE_COUNT 8 82 #define AAC_QUEUE_ALIGN 16 83 84 struct aac_queue_entry { 85 u_int32_t aq_fib_size; /* FIB size in bytes */ 86 u_int32_t aq_fib_addr; /* receiver-space address of the FIB */ 87 } __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 */ 96 struct aac_queue_table { 97 /* queue consumer/producer indexes (layout mandated by adapter) */ 98 u_int32_t qt_qindex[AAC_QUEUE_COUNT][2]; 99 100 /* queue entry structures (layout mandated by adapter) */ 101 struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES]; 102 struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES]; 103 struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES]; 104 struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES]; 105 struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES]; 106 struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES]; 107 struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES]; 108 struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES]; 109 } __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 */ 130 struct 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 */ 139 struct aac_fib_header { 140 u_int32_t XferState; 141 u_int16_t Command; 142 u_int8_t StructType; 143 u_int8_t Flags; 144 u_int16_t Size; 145 u_int16_t SenderSize; 146 u_int32_t SenderFibAddress; 147 u_int32_t ReceiverFibAddress; 148 u_int32_t SenderData; 149 union { 150 struct { 151 u_int32_t ReceiverTimeStart; 152 u_int32_t ReceiverTimeDone; 153 } _s; 154 struct aac_fib_list_entry FibLinks; 155 } _u; 156 } __attribute__ ((packed)); 157 158 #define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header)) 159 160 struct aac_fib { 161 struct aac_fib_header Header; 162 u_int8_t data[AAC_FIB_DATASIZE]; 163 } __attribute__ ((packed)); 164 165 /* 166 * FIB commands 167 */ 168 typedef enum { 169 TestCommandResponse = 1, 170 TestAdapterCommand = 2, 171 172 /* lowlevel and comm commands */ 173 LastTestCommand = 100, 174 ReinitHostNormCommandQueue = 101, 175 ReinitHostHighCommandQueue = 102, 176 ReinitHostHighRespQueue = 103, 177 ReinitHostNormRespQueue = 104, 178 ReinitAdapNormCommandQueue = 105, 179 ReinitAdapHighCommandQueue = 107, 180 ReinitAdapHighRespQueue = 108, 181 ReinitAdapNormRespQueue = 109, 182 InterfaceShutdown = 110, 183 DmaCommandFib = 120, 184 StartProfile = 121, 185 TermProfile = 122, 186 SpeedTest = 123, 187 TakeABreakPt = 124, 188 RequestPerfData = 125, 189 SetInterruptDefTimer= 126, 190 SetInterruptDefCount= 127, 191 GetInterruptDefStatus= 128, 192 LastCommCommand = 129, 193 194 /* filesystem commands */ 195 NuFileSystem = 300, 196 UFS = 301, 197 HostFileSystem = 302, 198 LastFileSystemCommand = 303, 199 200 /* Container Commands */ 201 ContainerCommand = 500, 202 ContainerCommand64 = 501, 203 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 */ 270 struct 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 */ 293 typedef 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 */ 313 typedef 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 b/t/l */ 323 FT_SLICE, /* virtual disk - raw volume - slice */ 324 FT_PARTITION, /* FSA partition - carved out of a slice - building 325 * block 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 */ 336 struct aac_sg_entry { 337 u_int32_t SgAddress; 338 u_int32_t SgByteCount; 339 } __attribute__ ((packed)); 340 341 struct 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 */ 349 struct 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 */ 359 struct 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 376 typedef enum { 377 RevApplication = 1, 378 RevDkiCli, 379 RevNetService, 380 RevApi, 381 RevFileSysDriver, 382 RevMiniportDriver, 383 RevAdapterSW, 384 RevMonitor, 385 RevRemoteApi 386 } RevComponent; 387 388 struct 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 405 typedef 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 417 typedef 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 429 typedef 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 453 typedef 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 */ 468 typedef 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 */ 492 struct 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 498 * size */ 499 u_int32_t BufferMem; /* adapter Data Memory */ 500 u_int32_t TotalMem; /* adapter Total Memory */ 501 struct FsaRevision KernelRevision; /* adapter Kernel Software 502 * Revision */ 503 struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic 504 * Software Revision */ 505 struct FsaRevision HardwareRevision;/* TBD */ 506 struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ 507 u_int32_t ClusteringEnabled; 508 u_int32_t ClusterChannelMask; 509 u_int64_t SerialNumber; 510 AAC_BatteryPlatform batteryPlatform; 511 u_int32_t SupportedOptions; /* supported features of this 512 * controller */ 513 AAC_OemFlavor OemVariant; 514 } __attribute__ ((packed)); 515 516 /* 517 * Monitor/Kernel interface. 518 */ 519 520 /* 521 * Synchronous commands to the monitor/kernel. 522 */ 523 #define AAC_MONKER_INITSTRUCT 0x05 524 #define AAC_MONKER_SYNCFIB 0x0c 525 526 /* 527 * Adapter Status Register 528 * 529 * Phase Staus mailbox is 32bits: 530 * <31:16> = Phase Status 531 * <15:0> = Phase 532 * 533 * The adapter reports its present state through the phase. Only 534 * a single phase should be ever be set. Each phase can have multiple 535 * phase status bits to provide more detailed information about the 536 * state of the adapter. 537 */ 538 #define AAC_SELF_TEST_FAILED 0x00000004 539 #define AAC_UP_AND_RUNNING 0x00000080 540 #define AAC_KERNEL_PANIC 0x00000100 541 542 /* 543 * Data types relating to control and monitoring of the NVRAM/WriteCache 544 * subsystem. 545 */ 546 547 #define AAC_NFILESYS 24 /* maximum number of filesystems */ 548 549 /* 550 * NVRAM/Write Cache subsystem states 551 */ 552 typedef enum { 553 NVSTATUS_DISABLED = 0, /* present, clean, not being used */ 554 NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */ 555 NVSTATUS_ERROR, /* present, dirty, contains dirty data */ 556 NVSTATUS_BATTERY, /* present, bad or low battery, may contain 557 * dirty data */ 558 NVSTATUS_UNKNOWN /* for bad/missing device */ 559 } AAC_NVSTATUS; 560 561 /* 562 * NVRAM/Write Cache subsystem battery component states 563 * 564 */ 565 typedef enum { 566 NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */ 567 NVBATTSTATUS_LOW, /* battery is low on power */ 568 NVBATTSTATUS_OK, /* battery is okay - normal operation possible 569 * only in this state */ 570 NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning 571 * in process */ 572 } AAC_NVBATTSTATUS; 573 574 /* 575 * Battery transition type 576 */ 577 typedef enum { 578 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not 579 * present */ 580 NVBATT_TRANSITION_LOW, /* battery is now low on power */ 581 NVBATT_TRANSITION_OK /* battery is now okay - normal 582 * operation possible only in this 583 * state */ 584 } AAC_NVBATT_TRANSITION; 585 586 /* 587 * NVRAM Info structure returned for NVRAM_GetInfo call 588 */ 589 struct aac_nvramdevinfo { 590 u_int32_t NV_Enabled; /* write caching enabled */ 591 u_int32_t NV_Error; /* device in error state */ 592 u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */ 593 u_int32_t NV_NActive; /* count of NVRAM buffers being 594 * written */ 595 } __attribute__ ((packed)); 596 597 struct aac_nvraminfo { 598 AAC_NVSTATUS NV_Status; /* nvram subsystem status */ 599 AAC_NVBATTSTATUS NV_BattStatus; /* battery status */ 600 u_int32_t NV_Size; /* size of WriteCache NVRAM in 601 * bytes */ 602 u_int32_t NV_BufSize; /* size of NVRAM buffers in 603 * bytes */ 604 u_int32_t NV_NBufs; /* number of NVRAM buffers */ 605 u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */ 606 u_int32_t NV_NClean; /* Num clean NVRAM buffers */ 607 u_int32_t NV_NActive; /* Num NVRAM buffers being 608 * written */ 609 u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */ 610 struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device 611 * info */ 612 u_int32_t NV_BattNeedsReconditioning; /* boolean */ 613 u_int32_t NV_TotalSize; /* size of all non-volatile 614 * memories in bytes */ 615 } __attribute__ ((packed)); 616 617 /* 618 * Data types relating to adapter-initiated FIBs 619 * 620 * Based on types and structures in <aifstruc.h> 621 */ 622 623 /* 624 * Progress Reports 625 */ 626 typedef enum { 627 AifJobStsSuccess = 1, 628 AifJobStsFinished, 629 AifJobStsAborted, 630 AifJobStsFailed, 631 AifJobStsLastReportMarker = 100, /* All prior mean last report */ 632 AifJobStsSuspended, 633 AifJobStsRunning 634 } AAC_AifJobStatus; 635 636 typedef enum { 637 AifJobScsiMin = 1, /* Minimum value for Scsi operation */ 638 AifJobScsiZero, /* SCSI device clear operation */ 639 AifJobScsiVerify, /* SCSI device Verify operation NO 640 * REPAIR */ 641 AifJobScsiExercise, /* SCSI device Exercise operation */ 642 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH 643 * repair */ 644 AifJobScsiMax = 99, /* Max Scsi value */ 645 AifJobCtrMin, /* Min Ctr op value */ 646 AifJobCtrZero, /* Container clear operation */ 647 AifJobCtrCopy, /* Container copy operation */ 648 AifJobCtrCreateMirror, /* Container Create Mirror operation */ 649 AifJobCtrMergeMirror, /* Container Merge Mirror operation */ 650 AifJobCtrScrubMirror, /* Container Scrub Mirror operation */ 651 AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */ 652 AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */ 653 AifJobCtrMorph, /* Container morph operation */ 654 AifJobCtrPartCopy, /* Container Partition copy operation */ 655 AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */ 656 AifJobCtrCrazyCache, /* crazy cache */ 657 AifJobCtrMax = 199, /* Max Ctr type operation */ 658 AifJobFsMin, /* Min Fs type operation */ 659 AifJobFsCreate, /* File System Create operation */ 660 AifJobFsVerify, /* File System Verify operation */ 661 AifJobFsExtend, /* File System Extend operation */ 662 AifJobFsMax = 299, /* Max Fs type operation */ 663 AifJobApiFormatNTFS, /* Format a drive to NTFS */ 664 AifJobApiFormatFAT, /* Format a drive to FAT */ 665 AifJobApiUpdateSnapshot, /* update the read/write half of a 666 * snapshot */ 667 AifJobApiFormatFAT32, /* Format a drive to FAT32 */ 668 AifJobApiMax = 399, /* Max API type operation */ 669 AifJobCtlContinuousCtrVerify, /* Adapter operation */ 670 AifJobCtlMax = 499 /* Max Adapter type operation */ 671 } AAC_AifJobType; 672 673 struct aac_AifContainers { 674 u_int32_t src; /* from/master */ 675 u_int32_t dst; /* to/slave */ 676 } __attribute__ ((packed)); 677 678 union aac_AifJobClient { 679 struct aac_AifContainers container; /* For Container and 680 * file system progress 681 * ops; */ 682 int32_t scsi_dh; /* For SCSI progress 683 * ops */ 684 }; 685 686 struct aac_AifJobDesc { 687 u_int32_t jobID; /* DO NOT FILL IN! Will be 688 * filled in by AIF */ 689 AAC_AifJobType type; /* Operation that is being 690 * performed */ 691 union aac_AifJobClient client; /* Details */ 692 } __attribute__ ((packed)); 693 694 struct aac_AifJobProgressReport { 695 struct aac_AifJobDesc jd; 696 AAC_AifJobStatus status; 697 u_int32_t finalTick; 698 u_int32_t currentTick; 699 u_int32_t jobSpecificData1; 700 u_int32_t jobSpecificData2; 701 } __attribute__ ((packed)); 702 703 /* 704 * Event Notification 705 */ 706 typedef enum { 707 /* General application notifies start here */ 708 AifEnGeneric = 1, /* Generic notification */ 709 AifEnTaskComplete, /* Task has completed */ 710 AifEnConfigChange, /* Adapter config change occurred */ 711 AifEnContainerChange, /* Adapter specific container 712 * configuration change */ 713 AifEnDeviceFailure, /* SCSI device failed */ 714 AifEnMirrorFailover, /* Mirror failover started */ 715 AifEnContainerEvent, /* Significant container event */ 716 AifEnFileSystemChange, /* File system changed */ 717 AifEnConfigPause, /* Container pause event */ 718 AifEnConfigResume, /* Container resume event */ 719 AifEnFailoverChange, /* Failover space assignment changed */ 720 AifEnRAID5RebuildDone, /* RAID5 rebuild finished */ 721 AifEnEnclosureManagement, /* Enclosure management event */ 722 AifEnBatteryEvent, /* Significant NV battery event */ 723 AifEnAddContainer, /* A new container was created. */ 724 AifEnDeleteContainer, /* A container was deleted. */ 725 AifEnSMARTEvent, /* SMART Event */ 726 AifEnBatteryNeedsRecond, /* The battery needs reconditioning */ 727 AifEnClusterEvent, /* Some cluster event */ 728 AifEnDiskSetEvent, /* A disk set event occured. */ 729 AifDriverNotifyStart=199, /* Notifies for host driver go here */ 730 /* Host driver notifications start here */ 731 AifDenMorphComplete, /* A morph operation completed */ 732 AifDenVolumeExtendComplete /* Volume expand operation completed */ 733 } AAC_AifEventNotifyType; 734 735 struct aac_AifEnsGeneric { 736 char text[132]; /* Generic text */ 737 } __attribute__ ((packed)); 738 739 struct aac_AifEnsDeviceFailure { 740 u_int32_t deviceHandle; /* SCSI device handle */ 741 } __attribute__ ((packed)); 742 743 struct aac_AifEnsMirrorFailover { 744 u_int32_t container; /* Container with failed element */ 745 u_int32_t failedSlice; /* Old slice which failed */ 746 u_int32_t creatingSlice; /* New slice used for auto-create */ 747 } __attribute__ ((packed)); 748 749 struct aac_AifEnsContainerChange { 750 u_int32_t container[2]; /* container that changed, -1 if no 751 * container */ 752 } __attribute__ ((packed)); 753 754 struct aac_AifEnsContainerEvent { 755 u_int32_t container; /* container number */ 756 u_int32_t eventType; /* event type */ 757 } __attribute__ ((packed)); 758 759 struct aac_AifEnsEnclosureEvent { 760 u_int32_t empID; /* enclosure management proc number */ 761 u_int32_t unitID; /* unitId, fan id, power supply id, 762 * slot id, tempsensor id. */ 763 u_int32_t eventType; /* event type */ 764 } __attribute__ ((packed)); 765 766 struct aac_AifEnsBatteryEvent { 767 AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */ 768 AAC_NVBATTSTATUS current_state; /* current batt state */ 769 AAC_NVBATTSTATUS prior_state; /* prev batt state */ 770 } __attribute__ ((packed)); 771 772 struct aac_AifEnsDiskSetEvent { 773 u_int32_t eventType; 774 u_int64_t DsNum; 775 u_int64_t CreatorId; 776 } __attribute__ ((packed)); 777 778 typedef enum { 779 CLUSTER_NULL_EVENT = 0, 780 CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or 781 * adaptername from NULL to non-NULL */ 782 /* (partner's agent may be up) */ 783 CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or 784 * adaptername from non-null to NULL */ 785 /* (partner has rebooted) */ 786 } AAC_ClusterAifEvent; 787 788 struct aac_AifEnsClusterEvent { 789 AAC_ClusterAifEvent eventType; 790 } __attribute__ ((packed)); 791 792 struct aac_AifEventNotify { 793 AAC_AifEventNotifyType type; 794 union { 795 struct aac_AifEnsGeneric EG; 796 struct aac_AifEnsDeviceFailure EDF; 797 struct aac_AifEnsMirrorFailover EMF; 798 struct aac_AifEnsContainerChange ECC; 799 struct aac_AifEnsContainerEvent ECE; 800 struct aac_AifEnsEnclosureEvent EEE; 801 struct aac_AifEnsBatteryEvent EBE; 802 struct aac_AifEnsDiskSetEvent EDS; 803 /* struct aac_AifEnsSMARTEvent ES;*/ 804 struct aac_AifEnsClusterEvent ECLE; 805 } data; 806 } __attribute__ ((packed)); 807 808 /* 809 * Adapter Initiated FIB command structures. Start with the adapter 810 * initiated FIBs that really come from the adapter, and get responded 811 * to by the host. 812 */ 813 #define AAC_AIF_REPORT_MAX_SIZE 64 814 815 typedef enum { 816 AifCmdEventNotify = 1, /* Notify of event */ 817 AifCmdJobProgress, /* Progress report */ 818 AifCmdAPIReport, /* Report from other user of API */ 819 AifCmdDriverNotify, /* Notify host driver of event */ 820 AifReqJobList = 100, /* Gets back complete job list */ 821 AifReqJobsForCtr, /* Gets back jobs for specific container */ 822 AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */ 823 AifReqJobReport, /* Gets back a specific job report or list */ 824 AifReqTerminateJob, /* Terminates job */ 825 AifReqSuspendJob, /* Suspends a job */ 826 AifReqResumeJob, /* Resumes a job */ 827 AifReqSendAPIReport, /* API generic report requests */ 828 AifReqAPIJobStart, /* Start a job from the API */ 829 AifReqAPIJobUpdate, /* Update a job report from the API */ 830 AifReqAPIJobFinish /* Finish a job from the API */ 831 } AAC_AifCommand; 832 833 struct aac_aif_command { 834 AAC_AifCommand command; /* Tell host what type of 835 * notify this is */ 836 u_int32_t seqNumber; /* To allow ordering of 837 * reports (if necessary) */ 838 union { 839 struct aac_AifEventNotify EN; /* Event notify structure */ 840 struct aac_AifJobProgressReport PR[1]; /* Progress report */ 841 u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE]; 842 } data; 843 } __attribute__ ((packed)); 844 845 /* 846 * Filesystem commands/data 847 * 848 * The adapter has a very complex filesystem interface, most of which we ignore. 849 * (And which seems not to be implemented, anyway.) 850 */ 851 852 /* 853 * FSA commands 854 * (not used?) 855 */ 856 typedef enum { 857 Null = 0, 858 GetAttributes, 859 SetAttributes, 860 Lookup, 861 ReadLink, 862 Read, 863 Write, 864 Create, 865 MakeDirectory, 866 SymbolicLink, 867 MakeNode, 868 Removex, 869 RemoveDirectory, 870 Rename, 871 Link, 872 ReadDirectory, 873 ReadDirectoryPlus, 874 FileSystemStatus, 875 FileSystemInfo, 876 PathConfigure, 877 Commit, 878 Mount, 879 UnMount, 880 Newfs, 881 FsCheck, 882 FsSync, 883 SimReadWrite, 884 SetFileSystemStatus, 885 BlockRead, 886 BlockWrite, 887 NvramIoctl, 888 FsSyncWait, 889 ClearArchiveBit, 890 SetAcl, 891 GetAcl, 892 AssignAcl, 893 FaultInsertion, 894 CrazyCache 895 } AAC_FSACommand; 896 897 /* 898 * Command status values 899 */ 900 typedef enum { 901 ST_OK = 0, 902 ST_PERM = 1, 903 ST_NOENT = 2, 904 ST_IO = 5, 905 ST_NXIO = 6, 906 ST_E2BIG = 7, 907 ST_ACCES = 13, 908 ST_EXIST = 17, 909 ST_XDEV = 18, 910 ST_NODEV = 19, 911 ST_NOTDIR = 20, 912 ST_ISDIR = 21, 913 ST_INVAL = 22, 914 ST_FBIG = 27, 915 ST_NOSPC = 28, 916 ST_ROFS = 30, 917 ST_MLINK = 31, 918 ST_WOULDBLOCK = 35, 919 ST_NAMETOOLONG = 63, 920 ST_NOTEMPTY = 66, 921 ST_DQUOT = 69, 922 ST_STALE = 70, 923 ST_REMOTE = 71, 924 ST_BADHANDLE = 10001, 925 ST_NOT_SYNC = 10002, 926 ST_BAD_COOKIE = 10003, 927 ST_NOTSUPP = 10004, 928 ST_TOOSMALL = 10005, 929 ST_SERVERFAULT = 10006, 930 ST_BADTYPE = 10007, 931 ST_JUKEBOX = 10008, 932 ST_NOTMOUNTED = 10009, 933 ST_MAINTMODE = 10010, 934 ST_STALEACL = 10011 935 } AAC_FSAStatus; 936 937 /* 938 * Volume manager commands 939 */ 940 typedef enum _VM_COMMANDS { 941 VM_Null = 0, 942 VM_NameServe, 943 VM_ContainerConfig, 944 VM_Ioctl, 945 VM_FilesystemIoctl, 946 VM_CloseAll, 947 VM_CtBlockRead, 948 VM_CtBlockWrite, 949 VM_SliceBlockRead, /* raw access to configured storage objects */ 950 VM_SliceBlockWrite, 951 VM_DriveBlockRead, /* raw access to physical devices */ 952 VM_DriveBlockWrite, 953 VM_EnclosureMgt, /* enclosure management */ 954 VM_Unused, /* used to be diskset management */ 955 VM_CtBlockVerify, 956 VM_CtPerf, /* performance test */ 957 VM_CtBlockRead64, 958 VM_CtBlockWrite64, 959 VM_CtBlockVerify64, 960 } AAC_VMCommand; 961 962 /* 963 * "mountable object" 964 */ 965 struct aac_mntobj { 966 u_int32_t ObjectId; 967 char FileSystemName[16]; 968 struct aac_container_creation CreateInfo; 969 u_int32_t Capacity; 970 AAC_FSAVolType VolType; 971 AAC_FType ObjType; 972 u_int32_t ContentState; 973 #define FSCS_READONLY 0x0002 /* XXX need more information 974 * than this */ 975 union { 976 u_int32_t pad[8]; 977 } ObjExtension; 978 u_int32_t AlterEgoId; 979 } __attribute__ ((packed)); 980 981 struct aac_mntinfo { 982 AAC_VMCommand Command; 983 AAC_FType MntType; 984 u_int32_t MntCount; 985 } __attribute__ ((packed)); 986 987 struct aac_mntinforesponse { 988 AAC_FSAStatus Status; 989 AAC_FType MntType; 990 u_int32_t MntRespCount; 991 struct aac_mntobj MntTable[1]; 992 } __attribute__ ((packed)); 993 994 /* 995 * Container shutdown command. 996 */ 997 struct aac_closecommand { 998 u_int32_t Command; 999 u_int32_t ContainerId; 1000 } __attribute__ ((packed)); 1001 1002 /* 1003 * Write 'stability' options. 1004 */ 1005 typedef enum { 1006 CSTABLE = 1, 1007 CUNSTABLE 1008 } AAC_CacheLevel; 1009 1010 /* 1011 * Commit level response for a write request. 1012 */ 1013 typedef enum { 1014 CMFILE_SYNC_NVRAM = 1, 1015 CMDATA_SYNC_NVRAM, 1016 CMFILE_SYNC, 1017 CMDATA_SYNC, 1018 CMUNSTABLE 1019 } AAC_CommitLevel; 1020 1021 /* 1022 * Block read/write operations. 1023 * These structures are packed into the 'data' area in the FIB. 1024 */ 1025 1026 struct aac_blockread { 1027 AAC_VMCommand Command; /* not FSACommand! */ 1028 u_int32_t ContainerId; 1029 u_int32_t BlockNumber; 1030 u_int32_t ByteCount; 1031 struct aac_sg_table SgMap; /* variable size */ 1032 } __attribute__ ((packed)); 1033 1034 struct aac_blockread_response { 1035 AAC_FSAStatus Status; 1036 u_int32_t ByteCount; 1037 } __attribute__ ((packed)); 1038 1039 struct aac_blockwrite { 1040 AAC_VMCommand Command; /* not FSACommand! */ 1041 u_int32_t ContainerId; 1042 u_int32_t BlockNumber; 1043 u_int32_t ByteCount; 1044 AAC_CacheLevel Stable; 1045 struct aac_sg_table SgMap; /* variable size */ 1046 } __attribute__ ((packed)); 1047 1048 struct aac_blockwrite_response { 1049 AAC_FSAStatus Status; 1050 u_int32_t ByteCount; 1051 AAC_CommitLevel Committed; 1052 } __attribute__ ((packed)); 1053 1054 /* 1055 * Container shutdown command. 1056 */ 1057 struct aac_close_command { 1058 AAC_VMCommand Command; 1059 u_int32_t ContainerId; 1060 }; 1061 1062 /* 1063 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based 1064 * on the SA110 'StrongArm'. 1065 */ 1066 1067 #define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */ 1068 #define AAC_SA_DOORBELL0_SET 0x9c 1069 #define AAC_SA_DOORBELL0 0x9c 1070 #define AAC_SA_MASK0_CLEAR 0xa0 1071 #define AAC_SA_MASK0_SET 0xa4 1072 1073 #define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */ 1074 #define AAC_SA_DOORBELL1_SET 0x9e 1075 #define AAC_SA_MASK1_CLEAR 0xa2 1076 #define AAC_SA_MASK1_SET 0xa6 1077 1078 #define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */ 1079 #define AAC_SA_FWSTATUS 0xc4 1080 1081 /* 1082 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx, 1083 * and other related adapters. 1084 */ 1085 1086 #define AAC_RX_IDBR 0x20 /* inbound doorbell register */ 1087 #define AAC_RX_IISR 0x24 /* inbound interrupt status register */ 1088 #define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */ 1089 #define AAC_RX_ODBR 0x2c /* outbound doorbell register */ 1090 #define AAC_RX_OISR 0x30 /* outbound interrupt status register */ 1091 #define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */ 1092 1093 #define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */ 1094 #define AAC_RX_FWSTATUS 0x6c 1095 1096 /* 1097 * Common bit definitions for the doorbell registers. 1098 */ 1099 1100 /* 1101 * Status bits in the doorbell registers. 1102 */ 1103 #define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */ 1104 #define AAC_DB_COMMAND_READY (1<<1) /* posted one or more commands */ 1105 #define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands complete */ 1106 #define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */ 1107 #define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */ 1108 1109 /* 1110 * The adapter can request the host print a message by setting the 1111 * DB_PRINTF flag in DOORBELL0. The driver responds by collecting the 1112 * message from the printf buffer, clearing the DB_PRINTF flag in 1113 * DOORBELL0 and setting it in DOORBELL1. 1114 * (ODBR and IDBR respectively for the i960Rx adapters) 1115 */ 1116 #define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */ 1117 1118 /* 1119 * Mask containing the interrupt bits we care about. We don't anticipate (or 1120 * want) interrupts not in this mask. 1121 */ 1122 #define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \ 1123 AAC_DB_RESPONSE_READY | \ 1124 AAC_DB_PRINTF) 1125