aacreg.h revision 213272
1193323Sed/*-
2193323Sed * Copyright (c) 2000 Michael Smith
3193323Sed * Copyright (c) 2000-2001 Scott Long
4193323Sed * Copyright (c) 2000 BSDi
5193323Sed * Copyright (c) 2001 Adaptec, Inc.
6193323Sed * All rights reserved.
7193323Sed *
8193323Sed * Redistribution and use in source and binary forms, with or without
9193323Sed * modification, are permitted provided that the following conditions
10193323Sed * are met:
11193323Sed * 1. Redistributions of source code must retain the above copyright
12193323Sed *    notice, this list of conditions and the following disclaimer.
13193323Sed * 2. Redistributions in binary form must reproduce the above copyright
14193323Sed *    notice, this list of conditions and the following disclaimer in the
15193323Sed *    documentation and/or other materials provided with the distribution.
16193323Sed *
17193323Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18193323Sed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19193323Sed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20193323Sed * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21193323Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22193323Sed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23193323Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24193323Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25193323Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26193323Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27193323Sed * SUCH DAMAGE.
28193323Sed *
29193323Sed *	$FreeBSD: head/sys/dev/aac/aacreg.h 213272 2010-09-29 14:22:00Z emaste $
30195340Sed */
31212904Sdim
32193323Sed/*
33224145Sdim * Data structures defining the interface between the driver and the Adaptec
34223017Sdim * 'FSA' adapters.  Note that many field names and comments here are taken
35193323Sed * verbatim from the Adaptec driver source in order to make comparing the
36218893Sdim * two slightly easier.
37218893Sdim */
38193323Sed
39193323Sed/*
40193323Sed * Misc. magic numbers.
41218893Sdim */
42218893Sdim#define AAC_MAX_CONTAINERS	64
43193323Sed#define AAC_BLOCK_SIZE		512
44198090Srdivacky
45193323Sed/*
46193323Sed * Communications interface.
47193323Sed *
48198090Srdivacky * Where datastructure layouts are closely parallel to the Adaptec sample code,
49218893Sdim * retain their naming conventions (for now) to aid in cross-referencing.
50193323Sed */
51193323Sed
52193323Sed/*
53193323Sed * We establish 4 command queues and matching response queues.  Queues must
54193323Sed * be 16-byte aligned, and are sized as follows:
55193323Sed */
56218893Sdim#define AAC_HOST_NORM_CMD_ENTRIES	8	/* command adapter->host,
57193323Sed						 * normal priority */
58193323Sed#define AAC_HOST_HIGH_CMD_ENTRIES	4	/* command adapter->host,
59193323Sed						 * high priority */
60193323Sed#define AAC_ADAP_NORM_CMD_ENTRIES	512	/* command host->adapter,
61198090Srdivacky						 * normal priority */
62218893Sdim#define AAC_ADAP_HIGH_CMD_ENTRIES	4	/* command host->adapter,
63218893Sdim						 * high priority */
64193323Sed#define AAC_HOST_NORM_RESP_ENTRIES	512	/* response, adapter->host,
65193323Sed						 * normal priority */
66193323Sed#define AAC_HOST_HIGH_RESP_ENTRIES	4	/* response, adapter->host,
67193323Sed						 * high priority */
68193323Sed#define AAC_ADAP_NORM_RESP_ENTRIES	8	/* response, host->adapter,
69193323Sed						 * normal priority */
70193323Sed#define AAC_ADAP_HIGH_RESP_ENTRIES	4	/* response, host->adapter,
71193323Sed						 * high priority */
72193323Sed
73193323Sed#define AAC_TOTALQ_LENGTH	(AAC_HOST_HIGH_CMD_ENTRIES +	\
74193323Sed				 AAC_HOST_NORM_CMD_ENTRIES +	\
75193323Sed				 AAC_ADAP_HIGH_CMD_ENTRIES +	\
76218893Sdim				 AAC_ADAP_NORM_CMD_ENTRIES +	\
77193323Sed				 AAC_HOST_HIGH_RESP_ENTRIES +	\
78218893Sdim				 AAC_HOST_NORM_RESP_ENTRIES +	\
79201360Srdivacky				 AAC_ADAP_HIGH_RESP_ENTRIES +	\
80201360Srdivacky				 AAC_ADAP_NORM_RESP_ENTRIES)
81201360Srdivacky#define AAC_QUEUE_COUNT		8
82201360Srdivacky#define AAC_QUEUE_ALIGN		16
83193323Sed
84193323Sedstruct aac_queue_entry {
85193323Sed	u_int32_t	aq_fib_size;	/* FIB size in bytes */
86193323Sed	u_int32_t	aq_fib_addr;	/* receiver-space address of the FIB */
87218893Sdim} __packed;
88218893Sdim
89218893Sdim#define AAC_PRODUCER_INDEX	0
90218893Sdim#define AAC_CONSUMER_INDEX	1
91218893Sdim
92218893Sdim/*
93218893Sdim * Table of queue indices and queues used to communicate with the
94193323Sed * controller.  This structure must be aligned to AAC_QUEUE_ALIGN
95193323Sed */
96218893Sdimstruct aac_queue_table {
97193323Sed	/* queue consumer/producer indexes (layout mandated by adapter) */
98193323Sed	u_int32_t			qt_qindex[AAC_QUEUE_COUNT][2];
99193323Sed
100193323Sed	/* queue entry structures (layout mandated by adapter) */
101193323Sed	struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES];
102193323Sed	struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES];
103218893Sdim	struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES];
104218893Sdim	struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES];
105218893Sdim	struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES];
106218893Sdim	struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES];
107218893Sdim	struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES];
108218893Sdim	struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES];
109218893Sdim} __packed;
110218893Sdim
111218893Sdim/*
112218893Sdim * Queue names
113218893Sdim *
114218893Sdim * Note that we base these at 0 in order to use them as array indices.  Adaptec
115218893Sdim * used base 1 for some unknown reason, and sorted them in a different order.
116193323Sed */
117218893Sdim#define AAC_HOST_NORM_CMD_QUEUE		0
118193323Sed#define AAC_HOST_HIGH_CMD_QUEUE		1
119193323Sed#define AAC_ADAP_NORM_CMD_QUEUE		2
120218893Sdim#define AAC_ADAP_HIGH_CMD_QUEUE		3
121218893Sdim#define AAC_HOST_NORM_RESP_QUEUE	4
122218893Sdim#define AAC_HOST_HIGH_RESP_QUEUE	5
123218893Sdim#define AAC_ADAP_NORM_RESP_QUEUE	6
124193323Sed#define AAC_ADAP_HIGH_RESP_QUEUE	7
125202878Srdivacky
126193323Sed/*
127218893Sdim * List structure used to chain FIBs (used by the adapter - we hang FIBs off
128218893Sdim * our private command structure and don't touch these)
129218893Sdim */
130218893Sdimstruct aac_fib_list_entry {
131218893Sdim	u_int32_t	Flink;
132218893Sdim	u_int32_t	Blink;
133218893Sdim} __packed;
134201360Srdivacky
135201360Srdivacky/*
136201360Srdivacky * FIB (FSA Interface Block?); this is the datastructure passed between the host
137218893Sdim * and adapter.
138218893Sdim */
139198892Srdivackystruct aac_fib_header {
140201360Srdivacky	u_int32_t		XferState;
141218893Sdim	u_int16_t		Command;
142201360Srdivacky	u_int8_t		StructType;
143201360Srdivacky	u_int8_t		Flags;
144201360Srdivacky	u_int16_t		Size;
145201360Srdivacky	u_int16_t		SenderSize;
146201360Srdivacky	u_int32_t		SenderFibAddress;
147201360Srdivacky	u_int32_t		ReceiverFibAddress;
148201360Srdivacky	u_int32_t		SenderData;
149198892Srdivacky	union {
150193323Sed		struct {
151198892Srdivacky			u_int32_t	ReceiverTimeStart;
152193323Sed			u_int32_t	ReceiverTimeDone;
153198892Srdivacky		} _s;
154193323Sed		struct aac_fib_list_entry FibLinks;
155218893Sdim	} _u;
156224145Sdim} __packed;
157224145Sdim
158193323Sed#define AAC_FIB_DATASIZE	(512 - sizeof(struct aac_fib_header))
159218893Sdim
160218893Sdimstruct aac_fib {
161218893Sdim	struct aac_fib_header	Header;
162218893Sdim	u_int8_t			data[AAC_FIB_DATASIZE];
163218893Sdim} __packed;
164218893Sdim
165218893Sdim/*
166218893Sdim * FIB commands
167218893Sdim */
168218893Sdimtypedef enum {
169218893Sdim	TestCommandResponse =		1,
170218893Sdim	TestAdapterCommand =		2,
171218893Sdim
172218893Sdim	/* lowlevel and comm commands */
173218893Sdim	LastTestCommand =		100,
174218893Sdim	ReinitHostNormCommandQueue =	101,
175218893Sdim	ReinitHostHighCommandQueue =	102,
176218893Sdim	ReinitHostHighRespQueue =	103,
177218893Sdim	ReinitHostNormRespQueue =	104,
178218893Sdim	ReinitAdapNormCommandQueue =	105,
179218893Sdim	ReinitAdapHighCommandQueue =	107,
180218893Sdim	ReinitAdapHighRespQueue =	108,
181218893Sdim	ReinitAdapNormRespQueue =	109,
182218893Sdim	InterfaceShutdown =		110,
183218893Sdim	DmaCommandFib =			120,
184218893Sdim	StartProfile =			121,
185218893Sdim	TermProfile =			122,
186218893Sdim	SpeedTest =			123,
187218893Sdim	TakeABreakPt =			124,
188218893Sdim	RequestPerfData =		125,
189218893Sdim	SetInterruptDefTimer=		126,
190218893Sdim	SetInterruptDefCount=		127,
191193323Sed	GetInterruptDefStatus=		128,
192193323Sed	LastCommCommand =		129,
193218893Sdim
194218893Sdim	/* filesystem commands */
195193323Sed	NuFileSystem =			300,
196218893Sdim	UFS =				301,
197218893Sdim	HostFileSystem =		302,
198218893Sdim	LastFileSystemCommand =		303,
199218893Sdim
200218893Sdim	/* Container Commands */
201218893Sdim	ContainerCommand =		500,
202218893Sdim	ContainerCommand64 =		501,
203218893Sdim	RawIo = 			502,
204218893Sdim
205218893Sdim	/* Cluster Commands */
206218893Sdim	ClusterCommand =		550,
207193323Sed
208218893Sdim	/* Scsi Port commands (scsi passthrough) */
209218893Sdim	ScsiPortCommand =		600,
210218893Sdim	ScsiPortCommandU64 =		601,
211218893Sdim	SataPortCommandU64 =		602,
212218893Sdim	SasSmpPassThrough =		603,
213193323Sed	SasRequestPhyInfo =		612,
214193323Sed
215193323Sed	/* misc house keeping and generic adapter initiated commands */
216207618Srdivacky	AifRequest =			700,
217207618Srdivacky	CheckRevision =			701,
218207618Srdivacky	FsaHostShutdown =		702,
219207618Srdivacky	RequestAdapterInfo =		703,
220207618Srdivacky	IsAdapterPaused =		704,
221207618Srdivacky	SendHostTime =			705,
222207618Srdivacky	RequestSupplementAdapterInfo =	706,	/* Supp. Info for set in UCC
223207618Srdivacky						 * use only if supported
224207618Srdivacky						 * (RequestAdapterInfo first) */
225221345Sdim	LastMiscCommand =		707,
226207618Srdivacky
227207618Srdivacky	OnLineDiagnostic =		800,
228218893Sdim	FduAdapterTest =		801,
229207618Srdivacky	RequestCompatibilityId =	802,
230207618Srdivacky	AdapterEnvironmentInfo =	803,	/* temp. sensors */
231207618Srdivacky	NvsramEventLog =		900,
232218893Sdim	ResetNvsramEventLogPointers =	901,
233224145Sdim	EnableEventLog =		902,
234224145Sdim	DisableEventLog =		903,
235224145Sdim	EncryptedKeyTransportFIB=	904,
236224145Sdim	KeyableFeaturesFIB=		905
237224145Sdim} AAC_FibCommands;
238224145Sdim
239224145Sdim/*
240224145Sdim * FIB types
241224145Sdim */
242224145Sdim#define AAC_FIBTYPE_TFIB	1
243224145Sdim#define AAC_FIBTYPE_TQE		2
244224145Sdim#define AAC_FIBTYPE_TCTPERF	3
245224145Sdim
246224145Sdim/*
247224145Sdim * FIB transfer state
248224145Sdim */
249224145Sdim#define AAC_FIBSTATE_HOSTOWNED		(1<<0)	/* owned by the host */
250224145Sdim#define AAC_FIBSTATE_ADAPTEROWNED	(1<<1)	/* owned by the adapter */
251224145Sdim#define AAC_FIBSTATE_INITIALISED	(1<<2)	/* initialised */
252224145Sdim#define AAC_FIBSTATE_EMPTY		(1<<3)	/* empty */
253207618Srdivacky#define AAC_FIBSTATE_FROMPOOL		(1<<4)	/* allocated from pool */
254207618Srdivacky#define AAC_FIBSTATE_FROMHOST		(1<<5)	/* sent from the host */
255207618Srdivacky#define AAC_FIBSTATE_FROMADAP		(1<<6)	/* sent from the adapter */
256224145Sdim#define AAC_FIBSTATE_REXPECTED		(1<<7)	/* response is expected */
257218893Sdim#define AAC_FIBSTATE_RNOTEXPECTED	(1<<8)	/* response is not expected */
258221345Sdim#define AAC_FIBSTATE_DONEADAP		(1<<9)	/* processed by the adapter */
259221345Sdim#define AAC_FIBSTATE_DONEHOST		(1<<10)	/* processed by the host */
260221345Sdim#define AAC_FIBSTATE_HIGH		(1<<11)	/* high priority */
261221345Sdim#define AAC_FIBSTATE_NORM		(1<<12)	/* normal priority */
262221345Sdim#define AAC_FIBSTATE_ASYNC		(1<<13)
263207618Srdivacky#define AAC_FIBSTATE_ASYNCIO		(1<<13)	/* to be removed */
264207618Srdivacky#define AAC_FIBSTATE_PAGEFILEIO		(1<<14)	/* to be removed */
265224145Sdim#define AAC_FIBSTATE_SHUTDOWN		(1<<15)
266224145Sdim#define AAC_FIBSTATE_LAZYWRITE		(1<<16)	/* to be removed */
267218893Sdim#define AAC_FIBSTATE_ADAPMICROFIB	(1<<17)
268207618Srdivacky#define AAC_FIBSTATE_BIOSFIB		(1<<18)
269218893Sdim#define AAC_FIBSTATE_FAST_RESPONSE	(1<<19)	/* fast response capable */
270207618Srdivacky#define AAC_FIBSTATE_APIFIB		(1<<20)
271207618Srdivacky
272224145Sdim/*
273221345Sdim * FIB error values
274207618Srdivacky */
275218893Sdim#define AAC_ERROR_NORMAL			0x00
276207618Srdivacky#define AAC_ERROR_PENDING			0x01
277207618Srdivacky#define AAC_ERROR_FATAL				0x02
278207618Srdivacky#define AAC_ERROR_INVALID_QUEUE			0x03
279207618Srdivacky#define AAC_ERROR_NOENTRIES			0x04
280207618Srdivacky#define AAC_ERROR_SENDFAILED			0x05
281207618Srdivacky#define AAC_ERROR_INVALID_QUEUE_PRIORITY	0x06
282207618Srdivacky#define AAC_ERROR_FIB_ALLOCATION_FAILED		0x07
283212904Sdim#define AAC_ERROR_FIB_DEALLOCATION_FAILED	0x08
284207618Srdivacky
285207618Srdivacky/*
286207618Srdivacky * Adapter Init Structure: this is passed to the adapter with the
287207618Srdivacky * AAC_MONKER_INITSTRUCT command to point it at our control structures.
288207618Srdivacky */
289207618Srdivackystruct aac_adapter_init {
290207618Srdivacky	u_int32_t	InitStructRevision;
291207618Srdivacky#define AAC_INIT_STRUCT_REVISION		3
292218893Sdim#define AAC_INIT_STRUCT_REVISION_4		4
293224145Sdim	u_int32_t	MiniPortRevision;
294224145Sdim#define AAC_INIT_STRUCT_MINIPORT_REVISION	1
295224145Sdim	u_int32_t	FilesystemRevision;
296224145Sdim	u_int32_t	CommHeaderAddress;
297224145Sdim	u_int32_t	FastIoCommAreaAddress;
298224145Sdim	u_int32_t	AdapterFibsPhysicalAddress;
299224145Sdim	u_int32_t 	AdapterFibsVirtualAddress;
300224145Sdim	u_int32_t	AdapterFibsSize;
301224145Sdim	u_int32_t	AdapterFibAlign;
302224145Sdim	u_int32_t	PrintfBufferAddress;
303207618Srdivacky	u_int32_t	PrintfBufferSize;
304207618Srdivacky#define	AAC_PAGE_SIZE				4096
305207618Srdivacky	u_int32_t	HostPhysMemPages;
306207618Srdivacky	u_int32_t	HostElapsedSeconds;
307207618Srdivacky	/* ADAPTER_INIT_STRUCT_REVISION_4 begins here */
308207618Srdivacky	u_int32_t	InitFlags;			/* flags for supported features */
309207618Srdivacky#define	AAC_INITFLAGS_NEW_COMM_SUPPORTED	1
310224145Sdim#define	AAC_INITFLAGS_DRIVER_USES_UTC_TIME	0x10
311224145Sdim#define	AAC_INITFLAGS_DRIVER_SUPPORTS_PM	0x20
312207618Srdivacky	u_int32_t	MaxIoCommands;		/* max outstanding commands */
313207618Srdivacky	u_int32_t	MaxIoSize;			/* largest I/O command */
314207618Srdivacky	u_int32_t	MaxFibSize;			/* largest FIB to adapter */
315207618Srdivacky} __packed;
316221345Sdim
317224145Sdim/*
318224145Sdim * Shared data types
319221345Sdim */
320221345Sdim/*
321207618Srdivacky * Container types
322207618Srdivacky */
323221345Sdimtypedef enum {
324207618Srdivacky	CT_NONE = 0,
325207618Srdivacky	CT_VOLUME,
326207618Srdivacky	CT_MIRROR,
327207618Srdivacky	CT_STRIPE,
328207618Srdivacky	CT_RAID5,
329207618Srdivacky	CT_SSRW,
330224145Sdim	CT_SSRO,
331224145Sdim	CT_MORPH,
332224145Sdim	CT_PASSTHRU,
333207618Srdivacky	CT_RAID4,
334221345Sdim	CT_RAID10,		/* stripe of mirror */
335207618Srdivacky	CT_RAID00,		/* stripe of stripe */
336207618Srdivacky	CT_VOLUME_OF_MIRRORS,	/* volume of mirror */
337207618Srdivacky	CT_PSEUDO_RAID3,	/* really raid4 */
338207618Srdivacky	CT_RAID50,		/* stripe of raid5 */
339221345Sdim	CT_RAID5D,		/* raid5 distributed hot-sparing */
340221345Sdim	CT_RAID5D0,
341221345Sdim	CT_RAID1E,		/* extended raid1 mirroring */
342221345Sdim	CT_RAID6,
343221345Sdim	CT_RAID60,
344207618Srdivacky} AAC_FSAVolType;
345207618Srdivacky
346207618Srdivacky/*
347224145Sdim * Host-addressable object types
348224145Sdim */
349207618Srdivackytypedef enum {
350207618Srdivacky	FT_REG = 1,	/* regular file */
351224145Sdim	FT_DIR,		/* directory */
352207618Srdivacky	FT_BLK,		/* "block" device - reserved */
353218893Sdim	FT_CHR,		/* "character special" device - reserved */
354207618Srdivacky	FT_LNK,		/* symbolic link */
355207618Srdivacky	FT_SOCK,	/* socket */
356207618Srdivacky	FT_FIFO,	/* fifo */
357207618Srdivacky	FT_FILESYS,	/* ADAPTEC's "FSA"(tm) filesystem */
358207618Srdivacky	FT_DRIVE,	/* physical disk - addressable in scsi by b/t/l */
359221345Sdim	FT_SLICE,	/* virtual disk - raw volume - slice */
360207618Srdivacky	FT_PARTITION,	/* FSA partition - carved out of a slice - building
361207618Srdivacky			 * block for containers */
362207618Srdivacky	FT_VOLUME,	/* Container - Volume Set */
363207618Srdivacky	FT_STRIPE,	/* Container - Stripe Set */
364221345Sdim	FT_MIRROR,	/* Container - Mirror Set */
365221345Sdim	FT_RAID5,	/* Container - Raid 5 Set */
366221345Sdim	FT_DATABASE	/* Storage object with "foreign" content manager */
367224145Sdim} AAC_FType;
368221345Sdim
369221345Sdim/*
370207618Srdivacky * Host-side scatter/gather list for 32-bit commands.
371207618Srdivacky */
372207618Srdivackystruct aac_sg_entry {
373223017Sdim	u_int32_t	SgAddress;
374223017Sdim	u_int32_t	SgByteCount;
375221345Sdim} __packed;
376224145Sdim
377207618Srdivackystruct aac_sg_entry64 {
378221345Sdim	u_int64_t	SgAddress;
379221345Sdim	u_int32_t	SgByteCount;
380221345Sdim} __packed;
381224145Sdim
382221345Sdimstruct aac_sg_entryraw {
383221345Sdim	u_int32_t	Next;		/* reserved for FW use */
384221345Sdim	u_int32_t	Prev;		/* reserved for FW use */
385221345Sdim	u_int64_t	SgAddress;
386221345Sdim	u_int32_t	SgByteCount;
387221345Sdim	u_int32_t	Flags;		/* reserved for FW use */
388207618Srdivacky} __packed;
389207618Srdivacky
390218893Sdimstruct aac_sg_table {
391207618Srdivacky	u_int32_t		SgCount;
392207618Srdivacky	struct aac_sg_entry	SgEntry[0];
393224145Sdim} __packed;
394207618Srdivacky
395207618Srdivacky/*
396224145Sdim * Host-side scatter/gather list for 64-bit commands.
397224145Sdim */
398221345Sdimstruct aac_sg_table64 {
399221345Sdim	u_int32_t	SgCount;
400221345Sdim	struct aac_sg_entry64	SgEntry64[0];
401221345Sdim} __packed;
402221345Sdim
403221345Sdim/*
404221345Sdim * s/g list for raw commands
405221345Sdim */
406221345Sdimstruct aac_sg_tableraw {
407221345Sdim	u_int32_t	SgCount;
408221345Sdim	struct aac_sg_entryraw	SgEntryRaw[0];
409221345Sdim} __packed;
410221345Sdim
411224145Sdim/*
412221345Sdim * Container creation data
413221345Sdim */
414221345Sdimstruct aac_container_creation {
415221345Sdim	u_int8_t	ViaBuildNumber;
416224145Sdim	u_int8_t	MicroSecond;
417221345Sdim	u_int8_t	Via;		/* 1 = FSU, 2 = API, etc. */
418221345Sdim	u_int8_t	YearsSince1900;
419221345Sdim	u_int32_t	Month:4;	/* 1-12 */
420224145Sdim	u_int32_t	Day:6;		/* 1-32 */
421224145Sdim	u_int32_t	Hour:6;		/* 0-23 */
422221345Sdim	u_int32_t	Minute:6;	/* 0-59 */
423224145Sdim	u_int32_t	Second:6;	/* 0-59 */
424221345Sdim	u_int64_t	ViaAdapterSerialNumber;
425224145Sdim} __packed;
426224145Sdim
427221345Sdim/*
428221345Sdim * Revision number handling
429221345Sdim */
430221345Sdim
431221345Sdimtypedef enum {
432221345Sdim	RevApplication = 1,
433221345Sdim	RevDkiCli,
434221345Sdim	RevNetService,
435221345Sdim	RevApi,
436221345Sdim	RevFileSysDriver,
437221345Sdim	RevMiniportDriver,
438221345Sdim	RevAdapterSW,
439221345Sdim	RevMonitor,
440221345Sdim	RevRemoteApi
441221345Sdim} RevComponent;
442221345Sdim
443221345Sdimstruct FsaRevision {
444221345Sdim	union {
445221345Sdim		struct {
446221345Sdim			u_int8_t	dash;
447221345Sdim			u_int8_t	type;
448221345Sdim			u_int8_t	minor;
449221345Sdim			u_int8_t	major;
450221345Sdim		} comp;
451221345Sdim		u_int32_t	ul;
452221345Sdim	} external;
453221345Sdim	u_int32_t	buildNumber;
454221345Sdim}  __packed;
455221345Sdim
456221345Sdim/*
457221345Sdim * Adapter Information
458221345Sdim */
459221345Sdim
460221345Sdimtypedef enum {
461224145Sdim	CPU_NTSIM = 1,
462221345Sdim	CPU_I960,
463221345Sdim	CPU_ARM,
464221345Sdim	CPU_SPARC,
465221345Sdim	CPU_POWERPC,
466221345Sdim	CPU_ALPHA,
467221345Sdim	CPU_P7,
468207618Srdivacky	CPU_I960_RX,
469207618Srdivacky	CPU_MIPS,
470207618Srdivacky	CPU_XSCALE,
471207618Srdivacky	CPU__last
472207618Srdivacky} AAC_CpuType;
473207618Srdivacky
474207618Srdivackytypedef enum {
475207618Srdivacky	CPUI960_JX = 1,
476207618Srdivacky	CPUI960_CX,
477207618Srdivacky	CPUI960_HX,
478207618Srdivacky	CPUI960_RX,
479207618Srdivacky	CPUARM_SA110,
480218893Sdim	CPUARM_xxx,
481207618Srdivacky	CPUPPC_603e,
482207618Srdivacky	CPUPPC_xxx,
483207618Srdivacky	CPUI960_80303,
484207618Srdivacky	CPU_XSCALE_80321,
485218893Sdim	CPU_MIPS_4KC,
486218893Sdim	CPU_MIPS_5KC,
487218893Sdim	CPUSUBTYPE__last
488221345Sdim} AAC_CpuSubType;
489224145Sdim
490207618Srdivackytypedef enum {
491207618Srdivacky	PLAT_NTSIM = 1,
492218893Sdim	PLAT_V3ADU,
493207618Srdivacky	PLAT_CYCLONE,
494207618Srdivacky	PLAT_CYCLONE_HD,
495207618Srdivacky	PLAT_BATBOARD,
496218893Sdim	PLAT_BATBOARD_HD,
497218893Sdim	PLAT_YOLO,
498218893Sdim	PLAT_COBRA,
499221345Sdim	PLAT_ANAHEIM,
500224145Sdim	PLAT_JALAPENO,
501207618Srdivacky	PLAT_QUEENS,
502207618Srdivacky	PLAT_JALAPENO_DELL,
503218893Sdim	PLAT_POBLANO,
504207618Srdivacky	PLAT_POBLANO_OPAL,
505207618Srdivacky	PLAT_POBLANO_SL0,
506207618Srdivacky	PLAT_POBLANO_SL1,
507207618Srdivacky	PLAT_POBLANO_SL2,
508207618Srdivacky	PLAT_POBLANO_XXX,
509207618Srdivacky	PLAT_JALAPENO_P2,
510207618Srdivacky	PLAT_HABANERO,
511207618Srdivacky	PLAT_VULCAN,
512207618Srdivacky	PLAT_CRUSADER,
513207618Srdivacky	PLAT_LANCER,
514207618Srdivacky	PLAT_HARRIER,
515218893Sdim	PLAT_TERMINATOR,
516207618Srdivacky	PLAT_SKYHAWK,
517207618Srdivacky	PLAT_CORSAIR,
518207618Srdivacky	PLAT_JAGUAR,
519207618Srdivacky	PLAT_SATAHAWK,
520207618Srdivacky	PLAT_SATANATOR,
521207618Srdivacky	PLAT_PROWLER,
522207618Srdivacky	PLAT_BLACKBIRD,
523207618Srdivacky	PLAT_SABREEXPRESS,
524221345Sdim	PLAT_INTRUDER,
525207618Srdivacky	PLAT__last
526207618Srdivacky} AAC_Platform;
527207618Srdivacky
528207618Srdivackytypedef enum {
529207618Srdivacky	OEM_FLAVOR_ADAPTEC = 1,
530207618Srdivacky	OEM_FLAVOR_DELL,
531224145Sdim	OEM_FLAVOR_HP,
532224145Sdim	OEM_FLAVOR_IBM,
533207618Srdivacky	OEM_FLAVOR_CPQ,
534224145Sdim	OEM_FLAVOR_FSC,
535224145Sdim	OEM_FLAVOR_DWS,
536224145Sdim	OEM_FLAVOR_BRAND_Z,
537224145Sdim	OEM_FLAVOR_LEGEND,
538224145Sdim	OEM_FLAVOR_HITACHI,
539224145Sdim	OEM_FLAVOR_ESG,
540224145Sdim	OEM_FLAVOR_ICP,
541224145Sdim	OEM_FLAVOR_SCM,
542224145Sdim	OEM_FLAVOR__last
543224145Sdim} AAC_OemFlavor;
544224145Sdim
545224145Sdim/*
546224145Sdim * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
547207618Srdivacky */
548221345Sdimtypedef enum
549207618Srdivacky{
550207618Srdivacky	PLATFORM_BAT_REQ_PRESENT = 1,	/* BATTERY REQUIRED AND PRESENT */
551207618Srdivacky	PLATFORM_BAT_REQ_NOTPRESENT,	/* BATTERY REQUIRED AND NOT PRESENT */
552207618Srdivacky	PLATFORM_BAT_OPT_PRESENT,	/* BATTERY OPTIONAL AND PRESENT */
553207618Srdivacky	PLATFORM_BAT_OPT_NOTPRESENT,	/* BATTERY OPTIONAL AND NOT PRESENT */
554207618Srdivacky	PLATFORM_BAT_NOT_SUPPORTED	/* BATTERY NOT SUPPORTED */
555207618Srdivacky} AAC_BatteryPlatform;
556207618Srdivacky
557207618Srdivacky/*
558218893Sdim * options supported by this board
559207618Srdivacky * there has to be a one to one mapping of these defines and the ones in
560207618Srdivacky * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT
561207618Srdivacky */
562218893Sdim#define AAC_SUPPORTED_SNAPSHOT		0x01
563207618Srdivacky#define AAC_SUPPORTED_CLUSTERS		0x02
564207618Srdivacky#define AAC_SUPPORTED_WRITE_CACHE	0x04
565207618Srdivacky#define AAC_SUPPORTED_64BIT_DATA	0x08
566218893Sdim#define AAC_SUPPORTED_HOST_TIME_FIB	0x10
567207618Srdivacky#define AAC_SUPPORTED_RAID50		0x20
568207618Srdivacky#define AAC_SUPPORTED_4GB_WINDOW	0x40
569207618Srdivacky#define AAC_SUPPORTED_SCSI_UPGRADEABLE	0x80
570207618Srdivacky#define AAC_SUPPORTED_SOFT_ERR_REPORT	0x100
571207618Srdivacky#define AAC_SUPPORTED_NOT_RECONDITION	0x200
572207618Srdivacky#define AAC_SUPPORTED_SGMAP_HOST64	0x400
573207618Srdivacky#define AAC_SUPPORTED_ALARM		0x800
574207618Srdivacky#define AAC_SUPPORTED_NONDASD		0x1000
575207618Srdivacky#define AAC_SUPPORTED_SCSI_MANAGED	0x2000
576207618Srdivacky#define AAC_SUPPORTED_RAID_SCSI_MODE	0x4000
577207618Srdivacky#define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO	0x10000
578207618Srdivacky#define AAC_SUPPORTED_NEW_COMM		0x20000
579207618Srdivacky#define AAC_SUPPORTED_64BIT_ARRAYSIZE	0x40000
580207618Srdivacky#define AAC_SUPPORTED_HEAT_SENSOR	0x80000
581207618Srdivacky
582207618Srdivacky/*
583207618Srdivacky * Structure used to respond to a RequestAdapterInfo fib.
584207618Srdivacky */
585207618Srdivackystruct aac_adapter_info {
586207618Srdivacky	AAC_Platform		PlatformBase;	 /* adapter type */
587207618Srdivacky	AAC_CpuType		CpuArchitecture; /* adapter CPU type */
588207618Srdivacky	AAC_CpuSubType		CpuVariant;	 /* adapter CPU subtype */
589207618Srdivacky	u_int32_t		ClockSpeed;	 /* adapter CPU clockspeed */
590207618Srdivacky	u_int32_t		ExecutionMem;	 /* adapter Execution Memory
591207618Srdivacky						  * size */
592207618Srdivacky	u_int32_t		BufferMem;	 /* adapter Data Memory */
593207618Srdivacky	u_int32_t		TotalMem;	 /* adapter Total Memory */
594207618Srdivacky	struct FsaRevision	KernelRevision;  /* adapter Kernel Software
595207618Srdivacky						  * Revision */
596207618Srdivacky	struct FsaRevision	MonitorRevision; /* adapter Monitor/Diagnostic
597218893Sdim						  * Software Revision */
598218893Sdim	struct FsaRevision	HardwareRevision;/* TBD */
599218893Sdim	struct FsaRevision	BIOSRevision;	 /* adapter BIOS Revision */
600207618Srdivacky	u_int32_t		ClusteringEnabled;
601207618Srdivacky	u_int32_t		ClusterChannelMask;
602207618Srdivacky	u_int64_t		SerialNumber;
603207618Srdivacky	AAC_BatteryPlatform	batteryPlatform;
604207618Srdivacky	u_int32_t		SupportedOptions; /* supported features of this
605207618Srdivacky						   * controller */
606207618Srdivacky	AAC_OemFlavor	OemVariant;
607207618Srdivacky} __packed;
608207618Srdivacky
609218893Sdim/*
610207618Srdivacky * Structure used to respond to a RequestSupplementAdapterInfo fib.
611207618Srdivacky */
612207618Srdivackystruct vpd_info {
613207618Srdivacky	u_int8_t		AssemblyPn[8];
614207618Srdivacky	u_int8_t		FruPn[8];
615207618Srdivacky	u_int8_t		BatteryFruPn[8];
616207618Srdivacky	u_int8_t		EcVersionString[8];
617218893Sdim	u_int8_t		Tsid[12];
618207618Srdivacky} __packed;
619207618Srdivacky
620207618Srdivacky#define	MFG_PCBA_SERIAL_NUMBER_WIDTH	12
621207618Srdivacky#define	MFG_WWN_WIDTH			8
622207618Srdivacky
623207618Srdivackystruct aac_supplement_adapter_info {
624218893Sdim	/* The assigned Adapter Type Text, extra byte for null termination */
625207618Srdivacky	int8_t		AdapterTypeText[17+1];
626207618Srdivacky	/* Pad for the text above */
627207618Srdivacky	int8_t		Pad[2];
628207618Srdivacky	/* Size in bytes of the memory that is flashed */
629207618Srdivacky	u_int32_t	FlashMemoryByteSize;
630207618Srdivacky	/* The assigned IMAGEID_xxx for this adapter */
631207618Srdivacky	u_int32_t	FlashImageId;
632218893Sdim	/*
633207618Srdivacky	 * The maximum number of Phys available on a SATA/SAS
634207618Srdivacky	 * Controller, 0 otherwise
635207618Srdivacky	 */
636207618Srdivacky	u_int32_t	MaxNumberPorts;
637207618Srdivacky	/* Version of expansion area */
638207618Srdivacky	u_int32_t	Version;
639207618Srdivacky	u_int32_t	FeatureBits;
640218893Sdim	u_int8_t		SlotNumber;
641207618Srdivacky	u_int8_t		ReservedPad0[3];
642207618Srdivacky	u_int8_t		BuildDate[12];
643207618Srdivacky	/* The current number of Ports on a SAS controller, 0 otherwise */
644207618Srdivacky	u_int32_t	CurrentNumberPorts;
645207618Srdivacky
646218893Sdim	struct vpd_info VpdInfo;
647207618Srdivacky
648207618Srdivacky	/* Firmware Revision (Vmaj.min-dash.) */
649207618Srdivacky	struct FsaRevision	FlashFirmwareRevision;
650218893Sdim	u_int32_t	RaidTypeMorphOptions;
651207618Srdivacky	/* Firmware's boot code Revision (Vmaj.min-dash.) */
652207618Srdivacky	struct FsaRevision	FlashFirmwareBootRevision;
653207618Srdivacky	/* PCBA serial no. from th MFG sector */
654207618Srdivacky	u_int8_t		MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH];
655207618Srdivacky	/* WWN from the MFG sector */
656207618Srdivacky	u_int8_t		MfgWWNName[MFG_WWN_WIDTH];
657207618Srdivacky	/* Growth Area for future expansion ((7*4) - 12 - 8)/4 = 2 words */
658207618Srdivacky	u_int32_t	ReservedGrowth[2];
659207618Srdivacky} __packed;
660218893Sdim
661207618Srdivacky/*
662207618Srdivacky * Monitor/Kernel interface.
663207618Srdivacky */
664218893Sdim
665218893Sdim/*
666218893Sdim * Synchronous commands to the monitor/kernel.
667207618Srdivacky */
668207618Srdivacky#define AAC_MONKER_BREAKPOINT	0x04
669207618Srdivacky#define AAC_MONKER_INITSTRUCT	0x05
670207618Srdivacky#define AAC_MONKER_SYNCFIB	0x0c
671218893Sdim#define AAC_MONKER_GETKERNVER	0x11
672218893Sdim#define AAC_MONKER_POSTRESULTS	0x14
673218893Sdim#define AAC_MONKER_GETINFO	0x19
674218893Sdim#define AAC_MONKER_GETDRVPROP	0x23
675218893Sdim#define AAC_MONKER_RCVTEMP	0x25
676218893Sdim#define AAC_MONKER_GETCOMMPREF	0x26
677218893Sdim#define AAC_MONKER_REINIT	0xee
678218893Sdim
679207618Srdivacky/*
680207618Srdivacky *  Adapter Status Register
681207618Srdivacky *
682218893Sdim *  Phase Staus mailbox is 32bits:
683207618Srdivacky *  <31:16> = Phase Status
684207618Srdivacky *  <15:0>  = Phase
685207618Srdivacky *
686207618Srdivacky *  The adapter reports its present state through the phase.  Only
687207618Srdivacky *  a single phase should be ever be set.  Each phase can have multiple
688218893Sdim *  phase status bits to provide more detailed information about the
689218893Sdim *  state of the adapter.
690218893Sdim */
691218893Sdim#define AAC_SELF_TEST_FAILED	0x00000004
692218893Sdim#define AAC_MONITOR_PANIC	0x00000020
693218893Sdim#define AAC_UP_AND_RUNNING	0x00000080
694218893Sdim#define AAC_KERNEL_PANIC	0x00000100
695218893Sdim
696207618Srdivacky/*
697207618Srdivacky * Data types relating to control and monitoring of the NVRAM/WriteCache
698207618Srdivacky * subsystem.
699207618Srdivacky */
700207618Srdivacky
701207618Srdivacky#define AAC_NFILESYS	24	/* maximum number of filesystems */
702207618Srdivacky
703207618Srdivacky/*
704207618Srdivacky * NVRAM/Write Cache subsystem states
705218893Sdim */
706207618Srdivackytypedef enum {
707207618Srdivacky	NVSTATUS_DISABLED = 0,	/* present, clean, not being used */
708207618Srdivacky	NVSTATUS_ENABLED,	/* present, possibly dirty, ready for use */
709207618Srdivacky	NVSTATUS_ERROR,		/* present, dirty, contains dirty data */
710221345Sdim	NVSTATUS_BATTERY,	/* present, bad or low battery, may contain
711221345Sdim				 * dirty data */
712221345Sdim	NVSTATUS_UNKNOWN	/* for bad/missing device */
713221345Sdim} AAC_NVSTATUS;
714221345Sdim
715221345Sdim/*
716221345Sdim * NVRAM/Write Cache subsystem battery component states
717221345Sdim *
718221345Sdim */
719221345Sdimtypedef enum {
720221345Sdim	NVBATTSTATUS_NONE = 0,	/* battery has no power or is not present */
721221345Sdim	NVBATTSTATUS_LOW,	/* battery is low on power */
722221345Sdim	NVBATTSTATUS_OK,	/* battery is okay - normal operation possible
723221345Sdim				 * only in this state */
724221345Sdim	NVBATTSTATUS_RECONDITIONING	/* no battery present - reconditioning
725221345Sdim					 * in process */
726221345Sdim} AAC_NVBATTSTATUS;
727221345Sdim
728221345Sdim/*
729221345Sdim * Battery transition type
730221345Sdim */
731221345Sdimtypedef enum {
732221345Sdim	NVBATT_TRANSITION_NONE = 0,	/* battery now has no power or is not
733221345Sdim					 * present */
734221345Sdim	NVBATT_TRANSITION_LOW,		/* battery is now low on power */
735221345Sdim	NVBATT_TRANSITION_OK		/* battery is now okay - normal
736221345Sdim					 * operation possible only in this
737221345Sdim					 * state */
738221345Sdim} AAC_NVBATT_TRANSITION;
739221345Sdim
740221345Sdim/*
741221345Sdim * NVRAM Info structure returned for NVRAM_GetInfo call
742221345Sdim */
743221345Sdimstruct aac_nvramdevinfo {
744221345Sdim	u_int32_t	NV_Enabled;	/* write caching enabled */
745221345Sdim	u_int32_t	NV_Error;	/* device in error state */
746221345Sdim	u_int32_t	NV_NDirty;	/* count of dirty NVRAM buffers */
747221345Sdim	u_int32_t	NV_NActive;	/* count of NVRAM buffers being
748221345Sdim					 * written */
749221345Sdim} __packed;
750221345Sdim
751221345Sdimstruct aac_nvraminfo {
752221345Sdim	AAC_NVSTATUS		NV_Status;	/* nvram subsystem status */
753221345Sdim	AAC_NVBATTSTATUS	NV_BattStatus;	/* battery status */
754221345Sdim	u_int32_t		NV_Size;	/* size of WriteCache NVRAM in
755221345Sdim						 * bytes */
756221345Sdim	u_int32_t		NV_BufSize;	/* size of NVRAM buffers in
757221345Sdim						 * bytes */
758221345Sdim	u_int32_t		NV_NBufs;	/* number of NVRAM buffers */
759221345Sdim	u_int32_t		NV_NDirty;	/* Num dirty NVRAM buffers */
760221345Sdim	u_int32_t		NV_NClean;	/* Num clean NVRAM buffers */
761221345Sdim	u_int32_t		NV_NActive;	/* Num NVRAM buffers being
762221345Sdim						 * written */
763221345Sdim	u_int32_t		NV_NBrokered;	/* Num brokered NVRAM buffers */
764221345Sdim	struct aac_nvramdevinfo	NV_DevInfo[AAC_NFILESYS];	/* per device
765221345Sdim								 * info */
766221345Sdim	u_int32_t		NV_BattNeedsReconditioning;	/* boolean */
767207618Srdivacky	u_int32_t		NV_TotalSize;	/* size of all non-volatile
768207618Srdivacky						 * memories in bytes */
769207618Srdivacky} __packed;
770207618Srdivacky
771207618Srdivacky/*
772207618Srdivacky * Data types relating to adapter-initiated FIBs
773207618Srdivacky *
774207618Srdivacky * Based on types and structures in <aifstruc.h>
775207618Srdivacky */
776207618Srdivacky
777207618Srdivacky/*
778207618Srdivacky * Progress Reports
779207618Srdivacky */
780207618Srdivackytypedef enum {
781221345Sdim	AifJobStsSuccess = 1,
782221345Sdim	AifJobStsFinished,
783207618Srdivacky	AifJobStsAborted,
784207618Srdivacky	AifJobStsFailed,
785207618Srdivacky	AifJobStsLastReportMarker = 100,	/* All prior mean last report */
786207618Srdivacky	AifJobStsSuspended,
787221345Sdim	AifJobStsRunning
788223017Sdim} AAC_AifJobStatus;
789221345Sdim
790223017Sdimtypedef enum {
791221345Sdim	AifJobScsiMin = 1,		/* Minimum value for Scsi operation */
792221345Sdim	AifJobScsiZero,			/* SCSI device clear operation */
793221345Sdim	AifJobScsiVerify,		/* SCSI device Verify operation NO
794221345Sdim					 * REPAIR */
795221345Sdim	AifJobScsiExercise,		/* SCSI device Exercise operation */
796221345Sdim	AifJobScsiVerifyRepair,		/* SCSI device Verify operation WITH
797221345Sdim					 * repair */
798221345Sdim	AifJobScsiWritePattern,		/* write pattern */
799221345Sdim	AifJobScsiMax = 99,		/* Max Scsi value */
800221345Sdim	AifJobCtrMin,			/* Min Ctr op value */
801207618Srdivacky	AifJobCtrZero,			/* Container clear operation */
802223017Sdim	AifJobCtrCopy,			/* Container copy operation */
803221345Sdim	AifJobCtrCreateMirror,		/* Container Create Mirror operation */
804221345Sdim	AifJobCtrMergeMirror,		/* Container Merge Mirror operation */
805221345Sdim	AifJobCtrScrubMirror,		/* Container Scrub Mirror operation */
806221345Sdim	AifJobCtrRebuildRaid5,		/* Container Rebuild Raid5 operation */
807221345Sdim	AifJobCtrScrubRaid5,		/* Container Scrub Raid5 operation */
808223017Sdim	AifJobCtrMorph,			/* Container morph operation */
809221345Sdim	AifJobCtrPartCopy,		/* Container Partition copy operation */
810221345Sdim	AifJobCtrRebuildMirror,		/* Container Rebuild Mirror operation */
811221345Sdim	AifJobCtrCrazyCache,		/* crazy cache */
812221345Sdim	AifJobCtrCopyback,		/* Container Copyback operation */
813221345Sdim	AifJobCtrCompactRaid5D,		/* Container Compaction operation */
814221345Sdim	AifJobCtrExpandRaid5D,		/* Container Expansion operation */
815221345Sdim	AifJobCtrRebuildRaid6,		/* Container Rebuild Raid6 operation */
816221345Sdim	AifJobCtrScrubRaid6,		/* Container Scrub Raid6 operation */
817221345Sdim	AifJobCtrSSBackup,		/* Container snapshot backup task */
818221345Sdim	AifJobCtrMax = 199,		/* Max Ctr type operation */
819221345Sdim	AifJobFsMin,			/* Min Fs type operation */
820221345Sdim	AifJobFsCreate,			/* File System Create operation */
821221345Sdim	AifJobFsVerify,			/* File System Verify operation */
822221345Sdim	AifJobFsExtend,			/* File System Extend operation */
823207618Srdivacky	AifJobFsMax = 299,		/* Max Fs type operation */
824207618Srdivacky	AifJobApiFormatNTFS,		/* Format a drive to NTFS */
825207618Srdivacky	AifJobApiFormatFAT,		/* Format a drive to FAT */
826207618Srdivacky	AifJobApiUpdateSnapshot,	/* update the read/write half of a
827207618Srdivacky					 * snapshot */
828207618Srdivacky	AifJobApiFormatFAT32,		/* Format a drive to FAT32 */
829207618Srdivacky	AifJobApiMax = 399,		/* Max API type operation */
830207618Srdivacky	AifJobCtlContinuousCtrVerify,	/* Adapter operation */
831207618Srdivacky	AifJobCtlMax = 499		/* Max Adapter type operation */
832207618Srdivacky} AAC_AifJobType;
833207618Srdivacky
834207618Srdivackystruct aac_AifContainers {
835207618Srdivacky	u_int32_t	src;		/* from/master */
836207618Srdivacky	u_int32_t	dst;		/* to/slave */
837218893Sdim} __packed;
838207618Srdivacky
839207618Srdivackyunion aac_AifJobClient {
840207618Srdivacky	struct aac_AifContainers	container;	/* For Container and
841207618Srdivacky							 * filesystem progress
842207618Srdivacky							 * ops; */
843207618Srdivacky	int32_t				scsi_dh;	/* For SCSI progress
844207618Srdivacky							 * ops */
845207618Srdivacky};
846207618Srdivacky
847207618Srdivackystruct aac_AifJobDesc {
848207618Srdivacky	u_int32_t		jobID;		/* DO NOT FILL IN! Will be
849207618Srdivacky						 * filled in by AIF */
850207618Srdivacky	AAC_AifJobType		type;		/* Operation that is being
851218893Sdim						 * performed */
852207618Srdivacky	union aac_AifJobClient	client;		/* Details */
853207618Srdivacky} __packed;
854207618Srdivacky
855207618Srdivackystruct aac_AifJobProgressReport {
856207618Srdivacky	struct aac_AifJobDesc	jd;
857207618Srdivacky	AAC_AifJobStatus	status;
858207618Srdivacky	u_int32_t		finalTick;
859207618Srdivacky	u_int32_t		currentTick;
860207618Srdivacky	u_int32_t		jobSpecificData1;
861207618Srdivacky	u_int32_t		jobSpecificData2;
862207618Srdivacky} __packed;
863207618Srdivacky
864207618Srdivacky/*
865207618Srdivacky * Event Notification
866207618Srdivacky */
867207618Srdivackytypedef enum {
868207618Srdivacky	/* General application notifies start here */
869207618Srdivacky	AifEnGeneric = 1,		/* Generic notification */
870207618Srdivacky	AifEnTaskComplete,		/* Task has completed */
871207618Srdivacky	AifEnConfigChange,		/* Adapter config change occurred */
872207618Srdivacky	AifEnContainerChange,		/* Adapter specific container
873207618Srdivacky					 * configuration change */
874207618Srdivacky	AifEnDeviceFailure,		/* SCSI device failed */
875207618Srdivacky	AifEnMirrorFailover,		/* Mirror failover started */
876207618Srdivacky	AifEnContainerEvent,		/* Significant container event */
877207618Srdivacky	AifEnFileSystemChange,		/* File system changed */
878207618Srdivacky	AifEnConfigPause,		/* Container pause event */
879207618Srdivacky	AifEnConfigResume,		/* Container resume event */
880207618Srdivacky	AifEnFailoverChange,		/* Failover space assignment changed */
881207618Srdivacky	AifEnRAID5RebuildDone,		/* RAID5 rebuild finished */
882207618Srdivacky	AifEnEnclosureManagement,	/* Enclosure management event */
883207618Srdivacky	AifEnBatteryEvent,		/* Significant NV battery event */
884207618Srdivacky	AifEnAddContainer,		/* A new container was created. */
885207618Srdivacky	AifEnDeleteContainer,		/* A container was deleted. */
886207618Srdivacky	AifEnSMARTEvent,		/* SMART Event */
887218893Sdim	AifEnBatteryNeedsRecond,	/* The battery needs reconditioning */
888207618Srdivacky	AifEnClusterEvent,		/* Some cluster event */
889207618Srdivacky	AifEnDiskSetEvent,		/* A disk set event occured. */
890207618Srdivacky	AifEnContainerScsiEvent,	/* a container event with no. and scsi id */
891207618Srdivacky	AifEnPicBatteryEvent,	/* An event gen. by pic_battery.c for an ABM */
892207618Srdivacky	AifEnExpEvent,		/* Exp. Event Type to replace CTPopUp messages */
893207618Srdivacky	AifEnRAID6RebuildDone,	/* RAID6 rebuild finished */
894207618Srdivacky	AifEnSensorOverHeat,	/* Heat Sensor indicate overheat */
895218893Sdim	AifEnSensorCoolDown,	/* Heat Sensor ind. cooled down after overheat */
896207618Srdivacky	AifFeatureKeysModified,	/* notif. of updated feature keys */
897207618Srdivacky	AifApplicationExpirationEvent,	/* notif. on app. expiration status */
898207618Srdivacky	AifEnBackgroundConsistencyCheck,/* BCC notif. for NEC - DDTS 94700 */
899218893Sdim	AifEnAddJBOD,		/* A new JBOD type drive was created (30) */
900207618Srdivacky	AifEnDeleteJBOD,	/* A JBOD type drive was deleted (31) */
901207618Srdivacky	AifDriverNotifyStart=199,	/* Notifies for host driver go here */
902207618Srdivacky	/* Host driver notifications start here */
903207618Srdivacky	AifDenMorphComplete, 		/* A morph operation completed */
904207618Srdivacky	AifDenVolumeExtendComplete 	/* Volume expand operation completed */
905207618Srdivacky} AAC_AifEventNotifyType;
906207618Srdivacky
907207618Srdivackystruct aac_AifEnsGeneric {
908207618Srdivacky	char	text[132];		/* Generic text */
909207618Srdivacky} __packed;
910207618Srdivacky
911207618Srdivackystruct aac_AifEnsDeviceFailure {
912207618Srdivacky	u_int32_t	deviceHandle;	/* SCSI device handle */
913207618Srdivacky} __packed;
914207618Srdivacky
915207618Srdivackystruct aac_AifEnsMirrorFailover {
916207618Srdivacky	u_int32_t	container;	/* Container with failed element */
917207618Srdivacky	u_int32_t	failedSlice;	/* Old slice which failed */
918207618Srdivacky	u_int32_t	creatingSlice;	/* New slice used for auto-create */
919207618Srdivacky} __packed;
920207618Srdivacky
921207618Srdivackystruct aac_AifEnsContainerChange {
922207618Srdivacky	u_int32_t	container[2];	/* container that changed, -1 if no
923207618Srdivacky					 * container */
924207618Srdivacky} __packed;
925207618Srdivacky
926207618Srdivackystruct aac_AifEnsContainerEvent {
927207618Srdivacky	u_int32_t	container;	/* container number  */
928207618Srdivacky	u_int32_t	eventType;	/* event type */
929207618Srdivacky} __packed;
930207618Srdivacky
931207618Srdivackystruct aac_AifEnsEnclosureEvent {
932207618Srdivacky	u_int32_t	empID;		/* enclosure management proc number  */
933207618Srdivacky	u_int32_t	unitID;		/* unitId, fan id, power supply id,
934207618Srdivacky					 * slot id, tempsensor id.  */
935207618Srdivacky	u_int32_t	eventType;	/* event type */
936218893Sdim} __packed;
937207618Srdivacky
938207618Srdivackytypedef enum {
939221345Sdim	AIF_EM_DRIVE_INSERTION=31,
940221345Sdim	AIF_EM_DRIVE_REMOVAL
941221345Sdim} aac_AifEMEventType;
942221345Sdim
943221345Sdimstruct aac_AifEnsBatteryEvent {
944221345Sdim	AAC_NVBATT_TRANSITION	transition_type;	/* eg from low to ok */
945221345Sdim	AAC_NVBATTSTATUS	current_state;		/* current batt state */
946221345Sdim	AAC_NVBATTSTATUS	prior_state;		/* prev batt state */
947221345Sdim} __packed;
948221345Sdim
949221345Sdimstruct aac_AifEnsDiskSetEvent {
950207618Srdivacky	u_int32_t	eventType;
951221345Sdim	u_int64_t	DsNum;
952221345Sdim	u_int64_t	CreatorId;
953221345Sdim} __packed;
954207618Srdivacky
955221345Sdimtypedef enum {
956221345Sdim	CLUSTER_NULL_EVENT = 0,
957221345Sdim	CLUSTER_PARTNER_NAME_EVENT,	/* change in partner hostname or
958221345Sdim					 * adaptername from NULL to non-NULL */
959221345Sdim	/* (partner's agent may be up) */
960221345Sdim	CLUSTER_PARTNER_NULL_NAME_EVENT	/* change in partner hostname or
961221345Sdim					 * adaptername from non-null to NULL */
962221345Sdim	/* (partner has rebooted) */
963221345Sdim} AAC_ClusterAifEvent;
964221345Sdim
965221345Sdimstruct aac_AifEnsClusterEvent {
966221345Sdim	AAC_ClusterAifEvent	eventType;
967221345Sdim} __packed;
968221345Sdim
969221345Sdimstruct aac_AifEventNotify {
970221345Sdim	AAC_AifEventNotifyType	type;
971221345Sdim	union {
972221345Sdim		struct aac_AifEnsGeneric		EG;
973221345Sdim		struct aac_AifEnsDeviceFailure		EDF;
974221345Sdim		struct aac_AifEnsMirrorFailover		EMF;
975207618Srdivacky		struct aac_AifEnsContainerChange	ECC;
976221345Sdim		struct aac_AifEnsContainerEvent		ECE;
977221345Sdim		struct aac_AifEnsEnclosureEvent		EEE;
978207618Srdivacky		struct aac_AifEnsBatteryEvent		EBE;
979221345Sdim		struct aac_AifEnsDiskSetEvent		EDS;
980207618Srdivacky/*		struct aac_AifEnsSMARTEvent		ES;*/
981207618Srdivacky		struct aac_AifEnsClusterEvent		ECLE;
982207618Srdivacky	} data;
983218893Sdim} __packed;
984207618Srdivacky
985207618Srdivacky/*
986207618Srdivacky * Adapter Initiated FIB command structures. Start with the adapter
987207618Srdivacky * initiated FIBs that really come from the adapter, and get responded
988207618Srdivacky * to by the host.
989218893Sdim */
990207618Srdivacky#define AAC_AIF_REPORT_MAX_SIZE 64
991207618Srdivacky
992207618Srdivackytypedef enum {
993207618Srdivacky	AifCmdEventNotify = 1,	/* Notify of event */
994207618Srdivacky	AifCmdJobProgress,	/* Progress report */
995218893Sdim	AifCmdAPIReport,	/* Report from other user of API */
996207618Srdivacky	AifCmdDriverNotify,	/* Notify host driver of event */
997207618Srdivacky	AifReqJobList = 100,	/* Gets back complete job list */
998207618Srdivacky	AifReqJobsForCtr,	/* Gets back jobs for specific container */
999207618Srdivacky	AifReqJobsForScsi,	/* Gets back jobs for specific SCSI device */
1000207618Srdivacky	AifReqJobReport,	/* Gets back a specific job report or list */
1001207618Srdivacky	AifReqTerminateJob,	/* Terminates job */
1002207618Srdivacky	AifReqSuspendJob,	/* Suspends a job */
1003207618Srdivacky	AifReqResumeJob,	/* Resumes a job */
1004207618Srdivacky	AifReqSendAPIReport,	/* API generic report requests */
1005207618Srdivacky	AifReqAPIJobStart,	/* Start a job from the API */
1006207618Srdivacky	AifReqAPIJobUpdate,	/* Update a job report from the API */
1007207618Srdivacky	AifReqAPIJobFinish	/* Finish a job from the API */
1008207618Srdivacky} AAC_AifCommand;
1009207618Srdivacky
1010207618Srdivackystruct aac_aif_command {
1011207618Srdivacky	AAC_AifCommand	command;	/* Tell host what type of
1012207618Srdivacky					 * notify this is */
1013207618Srdivacky	u_int32_t	seqNumber;	/* To allow ordering of
1014207618Srdivacky					 * reports (if necessary) */
1015207618Srdivacky	union {
1016207618Srdivacky		struct aac_AifEventNotify	EN;	/* Event notify */
1017207618Srdivacky		struct aac_AifJobProgressReport	PR[1];	/* Progress report */
1018207618Srdivacky		u_int8_t			AR[AAC_AIF_REPORT_MAX_SIZE];
1019207618Srdivacky		u_int8_t			data[AAC_FIB_DATASIZE - 8];
1020207618Srdivacky	} data;
1021207618Srdivacky} __packed;
1022207618Srdivacky
1023207618Srdivacky/*
1024207618Srdivacky * Filesystem commands/data
1025207618Srdivacky *
1026207618Srdivacky * The adapter has a very complex filesystem interface, most of which we ignore.
1027207618Srdivacky * (And which seems not to be implemented, anyway.)
1028207618Srdivacky */
1029207618Srdivacky
1030207618Srdivacky/*
1031207618Srdivacky * FSA commands
1032207618Srdivacky * (not used?)
1033207618Srdivacky */
1034207618Srdivackytypedef enum {
1035207618Srdivacky	Null = 0,
1036207618Srdivacky	GetAttributes,
1037207618Srdivacky	SetAttributes,
1038207618Srdivacky	Lookup,
1039207618Srdivacky	ReadLink,
1040207618Srdivacky	Read,
1041207618Srdivacky	Write,
1042207618Srdivacky	Create,
1043207618Srdivacky	MakeDirectory,
1044207618Srdivacky	SymbolicLink,
1045207618Srdivacky	MakeNode,
1046207618Srdivacky	Removex,
1047207618Srdivacky	RemoveDirectory,
1048207618Srdivacky	Rename,
1049207618Srdivacky	Link,
1050207618Srdivacky	ReadDirectory,
1051207618Srdivacky	ReadDirectoryPlus,
1052207618Srdivacky	FileSystemStatus,
1053207618Srdivacky	FileSystemInfo,
1054207618Srdivacky	PathConfigure,
1055207618Srdivacky	Commit,
1056207618Srdivacky	Mount,
1057207618Srdivacky	UnMount,
1058207618Srdivacky	Newfs,
1059207618Srdivacky	FsCheck,
1060207618Srdivacky	FsSync,
1061207618Srdivacky	SimReadWrite,
1062207618Srdivacky	SetFileSystemStatus,
1063207618Srdivacky	BlockRead,
1064207618Srdivacky	BlockWrite,
1065207618Srdivacky	NvramIoctl,
1066207618Srdivacky	FsSyncWait,
1067207618Srdivacky	ClearArchiveBit,
1068207618Srdivacky	SetAcl,
1069207618Srdivacky	GetAcl,
1070207618Srdivacky	AssignAcl,
1071207618Srdivacky	FaultInsertion,
1072207618Srdivacky	CrazyCache
1073193323Sed} AAC_FSACommand;
1074198090Srdivacky
1075198090Srdivacky/*
1076193323Sed * Command status values
1077198090Srdivacky */
1078198090Srdivackytypedef enum {
1079198090Srdivacky	ST_OK = 0,
1080198090Srdivacky	ST_PERM = 1,
1081198090Srdivacky	ST_NOENT = 2,
1082198090Srdivacky	ST_IO = 5,
1083198090Srdivacky	ST_NXIO = 6,
1084193323Sed	ST_E2BIG = 7,
1085193323Sed	ST_ACCES = 13,
1086193323Sed	ST_EXIST = 17,
1087193323Sed	ST_XDEV = 18,
1088193323Sed	ST_NODEV = 19,
1089193323Sed	ST_NOTDIR = 20,
1090193323Sed	ST_ISDIR = 21,
1091193323Sed	ST_INVAL = 22,
1092193323Sed	ST_FBIG = 27,
1093193323Sed	ST_NOSPC = 28,
1094193323Sed	ST_ROFS = 30,
1095218893Sdim	ST_MLINK = 31,
1096218893Sdim	ST_WOULDBLOCK = 35,
1097218893Sdim	ST_NAMETOOLONG = 63,
1098224145Sdim	ST_NOTEMPTY = 66,
1099224145Sdim	ST_DQUOT = 69,
1100224145Sdim	ST_STALE = 70,
1101218893Sdim	ST_REMOTE = 71,
1102223017Sdim	ST_NOT_READY = 72,
1103224145Sdim	ST_BADHANDLE = 10001,
1104224145Sdim	ST_NOT_SYNC = 10002,
1105218893Sdim	ST_BAD_COOKIE = 10003,
1106218893Sdim	ST_NOTSUPP = 10004,
1107218893Sdim	ST_TOOSMALL = 10005,
1108218893Sdim	ST_SERVERFAULT = 10006,
1109224145Sdim	ST_BADTYPE = 10007,
1110224145Sdim	ST_JUKEBOX = 10008,
1111224145Sdim	ST_NOTMOUNTED = 10009,
1112224145Sdim	ST_MAINTMODE = 10010,
1113224145Sdim	ST_STALEACL = 10011,
1114224145Sdim	ST_BUS_RESET = 20001
1115224145Sdim} AAC_FSAStatus;
1116224145Sdim
1117218893Sdim/*
1118218893Sdim * Volume manager commands
1119224145Sdim */
1120224145Sdimtypedef enum _VM_COMMANDS {
1121224145Sdim	VM_Null = 0,
1122224145Sdim	VM_NameServe,
1123224145Sdim	VM_ContainerConfig,
1124224145Sdim	VM_Ioctl,
1125224145Sdim	VM_FilesystemIoctl,
1126224145Sdim	VM_CloseAll,
1127224145Sdim	VM_CtBlockRead,
1128224145Sdim	VM_CtBlockWrite,
1129218893Sdim	VM_SliceBlockRead,	 /* raw access to configured storage objects */
1130218893Sdim	VM_SliceBlockWrite,
1131218893Sdim	VM_DriveBlockRead,	 /* raw access to physical devices */
1132218893Sdim	VM_DriveBlockWrite,
1133218893Sdim	VM_EnclosureMgt,	 /* enclosure management */
1134218893Sdim	VM_Unused,		 /* used to be diskset management */
1135218893Sdim	VM_CtBlockVerify,
1136218893Sdim	VM_CtPerf,		 /* performance test */
1137224145Sdim	VM_CtBlockRead64,
1138224145Sdim	VM_CtBlockWrite64,
1139224145Sdim	VM_CtBlockVerify64,
1140224145Sdim	VM_CtHostRead64,
1141224145Sdim	VM_CtHostWrite64,
1142224145Sdim	VM_DrvErrTblLog,	/* drive error table/log type of command */
1143224145Sdim	VM_NameServe64
1144224145Sdim} AAC_VMCommand;
1145224145Sdim
1146224145Sdim/*
1147224145Sdim * "mountable object"
1148224145Sdim */
1149224145Sdimstruct aac_mntobj {
1150224145Sdim	u_int32_t			ObjectId;
1151224145Sdim	char				FileSystemName[16];
1152224145Sdim	struct aac_container_creation	CreateInfo;
1153224145Sdim	u_int32_t			Capacity;
1154224145Sdim	u_int32_t			VolType;
1155224145Sdim	u_int32_t			ObjType;
1156224145Sdim	u_int32_t			ContentState;
1157224145Sdim#define FSCS_READONLY		0x0002		/* XXX need more information
1158224145Sdim						 * than this */
1159224145Sdim	union {
1160224145Sdim		u_int32_t	pad[8];
1161224145Sdim	} ObjExtension;
1162224145Sdim	u_int32_t			AlterEgoId;
1163224145Sdim	u_int32_t			CapacityHigh;
1164224145Sdim} __packed;
1165224145Sdim
1166224145Sdimstruct aac_mntinfo {
1167224145Sdim	u_int32_t		Command;
1168224145Sdim	u_int32_t		MntType;
1169224145Sdim	u_int32_t		MntCount;
1170224145Sdim} __packed;
1171224145Sdim
1172224145Sdimstruct aac_mntinforesp {
1173224145Sdim	u_int32_t		Status;
1174224145Sdim	u_int32_t		MntType;
1175224145Sdim	u_int32_t		MntRespCount;
1176218893Sdim	struct aac_mntobj	MntTable[1];
1177218893Sdim} __packed;
1178193323Sed
1179218893Sdim/*
1180218893Sdim * Container shutdown command.
1181218893Sdim */
1182218893Sdimstruct aac_closecommand {
1183218893Sdim	u_int32_t	Command;
1184218893Sdim	u_int32_t	ContainerId;
1185218893Sdim} __packed;
1186218893Sdim
1187218893Sdim/*
1188218893Sdim * Container Config Command
1189218893Sdim */
1190218893Sdim#define CT_GET_SCSI_METHOD	64
1191218893Sdimstruct aac_ctcfg {
1192218893Sdim	u_int32_t		Command;
1193218893Sdim	u_int32_t		cmd;
1194218893Sdim	u_int32_t		param;
1195218893Sdim} __packed;
1196218893Sdim
1197218893Sdimstruct aac_ctcfg_resp {
1198218893Sdim	u_int32_t		Status;
1199218893Sdim	u_int32_t		resp;
1200218893Sdim	u_int32_t		param;
1201218893Sdim} __packed;
1202218893Sdim
1203218893Sdim/*
1204218893Sdim * 'Ioctl' commads
1205218893Sdim */
1206218893Sdim#define AAC_SCSI_MAX_PORTS	10
1207218893Sdim#define AAC_BUS_NO_EXIST	0
1208218893Sdim#define AAC_BUS_VALID		1
1209218893Sdim#define AAC_BUS_FAULTED		2
1210218893Sdim#define AAC_BUS_DISABLED	3
1211218893Sdim#define GetBusInfo		0x9
1212218893Sdim
1213218893Sdimstruct aac_getbusinf {
1214218893Sdim	u_int32_t		ProbeComplete;
1215218893Sdim	u_int32_t		BusCount;
1216218893Sdim	u_int32_t		TargetsPerBus;
1217218893Sdim	u_int8_t		InitiatorBusId[AAC_SCSI_MAX_PORTS];
1218218893Sdim	u_int8_t		BusValid[AAC_SCSI_MAX_PORTS];
1219218893Sdim} __packed;
1220218893Sdim
1221218893Sdimstruct aac_vmioctl {
1222218893Sdim	u_int32_t		Command;
1223218893Sdim	u_int32_t		ObjType;
1224218893Sdim	u_int32_t		MethId;
1225218893Sdim	u_int32_t		ObjId;
1226218893Sdim	u_int32_t		IoctlCmd;
1227218893Sdim	u_int32_t		IoctlBuf[1];	/* Placeholder? */
1228218893Sdim} __packed;
1229218893Sdim
1230218893Sdimstruct aac_vmi_businf_resp {
1231218893Sdim	u_int32_t		Status;
1232218893Sdim	u_int32_t		ObjType;
1233218893Sdim	u_int32_t		MethId;
1234218893Sdim	u_int32_t		ObjId;
1235218893Sdim	u_int32_t		IoctlCmd;
1236218893Sdim	struct aac_getbusinf	BusInf;
1237218893Sdim} __packed;
1238218893Sdim
1239218893Sdim#if 0
1240218893Sdim#define AAC_BTL_TO_HANDLE(b, t, l) \
1241218893Sdim    (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf))
1242218893Sdim#else
1243218893Sdim#define AAC_BTL_TO_HANDLE(b, t, l) \
1244218893Sdim    ((((u_int32_t)b & 0x0f) << 24) | \
1245218893Sdim     (((u_int32_t)l & 0xff) << 16) | \
1246218893Sdim     ((u_int32_t)t & 0xffff))
1247218893Sdim#endif
1248218893Sdim#define GetDeviceProbeInfo 0x5
1249218893Sdim
1250218893Sdimstruct aac_vmi_devinfo_resp {
1251218893Sdim	u_int32_t		Status;
1252218893Sdim	u_int32_t		ObjType;
1253218893Sdim	u_int32_t		MethId;
1254218893Sdim	u_int32_t		ObjId;
1255218893Sdim	u_int32_t		IoctlCmd;
1256218893Sdim	u_int8_t		VendorId[8];
1257218893Sdim	u_int8_t		ProductId[16];
1258218893Sdim	u_int8_t		ProductRev[4];
1259218893Sdim	u_int32_t		Inquiry7;
1260218893Sdim	u_int32_t		align1;
1261218893Sdim	u_int32_t		Inquiry0;
1262218893Sdim	u_int32_t		align2;
1263218893Sdim	u_int32_t		Inquiry1;
1264218893Sdim	u_int32_t		align3;
1265218893Sdim	u_int32_t		reserved[2];
1266218893Sdim	u_int8_t		VendorSpecific[20];
1267218893Sdim	u_int32_t		Smart:1;
1268218893Sdim	u_int32_t		AAC_Managed:1;
1269218893Sdim	u_int32_t		align4;
1270218893Sdim	u_int32_t		reserved2:6;
1271218893Sdim	u_int32_t		Bus;
1272218893Sdim	u_int32_t		Target;
1273218893Sdim	u_int32_t		Lun;
1274218893Sdim	u_int32_t		ultraEnable:1,
1275218893Sdim				disconnectEnable:1,
1276218893Sdim				fast20EnabledW:1,
1277218893Sdim				scamDevice:1,
1278218893Sdim				scamTolerant:1,
1279218893Sdim				setForSync:1,
1280218893Sdim				setForWide:1,
1281218893Sdim				syncDevice:1,
1282218893Sdim				wideDevice:1,
1283218893Sdim				reserved1:7,
1284218893Sdim				ScsiRate:8,
1285218893Sdim				ScsiOffset:8;
1286218893Sdim}; /* Do not pack */
1287218893Sdim
1288218893Sdim#define ResetBus 0x16
1289218893Sdimstruct aac_resetbus {
1290218893Sdim	u_int32_t		BusNumber;
1291218893Sdim};
1292218893Sdim
1293218893Sdim/*
1294218893Sdim * Write 'stability' options.
1295218893Sdim */
1296218893Sdimtypedef enum {
1297218893Sdim	CSTABLE = 1,
1298218893Sdim	CUNSTABLE
1299218893Sdim} AAC_CacheLevel;
1300218893Sdim
1301218893Sdim/*
1302218893Sdim * Commit level response for a write request.
1303218893Sdim */
1304218893Sdimtypedef enum {
1305218893Sdim	CMFILE_SYNC_NVRAM = 1,
1306218893Sdim	CMDATA_SYNC_NVRAM,
1307218893Sdim	CMFILE_SYNC,
1308218893Sdim	CMDATA_SYNC,
1309218893Sdim	CMUNSTABLE
1310218893Sdim} AAC_CommitLevel;
1311218893Sdim
1312218893Sdim/*
1313218893Sdim * Block read/write operations.
1314218893Sdim * These structures are packed into the 'data' area in the FIB.
1315218893Sdim */
1316218893Sdim
1317218893Sdimstruct aac_blockread {
1318218893Sdim	u_int32_t		Command;	/* not FSACommand! */
1319218893Sdim	u_int32_t		ContainerId;
1320218893Sdim	u_int32_t		BlockNumber;
1321218893Sdim	u_int32_t		ByteCount;
1322218893Sdim	struct aac_sg_table	SgMap;		/* variable size */
1323218893Sdim} __packed;
1324218893Sdim
1325218893Sdimstruct aac_blockread64 {
1326218893Sdim	u_int32_t		Command;
1327218893Sdim	u_int16_t		ContainerId;
1328218893Sdim	u_int16_t		SectorCount;
1329218893Sdim	u_int32_t		BlockNumber;
1330218893Sdim	u_int16_t		Pad;
1331218893Sdim	u_int16_t		Flags;
1332218893Sdim	struct aac_sg_table64	SgMap64;
1333218893Sdim} __packed;
1334218893Sdim
1335218893Sdimstruct aac_blockread_response {
1336218893Sdim	u_int32_t		Status;
1337218893Sdim	u_int32_t		ByteCount;
1338218893Sdim} __packed;
1339218893Sdim
1340218893Sdimstruct aac_blockwrite {
1341218893Sdim	u_int32_t		Command;	/* not FSACommand! */
1342218893Sdim	u_int32_t		ContainerId;
1343218893Sdim	u_int32_t		BlockNumber;
1344218893Sdim	u_int32_t		ByteCount;
1345218893Sdim	u_int32_t		Stable;
1346218893Sdim	struct aac_sg_table	SgMap;		/* variable size */
1347218893Sdim} __packed;
1348218893Sdim
1349218893Sdimstruct aac_blockwrite64 {
1350218893Sdim	u_int32_t		Command;	/* not FSACommand! */
1351218893Sdim	u_int16_t		ContainerId;
1352218893Sdim	u_int16_t		SectorCount;
1353218893Sdim	u_int32_t		BlockNumber;
1354218893Sdim	u_int16_t		Pad;
1355218893Sdim	u_int16_t		Flags;
1356218893Sdim	struct aac_sg_table64	SgMap64;	/* variable size */
1357218893Sdim} __packed;
1358218893Sdim
1359218893Sdimstruct aac_blockwrite_response {
1360218893Sdim	u_int32_t		Status;
1361218893Sdim	u_int32_t		ByteCount;
1362218893Sdim	u_int32_t		Committed;
1363218893Sdim} __packed;
1364218893Sdim
1365218893Sdimstruct aac_raw_io {
1366218893Sdim	u_int64_t		BlockNumber;
1367224145Sdim	u_int32_t		ByteCount;
1368218893Sdim	u_int16_t		ContainerId;
1369218893Sdim	u_int16_t		Flags;				/* 0: W, 1: R */
1370218893Sdim	u_int16_t		BpTotal;			/* reserved for FW use */
1371218893Sdim	u_int16_t		BpComplete;			/* reserved for FW use */
1372218893Sdim	struct aac_sg_tableraw	SgMapRaw;	/* variable size */
1373218893Sdim} __packed;
1374218893Sdim
1375218893Sdim/*
1376218893Sdim * Container shutdown command.
1377218893Sdim */
1378218893Sdimstruct aac_close_command {
1379218893Sdim	u_int32_t		Command;
1380218893Sdim	u_int32_t		ContainerId;
1381218893Sdim};
1382218893Sdim
1383218893Sdim/*
1384218893Sdim * SCSI Passthrough structures
1385218893Sdim */
1386218893Sdimstruct aac_srb {
1387218893Sdim	u_int32_t		function;
1388218893Sdim	u_int32_t		bus;
1389218893Sdim	u_int32_t		target;
1390218893Sdim	u_int32_t		lun;
1391218893Sdim	u_int32_t		timeout;
1392218893Sdim	u_int32_t		flags;
1393218893Sdim	u_int32_t		data_len;
1394218893Sdim	u_int32_t		retry_limit;
1395218893Sdim	u_int32_t		cdb_len;
1396218893Sdim	u_int8_t		cdb[16];
1397221345Sdim	struct aac_sg_table	sg_map;
1398221345Sdim};
1399218893Sdim
1400218893Sdimenum {
1401218893Sdim	AAC_SRB_FUNC_EXECUTE_SCSI	= 0x00,
1402218893Sdim	AAC_SRB_FUNC_CLAIM_DEVICE,
1403218893Sdim	AAC_SRB_FUNC_IO_CONTROL,
1404218893Sdim	AAC_SRB_FUNC_RECEIVE_EVENT,
1405218893Sdim	AAC_SRB_FUNC_RELEASE_QUEUE,
1406218893Sdim	AAC_SRB_FUNC_ATTACH_DEVICE,
1407218893Sdim	AAC_SRB_FUNC_RELEASE_DEVICE,
1408218893Sdim	AAC_SRB_FUNC_SHUTDOWN,
1409218893Sdim	AAC_SRB_FUNC_FLUSH,
1410218893Sdim	AAC_SRB_FUNC_ABORT_COMMAND	= 0x10,
1411218893Sdim	AAC_SRB_FUNC_RELEASE_RECOVERY,
1412218893Sdim	AAC_SRB_FUNC_RESET_BUS,
1413218893Sdim	AAC_SRB_FUNC_RESET_DEVICE,
1414218893Sdim	AAC_SRB_FUNC_TERMINATE_IO,
1415218893Sdim	AAC_SRB_FUNC_FLUSH_QUEUE,
1416218893Sdim	AAC_SRB_FUNC_REMOVE_DEVICE,
1417218893Sdim	AAC_SRB_FUNC_DOMAIN_VALIDATION
1418218893Sdim};
1419218893Sdim
1420218893Sdim#define AAC_SRB_FLAGS_NO_DATA_XFER		0x0000
1421218893Sdim#define	AAC_SRB_FLAGS_DISABLE_DISCONNECT	0x0004
1422218893Sdim#define	AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER	0x0008
1423218893Sdim#define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE	0x0010
1424218893Sdim#define	AAC_SRB_FLAGS_DISABLE_AUTOSENSE		0x0020
1425218893Sdim#define	AAC_SRB_FLAGS_DATA_IN			0x0040
1426218893Sdim#define AAC_SRB_FLAGS_DATA_OUT			0x0080
1427218893Sdim#define	AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \
1428218893Sdim			(AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT)
1429218893Sdim
1430218893Sdim#define AAC_HOST_SENSE_DATA_MAX			30
1431218893Sdim
1432218893Sdimstruct aac_srb_response {
1433218893Sdim	u_int32_t	fib_status;
1434218893Sdim	u_int32_t	srb_status;
1435218893Sdim	u_int32_t	scsi_status;
1436218893Sdim	u_int32_t	data_len;
1437218893Sdim	u_int32_t	sense_len;
1438193323Sed	u_int8_t	sense[AAC_HOST_SENSE_DATA_MAX];
1439193323Sed};
1440218893Sdim
1441218893Sdim/*
1442218893Sdim * Status codes for SCSI passthrough commands.  Since they are based on ASPI,
1443193323Sed * they also exactly match CAM status codes in both enumeration and meaning.
1444193323Sed * They seem to also be used as status codes for synchronous FIBs.
1445224145Sdim */
1446193323Sedenum {
1447218893Sdim	AAC_SRB_STS_PENDING			= 0x00,
1448193323Sed	AAC_SRB_STS_SUCCESS,
1449193323Sed	AAC_SRB_STS_ABORTED,
1450193323Sed	AAC_SRB_STS_ABORT_FAILED,
1451193323Sed	AAC_SRB_STS_ERROR,
1452193323Sed	AAC_SRB_STS_BUSY,
1453193323Sed	AAC_SRB_STS_INVALID_REQUEST,
1454193323Sed	AAC_SRB_STS_INVALID_PATH_ID,
1455218893Sdim	AAC_SRB_STS_NO_DEVICE,
1456193323Sed	AAC_SRB_STS_TIMEOUT,
1457193323Sed	AAC_SRB_STS_SELECTION_TIMEOUT,
1458193323Sed	AAC_SRB_STS_COMMAND_TIMEOUT,
1459193323Sed	AAC_SRB_STS_MESSAGE_REJECTED		= 0x0D,
1460218893Sdim	AAC_SRB_STS_BUS_RESET,
1461218893Sdim	AAC_SRB_STS_PARITY_ERROR,
1462218893Sdim	AAC_SRB_STS_REQUEST_SENSE_FAILED,
1463218893Sdim	AAC_SRB_STS_NO_HBA,
1464218893Sdim	AAC_SRB_STS_DATA_OVERRUN,
1465218893Sdim	AAC_SRB_STS_UNEXPECTED_BUS_FREE,
1466218893Sdim	AAC_SRB_STS_PHASE_SEQUENCE_FAILURE,
1467218893Sdim	AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH,
1468218893Sdim	AAC_SRB_STS_REQUEST_FLUSHED,
1469218893Sdim	AAC_SRB_STS_INVALID_LUN			= 0x20,
1470218893Sdim	AAC_SRB_STS_INVALID_TARGET_ID,
1471224145Sdim	AAC_SRB_STS_BAD_FUNCTION,
1472218893Sdim	AAC_SRB_STS_ERROR_RECOVERY
1473218893Sdim};
1474218893Sdim
1475193323Sed/*
1476193323Sed * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
1477193323Sed * on the SA110 'StrongArm'.
1478193323Sed */
1479193323Sed
1480193323Sed#define AAC_SA_DOORBELL0_CLEAR		0x98	/* doorbell 0 (adapter->host) */
1481193323Sed#define AAC_SA_DOORBELL0_SET		0x9c
1482207618Srdivacky#define AAC_SA_DOORBELL0		0x9c
1483203954Srdivacky#define AAC_SA_MASK0_CLEAR		0xa0
1484203954Srdivacky#define AAC_SA_MASK0_SET		0xa4
1485203954Srdivacky
1486203954Srdivacky#define AAC_SA_DOORBELL1_CLEAR		0x9a	/* doorbell 1 (host->adapter) */
1487203954Srdivacky#define AAC_SA_DOORBELL1_SET		0x9e
1488193323Sed#define AAC_SA_DOORBELL1		0x9e
1489203954Srdivacky#define AAC_SA_MASK1_CLEAR		0xa2
1490203954Srdivacky#define AAC_SA_MASK1_SET		0xa6
1491203954Srdivacky
1492203954Srdivacky#define AAC_SA_MAILBOX			0xa8	/* mailbox (20 bytes) */
1493203954Srdivacky#define AAC_SA_FWSTATUS			0xc4
1494203954Srdivacky
1495193323Sed/*
1496193323Sed * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
1497207618Srdivacky * and other related adapters.
1498193323Sed */
1499224145Sdim
1500224145Sdim#define AAC_RX_OMR0		0x18	/* outbound message register 0 */
1501193323Sed#define AAC_RX_OMR1		0x1c	/* outbound message register 1 */
1502193323Sed#define AAC_RX_IDBR		0x20	/* inbound doorbell register */
1503198892Srdivacky#define AAC_RX_IISR		0x24	/* inbound interrupt status register */
1504193323Sed#define AAC_RX_IIMR		0x28	/* inbound interrupt mask register */
1505207618Srdivacky#define AAC_RX_ODBR		0x2c	/* outbound doorbell register */
1506193323Sed#define AAC_RX_OISR		0x30	/* outbound interrupt status register */
1507193323Sed#define AAC_RX_OIMR		0x34	/* outbound interrupt mask register */
1508198892Srdivacky#define AAC_RX_IQUE		0x40	/* inbound queue */
1509193323Sed#define AAC_RX_OQUE		0x44	/* outbound queue */
1510193323Sed
1511193323Sed#define AAC_RX_MAILBOX		0x50	/* mailbox (20 bytes) */
1512193323Sed#define AAC_RX_FWSTATUS		0x6c
1513193323Sed
1514198892Srdivacky/*
1515193323Sed * Register definitions for the Adaptec 'Rocket' RAID-On-Chip adapters.
1516218893Sdim * Unsurprisingly, it's quite similar to the i960!
1517193323Sed */
1518193323Sed
1519193323Sed#define AAC_RKT_OMR0		0x18	/* outbound message register 0 */
1520193323Sed#define AAC_RKT_OMR1		0x1c	/* outbound message register 1 */
1521207618Srdivacky#define AAC_RKT_IDBR		0x20	/* inbound doorbell register */
1522193323Sed#define AAC_RKT_IISR		0x24	/* inbound interrupt status register */
1523193323Sed#define AAC_RKT_IIMR		0x28	/* inbound interrupt mask register */
1524193323Sed#define AAC_RKT_ODBR		0x2c	/* outbound doorbell register */
1525193323Sed#define AAC_RKT_OISR		0x30	/* outbound interrupt status register */
1526193323Sed#define AAC_RKT_OIMR		0x34	/* outbound interrupt mask register */
1527193323Sed#define AAC_RKT_IQUE		0x40	/* inbound queue */
1528218893Sdim#define AAC_RKT_OQUE		0x44	/* outbound queue */
1529193323Sed
1530193323Sed#define AAC_RKT_MAILBOX		0x1000	/* mailbox */
1531193323Sed#define AAC_RKT_FWSTATUS	0x101c	/* Firmware Status (mailbox 7) */
1532193323Sed
1533193323Sed/*
1534224145Sdim * Common bit definitions for the doorbell registers.
1535224145Sdim */
1536202375Srdivacky
1537224145Sdim/*
1538224145Sdim * Status bits in the doorbell registers.
1539224145Sdim */
1540224145Sdim#define AAC_DB_SYNC_COMMAND	(1<<0)	/* send/completed synchronous FIB */
1541198090Srdivacky#define AAC_DB_COMMAND_READY	(1<<1)	/* posted one or more commands */
1542224145Sdim#define AAC_DB_RESPONSE_READY	(1<<2)	/* one or more commands complete */
1543193323Sed#define AAC_DB_COMMAND_NOT_FULL	(1<<3)	/* command queue not full */
1544193323Sed#define AAC_DB_RESPONSE_NOT_FULL (1<<4)	/* response queue not full */
1545193323Sed
1546193323Sed/*
1547193323Sed * The adapter can request the host print a message by setting the
1548218893Sdim * DB_PRINTF flag in DOORBELL0.  The driver responds by collecting the
1549193323Sed * message from the printf buffer, clearing the DB_PRINTF flag in
1550193323Sed * DOORBELL0 and setting it in DOORBELL1.
1551193323Sed * (ODBR and IDBR respectively for the i960Rx adapters)
1552193323Sed */
1553193323Sed#define AAC_DB_PRINTF		(1<<5)	/* adapter requests host printf */
1554193323Sed#define AAC_PRINTF_DONE		(1<<5)	/* Host completed printf processing */
1555198090Srdivacky
1556198090Srdivacky/*
1557218893Sdim * Mask containing the interrupt bits we care about.  We don't anticipate (or
1558207618Srdivacky * want) interrupts not in this mask.
1559207618Srdivacky */
1560218893Sdim#define AAC_DB_INTERRUPTS	(AAC_DB_COMMAND_READY  |	\
1561203954Srdivacky				 AAC_DB_RESPONSE_READY |	\
1562203954Srdivacky				 AAC_DB_PRINTF)
1563203954Srdivacky#define AAC_DB_INT_NEW_COMM		0x08
1564203954Srdivacky
1565203954Srdivacky