Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/aacraid/aacraid_reg.h
39536 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-2010 Adaptec, Inc.
8
* Copyright (c) 2010-2012 PMC-Sierra, Inc.
9
* All rights reserved.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
* SUCH DAMAGE.
31
*/
32
33
/*
34
* Data structures defining the interface between the driver and the Adaptec
35
* 'FSA' adapters. Note that many field names and comments here are taken
36
* verbatim from the Adaptec driver source in order to make comparing the
37
* two slightly easier.
38
*/
39
40
/*
41
* Misc. magic numbers.
42
*/
43
#define AAC_MAX_CONTAINERS 240
44
#define AAC_BLOCK_SIZE 512
45
46
/*
47
* Communications interface.
48
*
49
* Where datastructure layouts are closely parallel to the Adaptec sample code,
50
* retain their naming conventions (for now) to aid in cross-referencing.
51
*/
52
53
/* transport FIB header (PMC) */
54
struct aac_fib_xporthdr {
55
u_int64_t HostAddress; /* FIB host address w/o xport header */
56
u_int32_t Size; /* FIB size excluding xport header */
57
u_int32_t Handle; /* driver handle to reference the FIB */
58
u_int64_t Reserved[2];
59
} __packed;
60
61
/*
62
* List structure used to chain FIBs (used by the adapter - we hang FIBs off
63
* our private command structure and don't touch these)
64
*/
65
struct aac_fib_list_entry {
66
u_int32_t Flink;
67
u_int32_t Blink;
68
} __packed;
69
70
/*
71
* FIB (FSA Interface Block?); this is the datastructure passed between the host
72
* and adapter.
73
*/
74
struct aac_fib_header {
75
u_int32_t XferState;
76
u_int16_t Command;
77
u_int8_t StructType;
78
u_int8_t Unused;
79
u_int16_t Size;
80
u_int16_t SenderSize;
81
u_int32_t SenderFibAddress;
82
union {
83
u_int32_t ReceiverFibAddress;
84
u_int32_t SenderFibAddressHigh;
85
u_int32_t TimeStamp;
86
} u;
87
u_int32_t Handle;
88
u_int32_t Previous;
89
u_int32_t Next;
90
} __packed;
91
92
#define AAC_FIB_DATASIZE (512 - sizeof(struct aac_fib_header))
93
94
struct aac_fib {
95
struct aac_fib_header Header;
96
u_int8_t data[AAC_FIB_DATASIZE];
97
} __packed;
98
99
/*
100
* FIB commands
101
*/
102
typedef enum {
103
TestCommandResponse = 1,
104
TestAdapterCommand = 2,
105
106
/* lowlevel and comm commands */
107
LastTestCommand = 100,
108
ReinitHostNormCommandQueue = 101,
109
ReinitHostHighCommandQueue = 102,
110
ReinitHostHighRespQueue = 103,
111
ReinitHostNormRespQueue = 104,
112
ReinitAdapNormCommandQueue = 105,
113
ReinitAdapHighCommandQueue = 107,
114
ReinitAdapHighRespQueue = 108,
115
ReinitAdapNormRespQueue = 109,
116
InterfaceShutdown = 110,
117
DmaCommandFib = 120,
118
StartProfile = 121,
119
TermProfile = 122,
120
SpeedTest = 123,
121
TakeABreakPt = 124,
122
RequestPerfData = 125,
123
SetInterruptDefTimer= 126,
124
SetInterruptDefCount= 127,
125
GetInterruptDefStatus= 128,
126
LastCommCommand = 129,
127
128
/* filesystem commands */
129
NuFileSystem = 300,
130
UFS = 301,
131
HostFileSystem = 302,
132
LastFileSystemCommand = 303,
133
134
/* Container Commands */
135
ContainerCommand = 500,
136
ContainerCommand64 = 501,
137
RawIo = 502,
138
RawIo2 = 503,
139
140
/* Cluster Commands */
141
ClusterCommand = 550,
142
143
/* Scsi Port commands (scsi passthrough) */
144
ScsiPortCommand = 600,
145
ScsiPortCommandU64 = 601,
146
SataPortCommandU64 = 602,
147
SasSmpPassThrough = 603,
148
SasRequestPhyInfo = 612,
149
150
/* misc house keeping and generic adapter initiated commands */
151
AifRequest = 700,
152
CheckRevision = 701,
153
FsaHostShutdown = 702,
154
RequestAdapterInfo = 703,
155
IsAdapterPaused = 704,
156
SendHostTime = 705,
157
RequestSupplementAdapterInfo = 706, /* Supp. Info for set in UCC
158
* use only if supported
159
* (RequestAdapterInfo first) */
160
LastMiscCommand = 707,
161
162
OnLineDiagnostic = 800,
163
FduAdapterTest = 801,
164
RequestCompatibilityId = 802,
165
AdapterEnvironmentInfo = 803, /* temp. sensors */
166
NvsramEventLog = 900,
167
ResetNvsramEventLogPointers = 901,
168
EnableEventLog = 902,
169
DisableEventLog = 903,
170
EncryptedKeyTransportFIB= 904,
171
KeyableFeaturesFIB= 905
172
} AAC_FibCommands;
173
174
/*
175
* FIB types
176
*/
177
#define AAC_FIBTYPE_TFIB 1
178
#define AAC_FIBTYPE_TQE 2
179
#define AAC_FIBTYPE_TCTPERF 3
180
#define AAC_FIBTYPE_TFIB2 4
181
#define AAC_FIBTYPE_TFIB2_64 5
182
183
/*
184
* FIB transfer state
185
*/
186
#define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */
187
#define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */
188
#define AAC_FIBSTATE_INITIALISED (1<<2) /* initialised */
189
#define AAC_FIBSTATE_EMPTY (1<<3) /* empty */
190
#define AAC_FIBSTATE_FROMPOOL (1<<4) /* allocated from pool */
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_RNOTEXPECTED (1<<8) /* response is not 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_HIGH (1<<11) /* high priority */
198
#define AAC_FIBSTATE_NORM (1<<12) /* normal priority */
199
#define AAC_FIBSTATE_ASYNC (1<<13)
200
#define AAC_FIBSTATE_ASYNCIO (1<<13) /* to be removed */
201
#define AAC_FIBSTATE_PAGEFILEIO (1<<14) /* to be removed */
202
#define AAC_FIBSTATE_SHUTDOWN (1<<15)
203
#define AAC_FIBSTATE_LAZYWRITE (1<<16) /* to be removed */
204
#define AAC_FIBSTATE_ADAPMICROFIB (1<<17)
205
#define AAC_FIBSTATE_BIOSFIB (1<<18)
206
#define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */
207
#define AAC_FIBSTATE_APIFIB (1<<20)
208
#define AAC_FIBSTATE_NOMOREAIF (1<<21)
209
210
/*
211
* FIB error values
212
*/
213
#define AAC_ERROR_NORMAL 0x00
214
#define AAC_ERROR_PENDING 0x01
215
#define AAC_ERROR_FATAL 0x02
216
#define AAC_ERROR_INVALID_QUEUE 0x03
217
#define AAC_ERROR_NOENTRIES 0x04
218
#define AAC_ERROR_SENDFAILED 0x05
219
#define AAC_ERROR_INVALID_QUEUE_PRIORITY 0x06
220
#define AAC_ERROR_FIB_ALLOCATION_FAILED 0x07
221
#define AAC_ERROR_FIB_DEALLOCATION_FAILED 0x08
222
223
/*
224
* Adapter Init Structure: this is passed to the adapter with the
225
* AAC_MONKER_INITSTRUCT command to point it at our control structures.
226
*/
227
struct aac_adapter_init {
228
u_int32_t InitStructRevision;
229
#define AAC_INIT_STRUCT_REVISION 3
230
#define AAC_INIT_STRUCT_REVISION_4 4
231
#define AAC_INIT_STRUCT_REVISION_6 6
232
#define AAC_INIT_STRUCT_REVISION_7 7
233
u_int32_t NoOfMSIXVectors;
234
u_int32_t FilesystemRevision;
235
u_int32_t CommHeaderAddress;
236
u_int32_t FastIoCommAreaAddress;
237
u_int32_t AdapterFibsPhysicalAddress;
238
u_int32_t AdapterFibsVirtualAddress;
239
u_int32_t AdapterFibsSize;
240
u_int32_t AdapterFibAlign;
241
u_int32_t PrintfBufferAddress;
242
u_int32_t PrintfBufferSize;
243
#define AAC_PAGE_SIZE 4096
244
u_int32_t HostPhysMemPages;
245
u_int32_t HostElapsedSeconds;
246
/* ADAPTER_INIT_STRUCT_REVISION_4 begins here */
247
u_int32_t InitFlags; /* flags for supported features */
248
#define AAC_INITFLAGS_NEW_COMM_SUPPORTED 1
249
#define AAC_INITFLAGS_DRIVER_USES_UTC_TIME 0x10
250
#define AAC_INITFLAGS_DRIVER_SUPPORTS_PM 0x20
251
#define AAC_INITFLAGS_NEW_COMM_TYPE1_SUPPORTED 0x40
252
#define AAC_INITFLAGS_FAST_JBOD_SUPPORTED 0x80
253
#define AAC_INITFLAGS_NEW_COMM_TYPE2_SUPPORTED 0x100
254
u_int32_t MaxIoCommands; /* max outstanding commands */
255
u_int32_t MaxIoSize; /* largest I/O command */
256
u_int32_t MaxFibSize; /* largest FIB to adapter */
257
/* ADAPTER_INIT_STRUCT_REVISION_5 begins here */
258
u_int32_t MaxNumAif; /* max number of aif */
259
/* ADAPTER_INIT_STRUCT_REVISION_6 begins here */
260
u_int32_t HostRRQ_AddrLow;
261
u_int32_t HostRRQ_AddrHigh; /* Host RRQ (response queue) for SRC */
262
} __packed;
263
264
/*
265
* Shared data types
266
*/
267
/*
268
* Container types
269
*/
270
typedef enum {
271
CT_NONE = 0,
272
CT_VOLUME,
273
CT_MIRROR,
274
CT_STRIPE,
275
CT_RAID5,
276
CT_SSRW,
277
CT_SSRO,
278
CT_MORPH,
279
CT_PASSTHRU,
280
CT_RAID4,
281
CT_RAID10, /* stripe of mirror */
282
CT_RAID00, /* stripe of stripe */
283
CT_VOLUME_OF_MIRRORS, /* volume of mirror */
284
CT_PSEUDO_RAID3, /* really raid4 */
285
CT_RAID50, /* stripe of raid5 */
286
CT_RAID5D, /* raid5 distributed hot-sparing */
287
CT_RAID5D0,
288
CT_RAID1E, /* extended raid1 mirroring */
289
CT_RAID6,
290
CT_RAID60,
291
} AAC_FSAVolType;
292
293
/*
294
* Host-addressable object types
295
*/
296
typedef enum {
297
FT_REG = 1, /* regular file */
298
FT_DIR, /* directory */
299
FT_BLK, /* "block" device - reserved */
300
FT_CHR, /* "character special" device - reserved */
301
FT_LNK, /* symbolic link */
302
FT_SOCK, /* socket */
303
FT_FIFO, /* fifo */
304
FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */
305
FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */
306
FT_SLICE, /* virtual disk - raw volume - slice */
307
FT_PARTITION, /* FSA partition - carved out of a slice - building
308
* block for containers */
309
FT_VOLUME, /* Container - Volume Set */
310
FT_STRIPE, /* Container - Stripe Set */
311
FT_MIRROR, /* Container - Mirror Set */
312
FT_RAID5, /* Container - Raid 5 Set */
313
FT_DATABASE /* Storage object with "foreign" content manager */
314
} AAC_FType;
315
316
/*
317
* Host-side scatter/gather list for 32-bit commands.
318
*/
319
struct aac_sg_entry {
320
u_int32_t SgAddress;
321
u_int32_t SgByteCount;
322
} __packed;
323
324
struct aac_sg_entry64 {
325
u_int64_t SgAddress;
326
u_int32_t SgByteCount;
327
} __packed;
328
329
struct aac_sg_entryraw {
330
u_int32_t Next; /* reserved for FW use */
331
u_int32_t Prev; /* reserved for FW use */
332
u_int64_t SgAddress;
333
u_int32_t SgByteCount;
334
u_int32_t Flags; /* reserved for FW use */
335
} __packed;
336
337
struct aac_sg_table {
338
u_int32_t SgCount;
339
struct aac_sg_entry SgEntry[0];
340
} __packed;
341
342
/*
343
* Host-side scatter/gather list for 64-bit commands.
344
*/
345
struct aac_sg_table64 {
346
u_int32_t SgCount;
347
struct aac_sg_entry64 SgEntry64[0];
348
} __packed;
349
350
/*
351
* s/g list for raw commands
352
*/
353
struct aac_sg_tableraw {
354
u_int32_t SgCount;
355
struct aac_sg_entryraw SgEntryRaw[0];
356
} __packed;
357
358
/*
359
* new ieee1212 s/g element
360
*/
361
struct aac_sge_ieee1212 {
362
u_int32_t addrLow;
363
u_int32_t addrHigh;
364
u_int32_t length;
365
u_int32_t flags; /* always 0 from host side */
366
} __packed;
367
368
/*
369
* Container creation data
370
*/
371
struct aac_container_creation {
372
u_int8_t ViaBuildNumber;
373
u_int8_t MicroSecond;
374
u_int8_t Via; /* 1 = FSU, 2 = API, etc. */
375
u_int8_t YearsSince1900;
376
u_int32_t Month:4; /* 1-12 */
377
u_int32_t Day:6; /* 1-32 */
378
u_int32_t Hour:6; /* 0-23 */
379
u_int32_t Minute:6; /* 0-59 */
380
u_int32_t Second:6; /* 0-59 */
381
u_int64_t ViaAdapterSerialNumber;
382
} __packed;
383
384
/*
385
* Revision number handling
386
*/
387
388
typedef enum {
389
RevApplication = 1,
390
RevDkiCli,
391
RevNetService,
392
RevApi,
393
RevFileSysDriver,
394
RevMiniportDriver,
395
RevAdapterSW,
396
RevMonitor,
397
RevRemoteApi
398
} RevComponent;
399
400
struct FsaRevision {
401
union {
402
struct {
403
u_int8_t dash;
404
u_int8_t type;
405
u_int8_t minor;
406
u_int8_t major;
407
} comp;
408
u_int32_t ul;
409
} external;
410
u_int32_t buildNumber;
411
} __packed;
412
413
/*
414
* Adapter Information
415
*/
416
417
typedef enum {
418
CPU_NTSIM = 1,
419
CPU_I960,
420
CPU_ARM,
421
CPU_SPARC,
422
CPU_POWERPC,
423
CPU_ALPHA,
424
CPU_P7,
425
CPU_I960_RX,
426
CPU_MIPS,
427
CPU_XSCALE,
428
CPU__last
429
} AAC_CpuType;
430
431
typedef enum {
432
CPUI960_JX = 1,
433
CPUI960_CX,
434
CPUI960_HX,
435
CPUI960_RX,
436
CPUARM_SA110,
437
CPUARM_xxx,
438
CPUPPC_603e,
439
CPUPPC_xxx,
440
CPUI960_80303,
441
CPU_XSCALE_80321,
442
CPU_MIPS_4KC,
443
CPU_MIPS_5KC,
444
CPUSUBTYPE__last
445
} AAC_CpuSubType;
446
447
typedef enum {
448
PLAT_NTSIM = 1,
449
PLAT_V3ADU,
450
PLAT_CYCLONE,
451
PLAT_CYCLONE_HD,
452
PLAT_BATBOARD,
453
PLAT_BATBOARD_HD,
454
PLAT_YOLO,
455
PLAT_COBRA,
456
PLAT_ANAHEIM,
457
PLAT_JALAPENO,
458
PLAT_QUEENS,
459
PLAT_JALAPENO_DELL,
460
PLAT_POBLANO,
461
PLAT_POBLANO_OPAL,
462
PLAT_POBLANO_SL0,
463
PLAT_POBLANO_SL1,
464
PLAT_POBLANO_SL2,
465
PLAT_POBLANO_XXX,
466
PLAT_JALAPENO_P2,
467
PLAT_HABANERO,
468
PLAT_VULCAN,
469
PLAT_CRUSADER,
470
PLAT_LANCER,
471
PLAT_HARRIER,
472
PLAT_TERMINATOR,
473
PLAT_SKYHAWK,
474
PLAT_CORSAIR,
475
PLAT_JAGUAR,
476
PLAT_SATAHAWK,
477
PLAT_SATANATOR,
478
PLAT_PROWLER,
479
PLAT_BLACKBIRD,
480
PLAT_SABREEXPRESS,
481
PLAT_INTRUDER,
482
PLAT__last
483
} AAC_Platform;
484
485
typedef enum {
486
OEM_FLAVOR_ADAPTEC = 1,
487
OEM_FLAVOR_DELL,
488
OEM_FLAVOR_HP,
489
OEM_FLAVOR_IBM,
490
OEM_FLAVOR_CPQ,
491
OEM_FLAVOR_FSC,
492
OEM_FLAVOR_DWS,
493
OEM_FLAVOR_BRAND_Z,
494
OEM_FLAVOR_LEGEND,
495
OEM_FLAVOR_HITACHI,
496
OEM_FLAVOR_ESG,
497
OEM_FLAVOR_ICP,
498
OEM_FLAVOR_SCM,
499
OEM_FLAVOR__last
500
} AAC_OemFlavor;
501
502
/*
503
* XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
504
*/
505
typedef enum
506
{
507
PLATFORM_BAT_REQ_PRESENT = 1, /* BATTERY REQUIRED AND PRESENT */
508
PLATFORM_BAT_REQ_NOTPRESENT, /* BATTERY REQUIRED AND NOT PRESENT */
509
PLATFORM_BAT_OPT_PRESENT, /* BATTERY OPTIONAL AND PRESENT */
510
PLATFORM_BAT_OPT_NOTPRESENT, /* BATTERY OPTIONAL AND NOT PRESENT */
511
PLATFORM_BAT_NOT_SUPPORTED /* BATTERY NOT SUPPORTED */
512
} AAC_BatteryPlatform;
513
514
/*
515
* options supported by this board
516
* there has to be a one to one mapping of these defines and the ones in
517
* fsaapi.h, search for FSA_SUPPORT_SNAPSHOT
518
*/
519
#define AAC_SUPPORTED_SNAPSHOT 0x01
520
#define AAC_SUPPORTED_CLUSTERS 0x02
521
#define AAC_SUPPORTED_WRITE_CACHE 0x04
522
#define AAC_SUPPORTED_64BIT_DATA 0x08
523
#define AAC_SUPPORTED_HOST_TIME_FIB 0x10
524
#define AAC_SUPPORTED_RAID50 0x20
525
#define AAC_SUPPORTED_4GB_WINDOW 0x40
526
#define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80
527
#define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100
528
#define AAC_SUPPORTED_NOT_RECONDITION 0x200
529
#define AAC_SUPPORTED_SGMAP_HOST64 0x400
530
#define AAC_SUPPORTED_ALARM 0x800
531
#define AAC_SUPPORTED_NONDASD 0x1000
532
#define AAC_SUPPORTED_SCSI_MANAGED 0x2000
533
#define AAC_SUPPORTED_RAID_SCSI_MODE 0x4000
534
#define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO 0x10000
535
#define AAC_SUPPORTED_NEW_COMM 0x20000
536
#define AAC_SUPPORTED_64BIT_ARRAYSIZE 0x40000
537
#define AAC_SUPPORTED_HEAT_SENSOR 0x80000
538
#define AAC_SUPPORTED_NEW_COMM_TYPE1 0x10000000 /* Tupelo new comm */
539
#define AAC_SUPPORTED_NEW_COMM_TYPE2 0x20000000 /* Denali new comm */
540
#define AAC_SUPPORTED_NEW_COMM_TYPE3 0x40000000 /* Series 8 new comm */
541
#define AAC_SUPPORTED_NEW_COMM_TYPE4 0x80000000 /* Series 9 new comm */
542
543
/*
544
* Structure used to respond to a RequestAdapterInfo fib.
545
*/
546
struct aac_adapter_info {
547
AAC_Platform PlatformBase; /* adapter type */
548
AAC_CpuType CpuArchitecture; /* adapter CPU type */
549
AAC_CpuSubType CpuVariant; /* adapter CPU subtype */
550
u_int32_t ClockSpeed; /* adapter CPU clockspeed */
551
u_int32_t ExecutionMem; /* adapter Execution Memory
552
* size */
553
u_int32_t BufferMem; /* adapter Data Memory */
554
u_int32_t TotalMem; /* adapter Total Memory */
555
struct FsaRevision KernelRevision; /* adapter Kernel Software
556
* Revision */
557
struct FsaRevision MonitorRevision; /* adapter Monitor/Diagnostic
558
* Software Revision */
559
struct FsaRevision HardwareRevision;/* TBD */
560
struct FsaRevision BIOSRevision; /* adapter BIOS Revision */
561
u_int32_t ClusteringEnabled;
562
u_int32_t ClusterChannelMask;
563
u_int64_t SerialNumber;
564
AAC_BatteryPlatform batteryPlatform;
565
u_int32_t SupportedOptions; /* supported features of this
566
* controller */
567
AAC_OemFlavor OemVariant;
568
} __packed;
569
570
/*
571
* More options from supplement info - SupportedOptions2
572
*/
573
#define AAC_SUPPORTED_MU_RESET 0x01
574
#define AAC_SUPPORTED_IGNORE_RESET 0x02
575
#define AAC_SUPPORTED_POWER_MANAGEMENT 0x04
576
#define AAC_SUPPORTED_ARCIO_PHYDEV 0x08
577
#define AAC_SUPPORTED_DOORBELL_RESET 0x4000
578
#define AAC_SUPPORTED_VARIABLE_BLOCK_SIZE 0x40000 /* 4KB sector size */
579
580
/*
581
* FeatureBits of RequestSupplementAdapterInfo used in the driver
582
*/
583
#define AAC_SUPPL_SUPPORTED_JBOD 0x08000000
584
585
/*
586
* Structure used to respond to a RequestSupplementAdapterInfo fib.
587
*/
588
struct vpd_info {
589
u_int8_t AssemblyPn[8];
590
u_int8_t FruPn[8];
591
u_int8_t BatteryFruPn[8];
592
u_int8_t EcVersionString[8];
593
u_int8_t Tsid[12];
594
} __packed;
595
596
#define MFG_PCBA_SERIAL_NUMBER_WIDTH 12
597
#define MFG_WWN_WIDTH 8
598
599
struct aac_supplement_adapter_info {
600
/* The assigned Adapter Type Text, extra byte for null termination */
601
int8_t AdapterTypeText[17+1];
602
/* Pad for the text above */
603
int8_t Pad[2];
604
/* Size in bytes of the memory that is flashed */
605
u_int32_t FlashMemoryByteSize;
606
/* The assigned IMAGEID_xxx for this adapter */
607
u_int32_t FlashImageId;
608
/*
609
* The maximum number of Phys available on a SATA/SAS
610
* Controller, 0 otherwise
611
*/
612
u_int32_t MaxNumberPorts;
613
/* Version of expansion area */
614
u_int32_t Version;
615
u_int32_t FeatureBits;
616
u_int8_t SlotNumber;
617
u_int8_t ReservedPad0[3];
618
u_int8_t BuildDate[12];
619
/* The current number of Ports on a SAS controller, 0 otherwise */
620
u_int32_t CurrentNumberPorts;
621
622
struct vpd_info VpdInfo;
623
624
/* Firmware Revision (Vmaj.min-dash.) */
625
struct FsaRevision FlashFirmwareRevision;
626
u_int32_t RaidTypeMorphOptions;
627
/* Firmware's boot code Revision (Vmaj.min-dash.) */
628
struct FsaRevision FlashFirmwareBootRevision;
629
/* PCBA serial no. from th MFG sector */
630
u_int8_t MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH];
631
/* WWN from the MFG sector */
632
u_int8_t MfgWWNName[MFG_WWN_WIDTH];
633
u_int32_t SupportedOptions2; /* more supported features */
634
u_int32_t ExpansionFlag; /* 1 - following fields are valid */
635
u_int32_t FeatureBits3;
636
u_int32_t SupportedPerformanceMode;
637
/* Growth Area for future expansion */
638
u_int32_t ReservedGrowth[80];
639
} __packed;
640
641
/*
642
* Monitor/Kernel interface.
643
*/
644
645
/*
646
* Synchronous commands to the monitor/kernel.
647
*/
648
#define AAC_MONKER_BREAKPOINT 0x04
649
#define AAC_MONKER_INITSTRUCT 0x05
650
#define AAC_MONKER_SYNCFIB 0x0c
651
#define AAC_MONKER_GETKERNVER 0x11
652
#define AAC_MONKER_POSTRESULTS 0x14
653
#define AAC_MONKER_GETINFO 0x19
654
#define AAC_MONKER_GETDRVPROP 0x23
655
#define AAC_MONKER_RCVTEMP 0x25
656
#define AAC_MONKER_GETCOMMPREF 0x26
657
#define AAC_MONKER_REINIT 0xee
658
#define AAC_IOP_RESET 0x1000
659
#define AAC_IOP_RESET_ALWAYS 0x1001
660
661
/*
662
* Adapter Status Register
663
*
664
* Phase Staus mailbox is 32bits:
665
* <31:16> = Phase Status
666
* <15:0> = Phase
667
*
668
* The adapter reports its present state through the phase. Only
669
* a single phase should be ever be set. Each phase can have multiple
670
* phase status bits to provide more detailed information about the
671
* state of the adapter.
672
*/
673
#define AAC_SELF_TEST_FAILED 0x00000004
674
#define AAC_MONITOR_PANIC 0x00000020
675
#define AAC_UP_AND_RUNNING 0x00000080
676
#define AAC_KERNEL_PANIC 0x00000100
677
678
/*
679
* for dual FW image support
680
*/
681
#define AAC_FLASH_UPD_PENDING 0x00002000
682
#define AAC_FLASH_UPD_SUCCESS 0x00004000
683
#define AAC_FLASH_UPD_FAILED 0x00008000
684
685
/*
686
* Data types relating to control and monitoring of the NVRAM/WriteCache
687
* subsystem.
688
*/
689
690
#define AAC_NFILESYS 24 /* maximum number of filesystems */
691
692
/*
693
* NVRAM/Write Cache subsystem states
694
*/
695
typedef enum {
696
NVSTATUS_DISABLED = 0, /* present, clean, not being used */
697
NVSTATUS_ENABLED, /* present, possibly dirty, ready for use */
698
NVSTATUS_ERROR, /* present, dirty, contains dirty data */
699
NVSTATUS_BATTERY, /* present, bad or low battery, may contain
700
* dirty data */
701
NVSTATUS_UNKNOWN /* for bad/missing device */
702
} AAC_NVSTATUS;
703
704
/*
705
* NVRAM/Write Cache subsystem battery component states
706
*
707
*/
708
typedef enum {
709
NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */
710
NVBATTSTATUS_LOW, /* battery is low on power */
711
NVBATTSTATUS_OK, /* battery is okay - normal operation possible
712
* only in this state */
713
NVBATTSTATUS_RECONDITIONING /* no battery present - reconditioning
714
* in process */
715
} AAC_NVBATTSTATUS;
716
717
/*
718
* Battery transition type
719
*/
720
typedef enum {
721
NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not
722
* present */
723
NVBATT_TRANSITION_LOW, /* battery is now low on power */
724
NVBATT_TRANSITION_OK /* battery is now okay - normal
725
* operation possible only in this
726
* state */
727
} AAC_NVBATT_TRANSITION;
728
729
/*
730
* NVRAM Info structure returned for NVRAM_GetInfo call
731
*/
732
struct aac_nvramdevinfo {
733
u_int32_t NV_Enabled; /* write caching enabled */
734
u_int32_t NV_Error; /* device in error state */
735
u_int32_t NV_NDirty; /* count of dirty NVRAM buffers */
736
u_int32_t NV_NActive; /* count of NVRAM buffers being
737
* written */
738
} __packed;
739
740
struct aac_nvraminfo {
741
AAC_NVSTATUS NV_Status; /* nvram subsystem status */
742
AAC_NVBATTSTATUS NV_BattStatus; /* battery status */
743
u_int32_t NV_Size; /* size of WriteCache NVRAM in
744
* bytes */
745
u_int32_t NV_BufSize; /* size of NVRAM buffers in
746
* bytes */
747
u_int32_t NV_NBufs; /* number of NVRAM buffers */
748
u_int32_t NV_NDirty; /* Num dirty NVRAM buffers */
749
u_int32_t NV_NClean; /* Num clean NVRAM buffers */
750
u_int32_t NV_NActive; /* Num NVRAM buffers being
751
* written */
752
u_int32_t NV_NBrokered; /* Num brokered NVRAM buffers */
753
struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS]; /* per device
754
* info */
755
u_int32_t NV_BattNeedsReconditioning; /* boolean */
756
u_int32_t NV_TotalSize; /* size of all non-volatile
757
* memories in bytes */
758
} __packed;
759
760
/*
761
* Data types relating to adapter-initiated FIBs
762
*
763
* Based on types and structures in <aifstruc.h>
764
*/
765
766
/*
767
* Progress Reports
768
*/
769
typedef enum {
770
AifJobStsSuccess = 1,
771
AifJobStsFinished,
772
AifJobStsAborted,
773
AifJobStsFailed,
774
AifJobStsLastReportMarker = 100, /* All prior mean last report */
775
AifJobStsSuspended,
776
AifJobStsRunning
777
} AAC_AifJobStatus;
778
779
typedef enum {
780
AifJobScsiMin = 1, /* Minimum value for Scsi operation */
781
AifJobScsiZero, /* SCSI device clear operation */
782
AifJobScsiVerify, /* SCSI device Verify operation NO
783
* REPAIR */
784
AifJobScsiExercise, /* SCSI device Exercise operation */
785
AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH
786
* repair */
787
AifJobScsiWritePattern, /* write pattern */
788
AifJobScsiMax = 99, /* Max Scsi value */
789
AifJobCtrMin, /* Min Ctr op value */
790
AifJobCtrZero, /* Container clear operation */
791
AifJobCtrCopy, /* Container copy operation */
792
AifJobCtrCreateMirror, /* Container Create Mirror operation */
793
AifJobCtrMergeMirror, /* Container Merge Mirror operation */
794
AifJobCtrScrubMirror, /* Container Scrub Mirror operation */
795
AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */
796
AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */
797
AifJobCtrMorph, /* Container morph operation */
798
AifJobCtrPartCopy, /* Container Partition copy operation */
799
AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */
800
AifJobCtrCrazyCache, /* crazy cache */
801
AifJobCtrCopyback, /* Container Copyback operation */
802
AifJobCtrCompactRaid5D, /* Container Compaction operation */
803
AifJobCtrExpandRaid5D, /* Container Expansion operation */
804
AifJobCtrRebuildRaid6, /* Container Rebuild Raid6 operation */
805
AifJobCtrScrubRaid6, /* Container Scrub Raid6 operation */
806
AifJobCtrSSBackup, /* Container snapshot backup task */
807
AifJobCtrMax = 199, /* Max Ctr type operation */
808
AifJobFsMin, /* Min Fs type operation */
809
AifJobFsCreate, /* File System Create operation */
810
AifJobFsVerify, /* File System Verify operation */
811
AifJobFsExtend, /* File System Extend operation */
812
AifJobFsMax = 299, /* Max Fs type operation */
813
AifJobApiFormatNTFS, /* Format a drive to NTFS */
814
AifJobApiFormatFAT, /* Format a drive to FAT */
815
AifJobApiUpdateSnapshot, /* update the read/write half of a
816
* snapshot */
817
AifJobApiFormatFAT32, /* Format a drive to FAT32 */
818
AifJobApiMax = 399, /* Max API type operation */
819
AifJobCtlContinuousCtrVerify, /* Adapter operation */
820
AifJobCtlMax = 499 /* Max Adapter type operation */
821
} AAC_AifJobType;
822
823
struct aac_AifContainers {
824
u_int32_t src; /* from/master */
825
u_int32_t dst; /* to/slave */
826
} __packed;
827
828
union aac_AifJobClient {
829
struct aac_AifContainers container; /* For Container and
830
* filesystem progress
831
* ops; */
832
int32_t scsi_dh; /* For SCSI progress
833
* ops */
834
};
835
836
struct aac_AifJobDesc {
837
u_int32_t jobID; /* DO NOT FILL IN! Will be
838
* filled in by AIF */
839
AAC_AifJobType type; /* Operation that is being
840
* performed */
841
union aac_AifJobClient client; /* Details */
842
} __packed;
843
844
struct aac_AifJobProgressReport {
845
struct aac_AifJobDesc jd;
846
AAC_AifJobStatus status;
847
u_int32_t finalTick;
848
u_int32_t currentTick;
849
u_int32_t jobSpecificData1;
850
u_int32_t jobSpecificData2;
851
} __packed;
852
853
/*
854
* Event Notification
855
*/
856
typedef enum {
857
/* General application notifies start here */
858
AifEnGeneric = 1, /* Generic notification */
859
AifEnTaskComplete, /* Task has completed */
860
AifEnConfigChange, /* Adapter config change occurred */
861
AifEnContainerChange, /* Adapter specific container
862
* configuration change */
863
AifEnDeviceFailure, /* SCSI device failed */
864
AifEnMirrorFailover, /* Mirror failover started */
865
AifEnContainerEvent, /* Significant container event */
866
AifEnFileSystemChange, /* File system changed */
867
AifEnConfigPause, /* Container pause event */
868
AifEnConfigResume, /* Container resume event */
869
AifEnFailoverChange, /* Failover space assignment changed */
870
AifEnRAID5RebuildDone, /* RAID5 rebuild finished */
871
AifEnEnclosureManagement, /* Enclosure management event */
872
AifEnBatteryEvent, /* Significant NV battery event */
873
AifEnAddContainer, /* A new container was created. */
874
AifEnDeleteContainer, /* A container was deleted. */
875
AifEnSMARTEvent, /* SMART Event */
876
AifEnBatteryNeedsRecond, /* The battery needs reconditioning */
877
AifEnClusterEvent, /* Some cluster event */
878
AifEnDiskSetEvent, /* A disk set event occurred. */
879
AifEnContainerScsiEvent, /* a container event with no. and scsi id */
880
AifEnPicBatteryEvent, /* An event gen. by pic_battery.c for an ABM */
881
AifEnExpEvent, /* Exp. Event Type to replace CTPopUp messages */
882
AifEnRAID6RebuildDone, /* RAID6 rebuild finished */
883
AifEnSensorOverHeat, /* Heat Sensor indicate overheat */
884
AifEnSensorCoolDown, /* Heat Sensor ind. cooled down after overheat */
885
AifFeatureKeysModified, /* notif. of updated feature keys */
886
AifApplicationExpirationEvent, /* notif. on app. expiration status */
887
AifEnBackgroundConsistencyCheck,/* BCC notif. for NEC - DDTS 94700 */
888
AifEnAddJBOD, /* A new JBOD type drive was created (30) */
889
AifEnDeleteJBOD, /* A JBOD type drive was deleted (31) */
890
AifDriverNotifyStart=199, /* Notifies for host driver go here */
891
/* Host driver notifications start here */
892
AifDenMorphComplete, /* A morph operation completed */
893
AifDenVolumeExtendComplete, /* Volume expand operation completed */
894
AifDriverNotifyDelay,
895
AifRawDeviceRemove /* Raw device Failure event */
896
} AAC_AifEventNotifyType;
897
898
struct aac_AifEnsGeneric {
899
char text[132]; /* Generic text */
900
} __packed;
901
902
struct aac_AifEnsDeviceFailure {
903
u_int32_t deviceHandle; /* SCSI device handle */
904
} __packed;
905
906
struct aac_AifEnsMirrorFailover {
907
u_int32_t container; /* Container with failed element */
908
u_int32_t failedSlice; /* Old slice which failed */
909
u_int32_t creatingSlice; /* New slice used for auto-create */
910
} __packed;
911
912
struct aac_AifEnsContainerChange {
913
u_int32_t container[2]; /* container that changed, -1 if no
914
* container */
915
} __packed;
916
917
struct aac_AifEnsContainerEvent {
918
u_int32_t container; /* container number */
919
u_int32_t eventType; /* event type */
920
} __packed;
921
922
struct aac_AifEnsEnclosureEvent {
923
u_int32_t empID; /* enclosure management proc number */
924
u_int32_t unitID; /* unitId, fan id, power supply id,
925
* slot id, tempsensor id. */
926
u_int32_t eventType; /* event type */
927
} __packed;
928
929
typedef enum {
930
AIF_EM_DRIVE_INSERTION=31,
931
AIF_EM_DRIVE_REMOVAL
932
} aac_AifEMEventType;
933
934
struct aac_AifEnsBatteryEvent {
935
AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */
936
AAC_NVBATTSTATUS current_state; /* current batt state */
937
AAC_NVBATTSTATUS prior_state; /* prev batt state */
938
} __packed;
939
940
struct aac_AifEnsDiskSetEvent {
941
u_int32_t eventType;
942
u_int64_t DsNum;
943
u_int64_t CreatorId;
944
} __packed;
945
946
typedef enum {
947
CLUSTER_NULL_EVENT = 0,
948
CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or
949
* adaptername from NULL to non-NULL */
950
/* (partner's agent may be up) */
951
CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or
952
* adaptername from non-null to NULL */
953
/* (partner has rebooted) */
954
} AAC_ClusterAifEvent;
955
956
struct aac_AifEnsClusterEvent {
957
AAC_ClusterAifEvent eventType;
958
} __packed;
959
960
struct aac_AifEventNotify {
961
AAC_AifEventNotifyType type;
962
union {
963
struct aac_AifEnsGeneric EG;
964
struct aac_AifEnsDeviceFailure EDF;
965
struct aac_AifEnsMirrorFailover EMF;
966
struct aac_AifEnsContainerChange ECC;
967
struct aac_AifEnsContainerEvent ECE;
968
struct aac_AifEnsEnclosureEvent EEE;
969
struct aac_AifEnsBatteryEvent EBE;
970
struct aac_AifEnsDiskSetEvent EDS;
971
/* struct aac_AifEnsSMARTEvent ES;*/
972
struct aac_AifEnsClusterEvent ECLE;
973
} data;
974
} __packed;
975
976
/*
977
* Adapter Initiated FIB command structures. Start with the adapter
978
* initiated FIBs that really come from the adapter, and get responded
979
* to by the host.
980
*/
981
#define AAC_AIF_REPORT_MAX_SIZE 64
982
983
typedef enum {
984
AifCmdEventNotify = 1, /* Notify of event */
985
AifCmdJobProgress, /* Progress report */
986
AifCmdAPIReport, /* Report from other user of API */
987
AifCmdDriverNotify, /* Notify host driver of event */
988
AifReqJobList = 100, /* Gets back complete job list */
989
AifReqJobsForCtr, /* Gets back jobs for specific container */
990
AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */
991
AifReqJobReport, /* Gets back a specific job report or list */
992
AifReqTerminateJob, /* Terminates job */
993
AifReqSuspendJob, /* Suspends a job */
994
AifReqResumeJob, /* Resumes a job */
995
AifReqSendAPIReport, /* API generic report requests */
996
AifReqAPIJobStart, /* Start a job from the API */
997
AifReqAPIJobUpdate, /* Update a job report from the API */
998
AifReqAPIJobFinish, /* Finish a job from the API */
999
AifReqEvent = 200 /* PMC NEW COMM: Request the event data */
1000
} AAC_AifCommand;
1001
1002
struct aac_aif_command {
1003
AAC_AifCommand command; /* Tell host what type of
1004
* notify this is */
1005
u_int32_t seqNumber; /* To allow ordering of
1006
* reports (if necessary) */
1007
union {
1008
struct aac_AifEventNotify EN; /* Event notify */
1009
struct aac_AifJobProgressReport PR[1]; /* Progress report */
1010
u_int8_t AR[AAC_AIF_REPORT_MAX_SIZE];
1011
u_int8_t data[AAC_FIB_DATASIZE - 8];
1012
} data;
1013
} __packed;
1014
1015
/*
1016
* Filesystem commands/data
1017
*
1018
* The adapter has a very complex filesystem interface, most of which we ignore.
1019
* (And which seems not to be implemented, anyway.)
1020
*/
1021
1022
/*
1023
* FSA commands
1024
* (not used?)
1025
*/
1026
typedef enum {
1027
Null = 0,
1028
GetAttributes,
1029
SetAttributes,
1030
Lookup,
1031
ReadLink,
1032
Read,
1033
Write,
1034
Create,
1035
MakeDirectory,
1036
SymbolicLink,
1037
MakeNode,
1038
Removex,
1039
RemoveDirectory,
1040
Rename,
1041
Link,
1042
ReadDirectory,
1043
ReadDirectoryPlus,
1044
FileSystemStatus,
1045
FileSystemInfo,
1046
PathConfigure,
1047
Commit,
1048
Mount,
1049
UnMount,
1050
Newfs,
1051
FsCheck,
1052
FsSync,
1053
SimReadWrite,
1054
SetFileSystemStatus,
1055
BlockRead,
1056
BlockWrite,
1057
NvramIoctl,
1058
FsSyncWait,
1059
ClearArchiveBit,
1060
SetAcl,
1061
GetAcl,
1062
AssignAcl,
1063
FaultInsertion,
1064
CrazyCache
1065
} AAC_FSACommand;
1066
1067
/*
1068
* Command status values
1069
*/
1070
typedef enum {
1071
ST_OK = 0,
1072
ST_PERM = 1,
1073
ST_NOENT = 2,
1074
ST_IO = 5,
1075
ST_NXIO = 6,
1076
ST_E2BIG = 7,
1077
ST_ACCES = 13,
1078
ST_EXIST = 17,
1079
ST_XDEV = 18,
1080
ST_NODEV = 19,
1081
ST_NOTDIR = 20,
1082
ST_ISDIR = 21,
1083
ST_INVAL = 22,
1084
ST_FBIG = 27,
1085
ST_NOSPC = 28,
1086
ST_ROFS = 30,
1087
ST_MLINK = 31,
1088
ST_WOULDBLOCK = 35,
1089
ST_NAMETOOLONG = 63,
1090
ST_NOTEMPTY = 66,
1091
ST_DQUOT = 69,
1092
ST_STALE = 70,
1093
ST_REMOTE = 71,
1094
ST_NOT_READY = 72,
1095
ST_BADHANDLE = 10001,
1096
ST_NOT_SYNC = 10002,
1097
ST_BAD_COOKIE = 10003,
1098
ST_NOTSUPP = 10004,
1099
ST_TOOSMALL = 10005,
1100
ST_SERVERFAULT = 10006,
1101
ST_BADTYPE = 10007,
1102
ST_JUKEBOX = 10008,
1103
ST_NOTMOUNTED = 10009,
1104
ST_MAINTMODE = 10010,
1105
ST_STALEACL = 10011,
1106
ST_BUS_RESET = 20001
1107
} AAC_FSAStatus;
1108
1109
/*
1110
* Volume manager commands
1111
*/
1112
typedef enum _VM_COMMANDS {
1113
VM_Null = 0,
1114
VM_NameServe, /* query for mountable objects (containers) */
1115
VM_ContainerConfig,
1116
VM_Ioctl,
1117
VM_FilesystemIoctl,
1118
VM_CloseAll,
1119
VM_CtBlockRead,
1120
VM_CtBlockWrite,
1121
VM_SliceBlockRead, /* raw access to configured "storage objects" */
1122
VM_SliceBlockWrite,
1123
VM_DriveBlockRead, /* raw access to physical devices */
1124
VM_DriveBlockWrite,
1125
VM_EnclosureMgt, /* enclosure management */
1126
VM_Unused, /* used to be diskset management */
1127
VM_CtBlockVerify,
1128
VM_CtPerf, /* performance test */
1129
VM_CtBlockRead64,
1130
VM_CtBlockWrite64,
1131
VM_CtBlockVerify64,
1132
VM_CtHostRead64,
1133
VM_CtHostWrite64,
1134
VM_DrvErrTblLog, /* drive error table/log type of command */
1135
VM_NameServe64, /* query also for containers >2TB */
1136
VM_SasNvsramAccess, /* for sas nvsram layout function */
1137
VM_HandleExpiration, /* handles application expiration, internal use! */
1138
VM_GetDynAdapProps, /* retrieves dynamic adapter properties */
1139
VM_SetDynAdapProps, /* sets a dynamic adapter property */
1140
VM_UpdateSSDODM, /* updates the on-disk metadata for SSD caching */
1141
VM_GetSPMParameters, /* get SPM parameters for one of the perf. modes */
1142
VM_SetSPMParameters, /* set SPM parameters for user defined perf. mode */
1143
VM_NameServeAllBlk, /* query also for containers with 4KB sector size */
1144
MAX_VMCOMMAND_NUM /* used for sizing stats array - leave last */
1145
} AAC_VMCommand;
1146
1147
/* Container Configuration Sub-Commands */
1148
#define CT_GET_SCSI_METHOD 64
1149
#define CT_PAUSE_IO 65
1150
#define CT_RELEASE_IO 66
1151
#define CT_GET_CONFIG_STATUS 147
1152
#define CT_COMMIT_CONFIG 152
1153
#define CT_CID_TO_32BITS_UID 165
1154
#define CT_PM_DRIVER_SUPPORT 245
1155
1156
/* General CT_xxx return status */
1157
#define CT_OK 218
1158
1159
/* CT_PM_DRIVER_SUPPORT parameter */
1160
typedef enum {
1161
AAC_PM_DRIVERSUP_GET_STATUS = 1,
1162
AAC_PM_DRIVERSUP_START_UNIT,
1163
AAC_PM_DRIVERSUP_STOP_UNIT
1164
} AAC_CT_PM_DRIVER_SUPPORT_SUB_COM;
1165
1166
/*
1167
* CT_PAUSE_IO is immediate minimal runtime command that is used
1168
* to restart the applications and cache.
1169
*/
1170
struct aac_pause_command {
1171
u_int32_t Command;
1172
u_int32_t Type;
1173
u_int32_t Timeout;
1174
u_int32_t Min;
1175
u_int32_t NoRescan;
1176
u_int32_t Parm3;
1177
u_int32_t Parm4;
1178
u_int32_t Count;
1179
} __packed;
1180
1181
/* Flag values for ContentState */
1182
#define AAC_FSCS_NOTCLEAN 0x1 /* fscheck is necessary before mounting */
1183
#define AAC_FSCS_READONLY 0x2 /* possible result of broken mirror */
1184
#define AAC_FSCS_HIDDEN 0x4 /* container should be ignored by driver */
1185
#define AAC_FSCS_NOT_READY 0x8 /* cnt is in spinn. state, not rdy for IO's */
1186
1187
/*
1188
* "mountable object"
1189
*/
1190
struct aac_mntobj {
1191
u_int32_t ObjectId;
1192
char FileSystemName[16];
1193
struct aac_container_creation CreateInfo;
1194
u_int32_t Capacity;
1195
u_int32_t VolType;
1196
u_int32_t ObjType;
1197
u_int32_t ContentState;
1198
union {
1199
u_int32_t pad[8];
1200
struct {
1201
u_int32_t BlockSize;
1202
u_int32_t bdLgclPhysMap;
1203
} BlockDevice;
1204
} ObjExtension;
1205
u_int32_t AlterEgoId;
1206
u_int32_t CapacityHigh;
1207
} __packed;
1208
1209
struct aac_mntinfo {
1210
u_int32_t Command;
1211
u_int32_t MntType;
1212
u_int32_t MntCount;
1213
} __packed;
1214
1215
struct aac_mntinforesp {
1216
u_int32_t Status;
1217
u_int32_t MntType;
1218
u_int32_t MntRespCount;
1219
struct aac_mntobj MntTable[1];
1220
} __packed;
1221
1222
/*
1223
* Container shutdown command.
1224
*/
1225
struct aac_closecommand {
1226
u_int32_t Command;
1227
u_int32_t ContainerId;
1228
} __packed;
1229
1230
/*
1231
* Container Config Command
1232
*/
1233
struct aac_ctcfg {
1234
u_int32_t Command;
1235
u_int32_t cmd;
1236
u_int32_t param;
1237
} __packed;
1238
1239
struct aac_ctcfg_resp {
1240
u_int32_t Status;
1241
u_int32_t resp;
1242
u_int32_t param;
1243
} __packed;
1244
1245
/*
1246
* 'Ioctl' commads
1247
*/
1248
#define AAC_SCSI_MAX_PORTS 10
1249
#define AAC_BUS_NO_EXIST 0
1250
#define AAC_BUS_VALID 1
1251
#define AAC_BUS_FAULTED 2
1252
#define AAC_BUS_DISABLED 3
1253
#define GetBusInfo 0x9
1254
1255
struct aac_getbusinf {
1256
u_int32_t ProbeComplete;
1257
u_int32_t BusCount;
1258
u_int32_t TargetsPerBus;
1259
u_int8_t InitiatorBusId[AAC_SCSI_MAX_PORTS];
1260
u_int8_t BusValid[AAC_SCSI_MAX_PORTS];
1261
} __packed;
1262
1263
struct aac_vmioctl {
1264
u_int32_t Command;
1265
u_int32_t ObjType;
1266
u_int32_t MethId;
1267
u_int32_t ObjId;
1268
u_int32_t IoctlCmd;
1269
u_int32_t IoctlBuf[1]; /* Placeholder? */
1270
} __packed;
1271
1272
struct aac_vmi_businf_resp {
1273
u_int32_t Status;
1274
u_int32_t ObjType;
1275
u_int32_t MethId;
1276
u_int32_t ObjId;
1277
u_int32_t IoctlCmd;
1278
struct aac_getbusinf BusInf;
1279
} __packed;
1280
1281
struct aac_vmi_devinfo_resp {
1282
u_int32_t Status;
1283
u_int32_t ObjType;
1284
u_int32_t MethId;
1285
u_int32_t ObjId;
1286
u_int32_t IoctlCmd;
1287
u_int8_t VendorId[8];
1288
u_int8_t ProductId[16];
1289
u_int8_t ProductRev[4];
1290
u_int32_t Inquiry7;
1291
u_int32_t align1;
1292
u_int32_t Inquiry0;
1293
u_int32_t align2;
1294
u_int32_t Inquiry1;
1295
u_int32_t align3;
1296
u_int32_t reserved[2];
1297
u_int8_t VendorSpecific[20];
1298
u_int32_t Smart:1;
1299
u_int32_t AAC_Managed:1;
1300
u_int32_t align4;
1301
u_int32_t reserved2:6;
1302
u_int32_t Bus;
1303
u_int32_t Target;
1304
u_int32_t Lun;
1305
u_int32_t ultraEnable:1,
1306
disconnectEnable:1,
1307
fast20EnabledW:1,
1308
scamDevice:1,
1309
scamTolerant:1,
1310
setForSync:1,
1311
setForWide:1,
1312
syncDevice:1,
1313
wideDevice:1,
1314
reserved1:7,
1315
ScsiRate:8,
1316
ScsiOffset:8;
1317
}; /* Do not pack */
1318
1319
#define ResetBus 0x16
1320
struct aac_resetbus {
1321
u_int32_t BusNumber;
1322
};
1323
1324
/*
1325
* Write 'stability' options.
1326
*/
1327
typedef enum {
1328
CSTABLE = 1,
1329
CUNSTABLE
1330
} AAC_CacheLevel;
1331
1332
/*
1333
* Commit level response for a write request.
1334
*/
1335
typedef enum {
1336
CMFILE_SYNC_NVRAM = 1,
1337
CMDATA_SYNC_NVRAM,
1338
CMFILE_SYNC,
1339
CMDATA_SYNC,
1340
CMUNSTABLE
1341
} AAC_CommitLevel;
1342
1343
#define CT_FIB_PARAMS 6
1344
#define MAX_FIB_PARAMS 10
1345
#define CT_PACKET_SIZE \
1346
(AAC_FIB_DATASIZE - sizeof (u_int32_t) - \
1347
((sizeof (u_int32_t)) * (MAX_FIB_PARAMS + 1)))
1348
#define CNT_SIZE 5
1349
1350
struct aac_fsa_ctm {
1351
u_int32_t command;
1352
u_int32_t param[CT_FIB_PARAMS];
1353
int8_t data[CT_PACKET_SIZE];
1354
};
1355
1356
struct aac_cnt_config {
1357
u_int32_t Command;
1358
struct aac_fsa_ctm CTCommand;
1359
};
1360
1361
/* check config. */
1362
enum {
1363
CFACT_CONTINUE = 0, /* continue without pause */
1364
CFACT_PAUSE, /* pause, then continue */
1365
CFACT_ABORT /* abort */
1366
};
1367
1368
struct aac_cf_status_hdr {
1369
u_int32_t action;
1370
u_int32_t flags;
1371
u_int32_t recordcount;
1372
};
1373
1374
/*
1375
* Block read/write operations.
1376
* These structures are packed into the 'data' area in the FIB.
1377
*/
1378
1379
struct aac_blockread {
1380
u_int32_t Command; /* not FSACommand! */
1381
u_int32_t ContainerId;
1382
u_int32_t BlockNumber;
1383
u_int32_t ByteCount;
1384
struct aac_sg_table SgMap; /* variable size */
1385
} __packed;
1386
1387
struct aac_blockread64 {
1388
u_int32_t Command;
1389
u_int16_t ContainerId;
1390
u_int16_t SectorCount;
1391
u_int32_t BlockNumber;
1392
u_int16_t Pad;
1393
u_int16_t Flags;
1394
struct aac_sg_table64 SgMap64;
1395
} __packed;
1396
1397
struct aac_blockread_response {
1398
u_int32_t Status;
1399
u_int32_t ByteCount;
1400
} __packed;
1401
1402
struct aac_blockwrite {
1403
u_int32_t Command; /* not FSACommand! */
1404
u_int32_t ContainerId;
1405
u_int32_t BlockNumber;
1406
u_int32_t ByteCount;
1407
u_int32_t Stable;
1408
struct aac_sg_table SgMap; /* variable size */
1409
} __packed;
1410
1411
struct aac_blockwrite64 {
1412
u_int32_t Command; /* not FSACommand! */
1413
u_int16_t ContainerId;
1414
u_int16_t SectorCount;
1415
u_int32_t BlockNumber;
1416
u_int16_t Pad;
1417
u_int16_t Flags;
1418
struct aac_sg_table64 SgMap64; /* variable size */
1419
} __packed;
1420
1421
struct aac_blockwrite_response {
1422
u_int32_t Status;
1423
u_int32_t ByteCount;
1424
u_int32_t Committed;
1425
} __packed;
1426
1427
struct aac_raw_io {
1428
u_int64_t BlockNumber;
1429
u_int32_t ByteCount;
1430
u_int16_t ContainerId;
1431
u_int16_t Flags; /* 0: W, 1: R */
1432
u_int16_t BpTotal; /* reserved for FW use */
1433
u_int16_t BpComplete; /* reserved for FW use */
1434
struct aac_sg_tableraw SgMapRaw; /* variable size */
1435
} __packed;
1436
1437
#define RIO2_IO_TYPE 0x0003
1438
#define RIO2_IO_TYPE_WRITE 0x0000
1439
#define RIO2_IO_TYPE_READ 0x0001
1440
#define RIO2_IO_TYPE_VERIFY 0x0002
1441
#define RIO2_IO_ERROR 0x0004
1442
#define RIO2_IO_SUREWRITE 0x0008
1443
#define RIO2_SGL_CONFORMANT 0x0010
1444
#define RIO2_SG_FORMAT 0xF000
1445
#define RIO2_SG_FORMAT_ARC 0x0000
1446
#define RIO2_SG_FORMAT_SRL 0x1000
1447
#define RIO2_SG_FORMAT_IEEE1212 0x2000
1448
struct aac_raw_io2 {
1449
u_int32_t strtBlkLow;
1450
u_int32_t strtBlkHigh;
1451
u_int32_t byteCnt;
1452
u_int16_t ldNum;
1453
u_int16_t flags; /* RIO2_xxx */
1454
u_int32_t sgeFirstSize; /* size of first SG element */
1455
u_int32_t sgeNominalSize; /* size of 2nd SG element */
1456
u_int8_t sgeCnt;
1457
u_int8_t bpTotal; /* reserved for FW use */
1458
u_int8_t bpComplete; /* reserved for FW use */
1459
u_int8_t sgeFirstIndex; /* reserved for FW use */
1460
u_int8_t unused[4];
1461
struct aac_sge_ieee1212 sge[0]; /* variable size */
1462
} __packed;
1463
1464
/*
1465
* Container shutdown command.
1466
*/
1467
struct aac_close_command {
1468
u_int32_t Command;
1469
u_int32_t ContainerId;
1470
} __packed;
1471
1472
/*
1473
* SCSI Passthrough structures
1474
*/
1475
struct aac_srb {
1476
u_int32_t function;
1477
u_int32_t bus;
1478
u_int32_t target;
1479
u_int32_t lun;
1480
u_int32_t timeout;
1481
u_int32_t flags;
1482
u_int32_t data_len;
1483
u_int32_t retry_limit;
1484
u_int32_t cdb_len;
1485
u_int8_t cdb[16];
1486
struct aac_sg_table sg_map;
1487
} __packed;
1488
1489
enum {
1490
AAC_SRB_FUNC_EXECUTE_SCSI = 0x00,
1491
AAC_SRB_FUNC_CLAIM_DEVICE,
1492
AAC_SRB_FUNC_IO_CONTROL,
1493
AAC_SRB_FUNC_RECEIVE_EVENT,
1494
AAC_SRB_FUNC_RELEASE_QUEUE,
1495
AAC_SRB_FUNC_ATTACH_DEVICE,
1496
AAC_SRB_FUNC_RELEASE_DEVICE,
1497
AAC_SRB_FUNC_SHUTDOWN,
1498
AAC_SRB_FUNC_FLUSH,
1499
AAC_SRB_FUNC_ABORT_COMMAND = 0x10,
1500
AAC_SRB_FUNC_RELEASE_RECOVERY,
1501
AAC_SRB_FUNC_RESET_BUS,
1502
AAC_SRB_FUNC_RESET_DEVICE,
1503
AAC_SRB_FUNC_TERMINATE_IO,
1504
AAC_SRB_FUNC_FLUSH_QUEUE,
1505
AAC_SRB_FUNC_REMOVE_DEVICE,
1506
AAC_SRB_FUNC_DOMAIN_VALIDATION
1507
};
1508
1509
#define AAC_SRB_FLAGS_NO_DATA_XFER 0x0000
1510
#define AAC_SRB_FLAGS_DISABLE_DISCONNECT 0x0004
1511
#define AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER 0x0008
1512
#define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x0010
1513
#define AAC_SRB_FLAGS_DISABLE_AUTOSENSE 0x0020
1514
#define AAC_SRB_FLAGS_DATA_IN 0x0040
1515
#define AAC_SRB_FLAGS_DATA_OUT 0x0080
1516
#define AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \
1517
(AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT)
1518
1519
#define AAC_HOST_SENSE_DATA_MAX 30
1520
1521
struct aac_srb_response {
1522
u_int32_t fib_status;
1523
u_int32_t srb_status;
1524
u_int32_t scsi_status;
1525
u_int32_t data_len;
1526
u_int32_t sense_len;
1527
u_int8_t sense[AAC_HOST_SENSE_DATA_MAX];
1528
} __packed;
1529
1530
/*
1531
* Status codes for SCSI passthrough commands. Since they are based on ASPI,
1532
* they also exactly match CAM status codes in both enumeration and meaning.
1533
* They seem to also be used as status codes for synchronous FIBs.
1534
*/
1535
enum {
1536
AAC_SRB_STS_PENDING = 0x00,
1537
AAC_SRB_STS_SUCCESS,
1538
AAC_SRB_STS_ABORTED,
1539
AAC_SRB_STS_ABORT_FAILED,
1540
AAC_SRB_STS_ERROR,
1541
AAC_SRB_STS_BUSY,
1542
AAC_SRB_STS_INVALID_REQUEST,
1543
AAC_SRB_STS_INVALID_PATH_ID,
1544
AAC_SRB_STS_NO_DEVICE,
1545
AAC_SRB_STS_TIMEOUT,
1546
AAC_SRB_STS_SELECTION_TIMEOUT,
1547
AAC_SRB_STS_COMMAND_TIMEOUT,
1548
AAC_SRB_STS_MESSAGE_REJECTED = 0x0D,
1549
AAC_SRB_STS_BUS_RESET,
1550
AAC_SRB_STS_PARITY_ERROR,
1551
AAC_SRB_STS_REQUEST_SENSE_FAILED,
1552
AAC_SRB_STS_NO_HBA,
1553
AAC_SRB_STS_DATA_OVERRUN,
1554
AAC_SRB_STS_UNEXPECTED_BUS_FREE,
1555
AAC_SRB_STS_PHASE_SEQUENCE_FAILURE,
1556
AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH,
1557
AAC_SRB_STS_REQUEST_FLUSHED,
1558
AAC_SRB_STS_INVALID_LUN = 0x20,
1559
AAC_SRB_STS_INVALID_TARGET_ID,
1560
AAC_SRB_STS_BAD_FUNCTION,
1561
AAC_SRB_STS_ERROR_RECOVERY
1562
};
1563
1564
/*
1565
* Register definitions for the Adaptec PMC SRC/SRCv adapters.
1566
*/
1567
/* accessible via BAR0 */
1568
#define AAC_SRC_OMR 0xbc /* outbound message register */
1569
#define AAC_SRC_IOAR 0x18 /* IOA->host interrupt register */
1570
#define AAC_SRC_IDBR 0x20 /* inbound doorbell register */
1571
#define AAC_SRC_IISR 0x24 /* inbound interrupt status register */
1572
#define AAC_SRC_ODBR_R 0x9c /* outbound doorbell register read */
1573
#define AAC_SRC_ODBR_C 0xa0 /* outbound doorbell register clear */
1574
#define AAC_SRC_OIMR 0x34 /* outbound interrupt mask register */
1575
#define AAC_SRC_IQUE32 0x40 /* inbound queue address 32-bit */
1576
#define AAC_SRC_IQUE64_L 0xc0 /* inbound queue address 64-bit (low) */
1577
#define AAC_SRC_IQUE64_H 0xc4 /* inbound queue address 64-bit (high)*/
1578
#define AAC_SRC_ODBR_MSI 0xc8 /* MSI register for sync./AIF */
1579
1580
#define AAC_SRC_MAILBOX 0x7fc60 /* mailbox (20 bytes) */
1581
#define AAC_SRCV_MAILBOX 0x1000 /* mailbox (20 bytes) */
1582
1583
#define AAC_SRC_ODR_SHIFT 12 /* outbound doorbell shift */
1584
#define AAC_SRC_IDR_SHIFT 9 /* inbound doorbell shift */
1585
1586
/* Sunrise Lake dual core reset */
1587
#define AAC_IRCSR 0x38 /* inbound dual cores reset */
1588
#define AAC_IRCSR_CORES_RST 3
1589
1590
/*
1591
* Common bit definitions for the doorbell registers.
1592
*/
1593
1594
/*
1595
* Status bits in the doorbell registers.
1596
*/
1597
#define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous FIB */
1598
#define AAC_DB_AIF_PENDING (1<<6) /* pending AIF (new comm. type1) */
1599
/* PMC specific outbound doorbell bits */
1600
#define AAC_DB_RESPONSE_SENT_NS (1<<1) /* response sent (not shifted)*/
1601
1602
/*
1603
* The adapter can request the host print a message by setting the
1604
* DB_PRINTF flag in DOORBELL0. The driver responds by collecting the
1605
* message from the printf buffer, clearing the DB_PRINTF flag in
1606
* DOORBELL0 and setting it in DOORBELL1.
1607
* (ODBR and IDBR respectively for the i960Rx adapters)
1608
*/
1609
#define AAC_DB_PRINTF (1<<5) /* adapter requests host printf */
1610
#define AAC_PRINTF_DONE (1<<5) /* Host completed printf processing */
1611
1612
/*
1613
* Interrupts
1614
*/
1615
#define AAC_MAX_MSIX 32 /* vectors */
1616
#define AAC_PCI_MSI_ENABLE 0x8000
1617
#define AAC_MSI_SYNC_STATUS 0x1000
1618
1619
enum {
1620
AAC_ENABLE_INTERRUPT = 0x0,
1621
AAC_DISABLE_INTERRUPT,
1622
AAC_ENABLE_MSIX,
1623
AAC_DISABLE_MSIX,
1624
AAC_CLEAR_AIF_BIT,
1625
AAC_CLEAR_SYNC_BIT,
1626
AAC_ENABLE_INTX
1627
};
1628
1629
#define AAC_INT_MODE_INTX (1<<0)
1630
#define AAC_INT_MODE_MSI (1<<1)
1631
#define AAC_INT_MODE_AIF (1<<2)
1632
#define AAC_INT_MODE_SYNC (1<<3)
1633
1634
#define AAC_INT_ENABLE_TYPE1_INTX 0xfffffffb
1635
#define AAC_INT_ENABLE_TYPE1_MSIX 0xfffffffa
1636
#define AAC_INT_DISABLE_ALL 0xffffffff
1637
1638
/* Bit definitions in IOA->Host Interrupt Register */
1639
#define PMC_TRANSITION_TO_OPERATIONAL (0x80000000 >> 0)
1640
#define PMC_IOARCB_TRANSFER_FAILED (0x80000000 >> 3)
1641
#define PMC_IOA_UNIT_CHECK (0x80000000 >> 4)
1642
#define PMC_NO_HOST_RRQ_FOR_CMD_RESPONSE (0x80000000 >> 5)
1643
#define PMC_CRITICAL_IOA_OP_IN_PROGRESS (0x80000000 >> 6)
1644
#define PMC_IOARRIN_LOST (0x80000000 >> 27)
1645
#define PMC_SYSTEM_BUS_MMIO_ERROR (0x80000000 >> 28)
1646
#define PMC_IOA_PROCESSOR_IN_ERROR_STATE (0x80000000 >> 29)
1647
#define PMC_HOST_RRQ_VALID (0x80000000 >> 30)
1648
#define PMC_OPERATIONAL_STATUS (0x80000000 >> 0)
1649
#define PMC_ALLOW_MSIX_VECTOR0 (0x80000000 >> 31)
1650
1651
#define PMC_IOA_ERROR_INTERRUPTS (PMC_IOARCB_TRANSFER_FAILED | \
1652
PMC_IOA_UNIT_CHECK | \
1653
PMC_NO_HOST_RRQ_FOR_CMD_RESPONSE | \
1654
PMC_IOARRIN_LOST | \
1655
PMC_SYSTEM_BUS_MMIO_ERROR | \
1656
PMC_IOA_PROCESSOR_IN_ERROR_STATE)
1657
1658
#define PMC_ALL_INTERRUPT_BITS (PMC_IOA_ERROR_INTERRUPTS | \
1659
PMC_HOST_RRQ_VALID | \
1660
PMC_TRANSITION_TO_OPERATIONAL | \
1661
PMC_ALLOW_MSIX_VECTOR0)
1662
1663
#define PMC_GLOBAL_INT_BIT2 0x00000004
1664
#define PMC_GLOBAL_INT_BIT0 0x00000001
1665
1666