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