xref: /freebsd/sys/dev/mlx/mlxreg.h (revision 4b006d7bb7299b22a531f16ca93d5814ae78bb9e)
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_CFG_BASE0   0x10		/* first region */
304b006d7bSMike Smith #define MLX_CFG_BASE1   0x14		/* second region (type 3 only) */
314b006d7bSMike Smith 
324b006d7bSMike Smith #define MLX_BLKSIZE	512		/* fixed feature */
334b006d7bSMike Smith 
341ac4b82bSMike Smith /*
351ac4b82bSMike Smith  * Selected command codes.
361ac4b82bSMike Smith  */
371ac4b82bSMike Smith #define MLX_CMD_ENQUIRY		0x53
381ac4b82bSMike Smith #define MLX_CMD_ENQUIRY2	0x1c
391ac4b82bSMike Smith #define MLX_CMD_ENQSYSDRIVE	0x19
401ac4b82bSMike Smith #define MLX_CMD_READOLDSG	0xb6
411ac4b82bSMike Smith #define MLX_CMD_WRITEOLDSG	0xb7
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
491ac4b82bSMike Smith 
501ac4b82bSMike Smith /*
511ac4b82bSMike Smith  * Status values.
521ac4b82bSMike Smith  */
531ac4b82bSMike Smith #define MLX_STATUS_OK		0x0000
541ac4b82bSMike Smith #define MLX_STATUS_RDWROFFLINE	0x0002	/* read/write claims drive is offline */
551ac4b82bSMike Smith #define MLX_STATUS_WEDGED	0xdead	/* controller not listening */
561ac4b82bSMike Smith #define MLX_STATUS_BUSY		0xffff	/* command is in controller */
571ac4b82bSMike Smith 
581ac4b82bSMike Smith /*
59f6b84b08SMike Smith  * Accessor defines for the V3 interface.
60f6b84b08SMike Smith  */
61f6b84b08SMike Smith #define MLX_V3_MAILBOX		0x00
62f6b84b08SMike Smith #define	MLX_V3_STATUS_IDENT	0x0d
63f6b84b08SMike Smith #define MLX_V3_STATUS		0x0e
64f6b84b08SMike Smith #define MLX_V3_IDBR		0x40
65f6b84b08SMike Smith #define MLX_V3_ODBR		0x41
66f6b84b08SMike Smith #define MLX_V3_IER		0x43
67f6b84b08SMike Smith 
68f6b84b08SMike Smith #define MLX_V3_PUT_MAILBOX(sc, idx, val) bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_MAILBOX + idx, val)
69f6b84b08SMike Smith #define MLX_V3_GET_STATUS_IDENT(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_STATUS_IDENT)
70f6b84b08SMike Smith #define MLX_V3_GET_STATUS(sc)		 bus_space_read_2 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_STATUS)
71f6b84b08SMike Smith #define MLX_V3_GET_IDBR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_IDBR)
72f6b84b08SMike Smith #define MLX_V3_PUT_IDBR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_IDBR, val)
73f6b84b08SMike Smith #define MLX_V3_GET_ODBR(sc)		 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V3_ODBR)
74f6b84b08SMike Smith #define MLX_V3_PUT_ODBR(sc, val)	 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_ODBR, val)
75f6b84b08SMike Smith #define MLX_V3_PUT_IER(sc, val)		 bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V3_IER, val)
76f6b84b08SMike Smith 
77f6b84b08SMike Smith #define MLX_V3_IDB_FULL		(1<<0)		/* mailbox is full */
78f6b84b08SMike Smith #define MLX_V3_IDB_SACK		(1<<1)		/* acknowledge status read */
79f6b84b08SMike Smith 
80f6b84b08SMike Smith #define MLX_V3_ODB_SAVAIL	(1<<0)		/* status is available */
81f6b84b08SMike Smith 
82f6b84b08SMike Smith /*
83f6b84b08SMike Smith  * Accessor defines for the V4 interface.
84f6b84b08SMike Smith  */
85f6b84b08SMike Smith #define MLX_V4_MAILBOX		0x1000
86f6b84b08SMike Smith #define	MLX_V4_STATUS_IDENT	0x1018
87f6b84b08SMike Smith #define MLX_V4_STATUS		0x101a
88f6b84b08SMike Smith #define MLX_V4_IDBR		0x0020
89f6b84b08SMike Smith #define MLX_V4_ODBR		0x002c
90f6b84b08SMike Smith #define MLX_V4_IER		0x0034
91f6b84b08SMike Smith 
92f6b84b08SMike Smith /* use longword access? */
93f6b84b08SMike Smith #define MLX_V4_PUT_MAILBOX(sc, idx, val) bus_space_write_1(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_MAILBOX + idx, val)
94f6b84b08SMike Smith #define MLX_V4_GET_STATUS_IDENT(sc)	 bus_space_read_1 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_STATUS_IDENT)
95f6b84b08SMike Smith #define MLX_V4_GET_STATUS(sc)		 bus_space_read_2 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_STATUS)
96f6b84b08SMike Smith #define MLX_V4_GET_IDBR(sc)		 bus_space_read_4 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_IDBR)
97f6b84b08SMike Smith #define MLX_V4_PUT_IDBR(sc, val)	 bus_space_write_4(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_IDBR, val)
98f6b84b08SMike Smith #define MLX_V4_GET_ODBR(sc)		 bus_space_read_4 (sc->mlx_btag, sc->mlx_bhandle, MLX_V4_ODBR)
99f6b84b08SMike Smith #define MLX_V4_PUT_ODBR(sc, val)	 bus_space_write_4(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_ODBR, val)
100f6b84b08SMike Smith #define MLX_V4_PUT_IER(sc, val)		 bus_space_write_4(sc->mlx_btag, sc->mlx_bhandle, MLX_V4_IER, val)
101f6b84b08SMike Smith 
102f6b84b08SMike Smith #define MLX_V4_IDB_FULL		(1<<0)		/* mailbox is full */
103f6b84b08SMike Smith 
104f6b84b08SMike Smith #define MLX_V4_IDB_HWMBOX_CMD	(1<<0)		/* posted hardware mailbox command */
105f6b84b08SMike Smith #define MLX_V4_IDB_SACK		(1<<1)		/* acknowledge status read */
106f6b84b08SMike Smith #define MLX_V4_IDB_MEMMBOX_CMD	(1<<4)		/* posted memory mailbox command */
107f6b84b08SMike Smith 
108f6b84b08SMike Smith #define MLX_V4_ODB_HWSAVAIL	(1<<0)		/* status is available for hardware mailbox */
109f6b84b08SMike Smith #define MLX_V4_ODB_MEMSAVAIL	(1<<1)		/* status is available for memory mailbox */
110f6b84b08SMike Smith 
111f6b84b08SMike Smith #define MLX_V4_ODB_HWMBOX_ACK	(1<<0)		/* ack status read from hardware mailbox */
112f6b84b08SMike Smith #define MLX_V4_ODB_MEMMBOX_ACK	(1<<1)		/* ack status read from memory mailbox */
113f6b84b08SMike Smith 
114f6b84b08SMike Smith #define MLX_V4_IER_MASK		0xfb		/* message unit interrupt mask */
115f6b84b08SMike Smith #define MLX_V4_IER_DISINT	(1<<2)		/* interrupt disable bit */
116f6b84b08SMike Smith 
117f6b84b08SMike Smith /*
1181ac4b82bSMike Smith  * Scatter-gather list format, type 1, kind 00.
1191ac4b82bSMike Smith  */
1201ac4b82bSMike Smith struct mlx_sgentry
1211ac4b82bSMike Smith {
1221ac4b82bSMike Smith     u_int32_t	sg_addr;
1231ac4b82bSMike Smith     u_int32_t	sg_count;
1241ac4b82bSMike Smith } __attribute__ ((packed));
1251ac4b82bSMike Smith 
1261ac4b82bSMike Smith /*
1271ac4b82bSMike Smith  * Command result buffers, as placed in system memory by the controller.
1281ac4b82bSMike Smith  */
1291ac4b82bSMike Smith struct mlx_enquiry	/* MLX_CMD_ENQUIRY */
1301ac4b82bSMike Smith {
1311ac4b82bSMike Smith     u_int8_t		me_num_sys_drvs;
1321ac4b82bSMike Smith     u_int8_t		res1[3];
1331ac4b82bSMike Smith     u_int32_t		me_drvsize[32];
1341ac4b82bSMike Smith     u_int16_t		me_flash_age;
1351ac4b82bSMike Smith     u_int8_t		me_status_flags;
1361ac4b82bSMike Smith #define MLX_ENQ_SFLAG_DEFWRERR	(1<<0)	/* deferred write error indicator */
1371ac4b82bSMike Smith #define MLX_ENQ_SFLAG_BATTLOW	(1<<1)	/* battery low */
1381ac4b82bSMike Smith     u_int8_t		res2;
1391ac4b82bSMike Smith     u_int8_t		me_fwminor;
1401ac4b82bSMike Smith     u_int8_t		me_fwmajor;
1411ac4b82bSMike Smith     u_int8_t		me_rebuild_flag;
1421ac4b82bSMike Smith     u_int8_t		me_max_commands;
1431ac4b82bSMike Smith     u_int8_t		me_offline_sd_count;
1441ac4b82bSMike Smith     u_int8_t		res3;
1451ac4b82bSMike Smith     u_int16_t		me_event_log_seq_num;
1461ac4b82bSMike Smith     u_int8_t		me_critical_sd_count;
1471ac4b82bSMike Smith     u_int8_t		res4[3];
1481ac4b82bSMike Smith     u_int8_t		me_dead_count;
1491ac4b82bSMike Smith     u_int8_t		res5;
1501ac4b82bSMike Smith     u_int8_t		me_rebuild_count;
1511ac4b82bSMike Smith     u_int8_t		me_misc_flags;
1521ac4b82bSMike Smith #define MLX_ENQ_MISC_BBU	(1<<3)	/* battery backup present */
1531ac4b82bSMike Smith     struct
1541ac4b82bSMike Smith     {
1551ac4b82bSMike Smith 	u_int8_t	dd_targ;
1561ac4b82bSMike Smith 	u_int8_t	dd_chan;
1571ac4b82bSMike Smith     } __attribute__ ((packed)) me_dead[20];
1581ac4b82bSMike Smith } __attribute__ ((packed));
1591ac4b82bSMike Smith 
1601ac4b82bSMike Smith struct mlx_enquiry2	/* MLX_CMD_ENQUIRY2 */
1611ac4b82bSMike Smith {
1621ac4b82bSMike Smith     u_int32_t		me_hardware_id;
1631ac4b82bSMike Smith     u_int32_t		me_firmware_id;
1641ac4b82bSMike Smith     u_int32_t		res1;
1651ac4b82bSMike Smith     u_int8_t		me_configured_channels;
1661ac4b82bSMike Smith     u_int8_t		me_actual_channels;
1671ac4b82bSMike Smith     u_int8_t		me_max_targets;
1681ac4b82bSMike Smith     u_int8_t		me_max_tags;
1691ac4b82bSMike Smith     u_int8_t		me_max_sys_drives;
1701ac4b82bSMike Smith     u_int8_t		me_max_arms;
1711ac4b82bSMike Smith     u_int8_t		me_max_spans;
1721ac4b82bSMike Smith     u_int8_t		res2;
1731ac4b82bSMike Smith     u_int32_t		res3;
1741ac4b82bSMike Smith     u_int32_t		me_mem_size;
1751ac4b82bSMike Smith     u_int32_t		me_cache_size;
1761ac4b82bSMike Smith     u_int32_t		me_flash_size;
1771ac4b82bSMike Smith     u_int32_t		me_nvram_size;
1781ac4b82bSMike Smith     u_int16_t		me_mem_type;
1791ac4b82bSMike Smith     u_int16_t		me_clock_speed;
1801ac4b82bSMike Smith     u_int16_t		me_mem_speed;
1811ac4b82bSMike Smith     u_int16_t		me_hardware_speed;
1821ac4b82bSMike Smith     u_int8_t		res4[10];
1831ac4b82bSMike Smith     u_int16_t		me_max_commands;
1841ac4b82bSMike Smith     u_int16_t		me_max_sg;
1851ac4b82bSMike Smith     u_int16_t		me_max_dp;
1861ac4b82bSMike Smith     u_int16_t		me_max_iod;
1871ac4b82bSMike Smith     u_int16_t		me_max_comb;
1881ac4b82bSMike Smith     u_int8_t		me_latency;
1891ac4b82bSMike Smith     u_int8_t		res5;
1901ac4b82bSMike Smith     u_int8_t		me_scsi_timeout;
1911ac4b82bSMike Smith     u_int8_t		res6;
1921ac4b82bSMike Smith     u_int16_t		me_min_freelines;
1931ac4b82bSMike Smith     u_int8_t		res7[8];
1941ac4b82bSMike Smith     u_int8_t		me_rate_const;
1951ac4b82bSMike Smith     u_int8_t		res8[11];
1961ac4b82bSMike Smith     u_int16_t		me_physblk;
1971ac4b82bSMike Smith     u_int16_t		me_logblk;
1981ac4b82bSMike Smith     u_int16_t		me_maxblk;
1991ac4b82bSMike Smith     u_int16_t		me_blocking_factor;
2001ac4b82bSMike Smith     u_int16_t		me_cacheline;
2011ac4b82bSMike Smith     u_int8_t		me_scsi_cap;
2021ac4b82bSMike Smith     u_int8_t		res9[5];
2031ac4b82bSMike Smith     u_int16_t		me_fimware_build;
2041ac4b82bSMike Smith     u_int8_t		me_fault_mgmt_type;
2051ac4b82bSMike Smith     u_int8_t		res10;
2061ac4b82bSMike Smith     u_int32_t		me_firmware_features;
2071ac4b82bSMike Smith     u_int8_t		res11[8];
2081ac4b82bSMike Smith } __attribute__ ((packed));
2091ac4b82bSMike Smith 
2101ac4b82bSMike Smith struct mlx_enq_sys_drive /* MLX_CMD_ENQSYSDRIVE returns an array of 32 of these */
2111ac4b82bSMike Smith {
2121ac4b82bSMike Smith     u_int32_t		sd_size;
2131ac4b82bSMike Smith     u_int8_t		sd_state;
2141ac4b82bSMike Smith     u_int8_t		sd_raidlevel;
2151ac4b82bSMike Smith     u_int16_t		res1;
2161ac4b82bSMike Smith } __attribute__ ((packed));
2171ac4b82bSMike Smith 
2181ac4b82bSMike Smith struct mlx_eventlog_entry	/* MLX_CMD_LOGOP/MLX_LOGOP_GET */
2191ac4b82bSMike Smith {
2201ac4b82bSMike Smith     u_int8_t		el_type;
2211ac4b82bSMike Smith     u_int8_t		el_length;
2221ac4b82bSMike Smith     u_char		el_target:5;
2231ac4b82bSMike Smith     u_char		el_channel:3;
2241ac4b82bSMike Smith     u_char		el_lun:6;
2251ac4b82bSMike Smith     u_char		res1:2;
2261ac4b82bSMike Smith     u_int16_t		el_seqno;
2271ac4b82bSMike Smith     u_char		el_errorcode:7;
2281ac4b82bSMike Smith     u_char		el_valid:1;
2291ac4b82bSMike Smith     u_int8_t		el_segment;
2301ac4b82bSMike Smith     u_char		el_sensekey:4;
2311ac4b82bSMike Smith     u_char		res2:1;
2321ac4b82bSMike Smith     u_char		el_ILI:1;
2331ac4b82bSMike Smith     u_char		el_EOM:1;
2341ac4b82bSMike Smith     u_char		el_filemark:1;
2351ac4b82bSMike Smith     u_int8_t		el_information[4];
2361ac4b82bSMike Smith     u_int8_t		el_addsense;
2371ac4b82bSMike Smith     u_int8_t		el_csi[4];
2381ac4b82bSMike Smith     u_int8_t		el_asc;
2391ac4b82bSMike Smith     u_int8_t		el_asq;
2401ac4b82bSMike Smith     u_int8_t		res3[12];
2411ac4b82bSMike Smith } __attribute__ ((packed));
2421ac4b82bSMike Smith 
2431ac4b82bSMike Smith #define MLX_LOGOP_GET		0x00	/* operation codes for MLX_CMD_LOGOP */
2441ac4b82bSMike Smith #define MLX_LOGMSG_SENSE	0x00	/* log message contents codes */
2451ac4b82bSMike Smith 
2461ac4b82bSMike Smith struct mlx_rebuild_stat	/* MLX_CMD_REBUILDSTAT */
2471ac4b82bSMike Smith {
2481ac4b82bSMike Smith     u_int32_t	rb_drive;
2491ac4b82bSMike Smith     u_int32_t	rb_size;
2501ac4b82bSMike Smith     u_int32_t	rb_remaining;
2511ac4b82bSMike Smith } __attribute__ ((packed));
2521ac4b82bSMike Smith 
2534b006d7bSMike Smith /*
2544b006d7bSMike Smith  * Inlines to build various command structures
2554b006d7bSMike Smith  */
2564b006d7bSMike Smith static __inline void
2574b006d7bSMike Smith mlx_make_type1(struct mlx_command *mc,
2584b006d7bSMike Smith 	       u_int8_t code,
2594b006d7bSMike Smith 	       u_int16_t f1,
2604b006d7bSMike Smith 	       u_int32_t f2,
2614b006d7bSMike Smith 	       u_int8_t f3,
2624b006d7bSMike Smith 	       u_int32_t f4,
2634b006d7bSMike Smith 	       u_int8_t f5)
2644b006d7bSMike Smith {
2654b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
2664b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1 & 0xff;
2674b006d7bSMike Smith     mc->mc_mailbox[0x3] = (((f2 >> 24) & 0x3) << 6) | ((f1 >> 8) & 0x3f);
2684b006d7bSMike Smith     mc->mc_mailbox[0x4] = f2 & 0xff;
2694b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f2 >> 8) & 0xff;
2704b006d7bSMike Smith     mc->mc_mailbox[0x6] = (f2 >> 16) & 0xff;
2714b006d7bSMike Smith     mc->mc_mailbox[0x7] = f3;
2724b006d7bSMike Smith     mc->mc_mailbox[0x8] = f4 & 0xff;
2734b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f4 >> 8) & 0xff;
2744b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f4 >> 16) & 0xff;
2754b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f4 >> 24) & 0xff;
2764b006d7bSMike Smith     mc->mc_mailbox[0xc] = f5;
2774b006d7bSMike Smith }
2784b006d7bSMike Smith 
2794b006d7bSMike Smith static __inline void
2804b006d7bSMike Smith mlx_make_type2(struct mlx_command *mc,
2814b006d7bSMike Smith 	       u_int8_t code,
2824b006d7bSMike Smith 	       u_int8_t f1,
2834b006d7bSMike Smith 	       u_int8_t f2,
2844b006d7bSMike Smith 	       u_int8_t f3,
2854b006d7bSMike Smith 	       u_int8_t f4,
2864b006d7bSMike Smith 	       u_int8_t f5,
2874b006d7bSMike Smith 	       u_int8_t f6,
2884b006d7bSMike Smith 	       u_int32_t f7,
2894b006d7bSMike Smith 	       u_int8_t f8)
2904b006d7bSMike Smith {
2914b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
2924b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1;
2934b006d7bSMike Smith     mc->mc_mailbox[0x3] = f2;
2944b006d7bSMike Smith     mc->mc_mailbox[0x4] = f3;
2954b006d7bSMike Smith     mc->mc_mailbox[0x5] = f4;
2964b006d7bSMike Smith     mc->mc_mailbox[0x6] = f5;
2974b006d7bSMike Smith     mc->mc_mailbox[0x7] = f6;
2984b006d7bSMike Smith     mc->mc_mailbox[0x8] = f7 & 0xff;
2994b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f7 >> 8) & 0xff;
3004b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f7 >> 16) & 0xff;
3014b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f7 >> 24) & 0xff;
3024b006d7bSMike Smith     mc->mc_mailbox[0xc] = f8;
3034b006d7bSMike Smith }
3044b006d7bSMike Smith 
3054b006d7bSMike Smith static __inline void
3064b006d7bSMike Smith mlx_make_type3(struct mlx_command *mc,
3074b006d7bSMike Smith 	       u_int8_t code,
3084b006d7bSMike Smith 	       u_int8_t f1,
3094b006d7bSMike Smith 	       u_int8_t f2,
3104b006d7bSMike Smith 	       u_int16_t f3,
3114b006d7bSMike Smith 	       u_int8_t f4,
3124b006d7bSMike Smith 	       u_int8_t f5,
3134b006d7bSMike Smith 	       u_int32_t f6,
3144b006d7bSMike Smith 	       u_int8_t f7)
3154b006d7bSMike Smith {
3164b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
3174b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1;
3184b006d7bSMike Smith     mc->mc_mailbox[0x3] = f2;
3194b006d7bSMike Smith     mc->mc_mailbox[0x4] = f3 & 0xff;
3204b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f3 >> 8) & 0xff;
3214b006d7bSMike Smith     mc->mc_mailbox[0x6] = f4;
3224b006d7bSMike Smith     mc->mc_mailbox[0x7] = f5;
3234b006d7bSMike Smith     mc->mc_mailbox[0x8] = f6 & 0xff;
3244b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f6 >> 8) & 0xff;
3254b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f6 >> 16) & 0xff;
3264b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f6 >> 24) & 0xff;
3274b006d7bSMike Smith     mc->mc_mailbox[0xc] = f7;
3284b006d7bSMike Smith }
3294b006d7bSMike Smith 
3304b006d7bSMike Smith static __inline void
3314b006d7bSMike Smith mlx_make_type4(struct mlx_command *mc,
3324b006d7bSMike Smith 	       u_int8_t code,
3334b006d7bSMike Smith 	       u_int16_t f1,
3344b006d7bSMike Smith 	       u_int32_t f2,
3354b006d7bSMike Smith 	       u_int32_t f3,
3364b006d7bSMike Smith 	       u_int8_t f4)
3374b006d7bSMike Smith {
3384b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
3394b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1 & 0xff;
3404b006d7bSMike Smith     mc->mc_mailbox[0x3] = (f1 >> 8) & 0xff;
3414b006d7bSMike Smith     mc->mc_mailbox[0x4] = f2 & 0xff;
3424b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f2 >> 8) & 0xff;
3434b006d7bSMike Smith     mc->mc_mailbox[0x6] = (f2 >> 16) & 0xff;
3444b006d7bSMike Smith     mc->mc_mailbox[0x7] = (f2 >> 24) & 0xff;
3454b006d7bSMike Smith     mc->mc_mailbox[0x8] = f3 & 0xff;
3464b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f3 >> 8) & 0xff;
3474b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f3 >> 16) & 0xff;
3484b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f3 >> 24) & 0xff;
3494b006d7bSMike Smith     mc->mc_mailbox[0xc] = f4;
3504b006d7bSMike Smith }
3514b006d7bSMike Smith 
3524b006d7bSMike Smith static __inline void
3534b006d7bSMike Smith mlx_make_type5(struct mlx_command *mc,
3544b006d7bSMike Smith 	       u_int8_t code,
3554b006d7bSMike Smith 	       u_int8_t f1,
3564b006d7bSMike Smith 	       u_int8_t f2,
3574b006d7bSMike Smith 	       u_int32_t f3,
3584b006d7bSMike Smith 	       u_int32_t f4,
3594b006d7bSMike Smith 	       u_int8_t f5)
3604b006d7bSMike Smith {
3614b006d7bSMike Smith     mc->mc_mailbox[0x0] = code;
3624b006d7bSMike Smith     mc->mc_mailbox[0x2] = f1;
3634b006d7bSMike Smith     mc->mc_mailbox[0x3] = f2;
3644b006d7bSMike Smith     mc->mc_mailbox[0x4] = f3 & 0xff;
3654b006d7bSMike Smith     mc->mc_mailbox[0x5] = (f3 >> 8) & 0xff;
3664b006d7bSMike Smith     mc->mc_mailbox[0x6] = (f3 >> 16) & 0xff;
3674b006d7bSMike Smith     mc->mc_mailbox[0x7] = (f3 >> 24) & 0xff;
3684b006d7bSMike Smith     mc->mc_mailbox[0x8] = f4 & 0xff;
3694b006d7bSMike Smith     mc->mc_mailbox[0x9] = (f4 >> 8) & 0xff;
3704b006d7bSMike Smith     mc->mc_mailbox[0xa] = (f4 >> 16) & 0xff;
3714b006d7bSMike Smith     mc->mc_mailbox[0xb] = (f4 >> 24) & 0xff;
3724b006d7bSMike Smith     mc->mc_mailbox[0xc] = f5;
3734b006d7bSMike Smith }
374