Nuke device_ptr_t, USBBASEDEVICE, USBDEVNAME(), USBDEVUNIT(), USBGETSOFTC(),
[dragonfly/vkernel-mp.git] / sys / dev / raid / aac / aacreg.h
blob0c3f3e5549a9d34082bc9dfe41bd86dd446f60e4
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.
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.
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.
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.3 2003/07/23 04:30:14 dillon Exp $
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.
41 * Misc. magic numbers.
43 #define AAC_MAX_CONTAINERS 64
44 #define AAC_BLOCK_SIZE 512
47 * Communications interface.
49 * Where datastructure layouts are closely parallel to the Adaptec sample code,
50 * retain their naming conventions (for now) to aid in cross-referencing.
54 * We establish 4 command queues and matching response queues. Queues must
55 * be 16-byte aligned, and are sized as follows:
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 */
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
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));
90 #define AAC_PRODUCER_INDEX 0
91 #define AAC_CONSUMER_INDEX 1
94 * Table of queue indices and queues used to communicate with the
95 * controller. This structure must be aligned to AAC_QUEUE_ALIGN
97 struct aac_queue_table {
98 /* queue consumer/producer indexes (layout mandated by adapter) */
99 u_int32_t qt_qindex[AAC_QUEUE_COUNT][2];
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));
113 * Queue names
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.
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
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)
131 struct aac_fib_list_entry {
132 u_int32_t Flink;
133 u_int32_t Blink;
134 } __attribute__ ((packed));
137 * FIB (FSA Interface Block?); this is the datastructure passed between the host
138 * and adapter.
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));
159 #define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header))
161 struct aac_fib {
162 struct aac_fib_header Header;
163 u_int8_t data[AAC_FIB_DATASIZE];
164 } __attribute__ ((packed));
167 * FIB commands
169 typedef enum {
170 TestCommandResponse = 1,
171 TestAdapterCommand = 2,
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,
195 /* filesystem commands */
196 NuFileSystem = 300,
197 UFS = 301,
198 HostFileSystem = 302,
199 LastFileSystemCommand = 303,
201 /* Container Commands */
202 ContainerCommand = 500,
203 ContainerCommand64 = 501,
205 /* Cluster Commands */
206 ClusterCommand = 550,
208 /* Scsi Port commands (scsi passthrough) */
209 ScsiPortCommand = 600,
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;
222 * FIB types
224 #define AAC_FIBTYPE_TFIB 1
225 #define AAC_FIBTYPE_TQE 2
226 #define AAC_FIBTYPE_TCTPERF 3
229 * FIB transfer state
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)
255 * FIB error values
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
268 * Adapter Init Structure: this is passed to the adapter with the
269 * AAC_MONKER_INITSTRUCT command to point it at our control structures.
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));
290 typedef u_int32_t aac_phys_addr_t;
293 * Shared data types
296 * Container types
298 typedef enum {
299 CT_NONE = 0,
300 CT_VOLUME,
301 CT_MIRROR,
302 CT_STRIPE,
303 CT_RAID5,
304 CT_SSRW,
305 CT_SSRO,
306 CT_MORPH,
307 CT_PASSTHRU,
308 CT_RAID4,
309 CT_RAID10, /* stripe of mirror */
310 CT_RAID00, /* stripe of stripe */
311 CT_VOLUME_OF_MIRRORS, /* volume of mirror */
312 CT_PSEUDO_RAID3, /* really raid4 */
313 CT_RAID50, /* stripe of raid5 */
314 } AAC_FSAVolType;
317 * Host-addressable object types
319 typedef enum {
320 FT_REG = 1, /* regular file */
321 FT_DIR, /* directory */
322 FT_BLK, /* "block" device - reserved */
323 FT_CHR, /* "character special" device - reserved */
324 FT_LNK, /* symbolic link */
325 FT_SOCK, /* socket */
326 FT_FIFO, /* fifo */
327 FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */
328 FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */
329 FT_SLICE, /* virtual disk - raw volume - slice */
330 FT_PARTITION, /* FSA partition - carved out of a slice - building
331 * block for containers */
332 FT_VOLUME, /* Container - Volume Set */
333 FT_STRIPE, /* Container - Stripe Set */
334 FT_MIRROR, /* Container - Mirror Set */
335 FT_RAID5, /* Container - Raid 5 Set */
336 FT_DATABASE /* Storage object with "foreign" content manager */
337 } AAC_FType;
340 * Host-side scatter/gather list for 32-bit commands.
342 struct aac_sg_entry {
343 u_int32_t SgAddress;
344 u_int32_t SgByteCount;
345 } __attribute__ ((packed));
347 struct aac_sg_table {
348 u_int32_t SgCount;
349 struct aac_sg_entry SgEntry[0];
350 } __attribute__ ((packed));
353 * Host-side scatter/gather list for 64-bit commands.
355 struct aac_sg_table64 {
356 u_int8_t SgCount;
357 u_int8_t SgSectorsPerPage;
358 u_int16_t SgByteOffset;
359 u_int64_t SgEntry[0];
360 } __attribute__ ((packed));
363 * Container creation data
365 struct aac_container_creation {
366 u_int8_t ViaBuildNumber;
367 u_int8_t MicroSecond;
368 u_int8_t Via; /* 1 = FSU, 2 = API, etc. */
369 u_int8_t YearsSince1900;
370 u_int32_t Month:4; /* 1-12 */
371 u_int32_t Day:6; /* 1-32 */
372 u_int32_t Hour:6; /* 0-23 */
373 u_int32_t Minute:6; /* 0-59 */
374 u_int32_t Second:6; /* 0-59 */
375 u_int64_t ViaAdapterSerialNumber;
376 } __attribute__ ((packed));
379 * Revision number handling
382 typedef enum {
383 RevApplication = 1,
384 RevDkiCli,
385 RevNetService,
386 RevApi,
387 RevFileSysDriver,
388 RevMiniportDriver,
389 RevAdapterSW,
390 RevMonitor,
391 RevRemoteApi
392 } RevComponent;
394 struct FsaRevision {
395 union {
396 struct {
397 u_int8_t dash;
398 u_int8_t type;
399 u_int8_t minor;
400 u_int8_t major;
401 } comp;
402 u_int32_t ul;
403 } external;
404 u_int32_t buildNumber;
405 } __attribute__ ((packed));
408 * Adapter Information
411 typedef enum {
412 CPU_NTSIM = 1,
413 CPU_I960,
414 CPU_ARM,
415 CPU_SPARC,
416 CPU_POWERPC,
417 CPU_ALPHA,
418 CPU_P7,
419 CPU_I960_RX,
420 CPU__last
421 } AAC_CpuType;
423 typedef enum {
424 CPUI960_JX = 1,
425 CPUI960_CX,
426 CPUI960_HX,
427 CPUI960_RX,
428 CPUARM_SA110,
429 CPUARM_xxx,
430 CPUMPC_824x,
431 CPUPPC_xxx,
432 CPUSUBTYPE__last
433 } AAC_CpuSubType;
435 typedef enum {
436 PLAT_NTSIM = 1,
437 PLAT_V3ADU,
438 PLAT_CYCLONE,
439 PLAT_CYCLONE_HD,
440 PLAT_BATBOARD,
441 PLAT_BATBOARD_HD,
442 PLAT_YOLO,
443 PLAT_COBRA,
444 PLAT_ANAHEIM,
445 PLAT_JALAPENO,
446 PLAT_QUEENS,
447 PLAT_JALAPENO_DELL,
448 PLAT_POBLANO,
449 PLAT_POBLANO_OPAL,
450 PLAT_POBLANO_SL0,
451 PLAT_POBLANO_SL1,
452 PLAT_POBLANO_SL2,
453 PLAT_POBLANO_XXX,
454 PLAT_JALAPENO_P2,
455 PLAT_HABANERO,
456 PLAT__last
457 } AAC_Platform;
459 typedef enum {
460 OEM_FLAVOR_ADAPTEC = 1,
461 OEM_FLAVOR_DELL,
462 OEM_FLAVOR_HP,
463 OEM_FLAVOR_IBM,
464 OEM_FLAVOR_CPQ,
465 OEM_FLAVOR_BRAND_X,
466 OEM_FLAVOR_BRAND_Y,
467 OEM_FLAVOR_BRAND_Z,
468 OEM_FLAVOR__last
469 } AAC_OemFlavor;
472 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
474 typedef enum
476 PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */
477 PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */
478 PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */
479 PLATFORM_BAT_OPT_NOTPRESENT, /* BATTERY OPTIONAL AND NOT PRESENT */
480 PLATFORM_BAT_NOT_SUPPORTED /* BATTERY NOT SUPPORTED */
481 } AAC_BatteryPlatform;
484 * options supported by this board
485 * there has to be a one to one mapping of these defines and the ones in
486 * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT
488 #define AAC_SUPPORTED_SNAPSHOT 0x01
489 #define AAC_SUPPORTED_CLUSTERS 0x02
490 #define AAC_SUPPORTED_WRITE_CACHE 0x04
491 #define AAC_SUPPORTED_64BIT_DATA 0x08
492 #define AAC_SUPPORTED_HOST_TIME_FIB 0x10
493 #define AAC_SUPPORTED_RAID50 0x20
494 #define AAC_SUPPORTED_4GB_WINDOW 0x40
495 #define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80
496 #define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100
497 #define AAC_SUPPORTED_NOT_RECONDITION 0x200
498 #define AAC_SUPPORTED_SGMAP_HOST64 0x400
499 #define AAC_SUPPORTED_ALARM 0x800
500 #define AAC_SUPPORTED_NONDASD 0x1000
503 * Structure used to respond to a RequestAdapterInfo fib.
505 struct aac_adapter_info {
506 AAC_Platform PlatformBase; /* adapter type */
507 AAC_CpuType CpuArchitecture; /* adapter CPU type */
508 AAC_CpuSubType CpuVariant; /* adapter CPU subtype */
509 u_int32_t ClockSpeed; /* adapter CPU clockspeed */
510 u_int32_t ExecutionMem; /* adapter Execution Memory
511 * size */
512 u_int32_t BufferMem; /* adapter Data Memory */
513 u_int32_t TotalMem; /* adapter Total Memory */
514 struct FsaRevision KernelRevision; /* adapter Kernel Software
515 * Revision */
516 struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic
517 * Software Revision */
518 struct FsaRevision HardwareRevision;/* TBD */
519 struct FsaRevision BIOSRevision; /* adapter BIOS Revision */
520 u_int32_t ClusteringEnabled;
521 u_int32_t ClusterChannelMask;
522 u_int64_t SerialNumber;
523 AAC_BatteryPlatform batteryPlatform;
524 u_int32_t SupportedOptions; /* supported features of this
525 * controller */
526 AAC_OemFlavor OemVariant;
527 } __attribute__ ((packed));
530 * Monitor/Kernel interface.
534 * Synchronous commands to the monitor/kernel.
536 #define AAC_MONKER_INITSTRUCT 0x05
537 #define AAC_MONKER_SYNCFIB 0x0c
538 #define AAC_MONKER_GETKERNVER 0x11
539 #define AAC_MONKER_GETINFO 0x19
542 * Adapter Status Register
544 * Phase Staus mailbox is 32bits:
545 * <31:16> = Phase Status
546 * <15:0> = Phase
548 * The adapter reports its present state through the phase. Only
549 * a single phase should be ever be set. Each phase can have multiple
550 * phase status bits to provide more detailed information about the
551 * state of the adapter.
553 #define AAC_SELF_TEST_FAILED 0x00000004
554 #define AAC_UP_AND_RUNNING 0x00000080
555 #define AAC_KERNEL_PANIC 0x00000100
558 * Data types relating to control and monitoring of the NVRAM/WriteCache
559 * subsystem.
562 #define AAC_NFILESYS 24 /* maximum number of filesystems */
565 * NVRAM/Write Cache subsystem states
567 typedef enum {
568 NVSTATUS_DISABLED = 0, /* present, clean, not being used */
569 NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */
570 NVSTATUS_ERROR, /* present, dirty, contains dirty data */
571 NVSTATUS_BATTERY, /* present, bad or low battery, may contain
572 * dirty data */
573 NVSTATUS_UNKNOWN /* for bad/missing device */
574 } AAC_NVSTATUS;
577 * NVRAM/Write Cache subsystem battery component states
580 typedef enum {
581 NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */
582 NVBATTSTATUS_LOW, /* battery is low on power */
583 NVBATTSTATUS_OK, /* battery is okay - normal operation possible
584 * only in this state */
585 NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning
586 * in process */
587 } AAC_NVBATTSTATUS;
590 * Battery transition type
592 typedef enum {
593 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not
594 * present */
595 NVBATT_TRANSITION_LOW, /* battery is now low on power */
596 NVBATT_TRANSITION_OK /* battery is now okay - normal
597 * operation possible only in this
598 * state */
599 } AAC_NVBATT_TRANSITION;
602 * NVRAM Info structure returned for NVRAM_GetInfo call
604 struct aac_nvramdevinfo {
605 u_int32_t NV_Enabled; /* write caching enabled */
606 u_int32_t NV_Error; /* device in error state */
607 u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */
608 u_int32_t NV_NActive; /* count of NVRAM buffers being
609 * written */
610 } __attribute__ ((packed));
612 struct aac_nvraminfo {
613 AAC_NVSTATUS NV_Status; /* nvram subsystem status */
614 AAC_NVBATTSTATUS NV_BattStatus; /* battery status */
615 u_int32_t NV_Size; /* size of WriteCache NVRAM in
616 * bytes */
617 u_int32_t NV_BufSize; /* size of NVRAM buffers in
618 * bytes */
619 u_int32_t NV_NBufs; /* number of NVRAM buffers */
620 u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */
621 u_int32_t NV_NClean; /* Num clean NVRAM buffers */
622 u_int32_t NV_NActive; /* Num NVRAM buffers being
623 * written */
624 u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */
625 struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device
626 * info */
627 u_int32_t NV_BattNeedsReconditioning; /* boolean */
628 u_int32_t NV_TotalSize; /* size of all non-volatile
629 * memories in bytes */
630 } __attribute__ ((packed));
633 * Data types relating to adapter-initiated FIBs
635 * Based on types and structures in <aifstruc.h>
639 * Progress Reports
641 typedef enum {
642 AifJobStsSuccess = 1,
643 AifJobStsFinished,
644 AifJobStsAborted,
645 AifJobStsFailed,
646 AifJobStsLastReportMarker = 100, /* All prior mean last report */
647 AifJobStsSuspended,
648 AifJobStsRunning
649 } AAC_AifJobStatus;
651 typedef enum {
652 AifJobScsiMin = 1, /* Minimum value for Scsi operation */
653 AifJobScsiZero, /* SCSI device clear operation */
654 AifJobScsiVerify, /* SCSI device Verify operation NO
655 * REPAIR */
656 AifJobScsiExercise, /* SCSI device Exercise operation */
657 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH
658 * repair */
659 AifJobScsiMax = 99, /* Max Scsi value */
660 AifJobCtrMin, /* Min Ctr op value */
661 AifJobCtrZero, /* Container clear operation */
662 AifJobCtrCopy, /* Container copy operation */
663 AifJobCtrCreateMirror, /* Container Create Mirror operation */
664 AifJobCtrMergeMirror, /* Container Merge Mirror operation */
665 AifJobCtrScrubMirror, /* Container Scrub Mirror operation */
666 AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */
667 AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */
668 AifJobCtrMorph, /* Container morph operation */
669 AifJobCtrPartCopy, /* Container Partition copy operation */
670 AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */
671 AifJobCtrCrazyCache, /* crazy cache */
672 AifJobCtrMax = 199, /* Max Ctr type operation */
673 AifJobFsMin, /* Min Fs type operation */
674 AifJobFsCreate, /* File System Create operation */
675 AifJobFsVerify, /* File System Verify operation */
676 AifJobFsExtend, /* File System Extend operation */
677 AifJobFsMax = 299, /* Max Fs type operation */
678 AifJobApiFormatNTFS, /* Format a drive to NTFS */
679 AifJobApiFormatFAT, /* Format a drive to FAT */
680 AifJobApiUpdateSnapshot, /* update the read/write half of a
681 * snapshot */
682 AifJobApiFormatFAT32, /* Format a drive to FAT32 */
683 AifJobApiMax = 399, /* Max API type operation */
684 AifJobCtlContinuousCtrVerify, /* Adapter operation */
685 AifJobCtlMax = 499 /* Max Adapter type operation */
686 } AAC_AifJobType;
688 struct aac_AifContainers {
689 u_int32_t src; /* from/master */
690 u_int32_t dst; /* to/slave */
691 } __attribute__ ((packed));
693 union aac_AifJobClient {
694 struct aac_AifContainers container; /* For Container and
695 * file system progress
696 * ops; */
697 int32_t scsi_dh; /* For SCSI progress
698 * ops */
701 struct aac_AifJobDesc {
702 u_int32_t jobID; /* DO NOT FILL IN! Will be
703 * filled in by AIF */
704 AAC_AifJobType type; /* Operation that is being
705 * performed */
706 union aac_AifJobClient client; /* Details */
707 } __attribute__ ((packed));
709 struct aac_AifJobProgressReport {
710 struct aac_AifJobDesc jd;
711 AAC_AifJobStatus status;
712 u_int32_t finalTick;
713 u_int32_t currentTick;
714 u_int32_t jobSpecificData1;
715 u_int32_t jobSpecificData2;
716 } __attribute__ ((packed));
719 * Event Notification
721 typedef enum {
722 /* General application notifies start here */
723 AifEnGeneric = 1, /* Generic notification */
724 AifEnTaskComplete, /* Task has completed */
725 AifEnConfigChange, /* Adapter config change occurred */
726 AifEnContainerChange, /* Adapter specific container
727 * configuration change */
728 AifEnDeviceFailure, /* SCSI device failed */
729 AifEnMirrorFailover, /* Mirror failover started */
730 AifEnContainerEvent, /* Significant container event */
731 AifEnFileSystemChange, /* File system changed */
732 AifEnConfigPause, /* Container pause event */
733 AifEnConfigResume, /* Container resume event */
734 AifEnFailoverChange, /* Failover space assignment changed */
735 AifEnRAID5RebuildDone, /* RAID5 rebuild finished */
736 AifEnEnclosureManagement, /* Enclosure management event */
737 AifEnBatteryEvent, /* Significant NV battery event */
738 AifEnAddContainer, /* A new container was created. */
739 AifEnDeleteContainer, /* A container was deleted. */
740 AifEnSMARTEvent, /* SMART Event */
741 AifEnBatteryNeedsRecond, /* The battery needs reconditioning */
742 AifEnClusterEvent, /* Some cluster event */
743 AifEnDiskSetEvent, /* A disk set event occured. */
744 AifDriverNotifyStart=199, /* Notifies for host driver go here */
745 /* Host driver notifications start here */
746 AifDenMorphComplete, /* A morph operation completed */
747 AifDenVolumeExtendComplete /* Volume expand operation completed */
748 } AAC_AifEventNotifyType;
750 struct aac_AifEnsGeneric {
751 char text[132]; /* Generic text */
752 } __attribute__ ((packed));
754 struct aac_AifEnsDeviceFailure {
755 u_int32_t deviceHandle; /* SCSI device handle */
756 } __attribute__ ((packed));
758 struct aac_AifEnsMirrorFailover {
759 u_int32_t container; /* Container with failed element */
760 u_int32_t failedSlice; /* Old slice which failed */
761 u_int32_t creatingSlice; /* New slice used for auto-create */
762 } __attribute__ ((packed));
764 struct aac_AifEnsContainerChange {
765 u_int32_t container[2]; /* container that changed, -1 if no
766 * container */
767 } __attribute__ ((packed));
769 struct aac_AifEnsContainerEvent {
770 u_int32_t container; /* container number */
771 u_int32_t eventType; /* event type */
772 } __attribute__ ((packed));
774 struct aac_AifEnsEnclosureEvent {
775 u_int32_t empID; /* enclosure management proc number */
776 u_int32_t unitID; /* unitId, fan id, power supply id,
777 * slot id, tempsensor id. */
778 u_int32_t eventType; /* event type */
779 } __attribute__ ((packed));
781 struct aac_AifEnsBatteryEvent {
782 AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */
783 AAC_NVBATTSTATUS current_state; /* current batt state */
784 AAC_NVBATTSTATUS prior_state; /* prev batt state */
785 } __attribute__ ((packed));
787 struct aac_AifEnsDiskSetEvent {
788 u_int32_t eventType;
789 u_int64_t DsNum;
790 u_int64_t CreatorId;
791 } __attribute__ ((packed));
793 typedef enum {
794 CLUSTER_NULL_EVENT = 0,
795 CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or
796 * adaptername from NULL to non-NULL */
797 /* (partner's agent may be up) */
798 CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or
799 * adaptername from non-null to NULL */
800 /* (partner has rebooted) */
801 } AAC_ClusterAifEvent;
803 struct aac_AifEnsClusterEvent {
804 AAC_ClusterAifEvent eventType;
805 } __attribute__ ((packed));
807 struct aac_AifEventNotify {
808 AAC_AifEventNotifyType type;
809 union {
810 struct aac_AifEnsGeneric EG;
811 struct aac_AifEnsDeviceFailure EDF;
812 struct aac_AifEnsMirrorFailover EMF;
813 struct aac_AifEnsContainerChange ECC;
814 struct aac_AifEnsContainerEvent ECE;
815 struct aac_AifEnsEnclosureEvent EEE;
816 struct aac_AifEnsBatteryEvent EBE;
817 struct aac_AifEnsDiskSetEvent EDS;
818 /* struct aac_AifEnsSMARTEvent ES;*/
819 struct aac_AifEnsClusterEvent ECLE;
820 } data;
821 } __attribute__ ((packed));
824 * Adapter Initiated FIB command structures. Start with the adapter
825 * initiated FIBs that really come from the adapter, and get responded
826 * to by the host.
828 #define AAC_AIF_REPORT_MAX_SIZE 64
830 typedef enum {
831 AifCmdEventNotify = 1, /* Notify of event */
832 AifCmdJobProgress, /* Progress report */
833 AifCmdAPIReport, /* Report from other user of API */
834 AifCmdDriverNotify, /* Notify host driver of event */
835 AifReqJobList = 100, /* Gets back complete job list */
836 AifReqJobsForCtr, /* Gets back jobs for specific container */
837 AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */
838 AifReqJobReport, /* Gets back a specific job report or list */
839 AifReqTerminateJob, /* Terminates job */
840 AifReqSuspendJob, /* Suspends a job */
841 AifReqResumeJob, /* Resumes a job */
842 AifReqSendAPIReport, /* API generic report requests */
843 AifReqAPIJobStart, /* Start a job from the API */
844 AifReqAPIJobUpdate, /* Update a job report from the API */
845 AifReqAPIJobFinish /* Finish a job from the API */
846 } AAC_AifCommand;
848 struct aac_aif_command {
849 AAC_AifCommand command; /* Tell host what type of
850 * notify this is */
851 u_int32_t seqNumber; /* To allow ordering of
852 * reports (if necessary) */
853 union {
854 struct aac_AifEventNotify EN; /* Event notify structure */
855 struct aac_AifJobProgressReport PR[1]; /* Progress report */
856 u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE];
857 } data;
858 } __attribute__ ((packed));
861 * Filesystem commands/data
863 * The adapter has a very complex filesystem interface, most of which we ignore.
864 * (And which seems not to be implemented, anyway.)
868 * FSA commands
869 * (not used?)
871 typedef enum {
872 Null = 0,
873 GetAttributes,
874 SetAttributes,
875 Lookup,
876 ReadLink,
877 Read,
878 Write,
879 Create,
880 MakeDirectory,
881 SymbolicLink,
882 MakeNode,
883 Removex,
884 RemoveDirectory,
885 Rename,
886 Link,
887 ReadDirectory,
888 ReadDirectoryPlus,
889 FileSystemStatus,
890 FileSystemInfo,
891 PathConfigure,
892 Commit,
893 Mount,
894 UnMount,
895 Newfs,
896 FsCheck,
897 FsSync,
898 SimReadWrite,
899 SetFileSystemStatus,
900 BlockRead,
901 BlockWrite,
902 NvramIoctl,
903 FsSyncWait,
904 ClearArchiveBit,
905 SetAcl,
906 GetAcl,
907 AssignAcl,
908 FaultInsertion,
909 CrazyCache
910 } AAC_FSACommand;
913 * Command status values
915 typedef enum {
916 ST_OK = 0,
917 ST_PERM = 1,
918 ST_NOENT = 2,
919 ST_IO = 5,
920 ST_NXIO = 6,
921 ST_E2BIG = 7,
922 ST_ACCES = 13,
923 ST_EXIST = 17,
924 ST_XDEV = 18,
925 ST_NODEV = 19,
926 ST_NOTDIR = 20,
927 ST_ISDIR = 21,
928 ST_INVAL = 22,
929 ST_FBIG = 27,
930 ST_NOSPC = 28,
931 ST_ROFS = 30,
932 ST_MLINK = 31,
933 ST_WOULDBLOCK = 35,
934 ST_NAMETOOLONG = 63,
935 ST_NOTEMPTY = 66,
936 ST_DQUOT = 69,
937 ST_STALE = 70,
938 ST_REMOTE = 71,
939 ST_BADHANDLE = 10001,
940 ST_NOT_SYNC = 10002,
941 ST_BAD_COOKIE = 10003,
942 ST_NOTSUPP = 10004,
943 ST_TOOSMALL = 10005,
944 ST_SERVERFAULT = 10006,
945 ST_BADTYPE = 10007,
946 ST_JUKEBOX = 10008,
947 ST_NOTMOUNTED = 10009,
948 ST_MAINTMODE = 10010,
949 ST_STALEACL = 10011
950 } AAC_FSAStatus;
953 * Volume manager commands
955 typedef enum _VM_COMMANDS {
956 VM_Null = 0,
957 VM_NameServe,
958 VM_ContainerConfig,
959 VM_Ioctl,
960 VM_FilesystemIoctl,
961 VM_CloseAll,
962 VM_CtBlockRead,
963 VM_CtBlockWrite,
964 VM_SliceBlockRead, /* raw access to configured storage objects */
965 VM_SliceBlockWrite,
966 VM_DriveBlockRead, /* raw access to physical devices */
967 VM_DriveBlockWrite,
968 VM_EnclosureMgt, /* enclosure management */
969 VM_Unused, /* used to be diskset management */
970 VM_CtBlockVerify,
971 VM_CtPerf, /* performance test */
972 VM_CtBlockRead64,
973 VM_CtBlockWrite64,
974 VM_CtBlockVerify64,
975 } AAC_VMCommand;
978 * "mountable object"
980 struct aac_mntobj {
981 u_int32_t ObjectId;
982 char FileSystemName[16];
983 struct aac_container_creation CreateInfo;
984 u_int32_t Capacity;
985 u_int32_t VolType;
986 u_int32_t ObjType;
987 u_int32_t ContentState;
988 #define FSCS_READONLY 0x0002 /* XXX need more information
989 * than this */
990 union {
991 u_int32_t pad[8];
992 } ObjExtension;
993 u_int32_t AlterEgoId;
994 } __attribute__ ((packed));
996 struct aac_mntinfo {
997 u_int32_t Command;
998 u_int32_t MntType;
999 u_int32_t MntCount;
1000 } __attribute__ ((packed));
1002 struct aac_mntinforesp {
1003 u_int32_t Status;
1004 u_int32_t MntType;
1005 u_int32_t MntRespCount;
1006 struct aac_mntobj MntTable[1];
1007 } __attribute__ ((packed));
1010 * Container shutdown command.
1012 struct aac_closecommand {
1013 u_int32_t Command;
1014 u_int32_t ContainerId;
1015 } __attribute__ ((packed));
1018 * Container Config Command
1020 #define CT_GET_SCSI_METHOD 64
1021 struct aac_ctcfg {
1022 u_int32_t Command;
1023 u_int32_t cmd;
1024 u_int32_t param;
1025 } __attribute__ ((packed));
1027 struct aac_ctcfg_resp {
1028 u_int32_t Status;
1029 u_int32_t resp;
1030 u_int32_t param;
1031 } __attribute__ ((packed));
1034 * 'Ioctl' commads
1036 #define AAC_SCSI_MAX_PORTS 10
1037 #define AAC_BUS_NO_EXIST 0
1038 #define AAC_BUS_VALID 1
1039 #define AAC_BUS_FAULTED 2
1040 #define AAC_BUS_DISABLED 3
1041 #define GetBusInfo 0x9
1043 struct aac_getbusinf {
1044 u_int32_t ProbeComplete;
1045 u_int32_t BusCount;
1046 u_int32_t TargetsPerBus;
1047 u_int8_t InitiatorBusId[AAC_SCSI_MAX_PORTS];
1048 u_int8_t BusValid[AAC_SCSI_MAX_PORTS];
1049 } __attribute__ ((packed));
1051 struct aac_vmioctl {
1052 u_int32_t Command;
1053 u_int32_t ObjType;
1054 u_int32_t MethId;
1055 u_int32_t ObjId;
1056 u_int32_t IoctlCmd;
1057 u_int32_t IoctlBuf[1]; /* Placeholder? */
1058 } __attribute__ ((packed));
1060 struct aac_vmi_businf_resp {
1061 u_int32_t Status;
1062 u_int32_t ObjType;
1063 u_int32_t MethId;
1064 u_int32_t ObjId;
1065 u_int32_t IoctlCmd;
1066 struct aac_getbusinf BusInf;
1067 } __attribute__ ((packed));
1069 #define AAC_BTL_TO_HANDLE(b, t, l) \
1070 (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf))
1071 #define GetDeviceProbeInfo 0x5
1073 struct aac_vmi_devinfo_resp {
1074 u_int32_t Status;
1075 u_int32_t ObjType;
1076 u_int32_t MethId;
1077 u_int32_t ObjId;
1078 u_int32_t IoctlCmd;
1079 u_int8_t VendorId[8];
1080 u_int8_t ProductId[16];
1081 u_int8_t ProductRev[4];
1082 u_int32_t Inquiry7;
1083 u_int32_t align1;
1084 u_int32_t Inquiry0;
1085 u_int32_t align2;
1086 u_int32_t Inquiry1;
1087 u_int32_t align3;
1088 u_int32_t reserved[2];
1089 u_int8_t VendorSpecific[20];
1090 u_int32_t Smart:1;
1091 u_int32_t AAC_Managed:1;
1092 u_int32_t align4;
1093 u_int32_t reserved2:6;
1094 u_int32_t Bus;
1095 u_int32_t Target;
1096 u_int32_t Lun;
1097 u_int32_t ultraEnable:1,
1098 disconnectEnable:1,
1099 fast20EnabledW:1,
1100 scamDevice:1,
1101 scamTolerant:1,
1102 setForSync:1,
1103 setForWide:1,
1104 syncDevice:1,
1105 wideDevice:1,
1106 reserved1:7,
1107 ScsiRate:8,
1108 ScsiOffset:8;
1109 }; /* Do not pack */
1111 #define ResetBus 0x16
1112 struct aac_resetbus {
1113 u_int32_t BusNumber;
1117 * Write 'stability' options.
1119 typedef enum {
1120 CSTABLE = 1,
1121 CUNSTABLE
1122 } AAC_CacheLevel;
1125 * Commit level response for a write request.
1127 typedef enum {
1128 CMFILE_SYNC_NVRAM = 1,
1129 CMDATA_SYNC_NVRAM,
1130 CMFILE_SYNC,
1131 CMDATA_SYNC,
1132 CMUNSTABLE
1133 } AAC_CommitLevel;
1136 * Block read/write operations.
1137 * These structures are packed into the 'data' area in the FIB.
1140 struct aac_blockread {
1141 u_int32_t Command; /* not FSACommand! */
1142 u_int32_t ContainerId;
1143 u_int32_t BlockNumber;
1144 u_int32_t ByteCount;
1145 struct aac_sg_table SgMap; /* variable size */
1146 } __attribute__ ((packed));
1148 struct aac_blockread_response {
1149 u_int32_t Status;
1150 u_int32_t ByteCount;
1151 } __attribute__ ((packed));
1153 struct aac_blockwrite {
1154 u_int32_t Command; /* not FSACommand! */
1155 u_int32_t ContainerId;
1156 u_int32_t BlockNumber;
1157 u_int32_t ByteCount;
1158 u_int32_t Stable;
1159 struct aac_sg_table SgMap; /* variable size */
1160 } __attribute__ ((packed));
1162 struct aac_blockwrite_response {
1163 u_int32_t Status;
1164 u_int32_t ByteCount;
1165 u_int32_t Committed;
1166 } __attribute__ ((packed));
1169 * Container shutdown command.
1171 struct aac_close_command {
1172 u_int32_t Command;
1173 u_int32_t ContainerId;
1177 * SCSI Passthrough structures
1179 struct aac_srb32 {
1180 u_int32_t function;
1181 u_int32_t bus;
1182 u_int32_t target;
1183 u_int32_t lun;
1184 u_int32_t timeout;
1185 u_int32_t flags;
1186 u_int32_t data_len;
1187 u_int32_t retry_limit;
1188 u_int32_t cdb_len;
1189 u_int8_t cdb[16];
1190 struct aac_sg_table sg_map32;
1193 enum {
1194 AAC_SRB_FUNC_EXECUTE_SCSI = 0x00,
1195 AAC_SRB_FUNC_CLAIM_DEVICE,
1196 AAC_SRB_FUNC_IO_CONTROL,
1197 AAC_SRB_FUNC_RECEIVE_EVENT,
1198 AAC_SRB_FUNC_RELEASE_QUEUE,
1199 AAC_SRB_FUNC_ATTACH_DEVICE,
1200 AAC_SRB_FUNC_RELEASE_DEVICE,
1201 AAC_SRB_FUNC_SHUTDOWN,
1202 AAC_SRB_FUNC_FLUSH,
1203 AAC_SRB_FUNC_ABORT_COMMAND = 0x10,
1204 AAC_SRB_FUNC_RELEASE_RECOVERY,
1205 AAC_SRB_FUNC_RESET_BUS,
1206 AAC_SRB_FUNC_RESET_DEVICE,
1207 AAC_SRB_FUNC_TERMINATE_IO,
1208 AAC_SRB_FUNC_FLUSH_QUEUE,
1209 AAC_SRB_FUNC_REMOVE_DEVICE,
1210 AAC_SRB_FUNC_DOMAIN_VALIDATION
1213 #define AAC_SRB_FLAGS_NO_DATA_XFER 0x0000
1214 #define AAC_SRB_FLAGS_DISABLE_DISCONNECT 0x0004
1215 #define AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER 0x0008
1216 #define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x0010
1217 #define AAC_SRB_FLAGS_DISABLE_AUTOSENSE 0x0020
1218 #define AAC_SRB_FLAGS_DATA_IN 0x0040
1219 #define AAC_SRB_FLAGS_DATA_OUT 0x0080
1220 #define AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \
1221 (AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT)
1223 #define AAC_HOST_SENSE_DATA_MAX 30
1225 struct aac_srb_response {
1226 u_int32_t fib_status;
1227 u_int32_t srb_status;
1228 u_int32_t scsi_status;
1229 u_int32_t data_len;
1230 u_int32_t sense_len;
1231 u_int8_t sense[AAC_HOST_SENSE_DATA_MAX];
1234 enum {
1235 AAC_SRB_STS_PENDING = 0x00,
1236 AAC_SRB_STS_SUCCESS,
1237 AAC_SRB_STS_ABORTED,
1238 AAC_SRB_STS_ABORT_FAILED,
1239 AAC_SRB_STS_ERROR,
1240 AAC_SRB_STS_BUSY,
1241 AAC_SRB_STS_INVALID_REQUEST,
1242 AAC_SRB_STS_INVALID_PATH_ID,
1243 AAC_SRB_STS_NO_DEVICE,
1244 AAC_SRB_STS_TIMEOUT,
1245 AAC_SRB_STS_SELECTION_TIMEOUT,
1246 AAC_SRB_STS_COMMAND_TIMEOUT,
1247 AAC_SRB_STS_MESSAGE_REJECTED = 0x0D,
1248 AAC_SRB_STS_BUS_RESET,
1249 AAC_SRB_STS_PARITY_ERROR,
1250 AAC_SRB_STS_REQUEST_SENSE_FAILED,
1251 AAC_SRB_STS_NO_HBA,
1252 AAC_SRB_STS_DATA_OVERRUN,
1253 AAC_SRB_STS_UNEXPECTED_BUS_FREE,
1254 AAC_SRB_STS_PHASE_SEQUENCE_FAILURE,
1255 AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH,
1256 AAC_SRB_STS_REQUEST_FLUSHED,
1257 AAC_SRB_STS_INVALID_LUN = 0x20,
1258 AAC_SRB_STS_INVALID_TARGET_ID,
1259 AAC_SRB_STS_BAD_FUNCTION,
1260 AAC_SRB_STS_ERROR_RECOVERY
1264 * Register set for adapters based on the Falcon bridge and PPC core
1267 #define AAC_FA_DOORBELL0_CLEAR 0x00
1268 #define AAC_FA_DOORBELL1_CLEAR 0x02
1269 #define AAC_FA_DOORBELL0 0x04
1270 #define AAC_FA_DOORBELL1 0x06
1271 #define AAC_FA_MASK0_CLEAR 0x08
1272 #define AAC_FA_MASK1_CLEAR 0x0a
1273 #define AAC_FA_MASK0 0x0c
1274 #define AAC_FA_MASK1 0x0e
1275 #define AAC_FA_MAILBOX 0x10
1276 #define AAC_FA_FWSTATUS 0x2c /* Mailbox 7 */
1277 #define AAC_FA_INTSRC 0x900
1279 #define AAC_FA_HACK(sc) (void)AAC_GETREG4(sc, AAC_FA_INTSRC)
1282 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
1283 * on the SA110 'StrongArm'.
1286 #define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */
1287 #define AAC_SA_DOORBELL0_SET 0x9c
1288 #define AAC_SA_DOORBELL0 0x9c
1289 #define AAC_SA_MASK0_CLEAR 0xa0
1290 #define AAC_SA_MASK0_SET 0xa4
1292 #define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */
1293 #define AAC_SA_DOORBELL1_SET 0x9e
1294 #define AAC_SA_DOORBELL1 0x9e
1295 #define AAC_SA_MASK1_CLEAR 0xa2
1296 #define AAC_SA_MASK1_SET 0xa6
1298 #define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */
1299 #define AAC_SA_FWSTATUS 0xc4
1302 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
1303 * and other related adapters.
1306 #define AAC_RX_IDBR 0x20 /* inbound doorbell register */
1307 #define AAC_RX_IISR 0x24 /* inbound interrupt status register */
1308 #define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */
1309 #define AAC_RX_ODBR 0x2c /* outbound doorbell register */
1310 #define AAC_RX_OISR 0x30 /* outbound interrupt status register */
1311 #define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */
1313 #define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */
1314 #define AAC_RX_FWSTATUS 0x6c
1317 * Common bit definitions for the doorbell registers.
1321 * Status bits in the doorbell registers.
1323 #define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */
1324 #define AAC_DB_COMMAND_READY (1<<1) /* posted one or more commands */
1325 #define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands complete */
1326 #define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */
1327 #define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */
1330 * The adapter can request the host print a message by setting the
1331 * DB_PRINTF flag in DOORBELL0. The driver responds by collecting the
1332 * message from the printf buffer, clearing the DB_PRINTF flag in
1333 * DOORBELL0 and setting it in DOORBELL1.
1334 * (ODBR and IDBR respectively for the i960Rx adapters)
1336 #define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */
1337 #define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */
1340 * Mask containing the interrupt bits we care about. We don't anticipate (or
1341 * want) interrupts not in this mask.
1343 #define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \
1344 AAC_DB_RESPONSE_READY | \
1345 AAC_DB_PRINTF)