2 * Copyright (c) 2000 Michael Smith
3 * Copyright (c) 2000-2001 Scott Long
4 * Copyright (c) 2000 BSDi
5 * Copyright (c) 2001 Adaptec, Inc.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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
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 $
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,
59 #define AAC_HOST_HIGH_CMD_ENTRIES 4 /* command adapter->host,
61 #define AAC_ADAP_NORM_CMD_ENTRIES 512 /* command host->adapter,
63 #define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* command host->adapter,
65 #define AAC_HOST_NORM_RESP_ENTRIES 512 /* response, adapter->host,
67 #define AAC_HOST_HIGH_RESP_ENTRIES 4 /* response, adapter->host,
69 #define AAC_ADAP_NORM_RESP_ENTRIES 8 /* response, host->adapter,
71 #define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* response, host->adapter,
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));
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 {
134 } __attribute__ ((packed));
137 * FIB (FSA Interface Block?); this is the datastructure passed between the host
140 struct aac_fib_header {
146 u_int16_t SenderSize;
147 u_int32_t SenderFibAddress;
148 u_int32_t ReceiverFibAddress;
149 u_int32_t SenderData;
152 u_int32_t ReceiverTimeStart;
153 u_int32_t ReceiverTimeDone;
155 struct aac_fib_list_entry FibLinks;
157 } __attribute__ ((packed));
159 #define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header))
162 struct aac_fib_header Header;
163 u_int8_t data[AAC_FIB_DATASIZE];
164 } __attribute__ ((packed));
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,
189 RequestPerfData = 125,
190 SetInterruptDefTimer= 126,
191 SetInterruptDefCount= 127,
192 GetInterruptDefStatus= 128,
193 LastCommCommand = 129,
195 /* filesystem commands */
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 */
214 FsaHostShutdown = 702,
215 RequestAdapterInfo = 703,
216 IsAdapterPaused = 704,
218 LastMiscCommand = 706
224 #define AAC_FIBTYPE_TFIB 1
225 #define AAC_FIBTYPE_TQE 2
226 #define AAC_FIBTYPE_TCTPERF 3
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)
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));
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 */
315 * Host-addressable object types
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 */
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 */
338 * Host-side scatter/gather list for 32-bit commands.
340 struct aac_sg_entry {
342 u_int32_t SgByteCount;
343 } __attribute__ ((packed));
345 struct aac_sg_table {
347 struct aac_sg_entry SgEntry[0];
348 } __attribute__ ((packed));
351 * Host-side scatter/gather list for 64-bit commands.
353 struct aac_sg_table64 {
355 u_int8_t SgSectorsPerPage;
356 u_int16_t SgByteOffset;
357 u_int64_t SgEntry[0];
358 } __attribute__ ((packed));
361 * Container creation data
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));
377 * Revision number handling
402 u_int32_t buildNumber;
403 } __attribute__ ((packed));
406 * Adapter Information
458 OEM_FLAVOR_ADAPTEC = 1,
470 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
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;
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
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
501 * Structure used to respond to a RequestAdapterInfo fib.
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
510 u_int32_t BufferMem; /* adapter Data Memory */
511 u_int32_t TotalMem; /* adapter Total Memory */
512 struct FsaRevision KernelRevision; /* adapter Kernel Software
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
524 AAC_OemFlavor OemVariant;
525 } __attribute__ ((packed));
528 * Monitor/Kernel interface.
532 * Synchronous commands to the monitor/kernel.
534 #define AAC_MONKER_INITSTRUCT 0x05
535 #define AAC_MONKER_SYNCFIB 0x0c
536 #define AAC_MONKER_GETKERNVER 0x11
537 #define AAC_MONKER_GETINFO 0x19
540 * Adapter Status Register
542 * Phase Staus mailbox is 32bits:
543 * <31:16> = Phase Status
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.
551 #define AAC_SELF_TEST_FAILED 0x00000004
552 #define AAC_UP_AND_RUNNING 0x00000080
553 #define AAC_KERNEL_PANIC 0x00000100
556 * Data types relating to control and monitoring of the NVRAM/WriteCache
560 #define AAC_NFILESYS 24 /* maximum number of filesystems */
563 * NVRAM/Write Cache subsystem states
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
571 NVSTATUS_UNKNOWN /* for bad/missing device */
575 * NVRAM/Write Cache subsystem battery component states
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
588 * Battery transition type
591 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not
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
597 } AAC_NVBATT_TRANSITION;
600 * NVRAM Info structure returned for NVRAM_GetInfo call
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
608 } __attribute__ ((packed));
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
615 u_int32_t NV_BufSize; /* size of NVRAM buffers in
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
622 u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */
623 struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device
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));
631 * Data types relating to adapter-initiated FIBs
633 * Based on types and structures in <aifstruc.h>
640 AifJobStsSuccess = 1,
644 AifJobStsLastReportMarker = 100, /* All prior mean last report */
650 AifJobScsiMin = 1, /* Minimum value for Scsi operation */
651 AifJobScsiZero, /* SCSI device clear operation */
652 AifJobScsiVerify, /* SCSI device Verify operation NO
654 AifJobScsiExercise, /* SCSI device Exercise operation */
655 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH
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
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 */
686 struct aac_AifContainers {
687 u_int32_t src; /* from/master */
688 u_int32_t dst; /* to/slave */
689 } __attribute__ ((packed));
691 union aac_AifJobClient {
692 struct aac_AifContainers container; /* For Container and
693 * file system progress
695 int32_t scsi_dh; /* For SCSI progress
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
704 union aac_AifJobClient client; /* Details */
705 } __attribute__ ((packed));
707 struct aac_AifJobProgressReport {
708 struct aac_AifJobDesc jd;
709 AAC_AifJobStatus status;
711 u_int32_t currentTick;
712 u_int32_t jobSpecificData1;
713 u_int32_t jobSpecificData2;
714 } __attribute__ ((packed));
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;
748 struct aac_AifEnsGeneric {
749 char text[132]; /* Generic text */
750 } __attribute__ ((packed));
752 struct aac_AifEnsDeviceFailure {
753 u_int32_t deviceHandle; /* SCSI device handle */
754 } __attribute__ ((packed));
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));
762 struct aac_AifEnsContainerChange {
763 u_int32_t container[2]; /* container that changed, -1 if no
765 } __attribute__ ((packed));
767 struct aac_AifEnsContainerEvent {
768 u_int32_t container; /* container number */
769 u_int32_t eventType; /* event type */
770 } __attribute__ ((packed));
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));
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));
785 struct aac_AifEnsDiskSetEvent {
789 } __attribute__ ((packed));
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;
801 struct aac_AifEnsClusterEvent {
802 AAC_ClusterAifEvent eventType;
803 } __attribute__ ((packed));
805 struct aac_AifEventNotify {
806 AAC_AifEventNotifyType type;
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;
819 } __attribute__ ((packed));
822 * Adapter Initiated FIB command structures. Start with the adapter
823 * initiated FIBs that really come from the adapter, and get responded
826 #define AAC_AIF_REPORT_MAX_SIZE 64
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 */
846 struct aac_aif_command {
847 AAC_AifCommand command; /* Tell host what type of
849 u_int32_t seqNumber; /* To allow ordering of
850 * reports (if necessary) */
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];
856 } __attribute__ ((packed));
859 * Filesystem commands/data
861 * The adapter has a very complex filesystem interface, most of which we ignore.
862 * (And which seems not to be implemented, anyway.)
911 * Command status values
937 ST_BADHANDLE = 10001,
939 ST_BAD_COOKIE = 10003,
942 ST_SERVERFAULT = 10006,
945 ST_NOTMOUNTED = 10009,
946 ST_MAINTMODE = 10010,
951 * Volume manager commands
953 typedef enum _VM_COMMANDS {
962 VM_SliceBlockRead, /* raw access to configured storage objects */
964 VM_DriveBlockRead, /* raw access to physical devices */
966 VM_EnclosureMgt, /* enclosure management */
967 VM_Unused, /* used to be diskset management */
969 VM_CtPerf, /* performance test */
980 char FileSystemName[16];
981 struct aac_container_creation CreateInfo;
985 u_int32_t ContentState;
986 #define FSCS_READONLY 0x0002 /* XXX need more information
991 u_int32_t AlterEgoId;
992 } __attribute__ ((packed));
998 } __attribute__ ((packed));
1000 struct aac_mntinforesp {
1003 u_int32_t MntRespCount;
1004 struct aac_mntobj MntTable[1];
1005 } __attribute__ ((packed));
1008 * Container shutdown command.
1010 struct aac_closecommand {
1012 u_int32_t ContainerId;
1013 } __attribute__ ((packed));
1016 * Container Config Command
1018 #define CT_GET_SCSI_METHOD 64
1023 } __attribute__ ((packed));
1025 struct aac_ctcfg_resp {
1029 } __attribute__ ((packed));
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
1041 struct aac_getbusinf {
1042 u_int32_t ProbeComplete;
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));
1049 struct aac_vmioctl {
1055 u_int32_t IoctlBuf[1]; /* Placeholder? */
1056 } __attribute__ ((packed));
1058 struct aac_vmi_businf_resp {
1064 struct aac_getbusinf BusInf;
1065 } __attribute__ ((packed));
1067 #define AAC_BTL_TO_HANDLE(b, t, l) \
1068 (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf))
1069 #define GetDeviceProbeInfo 0x5
1071 struct aac_vmi_devinfo_resp {
1077 u_int8_t VendorId[8];
1078 u_int8_t ProductId[16];
1079 u_int8_t ProductRev[4];
1086 u_int32_t reserved[2];
1087 u_int8_t VendorSpecific[20];
1089 u_int32_t AAC_Managed:1;
1091 u_int32_t reserved2:6;
1095 u_int32_t ultraEnable:1,
1107 }; /* Do not pack */
1109 #define ResetBus 0x16
1110 struct aac_resetbus {
1111 u_int32_t BusNumber;
1115 * Write 'stability' options.
1123 * Commit level response for a write request.
1126 CMFILE_SYNC_NVRAM = 1,
1134 * Block read/write operations.
1135 * These structures are packed into the 'data' area in the FIB.
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));
1146 struct aac_blockread_response {
1148 u_int32_t ByteCount;
1149 } __attribute__ ((packed));
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;
1157 struct aac_sg_table SgMap; /* variable size */
1158 } __attribute__ ((packed));
1160 struct aac_blockwrite_response {
1162 u_int32_t ByteCount;
1163 u_int32_t Committed;
1164 } __attribute__ ((packed));
1167 * Container shutdown command.
1169 struct aac_close_command {
1171 u_int32_t ContainerId;
1175 * SCSI Passthrough structures
1185 u_int32_t retry_limit;
1188 struct aac_sg_table sg_map32;
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,
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
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)
1221 #define AAC_HOST_SENSE_DATA_MAX 30
1223 struct aac_srb_response {
1224 u_int32_t fib_status;
1225 u_int32_t srb_status;
1226 u_int32_t scsi_status;
1228 u_int32_t sense_len;
1229 u_int8_t sense[AAC_HOST_SENSE_DATA_MAX];
1233 AAC_SRB_STS_PENDING = 0x00,
1234 AAC_SRB_STS_SUCCESS,
1235 AAC_SRB_STS_ABORTED,
1236 AAC_SRB_STS_ABORT_FAILED,
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,
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
1262 * Register set for adapters based on the Falcon bridge and PPC core
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
1277 #define AAC_FA_HACK(sc) (void)AAC_GETREG4(sc, AAC_FA_INTSRC)
1280 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
1281 * on the SA110 'StrongArm'.
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
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
1296 #define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */
1297 #define AAC_SA_FWSTATUS 0xc4
1300 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
1301 * and other related adapters.
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 */
1311 #define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */
1312 #define AAC_RX_FWSTATUS 0x6c
1315 * Common bit definitions for the doorbell registers.
1319 * Status bits in the doorbell registers.
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 */
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)
1334 #define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */
1335 #define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */
1338 * Mask containing the interrupt bits we care about. We don't anticipate (or
1339 * want) interrupts not in this mask.
1341 #define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \
1342 AAC_DB_RESPONSE_READY | \