root / lab4 / .minix-src / include / dev / pci / mlyreg.h @ 14
History | View | Annotate | Download (39 KB)
1 |
/* $NetBSD: mlyreg.h,v 1.5 2008/09/08 23:36:54 gmcgarry Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by Andrew Doran, Thor Lancelot Simon, and Eric Haszlakiewicz.
|
9 |
*
|
10 |
* Redistribution and use in source and binary forms, with or without
|
11 |
* modification, are permitted provided that the following conditions
|
12 |
* are met:
|
13 |
* 1. Redistributions of source code must retain the above copyright
|
14 |
* notice, this list of conditions and the following disclaimer.
|
15 |
* 2. Redistributions in binary form must reproduce the above copyright
|
16 |
* notice, this list of conditions and the following disclaimer in the
|
17 |
* documentation and/or other materials provided with the distribution.
|
18 |
*
|
19 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
20 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
21 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
22 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
23 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29 |
* POSSIBILITY OF SUCH DAMAGE.
|
30 |
*/
|
31 |
|
32 |
/*-
|
33 |
* Copyright (c) 2000 Michael Smith
|
34 |
* Copyright (c) 2000 BSDi
|
35 |
* All rights reserved.
|
36 |
*
|
37 |
* Redistribution and use in source and binary forms, with or without
|
38 |
* modification, are permitted provided that the following conditions
|
39 |
* are met:
|
40 |
* 1. Redistributions of source code must retain the above copyright
|
41 |
* notice, this list of conditions and the following disclaimer.
|
42 |
* 2. Redistributions in binary form must reproduce the above copyright
|
43 |
* notice, this list of conditions and the following disclaimer in the
|
44 |
* documentation and/or other materials provided with the distribution.
|
45 |
*
|
46 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
47 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
48 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
49 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
50 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
51 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
52 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
53 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
54 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
55 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
56 |
* SUCH DAMAGE.
|
57 |
*
|
58 |
* from FreeBSD: mlyreg.h,v 1.1 2000/08/23 03:22:39 msmith Exp
|
59 |
*/
|
60 |
|
61 |
/*
|
62 |
* Section numbers in this document refer to the Mylex "Firmware Software Interface"
|
63 |
* document ('FSI'), revision 0.11 04/11/00 unless otherwise qualified.
|
64 |
*
|
65 |
* Reference is made to the Mylex "Programming Guide for 6.x Controllers" document
|
66 |
* ('PG6'), document #771242 revision 0.02, 04/11/00
|
67 |
*
|
68 |
* Note that fields marked N/A are not supported by the PCI controllers, but are
|
69 |
* defined here to hold place in datastructures that are shared with the SCSI
|
70 |
* controllers. Items not relevant to PCI controllers are not described here.
|
71 |
*
|
72 |
* Ordering of items in this file is a little odd due to the constraints of
|
73 |
* nested declarations.
|
74 |
*/
|
75 |
|
76 |
#ifndef _PCI_MLYREG_H_
|
77 |
#define _PCI_MLYREG_H_
|
78 |
|
79 |
/*
|
80 |
* 2.1 (Scatter Gather List Format)
|
81 |
*/
|
82 |
struct mly_sg_entry {
|
83 |
u_int64_t physaddr; |
84 |
u_int64_t length; |
85 |
} __packed; |
86 |
|
87 |
/*
|
88 |
* 5.2 System Device Access
|
89 |
*
|
90 |
* This is corroborated by the layout of the MDACIOCTL_GETCONTROLLERINFO data
|
91 |
* in 21.8
|
92 |
*/
|
93 |
#define MLY_MAX_CHANNELS 6 |
94 |
#define MLY_MAX_TARGETS 16 |
95 |
#define MLY_MAX_LUNS 1 |
96 |
|
97 |
/*
|
98 |
* 8.1 Different Device States
|
99 |
*/
|
100 |
#define MLY_DEVICE_STATE_OFFLINE 0x08 /* DEAD/OFFLINE */ |
101 |
#define MLY_DEVICE_STATE_UNCONFIGURED 0x00 |
102 |
#define MLY_DEVICE_STATE_ONLINE 0x01 |
103 |
#define MLY_DEVICE_STATE_CRITICAL 0x09 |
104 |
#define MLY_DEVICE_STATE_WRITEONLY 0x03 |
105 |
#define MLY_DEVICE_STATE_STANDBY 0x21 |
106 |
#define MLY_DEVICE_STATE_MISSING 0x04 /* or-ed with (ONLINE or WRITEONLY or STANDBY) */ |
107 |
|
108 |
/*
|
109 |
* 8.2 Device Type Field definitions
|
110 |
*/
|
111 |
#define MLY_DEVICE_TYPE_RAID0 0x0 /* RAID 0 */ |
112 |
#define MLY_DEVICE_TYPE_RAID1 0x1 /* RAID 1 */ |
113 |
#define MLY_DEVICE_TYPE_RAID3 0x3 /* RAID 3 right asymmetric parity */ |
114 |
#define MLY_DEVICE_TYPE_RAID5 0x5 /* RAID 5 right asymmetric parity */ |
115 |
#define MLY_DEVICE_TYPE_RAID6 0x6 /* RAID 6 (Mylex RAID 6) */ |
116 |
#define MLY_DEVICE_TYPE_RAID7 0x7 /* RAID 7 (JBOD) */ |
117 |
#define MLY_DEVICE_TYPE_NEWSPAN 0x8 /* New Mylex SPAN */ |
118 |
#define MLY_DEVICE_TYPE_RAID3F 0x9 /* RAID 3 fixed parity */ |
119 |
#define MLY_DEVICE_TYPE_RAID3L 0xb /* RAID 3 left symmetric parity */ |
120 |
#define MLY_DEVICE_TYPE_SPAN 0xc /* current spanning implementation */ |
121 |
#define MLY_DEVICE_TYPE_RAID5L 0xd /* RAID 5 left symmetric parity */ |
122 |
#define MLY_DEVICE_TYPE_RAIDE 0xe /* RAID E (concatenation) */ |
123 |
#define MLY_DEVICE_TYPE_PHYSICAL 0xf /* physical device */ |
124 |
|
125 |
/*
|
126 |
* 8.3 Stripe Size
|
127 |
*/
|
128 |
#define MLY_STRIPE_ZERO 0x0 /* no stripe (RAID 1, RAID 7, etc) */ |
129 |
#define MLY_STRIPE_512b 0x1 |
130 |
#define MLY_STRIPE_1k 0x2 |
131 |
#define MLY_STRIPE_2k 0x3 |
132 |
#define MLY_STRIPE_4k 0x4 |
133 |
#define MLY_STRIPE_8k 0x5 |
134 |
#define MLY_STRIPE_16k 0x6 |
135 |
#define MLY_STRIPE_32k 0x7 |
136 |
#define MLY_STRIPE_64k 0x8 |
137 |
#define MLY_STRIPE_128k 0x9 |
138 |
#define MLY_STRIPE_256k 0xa |
139 |
#define MLY_STRIPE_512k 0xb |
140 |
#define MLY_STRIPE_1m 0xc |
141 |
|
142 |
/*
|
143 |
* 8.4 Cacheline Size
|
144 |
*/
|
145 |
#define MLY_CACHELINE_ZERO 0x0 /* caching cannot be enabled */ |
146 |
#define MLY_CACHELINE_512b 0x1 |
147 |
#define MLY_CACHELINE_1k 0x2 |
148 |
#define MLY_CACHELINE_2k 0x3 |
149 |
#define MLY_CACHELINE_4k 0x4 |
150 |
#define MLY_CACHELINE_8k 0x5 |
151 |
#define MLY_CACHELINE_16k 0x6 |
152 |
#define MLY_CACHELINE_32k 0x7 |
153 |
#define MLY_CACHELINE_64k 0x8 |
154 |
|
155 |
/*
|
156 |
* 8.5 Read/Write control
|
157 |
*/
|
158 |
#define MLY_RWCtl_INITTED (1<<7) /* if set, the logical device is initialised */ |
159 |
/* write control */
|
160 |
#define MLY_RWCtl_WCD (0) /* write cache disabled */ |
161 |
#define MLY_RWCtl_WDISABLE (1<<3) /* writing disabled */ |
162 |
#define MLY_RWCtl_WCE (2<<3) /* write cache enabled */ |
163 |
#define MLY_RWCtl_IWCE (3<<3) /* intelligent write cache enabled */ |
164 |
/* read control */
|
165 |
#define MLY_RWCtl_RCD (0) /* read cache is disabled */ |
166 |
#define MLY_RWCtl_RCE (1) /* read cache enabled */ |
167 |
#define MLY_RWCtl_RAHEAD (2) /* readahead enabled */ |
168 |
#define MLY_RWCtl_IRAHEAD (3) /* intelligent readahead enabled */ |
169 |
|
170 |
/*
|
171 |
* 9.0 LUN Map Format
|
172 |
*/
|
173 |
struct mly_lun_map {
|
174 |
u_int8_t res1:4;
|
175 |
u_int8_t host_port_mapped:1; /* this system drive visibile to host on this controller/port combination */ |
176 |
u_int8_t tid_valid:1; /* target ID valid */ |
177 |
u_int8_t hid_valid:1; /* host ID valid */ |
178 |
u_int8_t lun_valid:1; /* LUN valid */ |
179 |
u_int8_t res2; |
180 |
u_int8_t lun; /* LUN */
|
181 |
u_int8_t tid; /* TID */
|
182 |
u_int8_t hid[32]; /* HID (one bit for each host) */ |
183 |
} __packed; |
184 |
|
185 |
/*
|
186 |
* 10.1 Controller Parameters
|
187 |
*/
|
188 |
struct mly_param_controller {
|
189 |
u_int8_t rdahen:1; /* N/A */ |
190 |
u_int8_t bilodly:1; /* N/A */ |
191 |
u_int8_t fua_disable:1;
|
192 |
u_int8_t reass1s:1; /* N/A */ |
193 |
u_int8_t truvrfy:1; /* N/A */ |
194 |
u_int8_t dwtvrfy:1; /* N/A */ |
195 |
u_int8_t background_initialisation:1;
|
196 |
u_int8_t clustering:1; /* N/A */ |
197 |
|
198 |
u_int8_t bios_disable:1;
|
199 |
u_int8_t boot_from_cdrom:1;
|
200 |
u_int8_t drive_coercion:1;
|
201 |
u_int8_t write_same_disable:1;
|
202 |
u_int8_t hba_mode:1; /* N/A */ |
203 |
u_int8_t bios_geometry:2;
|
204 |
#define MLY_BIOSGEOM_2G 0x0 |
205 |
#define MLY_BIOSGEOM_8G 0x1 |
206 |
u_int8_t res1:1; /* N/A */ |
207 |
|
208 |
u_int8_t res2[2]; /* N/A */ |
209 |
|
210 |
u_int8_t v_dec:1;
|
211 |
u_int8_t safte:1; /* N/A */ |
212 |
u_int8_t ses:1; /* N/A */ |
213 |
u_int8_t res3:2; /* N/A */ |
214 |
u_int8_t v_arm:1;
|
215 |
u_int8_t v_ofm:1;
|
216 |
u_int8_t res4:1; /* N/A */ |
217 |
|
218 |
u_int8_t rebuild_check_rate; |
219 |
u_int8_t cache_line_size; /* see 8.4 */
|
220 |
u_int8_t oem_code; |
221 |
#define MLY_OEM_MYLEX 0x00 |
222 |
#define MLY_OEM_IBM 0x08 |
223 |
#define MLY_OEM_HP 0x0a |
224 |
#define MLY_OEM_DEC 0x0c |
225 |
#define MLY_OEM_SIEMENS 0x10 |
226 |
#define MLY_OEM_INTEL 0x12 |
227 |
u_int8_t spinup_mode; |
228 |
#define MLY_SPIN_AUTO 0 |
229 |
#define MLY_SPIN_PWRSPIN 1 |
230 |
#define MLY_SPIN_WSSUSPIN 2 |
231 |
u_int8_t spinup_devices; |
232 |
u_int8_t spinup_interval; |
233 |
u_int8_t spinup_wait_time; |
234 |
|
235 |
u_int8_t res5:3; /* N/A */ |
236 |
u_int8_t vutursns:1; /* N/A */ |
237 |
u_int8_t dccfil:1; /* N/A */ |
238 |
u_int8_t nopause:1; /* N/A */ |
239 |
u_int8_t disqfull:1; /* N/A */ |
240 |
u_int8_t disbusy:1; /* N/A */ |
241 |
|
242 |
u_int8_t res6:2; /* N/A */ |
243 |
u_int8_t failover_node_name; /* N/A */
|
244 |
u_int8_t res7:1; /* N/A */ |
245 |
u_int8_t ftopo:3; /* N/A */ |
246 |
u_int8_t disable_ups:1; /* N/A */ |
247 |
|
248 |
u_int8_t res8:1; /* N/A */ |
249 |
u_int8_t propagate_reset:1; /* N/A */ |
250 |
u_int8_t nonstd_mp_reset:1; /* N/A */ |
251 |
u_int8_t res9:5; /* N/A */ |
252 |
|
253 |
u_int8_t res10; /* N/A */
|
254 |
u_int8_t serial_port_baud_rate; /* N/A */
|
255 |
u_int8_t serial_port_control; /* N/A */
|
256 |
u_int8_t change_stripe_ok_developer_flag_only; /* N/A */
|
257 |
|
258 |
u_int8_t small_large_host_transfers:2; /* N/A */ |
259 |
u_int8_t frame_control:2; /* N/A */ |
260 |
u_int8_t pci_latency_control:2; /* N/A */ |
261 |
u_int8_t treat_lip_as_reset:1; /* N/A */ |
262 |
u_int8_t res11:1; /* N/A */ |
263 |
|
264 |
u_int8_t ms_autorest:1; /* N/A */ |
265 |
u_int8_t res12:7; /* N/A */ |
266 |
|
267 |
u_int8_t ms_aa_fsim:1; /* N/A */ |
268 |
u_int8_t ms_aa_ccach:1; /* N/A */ |
269 |
u_int8_t ms_aa_fault_signals:1; /* N/A */ |
270 |
u_int8_t ms_aa_c4_faults:1; /* N/A */ |
271 |
u_int8_t ms_aa_host_reset_delay_mask:4; /* N/A */ |
272 |
|
273 |
u_int8_t ms_flg_simplex_no_rstcom:1; /* N/A */ |
274 |
u_int8_t res13:7; /* N/A */ |
275 |
|
276 |
u_int8_t res14; /* N/A */
|
277 |
u_int8_t hardloopid[2][2]; /* N/A */ |
278 |
u_int8_t ctrlname[2][16+1]; /* N/A */ |
279 |
u_int8_t initiator_id; |
280 |
u_int8_t startup_option; |
281 |
#define MLY_STARTUP_IF_NO_CHANGE 0x0 |
282 |
#define MLY_STARTUP_IF_NO_LUN_CHANGE 0x1 |
283 |
#define MLY_STARTUP_IF_NO_LUN_OFFLINE 0x2 |
284 |
#define MLY_STARTUP_IF_LUN0_NO_CHANGE 0x3 |
285 |
#define MLY_STARTUP_IF_LUN0_NOT_OFFLINE 0x4 |
286 |
#define MLY_STARTUP_ALWAYS 0x5 |
287 |
|
288 |
u_int8_t res15[62];
|
289 |
} __packed__; |
290 |
|
291 |
/*
|
292 |
* 10.2 Physical Device Parameters
|
293 |
*/
|
294 |
struct mly_param_physical_device {
|
295 |
u_int16_t tags; |
296 |
u_int16_t speed; |
297 |
u_int8_t width; |
298 |
u_int8_t combing:1;
|
299 |
u_int8_t res1:7;
|
300 |
u_int8_t res2[3];
|
301 |
} __packed; |
302 |
|
303 |
/*
|
304 |
* 10.3 Logical Device Parameters
|
305 |
*/
|
306 |
struct mly_param_logical_device {
|
307 |
u_int8_t type; /* see 8.2 */
|
308 |
u_int8_t state; /* see 8.1 */
|
309 |
u_int16_t raid_device; |
310 |
u_int8_t res1; |
311 |
u_int8_t bios_geometry; /* BIOS control word? */
|
312 |
u_int8_t stripe_size; /* see 8.3 */
|
313 |
u_int8_t read_write_control; /* see 8.5 */
|
314 |
u_int8_t res2[8];
|
315 |
} __packed; |
316 |
|
317 |
/*
|
318 |
* 12.3 Health Status Buffer
|
319 |
*
|
320 |
* Pad to 128 bytes.
|
321 |
*/
|
322 |
struct mly_health_status {
|
323 |
u_int32_t uptime_us; /* N/A */
|
324 |
u_int32_t uptime_ms; /* N/A */
|
325 |
u_int32_t realtime; /* N/A */
|
326 |
u_int32_t res1; /* N/A */
|
327 |
u_int32_t change_counter; |
328 |
u_int32_t res2; /* N/A */
|
329 |
u_int32_t debug_message_index; /* N/A */
|
330 |
u_int32_t bios_message_index; /* N/A */
|
331 |
u_int32_t trace_page; /* N/A */
|
332 |
u_int32_t profiler_page; /* N/A */
|
333 |
u_int32_t next_event; |
334 |
u_int8_t res3[4 + 16 + 64]; /* N/A */ |
335 |
} __packed; |
336 |
|
337 |
/*
|
338 |
* 14.2 Timeout Bit Format
|
339 |
*/
|
340 |
#define MLY_TIMEOUT_SECONDS 0x00 |
341 |
#define MLY_TIMEOUT_MINUTES 0x40 |
342 |
#define MLY_TIMEOUT_HOURS 0x80 |
343 |
|
344 |
/*
|
345 |
* 14.3 Operation Device
|
346 |
*/
|
347 |
#define MLY_OPDEVICE_PHYSICAL_DEVICE 0x0 |
348 |
#define MLY_OPDEVICE_RAID_DEVICE 0x1 |
349 |
#define MLY_OPDEVICE_PHYSICAL_CHANNEL 0x2 |
350 |
#define MLY_OPDEVICE_RAID_CHANNEL 0x3 |
351 |
#define MLY_OPDEVICE_PHYSICAL_CONTROLLER 0x4 |
352 |
#define MLY_OPDEVICE_RAID_CONTROLLER 0x5 |
353 |
#define MLY_OPDEVICE_CONFIGURATION_GROUP 0x10 |
354 |
|
355 |
/*
|
356 |
* 14.4 Status Bit Format
|
357 |
*
|
358 |
* AKA Status Mailbox Format
|
359 |
*
|
360 |
* XXX format conflict between FSI and PG6 over the ordering of the
|
361 |
* status and sense length fields.
|
362 |
*/
|
363 |
struct mly_status {
|
364 |
u_int16_t command_id; |
365 |
u_int8_t status; |
366 |
u_int8_t sense_length; |
367 |
int32_t residue; |
368 |
} __packed; |
369 |
|
370 |
/*
|
371 |
* 14.5 Command Control Bit (CCB) format
|
372 |
*
|
373 |
* This byte is unfortunately named.
|
374 |
*/
|
375 |
#define MLY_CMDCTL_FORCE_UNIT_ACCESS 0x01 |
376 |
#define MLY_CMDCTL_DISABLE_PAGE_OUT 0x02 |
377 |
#define MLY_CMDCTL_EXTENDED_SG_TABLE 0x08 |
378 |
#define MLY_CMDCTL_DATA_DIRECTION 0x10 |
379 |
#define MLY_CMDCTL_NO_AUTO_SENSE 0x40 |
380 |
#define MLY_CMDCTL_DISABLE_DISCONNECT 0x80 |
381 |
|
382 |
/*
|
383 |
* 15.0 Commands
|
384 |
*
|
385 |
* We use the command names as given by Mylex
|
386 |
*/
|
387 |
#define MDACMD_MEMCOPY 0x1 /* memory to memory copy */ |
388 |
#define MDACMD_SCSIPT 0x2 /* SCSI passthrough (small command) */ |
389 |
#define MDACMD_SCSILCPT 0x3 /* SCSI passthrough (large command) */ |
390 |
#define MDACMD_SCSI 0x4 /* SCSI command for logical/phyiscal device (small command) */ |
391 |
#define MDACMD_SCSILC 0x5 /* SCSI command for logical/phyiscal device (large command) */ |
392 |
#define MDACMD_IOCTL 0x20 /* Management command */ |
393 |
#define MDACMD_IOCTLCHECK 0x23 /* Validate management command (not implemented) */ |
394 |
|
395 |
/*
|
396 |
* 16.0 IOCTL command
|
397 |
*
|
398 |
* We use the IOCTL names as given by Mylex
|
399 |
* Note that only ioctls supported by the PCI controller family are listed
|
400 |
*/
|
401 |
#define MDACIOCTL_GETCONTROLLERINFO 0x1 |
402 |
#define MDACIOCTL_GETLOGDEVINFOVALID 0x3 |
403 |
#define MDACIOCTL_GETPHYSDEVINFOVALID 0x5 |
404 |
#define MDACIOCTL_GETCONTROLLERSTATISTICS 0xb |
405 |
#define MDACIOCTL_GETLOGDEVSTATISTICS 0xd |
406 |
#define MDACIOCTL_GETPHYSDEVSTATISTICS 0xf |
407 |
#define MDACIOCTL_GETHEALTHSTATUS 0x11 |
408 |
#define MDACIOCTL_GETEVENT 0x15 |
409 |
/* flash update */
|
410 |
#define MDACIOCTL_STOREIMAGE 0x2c |
411 |
#define MDACIOCTL_READIMAGE 0x2d |
412 |
#define MDACIOCTL_FLASHIMAGES 0x2e |
413 |
/* battery backup unit */
|
414 |
#define MDACIOCTL_GET_SUBSYSTEM_DATA 0x70 |
415 |
#define MDACIOCTL_SET_SUBSYSTEM_DATA 0x71 |
416 |
/* non-data commands */
|
417 |
#define MDACIOCTL_STARTDISOCVERY 0x81 |
418 |
#define MDACIOCTL_SETRAIDDEVSTATE 0x82 |
419 |
#define MDACIOCTL_INITPHYSDEVSTART 0x84 |
420 |
#define MDACIOCTL_INITPHYSDEVSTOP 0x85 |
421 |
#define MDACIOCTL_INITRAIDDEVSTART 0x86 |
422 |
#define MDACIOCTL_INITRAIDDEVSTOP 0x87 |
423 |
#define MDACIOCTL_REBUILDRAIDDEVSTART 0x88 |
424 |
#define MDACIOCTL_REBUILDRAIDDEVSTOP 0x89 |
425 |
#define MDACIOCTL_MAKECONSISTENTDATASTART 0x8a |
426 |
#define MDACIOCTL_MAKECONSISTENTDATASTOP 0x8b |
427 |
#define MDACIOCTL_CONSISTENCYCHECKSTART 0x8c |
428 |
#define MDACIOCTL_CONSISTENCYCHECKSTOP 0x8d |
429 |
#define MDACIOCTL_SETMEMORYMAILBOX 0x8e |
430 |
#define MDACIOCTL_RESETDEVICE 0x90 |
431 |
#define MDACIOCTL_FLUSHDEVICEDATA 0x91 |
432 |
#define MDACIOCTL_PAUSEDEVICE 0x92 |
433 |
#define MDACIOCTL_UNPAUSEDEVICE 0x93 |
434 |
#define MDACIOCTL_LOCATEDEVICE 0x94 |
435 |
#define MDACIOCTL_SETMASTERSLAVEMODE 0x95 |
436 |
#define MDACIOCTL_SETREALTIMECLOCK 0xac |
437 |
/* RAID configuration */
|
438 |
#define MDACIOCTL_CREATENEWCONF 0xc0 |
439 |
#define MDACIOCTL_DELETERAIDDEV 0xc1 |
440 |
#define MDACIOCTL_REPLACEINTERNALDEV 0xc2 |
441 |
#define MDACIOCTL_RENAMERAIDDEV 0xc3 |
442 |
#define MDACIOCTL_ADDNEWCONF 0xc4 |
443 |
#define MDACIOCTL_XLATEPHYSDEVTORAIDDEV 0xc5 |
444 |
#define MDACIOCTL_MORE 0xc6 |
445 |
#define MDACIOCTL_SETPHYSDEVPARAMETER 0xc8 |
446 |
#define MDACIOCTL_GETPHYSDEVPARAMETER 0xc9 |
447 |
#define MDACIOCTL_CLEARCONF 0xca |
448 |
#define MDACIOCTL_GETDEVCONFINFO 0xcb |
449 |
#define MDACIOCTL_GETGROUPCONFINFO 0xcc |
450 |
#define MDACIOCTL_GETFREESPACELIST 0xcd |
451 |
#define MDACIOCTL_GETLOGDEVPARAMETER 0xce |
452 |
#define MDACIOCTL_SETLOGDEVPARAMETER 0xcf |
453 |
#define MDACIOCTL_GETCONTROLLERPARAMETER 0xd0 |
454 |
#define MDACIOCTL_SETCONTRLLERPARAMETER 0xd1 |
455 |
#define MDACIOCTL_CLEARCONFSUSPMODE 0xd2 |
456 |
#define MDACIOCTL_GETBDT_FOR_SYSDRIVE 0xe0 |
457 |
|
458 |
/*
|
459 |
* 17.1.4 Data Transfer Memory Address Without SG List
|
460 |
*/
|
461 |
struct mly_short_transfer {
|
462 |
struct mly_sg_entry sg[2]; |
463 |
} __packed; |
464 |
|
465 |
/*
|
466 |
* 17.1.5 Data Transfer Memory Address With SG List
|
467 |
*
|
468 |
* Note that only the first s/g table is currently used.
|
469 |
*/
|
470 |
struct mly_sg_transfer {
|
471 |
u_int16_t entries[3];
|
472 |
u_int16_t res1; |
473 |
u_int64_t table_physaddr[3];
|
474 |
} __packed; |
475 |
|
476 |
/*
|
477 |
* 17.1.3 Data Transfer Memory Address Format
|
478 |
*/
|
479 |
union mly_cmd_transfer {
|
480 |
struct mly_short_transfer direct;
|
481 |
struct mly_sg_transfer indirect;
|
482 |
}; |
483 |
|
484 |
/*
|
485 |
* 21.1 MDACIOCTL_SETREALTIMECLOCK
|
486 |
* 21.7 MDACIOCTL_GETHEALTHSTATUS
|
487 |
* 21.8 MDACIOCTL_GETCONTROLLERINFO
|
488 |
* 21.9 MDACIOCTL_GETLOGDEVINFOVALID
|
489 |
* 21.10 MDACIOCTL_GETPHYSDEVINFOVALID
|
490 |
* 21.11 MDACIOCTL_GETPHYSDEVSTATISTICS
|
491 |
* 21.12 MDACIOCTL_GETLOGDEVSTATISTICS
|
492 |
* 21.13 MDACIOCTL_GETCONTROLLERSTATISTICS
|
493 |
* 21.27 MDACIOCTL_GETBDT_FOR_SYSDRIVE
|
494 |
* 23.4 MDACIOCTL_CREATENEWCONF
|
495 |
* 23.5 MDACIOCTL_ADDNEWCONF
|
496 |
* 23.8 MDACIOCTL_GETDEVCONFINFO
|
497 |
* 23.9 MDACIOCTL_GETFREESPACELIST
|
498 |
* 24.1 MDACIOCTL_MORE
|
499 |
* 25.1 MDACIOCTL_GETPHYSDEVPARAMETER
|
500 |
* 25.2 MDACIOCTL_SETPHYSDEVPARAMETER
|
501 |
* 25.3 MDACIOCTL_GETLOGDEVPARAMETER
|
502 |
* 25.4 MDACIOCTL_SETLOGDEVPARAMETER
|
503 |
* 25.5 MDACIOCTL_GETCONTROLLERPARAMETER
|
504 |
* 25.6 MDACIOCTL_SETCONTROLLERPARAMETER
|
505 |
*
|
506 |
* These commands just transfer data
|
507 |
*/
|
508 |
struct mly_ioctl_param_data {
|
509 |
u_int8_t param[10];
|
510 |
union mly_cmd_transfer transfer;
|
511 |
} __packed; |
512 |
|
513 |
/*
|
514 |
* 21.2 MDACIOCTL_SETMEMORYMAILBOX
|
515 |
*/
|
516 |
struct mly_ioctl_param_setmemorymailbox {
|
517 |
u_int8_t health_buffer_size; |
518 |
u_int8_t res1; |
519 |
u_int64_t health_buffer_physaddr; |
520 |
u_int64_t command_mailbox_physaddr; |
521 |
u_int64_t status_mailbox_physaddr; |
522 |
u_int64_t res2[2];
|
523 |
} __packed; |
524 |
|
525 |
/*
|
526 |
* 21.8.2 MDACIOCTL_GETCONTROLLERINFO: Data Format
|
527 |
*/
|
528 |
struct mly_ioctl_getcontrollerinfo {
|
529 |
u_int8_t res1; /* N/A */
|
530 |
u_int8_t interface_type; |
531 |
u_int8_t controller_type; |
532 |
u_int8_t res2; /* N/A */
|
533 |
u_int16_t interface_speed; |
534 |
u_int8_t interface_width; |
535 |
u_int8_t res3[9]; /* N/A */ |
536 |
char interface_name[16]; |
537 |
char controller_name[16]; |
538 |
u_int8_t res4[16]; /* N/A */ |
539 |
/* firmware release information */
|
540 |
u_int8_t fw_major; |
541 |
u_int8_t fw_minor; |
542 |
u_int8_t fw_turn; |
543 |
u_int8_t fw_build; |
544 |
u_int8_t fw_day; |
545 |
u_int8_t fw_month; |
546 |
u_int8_t fw_century; |
547 |
u_int8_t fw_year; |
548 |
/* hardware release information */
|
549 |
u_int8_t hw_revision; /* N/A */
|
550 |
u_int8_t res5[3]; /* N/A */ |
551 |
u_int8_t hw_release_day; /* N/A */
|
552 |
u_int8_t hw_release_month; /* N/A */
|
553 |
u_int8_t hw_release_century; /* N/A */
|
554 |
u_int8_t hw_release_year; /* N/A */
|
555 |
/* hardware manufacturing information */
|
556 |
u_int8_t batch_number; /* N/A */
|
557 |
u_int8_t res6; /* N/A */
|
558 |
u_int8_t plant_number; |
559 |
u_int8_t res7; |
560 |
u_int8_t hw_manuf_day; |
561 |
u_int8_t hw_manuf_month; |
562 |
u_int8_t hw_manuf_century; |
563 |
u_int8_t hw_manuf_year; |
564 |
u_int8_t max_pdd_per_xldd; |
565 |
u_int8_t max_ildd_per_xldd; |
566 |
u_int16_t nvram_size; |
567 |
u_int8_t max_number_of_xld; /* N/A */
|
568 |
u_int8_t res8[3]; /* N/A */ |
569 |
/* unique information per controller */
|
570 |
char serial_number[16]; |
571 |
u_int8_t res9[16]; /* N/A */ |
572 |
/* vendor information */
|
573 |
u_int8_t res10[3]; /* N/A */ |
574 |
u_int8_t oem_information; |
575 |
char vendor_name[16]; /* N/A */ |
576 |
/* other physical/controller/operation information */
|
577 |
u_int8_t bbu_present:1;
|
578 |
u_int8_t active_clustering:1;
|
579 |
u_int8_t res11:6; /* N/A */ |
580 |
u_int8_t res12[3]; /* N/A */ |
581 |
/* physical device scan information */
|
582 |
u_int8_t physical_scan_active:1;
|
583 |
u_int8_t res13:7; /* N/A */ |
584 |
u_int8_t physical_scan_channel; |
585 |
u_int8_t physical_scan_target; |
586 |
u_int8_t physical_scan_lun; |
587 |
/* maximum command data transfer size */
|
588 |
u_int16_t maximum_block_count; |
589 |
u_int16_t maximum_sg_entries; |
590 |
/* logical/physical device counts */
|
591 |
u_int16_t logical_devices_present; |
592 |
u_int16_t logical_devices_critical; |
593 |
u_int16_t logical_devices_offline; |
594 |
u_int16_t physical_devices_present; |
595 |
u_int16_t physical_disks_present; |
596 |
u_int16_t physical_disks_critical; /* N/A */
|
597 |
u_int16_t physical_disks_offline; |
598 |
u_int16_t maximum_parallel_commands; |
599 |
/* channel and target ID information */
|
600 |
u_int8_t physical_channels_present; |
601 |
u_int8_t virtual_channels_present; |
602 |
u_int8_t physical_channels_possible; |
603 |
u_int8_t virtual_channels_possible; |
604 |
u_int8_t maximum_targets_possible[16]; /* N/A (6 and up) */ |
605 |
u_int8_t res14[12]; /* N/A */ |
606 |
/* memory/cache information */
|
607 |
u_int16_t memory_size; |
608 |
u_int16_t cache_size; |
609 |
u_int32_t valid_cache_size; /* N/A */
|
610 |
u_int32_t dirty_cache_size; /* N/A */
|
611 |
u_int16_t memory_speed; |
612 |
u_int8_t memory_width; |
613 |
u_int8_t memory_type:5;
|
614 |
u_int8_t res15:1; /* N/A */ |
615 |
u_int8_t memory_parity:1;
|
616 |
u_int8_t memory_ecc:1;
|
617 |
char memory_information[16]; /* N/A */ |
618 |
/* execution memory information */
|
619 |
u_int16_t exmemory_size; |
620 |
u_int16_t l2cache_size; /* N/A */
|
621 |
u_int8_t res16[8]; /* N/A */ |
622 |
u_int16_t exmemory_speed; |
623 |
u_int8_t exmemory_width; |
624 |
u_int8_t exmemory_type:5;
|
625 |
u_int8_t res17:1; /* N/A */ |
626 |
u_int8_t exmemory_parity:1;
|
627 |
u_int8_t exmemory_ecc:1;
|
628 |
char exmemory_name[16]; /* N/A */ |
629 |
/* CPU information */
|
630 |
struct {
|
631 |
u_int16_t speed; |
632 |
u_int8_t type; |
633 |
u_int8_t number; |
634 |
u_int8_t res1[12]; /* N/A */ |
635 |
char name[16]; /* N/A */ |
636 |
} cpu[2] __packed;
|
637 |
/* debugging/profiling/command time tracing information */
|
638 |
u_int16_t profiling_page; /* N/A */
|
639 |
u_int16_t profiling_programs; /* N/A */
|
640 |
u_int16_t time_trace_page; /* N/A */
|
641 |
u_int16_t time_trace_programs; /* N/A */
|
642 |
u_int8_t res18[8]; /* N/A */ |
643 |
/* error counters on physical devices */
|
644 |
u_int16_t physical_device_bus_resets; /* N/A */
|
645 |
u_int16_t physical_device_parity_errors; /* N/A */
|
646 |
u_int16_t physical_device_soft_errors; /* N/A */
|
647 |
u_int16_t physical_device_commands_failed; /* N/A */
|
648 |
u_int16_t physical_device_miscellaneous_errors; /* N/A */
|
649 |
u_int16_t physical_device_command_timeouts; /* N/A */
|
650 |
u_int16_t physical_device_selection_timeouts; /* N/A */
|
651 |
u_int16_t physical_device_retries; /* N/A */
|
652 |
u_int16_t physical_device_aborts; /* N/A */
|
653 |
u_int16_t physical_device_host_command_aborts; /* N/A */
|
654 |
u_int16_t physical_device_PFAs_detected; /* N/A */
|
655 |
u_int16_t physical_device_host_commands_failed; /* N/A */
|
656 |
u_int8_t res19[8]; /* N/A */ |
657 |
/* error counters on logical devices */
|
658 |
u_int16_t logical_device_soft_errors; /* N/A */
|
659 |
u_int16_t logical_device_commands_failed; /* N/A */
|
660 |
u_int16_t logical_device_host_command_aborts; /* N/A */
|
661 |
u_int16_t res20; /* N/A */
|
662 |
/* error counters on controller */
|
663 |
u_int16_t controller_parity_ecc_errors; |
664 |
u_int16_t controller_host_command_aborts; /* N/A */
|
665 |
u_int8_t res21[4]; /* N/A */ |
666 |
/* long duration activity information */
|
667 |
u_int16_t background_inits_active; |
668 |
u_int16_t logical_inits_active; |
669 |
u_int16_t physical_inits_active; |
670 |
u_int16_t consistency_checks_active; |
671 |
u_int16_t rebuilds_active; |
672 |
u_int16_t MORE_active; |
673 |
u_int16_t patrol_active; /* N/A */
|
674 |
u_int8_t long_operation_status; /* N/A */
|
675 |
u_int8_t res22; /* N/A */
|
676 |
/* flash ROM information */
|
677 |
u_int8_t flash_type; /* N/A */
|
678 |
u_int8_t res23; /* N/A */
|
679 |
u_int16_t flash_size; |
680 |
u_int32_t flash_maximum_age; |
681 |
u_int32_t flash_age; |
682 |
u_int8_t res24[4]; /* N/A */ |
683 |
char flash_name[16]; /* N/A */ |
684 |
/* firmware runtime information */
|
685 |
u_int8_t rebuild_rate; |
686 |
u_int8_t background_init_rate; |
687 |
u_int8_t init_rate; |
688 |
u_int8_t consistency_check_rate; |
689 |
u_int8_t res25[4]; /* N/A */ |
690 |
u_int32_t maximum_dp; |
691 |
u_int32_t free_dp; |
692 |
u_int32_t maximum_iop; |
693 |
u_int32_t free_iop; |
694 |
u_int16_t maximum_comb_length; |
695 |
u_int16_t maximum_configuration_groups; |
696 |
u_int8_t installation_abort:1;
|
697 |
u_int8_t maintenance:1;
|
698 |
u_int8_t res26:6; /* N/A */ |
699 |
u_int8_t res27[3]; /* N/A */ |
700 |
u_int8_t res28[32 + 512]; /* N/A */ |
701 |
} __packed; |
702 |
|
703 |
/*
|
704 |
* 21.9.2 MDACIOCTL_GETLOGDEVINFOVALID
|
705 |
*/
|
706 |
struct mly_ioctl_getlogdevinfovalid {
|
707 |
u_int8_t res1; /* N/A */
|
708 |
u_int8_t channel; |
709 |
u_int8_t target; |
710 |
u_int8_t lun; |
711 |
u_int8_t state; /* see 8.1 */
|
712 |
u_int8_t raid_level; /* see 8.2 */
|
713 |
u_int8_t stripe_size; /* see 8.3 */
|
714 |
u_int8_t cache_line_size; /* see 8.4 */
|
715 |
u_int8_t read_write_control; /* see 8.5 */
|
716 |
u_int8_t consistency_check:1;
|
717 |
u_int8_t rebuild:1;
|
718 |
u_int8_t make_consistent:1;
|
719 |
u_int8_t initialisation:1;
|
720 |
u_int8_t migration:1;
|
721 |
u_int8_t patrol:1;
|
722 |
u_int8_t res2:2; /* N/A */ |
723 |
u_int8_t ar5_limit; |
724 |
u_int8_t ar5_algo; |
725 |
u_int16_t logical_device_number; |
726 |
u_int16_t bios_control; |
727 |
/* erorr counters */
|
728 |
u_int16_t soft_errors; /* N/A */
|
729 |
u_int16_t commands_failed; /* N/A */
|
730 |
u_int16_t host_command_aborts; /* N/A */
|
731 |
u_int16_t deferred_write_errors; /* N/A */
|
732 |
u_int8_t res3[8]; /* N/A */ |
733 |
/* device size information */
|
734 |
u_int8_t res4[2]; /* N/A */ |
735 |
u_int16_t device_block_size; |
736 |
u_int32_t original_device_size; /* N/A */
|
737 |
u_int32_t device_size; /* XXX "blocks or MB" Huh? */
|
738 |
u_int8_t res5[4]; /* N/A */ |
739 |
char device_name[32]; /* N/A */ |
740 |
u_int8_t inquiry[36];
|
741 |
u_int8_t res6[12]; /* N/A */ |
742 |
u_int64_t last_read_block; /* N/A */
|
743 |
u_int64_t last_written_block; /* N/A */
|
744 |
u_int64_t consistency_check_block; |
745 |
u_int64_t rebuild_block; |
746 |
u_int64_t make_consistent_block; |
747 |
u_int64_t initialisation_block; |
748 |
u_int64_t migration_block; |
749 |
u_int64_t patrol_block; /* N/A */
|
750 |
u_int8_t res7[64]; /* N/A */ |
751 |
} __packed; |
752 |
|
753 |
/*
|
754 |
* 21.10.2 MDACIOCTL_GETPHYSDEVINFOVALID: Data Format
|
755 |
*/
|
756 |
struct mly_ioctl_getphysdevinfovalid {
|
757 |
u_int8_t res1; |
758 |
u_int8_t channel; |
759 |
u_int8_t target; |
760 |
u_int8_t lun; |
761 |
u_int8_t raid_ft:1; /* configuration status */ |
762 |
u_int8_t res2:1; /* N/A */ |
763 |
u_int8_t local:1;
|
764 |
u_int8_t res3:5;
|
765 |
u_int8_t host_dead:1; /* multiple host/controller status *//* N/A */ |
766 |
u_int8_t host_connection_dead:1; /* N/A */ |
767 |
u_int8_t res4:6; /* N/A */ |
768 |
u_int8_t state; /* see 8.1 */
|
769 |
u_int8_t width; |
770 |
u_int16_t speed; |
771 |
/* multiported physical device information */
|
772 |
u_int8_t ports_available; /* N/A */
|
773 |
u_int8_t ports_inuse; /* N/A */
|
774 |
u_int8_t res5[4];
|
775 |
u_int8_t ether_address[16]; /* N/A */ |
776 |
u_int16_t command_tags; |
777 |
u_int8_t consistency_check:1; /* N/A */ |
778 |
u_int8_t rebuild:1; /* N/A */ |
779 |
u_int8_t make_consistent:1; /* N/A */ |
780 |
u_int8_t initialisation:1;
|
781 |
u_int8_t migration:1; /* N/A */ |
782 |
u_int8_t patrol:1; /* N/A */ |
783 |
u_int8_t res6:2;
|
784 |
u_int8_t long_operation_status; /* N/A */
|
785 |
u_int8_t parity_errors; |
786 |
u_int8_t soft_errors; |
787 |
u_int8_t hard_errors; |
788 |
u_int8_t miscellaneous_errors; |
789 |
u_int8_t command_timeouts; /* N/A */
|
790 |
u_int8_t retries; /* N/A */
|
791 |
u_int8_t aborts; /* N/A */
|
792 |
u_int8_t PFAs_detected; /* N/A */
|
793 |
u_int8_t res7[6];
|
794 |
u_int16_t block_size; |
795 |
u_int32_t original_device_size; /* XXX "blocks or MB" Huh? */
|
796 |
u_int32_t device_size; /* XXX "blocks or MB" Huh? */
|
797 |
u_int8_t res8[4];
|
798 |
char name[16]; /* N/A */ |
799 |
u_int8_t res9[16 + 32]; |
800 |
u_int8_t inquiry[36];
|
801 |
u_int8_t res10[12 + 16]; |
802 |
u_int64_t last_read_block; /* N/A */
|
803 |
u_int64_t last_written_block; /* N/A */
|
804 |
u_int64_t consistency_check_block; /* N/A */
|
805 |
u_int64_t rebuild_block; /* N/A */
|
806 |
u_int64_t make_consistent_block; /* N/A */
|
807 |
u_int64_t initialisation_block; /* N/A */
|
808 |
u_int64_t migration_block; /* N/A */
|
809 |
u_int64_t patrol_block; /* N/A */
|
810 |
u_int8_t res11[256];
|
811 |
} __packed; |
812 |
|
813 |
union mly_devinfo {
|
814 |
struct mly_ioctl_getlogdevinfovalid logdev;
|
815 |
struct mly_ioctl_getphysdevinfovalid physdev;
|
816 |
}; |
817 |
|
818 |
/*
|
819 |
* 21.11.2 MDACIOCTL_GETPHYSDEVSTATISTICS: Data Format
|
820 |
* 21.12.2 MDACIOCTL_GETLOGDEVSTATISTICS: Data Format
|
821 |
*/
|
822 |
struct mly_ioctl_getdevstatistics {
|
823 |
u_int32_t uptime_ms; /* getphysedevstatistics only */
|
824 |
u_int8_t res1[5]; /* N/A */ |
825 |
u_int8_t channel; |
826 |
u_int8_t target; |
827 |
u_int8_t lun; |
828 |
u_int16_t raid_device; /* getlogdevstatistics only */
|
829 |
u_int8_t res2[2]; /* N/A */ |
830 |
/* total read/write performance including cache data */
|
831 |
u_int32_t total_reads; |
832 |
u_int32_t total_writes; |
833 |
u_int32_t total_read_size; |
834 |
u_int32_t total_write_size; |
835 |
/* cache read/write performance */
|
836 |
u_int32_t cache_reads; /* N/A */
|
837 |
u_int32_t cache_writes; /* N/A */
|
838 |
u_int32_t cache_read_size; /* N/A */
|
839 |
u_int32_t cache_write_size; /* N/A */
|
840 |
/* commands active/wait information */
|
841 |
u_int32_t command_waits_done; /* N/A */
|
842 |
u_int16_t active_commands; /* N/A */
|
843 |
u_int16_t waiting_commands; /* N/A */
|
844 |
u_int8_t res3[8]; /* N/A */ |
845 |
} __packed; |
846 |
|
847 |
/*
|
848 |
* 21.13.2 MDACIOCTL_GETCONTROLLERSTATISTICS: Data Format
|
849 |
*/
|
850 |
struct mly_ioctl_getcontrollerstatistics {
|
851 |
u_int32_t uptime_ms; /* N/A */
|
852 |
u_int8_t res1[12]; /* N/A */ |
853 |
/* target physical device performance data information */
|
854 |
u_int32_t target_physical_device_interrupts; /* N/A */
|
855 |
u_int32_t target_physical_device_stray_interrupts;/* N/A */
|
856 |
u_int8_t res2[8]; /* N/A */ |
857 |
u_int32_t target_physical_device_reads; /* N/A */
|
858 |
u_int32_t target_physical_device_writes; /* N/A */
|
859 |
u_int32_t target_physical_device_read_size; /* N/A */
|
860 |
u_int32_t target_physical_device_write_size; /* N/A */
|
861 |
/* host system performance data information */
|
862 |
u_int32_t host_system_interrupts; /* N/A */
|
863 |
u_int32_t host_system_stray_interrupts; /* N/A */
|
864 |
u_int32_t host_system_sent_interrupts; /* N/A */
|
865 |
u_int8_t res3[4]; /* N/A */ |
866 |
u_int32_t physical_device_reads; /* N/A */
|
867 |
u_int32_t physical_device_writes; /* N/A */
|
868 |
u_int32_t physical_device_read_size; /* N/A */
|
869 |
u_int32_t physical_device_write_size; /* N/A */
|
870 |
u_int32_t physical_device_cache_reads; /* N/A */
|
871 |
u_int32_t physical_device_cache_writes; /* N/A */
|
872 |
u_int32_t physical_device_cache_read_size; /* N/A */
|
873 |
u_int32_t physical_device_cache_write_size; /* N/A */
|
874 |
u_int32_t logical_device_reads; /* N/A */
|
875 |
u_int32_t logical_device_writes; /* N/A */
|
876 |
u_int32_t logical_device_read_size; /* N/A */
|
877 |
u_int32_t logical_device_write_size; /* N/A */
|
878 |
u_int32_t logical_device_cache_reads; /* N/A */
|
879 |
u_int32_t logical_device_cache_writes; /* N/A */
|
880 |
u_int32_t logical_device_cache_read_size; /* N/A */
|
881 |
u_int32_t logical_device_cache_write_size; /* N/A */
|
882 |
u_int16_t target_physical_device_commands_active; /* N/A */
|
883 |
u_int16_t target_physical_device_commands_waiting;/* N/A */
|
884 |
u_int16_t host_system_commands_active; /* N/A */
|
885 |
u_int16_t host_system_commands_waiting; /* N/A */
|
886 |
u_int8_t res4[48 + 64]; /* N/A */ |
887 |
} __packed; |
888 |
|
889 |
/*
|
890 |
* 21.2 MDACIOCTL_SETRAIDDEVSTATE
|
891 |
*/
|
892 |
struct mly_ioctl_param_setraiddevstate {
|
893 |
u_int8_t state; |
894 |
} __packed; |
895 |
|
896 |
/*
|
897 |
* 21.27.2 MDACIOCTL_GETBDT_FOR_SYSDRIVE: Data Format
|
898 |
*/
|
899 |
#define MLY_MAX_BDT_ENTRIES 1022 |
900 |
struct mly_ioctl_getbdt_for_sysdrive {
|
901 |
u_int32_t num_of_bdt_entries; |
902 |
u_int32_t bad_data_block_address[MLY_MAX_BDT_ENTRIES]; |
903 |
} __packed; |
904 |
|
905 |
/*
|
906 |
* 22.1 Physical Device Definition (PDD)
|
907 |
*/
|
908 |
struct mly_pdd {
|
909 |
u_int8_t type; /* see 8.2 */
|
910 |
u_int8_t state; /* see 8.1 */
|
911 |
u_int16_t raid_device; |
912 |
u_int32_t device_size; /* XXX "block or MB" Huh? */
|
913 |
u_int8_t controller; |
914 |
u_int8_t channel; |
915 |
u_int8_t target; |
916 |
u_int8_t lun; |
917 |
u_int32_t start_address; |
918 |
} __packed; |
919 |
|
920 |
/*
|
921 |
* 22.2 RAID Device Use Definition (UDD)
|
922 |
*/
|
923 |
struct mly_udd {
|
924 |
u_int8_t res1; |
925 |
u_int8_t state; /* see 8.1 */
|
926 |
u_int16_t raid_device; |
927 |
u_int32_t start_address; |
928 |
} __packed; |
929 |
|
930 |
/*
|
931 |
* RAID Device Definition (LDD)
|
932 |
*/
|
933 |
struct mly_ldd {
|
934 |
u_int8_t type; /* see 8.2 */
|
935 |
u_int8_t state; /* see 8.1 */
|
936 |
u_int16_t raid_device; |
937 |
u_int32_t device_size; /* XXX "block or MB" Huh? */
|
938 |
u_int8_t devices_used_count; |
939 |
u_int8_t stripe_size; /* see 8.3 */
|
940 |
u_int8_t cache_line_size; /* see 8.4 */
|
941 |
u_int8_t read_write_control; /* see 8.5 */
|
942 |
u_int32_t devices_used_size; /* XXX "block or MB" Huh? */
|
943 |
u_int16_t devices_used[32]; /* XXX actual size of this field unknown! */ |
944 |
} __packed; |
945 |
|
946 |
/*
|
947 |
* Define a datastructure giving the smallest allocation that will hold
|
948 |
* a PDD, UDD or LDD for MDACIOCTL_GETDEVCONFINFO.
|
949 |
*/
|
950 |
struct mly_devconf_hdr {
|
951 |
u_int8_t type; /* see 8.2 */
|
952 |
u_int8_t state; /* see 8.1 */
|
953 |
u_int16_t raid_device; |
954 |
}; |
955 |
|
956 |
union mly_ioctl_devconfinfo {
|
957 |
struct mly_pdd pdd;
|
958 |
struct mly_udd udd;
|
959 |
struct mly_ldd ldd;
|
960 |
struct mly_devconf_hdr hdr;
|
961 |
}; |
962 |
|
963 |
/*
|
964 |
* 22.3 MDACIOCTL_RENAMERAIDDEV
|
965 |
*
|
966 |
* XXX this command is listed as transferring data, but does not define the data.
|
967 |
*/
|
968 |
struct mly_ioctl_param_renameraiddev {
|
969 |
u_int8_t new_raid_device; |
970 |
} __packed; |
971 |
|
972 |
/*
|
973 |
* 23.6.2 MDACIOCTL_XLATEPHYSDEVTORAIDDEV
|
974 |
*
|
975 |
* XXX documentation suggests this format will change
|
976 |
*/
|
977 |
struct mly_ioctl_param_xlatephysdevtoraiddev {
|
978 |
u_int16_t raid_device; |
979 |
u_int8_t res1[2];
|
980 |
u_int8_t controller; |
981 |
u_int8_t channel; |
982 |
u_int8_t target; |
983 |
u_int8_t lun; |
984 |
} __packed; |
985 |
|
986 |
/*
|
987 |
* 23.7 MDACIOCTL_GETGROUPCONFINFO
|
988 |
*/
|
989 |
struct mly_ioctl_param_getgroupconfinfo {
|
990 |
u_int16_t group; |
991 |
u_int8_t res1[8];
|
992 |
union mly_cmd_transfer transfer;
|
993 |
} __packed; |
994 |
|
995 |
/*
|
996 |
* 23.9.2 MDACIOCTL_GETFREESPACELIST: Data Format
|
997 |
*
|
998 |
* The controller will populate as much of this structure as is provided,
|
999 |
* or as is required to fully list the free space available.
|
1000 |
*/
|
1001 |
struct mly_ioctl_getfreespacelist_entry {
|
1002 |
u_int16_t raid_device; |
1003 |
u_int8_t res1[6];
|
1004 |
u_int32_t address; /* XXX "blocks or MB" Huh? */
|
1005 |
u_int32_t size; /* XXX "blocks or MB" Huh? */
|
1006 |
} __packed; |
1007 |
|
1008 |
struct mly_ioctl_getfrespacelist {
|
1009 |
u_int16_t returned_entries; |
1010 |
u_int16_t total_entries; |
1011 |
u_int8_t res1[12];
|
1012 |
struct mly_ioctl_getfreespacelist_entry space[]; /* expand to suit */ |
1013 |
} __packed; |
1014 |
|
1015 |
/*
|
1016 |
* 27.1 MDACIOCTL_GETSUBSYSTEMDATA
|
1017 |
* 27.2 MDACIOCTL_SETSUBSYSTEMDATA
|
1018 |
*
|
1019 |
* PCI controller only supports a limited subset of the possible operations.
|
1020 |
*
|
1021 |
* XXX where does the status end up? (the command transfers no data)
|
1022 |
*/
|
1023 |
struct mly_ioctl_param_subsystemdata {
|
1024 |
u_int8_t operation:4;
|
1025 |
#define MLY_BBU_GETSTATUS 0x00 |
1026 |
#define MLY_BBU_SET_THRESHOLD 0x00 /* minutes in param[0,1] */ |
1027 |
u_int8_t subsystem:4;
|
1028 |
#define MLY_SUBSYSTEM_BBU 0x01 |
1029 |
u_int parameter[3]; /* only for SETSUBSYSTEMDATA */ |
1030 |
} __packed; |
1031 |
|
1032 |
struct mly_ioctl_getsubsystemdata_bbustatus {
|
1033 |
u_int16_t current_power; |
1034 |
u_int16_t maximum_power; |
1035 |
u_int16_t power_threshold; |
1036 |
u_int8_t charge_level; |
1037 |
u_int8_t hardware_version; |
1038 |
u_int8_t battery_type; |
1039 |
#define MLY_BBU_TYPE_UNKNOWN 0x00 |
1040 |
#define MLY_BBU_TYPE_NICAD 0x01 |
1041 |
#define MLY_BBU_TYPE_MISSING 0xfe |
1042 |
u_int8_t res1; |
1043 |
u_int8_t operation_status; |
1044 |
#define MLY_BBU_STATUS_NO_SYNC 0x01 |
1045 |
#define MLY_BBU_STATUS_OUT_OF_SYNC 0x02 |
1046 |
#define MLY_BBU_STATUS_FIRST_WARNING 0x04 |
1047 |
#define MLY_BBU_STATUS_SECOND_WARNING 0x08 |
1048 |
#define MLY_BBU_STATUS_RECONDITIONING 0x10 |
1049 |
#define MLY_BBU_STATUS_DISCHARGING 0x20 |
1050 |
#define MLY_BBU_STATUS_FASTCHARGING 0x40 |
1051 |
u_int8_t res2; |
1052 |
} __packed; |
1053 |
|
1054 |
/*
|
1055 |
* 28.9 MDACIOCTL_RESETDEVICE
|
1056 |
* 28.10 MDACIOCTL_FLUSHDEVICEDATA
|
1057 |
* 28.11 MDACIOCTL_PAUSEDEVICE
|
1058 |
* 28.12 MDACIOCTL_UNPAUSEDEVICE
|
1059 |
*/
|
1060 |
struct mly_ioctl_param_deviceoperation {
|
1061 |
u_int8_t operation_device; /* see 14.3 */
|
1062 |
} __packed; |
1063 |
|
1064 |
/*
|
1065 |
* 31.1 Event Data Format
|
1066 |
*/
|
1067 |
struct mly_event {
|
1068 |
u_int32_t sequence_number; |
1069 |
u_int32_t timestamp; |
1070 |
u_int32_t code; |
1071 |
u_int8_t controller; |
1072 |
u_int8_t channel; |
1073 |
u_int8_t target; /* also enclosure */
|
1074 |
u_int8_t lun; /* also enclosure unit */
|
1075 |
u_int8_t res1[4];
|
1076 |
u_int32_t param; |
1077 |
u_int8_t sense[40];
|
1078 |
} __packed; |
1079 |
|
1080 |
/*
|
1081 |
* 31.2 MDACIOCTL_GETEVENT
|
1082 |
*/
|
1083 |
struct mly_ioctl_param_getevent {
|
1084 |
u_int16_t sequence_number_low; |
1085 |
u_int8_t res1[8];
|
1086 |
union mly_cmd_transfer transfer;
|
1087 |
} __packed; |
1088 |
|
1089 |
union mly_ioctl_param {
|
1090 |
struct mly_ioctl_param_data data;
|
1091 |
struct mly_ioctl_param_setmemorymailbox setmemorymailbox;
|
1092 |
struct mly_ioctl_param_setraiddevstate setraiddevstate;
|
1093 |
struct mly_ioctl_param_renameraiddev renameraiddev;
|
1094 |
struct mly_ioctl_param_xlatephysdevtoraiddev xlatephysdevtoraiddev;
|
1095 |
struct mly_ioctl_param_getgroupconfinfo getgroupconfinfo;
|
1096 |
struct mly_ioctl_param_subsystemdata subsystemdata;
|
1097 |
struct mly_ioctl_param_deviceoperation deviceoperation;
|
1098 |
struct mly_ioctl_param_getevent getevent;
|
1099 |
}; |
1100 |
|
1101 |
/*
|
1102 |
* 19 SCSI Command Format
|
1103 |
*/
|
1104 |
#define MLY_PHYADDR(c, b, t, l) \
|
1105 |
((l) | ((t) << 8) | ((b) << 16) | ((c) << 19)) |
1106 |
#define MLY_LOGADDR(c, u) \
|
1107 |
((u) | ((c) << 19))
|
1108 |
|
1109 |
#define MLY_LOGADDR_DEV(a) (a & 0xffff) |
1110 |
#define MLY_LOGADDR_CTLR(a) (a >> 19) |
1111 |
|
1112 |
#define MLY_PHYADDR_LUN(a) (a & 0xff) |
1113 |
#define MLY_PHYADDR_TARGET(a) ((a >> 8) & 0xff) |
1114 |
#define MLY_PHYADDR_CHANNEL(a) ((a >> 16) & 0x07) |
1115 |
#define MLY_PHYADDR_CTLR(a) ((a >> 19) & 0x1f) |
1116 |
|
1117 |
/*
|
1118 |
* struct mly_cmd_address_physical {
|
1119 |
* u_int8_t lun;
|
1120 |
* u_int8_t target;
|
1121 |
* u_int8_t channel:3;
|
1122 |
* u_int8_t controller:5;
|
1123 |
* } __packed;
|
1124 |
*
|
1125 |
* struct mly_cmd_address_logical {
|
1126 |
* u_int16_t logdev;
|
1127 |
* u_int8_t res1:3;
|
1128 |
* u_int8_t controller:5;
|
1129 |
* } __packed;
|
1130 |
*/
|
1131 |
|
1132 |
struct mly_cmd_generic {
|
1133 |
u_int16_t command_id; |
1134 |
u_int8_t opcode; |
1135 |
u_int8_t command_control; |
1136 |
u_int32_t data_size; |
1137 |
u_int64_t sense_buffer_address; |
1138 |
u_int8_t addr[3];
|
1139 |
u_int8_t timeout; |
1140 |
u_int8_t maximum_sense_size; |
1141 |
u_int8_t res1[11];
|
1142 |
union mly_cmd_transfer transfer;
|
1143 |
} __packed; |
1144 |
|
1145 |
|
1146 |
/*
|
1147 |
* 19.1 MDACMD_SCSI & MDACMD_SCSIPT
|
1148 |
*/
|
1149 |
#define MLY_CMD_SCSI_SMALL_CDB 10 |
1150 |
struct mly_cmd_scsi_small {
|
1151 |
u_int16_t command_id; |
1152 |
u_int8_t opcode; |
1153 |
u_int8_t command_control; |
1154 |
u_int32_t data_size; |
1155 |
u_int64_t sense_buffer_address; |
1156 |
u_int8_t addr[3];
|
1157 |
u_int8_t timeout; |
1158 |
u_int8_t maximum_sense_size; |
1159 |
u_int8_t cdb_length; |
1160 |
u_int8_t cdb[MLY_CMD_SCSI_SMALL_CDB]; |
1161 |
union mly_cmd_transfer transfer;
|
1162 |
} __packed; |
1163 |
|
1164 |
/*
|
1165 |
* 19.2 MDACMD_SCSILC & MDACMD_SCSILCPT
|
1166 |
*/
|
1167 |
struct mly_cmd_scsi_large {
|
1168 |
u_int16_t command_id; |
1169 |
u_int8_t opcode; |
1170 |
u_int8_t command_control; |
1171 |
u_int32_t data_size; |
1172 |
u_int64_t sense_buffer_address; |
1173 |
u_int8_t addr[3];
|
1174 |
u_int8_t timeout; |
1175 |
u_int8_t maximum_sense_size; |
1176 |
u_int8_t cdb_length; |
1177 |
u_int16_t res1; |
1178 |
u_int64_t cdb_physaddr; |
1179 |
union mly_cmd_transfer transfer;
|
1180 |
} __packed; |
1181 |
|
1182 |
/*
|
1183 |
* 20.1 IOCTL Command Format: Internal Bus
|
1184 |
*/
|
1185 |
struct mly_cmd_ioctl {
|
1186 |
u_int16_t command_id; |
1187 |
u_int8_t opcode; |
1188 |
u_int8_t command_control; |
1189 |
u_int32_t data_size; |
1190 |
u_int64_t sense_buffer_address; |
1191 |
u_int8_t addr[3];
|
1192 |
u_int8_t timeout; |
1193 |
u_int8_t maximum_sense_size; |
1194 |
u_int8_t sub_ioctl; |
1195 |
union mly_ioctl_param param;
|
1196 |
} __packed; |
1197 |
|
1198 |
/*
|
1199 |
* PG6: 8.2.2
|
1200 |
*/
|
1201 |
struct mly_cmd_mmbox {
|
1202 |
u_int32_t flag; |
1203 |
u_int8_t data[60];
|
1204 |
} __packed; |
1205 |
|
1206 |
union mly_cmd_packet {
|
1207 |
struct mly_cmd_generic generic;
|
1208 |
struct mly_cmd_scsi_small scsi_small;
|
1209 |
struct mly_cmd_scsi_large scsi_large;
|
1210 |
struct mly_cmd_ioctl ioctl;
|
1211 |
struct mly_cmd_mmbox mmbox;
|
1212 |
}; |
1213 |
|
1214 |
/*
|
1215 |
* PG6: 5.3
|
1216 |
*/
|
1217 |
#define MLY_I960RX_COMMAND_MAILBOX 0x10 |
1218 |
#define MLY_I960RX_STATUS_MAILBOX 0x18 |
1219 |
#define MLY_I960RX_IDBR 0x20 |
1220 |
#define MLY_I960RX_ODBR 0x2c |
1221 |
#define MLY_I960RX_ERROR_STATUS 0x2e |
1222 |
#define MLY_I960RX_INTERRUPT_STATUS 0x30 |
1223 |
#define MLY_I960RX_INTERRUPT_MASK 0x34 |
1224 |
|
1225 |
#define MLY_STRONGARM_COMMAND_MAILBOX 0x50 |
1226 |
#define MLY_STRONGARM_STATUS_MAILBOX 0x58 |
1227 |
#define MLY_STRONGARM_IDBR 0x60 |
1228 |
#define MLY_STRONGARM_ODBR 0x61 |
1229 |
#define MLY_STRONGARM_ERROR_STATUS 0x63 |
1230 |
#define MLY_STRONGARM_INTERRUPT_STATUS 0x30 |
1231 |
#define MLY_STRONGARM_INTERRUPT_MASK 0x34 |
1232 |
|
1233 |
/*
|
1234 |
* PG6: 5.4.3 Doorbell 0
|
1235 |
*/
|
1236 |
#define MLY_HM_CMDSENT (1<<0) |
1237 |
#define MLY_HM_STSACK (1<<1) |
1238 |
#define MLY_SOFT_RST (1<<3) |
1239 |
#define MLY_AM_CMDSENT (1<<4) |
1240 |
|
1241 |
/*
|
1242 |
* PG6: 5.4.4 Doorbell 1
|
1243 |
*
|
1244 |
* Note that the documentation claims that these bits are set when the
|
1245 |
* status queue(s) are empty, wheras the Linux driver and experience
|
1246 |
* suggest they are set when there is status available.
|
1247 |
*/
|
1248 |
#define MLY_HM_STSREADY (1<<0) |
1249 |
#define MLY_AM_STSREADY (1<<1) |
1250 |
|
1251 |
/*
|
1252 |
* PG6: 5.4.6 Doorbell 3
|
1253 |
*/
|
1254 |
#define MLY_MSG_EMPTY (1<<3) |
1255 |
#define MLY_MSG_SPINUP 0x08 |
1256 |
#define MLY_MSG_RACE_RECOVERY_FAIL 0x60 |
1257 |
#define MLY_MSG_RACE_IN_PROGRESS 0x70 |
1258 |
#define MLY_MSG_RACE_ON_CRITICAL 0xb0 |
1259 |
#define MLY_MSG_PARITY_ERROR 0xf0 |
1260 |
|
1261 |
/*
|
1262 |
* PG6: 5.4.8 Outbound Interrupt Mask
|
1263 |
*/
|
1264 |
#define MLY_INTERRUPT_MASK_DISABLE 0xff |
1265 |
#define MLY_INTERRUPT_MASK_ENABLE (0xff & ~(1<<2)) |
1266 |
|
1267 |
/*
|
1268 |
* PG6: 8.2 Advanced Mailbox Scheme
|
1269 |
*
|
1270 |
* Note that this must be allocated on a 4k boundary, and all internal
|
1271 |
* fields must also reside on a 4k boundary.
|
1272 |
* We could dynamically size this structure, but the extra effort
|
1273 |
* is probably unjustified. Note that these buffers do not need to be
|
1274 |
* adjacent - we just group them to simplify allocation of the bus-visible
|
1275 |
* buffer.
|
1276 |
*
|
1277 |
* XXX Note that for some reason, if MLY_MMBOX_COMMANDS is > 64, the controller
|
1278 |
* fails to respond to the command at (MLY_MMBOX_COMMANDS - 64). It's not
|
1279 |
* wrapping to 0 at this point (determined by experimentation). This is not
|
1280 |
* consistent with the Linux driver's implementation.
|
1281 |
* Whilst it's handy to have lots of room for status returns in case we end up
|
1282 |
* being slow getting back to completed commands, it seems unlikely that we
|
1283 |
* would get 64 commands ahead of the controller on the submissions side, so
|
1284 |
* the current workaround is to simply limit the command ring to 64 entries.
|
1285 |
*/
|
1286 |
union mly_status_packet {
|
1287 |
struct mly_status status;
|
1288 |
struct {
|
1289 |
u_int32_t flag; |
1290 |
u_int8_t data[4];
|
1291 |
} __packed mmbox; |
1292 |
}; |
1293 |
union mly_health_region {
|
1294 |
struct mly_health_status status;
|
1295 |
u_int8_t pad[1024];
|
1296 |
}; |
1297 |
|
1298 |
#define MLY_MMBOX_COMMANDS 64 |
1299 |
#define MLY_MMBOX_STATUS 512 |
1300 |
struct mly_mmbox {
|
1301 |
union mly_cmd_packet mmm_command[MLY_MMBOX_COMMANDS];
|
1302 |
union mly_status_packet mmm_status[MLY_MMBOX_STATUS];
|
1303 |
union mly_health_region mmm_health;
|
1304 |
} __packed; |
1305 |
|
1306 |
#endif /* !defined _PCI_MLYREG_H_ */ |