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