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