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