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