aacreg.h revision 135289
1/*-
2 * Copyright (c) 2000 Michael Smith
3 * Copyright (c) 2000-2001 Scott Long
4 * Copyright (c) 2000 BSDi
5 * Copyright (c) 2001 Adaptec, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 *	$FreeBSD: head/sys/dev/aac/aacreg.h 135289 2004-09-16 02:37:40Z scottl $
30 */
31
32/*
33 * Data structures defining the interface between the driver and the Adaptec
34 * 'FSA' adapters.  Note that many field names and comments here are taken
35 * verbatim from the Adaptec driver source in order to make comparing the
36 * two slightly easier.
37 */
38
39/*
40 * Misc. magic numbers.
41 */
42#define AAC_MAX_CONTAINERS	64
43#define AAC_BLOCK_SIZE		512
44
45/*
46 * Communications interface.
47 *
48 * Where datastructure layouts are closely parallel to the Adaptec sample code,
49 * retain their naming conventions (for now) to aid in cross-referencing.
50 */
51
52/*
53 * We establish 4 command queues and matching response queues.  Queues must
54 * be 16-byte aligned, and are sized as follows:
55 */
56#define AAC_HOST_NORM_CMD_ENTRIES	8	/* command adapter->host,
57						 * normal priority */
58#define AAC_HOST_HIGH_CMD_ENTRIES	4	/* command adapter->host,
59						 * high priority */
60#define AAC_ADAP_NORM_CMD_ENTRIES	512	/* command host->adapter,
61						 * normal priority */
62#define AAC_ADAP_HIGH_CMD_ENTRIES	4	/* command host->adapter,
63						 * high priority */
64#define AAC_HOST_NORM_RESP_ENTRIES	512	/* response, adapter->host,
65						 * normal priority */
66#define AAC_HOST_HIGH_RESP_ENTRIES	4	/* response, adapter->host,
67						 * high priority */
68#define AAC_ADAP_NORM_RESP_ENTRIES	8	/* response, host->adapter,
69						 * normal priority */
70#define AAC_ADAP_HIGH_RESP_ENTRIES	4	/* response, host->adapter,
71						 * high priority */
72
73#define AAC_TOTALQ_LENGTH	(AAC_HOST_HIGH_CMD_ENTRIES +	\
74				 AAC_HOST_NORM_CMD_ENTRIES +	\
75				 AAC_ADAP_HIGH_CMD_ENTRIES +	\
76				 AAC_ADAP_NORM_CMD_ENTRIES +	\
77				 AAC_HOST_HIGH_RESP_ENTRIES +	\
78				 AAC_HOST_NORM_RESP_ENTRIES +	\
79				 AAC_ADAP_HIGH_RESP_ENTRIES +	\
80				 AAC_ADAP_NORM_RESP_ENTRIES)
81#define AAC_QUEUE_COUNT		8
82#define AAC_QUEUE_ALIGN		16
83
84struct aac_queue_entry {
85	u_int32_t	aq_fib_size;	/* FIB size in bytes */
86	u_int32_t	aq_fib_addr;	/* receiver-space address of the FIB */
87} __packed;
88
89#define AAC_PRODUCER_INDEX	0
90#define AAC_CONSUMER_INDEX	1
91
92/*
93 * Table of queue indices and queues used to communicate with the
94 * controller.  This structure must be aligned to AAC_QUEUE_ALIGN
95 */
96struct aac_queue_table {
97	/* queue consumer/producer indexes (layout mandated by adapter) */
98	u_int32_t			qt_qindex[AAC_QUEUE_COUNT][2];
99
100	/* queue entry structures (layout mandated by adapter) */
101	struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES];
102	struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES];
103	struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES];
104	struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES];
105	struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES];
106	struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES];
107	struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES];
108	struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES];
109} __packed;
110
111/*
112 * Queue names
113 *
114 * Note that we base these at 0 in order to use them as array indices.  Adaptec
115 * used base 1 for some unknown reason, and sorted them in a different order.
116 */
117#define AAC_HOST_NORM_CMD_QUEUE		0
118#define AAC_HOST_HIGH_CMD_QUEUE		1
119#define AAC_ADAP_NORM_CMD_QUEUE		2
120#define AAC_ADAP_HIGH_CMD_QUEUE		3
121#define AAC_HOST_NORM_RESP_QUEUE	4
122#define AAC_HOST_HIGH_RESP_QUEUE	5
123#define AAC_ADAP_NORM_RESP_QUEUE	6
124#define AAC_ADAP_HIGH_RESP_QUEUE	7
125
126/*
127 * List structure used to chain FIBs (used by the adapter - we hang FIBs off
128 * our private command structure and don't touch these)
129 */
130struct aac_fib_list_entry {
131	u_int32_t	Flink;
132	u_int32_t	Blink;
133} __packed;
134
135/*
136 * FIB (FSA Interface Block?); this is the datastructure passed between the host
137 * and adapter.
138 */
139struct aac_fib_header {
140	u_int32_t		XferState;
141	u_int16_t		Command;
142	u_int8_t		StructType;
143	u_int8_t		Flags;
144	u_int16_t		Size;
145	u_int16_t		SenderSize;
146	u_int32_t		SenderFibAddress;
147	u_int32_t		ReceiverFibAddress;
148	u_int32_t		SenderData;
149	union {
150		struct {
151			u_int32_t	ReceiverTimeStart;
152			u_int32_t	ReceiverTimeDone;
153		} _s;
154		struct aac_fib_list_entry FibLinks;
155	} _u;
156} __packed;
157
158#define AAC_FIB_DATASIZE	(512 - sizeof(struct aac_fib_header))
159
160struct aac_fib {
161	struct aac_fib_header	Header;
162	u_int8_t			data[AAC_FIB_DATASIZE];
163} __packed;
164
165/*
166 * FIB commands
167 */
168typedef enum {
169	TestCommandResponse =		1,
170	TestAdapterCommand =		2,
171
172	/* lowlevel and comm commands */
173	LastTestCommand =		100,
174	ReinitHostNormCommandQueue =	101,
175	ReinitHostHighCommandQueue =	102,
176	ReinitHostHighRespQueue =	103,
177	ReinitHostNormRespQueue =	104,
178	ReinitAdapNormCommandQueue =	105,
179	ReinitAdapHighCommandQueue =	107,
180	ReinitAdapHighRespQueue =	108,
181	ReinitAdapNormRespQueue =	109,
182	InterfaceShutdown =		110,
183	DmaCommandFib =			120,
184	StartProfile =			121,
185	TermProfile =			122,
186	SpeedTest =			123,
187	TakeABreakPt =			124,
188	RequestPerfData =		125,
189	SetInterruptDefTimer=		126,
190	SetInterruptDefCount=		127,
191	GetInterruptDefStatus=		128,
192	LastCommCommand =		129,
193
194	/* filesystem commands */
195	NuFileSystem =			300,
196	UFS =				301,
197	HostFileSystem =		302,
198	LastFileSystemCommand =		303,
199
200	/* Container Commands */
201	ContainerCommand =		500,
202	ContainerCommand64 =		501,
203
204	/* Cluster Commands */
205	ClusterCommand =		550,
206
207	/* Scsi Port commands (scsi passthrough) */
208	ScsiPortCommand =		600,
209
210	/* misc house keeping and generic adapter initiated commands */
211	AifRequest =			700,
212	CheckRevision =			701,
213	FsaHostShutdown =		702,
214	RequestAdapterInfo =		703,
215	IsAdapterPaused =		704,
216	SendHostTime =			705,
217	LastMiscCommand =		706
218} AAC_FibCommands;
219
220/*
221 * FIB types
222 */
223#define AAC_FIBTYPE_TFIB	1
224#define AAC_FIBTYPE_TQE		2
225#define AAC_FIBTYPE_TCTPERF	3
226
227/*
228 * FIB transfer state
229 */
230#define AAC_FIBSTATE_HOSTOWNED		(1<<0)	/* owned by the host */
231#define AAC_FIBSTATE_ADAPTEROWNED	(1<<1)	/* owned by the adapter */
232#define AAC_FIBSTATE_INITIALISED	(1<<2)	/* initialised */
233#define AAC_FIBSTATE_EMPTY		(1<<3)	/* empty */
234#define AAC_FIBSTATE_FROMPOOL		(1<<4)	/* allocated from pool */
235#define AAC_FIBSTATE_FROMHOST		(1<<5)	/* sent from the host */
236#define AAC_FIBSTATE_FROMADAP		(1<<6)	/* sent from the adapter */
237#define AAC_FIBSTATE_REXPECTED		(1<<7)	/* response is expected */
238#define AAC_FIBSTATE_RNOTEXPECTED	(1<<8)	/* response is not expected */
239#define AAC_FIBSTATE_DONEADAP		(1<<9)	/* processed by the adapter */
240#define AAC_FIBSTATE_DONEHOST		(1<<10)	/* processed by the host */
241#define AAC_FIBSTATE_HIGH		(1<<11)	/* high priority */
242#define AAC_FIBSTATE_NORM		(1<<12)	/* normal priority */
243#define AAC_FIBSTATE_ASYNC		(1<<13)
244#define AAC_FIBSTATE_ASYNCIO		(1<<13)	/* to be removed */
245#define AAC_FIBSTATE_PAGEFILEIO		(1<<14)	/* to be removed */
246#define AAC_FIBSTATE_SHUTDOWN		(1<<15)
247#define AAC_FIBSTATE_LAZYWRITE		(1<<16)	/* to be removed */
248#define AAC_FIBSTATE_ADAPMICROFIB	(1<<17)
249#define AAC_FIBSTATE_BIOSFIB		(1<<18)
250#define AAC_FIBSTATE_FAST_RESPONSE	(1<<19)	/* fast response capable */
251#define AAC_FIBSTATE_APIFIB		(1<<20)
252
253/*
254 * FIB error values
255 */
256#define AAC_ERROR_NORMAL			0x00
257#define AAC_ERROR_PENDING			0x01
258#define AAC_ERROR_FATAL				0x02
259#define AAC_ERROR_INVALID_QUEUE			0x03
260#define AAC_ERROR_NOENTRIES			0x04
261#define AAC_ERROR_SENDFAILED			0x05
262#define AAC_ERROR_INVALID_QUEUE_PRIORITY	0x06
263#define AAC_ERROR_FIB_ALLOCATION_FAILED		0x07
264#define AAC_ERROR_FIB_DEALLOCATION_FAILED	0x08
265
266/*
267 * Adapter Init Structure: this is passed to the adapter with the
268 * AAC_MONKER_INITSTRUCT command to point it at our control structures.
269 */
270struct aac_adapter_init {
271	u_int32_t	InitStructRevision;
272#define AAC_INIT_STRUCT_REVISION		3
273	u_int32_t	MiniPortRevision;
274#define AAC_INIT_STRUCT_MINIPORT_REVISION	1
275	u_int32_t	FilesystemRevision;
276	u_int32_t	CommHeaderAddress;
277	u_int32_t	FastIoCommAreaAddress;
278	u_int32_t	AdapterFibsPhysicalAddress;
279	u_int32_t 	AdapterFibsVirtualAddress;
280	u_int32_t	AdapterFibsSize;
281	u_int32_t	AdapterFibAlign;
282	u_int32_t	PrintfBufferAddress;
283	u_int32_t	PrintfBufferSize;
284#define	AAC_PAGE_SIZE				4096
285	u_int32_t	HostPhysMemPages;
286	u_int32_t	HostElapsedSeconds;
287} __packed;
288
289/*
290 * Shared data types
291 */
292/*
293 * Container types
294 */
295typedef enum {
296	CT_NONE = 0,
297	CT_VOLUME,
298	CT_MIRROR,
299	CT_STRIPE,
300	CT_RAID5,
301	CT_SSRW,
302	CT_SSRO,
303	CT_MORPH,
304	CT_PASSTHRU,
305	CT_RAID4,
306	CT_RAID10,                  /* stripe of mirror */
307	CT_RAID00,                  /* stripe of stripe */
308	CT_VOLUME_OF_MIRRORS,       /* volume of mirror */
309	CT_PSEUDO_RAID3,            /* really raid4 */
310	CT_RAID50,		    /* stripe of raid5 */
311} AAC_FSAVolType;
312
313/*
314 * Host-addressable object types
315 */
316typedef enum {
317	FT_REG = 1,     /* regular file */
318	FT_DIR,         /* directory */
319	FT_BLK,         /* "block" device - reserved */
320	FT_CHR,         /* "character special" device - reserved */
321	FT_LNK,         /* symbolic link */
322	FT_SOCK,        /* socket */
323	FT_FIFO,        /* fifo */
324	FT_FILESYS,     /* ADAPTEC's "FSA"(tm) filesystem */
325	FT_DRIVE,       /* physical disk - addressable in scsi by b/t/l */
326	FT_SLICE,       /* virtual disk - raw volume - slice */
327	FT_PARTITION,   /* FSA partition - carved out of a slice - building
328			 * block for containers */
329	FT_VOLUME,      /* Container - Volume Set */
330	FT_STRIPE,      /* Container - Stripe Set */
331	FT_MIRROR,      /* Container - Mirror Set */
332	FT_RAID5,       /* Container - Raid 5 Set */
333	FT_DATABASE     /* Storage object with "foreign" content manager */
334} AAC_FType;
335
336/*
337 * Host-side scatter/gather list for 32-bit commands.
338 */
339struct aac_sg_entry {
340	u_int32_t	SgAddress;
341	u_int32_t	SgByteCount;
342} __packed;
343
344struct aac_sg_entry64 {
345	u_int64_t	SgAddress;
346	u_int32_t	SgByteCount;
347} __packed;
348
349struct aac_sg_table {
350	u_int32_t		SgCount;
351	struct aac_sg_entry	SgEntry[0];
352} __packed;
353
354/*
355 * Host-side scatter/gather list for 64-bit commands.
356 */
357struct aac_sg_table64 {
358	u_int32_t	SgCount;
359	struct aac_sg_entry64	SgEntry64[0];
360} __packed;
361
362/*
363 * Container creation data
364 */
365struct 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} __packed;
377
378/*
379 * Revision number handling
380 */
381
382typedef enum {
383	RevApplication = 1,
384	RevDkiCli,
385	RevNetService,
386	RevApi,
387	RevFileSysDriver,
388	RevMiniportDriver,
389	RevAdapterSW,
390	RevMonitor,
391	RevRemoteApi
392} RevComponent;
393
394struct FsaRevision {
395	union {
396		struct {
397			u_int8_t	dash;
398			u_int8_t	type;
399			u_int8_t	minor;
400			u_int8_t	major;
401		} comp;
402		u_int32_t	ul;
403	} external;
404	u_int32_t	buildNumber;
405}  __packed;
406
407/*
408 * Adapter Information
409 */
410
411typedef enum {
412	CPU_NTSIM = 1,
413	CPU_I960,
414	CPU_ARM,
415	CPU_SPARC,
416	CPU_POWERPC,
417	CPU_ALPHA,
418	CPU_P7,
419	CPU_I960_RX,
420	CPU__last
421} AAC_CpuType;
422
423typedef enum {
424	CPUI960_JX = 1,
425	CPUI960_CX,
426	CPUI960_HX,
427	CPUI960_RX,
428	CPUARM_SA110,
429	CPUARM_xxx,
430	CPUMPC_824x,
431	CPUPPC_xxx,
432	CPUSUBTYPE__last
433} AAC_CpuSubType;
434
435typedef enum {
436	PLAT_NTSIM = 1,
437	PLAT_V3ADU,
438	PLAT_CYCLONE,
439	PLAT_CYCLONE_HD,
440	PLAT_BATBOARD,
441	PLAT_BATBOARD_HD,
442	PLAT_YOLO,
443	PLAT_COBRA,
444	PLAT_ANAHEIM,
445	PLAT_JALAPENO,
446	PLAT_QUEENS,
447	PLAT_JALAPENO_DELL,
448	PLAT_POBLANO,
449	PLAT_POBLANO_OPAL,
450	PLAT_POBLANO_SL0,
451	PLAT_POBLANO_SL1,
452	PLAT_POBLANO_SL2,
453	PLAT_POBLANO_XXX,
454	PLAT_JALAPENO_P2,
455	PLAT_HABANERO,
456	PLAT__last
457} AAC_Platform;
458
459typedef enum {
460	OEM_FLAVOR_ADAPTEC = 1,
461	OEM_FLAVOR_DELL,
462	OEM_FLAVOR_HP,
463	OEM_FLAVOR_IBM,
464	OEM_FLAVOR_CPQ,
465	OEM_FLAVOR_BRAND_X,
466	OEM_FLAVOR_BRAND_Y,
467	OEM_FLAVOR_BRAND_Z,
468	OEM_FLAVOR__last
469} AAC_OemFlavor;
470
471/*
472 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
473 */
474typedef enum
475{
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;
482
483/*
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
487 */
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
501
502/*
503 * Structure used to respond to a RequestAdapterInfo fib.
504 */
505struct aac_adapter_info {
506	AAC_Platform		PlatformBase;    /* adapter type */
507	AAC_CpuType		CpuArchitecture; /* adapter CPU type */
508	AAC_CpuSubType		CpuVariant;      /* adapter CPU subtype */
509	u_int32_t		ClockSpeed;      /* adapter CPU clockspeed */
510	u_int32_t		ExecutionMem;    /* adapter Execution Memory
511						  * size */
512	u_int32_t		BufferMem;       /* adapter Data Memory */
513	u_int32_t		TotalMem;        /* adapter Total Memory */
514	struct FsaRevision	KernelRevision;  /* adapter Kernel Software
515						  * Revision */
516	struct FsaRevision	MonitorRevision; /* adapter Monitor/Diagnostic
517						  * Software Revision */
518	struct FsaRevision	HardwareRevision;/* TBD */
519	struct FsaRevision	BIOSRevision;    /* adapter BIOS Revision */
520	u_int32_t		ClusteringEnabled;
521	u_int32_t		ClusterChannelMask;
522	u_int64_t		SerialNumber;
523	AAC_BatteryPlatform	batteryPlatform;
524	u_int32_t		SupportedOptions; /* supported features of this
525						   * controller */
526	AAC_OemFlavor	OemVariant;
527} __packed;
528
529/*
530 * Monitor/Kernel interface.
531 */
532
533/*
534 * Synchronous commands to the monitor/kernel.
535 */
536#define AAC_MONKER_INITSTRUCT	0x05
537#define AAC_MONKER_SYNCFIB	0x0c
538#define AAC_MONKER_GETKERNVER	0x11
539#define AAC_MONKER_GETINFO	0x19
540
541/*
542 *  Adapter Status Register
543 *
544 *  Phase Staus mailbox is 32bits:
545 *  <31:16> = Phase Status
546 *  <15:0>  = Phase
547 *
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.
552 */
553#define AAC_SELF_TEST_FAILED	0x00000004
554#define	AAC_MONITOR_PANIC	0x00000020
555#define AAC_UP_AND_RUNNING	0x00000080
556#define AAC_KERNEL_PANIC	0x00000100
557
558/*
559 * Data types relating to control and monitoring of the NVRAM/WriteCache
560 * subsystem.
561 */
562
563#define AAC_NFILESYS	24	/* maximum number of filesystems */
564
565/*
566 * NVRAM/Write Cache subsystem states
567 */
568typedef enum {
569	NVSTATUS_DISABLED = 0,	/* present, clean, not being used */
570	NVSTATUS_ENABLED,	/* present, possibly dirty, ready for use */
571	NVSTATUS_ERROR,		/* present, dirty, contains dirty data */
572	NVSTATUS_BATTERY,	/* present, bad or low battery, may contain
573				 * dirty data */
574	NVSTATUS_UNKNOWN	/* for bad/missing device */
575} AAC_NVSTATUS;
576
577/*
578 * NVRAM/Write Cache subsystem battery component states
579 *
580 */
581typedef enum {
582	NVBATTSTATUS_NONE = 0,	/* battery has no power or is not present */
583	NVBATTSTATUS_LOW,	/* battery is low on power */
584	NVBATTSTATUS_OK,	/* battery is okay - normal operation possible
585				 * only in this state */
586	NVBATTSTATUS_RECONDITIONING	/* no battery present - reconditioning
587					 * in process */
588} AAC_NVBATTSTATUS;
589
590/*
591 * Battery transition type
592 */
593typedef enum {
594	NVBATT_TRANSITION_NONE = 0,	/* battery now has no power or is not
595					 * present */
596	NVBATT_TRANSITION_LOW,		/* battery is now low on power */
597	NVBATT_TRANSITION_OK		/* battery is now okay - normal
598					 * operation possible only in this
599					 * state */
600} AAC_NVBATT_TRANSITION;
601
602/*
603 * NVRAM Info structure returned for NVRAM_GetInfo call
604 */
605struct aac_nvramdevinfo {
606	u_int32_t	NV_Enabled;	/* write caching enabled */
607	u_int32_t	NV_Error;	/* device in error state */
608	u_int32_t	NV_NDirty;	/* count of dirty NVRAM buffers */
609	u_int32_t	NV_NActive;	/* count of NVRAM buffers being
610					 * written */
611} __packed;
612
613struct aac_nvraminfo {
614	AAC_NVSTATUS		NV_Status;	/* nvram subsystem status */
615	AAC_NVBATTSTATUS	NV_BattStatus;	/* battery status */
616	u_int32_t		NV_Size;	/* size of WriteCache NVRAM in
617						 * bytes */
618	u_int32_t		NV_BufSize;	/* size of NVRAM buffers in
619						 * bytes */
620	u_int32_t		NV_NBufs;	/* number of NVRAM buffers */
621	u_int32_t		NV_NDirty;	/* Num dirty NVRAM buffers */
622	u_int32_t		NV_NClean;	/* Num clean NVRAM buffers */
623	u_int32_t		NV_NActive;	/* Num NVRAM buffers being
624						 * written */
625	u_int32_t		NV_NBrokered;	/* Num brokered NVRAM buffers */
626	struct aac_nvramdevinfo	NV_DevInfo[AAC_NFILESYS];	/* per device
627								 * info */
628	u_int32_t		NV_BattNeedsReconditioning;	/* boolean */
629	u_int32_t		NV_TotalSize;	/* size of all non-volatile
630						 * memories in bytes */
631} __packed;
632
633/*
634 * Data types relating to adapter-initiated FIBs
635 *
636 * Based on types and structures in <aifstruc.h>
637 */
638
639/*
640 * Progress Reports
641 */
642typedef enum {
643	AifJobStsSuccess = 1,
644	AifJobStsFinished,
645	AifJobStsAborted,
646	AifJobStsFailed,
647	AifJobStsLastReportMarker = 100,	/* All prior mean last report */
648	AifJobStsSuspended,
649	AifJobStsRunning
650} AAC_AifJobStatus;
651
652typedef enum {
653	AifJobScsiMin = 1,		/* Minimum value for Scsi operation */
654	AifJobScsiZero,			/* SCSI device clear operation */
655	AifJobScsiVerify,		/* SCSI device Verify operation NO
656					 * REPAIR */
657	AifJobScsiExercise,		/* SCSI device Exercise operation */
658	AifJobScsiVerifyRepair,		/* SCSI device Verify operation WITH
659					 * repair */
660	AifJobScsiMax = 99,		/* Max Scsi value */
661	AifJobCtrMin,			/* Min Ctr op value */
662	AifJobCtrZero,			/* Container clear operation */
663	AifJobCtrCopy,			/* Container copy operation */
664	AifJobCtrCreateMirror,		/* Container Create Mirror operation */
665	AifJobCtrMergeMirror,		/* Container Merge Mirror operation */
666	AifJobCtrScrubMirror,		/* Container Scrub Mirror operation */
667	AifJobCtrRebuildRaid5,		/* Container Rebuild Raid5 operation */
668	AifJobCtrScrubRaid5,		/* Container Scrub Raid5 operation */
669	AifJobCtrMorph,			/* Container morph operation */
670	AifJobCtrPartCopy,		/* Container Partition copy operation */
671	AifJobCtrRebuildMirror,		/* Container Rebuild Mirror operation */
672	AifJobCtrCrazyCache,		/* crazy cache */
673	AifJobCtrMax = 199,		/* Max Ctr type operation */
674	AifJobFsMin,			/* Min Fs type operation */
675	AifJobFsCreate,			/* File System Create operation */
676	AifJobFsVerify,			/* File System Verify operation */
677	AifJobFsExtend,			/* File System Extend operation */
678	AifJobFsMax = 299,		/* Max Fs type operation */
679	AifJobApiFormatNTFS,		/* Format a drive to NTFS */
680	AifJobApiFormatFAT,		/* Format a drive to FAT */
681	AifJobApiUpdateSnapshot,	/* update the read/write half of a
682					 * snapshot */
683	AifJobApiFormatFAT32,		/* Format a drive to FAT32 */
684	AifJobApiMax = 399,		/* Max API type operation */
685	AifJobCtlContinuousCtrVerify,	/* Adapter operation */
686	AifJobCtlMax = 499		/* Max Adapter type operation */
687} AAC_AifJobType;
688
689struct aac_AifContainers {
690	u_int32_t	src;		/* from/master */
691	u_int32_t	dst;		/* to/slave */
692} __packed;
693
694union aac_AifJobClient {
695	struct aac_AifContainers	container;	/* For Container and
696							 * filesystem progress
697							 * ops; */
698	int32_t				scsi_dh;	/* For SCSI progress
699							 * ops */
700};
701
702struct aac_AifJobDesc {
703	u_int32_t		jobID;		/* DO NOT FILL IN! Will be
704						 * filled in by AIF */
705	AAC_AifJobType		type;		/* Operation that is being
706						 * performed */
707	union aac_AifJobClient	client;		/* Details */
708} __packed;
709
710struct aac_AifJobProgressReport {
711	struct aac_AifJobDesc	jd;
712	AAC_AifJobStatus	status;
713	u_int32_t		finalTick;
714	u_int32_t		currentTick;
715	u_int32_t		jobSpecificData1;
716	u_int32_t		jobSpecificData2;
717} __packed;
718
719/*
720 * Event Notification
721 */
722typedef enum {
723	/* General application notifies start here */
724	AifEnGeneric = 1,		/* Generic notification */
725	AifEnTaskComplete,		/* Task has completed */
726	AifEnConfigChange,		/* Adapter config change occurred */
727	AifEnContainerChange,		/* Adapter specific container
728					 * configuration change */
729	AifEnDeviceFailure,		/* SCSI device failed */
730	AifEnMirrorFailover,		/* Mirror failover started */
731	AifEnContainerEvent,		/* Significant container event */
732	AifEnFileSystemChange,		/* File system changed */
733	AifEnConfigPause,		/* Container pause event */
734	AifEnConfigResume,		/* Container resume event */
735	AifEnFailoverChange,		/* Failover space assignment changed */
736	AifEnRAID5RebuildDone,		/* RAID5 rebuild finished */
737	AifEnEnclosureManagement,	/* Enclosure management event */
738	AifEnBatteryEvent,		/* Significant NV battery event */
739	AifEnAddContainer,		/* A new container was created. */
740	AifEnDeleteContainer,		/* A container was deleted. */
741	AifEnSMARTEvent, 	       	/* SMART Event */
742	AifEnBatteryNeedsRecond,	/* The battery needs reconditioning */
743	AifEnClusterEvent,		/* Some cluster event */
744	AifEnDiskSetEvent,		/* A disk set event occured. */
745	AifDriverNotifyStart=199,	/* Notifies for host driver go here */
746	/* Host driver notifications start here */
747	AifDenMorphComplete, 		/* A morph operation completed */
748	AifDenVolumeExtendComplete 	/* Volume expand operation completed */
749} AAC_AifEventNotifyType;
750
751struct aac_AifEnsGeneric {
752	char	text[132];		/* Generic text */
753} __packed;
754
755struct aac_AifEnsDeviceFailure {
756	u_int32_t	deviceHandle;	/* SCSI device handle */
757} __packed;
758
759struct aac_AifEnsMirrorFailover {
760	u_int32_t	container;	/* Container with failed element */
761	u_int32_t	failedSlice;	/* Old slice which failed */
762	u_int32_t	creatingSlice;	/* New slice used for auto-create */
763} __packed;
764
765struct aac_AifEnsContainerChange {
766	u_int32_t	container[2];	/* container that changed, -1 if no
767					 * container */
768} __packed;
769
770struct aac_AifEnsContainerEvent {
771	u_int32_t	container;	/* container number  */
772	u_int32_t	eventType;	/* event type */
773} __packed;
774
775struct aac_AifEnsEnclosureEvent {
776	u_int32_t	empID;		/* enclosure management proc number  */
777	u_int32_t	unitID;		/* unitId, fan id, power supply id,
778					 * slot id, tempsensor id.  */
779	u_int32_t	eventType;	/* event type */
780} __packed;
781
782struct aac_AifEnsBatteryEvent {
783	AAC_NVBATT_TRANSITION	transition_type;	/* eg from low to ok */
784	AAC_NVBATTSTATUS	current_state;		/* current batt state */
785	AAC_NVBATTSTATUS	prior_state;		/* prev batt state */
786} __packed;
787
788struct aac_AifEnsDiskSetEvent {
789	u_int32_t	eventType;
790	u_int64_t	DsNum;
791	u_int64_t	CreatorId;
792} __packed;
793
794typedef enum {
795	CLUSTER_NULL_EVENT = 0,
796	CLUSTER_PARTNER_NAME_EVENT,	/* change in partner hostname or
797					 * adaptername from NULL to non-NULL */
798	/* (partner's agent may be up) */
799	CLUSTER_PARTNER_NULL_NAME_EVENT	/* change in partner hostname or
800					 * adaptername from non-null to NULL */
801	/* (partner has rebooted) */
802} AAC_ClusterAifEvent;
803
804struct aac_AifEnsClusterEvent {
805	AAC_ClusterAifEvent	eventType;
806} __packed;
807
808struct aac_AifEventNotify {
809	AAC_AifEventNotifyType	type;
810	union {
811		struct aac_AifEnsGeneric		EG;
812		struct aac_AifEnsDeviceFailure		EDF;
813		struct aac_AifEnsMirrorFailover		EMF;
814		struct aac_AifEnsContainerChange	ECC;
815		struct aac_AifEnsContainerEvent		ECE;
816		struct aac_AifEnsEnclosureEvent		EEE;
817		struct aac_AifEnsBatteryEvent		EBE;
818		struct aac_AifEnsDiskSetEvent		EDS;
819/*		struct aac_AifEnsSMARTEvent		ES;*/
820		struct aac_AifEnsClusterEvent		ECLE;
821	} data;
822} __packed;
823
824/*
825 * Adapter Initiated FIB command structures. Start with the adapter
826 * initiated FIBs that really come from the adapter, and get responded
827 * to by the host.
828 */
829#define AAC_AIF_REPORT_MAX_SIZE 64
830
831typedef enum {
832	AifCmdEventNotify = 1,	/* Notify of event */
833	AifCmdJobProgress,	/* Progress report */
834	AifCmdAPIReport,	/* Report from other user of API */
835	AifCmdDriverNotify,	/* Notify host driver of event */
836	AifReqJobList = 100,	/* Gets back complete job list */
837	AifReqJobsForCtr,	/* Gets back jobs for specific container */
838	AifReqJobsForScsi,	/* Gets back jobs for specific SCSI device */
839	AifReqJobReport,	/* Gets back a specific job report or list */
840	AifReqTerminateJob,	/* Terminates job */
841	AifReqSuspendJob,	/* Suspends a job */
842	AifReqResumeJob,	/* Resumes a job */
843	AifReqSendAPIReport,	/* API generic report requests */
844	AifReqAPIJobStart,	/* Start a job from the API */
845	AifReqAPIJobUpdate,	/* Update a job report from the API */
846	AifReqAPIJobFinish	/* Finish a job from the API */
847} AAC_AifCommand;
848
849struct aac_aif_command {
850	AAC_AifCommand	command;	/* Tell host what type of
851					 * notify this is */
852	u_int32_t	seqNumber;	/* To allow ordering of
853					 * reports (if necessary) */
854	union {
855		struct aac_AifEventNotify	EN;	/* Event notify */
856		struct aac_AifJobProgressReport	PR[1];	/* Progress report */
857		u_int8_t			AR[AAC_AIF_REPORT_MAX_SIZE];
858		u_int8_t			data[AAC_FIB_DATASIZE - 8];
859	} data;
860} __packed;
861
862/*
863 * Filesystem commands/data
864 *
865 * The adapter has a very complex filesystem interface, most of which we ignore.
866 * (And which seems not to be implemented, anyway.)
867 */
868
869/*
870 * FSA commands
871 * (not used?)
872 */
873typedef enum {
874	Null = 0,
875	GetAttributes,
876	SetAttributes,
877	Lookup,
878	ReadLink,
879	Read,
880	Write,
881	Create,
882	MakeDirectory,
883	SymbolicLink,
884	MakeNode,
885	Removex,
886	RemoveDirectory,
887	Rename,
888	Link,
889	ReadDirectory,
890	ReadDirectoryPlus,
891	FileSystemStatus,
892	FileSystemInfo,
893	PathConfigure,
894	Commit,
895	Mount,
896	UnMount,
897	Newfs,
898	FsCheck,
899	FsSync,
900	SimReadWrite,
901	SetFileSystemStatus,
902	BlockRead,
903	BlockWrite,
904	NvramIoctl,
905	FsSyncWait,
906	ClearArchiveBit,
907	SetAcl,
908	GetAcl,
909	AssignAcl,
910	FaultInsertion,
911	CrazyCache
912} AAC_FSACommand;
913
914/*
915 * Command status values
916 */
917typedef enum {
918	ST_OK = 0,
919	ST_PERM = 1,
920	ST_NOENT = 2,
921	ST_IO = 5,
922	ST_NXIO = 6,
923	ST_E2BIG = 7,
924	ST_ACCES = 13,
925	ST_EXIST = 17,
926	ST_XDEV = 18,
927	ST_NODEV = 19,
928	ST_NOTDIR = 20,
929	ST_ISDIR = 21,
930	ST_INVAL = 22,
931	ST_FBIG = 27,
932	ST_NOSPC = 28,
933	ST_ROFS = 30,
934	ST_MLINK = 31,
935	ST_WOULDBLOCK = 35,
936	ST_NAMETOOLONG = 63,
937	ST_NOTEMPTY = 66,
938	ST_DQUOT = 69,
939	ST_STALE = 70,
940	ST_REMOTE = 71,
941	ST_BADHANDLE = 10001,
942	ST_NOT_SYNC = 10002,
943	ST_BAD_COOKIE = 10003,
944	ST_NOTSUPP = 10004,
945	ST_TOOSMALL = 10005,
946	ST_SERVERFAULT = 10006,
947	ST_BADTYPE = 10007,
948	ST_JUKEBOX = 10008,
949	ST_NOTMOUNTED = 10009,
950	ST_MAINTMODE = 10010,
951	ST_STALEACL = 10011
952} AAC_FSAStatus;
953
954/*
955 * Volume manager commands
956 */
957typedef enum _VM_COMMANDS {
958	VM_Null = 0,
959	VM_NameServe,
960	VM_ContainerConfig,
961	VM_Ioctl,
962	VM_FilesystemIoctl,
963	VM_CloseAll,
964	VM_CtBlockRead,
965	VM_CtBlockWrite,
966	VM_SliceBlockRead,	 /* raw access to configured storage objects */
967	VM_SliceBlockWrite,
968	VM_DriveBlockRead,	 /* raw access to physical devices */
969	VM_DriveBlockWrite,
970	VM_EnclosureMgt,	 /* enclosure management */
971	VM_Unused,		 /* used to be diskset management */
972	VM_CtBlockVerify,
973	VM_CtPerf,		 /* performance test */
974	VM_CtBlockRead64,
975	VM_CtBlockWrite64,
976	VM_CtBlockVerify64,
977	VM_CtHostRead64,
978	VM_CtHostWrite64,
979} AAC_VMCommand;
980
981/*
982 * "mountable object"
983 */
984struct aac_mntobj {
985	u_int32_t			ObjectId;
986	char				FileSystemName[16];
987	struct aac_container_creation	CreateInfo;
988	u_int32_t			Capacity;
989	u_int32_t			VolType;
990	u_int32_t			ObjType;
991	u_int32_t			ContentState;
992#define FSCS_READONLY		0x0002		/* XXX need more information
993						 * than this */
994	union {
995		u_int32_t	pad[8];
996	} ObjExtension;
997	u_int32_t			AlterEgoId;
998} __packed;
999
1000struct aac_mntinfo {
1001	u_int32_t		Command;
1002	u_int32_t		MntType;
1003	u_int32_t		MntCount;
1004} __packed;
1005
1006struct aac_mntinforesp {
1007	u_int32_t		Status;
1008	u_int32_t		MntType;
1009	u_int32_t		MntRespCount;
1010	struct aac_mntobj	MntTable[1];
1011} __packed;
1012
1013/*
1014 * Container shutdown command.
1015 */
1016struct aac_closecommand {
1017	u_int32_t	Command;
1018	u_int32_t	ContainerId;
1019} __packed;
1020
1021/*
1022 * Container Config Command
1023 */
1024#define CT_GET_SCSI_METHOD	64
1025struct aac_ctcfg {
1026	u_int32_t		Command;
1027	u_int32_t		cmd;
1028	u_int32_t		param;
1029} __packed;
1030
1031struct aac_ctcfg_resp {
1032	u_int32_t		Status;
1033	u_int32_t		resp;
1034	u_int32_t		param;
1035} __packed;
1036
1037/*
1038 * 'Ioctl' commads
1039 */
1040#define AAC_SCSI_MAX_PORTS	10
1041#define AAC_BUS_NO_EXIST	0
1042#define AAC_BUS_VALID		1
1043#define AAC_BUS_FAULTED		2
1044#define AAC_BUS_DISABLED	3
1045#define GetBusInfo		0x9
1046
1047struct aac_getbusinf {
1048	u_int32_t		ProbeComplete;
1049	u_int32_t		BusCount;
1050	u_int32_t		TargetsPerBus;
1051	u_int8_t		InitiatorBusId[AAC_SCSI_MAX_PORTS];
1052	u_int8_t		BusValid[AAC_SCSI_MAX_PORTS];
1053} __packed;
1054
1055struct aac_vmioctl {
1056	u_int32_t		Command;
1057	u_int32_t		ObjType;
1058	u_int32_t		MethId;
1059	u_int32_t		ObjId;
1060	u_int32_t		IoctlCmd;
1061	u_int32_t		IoctlBuf[1];	/* Placeholder? */
1062} __packed;
1063
1064struct aac_vmi_businf_resp {
1065	u_int32_t		Status;
1066	u_int32_t		ObjType;
1067	u_int32_t		MethId;
1068	u_int32_t		ObjId;
1069	u_int32_t		IoctlCmd;
1070	struct aac_getbusinf	BusInf;
1071} __packed;
1072
1073#define AAC_BTL_TO_HANDLE(b, t, l) \
1074    (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf))
1075#define GetDeviceProbeInfo 0x5
1076
1077struct aac_vmi_devinfo_resp {
1078	u_int32_t		Status;
1079	u_int32_t		ObjType;
1080	u_int32_t		MethId;
1081	u_int32_t		ObjId;
1082	u_int32_t		IoctlCmd;
1083	u_int8_t		VendorId[8];
1084	u_int8_t		ProductId[16];
1085	u_int8_t		ProductRev[4];
1086	u_int32_t		Inquiry7;
1087	u_int32_t		align1;
1088	u_int32_t		Inquiry0;
1089	u_int32_t		align2;
1090	u_int32_t		Inquiry1;
1091	u_int32_t		align3;
1092	u_int32_t		reserved[2];
1093	u_int8_t		VendorSpecific[20];
1094	u_int32_t		Smart:1;
1095	u_int32_t		AAC_Managed:1;
1096	u_int32_t		align4;
1097	u_int32_t		reserved2:6;
1098	u_int32_t		Bus;
1099	u_int32_t		Target;
1100	u_int32_t		Lun;
1101	u_int32_t		ultraEnable:1,
1102				disconnectEnable:1,
1103				fast20EnabledW:1,
1104				scamDevice:1,
1105				scamTolerant:1,
1106				setForSync:1,
1107				setForWide:1,
1108				syncDevice:1,
1109				wideDevice:1,
1110				reserved1:7,
1111				ScsiRate:8,
1112				ScsiOffset:8;
1113}; /* Do not pack */
1114
1115#define ResetBus 0x16
1116struct aac_resetbus {
1117	u_int32_t		BusNumber;
1118};
1119
1120/*
1121 * Write 'stability' options.
1122 */
1123typedef enum {
1124	CSTABLE = 1,
1125	CUNSTABLE
1126} AAC_CacheLevel;
1127
1128/*
1129 * Commit level response for a write request.
1130 */
1131typedef enum {
1132	CMFILE_SYNC_NVRAM = 1,
1133	CMDATA_SYNC_NVRAM,
1134	CMFILE_SYNC,
1135	CMDATA_SYNC,
1136	CMUNSTABLE
1137} AAC_CommitLevel;
1138
1139/*
1140 * Block read/write operations.
1141 * These structures are packed into the 'data' area in the FIB.
1142 */
1143
1144struct aac_blockread {
1145	u_int32_t		Command;	/* not FSACommand! */
1146	u_int32_t		ContainerId;
1147	u_int32_t		BlockNumber;
1148	u_int32_t		ByteCount;
1149	struct aac_sg_table	SgMap;		/* variable size */
1150} __packed;
1151
1152struct aac_blockread64 {
1153	u_int32_t		Command;
1154	u_int16_t		ContainerId;
1155	u_int16_t		SectorCount;
1156	u_int32_t		BlockNumber;
1157	u_int16_t		Pad;
1158	u_int16_t		Flags;
1159	struct aac_sg_table64	SgMap64;
1160} __packed;
1161
1162struct aac_blockread_response {
1163	u_int32_t		Status;
1164	u_int32_t		ByteCount;
1165} __packed;
1166
1167struct aac_blockwrite {
1168	u_int32_t		Command;	/* not FSACommand! */
1169	u_int32_t		ContainerId;
1170	u_int32_t		BlockNumber;
1171	u_int32_t		ByteCount;
1172	u_int32_t		Stable;
1173	struct aac_sg_table	SgMap;		/* variable size */
1174} __packed;
1175
1176struct aac_blockwrite64 {
1177	u_int32_t		Command;	/* not FSACommand! */
1178	u_int16_t		ContainerId;
1179	u_int16_t		SectorCount;
1180	u_int32_t		BlockNumber;
1181	u_int16_t		Pad;
1182	u_int16_t		Flags;
1183	struct aac_sg_table64	SgMap64;	/* variable size */
1184} __packed;
1185
1186struct aac_blockwrite_response {
1187	u_int32_t		Status;
1188	u_int32_t		ByteCount;
1189	u_int32_t		Committed;
1190} __packed;
1191
1192/*
1193 * Container shutdown command.
1194 */
1195struct aac_close_command {
1196	u_int32_t		Command;
1197	u_int32_t		ContainerId;
1198};
1199
1200/*
1201 * SCSI Passthrough structures
1202 */
1203struct aac_srb32 {
1204	u_int32_t		function;
1205	u_int32_t		bus;
1206	u_int32_t		target;
1207	u_int32_t		lun;
1208	u_int32_t		timeout;
1209	u_int32_t		flags;
1210	u_int32_t		data_len;
1211	u_int32_t		retry_limit;
1212	u_int32_t		cdb_len;
1213	u_int8_t		cdb[16];
1214	struct aac_sg_table	sg_map32;
1215};
1216
1217enum {
1218	AAC_SRB_FUNC_EXECUTE_SCSI	= 0x00,
1219	AAC_SRB_FUNC_CLAIM_DEVICE,
1220	AAC_SRB_FUNC_IO_CONTROL,
1221	AAC_SRB_FUNC_RECEIVE_EVENT,
1222	AAC_SRB_FUNC_RELEASE_QUEUE,
1223	AAC_SRB_FUNC_ATTACH_DEVICE,
1224	AAC_SRB_FUNC_RELEASE_DEVICE,
1225	AAC_SRB_FUNC_SHUTDOWN,
1226	AAC_SRB_FUNC_FLUSH,
1227	AAC_SRB_FUNC_ABORT_COMMAND	= 0x10,
1228	AAC_SRB_FUNC_RELEASE_RECOVERY,
1229	AAC_SRB_FUNC_RESET_BUS,
1230	AAC_SRB_FUNC_RESET_DEVICE,
1231	AAC_SRB_FUNC_TERMINATE_IO,
1232	AAC_SRB_FUNC_FLUSH_QUEUE,
1233	AAC_SRB_FUNC_REMOVE_DEVICE,
1234	AAC_SRB_FUNC_DOMAIN_VALIDATION
1235};
1236
1237#define AAC_SRB_FLAGS_NO_DATA_XFER		0x0000
1238#define	AAC_SRB_FLAGS_DISABLE_DISCONNECT	0x0004
1239#define	AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER	0x0008
1240#define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE	0x0010
1241#define	AAC_SRB_FLAGS_DISABLE_AUTOSENSE		0x0020
1242#define	AAC_SRB_FLAGS_DATA_IN			0x0040
1243#define AAC_SRB_FLAGS_DATA_OUT			0x0080
1244#define	AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \
1245			(AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT)
1246
1247#define AAC_HOST_SENSE_DATA_MAX			30
1248
1249struct aac_srb_response {
1250	u_int32_t	fib_status;
1251	u_int32_t	srb_status;
1252	u_int32_t	scsi_status;
1253	u_int32_t	data_len;
1254	u_int32_t	sense_len;
1255	u_int8_t	sense[AAC_HOST_SENSE_DATA_MAX];
1256};
1257
1258enum {
1259	AAC_SRB_STS_PENDING			= 0x00,
1260	AAC_SRB_STS_SUCCESS,
1261	AAC_SRB_STS_ABORTED,
1262	AAC_SRB_STS_ABORT_FAILED,
1263	AAC_SRB_STS_ERROR,
1264	AAC_SRB_STS_BUSY,
1265	AAC_SRB_STS_INVALID_REQUEST,
1266	AAC_SRB_STS_INVALID_PATH_ID,
1267	AAC_SRB_STS_NO_DEVICE,
1268	AAC_SRB_STS_TIMEOUT,
1269	AAC_SRB_STS_SELECTION_TIMEOUT,
1270	AAC_SRB_STS_COMMAND_TIMEOUT,
1271	AAC_SRB_STS_MESSAGE_REJECTED		= 0x0D,
1272	AAC_SRB_STS_BUS_RESET,
1273	AAC_SRB_STS_PARITY_ERROR,
1274	AAC_SRB_STS_REQUEST_SENSE_FAILED,
1275	AAC_SRB_STS_NO_HBA,
1276	AAC_SRB_STS_DATA_OVERRUN,
1277	AAC_SRB_STS_UNEXPECTED_BUS_FREE,
1278	AAC_SRB_STS_PHASE_SEQUENCE_FAILURE,
1279	AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH,
1280	AAC_SRB_STS_REQUEST_FLUSHED,
1281	AAC_SRB_STS_INVALID_LUN			= 0x20,
1282	AAC_SRB_STS_INVALID_TARGET_ID,
1283	AAC_SRB_STS_BAD_FUNCTION,
1284	AAC_SRB_STS_ERROR_RECOVERY
1285};
1286
1287/*
1288 * Register set for adapters based on the Falcon bridge and PPC core
1289 */
1290
1291#define AAC_FA_DOORBELL0_CLEAR		0x00
1292#define AAC_FA_DOORBELL1_CLEAR		0x02
1293#define AAC_FA_DOORBELL0		0x04
1294#define AAC_FA_DOORBELL1		0x06
1295#define AAC_FA_MASK0_CLEAR		0x08
1296#define AAC_FA_MASK1_CLEAR		0x0a
1297#define	AAC_FA_MASK0			0x0c
1298#define AAC_FA_MASK1			0x0e
1299#define AAC_FA_MAILBOX			0x10
1300#define	AAC_FA_FWSTATUS			0x2c	/* Mailbox 7 */
1301#define	AAC_FA_INTSRC			0x900
1302
1303#define AAC_FA_HACK(sc)	(void)AAC_GETREG4(sc, AAC_FA_INTSRC)
1304
1305/*
1306 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
1307 * on the SA110 'StrongArm'.
1308 */
1309
1310#define AAC_SA_DOORBELL0_CLEAR		0x98	/* doorbell 0 (adapter->host) */
1311#define AAC_SA_DOORBELL0_SET		0x9c
1312#define AAC_SA_DOORBELL0		0x9c
1313#define AAC_SA_MASK0_CLEAR		0xa0
1314#define AAC_SA_MASK0_SET		0xa4
1315
1316#define AAC_SA_DOORBELL1_CLEAR		0x9a	/* doorbell 1 (host->adapter) */
1317#define AAC_SA_DOORBELL1_SET		0x9e
1318#define AAC_SA_DOORBELL1		0x9e
1319#define AAC_SA_MASK1_CLEAR		0xa2
1320#define AAC_SA_MASK1_SET		0xa6
1321
1322#define AAC_SA_MAILBOX			0xa8	/* mailbox (20 bytes) */
1323#define AAC_SA_FWSTATUS			0xc4
1324
1325/*
1326 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
1327 * and other related adapters.
1328 */
1329
1330#define AAC_RX_IDBR		0x20	/* inbound doorbell register */
1331#define AAC_RX_IISR		0x24	/* inbound interrupt status register */
1332#define AAC_RX_IIMR		0x28	/* inbound interrupt mask register */
1333#define AAC_RX_ODBR		0x2c	/* outbound doorbell register */
1334#define AAC_RX_OISR		0x30	/* outbound interrupt status register */
1335#define AAC_RX_OIMR		0x34	/* outbound interrupt mask register */
1336
1337#define AAC_RX_MAILBOX		0x50	/* mailbox (20 bytes) */
1338#define AAC_RX_FWSTATUS		0x6c
1339
1340/*
1341 * Register definitions for the Adaptec 'Rocket' RAID-On-Chip adapters.
1342 * Unsurprisingly, it's quite similar to the i960!
1343 */
1344
1345#define AAC_RKT_IDBR		0x20	/* inbound doorbell register */
1346#define AAC_RKT_IISR		0x24	/* inbound interrupt status register */
1347#define AAC_RKT_IIMR		0x28	/* inbound interrupt mask register */
1348#define AAC_RKT_ODBR		0x2c	/* outbound doorbell register */
1349#define AAC_RKT_OISR		0x30	/* outbound interrupt status register */
1350#define AAC_RKT_OIMR		0x34	/* outbound interrupt mask register */
1351
1352#define AAC_RKT_MAILBOX		0x1000	/* mailbox */
1353#define AAC_RKT_FWSTATUS	0x101c	/* Firmware Status (mailbox 7) */
1354
1355/*
1356 * Common bit definitions for the doorbell registers.
1357 */
1358
1359/*
1360 * Status bits in the doorbell registers.
1361 */
1362#define AAC_DB_SYNC_COMMAND	(1<<0)	/* send/completed synchronous FIB */
1363#define AAC_DB_COMMAND_READY	(1<<1)	/* posted one or more commands */
1364#define AAC_DB_RESPONSE_READY	(1<<2)	/* one or more commands complete */
1365#define AAC_DB_COMMAND_NOT_FULL	(1<<3)	/* command queue not full */
1366#define AAC_DB_RESPONSE_NOT_FULL (1<<4)	/* response queue not full */
1367
1368/*
1369 * The adapter can request the host print a message by setting the
1370 * DB_PRINTF flag in DOORBELL0.  The driver responds by collecting the
1371 * message from the printf buffer, clearing the DB_PRINTF flag in
1372 * DOORBELL0 and setting it in DOORBELL1.
1373 * (ODBR and IDBR respectively for the i960Rx adapters)
1374 */
1375#define AAC_DB_PRINTF		(1<<5)	/* adapter requests host printf */
1376#define AAC_PRINTF_DONE		(1<<5)	/* Host completed printf processing */
1377
1378/*
1379 * Mask containing the interrupt bits we care about.  We don't anticipate (or
1380 * want) interrupts not in this mask.
1381 */
1382#define AAC_DB_INTERRUPTS	(AAC_DB_COMMAND_READY  |	\
1383				 AAC_DB_RESPONSE_READY |	\
1384				 AAC_DB_PRINTF)
1385