xref: /dflybsd-src/sys/dev/raid/mly/mlyreg.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*-
286d7f5d3SJohn Marino  * Copyright (c) 2000 Michael Smith
386d7f5d3SJohn Marino  * Copyright (c) 2000 BSDi
486d7f5d3SJohn Marino  * All rights reserved.
586d7f5d3SJohn Marino  *
686d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
786d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
886d7f5d3SJohn Marino  * are met:
986d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
1086d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
1186d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
1286d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
1386d7f5d3SJohn Marino  *    documentation and/or other materials provided with the distribution.
1486d7f5d3SJohn Marino  *
1586d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1686d7f5d3SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1786d7f5d3SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1886d7f5d3SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1986d7f5d3SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2086d7f5d3SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2186d7f5d3SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2286d7f5d3SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2386d7f5d3SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2486d7f5d3SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2586d7f5d3SJohn Marino  * SUCH DAMAGE.
2686d7f5d3SJohn Marino  *
2786d7f5d3SJohn Marino  *	$FreeBSD: src/sys/dev/mly/mlyreg.h,v 1.2 2002/09/23 18:54:30 alfred Exp $
2886d7f5d3SJohn Marino  */
2986d7f5d3SJohn Marino 
3086d7f5d3SJohn Marino /*
3186d7f5d3SJohn Marino  * Section numbers in this document refer to the Mylex "Firmware Software Interface"
3286d7f5d3SJohn Marino  * document ('FSI'), revision 0.11 04/11/00 unless otherwise qualified.
3386d7f5d3SJohn Marino  *
3486d7f5d3SJohn Marino  * Reference is made to the Mylex "Programming Guide for 6.x Controllers" document
3586d7f5d3SJohn Marino  * ('PG6'), document #771242 revision 0.02, 04/11/00
3686d7f5d3SJohn Marino  *
3786d7f5d3SJohn Marino  * Note that fields marked N/A are not supported by the PCI controllers, but are
3886d7f5d3SJohn Marino  * defined here to hold place in datastructures that are shared with the SCSI
3986d7f5d3SJohn Marino  * controllers.  Items not relevant to PCI controllers are not described here.
4086d7f5d3SJohn Marino  *
4186d7f5d3SJohn Marino  * Ordering of items in this file is a little odd due to the constraints of
4286d7f5d3SJohn Marino  * nested declarations.
4386d7f5d3SJohn Marino  */
4486d7f5d3SJohn Marino 
4586d7f5d3SJohn Marino /*
4686d7f5d3SJohn Marino  * 2.1 (Scatter Gather List Format)
4786d7f5d3SJohn Marino  */
4886d7f5d3SJohn Marino struct mly_sg_entry {
4986d7f5d3SJohn Marino     u_int64_t	physaddr;
5086d7f5d3SJohn Marino     u_int64_t	length;
5186d7f5d3SJohn Marino } __packed;
5286d7f5d3SJohn Marino 
5386d7f5d3SJohn Marino /*
5486d7f5d3SJohn Marino  * 5.2 System Device Access
5586d7f5d3SJohn Marino  *
5686d7f5d3SJohn Marino  * This is corroborated by the layout of the MDACIOCTL_GETCONTROLLERINFO data
5786d7f5d3SJohn Marino  * in 21.8
5886d7f5d3SJohn Marino  */
5986d7f5d3SJohn Marino #define MLY_MAX_CHANNELS	6
6086d7f5d3SJohn Marino #define MLY_MAX_TARGETS		16
6186d7f5d3SJohn Marino #define MLY_MAX_LUNS		1
6286d7f5d3SJohn Marino 
6386d7f5d3SJohn Marino /*
6486d7f5d3SJohn Marino  * 8.1 Different Device States
6586d7f5d3SJohn Marino  */
6686d7f5d3SJohn Marino #define MLY_DEVICE_STATE_OFFLINE	0x08	/* DEAD/OFFLINE */
6786d7f5d3SJohn Marino #define MLY_DEVICE_STATE_UNCONFIGURED	0x00
6886d7f5d3SJohn Marino #define MLY_DEVICE_STATE_ONLINE		0x01
6986d7f5d3SJohn Marino #define MLY_DEVICE_STATE_CRITICAL	0x09
7086d7f5d3SJohn Marino #define MLY_DEVICE_STATE_WRITEONLY	0x03
7186d7f5d3SJohn Marino #define MLY_DEVICE_STATE_STANDBY	0x21
7286d7f5d3SJohn Marino #define MLY_DEVICE_STATE_MISSING	0x04	/* or-ed with (ONLINE or WRITEONLY or STANDBY) */
7386d7f5d3SJohn Marino 
7486d7f5d3SJohn Marino /*
7586d7f5d3SJohn Marino  * 8.2 Device Type Field definitions
7686d7f5d3SJohn Marino  */
7786d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID0		0x0	/* RAID 0 */
7886d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID1		0x1	/* RAID 1 */
7986d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID3		0x3	/* RAID 3 right asymmetric parity */
8086d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID5		0x5	/* RAID 5 right asymmetric parity */
8186d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID6		0x6	/* RAID 6 (Mylex RAID 6) */
8286d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID7		0x7	/* RAID 7 (JBOD) */
8386d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_NEWSPAN		0x8	/* New Mylex SPAN */
8486d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID3F		0x9	/* RAID 3 fixed parity */
8586d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID3L		0xb	/* RAID 3 left symmetric parity */
8686d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_SPAN		0xc	/* current spanning implementation */
8786d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID5L		0xd	/* RAID 5 left symmetric parity */
8886d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAIDE		0xe	/* RAID E (concatenation) */
8986d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_PHYSICAL	0xf	/* physical device */
9086d7f5d3SJohn Marino 
9186d7f5d3SJohn Marino /*
9286d7f5d3SJohn Marino  * 8.3 Stripe Size
9386d7f5d3SJohn Marino  */
9486d7f5d3SJohn Marino #define MLY_STRIPE_ZERO		0x0	/* no stripe (RAID 1, RAID 7, etc) */
9586d7f5d3SJohn Marino #define MLY_STRIPE_512b		0x1
9686d7f5d3SJohn Marino #define MLY_STRIPE_1k		0x2
9786d7f5d3SJohn Marino #define MLY_STRIPE_2k		0x3
9886d7f5d3SJohn Marino #define MLY_STRIPE_4k		0x4
9986d7f5d3SJohn Marino #define MLY_STRIPE_8k		0x5
10086d7f5d3SJohn Marino #define MLY_STRIPE_16k		0x6
10186d7f5d3SJohn Marino #define MLY_STRIPE_32k		0x7
10286d7f5d3SJohn Marino #define MLY_STRIPE_64k		0x8
10386d7f5d3SJohn Marino #define MLY_STRIPE_128k		0x9
10486d7f5d3SJohn Marino #define MLY_STRIPE_256k		0xa
10586d7f5d3SJohn Marino #define MLY_STRIPE_512k		0xb
10686d7f5d3SJohn Marino #define MLY_STRIPE_1m		0xc
10786d7f5d3SJohn Marino 
10886d7f5d3SJohn Marino /*
10986d7f5d3SJohn Marino  * 8.4 Cacheline Size
11086d7f5d3SJohn Marino  */
11186d7f5d3SJohn Marino #define MLY_CACHELINE_ZERO	0x0	/* caching cannot be enabled */
11286d7f5d3SJohn Marino #define MLY_CACHELINE_512b	0x1
11386d7f5d3SJohn Marino #define MLY_CACHELINE_1k	0x2
11486d7f5d3SJohn Marino #define MLY_CACHELINE_2k	0x3
11586d7f5d3SJohn Marino #define MLY_CACHELINE_4k	0x4
11686d7f5d3SJohn Marino #define MLY_CACHELINE_8k	0x5
11786d7f5d3SJohn Marino #define MLY_CACHELINE_16k	0x6
11886d7f5d3SJohn Marino #define MLY_CACHELINE_32k	0x7
11986d7f5d3SJohn Marino #define MLY_CACHELINE_64k	0x8
12086d7f5d3SJohn Marino 
12186d7f5d3SJohn Marino /*
12286d7f5d3SJohn Marino  * 8.5 Read/Write control
12386d7f5d3SJohn Marino  */
12486d7f5d3SJohn Marino #define MLY_RWCtl_INITTED	(1<<7)	/* if set, the logical device is initialised */
12586d7f5d3SJohn Marino 			/* write control */
12686d7f5d3SJohn Marino #define MLY_RWCtl_WCD		(0)	/* write cache disabled */
12786d7f5d3SJohn Marino #define MLY_RWCtl_WDISABLE	(1<<3)	/* writing disabled */
12886d7f5d3SJohn Marino #define MLY_RWCtl_WCE		(2<<3)	/* write cache enabled */
12986d7f5d3SJohn Marino #define MLY_RWCtl_IWCE		(3<<3)	/* intelligent write cache enabled */
13086d7f5d3SJohn Marino 			/* read control */
13186d7f5d3SJohn Marino #define MLY_RWCtl_RCD		(0)	/* read cache is disabled */
13286d7f5d3SJohn Marino #define MLY_RWCtl_RCE		(1)	/* read cache enabled */
13386d7f5d3SJohn Marino #define MLY_RWCtl_RAHEAD	(2)	/* readahead enabled */
13486d7f5d3SJohn Marino #define MLY_RWCtl_IRAHEAD	(3)	/* intelligent readahead enabled */
13586d7f5d3SJohn Marino 
13686d7f5d3SJohn Marino /*
13786d7f5d3SJohn Marino  * 9.0 LUN Map Format
13886d7f5d3SJohn Marino  */
13986d7f5d3SJohn Marino struct mly_lun_map {
14086d7f5d3SJohn Marino     u_int8_t	res1:4;
14186d7f5d3SJohn Marino     u_int8_t	host_port_mapped:1;	/* this system drive visibile to host on this controller/port combination */
14286d7f5d3SJohn Marino     u_int8_t	tid_valid:1;		/* target ID valid */
14386d7f5d3SJohn Marino     u_int8_t	hid_valid:1;		/* host ID valid */
14486d7f5d3SJohn Marino     u_int8_t	lun_valid:1;		/* LUN valid */
14586d7f5d3SJohn Marino     u_int8_t	res2;
14686d7f5d3SJohn Marino     u_int8_t	lun;			/* LUN */
14786d7f5d3SJohn Marino     u_int8_t	tid;			/* TID */
14886d7f5d3SJohn Marino     u_int8_t	hid[32];		/* HID (one bit for each host) */
14986d7f5d3SJohn Marino } __packed;
15086d7f5d3SJohn Marino 
15186d7f5d3SJohn Marino /*
15286d7f5d3SJohn Marino  * 10.1 Controller Parameters
15386d7f5d3SJohn Marino  */
15486d7f5d3SJohn Marino struct mly_param_controller {
15586d7f5d3SJohn Marino     u_int8_t	rdahen:1;					/* N/A */
15686d7f5d3SJohn Marino     u_int8_t	bilodly:1;					/* N/A */
15786d7f5d3SJohn Marino     u_int8_t   	fua_disable:1;
15886d7f5d3SJohn Marino     u_int8_t	reass1s:1;					/* N/A */
15986d7f5d3SJohn Marino     u_int8_t	truvrfy:1;					/* N/A */
16086d7f5d3SJohn Marino     u_int8_t	dwtvrfy:1;					/* N/A */
16186d7f5d3SJohn Marino     u_int8_t	background_initialisation:1;
16286d7f5d3SJohn Marino     u_int8_t	clustering:1;					/* N/A */
16386d7f5d3SJohn Marino 
16486d7f5d3SJohn Marino     u_int8_t	bios_disable:1;
16586d7f5d3SJohn Marino     u_int8_t   	boot_from_cdrom:1;
16686d7f5d3SJohn Marino     u_int8_t	drive_coercion:1;
16786d7f5d3SJohn Marino     u_int8_t	write_same_disable:1;
16886d7f5d3SJohn Marino     u_int8_t	hba_mode:1;					/* N/A */
16986d7f5d3SJohn Marino     u_int8_t	bios_geometry:2;
17086d7f5d3SJohn Marino #define MLY_BIOSGEOM_2G	0x0
17186d7f5d3SJohn Marino #define MLY_BIOSGEOM_8G	0x1
17286d7f5d3SJohn Marino     u_int8_t	res1:1;						/* N/A */
17386d7f5d3SJohn Marino 
17486d7f5d3SJohn Marino     u_int8_t	res2[2];					/* N/A */
17586d7f5d3SJohn Marino 
17686d7f5d3SJohn Marino     u_int8_t	v_dec:1;
17786d7f5d3SJohn Marino     u_int8_t	safte:1;					/* N/A */
17886d7f5d3SJohn Marino     u_int8_t	ses:1;						/* N/A */
17986d7f5d3SJohn Marino     u_int8_t	res3:2;						/* N/A */
18086d7f5d3SJohn Marino     u_int8_t	v_arm:1;
18186d7f5d3SJohn Marino     u_int8_t	v_ofm:1;
18286d7f5d3SJohn Marino     u_int8_t	res4:1;						/* N/A */
18386d7f5d3SJohn Marino 
18486d7f5d3SJohn Marino     u_int8_t	rebuild_check_rate;
18586d7f5d3SJohn Marino     u_int8_t	cache_line_size;	/* see 8.4 */
18686d7f5d3SJohn Marino     u_int8_t	oem_code;
18786d7f5d3SJohn Marino #define MLY_OEM_MYLEX	0x00
18886d7f5d3SJohn Marino #define MLY_OEM_IBM	0x08
18986d7f5d3SJohn Marino #define MLY_OEM_HP	0x0a
19086d7f5d3SJohn Marino #define MLY_OEM_DEC	0x0c
19186d7f5d3SJohn Marino #define MLY_OEM_SIEMENS	0x10
19286d7f5d3SJohn Marino #define MLY_OEM_INTEL	0x12
19386d7f5d3SJohn Marino     u_int8_t	spinup_mode;
19486d7f5d3SJohn Marino #define MLY_SPIN_AUTO		0
19586d7f5d3SJohn Marino #define MLY_SPIN_PWRSPIN	1
19686d7f5d3SJohn Marino #define MLY_SPIN_WSSUSPIN	2
19786d7f5d3SJohn Marino     u_int8_t	spinup_devices;
19886d7f5d3SJohn Marino     u_int8_t	spinup_interval;
19986d7f5d3SJohn Marino     u_int8_t	spinup_wait_time;
20086d7f5d3SJohn Marino 
20186d7f5d3SJohn Marino     u_int8_t	res5:3;						/* N/A */
20286d7f5d3SJohn Marino     u_int8_t	vutursns:1;					/* N/A */
20386d7f5d3SJohn Marino     u_int8_t	dccfil:1;					/* N/A */
20486d7f5d3SJohn Marino     u_int8_t	nopause:1;					/* N/A */
20586d7f5d3SJohn Marino     u_int8_t	disqfull:1;					/* N/A */
20686d7f5d3SJohn Marino     u_int8_t	disbusy:1;					/* N/A */
20786d7f5d3SJohn Marino 
20886d7f5d3SJohn Marino     u_int8_t	res6:2;						/* N/A */
20986d7f5d3SJohn Marino     u_int8_t	failover_node_name;				/* N/A */
21086d7f5d3SJohn Marino     u_int8_t	res7:1;						/* N/A */
21186d7f5d3SJohn Marino     u_int8_t	ftopo:3;					/* N/A */
21286d7f5d3SJohn Marino     u_int8_t	disable_ups:1;					/* N/A */
21386d7f5d3SJohn Marino 
21486d7f5d3SJohn Marino     u_int8_t	res8:1;						/* N/A */
21586d7f5d3SJohn Marino     u_int8_t	propagate_reset:1;				/* N/A */
21686d7f5d3SJohn Marino     u_int8_t	nonstd_mp_reset:1;				/* N/A */
21786d7f5d3SJohn Marino     u_int8_t	res9:5;						/* N/A */
21886d7f5d3SJohn Marino 
21986d7f5d3SJohn Marino     u_int8_t	res10;						/* N/A */
22086d7f5d3SJohn Marino     u_int8_t	serial_port_baud_rate;				/* N/A */
22186d7f5d3SJohn Marino     u_int8_t	serial_port_control;				/* N/A */
22286d7f5d3SJohn Marino     u_int8_t	change_stripe_ok_developer_flag_only;		/* N/A */
22386d7f5d3SJohn Marino 
22486d7f5d3SJohn Marino     u_int8_t	small_large_host_transfers:2;			/* N/A */
22586d7f5d3SJohn Marino     u_int8_t	frame_control:2;				/* N/A */
22686d7f5d3SJohn Marino     u_int8_t	pci_latency_control:2;				/* N/A */
22786d7f5d3SJohn Marino     u_int8_t	treat_lip_as_reset:1;				/* N/A */
22886d7f5d3SJohn Marino     u_int8_t	res11:1;					/* N/A */
22986d7f5d3SJohn Marino 
23086d7f5d3SJohn Marino     u_int8_t	ms_autorest:1;					/* N/A */
23186d7f5d3SJohn Marino     u_int8_t	res12:7;					/* N/A */
23286d7f5d3SJohn Marino 
23386d7f5d3SJohn Marino     u_int8_t	ms_aa_fsim:1;					/* N/A */
23486d7f5d3SJohn Marino     u_int8_t	ms_aa_ccach:1;					/* N/A */
23586d7f5d3SJohn Marino     u_int8_t	ms_aa_fault_signals:1;				/* N/A */
23686d7f5d3SJohn Marino     u_int8_t	ms_aa_c4_faults:1;				/* N/A */
23786d7f5d3SJohn Marino     u_int8_t	ms_aa_host_reset_delay_mask:4;			/* N/A */
23886d7f5d3SJohn Marino 
23986d7f5d3SJohn Marino     u_int8_t	ms_flg_simplex_no_rstcom:1;			/* N/A */
24086d7f5d3SJohn Marino     u_int8_t	res13:7;					/* N/A */
24186d7f5d3SJohn Marino 
24286d7f5d3SJohn Marino     u_int8_t	res14;						/* N/A */
24386d7f5d3SJohn Marino     u_int8_t	hardloopid[2][2];				/* N/A */
24486d7f5d3SJohn Marino     u_int8_t	ctrlname[2][16+1];				/* N/A */
24586d7f5d3SJohn Marino     u_int8_t	initiator_id;
24686d7f5d3SJohn Marino     u_int8_t	startup_option;
24786d7f5d3SJohn Marino #define MLY_STARTUP_IF_NO_CHANGE	0x0
24886d7f5d3SJohn Marino #define MLY_STARTUP_IF_NO_LUN_CHANGE	0x1
24986d7f5d3SJohn Marino #define MLY_STARTUP_IF_NO_LUN_OFFLINE	0x2
25086d7f5d3SJohn Marino #define MLY_STARTUP_IF_LUN0_NO_CHANGE	0x3
25186d7f5d3SJohn Marino #define MLY_STARTUP_IF_LUN0_NOT_OFFLINE	0x4
25286d7f5d3SJohn Marino #define MLY_STARTUP_ALWAYS		0x5
25386d7f5d3SJohn Marino 
25486d7f5d3SJohn Marino     u_int8_t	res15[62];
25586d7f5d3SJohn Marino } __packed;
25686d7f5d3SJohn Marino 
25786d7f5d3SJohn Marino /*
25886d7f5d3SJohn Marino  * 10.2 Physical Device Parameters
25986d7f5d3SJohn Marino  */
26086d7f5d3SJohn Marino struct mly_param_physical_device {
26186d7f5d3SJohn Marino     u_int16_t	tags;
26286d7f5d3SJohn Marino     u_int16_t	speed;
26386d7f5d3SJohn Marino     u_int8_t	width;
26486d7f5d3SJohn Marino     u_int8_t	combing:1;
26586d7f5d3SJohn Marino     u_int8_t	res1:7;
26686d7f5d3SJohn Marino     u_int8_t	res2[3];
26786d7f5d3SJohn Marino } __packed;
26886d7f5d3SJohn Marino 
26986d7f5d3SJohn Marino /*
27086d7f5d3SJohn Marino  * 10.3 Logical Device Parameters
27186d7f5d3SJohn Marino  */
27286d7f5d3SJohn Marino struct mly_param_logical_device {
27386d7f5d3SJohn Marino     u_int8_t	type;			/* see 8.2 */
27486d7f5d3SJohn Marino     u_int8_t	state;			/* see 8.1 */
27586d7f5d3SJohn Marino     u_int16_t	raid_device;
27686d7f5d3SJohn Marino     u_int8_t	res1;
27786d7f5d3SJohn Marino     u_int8_t	bios_geometry;		/* BIOS control word? */
27886d7f5d3SJohn Marino     u_int8_t	stripe_size;		/* see 8.3 */
27986d7f5d3SJohn Marino     u_int8_t	read_write_control;	/* see 8.5 */
28086d7f5d3SJohn Marino     u_int8_t	res2[8];
28186d7f5d3SJohn Marino } __packed;
28286d7f5d3SJohn Marino 
28386d7f5d3SJohn Marino /*
28486d7f5d3SJohn Marino  * 12.3 Health Status Buffer
28586d7f5d3SJohn Marino  *
28686d7f5d3SJohn Marino  * Pad to 128 bytes.
28786d7f5d3SJohn Marino  */
28886d7f5d3SJohn Marino struct mly_health_status {
28986d7f5d3SJohn Marino     u_int32_t	uptime_us;				/* N/A */
29086d7f5d3SJohn Marino     u_int32_t	uptime_ms;				/* N/A */
29186d7f5d3SJohn Marino     u_int32_t	realtime;				/* N/A */
29286d7f5d3SJohn Marino     u_int32_t	res1;					/* N/A */
29386d7f5d3SJohn Marino     u_int32_t	change_counter;
29486d7f5d3SJohn Marino     u_int32_t	res2;					/* N/A */
29586d7f5d3SJohn Marino     u_int32_t	debug_message_index;			/* N/A */
29686d7f5d3SJohn Marino     u_int32_t	bios_message_index;			/* N/A */
29786d7f5d3SJohn Marino     u_int32_t	trace_page;				/* N/A */
29886d7f5d3SJohn Marino     u_int32_t	profiler_page;				/* N/A */
29986d7f5d3SJohn Marino     u_int32_t	next_event;
30086d7f5d3SJohn Marino     u_int8_t	res3[4 + 16 + 64];			/* N/A */
30186d7f5d3SJohn Marino } __packed;
30286d7f5d3SJohn Marino 
30386d7f5d3SJohn Marino /*
30486d7f5d3SJohn Marino  * 14.2 Timeout Bit Format
30586d7f5d3SJohn Marino  */
30686d7f5d3SJohn Marino struct mly_timeout {
30786d7f5d3SJohn Marino     u_int8_t	value:6;
30886d7f5d3SJohn Marino     u_int8_t	scale:2;
30986d7f5d3SJohn Marino #define MLY_TIMEOUT_SECONDS	0x0
31086d7f5d3SJohn Marino #define MLY_TIMEOUT_MINUTES	0x1
31186d7f5d3SJohn Marino #define MLY_TIMEOUT_HOURS	0x2
31286d7f5d3SJohn Marino } __packed;
31386d7f5d3SJohn Marino 
31486d7f5d3SJohn Marino /*
31586d7f5d3SJohn Marino  * 14.3 Operation Device
31686d7f5d3SJohn Marino  */
31786d7f5d3SJohn Marino #define MLY_OPDEVICE_PHYSICAL_DEVICE		0x0
31886d7f5d3SJohn Marino #define MLY_OPDEVICE_RAID_DEVICE		0x1
31986d7f5d3SJohn Marino #define MLY_OPDEVICE_PHYSICAL_CHANNEL		0x2
32086d7f5d3SJohn Marino #define MLY_OPDEVICE_RAID_CHANNEL		0x3
32186d7f5d3SJohn Marino #define MLY_OPDEVICE_PHYSICAL_CONTROLLER	0x4
32286d7f5d3SJohn Marino #define MLY_OPDEVICE_RAID_CONTROLLER		0x5
32386d7f5d3SJohn Marino #define MLY_OPDEVICE_CONFIGURATION_GROUP	0x10
32486d7f5d3SJohn Marino 
32586d7f5d3SJohn Marino /*
32686d7f5d3SJohn Marino  * 14.4 Status Bit Format
32786d7f5d3SJohn Marino  *
32886d7f5d3SJohn Marino  * AKA Status Mailbox Format
32986d7f5d3SJohn Marino  *
33086d7f5d3SJohn Marino  * XXX format conflict between FSI and PG6 over the ordering of the
33186d7f5d3SJohn Marino  * status and sense length fields.
33286d7f5d3SJohn Marino  */
33386d7f5d3SJohn Marino struct mly_status {
33486d7f5d3SJohn Marino     u_int16_t	command_id;
33586d7f5d3SJohn Marino     u_int8_t	status;
33686d7f5d3SJohn Marino     u_int8_t	sense_length;
33786d7f5d3SJohn Marino     int32_t	residue;
33886d7f5d3SJohn Marino } __packed;
33986d7f5d3SJohn Marino 
34086d7f5d3SJohn Marino /*
34186d7f5d3SJohn Marino  * 14.5 Command Control Bit (CCB) format
34286d7f5d3SJohn Marino  *
34386d7f5d3SJohn Marino  * This byte is unfortunately named.
34486d7f5d3SJohn Marino  */
34586d7f5d3SJohn Marino struct mly_command_control {
34686d7f5d3SJohn Marino     u_int8_t	force_unit_access:1;
34786d7f5d3SJohn Marino     u_int8_t	disable_page_out:1;
34886d7f5d3SJohn Marino     u_int8_t	res1:1;
34986d7f5d3SJohn Marino     u_int8_t	extended_sg_table:1;
35086d7f5d3SJohn Marino     u_int8_t	data_direction:1;
35186d7f5d3SJohn Marino #define MLY_CCB_WRITE	1
35286d7f5d3SJohn Marino #define MLY_CCB_READ	0
35386d7f5d3SJohn Marino     u_int8_t	res2:1;
35486d7f5d3SJohn Marino     u_int8_t	no_auto_sense:1;
35586d7f5d3SJohn Marino     u_int8_t	disable_disconnect:1;
35686d7f5d3SJohn Marino } __packed;
35786d7f5d3SJohn Marino 
35886d7f5d3SJohn Marino /*
35986d7f5d3SJohn Marino  * 15.0 Commands
36086d7f5d3SJohn Marino  *
36186d7f5d3SJohn Marino  * We use the command names as given by Mylex
36286d7f5d3SJohn Marino  */
36386d7f5d3SJohn Marino #define MDACMD_MEMCOPY		0x1	/* memory to memory copy */
36486d7f5d3SJohn Marino #define MDACMD_SCSIPT		0x2	/* SCSI passthrough (small command) */
36586d7f5d3SJohn Marino #define MDACMD_SCSILCPT		0x3	/* SCSI passthrough (large command) */
36686d7f5d3SJohn Marino #define MDACMD_SCSI		0x4	/* SCSI command for logical/phyiscal device (small command) */
36786d7f5d3SJohn Marino #define MDACMD_SCSILC		0x5	/* SCSI command for logical/phyiscal device (large command) */
36886d7f5d3SJohn Marino #define MDACMD_IOCTL		0x20	/* Management command */
36986d7f5d3SJohn Marino #define MDACMD_IOCTLCHECK	0x23	/* Validate management command (not implemented) */
37086d7f5d3SJohn Marino 
37186d7f5d3SJohn Marino /*
37286d7f5d3SJohn Marino  * 16.0 IOCTL command
37386d7f5d3SJohn Marino  *
37486d7f5d3SJohn Marino  * We use the IOCTL names as given by Mylex
37586d7f5d3SJohn Marino  * Note that only ioctls supported by the PCI controller family are listed
37686d7f5d3SJohn Marino  */
37786d7f5d3SJohn Marino #define MDACIOCTL_GETCONTROLLERINFO		0x1
37886d7f5d3SJohn Marino #define MDACIOCTL_GETLOGDEVINFOVALID		0x3
37986d7f5d3SJohn Marino #define MDACIOCTL_GETPHYSDEVINFOVALID		0x5
38086d7f5d3SJohn Marino #define MDACIOCTL_GETCONTROLLERSTATISTICS	0xb
38186d7f5d3SJohn Marino #define MDACIOCTL_GETLOGDEVSTATISTICS		0xd
38286d7f5d3SJohn Marino #define MDACIOCTL_GETPHYSDEVSTATISTICS		0xf
38386d7f5d3SJohn Marino #define MDACIOCTL_GETHEALTHSTATUS		0x11
38486d7f5d3SJohn Marino #define MDACIOCTL_GETEVENT			0x15
38586d7f5d3SJohn Marino /* flash update */
38686d7f5d3SJohn Marino #define MDACIOCTL_STOREIMAGE			0x2c
38786d7f5d3SJohn Marino #define MDACIOCTL_READIMAGE			0x2d
38886d7f5d3SJohn Marino #define MDACIOCTL_FLASHIMAGES			0x2e
38986d7f5d3SJohn Marino /* battery backup unit */
39086d7f5d3SJohn Marino #define MDACIOCTL_GET_SUBSYSTEM_DATA		0x70
39186d7f5d3SJohn Marino #define MDACIOCTL_SET_SUBSYSTEM_DATA		0x71
39286d7f5d3SJohn Marino /* non-data commands */
39386d7f5d3SJohn Marino #define MDACIOCTL_STARTDISOCVERY		0x81
39486d7f5d3SJohn Marino #define MDACIOCTL_SETRAIDDEVSTATE		0x82
39586d7f5d3SJohn Marino #define MDACIOCTL_INITPHYSDEVSTART		0x84
39686d7f5d3SJohn Marino #define MDACIOCTL_INITPHYSDEVSTOP		0x85
39786d7f5d3SJohn Marino #define MDACIOCTL_INITRAIDDEVSTART		0x86
39886d7f5d3SJohn Marino #define MDACIOCTL_INITRAIDDEVSTOP		0x87
39986d7f5d3SJohn Marino #define MDACIOCTL_REBUILDRAIDDEVSTART		0x88
40086d7f5d3SJohn Marino #define MDACIOCTL_REBUILDRAIDDEVSTOP		0x89
40186d7f5d3SJohn Marino #define MDACIOCTL_MAKECONSISTENTDATASTART	0x8a
40286d7f5d3SJohn Marino #define MDACIOCTL_MAKECONSISTENTDATASTOP	0x8b
40386d7f5d3SJohn Marino #define MDACIOCTL_CONSISTENCYCHECKSTART		0x8c
40486d7f5d3SJohn Marino #define MDACIOCTL_CONSISTENCYCHECKSTOP		0x8d
40586d7f5d3SJohn Marino #define MDACIOCTL_SETMEMORYMAILBOX		0x8e
40686d7f5d3SJohn Marino #define MDACIOCTL_RESETDEVICE			0x90
40786d7f5d3SJohn Marino #define MDACIOCTL_FLUSHDEVICEDATA		0x91
40886d7f5d3SJohn Marino #define MDACIOCTL_PAUSEDEVICE			0x92
40986d7f5d3SJohn Marino #define MDACIOCTL_UNPAUSEDEVICE			0x93
41086d7f5d3SJohn Marino #define MDACIOCTL_LOCATEDEVICE			0x94
41186d7f5d3SJohn Marino #define MDACIOCTL_SETMASTERSLAVEMODE		0x95
41286d7f5d3SJohn Marino #define MDACIOCTL_SETREALTIMECLOCK		0xac
41386d7f5d3SJohn Marino /* RAID configuration */
41486d7f5d3SJohn Marino #define MDACIOCTL_CREATENEWCONF			0xc0
41586d7f5d3SJohn Marino #define MDACIOCTL_DELETERAIDDEV			0xc1
41686d7f5d3SJohn Marino #define MDACIOCTL_REPLACEINTERNALDEV		0xc2
41786d7f5d3SJohn Marino #define MDACIOCTL_RENAMERAIDDEV			0xc3
41886d7f5d3SJohn Marino #define MDACIOCTL_ADDNEWCONF			0xc4
41986d7f5d3SJohn Marino #define MDACIOCTL_XLATEPHYSDEVTORAIDDEV		0xc5
42086d7f5d3SJohn Marino #define MDACIOCTL_MORE				0xc6
42186d7f5d3SJohn Marino #define MDACIOCTL_SETPHYSDEVPARAMETER		0xc8
42286d7f5d3SJohn Marino #define MDACIOCTL_GETPHYSDEVPARAMETER		0xc9
42386d7f5d3SJohn Marino #define MDACIOCTL_CLEARCONF			0xca
42486d7f5d3SJohn Marino #define MDACIOCTL_GETDEVCONFINFO		0xcb
42586d7f5d3SJohn Marino #define MDACIOCTL_GETGROUPCONFINFO		0xcc
42686d7f5d3SJohn Marino #define MDACIOCTL_GETFREESPACELIST		0xcd
42786d7f5d3SJohn Marino #define MDACIOCTL_GETLOGDEVPARAMETER		0xce
42886d7f5d3SJohn Marino #define MDACIOCTL_SETLOGDEVPARAMETER		0xcf
42986d7f5d3SJohn Marino #define MDACIOCTL_GETCONTROLLERPARAMETER	0xd0
43086d7f5d3SJohn Marino #define MDACIOCTL_SETCONTRLLERPARAMETER		0xd1
43186d7f5d3SJohn Marino #define MDACIOCTL_CLEARCONFSUSPMODE		0xd2
43286d7f5d3SJohn Marino #define MDACIOCTL_GETBDT_FOR_SYSDRIVE		0xe0
43386d7f5d3SJohn Marino 
43486d7f5d3SJohn Marino /*
43586d7f5d3SJohn Marino  * 17.1.4 Data Transfer Memory Address Without SG List
43686d7f5d3SJohn Marino  */
43786d7f5d3SJohn Marino struct mly_short_transfer {
43886d7f5d3SJohn Marino     struct mly_sg_entry	sg[2];
43986d7f5d3SJohn Marino } __packed;
44086d7f5d3SJohn Marino 
44186d7f5d3SJohn Marino /*
44286d7f5d3SJohn Marino  * 17.1.5 Data Transfer Memory Address With SG List
44386d7f5d3SJohn Marino  *
44486d7f5d3SJohn Marino  * Note that only the first s/g table is currently used.
44586d7f5d3SJohn Marino  */
44686d7f5d3SJohn Marino struct mly_sg_transfer {
44786d7f5d3SJohn Marino     u_int16_t	entries[3];
44886d7f5d3SJohn Marino     u_int16_t	res1;
44986d7f5d3SJohn Marino     u_int64_t	table_physaddr[3];
45086d7f5d3SJohn Marino } __packed;
45186d7f5d3SJohn Marino 
45286d7f5d3SJohn Marino /*
45386d7f5d3SJohn Marino  * 17.1.3 Data Transfer Memory Address Format
45486d7f5d3SJohn Marino  */
45586d7f5d3SJohn Marino union mly_command_transfer {
45686d7f5d3SJohn Marino     struct mly_short_transfer	direct;
45786d7f5d3SJohn Marino     struct mly_sg_transfer	indirect;
45886d7f5d3SJohn Marino };
45986d7f5d3SJohn Marino 
46086d7f5d3SJohn Marino /*
46186d7f5d3SJohn Marino  * 21.1  MDACIOCTL_SETREALTIMECLOCK
46286d7f5d3SJohn Marino  * 21.7  MDACIOCTL_GETHEALTHSTATUS
46386d7f5d3SJohn Marino  * 21.8  MDACIOCTL_GETCONTROLLERINFO
46486d7f5d3SJohn Marino  * 21.9  MDACIOCTL_GETLOGDEVINFOVALID
46586d7f5d3SJohn Marino  * 21.10 MDACIOCTL_GETPHYSDEVINFOVALID
46686d7f5d3SJohn Marino  * 21.11 MDACIOCTL_GETPHYSDEVSTATISTICS
46786d7f5d3SJohn Marino  * 21.12 MDACIOCTL_GETLOGDEVSTATISTICS
46886d7f5d3SJohn Marino  * 21.13 MDACIOCTL_GETCONTROLLERSTATISTICS
46986d7f5d3SJohn Marino  * 21.27 MDACIOCTL_GETBDT_FOR_SYSDRIVE
47086d7f5d3SJohn Marino  * 23.4  MDACIOCTL_CREATENEWCONF
47186d7f5d3SJohn Marino  * 23.5  MDACIOCTL_ADDNEWCONF
47286d7f5d3SJohn Marino  * 23.8  MDACIOCTL_GETDEVCONFINFO
47386d7f5d3SJohn Marino  * 23.9  MDACIOCTL_GETFREESPACELIST
47486d7f5d3SJohn Marino  * 24.1  MDACIOCTL_MORE
47586d7f5d3SJohn Marino  * 25.1  MDACIOCTL_GETPHYSDEVPARAMETER
47686d7f5d3SJohn Marino  * 25.2  MDACIOCTL_SETPHYSDEVPARAMETER
47786d7f5d3SJohn Marino  * 25.3  MDACIOCTL_GETLOGDEVPARAMETER
47886d7f5d3SJohn Marino  * 25.4  MDACIOCTL_SETLOGDEVPARAMETER
47986d7f5d3SJohn Marino  * 25.5  MDACIOCTL_GETCONTROLLERPARAMETER
48086d7f5d3SJohn Marino  * 25.6  MDACIOCTL_SETCONTROLLERPARAMETER
48186d7f5d3SJohn Marino  *
48286d7f5d3SJohn Marino  * These commands just transfer data
48386d7f5d3SJohn Marino  */
48486d7f5d3SJohn Marino struct mly_ioctl_param_data {
48586d7f5d3SJohn Marino     u_int8_t			param[10];
48686d7f5d3SJohn Marino     union mly_command_transfer	transfer;
48786d7f5d3SJohn Marino } __packed;
48886d7f5d3SJohn Marino 
48986d7f5d3SJohn Marino /*
49086d7f5d3SJohn Marino  * 21.2 MDACIOCTL_SETMEMORYMAILBOX
49186d7f5d3SJohn Marino  */
49286d7f5d3SJohn Marino struct mly_ioctl_param_setmemorymailbox {
49386d7f5d3SJohn Marino     u_int8_t	health_buffer_size;
49486d7f5d3SJohn Marino     u_int8_t	res1;
49586d7f5d3SJohn Marino     u_int64_t	health_buffer_physaddr;
49686d7f5d3SJohn Marino     u_int64_t	command_mailbox_physaddr;
49786d7f5d3SJohn Marino     u_int64_t	status_mailbox_physaddr;
49886d7f5d3SJohn Marino     u_int64_t	res2[2];
49986d7f5d3SJohn Marino } __packed;
50086d7f5d3SJohn Marino 
50186d7f5d3SJohn Marino /*
50286d7f5d3SJohn Marino  * 21.8.2 MDACIOCTL_GETCONTROLLERINFO: Data Format
50386d7f5d3SJohn Marino  */
50486d7f5d3SJohn Marino struct mly_ioctl_getcontrollerinfo {
50586d7f5d3SJohn Marino     u_int8_t	res1;						/* N/A */
50686d7f5d3SJohn Marino     u_int8_t	interface_type;
50786d7f5d3SJohn Marino     u_int8_t	controller_type;
50886d7f5d3SJohn Marino     u_int8_t	res2;						/* N/A */
50986d7f5d3SJohn Marino     u_int16_t	interface_speed;
51086d7f5d3SJohn Marino     u_int8_t	interface_width;
51186d7f5d3SJohn Marino     u_int8_t	res3[9];					/* N/A */
51286d7f5d3SJohn Marino     char	interface_name[16];
51386d7f5d3SJohn Marino     char	controller_name[16];
51486d7f5d3SJohn Marino     u_int8_t	res4[16];					/* N/A */
51586d7f5d3SJohn Marino     /* firmware release information */
51686d7f5d3SJohn Marino     u_int8_t	fw_major;
51786d7f5d3SJohn Marino     u_int8_t	fw_minor;
51886d7f5d3SJohn Marino     u_int8_t	fw_turn;
51986d7f5d3SJohn Marino     u_int8_t	fw_build;
52086d7f5d3SJohn Marino     u_int8_t	fw_day;
52186d7f5d3SJohn Marino     u_int8_t	fw_month;
52286d7f5d3SJohn Marino     u_int8_t	fw_century;
52386d7f5d3SJohn Marino     u_int8_t	fw_year;
52486d7f5d3SJohn Marino     /* hardware release information */
52586d7f5d3SJohn Marino     u_int8_t	hw_revision;					/* N/A */
52686d7f5d3SJohn Marino     u_int8_t	res5[3];					/* N/A */
52786d7f5d3SJohn Marino     u_int8_t	hw_release_day;					/* N/A */
52886d7f5d3SJohn Marino     u_int8_t	hw_release_month;				/* N/A */
52986d7f5d3SJohn Marino     u_int8_t	hw_release_century;				/* N/A */
53086d7f5d3SJohn Marino     u_int8_t	hw_release_year;				/* N/A */
53186d7f5d3SJohn Marino     /* hardware manufacturing information */
53286d7f5d3SJohn Marino     u_int8_t	batch_number;					/* N/A */
53386d7f5d3SJohn Marino     u_int8_t	res6;						/* N/A */
53486d7f5d3SJohn Marino     u_int8_t	plant_number;
53586d7f5d3SJohn Marino     u_int8_t	res7;
53686d7f5d3SJohn Marino     u_int8_t	hw_manuf_day;
53786d7f5d3SJohn Marino     u_int8_t	hw_manuf_month;
53886d7f5d3SJohn Marino     u_int8_t	hw_manuf_century;
53986d7f5d3SJohn Marino     u_int8_t	hw_manuf_year;
54086d7f5d3SJohn Marino     u_int8_t	max_pdd_per_xldd;
54186d7f5d3SJohn Marino     u_int8_t	max_ildd_per_xldd;
54286d7f5d3SJohn Marino     u_int16_t	nvram_size;
54386d7f5d3SJohn Marino     u_int8_t	max_number_of_xld;				/* N/A */
54486d7f5d3SJohn Marino     u_int8_t	res8[3];					/* N/A */
54586d7f5d3SJohn Marino     /* unique information per controller */
54686d7f5d3SJohn Marino     char	serial_number[16];
54786d7f5d3SJohn Marino     u_int8_t	res9[16];					/* N/A */
54886d7f5d3SJohn Marino     /* vendor information */
54986d7f5d3SJohn Marino     u_int8_t	res10[3];					/* N/A */
55086d7f5d3SJohn Marino     u_int8_t	oem_information;
55186d7f5d3SJohn Marino     char	vendor_name[16];				/* N/A */
55286d7f5d3SJohn Marino     /* other physical/controller/operation information */
55386d7f5d3SJohn Marino     u_int8_t	bbu_present:1;
55486d7f5d3SJohn Marino     u_int8_t	active_clustering:1;
55586d7f5d3SJohn Marino     u_int8_t	res11:6;					/* N/A */
55686d7f5d3SJohn Marino     u_int8_t	res12[3];					/* N/A */
55786d7f5d3SJohn Marino     /* physical device scan information */
55886d7f5d3SJohn Marino     u_int8_t	physical_scan_active:1;
55986d7f5d3SJohn Marino     u_int8_t	res13:7;					/* N/A */
56086d7f5d3SJohn Marino     u_int8_t	physical_scan_channel;
56186d7f5d3SJohn Marino     u_int8_t	physical_scan_target;
56286d7f5d3SJohn Marino     u_int8_t	physical_scan_lun;
56386d7f5d3SJohn Marino     /* maximum command data transfer size */
56486d7f5d3SJohn Marino     u_int16_t	maximum_block_count;
56586d7f5d3SJohn Marino     u_int16_t	maximum_sg_entries;
56686d7f5d3SJohn Marino     /* logical/physical device counts */
56786d7f5d3SJohn Marino     u_int16_t	logical_devices_present;
56886d7f5d3SJohn Marino     u_int16_t	logical_devices_critical;
56986d7f5d3SJohn Marino     u_int16_t	logical_devices_offline;
57086d7f5d3SJohn Marino     u_int16_t	physical_devices_present;
57186d7f5d3SJohn Marino     u_int16_t	physical_disks_present;
57286d7f5d3SJohn Marino     u_int16_t	physical_disks_critical;			/* N/A */
57386d7f5d3SJohn Marino     u_int16_t	physical_disks_offline;
57486d7f5d3SJohn Marino     u_int16_t	maximum_parallel_commands;
57586d7f5d3SJohn Marino     /* channel and target ID information */
57686d7f5d3SJohn Marino     u_int8_t	physical_channels_present;
57786d7f5d3SJohn Marino     u_int8_t	virtual_channels_present;
57886d7f5d3SJohn Marino     u_int8_t	physical_channels_possible;
57986d7f5d3SJohn Marino     u_int8_t	virtual_channels_possible;
58086d7f5d3SJohn Marino     u_int8_t	maximum_targets_possible[16];			/* N/A (6 and up) */
58186d7f5d3SJohn Marino     u_int8_t	res14[12];					/* N/A */
58286d7f5d3SJohn Marino     /* memory/cache information */
58386d7f5d3SJohn Marino     u_int16_t	memory_size;
58486d7f5d3SJohn Marino     u_int16_t	cache_size;
58586d7f5d3SJohn Marino     u_int32_t	valid_cache_size;				/* N/A */
58686d7f5d3SJohn Marino     u_int32_t	dirty_cache_size;				/* N/A */
58786d7f5d3SJohn Marino     u_int16_t	memory_speed;
58886d7f5d3SJohn Marino     u_int8_t	memory_width;
58986d7f5d3SJohn Marino     u_int8_t	memory_type:5;
59086d7f5d3SJohn Marino     u_int8_t	res15:1;					/* N/A */
59186d7f5d3SJohn Marino     u_int8_t	memory_parity:1;
59286d7f5d3SJohn Marino     u_int8_t	memory_ecc:1;
59386d7f5d3SJohn Marino     char	memory_information[16];				/* N/A */
59486d7f5d3SJohn Marino     /* execution memory information */
59586d7f5d3SJohn Marino     u_int16_t	exmemory_size;
59686d7f5d3SJohn Marino     u_int16_t	l2cache_size;					/* N/A */
59786d7f5d3SJohn Marino     u_int8_t	res16[8];					/* N/A */
59886d7f5d3SJohn Marino     u_int16_t	exmemory_speed;
59986d7f5d3SJohn Marino     u_int8_t	exmemory_width;
60086d7f5d3SJohn Marino     u_int8_t	exmemory_type:5;
60186d7f5d3SJohn Marino     u_int8_t	res17:1;					/* N/A */
60286d7f5d3SJohn Marino     u_int8_t	exmemory_parity:1;
60386d7f5d3SJohn Marino     u_int8_t	exmemory_ecc:1;
60486d7f5d3SJohn Marino     char	exmemory_name[16];				/* N/A */
60586d7f5d3SJohn Marino     /* CPU information */
60686d7f5d3SJohn Marino     struct {
60786d7f5d3SJohn Marino 	u_int16_t	speed;
60886d7f5d3SJohn Marino 	u_int8_t	type;
60986d7f5d3SJohn Marino 	u_int8_t	number;
61086d7f5d3SJohn Marino 	u_int8_t	res1[12];				/* N/A */
61186d7f5d3SJohn Marino 	char		name[16];				/* N/A */
61286d7f5d3SJohn Marino     } cpu[2] __packed;
61386d7f5d3SJohn Marino     /* debugging/profiling/command time tracing information */
61486d7f5d3SJohn Marino     u_int16_t	profiling_page;					/* N/A */
61586d7f5d3SJohn Marino     u_int16_t	profiling_programs;				/* N/A */
61686d7f5d3SJohn Marino     u_int16_t	time_trace_page;				/* N/A */
61786d7f5d3SJohn Marino     u_int16_t	time_trace_programs;				/* N/A */
61886d7f5d3SJohn Marino     u_int8_t	res18[8];					/* N/A */
61986d7f5d3SJohn Marino     /* error counters on physical devices */
62086d7f5d3SJohn Marino     u_int16_t	physical_device_bus_resets;			/* N/A */
62186d7f5d3SJohn Marino     u_int16_t	physical_device_parity_errors;			/* N/A */
62286d7f5d3SJohn Marino     u_int16_t	physical_device_soft_errors;			/* N/A */
62386d7f5d3SJohn Marino     u_int16_t	physical_device_commands_failed;		/* N/A */
62486d7f5d3SJohn Marino     u_int16_t	physical_device_miscellaneous_errors;		/* N/A */
62586d7f5d3SJohn Marino     u_int16_t	physical_device_command_timeouts;		/* N/A */
62686d7f5d3SJohn Marino     u_int16_t	physical_device_selection_timeouts;		/* N/A */
62786d7f5d3SJohn Marino     u_int16_t	physical_device_retries;			/* N/A */
62886d7f5d3SJohn Marino     u_int16_t	physical_device_aborts;				/* N/A */
62986d7f5d3SJohn Marino     u_int16_t	physical_device_host_command_aborts;		/* N/A */
63086d7f5d3SJohn Marino     u_int16_t	physical_device_PFAs_detected;			/* N/A */
63186d7f5d3SJohn Marino     u_int16_t	physical_device_host_commands_failed;		/* N/A */
63286d7f5d3SJohn Marino     u_int8_t	res19[8];					/* N/A */
63386d7f5d3SJohn Marino     /* error counters on logical devices */
63486d7f5d3SJohn Marino     u_int16_t	logical_device_soft_errors;			/* N/A */
63586d7f5d3SJohn Marino     u_int16_t	logical_device_commands_failed;			/* N/A */
63686d7f5d3SJohn Marino     u_int16_t	logical_device_host_command_aborts;		/* N/A */
63786d7f5d3SJohn Marino     u_int16_t	res20;						/* N/A */
63886d7f5d3SJohn Marino     /* error counters on controller */
63986d7f5d3SJohn Marino     u_int16_t	controller_parity_ecc_errors;
64086d7f5d3SJohn Marino     u_int16_t	controller_host_command_aborts;			/* N/A */
64186d7f5d3SJohn Marino     u_int8_t	res21[4];					/* N/A */
64286d7f5d3SJohn Marino     /* long duration activity information */
64386d7f5d3SJohn Marino     u_int16_t	background_inits_active;
64486d7f5d3SJohn Marino     u_int16_t	logical_inits_active;
64586d7f5d3SJohn Marino     u_int16_t	physical_inits_active;
64686d7f5d3SJohn Marino     u_int16_t	consistency_checks_active;
64786d7f5d3SJohn Marino     u_int16_t	rebuilds_active;
64886d7f5d3SJohn Marino     u_int16_t	MORE_active;
64986d7f5d3SJohn Marino     u_int16_t	patrol_active;					/* N/A */
65086d7f5d3SJohn Marino     u_int8_t	long_operation_status;				/* N/A */
65186d7f5d3SJohn Marino     u_int8_t	res22;						/* N/A */
65286d7f5d3SJohn Marino     /* flash ROM information */
65386d7f5d3SJohn Marino     u_int8_t	flash_type;					/* N/A */
65486d7f5d3SJohn Marino     u_int8_t	res23;						/* N/A */
65586d7f5d3SJohn Marino     u_int16_t	flash_size;
65686d7f5d3SJohn Marino     u_int32_t	flash_maximum_age;
65786d7f5d3SJohn Marino     u_int32_t	flash_age;
65886d7f5d3SJohn Marino     u_int8_t	res24[4];					/* N/A */
65986d7f5d3SJohn Marino     char	flash_name[16];					/* N/A */
66086d7f5d3SJohn Marino     /* firmware runtime information */
66186d7f5d3SJohn Marino     u_int8_t	rebuild_rate;
66286d7f5d3SJohn Marino     u_int8_t	background_init_rate;
66386d7f5d3SJohn Marino     u_int8_t	init_rate;
66486d7f5d3SJohn Marino     u_int8_t	consistency_check_rate;
66586d7f5d3SJohn Marino     u_int8_t	res25[4];					/* N/A */
66686d7f5d3SJohn Marino     u_int32_t	maximum_dp;
66786d7f5d3SJohn Marino     u_int32_t	free_dp;
66886d7f5d3SJohn Marino     u_int32_t	maximum_iop;
66986d7f5d3SJohn Marino     u_int32_t	free_iop;
67086d7f5d3SJohn Marino     u_int16_t	maximum_comb_length;
67186d7f5d3SJohn Marino     u_int16_t	maximum_configuration_groups;
67286d7f5d3SJohn Marino     u_int8_t	installation_abort:1;
67386d7f5d3SJohn Marino     u_int8_t	maintenance:1;
67486d7f5d3SJohn Marino     u_int8_t	res26:6;					/* N/A */
67586d7f5d3SJohn Marino     u_int8_t	res27[3];					/* N/A */
67686d7f5d3SJohn Marino     u_int8_t	res28[32 + 512];				/* N/A */
67786d7f5d3SJohn Marino } __packed;
67886d7f5d3SJohn Marino 
67986d7f5d3SJohn Marino /*
68086d7f5d3SJohn Marino  * 21.9.2 MDACIOCTL_GETLOGDEVINFOVALID
68186d7f5d3SJohn Marino  */
68286d7f5d3SJohn Marino struct mly_ioctl_getlogdevinfovalid {
68386d7f5d3SJohn Marino     u_int8_t	res1;						/* N/A */
68486d7f5d3SJohn Marino     u_int8_t	channel;
68586d7f5d3SJohn Marino     u_int8_t	target;
68686d7f5d3SJohn Marino     u_int8_t	lun;
68786d7f5d3SJohn Marino     u_int8_t	state;				/* see 8.1 */
68886d7f5d3SJohn Marino     u_int8_t	raid_level;			/* see 8.2 */
68986d7f5d3SJohn Marino     u_int8_t	stripe_size;			/* see 8.3 */
69086d7f5d3SJohn Marino     u_int8_t	cache_line_size;		/* see 8.4 */
69186d7f5d3SJohn Marino     u_int8_t	read_write_control;		/* see 8.5 */
69286d7f5d3SJohn Marino     u_int8_t	consistency_check:1;
69386d7f5d3SJohn Marino     u_int8_t	rebuild:1;
69486d7f5d3SJohn Marino     u_int8_t	make_consistent:1;
69586d7f5d3SJohn Marino     u_int8_t	initialisation:1;
69686d7f5d3SJohn Marino     u_int8_t	migration:1;
69786d7f5d3SJohn Marino     u_int8_t	patrol:1;
69886d7f5d3SJohn Marino     u_int8_t	res2:2;						/* N/A */
69986d7f5d3SJohn Marino     u_int8_t	ar5_limit;
70086d7f5d3SJohn Marino     u_int8_t	ar5_algo;
70186d7f5d3SJohn Marino     u_int16_t	logical_device_number;
70286d7f5d3SJohn Marino     u_int16_t	bios_control;
70386d7f5d3SJohn Marino     /* erorr counters */
70486d7f5d3SJohn Marino     u_int16_t	soft_errors;					/* N/A */
70586d7f5d3SJohn Marino     u_int16_t	commands_failed;				/* N/A */
70686d7f5d3SJohn Marino     u_int16_t	host_command_aborts;				/* N/A */
70786d7f5d3SJohn Marino     u_int16_t	deferred_write_errors;				/* N/A */
70886d7f5d3SJohn Marino     u_int8_t	res3[8];					/* N/A */
70986d7f5d3SJohn Marino     /* device size information */
71086d7f5d3SJohn Marino     u_int8_t	res4[2];					/* N/A */
71186d7f5d3SJohn Marino     u_int16_t	device_block_size;
71286d7f5d3SJohn Marino     u_int32_t	original_device_size;				/* N/A */
71386d7f5d3SJohn Marino     u_int32_t	device_size;			/* XXX "blocks or MB" Huh? */
71486d7f5d3SJohn Marino     u_int8_t	res5[4];					/* N/A */
71586d7f5d3SJohn Marino     char	device_name[32];				/* N/A */
71686d7f5d3SJohn Marino     u_int8_t	inquiry[36];
71786d7f5d3SJohn Marino     u_int8_t	res6[12];					/* N/A */
71886d7f5d3SJohn Marino     u_int64_t	last_read_block;				/* N/A */
71986d7f5d3SJohn Marino     u_int64_t	last_written_block;				/* N/A */
72086d7f5d3SJohn Marino     u_int64_t	consistency_check_block;
72186d7f5d3SJohn Marino     u_int64_t	rebuild_block;
72286d7f5d3SJohn Marino     u_int64_t	make_consistent_block;
72386d7f5d3SJohn Marino     u_int64_t	initialisation_block;
72486d7f5d3SJohn Marino     u_int64_t	migration_block;
72586d7f5d3SJohn Marino     u_int64_t	patrol_block;					/* N/A */
72686d7f5d3SJohn Marino     u_int8_t	res7[64];					/* N/A */
72786d7f5d3SJohn Marino } __packed;
72886d7f5d3SJohn Marino 
72986d7f5d3SJohn Marino /*
73086d7f5d3SJohn Marino  * 21.10.2 MDACIOCTL_GETPHYSDEVINFOVALID: Data Format
73186d7f5d3SJohn Marino  */
73286d7f5d3SJohn Marino struct mly_ioctl_getphysdevinfovalid {
73386d7f5d3SJohn Marino     u_int8_t	res1;
73486d7f5d3SJohn Marino     u_int8_t	channel;
73586d7f5d3SJohn Marino     u_int8_t	target;
73686d7f5d3SJohn Marino     u_int8_t	lun;
73786d7f5d3SJohn Marino     u_int8_t	raid_ft:1;			/* configuration status */
73886d7f5d3SJohn Marino     u_int8_t	res2:1;						/* N/A */
73986d7f5d3SJohn Marino     u_int8_t	local:1;
74086d7f5d3SJohn Marino     u_int8_t	res3:5;
74186d7f5d3SJohn Marino     u_int8_t	host_dead:1;			/* multiple host/controller status *//* N/A */
74286d7f5d3SJohn Marino     u_int8_t	host_connection_dead:1;				/* N/A */
74386d7f5d3SJohn Marino     u_int8_t	res4:6;						/* N/A */
74486d7f5d3SJohn Marino     u_int8_t	state;				/* see 8.1 */
74586d7f5d3SJohn Marino     u_int8_t	width;
74686d7f5d3SJohn Marino     u_int16_t	speed;
74786d7f5d3SJohn Marino     /* multiported physical device information */
74886d7f5d3SJohn Marino     u_int8_t	ports_available;				/* N/A */
74986d7f5d3SJohn Marino     u_int8_t	ports_inuse;					/* N/A */
75086d7f5d3SJohn Marino     u_int8_t	res5[4];
75186d7f5d3SJohn Marino     u_int8_t	ether_address[16];				/* N/A */
75286d7f5d3SJohn Marino     u_int16_t	command_tags;
75386d7f5d3SJohn Marino     u_int8_t	consistency_check:1;				/* N/A */
75486d7f5d3SJohn Marino     u_int8_t	rebuild:1;					/* N/A */
75586d7f5d3SJohn Marino     u_int8_t	make_consistent:1;				/* N/A */
75686d7f5d3SJohn Marino     u_int8_t	initialisation:1;
75786d7f5d3SJohn Marino     u_int8_t	migration:1;					/* N/A */
75886d7f5d3SJohn Marino     u_int8_t	patrol:1;					/* N/A */
75986d7f5d3SJohn Marino     u_int8_t	res6:2;
76086d7f5d3SJohn Marino     u_int8_t	long_operation_status;				/* N/A */
76186d7f5d3SJohn Marino     u_int8_t	parity_errors;
76286d7f5d3SJohn Marino     u_int8_t	soft_errors;
76386d7f5d3SJohn Marino     u_int8_t	hard_errors;
76486d7f5d3SJohn Marino     u_int8_t	miscellaneous_errors;
76586d7f5d3SJohn Marino     u_int8_t	command_timeouts;				/* N/A */
76686d7f5d3SJohn Marino     u_int8_t	retries;					/* N/A */
76786d7f5d3SJohn Marino     u_int8_t	aborts;						/* N/A */
76886d7f5d3SJohn Marino     u_int8_t	PFAs_detected;					/* N/A */
76986d7f5d3SJohn Marino     u_int8_t	res7[6];
77086d7f5d3SJohn Marino     u_int16_t	block_size;
77186d7f5d3SJohn Marino     u_int32_t	original_device_size;		/* XXX "blocks or MB" Huh? */
77286d7f5d3SJohn Marino     u_int32_t	device_size;			/* XXX "blocks or MB" Huh? */
77386d7f5d3SJohn Marino     u_int8_t	res8[4];
77486d7f5d3SJohn Marino     char	name[16];					/* N/A */
77586d7f5d3SJohn Marino     u_int8_t	res9[16 + 32];
77686d7f5d3SJohn Marino     u_int8_t	inquiry[36];
77786d7f5d3SJohn Marino     u_int8_t	res10[12 + 16];
77886d7f5d3SJohn Marino     u_int64_t	last_read_block;				/* N/A */
77986d7f5d3SJohn Marino     u_int64_t	last_written_block;				/* N/A */
78086d7f5d3SJohn Marino     u_int64_t	consistency_check_block;			/* N/A */
78186d7f5d3SJohn Marino     u_int64_t	rebuild_block;					/* N/A */
78286d7f5d3SJohn Marino     u_int64_t	make_consistent_block;				/* N/A */
78386d7f5d3SJohn Marino     u_int64_t	initialisation_block;				/* N/A */
78486d7f5d3SJohn Marino     u_int64_t	migration_block;				/* N/A */
78586d7f5d3SJohn Marino     u_int64_t	patrol_block;					/* N/A */
78686d7f5d3SJohn Marino     u_int8_t	res11[256];
78786d7f5d3SJohn Marino } __packed;
78886d7f5d3SJohn Marino 
78986d7f5d3SJohn Marino union mly_devinfo {
79086d7f5d3SJohn Marino     struct mly_ioctl_getlogdevinfovalid		logdev;
79186d7f5d3SJohn Marino     struct mly_ioctl_getphysdevinfovalid	physdev;
79286d7f5d3SJohn Marino };
79386d7f5d3SJohn Marino 
79486d7f5d3SJohn Marino /*
79586d7f5d3SJohn Marino  * 21.11.2 MDACIOCTL_GETPHYSDEVSTATISTICS: Data Format
79686d7f5d3SJohn Marino  * 21.12.2 MDACIOCTL_GETLOGDEVSTATISTICS: Data Format
79786d7f5d3SJohn Marino  */
79886d7f5d3SJohn Marino struct mly_ioctl_getdevstatistics {
79986d7f5d3SJohn Marino     u_int32_t	uptime_ms;			/* getphysedevstatistics only */
80086d7f5d3SJohn Marino     u_int8_t	res1[5];					/* N/A */
80186d7f5d3SJohn Marino     u_int8_t	channel;
80286d7f5d3SJohn Marino     u_int8_t	target;
80386d7f5d3SJohn Marino     u_int8_t	lun;
80486d7f5d3SJohn Marino     u_int16_t	raid_device;			/* getlogdevstatistics only */
80586d7f5d3SJohn Marino     u_int8_t	res2[2];					/* N/A */
80686d7f5d3SJohn Marino     /* total read/write performance including cache data */
80786d7f5d3SJohn Marino     u_int32_t	total_reads;
80886d7f5d3SJohn Marino     u_int32_t	total_writes;
80986d7f5d3SJohn Marino     u_int32_t	total_read_size;
81086d7f5d3SJohn Marino     u_int32_t	total_write_size;
81186d7f5d3SJohn Marino     /* cache read/write performance */
81286d7f5d3SJohn Marino     u_int32_t	cache_reads;					/* N/A */
81386d7f5d3SJohn Marino     u_int32_t	cache_writes;					/* N/A */
81486d7f5d3SJohn Marino     u_int32_t	cache_read_size;				/* N/A */
81586d7f5d3SJohn Marino     u_int32_t	cache_write_size;				/* N/A */
81686d7f5d3SJohn Marino     /* commands active/wait information */
81786d7f5d3SJohn Marino     u_int32_t	command_waits_done;				/* N/A */
81886d7f5d3SJohn Marino     u_int16_t	active_commands;				/* N/A */
81986d7f5d3SJohn Marino     u_int16_t	waiting_commands;				/* N/A */
82086d7f5d3SJohn Marino     u_int8_t	res3[8];					/* N/A */
82186d7f5d3SJohn Marino } __packed;
82286d7f5d3SJohn Marino 
82386d7f5d3SJohn Marino /*
82486d7f5d3SJohn Marino  * 21.13.2 MDACIOCTL_GETCONTROLLERSTATISTICS: Data Format
82586d7f5d3SJohn Marino  */
82686d7f5d3SJohn Marino struct mly_ioctl_getcontrollerstatistics {
82786d7f5d3SJohn Marino     u_int32_t	uptime_ms;					/* N/A */
82886d7f5d3SJohn Marino     u_int8_t	res1[12];					/* N/A */
82986d7f5d3SJohn Marino     /* target physical device performance data information */
83086d7f5d3SJohn Marino     u_int32_t	target_physical_device_interrupts;		/* N/A */
83186d7f5d3SJohn Marino     u_int32_t	target_physical_device_stray_interrupts;	/* N/A */
83286d7f5d3SJohn Marino     u_int8_t	res2[8];					/* N/A */
83386d7f5d3SJohn Marino     u_int32_t	target_physical_device_reads;			/* N/A */
83486d7f5d3SJohn Marino     u_int32_t	target_physical_device_writes;			/* N/A */
83586d7f5d3SJohn Marino     u_int32_t	target_physical_device_read_size;		/* N/A */
83686d7f5d3SJohn Marino     u_int32_t	target_physical_device_write_size;		/* N/A */
83786d7f5d3SJohn Marino     /* host system performance data information */
83886d7f5d3SJohn Marino     u_int32_t	host_system_interrupts;				/* N/A */
83986d7f5d3SJohn Marino     u_int32_t	host_system_stray_interrupts;			/* N/A */
84086d7f5d3SJohn Marino     u_int32_t	host_system_sent_interrupts;			/* N/A */
84186d7f5d3SJohn Marino     u_int8_t	res3[4];					/* N/A */
84286d7f5d3SJohn Marino     u_int32_t	physical_device_reads;				/* N/A */
84386d7f5d3SJohn Marino     u_int32_t	physical_device_writes;				/* N/A */
84486d7f5d3SJohn Marino     u_int32_t	physical_device_read_size;			/* N/A */
84586d7f5d3SJohn Marino     u_int32_t	physical_device_write_size;			/* N/A */
84686d7f5d3SJohn Marino     u_int32_t	physical_device_cache_reads;			/* N/A */
84786d7f5d3SJohn Marino     u_int32_t	physical_device_cache_writes;			/* N/A */
84886d7f5d3SJohn Marino     u_int32_t	physical_device_cache_read_size;		/* N/A */
84986d7f5d3SJohn Marino     u_int32_t	physical_device_cache_write_size;		/* N/A */
85086d7f5d3SJohn Marino     u_int32_t	logical_device_reads;				/* N/A */
85186d7f5d3SJohn Marino     u_int32_t	logical_device_writes;				/* N/A */
85286d7f5d3SJohn Marino     u_int32_t	logical_device_read_size;			/* N/A */
85386d7f5d3SJohn Marino     u_int32_t	logical_device_write_size;			/* N/A */
85486d7f5d3SJohn Marino     u_int32_t	logical_device_cache_reads;			/* N/A */
85586d7f5d3SJohn Marino     u_int32_t	logical_device_cache_writes;			/* N/A */
85686d7f5d3SJohn Marino     u_int32_t	logical_device_cache_read_size;			/* N/A */
85786d7f5d3SJohn Marino     u_int32_t	logical_device_cache_write_size;		/* N/A */
85886d7f5d3SJohn Marino     u_int16_t	target_physical_device_commands_active;		/* N/A */
85986d7f5d3SJohn Marino     u_int16_t	target_physical_device_commands_waiting;	/* N/A */
86086d7f5d3SJohn Marino     u_int16_t	host_system_commands_active;			/* N/A */
86186d7f5d3SJohn Marino     u_int16_t	host_system_commands_waiting;			/* N/A */
86286d7f5d3SJohn Marino     u_int8_t	res4[48 + 64];					/* N/A */
86386d7f5d3SJohn Marino } __packed;
86486d7f5d3SJohn Marino 
86586d7f5d3SJohn Marino /*
86686d7f5d3SJohn Marino  * 21.2 MDACIOCTL_SETRAIDDEVSTATE
86786d7f5d3SJohn Marino  */
86886d7f5d3SJohn Marino struct mly_ioctl_param_setraiddevstate {
86986d7f5d3SJohn Marino     u_int8_t	state;
87086d7f5d3SJohn Marino } __packed;
87186d7f5d3SJohn Marino 
87286d7f5d3SJohn Marino /*
87386d7f5d3SJohn Marino  * 21.27.2 MDACIOCTL_GETBDT_FOR_SYSDRIVE: Data Format
87486d7f5d3SJohn Marino  */
87586d7f5d3SJohn Marino #define MLY_MAX_BDT_ENTRIES	1022
87686d7f5d3SJohn Marino struct mly_ioctl_getbdt_for_sysdrive {
87786d7f5d3SJohn Marino     u_int32_t	num_of_bdt_entries;
87886d7f5d3SJohn Marino     u_int32_t	bad_data_block_address[MLY_MAX_BDT_ENTRIES];
87986d7f5d3SJohn Marino } __packed;
88086d7f5d3SJohn Marino 
88186d7f5d3SJohn Marino /*
88286d7f5d3SJohn Marino  * 22.1 Physical Device Definition (PDD)
88386d7f5d3SJohn Marino  */
88486d7f5d3SJohn Marino struct mly_pdd {
88586d7f5d3SJohn Marino     u_int8_t	type;				/* see 8.2 */
88686d7f5d3SJohn Marino     u_int8_t	state;				/* see 8.1 */
88786d7f5d3SJohn Marino     u_int16_t	raid_device;
88886d7f5d3SJohn Marino     u_int32_t	device_size;			/* XXX "block or MB" Huh? */
88986d7f5d3SJohn Marino     u_int8_t	controller;
89086d7f5d3SJohn Marino     u_int8_t	channel;
89186d7f5d3SJohn Marino     u_int8_t	target;
89286d7f5d3SJohn Marino     u_int8_t	lun;
89386d7f5d3SJohn Marino     u_int32_t	start_address;
89486d7f5d3SJohn Marino } __packed;
89586d7f5d3SJohn Marino 
89686d7f5d3SJohn Marino /*
89786d7f5d3SJohn Marino  * 22.2 RAID Device Use Definition (UDD)
89886d7f5d3SJohn Marino  */
89986d7f5d3SJohn Marino struct mly_udd {
90086d7f5d3SJohn Marino     u_int8_t	res1;
90186d7f5d3SJohn Marino     u_int8_t	state;				/* see 8.1 */
90286d7f5d3SJohn Marino     u_int16_t	raid_device;
90386d7f5d3SJohn Marino     u_int32_t	start_address;
90486d7f5d3SJohn Marino } __packed;
90586d7f5d3SJohn Marino 
90686d7f5d3SJohn Marino /*
90786d7f5d3SJohn Marino  * RAID Device Definition (LDD)
90886d7f5d3SJohn Marino  */
90986d7f5d3SJohn Marino struct mly_ldd {
91086d7f5d3SJohn Marino     u_int8_t	type;				/* see 8.2 */
91186d7f5d3SJohn Marino     u_int8_t	state;				/* see 8.1 */
91286d7f5d3SJohn Marino     u_int16_t	raid_device;
91386d7f5d3SJohn Marino     u_int32_t	device_size;			/* XXX "block or MB" Huh? */
91486d7f5d3SJohn Marino     u_int8_t	devices_used_count;
91586d7f5d3SJohn Marino     u_int8_t	stripe_size;			/* see 8.3 */
91686d7f5d3SJohn Marino     u_int8_t	cache_line_size;		/* see 8.4 */
91786d7f5d3SJohn Marino     u_int8_t	read_write_control;		/* see 8.5 */
91886d7f5d3SJohn Marino     u_int32_t	devices_used_size;		/* XXX "block or MB" Huh? */
91986d7f5d3SJohn Marino     u_int16_t	devices_used[32];		/* XXX actual size of this field unknown! */
92086d7f5d3SJohn Marino } __packed;
92186d7f5d3SJohn Marino 
92286d7f5d3SJohn Marino /*
92386d7f5d3SJohn Marino  * Define a datastructure giving the smallest allocation that will hold
92486d7f5d3SJohn Marino  * a PDD, UDD or LDD for MDACIOCTL_GETDEVCONFINFO.
92586d7f5d3SJohn Marino  */
92686d7f5d3SJohn Marino struct mly_devconf_hdr {
92786d7f5d3SJohn Marino     u_int8_t	type;				/* see 8.2 */
92886d7f5d3SJohn Marino     u_int8_t	state;				/* see 8.1 */
92986d7f5d3SJohn Marino     u_int16_t	raid_device;
93086d7f5d3SJohn Marino };
93186d7f5d3SJohn Marino 
93286d7f5d3SJohn Marino union mly_ioctl_devconfinfo {
93386d7f5d3SJohn Marino     struct mly_pdd		pdd;
93486d7f5d3SJohn Marino     struct mly_udd		udd;
93586d7f5d3SJohn Marino     struct mly_ldd		ldd;
93686d7f5d3SJohn Marino     struct mly_devconf_hdr	hdr;
93786d7f5d3SJohn Marino };
93886d7f5d3SJohn Marino 
93986d7f5d3SJohn Marino /*
94086d7f5d3SJohn Marino  * 22.3 MDACIOCTL_RENAMERAIDDEV
94186d7f5d3SJohn Marino  *
94286d7f5d3SJohn Marino  * XXX this command is listed as transferring data, but does not define the data.
94386d7f5d3SJohn Marino  */
94486d7f5d3SJohn Marino struct mly_ioctl_param_renameraiddev {
94586d7f5d3SJohn Marino     u_int8_t	new_raid_device;
94686d7f5d3SJohn Marino } __packed;
94786d7f5d3SJohn Marino 
94886d7f5d3SJohn Marino /*
94986d7f5d3SJohn Marino  * 23.6.2 MDACIOCTL_XLATEPHYSDEVTORAIDDEV
95086d7f5d3SJohn Marino  *
95186d7f5d3SJohn Marino  * XXX documentation suggests this format will change
95286d7f5d3SJohn Marino  */
95386d7f5d3SJohn Marino struct mly_ioctl_param_xlatephysdevtoraiddev {
95486d7f5d3SJohn Marino     u_int16_t	raid_device;
95586d7f5d3SJohn Marino     u_int8_t	res1[2];
95686d7f5d3SJohn Marino     u_int8_t	controller;
95786d7f5d3SJohn Marino     u_int8_t	channel;
95886d7f5d3SJohn Marino     u_int8_t	target;
95986d7f5d3SJohn Marino     u_int8_t	lun;
96086d7f5d3SJohn Marino } __packed;
96186d7f5d3SJohn Marino 
96286d7f5d3SJohn Marino /*
96386d7f5d3SJohn Marino  * 23.7 MDACIOCTL_GETGROUPCONFINFO
96486d7f5d3SJohn Marino  */
96586d7f5d3SJohn Marino struct mly_ioctl_param_getgroupconfinfo {
96686d7f5d3SJohn Marino     u_int16_t			group;
96786d7f5d3SJohn Marino     u_int8_t			res1[8];
96886d7f5d3SJohn Marino     union mly_command_transfer	transfer;
96986d7f5d3SJohn Marino } __packed;
97086d7f5d3SJohn Marino 
97186d7f5d3SJohn Marino /*
97286d7f5d3SJohn Marino  * 23.9.2 MDACIOCTL_GETFREESPACELIST: Data Format
97386d7f5d3SJohn Marino  *
97486d7f5d3SJohn Marino  * The controller will populate as much of this structure as is provided,
97586d7f5d3SJohn Marino  * or as is required to fully list the free space available.
97686d7f5d3SJohn Marino  */
97786d7f5d3SJohn Marino struct mly_ioctl_getfreespacelist_entry {
97886d7f5d3SJohn Marino     u_int16_t	raid_device;
97986d7f5d3SJohn Marino     u_int8_t	res1[6];
98086d7f5d3SJohn Marino     u_int32_t	address;		/* XXX "blocks or MB" Huh? */
98186d7f5d3SJohn Marino     u_int32_t	size;			/* XXX "blocks or MB" Huh? */
98286d7f5d3SJohn Marino } __packed;
98386d7f5d3SJohn Marino 
98486d7f5d3SJohn Marino struct mly_ioctl_getfrespacelist {
98586d7f5d3SJohn Marino     u_int16_t	returned_entries;
98686d7f5d3SJohn Marino     u_int16_t	total_entries;
98786d7f5d3SJohn Marino     u_int8_t	res1[12];
98886d7f5d3SJohn Marino     struct mly_ioctl_getfreespacelist_entry space[0];	/* expand to suit */
98986d7f5d3SJohn Marino } __packed;
99086d7f5d3SJohn Marino 
99186d7f5d3SJohn Marino /*
99286d7f5d3SJohn Marino  * 27.1 MDACIOCTL_GETSUBSYSTEMDATA
99386d7f5d3SJohn Marino  * 27.2 MDACIOCTL_SETSUBSYSTEMDATA
99486d7f5d3SJohn Marino  *
99586d7f5d3SJohn Marino  * PCI controller only supports a limited subset of the possible operations.
99686d7f5d3SJohn Marino  *
99786d7f5d3SJohn Marino  * XXX where does the status end up? (the command transfers no data)
99886d7f5d3SJohn Marino  */
99986d7f5d3SJohn Marino struct mly_ioctl_param_subsystemdata {
100086d7f5d3SJohn Marino     u_int8_t	operation:4;
100186d7f5d3SJohn Marino #define MLY_BBU_GETSTATUS	0x00
100286d7f5d3SJohn Marino #define MLY_BBU_SET_THRESHOLD	0x00	/* minutes in param[0,1] */
100386d7f5d3SJohn Marino     u_int8_t	subsystem:4;
100486d7f5d3SJohn Marino #define MLY_SUBSYSTEM_BBU	0x01
100586d7f5d3SJohn Marino     u_int	parameter[3];		/* only for SETSUBSYSTEMDATA */
100686d7f5d3SJohn Marino } __packed;
100786d7f5d3SJohn Marino 
100886d7f5d3SJohn Marino struct mly_ioctl_getsubsystemdata_bbustatus {
100986d7f5d3SJohn Marino     u_int16_t	current_power;
101086d7f5d3SJohn Marino     u_int16_t	maximum_power;
101186d7f5d3SJohn Marino     u_int16_t	power_threshold;
101286d7f5d3SJohn Marino     u_int8_t	charge_level;
101386d7f5d3SJohn Marino     u_int8_t	hardware_version;
101486d7f5d3SJohn Marino     u_int8_t	battery_type;
101586d7f5d3SJohn Marino #define MLY_BBU_TYPE_UNKNOWN	0x00
101686d7f5d3SJohn Marino #define MLY_BBU_TYPE_NICAD	0x01
101786d7f5d3SJohn Marino #define MLY_BBU_TYPE_MISSING	0xfe
101886d7f5d3SJohn Marino     u_int8_t	res1;
101986d7f5d3SJohn Marino     u_int8_t	operation_status;
102086d7f5d3SJohn Marino #define MLY_BBU_STATUS_NO_SYNC		0x01
102186d7f5d3SJohn Marino #define MLY_BBU_STATUS_OUT_OF_SYNC	0x02
102286d7f5d3SJohn Marino #define MLY_BBU_STATUS_FIRST_WARNING	0x04
102386d7f5d3SJohn Marino #define MLY_BBU_STATUS_SECOND_WARNING	0x08
102486d7f5d3SJohn Marino #define MLY_BBU_STATUS_RECONDITIONING	0x10
102586d7f5d3SJohn Marino #define MLY_BBU_STATUS_DISCHARGING	0x20
102686d7f5d3SJohn Marino #define MLY_BBU_STATUS_FASTCHARGING	0x40
102786d7f5d3SJohn Marino     u_int8_t	res2;
102886d7f5d3SJohn Marino } __packed;
102986d7f5d3SJohn Marino 
103086d7f5d3SJohn Marino /*
103186d7f5d3SJohn Marino  * 28.9  MDACIOCTL_RESETDEVICE
103286d7f5d3SJohn Marino  * 28.10 MDACIOCTL_FLUSHDEVICEDATA
103386d7f5d3SJohn Marino  * 28.11 MDACIOCTL_PAUSEDEVICE
103486d7f5d3SJohn Marino  * 28.12 MDACIOCTL_UNPAUSEDEVICE
103586d7f5d3SJohn Marino  */
103686d7f5d3SJohn Marino struct mly_ioctl_param_deviceoperation {
103786d7f5d3SJohn Marino     u_int8_t	operation_device;		/* see 14.3 */
103886d7f5d3SJohn Marino } __packed;
103986d7f5d3SJohn Marino 
104086d7f5d3SJohn Marino /*
104186d7f5d3SJohn Marino  * 31.1 Event Data Format
104286d7f5d3SJohn Marino  */
104386d7f5d3SJohn Marino struct mly_event {
104486d7f5d3SJohn Marino     u_int32_t	sequence_number;
104586d7f5d3SJohn Marino     u_int32_t	timestamp;
104686d7f5d3SJohn Marino     u_int32_t	code;
104786d7f5d3SJohn Marino     u_int8_t	controller;
104886d7f5d3SJohn Marino     u_int8_t	channel;
104986d7f5d3SJohn Marino     u_int8_t	target;				/* also enclosure */
105086d7f5d3SJohn Marino     u_int8_t	lun;				/* also enclosure unit */
105186d7f5d3SJohn Marino     u_int8_t   	res1[4];
105286d7f5d3SJohn Marino     u_int32_t	param;
105386d7f5d3SJohn Marino     u_int8_t	sense[40];
105486d7f5d3SJohn Marino } __packed;
105586d7f5d3SJohn Marino 
105686d7f5d3SJohn Marino /*
105786d7f5d3SJohn Marino  * 31.2 MDACIOCTL_GETEVENT
105886d7f5d3SJohn Marino  */
105986d7f5d3SJohn Marino struct mly_ioctl_param_getevent {
106086d7f5d3SJohn Marino     u_int16_t			sequence_number_low;
106186d7f5d3SJohn Marino     u_int8_t			res1[8];
106286d7f5d3SJohn Marino     union mly_command_transfer	transfer;
106386d7f5d3SJohn Marino } __packed;
106486d7f5d3SJohn Marino 
106586d7f5d3SJohn Marino union mly_ioctl_param {
106686d7f5d3SJohn Marino     struct mly_ioctl_param_data				data;
106786d7f5d3SJohn Marino     struct mly_ioctl_param_setmemorymailbox		setmemorymailbox;
106886d7f5d3SJohn Marino     struct mly_ioctl_param_setraiddevstate		setraiddevstate;
106986d7f5d3SJohn Marino     struct mly_ioctl_param_renameraiddev		renameraiddev;
107086d7f5d3SJohn Marino     struct mly_ioctl_param_xlatephysdevtoraiddev	xlatephysdevtoraiddev;
107186d7f5d3SJohn Marino     struct mly_ioctl_param_getgroupconfinfo		getgroupconfinfo;
107286d7f5d3SJohn Marino     struct mly_ioctl_param_subsystemdata		subsystemdata;
107386d7f5d3SJohn Marino     struct mly_ioctl_param_deviceoperation		deviceoperation;
107486d7f5d3SJohn Marino     struct mly_ioctl_param_getevent			getevent;
107586d7f5d3SJohn Marino };
107686d7f5d3SJohn Marino 
107786d7f5d3SJohn Marino /*
107886d7f5d3SJohn Marino  * 19 SCSI Command Format
107986d7f5d3SJohn Marino  */
108086d7f5d3SJohn Marino struct mly_command_address_physical {
108186d7f5d3SJohn Marino     u_int8_t			lun;
108286d7f5d3SJohn Marino     u_int8_t			target;
108386d7f5d3SJohn Marino     u_int8_t			channel:3;
108486d7f5d3SJohn Marino     u_int8_t			controller:5;
108586d7f5d3SJohn Marino } __packed;
108686d7f5d3SJohn Marino 
108786d7f5d3SJohn Marino struct mly_command_address_logical {
108886d7f5d3SJohn Marino     u_int16_t			logdev;
108986d7f5d3SJohn Marino     u_int8_t			res1:3;
109086d7f5d3SJohn Marino     u_int8_t			controller:5;
109186d7f5d3SJohn Marino } __packed;
109286d7f5d3SJohn Marino 
109386d7f5d3SJohn Marino union mly_command_address {
109486d7f5d3SJohn Marino     struct mly_command_address_physical	phys;
109586d7f5d3SJohn Marino     struct mly_command_address_logical	log;
109686d7f5d3SJohn Marino };
109786d7f5d3SJohn Marino 
109886d7f5d3SJohn Marino struct mly_command_generic {
109986d7f5d3SJohn Marino     u_int16_t			command_id;
110086d7f5d3SJohn Marino     u_int8_t			opcode;
110186d7f5d3SJohn Marino     struct mly_command_control	command_control;
110286d7f5d3SJohn Marino     u_int32_t			data_size;
110386d7f5d3SJohn Marino     u_int64_t			sense_buffer_address;
110486d7f5d3SJohn Marino     union mly_command_address	addr;
110586d7f5d3SJohn Marino     struct mly_timeout		timeout;
110686d7f5d3SJohn Marino     u_int8_t			maximum_sense_size;
110786d7f5d3SJohn Marino     u_int8_t			res1[11];
110886d7f5d3SJohn Marino     union mly_command_transfer	transfer;
110986d7f5d3SJohn Marino } __packed;
111086d7f5d3SJohn Marino 
111186d7f5d3SJohn Marino 
111286d7f5d3SJohn Marino /*
111386d7f5d3SJohn Marino  * 19.1 MDACMD_SCSI & MDACMD_SCSIPT
111486d7f5d3SJohn Marino  */
111586d7f5d3SJohn Marino #define MLY_CMD_SCSI_SMALL_CDB	10
111686d7f5d3SJohn Marino struct mly_command_scsi_small {
111786d7f5d3SJohn Marino     u_int16_t			command_id;
111886d7f5d3SJohn Marino     u_int8_t			opcode;
111986d7f5d3SJohn Marino     struct mly_command_control	command_control;
112086d7f5d3SJohn Marino     u_int32_t			data_size;
112186d7f5d3SJohn Marino     u_int64_t			sense_buffer_address;
112286d7f5d3SJohn Marino     union mly_command_address	addr;
112386d7f5d3SJohn Marino     struct mly_timeout		timeout;
112486d7f5d3SJohn Marino     u_int8_t			maximum_sense_size;
112586d7f5d3SJohn Marino     u_int8_t			cdb_length;
112686d7f5d3SJohn Marino     u_int8_t			cdb[MLY_CMD_SCSI_SMALL_CDB];
112786d7f5d3SJohn Marino     union mly_command_transfer	transfer;
112886d7f5d3SJohn Marino } __packed;
112986d7f5d3SJohn Marino 
113086d7f5d3SJohn Marino /*
113186d7f5d3SJohn Marino  * 19.2 MDACMD_SCSILC & MDACMD_SCSILCPT
113286d7f5d3SJohn Marino  */
113386d7f5d3SJohn Marino struct mly_command_scsi_large {
113486d7f5d3SJohn Marino     u_int16_t			command_id;
113586d7f5d3SJohn Marino     u_int8_t			opcode;
113686d7f5d3SJohn Marino     struct mly_command_control	command_control;
113786d7f5d3SJohn Marino     u_int32_t			data_size;
113886d7f5d3SJohn Marino     u_int64_t			sense_buffer_address;
113986d7f5d3SJohn Marino     union mly_command_address	addr;
114086d7f5d3SJohn Marino     struct mly_timeout		timeout;
114186d7f5d3SJohn Marino     u_int8_t			maximum_sense_size;
114286d7f5d3SJohn Marino     u_int8_t			cdb_length;
114386d7f5d3SJohn Marino     u_int16_t			res1;
114486d7f5d3SJohn Marino     u_int64_t			cdb_physaddr;
114586d7f5d3SJohn Marino     union mly_command_transfer	transfer;
114686d7f5d3SJohn Marino } __packed;
114786d7f5d3SJohn Marino 
114886d7f5d3SJohn Marino /*
114986d7f5d3SJohn Marino  * 20.1 IOCTL Command Format: Internal Bus
115086d7f5d3SJohn Marino  */
115186d7f5d3SJohn Marino struct mly_command_ioctl {
115286d7f5d3SJohn Marino     u_int16_t			command_id;
115386d7f5d3SJohn Marino     u_int8_t			opcode;
115486d7f5d3SJohn Marino     struct mly_command_control	command_control;
115586d7f5d3SJohn Marino     u_int32_t			data_size;
115686d7f5d3SJohn Marino     u_int64_t			sense_buffer_address;
115786d7f5d3SJohn Marino     union mly_command_address	addr;
115886d7f5d3SJohn Marino     struct mly_timeout		timeout;
115986d7f5d3SJohn Marino     u_int8_t			maximum_sense_size;
116086d7f5d3SJohn Marino     u_int8_t			sub_ioctl;
116186d7f5d3SJohn Marino     union mly_ioctl_param	param;
116286d7f5d3SJohn Marino } __packed;
116386d7f5d3SJohn Marino 
116486d7f5d3SJohn Marino /*
116586d7f5d3SJohn Marino  * PG6: 8.2.2
116686d7f5d3SJohn Marino  */
116786d7f5d3SJohn Marino struct mly_command_mmbox {
116886d7f5d3SJohn Marino     u_int32_t			flag;
116986d7f5d3SJohn Marino     u_int8_t			data[60];
117086d7f5d3SJohn Marino } __packed;
117186d7f5d3SJohn Marino 
117286d7f5d3SJohn Marino union mly_command_packet {
117386d7f5d3SJohn Marino     struct mly_command_generic		generic;
117486d7f5d3SJohn Marino     struct mly_command_scsi_small	scsi_small;
117586d7f5d3SJohn Marino     struct mly_command_scsi_large	scsi_large;
117686d7f5d3SJohn Marino     struct mly_command_ioctl		ioctl;
117786d7f5d3SJohn Marino     struct mly_command_mmbox		mmbox;
117886d7f5d3SJohn Marino };
117986d7f5d3SJohn Marino 
118086d7f5d3SJohn Marino /*
118186d7f5d3SJohn Marino  * PG6: 5.3
118286d7f5d3SJohn Marino  */
118386d7f5d3SJohn Marino #define MLY_I960RX_COMMAND_MAILBOX	0x10
118486d7f5d3SJohn Marino #define MLY_I960RX_STATUS_MAILBOX	0x18
118586d7f5d3SJohn Marino #define MLY_I960RX_IDBR			0x20
118686d7f5d3SJohn Marino #define MLY_I960RX_ODBR			0x2c
118786d7f5d3SJohn Marino #define MLY_I960RX_ERROR_STATUS		0x2e
118886d7f5d3SJohn Marino #define MLY_I960RX_INTERRUPT_STATUS	0x30
118986d7f5d3SJohn Marino #define MLY_I960RX_INTERRUPT_MASK	0x34
119086d7f5d3SJohn Marino 
119186d7f5d3SJohn Marino #define MLY_STRONGARM_COMMAND_MAILBOX	0x50
119286d7f5d3SJohn Marino #define MLY_STRONGARM_STATUS_MAILBOX	0x58
119386d7f5d3SJohn Marino #define MLY_STRONGARM_IDBR		0x60
119486d7f5d3SJohn Marino #define MLY_STRONGARM_ODBR		0x61
119586d7f5d3SJohn Marino #define MLY_STRONGARM_ERROR_STATUS	0x63
119686d7f5d3SJohn Marino #define MLY_STRONGARM_INTERRUPT_STATUS	0x30
119786d7f5d3SJohn Marino #define MLY_STRONGARM_INTERRUPT_MASK	0x34
119886d7f5d3SJohn Marino 
119986d7f5d3SJohn Marino /*
120086d7f5d3SJohn Marino  * PG6: 5.4.3 Doorbell 0
120186d7f5d3SJohn Marino  */
120286d7f5d3SJohn Marino #define MLY_HM_CMDSENT			(1<<0)
120386d7f5d3SJohn Marino #define MLY_HM_STSACK			(1<<1)
120486d7f5d3SJohn Marino #define MLY_SOFT_RST			(1<<3)
120586d7f5d3SJohn Marino #define MLY_AM_CMDSENT			(1<<4)
120686d7f5d3SJohn Marino 
120786d7f5d3SJohn Marino /*
120886d7f5d3SJohn Marino  * PG6: 5.4.4 Doorbell 1
120986d7f5d3SJohn Marino  *
121086d7f5d3SJohn Marino  * Note that the documentation claims that these bits are set when the
121186d7f5d3SJohn Marino  * status queue(s) are empty, wheras the Linux driver and experience
121286d7f5d3SJohn Marino  * suggest they are set when there is status available.
121386d7f5d3SJohn Marino  */
121486d7f5d3SJohn Marino #define MLY_HM_STSREADY			(1<<0)
121586d7f5d3SJohn Marino #define MLY_AM_STSREADY			(1<<1)
121686d7f5d3SJohn Marino 
121786d7f5d3SJohn Marino /*
121886d7f5d3SJohn Marino  * PG6: 5.4.6 Doorbell 3
121986d7f5d3SJohn Marino  */
122086d7f5d3SJohn Marino #define MLY_MSG_EMPTY			(1<<3)
122186d7f5d3SJohn Marino #define MLY_MSG_SPINUP			0x08
122286d7f5d3SJohn Marino #define MLY_MSG_RACE_RECOVERY_FAIL	0x60
122386d7f5d3SJohn Marino #define MLY_MSG_RACE_IN_PROGRESS	0x70
122486d7f5d3SJohn Marino #define MLY_MSG_RACE_ON_CRITICAL	0xb0
122586d7f5d3SJohn Marino #define MLY_MSG_PARITY_ERROR		0xf0
122686d7f5d3SJohn Marino 
122786d7f5d3SJohn Marino /*
122886d7f5d3SJohn Marino  * PG6: 5.4.8 Outbound Interrupt Mask
122986d7f5d3SJohn Marino  */
123086d7f5d3SJohn Marino #define MLY_INTERRUPT_MASK_DISABLE	0xff
123186d7f5d3SJohn Marino #define MLY_INTERRUPT_MASK_ENABLE	(0xff & ~(1<<2))
123286d7f5d3SJohn Marino 
123386d7f5d3SJohn Marino /*
123486d7f5d3SJohn Marino  * PG6: 8.2 Advanced Mailbox Scheme
123586d7f5d3SJohn Marino  *
123686d7f5d3SJohn Marino  * Note that this must be allocated on a 4k boundary, and all internal
123786d7f5d3SJohn Marino  * fields must also reside on a 4k boundary.
123886d7f5d3SJohn Marino  * We could dynamically size this structure, but the extra effort
123986d7f5d3SJohn Marino  * is probably unjustified.  Note that these buffers do not need to be
124086d7f5d3SJohn Marino  * adjacent - we just group them to simplify allocation of the bus-visible
124186d7f5d3SJohn Marino  * buffer.
124286d7f5d3SJohn Marino  *
124386d7f5d3SJohn Marino  * XXX Note that for some reason, if MLY_MMBOX_COMMANDS is > 64, the controller
124486d7f5d3SJohn Marino  * fails to respond to the command at (MLY_MMBOX_COMMANDS - 64).  It's not
124586d7f5d3SJohn Marino  * wrapping to 0 at this point (determined by experimentation).  This is not
124686d7f5d3SJohn Marino  * consistent with the Linux driver's implementation.
124786d7f5d3SJohn Marino  * Whilst it's handy to have lots of room for status returns in case we end up
124886d7f5d3SJohn Marino  * being slow getting back to completed commands, it seems unlikely that we
124986d7f5d3SJohn Marino  * would get 64 commands ahead of the controller on the submissions side, so
125086d7f5d3SJohn Marino  * the current workaround is to simply limit the command ring to 64 entries.
125186d7f5d3SJohn Marino  */
125286d7f5d3SJohn Marino union mly_status_packet {
125386d7f5d3SJohn Marino      struct mly_status		status;
125486d7f5d3SJohn Marino      struct {
125586d7f5d3SJohn Marino 	 u_int32_t		flag;
125686d7f5d3SJohn Marino 	 u_int8_t		data[4];
125786d7f5d3SJohn Marino      } __packed mmbox;
125886d7f5d3SJohn Marino };
125986d7f5d3SJohn Marino union mly_health_region {
126086d7f5d3SJohn Marino     struct mly_health_status	status;
126186d7f5d3SJohn Marino     u_int8_t			pad[1024];
126286d7f5d3SJohn Marino };
126386d7f5d3SJohn Marino 
126486d7f5d3SJohn Marino #define MLY_MMBOX_COMMANDS		64
126586d7f5d3SJohn Marino #define MLY_MMBOX_STATUS		512
126686d7f5d3SJohn Marino struct mly_mmbox {
126786d7f5d3SJohn Marino     union mly_command_packet	mmm_command[MLY_MMBOX_COMMANDS];
126886d7f5d3SJohn Marino     union mly_status_packet	mmm_status[MLY_MMBOX_STATUS];
126986d7f5d3SJohn Marino     union mly_health_region	mmm_health;
127086d7f5d3SJohn Marino } __packed;
1271