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.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,
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
));
290 typedef u_int32_t aac_phys_addr_t
;
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 */
317 * Host-addressable object types
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 */
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 */
340 * Host-side scatter/gather list for 32-bit commands.
342 struct aac_sg_entry
{
344 u_int32_t SgByteCount
;
345 } __attribute__ ((packed
));
347 struct aac_sg_table
{
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
{
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
404 u_int32_t buildNumber
;
405 } __attribute__ ((packed
));
408 * Adapter Information
460 OEM_FLAVOR_ADAPTEC
= 1,
472 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
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
512 u_int32_t BufferMem
; /* adapter Data Memory */
513 u_int32_t TotalMem
; /* adapter Total Memory */
514 struct FsaRevision KernelRevision
; /* adapter Kernel Software
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
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
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
562 #define AAC_NFILESYS 24 /* maximum number of filesystems */
565 * NVRAM/Write Cache subsystem states
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
573 NVSTATUS_UNKNOWN
/* for bad/missing device */
577 * NVRAM/Write Cache subsystem battery component states
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
590 * Battery transition type
593 NVBATT_TRANSITION_NONE
= 0, /* battery now has no power or is not
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
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
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
617 u_int32_t NV_BufSize
; /* size of NVRAM buffers in
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
624 u_int32_t NV_NBrokered
; /* Num brokered NVRAM buffers */
625 struct aac_nvramdevinfo NV_DevInfo
[AAC_NFILESYS
]; /* per device
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>
642 AifJobStsSuccess
= 1,
646 AifJobStsLastReportMarker
= 100, /* All prior mean last report */
652 AifJobScsiMin
= 1, /* Minimum value for Scsi operation */
653 AifJobScsiZero
, /* SCSI device clear operation */
654 AifJobScsiVerify
, /* SCSI device Verify operation NO
656 AifJobScsiExercise
, /* SCSI device Exercise operation */
657 AifJobScsiVerifyRepair
, /* SCSI device Verify operation WITH
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
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 */
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
697 int32_t scsi_dh
; /* For SCSI progress
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
706 union aac_AifJobClient client
; /* Details */
707 } __attribute__ ((packed
));
709 struct aac_AifJobProgressReport
{
710 struct aac_AifJobDesc jd
;
711 AAC_AifJobStatus status
;
713 u_int32_t currentTick
;
714 u_int32_t jobSpecificData1
;
715 u_int32_t jobSpecificData2
;
716 } __attribute__ ((packed
));
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
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
{
791 } __attribute__ ((packed
));
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
;
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
;
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
828 #define AAC_AIF_REPORT_MAX_SIZE 64
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 */
848 struct aac_aif_command
{
849 AAC_AifCommand command
; /* Tell host what type of
851 u_int32_t seqNumber
; /* To allow ordering of
852 * reports (if necessary) */
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
];
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.)
913 * Command status values
939 ST_BADHANDLE
= 10001,
941 ST_BAD_COOKIE
= 10003,
944 ST_SERVERFAULT
= 10006,
947 ST_NOTMOUNTED
= 10009,
948 ST_MAINTMODE
= 10010,
953 * Volume manager commands
955 typedef enum _VM_COMMANDS
{
964 VM_SliceBlockRead
, /* raw access to configured storage objects */
966 VM_DriveBlockRead
, /* raw access to physical devices */
968 VM_EnclosureMgt
, /* enclosure management */
969 VM_Unused
, /* used to be diskset management */
971 VM_CtPerf
, /* performance test */
982 char FileSystemName
[16];
983 struct aac_container_creation CreateInfo
;
987 u_int32_t ContentState
;
988 #define FSCS_READONLY 0x0002 /* XXX need more information
993 u_int32_t AlterEgoId
;
994 } __attribute__ ((packed
));
1000 } __attribute__ ((packed
));
1002 struct aac_mntinforesp
{
1005 u_int32_t MntRespCount
;
1006 struct aac_mntobj MntTable
[1];
1007 } __attribute__ ((packed
));
1010 * Container shutdown command.
1012 struct aac_closecommand
{
1014 u_int32_t ContainerId
;
1015 } __attribute__ ((packed
));
1018 * Container Config Command
1020 #define CT_GET_SCSI_METHOD 64
1025 } __attribute__ ((packed
));
1027 struct aac_ctcfg_resp
{
1031 } __attribute__ ((packed
));
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
;
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
{
1057 u_int32_t IoctlBuf
[1]; /* Placeholder? */
1058 } __attribute__ ((packed
));
1060 struct aac_vmi_businf_resp
{
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
{
1079 u_int8_t VendorId
[8];
1080 u_int8_t ProductId
[16];
1081 u_int8_t ProductRev
[4];
1088 u_int32_t reserved
[2];
1089 u_int8_t VendorSpecific
[20];
1091 u_int32_t AAC_Managed
:1;
1093 u_int32_t reserved2
:6;
1097 u_int32_t ultraEnable
:1,
1109 }; /* Do not pack */
1111 #define ResetBus 0x16
1112 struct aac_resetbus
{
1113 u_int32_t BusNumber
;
1117 * Write 'stability' options.
1125 * Commit level response for a write request.
1128 CMFILE_SYNC_NVRAM
= 1,
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
{
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
;
1159 struct aac_sg_table SgMap
; /* variable size */
1160 } __attribute__ ((packed
));
1162 struct aac_blockwrite_response
{
1164 u_int32_t ByteCount
;
1165 u_int32_t Committed
;
1166 } __attribute__ ((packed
));
1169 * Container shutdown command.
1171 struct aac_close_command
{
1173 u_int32_t ContainerId
;
1177 * SCSI Passthrough structures
1187 u_int32_t retry_limit
;
1190 struct aac_sg_table sg_map32
;
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
,
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
;
1230 u_int32_t sense_len
;
1231 u_int8_t sense
[AAC_HOST_SENSE_DATA_MAX
];
1235 AAC_SRB_STS_PENDING
= 0x00,
1236 AAC_SRB_STS_SUCCESS
,
1237 AAC_SRB_STS_ABORTED
,
1238 AAC_SRB_STS_ABORT_FAILED
,
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
,
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 | \