xref: /freebsd/sys/dev/mlx/mlxreg.h (revision 4f492bfab53a4732222656e2be91c50a2df9e13c)
11ac4b82bSMike Smith /*-
21ac4b82bSMike Smith  * Copyright (c) 1999 Michael Smith
31ac4b82bSMike Smith  * All rights reserved.
41ac4b82bSMike Smith  *
51ac4b82bSMike Smith  * Redistribution and use in source and binary forms, with or without
61ac4b82bSMike Smith  * modification, are permitted provided that the following conditions
71ac4b82bSMike Smith  * are met:
81ac4b82bSMike Smith  * 1. Redistributions of source code must retain the above copyright
91ac4b82bSMike Smith  *    notice, this list of conditions and the following disclaimer.
101ac4b82bSMike Smith  * 2. Redistributions in binary form must reproduce the above copyright
111ac4b82bSMike Smith  *    notice, this list of conditions and the following disclaimer in the
121ac4b82bSMike Smith  *    documentation and/or other materials provided with the distribution.
131ac4b82bSMike Smith  *
141ac4b82bSMike Smith  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
151ac4b82bSMike Smith  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
161ac4b82bSMike Smith  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
171ac4b82bSMike Smith  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
181ac4b82bSMike Smith  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
191ac4b82bSMike Smith  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
201ac4b82bSMike Smith  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
211ac4b82bSMike Smith  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
221ac4b82bSMike Smith  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
231ac4b82bSMike Smith  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
241ac4b82bSMike Smith  * SUCH DAMAGE.
251ac4b82bSMike Smith  *
261ac4b82bSMike Smith  *	$FreeBSD$
271ac4b82bSMike Smith  */
281ac4b82bSMike Smith 
294b006d7bSMike Smith #define MLX_BLKSIZE	512		/* fixed feature */
304b006d7bSMike Smith 
311ac4b82bSMike Smith /*
321ac4b82bSMike Smith  * Selected command codes.
331ac4b82bSMike Smith  */
34da8bb3a3SMike Smith #define MLX_CMD_ENQUIRY_OLD	0x05
351ac4b82bSMike Smith #define MLX_CMD_ENQUIRY		0x53
361ac4b82bSMike Smith #define MLX_CMD_ENQUIRY2	0x1c
371ac4b82bSMike Smith #define MLX_CMD_ENQSYSDRIVE	0x19
38da8bb3a3SMike Smith #define MLX_CMD_READSG		0xb6
39da8bb3a3SMike Smith #define MLX_CMD_WRITESG		0xb7
40da8bb3a3SMike Smith #define MLX_CMD_READSG_OLD	0x82
41da8bb3a3SMike Smith #define MLX_CMD_WRITESG_OLD	0x83
421ac4b82bSMike Smith #define MLX_CMD_FLUSH		0x0a
431ac4b82bSMike Smith #define MLX_CMD_LOGOP		0x72
441ac4b82bSMike Smith #define MLX_CMD_REBUILDASYNC	0x16
451ac4b82bSMike Smith #define MLX_CMD_CHECKASYNC	0x1e
461ac4b82bSMike Smith #define MLX_CMD_REBUILDSTAT	0x0c
471ac4b82bSMike Smith #define MLX_CMD_STOPCHANNEL	0x13
481ac4b82bSMike Smith #define MLX_CMD_STARTCHANNEL	0x12
49da8bb3a3SMike Smith #define MLX_CMD_READ_CONFIG	0x4e
50da8bb3a3SMike Smith #define MLX_CMD_DIRECT_CDB	0x04
51421f2f7dSMike Smith #define MLX_CMD_DEVICE_STATE	0x50
52da8bb3a3SMike Smith 
53da8bb3a3SMike Smith #ifdef _KERNEL
54da8bb3a3SMike Smith 
55da8bb3a3SMike Smith #define MLX_CFG_BASE0   0x10		/* first region */
56da8bb3a3SMike Smith #define MLX_CFG_BASE1   0x14		/* second region (type 3 only) */
571ac4b82bSMike Smith 
581ac4b82bSMike Smith /*
591ac4b82bSMike Smith  * Status values.
601ac4b82bSMike Smith  */
611ac4b82bSMike Smith #define MLX_STATUS_OK		0x0000
621ac4b82bSMike Smith #define MLX_STATUS_RDWROFFLINE	0x0002	/* read/write claims drive is offline */
631ac4b82bSMike Smith #define MLX_STATUS_WEDGED	0xdead	/* controller not listening */
645792b7feSMike Smith #define MLX_STATUS_LOST		0xbeef	/* never came back */
651ac4b82bSMike Smith #define MLX_STATUS_BUSY		0xffff	/* command is in controller */
661ac4b82bSMike Smith 
671ac4b82bSMike Smith /*
68f6b84b08SMike Smith  * Accessor defines for the V3 interface.
69f6b84b08SMike Smith  */
70f6b84b08SMike Smith #define MLX_V3_MAILBOX		0x00
71f6b84b08SMike Smith #define	MLX_V3_STATUS_IDENT	0x0d
72f6b84b08SMike Smith #define MLX_V3_STATUS		0x0e
73f6b84b08SMike Smith #define MLX_V3_IDBR		0x40
74f6b84b08SMike Smith #define MLX_V3_ODBR		0x41
75f6b84b08SMike Smith #define MLX_V3_IER		0x43
76da8bb3a3SMike Smith #define MLX_V3_FWERROR		0x3f
77da8bb3a3SMike Smith #define MLX_V3_FWERROR_PARAM1	0x00
78da8bb3a3SMike Smith #define MLX_V3_FWERROR_PARAM2	0x01
79f6b84b08SMike Smith 
80f6b84b08SMike Smith #define MLX_V3_PUT_MAILBOX(sc, idx, val) bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_MAILBOX + idx, val)
81f6b84b08SMike Smith #define MLX_V3_GET_STATUS_IDENT(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_STATUS_IDENT)
82f6b84b08SMike Smith #define MLX_V3_GET_STATUS(sc)		 bus_space_read_2 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_STATUS)
83f6b84b08SMike Smith #define MLX_V3_GET_IDBR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_IDBR)
84f6b84b08SMike Smith #define MLX_V3_PUT_IDBR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_IDBR, val)
85f6b84b08SMike Smith #define MLX_V3_GET_ODBR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_ODBR)
86f6b84b08SMike Smith #define MLX_V3_PUT_ODBR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_ODBR, val)
87f6b84b08SMike Smith #define MLX_V3_PUT_IER(sc, val)		 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_IER, val)
88da8bb3a3SMike Smith #define MLX_V3_GET_FWERROR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_FWERROR)
89da8bb3a3SMike Smith #define MLX_V3_PUT_FWERROR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_FWERROR, val)
90da8bb3a3SMike Smith #define MLX_V3_GET_FWERROR_PARAM1(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_FWERROR_PARAM1)
91da8bb3a3SMike Smith #define MLX_V3_GET_FWERROR_PARAM2(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_FWERROR_PARAM2)
92f6b84b08SMike Smith 
93f6b84b08SMike Smith #define MLX_V3_IDB_FULL		(1<<0)		/* mailbox is full */
94da8bb3a3SMike Smith #define MLX_V3_IDB_INIT_BUSY	(1<<1)		/* initialisation in progress */
95da8bb3a3SMike Smith 
96f6b84b08SMike Smith #define MLX_V3_IDB_SACK		(1<<1)		/* acknowledge status read */
97f6b84b08SMike Smith 
98f6b84b08SMike Smith #define MLX_V3_ODB_SAVAIL	(1<<0)		/* status is available */
99f6b84b08SMike Smith 
100da8bb3a3SMike Smith #define MLX_V3_FWERROR_PEND	(1<<2)		/* firmware error pending */
101da8bb3a3SMike Smith 
102f6b84b08SMike Smith /*
103f6b84b08SMike Smith  * Accessor defines for the V4 interface.
104f6b84b08SMike Smith  */
105f6b84b08SMike Smith #define MLX_V4_MAILBOX		0x1000
106da8bb3a3SMike Smith #define MLX_V4_MAILBOX_LENGTH		16
107f6b84b08SMike Smith #define MLX_V4_STATUS_IDENT	0x1018
108f6b84b08SMike Smith #define MLX_V4_STATUS		0x101a
109f6b84b08SMike Smith #define MLX_V4_IDBR		0x0020
110f6b84b08SMike Smith #define MLX_V4_ODBR		0x002c
111f6b84b08SMike Smith #define MLX_V4_IER		0x0034
112da8bb3a3SMike Smith #define MLX_V4_FWERROR		0x103f
113da8bb3a3SMike Smith #define MLX_V4_FWERROR_PARAM1	0x1000
114da8bb3a3SMike Smith #define MLX_V4_FWERROR_PARAM2	0x1001
115f6b84b08SMike Smith 
116f6b84b08SMike Smith /* use longword access? */
117f6b84b08SMike Smith #define MLX_V4_PUT_MAILBOX(sc, idx, val) bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_MAILBOX + idx, val)
118f6b84b08SMike Smith #define MLX_V4_GET_STATUS_IDENT(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_STATUS_IDENT)
119f6b84b08SMike Smith #define MLX_V4_GET_STATUS(sc)		 bus_space_read_2 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_STATUS)
120f6b84b08SMike Smith #define MLX_V4_GET_IDBR(sc)		 bus_space_read_4 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_IDBR)
121f6b84b08SMike Smith #define MLX_V4_PUT_IDBR(sc, val)	 bus_space_write_4(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_IDBR, val)
122f6b84b08SMike Smith #define MLX_V4_GET_ODBR(sc)		 bus_space_read_4 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_ODBR)
123f6b84b08SMike Smith #define MLX_V4_PUT_ODBR(sc, val)	 bus_space_write_4(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_ODBR, val)
124f6b84b08SMike Smith #define MLX_V4_PUT_IER(sc, val)		 bus_space_write_4(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_IER, val)
125da8bb3a3SMike Smith #define MLX_V4_GET_FWERROR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_FWERROR)
126da8bb3a3SMike Smith #define MLX_V4_PUT_FWERROR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_FWERROR, val)
127da8bb3a3SMike Smith #define MLX_V4_GET_FWERROR_PARAM1(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_FWERROR_PARAM1)
128da8bb3a3SMike Smith #define MLX_V4_GET_FWERROR_PARAM2(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_FWERROR_PARAM2)
129f6b84b08SMike Smith 
130f6b84b08SMike Smith #define MLX_V4_IDB_FULL		(1<<0)		/* mailbox is full */
131da8bb3a3SMike Smith #define MLX_V4_IDB_INIT_BUSY	(1<<1)		/* initialisation in progress */
132f6b84b08SMike Smith 
133f6b84b08SMike Smith #define MLX_V4_IDB_HWMBOX_CMD	(1<<0)		/* posted hardware mailbox command */
134f6b84b08SMike Smith #define MLX_V4_IDB_SACK		(1<<1)		/* acknowledge status read */
135f6b84b08SMike Smith #define MLX_V4_IDB_MEMMBOX_CMD	(1<<4)		/* posted memory mailbox command */
136f6b84b08SMike Smith 
137f6b84b08SMike Smith #define MLX_V4_ODB_HWSAVAIL	(1<<0)		/* status is available for hardware mailbox */
138f6b84b08SMike Smith #define MLX_V4_ODB_MEMSAVAIL	(1<<1)		/* status is available for memory mailbox */
139f6b84b08SMike Smith 
140f6b84b08SMike Smith #define MLX_V4_ODB_HWMBOX_ACK	(1<<0)		/* ack status read from hardware mailbox */
141f6b84b08SMike Smith #define MLX_V4_ODB_MEMMBOX_ACK	(1<<1)		/* ack status read from memory mailbox */
142f6b84b08SMike Smith 
143f6b84b08SMike Smith #define MLX_V4_IER_MASK		0xfb		/* message unit interrupt mask */
144f6b84b08SMike Smith #define MLX_V4_IER_DISINT	(1<<2)		/* interrupt disable bit */
145f6b84b08SMike Smith 
146da8bb3a3SMike Smith #define MLX_V4_FWERROR_PEND	(1<<2)		/* firmware error pending */
147da8bb3a3SMike Smith 
148f6b84b08SMike Smith /*
1495792b7feSMike Smith  * Accessor defines for the V5 interface
1505792b7feSMike Smith  */
1515792b7feSMike Smith #define MLX_V5_MAILBOX		0x50
152da8bb3a3SMike Smith #define MLX_V5_MAILBOX_LENGTH		16
1535792b7feSMike Smith #define MLX_V5_STATUS_IDENT	0x5d
1545792b7feSMike Smith #define MLX_V5_STATUS		0x5e
1555792b7feSMike Smith #define MLX_V5_IDBR		0x60
1565792b7feSMike Smith #define MLX_V5_ODBR		0x61
1575792b7feSMike Smith #define MLX_V5_IER		0x34
158da8bb3a3SMike Smith #define MLX_V5_FWERROR		0x63
159da8bb3a3SMike Smith #define MLX_V5_FWERROR_PARAM1	0x50
160da8bb3a3SMike Smith #define MLX_V5_FWERROR_PARAM2	0x51
1615792b7feSMike Smith 
1625792b7feSMike Smith #define MLX_V5_PUT_MAILBOX(sc, idx, val) bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V5_MAILBOX + idx, val)
1635792b7feSMike Smith #define MLX_V5_GET_STATUS_IDENT(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_STATUS_IDENT)
1645792b7feSMike Smith #define MLX_V5_GET_STATUS(sc)		 bus_space_read_2 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_STATUS)
1655792b7feSMike Smith #define MLX_V5_GET_IDBR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_IDBR)
1665792b7feSMike Smith #define MLX_V5_PUT_IDBR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V5_IDBR, val)
1675792b7feSMike Smith #define MLX_V5_GET_ODBR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_ODBR)
1685792b7feSMike Smith #define MLX_V5_PUT_ODBR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V5_ODBR, val)
1695792b7feSMike Smith #define MLX_V5_PUT_IER(sc, val)		 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V5_IER, val)
170da8bb3a3SMike Smith #define MLX_V5_GET_FWERROR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_FWERROR)
171da8bb3a3SMike Smith #define MLX_V5_PUT_FWERROR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V5_FWERROR, val)
172da8bb3a3SMike Smith #define MLX_V5_GET_FWERROR_PARAM1(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_FWERROR_PARAM1)
173da8bb3a3SMike Smith #define MLX_V5_GET_FWERROR_PARAM2(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V5_FWERROR_PARAM2)
1745792b7feSMike Smith 
1755792b7feSMike Smith #define MLX_V5_IDB_EMPTY	(1<<0)		/* mailbox is empty */
176da8bb3a3SMike Smith #define MLX_V5_IDB_INIT_DONE	(1<<1)		/* initialisation has completed */
1775792b7feSMike Smith 
1785792b7feSMike Smith #define MLX_V5_IDB_HWMBOX_CMD	(1<<0)		/* posted hardware mailbox command */
1795792b7feSMike Smith #define MLX_V5_IDB_SACK		(1<<1)		/* acknowledge status read */
180da8bb3a3SMike Smith #define MLX_V5_IDB_RESET	(1<<3)		/* reset request */
1815792b7feSMike Smith #define MLX_V5_IDB_MEMMBOX_CMD	(1<<4)		/* posted memory mailbox command */
1825792b7feSMike Smith 
1835792b7feSMike Smith #define MLX_V5_ODB_HWSAVAIL	(1<<0)		/* status is available for hardware mailbox */
1845792b7feSMike Smith #define MLX_V5_ODB_MEMSAVAIL	(1<<1)		/* status is available for memory mailbox */
1855792b7feSMike Smith 
1865792b7feSMike Smith #define MLX_V5_ODB_HWMBOX_ACK	(1<<0)		/* ack status read from hardware mailbox */
1875792b7feSMike Smith #define MLX_V5_ODB_MEMMBOX_ACK	(1<<1)		/* ack status read from memory mailbox */
1885792b7feSMike Smith 
1895792b7feSMike Smith #define MLX_V5_IER_DISINT	(1<<2)		/* interrupt disable bit */
1905792b7feSMike Smith 
191da8bb3a3SMike Smith #define MLX_V5_FWERROR_PEND	(1<<2)		/* firmware error pending */
192da8bb3a3SMike Smith 
193da8bb3a3SMike Smith #endif /* _KERNEL */
1945792b7feSMike Smith 
1955792b7feSMike Smith /*
1961ac4b82bSMike Smith  * Scatter-gather list format, type 1, kind 00.
1971ac4b82bSMike Smith  */
1981ac4b82bSMike Smith struct mlx_sgentry
1991ac4b82bSMike Smith {
2001ac4b82bSMike Smith     u_int32_t	sg_addr;
2011ac4b82bSMike Smith     u_int32_t	sg_count;
2024f492bfaSAlfred Perlstein } __packed;
2031ac4b82bSMike Smith 
2041ac4b82bSMike Smith /*
2051ac4b82bSMike Smith  * Command result buffers, as placed in system memory by the controller.
2061ac4b82bSMike Smith  */
207da8bb3a3SMike Smith 
208da8bb3a3SMike Smith struct mlx_enquiry_old	/* MLX_CMD_ENQUIRY_OLD */
209da8bb3a3SMike Smith {
210da8bb3a3SMike Smith     u_int8_t		me_num_sys_drvs;
211da8bb3a3SMike Smith     u_int8_t		res1[3];
212da8bb3a3SMike Smith     u_int32_t		me_drvsize[8];
213da8bb3a3SMike Smith     u_int16_t		me_flash_age;
214da8bb3a3SMike Smith     u_int8_t		me_status_flags;
215da8bb3a3SMike Smith     u_int8_t		me_free_state_change_count;
216da8bb3a3SMike Smith     u_int8_t		me_fwminor;
217da8bb3a3SMike Smith     u_int8_t		me_fwmajor;
218da8bb3a3SMike Smith     u_int8_t		me_rebuild_flag;
219da8bb3a3SMike Smith     u_int8_t		me_max_commands;
220da8bb3a3SMike Smith     u_int8_t		me_offline_sd_count;
221da8bb3a3SMike Smith     u_int8_t		res3;
222da8bb3a3SMike Smith     u_int8_t		me_critical_sd_count;
223da8bb3a3SMike Smith     u_int8_t		res4[3];
224da8bb3a3SMike Smith     u_int8_t		me_dead_count;
225da8bb3a3SMike Smith     u_int8_t		res5;
226da8bb3a3SMike Smith     u_int8_t		me_rebuild_count;
227da8bb3a3SMike Smith     u_int8_t		me_misc_flags;
228da8bb3a3SMike Smith     struct
229da8bb3a3SMike Smith     {
230da8bb3a3SMike Smith 	u_int8_t	dd_targ;
231da8bb3a3SMike Smith 	u_int8_t	dd_chan;
2324f492bfaSAlfred Perlstein     } __packed me_dead[20];
2334f492bfaSAlfred Perlstein } __packed;
234da8bb3a3SMike Smith 
2351ac4b82bSMike Smith struct mlx_enquiry	/* MLX_CMD_ENQUIRY */
2361ac4b82bSMike Smith {
2371ac4b82bSMike Smith     u_int8_t		me_num_sys_drvs;
2381ac4b82bSMike Smith     u_int8_t		res1[3];
2391ac4b82bSMike Smith     u_int32_t		me_drvsize[32];
2401ac4b82bSMike Smith     u_int16_t		me_flash_age;
2411ac4b82bSMike Smith     u_int8_t		me_status_flags;
2421ac4b82bSMike Smith #define MLX_ENQ_SFLAG_DEFWRERR	(1<<0)	/* deferred write error indicator */
2431ac4b82bSMike Smith #define MLX_ENQ_SFLAG_BATTLOW	(1<<1)	/* battery low */
2441ac4b82bSMike Smith     u_int8_t		res2;
2451ac4b82bSMike Smith     u_int8_t		me_fwminor;
2461ac4b82bSMike Smith     u_int8_t		me_fwmajor;
2471ac4b82bSMike Smith     u_int8_t		me_rebuild_flag;
2481ac4b82bSMike Smith     u_int8_t		me_max_commands;
2491ac4b82bSMike Smith     u_int8_t		me_offline_sd_count;
2501ac4b82bSMike Smith     u_int8_t		res3;
2511ac4b82bSMike Smith     u_int16_t		me_event_log_seq_num;
2521ac4b82bSMike Smith     u_int8_t		me_critical_sd_count;
2531ac4b82bSMike Smith     u_int8_t		res4[3];
2541ac4b82bSMike Smith     u_int8_t		me_dead_count;
2551ac4b82bSMike Smith     u_int8_t		res5;
2561ac4b82bSMike Smith     u_int8_t		me_rebuild_count;
2571ac4b82bSMike Smith     u_int8_t		me_misc_flags;
2581ac4b82bSMike Smith #define MLX_ENQ_MISC_BBU	(1<<3)	/* battery backup present */
2591ac4b82bSMike Smith     struct
2601ac4b82bSMike Smith     {
2611ac4b82bSMike Smith 	u_int8_t	dd_targ;
2621ac4b82bSMike Smith 	u_int8_t	dd_chan;
2634f492bfaSAlfred Perlstein     } __packed me_dead[20];
2644f492bfaSAlfred Perlstein } __packed;
2651ac4b82bSMike Smith 
2661ac4b82bSMike Smith struct mlx_enquiry2	/* MLX_CMD_ENQUIRY2 */
2671ac4b82bSMike Smith {
2681ac4b82bSMike Smith     u_int32_t		me_hardware_id;
2691ac4b82bSMike Smith     u_int32_t		me_firmware_id;
2701ac4b82bSMike Smith     u_int32_t		res1;
2711ac4b82bSMike Smith     u_int8_t		me_configured_channels;
2721ac4b82bSMike Smith     u_int8_t		me_actual_channels;
2731ac4b82bSMike Smith     u_int8_t		me_max_targets;
2741ac4b82bSMike Smith     u_int8_t		me_max_tags;
2751ac4b82bSMike Smith     u_int8_t		me_max_sys_drives;
2761ac4b82bSMike Smith     u_int8_t		me_max_arms;
2771ac4b82bSMike Smith     u_int8_t		me_max_spans;
2781ac4b82bSMike Smith     u_int8_t		res2;
2791ac4b82bSMike Smith     u_int32_t		res3;
2801ac4b82bSMike Smith     u_int32_t		me_mem_size;
2811ac4b82bSMike Smith     u_int32_t		me_cache_size;
2821ac4b82bSMike Smith     u_int32_t		me_flash_size;
2831ac4b82bSMike Smith     u_int32_t		me_nvram_size;
2841ac4b82bSMike Smith     u_int16_t		me_mem_type;
2851ac4b82bSMike Smith     u_int16_t		me_clock_speed;
2861ac4b82bSMike Smith     u_int16_t		me_mem_speed;
2871ac4b82bSMike Smith     u_int16_t		me_hardware_speed;
2889eee27f1SMike Smith     u_int8_t		res4[12];
2891ac4b82bSMike Smith     u_int16_t		me_max_commands;
2901ac4b82bSMike Smith     u_int16_t		me_max_sg;
2911ac4b82bSMike Smith     u_int16_t		me_max_dp;
2921ac4b82bSMike Smith     u_int16_t		me_max_iod;
2931ac4b82bSMike Smith     u_int16_t		me_max_comb;
2941ac4b82bSMike Smith     u_int8_t		me_latency;
2951ac4b82bSMike Smith     u_int8_t		res5;
2961ac4b82bSMike Smith     u_int8_t		me_scsi_timeout;
2971ac4b82bSMike Smith     u_int8_t		res6;
2981ac4b82bSMike Smith     u_int16_t		me_min_freelines;
2991ac4b82bSMike Smith     u_int8_t		res7[8];
3001ac4b82bSMike Smith     u_int8_t		me_rate_const;
3011ac4b82bSMike Smith     u_int8_t		res8[11];
3021ac4b82bSMike Smith     u_int16_t		me_physblk;
3031ac4b82bSMike Smith     u_int16_t		me_logblk;
3041ac4b82bSMike Smith     u_int16_t		me_maxblk;
3051ac4b82bSMike Smith     u_int16_t		me_blocking_factor;
3061ac4b82bSMike Smith     u_int16_t		me_cacheline;
3071ac4b82bSMike Smith     u_int8_t		me_scsi_cap;
3081ac4b82bSMike Smith     u_int8_t		res9[5];
3099eee27f1SMike Smith     u_int16_t		me_firmware_build;
3101ac4b82bSMike Smith     u_int8_t		me_fault_mgmt_type;
3111ac4b82bSMike Smith     u_int8_t		res10;
3121ac4b82bSMike Smith     u_int32_t		me_firmware_features;
3131ac4b82bSMike Smith     u_int8_t		res11[8];
3144f492bfaSAlfred Perlstein } __packed;
3151ac4b82bSMike Smith 
3161ac4b82bSMike Smith struct mlx_enq_sys_drive /* MLX_CMD_ENQSYSDRIVE returns an array of 32 of these */
3171ac4b82bSMike Smith {
3181ac4b82bSMike Smith     u_int32_t		sd_size;
3191ac4b82bSMike Smith     u_int8_t		sd_state;
3201ac4b82bSMike Smith     u_int8_t		sd_raidlevel;
3211ac4b82bSMike Smith     u_int16_t		res1;
3224f492bfaSAlfred Perlstein } __packed;
3231ac4b82bSMike Smith 
3241ac4b82bSMike Smith struct mlx_eventlog_entry	/* MLX_CMD_LOGOP/MLX_LOGOP_GET */
3251ac4b82bSMike Smith {
3261ac4b82bSMike Smith     u_int8_t		el_type;
3271ac4b82bSMike Smith     u_int8_t		el_length;
3281ac4b82bSMike Smith     u_char		el_target:5;
3291ac4b82bSMike Smith     u_char		el_channel:3;
3301ac4b82bSMike Smith     u_char		el_lun:6;
3311ac4b82bSMike Smith     u_char		res1:2;
3321ac4b82bSMike Smith     u_int16_t		el_seqno;
3331ac4b82bSMike Smith     u_char		el_errorcode:7;
3341ac4b82bSMike Smith     u_char		el_valid:1;
3351ac4b82bSMike Smith     u_int8_t		el_segment;
3361ac4b82bSMike Smith     u_char		el_sensekey:4;
3371ac4b82bSMike Smith     u_char		res2:1;
3381ac4b82bSMike Smith     u_char		el_ILI:1;
3391ac4b82bSMike Smith     u_char		el_EOM:1;
3401ac4b82bSMike Smith     u_char		el_filemark:1;
3411ac4b82bSMike Smith     u_int8_t		el_information[4];
3421ac4b82bSMike Smith     u_int8_t		el_addsense;
3431ac4b82bSMike Smith     u_int8_t		el_csi[4];
3441ac4b82bSMike Smith     u_int8_t		el_asc;
3451ac4b82bSMike Smith     u_int8_t		el_asq;
3461ac4b82bSMike Smith     u_int8_t		res3[12];
3474f492bfaSAlfred Perlstein } __packed;
3481ac4b82bSMike Smith 
3491ac4b82bSMike Smith #define MLX_LOGOP_GET		0x00	/* operation codes for MLX_CMD_LOGOP */
3501ac4b82bSMike Smith #define MLX_LOGMSG_SENSE	0x00	/* log message contents codes */
3511ac4b82bSMike Smith 
3521ac4b82bSMike Smith struct mlx_rebuild_stat	/* MLX_CMD_REBUILDSTAT */
3531ac4b82bSMike Smith {
3541ac4b82bSMike Smith     u_int32_t	rb_drive;
3551ac4b82bSMike Smith     u_int32_t	rb_size;
3561ac4b82bSMike Smith     u_int32_t	rb_remaining;
3574f492bfaSAlfred Perlstein } __packed;
3581ac4b82bSMike Smith 
359da8bb3a3SMike Smith struct mlx_config2
360da8bb3a3SMike Smith {
361da8bb3a3SMike Smith     u_int16_t	cf_flags1;
362da8bb3a3SMike Smith #define MLX_CF2_ACTV_NEG	(1<<1)
363da8bb3a3SMike Smith #define MLX_CF2_NORSTRTRY	(1<<7)
364da8bb3a3SMike Smith #define MLX_CF2_STRGWRK		(1<<8)
365da8bb3a3SMike Smith #define MLX_CF2_HPSUPP		(1<<9)
366da8bb3a3SMike Smith #define MLX_CF2_NODISCN		(1<<10)
367da8bb3a3SMike Smith #define MLX_CF2_ARM    		(1<<13)
368da8bb3a3SMike Smith #define MLX_CF2_OFM		(1<<15)
369da8bb3a3SMike Smith #define MLX_CF2_AEMI (MLX_CF2_ARM | MLX_CF2_OFM)
370da8bb3a3SMike Smith     u_int8_t	cf_oemid;
371da8bb3a3SMike Smith     u_int8_t	cf_oem_model;
372da8bb3a3SMike Smith     u_int8_t	cf_physical_sector;
373da8bb3a3SMike Smith     u_int8_t	cf_logical_sector;
374da8bb3a3SMike Smith     u_int8_t	cf_blockfactor;
375da8bb3a3SMike Smith     u_int8_t	cf_flags2;
376da8bb3a3SMike Smith #define MLX_CF2_READAH		(1<<0)
377da8bb3a3SMike Smith #define MLX_CF2_BIOSDLY		(1<<1)
378da8bb3a3SMike Smith #define MLX_CF2_REASS1S		(1<<4)
379da8bb3a3SMike Smith #define MLX_CF2_FUAENABL	(1<<6)
380da8bb3a3SMike Smith #define MLX_CF2_R5ALLS		(1<<7)
381da8bb3a3SMike Smith     u_int8_t	cf_rcrate;
382da8bb3a3SMike Smith     u_int8_t	cf_res1;
383da8bb3a3SMike Smith     u_int8_t	cf_blocks_per_cache_line;
384da8bb3a3SMike Smith     u_int8_t	cf_blocks_per_stripe;
385da8bb3a3SMike Smith     u_int8_t	cf_scsi_param_0;
386da8bb3a3SMike Smith     u_int8_t	cf_scsi_param_1;
387da8bb3a3SMike Smith     u_int8_t	cf_scsi_param_2;
388da8bb3a3SMike Smith     u_int8_t	cf_scsi_param_3;
389da8bb3a3SMike Smith     u_int8_t	cf_scsi_param_4;
390da8bb3a3SMike Smith     u_int8_t	cf_scsi_param_5;
391da8bb3a3SMike Smith     u_int8_t	cf_scsi_initiator_id;
392da8bb3a3SMike Smith     u_int8_t	cf_res2;
393da8bb3a3SMike Smith     u_int8_t	cf_startup_mode;
394da8bb3a3SMike Smith     u_int8_t	cf_simultaneous_spinup_devices;
395da8bb3a3SMike Smith     u_int8_t	cf_delay_between_spinups;
396da8bb3a3SMike Smith     u_int8_t	cf_res3;
397da8bb3a3SMike Smith     u_int16_t	cf_checksum;
3984f492bfaSAlfred Perlstein } __packed;
399da8bb3a3SMike Smith 
400da8bb3a3SMike Smith struct mlx_sys_drv_span
401da8bb3a3SMike Smith {
402da8bb3a3SMike Smith     u_int32_t	sp_start_lba;
403da8bb3a3SMike Smith     u_int32_t	sp_nblks;
404da8bb3a3SMike Smith     u_int8_t	sp_arm[8];
4054f492bfaSAlfred Perlstein } __packed;
406da8bb3a3SMike Smith 
407da8bb3a3SMike Smith struct mlx_sys_drv
408da8bb3a3SMike Smith {
409da8bb3a3SMike Smith     u_int8_t	sd_status;
410da8bb3a3SMike Smith     u_int8_t	sd_ext_status;
411da8bb3a3SMike Smith     u_int8_t	sd_mod1;
412da8bb3a3SMike Smith     u_int8_t	sd_mod2;
413da8bb3a3SMike Smith     u_int8_t	sd_raidlevel;
414da8bb3a3SMike Smith #define MLX_SYS_DRV_WRITEBACK	(1<<7)
415da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID0	0
416da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID1	1
417da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID3	3
418da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID5	5
419da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID6	6
420da8bb3a3SMike Smith #define MLX_SYS_DRV_JBOD	7
421da8bb3a3SMike Smith     u_int8_t	sd_valid_arms;
422da8bb3a3SMike Smith     u_int8_t	sd_valid_spans;
423da8bb3a3SMike Smith     u_int8_t	sd_init_state;
424da8bb3a3SMike Smith #define MLX_SYS_DRV_INITTED	0x81;
425da8bb3a3SMike Smith     struct mlx_sys_drv_span sd_span[4];
4264f492bfaSAlfred Perlstein } __packed;
427da8bb3a3SMike Smith 
428da8bb3a3SMike Smith struct mlx_phys_drv
429da8bb3a3SMike Smith {
430da8bb3a3SMike Smith     u_int8_t	pd_flags1;
431da8bb3a3SMike Smith #define	MLX_PHYS_DRV_PRESENT	(1<<0)
432da8bb3a3SMike Smith     u_int8_t	pd_flags2;
433da8bb3a3SMike Smith #define MLX_PHYS_DRV_OTHER	0x00
434da8bb3a3SMike Smith #define MLX_PHYS_DRV_DISK	0x01
435da8bb3a3SMike Smith #define MLX_PHYS_DRV_SEQUENTIAL	0x02
436da8bb3a3SMike Smith #define MLX_PHYS_DRV_CDROM	0x03
437da8bb3a3SMike Smith #define MLX_PHYS_DRV_FAST20	(1<<3)
438da8bb3a3SMike Smith #define MLX_PHYS_DRV_SYNC	(1<<4)
439da8bb3a3SMike Smith #define MLX_PHYS_DRV_FAST	(1<<5)
440da8bb3a3SMike Smith #define MLX_PHYS_DRV_WIDE	(1<<6)
441da8bb3a3SMike Smith #define MLX_PHYS_DRV_TAG	(1<<7)
442da8bb3a3SMike Smith     u_int8_t	pd_status;
443da8bb3a3SMike Smith #define MLX_PHYS_DRV_DEAD	0x00
444da8bb3a3SMike Smith #define MLX_PHYS_DRV_WRONLY	0x02
445da8bb3a3SMike Smith #define MLX_PHYS_DRV_ONLINE	0x03
446da8bb3a3SMike Smith #define MLX_PHYS_DRV_STANDBY	0x10
447da8bb3a3SMike Smith     u_int8_t	pd_res1;
448da8bb3a3SMike Smith     u_int8_t	pd_period;
449da8bb3a3SMike Smith     u_int8_t	pd_offset;
450da8bb3a3SMike Smith     u_int32_t	pd_config_size;
4514f492bfaSAlfred Perlstein } __packed;
452da8bb3a3SMike Smith 
453da8bb3a3SMike Smith struct mlx_core_cfg
454da8bb3a3SMike Smith {
455da8bb3a3SMike Smith     u_int8_t	cc_num_sys_drives;
456da8bb3a3SMike Smith     u_int8_t	cc_res1[3];
457da8bb3a3SMike Smith     struct mlx_sys_drv	cc_sys_drives[32];
458da8bb3a3SMike Smith     struct mlx_phys_drv cc_phys_drives[5 * 16];
4594f492bfaSAlfred Perlstein } __packed;
460da8bb3a3SMike Smith 
461da8bb3a3SMike Smith struct mlx_dcdb
462da8bb3a3SMike Smith {
463da8bb3a3SMike Smith     u_int8_t	dcdb_target:4;
464da8bb3a3SMike Smith     u_int8_t	dcdb_channel:4;
465da8bb3a3SMike Smith     u_int8_t	dcdb_flags;
466da8bb3a3SMike Smith #define MLX_DCDB_NO_DATA	0x00
467da8bb3a3SMike Smith #define MLX_DCDB_DATA_IN	0x01
468da8bb3a3SMike Smith #define MLX_DCDB_DATA_OUT	0x02
469da8bb3a3SMike Smith #define MLX_DCDB_EARLY_STATUS		(1<<2)
470da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_10S	0x10
471da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_60S	0x20
472da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_20M	0x30
473da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_24H	0x40
474da8bb3a3SMike Smith #define MLX_DCDB_NO_AUTO_SENSE	(1<<6)
475da8bb3a3SMike Smith #define MLX_DCDB_DISCONNECT	(1<<7)
476da8bb3a3SMike Smith     u_int16_t	dcdb_datasize;
477da8bb3a3SMike Smith     u_int32_t	dcdb_physaddr;
478da8bb3a3SMike Smith     u_int8_t	dcdb_cdb_length:4;
479da8bb3a3SMike Smith     u_int8_t	dcdb_datasize_high:4;
480da8bb3a3SMike Smith     u_int8_t	dcdb_sense_length;
481da8bb3a3SMike Smith     u_int8_t	dcdb_cdb[12];
482da8bb3a3SMike Smith     u_int8_t	dcdb_sense[64];
483da8bb3a3SMike Smith     u_int8_t	dcdb_status;
484da8bb3a3SMike Smith     u_int8_t	res1;
4854f492bfaSAlfred Perlstein } __packed;
486da8bb3a3SMike Smith 
487421f2f7dSMike Smith struct mlx_bbtable_entry
488421f2f7dSMike Smith {
489421f2f7dSMike Smith     u_int32_t	bbt_block_number;
490421f2f7dSMike Smith     u_int8_t	bbt_extent;
491421f2f7dSMike Smith     u_int8_t	res1;
492421f2f7dSMike Smith     u_int8_t	bbt_entry_type;
493421f2f7dSMike Smith     u_int8_t	bbt_system_drive:5;
494421f2f7dSMike Smith     u_int8_t	res2:3;
4954f492bfaSAlfred Perlstein } __packed;
496421f2f7dSMike Smith 
497da8bb3a3SMike Smith #ifdef _KERNEL
4984b006d7bSMike Smith /*
4994b006d7bSMike Smith  * Inlines to build various command structures
5004b006d7bSMike Smith  */
5014b006d7bSMike Smith static __inline void
5024b006d7bSMike Smith mlx_make_type1(struct mlx_command *mc,
5034b006d7bSMike Smith 	       u_int8_t code,
5044b006d7bSMike Smith 	       u_int16_t f1,
5054b006d7bSMike Smith 	       u_int32_t f2,
5064b006d7bSMike Smith 	       u_int8_t f3,
5074b006d7bSMike Smith 	       u_int32_t f4,
5084b006d7bSMike Smith 	       u_int8_t f5)
5094b006d7bSMike Smith {
5104b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
5114b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1 & 0xff;
5124b006d7bSMike Smith     mc->mc_mailbox[0x3] = (((f2 >> 24) & 0x3) << 6) | ((f1 >> 8) & 0x3f);
5134b006d7bSMike Smith     mc->mc_mailbox[0x4] = f2 & 0xff;
5144b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f2 >> 8) & 0xff;
5154b006d7bSMike Smith     mc->mc_mailbox[0x6] = (f2 >> 16) & 0xff;
5164b006d7bSMike Smith     mc->mc_mailbox[0x7] = f3;
5174b006d7bSMike Smith     mc->mc_mailbox[0x8] = f4 & 0xff;
5184b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f4 >> 8) & 0xff;
5194b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f4 >> 16) & 0xff;
5204b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f4 >> 24) & 0xff;
5214b006d7bSMike Smith     mc->mc_mailbox[0xc] = f5;
5224b006d7bSMike Smith }
5234b006d7bSMike Smith 
5244b006d7bSMike Smith static __inline void
5254b006d7bSMike Smith mlx_make_type2(struct mlx_command *mc,
5264b006d7bSMike Smith 	       u_int8_t code,
5274b006d7bSMike Smith 	       u_int8_t f1,
5284b006d7bSMike Smith 	       u_int8_t f2,
5294b006d7bSMike Smith 	       u_int8_t f3,
5304b006d7bSMike Smith 	       u_int8_t f4,
5314b006d7bSMike Smith 	       u_int8_t f5,
5324b006d7bSMike Smith 	       u_int8_t f6,
5334b006d7bSMike Smith 	       u_int32_t f7,
5344b006d7bSMike Smith 	       u_int8_t f8)
5354b006d7bSMike Smith {
5364b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
5374b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1;
5384b006d7bSMike Smith     mc->mc_mailbox[0x3] = f2;
5394b006d7bSMike Smith     mc->mc_mailbox[0x4] = f3;
5404b006d7bSMike Smith     mc->mc_mailbox[0x5] = f4;
5414b006d7bSMike Smith     mc->mc_mailbox[0x6] = f5;
5424b006d7bSMike Smith     mc->mc_mailbox[0x7] = f6;
5434b006d7bSMike Smith     mc->mc_mailbox[0x8] = f7 & 0xff;
5444b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f7 >> 8) & 0xff;
5454b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f7 >> 16) & 0xff;
5464b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f7 >> 24) & 0xff;
5474b006d7bSMike Smith     mc->mc_mailbox[0xc] = f8;
5484b006d7bSMike Smith }
5494b006d7bSMike Smith 
5504b006d7bSMike Smith static __inline void
5514b006d7bSMike Smith mlx_make_type3(struct mlx_command *mc,
5524b006d7bSMike Smith 	       u_int8_t code,
5534b006d7bSMike Smith 	       u_int8_t f1,
5544b006d7bSMike Smith 	       u_int8_t f2,
5554b006d7bSMike Smith 	       u_int16_t f3,
5564b006d7bSMike Smith 	       u_int8_t f4,
5574b006d7bSMike Smith 	       u_int8_t f5,
5584b006d7bSMike Smith 	       u_int32_t f6,
5594b006d7bSMike Smith 	       u_int8_t f7)
5604b006d7bSMike Smith {
5614b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
5624b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1;
5634b006d7bSMike Smith     mc->mc_mailbox[0x3] = f2;
5644b006d7bSMike Smith     mc->mc_mailbox[0x4] = f3 & 0xff;
5654b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f3 >> 8) & 0xff;
5664b006d7bSMike Smith     mc->mc_mailbox[0x6] = f4;
5674b006d7bSMike Smith     mc->mc_mailbox[0x7] = f5;
5684b006d7bSMike Smith     mc->mc_mailbox[0x8] = f6 & 0xff;
5694b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f6 >> 8) & 0xff;
5704b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f6 >> 16) & 0xff;
5714b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f6 >> 24) & 0xff;
5724b006d7bSMike Smith     mc->mc_mailbox[0xc] = f7;
5734b006d7bSMike Smith }
5744b006d7bSMike Smith 
5754b006d7bSMike Smith static __inline void
5764b006d7bSMike Smith mlx_make_type4(struct mlx_command *mc,
5774b006d7bSMike Smith 	       u_int8_t code,
5784b006d7bSMike Smith 	       u_int16_t f1,
5794b006d7bSMike Smith 	       u_int32_t f2,
5804b006d7bSMike Smith 	       u_int32_t f3,
5814b006d7bSMike Smith 	       u_int8_t f4)
5824b006d7bSMike Smith {
5834b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
5844b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1 & 0xff;
5854b006d7bSMike Smith     mc->mc_mailbox[0x3] = (f1 >> 8) & 0xff;
5864b006d7bSMike Smith     mc->mc_mailbox[0x4] = f2 & 0xff;
5874b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f2 >> 8) & 0xff;
5884b006d7bSMike Smith     mc->mc_mailbox[0x6] = (f2 >> 16) & 0xff;
5894b006d7bSMike Smith     mc->mc_mailbox[0x7] = (f2 >> 24) & 0xff;
5904b006d7bSMike Smith     mc->mc_mailbox[0x8] = f3 & 0xff;
5914b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f3 >> 8) & 0xff;
5924b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f3 >> 16) & 0xff;
5934b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f3 >> 24) & 0xff;
5944b006d7bSMike Smith     mc->mc_mailbox[0xc] = f4;
5954b006d7bSMike Smith }
5964b006d7bSMike Smith 
5974b006d7bSMike Smith static __inline void
5984b006d7bSMike Smith mlx_make_type5(struct mlx_command *mc,
5994b006d7bSMike Smith 	       u_int8_t code,
6004b006d7bSMike Smith 	       u_int8_t f1,
6014b006d7bSMike Smith 	       u_int8_t f2,
6024b006d7bSMike Smith 	       u_int32_t f3,
6034b006d7bSMike Smith 	       u_int32_t f4,
6044b006d7bSMike Smith 	       u_int8_t f5)
6054b006d7bSMike Smith {
6064b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
6074b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1;
6084b006d7bSMike Smith     mc->mc_mailbox[0x3] = f2;
6094b006d7bSMike Smith     mc->mc_mailbox[0x4] = f3 & 0xff;
6104b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f3 >> 8) & 0xff;
6114b006d7bSMike Smith     mc->mc_mailbox[0x6] = (f3 >> 16) & 0xff;
6124b006d7bSMike Smith     mc->mc_mailbox[0x7] = (f3 >> 24) & 0xff;
6134b006d7bSMike Smith     mc->mc_mailbox[0x8] = f4 & 0xff;
6144b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f4 >> 8) & 0xff;
6154b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f4 >> 16) & 0xff;
6164b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f4 >> 24) & 0xff;
6174b006d7bSMike Smith     mc->mc_mailbox[0xc] = f5;
6184b006d7bSMike Smith }
619da8bb3a3SMike Smith 
620da8bb3a3SMike Smith #endif /* _KERNEL */
621