aacreg.h revision 83114
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 83114 2001-09-05 20:43:02Z 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} __attribute__ ((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} __attribute__ ((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	struct fib_list_entry	*Flink;
132	struct fib_list_entry	*Blink;
133} __attribute__ ((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} __attribute__ ((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} __attribute__ ((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	u_int32_t	FilesystemRevision;
275	u_int32_t	CommHeaderAddress;
276	u_int32_t	FastIoCommAreaAddress;
277	u_int32_t	AdapterFibsPhysicalAddress;
278	void		*AdapterFibsVirtualAddress;
279	u_int32_t	AdapterFibsSize;
280	u_int32_t	AdapterFibAlign;
281	u_int32_t	PrintfBufferAddress;
282	u_int32_t	PrintfBufferSize;
283	u_int32_t	HostPhysMemPages;
284	u_int32_t	HostElapsedSeconds;
285} __attribute__ ((packed));
286
287/*
288 * Shared data types
289 */
290/*
291 * Container types
292 */
293typedef enum {
294	CT_NONE = 0,
295	CT_VOLUME,
296	CT_MIRROR,
297	CT_STRIPE,
298	CT_RAID5,
299	CT_SSRW,
300	CT_SSRO,
301	CT_MORPH,
302	CT_PASSTHRU,
303	CT_RAID4,
304	CT_RAID10,                  /* stripe of mirror */
305	CT_RAID00,                  /* stripe of stripe */
306	CT_VOLUME_OF_MIRRORS,       /* volume of mirror */
307	CT_PSEUDO_RAID3,            /* really raid4 */
308} AAC_FSAVolType;
309
310/*
311 * Host-addressable object types
312 */
313typedef enum {
314	FT_REG = 1,     /* regular file */
315	FT_DIR,         /* directory */
316	FT_BLK,         /* "block" device - reserved */
317	FT_CHR,         /* "character special" device - reserved */
318	FT_LNK,         /* symbolic link */
319	FT_SOCK,        /* socket */
320	FT_FIFO,        /* fifo */
321	FT_FILESYS,     /* ADAPTEC's "FSA"(tm) filesystem */
322	FT_DRIVE,       /* physical disk - addressable in scsi by b/t/l */
323	FT_SLICE,       /* virtual disk - raw volume - slice */
324	FT_PARTITION,   /* FSA partition - carved out of a slice - building
325			 * block for containers */
326	FT_VOLUME,      /* Container - Volume Set */
327	FT_STRIPE,      /* Container - Stripe Set */
328	FT_MIRROR,      /* Container - Mirror Set */
329	FT_RAID5,       /* Container - Raid 5 Set */
330	FT_DATABASE     /* Storage object with "foreign" content manager */
331} AAC_FType;
332
333/*
334 * Host-side scatter/gather list for 32-bit commands.
335 */
336struct aac_sg_entry {
337	u_int32_t	SgAddress;
338	u_int32_t	SgByteCount;
339} __attribute__ ((packed));
340
341struct aac_sg_table {
342	u_int32_t		SgCount;
343	struct aac_sg_entry	SgEntry[0];
344} __attribute__ ((packed));
345
346/*
347 * Host-side scatter/gather list for 64-bit commands.
348 */
349struct aac_sg_table64 {
350	u_int8_t	SgCount;
351	u_int8_t	SgSectorsPerPage;
352	u_int16_t	SgByteOffset;
353	u_int64_t	SgEntry[0];
354} __attribute__ ((packed));
355
356/*
357 * Container creation data
358 */
359struct aac_container_creation {
360	u_int8_t	ViaBuildNumber;
361	u_int8_t	MicroSecond;
362	u_int8_t	Via;		/* 1 = FSU, 2 = API, etc. */
363	u_int8_t	YearsSince1900;
364	u_int32_t	Month:4;	/* 1-12 */
365	u_int32_t	Day:6;		/* 1-32 */
366	u_int32_t	Hour:6;		/* 0-23 */
367	u_int32_t	Minute:6;	/* 0-59 */
368	u_int32_t	Second:6;	/* 0-59 */
369	u_int64_t	ViaAdapterSerialNumber;
370} __attribute__ ((packed));
371
372/*
373 * Revision number handling
374 */
375
376typedef enum {
377	RevApplication = 1,
378	RevDkiCli,
379	RevNetService,
380	RevApi,
381	RevFileSysDriver,
382	RevMiniportDriver,
383	RevAdapterSW,
384	RevMonitor,
385	RevRemoteApi
386} RevComponent;
387
388struct FsaRevision {
389	union {
390		struct {
391			u_int8_t	dash;
392			u_int8_t	type;
393			u_int8_t	minor;
394			u_int8_t	major;
395		} comp;
396		u_int32_t	ul;
397	} external;
398	u_int32_t	buildNumber;
399}  __attribute__ ((packed));
400
401/*
402 * Adapter Information
403 */
404
405typedef enum {
406	CPU_NTSIM = 1,
407	CPU_I960,
408	CPU_ARM,
409	CPU_SPARC,
410	CPU_POWERPC,
411	CPU_ALPHA,
412	CPU_P7,
413	CPU_I960_RX,
414	CPU__last
415} AAC_CpuType;
416
417typedef enum {
418	CPUI960_JX = 1,
419	CPUI960_CX,
420	CPUI960_HX,
421	CPUI960_RX,
422	CPUARM_SA110,
423	CPUARM_xxx,
424	CPUPPC_603e,
425	CPUPPC_xxx,
426	CPUSUBTYPE__last
427} AAC_CpuSubType;
428
429typedef enum {
430	PLAT_NTSIM = 1,
431	PLAT_V3ADU,
432	PLAT_CYCLONE,
433	PLAT_CYCLONE_HD,
434	PLAT_BATBOARD,
435	PLAT_BATBOARD_HD,
436	PLAT_YOLO,
437	PLAT_COBRA,
438	PLAT_ANAHEIM,
439	PLAT_JALAPENO,
440	PLAT_QUEENS,
441	PLAT_JALAPENO_DELL,
442	PLAT_POBLANO,
443	PLAT_POBLANO_OPAL,
444	PLAT_POBLANO_SL0,
445	PLAT_POBLANO_SL1,
446	PLAT_POBLANO_SL2,
447	PLAT_POBLANO_XXX,
448	PLAT_JALAPENO_P2,
449	PLAT_HABANERO,
450	PLAT__last
451} AAC_Platform;
452
453typedef enum {
454	OEM_FLAVOR_ADAPTEC = 1,
455	OEM_FLAVOR_DELL,
456	OEM_FLAVOR_HP,
457	OEM_FLAVOR_IBM,
458	OEM_FLAVOR_CPQ,
459	OEM_FLAVOR_BRAND_X,
460	OEM_FLAVOR_BRAND_Y,
461	OEM_FLAVOR_BRAND_Z,
462	OEM_FLAVOR__last
463} AAC_OemFlavor;
464
465/*
466 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
467 */
468typedef enum
469{
470	PLATFORM_BAT_REQ_PRESENT = 1,	/* BATTERY REQUIRED AND PRESENT */
471	PLATFORM_BAT_REQ_NOTPRESENT,	/* BATTERY REQUIRED AND NOT PRESENT */
472	PLATFORM_BAT_OPT_PRESENT,	/* BATTERY OPTIONAL AND PRESENT */
473	PLATFORM_BAT_OPT_NOTPRESENT,	/* BATTERY OPTIONAL AND NOT PRESENT */
474	PLATFORM_BAT_NOT_SUPPORTED	/* BATTERY NOT SUPPORTED */
475} AAC_BatteryPlatform;
476
477/*
478 * options supported by this board
479 * there has to be a one to one mapping of these defines and the ones in
480 * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT
481 */
482#define AAC_SUPPORTED_SNAPSHOT		0x01
483#define AAC_SUPPORTED_CLUSTERS		0x02
484#define AAC_SUPPORTED_WRITE_CACHE	0x04
485#define AAC_SUPPORTED_64BIT_DATA	0x08
486#define AAC_SUPPORTED_HOST_TIME_FIB	0x10
487#define AAC_SUPPORTED_RAID50		0x20
488
489/*
490 * Structure used to respond to a RequestAdapterInfo fib.
491 */
492struct aac_adapter_info {
493	AAC_Platform		PlatformBase;    /* adapter type */
494	AAC_CpuType		CpuArchitecture; /* adapter CPU type */
495	AAC_CpuSubType		CpuVariant;      /* adapter CPU subtype */
496	u_int32_t		ClockSpeed;      /* adapter CPU clockspeed */
497	u_int32_t		ExecutionMem;    /* adapter Execution Memory
498						  * size */
499	u_int32_t		BufferMem;       /* adapter Data Memory */
500	u_int32_t		TotalMem;        /* adapter Total Memory */
501	struct FsaRevision	KernelRevision;  /* adapter Kernel Software
502						  * Revision */
503	struct FsaRevision	MonitorRevision; /* adapter Monitor/Diagnostic
504						  * Software Revision */
505	struct FsaRevision	HardwareRevision;/* TBD */
506	struct FsaRevision	BIOSRevision;    /* adapter BIOS Revision */
507	u_int32_t		ClusteringEnabled;
508	u_int32_t		ClusterChannelMask;
509	u_int64_t		SerialNumber;
510	AAC_BatteryPlatform	batteryPlatform;
511	u_int32_t		SupportedOptions; /* supported features of this
512						   * controller */
513	AAC_OemFlavor	OemVariant;
514} __attribute__ ((packed));
515
516/*
517 * Monitor/Kernel interface.
518 */
519
520/*
521 * Synchronous commands to the monitor/kernel.
522 */
523#define AAC_MONKER_INITSTRUCT	0x05
524#define AAC_MONKER_SYNCFIB	0x0c
525
526/*
527 *  Adapter Status Register
528 *
529 *  Phase Staus mailbox is 32bits:
530 *  <31:16> = Phase Status
531 *  <15:0>  = Phase
532 *
533 *  The adapter reports its present state through the phase.  Only
534 *  a single phase should be ever be set.  Each phase can have multiple
535 *  phase status bits to provide more detailed information about the
536 *  state of the adapter.
537 */
538#define AAC_SELF_TEST_FAILED	0x00000004
539#define AAC_UP_AND_RUNNING	0x00000080
540#define AAC_KERNEL_PANIC	0x00000100
541
542/*
543 * Data types relating to control and monitoring of the NVRAM/WriteCache
544 * subsystem.
545 */
546
547#define AAC_NFILESYS	24	/* maximum number of filesystems */
548
549/*
550 * NVRAM/Write Cache subsystem states
551 */
552typedef enum {
553	NVSTATUS_DISABLED = 0,	/* present, clean, not being used */
554	NVSTATUS_ENABLED,	/* present, possibly dirty, ready for use */
555	NVSTATUS_ERROR,		/* present, dirty, contains dirty data */
556	NVSTATUS_BATTERY,	/* present, bad or low battery, may contain
557				 * dirty data */
558	NVSTATUS_UNKNOWN	/* for bad/missing device */
559} AAC_NVSTATUS;
560
561/*
562 * NVRAM/Write Cache subsystem battery component states
563 *
564 */
565typedef enum {
566	NVBATTSTATUS_NONE = 0,	/* battery has no power or is not present */
567	NVBATTSTATUS_LOW,	/* battery is low on power */
568	NVBATTSTATUS_OK,	/* battery is okay - normal operation possible
569				 * only in this state */
570	NVBATTSTATUS_RECONDITIONING	/* no battery present - reconditioning
571					 * in process */
572} AAC_NVBATTSTATUS;
573
574/*
575 * Battery transition type
576 */
577typedef enum {
578	NVBATT_TRANSITION_NONE = 0,	/* battery now has no power or is not
579					 * present */
580	NVBATT_TRANSITION_LOW,		/* battery is now low on power */
581	NVBATT_TRANSITION_OK		/* battery is now okay - normal
582					 * operation possible only in this
583					 * state */
584} AAC_NVBATT_TRANSITION;
585
586/*
587 * NVRAM Info structure returned for NVRAM_GetInfo call
588 */
589struct aac_nvramdevinfo {
590	u_int32_t	NV_Enabled;	/* write caching enabled */
591	u_int32_t	NV_Error;	/* device in error state */
592	u_int32_t	NV_NDirty;	/* count of dirty NVRAM buffers */
593	u_int32_t	NV_NActive;	/* count of NVRAM buffers being
594					 * written */
595} __attribute__ ((packed));
596
597struct aac_nvraminfo {
598	AAC_NVSTATUS		NV_Status;	/* nvram subsystem status */
599	AAC_NVBATTSTATUS	NV_BattStatus;	/* battery status */
600	u_int32_t		NV_Size;	/* size of WriteCache NVRAM in
601						 * bytes */
602	u_int32_t		NV_BufSize;	/* size of NVRAM buffers in
603						 * bytes */
604	u_int32_t		NV_NBufs;	/* number of NVRAM buffers */
605	u_int32_t		NV_NDirty;	/* Num dirty NVRAM buffers */
606	u_int32_t		NV_NClean;	/* Num clean NVRAM buffers */
607	u_int32_t		NV_NActive;	/* Num NVRAM buffers being
608						 * written */
609	u_int32_t		NV_NBrokered;	/* Num brokered NVRAM buffers */
610	struct aac_nvramdevinfo	NV_DevInfo[AAC_NFILESYS];	/* per device
611								 * info */
612	u_int32_t		NV_BattNeedsReconditioning;	/* boolean */
613	u_int32_t		NV_TotalSize;	/* size of all non-volatile
614						 * memories in bytes */
615} __attribute__ ((packed));
616
617/*
618 * Data types relating to adapter-initiated FIBs
619 *
620 * Based on types and structures in <aifstruc.h>
621 */
622
623/*
624 * Progress Reports
625 */
626typedef enum {
627	AifJobStsSuccess = 1,
628	AifJobStsFinished,
629	AifJobStsAborted,
630	AifJobStsFailed,
631	AifJobStsLastReportMarker = 100,	/* All prior mean last report */
632	AifJobStsSuspended,
633	AifJobStsRunning
634} AAC_AifJobStatus;
635
636typedef enum {
637	AifJobScsiMin = 1,		/* Minimum value for Scsi operation */
638	AifJobScsiZero,			/* SCSI device clear operation */
639	AifJobScsiVerify,		/* SCSI device Verify operation NO
640					 * REPAIR */
641	AifJobScsiExercise,		/* SCSI device Exercise operation */
642	AifJobScsiVerifyRepair,		/* SCSI device Verify operation WITH
643					 * repair */
644	AifJobScsiMax = 99,		/* Max Scsi value */
645	AifJobCtrMin,			/* Min Ctr op value */
646	AifJobCtrZero,			/* Container clear operation */
647	AifJobCtrCopy,			/* Container copy operation */
648	AifJobCtrCreateMirror,		/* Container Create Mirror operation */
649	AifJobCtrMergeMirror,		/* Container Merge Mirror operation */
650	AifJobCtrScrubMirror,		/* Container Scrub Mirror operation */
651	AifJobCtrRebuildRaid5,		/* Container Rebuild Raid5 operation */
652	AifJobCtrScrubRaid5,		/* Container Scrub Raid5 operation */
653	AifJobCtrMorph,			/* Container morph operation */
654	AifJobCtrPartCopy,		/* Container Partition copy operation */
655	AifJobCtrRebuildMirror,		/* Container Rebuild Mirror operation */
656	AifJobCtrCrazyCache,		/* crazy cache */
657	AifJobCtrMax = 199,		/* Max Ctr type operation */
658	AifJobFsMin,			/* Min Fs type operation */
659	AifJobFsCreate,			/* File System Create operation */
660	AifJobFsVerify,			/* File System Verify operation */
661	AifJobFsExtend,			/* File System Extend operation */
662	AifJobFsMax = 299,		/* Max Fs type operation */
663	AifJobApiFormatNTFS,		/* Format a drive to NTFS */
664	AifJobApiFormatFAT,		/* Format a drive to FAT */
665	AifJobApiUpdateSnapshot,	/* update the read/write half of a
666					 * snapshot */
667	AifJobApiFormatFAT32,		/* Format a drive to FAT32 */
668	AifJobApiMax = 399,		/* Max API type operation */
669	AifJobCtlContinuousCtrVerify,	/* Adapter operation */
670	AifJobCtlMax = 499		/* Max Adapter type operation */
671} AAC_AifJobType;
672
673struct aac_AifContainers {
674	u_int32_t	src;		/* from/master */
675	u_int32_t	dst;		/* to/slave */
676} __attribute__ ((packed));
677
678union aac_AifJobClient {
679	struct aac_AifContainers	container;	/* For Container and
680							 * file system progress
681							 * ops; */
682	int32_t				scsi_dh;	/* For SCSI progress
683							 * ops */
684};
685
686struct aac_AifJobDesc {
687	u_int32_t		jobID;		/* DO NOT FILL IN! Will be
688						 * filled in by AIF */
689	AAC_AifJobType		type;		/* Operation that is being
690						 * performed */
691	union aac_AifJobClient	client;		/* Details */
692} __attribute__ ((packed));
693
694struct aac_AifJobProgressReport {
695	struct aac_AifJobDesc	jd;
696	AAC_AifJobStatus	status;
697	u_int32_t		finalTick;
698	u_int32_t		currentTick;
699	u_int32_t		jobSpecificData1;
700	u_int32_t		jobSpecificData2;
701} __attribute__ ((packed));
702
703/*
704 * Event Notification
705 */
706typedef enum {
707	/* General application notifies start here */
708	AifEnGeneric = 1,		/* Generic notification */
709	AifEnTaskComplete,		/* Task has completed */
710	AifEnConfigChange,		/* Adapter config change occurred */
711	AifEnContainerChange,		/* Adapter specific container
712					 * configuration change */
713	AifEnDeviceFailure,		/* SCSI device failed */
714	AifEnMirrorFailover,		/* Mirror failover started */
715	AifEnContainerEvent,		/* Significant container event */
716	AifEnFileSystemChange,		/* File system changed */
717	AifEnConfigPause,		/* Container pause event */
718	AifEnConfigResume,		/* Container resume event */
719	AifEnFailoverChange,		/* Failover space assignment changed */
720	AifEnRAID5RebuildDone,		/* RAID5 rebuild finished */
721	AifEnEnclosureManagement,	/* Enclosure management event */
722	AifEnBatteryEvent,		/* Significant NV battery event */
723	AifEnAddContainer,		/* A new container was created. */
724	AifEnDeleteContainer,		/* A container was deleted. */
725	AifEnSMARTEvent, 	       	/* SMART Event */
726	AifEnBatteryNeedsRecond,	/* The battery needs reconditioning */
727	AifEnClusterEvent,		/* Some cluster event */
728	AifEnDiskSetEvent,		/* A disk set event occured. */
729	AifDriverNotifyStart=199,	/* Notifies for host driver go here */
730	/* Host driver notifications start here */
731	AifDenMorphComplete, 		/* A morph operation completed */
732	AifDenVolumeExtendComplete 	/* Volume expand operation completed */
733} AAC_AifEventNotifyType;
734
735struct aac_AifEnsGeneric {
736	char	text[132];		/* Generic text */
737} __attribute__ ((packed));
738
739struct aac_AifEnsDeviceFailure {
740	u_int32_t	deviceHandle;	/* SCSI device handle */
741} __attribute__ ((packed));
742
743struct aac_AifEnsMirrorFailover {
744	u_int32_t	container;	/* Container with failed element */
745	u_int32_t	failedSlice;	/* Old slice which failed */
746	u_int32_t	creatingSlice;	/* New slice used for auto-create */
747} __attribute__ ((packed));
748
749struct aac_AifEnsContainerChange {
750	u_int32_t	container[2];	/* container that changed, -1 if no
751					 * container */
752} __attribute__ ((packed));
753
754struct aac_AifEnsContainerEvent {
755	u_int32_t	container;	/* container number  */
756	u_int32_t	eventType;	/* event type */
757} __attribute__ ((packed));
758
759struct aac_AifEnsEnclosureEvent {
760	u_int32_t	empID;		/* enclosure management proc number  */
761	u_int32_t	unitID;		/* unitId, fan id, power supply id,
762					 * slot id, tempsensor id.  */
763	u_int32_t	eventType;	/* event type */
764} __attribute__ ((packed));
765
766struct aac_AifEnsBatteryEvent {
767	AAC_NVBATT_TRANSITION	transition_type;	/* eg from low to ok */
768	AAC_NVBATTSTATUS	current_state;		/* current batt state */
769	AAC_NVBATTSTATUS	prior_state;		/* prev batt state */
770} __attribute__ ((packed));
771
772struct aac_AifEnsDiskSetEvent {
773	u_int32_t	eventType;
774	u_int64_t	DsNum;
775	u_int64_t	CreatorId;
776} __attribute__ ((packed));
777
778typedef enum {
779	CLUSTER_NULL_EVENT = 0,
780	CLUSTER_PARTNER_NAME_EVENT,	/* change in partner hostname or
781					 * adaptername from NULL to non-NULL */
782	/* (partner's agent may be up) */
783	CLUSTER_PARTNER_NULL_NAME_EVENT	/* change in partner hostname or
784					 * adaptername from non-null to NULL */
785	/* (partner has rebooted) */
786} AAC_ClusterAifEvent;
787
788struct aac_AifEnsClusterEvent {
789	AAC_ClusterAifEvent	eventType;
790} __attribute__ ((packed));
791
792struct aac_AifEventNotify {
793	AAC_AifEventNotifyType	type;
794	union {
795		struct aac_AifEnsGeneric		EG;
796		struct aac_AifEnsDeviceFailure		EDF;
797		struct aac_AifEnsMirrorFailover		EMF;
798		struct aac_AifEnsContainerChange	ECC;
799		struct aac_AifEnsContainerEvent		ECE;
800		struct aac_AifEnsEnclosureEvent		EEE;
801		struct aac_AifEnsBatteryEvent		EBE;
802		struct aac_AifEnsDiskSetEvent		EDS;
803/*		struct aac_AifEnsSMARTEvent		ES;*/
804		struct aac_AifEnsClusterEvent		ECLE;
805	} data;
806} __attribute__ ((packed));
807
808/*
809 * Adapter Initiated FIB command structures. Start with the adapter
810 * initiated FIBs that really come from the adapter, and get responded
811 * to by the host.
812 */
813#define AAC_AIF_REPORT_MAX_SIZE 64
814
815typedef enum {
816	AifCmdEventNotify = 1,	/* Notify of event */
817	AifCmdJobProgress,	/* Progress report */
818	AifCmdAPIReport,	/* Report from other user of API */
819	AifCmdDriverNotify,	/* Notify host driver of event */
820	AifReqJobList = 100,	/* Gets back complete job list */
821	AifReqJobsForCtr,	/* Gets back jobs for specific container */
822	AifReqJobsForScsi,	/* Gets back jobs for specific SCSI device */
823	AifReqJobReport,	/* Gets back a specific job report or list */
824	AifReqTerminateJob,	/* Terminates job */
825	AifReqSuspendJob,	/* Suspends a job */
826	AifReqResumeJob,	/* Resumes a job */
827	AifReqSendAPIReport,	/* API generic report requests */
828	AifReqAPIJobStart,	/* Start a job from the API */
829	AifReqAPIJobUpdate,	/* Update a job report from the API */
830	AifReqAPIJobFinish	/* Finish a job from the API */
831} AAC_AifCommand;
832
833struct aac_aif_command {
834	AAC_AifCommand	command;	/* Tell host what type of
835					 * notify this is */
836	u_int32_t	seqNumber;	/* To allow ordering of
837					 * reports (if necessary) */
838	union {
839	struct aac_AifEventNotify	EN;	/* Event notify structure */
840	struct aac_AifJobProgressReport	PR[1];	/* Progress report */
841	u_int8_t			AR[AAC_AIF_REPORT_MAX_SIZE];
842	} data;
843} __attribute__ ((packed));
844
845/*
846 * Filesystem commands/data
847 *
848 * The adapter has a very complex filesystem interface, most of which we ignore.
849 * (And which seems not to be implemented, anyway.)
850 */
851
852/*
853 * FSA commands
854 * (not used?)
855 */
856typedef enum {
857	Null = 0,
858	GetAttributes,
859	SetAttributes,
860	Lookup,
861	ReadLink,
862	Read,
863	Write,
864	Create,
865	MakeDirectory,
866	SymbolicLink,
867	MakeNode,
868	Removex,
869	RemoveDirectory,
870	Rename,
871	Link,
872	ReadDirectory,
873	ReadDirectoryPlus,
874	FileSystemStatus,
875	FileSystemInfo,
876	PathConfigure,
877	Commit,
878	Mount,
879	UnMount,
880	Newfs,
881	FsCheck,
882	FsSync,
883	SimReadWrite,
884	SetFileSystemStatus,
885	BlockRead,
886	BlockWrite,
887	NvramIoctl,
888	FsSyncWait,
889	ClearArchiveBit,
890	SetAcl,
891	GetAcl,
892	AssignAcl,
893	FaultInsertion,
894	CrazyCache
895} AAC_FSACommand;
896
897/*
898 * Command status values
899 */
900typedef enum {
901	ST_OK = 0,
902	ST_PERM = 1,
903	ST_NOENT = 2,
904	ST_IO = 5,
905	ST_NXIO = 6,
906	ST_E2BIG = 7,
907	ST_ACCES = 13,
908	ST_EXIST = 17,
909	ST_XDEV = 18,
910	ST_NODEV = 19,
911	ST_NOTDIR = 20,
912	ST_ISDIR = 21,
913	ST_INVAL = 22,
914	ST_FBIG = 27,
915	ST_NOSPC = 28,
916	ST_ROFS = 30,
917	ST_MLINK = 31,
918	ST_WOULDBLOCK = 35,
919	ST_NAMETOOLONG = 63,
920	ST_NOTEMPTY = 66,
921	ST_DQUOT = 69,
922	ST_STALE = 70,
923	ST_REMOTE = 71,
924	ST_BADHANDLE = 10001,
925	ST_NOT_SYNC = 10002,
926	ST_BAD_COOKIE = 10003,
927	ST_NOTSUPP = 10004,
928	ST_TOOSMALL = 10005,
929	ST_SERVERFAULT = 10006,
930	ST_BADTYPE = 10007,
931	ST_JUKEBOX = 10008,
932	ST_NOTMOUNTED = 10009,
933	ST_MAINTMODE = 10010,
934	ST_STALEACL = 10011
935} AAC_FSAStatus;
936
937/*
938 * Volume manager commands
939 */
940typedef enum _VM_COMMANDS {
941	VM_Null = 0,
942	VM_NameServe,
943	VM_ContainerConfig,
944	VM_Ioctl,
945	VM_FilesystemIoctl,
946	VM_CloseAll,
947	VM_CtBlockRead,
948	VM_CtBlockWrite,
949	VM_SliceBlockRead,	 /* raw access to configured storage objects */
950	VM_SliceBlockWrite,
951	VM_DriveBlockRead,	 /* raw access to physical devices */
952	VM_DriveBlockWrite,
953	VM_EnclosureMgt,	 /* enclosure management */
954	VM_Unused,		 /* used to be diskset management */
955	VM_CtBlockVerify,
956	VM_CtPerf,		 /* performance test */
957	VM_CtBlockRead64,
958	VM_CtBlockWrite64,
959	VM_CtBlockVerify64,
960} AAC_VMCommand;
961
962/*
963 * "mountable object"
964 */
965struct aac_mntobj {
966	u_int32_t			ObjectId;
967	char				FileSystemName[16];
968	struct aac_container_creation	CreateInfo;
969	u_int32_t			Capacity;
970	AAC_FSAVolType			VolType;
971	AAC_FType			ObjType;
972	u_int32_t			ContentState;
973#define FSCS_READONLY		0x0002		/* XXX need more information
974						 * than this */
975	union {
976		u_int32_t	pad[8];
977	} ObjExtension;
978	u_int32_t			AlterEgoId;
979} __attribute__ ((packed));
980
981struct aac_mntinfo {
982	AAC_VMCommand		Command;
983	AAC_FType		MntType;
984	u_int32_t		MntCount;
985} __attribute__ ((packed));
986
987struct aac_mntinforesponse {
988	AAC_FSAStatus		Status;
989	AAC_FType		MntType;
990	u_int32_t		MntRespCount;
991	struct aac_mntobj	MntTable[1];
992} __attribute__ ((packed));
993
994/*
995 * Container shutdown command.
996 */
997struct aac_closecommand {
998	u_int32_t	Command;
999	u_int32_t	ContainerId;
1000} __attribute__ ((packed));
1001
1002/*
1003 * Write 'stability' options.
1004 */
1005typedef enum {
1006	CSTABLE = 1,
1007	CUNSTABLE
1008} AAC_CacheLevel;
1009
1010/*
1011 * Commit level response for a write request.
1012 */
1013typedef enum {
1014	CMFILE_SYNC_NVRAM = 1,
1015	CMDATA_SYNC_NVRAM,
1016	CMFILE_SYNC,
1017	CMDATA_SYNC,
1018	CMUNSTABLE
1019} AAC_CommitLevel;
1020
1021/*
1022 * Block read/write operations.
1023 * These structures are packed into the 'data' area in the FIB.
1024 */
1025
1026struct aac_blockread {
1027	AAC_VMCommand		Command;	/* not FSACommand! */
1028	u_int32_t		ContainerId;
1029	u_int32_t		BlockNumber;
1030	u_int32_t		ByteCount;
1031	struct aac_sg_table	SgMap;		/* variable size */
1032} __attribute__ ((packed));
1033
1034struct aac_blockread_response {
1035	AAC_FSAStatus		Status;
1036	u_int32_t		ByteCount;
1037} __attribute__ ((packed));
1038
1039struct aac_blockwrite {
1040	AAC_VMCommand		Command;	/* not FSACommand! */
1041	u_int32_t		ContainerId;
1042	u_int32_t		BlockNumber;
1043	u_int32_t		ByteCount;
1044	AAC_CacheLevel	Stable;
1045	struct aac_sg_table	SgMap;		/* variable size */
1046} __attribute__ ((packed));
1047
1048struct aac_blockwrite_response {
1049	AAC_FSAStatus	Status;
1050	u_int32_t		ByteCount;
1051	AAC_CommitLevel	Committed;
1052} __attribute__ ((packed));
1053
1054/*
1055 * Container shutdown command.
1056 */
1057struct aac_close_command {
1058	AAC_VMCommand      Command;
1059	u_int32_t          ContainerId;
1060};
1061
1062/*
1063 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
1064 * on the SA110 'StrongArm'.
1065 */
1066
1067#define AAC_SA_DOORBELL0_CLEAR		0x98	/* doorbell 0 (adapter->host) */
1068#define AAC_SA_DOORBELL0_SET		0x9c
1069#define AAC_SA_DOORBELL0		0x9c
1070#define AAC_SA_MASK0_CLEAR		0xa0
1071#define AAC_SA_MASK0_SET		0xa4
1072
1073#define AAC_SA_DOORBELL1_CLEAR		0x9a	/* doorbell 1 (host->adapter) */
1074#define AAC_SA_DOORBELL1_SET		0x9e
1075#define AAC_SA_MASK1_CLEAR		0xa2
1076#define AAC_SA_MASK1_SET		0xa6
1077
1078#define AAC_SA_MAILBOX			0xa8	/* mailbox (20 bytes) */
1079#define AAC_SA_FWSTATUS			0xc4
1080
1081/*
1082 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
1083 * and other related adapters.
1084 */
1085
1086#define AAC_RX_IDBR		0x20	/* inbound doorbell register */
1087#define AAC_RX_IISR		0x24	/* inbound interrupt status register */
1088#define AAC_RX_IIMR		0x28	/* inbound interrupt mask register */
1089#define AAC_RX_ODBR		0x2c	/* outbound doorbell register */
1090#define AAC_RX_OISR		0x30	/* outbound interrupt status register */
1091#define AAC_RX_OIMR		0x34	/* outbound interrupt mask register */
1092
1093#define AAC_RX_MAILBOX		0x50	/* mailbox (20 bytes) */
1094#define AAC_RX_FWSTATUS		0x6c
1095
1096/*
1097 * Common bit definitions for the doorbell registers.
1098 */
1099
1100/*
1101 * Status bits in the doorbell registers.
1102 */
1103#define AAC_DB_SYNC_COMMAND	(1<<0)	/* send/completed synchronous FIB */
1104#define AAC_DB_COMMAND_READY	(1<<1)	/* posted one or more commands */
1105#define AAC_DB_RESPONSE_READY	(1<<2)	/* one or more commands complete */
1106#define AAC_DB_COMMAND_NOT_FULL	(1<<3)	/* command queue not full */
1107#define AAC_DB_RESPONSE_NOT_FULL (1<<4)	/* response queue not full */
1108
1109/*
1110 * The adapter can request the host print a message by setting the
1111 * DB_PRINTF flag in DOORBELL0.  The driver responds by collecting the
1112 * message from the printf buffer, clearing the DB_PRINTF flag in
1113 * DOORBELL0 and setting it in DOORBELL1.
1114 * (ODBR and IDBR respectively for the i960Rx adapters)
1115 */
1116#define AAC_DB_PRINTF		(1<<5)	/* adapter requests host printf */
1117
1118/*
1119 * Mask containing the interrupt bits we care about.  We don't anticipate (or
1120 * want) interrupts not in this mask.
1121 */
1122#define AAC_DB_INTERRUPTS	(AAC_DB_COMMAND_READY  |	\
1123				 AAC_DB_RESPONSE_READY |	\
1124				 AAC_DB_PRINTF)
1125