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