Merge remote-tracking branch 'origin/master'
[unleashed/lotheac.git] / usr / src / uts / common / io / aac / aac_regs.h
blob72db5683f2c90770d6505017d4a9599a7beefb00
1 /*
2 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
3 */
5 /*
6 * Copyright 2005-06 Adaptec, Inc.
7 * Copyright (c) 2005-06 Adaptec Inc., Achim Leubner
8 * Copyright (c) 2000 Michael Smith
9 * Copyright (c) 2000-2001 Scott Long
10 * Copyright (c) 2000 BSDi
11 * All rights reserved.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
34 * $FreeBSD: src/sys/dev/aac/aacreg.h,v 1.23 2005/10/14 16:22:45 scottl Exp $
37 #ifndef __AAC_REGS_H__
38 #define __AAC_REGS_H__
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
44 /* Status bits in the doorbell registers */
45 #define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous */
46 /* FIB */
47 #define AAC_DB_COMMAND_READY (1<<1) /* posted one or more */
48 /* commands */
49 #define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands */
50 /* complete */
51 #define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */
52 #define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */
53 #define AAC_DB_PRINTF_READY (1<<5) /* adapter requests host */
54 /* printf */
55 #define AAC_DB_INTR_BITS (AAC_DB_COMMAND_READY | \
56 AAC_DB_RESPONSE_READY | AAC_DB_PRINTF_READY)
57 #define AAC_DB_INTR_NEW 0x08
59 /* Status bits in firmware status reg */
60 #define AAC_SELF_TEST_FAILED 0x00000004
61 #define AAC_MONITOR_PANIC 0x00000020
62 #define AAC_KERNEL_UP_AND_RUNNING 0x00000080
63 #define AAC_KERNEL_PANIC 0x00000100
65 /* aac registers definitions */
66 #define AAC_OMR0 0x18 /* outbound message register 0 */
67 #define AAC_OMR1 0x1c /* outbound message register 1 */
68 #define AAC_IDBR 0x20 /* inbound doorbell reg */
69 #define AAC_ODBR 0x2c /* outbound doorbell reg */
70 #define AAC_OIMR 0x34 /* outbound interrupt mask reg */
71 #define AAC_IRCSR 0x38 /* inbound dual cores reset (SRL) */
72 #define AAC_IQUE 0x40 /* inbound queue */
73 #define AAC_OQUE 0x44 /* outbound queue */
74 #define AAC_RX_MAILBOX 0x50 /* mailbox, size=20bytes, rx */
75 #define AAC_RX_FWSTATUS 0x6c /* firmware status, rx */
76 #define AAC_RKT_MAILBOX 0x1000 /* mailbox, size=20bytes, rkt */
77 #define AAC_RKT_FWSTATUS 0x101c /* firmware status, rkt */
79 /* Synchronous commands to the monitor/kernel. */
80 #define AAC_BREAKPOINT_REQ 0x04
81 #define AAC_MONKER_INITSTRUCT 0x05
82 #define AAC_MONKER_SYNCFIB 0x0c
83 #define AAC_MONKER_GETKERNVER 0x11
84 #define AAC_MONKER_GETINFO 0x19
85 #define AAC_MONKER_GETDRVPROP 0x23
86 #define AAC_MONKER_GETCOMMPREF 0x26
87 #define AAC_IOP_RESET 0x1000
89 /* Sunrise Lake dual core reset */
90 #define AAC_IRCSR_CORES_RST 3
92 #define AAC_SECTOR_SIZE 512
93 #define AAC_NUMBER_OF_HEADS 255
94 #define AAC_SECTORS_PER_TRACK 63
95 #define AAC_ROTATION_SPEED 10000
96 #define AAC_MAX_PFN 0xfffff
98 #define AAC_ADDITIONAL_LEN 31
99 #define AAC_ANSI_VER 2
100 #define AAC_RESP_DATA_FORMAT 2
102 #define AAC_MAX_LD 64 /* max number of logical disks */
103 #define AAC_MAX_PD(s) ((s)->bus_max * (s)->tgt_max)
104 #define AAC_MAX_DEV(s) (AAC_MAX_LD + AAC_MAX_PD((s)))
105 #define AAC_BLK_SIZE AAC_SECTOR_SIZE
106 #define AAC_DMA_ALIGN 4
107 #define AAC_DMA_ALIGN_MASK (AAC_DMA_ALIGN - 1)
109 #define AAC_MAX_CONTAINERS AAC_MAX_LD
112 * Minimum memory sizes we need to map to address the adapter. Before
113 * we know the actual size to map, minimum memory is used instead.
115 #define AAC_MAP_SIZE_MIN_RX 4096
116 #define AAC_MAP_SIZE_MIN_RKT 8192
119 * Options supported by the adapter
121 #define AAC_SUPPORTED_SNAPSHOT 0x01
122 #define AAC_SUPPORTED_CLUSTERS 0x02
123 #define AAC_SUPPORTED_WRITE_CACHE 0x04
124 #define AAC_SUPPORTED_64BIT_DATA 0x08
125 #define AAC_SUPPORTED_HOST_TIME_FIB 0x10
126 #define AAC_SUPPORTED_RAID50 0x20
127 #define AAC_SUPPORTED_4GB_WINDOW 0x40
128 #define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80
129 #define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100
130 #define AAC_SUPPORTED_NOT_RECONDITION 0x200
131 #define AAC_SUPPORTED_SGMAP_HOST64 0x400
132 #define AAC_SUPPORTED_ALARM 0x800
133 #define AAC_SUPPORTED_NONDASD 0x1000
134 #define AAC_SUPPORTED_SCSI_MANAGED 0x2000
135 #define AAC_SUPPORTED_RAID_SCSI_MODE 0x4000
136 #define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO 0x10000
137 #define AAC_SUPPORTED_NEW_COMM 0x20000
138 #define AAC_SUPPORTED_64BIT_ARRAYSIZE 0x40000
139 #define AAC_SUPPORTED_HEAT_SENSOR 0x80000
142 * More options from supplement info - SupportedOptions2
144 #define AAC_SUPPORTED_MU_RESET 0x01
145 #define AAC_SUPPORTED_IGNORE_RESET 0x02
146 #define AAC_SUPPORTED_POWER_MANAGEMENT 0x04
147 #define AAC_SUPPORTED_ARCIO_PHYDEV 0x08
149 * FeatureBits of RequestSupplementAdapterInfo used in the driver
151 #define AAC_FEATURE_SUPPORTED_JBOD 0x08000000
153 #pragma pack(1)
156 * FIB (FSA Interface Block) this is the data structure passed between
157 * the host and adapter.
159 struct aac_fib_header {
160 uint32_t XferState;
161 uint16_t Command;
162 uint8_t StructType;
163 uint8_t Flags;
164 uint16_t Size;
165 uint16_t SenderSize;
166 uint32_t SenderFibAddress;
167 uint32_t ReceiverFibAddress;
168 uint32_t SenderData;
169 int prev;
170 int next;
173 /* FIB completed without error or no data was transferred in the FIB */
174 #define AAC_SENDERADDR_MASK_FAST_RESPONSE 0x01
175 /* The received FIB is an AIF */
176 #define AAC_SENDERADDR_MASK_AIF 0x02
178 #define AAC_FIB_SIZE 512 /* size of a fib block in byte */
179 #define AAC_FIB_DATASIZE (AAC_FIB_SIZE - sizeof (struct aac_fib_header))
181 struct aac_fib {
182 struct aac_fib_header Header;
183 uint8_t data[AAC_FIB_DATASIZE];
186 /* FIB transfer state */
187 #define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */
188 #define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */
189 #define AAC_FIBSTATE_INITIALISED (1<<2) /* has been initialised */
190 #define AAC_FIBSTATE_EMPTY (1<<3) /* is empty now */
191 #define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */
192 #define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */
193 #define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */
194 #define AAC_FIBSTATE_NOREXPECTED (1<<8) /* no response is expected */
195 #define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */
196 #define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */
197 #define AAC_FIBSTATE_NORM (1<<12) /* normal priority */
198 #define AAC_FIBSTATE_ASYNC (1<<13)
199 #define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */
201 /* FIB types */
202 #define AAC_FIBTYPE_TFIB 1
205 * FIB commands
208 #define TestCommandResponse 1
209 #define TestAdapterCommand 2
210 /* Lowlevel and comm commands */
211 #define LastTestCommand 100
212 #define ReinitHostNormCommandQueue 101
213 #define ReinitHostHighCommandQueue 102
214 #define ReinitHostHighRespQueue 103
215 #define ReinitHostNormRespQueue 104
216 #define ReinitAdapNormCommandQueue 105
217 #define ReinitAdapHighCommandQueue 107
218 #define ReinitAdapHighRespQueue 108
219 #define ReinitAdapNormRespQueue 109
220 #define InterfaceShutdown 110
221 #define DmaCommandFib 120
222 #define StartProfile 121
223 #define TermProfile 122
224 #define SpeedTest 123
225 #define TakeABreakPt 124
226 #define RequestPerfData 125
227 #define SetInterruptDefTimer 126
228 #define SetInterruptDefCount 127
229 #define GetInterruptDefStatus 128
230 #define LastCommCommand 129
231 /* Filesystem commands */
232 #define NuFileSystem 300
233 #define UFS 301
234 #define HostFileSystem 302
235 #define LastFileSystemCommand 303
236 /* Container commands */
237 #define ContainerCommand 500
238 #define ContainerCommand64 501
239 #define RawIo 502
240 /* Cluster commands */
241 #define ClusterCommand 550
242 /* Scsi Port commands (scsi passthrough) */
243 #define ScsiPortCommand 600
244 #define ScsiPortCommandU64 601
245 /* Misc house keeping and generic adapter initiated commands */
246 #define AifRequest 700
247 #define CheckRevision 701
248 #define FsaHostShutdown 702
249 #define RequestAdapterInfo 703
250 #define IsAdapterPaused 704
251 #define SendHostTime 705
252 #define RequestSupplementAdapterInfo 706
253 #define LastMiscCommand 707
254 #define OnLineDiagnostic 800
255 #define FduAdapterTest 801
258 * Revision number handling
260 struct FsaRev {
261 union {
262 struct {
263 uint8_t dash;
264 uint8_t type;
265 uint8_t minor;
266 uint8_t major;
267 } comp;
268 uint32_t ul;
269 } external;
270 uint32_t buildNumber;
274 * Structures used to respond to a RequestAdapterInfo FIB
276 struct aac_adapter_info {
277 uint32_t PlatformBase; /* adapter type */
278 uint32_t CpuArchitecture; /* adapter CPU type */
279 uint32_t CpuVariant; /* adapter CPU subtype */
280 uint32_t ClockSpeed; /* adapter CPU clockspeed */
281 uint32_t ExecutionMem; /* adapter Execution Memory size */
282 uint32_t BufferMem; /* adapter Data Memory */
283 uint32_t TotalMem; /* adapter Total Memory */
284 struct FsaRev KernelRevision; /* adapter Kernel Software Revision */
285 struct FsaRev MonitorRevision; /* adapter Monitor Software Revision */
286 struct FsaRev HardwareRevision;
287 struct FsaRev BIOSRevision; /* adapter BIOS Revision */
288 uint32_t ClusteringEnabled;
289 uint32_t ClusterChannelMask;
290 uint64_t SerialNumber;
291 uint32_t batteryPlatform;
292 uint32_t SupportedOptions; /* supported features */
293 uint32_t OemVariant;
297 * The following definitions on Supplement Adapter Information
298 * come from Adaptec:
300 struct vpd_info {
301 uint8_t AssemblyPn[8];
302 uint8_t FruPn[8];
303 uint8_t BatteryFruPn[8];
304 uint8_t EcVersionString[8];
305 uint8_t Tsid[12];
308 #define MFG_PCBA_SERIAL_NUMBER_WIDTH 12
309 #define MFG_WWN_WIDTH 8
311 struct aac_supplement_adapter_info {
312 /* The assigned Adapter Type Text, extra byte for null termination */
313 int8_t AdapterTypeText[17+1];
314 /* Pad for the text above */
315 int8_t Pad[2];
316 /* Size in bytes of the memory that is flashed */
317 uint32_t FlashMemoryByteSize;
318 /* The assigned IMAGEID_xxx for this adapter */
319 uint32_t FlashImageId;
321 * The maximum number of Phys available on a SATA/SAS
322 * Controller, 0 otherwise
324 uint32_t MaxNumberPorts;
325 /* Version of expansion area */
326 uint32_t Version;
327 uint32_t FeatureBits;
328 uint8_t SlotNumber;
329 uint8_t ReservedPad0[3];
330 uint8_t BuildDate[12];
331 /* The current number of Ports on a SAS controller, 0 otherwise */
332 uint32_t CurrentNumberPorts;
334 struct vpd_info VpdInfo;
336 /* Firmware Revision (Vmaj.min-dash.) */
337 struct FsaRev FlashFirmwareRevision;
338 uint32_t RaidTypeMorphOptions;
339 /* Firmware's boot code Revision (Vmaj.min-dash.) */
340 struct FsaRev FlashFirmwareBootRevision;
341 /* PCBA serial no. from th MFG sector */
342 uint8_t MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH];
343 /* WWN from the MFG sector */
344 uint8_t MfgWWNName[MFG_WWN_WIDTH];
345 uint32_t SupportedOptions2; /* more supported features */
346 uint32_t ExpansionFlag; /* 1 - following fields are valid */
347 uint32_t FeatureBits3;
348 uint32_t SupportedPerformanceMode;
349 /* Growth Area for future expansion */
350 uint32_t ReservedGrowth[80];
353 /* Container creation data */
354 struct aac_container_creation {
355 uint8_t ViaBuildNumber;
356 uint8_t MicroSecond;
357 uint8_t Via; /* 1 = FSU, 2 = API, etc */
358 uint8_t Years; /* Since1900 */
359 uint32_t Month:4; /* 1-12 */
360 uint32_t Day:6; /* 1-32 */
361 uint32_t Hour:6; /* 0-23 */
362 uint32_t Minute:6; /* 0-59 */
363 uint32_t Second:6; /* 0-59 */
364 uint64_t ViaAdapterSerialNumber;
367 struct aac_mntobj {
368 uint32_t ObjectId;
369 char FileSystemName[16];
370 struct aac_container_creation CreateInfo;
371 uint32_t Capacity;
372 uint32_t VolType;
373 uint32_t ObjType;
374 uint32_t ContentState;
375 union {
376 uint32_t pad[8];
377 } ObjExtension;
378 uint32_t AlterEgoId;
380 uint32_t CapacityHigh; /* 64-bit LBA */
383 struct aac_mntinfo {
384 uint32_t Command;
385 uint32_t MntType;
386 uint32_t MntCount;
389 struct aac_mntinforesp {
390 uint32_t Status;
391 uint32_t MntType;
392 uint32_t MntRespCount;
393 struct aac_mntobj MntObj;
397 * Structures used to access physical drives
399 struct aac_bus_info {
400 uint32_t Command; /* VM_Ioctl */
401 uint32_t ObjType; /* FT_DRIVE */
402 uint32_t MethodId; /* 1 = SCSI Layer */
403 uint32_t ObjectId; /* Handle */
404 uint32_t CtlCmd; /* GetBusInfo */
407 struct aac_bus_info_response {
408 uint32_t Status; /* ST_OK */
409 uint32_t ObjType;
410 uint32_t MethodId; /* unused */
411 uint32_t ObjectId; /* unused */
412 uint32_t CtlCmd; /* unused */
413 uint32_t ProbeComplete;
414 uint32_t BusCount;
415 uint32_t TargetsPerBus;
416 uint8_t InitiatorBusId[10];
417 uint8_t BusValid[10];
420 #define CT_FIB_PARAMS 6
421 #define MAX_FIB_PARAMS 10
422 #define CT_PACKET_SIZE \
423 (AAC_FIB_DATASIZE - sizeof (uint32_t) - \
424 ((sizeof (uint32_t)) * (MAX_FIB_PARAMS + 1)))
426 #define CNT_SIZE 5
428 /* Container types */
429 typedef enum {
430 CT_NONE = 0,
431 CT_VOLUME,
432 CT_MIRROR,
433 CT_STRIPE,
434 CT_RAID5,
435 CT_SSRW,
436 CT_SSRO,
437 CT_MORPH,
438 CT_PASSTHRU,
439 CT_RAID4,
440 CT_RAID10, /* stripe of mirror */
441 CT_RAID00, /* stripe of stripe */
442 CT_VOLUME_OF_MIRRORS, /* volume of mirror */
443 CT_PSEUDO_RAID3, /* really raid4 */
444 CT_RAID50, /* stripe of raid5 */
445 CT_RAID5D, /* raid5 distributed hot-sparing */
446 CT_RAID5D0,
447 CT_RAID1E, /* extended raid1 mirroring */
448 CT_RAID6,
449 CT_RAID60
450 } AAC_FSAVolType;
453 * Container Configuration Sub-Commands
455 typedef enum {
456 CT_Null = 0,
457 CT_GET_SLICE_COUNT, /* 1 */
458 CT_GET_PARTITION_COUNT, /* 2 */
459 CT_GET_PARTITION_INFO, /* 3 */
460 CT_GET_CONTAINER_COUNT, /* 4 */
461 CT_GET_CONTAINER_INFO_OLD, /* 5 */
462 CT_WRITE_MBR, /* 6 */
463 CT_WRITE_PARTITION, /* 7 */
464 CT_UPDATE_PARTITION, /* 8 */
465 CT_UNLOAD_CONTAINER, /* 9 */
466 CT_CONFIG_SINGLE_PRIMARY, /* 10 */
467 CT_READ_CONFIG_AGE, /* 11 */
468 CT_WRITE_CONFIG_AGE, /* 12 */
469 CT_READ_SERIAL_NUMBER, /* 13 */
470 CT_ZERO_PAR_ENTRY, /* 14 */
471 CT_READ_MBR, /* 15 */
472 CT_READ_PARTITION, /* 16 */
473 CT_DESTROY_CONTAINER, /* 17 */
474 CT_DESTROY2_CONTAINER, /* 18 */
475 CT_SLICE_SIZE, /* 19 */
476 CT_CHECK_CONFLICTS, /* 20 */
477 CT_MOVE_CONTAINER, /* 21 */
478 CT_READ_LAST_DRIVE, /* 22 */
479 CT_WRITE_LAST_DRIVE, /* 23 */
480 CT_UNMIRROR, /* 24 */
481 CT_MIRROR_DELAY, /* 25 */
482 CT_GEN_MIRROR, /* 26 */
483 CT_GEN_MIRROR2, /* 27 */
484 CT_TEST_CONTAINER, /* 28 */
485 CT_MOVE2, /* 29 */
486 CT_SPLIT, /* 30 */
487 CT_SPLIT2, /* 31 */
488 CT_SPLIT_BROKEN, /* 32 */
489 CT_SPLIT_BROKEN2, /* 33 */
490 CT_RECONFIG, /* 34 */
491 CT_BREAK2, /* 35 */
492 CT_BREAK, /* 36 */
493 CT_MERGE2, /* 37 */
494 CT_MERGE, /* 38 */
495 CT_FORCE_ERROR, /* 39 */
496 CT_CLEAR_ERROR, /* 40 */
497 CT_ASSIGN_FAILOVER, /* 41 */
498 CT_CLEAR_FAILOVER, /* 42 */
499 CT_GET_FAILOVER_DATA, /* 43 */
500 CT_VOLUME_ADD, /* 44 */
501 CT_VOLUME_ADD2, /* 45 */
502 CT_MIRROR_STATUS, /* 46 */
503 CT_COPY_STATUS, /* 47 */
504 CT_COPY, /* 48 */
505 CT_UNLOCK_CONTAINER, /* 49 */
506 CT_LOCK_CONTAINER, /* 50 */
507 CT_MAKE_READ_ONLY, /* 51 */
508 CT_MAKE_READ_WRITE, /* 52 */
509 CT_CLEAN_DEAD, /* 53 */
510 CT_ABORT_MIRROR_COMMAND, /* 54 */
511 CT_SET, /* 55 */
512 CT_GET, /* 56 */
513 CT_GET_NVLOG_ENTRY, /* 57 */
514 CT_GET_DELAY, /* 58 */
515 CT_ZERO_CONTAINER_SPACE, /* 59 */
516 CT_GET_ZERO_STATUS, /* 60 */
517 CT_SCRUB, /* 61 */
518 CT_GET_SCRUB_STATUS, /* 62 */
519 CT_GET_SLICE_INFO, /* 63 */
520 CT_GET_SCSI_METHOD, /* 64 */
521 CT_PAUSE_IO, /* 65 */
522 CT_RELEASE_IO, /* 66 */
523 CT_SCRUB2, /* 67 */
524 CT_MCHECK, /* 68 */
525 CT_CORRUPT, /* 69 */
526 CT_GET_TASK_COUNT, /* 70 */
527 CT_PROMOTE, /* 71 */
528 CT_SET_DEAD, /* 72 */
529 CT_CONTAINER_OPTIONS, /* 73 */
530 CT_GET_NV_PARAM, /* 74 */
531 CT_GET_PARAM, /* 75 */
532 CT_NV_PARAM_SIZE, /* 76 */
533 CT_COMMON_PARAM_SIZE, /* 77 */
534 CT_PLATFORM_PARAM_SIZE, /* 78 */
535 CT_SET_NV_PARAM, /* 79 */
536 CT_ABORT_SCRUB, /* 80 */
537 CT_GET_SCRUB_ERROR, /* 81 */
538 CT_LABEL_CONTAINER, /* 82 */
539 CT_CONTINUE_DATA, /* 83 */
540 CT_STOP_DATA, /* 84 */
541 CT_GET_PARTITION_TABLE, /* 85 */
542 CT_GET_DISK_PARTITIONS, /* 86 */
543 CT_GET_MISC_STATUS, /* 87 */
544 CT_GET_CONTAINER_PERF_INFO, /* 88 */
545 CT_GET_TIME, /* 89 */
546 CT_READ_DATA, /* 90 */
547 CT_CTR, /* 91 */
548 CT_CTL, /* 92 */
549 CT_DRAINIO, /* 93 */
550 CT_RELEASEIO, /* 94 */
551 CT_GET_NVRAM, /* 95 */
552 CT_GET_MEMORY, /* 96 */
553 CT_PRINT_CT_LOG, /* 97 */
554 CT_ADD_LEVEL, /* 98 */
555 CT_NV_ZERO, /* 99 */
556 CT_READ_SIGNATURE, /* 100 */
557 CT_THROTTLE_ON, /* 101 */
558 CT_THROTTLE_OFF, /* 102 */
559 CT_GET_THROTTLE_STATS, /* 103 */
560 CT_MAKE_SNAPSHOT, /* 104 */
561 CT_REMOVE_SNAPSHOT, /* 105 */
562 CT_WRITE_USER_FLAGS, /* 106 */
563 CT_READ_USER_FLAGS, /* 107 */
564 CT_MONITOR, /* 108 */
565 CT_GEN_MORPH, /* 109 */
566 CT_GET_SNAPSHOT_INFO, /* 110 */
567 CT_CACHE_SET, /* 111 */
568 CT_CACHE_STAT, /* 112 */
569 CT_TRACE_START, /* 113 */
570 CT_TRACE_STOP, /* 114 */
571 CT_TRACE_ENABLE, /* 115 */
572 CT_TRACE_DISABLE, /* 116 */
573 CT_FORCE_CORE_DUMP, /* 117 */
574 CT_SET_SERIAL_NUMBER, /* 118 */
575 CT_RESET_SERIAL_NUMBER, /* 119 */
576 CT_ENABLE_RAID5, /* 120 */
577 CT_CLEAR_VALID_DUMP_FLAG, /* 121 */
578 CT_GET_MEM_STATS, /* 122 */
579 CT_GET_CORE_SIZE, /* 123 */
580 CT_CREATE_CONTAINER_OLD, /* 124 */
581 CT_STOP_DUMPS, /* 125 */
582 CT_PANIC_ON_TAKE_A_BREAK, /* 126 */
583 CT_GET_CACHE_STATS, /* 127 */
584 CT_MOVE_PARTITION, /* 128 */
585 CT_FLUSH_CACHE, /* 129 */
586 CT_READ_NAME, /* 130 */
587 CT_WRITE_NAME, /* 131 */
588 CT_TOSS_CACHE, /* 132 */
589 CT_LOCK_DRAINIO, /* 133 */
590 CT_CONTAINER_OFFLINE, /* 134 */
591 CT_SET_CACHE_SIZE, /* 135 */
592 CT_CLEAN_SHUTDOWN_STATUS, /* 136 */
593 CT_CLEAR_DISKLOG_ON_DISK, /* 137 */
594 CT_CLEAR_ALL_DISKLOG, /* 138 */
595 CT_CACHE_FAVOR, /* 139 */
596 CT_READ_PASSTHRU_MBR, /* 140 */
597 CT_SCRUB_NOFIX, /* 141 */
598 CT_SCRUB2_NOFIX, /* 142 */
599 CT_FLUSH, /* 143 */
600 CT_REBUILD, /* 144 rma, not really a command, partner to CT_SCRUB */
601 CT_FLUSH_CONTAINER, /* 145 */
602 CT_RESTART, /* 146 */
603 CT_GET_CONFIG_STATUS, /* 147 */
604 CT_TRACE_FLAG, /* 148 */
605 CT_RESTART_MORPH, /* 149 */
606 CT_GET_TRACE_INFO, /* 150 */
607 CT_GET_TRACE_ITEM, /* 151 */
608 CT_COMMIT_CONFIG, /* 152 */
609 CT_CONTAINER_EXISTS, /* 153 */
610 CT_GET_SLICE_FROM_DEVT, /* 154 */
611 CT_OPEN_READ_WRITE, /* 155 */
612 CT_WRITE_MEMORY_BLOCK, /* 156 */
613 CT_GET_CACHE_PARAMS, /* 157 */
614 CT_CRAZY_CACHE, /* 158 */
615 CT_GET_PROFILE_STRUCT, /* 159 */
616 CT_SET_IO_TRACE_FLAG, /* 160 */
617 CT_GET_IO_TRACE_STRUCT, /* 161 */
618 CT_CID_TO_64BITS_UID, /* 162 */
619 CT_64BITS_UID_TO_CID, /* 163 */
620 CT_PAR_TO_64BITS_UID, /* 164 */
621 CT_CID_TO_32BITS_UID, /* 165 */
622 CT_32BITS_UID_TO_CID, /* 166 */
623 CT_PAR_TO_32BITS_UID, /* 167 */
624 CT_SET_FAILOVER_OPTION, /* 168 */
625 CT_GET_FAILOVER_OPTION, /* 169 */
626 CT_STRIPE_ADD2, /* 170 */
627 CT_CREATE_VOLUME_SET, /* 171 */
628 CT_CREATE_STRIPE_SET, /* 172 */
629 /* 173 command and partner to scrub and rebuild task types */
630 CT_VERIFY_CONTAINER,
631 CT_IS_CONTAINER_DEAD, /* 174 */
632 CT_GET_CONTAINER_OPTION, /* 175 */
633 CT_GET_SNAPSHOT_UNUSED_STRUCT, /* 176 */
634 CT_CLEAR_SNAPSHOT_UNUSED_STRUCT, /* 177 */
635 CT_GET_CONTAINER_INFO, /* 178 */
636 CT_CREATE_CONTAINER, /* 179 */
637 CT_CHANGE_CREATIONINFO, /* 180 */
638 CT_CHECK_CONFLICT_UID, /* 181 */
639 CT_CONTAINER_UID_CHECK, /* 182 */
641 /* 183 :RECmm: 20011220 added to support the Babylon */
642 CT_IS_CONTAINER_MEATADATA_STANDARD,
643 /* 184 :RECmm: 20011220 array imports */
644 CT_IS_SLICE_METADATA_STANDARD,
646 /* :BIOS_TEST: */
647 /* 185 :RECmm: 20020116 added to support BIOS interface for */
648 CT_GET_IMPORT_COUNT,
649 /* 186 :RECmm: 20020116 metadata conversion */
650 CT_CANCEL_ALL_IMPORTS,
651 CT_GET_IMPORT_INFO, /* 187 :RECmm: 20020116 " */
652 CT_IMPORT_ARRAY, /* 188 :RECmm: 20020116 " */
653 CT_GET_LOG_SIZE, /* 189 */
655 /* Not BIOS TEST */
656 CT_ALARM_GET_STATE, /* 190 */
657 CT_ALARM_SET_STATE, /* 191 */
658 CT_ALARM_ON_OFF, /* 192 */
660 CT_GET_EE_OEM_ID, /* 193 */
662 CT_GET_PPI_HEADERS, /* 194 get header fields only */
663 CT_GET_PPI_DATA, /* 195 get all ppitable.data */
664 /* 196 get only range of entries specified in c_params */
665 CT_GET_PPI_ENTRIES,
666 /* 197 remove ppitable bundle specified by uid in c_param0 */
667 CT_DELETE_PPI_BUNDLE,
669 /* 198 current partition structure (not legacy) */
670 CT_GET_PARTITION_TABLE_2,
671 CT_GET_PARTITION_INFO_2,
672 CT_GET_DISK_PARTITIONS_2,
674 CT_QUIESCE_ADAPTER, /* 201 chill dude */
675 CT_CLEAR_PPI_TABLE, /* 202 clear ppi table */
677 CT_SET_DEVICE_CACHE_POLICY, /* 203 */
678 CT_GET_DEVICE_CACHE_POLICY, /* 204 */
680 CT_SET_VERIFY_DELAY, /* 205 */
681 CT_GET_VERIFY_DELAY, /* 206 */
683 /* 207 delete all PPI bundles that have an entry for device at devt */
684 CT_DELETE_PPI_BUNDLES_FOR_DEVT,
686 CT_READ_SW_SECTOR, /* 208 */
687 CT_WRITE_SW_SECTOR, /* 209 */
689 /* 210 added to support firmware cache sync operations */
690 CT_GET_CACHE_SYNC_INFO,
691 CT_SET_CACHE_SYNC_MODE, /* 211 */
692 CT_PM_DRIVER_SUPPORT, /* 212 */
693 CT_PM_CONFIGURATION, /* 213 */
695 CT_LAST_COMMAND /* last command */
696 } AAC_CTCommand;
698 /* General return status */
699 #define CT_OK 218
701 /* CT_PM_DRIVER_SUPPORT parameter */
702 typedef enum {
703 AAC_PM_DRIVERSUP_GET_STATUS = 1,
704 AAC_PM_DRIVERSUP_START_UNIT,
705 AAC_PM_DRIVERSUP_STOP_UNIT
706 } AAC_CT_PM_DRIVER_SUPPORT_SUB_COM;
708 struct aac_fsa_ctm {
709 uint32_t command;
710 uint32_t param[CT_FIB_PARAMS];
711 int8_t data[CT_PACKET_SIZE];
714 struct aac_Container {
715 uint32_t Command;
716 struct aac_fsa_ctm CTCommand;
719 struct aac_fsa_ctr {
720 uint32_t response;
721 uint32_t param[CT_FIB_PARAMS];
722 int8_t data[CT_PACKET_SIZE];
725 struct aac_Container_resp {
726 uint32_t Status;
727 struct aac_fsa_ctr CTResponse;
730 struct aac_cf_status_header {
731 uint32_t action;
732 uint16_t flags;
733 int16_t recordcount;
736 enum aac_cf_action_type {
737 CFACT_CONTINUE = 0, /* Continue without pause */
738 CFACT_PAUSE, /* Pause, then continue */
739 CFACT_ABORT /* Abort */
742 enum aac_mpe {
743 AACMPE_OK = 0x0,
744 AACMPE_GET_CONFIG_STATUS = 0x1,
745 AACMPE_CONFIG_STATUS = 0x2,
746 AACMPE_COMMIT_CONFIG = 0x3
750 * CT_PAUSE_IO is immediate minimal runtime command that is used
751 * to restart the applications and cache.
753 struct aac_pause_command {
754 uint32_t Command;
755 uint32_t Type;
756 uint32_t Timeout;
757 uint32_t Min;
758 uint32_t NoRescan;
759 uint32_t Parm3;
760 uint32_t Parm4;
761 uint32_t Count;
765 * The following two definitions come from Adaptec:
767 * Used to flush drive cache for container "cid"
769 struct aac_synchronize_command {
770 uint32_t Command; /* VM_ContainerConfig */
771 uint32_t Type; /* CT_FLUSH_CACHE */
772 uint32_t Cid;
773 uint32_t Parm1;
774 uint32_t Parm2;
775 uint32_t Parm3;
776 uint32_t Parm4;
777 uint32_t Count;
780 struct aac_synchronize_reply {
781 uint32_t Dummy0;
782 uint32_t Dummy1;
783 uint32_t Status;
784 uint32_t Parm1;
785 uint32_t Parm2;
786 uint32_t Parm3;
787 uint32_t Parm4;
788 uint32_t Parm5;
789 uint8_t Data[16];
793 * Command status values
795 typedef enum {
796 ST_OK = 0,
797 ST_PERM = 1,
798 ST_NOENT = 2,
799 ST_IO = 5,
800 ST_NXIO = 6,
801 ST_E2BIG = 7,
802 ST_ACCES = 13,
803 ST_EXIST = 17,
804 ST_XDEV = 18,
805 ST_NODEV = 19,
806 ST_NOTDIR = 20,
807 ST_ISDIR = 21,
808 ST_INVAL = 22,
809 ST_FBIG = 27,
810 ST_NOSPC = 28,
811 ST_ROFS = 30,
812 ST_MLINK = 31,
813 ST_WOULDBLOCK = 35,
814 ST_NAMETOOLONG = 63,
815 ST_NOTEMPTY = 66,
816 ST_DQUOT = 69,
817 ST_STALE = 70,
818 ST_REMOTE = 71,
819 ST_BADHANDLE = 10001,
820 ST_NOT_SYNC = 10002,
821 ST_BAD_COOKIE = 10003,
822 ST_NOTSUPP = 10004,
823 ST_TOOSMALL = 10005,
824 ST_SERVERFAULT = 10006,
825 ST_BADTYPE = 10007,
826 ST_JUKEBOX = 10008,
827 ST_NOTMOUNTED = 10009,
828 ST_MAINTMODE = 10010,
829 ST_STALEACL = 10011
830 } AAC_FSAStatus;
833 * Object-Server / Volume-Manager Dispatch Classes
835 typedef enum {
836 VM_Null = 0,
837 VM_NameServe,
838 VM_ContainerConfig,
839 VM_Ioctl,
840 VM_FilesystemIoctl,
841 VM_CloseAll,
842 VM_CtBlockRead,
843 VM_CtBlockWrite,
844 VM_SliceBlockRead, /* raw access to configured "storage objects" */
845 VM_SliceBlockWrite,
846 VM_DriveBlockRead, /* raw access to physical devices */
847 VM_DriveBlockWrite,
848 VM_EnclosureMgt, /* enclosure management */
849 VM_Unused, /* used to be diskset management */
850 VM_CtBlockVerify,
851 VM_CtPerf, /* performance test */
852 VM_CtBlockRead64,
853 VM_CtBlockWrite64,
854 VM_CtBlockVerify64,
855 VM_CtHostRead64,
856 VM_CtHostWrite64,
857 VM_NameServe64 = 22,
858 MAX_VMCOMMAND_NUM /* used for sizing stats array - leave last */
859 } AAC_VMCommand;
862 * Host-addressable object types
864 typedef enum {
865 FT_REG = 1, /* regular file */
866 FT_DIR, /* directory */
867 FT_BLK, /* "block" device - reserved */
868 FT_CHR, /* "character special" device - reserved */
869 FT_LNK, /* symbolic link */
870 FT_SOCK, /* socket */
871 FT_FIFO, /* fifo */
872 FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */
873 FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */
874 FT_SLICE, /* virtual disk - raw volume - slice */
875 FT_PARTITION, /* FSA partition - carved out of a slice - building */
876 /* block for containers */
877 FT_VOLUME, /* Container - Volume Set */
878 FT_STRIPE, /* Container - Stripe Set */
879 FT_MIRROR, /* Container - Mirror Set */
880 FT_RAID5, /* Container - Raid 5 Set */
881 FT_DATABASE /* Storage object with "foreign" content manager */
882 } AAC_FType;
884 /* Host-side scatter/gather list for 32-bit, 64-bit, raw commands */
885 struct aac_sg_entry {
886 uint32_t SgAddress;
887 uint32_t SgByteCount;
890 struct aac_sg_entry64 {
891 uint64_t SgAddress;
892 uint32_t SgByteCount;
895 struct aac_sg_entryraw {
896 uint32_t Next; /* reserved */
897 uint32_t Prev; /* reserved */
898 uint64_t SgAddress;
899 uint32_t SgByteCount;
900 uint32_t Flags; /* reserved */
903 struct aac_sg_table {
904 uint32_t SgCount;
905 struct aac_sg_entry SgEntry[1]; /* at least there is one */
906 /* SUN's CC cannot accept [0] */
909 struct aac_sg_table64 {
910 uint32_t SgCount;
911 struct aac_sg_entry64 SgEntry64[1];
914 struct aac_sg_tableraw {
915 uint32_t SgCount;
916 struct aac_sg_entryraw SgEntryRaw[1];
920 * Block read/write operations.
921 * These structures are packed into the 'data' area in the FIB.
923 struct aac_blockread {
924 uint32_t Command;
925 uint32_t ContainerId;
926 uint32_t BlockNumber;
927 uint32_t ByteCount;
928 struct aac_sg_table SgMap;
931 struct aac_blockread64 {
932 uint32_t Command;
933 uint16_t ContainerId;
934 uint16_t SectorCount;
935 uint32_t BlockNumber;
936 uint16_t Pad;
937 uint16_t Flags;
938 struct aac_sg_table64 SgMap64;
941 struct aac_blockread_response {
942 uint32_t Status;
943 uint32_t ByteCount;
946 struct aac_blockwrite {
947 uint32_t Command;
948 uint32_t ContainerId;
949 uint32_t BlockNumber;
950 uint32_t ByteCount;
951 uint32_t Stable;
952 struct aac_sg_table SgMap;
955 struct aac_blockwrite64 {
956 uint32_t Command;
957 uint16_t ContainerId;
958 uint16_t SectorCount;
959 uint32_t BlockNumber;
960 uint16_t Pad;
961 uint16_t Flags;
962 struct aac_sg_table64 SgMap64;
965 struct aac_blockwrite_response {
966 uint32_t Status;
967 uint32_t ByteCount;
968 uint32_t Committed;
971 struct aac_raw_io {
972 uint64_t BlockNumber;
973 uint32_t ByteCount;
974 uint16_t ContainerId;
975 uint16_t Flags; /* 0: W, 1: R */
976 uint16_t BpTotal; /* reserved */
977 uint16_t BpComplete; /* reserved */
978 struct aac_sg_tableraw SgMapRaw;
982 * Container shutdown command.
984 struct aac_close_command {
985 uint32_t Command;
986 uint32_t ContainerId;
990 * Container Config Command
992 struct aac_ctcfg {
993 uint32_t Command;
994 uint32_t cmd;
995 uint32_t param;
998 struct aac_ctcfg_resp {
999 uint32_t Status;
1000 uint32_t resp;
1001 uint32_t param;
1004 /* Write 'stability' options */
1005 #define CSTABLE 1
1006 #define CUNSTABLE 2
1008 /* Number of FIBs for the controller to send us messages */
1009 #define AAC_ADAPTER_FIBS 8
1011 /* Number of FIBs for the host I/O request */
1012 #define AAC_HOST_FIBS 256
1014 /* Size of buffer for text messages from the controller */
1015 #define AAC_ADAPTER_PRINT_BUFSIZE 256
1017 #define AAC_INIT_STRUCT_REVISION 3
1018 #define AAC_INIT_STRUCT_REVISION_4 4
1019 #define AAC_INIT_STRUCT_MINIPORT_REVISION 1
1021 #define AAC_INIT_FLAGS_NEW_COMM_SUPPORTED 1
1022 #define AAC_INIT_FLAGS_DRIVER_USES_UTC_TIME 0x10
1023 #define AAC_INIT_FLAGS_DRIVER_SUPPORTS_PM 0x20
1025 #define AAC_PAGE_SIZE 4096
1026 struct aac_adapter_init {
1027 uint32_t InitStructRevision;
1028 uint32_t MiniPortRevision;
1029 uint32_t FilesystemRevision;
1030 uint32_t CommHeaderAddress;
1031 uint32_t FastIoCommAreaAddress;
1032 uint32_t AdapterFibsPhysicalAddress;
1033 uint32_t AdapterFibsVirtualAddress;
1034 uint32_t AdapterFibsSize;
1035 uint32_t AdapterFibAlign;
1036 uint32_t PrintfBufferAddress;
1037 uint32_t PrintfBufferSize;
1038 uint32_t HostPhysMemPages;
1039 uint32_t HostElapsedSeconds;
1040 /* ADAPTER_INIT_STRUCT_REVISION_4 begins here */
1041 uint32_t InitFlags;
1042 uint32_t MaxIoCommands;
1043 uint32_t MaxIoSize;
1044 uint32_t MaxFibSize;
1047 /* ************AAC QUEUE DEFINES (BELOW)*********** */
1049 #define AAC_QUEUE_ALIGN 16
1050 #define AAC_QUEUE_COUNT 8
1051 #define AAC_PRODUCER_INDEX 0
1052 #define AAC_CONSUMER_INDEX 1
1054 struct aac_queue_entry {
1055 uint32_t aq_fib_size; /* FIB size in bytes */
1056 uint32_t aq_fib_addr; /* receiver-space address of the FIB */
1060 * Queue names
1062 * Note that we base these at 0 in order to use them as array indices.
1063 * Adaptec used base 1 for some unknown reason, and sorted them in a
1064 * different order.
1066 #define AAC_HOST_NORM_CMD_Q 0
1067 #define AAC_HOST_HIGH_CMD_Q 1
1068 #define AAC_ADAP_NORM_CMD_Q 2
1069 #define AAC_ADAP_HIGH_CMD_Q 3
1070 #define AAC_HOST_NORM_RESP_Q 4
1071 #define AAC_HOST_HIGH_RESP_Q 5
1072 #define AAC_ADAP_NORM_RESP_Q 6
1073 #define AAC_ADAP_HIGH_RESP_Q 7
1076 * We establish 4 command queues and matching response queues. Queues must
1077 * be 16-byte aligned, and are sized as follows:
1079 /* command adapter->host, normal priority */
1080 #define AAC_HOST_NORM_CMD_ENTRIES 8
1081 /* command adapter->host, high priority */
1082 #define AAC_HOST_HIGH_CMD_ENTRIES 4
1083 /* command host->adapter, normal priority */
1084 #define AAC_ADAP_NORM_CMD_ENTRIES 512
1085 /* command host->adapter, high priority */
1086 #define AAC_ADAP_HIGH_CMD_ENTRIES 4
1087 /* response, adapter->host, normal priority */
1088 #define AAC_HOST_NORM_RESP_ENTRIES 512
1089 /* response, adapter->host, high priority */
1090 #define AAC_HOST_HIGH_RESP_ENTRIES 4
1091 /* response, host->adapter, normal priority */
1092 #define AAC_ADAP_NORM_RESP_ENTRIES 8
1093 /* response, host->adapter, high priority */
1094 #define AAC_ADAP_HIGH_RESP_ENTRIES 4
1096 #define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \
1097 AAC_HOST_NORM_CMD_ENTRIES + \
1098 AAC_ADAP_HIGH_CMD_ENTRIES + \
1099 AAC_ADAP_NORM_CMD_ENTRIES + \
1100 AAC_HOST_HIGH_RESP_ENTRIES + \
1101 AAC_HOST_NORM_RESP_ENTRIES + \
1102 AAC_ADAP_HIGH_RESP_ENTRIES + \
1103 AAC_ADAP_NORM_RESP_ENTRIES)
1106 * Table of queue indices and queues used to communicate with the
1107 * controller. This structure must be aligned to AAC_QUEUE_ALIGN.
1109 struct aac_queue_table {
1110 /* queue consumer/producer indexes (layout mandated by adapter) */
1111 uint32_t qt_qindex[AAC_QUEUE_COUNT][2];
1113 /* queue entry structures (layout mandated by adapter) */
1114 struct aac_queue_entry qt_HostNormCmdQueue \
1115 [AAC_HOST_NORM_CMD_ENTRIES];
1116 struct aac_queue_entry qt_HostHighCmdQueue \
1117 [AAC_HOST_HIGH_CMD_ENTRIES];
1118 struct aac_queue_entry qt_AdapNormCmdQueue \
1119 [AAC_ADAP_NORM_CMD_ENTRIES];
1120 struct aac_queue_entry qt_AdapHighCmdQueue \
1121 [AAC_ADAP_HIGH_CMD_ENTRIES];
1122 struct aac_queue_entry qt_HostNormRespQueue \
1123 [AAC_HOST_NORM_RESP_ENTRIES];
1124 struct aac_queue_entry qt_HostHighRespQueue \
1125 [AAC_HOST_HIGH_RESP_ENTRIES];
1126 struct aac_queue_entry qt_AdapNormRespQueue \
1127 [AAC_ADAP_NORM_RESP_ENTRIES];
1128 struct aac_queue_entry qt_AdapHighRespQueue \
1129 [AAC_ADAP_HIGH_RESP_ENTRIES];
1131 /* ************AAC QUEUE DEFINES (ABOVE)*********** */
1134 * NVRAM/Write Cache subsystem battery component states
1136 typedef enum {
1137 NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */
1138 NVBATTSTATUS_LOW, /* battery is low on power */
1139 NVBATTSTATUS_OK, /* battery is okay - normal operation */
1140 /* possible only in this state */
1141 NVBATTSTATUS_RECONDITIONING /* no battery present */
1142 /* - reconditioning in process */
1143 } AAC_NVBATTSTATUS;
1146 * Battery transition type
1148 typedef enum {
1149 NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not */
1150 /* present */
1151 NVBATT_TRANSITION_LOW, /* battery is now low on power */
1152 NVBATT_TRANSITION_OK /* battery is now okay - normal */
1153 /* operation possible only in this state */
1154 } AAC_NVBATT_TRANSITION;
1157 * Data types relating to AIFs
1161 * Progress Reports
1163 typedef enum {
1164 AifJobStsSuccess = 1,
1165 AifJobStsFinished,
1166 AifJobStsAborted,
1167 AifJobStsFailed,
1168 AifJobStsLastReportMarker = 100, /* All prior mean last report */
1169 AifJobStsSuspended,
1170 AifJobStsRunning
1171 } AAC_AifJobStatus;
1173 typedef enum {
1174 AifJobScsiMin = 1, /* Minimum value for Scsi operation */
1175 AifJobScsiZero, /* SCSI device clear operation */
1176 AifJobScsiVerify, /* SCSI device Verify operation NO REPAIR */
1177 AifJobScsiExercise, /* SCSI device Exercise operation */
1178 AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH repair */
1179 AifJobScsiWritePattern, /* write pattern */
1180 AifJobScsiMax = 99, /* Max Scsi value */
1181 AifJobCtrMin, /* Min Ctr op value */
1182 AifJobCtrZero, /* Container clear operation */
1183 AifJobCtrCopy, /* Container copy operation */
1184 AifJobCtrCreateMirror, /* Container Create Mirror operation */
1185 AifJobCtrMergeMirror, /* Container Merge Mirror operation */
1186 AifJobCtrScrubMirror, /* Container Scrub Mirror operation */
1187 AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */
1188 AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */
1189 AifJobCtrMorph, /* Container morph operation */
1190 AifJobCtrPartCopy, /* Container Partition copy operation */
1191 AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */
1192 AifJobCtrCrazyCache, /* crazy cache */
1193 AifJobCtrCopyback, /* Container Copyback operation */
1194 AifJobCtrCompactRaid5D, /* Container Compaction operation */
1195 AifJobCtrExpandRaid5D, /* Container Expansion operation */
1196 AifJobCtrRebuildRaid6, /* Container Rebuild Raid6 operation */
1197 AifJobCtrScrubRaid6, /* Container Scrub Raid6 operation */
1198 AifJobCtrSSBackup, /* Container snapshot backup task */
1199 AifJobCtrMax = 199, /* Max Ctr type operation */
1200 AifJobFsMin, /* Min Fs type operation */
1201 AifJobFsCreate, /* File System Create operation */
1202 AifJobFsVerify, /* File System Verify operation */
1203 AifJobFsExtend, /* File System Extend operation */
1204 AifJobFsMax = 299, /* Max Fs type operation */
1205 AifJobApiFormatNTFS, /* Format a drive to NTFS */
1206 AifJobApiFormatFAT, /* Format a drive to FAT */
1207 AifJobApiUpdateSnapshot, /* update the read/write half of a snapshot */
1208 AifJobApiFormatFAT32, /* Format a drive to FAT32 */
1209 AifJobApiMax = 399, /* Max API type operation */
1210 AifJobCtlContinuousCtrVerify, /* Adapter operation */
1211 AifJobCtlMax = 499 /* Max Adapter type operation */
1212 } AAC_AifJobType;
1214 struct aac_AifContainers {
1215 uint32_t src; /* from/master */
1216 uint32_t dst; /* to/slave */
1219 union aac_AifJobClient {
1220 struct aac_AifContainers container; /* For Container and */
1221 /* filesystem progress ops */
1222 int32_t scsi_dh; /* For SCSI progress ops */
1225 struct aac_AifJobDesc {
1226 uint32_t jobID; /* DO NOT FILL IN! Will be filled in by AIF */
1227 AAC_AifJobType type; /* Operation that is being performed */
1228 union aac_AifJobClient client; /* Details */
1231 struct aac_AifJobProgressReport {
1232 struct aac_AifJobDesc jd;
1233 AAC_AifJobStatus status;
1234 uint32_t finalTick;
1235 uint32_t currentTick;
1236 uint32_t jobSpecificData1;
1237 uint32_t jobSpecificData2;
1241 * Event Notification
1243 typedef enum {
1244 /* General application notifies start here */
1245 AifEnGeneric = 1, /* Generic notification */
1246 AifEnTaskComplete, /* Task has completed */
1247 AifEnConfigChange, /* Adapter config change occurred */
1248 AifEnContainerChange, /* Adapter specific container cfg. change */
1249 AifEnDeviceFailure, /* SCSI device failed */
1250 AifEnMirrorFailover, /* Mirror failover started */
1251 AifEnContainerEvent, /* Significant container event */
1252 AifEnFileSystemChange, /* File system changed */
1253 AifEnConfigPause, /* Container pause event */
1254 AifEnConfigResume, /* Container resume event */
1255 AifEnFailoverChange, /* Failover space assignment changed */
1256 AifEnRAID5RebuildDone, /* RAID5 rebuild finished */
1257 AifEnEnclosureManagement, /* Enclosure management event */
1258 AifEnBatteryEvent, /* Significant NV battery event */
1259 AifEnAddContainer, /* A new container was created. */
1260 AifEnDeleteContainer, /* A container was deleted. */
1261 AifEnSMARTEvent, /* SMART Event */
1262 AifEnBatteryNeedsRecond, /* The battery needs reconditioning */
1263 AifEnClusterEvent, /* Some cluster event */
1264 AifEnDiskSetEvent, /* A disk set event occured. */
1265 AifEnAddJBOD = 30, /* A new JBOD type drive was created (30) */
1266 AifEnDeleteJBOD = 31, /* A JBOD type drive was deleted (31) */
1267 AifDriverNotifyStart = 199, /* Notifies for host driver go here */
1268 /* Host driver notifications start here */
1269 AifDenMorphComplete, /* A morph operation completed */
1270 AifDenVolumeExtendComplete /* Volume expand operation completed */
1271 } AAC_AifEventNotifyType;
1273 struct aac_AifEnsGeneric {
1274 char text[132]; /* Generic text */
1277 struct aac_AifEnsDeviceFailure {
1278 uint32_t deviceHandle; /* SCSI device handle */
1281 struct aac_AifEnsMirrorFailover {
1282 uint32_t container; /* Container with failed element */
1283 uint32_t failedSlice; /* Old slice which failed */
1284 uint32_t creatingSlice; /* New slice used for auto-create */
1287 struct aac_AifEnsContainerChange {
1288 uint32_t container[2]; /* container that changed, -1 if */
1289 /* no container */
1292 struct aac_AifEnsContainerEvent {
1293 uint32_t container; /* container number */
1294 uint32_t eventType; /* event type */
1297 struct aac_AifEnsEnclosureEvent {
1298 uint32_t empID; /* enclosure management proc number */
1299 uint32_t unitID; /* unitId, fan id, power supply id, */
1300 /* slot id, tempsensor id. */
1301 uint32_t eventType; /* event type */
1304 struct aac_AifEnsBatteryEvent {
1305 AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */
1306 AAC_NVBATTSTATUS current_state; /* current batt state */
1307 AAC_NVBATTSTATUS prior_state; /* prev batt state */
1310 struct aac_AifEnsDiskSetEvent {
1311 uint32_t eventType;
1312 uint64_t DsNum;
1313 uint64_t CreatorId;
1316 typedef enum {
1317 CLUSTER_NULL_EVENT = 0,
1318 CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or */
1319 /* adaptername from NULL to non-NULL */
1320 /* (partner's agent may be up) */
1321 CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or */
1322 /* adaptername from non-null to NULL */
1323 /* (partner has rebooted) */
1324 } AAC_ClusterAifEvent;
1326 struct aac_AifEnsClusterEvent {
1327 AAC_ClusterAifEvent eventType;
1330 struct aac_AifEventNotify {
1331 AAC_AifEventNotifyType type;
1332 union {
1333 struct aac_AifEnsGeneric EG;
1334 struct aac_AifEnsDeviceFailure EDF;
1335 struct aac_AifEnsMirrorFailover EMF;
1336 struct aac_AifEnsContainerChange ECC;
1337 struct aac_AifEnsContainerEvent ECE;
1338 struct aac_AifEnsEnclosureEvent EEE;
1339 struct aac_AifEnsBatteryEvent EBE;
1340 struct aac_AifEnsDiskSetEvent EDS;
1341 /* struct aac_AifEnsSMARTEvent ES; */
1342 struct aac_AifEnsClusterEvent ECLE;
1343 } data;
1347 * Adapter Initiated FIB command structures. Start with the adapter
1348 * initiated FIBs that really come from the adapter, and get responded
1349 * to by the host.
1351 #define AAC_AIF_REPORT_MAX_SIZE 64
1353 typedef enum {
1354 AifCmdEventNotify = 1, /* Notify of event */
1355 AifCmdJobProgress, /* Progress report */
1356 AifCmdAPIReport, /* Report from other user of API */
1357 AifCmdDriverNotify, /* Notify host driver of event */
1358 AifReqJobList = 100, /* Gets back complete job list */
1359 AifReqJobsForCtr, /* Gets back jobs for specific container */
1360 AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */
1361 AifReqJobReport, /* Gets back a specific job report or list */
1362 AifReqTerminateJob, /* Terminates job */
1363 AifReqSuspendJob, /* Suspends a job */
1364 AifReqResumeJob, /* Resumes a job */
1365 AifReqSendAPIReport, /* API generic report requests */
1366 AifReqAPIJobStart, /* Start a job from the API */
1367 AifReqAPIJobUpdate, /* Update a job report from the API */
1368 AifReqAPIJobFinish /* Finish a job from the API */
1369 } AAC_AifCommand;
1371 struct aac_aif_command {
1372 AAC_AifCommand command; /* Tell host what type of notify this is */
1373 uint32_t seqNumber; /* To allow ordering of reports */
1374 /* (if necessary) */
1375 union {
1376 struct aac_AifEventNotify EN; /* Event notify */
1377 struct aac_AifJobProgressReport PR[1]; /* Progress report */
1378 uint8_t AR[AAC_AIF_REPORT_MAX_SIZE];
1379 uint8_t data[AAC_FIB_DATASIZE - 8];
1380 } data;
1383 #define CT_PUP_MISSING_DRIVE 27
1386 * Cluster Management Commands
1388 typedef enum {
1389 CL_NULL = 0, /* 0x00 null */
1390 /* disk set commands */
1391 DS_INIT = 1, /* 0x01 init disk set control block */
1392 DS_RESCAN, /* 0x02 refresh drive, disk set, and slice */
1393 /* structs */
1394 DS_CREATE, /* 0x03 create a disk set */
1395 DS_DELETE, /* 0x04 delete a disk set */
1396 DS_ADD_DISK, /* 0x05 add a disk to an existing disk set */
1397 DS_REMOVE_DISK, /* 0x06 remove a disk from an existing disk */
1398 /* set */
1399 DS_MOVE_DISK, /* 0x07 move a disk from one existing disk */
1400 /* set to another */
1401 DS_TAKE_OWNERSHIP, /* 0x08 take ownership of an unowned disk set */
1402 DS_RELEASE_OWNERSHIP, /* 0x09 release ownership of a disk set */
1403 DS_FORCE_OWNERSHIP, /* 0x0A force ownership of an disk set */
1404 DS_GET_DISK_SET_PARAM, /* 0x0B get info on a disk set */
1405 DS_GET_DRIVE_PARAM, /* 0x0C get info on a drive */
1406 DS_GET_SLICE_PARAM, /* 0x0D get info on a slice */
1407 DS_GET_DISK_SETS, /* 0x0E get a list of disk sets */
1408 DS_GET_DRIVES, /* 0x0F get a list of drives */
1409 DS_SET_DISK_SET_PARAM, /* 0x10 set info of a disk set */
1410 DS_ONLINE, /* 0x11 take disk set online */
1411 DS_OFFLINE, /* 0x12 take disk set offline */
1412 DS_ONLINE_CONTAINERS, /* 0x13 bring containers in diskset online */
1413 DS_FSAPRINT, /* 0x14 do an FsaPrint */
1415 /* config commands */
1416 CL_CFG_SET_HOST_IDS = 0x100, /* 0x100 set host ids (host name and */
1417 /* adapter name) */
1418 CL_CFG_SET_PARTNER_HOST_IDS, /* 0x101 set partner host ids (host */
1419 /* name and adapter name) */
1420 CL_CFG_GET_CLUSTER_CONFIG, /* 0x102 get cluster configuration */
1422 /* cluster comm commands */
1423 CC_CLI_CLEAR_MESSAGE_BUFFER = 0x200, /* 0x200 CC - client - clear */
1424 /* contents of message buffer */
1425 CC_SRV_CLEAR_MESSAGE_BUFFER, /* 0x201 CC - server - clear contents */
1426 /* of message buffer */
1427 CC_CLI_SHOW_MESSAGE_BUFFER, /* 0x202 CC - client - show contents */
1428 /* of message buffer */
1429 CC_SRV_SHOW_MESSAGE_BUFFER, /* 0x203 CC - server - show contents */
1430 /* of message buffer */
1431 CC_CLI_SEND_MESSAGE, /* 0x204 CC - client - send (req) message to */
1432 /* server side */
1433 CC_SRV_SEND_MESSAGE, /* 0x205 CC - server - send (reply) message */
1434 /* to client side */
1435 CC_CLI_GET_MESSAGE, /* 0x206 CC - client - read thru read message */
1436 /* buffer */
1437 CC_SRV_GET_MESSAGE, /* 0x207 CC - server - read thru read message */
1438 /* buffer */
1439 CC_SEND_TEST_MESSAGE, /* 0x208 CC - send a special subclass message */
1440 CC_GET_BUSINFO, /* 0x209 CC - get bus info */
1441 CC_GET_PORTINFO, /* 0x20A CC - get bus,port info */
1442 CC_GET_NAMEINFO, /* 0x20B CC - get misc info */
1443 CC_GET_CONFIGINFO, /* 0x20C CC - get misc info */
1444 CQ_QUORUM_OP = 0x300, /* 0x300 CQ - quorum messages */
1446 /* last command */
1447 CL_LAST_COMMAND /* used for bounds checking */
1448 } AAC_CLCommand;
1451 * Disk IOCTL Functions
1453 #define Reserved_IOCTL 0x0000
1454 #define GetDeviceHandle 0x0001
1455 #define BusTargetLun_to_DeviceHandle 0x0002
1456 #define DeviceHandle_to_BusTargetLun 0x0003
1457 #define RescanBus 0x0004
1458 #define GetDeviceProbeInfo 0x0005
1459 #define GetDeviceCapacity 0x0006
1460 #define GetContainerProbeInfo 0x0007 /* Container, not diskclass */
1461 /* ioctl */
1462 #define GetRequestedMemorySize 0x0008
1463 #define GetBusInfo 0x0009
1464 #define GetVendorSpecific 0x000a
1466 #define EnhancedGetDeviceProbeInfo 0x000b
1467 #define EnhancedGetBusInfo 0x000c
1469 #define SetupExtendedCounters 0x000d
1470 #define GetPerformanceCounters 0x000f
1471 #define ResetPerformanceCounters 0x0010
1472 #define ReadModePage 0x0011
1473 #define WriteModePage 0x0012
1474 #define ReadDriveParameter 0x0013
1475 #define WriteDriveParameter 0x0014
1476 #define ResetAdapter 0x0015
1477 #define ResetBus 0x0016
1478 #define ResetBusDevice 0x0017
1479 #define ExecuteSrb 0x0018
1481 #define Create_IO_Task 0x0030
1482 #define Delete_IO_Task 0x0031
1483 #define Get_IO_Task_Info 0x0032
1484 #define Check_Task_Progress 0x0033
1486 #define InjectError 0x0040
1487 #define GetDeviceDefectCounts 0x0041
1488 #define GetDeviceDefectInfo 0x0042
1489 #define GetDeviceStatus 0x0043
1490 #define ClearDeviceStatus 0x0044
1491 #define DiskSpinControl 0x0045
1492 #define DiskSmartControl 0x0046
1493 #define WriteSame 0x0047
1494 #define ReadWriteLong 0x0048
1495 #define FormatUnit 0x0049
1497 #define TargetDeviceControl 0x0050
1498 #define TargetChannelControl 0x0051
1500 #define FlashNewCode 0x0052
1501 #define DiskCheck 0x0053
1502 #define RequestSense 0x0054
1503 #define DiskPERControl 0x0055
1504 #define Read10 0x0056
1505 #define Write10 0x0057
1508 * The following definitions come from Adaptec:
1510 * SRB is required for the new management tools
1511 * and non-DASD support.
1513 struct aac_srb
1515 uint32_t function;
1516 uint32_t channel;
1517 uint32_t id;
1518 uint32_t lun;
1519 uint32_t timeout; /* timeout in sec. */
1520 uint32_t flags;
1521 uint32_t count; /* data xfer size */
1522 uint32_t retry_limit; /* obsolete */
1523 uint32_t cdb_size;
1524 uint8_t cdb[16];
1525 struct aac_sg_table sg;
1528 #define AAC_SENSE_BUFFERSIZE 30
1530 struct aac_srb_reply
1532 uint32_t status;
1533 uint32_t srb_status;
1534 uint32_t scsi_status;
1535 uint32_t data_xfer_length;
1536 uint32_t sense_data_size;
1537 uint8_t sense_data[AAC_SENSE_BUFFERSIZE];
1541 * SRB Flags
1543 #define SRB_NoDataXfer 0x0000
1544 #define SRB_DisableDisconnect 0x0004
1545 #define SRB_DisableSynchTransfer 0x0008
1546 #define SRB_BypassFrozenQueue 0x0010
1547 #define SRB_DisableAutosense 0x0020
1548 #define SRB_DataIn 0x0040
1549 #define SRB_DataOut 0x0080
1552 * SRB Functions - set in aac_srb->function
1554 #define SRBF_ExecuteScsi 0x0000
1555 #define SRBF_ClaimDevice 0x0001
1556 #define SRBF_IO_Control 0x0002
1557 #define SRBF_ReceiveEvent 0x0003
1558 #define SRBF_ReleaseQueue 0x0004
1559 #define SRBF_AttachDevice 0x0005
1560 #define SRBF_ReleaseDevice 0x0006
1561 #define SRBF_Shutdown 0x0007
1562 #define SRBF_Flush 0x0008
1563 #define SRBF_AbortCommand 0x0010
1564 #define SRBF_ReleaseRecovery 0x0011
1565 #define SRBF_ResetBus 0x0012
1566 #define SRBF_ResetDevice 0x0013
1567 #define SRBF_TerminateIO 0x0014
1568 #define SRBF_FlushQueue 0x0015
1569 #define SRBF_RemoveDevice 0x0016
1570 #define SRBF_DomainValidation 0x0017
1573 * SRB SCSI Status
1574 * Status codes for SCSI passthrough commands,
1575 * set in aac_srb->scsi_status
1577 #define SRB_STATUS_PENDING 0x00
1578 #define SRB_STATUS_SUCCESS 0x01
1579 #define SRB_STATUS_ABORTED 0x02
1580 #define SRB_STATUS_ABORT_FAILED 0x03
1581 #define SRB_STATUS_ERROR 0x04
1582 #define SRB_STATUS_BUSY 0x05
1583 #define SRB_STATUS_INVALID_REQUEST 0x06
1584 #define SRB_STATUS_INVALID_PATH_ID 0x07
1585 #define SRB_STATUS_NO_DEVICE 0x08
1586 #define SRB_STATUS_TIMEOUT 0x09
1587 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
1588 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
1589 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
1590 #define SRB_STATUS_BUS_RESET 0x0E
1591 #define SRB_STATUS_PARITY_ERROR 0x0F
1592 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
1593 #define SRB_STATUS_NO_HBA 0x11
1594 #define SRB_STATUS_DATA_OVERRUN 0x12
1595 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
1596 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
1597 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
1598 #define SRB_STATUS_REQUEST_FLUSHED 0x16
1599 #define SRB_STATUS_DELAYED_RETRY 0x17
1600 #define SRB_STATUS_INVALID_LUN 0x20
1601 #define SRB_STATUS_INVALID_TARGET_ID 0x21
1602 #define SRB_STATUS_BAD_FUNCTION 0x22
1603 #define SRB_STATUS_ERROR_RECOVERY 0x23
1604 #define SRB_STATUS_NOT_STARTED 0x24
1605 #define SRB_STATUS_NOT_IN_USE 0x30
1606 #define SRB_STATUS_FORCE_ABORT 0x31
1607 #define SRB_STATUS_DOMAIN_VALIDATION_FAIL 0x32
1609 #pragma pack()
1612 * Aligned structure definition for variable declarations that require
1613 * alignment.
1615 union aac_fib_align {
1616 struct aac_fib d;
1617 uint32_t dumb;
1620 /* AAC Communication Space */
1621 struct aac_comm_space {
1622 struct aac_fib adapter_fibs[AAC_ADAPTER_FIBS];
1623 struct aac_adapter_init init_data;
1624 struct aac_queue_table qtable;
1625 char qt_align_pad[AAC_QUEUE_ALIGN];
1626 char adapter_print_buf[AAC_ADAPTER_PRINT_BUFSIZE];
1629 #ifdef __cplusplus
1631 #endif
1633 #endif /* __AAC_REGS_H__ */