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