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