1 /* $NetBSD: mlyreg.h,v 1.5 2008/09/08 23:36:54 gmcgarry Exp $ */
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andrew Doran, Thor Lancelot Simon, and Eric Haszlakiewicz.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
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.
33 * Copyright (c) 2000 Michael Smith
34 * Copyright (c) 2000 BSDi
35 * All rights reserved.
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
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.
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
58 * from FreeBSD: mlyreg.h,v 1.1 2000/08/23 03:22:39 msmith Exp
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.
65 * Reference is made to the Mylex "Programming Guide for 6.x Controllers" document
66 * ('PG6'), document #771242 revision 0.02, 04/11/00
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.
72 * Ordering of items in this file is a little odd due to the constraints of
73 * nested declarations.
76 #ifndef _PCI_MLYREG_H_
77 #define _PCI_MLYREG_H_
80 * 2.1 (Scatter Gather List Format)
88 * 5.2 System Device Access
90 * This is corroborated by the layout of the MDACIOCTL_GETCONTROLLERINFO data
93 #define MLY_MAX_CHANNELS 6
94 #define MLY_MAX_TARGETS 16
95 #define MLY_MAX_LUNS 1
98 * 8.1 Different Device States
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) */
109 * 8.2 Device Type Field definitions
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 */
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
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
156 * 8.5 Read/Write control
158 #define MLY_RWCtl_INITTED (1<<7) /* if set, the logical device is initialised */
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 */
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 */
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 */
180 u_int8_t lun
; /* LUN */
181 u_int8_t tid
; /* TID */
182 u_int8_t hid
[32]; /* HID (one bit for each host) */
186 * 10.1 Controller Parameters
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 */
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 */
208 u_int8_t res2
[2]; /* N/A */
211 u_int8_t safte
:1; /* N/A */
212 u_int8_t ses
:1; /* N/A */
213 u_int8_t res3
:2; /* N/A */
216 u_int8_t res4
:1; /* N/A */
218 u_int8_t rebuild_check_rate
;
219 u_int8_t cache_line_size
; /* see 8.4 */
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
;
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 */
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 */
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 */
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 */
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 */
264 u_int8_t ms_autorest
:1; /* N/A */
265 u_int8_t res12
:7; /* N/A */
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 */
273 u_int8_t ms_flg_simplex_no_rstcom
:1; /* N/A */
274 u_int8_t res13
:7; /* N/A */
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
292 * 10.2 Physical Device Parameters
294 struct mly_param_physical_device
{
304 * 10.3 Logical Device Parameters
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
;
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 */
318 * 12.3 Health Status Buffer
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 */
338 * 14.2 Timeout Bit Format
340 #define MLY_TIMEOUT_SECONDS 0x00
341 #define MLY_TIMEOUT_MINUTES 0x40
342 #define MLY_TIMEOUT_HOURS 0x80
345 * 14.3 Operation Device
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
356 * 14.4 Status Bit Format
358 * AKA Status Mailbox Format
360 * XXX format conflict between FSI and PG6 over the ordering of the
361 * status and sense length fields.
364 u_int16_t command_id
;
366 u_int8_t sense_length
;
371 * 14.5 Command Control Bit (CCB) format
373 * This byte is unfortunately named.
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
385 * We use the command names as given by Mylex
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) */
398 * We use the IOCTL names as given by Mylex
399 * Note that only ioctls supported by the PCI controller family are listed
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
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
459 * 17.1.4 Data Transfer Memory Address Without SG List
461 struct mly_short_transfer
{
462 struct mly_sg_entry sg
[2];
466 * 17.1.5 Data Transfer Memory Address With SG List
468 * Note that only the first s/g table is currently used.
470 struct mly_sg_transfer
{
471 u_int16_t entries
[3];
473 u_int64_t table_physaddr
[3];
477 * 17.1.3 Data Transfer Memory Address Format
479 union mly_cmd_transfer
{
480 struct mly_short_transfer direct
;
481 struct mly_sg_transfer indirect
;
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
506 * These commands just transfer data
508 struct mly_ioctl_param_data
{
510 union mly_cmd_transfer transfer
;
514 * 21.2 MDACIOCTL_SETMEMORYMAILBOX
516 struct mly_ioctl_param_setmemorymailbox
{
517 u_int8_t health_buffer_size
;
519 u_int64_t health_buffer_physaddr
;
520 u_int64_t command_mailbox_physaddr
;
521 u_int64_t status_mailbox_physaddr
;
526 * 21.8.2 MDACIOCTL_GETCONTROLLERINFO: Data Format
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 */
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
;
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 */
634 u_int8_t res1
[12]; /* N/A */
635 char name
[16]; /* N/A */
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
;
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
;
688 u_int8_t consistency_check_rate
;
689 u_int8_t res25
[4]; /* N/A */
690 u_int32_t maximum_dp
;
692 u_int32_t maximum_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 */
704 * 21.9.2 MDACIOCTL_GETLOGDEVINFOVALID
706 struct mly_ioctl_getlogdevinfovalid
{
707 u_int8_t res1
; /* N/A */
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;
718 u_int8_t make_consistent
:1;
719 u_int8_t initialisation
:1;
720 u_int8_t migration
:1;
722 u_int8_t res2
:2; /* N/A */
725 u_int16_t logical_device_number
;
726 u_int16_t bios_control
;
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 */
754 * 21.10.2 MDACIOCTL_GETPHYSDEVINFOVALID: Data Format
756 struct mly_ioctl_getphysdevinfovalid
{
761 u_int8_t raid_ft
:1; /* configuration status */
762 u_int8_t res2
:1; /* N/A */
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 */
771 /* multiported physical device information */
772 u_int8_t ports_available
; /* N/A */
773 u_int8_t ports_inuse
; /* N/A */
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 */
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 */
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? */
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 */
814 struct mly_ioctl_getlogdevinfovalid logdev
;
815 struct mly_ioctl_getphysdevinfovalid physdev
;
819 * 21.11.2 MDACIOCTL_GETPHYSDEVSTATISTICS: Data Format
820 * 21.12.2 MDACIOCTL_GETLOGDEVSTATISTICS: Data Format
822 struct mly_ioctl_getdevstatistics
{
823 u_int32_t uptime_ms
; /* getphysedevstatistics only */
824 u_int8_t res1
[5]; /* N/A */
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 */
848 * 21.13.2 MDACIOCTL_GETCONTROLLERSTATISTICS: Data Format
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 */
890 * 21.2 MDACIOCTL_SETRAIDDEVSTATE
892 struct mly_ioctl_param_setraiddevstate
{
897 * 21.27.2 MDACIOCTL_GETBDT_FOR_SYSDRIVE: Data Format
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
];
906 * 22.1 Physical Device Definition (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? */
917 u_int32_t start_address
;
921 * 22.2 RAID Device Use Definition (UDD)
925 u_int8_t state
; /* see 8.1 */
926 u_int16_t raid_device
;
927 u_int32_t start_address
;
931 * RAID Device Definition (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! */
947 * Define a datastructure giving the smallest allocation that will hold
948 * a PDD, UDD or LDD for MDACIOCTL_GETDEVCONFINFO.
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
;
956 union mly_ioctl_devconfinfo
{
960 struct mly_devconf_hdr hdr
;
964 * 22.3 MDACIOCTL_RENAMERAIDDEV
966 * XXX this command is listed as transferring data, but does not define the data.
968 struct mly_ioctl_param_renameraiddev
{
969 u_int8_t new_raid_device
;
973 * 23.6.2 MDACIOCTL_XLATEPHYSDEVTORAIDDEV
975 * XXX documentation suggests this format will change
977 struct mly_ioctl_param_xlatephysdevtoraiddev
{
978 u_int16_t raid_device
;
987 * 23.7 MDACIOCTL_GETGROUPCONFINFO
989 struct mly_ioctl_param_getgroupconfinfo
{
992 union mly_cmd_transfer transfer
;
996 * 23.9.2 MDACIOCTL_GETFREESPACELIST: Data Format
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.
1001 struct mly_ioctl_getfreespacelist_entry
{
1002 u_int16_t raid_device
;
1004 u_int32_t address
; /* XXX "blocks or MB" Huh? */
1005 u_int32_t size
; /* XXX "blocks or MB" Huh? */
1008 struct mly_ioctl_getfrespacelist
{
1009 u_int16_t returned_entries
;
1010 u_int16_t total_entries
;
1012 struct mly_ioctl_getfreespacelist_entry space
[]; /* expand to suit */
1016 * 27.1 MDACIOCTL_GETSUBSYSTEMDATA
1017 * 27.2 MDACIOCTL_SETSUBSYSTEMDATA
1019 * PCI controller only supports a limited subset of the possible operations.
1021 * XXX where does the status end up? (the command transfers no data)
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 */
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
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
1055 * 28.9 MDACIOCTL_RESETDEVICE
1056 * 28.10 MDACIOCTL_FLUSHDEVICEDATA
1057 * 28.11 MDACIOCTL_PAUSEDEVICE
1058 * 28.12 MDACIOCTL_UNPAUSEDEVICE
1060 struct mly_ioctl_param_deviceoperation
{
1061 u_int8_t operation_device
; /* see 14.3 */
1065 * 31.1 Event Data Format
1068 u_int32_t sequence_number
;
1069 u_int32_t timestamp
;
1071 u_int8_t controller
;
1073 u_int8_t target
; /* also enclosure */
1074 u_int8_t lun
; /* also enclosure unit */
1081 * 31.2 MDACIOCTL_GETEVENT
1083 struct mly_ioctl_param_getevent
{
1084 u_int16_t sequence_number_low
;
1086 union mly_cmd_transfer transfer
;
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
;
1102 * 19 SCSI Command Format
1104 #define MLY_PHYADDR(c, b, t, l) \
1105 ((l) | ((t) << 8) | ((b) << 16) | ((c) << 19))
1106 #define MLY_LOGADDR(c, u) \
1109 #define MLY_LOGADDR_DEV(a) (a & 0xffff)
1110 #define MLY_LOGADDR_CTLR(a) (a >> 19)
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)
1118 * struct mly_cmd_address_physical {
1121 * u_int8_t channel:3;
1122 * u_int8_t controller:5;
1125 * struct mly_cmd_address_logical {
1128 * u_int8_t controller:5;
1132 struct mly_cmd_generic
{
1133 u_int16_t command_id
;
1135 u_int8_t command_control
;
1136 u_int32_t data_size
;
1137 u_int64_t sense_buffer_address
;
1140 u_int8_t maximum_sense_size
;
1142 union mly_cmd_transfer transfer
;
1147 * 19.1 MDACMD_SCSI & MDACMD_SCSIPT
1149 #define MLY_CMD_SCSI_SMALL_CDB 10
1150 struct mly_cmd_scsi_small
{
1151 u_int16_t command_id
;
1153 u_int8_t command_control
;
1154 u_int32_t data_size
;
1155 u_int64_t sense_buffer_address
;
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
;
1165 * 19.2 MDACMD_SCSILC & MDACMD_SCSILCPT
1167 struct mly_cmd_scsi_large
{
1168 u_int16_t command_id
;
1170 u_int8_t command_control
;
1171 u_int32_t data_size
;
1172 u_int64_t sense_buffer_address
;
1175 u_int8_t maximum_sense_size
;
1176 u_int8_t cdb_length
;
1178 u_int64_t cdb_physaddr
;
1179 union mly_cmd_transfer transfer
;
1183 * 20.1 IOCTL Command Format: Internal Bus
1185 struct mly_cmd_ioctl
{
1186 u_int16_t command_id
;
1188 u_int8_t command_control
;
1189 u_int32_t data_size
;
1190 u_int64_t sense_buffer_address
;
1193 u_int8_t maximum_sense_size
;
1195 union mly_ioctl_param param
;
1201 struct mly_cmd_mmbox
{
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
;
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
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
1234 * PG6: 5.4.3 Doorbell 0
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)
1242 * PG6: 5.4.4 Doorbell 1
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.
1248 #define MLY_HM_STSREADY (1<<0)
1249 #define MLY_AM_STSREADY (1<<1)
1252 * PG6: 5.4.6 Doorbell 3
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
1262 * PG6: 5.4.8 Outbound Interrupt Mask
1264 #define MLY_INTERRUPT_MASK_DISABLE 0xff
1265 #define MLY_INTERRUPT_MASK_ENABLE (0xff & ~(1<<2))
1268 * PG6: 8.2 Advanced Mailbox Scheme
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
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.
1286 union mly_status_packet
{
1287 struct mly_status status
;
1293 union mly_health_region
{
1294 struct mly_health_status status
;
1298 #define MLY_MMBOX_COMMANDS 64
1299 #define MLY_MMBOX_STATUS 512
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
;
1306 #endif /* !defined _PCI_MLYREG_H_ */