xref: /illumos-gate/usr/src/uts/common/io/aac/aac_regs.h (revision 3fced4392c3510db4e569c4f8188c45bb5b5f5d3)
1942c5e3cSpl196000 /*
2*3fced439Szhongyan gu - Sun Microsystems - Beijing China  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
3942c5e3cSpl196000  */
4942c5e3cSpl196000 
5942c5e3cSpl196000 /*
6942c5e3cSpl196000  * Copyright 2005-06 Adaptec, Inc.
7942c5e3cSpl196000  * Copyright (c) 2005-06 Adaptec Inc., Achim Leubner
8942c5e3cSpl196000  * Copyright (c) 2000 Michael Smith
9942c5e3cSpl196000  * Copyright (c) 2000-2001 Scott Long
10942c5e3cSpl196000  * Copyright (c) 2000 BSDi
11942c5e3cSpl196000  * All rights reserved.
12942c5e3cSpl196000  *
13942c5e3cSpl196000  * Redistribution and use in source and binary forms, with or without
14942c5e3cSpl196000  * modification, are permitted provided that the following conditions
15942c5e3cSpl196000  * are met:
16942c5e3cSpl196000  * 1. Redistributions of source code must retain the above copyright
17942c5e3cSpl196000  *    notice, this list of conditions and the following disclaimer.
18942c5e3cSpl196000  * 2. Redistributions in binary form must reproduce the above copyright
19942c5e3cSpl196000  *    notice, this list of conditions and the following disclaimer in the
20942c5e3cSpl196000  *    documentation and/or other materials provided with the distribution.
21942c5e3cSpl196000  *
22942c5e3cSpl196000  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23942c5e3cSpl196000  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24942c5e3cSpl196000  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25942c5e3cSpl196000  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26942c5e3cSpl196000  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27942c5e3cSpl196000  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28942c5e3cSpl196000  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29942c5e3cSpl196000  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30942c5e3cSpl196000  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31942c5e3cSpl196000  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32942c5e3cSpl196000  * SUCH DAMAGE.
33942c5e3cSpl196000  *
34942c5e3cSpl196000  *    $FreeBSD: src/sys/dev/aac/aacreg.h,v 1.23 2005/10/14 16:22:45 scottl Exp $
35942c5e3cSpl196000  */
36942c5e3cSpl196000 
37942c5e3cSpl196000 #ifndef	__AAC_REGS_H__
38942c5e3cSpl196000 #define	__AAC_REGS_H__
39942c5e3cSpl196000 
40942c5e3cSpl196000 #ifdef	__cplusplus
41942c5e3cSpl196000 extern "C" {
42942c5e3cSpl196000 #endif
43942c5e3cSpl196000 
44942c5e3cSpl196000 /* Status bits in the doorbell registers */
45942c5e3cSpl196000 #define	AAC_DB_SYNC_COMMAND		(1<<0)	/* send/completed synchronous */
46942c5e3cSpl196000 						/* FIB */
47942c5e3cSpl196000 #define	AAC_DB_COMMAND_READY		(1<<1)	/* posted one or more */
48942c5e3cSpl196000 						/* commands */
49942c5e3cSpl196000 #define	AAC_DB_RESPONSE_READY		(1<<2)	/* one or more commands	*/
50942c5e3cSpl196000 						/* complete */
51942c5e3cSpl196000 #define	AAC_DB_COMMAND_NOT_FULL		(1<<3)	/* command queue not full */
52942c5e3cSpl196000 #define	AAC_DB_RESPONSE_NOT_FULL	(1<<4)	/* response queue not full */
53942c5e3cSpl196000 #define	AAC_DB_PRINTF_READY		(1<<5)	/* adapter requests host */
54942c5e3cSpl196000 						/* printf */
55942c5e3cSpl196000 #define	AAC_DB_INTR_BITS (AAC_DB_COMMAND_READY | \
56942c5e3cSpl196000 	AAC_DB_RESPONSE_READY | AAC_DB_PRINTF_READY)
57942c5e3cSpl196000 #define	AAC_DB_INTR_NEW			0x08
58942c5e3cSpl196000 
59942c5e3cSpl196000 /* Status bits in firmware status reg */
60942c5e3cSpl196000 #define	AAC_SELF_TEST_FAILED		0x00000004
61942c5e3cSpl196000 #define	AAC_MONITOR_PANIC		0x00000020
62942c5e3cSpl196000 #define	AAC_KERNEL_UP_AND_RUNNING	0x00000080
63942c5e3cSpl196000 #define	AAC_KERNEL_PANIC		0x00000100
64942c5e3cSpl196000 
65942c5e3cSpl196000 /* aac registers definitions */
66942c5e3cSpl196000 #define	AAC_OMR0		0x18	/* outbound message register 0 */
67942c5e3cSpl196000 #define	AAC_OMR1		0x1c	/* outbound message register 1 */
68942c5e3cSpl196000 #define	AAC_IDBR		0x20	/* inbound doorbell reg */
69942c5e3cSpl196000 #define	AAC_ODBR		0x2c	/* outbound doorbell reg */
70942c5e3cSpl196000 #define	AAC_OIMR		0x34	/* outbound interrupt mask reg */
71942c5e3cSpl196000 #define	AAC_IRCSR		0x38	/* inbound dual cores reset (SRL) */
72942c5e3cSpl196000 #define	AAC_IQUE		0x40	/* inbound queue */
73942c5e3cSpl196000 #define	AAC_OQUE		0x44	/* outbound queue */
74942c5e3cSpl196000 #define	AAC_RX_MAILBOX		0x50	/* mailbox, size=20bytes, rx */
75942c5e3cSpl196000 #define	AAC_RX_FWSTATUS		0x6c	/* firmware status, rx */
76942c5e3cSpl196000 #define	AAC_RKT_MAILBOX		0x1000	/* mailbox, size=20bytes, rkt */
77942c5e3cSpl196000 #define	AAC_RKT_FWSTATUS	0x101c	/* firmware status, rkt */
78942c5e3cSpl196000 
79942c5e3cSpl196000 /* Synchronous commands to the monitor/kernel. */
80942c5e3cSpl196000 #define	AAC_BREAKPOINT_REQ	0x04
81942c5e3cSpl196000 #define	AAC_MONKER_INITSTRUCT	0x05
82942c5e3cSpl196000 #define	AAC_MONKER_SYNCFIB	0x0c
83942c5e3cSpl196000 #define	AAC_MONKER_GETKERNVER	0x11
84942c5e3cSpl196000 #define	AAC_MONKER_GETINFO	0x19
85942c5e3cSpl196000 #define	AAC_MONKER_GETDRVPROP	0x23
86942c5e3cSpl196000 #define	AAC_MONKER_GETCOMMPREF	0x26
87942c5e3cSpl196000 #define	AAC_IOP_RESET		0x1000
88942c5e3cSpl196000 
89942c5e3cSpl196000 /* Sunrise Lake dual core reset */
90942c5e3cSpl196000 #define	AAC_IRCSR_CORES_RST	3
91942c5e3cSpl196000 
92942c5e3cSpl196000 #define	AAC_SECTOR_SIZE		512
93942c5e3cSpl196000 #define	AAC_NUMBER_OF_HEADS	255
94942c5e3cSpl196000 #define	AAC_SECTORS_PER_TRACK	63
95942c5e3cSpl196000 #define	AAC_ROTATION_SPEED	10000
96942c5e3cSpl196000 #define	AAC_MAX_PFN		0xfffff
97942c5e3cSpl196000 
98942c5e3cSpl196000 #define	AAC_ADDITIONAL_LEN	31
99942c5e3cSpl196000 #define	AAC_ANSI_VER		2
100942c5e3cSpl196000 #define	AAC_RESP_DATA_FORMAT	2
101942c5e3cSpl196000 
102942c5e3cSpl196000 #define	AAC_MAX_LD		64	/* max number of logical disks */
10358bc78c7SXin Chen #define	AAC_MAX_PD(s)		((s)->bus_max * (s)->tgt_max)
10458bc78c7SXin Chen #define	AAC_MAX_DEV(s)		(AAC_MAX_LD + AAC_MAX_PD((s)))
105942c5e3cSpl196000 #define	AAC_BLK_SIZE		AAC_SECTOR_SIZE
106942c5e3cSpl196000 #define	AAC_DMA_ALIGN		4
107942c5e3cSpl196000 #define	AAC_DMA_ALIGN_MASK	(AAC_DMA_ALIGN - 1)
108942c5e3cSpl196000 
109942c5e3cSpl196000 #define	AAC_MAX_CONTAINERS	AAC_MAX_LD
110942c5e3cSpl196000 
111942c5e3cSpl196000 /*
112942c5e3cSpl196000  * Minimum memory sizes we need to map to address the adapter. Before
113942c5e3cSpl196000  * we know the actual size to map, minimum memory is used instead.
114942c5e3cSpl196000  */
115942c5e3cSpl196000 #define	AAC_MAP_SIZE_MIN_RX	4096
116942c5e3cSpl196000 #define	AAC_MAP_SIZE_MIN_RKT	8192
117942c5e3cSpl196000 
118942c5e3cSpl196000 /*
119942c5e3cSpl196000  * Options supported by the adapter
120942c5e3cSpl196000  */
121942c5e3cSpl196000 #define	AAC_SUPPORTED_SNAPSHOT			0x01
122942c5e3cSpl196000 #define	AAC_SUPPORTED_CLUSTERS			0x02
123942c5e3cSpl196000 #define	AAC_SUPPORTED_WRITE_CACHE		0x04
124942c5e3cSpl196000 #define	AAC_SUPPORTED_64BIT_DATA		0x08
125942c5e3cSpl196000 #define	AAC_SUPPORTED_HOST_TIME_FIB		0x10
126942c5e3cSpl196000 #define	AAC_SUPPORTED_RAID50			0x20
127942c5e3cSpl196000 #define	AAC_SUPPORTED_4GB_WINDOW		0x40
128942c5e3cSpl196000 #define	AAC_SUPPORTED_SCSI_UPGRADEABLE		0x80
129942c5e3cSpl196000 #define	AAC_SUPPORTED_SOFT_ERR_REPORT		0x100
130942c5e3cSpl196000 #define	AAC_SUPPORTED_NOT_RECONDITION		0x200
131942c5e3cSpl196000 #define	AAC_SUPPORTED_SGMAP_HOST64		0x400
132942c5e3cSpl196000 #define	AAC_SUPPORTED_ALARM			0x800
133942c5e3cSpl196000 #define	AAC_SUPPORTED_NONDASD			0x1000
134942c5e3cSpl196000 #define	AAC_SUPPORTED_SCSI_MANAGED		0x2000
135942c5e3cSpl196000 #define	AAC_SUPPORTED_RAID_SCSI_MODE		0x4000
136942c5e3cSpl196000 #define	AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO	0x10000
137942c5e3cSpl196000 #define	AAC_SUPPORTED_NEW_COMM			0x20000
138942c5e3cSpl196000 #define	AAC_SUPPORTED_64BIT_ARRAYSIZE		0x40000
139942c5e3cSpl196000 #define	AAC_SUPPORTED_HEAT_SENSOR		0x80000
140942c5e3cSpl196000 
141b40e8a89Szhongyan gu - Sun Microsystems - Beijing China /*
142b40e8a89Szhongyan gu - Sun Microsystems - Beijing China  * More options from supplement info - SupportedOptions2
143b40e8a89Szhongyan gu - Sun Microsystems - Beijing China  */
144b40e8a89Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_SUPPORTED_MU_RESET			0x01
145b40e8a89Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_SUPPORTED_IGNORE_RESET		0x02
146b40e8a89Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_SUPPORTED_POWER_MANAGEMENT		0x04
147b40e8a89Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_SUPPORTED_ARCIO_PHYDEV		0x08
148*3fced439Szhongyan gu - Sun Microsystems - Beijing China /*
149*3fced439Szhongyan gu - Sun Microsystems - Beijing China  * FeatureBits of RequestSupplementAdapterInfo used in the driver
150*3fced439Szhongyan gu - Sun Microsystems - Beijing China  */
151*3fced439Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_FEATURE_SUPPORTED_JBOD		0x08000000
152b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 
153942c5e3cSpl196000 #pragma	pack(1)
154942c5e3cSpl196000 
155942c5e3cSpl196000 /*
156942c5e3cSpl196000  * FIB (FSA Interface Block) this is the data structure passed between
157942c5e3cSpl196000  * the host and adapter.
158942c5e3cSpl196000  */
159942c5e3cSpl196000 struct aac_fib_header {
160942c5e3cSpl196000 	uint32_t	XferState;
161942c5e3cSpl196000 	uint16_t	Command;
162942c5e3cSpl196000 	uint8_t		StructType;
163942c5e3cSpl196000 	uint8_t		Flags;
164942c5e3cSpl196000 	uint16_t	Size;
165942c5e3cSpl196000 	uint16_t	SenderSize;
166942c5e3cSpl196000 	uint32_t	SenderFibAddress;
167942c5e3cSpl196000 	uint32_t	ReceiverFibAddress;
168942c5e3cSpl196000 	uint32_t	SenderData;
169942c5e3cSpl196000 	int prev;
170942c5e3cSpl196000 	int next;
171942c5e3cSpl196000 };
172942c5e3cSpl196000 
173942c5e3cSpl196000 /* FIB completed without error or no data was transferred in the FIB */
174942c5e3cSpl196000 #define	AAC_SENDERADDR_MASK_FAST_RESPONSE	0x01
175942c5e3cSpl196000 /* The received FIB is an AIF */
176942c5e3cSpl196000 #define	AAC_SENDERADDR_MASK_AIF			0x02
177942c5e3cSpl196000 
178942c5e3cSpl196000 #define	AAC_FIB_SIZE		512 /* size of a fib block in byte */
179942c5e3cSpl196000 #define	AAC_FIB_DATASIZE	(AAC_FIB_SIZE - sizeof (struct aac_fib_header))
180942c5e3cSpl196000 
181942c5e3cSpl196000 struct aac_fib {
182942c5e3cSpl196000 	struct aac_fib_header	Header;
183942c5e3cSpl196000 	uint8_t data[AAC_FIB_DATASIZE];
184942c5e3cSpl196000 };
185942c5e3cSpl196000 
186942c5e3cSpl196000 /* FIB transfer state */
187942c5e3cSpl196000 #define	AAC_FIBSTATE_HOSTOWNED		(1<<0)	/* owned by the host */
188942c5e3cSpl196000 #define	AAC_FIBSTATE_ADAPTEROWNED	(1<<1)	/* owned by the adapter */
189942c5e3cSpl196000 #define	AAC_FIBSTATE_INITIALISED	(1<<2)	/* has been initialised */
190942c5e3cSpl196000 #define	AAC_FIBSTATE_EMPTY		(1<<3)	/* is empty now */
191942c5e3cSpl196000 #define	AAC_FIBSTATE_FROMHOST		(1<<5)	/* sent from the host */
192942c5e3cSpl196000 #define	AAC_FIBSTATE_FROMADAP		(1<<6)	/* sent from the adapter */
193942c5e3cSpl196000 #define	AAC_FIBSTATE_REXPECTED		(1<<7)	/* response is expected */
194942c5e3cSpl196000 #define	AAC_FIBSTATE_NOREXPECTED	(1<<8)	/* no response is expected */
195942c5e3cSpl196000 #define	AAC_FIBSTATE_DONEADAP		(1<<9)	/* processed by the adapter */
196942c5e3cSpl196000 #define	AAC_FIBSTATE_DONEHOST		(1<<10)	/* processed by the host */
197942c5e3cSpl196000 #define	AAC_FIBSTATE_NORM		(1<<12)	/* normal priority */
198942c5e3cSpl196000 #define	AAC_FIBSTATE_ASYNC		(1<<13)
199942c5e3cSpl196000 #define	AAC_FIBSTATE_FAST_RESPONSE	(1<<19)	/* fast response capable */
200942c5e3cSpl196000 
201942c5e3cSpl196000 /* FIB types */
202942c5e3cSpl196000 #define	AAC_FIBTYPE_TFIB		1
203942c5e3cSpl196000 
204942c5e3cSpl196000 /*
205942c5e3cSpl196000  * FIB commands
206942c5e3cSpl196000  */
207942c5e3cSpl196000 
208942c5e3cSpl196000 #define	TestCommandResponse		1
209942c5e3cSpl196000 #define	TestAdapterCommand		2
210942c5e3cSpl196000 /* Lowlevel and comm commands */
211942c5e3cSpl196000 #define	LastTestCommand			100
212942c5e3cSpl196000 #define	ReinitHostNormCommandQueue	101
213942c5e3cSpl196000 #define	ReinitHostHighCommandQueue	102
214942c5e3cSpl196000 #define	ReinitHostHighRespQueue		103
215942c5e3cSpl196000 #define	ReinitHostNormRespQueue		104
216942c5e3cSpl196000 #define	ReinitAdapNormCommandQueue	105
217942c5e3cSpl196000 #define	ReinitAdapHighCommandQueue	107
218942c5e3cSpl196000 #define	ReinitAdapHighRespQueue		108
219942c5e3cSpl196000 #define	ReinitAdapNormRespQueue		109
220942c5e3cSpl196000 #define	InterfaceShutdown		110
221942c5e3cSpl196000 #define	DmaCommandFib			120
222942c5e3cSpl196000 #define	StartProfile			121
223942c5e3cSpl196000 #define	TermProfile			122
224942c5e3cSpl196000 #define	SpeedTest			123
225942c5e3cSpl196000 #define	TakeABreakPt			124
226942c5e3cSpl196000 #define	RequestPerfData			125
227942c5e3cSpl196000 #define	SetInterruptDefTimer		126
228942c5e3cSpl196000 #define	SetInterruptDefCount		127
229942c5e3cSpl196000 #define	GetInterruptDefStatus		128
230942c5e3cSpl196000 #define	LastCommCommand			129
231942c5e3cSpl196000 /* Filesystem commands */
232942c5e3cSpl196000 #define	NuFileSystem			300
233942c5e3cSpl196000 #define	UFS				301
234942c5e3cSpl196000 #define	HostFileSystem			302
235942c5e3cSpl196000 #define	LastFileSystemCommand		303
236942c5e3cSpl196000 /* Container commands */
237942c5e3cSpl196000 #define	ContainerCommand		500
238942c5e3cSpl196000 #define	ContainerCommand64		501
239942c5e3cSpl196000 #define	RawIo				502
240942c5e3cSpl196000 /* Cluster commands */
241942c5e3cSpl196000 #define	ClusterCommand			550
242942c5e3cSpl196000 /* Scsi Port commands (scsi passthrough) */
243942c5e3cSpl196000 #define	ScsiPortCommand			600
244942c5e3cSpl196000 #define	ScsiPortCommandU64		601
245942c5e3cSpl196000 /* Misc house keeping and generic adapter initiated commands */
246942c5e3cSpl196000 #define	AifRequest			700
247942c5e3cSpl196000 #define	CheckRevision			701
248942c5e3cSpl196000 #define	FsaHostShutdown			702
249942c5e3cSpl196000 #define	RequestAdapterInfo		703
250942c5e3cSpl196000 #define	IsAdapterPaused			704
251942c5e3cSpl196000 #define	SendHostTime			705
252942c5e3cSpl196000 #define	RequestSupplementAdapterInfo	706
253942c5e3cSpl196000 #define	LastMiscCommand			707
254942c5e3cSpl196000 #define	OnLineDiagnostic		800
255942c5e3cSpl196000 #define	FduAdapterTest			801
256942c5e3cSpl196000 
257942c5e3cSpl196000 /*
258942c5e3cSpl196000  * Revision number handling
259942c5e3cSpl196000  */
260942c5e3cSpl196000 struct FsaRev {
261942c5e3cSpl196000 	union {
262942c5e3cSpl196000 		struct {
263942c5e3cSpl196000 			uint8_t	dash;
264942c5e3cSpl196000 			uint8_t	type;
265942c5e3cSpl196000 			uint8_t	minor;
266942c5e3cSpl196000 			uint8_t	major;
267942c5e3cSpl196000 		} comp;
268942c5e3cSpl196000 		uint32_t ul;
269942c5e3cSpl196000 	} external;
270942c5e3cSpl196000 	uint32_t buildNumber;
271942c5e3cSpl196000 };
272942c5e3cSpl196000 
273942c5e3cSpl196000 /*
274942c5e3cSpl196000  * Structures used to respond to a RequestAdapterInfo FIB
275942c5e3cSpl196000  */
276942c5e3cSpl196000 struct aac_adapter_info {
277942c5e3cSpl196000 	uint32_t	PlatformBase;	/* adapter type */
278942c5e3cSpl196000 	uint32_t	CpuArchitecture; /* adapter CPU type */
279942c5e3cSpl196000 	uint32_t	CpuVariant;	/* adapter CPU subtype */
280942c5e3cSpl196000 	uint32_t	ClockSpeed;	/* adapter CPU clockspeed */
281942c5e3cSpl196000 	uint32_t	ExecutionMem;	/* adapter Execution Memory size */
282942c5e3cSpl196000 	uint32_t	BufferMem;	/* adapter Data Memory */
283942c5e3cSpl196000 	uint32_t	TotalMem;	/* adapter Total Memory */
284942c5e3cSpl196000 	struct FsaRev	KernelRevision;	/* adapter Kernel Software Revision */
285942c5e3cSpl196000 	struct FsaRev	MonitorRevision; /* adapter Monitor Software Revision */
286942c5e3cSpl196000 	struct FsaRev	HardwareRevision;
287942c5e3cSpl196000 	struct FsaRev	BIOSRevision;	/* adapter BIOS Revision */
288942c5e3cSpl196000 	uint32_t	ClusteringEnabled;
289942c5e3cSpl196000 	uint32_t	ClusterChannelMask;
290942c5e3cSpl196000 	uint64_t	SerialNumber;
291942c5e3cSpl196000 	uint32_t	batteryPlatform;
292942c5e3cSpl196000 	uint32_t	SupportedOptions; /* supported features */
293942c5e3cSpl196000 	uint32_t	OemVariant;
294942c5e3cSpl196000 };
295942c5e3cSpl196000 
296942c5e3cSpl196000 /*
297942c5e3cSpl196000  * The following definitions on Supplement Adapter Information
298942c5e3cSpl196000  * come from Adaptec:
299942c5e3cSpl196000  */
300942c5e3cSpl196000 struct vpd_info {
301942c5e3cSpl196000 	uint8_t		AssemblyPn[8];
302942c5e3cSpl196000 	uint8_t		FruPn[8];
303942c5e3cSpl196000 	uint8_t		BatteryFruPn[8];
304942c5e3cSpl196000 	uint8_t		EcVersionString[8];
305942c5e3cSpl196000 	uint8_t		Tsid[12];
306942c5e3cSpl196000 };
307942c5e3cSpl196000 
308942c5e3cSpl196000 #define	MFG_PCBA_SERIAL_NUMBER_WIDTH	12
309942c5e3cSpl196000 #define	MFG_WWN_WIDTH			8
310942c5e3cSpl196000 
311942c5e3cSpl196000 struct aac_supplement_adapter_info {
312942c5e3cSpl196000 	/* The assigned Adapter Type Text, extra byte for null termination */
313942c5e3cSpl196000 	int8_t		AdapterTypeText[17+1];
314942c5e3cSpl196000 	/* Pad for the text above */
315942c5e3cSpl196000 	int8_t		Pad[2];
316942c5e3cSpl196000 	/* Size in bytes of the memory that is flashed */
317942c5e3cSpl196000 	uint32_t	FlashMemoryByteSize;
318942c5e3cSpl196000 	/* The assigned IMAGEID_xxx for this adapter */
319942c5e3cSpl196000 	uint32_t	FlashImageId;
320942c5e3cSpl196000 	/*
321942c5e3cSpl196000 	 * The maximum number of Phys available on a SATA/SAS
322942c5e3cSpl196000 	 * Controller, 0 otherwise
323942c5e3cSpl196000 	 */
324942c5e3cSpl196000 	uint32_t	MaxNumberPorts;
325942c5e3cSpl196000 	/* Version of expansion area */
326942c5e3cSpl196000 	uint32_t	Version;
327942c5e3cSpl196000 	uint32_t	FeatureBits;
328942c5e3cSpl196000 	uint8_t		SlotNumber;
329942c5e3cSpl196000 	uint8_t		ReservedPad0[3];
330942c5e3cSpl196000 	uint8_t		BuildDate[12];
331942c5e3cSpl196000 	/* The current number of Ports on a SAS controller, 0 otherwise */
332942c5e3cSpl196000 	uint32_t	CurrentNumberPorts;
333942c5e3cSpl196000 
334942c5e3cSpl196000 	struct vpd_info VpdInfo;
335942c5e3cSpl196000 
336942c5e3cSpl196000 	/* Firmware Revision (Vmaj.min-dash.) */
337942c5e3cSpl196000 	struct FsaRev	FlashFirmwareRevision;
338942c5e3cSpl196000 	uint32_t	RaidTypeMorphOptions;
339942c5e3cSpl196000 	/* Firmware's boot code Revision (Vmaj.min-dash.) */
340942c5e3cSpl196000 	struct FsaRev	FlashFirmwareBootRevision;
341942c5e3cSpl196000 	/* PCBA serial no. from th MFG sector */
342942c5e3cSpl196000 	uint8_t		MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH];
343942c5e3cSpl196000 	/* WWN from the MFG sector */
344942c5e3cSpl196000 	uint8_t		MfgWWNName[MFG_WWN_WIDTH];
345b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	uint32_t	SupportedOptions2;	/* more supported features */
346b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	uint32_t	ExpansionFlag;	/* 1 - following fields are valid */
347b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	uint32_t	FeatureBits3;
348b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	uint32_t	SupportedPerformanceMode;
349b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	/* Growth Area for future expansion */
350b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	uint32_t	ReservedGrowth[80];
351942c5e3cSpl196000 };
352942c5e3cSpl196000 
353942c5e3cSpl196000 /* Container creation data */
354942c5e3cSpl196000 struct aac_container_creation {
355942c5e3cSpl196000 	uint8_t		ViaBuildNumber;
356942c5e3cSpl196000 	uint8_t		MicroSecond;
357942c5e3cSpl196000 	uint8_t		Via;		/* 1 = FSU, 2 = API, etc */
358942c5e3cSpl196000 	uint8_t		Years;		/* Since1900 */
359942c5e3cSpl196000 	uint32_t	Month:4;	/* 1-12 */
360942c5e3cSpl196000 	uint32_t	Day:6;		/* 1-32 */
361942c5e3cSpl196000 	uint32_t	Hour:6;		/* 0-23 */
362942c5e3cSpl196000 	uint32_t	Minute:6;	/* 0-59 */
363942c5e3cSpl196000 	uint32_t	Second:6;	/* 0-59 */
364942c5e3cSpl196000 	uint64_t	ViaAdapterSerialNumber;
365942c5e3cSpl196000 };
366942c5e3cSpl196000 
367942c5e3cSpl196000 struct aac_mntobj {
368942c5e3cSpl196000 	uint32_t		ObjectId;
369942c5e3cSpl196000 	char			FileSystemName[16];
370942c5e3cSpl196000 	struct aac_container_creation	CreateInfo;
371942c5e3cSpl196000 	uint32_t		Capacity;
372942c5e3cSpl196000 	uint32_t		VolType;
373942c5e3cSpl196000 	uint32_t		ObjType;
374942c5e3cSpl196000 	uint32_t		ContentState;
375942c5e3cSpl196000 	union {
376942c5e3cSpl196000 		uint32_t	pad[8];
377942c5e3cSpl196000 	} ObjExtension;
378942c5e3cSpl196000 	uint32_t		AlterEgoId;
379942c5e3cSpl196000 
380942c5e3cSpl196000 	uint32_t		CapacityHigh; /* 64-bit LBA */
381942c5e3cSpl196000 };
382942c5e3cSpl196000 
383942c5e3cSpl196000 struct aac_mntinfo {
384942c5e3cSpl196000 	uint32_t	Command;
385942c5e3cSpl196000 	uint32_t	MntType;
386942c5e3cSpl196000 	uint32_t	MntCount;
387942c5e3cSpl196000 };
388942c5e3cSpl196000 
389942c5e3cSpl196000 struct aac_mntinforesp {
390942c5e3cSpl196000 	uint32_t		Status;
391942c5e3cSpl196000 	uint32_t		MntType;
392942c5e3cSpl196000 	uint32_t		MntRespCount;
393942c5e3cSpl196000 	struct aac_mntobj	MntObj;
394942c5e3cSpl196000 };
395942c5e3cSpl196000 
39658bc78c7SXin Chen /*
39758bc78c7SXin Chen  * Structures used to access physical drives
39858bc78c7SXin Chen  */
39958bc78c7SXin Chen struct aac_bus_info {
40058bc78c7SXin Chen 	uint32_t	Command;	/* VM_Ioctl */
40158bc78c7SXin Chen 	uint32_t	ObjType;	/* FT_DRIVE */
40258bc78c7SXin Chen 	uint32_t	MethodId;	/* 1 = SCSI Layer */
40358bc78c7SXin Chen 	uint32_t	ObjectId;	/* Handle */
40458bc78c7SXin Chen 	uint32_t	CtlCmd;		/* GetBusInfo */
40558bc78c7SXin Chen };
40658bc78c7SXin Chen 
40758bc78c7SXin Chen struct aac_bus_info_response {
40858bc78c7SXin Chen 	uint32_t	Status;		/* ST_OK */
40958bc78c7SXin Chen 	uint32_t	ObjType;
41058bc78c7SXin Chen 	uint32_t	MethodId;	/* unused */
41158bc78c7SXin Chen 	uint32_t	ObjectId;	/* unused */
41258bc78c7SXin Chen 	uint32_t	CtlCmd;		/* unused */
41358bc78c7SXin Chen 	uint32_t	ProbeComplete;
41458bc78c7SXin Chen 	uint32_t	BusCount;
41558bc78c7SXin Chen 	uint32_t	TargetsPerBus;
41658bc78c7SXin Chen 	uint8_t		InitiatorBusId[10];
41758bc78c7SXin Chen 	uint8_t		BusValid[10];
41858bc78c7SXin Chen };
41958bc78c7SXin Chen 
420942c5e3cSpl196000 #define	CT_FIB_PARAMS			6
421942c5e3cSpl196000 #define	MAX_FIB_PARAMS			10
422942c5e3cSpl196000 #define	CT_PACKET_SIZE \
423942c5e3cSpl196000 	(AAC_FIB_DATASIZE - sizeof (uint32_t) - \
424942c5e3cSpl196000 	((sizeof (uint32_t)) * (MAX_FIB_PARAMS + 1)))
425942c5e3cSpl196000 
426942c5e3cSpl196000 #define	CNT_SIZE			5
427942c5e3cSpl196000 
428942c5e3cSpl196000 /* Container types */
429942c5e3cSpl196000 typedef enum {
430942c5e3cSpl196000 	CT_NONE = 0,
431942c5e3cSpl196000 	CT_VOLUME,
432942c5e3cSpl196000 	CT_MIRROR,
433942c5e3cSpl196000 	CT_STRIPE,
434942c5e3cSpl196000 	CT_RAID5,
435942c5e3cSpl196000 	CT_SSRW,
436942c5e3cSpl196000 	CT_SSRO,
437942c5e3cSpl196000 	CT_MORPH,
438942c5e3cSpl196000 	CT_PASSTHRU,
439942c5e3cSpl196000 	CT_RAID4,
440942c5e3cSpl196000 	CT_RAID10,		/* stripe of mirror */
441942c5e3cSpl196000 	CT_RAID00,		/* stripe of stripe */
442942c5e3cSpl196000 	CT_VOLUME_OF_MIRRORS,	/* volume of mirror */
443942c5e3cSpl196000 	CT_PSEUDO_RAID3,	/* really raid4 */
444942c5e3cSpl196000 	CT_RAID50,		/* stripe of raid5 */
445942c5e3cSpl196000 	CT_RAID5D,		/* raid5 distributed hot-sparing */
446942c5e3cSpl196000 	CT_RAID5D0,
447942c5e3cSpl196000 	CT_RAID1E,		/* extended raid1 mirroring */
448942c5e3cSpl196000 	CT_RAID6,
449942c5e3cSpl196000 	CT_RAID60
450942c5e3cSpl196000 } AAC_FSAVolType;
451942c5e3cSpl196000 
452942c5e3cSpl196000 /*
453942c5e3cSpl196000  * Container Configuration Sub-Commands
454942c5e3cSpl196000  */
455942c5e3cSpl196000 typedef enum {
456942c5e3cSpl196000 	CT_Null = 0,
457942c5e3cSpl196000 	CT_GET_SLICE_COUNT,		/* 1 */
458942c5e3cSpl196000 	CT_GET_PARTITION_COUNT,		/* 2 */
459942c5e3cSpl196000 	CT_GET_PARTITION_INFO,		/* 3 */
460942c5e3cSpl196000 	CT_GET_CONTAINER_COUNT,		/* 4 */
461942c5e3cSpl196000 	CT_GET_CONTAINER_INFO_OLD,	/* 5 */
462942c5e3cSpl196000 	CT_WRITE_MBR,			/* 6 */
463942c5e3cSpl196000 	CT_WRITE_PARTITION,		/* 7 */
464942c5e3cSpl196000 	CT_UPDATE_PARTITION,		/* 8 */
465942c5e3cSpl196000 	CT_UNLOAD_CONTAINER,		/* 9 */
466942c5e3cSpl196000 	CT_CONFIG_SINGLE_PRIMARY,	/* 10 */
467942c5e3cSpl196000 	CT_READ_CONFIG_AGE,		/* 11 */
468942c5e3cSpl196000 	CT_WRITE_CONFIG_AGE,		/* 12 */
469942c5e3cSpl196000 	CT_READ_SERIAL_NUMBER,		/* 13 */
470942c5e3cSpl196000 	CT_ZERO_PAR_ENTRY,		/* 14 */
471942c5e3cSpl196000 	CT_READ_MBR,			/* 15 */
472942c5e3cSpl196000 	CT_READ_PARTITION,		/* 16 */
473942c5e3cSpl196000 	CT_DESTROY_CONTAINER,		/* 17 */
474942c5e3cSpl196000 	CT_DESTROY2_CONTAINER,		/* 18 */
475942c5e3cSpl196000 	CT_SLICE_SIZE,			/* 19 */
476942c5e3cSpl196000 	CT_CHECK_CONFLICTS,		/* 20 */
477942c5e3cSpl196000 	CT_MOVE_CONTAINER,		/* 21 */
478942c5e3cSpl196000 	CT_READ_LAST_DRIVE,		/* 22 */
479942c5e3cSpl196000 	CT_WRITE_LAST_DRIVE,		/* 23 */
480942c5e3cSpl196000 	CT_UNMIRROR,			/* 24 */
481942c5e3cSpl196000 	CT_MIRROR_DELAY,		/* 25 */
482942c5e3cSpl196000 	CT_GEN_MIRROR,			/* 26 */
483942c5e3cSpl196000 	CT_GEN_MIRROR2,			/* 27 */
484942c5e3cSpl196000 	CT_TEST_CONTAINER,		/* 28 */
485942c5e3cSpl196000 	CT_MOVE2,			/* 29 */
486942c5e3cSpl196000 	CT_SPLIT,			/* 30 */
487942c5e3cSpl196000 	CT_SPLIT2,			/* 31 */
488942c5e3cSpl196000 	CT_SPLIT_BROKEN,		/* 32 */
489942c5e3cSpl196000 	CT_SPLIT_BROKEN2,		/* 33 */
490942c5e3cSpl196000 	CT_RECONFIG,			/* 34 */
491942c5e3cSpl196000 	CT_BREAK2,			/* 35 */
492942c5e3cSpl196000 	CT_BREAK,			/* 36 */
493942c5e3cSpl196000 	CT_MERGE2,			/* 37 */
494942c5e3cSpl196000 	CT_MERGE,			/* 38 */
495942c5e3cSpl196000 	CT_FORCE_ERROR,			/* 39 */
496942c5e3cSpl196000 	CT_CLEAR_ERROR,			/* 40 */
497942c5e3cSpl196000 	CT_ASSIGN_FAILOVER,		/* 41 */
498942c5e3cSpl196000 	CT_CLEAR_FAILOVER,		/* 42 */
499942c5e3cSpl196000 	CT_GET_FAILOVER_DATA,		/* 43 */
500942c5e3cSpl196000 	CT_VOLUME_ADD,			/* 44 */
501942c5e3cSpl196000 	CT_VOLUME_ADD2,			/* 45 */
502942c5e3cSpl196000 	CT_MIRROR_STATUS,		/* 46 */
503942c5e3cSpl196000 	CT_COPY_STATUS,			/* 47 */
504942c5e3cSpl196000 	CT_COPY,			/* 48 */
505942c5e3cSpl196000 	CT_UNLOCK_CONTAINER,		/* 49 */
506942c5e3cSpl196000 	CT_LOCK_CONTAINER,		/* 50 */
507942c5e3cSpl196000 	CT_MAKE_READ_ONLY,		/* 51 */
508942c5e3cSpl196000 	CT_MAKE_READ_WRITE,		/* 52 */
509942c5e3cSpl196000 	CT_CLEAN_DEAD,			/* 53 */
510942c5e3cSpl196000 	CT_ABORT_MIRROR_COMMAND,	/* 54 */
511942c5e3cSpl196000 	CT_SET,				/* 55 */
512942c5e3cSpl196000 	CT_GET,				/* 56 */
513942c5e3cSpl196000 	CT_GET_NVLOG_ENTRY,		/* 57 */
514942c5e3cSpl196000 	CT_GET_DELAY,			/* 58 */
515942c5e3cSpl196000 	CT_ZERO_CONTAINER_SPACE,	/* 59 */
516942c5e3cSpl196000 	CT_GET_ZERO_STATUS,		/* 60 */
517942c5e3cSpl196000 	CT_SCRUB,			/* 61 */
518942c5e3cSpl196000 	CT_GET_SCRUB_STATUS,		/* 62 */
519942c5e3cSpl196000 	CT_GET_SLICE_INFO,		/* 63 */
520942c5e3cSpl196000 	CT_GET_SCSI_METHOD,		/* 64 */
521942c5e3cSpl196000 	CT_PAUSE_IO,			/* 65 */
522942c5e3cSpl196000 	CT_RELEASE_IO,			/* 66 */
523942c5e3cSpl196000 	CT_SCRUB2,			/* 67 */
524942c5e3cSpl196000 	CT_MCHECK,			/* 68 */
525942c5e3cSpl196000 	CT_CORRUPT,			/* 69 */
526942c5e3cSpl196000 	CT_GET_TASK_COUNT,		/* 70 */
527942c5e3cSpl196000 	CT_PROMOTE,			/* 71 */
528942c5e3cSpl196000 	CT_SET_DEAD,			/* 72 */
529942c5e3cSpl196000 	CT_CONTAINER_OPTIONS,		/* 73 */
530942c5e3cSpl196000 	CT_GET_NV_PARAM,		/* 74 */
531942c5e3cSpl196000 	CT_GET_PARAM,			/* 75 */
532942c5e3cSpl196000 	CT_NV_PARAM_SIZE,		/* 76 */
533942c5e3cSpl196000 	CT_COMMON_PARAM_SIZE,		/* 77 */
534942c5e3cSpl196000 	CT_PLATFORM_PARAM_SIZE,		/* 78 */
535942c5e3cSpl196000 	CT_SET_NV_PARAM,		/* 79 */
536942c5e3cSpl196000 	CT_ABORT_SCRUB,			/* 80 */
537942c5e3cSpl196000 	CT_GET_SCRUB_ERROR,		/* 81 */
538942c5e3cSpl196000 	CT_LABEL_CONTAINER,		/* 82 */
539942c5e3cSpl196000 	CT_CONTINUE_DATA,		/* 83 */
540942c5e3cSpl196000 	CT_STOP_DATA,			/* 84 */
541942c5e3cSpl196000 	CT_GET_PARTITION_TABLE,		/* 85 */
542942c5e3cSpl196000 	CT_GET_DISK_PARTITIONS,		/* 86 */
543942c5e3cSpl196000 	CT_GET_MISC_STATUS,		/* 87 */
544942c5e3cSpl196000 	CT_GET_CONTAINER_PERF_INFO,	/* 88 */
545942c5e3cSpl196000 	CT_GET_TIME,			/* 89 */
546942c5e3cSpl196000 	CT_READ_DATA,			/* 90 */
547942c5e3cSpl196000 	CT_CTR,				/* 91 */
548942c5e3cSpl196000 	CT_CTL,				/* 92 */
549942c5e3cSpl196000 	CT_DRAINIO,			/* 93 */
550942c5e3cSpl196000 	CT_RELEASEIO,			/* 94 */
551942c5e3cSpl196000 	CT_GET_NVRAM,			/* 95 */
552942c5e3cSpl196000 	CT_GET_MEMORY,			/* 96 */
553942c5e3cSpl196000 	CT_PRINT_CT_LOG,		/* 97 */
554942c5e3cSpl196000 	CT_ADD_LEVEL,			/* 98 */
555942c5e3cSpl196000 	CT_NV_ZERO,			/* 99 */
556942c5e3cSpl196000 	CT_READ_SIGNATURE,		/* 100 */
557942c5e3cSpl196000 	CT_THROTTLE_ON,			/* 101 */
558942c5e3cSpl196000 	CT_THROTTLE_OFF,		/* 102 */
559942c5e3cSpl196000 	CT_GET_THROTTLE_STATS,		/* 103 */
560942c5e3cSpl196000 	CT_MAKE_SNAPSHOT,		/* 104 */
561942c5e3cSpl196000 	CT_REMOVE_SNAPSHOT,		/* 105 */
562942c5e3cSpl196000 	CT_WRITE_USER_FLAGS,		/* 106 */
563942c5e3cSpl196000 	CT_READ_USER_FLAGS,		/* 107 */
564942c5e3cSpl196000 	CT_MONITOR,			/* 108 */
565942c5e3cSpl196000 	CT_GEN_MORPH,			/* 109 */
566942c5e3cSpl196000 	CT_GET_SNAPSHOT_INFO,		/* 110 */
567942c5e3cSpl196000 	CT_CACHE_SET,			/* 111 */
568942c5e3cSpl196000 	CT_CACHE_STAT,			/* 112 */
569942c5e3cSpl196000 	CT_TRACE_START,			/* 113 */
570942c5e3cSpl196000 	CT_TRACE_STOP,			/* 114 */
571942c5e3cSpl196000 	CT_TRACE_ENABLE,		/* 115 */
572942c5e3cSpl196000 	CT_TRACE_DISABLE,		/* 116 */
573942c5e3cSpl196000 	CT_FORCE_CORE_DUMP,		/* 117 */
574942c5e3cSpl196000 	CT_SET_SERIAL_NUMBER,		/* 118 */
575942c5e3cSpl196000 	CT_RESET_SERIAL_NUMBER,		/* 119 */
576942c5e3cSpl196000 	CT_ENABLE_RAID5,		/* 120 */
577942c5e3cSpl196000 	CT_CLEAR_VALID_DUMP_FLAG,	/* 121 */
578942c5e3cSpl196000 	CT_GET_MEM_STATS,		/* 122 */
579942c5e3cSpl196000 	CT_GET_CORE_SIZE,		/* 123 */
580942c5e3cSpl196000 	CT_CREATE_CONTAINER_OLD,	/* 124 */
581942c5e3cSpl196000 	CT_STOP_DUMPS,			/* 125 */
582942c5e3cSpl196000 	CT_PANIC_ON_TAKE_A_BREAK,	/* 126 */
583942c5e3cSpl196000 	CT_GET_CACHE_STATS,		/* 127 */
584942c5e3cSpl196000 	CT_MOVE_PARTITION,		/* 128 */
585942c5e3cSpl196000 	CT_FLUSH_CACHE,			/* 129 */
586942c5e3cSpl196000 	CT_READ_NAME,			/* 130 */
587942c5e3cSpl196000 	CT_WRITE_NAME,			/* 131 */
588942c5e3cSpl196000 	CT_TOSS_CACHE,			/* 132 */
589942c5e3cSpl196000 	CT_LOCK_DRAINIO,		/* 133 */
590942c5e3cSpl196000 	CT_CONTAINER_OFFLINE,		/* 134 */
591942c5e3cSpl196000 	CT_SET_CACHE_SIZE,		/* 135 */
592942c5e3cSpl196000 	CT_CLEAN_SHUTDOWN_STATUS,	/* 136 */
593942c5e3cSpl196000 	CT_CLEAR_DISKLOG_ON_DISK,	/* 137 */
594942c5e3cSpl196000 	CT_CLEAR_ALL_DISKLOG,		/* 138 */
595942c5e3cSpl196000 	CT_CACHE_FAVOR,			/* 139 */
596942c5e3cSpl196000 	CT_READ_PASSTHRU_MBR,		/* 140 */
597942c5e3cSpl196000 	CT_SCRUB_NOFIX,			/* 141 */
598942c5e3cSpl196000 	CT_SCRUB2_NOFIX,		/* 142 */
599942c5e3cSpl196000 	CT_FLUSH,			/* 143 */
600942c5e3cSpl196000 	CT_REBUILD,	/* 144 rma, not really a command, partner to CT_SCRUB */
601942c5e3cSpl196000 	CT_FLUSH_CONTAINER,		/* 145 */
602942c5e3cSpl196000 	CT_RESTART,			/* 146 */
603942c5e3cSpl196000 	CT_GET_CONFIG_STATUS,		/* 147 */
604942c5e3cSpl196000 	CT_TRACE_FLAG,			/* 148 */
605942c5e3cSpl196000 	CT_RESTART_MORPH,		/* 149 */
606942c5e3cSpl196000 	CT_GET_TRACE_INFO,		/* 150 */
607942c5e3cSpl196000 	CT_GET_TRACE_ITEM,		/* 151 */
608942c5e3cSpl196000 	CT_COMMIT_CONFIG,		/* 152 */
609942c5e3cSpl196000 	CT_CONTAINER_EXISTS,		/* 153 */
610942c5e3cSpl196000 	CT_GET_SLICE_FROM_DEVT,		/* 154 */
611942c5e3cSpl196000 	CT_OPEN_READ_WRITE,		/* 155 */
612942c5e3cSpl196000 	CT_WRITE_MEMORY_BLOCK,		/* 156 */
613942c5e3cSpl196000 	CT_GET_CACHE_PARAMS,		/* 157 */
614942c5e3cSpl196000 	CT_CRAZY_CACHE,			/* 158 */
615942c5e3cSpl196000 	CT_GET_PROFILE_STRUCT,		/* 159 */
616942c5e3cSpl196000 	CT_SET_IO_TRACE_FLAG,		/* 160 */
617942c5e3cSpl196000 	CT_GET_IO_TRACE_STRUCT,		/* 161 */
618942c5e3cSpl196000 	CT_CID_TO_64BITS_UID,		/* 162 */
619942c5e3cSpl196000 	CT_64BITS_UID_TO_CID,		/* 163 */
620942c5e3cSpl196000 	CT_PAR_TO_64BITS_UID,		/* 164 */
621942c5e3cSpl196000 	CT_CID_TO_32BITS_UID,		/* 165 */
622942c5e3cSpl196000 	CT_32BITS_UID_TO_CID,		/* 166 */
623942c5e3cSpl196000 	CT_PAR_TO_32BITS_UID,		/* 167 */
624942c5e3cSpl196000 	CT_SET_FAILOVER_OPTION,		/* 168 */
625942c5e3cSpl196000 	CT_GET_FAILOVER_OPTION,		/* 169 */
626942c5e3cSpl196000 	CT_STRIPE_ADD2,			/* 170 */
627942c5e3cSpl196000 	CT_CREATE_VOLUME_SET,		/* 171 */
628942c5e3cSpl196000 	CT_CREATE_STRIPE_SET,		/* 172 */
629942c5e3cSpl196000 	/* 173	command and partner to scrub and rebuild task types */
630942c5e3cSpl196000 	CT_VERIFY_CONTAINER,
631942c5e3cSpl196000 	CT_IS_CONTAINER_DEAD,		/* 174 */
632942c5e3cSpl196000 	CT_GET_CONTAINER_OPTION,	/* 175 */
633942c5e3cSpl196000 	CT_GET_SNAPSHOT_UNUSED_STRUCT,	/* 176 */
634942c5e3cSpl196000 	CT_CLEAR_SNAPSHOT_UNUSED_STRUCT,	/* 177 */
635942c5e3cSpl196000 	CT_GET_CONTAINER_INFO,		/* 178 */
636942c5e3cSpl196000 	CT_CREATE_CONTAINER,		/* 179 */
637942c5e3cSpl196000 	CT_CHANGE_CREATIONINFO,		/* 180 */
638942c5e3cSpl196000 	CT_CHECK_CONFLICT_UID,		/* 181 */
639942c5e3cSpl196000 	CT_CONTAINER_UID_CHECK,		/* 182 */
640942c5e3cSpl196000 
641942c5e3cSpl196000 	/* 183 :RECmm: 20011220 added to support the Babylon */
642942c5e3cSpl196000 	CT_IS_CONTAINER_MEATADATA_STANDARD,
643942c5e3cSpl196000 	/* 184 :RECmm: 20011220 array imports */
644942c5e3cSpl196000 	CT_IS_SLICE_METADATA_STANDARD,
645942c5e3cSpl196000 
646942c5e3cSpl196000 	/* :BIOS_TEST: */
647942c5e3cSpl196000 	/* 185 :RECmm: 20020116	added to support BIOS interface for */
648942c5e3cSpl196000 	CT_GET_IMPORT_COUNT,
649942c5e3cSpl196000 	/* 186 :RECmm: 20020116	metadata conversion */
650942c5e3cSpl196000 	CT_CANCEL_ALL_IMPORTS,
651942c5e3cSpl196000 	CT_GET_IMPORT_INFO,		/* 187 :RECmm: 20020116	" */
652942c5e3cSpl196000 	CT_IMPORT_ARRAY,		/* 188 :RECmm: 20020116	" */
653942c5e3cSpl196000 	CT_GET_LOG_SIZE,		/* 189  */
654942c5e3cSpl196000 
655942c5e3cSpl196000 	/* Not BIOS TEST */
656942c5e3cSpl196000 	CT_ALARM_GET_STATE,		/* 190 */
657942c5e3cSpl196000 	CT_ALARM_SET_STATE,		/* 191 */
658942c5e3cSpl196000 	CT_ALARM_ON_OFF,		/* 192 */
659942c5e3cSpl196000 
660942c5e3cSpl196000 	CT_GET_EE_OEM_ID,		/* 193 */
661942c5e3cSpl196000 
662942c5e3cSpl196000 	CT_GET_PPI_HEADERS,		/* 194  get header fields only */
663942c5e3cSpl196000 	CT_GET_PPI_DATA,		/* 195  get all ppitable.data */
664942c5e3cSpl196000 	/* 196  get only range of entries specified in c_params */
665942c5e3cSpl196000 	CT_GET_PPI_ENTRIES,
666942c5e3cSpl196000 	/* 197  remove ppitable bundle specified by uid in c_param0 */
667942c5e3cSpl196000 	CT_DELETE_PPI_BUNDLE,
668942c5e3cSpl196000 
669942c5e3cSpl196000 	/* 198  current partition structure (not legacy) */
670942c5e3cSpl196000 	CT_GET_PARTITION_TABLE_2,
671942c5e3cSpl196000 	CT_GET_PARTITION_INFO_2,
672942c5e3cSpl196000 	CT_GET_DISK_PARTITIONS_2,
673942c5e3cSpl196000 
674942c5e3cSpl196000 	CT_QUIESCE_ADAPTER,		/* 201  chill dude */
675942c5e3cSpl196000 	CT_CLEAR_PPI_TABLE,		/* 202  clear ppi table */
676942c5e3cSpl196000 
677942c5e3cSpl196000 	CT_SET_DEVICE_CACHE_POLICY,	/* 203 */
678942c5e3cSpl196000 	CT_GET_DEVICE_CACHE_POLICY,	/* 204 */
679942c5e3cSpl196000 
680942c5e3cSpl196000 	CT_SET_VERIFY_DELAY,		/* 205 */
681942c5e3cSpl196000 	CT_GET_VERIFY_DELAY,		/* 206 */
682942c5e3cSpl196000 
683942c5e3cSpl196000 	/* 207 delete all PPI bundles that have an entry for device at devt */
684942c5e3cSpl196000 	CT_DELETE_PPI_BUNDLES_FOR_DEVT,
685942c5e3cSpl196000 
686942c5e3cSpl196000 	CT_READ_SW_SECTOR,		/* 208 */
687942c5e3cSpl196000 	CT_WRITE_SW_SECTOR,		/* 209 */
688942c5e3cSpl196000 
689942c5e3cSpl196000 	/* 210 added to support firmware cache sync operations */
690942c5e3cSpl196000 	CT_GET_CACHE_SYNC_INFO,
691942c5e3cSpl196000 	CT_SET_CACHE_SYNC_MODE,		/* 211 */
692b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	CT_PM_DRIVER_SUPPORT,		/* 212 */
693b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	CT_PM_CONFIGURATION,		/* 213 */
694942c5e3cSpl196000 
695942c5e3cSpl196000 	CT_LAST_COMMAND			/* last command */
696942c5e3cSpl196000 } AAC_CTCommand;
697942c5e3cSpl196000 
698942c5e3cSpl196000 /* General return status */
699942c5e3cSpl196000 #define	CT_OK				218
700942c5e3cSpl196000 
701b40e8a89Szhongyan gu - Sun Microsystems - Beijing China /* CT_PM_DRIVER_SUPPORT parameter */
702b40e8a89Szhongyan gu - Sun Microsystems - Beijing China typedef enum {
703b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	AAC_PM_DRIVERSUP_GET_STATUS = 1,
704b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	AAC_PM_DRIVERSUP_START_UNIT,
705b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 	AAC_PM_DRIVERSUP_STOP_UNIT
706b40e8a89Szhongyan gu - Sun Microsystems - Beijing China } AAC_CT_PM_DRIVER_SUPPORT_SUB_COM;
707b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 
708942c5e3cSpl196000 struct aac_fsa_ctm {
709942c5e3cSpl196000 	uint32_t	command;
710942c5e3cSpl196000 	uint32_t	param[CT_FIB_PARAMS];
711942c5e3cSpl196000 	int8_t		data[CT_PACKET_SIZE];
712942c5e3cSpl196000 };
713942c5e3cSpl196000 
714942c5e3cSpl196000 struct aac_Container {
715942c5e3cSpl196000 	uint32_t		Command;
716942c5e3cSpl196000 	struct aac_fsa_ctm	CTCommand;
717942c5e3cSpl196000 };
718942c5e3cSpl196000 
719942c5e3cSpl196000 struct aac_fsa_ctr {
720942c5e3cSpl196000 	uint32_t	response;
721942c5e3cSpl196000 	uint32_t	param[CT_FIB_PARAMS];
722942c5e3cSpl196000 	int8_t		data[CT_PACKET_SIZE];
723942c5e3cSpl196000 };
724942c5e3cSpl196000 
725942c5e3cSpl196000 struct aac_Container_resp {
726942c5e3cSpl196000 	uint32_t		Status;
727942c5e3cSpl196000 	struct aac_fsa_ctr	CTResponse;
728942c5e3cSpl196000 };
729942c5e3cSpl196000 
730942c5e3cSpl196000 struct aac_cf_status_header {
731942c5e3cSpl196000 	uint32_t	action;
732942c5e3cSpl196000 	uint16_t	flags;
733942c5e3cSpl196000 	int16_t		recordcount;
734942c5e3cSpl196000 };
735942c5e3cSpl196000 
736942c5e3cSpl196000 enum aac_cf_action_type {
737942c5e3cSpl196000 	CFACT_CONTINUE = 0,		/* Continue without pause */
738942c5e3cSpl196000 	CFACT_PAUSE,			/* Pause, then continue */
739942c5e3cSpl196000 	CFACT_ABORT			/* Abort */
740942c5e3cSpl196000 };
741942c5e3cSpl196000 
742942c5e3cSpl196000 enum aac_mpe {
743942c5e3cSpl196000 	AACMPE_OK = 0x0,
744942c5e3cSpl196000 	AACMPE_GET_CONFIG_STATUS = 0x1,
745942c5e3cSpl196000 	AACMPE_CONFIG_STATUS = 0x2,
746942c5e3cSpl196000 	AACMPE_COMMIT_CONFIG = 0x3
747942c5e3cSpl196000 };
748942c5e3cSpl196000 
749942c5e3cSpl196000 /*
750942c5e3cSpl196000  * CT_PAUSE_IO is immediate minimal runtime command that is used
751942c5e3cSpl196000  * to restart the applications and cache.
752942c5e3cSpl196000  */
753942c5e3cSpl196000 struct aac_pause_command {
754942c5e3cSpl196000 	uint32_t	Command;
755942c5e3cSpl196000 	uint32_t	Type;
756942c5e3cSpl196000 	uint32_t	Timeout;
757942c5e3cSpl196000 	uint32_t	Min;
758942c5e3cSpl196000 	uint32_t	NoRescan;
759942c5e3cSpl196000 	uint32_t	Parm3;
760942c5e3cSpl196000 	uint32_t	Parm4;
761942c5e3cSpl196000 	uint32_t	Count;
762942c5e3cSpl196000 };
763942c5e3cSpl196000 
764942c5e3cSpl196000 /*
765942c5e3cSpl196000  * The following two definitions come from Adaptec:
766942c5e3cSpl196000  *
767942c5e3cSpl196000  * Used to flush drive cache for container "cid"
768942c5e3cSpl196000  */
769942c5e3cSpl196000 struct aac_synchronize_command {
770942c5e3cSpl196000 	uint32_t	Command;	/* VM_ContainerConfig */
771942c5e3cSpl196000 	uint32_t	Type;		/* CT_FLUSH_CACHE */
772942c5e3cSpl196000 	uint32_t	Cid;
773942c5e3cSpl196000 	uint32_t	Parm1;
774942c5e3cSpl196000 	uint32_t	Parm2;
775942c5e3cSpl196000 	uint32_t	Parm3;
776942c5e3cSpl196000 	uint32_t	Parm4;
777942c5e3cSpl196000 	uint32_t	Count;
778942c5e3cSpl196000 };
779942c5e3cSpl196000 
780942c5e3cSpl196000 struct aac_synchronize_reply {
781942c5e3cSpl196000 	uint32_t	Dummy0;
782942c5e3cSpl196000 	uint32_t	Dummy1;
783942c5e3cSpl196000 	uint32_t	Status;
784942c5e3cSpl196000 	uint32_t	Parm1;
785942c5e3cSpl196000 	uint32_t	Parm2;
786942c5e3cSpl196000 	uint32_t	Parm3;
787942c5e3cSpl196000 	uint32_t	Parm4;
788942c5e3cSpl196000 	uint32_t	Parm5;
789942c5e3cSpl196000 	uint8_t		Data[16];
790942c5e3cSpl196000 };
791942c5e3cSpl196000 
792942c5e3cSpl196000 /*
793942c5e3cSpl196000  * Command status values
794942c5e3cSpl196000  */
795942c5e3cSpl196000 typedef enum {
796942c5e3cSpl196000 	ST_OK = 0,
797942c5e3cSpl196000 	ST_PERM = 1,
798942c5e3cSpl196000 	ST_NOENT = 2,
799942c5e3cSpl196000 	ST_IO = 5,
800942c5e3cSpl196000 	ST_NXIO = 6,
801942c5e3cSpl196000 	ST_E2BIG = 7,
802942c5e3cSpl196000 	ST_ACCES = 13,
803942c5e3cSpl196000 	ST_EXIST = 17,
804942c5e3cSpl196000 	ST_XDEV = 18,
805942c5e3cSpl196000 	ST_NODEV = 19,
806942c5e3cSpl196000 	ST_NOTDIR = 20,
807942c5e3cSpl196000 	ST_ISDIR = 21,
808942c5e3cSpl196000 	ST_INVAL = 22,
809942c5e3cSpl196000 	ST_FBIG = 27,
810942c5e3cSpl196000 	ST_NOSPC = 28,
811942c5e3cSpl196000 	ST_ROFS = 30,
812942c5e3cSpl196000 	ST_MLINK = 31,
813942c5e3cSpl196000 	ST_WOULDBLOCK = 35,
814942c5e3cSpl196000 	ST_NAMETOOLONG = 63,
815942c5e3cSpl196000 	ST_NOTEMPTY = 66,
816942c5e3cSpl196000 	ST_DQUOT = 69,
817942c5e3cSpl196000 	ST_STALE = 70,
818942c5e3cSpl196000 	ST_REMOTE = 71,
819942c5e3cSpl196000 	ST_BADHANDLE = 10001,
820942c5e3cSpl196000 	ST_NOT_SYNC = 10002,
821942c5e3cSpl196000 	ST_BAD_COOKIE = 10003,
822942c5e3cSpl196000 	ST_NOTSUPP = 10004,
823942c5e3cSpl196000 	ST_TOOSMALL = 10005,
824942c5e3cSpl196000 	ST_SERVERFAULT = 10006,
825942c5e3cSpl196000 	ST_BADTYPE = 10007,
826942c5e3cSpl196000 	ST_JUKEBOX = 10008,
827942c5e3cSpl196000 	ST_NOTMOUNTED = 10009,
828942c5e3cSpl196000 	ST_MAINTMODE = 10010,
829942c5e3cSpl196000 	ST_STALEACL = 10011
830942c5e3cSpl196000 } AAC_FSAStatus;
831942c5e3cSpl196000 
832942c5e3cSpl196000 /*
833942c5e3cSpl196000  * Object-Server / Volume-Manager Dispatch Classes
834942c5e3cSpl196000  */
835942c5e3cSpl196000 typedef enum {
836942c5e3cSpl196000 	VM_Null = 0,
837942c5e3cSpl196000 	VM_NameServe,
838942c5e3cSpl196000 	VM_ContainerConfig,
839942c5e3cSpl196000 	VM_Ioctl,
840942c5e3cSpl196000 	VM_FilesystemIoctl,
841942c5e3cSpl196000 	VM_CloseAll,
842942c5e3cSpl196000 	VM_CtBlockRead,
843942c5e3cSpl196000 	VM_CtBlockWrite,
844942c5e3cSpl196000 	VM_SliceBlockRead,	/* raw access to configured "storage objects" */
845942c5e3cSpl196000 	VM_SliceBlockWrite,
846942c5e3cSpl196000 	VM_DriveBlockRead,	/* raw access to physical devices */
847942c5e3cSpl196000 	VM_DriveBlockWrite,
848942c5e3cSpl196000 	VM_EnclosureMgt,	/* enclosure management */
849942c5e3cSpl196000 	VM_Unused,		/* used to be diskset management */
850942c5e3cSpl196000 	VM_CtBlockVerify,
851942c5e3cSpl196000 	VM_CtPerf,		/* performance test */
852942c5e3cSpl196000 	VM_CtBlockRead64,
853942c5e3cSpl196000 	VM_CtBlockWrite64,
854942c5e3cSpl196000 	VM_CtBlockVerify64,
855942c5e3cSpl196000 	VM_CtHostRead64,
856942c5e3cSpl196000 	VM_CtHostWrite64,
857942c5e3cSpl196000 	VM_NameServe64 = 22,
858942c5e3cSpl196000 	MAX_VMCOMMAND_NUM	/* used for sizing stats array - leave last */
859942c5e3cSpl196000 } AAC_VMCommand;
860942c5e3cSpl196000 
861942c5e3cSpl196000 /*
862942c5e3cSpl196000  * Host-addressable object types
863942c5e3cSpl196000  */
864942c5e3cSpl196000 typedef enum {
865942c5e3cSpl196000 	FT_REG = 1,	/* regular file */
866942c5e3cSpl196000 	FT_DIR,		/* directory */
867942c5e3cSpl196000 	FT_BLK,		/* "block" device - reserved */
868942c5e3cSpl196000 	FT_CHR,		/* "character special" device - reserved */
869942c5e3cSpl196000 	FT_LNK,		/* symbolic link */
870942c5e3cSpl196000 	FT_SOCK,	/* socket */
871942c5e3cSpl196000 	FT_FIFO,	/* fifo */
872942c5e3cSpl196000 	FT_FILESYS,	/* ADAPTEC's "FSA"(tm) filesystem */
873942c5e3cSpl196000 	FT_DRIVE,	/* physical disk - addressable in scsi by b/t/l */
874942c5e3cSpl196000 	FT_SLICE,	/* virtual disk - raw volume - slice */
875942c5e3cSpl196000 	FT_PARTITION,	/* FSA partition - carved out of a slice - building */
876942c5e3cSpl196000 			/* block for containers */
877942c5e3cSpl196000 	FT_VOLUME,	/* Container - Volume Set */
878942c5e3cSpl196000 	FT_STRIPE,	/* Container - Stripe Set */
879942c5e3cSpl196000 	FT_MIRROR,	/* Container - Mirror Set */
880942c5e3cSpl196000 	FT_RAID5,	/* Container - Raid 5 Set */
881942c5e3cSpl196000 	FT_DATABASE	/* Storage object with "foreign" content manager */
882942c5e3cSpl196000 } AAC_FType;
883942c5e3cSpl196000 
884942c5e3cSpl196000 /* Host-side scatter/gather list for 32-bit, 64-bit, raw commands */
885942c5e3cSpl196000 struct aac_sg_entry {
886942c5e3cSpl196000 	uint32_t	SgAddress;
887942c5e3cSpl196000 	uint32_t	SgByteCount;
888942c5e3cSpl196000 };
889942c5e3cSpl196000 
890942c5e3cSpl196000 struct aac_sg_entry64 {
891942c5e3cSpl196000 	uint64_t	SgAddress;
892942c5e3cSpl196000 	uint32_t	SgByteCount;
893942c5e3cSpl196000 };
894942c5e3cSpl196000 
895942c5e3cSpl196000 struct aac_sg_entryraw {
896942c5e3cSpl196000 	uint32_t	Next;		/* reserved */
897942c5e3cSpl196000 	uint32_t	Prev;		/* reserved */
898942c5e3cSpl196000 	uint64_t	SgAddress;
899942c5e3cSpl196000 	uint32_t	SgByteCount;
900942c5e3cSpl196000 	uint32_t	Flags;		/* reserved */
901942c5e3cSpl196000 };
902942c5e3cSpl196000 
903942c5e3cSpl196000 struct aac_sg_table {
904942c5e3cSpl196000 	uint32_t		SgCount;
905942c5e3cSpl196000 	struct aac_sg_entry	SgEntry[1]; /* at least there is one */
906942c5e3cSpl196000 					    /* SUN's CC cannot accept [0] */
907942c5e3cSpl196000 };
908942c5e3cSpl196000 
909942c5e3cSpl196000 struct aac_sg_table64 {
910942c5e3cSpl196000 	uint32_t		SgCount;
911942c5e3cSpl196000 	struct aac_sg_entry64	SgEntry64[1];
912942c5e3cSpl196000 };
913942c5e3cSpl196000 
914942c5e3cSpl196000 struct aac_sg_tableraw {
915942c5e3cSpl196000 	uint32_t		SgCount;
916942c5e3cSpl196000 	struct aac_sg_entryraw	SgEntryRaw[1];
917942c5e3cSpl196000 };
918942c5e3cSpl196000 
919942c5e3cSpl196000 /*
920942c5e3cSpl196000  * Block read/write operations.
921942c5e3cSpl196000  * These structures are packed into the 'data' area in the FIB.
922942c5e3cSpl196000  */
923942c5e3cSpl196000 struct aac_blockread {
924942c5e3cSpl196000 	uint32_t		Command;
925942c5e3cSpl196000 	uint32_t		ContainerId;
926942c5e3cSpl196000 	uint32_t		BlockNumber;
927942c5e3cSpl196000 	uint32_t		ByteCount;
928942c5e3cSpl196000 	struct aac_sg_table	SgMap;
929942c5e3cSpl196000 };
930942c5e3cSpl196000 
931942c5e3cSpl196000 struct aac_blockread64 {
932942c5e3cSpl196000 	uint32_t		Command;
933942c5e3cSpl196000 	uint16_t		ContainerId;
934942c5e3cSpl196000 	uint16_t		SectorCount;
935942c5e3cSpl196000 	uint32_t		BlockNumber;
936942c5e3cSpl196000 	uint16_t		Pad;
937942c5e3cSpl196000 	uint16_t		Flags;
938942c5e3cSpl196000 	struct aac_sg_table64	SgMap64;
939942c5e3cSpl196000 };
940942c5e3cSpl196000 
941942c5e3cSpl196000 struct aac_blockread_response {
942942c5e3cSpl196000 	uint32_t		Status;
943942c5e3cSpl196000 	uint32_t		ByteCount;
944942c5e3cSpl196000 };
945942c5e3cSpl196000 
946942c5e3cSpl196000 struct aac_blockwrite {
947942c5e3cSpl196000 	uint32_t		Command;
948942c5e3cSpl196000 	uint32_t		ContainerId;
949942c5e3cSpl196000 	uint32_t		BlockNumber;
950942c5e3cSpl196000 	uint32_t		ByteCount;
951942c5e3cSpl196000 	uint32_t		Stable;
952942c5e3cSpl196000 	struct aac_sg_table	SgMap;
953942c5e3cSpl196000 };
954942c5e3cSpl196000 
955942c5e3cSpl196000 struct aac_blockwrite64 {
956942c5e3cSpl196000 	uint32_t		Command;
957942c5e3cSpl196000 	uint16_t		ContainerId;
958942c5e3cSpl196000 	uint16_t		SectorCount;
959942c5e3cSpl196000 	uint32_t		BlockNumber;
960942c5e3cSpl196000 	uint16_t		Pad;
961942c5e3cSpl196000 	uint16_t		Flags;
962942c5e3cSpl196000 	struct aac_sg_table64	SgMap64;
963942c5e3cSpl196000 };
964942c5e3cSpl196000 
965942c5e3cSpl196000 struct aac_blockwrite_response {
966942c5e3cSpl196000 	uint32_t		Status;
967942c5e3cSpl196000 	uint32_t		ByteCount;
968942c5e3cSpl196000 	uint32_t		Committed;
969942c5e3cSpl196000 };
970942c5e3cSpl196000 
971942c5e3cSpl196000 struct aac_raw_io {
972942c5e3cSpl196000 	uint64_t		BlockNumber;
973942c5e3cSpl196000 	uint32_t		ByteCount;
974942c5e3cSpl196000 	uint16_t		ContainerId;
975942c5e3cSpl196000 	uint16_t		Flags;		/* 0: W, 1: R */
976942c5e3cSpl196000 	uint16_t		BpTotal;	/* reserved */
977942c5e3cSpl196000 	uint16_t		BpComplete;	/* reserved */
978942c5e3cSpl196000 	struct aac_sg_tableraw	SgMapRaw;
979942c5e3cSpl196000 };
980942c5e3cSpl196000 
981942c5e3cSpl196000 /*
982942c5e3cSpl196000  * Container shutdown command.
983942c5e3cSpl196000  */
984942c5e3cSpl196000 struct aac_close_command {
985942c5e3cSpl196000 	uint32_t		Command;
986942c5e3cSpl196000 	uint32_t		ContainerId;
987942c5e3cSpl196000 };
988942c5e3cSpl196000 
98958bc78c7SXin Chen /*
99058bc78c7SXin Chen  * Container Config Command
99158bc78c7SXin Chen  */
99258bc78c7SXin Chen struct aac_ctcfg {
99358bc78c7SXin Chen 	uint32_t		Command;
99458bc78c7SXin Chen 	uint32_t		cmd;
99558bc78c7SXin Chen 	uint32_t		param;
99658bc78c7SXin Chen };
99758bc78c7SXin Chen 
99858bc78c7SXin Chen struct aac_ctcfg_resp {
99958bc78c7SXin Chen 	uint32_t		Status;
100058bc78c7SXin Chen 	uint32_t		resp;
100158bc78c7SXin Chen 	uint32_t		param;
100258bc78c7SXin Chen };
100358bc78c7SXin Chen 
1004942c5e3cSpl196000 /* Write 'stability' options */
1005942c5e3cSpl196000 #define	CSTABLE			1
1006942c5e3cSpl196000 #define	CUNSTABLE		2
1007942c5e3cSpl196000 
1008942c5e3cSpl196000 /* Number of FIBs for the controller to send us messages */
1009942c5e3cSpl196000 #define	AAC_ADAPTER_FIBS	8
1010942c5e3cSpl196000 
1011942c5e3cSpl196000 /* Number of FIBs for the host I/O request */
1012942c5e3cSpl196000 #define	AAC_HOST_FIBS		256
1013942c5e3cSpl196000 
1014942c5e3cSpl196000 /* Size of buffer for text messages from the controller */
1015942c5e3cSpl196000 #define	AAC_ADAPTER_PRINT_BUFSIZE		256
1016942c5e3cSpl196000 
1017942c5e3cSpl196000 #define	AAC_INIT_STRUCT_REVISION		3
1018942c5e3cSpl196000 #define	AAC_INIT_STRUCT_REVISION_4		4
1019942c5e3cSpl196000 #define	AAC_INIT_STRUCT_MINIPORT_REVISION	1
1020b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 
1021942c5e3cSpl196000 #define	AAC_INIT_FLAGS_NEW_COMM_SUPPORTED	1
1022b40e8a89Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_INIT_FLAGS_DRIVER_USES_UTC_TIME	0x10
1023b40e8a89Szhongyan gu - Sun Microsystems - Beijing China #define	AAC_INIT_FLAGS_DRIVER_SUPPORTS_PM	0x20
1024b40e8a89Szhongyan gu - Sun Microsystems - Beijing China 
1025942c5e3cSpl196000 #define	AAC_PAGE_SIZE				4096
1026942c5e3cSpl196000 struct aac_adapter_init {
1027942c5e3cSpl196000 	uint32_t	InitStructRevision;
1028942c5e3cSpl196000 	uint32_t	MiniPortRevision;
1029942c5e3cSpl196000 	uint32_t	FilesystemRevision;
1030942c5e3cSpl196000 	uint32_t	CommHeaderAddress;
1031942c5e3cSpl196000 	uint32_t	FastIoCommAreaAddress;
1032942c5e3cSpl196000 	uint32_t	AdapterFibsPhysicalAddress;
1033942c5e3cSpl196000 	uint32_t	AdapterFibsVirtualAddress;
1034942c5e3cSpl196000 	uint32_t	AdapterFibsSize;
1035942c5e3cSpl196000 	uint32_t	AdapterFibAlign;
1036942c5e3cSpl196000 	uint32_t	PrintfBufferAddress;
1037942c5e3cSpl196000 	uint32_t	PrintfBufferSize;
1038942c5e3cSpl196000 	uint32_t	HostPhysMemPages;
1039942c5e3cSpl196000 	uint32_t	HostElapsedSeconds;
1040942c5e3cSpl196000 	/* ADAPTER_INIT_STRUCT_REVISION_4 begins here */
1041942c5e3cSpl196000 	uint32_t	InitFlags;
1042942c5e3cSpl196000 	uint32_t	MaxIoCommands;
1043942c5e3cSpl196000 	uint32_t	MaxIoSize;
1044942c5e3cSpl196000 	uint32_t	MaxFibSize;
1045942c5e3cSpl196000 };
1046942c5e3cSpl196000 
1047942c5e3cSpl196000 /* ************AAC QUEUE DEFINES (BELOW)*********** */
1048942c5e3cSpl196000 
1049942c5e3cSpl196000 #define	AAC_QUEUE_ALIGN		16
1050942c5e3cSpl196000 #define	AAC_QUEUE_COUNT		8
1051942c5e3cSpl196000 #define	AAC_PRODUCER_INDEX	0
1052942c5e3cSpl196000 #define	AAC_CONSUMER_INDEX	1
1053942c5e3cSpl196000 
1054942c5e3cSpl196000 struct aac_queue_entry {
1055942c5e3cSpl196000 	uint32_t aq_fib_size;	/* FIB size in bytes */
1056942c5e3cSpl196000 	uint32_t aq_fib_addr;	/* receiver-space address of the FIB */
1057942c5e3cSpl196000 };
1058942c5e3cSpl196000 
1059942c5e3cSpl196000 /*
1060942c5e3cSpl196000  * Queue names
1061942c5e3cSpl196000  *
1062942c5e3cSpl196000  * Note that we base these at 0 in order to use them as array indices.
1063942c5e3cSpl196000  * Adaptec used base 1 for some unknown reason, and sorted them in a
1064942c5e3cSpl196000  * different order.
1065942c5e3cSpl196000  */
1066942c5e3cSpl196000 #define	AAC_HOST_NORM_CMD_Q	0
1067942c5e3cSpl196000 #define	AAC_HOST_HIGH_CMD_Q	1
1068942c5e3cSpl196000 #define	AAC_ADAP_NORM_CMD_Q	2
1069942c5e3cSpl196000 #define	AAC_ADAP_HIGH_CMD_Q	3
1070942c5e3cSpl196000 #define	AAC_HOST_NORM_RESP_Q	4
1071942c5e3cSpl196000 #define	AAC_HOST_HIGH_RESP_Q	5
1072942c5e3cSpl196000 #define	AAC_ADAP_NORM_RESP_Q	6
1073942c5e3cSpl196000 #define	AAC_ADAP_HIGH_RESP_Q	7
1074942c5e3cSpl196000 
1075942c5e3cSpl196000 /*
1076942c5e3cSpl196000  * We establish 4 command queues and matching response queues. Queues must
1077942c5e3cSpl196000  * be 16-byte aligned, and are sized as follows:
1078942c5e3cSpl196000  */
1079942c5e3cSpl196000 /* command adapter->host, normal priority */
1080942c5e3cSpl196000 #define	AAC_HOST_NORM_CMD_ENTRIES	8
1081942c5e3cSpl196000 /* command adapter->host, high priority */
1082942c5e3cSpl196000 #define	AAC_HOST_HIGH_CMD_ENTRIES	4
1083942c5e3cSpl196000 /* command host->adapter, normal priority */
1084942c5e3cSpl196000 #define	AAC_ADAP_NORM_CMD_ENTRIES	512
1085942c5e3cSpl196000 /* command host->adapter, high priority */
1086942c5e3cSpl196000 #define	AAC_ADAP_HIGH_CMD_ENTRIES	4
1087942c5e3cSpl196000 /* response, adapter->host, normal priority */
1088942c5e3cSpl196000 #define	AAC_HOST_NORM_RESP_ENTRIES	512
1089942c5e3cSpl196000 /* response, adapter->host, high priority */
1090942c5e3cSpl196000 #define	AAC_HOST_HIGH_RESP_ENTRIES	4
1091942c5e3cSpl196000 /* response, host->adapter, normal priority */
1092942c5e3cSpl196000 #define	AAC_ADAP_NORM_RESP_ENTRIES	8
1093942c5e3cSpl196000 /* response, host->adapter, high priority */
1094942c5e3cSpl196000 #define	AAC_ADAP_HIGH_RESP_ENTRIES	4
1095942c5e3cSpl196000 
1096942c5e3cSpl196000 #define	AAC_TOTALQ_LENGTH	(AAC_HOST_HIGH_CMD_ENTRIES + \
1097942c5e3cSpl196000 				AAC_HOST_NORM_CMD_ENTRIES + \
1098942c5e3cSpl196000 				AAC_ADAP_HIGH_CMD_ENTRIES + \
1099942c5e3cSpl196000 				AAC_ADAP_NORM_CMD_ENTRIES + \
1100942c5e3cSpl196000 				AAC_HOST_HIGH_RESP_ENTRIES + \
1101942c5e3cSpl196000 				AAC_HOST_NORM_RESP_ENTRIES + \
1102942c5e3cSpl196000 				AAC_ADAP_HIGH_RESP_ENTRIES + \
1103942c5e3cSpl196000 				AAC_ADAP_NORM_RESP_ENTRIES)
1104942c5e3cSpl196000 
1105942c5e3cSpl196000 /*
1106942c5e3cSpl196000  * Table of queue indices and queues used to communicate with the
1107942c5e3cSpl196000  * controller. This structure must be aligned to AAC_QUEUE_ALIGN.
1108942c5e3cSpl196000  */
1109942c5e3cSpl196000 struct aac_queue_table {
1110942c5e3cSpl196000 	/* queue consumer/producer indexes (layout mandated by adapter) */
1111942c5e3cSpl196000 	uint32_t qt_qindex[AAC_QUEUE_COUNT][2];
1112942c5e3cSpl196000 
1113942c5e3cSpl196000 	/* queue entry structures (layout mandated by adapter) */
1114942c5e3cSpl196000 	struct aac_queue_entry qt_HostNormCmdQueue \
1115942c5e3cSpl196000 	    [AAC_HOST_NORM_CMD_ENTRIES];
1116942c5e3cSpl196000 	struct aac_queue_entry qt_HostHighCmdQueue \
1117942c5e3cSpl196000 	    [AAC_HOST_HIGH_CMD_ENTRIES];
1118942c5e3cSpl196000 	struct aac_queue_entry qt_AdapNormCmdQueue \
1119942c5e3cSpl196000 	    [AAC_ADAP_NORM_CMD_ENTRIES];
1120942c5e3cSpl196000 	struct aac_queue_entry qt_AdapHighCmdQueue \
1121942c5e3cSpl196000 	    [AAC_ADAP_HIGH_CMD_ENTRIES];
1122942c5e3cSpl196000 	struct aac_queue_entry qt_HostNormRespQueue \
1123942c5e3cSpl196000 	    [AAC_HOST_NORM_RESP_ENTRIES];
1124942c5e3cSpl196000 	struct aac_queue_entry qt_HostHighRespQueue \
1125942c5e3cSpl196000 	    [AAC_HOST_HIGH_RESP_ENTRIES];
1126942c5e3cSpl196000 	struct aac_queue_entry qt_AdapNormRespQueue \
1127942c5e3cSpl196000 	    [AAC_ADAP_NORM_RESP_ENTRIES];
1128942c5e3cSpl196000 	struct aac_queue_entry qt_AdapHighRespQueue \
1129942c5e3cSpl196000 	    [AAC_ADAP_HIGH_RESP_ENTRIES];
1130942c5e3cSpl196000 };
1131942c5e3cSpl196000 /* ************AAC QUEUE DEFINES (ABOVE)*********** */
1132942c5e3cSpl196000 
1133942c5e3cSpl196000 /*
1134942c5e3cSpl196000  * NVRAM/Write Cache subsystem battery component states
1135942c5e3cSpl196000  */
1136942c5e3cSpl196000 typedef enum {
1137942c5e3cSpl196000 	NVBATTSTATUS_NONE = 0,	/* battery has no power or is not present */
1138942c5e3cSpl196000 	NVBATTSTATUS_LOW,	/* battery is low on power */
1139942c5e3cSpl196000 	NVBATTSTATUS_OK,	/* battery is okay - normal operation */
1140942c5e3cSpl196000 				/* possible only in this state */
1141942c5e3cSpl196000 	NVBATTSTATUS_RECONDITIONING	/* no battery present */
1142942c5e3cSpl196000 					/* - reconditioning in process */
1143942c5e3cSpl196000 } AAC_NVBATTSTATUS;
1144942c5e3cSpl196000 
1145942c5e3cSpl196000 /*
1146942c5e3cSpl196000  * Battery transition type
1147942c5e3cSpl196000  */
1148942c5e3cSpl196000 typedef enum {
1149942c5e3cSpl196000 	NVBATT_TRANSITION_NONE = 0,	/* battery now has no power or is not */
1150942c5e3cSpl196000 					/* present */
1151942c5e3cSpl196000 	NVBATT_TRANSITION_LOW,	/* battery is now low on power */
1152942c5e3cSpl196000 	NVBATT_TRANSITION_OK	/* battery is now okay - normal */
1153942c5e3cSpl196000 				/* operation possible only in this state */
1154942c5e3cSpl196000 } AAC_NVBATT_TRANSITION;
1155942c5e3cSpl196000 
1156942c5e3cSpl196000 /*
1157942c5e3cSpl196000  * Data types relating to AIFs
1158942c5e3cSpl196000  */
1159942c5e3cSpl196000 
1160942c5e3cSpl196000 /*
1161942c5e3cSpl196000  * Progress Reports
1162942c5e3cSpl196000  */
1163942c5e3cSpl196000 typedef enum {
1164942c5e3cSpl196000 	AifJobStsSuccess = 1,
1165942c5e3cSpl196000 	AifJobStsFinished,
1166942c5e3cSpl196000 	AifJobStsAborted,
1167942c5e3cSpl196000 	AifJobStsFailed,
1168942c5e3cSpl196000 	AifJobStsLastReportMarker = 100,	/* All prior mean last report */
1169942c5e3cSpl196000 	AifJobStsSuspended,
1170942c5e3cSpl196000 	AifJobStsRunning
1171942c5e3cSpl196000 } AAC_AifJobStatus;
1172942c5e3cSpl196000 
1173942c5e3cSpl196000 typedef enum {
1174942c5e3cSpl196000 	AifJobScsiMin = 1,	/* Minimum value for Scsi operation */
1175942c5e3cSpl196000 	AifJobScsiZero,		/* SCSI device clear operation */
1176942c5e3cSpl196000 	AifJobScsiVerify,	/* SCSI device Verify operation NO REPAIR */
1177942c5e3cSpl196000 	AifJobScsiExercise,	/* SCSI device Exercise operation */
1178942c5e3cSpl196000 	AifJobScsiVerifyRepair,	/* SCSI device Verify operation WITH repair */
1179942c5e3cSpl196000 	AifJobScsiWritePattern,	/* write pattern */
1180942c5e3cSpl196000 	AifJobScsiMax = 99,	/* Max Scsi value */
1181942c5e3cSpl196000 	AifJobCtrMin,		/* Min Ctr op value */
1182942c5e3cSpl196000 	AifJobCtrZero,		/* Container clear operation */
1183942c5e3cSpl196000 	AifJobCtrCopy,		/* Container copy operation */
1184942c5e3cSpl196000 	AifJobCtrCreateMirror,	/* Container Create Mirror operation */
1185942c5e3cSpl196000 	AifJobCtrMergeMirror,	/* Container Merge Mirror operation */
1186942c5e3cSpl196000 	AifJobCtrScrubMirror,	/* Container Scrub Mirror operation */
1187942c5e3cSpl196000 	AifJobCtrRebuildRaid5,	/* Container Rebuild Raid5 operation */
1188942c5e3cSpl196000 	AifJobCtrScrubRaid5,	/* Container Scrub Raid5 operation */
1189942c5e3cSpl196000 	AifJobCtrMorph,		/* Container morph operation */
1190942c5e3cSpl196000 	AifJobCtrPartCopy,	/* Container Partition copy operation */
1191942c5e3cSpl196000 	AifJobCtrRebuildMirror,	/* Container Rebuild Mirror operation */
1192942c5e3cSpl196000 	AifJobCtrCrazyCache,	/* crazy cache */
1193942c5e3cSpl196000 	AifJobCtrCopyback,	/* Container Copyback operation */
1194942c5e3cSpl196000 	AifJobCtrCompactRaid5D,	/* Container Compaction operation */
1195942c5e3cSpl196000 	AifJobCtrExpandRaid5D,	/* Container Expansion operation */
1196942c5e3cSpl196000 	AifJobCtrRebuildRaid6,	/* Container Rebuild Raid6 operation */
1197942c5e3cSpl196000 	AifJobCtrScrubRaid6,	/* Container Scrub Raid6 operation */
1198942c5e3cSpl196000 	AifJobCtrSSBackup,	/* Container snapshot backup task */
1199942c5e3cSpl196000 	AifJobCtrMax = 199,	/* Max Ctr type operation */
1200942c5e3cSpl196000 	AifJobFsMin,		/* Min Fs type operation */
1201942c5e3cSpl196000 	AifJobFsCreate,		/* File System Create operation */
1202942c5e3cSpl196000 	AifJobFsVerify,		/* File System Verify operation */
1203942c5e3cSpl196000 	AifJobFsExtend,		/* File System Extend operation */
1204942c5e3cSpl196000 	AifJobFsMax = 299,	/* Max Fs type operation */
1205942c5e3cSpl196000 	AifJobApiFormatNTFS,	/* Format a drive to NTFS */
1206942c5e3cSpl196000 	AifJobApiFormatFAT,	/* Format a drive to FAT */
1207942c5e3cSpl196000 	AifJobApiUpdateSnapshot, /* update the read/write half of a snapshot */
1208942c5e3cSpl196000 	AifJobApiFormatFAT32,	/* Format a drive to FAT32 */
1209942c5e3cSpl196000 	AifJobApiMax = 399,		/* Max API type operation */
1210942c5e3cSpl196000 	AifJobCtlContinuousCtrVerify,	/* Adapter operation */
1211942c5e3cSpl196000 	AifJobCtlMax = 499		/* Max Adapter type operation */
1212942c5e3cSpl196000 } AAC_AifJobType;
1213942c5e3cSpl196000 
1214942c5e3cSpl196000 struct aac_AifContainers {
1215942c5e3cSpl196000 	uint32_t	src;		/* from/master */
1216942c5e3cSpl196000 	uint32_t	dst;		/* to/slave */
1217942c5e3cSpl196000 };
1218942c5e3cSpl196000 
1219942c5e3cSpl196000 union aac_AifJobClient {
1220942c5e3cSpl196000 	struct aac_AifContainers container;	/* For Container and */
1221942c5e3cSpl196000 						/* filesystem progress ops */
1222942c5e3cSpl196000 	int32_t scsi_dh;			/* For SCSI progress ops */
1223942c5e3cSpl196000 };
1224942c5e3cSpl196000 
1225942c5e3cSpl196000 struct aac_AifJobDesc {
1226942c5e3cSpl196000 	uint32_t	jobID;	/* DO NOT FILL IN! Will be filled in by AIF */
1227942c5e3cSpl196000 	AAC_AifJobType	type;	/* Operation that is being performed */
1228942c5e3cSpl196000 	union aac_AifJobClient	client;	/* Details */
1229942c5e3cSpl196000 };
1230942c5e3cSpl196000 
1231942c5e3cSpl196000 struct aac_AifJobProgressReport {
1232942c5e3cSpl196000 	struct aac_AifJobDesc	jd;
1233942c5e3cSpl196000 	AAC_AifJobStatus	status;
1234942c5e3cSpl196000 	uint32_t		finalTick;
1235942c5e3cSpl196000 	uint32_t		currentTick;
1236942c5e3cSpl196000 	uint32_t		jobSpecificData1;
1237942c5e3cSpl196000 	uint32_t		jobSpecificData2;
1238942c5e3cSpl196000 };
1239942c5e3cSpl196000 
1240942c5e3cSpl196000 /*
1241942c5e3cSpl196000  * Event Notification
1242942c5e3cSpl196000  */
1243942c5e3cSpl196000 typedef enum {
1244942c5e3cSpl196000 	/* General application notifies start here */
1245942c5e3cSpl196000 	AifEnGeneric = 1,	/* Generic notification */
1246942c5e3cSpl196000 	AifEnTaskComplete,	/* Task has completed */
1247942c5e3cSpl196000 	AifEnConfigChange,	/* Adapter config change occurred */
1248942c5e3cSpl196000 	AifEnContainerChange,	/* Adapter specific container cfg. change */
1249942c5e3cSpl196000 	AifEnDeviceFailure,	/* SCSI device failed */
1250942c5e3cSpl196000 	AifEnMirrorFailover,	/* Mirror failover started */
1251942c5e3cSpl196000 	AifEnContainerEvent,	/* Significant container event */
1252942c5e3cSpl196000 	AifEnFileSystemChange,	/* File system changed */
1253942c5e3cSpl196000 	AifEnConfigPause,	/* Container pause event */
1254942c5e3cSpl196000 	AifEnConfigResume,	/* Container resume event */
1255942c5e3cSpl196000 	AifEnFailoverChange,	/* Failover space assignment changed */
1256942c5e3cSpl196000 	AifEnRAID5RebuildDone,	/* RAID5 rebuild finished */
1257942c5e3cSpl196000 	AifEnEnclosureManagement,	/* Enclosure management event */
1258942c5e3cSpl196000 	AifEnBatteryEvent,	/* Significant NV battery event */
1259942c5e3cSpl196000 	AifEnAddContainer,	/* A new container was created. */
1260942c5e3cSpl196000 	AifEnDeleteContainer,	/* A container was deleted. */
1261942c5e3cSpl196000 	AifEnSMARTEvent,	/* SMART Event */
1262942c5e3cSpl196000 	AifEnBatteryNeedsRecond,	/* The battery needs reconditioning */
1263942c5e3cSpl196000 	AifEnClusterEvent,		/* Some cluster event */
1264942c5e3cSpl196000 	AifEnDiskSetEvent,		/* A disk set event occured. */
1265*3fced439Szhongyan gu - Sun Microsystems - Beijing China 	AifEnAddJBOD = 30,	/* A new JBOD type drive was created (30) */
1266*3fced439Szhongyan gu - Sun Microsystems - Beijing China 	AifEnDeleteJBOD = 31,	/* A JBOD type drive was deleted (31) */
1267942c5e3cSpl196000 	AifDriverNotifyStart = 199,	/* Notifies for host driver go here */
1268942c5e3cSpl196000 	/* Host driver notifications start here */
1269942c5e3cSpl196000 	AifDenMorphComplete,		/* A morph operation completed */
1270942c5e3cSpl196000 	AifDenVolumeExtendComplete	/* Volume expand operation completed */
1271942c5e3cSpl196000 } AAC_AifEventNotifyType;
1272942c5e3cSpl196000 
1273942c5e3cSpl196000 struct aac_AifEnsGeneric {
1274942c5e3cSpl196000 	char	text[132];		/* Generic text */
1275942c5e3cSpl196000 };
1276942c5e3cSpl196000 
1277942c5e3cSpl196000 struct aac_AifEnsDeviceFailure {
1278942c5e3cSpl196000 	uint32_t	deviceHandle;	/* SCSI device handle */
1279942c5e3cSpl196000 };
1280942c5e3cSpl196000 
1281942c5e3cSpl196000 struct aac_AifEnsMirrorFailover {
1282942c5e3cSpl196000 	uint32_t	container;	/* Container with failed element */
1283942c5e3cSpl196000 	uint32_t	failedSlice;	/* Old slice which failed */
1284942c5e3cSpl196000 	uint32_t	creatingSlice;	/* New slice used for auto-create */
1285942c5e3cSpl196000 };
1286942c5e3cSpl196000 
1287942c5e3cSpl196000 struct aac_AifEnsContainerChange {
1288942c5e3cSpl196000 	uint32_t	container[2];	/* container that changed, -1 if */
1289942c5e3cSpl196000 					/* no container */
1290942c5e3cSpl196000 };
1291942c5e3cSpl196000 
1292942c5e3cSpl196000 struct aac_AifEnsContainerEvent {
1293942c5e3cSpl196000 	uint32_t	container;	/* container number  */
1294942c5e3cSpl196000 	uint32_t	eventType;	/* event type */
1295942c5e3cSpl196000 };
1296942c5e3cSpl196000 
1297942c5e3cSpl196000 struct aac_AifEnsEnclosureEvent {
1298942c5e3cSpl196000 	uint32_t	empID;		/* enclosure management proc number  */
1299942c5e3cSpl196000 	uint32_t	unitID;		/* unitId, fan id, power supply id, */
1300942c5e3cSpl196000 					/* slot id, tempsensor id. */
1301942c5e3cSpl196000 	uint32_t	eventType;	/* event type */
1302942c5e3cSpl196000 };
1303942c5e3cSpl196000 
1304942c5e3cSpl196000 struct aac_AifEnsBatteryEvent {
1305942c5e3cSpl196000 	AAC_NVBATT_TRANSITION	transition_type;	/* eg from low to ok */
1306942c5e3cSpl196000 	AAC_NVBATTSTATUS	current_state;	/* current batt state */
1307942c5e3cSpl196000 	AAC_NVBATTSTATUS	prior_state;	/* prev batt state */
1308942c5e3cSpl196000 };
1309942c5e3cSpl196000 
1310942c5e3cSpl196000 struct aac_AifEnsDiskSetEvent {
1311942c5e3cSpl196000 	uint32_t	eventType;
1312942c5e3cSpl196000 	uint64_t	DsNum;
1313942c5e3cSpl196000 	uint64_t	CreatorId;
1314942c5e3cSpl196000 };
1315942c5e3cSpl196000 
1316942c5e3cSpl196000 typedef enum {
1317942c5e3cSpl196000 	CLUSTER_NULL_EVENT = 0,
1318942c5e3cSpl196000 	CLUSTER_PARTNER_NAME_EVENT,	/* change in partner hostname or */
1319942c5e3cSpl196000 					/* adaptername from NULL to non-NULL */
1320942c5e3cSpl196000 					/* (partner's agent may be up) */
1321942c5e3cSpl196000 	CLUSTER_PARTNER_NULL_NAME_EVENT	/* change in partner hostname or */
1322942c5e3cSpl196000 					/* adaptername from non-null to NULL */
1323942c5e3cSpl196000 					/* (partner has rebooted) */
1324942c5e3cSpl196000 } AAC_ClusterAifEvent;
1325942c5e3cSpl196000 
1326942c5e3cSpl196000 struct aac_AifEnsClusterEvent {
1327942c5e3cSpl196000 	AAC_ClusterAifEvent	eventType;
1328942c5e3cSpl196000 };
1329942c5e3cSpl196000 
1330942c5e3cSpl196000 struct aac_AifEventNotify {
1331942c5e3cSpl196000 	AAC_AifEventNotifyType	type;
1332942c5e3cSpl196000 	union {
1333942c5e3cSpl196000 		struct aac_AifEnsGeneric		EG;
1334942c5e3cSpl196000 		struct aac_AifEnsDeviceFailure		EDF;
1335942c5e3cSpl196000 		struct aac_AifEnsMirrorFailover		EMF;
1336942c5e3cSpl196000 		struct aac_AifEnsContainerChange	ECC;
1337942c5e3cSpl196000 		struct aac_AifEnsContainerEvent		ECE;
1338942c5e3cSpl196000 		struct aac_AifEnsEnclosureEvent		EEE;
1339942c5e3cSpl196000 		struct aac_AifEnsBatteryEvent		EBE;
1340942c5e3cSpl196000 		struct aac_AifEnsDiskSetEvent		EDS;
1341942c5e3cSpl196000 /*		struct aac_AifEnsSMARTEvent		ES; */
1342942c5e3cSpl196000 		struct aac_AifEnsClusterEvent		ECLE;
1343942c5e3cSpl196000 	} data;
1344942c5e3cSpl196000 };
1345942c5e3cSpl196000 
1346942c5e3cSpl196000 /*
1347942c5e3cSpl196000  * Adapter Initiated FIB command structures. Start with the adapter
1348942c5e3cSpl196000  * initiated FIBs that really come from the adapter, and get responded
1349942c5e3cSpl196000  * to by the host.
1350942c5e3cSpl196000  */
1351942c5e3cSpl196000 #define	AAC_AIF_REPORT_MAX_SIZE 64
1352942c5e3cSpl196000 
1353942c5e3cSpl196000 typedef enum {
1354942c5e3cSpl196000 	AifCmdEventNotify = 1,	/* Notify of event */
1355942c5e3cSpl196000 	AifCmdJobProgress,	/* Progress report */
1356942c5e3cSpl196000 	AifCmdAPIReport,	/* Report from other user of API */
1357942c5e3cSpl196000 	AifCmdDriverNotify,	/* Notify host driver of event */
1358942c5e3cSpl196000 	AifReqJobList = 100,	/* Gets back complete job list */
1359942c5e3cSpl196000 	AifReqJobsForCtr,	/* Gets back jobs for specific container */
1360942c5e3cSpl196000 	AifReqJobsForScsi,	/* Gets back jobs for specific SCSI device */
1361942c5e3cSpl196000 	AifReqJobReport,	/* Gets back a specific job report or list */
1362942c5e3cSpl196000 	AifReqTerminateJob,	/* Terminates job */
1363942c5e3cSpl196000 	AifReqSuspendJob,	/* Suspends a job */
1364942c5e3cSpl196000 	AifReqResumeJob,	/* Resumes a job */
1365942c5e3cSpl196000 	AifReqSendAPIReport,	/* API generic report requests */
1366942c5e3cSpl196000 	AifReqAPIJobStart,	/* Start a job from the API */
1367942c5e3cSpl196000 	AifReqAPIJobUpdate,	/* Update a job report from the API */
1368942c5e3cSpl196000 	AifReqAPIJobFinish	/* Finish a job from the API */
1369942c5e3cSpl196000 } AAC_AifCommand;
1370942c5e3cSpl196000 
1371942c5e3cSpl196000 struct aac_aif_command {
1372942c5e3cSpl196000 	AAC_AifCommand	command; /* Tell host what type of notify this is */
1373942c5e3cSpl196000 	uint32_t	seqNumber;	/* To allow ordering of reports */
1374942c5e3cSpl196000 					/* (if necessary) */
1375942c5e3cSpl196000 	union {
1376942c5e3cSpl196000 		struct aac_AifEventNotify	EN;	/* Event notify */
1377942c5e3cSpl196000 		struct aac_AifJobProgressReport	PR[1];	/* Progress report */
1378942c5e3cSpl196000 		uint8_t	AR[AAC_AIF_REPORT_MAX_SIZE];
1379942c5e3cSpl196000 		uint8_t	data[AAC_FIB_DATASIZE - 8];
1380942c5e3cSpl196000 	} data;
1381942c5e3cSpl196000 };
1382942c5e3cSpl196000 
1383942c5e3cSpl196000 #define	CT_PUP_MISSING_DRIVE	27
1384942c5e3cSpl196000 
1385942c5e3cSpl196000 /*
1386942c5e3cSpl196000  * Cluster Management Commands
1387942c5e3cSpl196000  */
1388942c5e3cSpl196000 typedef enum {
1389942c5e3cSpl196000 	CL_NULL = 0,		/* 0x00 null */
1390942c5e3cSpl196000 	/* disk set commands */
1391942c5e3cSpl196000 	DS_INIT = 1,		/* 0x01 init disk set control block */
1392942c5e3cSpl196000 	DS_RESCAN,		/* 0x02 refresh drive, disk set, and slice */
1393942c5e3cSpl196000 				/* structs */
1394942c5e3cSpl196000 	DS_CREATE,		/* 0x03 create a disk set */
1395942c5e3cSpl196000 	DS_DELETE,		/* 0x04 delete a disk set */
1396942c5e3cSpl196000 	DS_ADD_DISK,		/* 0x05 add a disk to an existing disk set */
1397942c5e3cSpl196000 	DS_REMOVE_DISK,		/* 0x06 remove a disk from an existing disk */
1398942c5e3cSpl196000 				/* set */
1399942c5e3cSpl196000 	DS_MOVE_DISK,		/* 0x07 move a disk from one existing disk */
1400942c5e3cSpl196000 				/* set to another */
1401942c5e3cSpl196000 	DS_TAKE_OWNERSHIP,	/* 0x08 take ownership of an unowned disk set */
1402942c5e3cSpl196000 	DS_RELEASE_OWNERSHIP,	/* 0x09 release ownership of a disk set */
1403942c5e3cSpl196000 	DS_FORCE_OWNERSHIP,	/* 0x0A force ownership of an disk set */
1404942c5e3cSpl196000 	DS_GET_DISK_SET_PARAM,	/* 0x0B get info on a disk set */
1405942c5e3cSpl196000 	DS_GET_DRIVE_PARAM,	/* 0x0C get info on a drive */
1406942c5e3cSpl196000 	DS_GET_SLICE_PARAM,	/* 0x0D get info on a slice */
1407942c5e3cSpl196000 	DS_GET_DISK_SETS,	/* 0x0E get a list of disk sets */
1408942c5e3cSpl196000 	DS_GET_DRIVES,		/* 0x0F get a list of drives */
1409942c5e3cSpl196000 	DS_SET_DISK_SET_PARAM,	/* 0x10 set info of a disk set */
1410942c5e3cSpl196000 	DS_ONLINE,		/* 0x11 take disk set online */
1411942c5e3cSpl196000 	DS_OFFLINE,		/* 0x12 take disk set offline */
1412942c5e3cSpl196000 	DS_ONLINE_CONTAINERS,	/* 0x13 bring containers in diskset online */
1413942c5e3cSpl196000 	DS_FSAPRINT,		/* 0x14 do an FsaPrint */
1414942c5e3cSpl196000 
1415942c5e3cSpl196000 	/* config commands */
1416942c5e3cSpl196000 	CL_CFG_SET_HOST_IDS = 0x100,	/* 0x100 set host ids (host name and */
1417942c5e3cSpl196000 					/* adapter name) */
1418942c5e3cSpl196000 	CL_CFG_SET_PARTNER_HOST_IDS,	/* 0x101 set partner host ids (host */
1419942c5e3cSpl196000 					/* name and adapter name) */
1420942c5e3cSpl196000 	CL_CFG_GET_CLUSTER_CONFIG,	/* 0x102 get cluster configuration */
1421942c5e3cSpl196000 
1422942c5e3cSpl196000 	/* cluster comm commands */
1423942c5e3cSpl196000 	CC_CLI_CLEAR_MESSAGE_BUFFER = 0x200,	/* 0x200 CC - client - clear */
1424942c5e3cSpl196000 						/* contents of message buffer */
1425942c5e3cSpl196000 	CC_SRV_CLEAR_MESSAGE_BUFFER,	/* 0x201 CC - server - clear contents */
1426942c5e3cSpl196000 					/* of message buffer */
1427942c5e3cSpl196000 	CC_CLI_SHOW_MESSAGE_BUFFER,	/* 0x202 CC - client - show contents */
1428942c5e3cSpl196000 					/* of message buffer */
1429942c5e3cSpl196000 	CC_SRV_SHOW_MESSAGE_BUFFER,	/* 0x203 CC - server - show contents */
1430942c5e3cSpl196000 					/* of message buffer */
1431942c5e3cSpl196000 	CC_CLI_SEND_MESSAGE,	/* 0x204 CC - client - send (req) message to */
1432942c5e3cSpl196000 				/* server side */
1433942c5e3cSpl196000 	CC_SRV_SEND_MESSAGE,	/* 0x205 CC - server - send (reply) message */
1434942c5e3cSpl196000 				/* to client side */
1435942c5e3cSpl196000 	CC_CLI_GET_MESSAGE,	/* 0x206 CC - client - read thru read message */
1436942c5e3cSpl196000 				/* buffer */
1437942c5e3cSpl196000 	CC_SRV_GET_MESSAGE,	/* 0x207 CC - server - read thru read message */
1438942c5e3cSpl196000 				/* buffer */
1439942c5e3cSpl196000 	CC_SEND_TEST_MESSAGE,	/* 0x208 CC - send a special subclass message */
1440942c5e3cSpl196000 	CC_GET_BUSINFO,		/* 0x209 CC - get bus info */
1441942c5e3cSpl196000 	CC_GET_PORTINFO,	/* 0x20A CC - get bus,port info */
1442942c5e3cSpl196000 	CC_GET_NAMEINFO,	/* 0x20B CC - get misc info */
1443942c5e3cSpl196000 	CC_GET_CONFIGINFO,	/* 0x20C CC - get misc info */
1444942c5e3cSpl196000 	CQ_QUORUM_OP = 0x300,	/* 0x300 CQ - quorum messages */
1445942c5e3cSpl196000 
1446942c5e3cSpl196000 	/* last command */
1447942c5e3cSpl196000 	CL_LAST_COMMAND		/* used for bounds checking */
1448942c5e3cSpl196000 } AAC_CLCommand;
1449942c5e3cSpl196000 
1450942c5e3cSpl196000 /*
1451942c5e3cSpl196000  * Disk IOCTL Functions
1452942c5e3cSpl196000  */
1453942c5e3cSpl196000 #define	Reserved_IOCTL			0x0000
1454942c5e3cSpl196000 #define	GetDeviceHandle			0x0001
1455942c5e3cSpl196000 #define	BusTargetLun_to_DeviceHandle	0x0002
1456942c5e3cSpl196000 #define	DeviceHandle_to_BusTargetLun	0x0003
1457942c5e3cSpl196000 #define	RescanBus			0x0004
1458942c5e3cSpl196000 #define	GetDeviceProbeInfo		0x0005
1459942c5e3cSpl196000 #define	GetDeviceCapacity		0x0006
1460942c5e3cSpl196000 #define	GetContainerProbeInfo		0x0007	/* Container, not diskclass */
1461942c5e3cSpl196000 						/* ioctl */
1462942c5e3cSpl196000 #define	GetRequestedMemorySize		0x0008
1463942c5e3cSpl196000 #define	GetBusInfo			0x0009
1464942c5e3cSpl196000 #define	GetVendorSpecific		0x000a
1465942c5e3cSpl196000 
1466942c5e3cSpl196000 #define	EnhancedGetDeviceProbeInfo	0x000b
1467942c5e3cSpl196000 #define	EnhancedGetBusInfo		0x000c
1468942c5e3cSpl196000 
1469942c5e3cSpl196000 #define	SetupExtendedCounters		0x000d
1470942c5e3cSpl196000 #define	GetPerformanceCounters		0x000f
1471942c5e3cSpl196000 #define	ResetPerformanceCounters	0x0010
1472942c5e3cSpl196000 #define	ReadModePage			0x0011
1473942c5e3cSpl196000 #define	WriteModePage			0x0012
1474942c5e3cSpl196000 #define	ReadDriveParameter		0x0013
1475942c5e3cSpl196000 #define	WriteDriveParameter		0x0014
1476942c5e3cSpl196000 #define	ResetAdapter			0x0015
1477942c5e3cSpl196000 #define	ResetBus			0x0016
1478942c5e3cSpl196000 #define	ResetBusDevice			0x0017
1479942c5e3cSpl196000 #define	ExecuteSrb			0x0018
1480942c5e3cSpl196000 
1481942c5e3cSpl196000 #define	Create_IO_Task			0x0030
1482942c5e3cSpl196000 #define	Delete_IO_Task			0x0031
1483942c5e3cSpl196000 #define	Get_IO_Task_Info		0x0032
1484942c5e3cSpl196000 #define	Check_Task_Progress		0x0033
1485942c5e3cSpl196000 
1486942c5e3cSpl196000 #define	InjectError			0x0040
1487942c5e3cSpl196000 #define	GetDeviceDefectCounts		0x0041
1488942c5e3cSpl196000 #define	GetDeviceDefectInfo		0x0042
1489942c5e3cSpl196000 #define	GetDeviceStatus			0x0043
1490942c5e3cSpl196000 #define	ClearDeviceStatus		0x0044
1491942c5e3cSpl196000 #define	DiskSpinControl			0x0045
1492942c5e3cSpl196000 #define	DiskSmartControl		0x0046
1493942c5e3cSpl196000 #define	WriteSame			0x0047
1494942c5e3cSpl196000 #define	ReadWriteLong			0x0048
1495942c5e3cSpl196000 #define	FormatUnit			0x0049
1496942c5e3cSpl196000 
1497942c5e3cSpl196000 #define	TargetDeviceControl		0x0050
1498942c5e3cSpl196000 #define	TargetChannelControl		0x0051
1499942c5e3cSpl196000 
1500942c5e3cSpl196000 #define	FlashNewCode			0x0052
1501942c5e3cSpl196000 #define	DiskCheck			0x0053
1502942c5e3cSpl196000 #define	RequestSense			0x0054
1503942c5e3cSpl196000 #define	DiskPERControl			0x0055
1504942c5e3cSpl196000 #define	Read10				0x0056
1505942c5e3cSpl196000 #define	Write10				0x0057
1506942c5e3cSpl196000 
1507942c5e3cSpl196000 /*
1508942c5e3cSpl196000  * The following definitions come from Adaptec:
1509942c5e3cSpl196000  *
1510942c5e3cSpl196000  * SRB is required for the new management tools
1511942c5e3cSpl196000  * and non-DASD support.
1512942c5e3cSpl196000  */
1513942c5e3cSpl196000 struct aac_srb
1514942c5e3cSpl196000 {
1515942c5e3cSpl196000 	uint32_t function;
1516942c5e3cSpl196000 	uint32_t channel;
1517942c5e3cSpl196000 	uint32_t id;
1518942c5e3cSpl196000 	uint32_t lun;
1519942c5e3cSpl196000 	uint32_t timeout;	/* timeout in sec. */
1520942c5e3cSpl196000 	uint32_t flags;
1521942c5e3cSpl196000 	uint32_t count;		/* data xfer size */
1522942c5e3cSpl196000 	uint32_t retry_limit;	/* obsolete */
1523942c5e3cSpl196000 	uint32_t cdb_size;
1524942c5e3cSpl196000 	uint8_t cdb[16];
1525942c5e3cSpl196000 	struct aac_sg_table sg;
1526942c5e3cSpl196000 };
1527942c5e3cSpl196000 
1528942c5e3cSpl196000 #define	AAC_SENSE_BUFFERSIZE	 30
1529942c5e3cSpl196000 
1530942c5e3cSpl196000 struct aac_srb_reply
1531942c5e3cSpl196000 {
1532942c5e3cSpl196000 	uint32_t status;
1533942c5e3cSpl196000 	uint32_t srb_status;
1534942c5e3cSpl196000 	uint32_t scsi_status;
1535942c5e3cSpl196000 	uint32_t data_xfer_length;
1536942c5e3cSpl196000 	uint32_t sense_data_size;
153758bc78c7SXin Chen 	uint8_t sense_data[AAC_SENSE_BUFFERSIZE];
1538942c5e3cSpl196000 };
1539942c5e3cSpl196000 
1540942c5e3cSpl196000 /*
1541942c5e3cSpl196000  * SRB Flags
1542942c5e3cSpl196000  */
1543942c5e3cSpl196000 #define	SRB_NoDataXfer			0x0000
1544942c5e3cSpl196000 #define	SRB_DisableDisconnect		0x0004
1545942c5e3cSpl196000 #define	SRB_DisableSynchTransfer	0x0008
1546942c5e3cSpl196000 #define	SRB_BypassFrozenQueue		0x0010
1547942c5e3cSpl196000 #define	SRB_DisableAutosense		0x0020
1548942c5e3cSpl196000 #define	SRB_DataIn			0x0040
1549942c5e3cSpl196000 #define	SRB_DataOut			0x0080
1550942c5e3cSpl196000 
1551942c5e3cSpl196000 /*
1552942c5e3cSpl196000  * SRB Functions - set in aac_srb->function
1553942c5e3cSpl196000  */
1554942c5e3cSpl196000 #define	SRBF_ExecuteScsi		0x0000
1555942c5e3cSpl196000 #define	SRBF_ClaimDevice		0x0001
1556942c5e3cSpl196000 #define	SRBF_IO_Control			0x0002
1557942c5e3cSpl196000 #define	SRBF_ReceiveEvent		0x0003
1558942c5e3cSpl196000 #define	SRBF_ReleaseQueue		0x0004
1559942c5e3cSpl196000 #define	SRBF_AttachDevice		0x0005
1560942c5e3cSpl196000 #define	SRBF_ReleaseDevice		0x0006
1561942c5e3cSpl196000 #define	SRBF_Shutdown			0x0007
1562942c5e3cSpl196000 #define	SRBF_Flush			0x0008
1563942c5e3cSpl196000 #define	SRBF_AbortCommand		0x0010
1564942c5e3cSpl196000 #define	SRBF_ReleaseRecovery		0x0011
1565942c5e3cSpl196000 #define	SRBF_ResetBus			0x0012
1566942c5e3cSpl196000 #define	SRBF_ResetDevice		0x0013
1567942c5e3cSpl196000 #define	SRBF_TerminateIO		0x0014
1568942c5e3cSpl196000 #define	SRBF_FlushQueue			0x0015
1569942c5e3cSpl196000 #define	SRBF_RemoveDevice		0x0016
1570942c5e3cSpl196000 #define	SRBF_DomainValidation		0x0017
1571942c5e3cSpl196000 
1572942c5e3cSpl196000 /*
1573942c5e3cSpl196000  * SRB SCSI Status
1574942c5e3cSpl196000  * Status codes for SCSI passthrough commands,
1575942c5e3cSpl196000  * set in aac_srb->scsi_status
1576942c5e3cSpl196000  */
1577942c5e3cSpl196000 #define	SRB_STATUS_PENDING			0x00
1578942c5e3cSpl196000 #define	SRB_STATUS_SUCCESS			0x01
1579942c5e3cSpl196000 #define	SRB_STATUS_ABORTED			0x02
1580942c5e3cSpl196000 #define	SRB_STATUS_ABORT_FAILED			0x03
1581942c5e3cSpl196000 #define	SRB_STATUS_ERROR			0x04
1582942c5e3cSpl196000 #define	SRB_STATUS_BUSY				0x05
1583942c5e3cSpl196000 #define	SRB_STATUS_INVALID_REQUEST		0x06
1584942c5e3cSpl196000 #define	SRB_STATUS_INVALID_PATH_ID		0x07
1585942c5e3cSpl196000 #define	SRB_STATUS_NO_DEVICE			0x08
1586942c5e3cSpl196000 #define	SRB_STATUS_TIMEOUT			0x09
1587942c5e3cSpl196000 #define	SRB_STATUS_SELECTION_TIMEOUT		0x0A
1588942c5e3cSpl196000 #define	SRB_STATUS_COMMAND_TIMEOUT		0x0B
1589942c5e3cSpl196000 #define	SRB_STATUS_MESSAGE_REJECTED		0x0D
1590942c5e3cSpl196000 #define	SRB_STATUS_BUS_RESET			0x0E
1591942c5e3cSpl196000 #define	SRB_STATUS_PARITY_ERROR			0x0F
1592942c5e3cSpl196000 #define	SRB_STATUS_REQUEST_SENSE_FAILED		0x10
1593942c5e3cSpl196000 #define	SRB_STATUS_NO_HBA			0x11
1594942c5e3cSpl196000 #define	SRB_STATUS_DATA_OVERRUN			0x12
1595942c5e3cSpl196000 #define	SRB_STATUS_UNEXPECTED_BUS_FREE		0x13
1596942c5e3cSpl196000 #define	SRB_STATUS_PHASE_SEQUENCE_FAILURE	0x14
1597942c5e3cSpl196000 #define	SRB_STATUS_BAD_SRB_BLOCK_LENGTH		0x15
1598942c5e3cSpl196000 #define	SRB_STATUS_REQUEST_FLUSHED		0x16
1599942c5e3cSpl196000 #define	SRB_STATUS_DELAYED_RETRY		0x17
1600942c5e3cSpl196000 #define	SRB_STATUS_INVALID_LUN			0x20
1601942c5e3cSpl196000 #define	SRB_STATUS_INVALID_TARGET_ID		0x21
1602942c5e3cSpl196000 #define	SRB_STATUS_BAD_FUNCTION			0x22
1603942c5e3cSpl196000 #define	SRB_STATUS_ERROR_RECOVERY		0x23
1604942c5e3cSpl196000 #define	SRB_STATUS_NOT_STARTED			0x24
1605942c5e3cSpl196000 #define	SRB_STATUS_NOT_IN_USE			0x30
1606942c5e3cSpl196000 #define	SRB_STATUS_FORCE_ABORT			0x31
1607942c5e3cSpl196000 #define	SRB_STATUS_DOMAIN_VALIDATION_FAIL	0x32
1608942c5e3cSpl196000 
1609942c5e3cSpl196000 #pragma	pack()
1610942c5e3cSpl196000 
1611942c5e3cSpl196000 /*
1612942c5e3cSpl196000  * Aligned structure definition for variable declarations that require
1613942c5e3cSpl196000  * alignment.
1614942c5e3cSpl196000  */
1615942c5e3cSpl196000 union aac_fib_align {
1616942c5e3cSpl196000 	struct aac_fib d;
1617942c5e3cSpl196000 	uint32_t dumb;
1618942c5e3cSpl196000 };
1619942c5e3cSpl196000 
1620942c5e3cSpl196000 /* AAC Communication Space */
1621942c5e3cSpl196000 struct aac_comm_space {
1622942c5e3cSpl196000 	struct aac_fib adapter_fibs[AAC_ADAPTER_FIBS];
1623942c5e3cSpl196000 	struct aac_adapter_init init_data;
1624942c5e3cSpl196000 	struct aac_queue_table qtable;
1625942c5e3cSpl196000 	char qt_align_pad[AAC_QUEUE_ALIGN];
1626942c5e3cSpl196000 	char adapter_print_buf[AAC_ADAPTER_PRINT_BUFSIZE];
1627942c5e3cSpl196000 };
1628942c5e3cSpl196000 
1629942c5e3cSpl196000 #ifdef	__cplusplus
1630942c5e3cSpl196000 }
1631942c5e3cSpl196000 #endif
1632942c5e3cSpl196000 
1633942c5e3cSpl196000 #endif /* __AAC_REGS_H__ */
1634