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