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