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