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