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 */ 304161b1a1SScott Long #define MLX_PAGE_SIZE 4096 /* controller, not cpu, attribute */ 314b006d7bSMike Smith 321ac4b82bSMike Smith /* 331ac4b82bSMike Smith * Selected command codes. 341ac4b82bSMike Smith */ 35da8bb3a3SMike Smith #define MLX_CMD_ENQUIRY_OLD 0x05 361ac4b82bSMike Smith #define MLX_CMD_ENQUIRY 0x53 371ac4b82bSMike Smith #define MLX_CMD_ENQUIRY2 0x1c 381ac4b82bSMike Smith #define MLX_CMD_ENQSYSDRIVE 0x19 39da8bb3a3SMike Smith #define MLX_CMD_READSG 0xb6 40da8bb3a3SMike Smith #define MLX_CMD_WRITESG 0xb7 41da8bb3a3SMike Smith #define MLX_CMD_READSG_OLD 0x82 42da8bb3a3SMike Smith #define MLX_CMD_WRITESG_OLD 0x83 431ac4b82bSMike Smith #define MLX_CMD_FLUSH 0x0a 441ac4b82bSMike Smith #define MLX_CMD_LOGOP 0x72 451ac4b82bSMike Smith #define MLX_CMD_REBUILDASYNC 0x16 461ac4b82bSMike Smith #define MLX_CMD_CHECKASYNC 0x1e 471ac4b82bSMike Smith #define MLX_CMD_REBUILDSTAT 0x0c 481ac4b82bSMike Smith #define MLX_CMD_STOPCHANNEL 0x13 491ac4b82bSMike Smith #define MLX_CMD_STARTCHANNEL 0x12 50da8bb3a3SMike Smith #define MLX_CMD_READ_CONFIG 0x4e 51da8bb3a3SMike Smith #define MLX_CMD_DIRECT_CDB 0x04 52421f2f7dSMike Smith #define MLX_CMD_DEVICE_STATE 0x50 53da8bb3a3SMike Smith 54da8bb3a3SMike Smith #ifdef _KERNEL 55da8bb3a3SMike Smith 56da8bb3a3SMike Smith #define MLX_CFG_BASE0 0x10 /* first region */ 57da8bb3a3SMike Smith #define MLX_CFG_BASE1 0x14 /* second region (type 3 only) */ 581ac4b82bSMike Smith 591ac4b82bSMike Smith /* 601ac4b82bSMike Smith * Status values. 611ac4b82bSMike Smith */ 621ac4b82bSMike Smith #define MLX_STATUS_OK 0x0000 631ac4b82bSMike Smith #define MLX_STATUS_RDWROFFLINE 0x0002 /* read/write claims drive is offline */ 641ac4b82bSMike Smith #define MLX_STATUS_WEDGED 0xdead /* controller not listening */ 655792b7feSMike Smith #define MLX_STATUS_LOST 0xbeef /* never came back */ 661ac4b82bSMike Smith #define MLX_STATUS_BUSY 0xffff /* command is in controller */ 671ac4b82bSMike Smith 681ac4b82bSMike Smith /* 69f6b84b08SMike Smith * Accessor defines for the V3 interface. 70f6b84b08SMike Smith */ 71f6b84b08SMike Smith #define MLX_V3_MAILBOX 0x00 72f6b84b08SMike Smith #define MLX_V3_STATUS_IDENT 0x0d 73f6b84b08SMike Smith #define MLX_V3_STATUS 0x0e 74f6b84b08SMike Smith #define MLX_V3_IDBR 0x40 75f6b84b08SMike Smith #define MLX_V3_ODBR 0x41 76f6b84b08SMike Smith #define MLX_V3_IER 0x43 77da8bb3a3SMike Smith #define MLX_V3_FWERROR 0x3f 78da8bb3a3SMike Smith #define MLX_V3_FWERROR_PARAM1 0x00 79da8bb3a3SMike Smith #define MLX_V3_FWERROR_PARAM2 0x01 80f6b84b08SMike Smith 81*0fca6f8bSJohn Baldwin #define MLX_V3_PUT_MAILBOX(sc, idx, val) bus_write_1(sc->mlx_mem, MLX_V3_MAILBOX + idx, val) 82*0fca6f8bSJohn Baldwin #define MLX_V3_GET_STATUS_IDENT(sc) bus_read_1 (sc->mlx_mem, MLX_V3_STATUS_IDENT) 83*0fca6f8bSJohn Baldwin #define MLX_V3_GET_STATUS(sc) bus_read_2 (sc->mlx_mem, MLX_V3_STATUS) 84*0fca6f8bSJohn Baldwin #define MLX_V3_GET_IDBR(sc) bus_read_1 (sc->mlx_mem, MLX_V3_IDBR) 85*0fca6f8bSJohn Baldwin #define MLX_V3_PUT_IDBR(sc, val) bus_write_1(sc->mlx_mem, MLX_V3_IDBR, val) 86*0fca6f8bSJohn Baldwin #define MLX_V3_GET_ODBR(sc) bus_read_1 (sc->mlx_mem, MLX_V3_ODBR) 87*0fca6f8bSJohn Baldwin #define MLX_V3_PUT_ODBR(sc, val) bus_write_1(sc->mlx_mem, MLX_V3_ODBR, val) 88*0fca6f8bSJohn Baldwin #define MLX_V3_PUT_IER(sc, val) bus_write_1(sc->mlx_mem, MLX_V3_IER, val) 89*0fca6f8bSJohn Baldwin #define MLX_V3_GET_FWERROR(sc) bus_read_1 (sc->mlx_mem, MLX_V3_FWERROR) 90*0fca6f8bSJohn Baldwin #define MLX_V3_PUT_FWERROR(sc, val) bus_write_1(sc->mlx_mem, MLX_V3_FWERROR, val) 91*0fca6f8bSJohn Baldwin #define MLX_V3_GET_FWERROR_PARAM1(sc) bus_read_1 (sc->mlx_mem, MLX_V3_FWERROR_PARAM1) 92*0fca6f8bSJohn Baldwin #define MLX_V3_GET_FWERROR_PARAM2(sc) bus_read_1 (sc->mlx_mem, MLX_V3_FWERROR_PARAM2) 93f6b84b08SMike Smith 94f6b84b08SMike Smith #define MLX_V3_IDB_FULL (1<<0) /* mailbox is full */ 95da8bb3a3SMike Smith #define MLX_V3_IDB_INIT_BUSY (1<<1) /* initialisation in progress */ 96da8bb3a3SMike Smith 97f6b84b08SMike Smith #define MLX_V3_IDB_SACK (1<<1) /* acknowledge status read */ 98f6b84b08SMike Smith 99f6b84b08SMike Smith #define MLX_V3_ODB_SAVAIL (1<<0) /* status is available */ 100f6b84b08SMike Smith 101da8bb3a3SMike Smith #define MLX_V3_FWERROR_PEND (1<<2) /* firmware error pending */ 102da8bb3a3SMike Smith 103f6b84b08SMike Smith /* 104f6b84b08SMike Smith * Accessor defines for the V4 interface. 105f6b84b08SMike Smith */ 106f6b84b08SMike Smith #define MLX_V4_MAILBOX 0x1000 107da8bb3a3SMike Smith #define MLX_V4_MAILBOX_LENGTH 16 108f6b84b08SMike Smith #define MLX_V4_STATUS_IDENT 0x1018 109f6b84b08SMike Smith #define MLX_V4_STATUS 0x101a 110f6b84b08SMike Smith #define MLX_V4_IDBR 0x0020 111f6b84b08SMike Smith #define MLX_V4_ODBR 0x002c 112f6b84b08SMike Smith #define MLX_V4_IER 0x0034 113da8bb3a3SMike Smith #define MLX_V4_FWERROR 0x103f 114da8bb3a3SMike Smith #define MLX_V4_FWERROR_PARAM1 0x1000 115da8bb3a3SMike Smith #define MLX_V4_FWERROR_PARAM2 0x1001 116f6b84b08SMike Smith 117f6b84b08SMike Smith /* use longword access? */ 118*0fca6f8bSJohn Baldwin #define MLX_V4_PUT_MAILBOX(sc, idx, val) bus_write_1(sc->mlx_mem, MLX_V4_MAILBOX + idx, val) 119*0fca6f8bSJohn Baldwin #define MLX_V4_GET_STATUS_IDENT(sc) bus_read_1 (sc->mlx_mem, MLX_V4_STATUS_IDENT) 120*0fca6f8bSJohn Baldwin #define MLX_V4_GET_STATUS(sc) bus_read_2 (sc->mlx_mem, MLX_V4_STATUS) 121*0fca6f8bSJohn Baldwin #define MLX_V4_GET_IDBR(sc) bus_read_4 (sc->mlx_mem, MLX_V4_IDBR) 122*0fca6f8bSJohn Baldwin #define MLX_V4_PUT_IDBR(sc, val) bus_write_4(sc->mlx_mem, MLX_V4_IDBR, val) 123*0fca6f8bSJohn Baldwin #define MLX_V4_GET_ODBR(sc) bus_read_4 (sc->mlx_mem, MLX_V4_ODBR) 124*0fca6f8bSJohn Baldwin #define MLX_V4_PUT_ODBR(sc, val) bus_write_4(sc->mlx_mem, MLX_V4_ODBR, val) 125*0fca6f8bSJohn Baldwin #define MLX_V4_PUT_IER(sc, val) bus_write_4(sc->mlx_mem, MLX_V4_IER, val) 126*0fca6f8bSJohn Baldwin #define MLX_V4_GET_FWERROR(sc) bus_read_1 (sc->mlx_mem, MLX_V4_FWERROR) 127*0fca6f8bSJohn Baldwin #define MLX_V4_PUT_FWERROR(sc, val) bus_write_1(sc->mlx_mem, MLX_V4_FWERROR, val) 128*0fca6f8bSJohn Baldwin #define MLX_V4_GET_FWERROR_PARAM1(sc) bus_read_1 (sc->mlx_mem, MLX_V4_FWERROR_PARAM1) 129*0fca6f8bSJohn Baldwin #define MLX_V4_GET_FWERROR_PARAM2(sc) bus_read_1 (sc->mlx_mem, MLX_V4_FWERROR_PARAM2) 130f6b84b08SMike Smith 131f6b84b08SMike Smith #define MLX_V4_IDB_FULL (1<<0) /* mailbox is full */ 132da8bb3a3SMike Smith #define MLX_V4_IDB_INIT_BUSY (1<<1) /* initialisation in progress */ 133f6b84b08SMike Smith 134f6b84b08SMike Smith #define MLX_V4_IDB_HWMBOX_CMD (1<<0) /* posted hardware mailbox command */ 135f6b84b08SMike Smith #define MLX_V4_IDB_SACK (1<<1) /* acknowledge status read */ 136f6b84b08SMike Smith #define MLX_V4_IDB_MEMMBOX_CMD (1<<4) /* posted memory mailbox command */ 137f6b84b08SMike Smith 138f6b84b08SMike Smith #define MLX_V4_ODB_HWSAVAIL (1<<0) /* status is available for hardware mailbox */ 139f6b84b08SMike Smith #define MLX_V4_ODB_MEMSAVAIL (1<<1) /* status is available for memory mailbox */ 140f6b84b08SMike Smith 141f6b84b08SMike Smith #define MLX_V4_ODB_HWMBOX_ACK (1<<0) /* ack status read from hardware mailbox */ 142f6b84b08SMike Smith #define MLX_V4_ODB_MEMMBOX_ACK (1<<1) /* ack status read from memory mailbox */ 143f6b84b08SMike Smith 144f6b84b08SMike Smith #define MLX_V4_IER_MASK 0xfb /* message unit interrupt mask */ 145f6b84b08SMike Smith #define MLX_V4_IER_DISINT (1<<2) /* interrupt disable bit */ 146f6b84b08SMike Smith 147da8bb3a3SMike Smith #define MLX_V4_FWERROR_PEND (1<<2) /* firmware error pending */ 148da8bb3a3SMike Smith 149f6b84b08SMike Smith /* 1505792b7feSMike Smith * Accessor defines for the V5 interface 1515792b7feSMike Smith */ 1525792b7feSMike Smith #define MLX_V5_MAILBOX 0x50 153da8bb3a3SMike Smith #define MLX_V5_MAILBOX_LENGTH 16 1545792b7feSMike Smith #define MLX_V5_STATUS_IDENT 0x5d 1555792b7feSMike Smith #define MLX_V5_STATUS 0x5e 1565792b7feSMike Smith #define MLX_V5_IDBR 0x60 1575792b7feSMike Smith #define MLX_V5_ODBR 0x61 1585792b7feSMike Smith #define MLX_V5_IER 0x34 159da8bb3a3SMike Smith #define MLX_V5_FWERROR 0x63 160da8bb3a3SMike Smith #define MLX_V5_FWERROR_PARAM1 0x50 161da8bb3a3SMike Smith #define MLX_V5_FWERROR_PARAM2 0x51 1625792b7feSMike Smith 163*0fca6f8bSJohn Baldwin #define MLX_V5_PUT_MAILBOX(sc, idx, val) bus_write_1(sc->mlx_mem, MLX_V5_MAILBOX + idx, val) 164*0fca6f8bSJohn Baldwin #define MLX_V5_GET_STATUS_IDENT(sc) bus_read_1 (sc->mlx_mem, MLX_V5_STATUS_IDENT) 165*0fca6f8bSJohn Baldwin #define MLX_V5_GET_STATUS(sc) bus_read_2 (sc->mlx_mem, MLX_V5_STATUS) 166*0fca6f8bSJohn Baldwin #define MLX_V5_GET_IDBR(sc) bus_read_1 (sc->mlx_mem, MLX_V5_IDBR) 167*0fca6f8bSJohn Baldwin #define MLX_V5_PUT_IDBR(sc, val) bus_write_1(sc->mlx_mem, MLX_V5_IDBR, val) 168*0fca6f8bSJohn Baldwin #define MLX_V5_GET_ODBR(sc) bus_read_1 (sc->mlx_mem, MLX_V5_ODBR) 169*0fca6f8bSJohn Baldwin #define MLX_V5_PUT_ODBR(sc, val) bus_write_1(sc->mlx_mem, MLX_V5_ODBR, val) 170*0fca6f8bSJohn Baldwin #define MLX_V5_PUT_IER(sc, val) bus_write_1(sc->mlx_mem, MLX_V5_IER, val) 171*0fca6f8bSJohn Baldwin #define MLX_V5_GET_FWERROR(sc) bus_read_1 (sc->mlx_mem, MLX_V5_FWERROR) 172*0fca6f8bSJohn Baldwin #define MLX_V5_PUT_FWERROR(sc, val) bus_write_1(sc->mlx_mem, MLX_V5_FWERROR, val) 173*0fca6f8bSJohn Baldwin #define MLX_V5_GET_FWERROR_PARAM1(sc) bus_read_1 (sc->mlx_mem, MLX_V5_FWERROR_PARAM1) 174*0fca6f8bSJohn Baldwin #define MLX_V5_GET_FWERROR_PARAM2(sc) bus_read_1 (sc->mlx_mem, MLX_V5_FWERROR_PARAM2) 1755792b7feSMike Smith 1765792b7feSMike Smith #define MLX_V5_IDB_EMPTY (1<<0) /* mailbox is empty */ 177da8bb3a3SMike Smith #define MLX_V5_IDB_INIT_DONE (1<<1) /* initialisation has completed */ 1785792b7feSMike Smith 1795792b7feSMike Smith #define MLX_V5_IDB_HWMBOX_CMD (1<<0) /* posted hardware mailbox command */ 1805792b7feSMike Smith #define MLX_V5_IDB_SACK (1<<1) /* acknowledge status read */ 181da8bb3a3SMike Smith #define MLX_V5_IDB_RESET (1<<3) /* reset request */ 1825792b7feSMike Smith #define MLX_V5_IDB_MEMMBOX_CMD (1<<4) /* posted memory mailbox command */ 1835792b7feSMike Smith 1845792b7feSMike Smith #define MLX_V5_ODB_HWSAVAIL (1<<0) /* status is available for hardware mailbox */ 1855792b7feSMike Smith #define MLX_V5_ODB_MEMSAVAIL (1<<1) /* status is available for memory mailbox */ 1865792b7feSMike Smith 1875792b7feSMike Smith #define MLX_V5_ODB_HWMBOX_ACK (1<<0) /* ack status read from hardware mailbox */ 1885792b7feSMike Smith #define MLX_V5_ODB_MEMMBOX_ACK (1<<1) /* ack status read from memory mailbox */ 1895792b7feSMike Smith 1905792b7feSMike Smith #define MLX_V5_IER_DISINT (1<<2) /* interrupt disable bit */ 1915792b7feSMike Smith 192da8bb3a3SMike Smith #define MLX_V5_FWERROR_PEND (1<<2) /* firmware error pending */ 193da8bb3a3SMike Smith 194da8bb3a3SMike Smith #endif /* _KERNEL */ 1955792b7feSMike Smith 1965792b7feSMike Smith /* 1971ac4b82bSMike Smith * Scatter-gather list format, type 1, kind 00. 1981ac4b82bSMike Smith */ 1991ac4b82bSMike Smith struct mlx_sgentry 2001ac4b82bSMike Smith { 2011ac4b82bSMike Smith u_int32_t sg_addr; 2021ac4b82bSMike Smith u_int32_t sg_count; 2034f492bfaSAlfred Perlstein } __packed; 2041ac4b82bSMike Smith 2051ac4b82bSMike Smith /* 2061ac4b82bSMike Smith * Command result buffers, as placed in system memory by the controller. 2071ac4b82bSMike Smith */ 208da8bb3a3SMike Smith 209da8bb3a3SMike Smith struct mlx_enquiry_old /* MLX_CMD_ENQUIRY_OLD */ 210da8bb3a3SMike Smith { 211da8bb3a3SMike Smith u_int8_t me_num_sys_drvs; 212da8bb3a3SMike Smith u_int8_t res1[3]; 213da8bb3a3SMike Smith u_int32_t me_drvsize[8]; 214da8bb3a3SMike Smith u_int16_t me_flash_age; 215da8bb3a3SMike Smith u_int8_t me_status_flags; 216da8bb3a3SMike Smith u_int8_t me_free_state_change_count; 217da8bb3a3SMike Smith u_int8_t me_fwminor; 218da8bb3a3SMike Smith u_int8_t me_fwmajor; 219da8bb3a3SMike Smith u_int8_t me_rebuild_flag; 220da8bb3a3SMike Smith u_int8_t me_max_commands; 221da8bb3a3SMike Smith u_int8_t me_offline_sd_count; 222da8bb3a3SMike Smith u_int8_t res3; 223da8bb3a3SMike Smith u_int8_t me_critical_sd_count; 224da8bb3a3SMike Smith u_int8_t res4[3]; 225da8bb3a3SMike Smith u_int8_t me_dead_count; 226da8bb3a3SMike Smith u_int8_t res5; 227da8bb3a3SMike Smith u_int8_t me_rebuild_count; 228da8bb3a3SMike Smith u_int8_t me_misc_flags; 229da8bb3a3SMike Smith struct 230da8bb3a3SMike Smith { 231da8bb3a3SMike Smith u_int8_t dd_targ; 232da8bb3a3SMike Smith u_int8_t dd_chan; 2334f492bfaSAlfred Perlstein } __packed me_dead[20]; 2344f492bfaSAlfred Perlstein } __packed; 235da8bb3a3SMike Smith 2361ac4b82bSMike Smith struct mlx_enquiry /* MLX_CMD_ENQUIRY */ 2371ac4b82bSMike Smith { 2381ac4b82bSMike Smith u_int8_t me_num_sys_drvs; 2391ac4b82bSMike Smith u_int8_t res1[3]; 2401ac4b82bSMike Smith u_int32_t me_drvsize[32]; 2411ac4b82bSMike Smith u_int16_t me_flash_age; 2421ac4b82bSMike Smith u_int8_t me_status_flags; 2431ac4b82bSMike Smith #define MLX_ENQ_SFLAG_DEFWRERR (1<<0) /* deferred write error indicator */ 2441ac4b82bSMike Smith #define MLX_ENQ_SFLAG_BATTLOW (1<<1) /* battery low */ 2451ac4b82bSMike Smith u_int8_t res2; 2461ac4b82bSMike Smith u_int8_t me_fwminor; 2471ac4b82bSMike Smith u_int8_t me_fwmajor; 2481ac4b82bSMike Smith u_int8_t me_rebuild_flag; 2491ac4b82bSMike Smith u_int8_t me_max_commands; 2501ac4b82bSMike Smith u_int8_t me_offline_sd_count; 2511ac4b82bSMike Smith u_int8_t res3; 2521ac4b82bSMike Smith u_int16_t me_event_log_seq_num; 2531ac4b82bSMike Smith u_int8_t me_critical_sd_count; 2541ac4b82bSMike Smith u_int8_t res4[3]; 2551ac4b82bSMike Smith u_int8_t me_dead_count; 2561ac4b82bSMike Smith u_int8_t res5; 2571ac4b82bSMike Smith u_int8_t me_rebuild_count; 2581ac4b82bSMike Smith u_int8_t me_misc_flags; 2591ac4b82bSMike Smith #define MLX_ENQ_MISC_BBU (1<<3) /* battery backup present */ 2601ac4b82bSMike Smith struct 2611ac4b82bSMike Smith { 2621ac4b82bSMike Smith u_int8_t dd_targ; 2631ac4b82bSMike Smith u_int8_t dd_chan; 2644f492bfaSAlfred Perlstein } __packed me_dead[20]; 2654f492bfaSAlfred Perlstein } __packed; 2661ac4b82bSMike Smith 2671ac4b82bSMike Smith struct mlx_enquiry2 /* MLX_CMD_ENQUIRY2 */ 2681ac4b82bSMike Smith { 2691ac4b82bSMike Smith u_int32_t me_hardware_id; 2701ac4b82bSMike Smith u_int32_t me_firmware_id; 2711ac4b82bSMike Smith u_int32_t res1; 2721ac4b82bSMike Smith u_int8_t me_configured_channels; 2731ac4b82bSMike Smith u_int8_t me_actual_channels; 2741ac4b82bSMike Smith u_int8_t me_max_targets; 2751ac4b82bSMike Smith u_int8_t me_max_tags; 2761ac4b82bSMike Smith u_int8_t me_max_sys_drives; 2771ac4b82bSMike Smith u_int8_t me_max_arms; 2781ac4b82bSMike Smith u_int8_t me_max_spans; 2791ac4b82bSMike Smith u_int8_t res2; 2801ac4b82bSMike Smith u_int32_t res3; 2811ac4b82bSMike Smith u_int32_t me_mem_size; 2821ac4b82bSMike Smith u_int32_t me_cache_size; 2831ac4b82bSMike Smith u_int32_t me_flash_size; 2841ac4b82bSMike Smith u_int32_t me_nvram_size; 2851ac4b82bSMike Smith u_int16_t me_mem_type; 2861ac4b82bSMike Smith u_int16_t me_clock_speed; 2871ac4b82bSMike Smith u_int16_t me_mem_speed; 2881ac4b82bSMike Smith u_int16_t me_hardware_speed; 2899eee27f1SMike Smith u_int8_t res4[12]; 2901ac4b82bSMike Smith u_int16_t me_max_commands; 2911ac4b82bSMike Smith u_int16_t me_max_sg; 2921ac4b82bSMike Smith u_int16_t me_max_dp; 2931ac4b82bSMike Smith u_int16_t me_max_iod; 2941ac4b82bSMike Smith u_int16_t me_max_comb; 2951ac4b82bSMike Smith u_int8_t me_latency; 2961ac4b82bSMike Smith u_int8_t res5; 2971ac4b82bSMike Smith u_int8_t me_scsi_timeout; 2981ac4b82bSMike Smith u_int8_t res6; 2991ac4b82bSMike Smith u_int16_t me_min_freelines; 3001ac4b82bSMike Smith u_int8_t res7[8]; 3011ac4b82bSMike Smith u_int8_t me_rate_const; 3021ac4b82bSMike Smith u_int8_t res8[11]; 3031ac4b82bSMike Smith u_int16_t me_physblk; 3041ac4b82bSMike Smith u_int16_t me_logblk; 3051ac4b82bSMike Smith u_int16_t me_maxblk; 3061ac4b82bSMike Smith u_int16_t me_blocking_factor; 3071ac4b82bSMike Smith u_int16_t me_cacheline; 3081ac4b82bSMike Smith u_int8_t me_scsi_cap; 3091ac4b82bSMike Smith u_int8_t res9[5]; 3109eee27f1SMike Smith u_int16_t me_firmware_build; 3111ac4b82bSMike Smith u_int8_t me_fault_mgmt_type; 3121ac4b82bSMike Smith u_int8_t res10; 3131ac4b82bSMike Smith u_int32_t me_firmware_features; 3141ac4b82bSMike Smith u_int8_t res11[8]; 3154f492bfaSAlfred Perlstein } __packed; 3161ac4b82bSMike Smith 3171ac4b82bSMike Smith struct mlx_enq_sys_drive /* MLX_CMD_ENQSYSDRIVE returns an array of 32 of these */ 3181ac4b82bSMike Smith { 3191ac4b82bSMike Smith u_int32_t sd_size; 3201ac4b82bSMike Smith u_int8_t sd_state; 3211ac4b82bSMike Smith u_int8_t sd_raidlevel; 3221ac4b82bSMike Smith u_int16_t res1; 3234f492bfaSAlfred Perlstein } __packed; 3241ac4b82bSMike Smith 3251ac4b82bSMike Smith struct mlx_eventlog_entry /* MLX_CMD_LOGOP/MLX_LOGOP_GET */ 3261ac4b82bSMike Smith { 3271ac4b82bSMike Smith u_int8_t el_type; 3281ac4b82bSMike Smith u_int8_t el_length; 3291ac4b82bSMike Smith u_char el_target:5; 3301ac4b82bSMike Smith u_char el_channel:3; 3311ac4b82bSMike Smith u_char el_lun:6; 3321ac4b82bSMike Smith u_char res1:2; 3331ac4b82bSMike Smith u_int16_t el_seqno; 3341ac4b82bSMike Smith u_char el_errorcode:7; 3351ac4b82bSMike Smith u_char el_valid:1; 3361ac4b82bSMike Smith u_int8_t el_segment; 3371ac4b82bSMike Smith u_char el_sensekey:4; 3381ac4b82bSMike Smith u_char res2:1; 3391ac4b82bSMike Smith u_char el_ILI:1; 3401ac4b82bSMike Smith u_char el_EOM:1; 3411ac4b82bSMike Smith u_char el_filemark:1; 3421ac4b82bSMike Smith u_int8_t el_information[4]; 3431ac4b82bSMike Smith u_int8_t el_addsense; 3441ac4b82bSMike Smith u_int8_t el_csi[4]; 3451ac4b82bSMike Smith u_int8_t el_asc; 3461ac4b82bSMike Smith u_int8_t el_asq; 3471ac4b82bSMike Smith u_int8_t res3[12]; 3484f492bfaSAlfred Perlstein } __packed; 3491ac4b82bSMike Smith 3501ac4b82bSMike Smith #define MLX_LOGOP_GET 0x00 /* operation codes for MLX_CMD_LOGOP */ 3511ac4b82bSMike Smith #define MLX_LOGMSG_SENSE 0x00 /* log message contents codes */ 3521ac4b82bSMike Smith 3531ac4b82bSMike Smith struct mlx_rebuild_stat /* MLX_CMD_REBUILDSTAT */ 3541ac4b82bSMike Smith { 3551ac4b82bSMike Smith u_int32_t rb_drive; 3561ac4b82bSMike Smith u_int32_t rb_size; 3571ac4b82bSMike Smith u_int32_t rb_remaining; 3584f492bfaSAlfred Perlstein } __packed; 3591ac4b82bSMike Smith 360da8bb3a3SMike Smith struct mlx_config2 361da8bb3a3SMike Smith { 362da8bb3a3SMike Smith u_int16_t cf_flags1; 363da8bb3a3SMike Smith #define MLX_CF2_ACTV_NEG (1<<1) 364da8bb3a3SMike Smith #define MLX_CF2_NORSTRTRY (1<<7) 365da8bb3a3SMike Smith #define MLX_CF2_STRGWRK (1<<8) 366da8bb3a3SMike Smith #define MLX_CF2_HPSUPP (1<<9) 367da8bb3a3SMike Smith #define MLX_CF2_NODISCN (1<<10) 368da8bb3a3SMike Smith #define MLX_CF2_ARM (1<<13) 369da8bb3a3SMike Smith #define MLX_CF2_OFM (1<<15) 370da8bb3a3SMike Smith #define MLX_CF2_AEMI (MLX_CF2_ARM | MLX_CF2_OFM) 371da8bb3a3SMike Smith u_int8_t cf_oemid; 372da8bb3a3SMike Smith u_int8_t cf_oem_model; 373da8bb3a3SMike Smith u_int8_t cf_physical_sector; 374da8bb3a3SMike Smith u_int8_t cf_logical_sector; 375da8bb3a3SMike Smith u_int8_t cf_blockfactor; 376da8bb3a3SMike Smith u_int8_t cf_flags2; 377da8bb3a3SMike Smith #define MLX_CF2_READAH (1<<0) 378da8bb3a3SMike Smith #define MLX_CF2_BIOSDLY (1<<1) 379da8bb3a3SMike Smith #define MLX_CF2_REASS1S (1<<4) 380da8bb3a3SMike Smith #define MLX_CF2_FUAENABL (1<<6) 381da8bb3a3SMike Smith #define MLX_CF2_R5ALLS (1<<7) 382da8bb3a3SMike Smith u_int8_t cf_rcrate; 383da8bb3a3SMike Smith u_int8_t cf_res1; 384da8bb3a3SMike Smith u_int8_t cf_blocks_per_cache_line; 385da8bb3a3SMike Smith u_int8_t cf_blocks_per_stripe; 386da8bb3a3SMike Smith u_int8_t cf_scsi_param_0; 387da8bb3a3SMike Smith u_int8_t cf_scsi_param_1; 388da8bb3a3SMike Smith u_int8_t cf_scsi_param_2; 389da8bb3a3SMike Smith u_int8_t cf_scsi_param_3; 390da8bb3a3SMike Smith u_int8_t cf_scsi_param_4; 391da8bb3a3SMike Smith u_int8_t cf_scsi_param_5; 392da8bb3a3SMike Smith u_int8_t cf_scsi_initiator_id; 393da8bb3a3SMike Smith u_int8_t cf_res2; 394da8bb3a3SMike Smith u_int8_t cf_startup_mode; 395da8bb3a3SMike Smith u_int8_t cf_simultaneous_spinup_devices; 396da8bb3a3SMike Smith u_int8_t cf_delay_between_spinups; 397da8bb3a3SMike Smith u_int8_t cf_res3; 398da8bb3a3SMike Smith u_int16_t cf_checksum; 3994f492bfaSAlfred Perlstein } __packed; 400da8bb3a3SMike Smith 401da8bb3a3SMike Smith struct mlx_sys_drv_span 402da8bb3a3SMike Smith { 403da8bb3a3SMike Smith u_int32_t sp_start_lba; 404da8bb3a3SMike Smith u_int32_t sp_nblks; 405da8bb3a3SMike Smith u_int8_t sp_arm[8]; 4064f492bfaSAlfred Perlstein } __packed; 407da8bb3a3SMike Smith 408da8bb3a3SMike Smith struct mlx_sys_drv 409da8bb3a3SMike Smith { 410da8bb3a3SMike Smith u_int8_t sd_status; 411da8bb3a3SMike Smith u_int8_t sd_ext_status; 412da8bb3a3SMike Smith u_int8_t sd_mod1; 413da8bb3a3SMike Smith u_int8_t sd_mod2; 414da8bb3a3SMike Smith u_int8_t sd_raidlevel; 415da8bb3a3SMike Smith #define MLX_SYS_DRV_WRITEBACK (1<<7) 416da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID0 0 417da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID1 1 418da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID3 3 419da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID5 5 420da8bb3a3SMike Smith #define MLX_SYS_DRV_RAID6 6 421da8bb3a3SMike Smith #define MLX_SYS_DRV_JBOD 7 422da8bb3a3SMike Smith u_int8_t sd_valid_arms; 423da8bb3a3SMike Smith u_int8_t sd_valid_spans; 424da8bb3a3SMike Smith u_int8_t sd_init_state; 425da8bb3a3SMike Smith #define MLX_SYS_DRV_INITTED 0x81; 426da8bb3a3SMike Smith struct mlx_sys_drv_span sd_span[4]; 4274f492bfaSAlfred Perlstein } __packed; 428da8bb3a3SMike Smith 429da8bb3a3SMike Smith struct mlx_phys_drv 430da8bb3a3SMike Smith { 431da8bb3a3SMike Smith u_int8_t pd_flags1; 432da8bb3a3SMike Smith #define MLX_PHYS_DRV_PRESENT (1<<0) 433da8bb3a3SMike Smith u_int8_t pd_flags2; 434da8bb3a3SMike Smith #define MLX_PHYS_DRV_OTHER 0x00 435da8bb3a3SMike Smith #define MLX_PHYS_DRV_DISK 0x01 436da8bb3a3SMike Smith #define MLX_PHYS_DRV_SEQUENTIAL 0x02 437da8bb3a3SMike Smith #define MLX_PHYS_DRV_CDROM 0x03 438da8bb3a3SMike Smith #define MLX_PHYS_DRV_FAST20 (1<<3) 439da8bb3a3SMike Smith #define MLX_PHYS_DRV_SYNC (1<<4) 440da8bb3a3SMike Smith #define MLX_PHYS_DRV_FAST (1<<5) 441da8bb3a3SMike Smith #define MLX_PHYS_DRV_WIDE (1<<6) 442da8bb3a3SMike Smith #define MLX_PHYS_DRV_TAG (1<<7) 443da8bb3a3SMike Smith u_int8_t pd_status; 444da8bb3a3SMike Smith #define MLX_PHYS_DRV_DEAD 0x00 445da8bb3a3SMike Smith #define MLX_PHYS_DRV_WRONLY 0x02 446da8bb3a3SMike Smith #define MLX_PHYS_DRV_ONLINE 0x03 447da8bb3a3SMike Smith #define MLX_PHYS_DRV_STANDBY 0x10 448da8bb3a3SMike Smith u_int8_t pd_res1; 449da8bb3a3SMike Smith u_int8_t pd_period; 450da8bb3a3SMike Smith u_int8_t pd_offset; 451da8bb3a3SMike Smith u_int32_t pd_config_size; 4524f492bfaSAlfred Perlstein } __packed; 453da8bb3a3SMike Smith 454da8bb3a3SMike Smith struct mlx_core_cfg 455da8bb3a3SMike Smith { 456da8bb3a3SMike Smith u_int8_t cc_num_sys_drives; 457da8bb3a3SMike Smith u_int8_t cc_res1[3]; 458da8bb3a3SMike Smith struct mlx_sys_drv cc_sys_drives[32]; 459da8bb3a3SMike Smith struct mlx_phys_drv cc_phys_drives[5 * 16]; 4604f492bfaSAlfred Perlstein } __packed; 461da8bb3a3SMike Smith 462da8bb3a3SMike Smith struct mlx_dcdb 463da8bb3a3SMike Smith { 464da8bb3a3SMike Smith u_int8_t dcdb_target:4; 465da8bb3a3SMike Smith u_int8_t dcdb_channel:4; 466da8bb3a3SMike Smith u_int8_t dcdb_flags; 467da8bb3a3SMike Smith #define MLX_DCDB_NO_DATA 0x00 468da8bb3a3SMike Smith #define MLX_DCDB_DATA_IN 0x01 469da8bb3a3SMike Smith #define MLX_DCDB_DATA_OUT 0x02 470da8bb3a3SMike Smith #define MLX_DCDB_EARLY_STATUS (1<<2) 471da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_10S 0x10 472da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_60S 0x20 473da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_20M 0x30 474da8bb3a3SMike Smith #define MLX_DCDB_TIMEOUT_24H 0x40 475da8bb3a3SMike Smith #define MLX_DCDB_NO_AUTO_SENSE (1<<6) 476da8bb3a3SMike Smith #define MLX_DCDB_DISCONNECT (1<<7) 477da8bb3a3SMike Smith u_int16_t dcdb_datasize; 478da8bb3a3SMike Smith u_int32_t dcdb_physaddr; 479da8bb3a3SMike Smith u_int8_t dcdb_cdb_length:4; 480da8bb3a3SMike Smith u_int8_t dcdb_datasize_high:4; 481da8bb3a3SMike Smith u_int8_t dcdb_sense_length; 482da8bb3a3SMike Smith u_int8_t dcdb_cdb[12]; 483da8bb3a3SMike Smith u_int8_t dcdb_sense[64]; 484da8bb3a3SMike Smith u_int8_t dcdb_status; 485da8bb3a3SMike Smith u_int8_t res1; 4864f492bfaSAlfred Perlstein } __packed; 487da8bb3a3SMike Smith 488421f2f7dSMike Smith struct mlx_bbtable_entry 489421f2f7dSMike Smith { 490421f2f7dSMike Smith u_int32_t bbt_block_number; 491421f2f7dSMike Smith u_int8_t bbt_extent; 492421f2f7dSMike Smith u_int8_t res1; 493421f2f7dSMike Smith u_int8_t bbt_entry_type; 494421f2f7dSMike Smith u_int8_t bbt_system_drive:5; 495421f2f7dSMike Smith u_int8_t res2:3; 4964f492bfaSAlfred Perlstein } __packed; 497421f2f7dSMike Smith 498da8bb3a3SMike Smith #ifdef _KERNEL 4994b006d7bSMike Smith /* 5004b006d7bSMike Smith * Inlines to build various command structures 5014b006d7bSMike Smith */ 5024b006d7bSMike Smith static __inline void 5034b006d7bSMike Smith mlx_make_type1(struct mlx_command *mc, 5044b006d7bSMike Smith u_int8_t code, 5054b006d7bSMike Smith u_int16_t f1, 5064b006d7bSMike Smith u_int32_t f2, 5074b006d7bSMike Smith u_int8_t f3, 5084b006d7bSMike Smith u_int32_t f4, 5094b006d7bSMike Smith u_int8_t f5) 5104b006d7bSMike Smith { 5114b006d7bSMike Smith mc->mc_mailbox[0x0] = code; 5124b006d7bSMike Smith mc->mc_mailbox[0x2] = f1 & 0xff; 5134b006d7bSMike Smith mc->mc_mailbox[0x3] = (((f2 >> 24) & 0x3) << 6) | ((f1 >> 8) & 0x3f); 5144b006d7bSMike Smith mc->mc_mailbox[0x4] = f2 & 0xff; 5154b006d7bSMike Smith mc->mc_mailbox[0x5] = (f2 >> 8) & 0xff; 5164b006d7bSMike Smith mc->mc_mailbox[0x6] = (f2 >> 16) & 0xff; 5174b006d7bSMike Smith mc->mc_mailbox[0x7] = f3; 5184b006d7bSMike Smith mc->mc_mailbox[0x8] = f4 & 0xff; 5194b006d7bSMike Smith mc->mc_mailbox[0x9] = (f4 >> 8) & 0xff; 5204b006d7bSMike Smith mc->mc_mailbox[0xa] = (f4 >> 16) & 0xff; 5214b006d7bSMike Smith mc->mc_mailbox[0xb] = (f4 >> 24) & 0xff; 5224b006d7bSMike Smith mc->mc_mailbox[0xc] = f5; 5234b006d7bSMike Smith } 5244b006d7bSMike Smith 5254b006d7bSMike Smith static __inline void 5264b006d7bSMike Smith mlx_make_type2(struct mlx_command *mc, 5274b006d7bSMike Smith u_int8_t code, 5284b006d7bSMike Smith u_int8_t f1, 5294b006d7bSMike Smith u_int8_t f2, 5304b006d7bSMike Smith u_int8_t f3, 5314b006d7bSMike Smith u_int8_t f4, 5324b006d7bSMike Smith u_int8_t f5, 5334b006d7bSMike Smith u_int8_t f6, 5344b006d7bSMike Smith u_int32_t f7, 5354b006d7bSMike Smith u_int8_t f8) 5364b006d7bSMike Smith { 5374b006d7bSMike Smith mc->mc_mailbox[0x0] = code; 5384b006d7bSMike Smith mc->mc_mailbox[0x2] = f1; 5394b006d7bSMike Smith mc->mc_mailbox[0x3] = f2; 5404b006d7bSMike Smith mc->mc_mailbox[0x4] = f3; 5414b006d7bSMike Smith mc->mc_mailbox[0x5] = f4; 5424b006d7bSMike Smith mc->mc_mailbox[0x6] = f5; 5434b006d7bSMike Smith mc->mc_mailbox[0x7] = f6; 5444b006d7bSMike Smith mc->mc_mailbox[0x8] = f7 & 0xff; 5454b006d7bSMike Smith mc->mc_mailbox[0x9] = (f7 >> 8) & 0xff; 5464b006d7bSMike Smith mc->mc_mailbox[0xa] = (f7 >> 16) & 0xff; 5474b006d7bSMike Smith mc->mc_mailbox[0xb] = (f7 >> 24) & 0xff; 5484b006d7bSMike Smith mc->mc_mailbox[0xc] = f8; 5494b006d7bSMike Smith } 5504b006d7bSMike Smith 5514b006d7bSMike Smith static __inline void 5524b006d7bSMike Smith mlx_make_type3(struct mlx_command *mc, 5534b006d7bSMike Smith u_int8_t code, 5544b006d7bSMike Smith u_int8_t f1, 5554b006d7bSMike Smith u_int8_t f2, 5564b006d7bSMike Smith u_int16_t f3, 5574b006d7bSMike Smith u_int8_t f4, 5584b006d7bSMike Smith u_int8_t f5, 5594b006d7bSMike Smith u_int32_t f6, 5604b006d7bSMike Smith u_int8_t f7) 5614b006d7bSMike Smith { 5624b006d7bSMike Smith mc->mc_mailbox[0x0] = code; 5634b006d7bSMike Smith mc->mc_mailbox[0x2] = f1; 5644b006d7bSMike Smith mc->mc_mailbox[0x3] = f2; 5654b006d7bSMike Smith mc->mc_mailbox[0x4] = f3 & 0xff; 5664b006d7bSMike Smith mc->mc_mailbox[0x5] = (f3 >> 8) & 0xff; 5674b006d7bSMike Smith mc->mc_mailbox[0x6] = f4; 5684b006d7bSMike Smith mc->mc_mailbox[0x7] = f5; 5694b006d7bSMike Smith mc->mc_mailbox[0x8] = f6 & 0xff; 5704b006d7bSMike Smith mc->mc_mailbox[0x9] = (f6 >> 8) & 0xff; 5714b006d7bSMike Smith mc->mc_mailbox[0xa] = (f6 >> 16) & 0xff; 5724b006d7bSMike Smith mc->mc_mailbox[0xb] = (f6 >> 24) & 0xff; 5734b006d7bSMike Smith mc->mc_mailbox[0xc] = f7; 5744b006d7bSMike Smith } 5754b006d7bSMike Smith 5764b006d7bSMike Smith static __inline void 5774b006d7bSMike Smith mlx_make_type4(struct mlx_command *mc, 5784b006d7bSMike Smith u_int8_t code, 5794b006d7bSMike Smith u_int16_t f1, 5804b006d7bSMike Smith u_int32_t f2, 5814b006d7bSMike Smith u_int32_t f3, 5824b006d7bSMike Smith u_int8_t f4) 5834b006d7bSMike Smith { 5844b006d7bSMike Smith mc->mc_mailbox[0x0] = code; 5854b006d7bSMike Smith mc->mc_mailbox[0x2] = f1 & 0xff; 5864b006d7bSMike Smith mc->mc_mailbox[0x3] = (f1 >> 8) & 0xff; 5874b006d7bSMike Smith mc->mc_mailbox[0x4] = f2 & 0xff; 5884b006d7bSMike Smith mc->mc_mailbox[0x5] = (f2 >> 8) & 0xff; 5894b006d7bSMike Smith mc->mc_mailbox[0x6] = (f2 >> 16) & 0xff; 5904b006d7bSMike Smith mc->mc_mailbox[0x7] = (f2 >> 24) & 0xff; 5914b006d7bSMike Smith mc->mc_mailbox[0x8] = f3 & 0xff; 5924b006d7bSMike Smith mc->mc_mailbox[0x9] = (f3 >> 8) & 0xff; 5934b006d7bSMike Smith mc->mc_mailbox[0xa] = (f3 >> 16) & 0xff; 5944b006d7bSMike Smith mc->mc_mailbox[0xb] = (f3 >> 24) & 0xff; 5954b006d7bSMike Smith mc->mc_mailbox[0xc] = f4; 5964b006d7bSMike Smith } 5974b006d7bSMike Smith 5984b006d7bSMike Smith static __inline void 5994b006d7bSMike Smith mlx_make_type5(struct mlx_command *mc, 6004b006d7bSMike Smith u_int8_t code, 6014b006d7bSMike Smith u_int8_t f1, 6024b006d7bSMike Smith u_int8_t f2, 6034b006d7bSMike Smith u_int32_t f3, 6044b006d7bSMike Smith u_int32_t f4, 6054b006d7bSMike Smith u_int8_t f5) 6064b006d7bSMike Smith { 6074b006d7bSMike Smith mc->mc_mailbox[0x0] = code; 6084b006d7bSMike Smith mc->mc_mailbox[0x2] = f1; 6094b006d7bSMike Smith mc->mc_mailbox[0x3] = f2; 6104b006d7bSMike Smith mc->mc_mailbox[0x4] = f3 & 0xff; 6114b006d7bSMike Smith mc->mc_mailbox[0x5] = (f3 >> 8) & 0xff; 6124b006d7bSMike Smith mc->mc_mailbox[0x6] = (f3 >> 16) & 0xff; 6134b006d7bSMike Smith mc->mc_mailbox[0x7] = (f3 >> 24) & 0xff; 6144b006d7bSMike Smith mc->mc_mailbox[0x8] = f4 & 0xff; 6154b006d7bSMike Smith mc->mc_mailbox[0x9] = (f4 >> 8) & 0xff; 6164b006d7bSMike Smith mc->mc_mailbox[0xa] = (f4 >> 16) & 0xff; 6174b006d7bSMike Smith mc->mc_mailbox[0xb] = (f4 >> 24) & 0xff; 6184b006d7bSMike Smith mc->mc_mailbox[0xc] = f5; 6194b006d7bSMike Smith } 620da8bb3a3SMike Smith 621da8bb3a3SMike Smith #endif /* _KERNEL */ 622