xref: /openbsd/sys/dev/ic/aacreg.h (revision c4d1da1f)
1*c4d1da1fSniklas /*	$OpenBSD: aacreg.h,v 1.1 2000/11/10 09:39:36 niklas Exp $	*/
2*c4d1da1fSniklas 
3*c4d1da1fSniklas /*-
4*c4d1da1fSniklas  * Copyright (c) 2000 Michael Smith
5*c4d1da1fSniklas  * Copyright (c) 2000 Scott Long
6*c4d1da1fSniklas  * Copyright (c) 2000 BSDi
7*c4d1da1fSniklas  * Copyright (c) 2000 Niklas Hallqvist
8*c4d1da1fSniklas  * All rights reserved.
9*c4d1da1fSniklas  *
10*c4d1da1fSniklas  * Redistribution and use in source and binary forms, with or without
11*c4d1da1fSniklas  * modification, are permitted provided that the following conditions
12*c4d1da1fSniklas  * are met:
13*c4d1da1fSniklas  * 1. Redistributions of source code must retain the above copyright
14*c4d1da1fSniklas  *    notice, this list of conditions and the following disclaimer.
15*c4d1da1fSniklas  * 2. Redistributions in binary form must reproduce the above copyright
16*c4d1da1fSniklas  *    notice, this list of conditions and the following disclaimer in the
17*c4d1da1fSniklas  *    documentation and/or other materials provided with the distribution.
18*c4d1da1fSniklas  *
19*c4d1da1fSniklas  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20*c4d1da1fSniklas  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*c4d1da1fSniklas  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*c4d1da1fSniklas  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23*c4d1da1fSniklas  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*c4d1da1fSniklas  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*c4d1da1fSniklas  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*c4d1da1fSniklas  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*c4d1da1fSniklas  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*c4d1da1fSniklas  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*c4d1da1fSniklas  * SUCH DAMAGE.
30*c4d1da1fSniklas  *
31*c4d1da1fSniklas  *	$FreeBSD: /c/ncvs/src/sys/dev/aac/aacreg.h,v 1.1 2000/09/13 03:20:34 msmith Exp $
32*c4d1da1fSniklas  */
33*c4d1da1fSniklas 
34*c4d1da1fSniklas /*
35*c4d1da1fSniklas  * Data structures defining the interface between the driver and the Adaptec
36*c4d1da1fSniklas  * 'FSA' adapters.  Note that many field names and comments here are taken
37*c4d1da1fSniklas  * verbatim from the Adaptec driver source in order to make comparing the
38*c4d1da1fSniklas  * two slightly easier.
39*c4d1da1fSniklas  */
40*c4d1da1fSniklas 
41*c4d1da1fSniklas /*
42*c4d1da1fSniklas  * Misc. magic numbers.
43*c4d1da1fSniklas  */
44*c4d1da1fSniklas #define AAC_MAX_CONTAINERS	64
45*c4d1da1fSniklas #define AAC_BLOCK_SIZE		512
46*c4d1da1fSniklas 
47*c4d1da1fSniklas /*
48*c4d1da1fSniklas  * Communications interface.
49*c4d1da1fSniklas  *
50*c4d1da1fSniklas  * Where datastructure layouts are closely parallel to the Adaptec sample code,
51*c4d1da1fSniklas  * retain their naming conventions (for now) to aid in cross-referencing.
52*c4d1da1fSniklas  */
53*c4d1da1fSniklas 
54*c4d1da1fSniklas /*
55*c4d1da1fSniklas  * We establish 4 command queues and matching response queues.  Queues must
56*c4d1da1fSniklas  * be 16-byte aligned, and are sized as follows:
57*c4d1da1fSniklas  */
58*c4d1da1fSniklas #define AAC_HOST_NORM_CMD_ENTRIES 8	/* cmd adapter->host, normal pri */
59*c4d1da1fSniklas #define AAC_HOST_HIGH_CMD_ENTRIES 4	/* cmd adapter->host, high pri */
60*c4d1da1fSniklas #define AAC_ADAP_NORM_CMD_ENTRIES 512	/* cmd host->adapter, normal pri */
61*c4d1da1fSniklas #define AAC_ADAP_HIGH_CMD_ENTRIES 4	/* cmd host->adapter, high pri */
62*c4d1da1fSniklas #define AAC_HOST_NORM_RESP_ENTRIES 512	/* resp, adapter->host, normal pri */
63*c4d1da1fSniklas #define AAC_HOST_HIGH_RESP_ENTRIES 4	/* resp, adapter->host, high pri */
64*c4d1da1fSniklas #define AAC_ADAP_NORM_RESP_ENTRIES 8	/* resp, host->adapter, normal pri */
65*c4d1da1fSniklas #define AAC_ADAP_HIGH_RESP_ENTRIES 4	/* resp, host->adapter, high pri */
66*c4d1da1fSniklas 
67*c4d1da1fSniklas #define AAC_TOTALQ_LENGTH \
68*c4d1da1fSniklas     (AAC_HOST_HIGH_CMD_ENTRIES + AAC_HOST_NORM_CMD_ENTRIES + \
69*c4d1da1fSniklas     AAC_ADAP_HIGH_CMD_ENTRIES +	AAC_ADAP_NORM_CMD_ENTRIES + \
70*c4d1da1fSniklas     AAC_HOST_HIGH_RESP_ENTRIES + AAC_HOST_NORM_RESP_ENTRIES + \
71*c4d1da1fSniklas     AAC_ADAP_HIGH_RESP_ENTRIES + AAC_ADAP_NORM_RESP_ENTRIES)
72*c4d1da1fSniklas 
73*c4d1da1fSniklas #define AAC_QUEUE_COUNT		8
74*c4d1da1fSniklas #define AAC_QUEUE_ALIGN		16
75*c4d1da1fSniklas 
76*c4d1da1fSniklas struct aac_queue_entry {
77*c4d1da1fSniklas 	u_int32_t aq_fib_size;		/* FIB size in bytes */
78*c4d1da1fSniklas 	u_int32_t aq_fib_addr;		/* receiver-space address of the FIB */
79*c4d1da1fSniklas } __attribute__ ((packed));
80*c4d1da1fSniklas 
81*c4d1da1fSniklas #define AAC_PRODUCER_INDEX	0
82*c4d1da1fSniklas #define AAC_CONSUMER_INDEX	1
83*c4d1da1fSniklas 
84*c4d1da1fSniklas /*
85*c4d1da1fSniklas  * Table of queue indices and queues used to communicate with the
86*c4d1da1fSniklas  * controller.  This structure must be aligned to AAC_QUEUE_ALIGN
87*c4d1da1fSniklas  */
88*c4d1da1fSniklas struct aac_queue_table {
89*c4d1da1fSniklas 	/* queue consumer/producer indexes (layout mandated by adapter) */
90*c4d1da1fSniklas 	u_int32_t qt_qindex[AAC_QUEUE_COUNT][2];
91*c4d1da1fSniklas 
92*c4d1da1fSniklas 	/* queue entry structures (layout mandated by adapter) */
93*c4d1da1fSniklas 	struct aac_queue_entry qt_HostNormCmdQueue[AAC_HOST_NORM_CMD_ENTRIES];
94*c4d1da1fSniklas 	struct aac_queue_entry qt_HostHighCmdQueue[AAC_HOST_HIGH_CMD_ENTRIES];
95*c4d1da1fSniklas 	struct aac_queue_entry qt_AdapNormCmdQueue[AAC_ADAP_NORM_CMD_ENTRIES];
96*c4d1da1fSniklas 	struct aac_queue_entry qt_AdapHighCmdQueue[AAC_ADAP_HIGH_CMD_ENTRIES];
97*c4d1da1fSniklas 	struct aac_queue_entry
98*c4d1da1fSniklas 	    qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES];
99*c4d1da1fSniklas 	struct aac_queue_entry
100*c4d1da1fSniklas 	    qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES];
101*c4d1da1fSniklas 	struct aac_queue_entry
102*c4d1da1fSniklas 	    qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES];
103*c4d1da1fSniklas 	struct aac_queue_entry
104*c4d1da1fSniklas 	    qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES];
105*c4d1da1fSniklas } __attribute__ ((packed));
106*c4d1da1fSniklas 
107*c4d1da1fSniklas /*
108*c4d1da1fSniklas  * Adapter Init Structure: this is passed to the adapter with the
109*c4d1da1fSniklas  * AAC_MONKER_INITSTRUCT command to point it at our control structures.
110*c4d1da1fSniklas  */
111*c4d1da1fSniklas struct aac_adapter_init {
112*c4d1da1fSniklas 	u_int32_t InitStructRevision;
113*c4d1da1fSniklas #define AAC_INIT_STRUCT_REVISION	3
114*c4d1da1fSniklas 	u_int32_t MiniPortRevision;
115*c4d1da1fSniklas 	u_int32_t FilesystemRevision;
116*c4d1da1fSniklas 	u_int32_t CommHeaderAddress;
117*c4d1da1fSniklas 	u_int32_t FastIoCommAreaAddress;
118*c4d1da1fSniklas 	u_int32_t AdapterFibsPhysicalAddress;
119*c4d1da1fSniklas 	void	*AdapterFibsVirtualAddress;
120*c4d1da1fSniklas 	u_int32_t AdapterFibsSize;
121*c4d1da1fSniklas 	u_int32_t AdapterFibAlign;
122*c4d1da1fSniklas 	u_int32_t PrintfBufferAddress;
123*c4d1da1fSniklas 	u_int32_t PrintfBufferSize;
124*c4d1da1fSniklas 	u_int32_t HostPhysMemPages;
125*c4d1da1fSniklas 	u_int32_t HostElapsedSeconds;
126*c4d1da1fSniklas } __attribute__((packed));
127*c4d1da1fSniklas 
128*c4d1da1fSniklas /*
129*c4d1da1fSniklas  * Shared data types
130*c4d1da1fSniklas  */
131*c4d1da1fSniklas 
132*c4d1da1fSniklas /*
133*c4d1da1fSniklas  * Container types
134*c4d1da1fSniklas  */
135*c4d1da1fSniklas typedef enum {
136*c4d1da1fSniklas 	CT_NONE = 0,
137*c4d1da1fSniklas 	CT_VOLUME,
138*c4d1da1fSniklas 	CT_MIRROR,
139*c4d1da1fSniklas 	CT_STRIPE,
140*c4d1da1fSniklas 	CT_RAID5,
141*c4d1da1fSniklas 	CT_SSRW,
142*c4d1da1fSniklas 	CT_SSRO,
143*c4d1da1fSniklas 	CT_MORPH,
144*c4d1da1fSniklas 	CT_PASSTHRU,
145*c4d1da1fSniklas 	CT_RAID4,
146*c4d1da1fSniklas 	CT_RAID10,                  /* stripe of mirror */
147*c4d1da1fSniklas 	CT_RAID00,                  /* stripe of stripe */
148*c4d1da1fSniklas 	CT_VOLUME_OF_MIRRORS,       /* volume of mirror */
149*c4d1da1fSniklas 	CT_PSEUDO_RAID3,            /* really raid4 */
150*c4d1da1fSniklas } AAC_FSAVolType;
151*c4d1da1fSniklas 
152*c4d1da1fSniklas /*
153*c4d1da1fSniklas  * Host-addressable object types
154*c4d1da1fSniklas  */
155*c4d1da1fSniklas typedef enum {
156*c4d1da1fSniklas 	FT_REG = 1,     /* regular file */
157*c4d1da1fSniklas 	FT_DIR,         /* directory */
158*c4d1da1fSniklas 	FT_BLK,         /* "block" device - reserved */
159*c4d1da1fSniklas 	FT_CHR,         /* "character special" device - reserved */
160*c4d1da1fSniklas 	FT_LNK,         /* symbolic link */
161*c4d1da1fSniklas 	FT_SOCK,        /* socket */
162*c4d1da1fSniklas 	FT_FIFO,        /* fifo */
163*c4d1da1fSniklas 	FT_FILESYS,     /* ADAPTEC's "FSA"(tm) filesystem */
164*c4d1da1fSniklas 	FT_DRIVE,       /* phys disk - addressable in scsi by bus/target/lun */
165*c4d1da1fSniklas 	FT_SLICE,       /* virtual disk - raw volume - slice */
166*c4d1da1fSniklas 	FT_PARTITION,   /* FSA part, inside slice, container building block */
167*c4d1da1fSniklas 	FT_VOLUME,      /* Container - Volume Set */
168*c4d1da1fSniklas 	FT_STRIPE,      /* Container - Stripe Set */
169*c4d1da1fSniklas 	FT_MIRROR,      /* Container - Mirror Set */
170*c4d1da1fSniklas 	FT_RAID5,       /* Container - Raid 5 Set */
171*c4d1da1fSniklas 	FT_DATABASE     /* Storage object with "foreign" content manager */
172*c4d1da1fSniklas } AAC_FType;
173*c4d1da1fSniklas 
174*c4d1da1fSniklas /*
175*c4d1da1fSniklas  * Host-side scatter/gather list for 32-bit commands.
176*c4d1da1fSniklas  */
177*c4d1da1fSniklas struct aac_sg_entry {
178*c4d1da1fSniklas 	u_int32_t SgAddress;
179*c4d1da1fSniklas 	u_int32_t SgByteCount;
180*c4d1da1fSniklas } __attribute__ ((packed));
181*c4d1da1fSniklas 
182*c4d1da1fSniklas struct aac_sg_table {
183*c4d1da1fSniklas 	u_int32_t SgCount;
184*c4d1da1fSniklas 	struct aac_sg_entry SgEntry[0];
185*c4d1da1fSniklas } __attribute__ ((packed));
186*c4d1da1fSniklas 
187*c4d1da1fSniklas /*
188*c4d1da1fSniklas  * Host-side scatter/gather list for 64-bit commands.
189*c4d1da1fSniklas  */
190*c4d1da1fSniklas struct aac_sg_table64 {
191*c4d1da1fSniklas 	u_int8_t SgCount;
192*c4d1da1fSniklas 	u_int8_t SgSectorsPerPage;
193*c4d1da1fSniklas 	u_int16_t SgByteOffset;
194*c4d1da1fSniklas 	u_int64_t SgEntry[0];
195*c4d1da1fSniklas } __attribute__ ((packed));
196*c4d1da1fSniklas 
197*c4d1da1fSniklas /*
198*c4d1da1fSniklas  * Container creation data
199*c4d1da1fSniklas  */
200*c4d1da1fSniklas struct aac_container_creation {
201*c4d1da1fSniklas 	u_int8_t ViaBuildNumber;
202*c4d1da1fSniklas 	u_int8_t MicroSecond;
203*c4d1da1fSniklas 	u_int8_t Via;			/* 1 = FSU, 2 = API, etc. */
204*c4d1da1fSniklas 	u_int8_t YearsSince1900;
205*c4d1da1fSniklas 	u_int32_t Month:4;		/* 1-12 */
206*c4d1da1fSniklas 	u_int32_t Day:6;		/* 1-32 */
207*c4d1da1fSniklas 	u_int32_t Hour:6;		/* 0-23 */
208*c4d1da1fSniklas 	u_int32_t Minute:6;		/* 0-59 */
209*c4d1da1fSniklas 	u_int32_t Second:6;		/* 0-59 */
210*c4d1da1fSniklas 	u_int64_t ViaAdapterSerialNumber;
211*c4d1da1fSniklas } __attribute__ ((packed));
212*c4d1da1fSniklas 
213*c4d1da1fSniklas struct FsaRevision {
214*c4d1da1fSniklas 	union {
215*c4d1da1fSniklas         	struct {
216*c4d1da1fSniklas 			u_int8_t dash;
217*c4d1da1fSniklas 			u_int8_t type;
218*c4d1da1fSniklas 			u_int8_t minor;
219*c4d1da1fSniklas 			u_int8_t major;
220*c4d1da1fSniklas 	        } comp;
221*c4d1da1fSniklas 	        u_int32_t ul;
222*c4d1da1fSniklas 	} external;
223*c4d1da1fSniklas 	u_int32_t buildNumber;
224*c4d1da1fSniklas } __attribute__((packed));
225*c4d1da1fSniklas 
226*c4d1da1fSniklas /*
227*c4d1da1fSniklas  * Adapter Information
228*c4d1da1fSniklas  */
229*c4d1da1fSniklas 
230*c4d1da1fSniklas typedef enum {
231*c4d1da1fSniklas 	CPU_NTSIM = 1,
232*c4d1da1fSniklas 	CPU_I960,
233*c4d1da1fSniklas 	CPU_ARM,
234*c4d1da1fSniklas 	CPU_SPARC,
235*c4d1da1fSniklas 	CPU_POWERPC,
236*c4d1da1fSniklas 	CPU_ALPHA,
237*c4d1da1fSniklas 	CPU_P7,
238*c4d1da1fSniklas 	CPU_I960_RX,
239*c4d1da1fSniklas 	CPU__last
240*c4d1da1fSniklas } AAC_CpuType;
241*c4d1da1fSniklas 
242*c4d1da1fSniklas typedef enum {
243*c4d1da1fSniklas 	CPUI960_JX = 1,
244*c4d1da1fSniklas 	CPUI960_CX,
245*c4d1da1fSniklas 	CPUI960_HX,
246*c4d1da1fSniklas 	CPUI960_RX,
247*c4d1da1fSniklas 	CPUARM_SA110,
248*c4d1da1fSniklas 	CPUARM_xxx,
249*c4d1da1fSniklas 	CPUPPC_603e,
250*c4d1da1fSniklas 	CPUPPC_xxx,
251*c4d1da1fSniklas 	CPUSUBTYPE__last
252*c4d1da1fSniklas } AAC_CpuSubType;
253*c4d1da1fSniklas 
254*c4d1da1fSniklas typedef enum {
255*c4d1da1fSniklas 	PLAT_NTSIM = 1,
256*c4d1da1fSniklas 	PLAT_V3ADU,
257*c4d1da1fSniklas 	PLAT_CYCLONE,
258*c4d1da1fSniklas 	PLAT_CYCLONE_HD,
259*c4d1da1fSniklas 	PLAT_BATBOARD,
260*c4d1da1fSniklas 	PLAT_BATBOARD_HD,
261*c4d1da1fSniklas 	PLAT_YOLO,
262*c4d1da1fSniklas 	PLAT_COBRA,
263*c4d1da1fSniklas 	PLAT_ANAHEIM,
264*c4d1da1fSniklas 	PLAT_JALAPENO,
265*c4d1da1fSniklas 	PLAT_QUEENS,
266*c4d1da1fSniklas 	PLAT_JALAPENO_DELL,
267*c4d1da1fSniklas 	PLAT_POBLANO,
268*c4d1da1fSniklas 	PLAT_POBLANO_OPAL,
269*c4d1da1fSniklas 	PLAT_POBLANO_SL0,
270*c4d1da1fSniklas 	PLAT_POBLANO_SL1,
271*c4d1da1fSniklas 	PLAT_POBLANO_SL2,
272*c4d1da1fSniklas 	PLAT_POBLANO_XXX,
273*c4d1da1fSniklas 	PLAT_JALAPENO_P2,
274*c4d1da1fSniklas 	PLAT_HABANERO,
275*c4d1da1fSniklas 	PLAT__last
276*c4d1da1fSniklas } AAC_Platform;
277*c4d1da1fSniklas 
278*c4d1da1fSniklas typedef enum {
279*c4d1da1fSniklas 	OEM_FLAVOR_ADAPTEC = 1,
280*c4d1da1fSniklas 	OEM_FLAVOR_DELL,
281*c4d1da1fSniklas 	OEM_FLAVOR_HP,
282*c4d1da1fSniklas 	OEM_FLAVOR_IBM,
283*c4d1da1fSniklas 	OEM_FLAVOR_CPQ,
284*c4d1da1fSniklas 	OEM_FLAVOR_BRAND_X,
285*c4d1da1fSniklas 	OEM_FLAVOR_BRAND_Y,
286*c4d1da1fSniklas 	OEM_FLAVOR_BRAND_Z,
287*c4d1da1fSniklas 	OEM_FLAVOR__last
288*c4d1da1fSniklas } AAC_OemFlavor;
289*c4d1da1fSniklas 
290*c4d1da1fSniklas /*
291*c4d1da1fSniklas  * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
292*c4d1da1fSniklas  */
293*c4d1da1fSniklas typedef enum {
294*c4d1da1fSniklas 	PLATFORM_BAT_REQ_PRESENT = 1,	/* BATTERY REQUIRED AND PRESENT */
295*c4d1da1fSniklas 	PLATFORM_BAT_REQ_NOTPRESENT,	/* BATTERY REQUIRED AND NOT PRESENT */
296*c4d1da1fSniklas 	PLATFORM_BAT_OPT_PRESENT,	/* BATTERY OPTIONAL AND PRESENT */
297*c4d1da1fSniklas 	PLATFORM_BAT_OPT_NOTPRESENT,	/* BATTERY OPTIONAL AND NOT PRESENT */
298*c4d1da1fSniklas 	PLATFORM_BAT_NOT_SUPPORTED	/* BATTERY NOT SUPPORTED */
299*c4d1da1fSniklas } AAC_BatteryPlatform;
300*c4d1da1fSniklas 
301*c4d1da1fSniklas /*
302*c4d1da1fSniklas  * Structure used to respond to a RequestAdapterInfo fib.
303*c4d1da1fSniklas  */
304*c4d1da1fSniklas struct aac_adapter_info {
305*c4d1da1fSniklas 	AAC_Platform PlatformBase;	/* adapter type */
306*c4d1da1fSniklas 	AAC_CpuType CpuArchitecture;	/* adapter CPU type */
307*c4d1da1fSniklas 	AAC_CpuSubType CpuVariant;	/* adapter CPU subtype */
308*c4d1da1fSniklas 	u_int32_t ClockSpeed;		/* adapter CPU clockspeed */
309*c4d1da1fSniklas 	u_int32_t ExecutionMem;		/* adapter Execution Memory size */
310*c4d1da1fSniklas 	u_int32_t BufferMem;		/* adapter Data Memory */
311*c4d1da1fSniklas 	u_int32_t TotalMem;		/* adapter Total Memory */
312*c4d1da1fSniklas 	struct FsaRevision KernelRevision; /* adapter Kernel SW Revision */
313*c4d1da1fSniklas 	struct FsaRevision MonitorRevision; /* adapter Monitor/Diag SW Rev */
314*c4d1da1fSniklas 	struct FsaRevision HardwareRevision; /* TDB */
315*c4d1da1fSniklas 	struct FsaRevision BIOSRevision; /* adapter BIOS Revision */
316*c4d1da1fSniklas 	u_int32_t ClusteringEnabled;
317*c4d1da1fSniklas 	u_int32_t ClusterChannelMask;
318*c4d1da1fSniklas 	u_int64_t SerialNumber;
319*c4d1da1fSniklas 	AAC_BatteryPlatform batteryPlatform;
320*c4d1da1fSniklas 	u_int32_t SupportedOptions;	/* supported features of this ctrlr */
321*c4d1da1fSniklas 	AAC_OemFlavor OemVariant;
322*c4d1da1fSniklas } __attribute__((packed));
323*c4d1da1fSniklas 
324*c4d1da1fSniklas /*
325*c4d1da1fSniklas  * Monitor/Kernel interface.
326*c4d1da1fSniklas  */
327*c4d1da1fSniklas 
328*c4d1da1fSniklas /*
329*c4d1da1fSniklas  * Synchronous commands to the monitor/kernel.
330*c4d1da1fSniklas  */
331*c4d1da1fSniklas #define AAC_MONKER_INITSTRUCT	0x05
332*c4d1da1fSniklas #define AAC_MONKER_SYNCFIB	0x0c
333*c4d1da1fSniklas 
334*c4d1da1fSniklas /*
335*c4d1da1fSniklas  * Command status values
336*c4d1da1fSniklas  */
337*c4d1da1fSniklas typedef enum {
338*c4d1da1fSniklas     ST_OK = 0,
339*c4d1da1fSniklas     ST_PERM = 1,
340*c4d1da1fSniklas     ST_NOENT = 2,
341*c4d1da1fSniklas     ST_IO = 5,
342*c4d1da1fSniklas     ST_NXIO = 6,
343*c4d1da1fSniklas     ST_E2BIG = 7,
344*c4d1da1fSniklas     ST_ACCES = 13,
345*c4d1da1fSniklas     ST_EXIST = 17,
346*c4d1da1fSniklas     ST_XDEV = 18,
347*c4d1da1fSniklas     ST_NODEV = 19,
348*c4d1da1fSniklas     ST_NOTDIR = 20,
349*c4d1da1fSniklas     ST_ISDIR = 21,
350*c4d1da1fSniklas     ST_INVAL = 22,
351*c4d1da1fSniklas     ST_FBIG = 27,
352*c4d1da1fSniklas     ST_NOSPC = 28,
353*c4d1da1fSniklas     ST_ROFS = 30,
354*c4d1da1fSniklas     ST_MLINK = 31,
355*c4d1da1fSniklas     ST_WOULDBLOCK = 35,
356*c4d1da1fSniklas     ST_NAMETOOLONG = 63,
357*c4d1da1fSniklas     ST_NOTEMPTY = 66,
358*c4d1da1fSniklas     ST_DQUOT = 69,
359*c4d1da1fSniklas     ST_STALE = 70,
360*c4d1da1fSniklas     ST_REMOTE = 71,
361*c4d1da1fSniklas     ST_BADHANDLE = 10001,
362*c4d1da1fSniklas     ST_NOT_SYNC = 10002,
363*c4d1da1fSniklas     ST_BAD_COOKIE = 10003,
364*c4d1da1fSniklas     ST_NOTSUPP = 10004,
365*c4d1da1fSniklas     ST_TOOSMALL = 10005,
366*c4d1da1fSniklas     ST_SERVERFAULT = 10006,
367*c4d1da1fSniklas     ST_BADTYPE = 10007,
368*c4d1da1fSniklas     ST_JUKEBOX = 10008,
369*c4d1da1fSniklas     ST_NOTMOUNTED = 10009,
370*c4d1da1fSniklas     ST_MAINTMODE = 10010,
371*c4d1da1fSniklas     ST_STALEACL = 10011
372*c4d1da1fSniklas } AAC_FSAStatus;
373*c4d1da1fSniklas 
374*c4d1da1fSniklas /*
375*c4d1da1fSniklas  * Volume manager commands
376*c4d1da1fSniklas  */
377*c4d1da1fSniklas typedef enum _VM_COMMANDS {
378*c4d1da1fSniklas     VM_Null = 0,
379*c4d1da1fSniklas     VM_NameServe,
380*c4d1da1fSniklas     VM_ContainerConfig,
381*c4d1da1fSniklas     VM_Ioctl,
382*c4d1da1fSniklas     VM_FilesystemIoctl,
383*c4d1da1fSniklas     VM_CloseAll,
384*c4d1da1fSniklas     VM_CtBlockRead,
385*c4d1da1fSniklas     VM_CtBlockWrite,
386*c4d1da1fSniklas     VM_SliceBlockRead,	 /* raw access to configured "storage objects" */
387*c4d1da1fSniklas     VM_SliceBlockWrite,
388*c4d1da1fSniklas     VM_DriveBlockRead,	 /* raw access to physical devices */
389*c4d1da1fSniklas     VM_DriveBlockWrite,
390*c4d1da1fSniklas     VM_EnclosureMgt,	 /* enclosure management */
391*c4d1da1fSniklas     VM_Unused,		 /* used to be diskset management */
392*c4d1da1fSniklas     VM_CtBlockVerify,
393*c4d1da1fSniklas     VM_CtPerf,		 /* performance test */
394*c4d1da1fSniklas     VM_CtBlockRead64,
395*c4d1da1fSniklas     VM_CtBlockWrite64,
396*c4d1da1fSniklas     VM_CtBlockVerify64,
397*c4d1da1fSniklas } AAC_VMCommand;
398*c4d1da1fSniklas 
399*c4d1da1fSniklas /*
400*c4d1da1fSniklas  * "Mountable object"
401*c4d1da1fSniklas  */
402*c4d1da1fSniklas struct aac_mntobj {
403*c4d1da1fSniklas 	u_int32_t ObjectId;
404*c4d1da1fSniklas 	char	FileSystemName[16];
405*c4d1da1fSniklas 	struct aac_container_creation CreateInfo;
406*c4d1da1fSniklas 	u_int32_t Capacity;
407*c4d1da1fSniklas 	AAC_FSAVolType VolType;
408*c4d1da1fSniklas 	AAC_FType ObjType;
409*c4d1da1fSniklas 	u_int32_t ContentState;
410*c4d1da1fSniklas #define AAC_FSCS_READONLY 0x0002 /* XXX need more information than this */
411*c4d1da1fSniklas 	union {
412*c4d1da1fSniklas 		u_int32_t pad[8];
413*c4d1da1fSniklas 	} ObjExtension;
414*c4d1da1fSniklas 	u_int32_t AlterEgoId;
415*c4d1da1fSniklas } __attribute__ ((packed));
416*c4d1da1fSniklas 
417*c4d1da1fSniklas struct aac_mntinfo {
418*c4d1da1fSniklas 	AAC_VMCommand Command;
419*c4d1da1fSniklas 	AAC_FType MntType;
420*c4d1da1fSniklas 	u_int32_t MntCount;
421*c4d1da1fSniklas } __attribute__ ((packed));
422*c4d1da1fSniklas 
423*c4d1da1fSniklas struct aac_mntinforesponse {
424*c4d1da1fSniklas 	AAC_FSAStatus Status;
425*c4d1da1fSniklas 	AAC_FType MntType;
426*c4d1da1fSniklas 	u_int32_t MntRespCount;
427*c4d1da1fSniklas 	struct aac_mntobj MntTable[1];
428*c4d1da1fSniklas } __attribute__ ((packed));
429*c4d1da1fSniklas 
430*c4d1da1fSniklas /*
431*c4d1da1fSniklas  * Write 'stability' options.
432*c4d1da1fSniklas  */
433*c4d1da1fSniklas typedef enum {
434*c4d1da1fSniklas 	CSTABLE = 1,
435*c4d1da1fSniklas 	CUNSTABLE
436*c4d1da1fSniklas } AAC_CacheLevel;
437*c4d1da1fSniklas 
438*c4d1da1fSniklas /*
439*c4d1da1fSniklas  * Commit level response for a write request.
440*c4d1da1fSniklas  */
441*c4d1da1fSniklas typedef enum {
442*c4d1da1fSniklas 	CMFILE_SYNC_NVRAM = 1,
443*c4d1da1fSniklas 	CMDATA_SYNC_NVRAM,
444*c4d1da1fSniklas 	CMFILE_SYNC,
445*c4d1da1fSniklas 	CMDATA_SYNC,
446*c4d1da1fSniklas 	CMUNSTABLE
447*c4d1da1fSniklas } AAC_CommitLevel;
448*c4d1da1fSniklas 
449*c4d1da1fSniklas /*
450*c4d1da1fSniklas  * Block read/write operations.
451*c4d1da1fSniklas  * These structures are packed into the 'data' area in the FIB.
452*c4d1da1fSniklas  */
453*c4d1da1fSniklas 
454*c4d1da1fSniklas struct aac_blockread {
455*c4d1da1fSniklas 	AAC_VMCommand Command;		/* not FSACommand! */
456*c4d1da1fSniklas 	u_int32_t ContainerId;
457*c4d1da1fSniklas 	u_int32_t BlockNumber;
458*c4d1da1fSniklas 	u_int32_t ByteCount;
459*c4d1da1fSniklas 	struct aac_sg_table SgMap;	/* variable size */
460*c4d1da1fSniklas } __attribute__ ((packed));
461*c4d1da1fSniklas 
462*c4d1da1fSniklas struct aac_blockread_response {
463*c4d1da1fSniklas 	AAC_FSAStatus Status;
464*c4d1da1fSniklas 	u_int32_t ByteCount;
465*c4d1da1fSniklas } __attribute__ ((packed));
466*c4d1da1fSniklas 
467*c4d1da1fSniklas struct aac_blockwrite {
468*c4d1da1fSniklas 	AAC_VMCommand	Command;	/* not FSACommand! */
469*c4d1da1fSniklas 	u_int32_t ContainerId;
470*c4d1da1fSniklas 	u_int32_t BlockNumber;
471*c4d1da1fSniklas 	u_int32_t ByteCount;
472*c4d1da1fSniklas 	AAC_CacheLevel Stable;
473*c4d1da1fSniklas 	struct aac_sg_table SgMap;	/* variable size */
474*c4d1da1fSniklas } __attribute__ ((packed));
475*c4d1da1fSniklas 
476*c4d1da1fSniklas struct aac_blockwrite_response {
477*c4d1da1fSniklas 	AAC_FSAStatus Status;
478*c4d1da1fSniklas 	u_int32_t ByteCount;
479*c4d1da1fSniklas 	AAC_CommitLevel Committed;
480*c4d1da1fSniklas } __attribute__ ((packed));
481*c4d1da1fSniklas 
482*c4d1da1fSniklas /*
483*c4d1da1fSniklas  * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
484*c4d1da1fSniklas  * on the SA110 'StrongArm'.
485*c4d1da1fSniklas  */
486*c4d1da1fSniklas 
487*c4d1da1fSniklas /* doorbell 0 (adapter->host) */
488*c4d1da1fSniklas #define AAC_SA_DOORBELL0_CLEAR	0x98
489*c4d1da1fSniklas #define AAC_SA_DOORBELL0_SET	0x9c
490*c4d1da1fSniklas #define AAC_SA_DOORBELL0	0x9c
491*c4d1da1fSniklas #define AAC_SA_MASK0_CLEAR	0xa0
492*c4d1da1fSniklas #define AAC_SA_MASK0_SET	0xa4
493*c4d1da1fSniklas 
494*c4d1da1fSniklas /* doorbell 1 (host->adapter) */
495*c4d1da1fSniklas #define AAC_SA_DOORBELL1_CLEAR	0x9a
496*c4d1da1fSniklas #define AAC_SA_DOORBELL1_SET	0x9e
497*c4d1da1fSniklas #define AAC_SA_MASK1_CLEAR	0xa2
498*c4d1da1fSniklas #define AAC_SA_MASK1_SET	0xa6
499*c4d1da1fSniklas 
500*c4d1da1fSniklas /* mailbox (20 bytes) */
501*c4d1da1fSniklas #define AAC_SA_MAILBOX		0xa8
502*c4d1da1fSniklas #define AAC_SA_FWSTATUS		0xc4
503*c4d1da1fSniklas 
504*c4d1da1fSniklas /*
505*c4d1da1fSniklas  * Register definitions for the Adaptec 'Pablano' adapters, based on the
506*c4d1da1fSniklas  * i960Rx, and other related adapters.
507*c4d1da1fSniklas  */
508*c4d1da1fSniklas 
509*c4d1da1fSniklas #define AAC_RX_IDBR		0x20	/* inbound doorbell */
510*c4d1da1fSniklas #define AAC_RX_IISR		0x24	/* inbound interrupt status */
511*c4d1da1fSniklas #define AAC_RX_IIMR		0x28	/* inbound interrupt mask */
512*c4d1da1fSniklas #define AAC_RX_ODBR		0x2c	/* outbound doorbell */
513*c4d1da1fSniklas #define AAC_RX_OISR		0x30	/* outbound interrupt status */
514*c4d1da1fSniklas #define AAC_RX_OIMR		0x34	/* outbound interrupt mask */
515*c4d1da1fSniklas 
516*c4d1da1fSniklas #define AAC_RX_MAILBOX		0x50	/* mailbox (20 bytes) */
517*c4d1da1fSniklas #define AAC_RX_FWSTATUS		0x6c
518*c4d1da1fSniklas 
519*c4d1da1fSniklas /*
520*c4d1da1fSniklas  * Common bit definitions for the doorbell registers.
521*c4d1da1fSniklas  */
522*c4d1da1fSniklas 
523*c4d1da1fSniklas /*
524*c4d1da1fSniklas  * Status bits in the doorbell registers.
525*c4d1da1fSniklas  */
526*c4d1da1fSniklas #define AAC_DB_SYNC_COMMAND	(1<<0)	/* send/completed synchronous FIB */
527*c4d1da1fSniklas #define AAC_DB_COMMAND_READY	(1<<1)	/* posted one or more commands */
528*c4d1da1fSniklas #define AAC_DB_RESPONSE_READY	(1<<2)	/* one or more commands complete */
529*c4d1da1fSniklas #define AAC_DB_COMMAND_NOT_FULL	(1<<3)	/* command queue not full */
530*c4d1da1fSniklas #define AAC_DB_RESPONSE_NOT_FULL (1<<4)	/* response queue not full */
531*c4d1da1fSniklas 
532*c4d1da1fSniklas /*
533*c4d1da1fSniklas  * The adapter can request the host print a message by setting the
534*c4d1da1fSniklas  * DB_PRINTF flag in DOORBELL0.  The driver responds by collecting the
535*c4d1da1fSniklas  * message from the printf buffer, clearing the DB_PRINTF flag in
536*c4d1da1fSniklas  * DOORBELL0 and setting it in DOORBELL1.
537*c4d1da1fSniklas  * (ODBR and IDBR respectively for the i960Rx adapters)
538*c4d1da1fSniklas  */
539*c4d1da1fSniklas #define AAC_DB_PRINTF		(1<<5)
540*c4d1da1fSniklas 
541*c4d1da1fSniklas /*
542*c4d1da1fSniklas  * Mask containing the interrupt bits we care about.  We don't anticipate
543*c4d1da1fSniklas  * (or want) interrupts not in this mask.
544*c4d1da1fSniklas  */
545*c4d1da1fSniklas #define AAC_DB_INTERRUPTS \
546*c4d1da1fSniklas 	(AAC_DB_COMMAND_READY | AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)
547*c4d1da1fSniklas 
548*c4d1da1fSniklas /*
549*c4d1da1fSniklas  * Queue names
550*c4d1da1fSniklas  *
551*c4d1da1fSniklas  * Note that we base these at 0 in order to use them as array indices.  Adaptec
552*c4d1da1fSniklas  * used base 1 for some unknown reason, and sorted them in a different order.
553*c4d1da1fSniklas  */
554*c4d1da1fSniklas #define AAC_HOST_NORM_CMD_QUEUE		0
555*c4d1da1fSniklas #define AAC_HOST_HIGH_CMD_QUEUE		1
556*c4d1da1fSniklas #define AAC_ADAP_NORM_CMD_QUEUE		2
557*c4d1da1fSniklas #define AAC_ADAP_HIGH_CMD_QUEUE		3
558*c4d1da1fSniklas #define AAC_HOST_NORM_RESP_QUEUE	4
559*c4d1da1fSniklas #define AAC_HOST_HIGH_RESP_QUEUE	5
560*c4d1da1fSniklas #define AAC_ADAP_NORM_RESP_QUEUE	6
561*c4d1da1fSniklas #define AAC_ADAP_HIGH_RESP_QUEUE	7
562*c4d1da1fSniklas 
563*c4d1da1fSniklas /*
564*c4d1da1fSniklas  * List structure used to chain FIBs (used by the adapter - we hang FIBs off
565*c4d1da1fSniklas  * our private command structure and don't touch these)
566*c4d1da1fSniklas  */
567*c4d1da1fSniklas struct aac_fib_list_entry {
568*c4d1da1fSniklas 	struct fib_list_entry *Flink;
569*c4d1da1fSniklas 	struct fib_list_entry *Blink;
570*c4d1da1fSniklas } __attribute__((packed));
571*c4d1da1fSniklas 
572*c4d1da1fSniklas /*
573*c4d1da1fSniklas  * FIB (FSA Interface Block?); this is the datastructure passed between the
574*c4d1da1fSniklas  * host and adapter.
575*c4d1da1fSniklas  */
576*c4d1da1fSniklas struct aac_fib_header {
577*c4d1da1fSniklas 	u_int32_t XferState;
578*c4d1da1fSniklas 	u_int16_t Command;
579*c4d1da1fSniklas 	u_int8_t StructType;
580*c4d1da1fSniklas 	u_int8_t Flags;
581*c4d1da1fSniklas 	u_int16_t Size;
582*c4d1da1fSniklas 	u_int16_t SenderSize;
583*c4d1da1fSniklas 	u_int32_t SenderFibAddress;
584*c4d1da1fSniklas 	u_int32_t ReceiverFibAddress;
585*c4d1da1fSniklas 	u_int32_t SenderData;
586*c4d1da1fSniklas 	union {
587*c4d1da1fSniklas 		struct {
588*c4d1da1fSniklas 			u_int32_t ReceiverTimeStart;
589*c4d1da1fSniklas 			u_int32_t ReceiverTimeDone;
590*c4d1da1fSniklas 		} _s;
591*c4d1da1fSniklas 		struct aac_fib_list_entry FibLinks;
592*c4d1da1fSniklas 	} _u;
593*c4d1da1fSniklas } __attribute__((packed));
594*c4d1da1fSniklas 
595*c4d1da1fSniklas #define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header))
596*c4d1da1fSniklas 
597*c4d1da1fSniklas struct aac_fib {
598*c4d1da1fSniklas 	struct aac_fib_header Header;
599*c4d1da1fSniklas 	u_int8_t data[AAC_FIB_DATASIZE];
600*c4d1da1fSniklas } __attribute__((packed));
601*c4d1da1fSniklas 
602*c4d1da1fSniklas /*
603*c4d1da1fSniklas  * FIB commands
604*c4d1da1fSniklas  */
605*c4d1da1fSniklas typedef enum {
606*c4d1da1fSniklas     TestCommandResponse =		1,
607*c4d1da1fSniklas     TestAdapterCommand =		2,
608*c4d1da1fSniklas 
609*c4d1da1fSniklas     /* lowlevel and comm commands */
610*c4d1da1fSniklas     LastTestCommand =			100,
611*c4d1da1fSniklas     ReinitHostNormCommandQueue =	101,
612*c4d1da1fSniklas     ReinitHostHighCommandQueue =	102,
613*c4d1da1fSniklas     ReinitHostHighRespQueue =		103,
614*c4d1da1fSniklas     ReinitHostNormRespQueue =		104,
615*c4d1da1fSniklas     ReinitAdapNormCommandQueue =	105,
616*c4d1da1fSniklas     ReinitAdapHighCommandQueue =	107,
617*c4d1da1fSniklas     ReinitAdapHighRespQueue =		108,
618*c4d1da1fSniklas     ReinitAdapNormRespQueue =		109,
619*c4d1da1fSniklas     InterfaceShutdown =			110,
620*c4d1da1fSniklas     DmaCommandFib =			120,
621*c4d1da1fSniklas     StartProfile =			121,
622*c4d1da1fSniklas     TermProfile =			122,
623*c4d1da1fSniklas     SpeedTest =				123,
624*c4d1da1fSniklas     TakeABreakPt =			124,
625*c4d1da1fSniklas     RequestPerfData =			125,
626*c4d1da1fSniklas     SetInterruptDefTimer=		126,
627*c4d1da1fSniklas     SetInterruptDefCount=		127,
628*c4d1da1fSniklas     GetInterruptDefStatus=		128,
629*c4d1da1fSniklas     LastCommCommand =			129,
630*c4d1da1fSniklas 
631*c4d1da1fSniklas     /* filesystem commands */
632*c4d1da1fSniklas     NuFileSystem =			300,
633*c4d1da1fSniklas     UFS =				301,
634*c4d1da1fSniklas     HostFileSystem =			302,
635*c4d1da1fSniklas     LastFileSystemCommand =		303,
636*c4d1da1fSniklas 
637*c4d1da1fSniklas     /* Container Commands */
638*c4d1da1fSniklas     ContainerCommand =			500,
639*c4d1da1fSniklas     ContainerCommand64 =		501,
640*c4d1da1fSniklas 
641*c4d1da1fSniklas     /* Cluster Commands */
642*c4d1da1fSniklas     ClusterCommand =			550,
643*c4d1da1fSniklas 
644*c4d1da1fSniklas     /* Scsi Port commands (scsi passthrough) */
645*c4d1da1fSniklas     ScsiPortCommand =			600,
646*c4d1da1fSniklas 
647*c4d1da1fSniklas     /* misc house keeping and generic adapter initiated commands */
648*c4d1da1fSniklas     AifRequest =			700,
649*c4d1da1fSniklas     CheckRevision =			701,
650*c4d1da1fSniklas     FsaHostShutdown =			702,
651*c4d1da1fSniklas     RequestAdapterInfo =		703,
652*c4d1da1fSniklas     IsAdapterPaused =			704,
653*c4d1da1fSniklas     SendHostTime =			705,
654*c4d1da1fSniklas     LastMiscCommand =			706
655*c4d1da1fSniklas } AAC_FibCommands;
656*c4d1da1fSniklas 
657*c4d1da1fSniklas /*
658*c4d1da1fSniklas  * FIB types
659*c4d1da1fSniklas  */
660*c4d1da1fSniklas #define AAC_FIBTYPE_TFIB	1
661*c4d1da1fSniklas #define AAC_FIBTYPE_TQE		2
662*c4d1da1fSniklas #define AAC_FIBTYPE_TCTPERF	3
663*c4d1da1fSniklas 
664*c4d1da1fSniklas /*
665*c4d1da1fSniklas  * FIB transfer state
666*c4d1da1fSniklas  */
667*c4d1da1fSniklas #define AAC_FIBSTATE_HOSTOWNED		(1<<0)	/* owned by the host */
668*c4d1da1fSniklas #define AAC_FIBSTATE_ADAPTEROWNED	(1<<1)	/* owned by the adapter */
669*c4d1da1fSniklas #define AAC_FIBSTATE_INITIALISED	(1<<2)	/* initialised */
670*c4d1da1fSniklas #define AAC_FIBSTATE_EMPTY		(1<<3)	/* empty */
671*c4d1da1fSniklas #define AAC_FIBSTATE_FROMPOOL		(1<<4)	/* allocated from pool */
672*c4d1da1fSniklas #define AAC_FIBSTATE_FROMHOST		(1<<5)	/* sent from the host */
673*c4d1da1fSniklas #define AAC_FIBSTATE_FROMADAP		(1<<6)	/* sent from the adapter */
674*c4d1da1fSniklas #define AAC_FIBSTATE_REXPECTED		(1<<7)	/* response is expected */
675*c4d1da1fSniklas #define AAC_FIBSTATE_RNOTEXPECTED	(1<<8)	/* response is not expected */
676*c4d1da1fSniklas #define AAC_FIBSTATE_DONEADAP		(1<<9)	/* processed by the adapter */
677*c4d1da1fSniklas #define AAC_FIBSTATE_DONEHOST		(1<<10)	/* processed by the host */
678*c4d1da1fSniklas #define AAC_FIBSTATE_HIGH		(1<<11)	/* high priority */
679*c4d1da1fSniklas #define AAC_FIBSTATE_NORM		(1<<12)	/* normal priority */
680*c4d1da1fSniklas #define AAC_FIBSTATE_ASYNC		(1<<13)
681*c4d1da1fSniklas #define AAC_FIBSTATE_ASYNCIO		(1<<13)	/* to be removed */
682*c4d1da1fSniklas #define AAC_FIBSTATE_PAGEFILEIO		(1<<14)	/* to be removed */
683*c4d1da1fSniklas #define AAC_FIBSTATE_SHUTDOWN		(1<<15)
684*c4d1da1fSniklas #define AAC_FIBSTATE_LAZYWRITE		(1<<16)	/* to be removed */
685*c4d1da1fSniklas #define AAC_FIBSTATE_ADAPMICROFIB	(1<<17)
686*c4d1da1fSniklas #define AAC_FIBSTATE_BIOSFIB		(1<<18)
687*c4d1da1fSniklas #define AAC_FIBSTATE_FAST_RESPONSE	(1<<19)	/* fast response capable */
688*c4d1da1fSniklas #define AAC_FIBSTATE_APIFIB		(1<<20)
689*c4d1da1fSniklas 
690*c4d1da1fSniklas /*
691*c4d1da1fSniklas  * FIB error values
692*c4d1da1fSniklas  */
693*c4d1da1fSniklas #define AAC_ERROR_NORMAL			0x00
694*c4d1da1fSniklas #define AAC_ERROR_PENDING			0x01
695*c4d1da1fSniklas #define AAC_ERROR_FATAL				0x02
696*c4d1da1fSniklas #define AAC_ERROR_INVALID_QUEUE			0x03
697*c4d1da1fSniklas #define AAC_ERROR_NOENTRIES			0x04
698*c4d1da1fSniklas #define AAC_ERROR_SENDFAILED			0x05
699*c4d1da1fSniklas #define AAC_ERROR_INVALID_QUEUE_PRIORITY	0x06
700*c4d1da1fSniklas #define AAC_ERROR_FIB_ALLOCATION_FAILED		0x07
701*c4d1da1fSniklas #define AAC_ERROR_FIB_DEALLOCATION_FAILED	0x08
702*c4d1da1fSniklas 
703*c4d1da1fSniklas /*
704*c4d1da1fSniklas  *  Adapter Status Register
705*c4d1da1fSniklas  *
706*c4d1da1fSniklas  *  Phase Staus mailbox is 32bits:
707*c4d1da1fSniklas  *  <31:16> = Phase Status
708*c4d1da1fSniklas  *  <15:0>  = Phase
709*c4d1da1fSniklas  *
710*c4d1da1fSniklas  *  The adapter reports its present state through the phase.  Only
711*c4d1da1fSniklas  *  a single phase should be ever be set.  Each phase can have multiple
712*c4d1da1fSniklas  *  phase status bits to provide more detailed information about the
713*c4d1da1fSniklas  *  state of the adapter.
714*c4d1da1fSniklas  */
715*c4d1da1fSniklas #define AAC_SELF_TEST_FAILED	0x00000004
716*c4d1da1fSniklas #define AAC_UP_AND_RUNNING	0x00000080
717*c4d1da1fSniklas #define AAC_KERNEL_PANIC	0x00000100
718