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