aacreg.h revision 82527
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 82527 2001-08-29 23:34:05Z scottl $
30 */
31
32/*
33 * Data structures defining the interface between the driver and the Adaptec
34 * 'FSA' adapters.  Note that many field names and comments here are taken
35 * verbatim from the Adaptec driver source in order to make comparing the
36 * two slightly easier.
37 */
38
39/******************************************************************************
40 * Misc. magic numbers.
41 */
42#define AAC_MAX_CONTAINERS	64
43#define AAC_BLOCK_SIZE		512
44
45/******************************************************************************
46 * Communications interface.
47 *
48 * Where datastructure layouts are closely parallel to the Adaptec sample code,
49 * retain their naming conventions (for now) to aid in cross-referencing.
50 */
51
52/*
53 * We establish 4 command queues and matching response queues.  Queues must
54 * be 16-byte aligned, and are sized as follows:
55 */
56#define AAC_HOST_NORM_CMD_ENTRIES	8	/* command adapter->host,
57						 * normal priority */
58#define AAC_HOST_HIGH_CMD_ENTRIES	4	/* command adapter->host,
59						 * high priority */
60#define AAC_ADAP_NORM_CMD_ENTRIES	512	/* command host->adapter,
61						 * normal priority */
62#define AAC_ADAP_HIGH_CMD_ENTRIES	4	/* command host->adapter,
63						 * high priority */
64#define AAC_HOST_NORM_RESP_ENTRIES	512	/* response, adapter->host,
65						 * normal priority */
66#define AAC_HOST_HIGH_RESP_ENTRIES	4	/* response, adapter->host,
67						 * high priority */
68#define AAC_ADAP_NORM_RESP_ENTRIES	8	/* response, host->adapter,
69						 * normal priority */
70#define AAC_ADAP_HIGH_RESP_ENTRIES	4	/* response, host->adapter,
71						 * high priority */
72
73#define AAC_TOTALQ_LENGTH	(AAC_HOST_HIGH_CMD_ENTRIES +	\
74				 AAC_HOST_NORM_CMD_ENTRIES +	\
75				 AAC_ADAP_HIGH_CMD_ENTRIES +	\
76				 AAC_ADAP_NORM_CMD_ENTRIES +	\
77				 AAC_HOST_HIGH_RESP_ENTRIES +	\
78				 AAC_HOST_NORM_RESP_ENTRIES +	\
79				 AAC_ADAP_HIGH_RESP_ENTRIES +	\
80				 AAC_ADAP_NORM_RESP_ENTRIES)
81#define AAC_QUEUE_COUNT		8
82#define AAC_QUEUE_ALIGN		16
83
84struct aac_queue_entry {
85    u_int32_t	aq_fib_size;		/* FIB size in bytes */
86    u_int32_t	aq_fib_addr;		/* receiver-space address of the FIB */
87} __attribute__ ((packed));
88
89#define AAC_PRODUCER_INDEX	0
90#define AAC_CONSUMER_INDEX	1
91
92/*
93 * Table of queue indices and queues used to communicate with the
94 * controller.  This structure must be aligned to AAC_QUEUE_ALIGN
95 */
96struct aac_queue_table {
97    /* queue consumer/producer indexes (layout mandated by adapter) */
98    u_int32_t			qt_qindex[AAC_QUEUE_COUNT][2];
99
100    /* queue entry structures (layout mandated by adapter) */
101    struct aac_queue_entry     qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES];
102    struct aac_queue_entry     qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES];
103    struct aac_queue_entry     qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES];
104    struct aac_queue_entry     qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES];
105    struct aac_queue_entry     qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES];
106    struct aac_queue_entry     qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES];
107    struct aac_queue_entry     qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES];
108    struct aac_queue_entry     qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES];
109} __attribute__ ((packed));
110
111/*
112 * Queue names
113 *
114 * Note that we base these at 0 in order to use them as array indices.  Adaptec
115 * used base 1 for some unknown reason, and sorted them in a different order.
116 */
117#define AAC_HOST_NORM_CMD_QUEUE		0
118#define AAC_HOST_HIGH_CMD_QUEUE		1
119#define AAC_ADAP_NORM_CMD_QUEUE		2
120#define AAC_ADAP_HIGH_CMD_QUEUE		3
121#define AAC_HOST_NORM_RESP_QUEUE	4
122#define AAC_HOST_HIGH_RESP_QUEUE	5
123#define AAC_ADAP_NORM_RESP_QUEUE	6
124#define AAC_ADAP_HIGH_RESP_QUEUE	7
125
126/*
127 * List structure used to chain FIBs (used by the adapter - we hang FIBs off
128 * our private command structure and don't touch these)
129 */
130struct aac_fib_list_entry {
131    struct fib_list_entry	*Flink;
132    struct fib_list_entry	*Blink;
133} __attribute__ ((packed));
134
135/*
136 * FIB (FSA Interface Block?); this is the datastructure passed between the host
137 * and adapter.
138 */
139struct aac_fib_header {
140    u_int32_t		XferState;
141    u_int16_t		Command;
142    u_int8_t		StructType;
143    u_int8_t		Flags;
144    u_int16_t		Size;
145    u_int16_t		SenderSize;
146    u_int32_t		SenderFibAddress;
147    u_int32_t		ReceiverFibAddress;
148    u_int32_t		SenderData;
149    union {
150	struct {
151	    u_int32_t	ReceiverTimeStart;
152	    u_int32_t	ReceiverTimeDone;
153	} _s;
154	struct aac_fib_list_entry FibLinks;
155    } _u;
156} __attribute__ ((packed));
157
158#define AAC_FIB_DATASIZE	(512 - sizeof(struct aac_fib_header))
159
160struct aac_fib {
161    struct aac_fib_header	Header;
162    u_int8_t			data[AAC_FIB_DATASIZE];
163} __attribute__ ((packed));
164
165/*
166 * FIB commands
167 */
168typedef enum {
169    TestCommandResponse =		1,
170    TestAdapterCommand =		2,
171
172    /* lowlevel and comm commands */
173    LastTestCommand =			100,
174    ReinitHostNormCommandQueue =	101,
175    ReinitHostHighCommandQueue =	102,
176    ReinitHostHighRespQueue =		103,
177    ReinitHostNormRespQueue =		104,
178    ReinitAdapNormCommandQueue =	105,
179    ReinitAdapHighCommandQueue =	107,
180    ReinitAdapHighRespQueue =		108,
181    ReinitAdapNormRespQueue =		109,
182    InterfaceShutdown =			110,
183    DmaCommandFib =			120,
184    StartProfile =			121,
185    TermProfile =			122,
186    SpeedTest =				123,
187    TakeABreakPt =			124,
188    RequestPerfData =			125,
189    SetInterruptDefTimer=		126,
190    SetInterruptDefCount=		127,
191    GetInterruptDefStatus=		128,
192    LastCommCommand =			129,
193
194    /* filesystem commands */
195    NuFileSystem =			300,
196    UFS =				301,
197    HostFileSystem =			302,
198    LastFileSystemCommand =		303,
199
200    /* Container Commands */
201    ContainerCommand =			500,
202    ContainerCommand64 =		501,
203
204    /* Cluster Commands */
205    ClusterCommand =			550,
206
207    /* Scsi Port commands (scsi passthrough) */
208    ScsiPortCommand =			600,
209
210    /* misc house keeping and generic adapter initiated commands */
211    AifRequest =			700,
212    CheckRevision =			701,
213    FsaHostShutdown =			702,
214    RequestAdapterInfo =		703,
215    IsAdapterPaused =			704,
216    SendHostTime =			705,
217    LastMiscCommand =			706
218} AAC_FibCommands;
219
220/*
221 * FIB types
222 */
223#define AAC_FIBTYPE_TFIB	1
224#define AAC_FIBTYPE_TQE		2
225#define AAC_FIBTYPE_TCTPERF	3
226
227/*
228 * FIB transfer state
229 */
230#define AAC_FIBSTATE_HOSTOWNED		(1<<0)	/* owned by the host */
231#define AAC_FIBSTATE_ADAPTEROWNED	(1<<1)	/* owned by the adapter */
232#define AAC_FIBSTATE_INITIALISED	(1<<2)	/* initialised */
233#define AAC_FIBSTATE_EMPTY		(1<<3)	/* empty */
234#define AAC_FIBSTATE_FROMPOOL		(1<<4)	/* allocated from pool */
235#define AAC_FIBSTATE_FROMHOST		(1<<5)	/* sent from the host */
236#define AAC_FIBSTATE_FROMADAP		(1<<6)	/* sent from the adapter */
237#define AAC_FIBSTATE_REXPECTED		(1<<7)	/* response is expected */
238#define AAC_FIBSTATE_RNOTEXPECTED	(1<<8)	/* response is not expected */
239#define AAC_FIBSTATE_DONEADAP		(1<<9)	/* processed by the adapter */
240#define AAC_FIBSTATE_DONEHOST		(1<<10)	/* processed by the host */
241#define AAC_FIBSTATE_HIGH		(1<<11)	/* high priority */
242#define AAC_FIBSTATE_NORM		(1<<12)	/* normal priority */
243#define AAC_FIBSTATE_ASYNC		(1<<13)
244#define AAC_FIBSTATE_ASYNCIO		(1<<13)	/* to be removed */
245#define AAC_FIBSTATE_PAGEFILEIO		(1<<14)	/* to be removed */
246#define AAC_FIBSTATE_SHUTDOWN		(1<<15)
247#define AAC_FIBSTATE_LAZYWRITE		(1<<16)	/* to be removed */
248#define AAC_FIBSTATE_ADAPMICROFIB	(1<<17)
249#define AAC_FIBSTATE_BIOSFIB		(1<<18)
250#define AAC_FIBSTATE_FAST_RESPONSE	(1<<19)	/* fast response capable */
251#define AAC_FIBSTATE_APIFIB		(1<<20)
252
253/*
254 * FIB error values
255 */
256#define AAC_ERROR_NORMAL			0x00
257#define AAC_ERROR_PENDING			0x01
258#define AAC_ERROR_FATAL				0x02
259#define AAC_ERROR_INVALID_QUEUE			0x03
260#define AAC_ERROR_NOENTRIES			0x04
261#define AAC_ERROR_SENDFAILED			0x05
262#define AAC_ERROR_INVALID_QUEUE_PRIORITY	0x06
263#define AAC_ERROR_FIB_ALLOCATION_FAILED		0x07
264#define AAC_ERROR_FIB_DEALLOCATION_FAILED	0x08
265
266/*
267 * Adapter Init Structure: this is passed to the adapter with the
268 * AAC_MONKER_INITSTRUCT command to point it at our control structures.
269 */
270struct aac_adapter_init {
271    u_int32_t	InitStructRevision;
272#define AAC_INIT_STRUCT_REVISION	3
273    u_int32_t	MiniPortRevision;
274    u_int32_t	FilesystemRevision;
275    u_int32_t	CommHeaderAddress;
276    u_int32_t	FastIoCommAreaAddress;
277    u_int32_t	AdapterFibsPhysicalAddress;
278    void	*AdapterFibsVirtualAddress;
279    u_int32_t	AdapterFibsSize;
280    u_int32_t	AdapterFibAlign;
281    u_int32_t	PrintfBufferAddress;
282    u_int32_t	PrintfBufferSize;
283    u_int32_t	HostPhysMemPages;
284    u_int32_t	HostElapsedSeconds;
285} __attribute__ ((packed));
286
287/******************************************************************************
288 * Shared data types
289 */
290/*
291 * Container types
292 */
293typedef enum {
294    CT_NONE = 0,
295    CT_VOLUME,
296    CT_MIRROR,
297    CT_STRIPE,
298    CT_RAID5,
299    CT_SSRW,
300    CT_SSRO,
301    CT_MORPH,
302    CT_PASSTHRU,
303    CT_RAID4,
304    CT_RAID10,                  /* stripe of mirror */
305    CT_RAID00,                  /* stripe of stripe */
306    CT_VOLUME_OF_MIRRORS,       /* volume of mirror */
307    CT_PSEUDO_RAID3,            /* really raid4 */
308} AAC_FSAVolType;
309
310/*
311 * Host-addressable object types
312 */
313typedef enum {
314    FT_REG = 1,     /* regular file */
315    FT_DIR,         /* directory */
316    FT_BLK,         /* "block" device - reserved */
317    FT_CHR,         /* "character special" device - reserved */
318    FT_LNK,         /* symbolic link */
319    FT_SOCK,        /* socket */
320    FT_FIFO,        /* fifo */
321    FT_FILESYS,     /* ADAPTEC's "FSA"(tm) filesystem */
322    FT_DRIVE,       /* physical disk - addressable in scsi by bus/target/lun */
323    FT_SLICE,       /* virtual disk - raw volume - slice */
324    FT_PARTITION,   /* FSA partition - carved out of a slice - building block
325		     * for containers */
326    FT_VOLUME,      /* Container - Volume Set */
327    FT_STRIPE,      /* Container - Stripe Set */
328    FT_MIRROR,      /* Container - Mirror Set */
329    FT_RAID5,       /* Container - Raid 5 Set */
330    FT_DATABASE     /* Storage object with "foreign" content manager */
331} AAC_FType;
332
333/*
334 * Host-side scatter/gather list for 32-bit commands.
335 */
336struct aac_sg_entry {
337    u_int32_t	SgAddress;
338    u_int32_t	SgByteCount;
339} __attribute__ ((packed));
340
341struct aac_sg_table {
342    u_int32_t		SgCount;
343    struct aac_sg_entry	SgEntry[0];
344} __attribute__ ((packed));
345
346/*
347 * Host-side scatter/gather list for 64-bit commands.
348 */
349struct aac_sg_table64 {
350    u_int8_t	SgCount;
351    u_int8_t	SgSectorsPerPage;
352    u_int16_t	SgByteOffset;
353    u_int64_t	SgEntry[0];
354} __attribute__ ((packed));
355
356/*
357 * Container creation data
358 */
359struct aac_container_creation {
360    u_int8_t	ViaBuildNumber;
361    u_int8_t	MicroSecond;
362    u_int8_t	Via;		/* 1 = FSU, 2 = API, etc. */
363    u_int8_t	YearsSince1900;
364    u_int32_t	Month:4;	/* 1-12 */
365    u_int32_t	Day:6;		/* 1-32 */
366    u_int32_t	Hour:6;		/* 0-23 */
367    u_int32_t	Minute:6;	/* 0-59 */
368    u_int32_t	Second:6;	/* 0-59 */
369    u_int64_t	ViaAdapterSerialNumber;
370} __attribute__ ((packed));
371
372/******************************************************************************
373 * Revision number handling
374 */
375
376typedef enum {
377    RevApplication = 1,
378    RevDkiCli,
379    RevNetService,
380    RevApi,
381    RevFileSysDriver,
382    RevMiniportDriver,
383    RevAdapterSW,
384    RevMonitor,
385    RevRemoteApi
386} RevComponent;
387
388struct FsaRevision {
389    union {
390        struct {
391            u_int8_t	dash;
392            u_int8_t	type;
393            u_int8_t	minor;
394            u_int8_t	major;
395        } comp;
396        u_int32_t	ul;
397    } external;
398    u_int32_t	buildNumber;
399}  __attribute__ ((packed));
400
401/******************************************************************************
402 * Adapter Information
403 */
404
405typedef enum {
406    CPU_NTSIM = 1,
407    CPU_I960,
408    CPU_ARM,
409    CPU_SPARC,
410    CPU_POWERPC,
411    CPU_ALPHA,
412    CPU_P7,
413    CPU_I960_RX,
414    CPU__last
415} AAC_CpuType;
416
417typedef enum {
418    CPUI960_JX = 1,
419    CPUI960_CX,
420    CPUI960_HX,
421    CPUI960_RX,
422    CPUARM_SA110,
423    CPUARM_xxx,
424    CPUPPC_603e,
425    CPUPPC_xxx,
426    CPUSUBTYPE__last
427} AAC_CpuSubType;
428
429typedef enum {
430    PLAT_NTSIM = 1,
431    PLAT_V3ADU,
432    PLAT_CYCLONE,
433    PLAT_CYCLONE_HD,
434    PLAT_BATBOARD,
435    PLAT_BATBOARD_HD,
436    PLAT_YOLO,
437    PLAT_COBRA,
438    PLAT_ANAHEIM,
439    PLAT_JALAPENO,
440    PLAT_QUEENS,
441    PLAT_JALAPENO_DELL,
442    PLAT_POBLANO,
443    PLAT_POBLANO_OPAL,
444    PLAT_POBLANO_SL0,
445    PLAT_POBLANO_SL1,
446    PLAT_POBLANO_SL2,
447    PLAT_POBLANO_XXX,
448    PLAT_JALAPENO_P2,
449    PLAT_HABANERO,
450    PLAT__last
451} AAC_Platform;
452
453typedef enum {
454    OEM_FLAVOR_ADAPTEC = 1,
455    OEM_FLAVOR_DELL,
456    OEM_FLAVOR_HP,
457    OEM_FLAVOR_IBM,
458    OEM_FLAVOR_CPQ,
459    OEM_FLAVOR_BRAND_X,
460    OEM_FLAVOR_BRAND_Y,
461    OEM_FLAVOR_BRAND_Z,
462    OEM_FLAVOR__last
463} AAC_OemFlavor;
464
465/*
466 * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
467 */
468typedef enum
469{
470    PLATFORM_BAT_REQ_PRESENT = 1,	/* BATTERY REQUIRED AND PRESENT */
471    PLATFORM_BAT_REQ_NOTPRESENT,	/* BATTERY REQUIRED AND NOT PRESENT */
472    PLATFORM_BAT_OPT_PRESENT,		/* BATTERY OPTIONAL AND PRESENT */
473    PLATFORM_BAT_OPT_NOTPRESENT,	/* BATTERY OPTIONAL AND NOT PRESENT */
474    PLATFORM_BAT_NOT_SUPPORTED		/* BATTERY NOT SUPPORTED */
475} AAC_BatteryPlatform;
476
477/*
478 * options supported by this board
479 * there has to be a one to one mapping of these defines and the ones in
480 * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT
481 */
482#define AAC_SUPPORTED_SNAPSHOT		0x01
483#define AAC_SUPPORTED_CLUSTERS		0x02
484#define AAC_SUPPORTED_WRITE_CACHE	0x04
485#define AAC_SUPPORTED_64BIT_DATA	0x08
486#define AAC_SUPPORTED_HOST_TIME_FIB	0x10
487#define AAC_SUPPORTED_RAID50		0x20
488
489/*
490 * Structure used to respond to a RequestAdapterInfo fib.
491 */
492struct aac_adapter_info {
493    AAC_Platform	PlatformBase;    /* adapter type */
494    AAC_CpuType		CpuArchitecture; /* adapter CPU type */
495    AAC_CpuSubType	CpuVariant;      /* adapter CPU subtype */
496    u_int32_t		ClockSpeed;      /* adapter CPU clockspeed */
497    u_int32_t		ExecutionMem;    /* adapter Execution Memory size */
498    u_int32_t		BufferMem;       /* adapter Data Memory */
499    u_int32_t		TotalMem;        /* adapter Total Memory */
500    struct FsaRevision	KernelRevision;  /* adapter Kernel Software Revision */
501    struct FsaRevision	MonitorRevision; /* adapter Monitor/Diagnostic
502					  * Software Revision */
503    struct FsaRevision	HardwareRevision;/* TBD */
504    struct FsaRevision	BIOSRevision;    /* adapter BIOS Revision */
505    u_int32_t		ClusteringEnabled;
506    u_int32_t		ClusterChannelMask;
507    u_int64_t		SerialNumber;
508    AAC_BatteryPlatform	batteryPlatform;
509    u_int32_t		SupportedOptions; /* supported features of this
510					   * controller */
511    AAC_OemFlavor	OemVariant;
512} __attribute__ ((packed));
513
514/******************************************************************************
515 * Monitor/Kernel interface.
516 */
517
518/*
519 * Synchronous commands to the monitor/kernel.
520 */
521#define AAC_MONKER_INITSTRUCT	0x05
522#define AAC_MONKER_SYNCFIB	0x0c
523
524/*
525 *  Adapter Status Register
526 *
527 *  Phase Staus mailbox is 32bits:
528 *  <31:16> = Phase Status
529 *  <15:0>  = Phase
530 *
531 *  The adapter reports its present state through the phase.  Only
532 *  a single phase should be ever be set.  Each phase can have multiple
533 *  phase status bits to provide more detailed information about the
534 *  state of the adapter.
535 */
536#define AAC_SELF_TEST_FAILED	0x00000004
537#define AAC_UP_AND_RUNNING	0x00000080
538#define AAC_KERNEL_PANIC	0x00000100
539
540/******************************************************************************
541 * Data types relating to control and monitoring of the NVRAM/WriteCache
542 * subsystem.
543 */
544
545#define AAC_NFILESYS	24	/* maximum number of filesystems */
546
547/*
548 * NVRAM/Write Cache subsystem states
549 */
550typedef enum {
551    NVSTATUS_DISABLED = 0,	/* present, clean, not being used */
552    NVSTATUS_ENABLED,		/* present, possibly dirty, ready for use */
553    NVSTATUS_ERROR,		/* present, dirty, contains dirty data */
554    /* for bad/missing device */
555    NVSTATUS_BATTERY,		/* present, bad or low battery, may contain dirty data */
556    /* for bad/missing device */
557    NVSTATUS_UNKNOWN
558} AAC_NVSTATUS;
559
560/*
561 * NVRAM/Write Cache subsystem battery component states
562 *
563 */
564typedef enum {
565    NVBATTSTATUS_NONE = 0,	/* battery has no power or is not present */
566    NVBATTSTATUS_LOW,		/* battery is low on power */
567    NVBATTSTATUS_OK,		/* battery is okay - normal operation possible only in this state */
568    NVBATTSTATUS_RECONDITIONING	/* no battery present - reconditioning in process */
569} AAC_NVBATTSTATUS;
570
571/*
572 * Battery transition type
573 */
574typedef enum {
575    NVBATT_TRANSITION_NONE = 0,	/* battery now has no power or is not present */
576    NVBATT_TRANSITION_LOW,	/* battery is now low on power */
577    NVBATT_TRANSITION_OK	/* battery is now okay - normal operation possible only in this state */
578} AAC_NVBATT_TRANSITION;
579
580/*
581 * NVRAM Info structure returned for NVRAM_GetInfo call
582 */
583struct aac_nvramdevinfo {
584    u_int32_t	NV_Enabled;	/* write caching enabled */
585    u_int32_t	NV_Error;	/* device in error state */
586    u_int32_t	NV_NDirty;	/* count of dirty NVRAM buffers */
587    u_int32_t	NV_NActive;	/* count of NVRAM buffers being written */
588} __attribute__ ((packed));
589
590struct aac_nvraminfo {
591    AAC_NVSTATUS		NV_Status;	/* nvram subsystem status */
592    AAC_NVBATTSTATUS		NV_BattStatus;	/* battery status */
593    u_int32_t			NV_Size;	/* size of WriteCache NVRAM in
594						 * bytes */
595    u_int32_t			NV_BufSize;	/* size of NVRAM buffers in
596						 * bytes */
597    u_int32_t			NV_NBufs;	/* number of NVRAM buffers */
598    u_int32_t			NV_NDirty;	/* Num dirty NVRAM buffers */
599    u_int32_t			NV_NClean;	/* Num clean NVRAM buffers */
600    u_int32_t			NV_NActive;	/* Num NVRAM buffers being
601						 * written */
602    u_int32_t			NV_NBrokered;	/* Num brokered NVRAM buffers */
603    struct aac_nvramdevinfo	NV_DevInfo[AAC_NFILESYS];	/* per device
604								 * info */
605    u_int32_t			NV_BattNeedsReconditioning;	/* boolean */
606    u_int32_t			NV_TotalSize;	/* size of all non-volatile
607						 * memories in bytes */
608} __attribute__ ((packed));
609
610/******************************************************************************
611 * Data types relating to adapter-initiated FIBs
612 *
613 * Based on types and structures in <aifstruc.h>
614 */
615
616/*
617 * Progress Reports
618 */
619typedef enum {
620    AifJobStsSuccess = 1,
621    AifJobStsFinished,
622    AifJobStsAborted,
623    AifJobStsFailed,
624    AifJobStsLastReportMarker = 100,	/* All before mean last report */
625    AifJobStsSuspended,
626    AifJobStsRunning
627} AAC_AifJobStatus;
628
629typedef enum {
630    AifJobScsiMin = 1,			/* Minimum value for Scsi operation */
631    AifJobScsiZero,			/* SCSI device clear operation */
632    AifJobScsiVerify,			/* SCSI device Verify operation NO
633					 * REPAIR */
634    AifJobScsiExercise,			/* SCSI device Exercise operation */
635    AifJobScsiVerifyRepair,		/* SCSI device Verify operation WITH
636					 * repair */
637    AifJobScsiMax = 99,			/* Max Scsi value */
638    AifJobCtrMin,			/* Min Ctr op value */
639    AifJobCtrZero,			/* Container clear operation */
640    AifJobCtrCopy,			/* Container copy operation */
641    AifJobCtrCreateMirror,		/* Container Create Mirror operation */
642    AifJobCtrMergeMirror,		/* Container Merge Mirror operation */
643    AifJobCtrScrubMirror,		/* Container Scrub Mirror operation */
644    AifJobCtrRebuildRaid5,		/* Container Rebuild Raid5 operation */
645    AifJobCtrScrubRaid5,		/* Container Scrub Raid5 operation */
646    AifJobCtrMorph,			/* Container morph operation */
647    AifJobCtrPartCopy,			/* Container Partition copy operation */
648    AifJobCtrRebuildMirror,		/* Container Rebuild Mirror operation */
649    AifJobCtrCrazyCache,		/* crazy cache */
650    AifJobCtrMax = 199,			/* Max Ctr type operation */
651    AifJobFsMin,			/* Min Fs type operation */
652    AifJobFsCreate,			/* File System Create operation */
653    AifJobFsVerify,			/* File System Verify operation */
654    AifJobFsExtend,			/* File System Extend operation */
655    AifJobFsMax = 299,			/* Max Fs type operation */
656    AifJobApiFormatNTFS,		/* Format a drive to NTFS */
657    AifJobApiFormatFAT,			/* Format a drive to FAT */
658    AifJobApiUpdateSnapshot,		/* update the read/write half of a
659					 * snapshot */
660    AifJobApiFormatFAT32,		/* Format a drive to FAT32 */
661    AifJobApiMax = 399,			/* Max API type operation */
662    AifJobCtlContinuousCtrVerify,	/* Adapter operation */
663    AifJobCtlMax = 499			/* Max Adapter type operation */
664} AAC_AifJobType;
665
666struct aac_AifContainers {
667    u_int32_t	src;			/* from/master */
668    u_int32_t	dst;			/* to/slave */
669} __attribute__ ((packed));
670
671union aac_AifJobClient {
672    struct aac_AifContainers	container;	/* For Container and file
673						 * system progress ops; */
674    int32_t			scsi_dh;	/* For SCSI progress ops */
675};
676
677struct aac_AifJobDesc {
678    u_int32_t			jobID;		/* DO NOT FILL IN! Will be
679						 * filled in by AIF */
680    AAC_AifJobType		type;		/* Operation that is being
681						 * performed */
682    union aac_AifJobClient	client;		/* Details */
683} __attribute__ ((packed));
684
685struct aac_AifJobProgressReport {
686    struct aac_AifJobDesc	jd;
687    AAC_AifJobStatus		status;
688    u_int32_t			finalTick;
689    u_int32_t			currentTick;
690    u_int32_t			jobSpecificData1;
691    u_int32_t			jobSpecificData2;
692} __attribute__ ((packed));
693
694/*
695 * Event Notification
696 */
697typedef enum {
698    /* General application notifies start here */
699    AifEnGeneric = 1,			/* Generic notification */
700    AifEnTaskComplete,			/* Task has completed */
701    AifEnConfigChange,			/* Adapter config change occurred */
702    AifEnContainerChange,		/* Adapter specific container
703					 * configuration change */
704    AifEnDeviceFailure,			/* SCSI device failed */
705    AifEnMirrorFailover,		/* Mirror failover started */
706    AifEnContainerEvent,		/* Significant container event */
707    AifEnFileSystemChange,		/* File system changed */
708    AifEnConfigPause,			/* Container pause event */
709    AifEnConfigResume,			/* Container resume event */
710    AifEnFailoverChange,		/* Failover space assignment changed */
711    AifEnRAID5RebuildDone,		/* RAID5 rebuild finished */
712    AifEnEnclosureManagement,		/* Enclosure management event */
713    AifEnBatteryEvent,			/* Significant NV battery event */
714    AifEnAddContainer,			/* A new container was created. */
715    AifEnDeleteContainer,		/* A container was deleted. */
716    AifEnSMARTEvent, 	         	/* SMART Event */
717    AifEnBatteryNeedsRecond,		/* The battery needs reconditioning */
718    AifEnClusterEvent,			/* Some cluster event */
719    AifEnDiskSetEvent,			/* A disk set event occured. */
720    AifDriverNotifyStart=199,		/* Notifies for host driver go here */
721    /* Host driver notifications start here */
722    AifDenMorphComplete, 		/* A morph operation completed */
723    AifDenVolumeExtendComplete 		/* A volume expand operation completed */
724} AAC_AifEventNotifyType;
725
726struct aac_AifEnsGeneric {
727    char	text[132];			/* Generic text */
728} __attribute__ ((packed));
729
730struct aac_AifEnsDeviceFailure {
731    u_int32_t	deviceHandle;		/* SCSI device handle */
732} __attribute__ ((packed));
733
734struct aac_AifEnsMirrorFailover {
735    u_int32_t	container;		/* Container with failed element */
736    u_int32_t	failedSlice;		/* Old slice which failed */
737    u_int32_t	creatingSlice;		/* New slice used for auto-create */
738} __attribute__ ((packed));
739
740struct aac_AifEnsContainerChange {
741    u_int32_t	container[2];		/* container that changed, -1 if no
742					 * container */
743} __attribute__ ((packed));
744
745struct aac_AifEnsContainerEvent {
746    u_int32_t	container;		/* container number  */
747    u_int32_t	eventType;		/* event type */
748} __attribute__ ((packed));
749
750struct aac_AifEnsEnclosureEvent {
751    u_int32_t	empID;			/* enclosure management proc number  */
752    u_int32_t	unitID;			/* unitId, fan id, power supply id,
753					 * slot id, tempsensor id.  */
754    u_int32_t	eventType;		/* event type */
755} __attribute__ ((packed));
756
757struct aac_AifEnsBatteryEvent {
758    AAC_NVBATT_TRANSITION	transition_type;	/* eg from low to ok */
759    AAC_NVBATTSTATUS		current_state;		/* current batt state */
760    AAC_NVBATTSTATUS		prior_state;		/* prev batt state */
761} __attribute__ ((packed));
762
763struct aac_AifEnsDiskSetEvent {
764    u_int32_t	eventType;
765    u_int64_t	DsNum;
766    u_int64_t	CreatorId;
767} __attribute__ ((packed));
768
769typedef enum {
770    CLUSTER_NULL_EVENT = 0,
771    CLUSTER_PARTNER_NAME_EVENT,		/* change in partner hostname or
772					 * adaptername from NULL to non-NULL */
773    /* (partner's agent may be up) */
774    CLUSTER_PARTNER_NULL_NAME_EVENT	/* change in partner hostname or
775					 * adaptername from non-null to NULL */
776    /* (partner has rebooted) */
777} AAC_ClusterAifEvent;
778
779struct aac_AifEnsClusterEvent {
780    AAC_ClusterAifEvent	eventType;
781} __attribute__ ((packed));
782
783struct aac_AifEventNotify {
784    AAC_AifEventNotifyType	type;
785    union {
786	struct aac_AifEnsGeneric		EG;
787	struct aac_AifEnsDeviceFailure		EDF;
788	struct aac_AifEnsMirrorFailover		EMF;
789	struct aac_AifEnsContainerChange	ECC;
790	struct aac_AifEnsContainerEvent		ECE;
791	struct aac_AifEnsEnclosureEvent		EEE;
792	struct aac_AifEnsBatteryEvent		EBE;
793	struct aac_AifEnsDiskSetEvent		EDS;
794/*	struct aac_AifEnsSMARTEvent		ES;*/
795	struct aac_AifEnsClusterEvent		ECLE;
796    } data;
797} __attribute__ ((packed));
798
799/*
800 * Adapter Initiated FIB command structures. Start with the adapter
801 * initiated FIBs that really come from the adapter, and get responded
802 * to by the host.
803 */
804#define AAC_AIF_REPORT_MAX_SIZE 64
805
806typedef enum {
807    AifCmdEventNotify = 1,	/* Notify of event */
808    AifCmdJobProgress,		/* Progress report */
809    AifCmdAPIReport,		/* Report from other user of API */
810    AifCmdDriverNotify,		/* Notify host driver of event */
811    AifReqJobList = 100,	/* Gets back complete job list */
812    AifReqJobsForCtr,		/* Gets back jobs for specific container */
813    AifReqJobsForScsi,		/* Gets back jobs for specific SCSI device */
814    AifReqJobReport,		/* Gets back a specific job report or list */
815    AifReqTerminateJob,		/* Terminates job */
816    AifReqSuspendJob,		/* Suspends a job */
817    AifReqResumeJob,		/* Resumes a job */
818    AifReqSendAPIReport,	/* API generic report requests */
819    AifReqAPIJobStart,		/* Start a job from the API */
820    AifReqAPIJobUpdate,		/* Update a job report from the API */
821    AifReqAPIJobFinish		/* Finish a job from the API */
822} AAC_AifCommand;
823
824struct aac_aif_command {
825    AAC_AifCommand	command;		/* Tell host what type of
826						 * notify this is */
827    u_int32_t		seqNumber;		/* To allow ordering of
828						 * reports (if necessary) */
829    union {
830	struct aac_AifEventNotify	EN;	/* Event notify structure */
831	struct aac_AifJobProgressReport	PR[1];	/* Progress report */
832	u_int8_t			AR[AAC_AIF_REPORT_MAX_SIZE];
833    } data;
834} __attribute__ ((packed));
835
836/******************************************************************************
837 * Filesystem commands/data
838 *
839 * The adapter has a very complex filesystem interface, most of which we ignore.
840 * (And which seems not to be implemented, anyway.)
841 */
842
843/*
844 * FSA commands
845 * (not used?)
846 */
847typedef enum {
848    Null = 0,
849    GetAttributes,
850    SetAttributes,
851    Lookup,
852    ReadLink,
853    Read,
854    Write,
855    Create,
856    MakeDirectory,
857    SymbolicLink,
858    MakeNode,
859    Removex,
860    RemoveDirectory,
861    Rename,
862    Link,
863    ReadDirectory,
864    ReadDirectoryPlus,
865    FileSystemStatus,
866    FileSystemInfo,
867    PathConfigure,
868    Commit,
869    Mount,
870    UnMount,
871    Newfs,
872    FsCheck,
873    FsSync,
874    SimReadWrite,
875    SetFileSystemStatus,
876    BlockRead,
877    BlockWrite,
878    NvramIoctl,
879    FsSyncWait,
880    ClearArchiveBit,
881    SetAcl,
882    GetAcl,
883    AssignAcl,
884    FaultInsertion,
885    CrazyCache
886} AAC_FSACommand;
887
888/*
889 * Command status values
890 */
891typedef enum {
892    ST_OK = 0,
893    ST_PERM = 1,
894    ST_NOENT = 2,
895    ST_IO = 5,
896    ST_NXIO = 6,
897    ST_E2BIG = 7,
898    ST_ACCES = 13,
899    ST_EXIST = 17,
900    ST_XDEV = 18,
901    ST_NODEV = 19,
902    ST_NOTDIR = 20,
903    ST_ISDIR = 21,
904    ST_INVAL = 22,
905    ST_FBIG = 27,
906    ST_NOSPC = 28,
907    ST_ROFS = 30,
908    ST_MLINK = 31,
909    ST_WOULDBLOCK = 35,
910    ST_NAMETOOLONG = 63,
911    ST_NOTEMPTY = 66,
912    ST_DQUOT = 69,
913    ST_STALE = 70,
914    ST_REMOTE = 71,
915    ST_BADHANDLE = 10001,
916    ST_NOT_SYNC = 10002,
917    ST_BAD_COOKIE = 10003,
918    ST_NOTSUPP = 10004,
919    ST_TOOSMALL = 10005,
920    ST_SERVERFAULT = 10006,
921    ST_BADTYPE = 10007,
922    ST_JUKEBOX = 10008,
923    ST_NOTMOUNTED = 10009,
924    ST_MAINTMODE = 10010,
925    ST_STALEACL = 10011
926} AAC_FSAStatus;
927
928/*
929 * Volume manager commands
930 */
931typedef enum _VM_COMMANDS {
932    VM_Null = 0,
933    VM_NameServe,
934    VM_ContainerConfig,
935    VM_Ioctl,
936    VM_FilesystemIoctl,
937    VM_CloseAll,
938    VM_CtBlockRead,
939    VM_CtBlockWrite,
940    VM_SliceBlockRead,	 /* raw access to configured "storage objects" */
941    VM_SliceBlockWrite,
942    VM_DriveBlockRead,	 /* raw access to physical devices */
943    VM_DriveBlockWrite,
944    VM_EnclosureMgt,	 /* enclosure management */
945    VM_Unused,		 /* used to be diskset management */
946    VM_CtBlockVerify,
947    VM_CtPerf,		 /* performance test */
948    VM_CtBlockRead64,
949    VM_CtBlockWrite64,
950    VM_CtBlockVerify64,
951} AAC_VMCommand;
952
953/*
954 * "mountable object"
955 */
956struct aac_mntobj {
957    u_int32_t				ObjectId;
958    char				FileSystemName[16];
959    struct aac_container_creation	CreateInfo;
960    u_int32_t				Capacity;
961    AAC_FSAVolType			VolType;
962    AAC_FType				ObjType;
963    u_int32_t				ContentState;
964#define FSCS_READONLY		0x0002		/* XXX need more information
965						 * than this */
966    union {
967	u_int32_t	pad[8];
968    } ObjExtension;
969    u_int32_t				AlterEgoId;
970} __attribute__ ((packed));
971
972struct aac_mntinfo {
973    AAC_VMCommand	Command;
974    AAC_FType		MntType;
975    u_int32_t		MntCount;
976} __attribute__ ((packed));
977
978struct aac_mntinforesponse {
979    AAC_FSAStatus	Status;
980    AAC_FType		MntType;
981    u_int32_t		MntRespCount;
982    struct aac_mntobj	MntTable[1];
983} __attribute__ ((packed));
984
985/*
986 * Container shutdown command.
987 */
988struct aac_closecommand {
989    u_int32_t	Command;
990    u_int32_t	ContainerId;
991} __attribute__ ((packed));
992
993/*
994 * Write 'stability' options.
995 */
996typedef enum {
997    CSTABLE = 1,
998    CUNSTABLE
999} AAC_CacheLevel;
1000
1001/*
1002 * Commit level response for a write request.
1003 */
1004typedef enum {
1005    CMFILE_SYNC_NVRAM = 1,
1006    CMDATA_SYNC_NVRAM,
1007    CMFILE_SYNC,
1008    CMDATA_SYNC,
1009    CMUNSTABLE
1010} AAC_CommitLevel;
1011
1012/*
1013 * Block read/write operations.
1014 * These structures are packed into the 'data' area in the FIB.
1015 */
1016
1017struct aac_blockread {
1018    AAC_VMCommand	Command;	/* not FSACommand! */
1019    u_int32_t		ContainerId;
1020    u_int32_t		BlockNumber;
1021    u_int32_t		ByteCount;
1022    struct aac_sg_table	SgMap;		/* variable size */
1023} __attribute__ ((packed));
1024
1025struct aac_blockread_response {
1026    AAC_FSAStatus	Status;
1027    u_int32_t		ByteCount;
1028} __attribute__ ((packed));
1029
1030struct aac_blockwrite {
1031    AAC_VMCommand	Command;	/* not FSACommand! */
1032    u_int32_t		ContainerId;
1033    u_int32_t		BlockNumber;
1034    u_int32_t		ByteCount;
1035    AAC_CacheLevel	Stable;
1036    struct aac_sg_table	SgMap;		/* variable size */
1037} __attribute__ ((packed));
1038
1039struct aac_blockwrite_response {
1040    AAC_FSAStatus	Status;
1041    u_int32_t		ByteCount;
1042    AAC_CommitLevel	Committed;
1043} __attribute__ ((packed));
1044
1045/*
1046 * Container shutdown command.
1047 */
1048struct aac_close_command {
1049    AAC_VMCommand      Command;
1050    u_int32_t          ContainerId;
1051};
1052
1053/******************************************************************************
1054 * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
1055 * on the SA110 'StrongArm'.
1056 */
1057
1058#define AAC_SA_DOORBELL0_CLEAR		0x98	/* doorbell 0 (adapter->host) */
1059#define AAC_SA_DOORBELL0_SET		0x9c
1060#define AAC_SA_DOORBELL0		0x9c
1061#define AAC_SA_MASK0_CLEAR		0xa0
1062#define AAC_SA_MASK0_SET		0xa4
1063
1064#define AAC_SA_DOORBELL1_CLEAR		0x9a	/* doorbell 1 (host->adapter) */
1065#define AAC_SA_DOORBELL1_SET		0x9e
1066#define AAC_SA_MASK1_CLEAR		0xa2
1067#define AAC_SA_MASK1_SET		0xa6
1068
1069#define AAC_SA_MAILBOX			0xa8	/* mailbox (20 bytes) */
1070#define AAC_SA_FWSTATUS			0xc4
1071
1072/******************************************************************************
1073 * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
1074 * and other related adapters.
1075 */
1076
1077#define AAC_RX_IDBR		0x20	/* inbound doorbell register */
1078#define AAC_RX_IISR		0x24	/* inbound interrupt status register */
1079#define AAC_RX_IIMR		0x28	/* inbound interrupt mask register */
1080#define AAC_RX_ODBR		0x2c	/* outbound doorbell register */
1081#define AAC_RX_OISR		0x30	/* outbound interrupt status register */
1082#define AAC_RX_OIMR		0x34	/* outbound interrupt mask register */
1083
1084#define AAC_RX_MAILBOX		0x50	/* mailbox (20 bytes) */
1085#define AAC_RX_FWSTATUS		0x6c
1086
1087/******************************************************************************
1088 * Common bit definitions for the doorbell registers.
1089 */
1090
1091/*
1092 * Status bits in the doorbell registers.
1093 */
1094#define AAC_DB_SYNC_COMMAND	(1<<0)	/* send/completed synchronous FIB */
1095#define AAC_DB_COMMAND_READY	(1<<1)	/* posted one or more commands */
1096#define AAC_DB_RESPONSE_READY	(1<<2)	/* one or more commands complete */
1097#define AAC_DB_COMMAND_NOT_FULL	(1<<3)	/* command queue not full */
1098#define AAC_DB_RESPONSE_NOT_FULL (1<<4)	/* response queue not full */
1099
1100/*
1101 * The adapter can request the host print a message by setting the
1102 * DB_PRINTF flag in DOORBELL0.  The driver responds by collecting the
1103 * message from the printf buffer, clearing the DB_PRINTF flag in
1104 * DOORBELL0 and setting it in DOORBELL1.
1105 * (ODBR and IDBR respectively for the i960Rx adapters)
1106 */
1107#define AAC_DB_PRINTF		(1<<5)	/* adapter requests host printf */
1108
1109/*
1110 * Mask containing the interrupt bits we care about.  We don't anticipate (or
1111 * want) interrupts not in this mask.
1112 */
1113#define AAC_DB_INTERRUPTS	(AAC_DB_COMMAND_READY | AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)
1114