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