diff options
author | Nathan Binkert <nate@cvs.openbsd.org> | 2005-11-18 05:39:11 +0000 |
---|---|---|
committer | Nathan Binkert <nate@cvs.openbsd.org> | 2005-11-18 05:39:11 +0000 |
commit | 8620825e8febd077391d828f94021b6ff2aa1147 (patch) | |
tree | 0d8f733c65d8b8ff4d6faef5d6164a500d01e426 /sys/dev/ic/aacreg.h | |
parent | ffcf7a60e15fc8961bad48280830a3f44a432212 (diff) |
Major improvements to the aac(4) device driver.
- decouple the command structures from scsi structures, allowing non block
oriented commands (e.g. management commands) to be built.
- redesign the various command queues to remove race conditions and to allow
commands from multiple sources to coexist in the system
- move major processing of commands and messages to a dedicated kernel
thread to avoid spending too long in the interrupt handler
- add device data structures for various management commands to the header
file
Much code from FreeBSD
Diffstat (limited to 'sys/dev/ic/aacreg.h')
-rw-r--r-- | sys/dev/ic/aacreg.h | 1426 |
1 files changed, 1040 insertions, 386 deletions
diff --git a/sys/dev/ic/aacreg.h b/sys/dev/ic/aacreg.h index 1a66fa1a28a..4557e1485e4 100644 --- a/sys/dev/ic/aacreg.h +++ b/sys/dev/ic/aacreg.h @@ -1,9 +1,10 @@ -/* $OpenBSD: aacreg.h,v 1.6 2004/05/21 20:34:52 marco Exp $ */ +/* $OpenBSD: aacreg.h,v 1.7 2005/11/18 05:39:10 nate Exp $ */ /*- * Copyright (c) 2000 Michael Smith - * Copyright (c) 2000 Scott Long + * Copyright (c) 2000-2001 Scott Long * Copyright (c) 2000 BSDi + * Copyright (c) 2001 Adaptec, Inc. * Copyright (c) 2000 Niklas Hallqvist * All rights reserved. * @@ -28,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: /c/ncvs/src/sys/dev/aac/aacreg.h,v 1.1 2000/09/13 03:20:34 msmith Exp $ + * $FreeBSD$ */ /* @@ -55,27 +56,37 @@ * We establish 4 command queues and matching response queues. Queues must * be 16-byte aligned, and are sized as follows: */ -#define AAC_HOST_NORM_CMD_ENTRIES 8 /* cmd adapter->host, normal pri */ -#define AAC_HOST_HIGH_CMD_ENTRIES 4 /* cmd adapter->host, high pri */ -#define AAC_ADAP_NORM_CMD_ENTRIES 512 /* cmd host->adapter, normal pri */ -#define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* cmd host->adapter, high pri */ -#define AAC_HOST_NORM_RESP_ENTRIES 512 /* resp, adapter->host, normal pri */ -#define AAC_HOST_HIGH_RESP_ENTRIES 4 /* resp, adapter->host, high pri */ -#define AAC_ADAP_NORM_RESP_ENTRIES 8 /* resp, host->adapter, normal pri */ -#define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* resp, host->adapter, high pri */ - -#define AAC_TOTALQ_LENGTH \ - (AAC_HOST_HIGH_CMD_ENTRIES + AAC_HOST_NORM_CMD_ENTRIES + \ - AAC_ADAP_HIGH_CMD_ENTRIES + AAC_ADAP_NORM_CMD_ENTRIES + \ - AAC_HOST_HIGH_RESP_ENTRIES + AAC_HOST_NORM_RESP_ENTRIES + \ - AAC_ADAP_HIGH_RESP_ENTRIES + AAC_ADAP_NORM_RESP_ENTRIES) - +#define AAC_HOST_NORM_CMD_ENTRIES 8 /* command adapter->host, + * normal priority */ +#define AAC_HOST_HIGH_CMD_ENTRIES 4 /* command adapter->host, + * high priority */ +#define AAC_ADAP_NORM_CMD_ENTRIES 512 /* command host->adapter, + * normal priority */ +#define AAC_ADAP_HIGH_CMD_ENTRIES 4 /* command host->adapter, + * high priority */ +#define AAC_HOST_NORM_RESP_ENTRIES 512 /* response, adapter->host, + * normal priority */ +#define AAC_HOST_HIGH_RESP_ENTRIES 4 /* response, adapter->host, + * high priority */ +#define AAC_ADAP_NORM_RESP_ENTRIES 8 /* response, host->adapter, + * normal priority */ +#define AAC_ADAP_HIGH_RESP_ENTRIES 4 /* response, host->adapter, + * high priority */ + +#define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \ + AAC_HOST_NORM_CMD_ENTRIES + \ + AAC_ADAP_HIGH_CMD_ENTRIES + \ + AAC_ADAP_NORM_CMD_ENTRIES + \ + AAC_HOST_HIGH_RESP_ENTRIES + \ + AAC_HOST_NORM_RESP_ENTRIES + \ + AAC_ADAP_HIGH_RESP_ENTRIES + \ + AAC_ADAP_NORM_RESP_ENTRIES) #define AAC_QUEUE_COUNT 8 #define AAC_QUEUE_ALIGN 16 struct aac_queue_entry { - u_int32_t aq_fib_size; /* FIB size in bytes */ - u_int32_t aq_fib_addr; /* receiver-space address of the FIB */ + u_int32_t aq_fib_size; /* FIB size in bytes */ + u_int32_t aq_fib_addr; /* receiver-space address of the FIB */ } __attribute__ ((__packed__)); #define AAC_PRODUCER_INDEX 0 @@ -87,48 +98,200 @@ struct aac_queue_entry { */ struct aac_queue_table { /* queue consumer/producer indexes (layout mandated by adapter) */ - u_int32_t qt_qindex[AAC_QUEUE_COUNT][2]; + u_int32_t qt_qindex[AAC_QUEUE_COUNT][2]; /* queue entry structures (layout mandated by adapter) */ - struct aac_queue_entry qt_HostNormCmdQueue[AAC_HOST_NORM_CMD_ENTRIES]; - struct aac_queue_entry qt_HostHighCmdQueue[AAC_HOST_HIGH_CMD_ENTRIES]; - struct aac_queue_entry qt_AdapNormCmdQueue[AAC_ADAP_NORM_CMD_ENTRIES]; - struct aac_queue_entry qt_AdapHighCmdQueue[AAC_ADAP_HIGH_CMD_ENTRIES]; - struct aac_queue_entry - qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES]; - struct aac_queue_entry - qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES]; - struct aac_queue_entry - qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES]; - struct aac_queue_entry - qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES]; + struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES]; + struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES]; + struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES]; + struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES]; + struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES]; + struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES]; + struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES]; + struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES]; +} __attribute__ ((__packed__)); + +/* + * Queue names + * + * Note that we base these at 0 in order to use them as array indices. Adaptec + * used base 1 for some unknown reason, and sorted them in a different order. + */ +#define AAC_HOST_NORM_CMD_QUEUE 0 +#define AAC_HOST_HIGH_CMD_QUEUE 1 +#define AAC_ADAP_NORM_CMD_QUEUE 2 +#define AAC_ADAP_HIGH_CMD_QUEUE 3 +#define AAC_HOST_NORM_RESP_QUEUE 4 +#define AAC_HOST_HIGH_RESP_QUEUE 5 +#define AAC_ADAP_NORM_RESP_QUEUE 6 +#define AAC_ADAP_HIGH_RESP_QUEUE 7 + +/* + * List structure used to chain FIBs (used by the adapter - we hang FIBs off + * our private command structure and don't touch these) + */ +struct aac_fib_list_entry { + u_int32_t Flink; + u_int32_t Blink; } __attribute__ ((__packed__)); /* + * FIB (FSA Interface Block?); this is the datastructure passed between the host + * and adapter. + */ +struct aac_fib_header { + u_int32_t XferState; + u_int16_t Command; + u_int8_t StructType; + u_int8_t Flags; + u_int16_t Size; + u_int16_t SenderSize; + u_int32_t SenderFibAddress; + u_int32_t ReceiverFibAddress; + u_int32_t SenderData; + union { + struct { + u_int32_t ReceiverTimeStart; + u_int32_t ReceiverTimeDone; + } _s; + struct aac_fib_list_entry FibLinks; + } _u; +} __attribute__ ((__packed__)); + +#define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header)) + +struct aac_fib { + struct aac_fib_header Header; + u_int8_t data[AAC_FIB_DATASIZE]; +} __attribute__ ((__packed__)); + +/* + * FIB commands + */ +typedef enum { + TestCommandResponse = 1, + TestAdapterCommand = 2, + + /* lowlevel and comm commands */ + LastTestCommand = 100, + ReinitHostNormCommandQueue = 101, + ReinitHostHighCommandQueue = 102, + ReinitHostHighRespQueue = 103, + ReinitHostNormRespQueue = 104, + ReinitAdapNormCommandQueue = 105, + ReinitAdapHighCommandQueue = 107, + ReinitAdapHighRespQueue = 108, + ReinitAdapNormRespQueue = 109, + InterfaceShutdown = 110, + DmaCommandFib = 120, + StartProfile = 121, + TermProfile = 122, + SpeedTest = 123, + TakeABreakPt = 124, + RequestPerfData = 125, + SetInterruptDefTimer= 126, + SetInterruptDefCount= 127, + GetInterruptDefStatus= 128, + LastCommCommand = 129, + + /* filesystem commands */ + NuFileSystem = 300, + UFS = 301, + HostFileSystem = 302, + LastFileSystemCommand = 303, + + /* Container Commands */ + ContainerCommand = 500, + ContainerCommand64 = 501, + + /* Cluster Commands */ + ClusterCommand = 550, + + /* Scsi Port commands (scsi passthrough) */ + ScsiPortCommand = 600, + + /* misc house keeping and generic adapter initiated commands */ + AifRequest = 700, + CheckRevision = 701, + FsaHostShutdown = 702, + RequestAdapterInfo = 703, + IsAdapterPaused = 704, + SendHostTime = 705, + LastMiscCommand = 706 +} AAC_FibCommands; + +/* + * FIB types + */ +#define AAC_FIBTYPE_TFIB 1 +#define AAC_FIBTYPE_TQE 2 +#define AAC_FIBTYPE_TCTPERF 3 + +/* + * FIB transfer state + */ +#define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */ +#define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */ +#define AAC_FIBSTATE_INITIALISED (1<<2) /* initialised */ +#define AAC_FIBSTATE_EMPTY (1<<3) /* empty */ +#define AAC_FIBSTATE_FROMPOOL (1<<4) /* allocated from pool */ +#define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */ +#define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */ +#define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */ +#define AAC_FIBSTATE_RNOTEXPECTED (1<<8) /* response is not expected */ +#define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */ +#define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */ +#define AAC_FIBSTATE_HIGH (1<<11) /* high priority */ +#define AAC_FIBSTATE_NORM (1<<12) /* normal priority */ +#define AAC_FIBSTATE_ASYNC (1<<13) +#define AAC_FIBSTATE_ASYNCIO (1<<13) /* to be removed */ +#define AAC_FIBSTATE_PAGEFILEIO (1<<14) /* to be removed */ +#define AAC_FIBSTATE_SHUTDOWN (1<<15) +#define AAC_FIBSTATE_LAZYWRITE (1<<16) /* to be removed */ +#define AAC_FIBSTATE_ADAPMICROFIB (1<<17) +#define AAC_FIBSTATE_BIOSFIB (1<<18) +#define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */ +#define AAC_FIBSTATE_APIFIB (1<<20) + +/* + * FIB error values + */ +#define AAC_ERROR_NORMAL 0x00 +#define AAC_ERROR_PENDING 0x01 +#define AAC_ERROR_FATAL 0x02 +#define AAC_ERROR_INVALID_QUEUE 0x03 +#define AAC_ERROR_NOENTRIES 0x04 +#define AAC_ERROR_SENDFAILED 0x05 +#define AAC_ERROR_INVALID_QUEUE_PRIORITY 0x06 +#define AAC_ERROR_FIB_ALLOCATION_FAILED 0x07 +#define AAC_ERROR_FIB_DEALLOCATION_FAILED 0x08 + +/* * Adapter Init Structure: this is passed to the adapter with the * AAC_MONKER_INITSTRUCT command to point it at our control structures. */ struct aac_adapter_init { - u_int32_t InitStructRevision; -#define AAC_INIT_STRUCT_REVISION 3 - u_int32_t MiniPortRevision; - u_int32_t FilesystemRevision; - u_int32_t CommHeaderAddress; - u_int32_t FastIoCommAreaAddress; - u_int32_t AdapterFibsPhysicalAddress; - void *AdapterFibsVirtualAddress; - u_int32_t AdapterFibsSize; - u_int32_t AdapterFibAlign; - u_int32_t PrintfBufferAddress; - u_int32_t PrintfBufferSize; - u_int32_t HostPhysMemPages; - u_int32_t HostElapsedSeconds; -} __packed; + u_int32_t InitStructRevision; +#define AAC_INIT_STRUCT_REVISION 3 + u_int32_t MiniPortRevision; +#define AAC_INIT_STRUCT_MINIPORT_REVISION 1 + u_int32_t FilesystemRevision; + u_int32_t CommHeaderAddress; + u_int32_t FastIoCommAreaAddress; + u_int32_t AdapterFibsPhysicalAddress; + u_int32_t AdapterFibsVirtualAddress; + u_int32_t AdapterFibsSize; + u_int32_t AdapterFibAlign; + u_int32_t PrintfBufferAddress; + u_int32_t PrintfBufferSize; +#define AAC_PAGE_SIZE 4096 + u_int32_t HostPhysMemPages; + u_int32_t HostElapsedSeconds; +} __attribute__ ((__packed__)); /* * Shared data types */ - /* * Container types */ @@ -146,7 +309,8 @@ typedef enum { CT_RAID10, /* stripe of mirror */ CT_RAID00, /* stripe of stripe */ CT_VOLUME_OF_MIRRORS, /* volume of mirror */ - CT_PSEUDO_RAID3 /* really raid4 */ + CT_PSEUDO_RAID3, /* really raid4 */ + CT_RAID50, /* stripe of raid5 */ } AAC_FSAVolType; /* @@ -161,9 +325,10 @@ typedef enum { FT_SOCK, /* socket */ FT_FIFO, /* fifo */ FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */ - FT_DRIVE, /* phys disk - addressable in scsi by bus/target/lun */ + FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */ FT_SLICE, /* virtual disk - raw volume - slice */ - FT_PARTITION, /* FSA part, inside slice, container building block */ + FT_PARTITION, /* FSA partition - carved out of a slice - building + * block for containers */ FT_VOLUME, /* Container - Volume Set */ FT_STRIPE, /* Container - Stripe Set */ FT_MIRROR, /* Container - Mirror Set */ @@ -175,53 +340,72 @@ typedef enum { * Host-side scatter/gather list for 32-bit commands. */ struct aac_sg_entry { - u_int32_t SgAddress; - u_int32_t SgByteCount; + u_int32_t SgAddress; + u_int32_t SgByteCount; +} __attribute__ ((__packed__)); + +struct aac_sg_entry64 { + u_int64_t SgAddress; + u_int32_t SgByteCount; } __attribute__ ((__packed__)); struct aac_sg_table { - u_int32_t SgCount; - struct aac_sg_entry SgEntry[0]; + u_int32_t SgCount; + struct aac_sg_entry SgEntry[0]; } __attribute__ ((__packed__)); /* * Host-side scatter/gather list for 64-bit commands. */ struct aac_sg_table64 { - u_int8_t SgCount; - u_int8_t SgSectorsPerPage; - u_int16_t SgByteOffset; - u_int64_t SgEntry[0]; + u_int32_t SgCount; + struct aac_sg_entry64 SgEntry64[0]; } __attribute__ ((__packed__)); /* * Container creation data */ struct aac_container_creation { - u_int8_t ViaBuildNumber; - u_int8_t MicroSecond; - u_int8_t Via; /* 1 = FSU, 2 = API, etc. */ - u_int8_t YearsSince1900; - u_int32_t Month:4; /* 1-12 */ - u_int32_t Day:6; /* 1-32 */ - u_int32_t Hour:6; /* 0-23 */ - u_int32_t Minute:6; /* 0-59 */ - u_int32_t Second:6; /* 0-59 */ - u_int64_t ViaAdapterSerialNumber; + u_int8_t ViaBuildNumber; + u_int8_t MicroSecond; + u_int8_t Via; /* 1 = FSU, 2 = API, etc. */ + u_int8_t YearsSince1900; + u_int32_t Month:4; /* 1-12 */ + u_int32_t Day:6; /* 1-32 */ + u_int32_t Hour:6; /* 0-23 */ + u_int32_t Minute:6; /* 0-59 */ + u_int32_t Second:6; /* 0-59 */ + u_int64_t ViaAdapterSerialNumber; } __attribute__ ((__packed__)); +/* + * Revision number handling + */ + +typedef enum { + RevApplication = 1, + RevDkiCli, + RevNetService, + RevApi, + RevFileSysDriver, + RevMiniportDriver, + RevAdapterSW, + RevMonitor, + RevRemoteApi +} RevComponent; + struct FsaRevision { union { - struct { - u_int8_t dash; - u_int8_t type; - u_int8_t minor; - u_int8_t major; - } comp; - u_int32_t ul; + struct { + u_int8_t dash; + u_int8_t type; + u_int8_t minor; + u_int8_t major; + } comp; + u_int32_t ul; } external; - u_int32_t buildNumber; -} __packed; + u_int32_t buildNumber; +} __attribute__ ((__packed__)); /* * Adapter Information @@ -246,7 +430,7 @@ typedef enum { CPUI960_RX, CPUARM_SA110, CPUARM_xxx, - CPUPPC_603e, + CPUMPC_824x, CPUPPC_xxx, CPUI960_302, CPUSUBTYPE__last @@ -291,7 +475,8 @@ typedef enum { /* * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT */ -typedef enum { +typedef enum +{ PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */ PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */ PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */ @@ -300,27 +485,50 @@ typedef enum { } AAC_BatteryPlatform; /* + * options supported by this board + * there has to be a one to one mapping of these defines and the ones in + * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT + */ +#define AAC_SUPPORTED_SNAPSHOT 0x01 +#define AAC_SUPPORTED_CLUSTERS 0x02 +#define AAC_SUPPORTED_WRITE_CACHE 0x04 +#define AAC_SUPPORTED_64BIT_DATA 0x08 +#define AAC_SUPPORTED_HOST_TIME_FIB 0x10 +#define AAC_SUPPORTED_RAID50 0x20 +#define AAC_SUPPORTED_4GB_WINDOW 0x40 +#define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80 +#define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100 +#define AAC_SUPPORTED_NOT_RECONDITION 0x200 +#define AAC_SUPPORTED_SGMAP_HOST64 0x400 +#define AAC_SUPPORTED_ALARM 0x800 +#define AAC_SUPPORTED_NONDASD 0x1000 + +/* * Structure used to respond to a RequestAdapterInfo fib. */ struct aac_adapter_info { - AAC_Platform PlatformBase; /* adapter type */ - AAC_CpuType CpuArchitecture; /* adapter CPU type */ - AAC_CpuSubType CpuVariant; /* adapter CPU subtype */ - u_int32_t ClockSpeed; /* adapter CPU clockspeed */ - u_int32_t ExecutionMem; /* adapter Execution Memory size */ - u_int32_t BufferMem; /* adapter Data Memory */ - u_int32_t TotalMem; /* adapter Total Memory */ - struct FsaRevision KernelRevision; /* adapter Kernel SW Revision */ - struct FsaRevision MonitorRevision; /* adapter Monitor/Diag SW Rev */ - struct FsaRevision HardwareRevision; /* TDB */ - struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ - u_int32_t ClusteringEnabled; - u_int32_t ClusterChannelMask; - u_int64_t SerialNumber; - AAC_BatteryPlatform batteryPlatform; - u_int32_t SupportedOptions; /* supported features of this ctrlr */ - AAC_OemFlavor OemVariant; -} __packed; + AAC_Platform PlatformBase; /* adapter type */ + AAC_CpuType CpuArchitecture; /* adapter CPU type */ + AAC_CpuSubType CpuVariant; /* adapter CPU subtype */ + u_int32_t ClockSpeed; /* adapter CPU clockspeed */ + u_int32_t ExecutionMem; /* adapter Execution Memory + * size */ + u_int32_t BufferMem; /* adapter Data Memory */ + u_int32_t TotalMem; /* adapter Total Memory */ + struct FsaRevision KernelRevision; /* adapter Kernel Software + * Revision */ + struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic + * Software Revision */ + struct FsaRevision HardwareRevision;/* TBD */ + struct FsaRevision BIOSRevision; /* adapter BIOS Revision */ + u_int32_t ClusteringEnabled; + u_int32_t ClusterChannelMask; + u_int64_t SerialNumber; + AAC_BatteryPlatform batteryPlatform; + u_int32_t SupportedOptions; /* supported features of this + * controller */ + AAC_OemFlavor OemVariant; +} __attribute__ ((__packed__)); /* * Monitor/Kernel interface. @@ -331,104 +539,588 @@ struct aac_adapter_info { */ #define AAC_MONKER_INITSTRUCT 0x05 #define AAC_MONKER_SYNCFIB 0x0c +#define AAC_MONKER_GETKERNVER 0x11 +#define AAC_MONKER_GETINFO 0x19 + +/* + * Adapter Status Register + * + * Phase Staus mailbox is 32bits: + * <31:16> = Phase Status + * <15:0> = Phase + * + * The adapter reports its present state through the phase. Only + * a single phase should be ever be set. Each phase can have multiple + * phase status bits to provide more detailed information about the + * state of the adapter. + */ +#define AAC_SELF_TEST_FAILED 0x00000004 +#define AAC_UP_AND_RUNNING 0x00000080 +#define AAC_KERNEL_PANIC 0x00000100 + +/* + * Data types relating to control and monitoring of the NVRAM/WriteCache + * subsystem. + */ + +#define AAC_NFILESYS 24 /* maximum number of filesystems */ + +/* + * NVRAM/Write Cache subsystem states + */ +typedef enum { + NVSTATUS_DISABLED = 0, /* present, clean, not being used */ + NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */ + NVSTATUS_ERROR, /* present, dirty, contains dirty data */ + NVSTATUS_BATTERY, /* present, bad or low battery, may contain + * dirty data */ + NVSTATUS_UNKNOWN /* for bad/missing device */ +} AAC_NVSTATUS; + +/* + * NVRAM/Write Cache subsystem battery component states + * + */ +typedef enum { + NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */ + NVBATTSTATUS_LOW, /* battery is low on power */ + NVBATTSTATUS_OK, /* battery is okay - normal operation possible + * only in this state */ + NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning + * in process */ +} AAC_NVBATTSTATUS; + +/* + * Battery transition type + */ +typedef enum { + NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not + * present */ + NVBATT_TRANSITION_LOW, /* battery is now low on power */ + NVBATT_TRANSITION_OK /* battery is now okay - normal + * operation possible only in this + * state */ +} AAC_NVBATT_TRANSITION; + +/* + * NVRAM Info structure returned for NVRAM_GetInfo call + */ +struct aac_nvramdevinfo { + u_int32_t NV_Enabled; /* write caching enabled */ + u_int32_t NV_Error; /* device in error state */ + u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */ + u_int32_t NV_NActive; /* count of NVRAM buffers being + * written */ +} __attribute__ ((__packed__)); + +struct aac_nvraminfo { + AAC_NVSTATUS NV_Status; /* nvram subsystem status */ + AAC_NVBATTSTATUS NV_BattStatus; /* battery status */ + u_int32_t NV_Size; /* size of WriteCache NVRAM in + * bytes */ + u_int32_t NV_BufSize; /* size of NVRAM buffers in + * bytes */ + u_int32_t NV_NBufs; /* number of NVRAM buffers */ + u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */ + u_int32_t NV_NClean; /* Num clean NVRAM buffers */ + u_int32_t NV_NActive; /* Num NVRAM buffers being + * written */ + u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */ + struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device + * info */ + u_int32_t NV_BattNeedsReconditioning; /* boolean */ + u_int32_t NV_TotalSize; /* size of all non-volatile + * memories in bytes */ +} __attribute__ ((__packed__)); + +/* + * Data types relating to adapter-initiated FIBs + * + * Based on types and structures in <aifstruc.h> + */ + +/* + * Progress Reports + */ +typedef enum { + AifJobStsSuccess = 1, + AifJobStsFinished, + AifJobStsAborted, + AifJobStsFailed, + AifJobStsLastReportMarker = 100, /* All prior mean last report */ + AifJobStsSuspended, + AifJobStsRunning +} AAC_AifJobStatus; + +typedef enum { + AifJobScsiMin = 1, /* Minimum value for Scsi operation */ + AifJobScsiZero, /* SCSI device clear operation */ + AifJobScsiVerify, /* SCSI device Verify operation NO + * REPAIR */ + AifJobScsiExercise, /* SCSI device Exercise operation */ + AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH + * repair */ + AifJobScsiMax = 99, /* Max Scsi value */ + AifJobCtrMin, /* Min Ctr op value */ + AifJobCtrZero, /* Container clear operation */ + AifJobCtrCopy, /* Container copy operation */ + AifJobCtrCreateMirror, /* Container Create Mirror operation */ + AifJobCtrMergeMirror, /* Container Merge Mirror operation */ + AifJobCtrScrubMirror, /* Container Scrub Mirror operation */ + AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */ + AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */ + AifJobCtrMorph, /* Container morph operation */ + AifJobCtrPartCopy, /* Container Partition copy operation */ + AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */ + AifJobCtrCrazyCache, /* crazy cache */ + AifJobCtrMax = 199, /* Max Ctr type operation */ + AifJobFsMin, /* Min Fs type operation */ + AifJobFsCreate, /* File System Create operation */ + AifJobFsVerify, /* File System Verify operation */ + AifJobFsExtend, /* File System Extend operation */ + AifJobFsMax = 299, /* Max Fs type operation */ + AifJobApiFormatNTFS, /* Format a drive to NTFS */ + AifJobApiFormatFAT, /* Format a drive to FAT */ + AifJobApiUpdateSnapshot, /* update the read/write half of a + * snapshot */ + AifJobApiFormatFAT32, /* Format a drive to FAT32 */ + AifJobApiMax = 399, /* Max API type operation */ + AifJobCtlContinuousCtrVerify, /* Adapter operation */ + AifJobCtlMax = 499 /* Max Adapter type operation */ +} AAC_AifJobType; + +struct aac_AifContainers { + u_int32_t src; /* from/master */ + u_int32_t dst; /* to/slave */ +} __attribute__ ((__packed__)); + +union aac_AifJobClient { + struct aac_AifContainers container; /* For Container and + * filesystem progress + * ops; */ + int32_t scsi_dh; /* For SCSI progress + * ops */ +}; + +struct aac_AifJobDesc { + u_int32_t jobID; /* DO NOT FILL IN! Will be + * filled in by AIF */ + AAC_AifJobType type; /* Operation that is being + * performed */ + union aac_AifJobClient client; /* Details */ +} __attribute__ ((__packed__)); + +struct aac_AifJobProgressReport { + struct aac_AifJobDesc jd; + AAC_AifJobStatus status; + u_int32_t finalTick; + u_int32_t currentTick; + u_int32_t jobSpecificData1; + u_int32_t jobSpecificData2; +} __attribute__ ((__packed__)); + +/* + * Event Notification + */ +typedef enum { + /* General application notifies start here */ + AifEnGeneric = 1, /* Generic notification */ + AifEnTaskComplete, /* Task has completed */ + AifEnConfigChange, /* Adapter config change occurred */ + AifEnContainerChange, /* Adapter specific container + * configuration change */ + AifEnDeviceFailure, /* SCSI device failed */ + AifEnMirrorFailover, /* Mirror failover started */ + AifEnContainerEvent, /* Significant container event */ + AifEnFileSystemChange, /* File system changed */ + AifEnConfigPause, /* Container pause event */ + AifEnConfigResume, /* Container resume event */ + AifEnFailoverChange, /* Failover space assignment changed */ + AifEnRAID5RebuildDone, /* RAID5 rebuild finished */ + AifEnEnclosureManagement, /* Enclosure management event */ + AifEnBatteryEvent, /* Significant NV battery event */ + AifEnAddContainer, /* A new container was created. */ + AifEnDeleteContainer, /* A container was deleted. */ + AifEnSMARTEvent, /* SMART Event */ + AifEnBatteryNeedsRecond, /* The battery needs reconditioning */ + AifEnClusterEvent, /* Some cluster event */ + AifEnDiskSetEvent, /* A disk set event occured. */ + AifDriverNotifyStart=199, /* Notifies for host driver go here */ + /* Host driver notifications start here */ + AifDenMorphComplete, /* A morph operation completed */ + AifDenVolumeExtendComplete /* Volume expand operation completed */ +} AAC_AifEventNotifyType; + +struct aac_AifEnsGeneric { + char text[132]; /* Generic text */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsDeviceFailure { + u_int32_t deviceHandle; /* SCSI device handle */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsMirrorFailover { + u_int32_t container; /* Container with failed element */ + u_int32_t failedSlice; /* Old slice which failed */ + u_int32_t creatingSlice; /* New slice used for auto-create */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsContainerChange { + u_int32_t container[2]; /* container that changed, -1 if no + * container */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsContainerEvent { + u_int32_t container; /* container number */ + u_int32_t eventType; /* event type */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsEnclosureEvent { + u_int32_t empID; /* enclosure management proc number */ + u_int32_t unitID; /* unitId, fan id, power supply id, + * slot id, tempsensor id. */ + u_int32_t eventType; /* event type */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsBatteryEvent { + AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */ + AAC_NVBATTSTATUS current_state; /* current batt state */ + AAC_NVBATTSTATUS prior_state; /* prev batt state */ +} __attribute__ ((__packed__)); + +struct aac_AifEnsDiskSetEvent { + u_int32_t eventType; + u_int64_t DsNum; + u_int64_t CreatorId; +} __attribute__ ((__packed__)); + +typedef enum { + CLUSTER_NULL_EVENT = 0, + CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or + * adaptername from NULL to non-NULL */ + /* (partner's agent may be up) */ + CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or + * adaptername from non-null to NULL */ + /* (partner has rebooted) */ +} AAC_ClusterAifEvent; + +struct aac_AifEnsClusterEvent { + AAC_ClusterAifEvent eventType; +} __attribute__ ((__packed__)); + +struct aac_AifEventNotify { + AAC_AifEventNotifyType type; + union { + struct aac_AifEnsGeneric EG; + struct aac_AifEnsDeviceFailure EDF; + struct aac_AifEnsMirrorFailover EMF; + struct aac_AifEnsContainerChange ECC; + struct aac_AifEnsContainerEvent ECE; + struct aac_AifEnsEnclosureEvent EEE; + struct aac_AifEnsBatteryEvent EBE; + struct aac_AifEnsDiskSetEvent EDS; +/* struct aac_AifEnsSMARTEvent ES;*/ + struct aac_AifEnsClusterEvent ECLE; + } data; +} __attribute__ ((__packed__)); + +/* + * Adapter Initiated FIB command structures. Start with the adapter + * initiated FIBs that really come from the adapter, and get responded + * to by the host. + */ +#define AAC_AIF_REPORT_MAX_SIZE 64 + +typedef enum { + AifCmdEventNotify = 1, /* Notify of event */ + AifCmdJobProgress, /* Progress report */ + AifCmdAPIReport, /* Report from other user of API */ + AifCmdDriverNotify, /* Notify host driver of event */ + AifReqJobList = 100, /* Gets back complete job list */ + AifReqJobsForCtr, /* Gets back jobs for specific container */ + AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */ + AifReqJobReport, /* Gets back a specific job report or list */ + AifReqTerminateJob, /* Terminates job */ + AifReqSuspendJob, /* Suspends a job */ + AifReqResumeJob, /* Resumes a job */ + AifReqSendAPIReport, /* API generic report requests */ + AifReqAPIJobStart, /* Start a job from the API */ + AifReqAPIJobUpdate, /* Update a job report from the API */ + AifReqAPIJobFinish /* Finish a job from the API */ +} AAC_AifCommand; + +struct aac_aif_command { + AAC_AifCommand command; /* Tell host what type of + * notify this is */ + u_int32_t seqNumber; /* To allow ordering of + * reports (if necessary) */ + union { + struct aac_AifEventNotify EN; /* Event notify */ + struct aac_AifJobProgressReport PR[1]; /* Progress report */ + u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE]; + u_int8_t data[AAC_FIB_DATASIZE - 8]; + } data; +} __attribute__ ((__packed__)); + +/* + * Filesystem commands/data + * + * The adapter has a very complex filesystem interface, most of which we ignore. + * (And which seems not to be implemented, anyway.) + */ + +/* + * FSA commands + * (not used?) + */ +typedef enum { + Null = 0, + GetAttributes, + SetAttributes, + Lookup, + ReadLink, + Read, + Write, + Create, + MakeDirectory, + SymbolicLink, + MakeNode, + Removex, + RemoveDirectory, + Rename, + Link, + ReadDirectory, + ReadDirectoryPlus, + FileSystemStatus, + FileSystemInfo, + PathConfigure, + Commit, + Mount, + UnMount, + Newfs, + FsCheck, + FsSync, + SimReadWrite, + SetFileSystemStatus, + BlockRead, + BlockWrite, + NvramIoctl, + FsSyncWait, + ClearArchiveBit, + SetAcl, + GetAcl, + AssignAcl, + FaultInsertion, + CrazyCache +} AAC_FSACommand; /* * Command status values */ typedef enum { - ST_OK = 0, - ST_PERM = 1, - ST_NOENT = 2, - ST_IO = 5, - ST_NXIO = 6, - ST_E2BIG = 7, - ST_ACCES = 13, - ST_EXIST = 17, - ST_XDEV = 18, - ST_NODEV = 19, - ST_NOTDIR = 20, - ST_ISDIR = 21, - ST_INVAL = 22, - ST_FBIG = 27, - ST_NOSPC = 28, - ST_ROFS = 30, - ST_MLINK = 31, - ST_WOULDBLOCK = 35, - ST_NAMETOOLONG = 63, - ST_NOTEMPTY = 66, - ST_DQUOT = 69, - ST_STALE = 70, - ST_REMOTE = 71, - ST_BADHANDLE = 10001, - ST_NOT_SYNC = 10002, - ST_BAD_COOKIE = 10003, - ST_NOTSUPP = 10004, - ST_TOOSMALL = 10005, - ST_SERVERFAULT = 10006, - ST_BADTYPE = 10007, - ST_JUKEBOX = 10008, - ST_NOTMOUNTED = 10009, - ST_MAINTMODE = 10010, - ST_STALEACL = 10011 + ST_OK = 0, + ST_PERM = 1, + ST_NOENT = 2, + ST_IO = 5, + ST_NXIO = 6, + ST_E2BIG = 7, + ST_ACCES = 13, + ST_EXIST = 17, + ST_XDEV = 18, + ST_NODEV = 19, + ST_NOTDIR = 20, + ST_ISDIR = 21, + ST_INVAL = 22, + ST_FBIG = 27, + ST_NOSPC = 28, + ST_ROFS = 30, + ST_MLINK = 31, + ST_WOULDBLOCK = 35, + ST_NAMETOOLONG = 63, + ST_NOTEMPTY = 66, + ST_DQUOT = 69, + ST_STALE = 70, + ST_REMOTE = 71, + ST_BADHANDLE = 10001, + ST_NOT_SYNC = 10002, + ST_BAD_COOKIE = 10003, + ST_NOTSUPP = 10004, + ST_TOOSMALL = 10005, + ST_SERVERFAULT = 10006, + ST_BADTYPE = 10007, + ST_JUKEBOX = 10008, + ST_NOTMOUNTED = 10009, + ST_MAINTMODE = 10010, + ST_STALEACL = 10011 } AAC_FSAStatus; /* * Volume manager commands */ typedef enum _VM_COMMANDS { - VM_Null = 0, - VM_NameServe, - VM_ContainerConfig, - VM_Ioctl, - VM_FilesystemIoctl, - VM_CloseAll, - VM_CtBlockRead, - VM_CtBlockWrite, - VM_SliceBlockRead, /* raw access to configured "storage objects" */ - VM_SliceBlockWrite, - VM_DriveBlockRead, /* raw access to physical devices */ - VM_DriveBlockWrite, - VM_EnclosureMgt, /* enclosure management */ - VM_Unused, /* used to be diskset management */ - VM_CtBlockVerify, - VM_CtPerf, /* performance test */ - VM_CtBlockRead64, - VM_CtBlockWrite64, - VM_CtBlockVerify64, + VM_Null = 0, + VM_NameServe, + VM_ContainerConfig, + VM_Ioctl, + VM_FilesystemIoctl, + VM_CloseAll, + VM_CtBlockRead, + VM_CtBlockWrite, + VM_SliceBlockRead, /* raw access to configured storage objects */ + VM_SliceBlockWrite, + VM_DriveBlockRead, /* raw access to physical devices */ + VM_DriveBlockWrite, + VM_EnclosureMgt, /* enclosure management */ + VM_Unused, /* used to be diskset management */ + VM_CtBlockVerify, + VM_CtPerf, /* performance test */ + VM_CtBlockRead64, + VM_CtBlockWrite64, + VM_CtBlockVerify64, + VM_CtHostRead64, + VM_CtHostWrite64, } AAC_VMCommand; /* - * "Mountable object" + * "mountable object" */ struct aac_mntobj { - u_int32_t ObjectId; - char FileSystemName[16]; - struct aac_container_creation CreateInfo; - u_int32_t Capacity; - AAC_FSAVolType VolType; - AAC_FType ObjType; - u_int32_t ContentState; -#define AAC_FSCS_READONLY 0x0002 /* XXX need more information than this */ + u_int32_t ObjectId; + char FileSystemName[16]; + struct aac_container_creation CreateInfo; + u_int32_t Capacity; + u_int32_t VolType; + u_int32_t ObjType; + u_int32_t ContentState; +#define FSCS_READONLY 0x0002 /* XXX need more information + * than this */ union { - u_int32_t pad[8]; + u_int32_t pad[8]; } ObjExtension; - u_int32_t AlterEgoId; + u_int32_t AlterEgoId; } __attribute__ ((__packed__)); struct aac_mntinfo { - AAC_VMCommand Command; - AAC_FType MntType; - u_int32_t MntCount; + u_int32_t Command; + u_int32_t MntType; + u_int32_t MntCount; } __attribute__ ((__packed__)); -struct aac_mntinforesponse { - AAC_FSAStatus Status; - AAC_FType MntType; - u_int32_t MntRespCount; - struct aac_mntobj MntTable[1]; +struct aac_mntinforesp { + u_int32_t Status; + u_int32_t MntType; + u_int32_t MntRespCount; + struct aac_mntobj MntTable[1]; } __attribute__ ((__packed__)); /* + * Container shutdown command. + */ +struct aac_closecommand { + u_int32_t Command; + u_int32_t ContainerId; +} __attribute__ ((__packed__)); + +/* + * Container Config Command + */ +#define CT_GET_SCSI_METHOD 64 +struct aac_ctcfg { + u_int32_t Command; + u_int32_t cmd; + u_int32_t param; +} __attribute__ ((__packed__)); + +struct aac_ctcfg_resp { + u_int32_t Status; + u_int32_t resp; + u_int32_t param; +} __attribute__ ((__packed__)); + +/* + * 'Ioctl' commads + */ +#define AAC_SCSI_MAX_PORTS 10 +#define AAC_BUS_NO_EXIST 0 +#define AAC_BUS_VALID 1 +#define AAC_BUS_FAULTED 2 +#define AAC_BUS_DISABLED 3 +#define GetBusInfo 0x9 + +struct aac_getbusinf { + u_int32_t ProbeComplete; + u_int32_t BusCount; + u_int32_t TargetsPerBus; + u_int8_t InitiatorBusId[AAC_SCSI_MAX_PORTS]; + u_int8_t BusValid[AAC_SCSI_MAX_PORTS]; +} __attribute__ ((__packed__)); + +struct aac_vmioctl { + u_int32_t Command; + u_int32_t ObjType; + u_int32_t MethId; + u_int32_t ObjId; + u_int32_t IoctlCmd; + u_int32_t IoctlBuf[1]; /* Placeholder? */ +} __attribute__ ((__packed__)); + +struct aac_vmi_businf_resp { + u_int32_t Status; + u_int32_t ObjType; + u_int32_t MethId; + u_int32_t ObjId; + u_int32_t IoctlCmd; + struct aac_getbusinf BusInf; +} __attribute__ ((__packed__)); + +#define AAC_BTL_TO_HANDLE(b, t, l) \ + (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf)) +#define GetDeviceProbeInfo 0x5 + +struct aac_vmi_devinfo_resp { + u_int32_t Status; + u_int32_t ObjType; + u_int32_t MethId; + u_int32_t ObjId; + u_int32_t IoctlCmd; + u_int8_t VendorId[8]; + u_int8_t ProductId[16]; + u_int8_t ProductRev[4]; + u_int32_t Inquiry7; + u_int32_t align1; + u_int32_t Inquiry0; + u_int32_t align2; + u_int32_t Inquiry1; + u_int32_t align3; + u_int32_t reserved[2]; + u_int8_t VendorSpecific[20]; + u_int32_t Smart:1; + u_int32_t AAC_Managed:1; + u_int32_t align4; + u_int32_t reserved2:6; + u_int32_t Bus; + u_int32_t Target; + u_int32_t Lun; + u_int32_t ultraEnable:1, + disconnectEnable:1, + fast20EnabledW:1, + scamDevice:1, + scamTolerant:1, + setForSync:1, + setForWide:1, + syncDevice:1, + wideDevice:1, + reserved1:7, + ScsiRate:8, + ScsiOffset:8; +}; /* Do not pack */ + +#define ResetBus 0x16 +struct aac_resetbus { + u_int32_t BusNumber; +}; + +/* * Write 'stability' options. */ typedef enum { @@ -453,68 +1145,199 @@ typedef enum { */ struct aac_blockread { - AAC_VMCommand Command; /* not FSACommand! */ - u_int32_t ContainerId; - u_int32_t BlockNumber; - u_int32_t ByteCount; - struct aac_sg_table SgMap; /* variable size */ + u_int32_t Command; /* not FSACommand! */ + u_int32_t ContainerId; + u_int32_t BlockNumber; + u_int32_t ByteCount; + struct aac_sg_table SgMap; /* variable size */ +} __attribute__ ((__packed__)); + +struct aac_blockread64 { + u_int32_t Command; + u_int16_t ContainerId; + u_int16_t SectorCount; + u_int32_t BlockNumber; + u_int16_t Pad; + u_int16_t Flags; + struct aac_sg_table64 SgMap64; } __attribute__ ((__packed__)); struct aac_blockread_response { - AAC_FSAStatus Status; - u_int32_t ByteCount; + u_int32_t Status; + u_int32_t ByteCount; } __attribute__ ((__packed__)); struct aac_blockwrite { - AAC_VMCommand Command; /* not FSACommand! */ - u_int32_t ContainerId; - u_int32_t BlockNumber; - u_int32_t ByteCount; - AAC_CacheLevel Stable; - struct aac_sg_table SgMap; /* variable size */ + u_int32_t Command; /* not FSACommand! */ + u_int32_t ContainerId; + u_int32_t BlockNumber; + u_int32_t ByteCount; + u_int32_t Stable; + struct aac_sg_table SgMap; /* variable size */ +} __attribute__ ((__packed__)); + +struct aac_blockwrite64 { + u_int32_t Command; /* not FSACommand! */ + u_int16_t ContainerId; + u_int16_t SectorCount; + u_int32_t BlockNumber; + u_int16_t Pad; + u_int16_t Flags; + struct aac_sg_table64 SgMap64; /* variable size */ } __attribute__ ((__packed__)); struct aac_blockwrite_response { - AAC_FSAStatus Status; - u_int32_t ByteCount; - AAC_CommitLevel Committed; + u_int32_t Status; + u_int32_t ByteCount; + u_int32_t Committed; } __attribute__ ((__packed__)); /* + * Container shutdown command. + */ +struct aac_close_command { + u_int32_t Command; + u_int32_t ContainerId; +}; + +/* + * SCSI Passthrough structures + */ +struct aac_srb32 { + u_int32_t function; + u_int32_t bus; + u_int32_t target; + u_int32_t lun; + u_int32_t timeout; + u_int32_t flags; + u_int32_t data_len; + u_int32_t retry_limit; + u_int32_t cdb_len; + u_int8_t cdb[16]; + struct aac_sg_table sg_map32; +}; + +enum { + AAC_SRB_FUNC_EXECUTE_SCSI = 0x00, + AAC_SRB_FUNC_CLAIM_DEVICE, + AAC_SRB_FUNC_IO_CONTROL, + AAC_SRB_FUNC_RECEIVE_EVENT, + AAC_SRB_FUNC_RELEASE_QUEUE, + AAC_SRB_FUNC_ATTACH_DEVICE, + AAC_SRB_FUNC_RELEASE_DEVICE, + AAC_SRB_FUNC_SHUTDOWN, + AAC_SRB_FUNC_FLUSH, + AAC_SRB_FUNC_ABORT_COMMAND = 0x10, + AAC_SRB_FUNC_RELEASE_RECOVERY, + AAC_SRB_FUNC_RESET_BUS, + AAC_SRB_FUNC_RESET_DEVICE, + AAC_SRB_FUNC_TERMINATE_IO, + AAC_SRB_FUNC_FLUSH_QUEUE, + AAC_SRB_FUNC_REMOVE_DEVICE, + AAC_SRB_FUNC_DOMAIN_VALIDATION +}; + +#define AAC_SRB_FLAGS_NO_DATA_XFER 0x0000 +#define AAC_SRB_FLAGS_DISABLE_DISCONNECT 0x0004 +#define AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER 0x0008 +#define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x0010 +#define AAC_SRB_FLAGS_DISABLE_AUTOSENSE 0x0020 +#define AAC_SRB_FLAGS_DATA_IN 0x0040 +#define AAC_SRB_FLAGS_DATA_OUT 0x0080 +#define AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \ + (AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT) + +#define AAC_HOST_SENSE_DATA_MAX 30 + +struct aac_srb_response { + u_int32_t fib_status; + u_int32_t srb_status; + u_int32_t scsi_status; + u_int32_t data_len; + u_int32_t sense_len; + u_int8_t sense[AAC_HOST_SENSE_DATA_MAX]; +}; + +enum { + AAC_SRB_STS_PENDING = 0x00, + AAC_SRB_STS_SUCCESS, + AAC_SRB_STS_ABORTED, + AAC_SRB_STS_ABORT_FAILED, + AAC_SRB_STS_ERROR, + AAC_SRB_STS_BUSY, + AAC_SRB_STS_INVALID_REQUEST, + AAC_SRB_STS_INVALID_PATH_ID, + AAC_SRB_STS_NO_DEVICE, + AAC_SRB_STS_TIMEOUT, + AAC_SRB_STS_SELECTION_TIMEOUT, + AAC_SRB_STS_COMMAND_TIMEOUT, + AAC_SRB_STS_MESSAGE_REJECTED = 0x0D, + AAC_SRB_STS_BUS_RESET, + AAC_SRB_STS_PARITY_ERROR, + AAC_SRB_STS_REQUEST_SENSE_FAILED, + AAC_SRB_STS_NO_HBA, + AAC_SRB_STS_DATA_OVERRUN, + AAC_SRB_STS_UNEXPECTED_BUS_FREE, + AAC_SRB_STS_PHASE_SEQUENCE_FAILURE, + AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH, + AAC_SRB_STS_REQUEST_FLUSHED, + AAC_SRB_STS_INVALID_LUN = 0x20, + AAC_SRB_STS_INVALID_TARGET_ID, + AAC_SRB_STS_BAD_FUNCTION, + AAC_SRB_STS_ERROR_RECOVERY +}; + +/* + * Register set for adapters based on the Falcon bridge and PPC core + */ + +#define AAC_FA_DOORBELL0_CLEAR 0x00 +#define AAC_FA_DOORBELL1_CLEAR 0x02 +#define AAC_FA_DOORBELL0 0x04 +#define AAC_FA_DOORBELL1 0x06 +#define AAC_FA_MASK0_CLEAR 0x08 +#define AAC_FA_MASK1_CLEAR 0x0a +#define AAC_FA_MASK0 0x0c +#define AAC_FA_MASK1 0x0e +#define AAC_FA_MAILBOX 0x10 +#define AAC_FA_FWSTATUS 0x2c /* Mailbox 7 */ +#define AAC_FA_INTSRC 0x900 + +#define AAC_FA_HACK(sc) (void)AAC_GETREG4(sc, AAC_FA_INTSRC) + +/* * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based * on the SA110 'StrongArm'. */ -#define AAC_REGSIZE 0x100 +#define AAC_REGSIZE 0x100 -/* doorbell 0 (adapter->host) */ -#define AAC_SA_DOORBELL0_CLEAR 0x98 -#define AAC_SA_DOORBELL0_SET 0x9c -#define AAC_SA_DOORBELL0 0x9c -#define AAC_SA_MASK0_CLEAR 0xa0 -#define AAC_SA_MASK0_SET 0xa4 +#define AAC_SA_DOORBELL0_CLEAR 0x98 /* doorbell 0 (adapter->host) */ +#define AAC_SA_DOORBELL0_SET 0x9c +#define AAC_SA_DOORBELL0 0x9c +#define AAC_SA_MASK0_CLEAR 0xa0 +#define AAC_SA_MASK0_SET 0xa4 -/* doorbell 1 (host->adapter) */ -#define AAC_SA_DOORBELL1_CLEAR 0x9a -#define AAC_SA_DOORBELL1_SET 0x9e -#define AAC_SA_MASK1_CLEAR 0xa2 -#define AAC_SA_MASK1_SET 0xa6 +#define AAC_SA_DOORBELL1_CLEAR 0x9a /* doorbell 1 (host->adapter) */ +#define AAC_SA_DOORBELL1_SET 0x9e +#define AAC_SA_DOORBELL1 0x9e +#define AAC_SA_MASK1_CLEAR 0xa2 +#define AAC_SA_MASK1_SET 0xa6 -/* mailbox (20 bytes) */ -#define AAC_SA_MAILBOX 0xa8 -#define AAC_SA_FWSTATUS 0xc4 +#define AAC_SA_MAILBOX 0xa8 /* mailbox (20 bytes) */ +#define AAC_SA_FWSTATUS 0xc4 /* - * Register definitions for the Adaptec 'Pablano' adapters, based on the - * i960Rx, and other related adapters. + * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx, + * and other related adapters. */ -#define AAC_RX_IDBR 0x20 /* inbound doorbell */ -#define AAC_RX_IISR 0x24 /* inbound interrupt status */ -#define AAC_RX_IIMR 0x28 /* inbound interrupt mask */ -#define AAC_RX_ODBR 0x2c /* outbound doorbell */ -#define AAC_RX_OISR 0x30 /* outbound interrupt status */ -#define AAC_RX_OIMR 0x34 /* outbound interrupt mask */ +#define AAC_RX_IDBR 0x20 /* inbound doorbell register */ +#define AAC_RX_IISR 0x24 /* inbound interrupt status register */ +#define AAC_RX_IIMR 0x28 /* inbound interrupt mask register */ +#define AAC_RX_ODBR 0x2c /* outbound doorbell register */ +#define AAC_RX_OISR 0x30 /* outbound interrupt status register */ +#define AAC_RX_OIMR 0x34 /* outbound interrupt mask register */ #define AAC_RX_MAILBOX 0x50 /* mailbox (20 bytes) */ #define AAC_RX_FWSTATUS 0x6c @@ -539,182 +1362,13 @@ struct aac_blockwrite_response { * DOORBELL0 and setting it in DOORBELL1. * (ODBR and IDBR respectively for the i960Rx adapters) */ -#define AAC_DB_PRINTF (1<<5) - -/* - * Mask containing the interrupt bits we care about. We don't anticipate - * (or want) interrupts not in this mask. - */ -#define AAC_DB_INTERRUPTS \ - (AAC_DB_COMMAND_READY | AAC_DB_RESPONSE_READY | AAC_DB_PRINTF) - -/* - * Queue names - * - * Note that we base these at 0 in order to use them as array indices. Adaptec - * used base 1 for some unknown reason, and sorted them in a different order. - */ -#define AAC_HOST_NORM_CMD_QUEUE 0 -#define AAC_HOST_HIGH_CMD_QUEUE 1 -#define AAC_ADAP_NORM_CMD_QUEUE 2 -#define AAC_ADAP_HIGH_CMD_QUEUE 3 -#define AAC_HOST_NORM_RESP_QUEUE 4 -#define AAC_HOST_HIGH_RESP_QUEUE 5 -#define AAC_ADAP_NORM_RESP_QUEUE 6 -#define AAC_ADAP_HIGH_RESP_QUEUE 7 - -/* - * List structure used to chain FIBs (used by the adapter - we hang FIBs off - * our private command structure and don't touch these) - */ -struct aac_fib_list_entry { - struct fib_list_entry *Flink; - struct fib_list_entry *Blink; -} __packed; - -/* - * FIB (FSA Interface Block?); this is the datastructure passed between the - * host and adapter. - */ -struct aac_fib_header { - u_int32_t XferState; - u_int16_t Command; - u_int8_t StructType; - u_int8_t Flags; - u_int16_t Size; - u_int16_t SenderSize; - u_int32_t SenderFibAddress; - u_int32_t ReceiverFibAddress; - u_int32_t SenderData; - union { - struct { - u_int32_t ReceiverTimeStart; - u_int32_t ReceiverTimeDone; - } _s; - struct aac_fib_list_entry FibLinks; - } _u; -} __packed; - -#define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header)) - -struct aac_fib { - struct aac_fib_header Header; - u_int8_t data[AAC_FIB_DATASIZE]; -} __packed; - -/* - * FIB commands - */ -typedef enum { - TestCommandResponse = 1, - TestAdapterCommand = 2, - - /* lowlevel and comm commands */ - LastTestCommand = 100, - ReinitHostNormCommandQueue = 101, - ReinitHostHighCommandQueue = 102, - ReinitHostHighRespQueue = 103, - ReinitHostNormRespQueue = 104, - ReinitAdapNormCommandQueue = 105, - ReinitAdapHighCommandQueue = 107, - ReinitAdapHighRespQueue = 108, - ReinitAdapNormRespQueue = 109, - InterfaceShutdown = 110, - DmaCommandFib = 120, - StartProfile = 121, - TermProfile = 122, - SpeedTest = 123, - TakeABreakPt = 124, - RequestPerfData = 125, - SetInterruptDefTimer= 126, - SetInterruptDefCount= 127, - GetInterruptDefStatus= 128, - LastCommCommand = 129, - - /* filesystem commands */ - NuFileSystem = 300, - UFS = 301, - HostFileSystem = 302, - LastFileSystemCommand = 303, - - /* Container Commands */ - ContainerCommand = 500, - ContainerCommand64 = 501, - - /* Cluster Commands */ - ClusterCommand = 550, - - /* Scsi Port commands (scsi passthrough) */ - ScsiPortCommand = 600, - - /* misc house keeping and generic adapter initiated commands */ - AifRequest = 700, - CheckRevision = 701, - FsaHostShutdown = 702, - RequestAdapterInfo = 703, - IsAdapterPaused = 704, - SendHostTime = 705, - LastMiscCommand = 706 -} AAC_FibCommands; +#define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */ +#define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */ /* - * FIB types - */ -#define AAC_FIBTYPE_TFIB 1 -#define AAC_FIBTYPE_TQE 2 -#define AAC_FIBTYPE_TCTPERF 3 - -/* - * FIB transfer state + * Mask containing the interrupt bits we care about. We don't anticipate (or + * want) interrupts not in this mask. */ -#define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */ -#define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */ -#define AAC_FIBSTATE_INITIALISED (1<<2) /* initialised */ -#define AAC_FIBSTATE_EMPTY (1<<3) /* empty */ -#define AAC_FIBSTATE_FROMPOOL (1<<4) /* allocated from pool */ -#define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */ -#define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */ -#define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */ -#define AAC_FIBSTATE_RNOTEXPECTED (1<<8) /* response is not expected */ -#define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */ -#define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */ -#define AAC_FIBSTATE_HIGH (1<<11) /* high priority */ -#define AAC_FIBSTATE_NORM (1<<12) /* normal priority */ -#define AAC_FIBSTATE_ASYNC (1<<13) -#define AAC_FIBSTATE_ASYNCIO (1<<13) /* to be removed */ -#define AAC_FIBSTATE_PAGEFILEIO (1<<14) /* to be removed */ -#define AAC_FIBSTATE_SHUTDOWN (1<<15) -#define AAC_FIBSTATE_LAZYWRITE (1<<16) /* to be removed */ -#define AAC_FIBSTATE_ADAPMICROFIB (1<<17) -#define AAC_FIBSTATE_BIOSFIB (1<<18) -#define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */ -#define AAC_FIBSTATE_APIFIB (1<<20) - -/* - * FIB error values - */ -#define AAC_ERROR_NORMAL 0x00 -#define AAC_ERROR_PENDING 0x01 -#define AAC_ERROR_FATAL 0x02 -#define AAC_ERROR_INVALID_QUEUE 0x03 -#define AAC_ERROR_NOENTRIES 0x04 -#define AAC_ERROR_SENDFAILED 0x05 -#define AAC_ERROR_INVALID_QUEUE_PRIORITY 0x06 -#define AAC_ERROR_FIB_ALLOCATION_FAILED 0x07 -#define AAC_ERROR_FIB_DEALLOCATION_FAILED 0x08 - -/* - * Adapter Status Register - * - * Phase Staus mailbox is 32bits: - * <31:16> = Phase Status - * <15:0> = Phase - * - * The adapter reports its present state through the phase. Only - * a single phase should be ever be set. Each phase can have multiple - * phase status bits to provide more detailed information about the - * state of the adapter. - */ -#define AAC_SELF_TEST_FAILED 0x00000004 -#define AAC_UP_AND_RUNNING 0x00000080 -#define AAC_KERNEL_PANIC 0x00000100 +#define AAC_DB_INTERRUPTS (AAC_DB_COMMAND_READY | \ + AAC_DB_RESPONSE_READY | \ + AAC_DB_PRINTF) |