186d7f5d3SJohn Marino /*- 286d7f5d3SJohn Marino * Copyright (c) 2000 Michael Smith 386d7f5d3SJohn Marino * Copyright (c) 2000 BSDi 486d7f5d3SJohn Marino * All rights reserved. 586d7f5d3SJohn Marino * 686d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without 786d7f5d3SJohn Marino * modification, are permitted provided that the following conditions 886d7f5d3SJohn Marino * are met: 986d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright 1086d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer. 1186d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 1286d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the 1386d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution. 1486d7f5d3SJohn Marino * 1586d7f5d3SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1686d7f5d3SJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1786d7f5d3SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1886d7f5d3SJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1986d7f5d3SJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2086d7f5d3SJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2186d7f5d3SJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2286d7f5d3SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2386d7f5d3SJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2486d7f5d3SJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2586d7f5d3SJohn Marino * SUCH DAMAGE. 2686d7f5d3SJohn Marino * 2786d7f5d3SJohn Marino * $FreeBSD: src/sys/dev/mly/mlyreg.h,v 1.2 2002/09/23 18:54:30 alfred Exp $ 2886d7f5d3SJohn Marino */ 2986d7f5d3SJohn Marino 3086d7f5d3SJohn Marino /* 3186d7f5d3SJohn Marino * Section numbers in this document refer to the Mylex "Firmware Software Interface" 3286d7f5d3SJohn Marino * document ('FSI'), revision 0.11 04/11/00 unless otherwise qualified. 3386d7f5d3SJohn Marino * 3486d7f5d3SJohn Marino * Reference is made to the Mylex "Programming Guide for 6.x Controllers" document 3586d7f5d3SJohn Marino * ('PG6'), document #771242 revision 0.02, 04/11/00 3686d7f5d3SJohn Marino * 3786d7f5d3SJohn Marino * Note that fields marked N/A are not supported by the PCI controllers, but are 3886d7f5d3SJohn Marino * defined here to hold place in datastructures that are shared with the SCSI 3986d7f5d3SJohn Marino * controllers. Items not relevant to PCI controllers are not described here. 4086d7f5d3SJohn Marino * 4186d7f5d3SJohn Marino * Ordering of items in this file is a little odd due to the constraints of 4286d7f5d3SJohn Marino * nested declarations. 4386d7f5d3SJohn Marino */ 4486d7f5d3SJohn Marino 4586d7f5d3SJohn Marino /* 4686d7f5d3SJohn Marino * 2.1 (Scatter Gather List Format) 4786d7f5d3SJohn Marino */ 4886d7f5d3SJohn Marino struct mly_sg_entry { 4986d7f5d3SJohn Marino u_int64_t physaddr; 5086d7f5d3SJohn Marino u_int64_t length; 5186d7f5d3SJohn Marino } __packed; 5286d7f5d3SJohn Marino 5386d7f5d3SJohn Marino /* 5486d7f5d3SJohn Marino * 5.2 System Device Access 5586d7f5d3SJohn Marino * 5686d7f5d3SJohn Marino * This is corroborated by the layout of the MDACIOCTL_GETCONTROLLERINFO data 5786d7f5d3SJohn Marino * in 21.8 5886d7f5d3SJohn Marino */ 5986d7f5d3SJohn Marino #define MLY_MAX_CHANNELS 6 6086d7f5d3SJohn Marino #define MLY_MAX_TARGETS 16 6186d7f5d3SJohn Marino #define MLY_MAX_LUNS 1 6286d7f5d3SJohn Marino 6386d7f5d3SJohn Marino /* 6486d7f5d3SJohn Marino * 8.1 Different Device States 6586d7f5d3SJohn Marino */ 6686d7f5d3SJohn Marino #define MLY_DEVICE_STATE_OFFLINE 0x08 /* DEAD/OFFLINE */ 6786d7f5d3SJohn Marino #define MLY_DEVICE_STATE_UNCONFIGURED 0x00 6886d7f5d3SJohn Marino #define MLY_DEVICE_STATE_ONLINE 0x01 6986d7f5d3SJohn Marino #define MLY_DEVICE_STATE_CRITICAL 0x09 7086d7f5d3SJohn Marino #define MLY_DEVICE_STATE_WRITEONLY 0x03 7186d7f5d3SJohn Marino #define MLY_DEVICE_STATE_STANDBY 0x21 7286d7f5d3SJohn Marino #define MLY_DEVICE_STATE_MISSING 0x04 /* or-ed with (ONLINE or WRITEONLY or STANDBY) */ 7386d7f5d3SJohn Marino 7486d7f5d3SJohn Marino /* 7586d7f5d3SJohn Marino * 8.2 Device Type Field definitions 7686d7f5d3SJohn Marino */ 7786d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID0 0x0 /* RAID 0 */ 7886d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID1 0x1 /* RAID 1 */ 7986d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID3 0x3 /* RAID 3 right asymmetric parity */ 8086d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID5 0x5 /* RAID 5 right asymmetric parity */ 8186d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID6 0x6 /* RAID 6 (Mylex RAID 6) */ 8286d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID7 0x7 /* RAID 7 (JBOD) */ 8386d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_NEWSPAN 0x8 /* New Mylex SPAN */ 8486d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID3F 0x9 /* RAID 3 fixed parity */ 8586d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID3L 0xb /* RAID 3 left symmetric parity */ 8686d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_SPAN 0xc /* current spanning implementation */ 8786d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAID5L 0xd /* RAID 5 left symmetric parity */ 8886d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_RAIDE 0xe /* RAID E (concatenation) */ 8986d7f5d3SJohn Marino #define MLY_DEVICE_TYPE_PHYSICAL 0xf /* physical device */ 9086d7f5d3SJohn Marino 9186d7f5d3SJohn Marino /* 9286d7f5d3SJohn Marino * 8.3 Stripe Size 9386d7f5d3SJohn Marino */ 9486d7f5d3SJohn Marino #define MLY_STRIPE_ZERO 0x0 /* no stripe (RAID 1, RAID 7, etc) */ 9586d7f5d3SJohn Marino #define MLY_STRIPE_512b 0x1 9686d7f5d3SJohn Marino #define MLY_STRIPE_1k 0x2 9786d7f5d3SJohn Marino #define MLY_STRIPE_2k 0x3 9886d7f5d3SJohn Marino #define MLY_STRIPE_4k 0x4 9986d7f5d3SJohn Marino #define MLY_STRIPE_8k 0x5 10086d7f5d3SJohn Marino #define MLY_STRIPE_16k 0x6 10186d7f5d3SJohn Marino #define MLY_STRIPE_32k 0x7 10286d7f5d3SJohn Marino #define MLY_STRIPE_64k 0x8 10386d7f5d3SJohn Marino #define MLY_STRIPE_128k 0x9 10486d7f5d3SJohn Marino #define MLY_STRIPE_256k 0xa 10586d7f5d3SJohn Marino #define MLY_STRIPE_512k 0xb 10686d7f5d3SJohn Marino #define MLY_STRIPE_1m 0xc 10786d7f5d3SJohn Marino 10886d7f5d3SJohn Marino /* 10986d7f5d3SJohn Marino * 8.4 Cacheline Size 11086d7f5d3SJohn Marino */ 11186d7f5d3SJohn Marino #define MLY_CACHELINE_ZERO 0x0 /* caching cannot be enabled */ 11286d7f5d3SJohn Marino #define MLY_CACHELINE_512b 0x1 11386d7f5d3SJohn Marino #define MLY_CACHELINE_1k 0x2 11486d7f5d3SJohn Marino #define MLY_CACHELINE_2k 0x3 11586d7f5d3SJohn Marino #define MLY_CACHELINE_4k 0x4 11686d7f5d3SJohn Marino #define MLY_CACHELINE_8k 0x5 11786d7f5d3SJohn Marino #define MLY_CACHELINE_16k 0x6 11886d7f5d3SJohn Marino #define MLY_CACHELINE_32k 0x7 11986d7f5d3SJohn Marino #define MLY_CACHELINE_64k 0x8 12086d7f5d3SJohn Marino 12186d7f5d3SJohn Marino /* 12286d7f5d3SJohn Marino * 8.5 Read/Write control 12386d7f5d3SJohn Marino */ 12486d7f5d3SJohn Marino #define MLY_RWCtl_INITTED (1<<7) /* if set, the logical device is initialised */ 12586d7f5d3SJohn Marino /* write control */ 12686d7f5d3SJohn Marino #define MLY_RWCtl_WCD (0) /* write cache disabled */ 12786d7f5d3SJohn Marino #define MLY_RWCtl_WDISABLE (1<<3) /* writing disabled */ 12886d7f5d3SJohn Marino #define MLY_RWCtl_WCE (2<<3) /* write cache enabled */ 12986d7f5d3SJohn Marino #define MLY_RWCtl_IWCE (3<<3) /* intelligent write cache enabled */ 13086d7f5d3SJohn Marino /* read control */ 13186d7f5d3SJohn Marino #define MLY_RWCtl_RCD (0) /* read cache is disabled */ 13286d7f5d3SJohn Marino #define MLY_RWCtl_RCE (1) /* read cache enabled */ 13386d7f5d3SJohn Marino #define MLY_RWCtl_RAHEAD (2) /* readahead enabled */ 13486d7f5d3SJohn Marino #define MLY_RWCtl_IRAHEAD (3) /* intelligent readahead enabled */ 13586d7f5d3SJohn Marino 13686d7f5d3SJohn Marino /* 13786d7f5d3SJohn Marino * 9.0 LUN Map Format 13886d7f5d3SJohn Marino */ 13986d7f5d3SJohn Marino struct mly_lun_map { 14086d7f5d3SJohn Marino u_int8_t res1:4; 14186d7f5d3SJohn Marino u_int8_t host_port_mapped:1; /* this system drive visibile to host on this controller/port combination */ 14286d7f5d3SJohn Marino u_int8_t tid_valid:1; /* target ID valid */ 14386d7f5d3SJohn Marino u_int8_t hid_valid:1; /* host ID valid */ 14486d7f5d3SJohn Marino u_int8_t lun_valid:1; /* LUN valid */ 14586d7f5d3SJohn Marino u_int8_t res2; 14686d7f5d3SJohn Marino u_int8_t lun; /* LUN */ 14786d7f5d3SJohn Marino u_int8_t tid; /* TID */ 14886d7f5d3SJohn Marino u_int8_t hid[32]; /* HID (one bit for each host) */ 14986d7f5d3SJohn Marino } __packed; 15086d7f5d3SJohn Marino 15186d7f5d3SJohn Marino /* 15286d7f5d3SJohn Marino * 10.1 Controller Parameters 15386d7f5d3SJohn Marino */ 15486d7f5d3SJohn Marino struct mly_param_controller { 15586d7f5d3SJohn Marino u_int8_t rdahen:1; /* N/A */ 15686d7f5d3SJohn Marino u_int8_t bilodly:1; /* N/A */ 15786d7f5d3SJohn Marino u_int8_t fua_disable:1; 15886d7f5d3SJohn Marino u_int8_t reass1s:1; /* N/A */ 15986d7f5d3SJohn Marino u_int8_t truvrfy:1; /* N/A */ 16086d7f5d3SJohn Marino u_int8_t dwtvrfy:1; /* N/A */ 16186d7f5d3SJohn Marino u_int8_t background_initialisation:1; 16286d7f5d3SJohn Marino u_int8_t clustering:1; /* N/A */ 16386d7f5d3SJohn Marino 16486d7f5d3SJohn Marino u_int8_t bios_disable:1; 16586d7f5d3SJohn Marino u_int8_t boot_from_cdrom:1; 16686d7f5d3SJohn Marino u_int8_t drive_coercion:1; 16786d7f5d3SJohn Marino u_int8_t write_same_disable:1; 16886d7f5d3SJohn Marino u_int8_t hba_mode:1; /* N/A */ 16986d7f5d3SJohn Marino u_int8_t bios_geometry:2; 17086d7f5d3SJohn Marino #define MLY_BIOSGEOM_2G 0x0 17186d7f5d3SJohn Marino #define MLY_BIOSGEOM_8G 0x1 17286d7f5d3SJohn Marino u_int8_t res1:1; /* N/A */ 17386d7f5d3SJohn Marino 17486d7f5d3SJohn Marino u_int8_t res2[2]; /* N/A */ 17586d7f5d3SJohn Marino 17686d7f5d3SJohn Marino u_int8_t v_dec:1; 17786d7f5d3SJohn Marino u_int8_t safte:1; /* N/A */ 17886d7f5d3SJohn Marino u_int8_t ses:1; /* N/A */ 17986d7f5d3SJohn Marino u_int8_t res3:2; /* N/A */ 18086d7f5d3SJohn Marino u_int8_t v_arm:1; 18186d7f5d3SJohn Marino u_int8_t v_ofm:1; 18286d7f5d3SJohn Marino u_int8_t res4:1; /* N/A */ 18386d7f5d3SJohn Marino 18486d7f5d3SJohn Marino u_int8_t rebuild_check_rate; 18586d7f5d3SJohn Marino u_int8_t cache_line_size; /* see 8.4 */ 18686d7f5d3SJohn Marino u_int8_t oem_code; 18786d7f5d3SJohn Marino #define MLY_OEM_MYLEX 0x00 18886d7f5d3SJohn Marino #define MLY_OEM_IBM 0x08 18986d7f5d3SJohn Marino #define MLY_OEM_HP 0x0a 19086d7f5d3SJohn Marino #define MLY_OEM_DEC 0x0c 19186d7f5d3SJohn Marino #define MLY_OEM_SIEMENS 0x10 19286d7f5d3SJohn Marino #define MLY_OEM_INTEL 0x12 19386d7f5d3SJohn Marino u_int8_t spinup_mode; 19486d7f5d3SJohn Marino #define MLY_SPIN_AUTO 0 19586d7f5d3SJohn Marino #define MLY_SPIN_PWRSPIN 1 19686d7f5d3SJohn Marino #define MLY_SPIN_WSSUSPIN 2 19786d7f5d3SJohn Marino u_int8_t spinup_devices; 19886d7f5d3SJohn Marino u_int8_t spinup_interval; 19986d7f5d3SJohn Marino u_int8_t spinup_wait_time; 20086d7f5d3SJohn Marino 20186d7f5d3SJohn Marino u_int8_t res5:3; /* N/A */ 20286d7f5d3SJohn Marino u_int8_t vutursns:1; /* N/A */ 20386d7f5d3SJohn Marino u_int8_t dccfil:1; /* N/A */ 20486d7f5d3SJohn Marino u_int8_t nopause:1; /* N/A */ 20586d7f5d3SJohn Marino u_int8_t disqfull:1; /* N/A */ 20686d7f5d3SJohn Marino u_int8_t disbusy:1; /* N/A */ 20786d7f5d3SJohn Marino 20886d7f5d3SJohn Marino u_int8_t res6:2; /* N/A */ 20986d7f5d3SJohn Marino u_int8_t failover_node_name; /* N/A */ 21086d7f5d3SJohn Marino u_int8_t res7:1; /* N/A */ 21186d7f5d3SJohn Marino u_int8_t ftopo:3; /* N/A */ 21286d7f5d3SJohn Marino u_int8_t disable_ups:1; /* N/A */ 21386d7f5d3SJohn Marino 21486d7f5d3SJohn Marino u_int8_t res8:1; /* N/A */ 21586d7f5d3SJohn Marino u_int8_t propagate_reset:1; /* N/A */ 21686d7f5d3SJohn Marino u_int8_t nonstd_mp_reset:1; /* N/A */ 21786d7f5d3SJohn Marino u_int8_t res9:5; /* N/A */ 21886d7f5d3SJohn Marino 21986d7f5d3SJohn Marino u_int8_t res10; /* N/A */ 22086d7f5d3SJohn Marino u_int8_t serial_port_baud_rate; /* N/A */ 22186d7f5d3SJohn Marino u_int8_t serial_port_control; /* N/A */ 22286d7f5d3SJohn Marino u_int8_t change_stripe_ok_developer_flag_only; /* N/A */ 22386d7f5d3SJohn Marino 22486d7f5d3SJohn Marino u_int8_t small_large_host_transfers:2; /* N/A */ 22586d7f5d3SJohn Marino u_int8_t frame_control:2; /* N/A */ 22686d7f5d3SJohn Marino u_int8_t pci_latency_control:2; /* N/A */ 22786d7f5d3SJohn Marino u_int8_t treat_lip_as_reset:1; /* N/A */ 22886d7f5d3SJohn Marino u_int8_t res11:1; /* N/A */ 22986d7f5d3SJohn Marino 23086d7f5d3SJohn Marino u_int8_t ms_autorest:1; /* N/A */ 23186d7f5d3SJohn Marino u_int8_t res12:7; /* N/A */ 23286d7f5d3SJohn Marino 23386d7f5d3SJohn Marino u_int8_t ms_aa_fsim:1; /* N/A */ 23486d7f5d3SJohn Marino u_int8_t ms_aa_ccach:1; /* N/A */ 23586d7f5d3SJohn Marino u_int8_t ms_aa_fault_signals:1; /* N/A */ 23686d7f5d3SJohn Marino u_int8_t ms_aa_c4_faults:1; /* N/A */ 23786d7f5d3SJohn Marino u_int8_t ms_aa_host_reset_delay_mask:4; /* N/A */ 23886d7f5d3SJohn Marino 23986d7f5d3SJohn Marino u_int8_t ms_flg_simplex_no_rstcom:1; /* N/A */ 24086d7f5d3SJohn Marino u_int8_t res13:7; /* N/A */ 24186d7f5d3SJohn Marino 24286d7f5d3SJohn Marino u_int8_t res14; /* N/A */ 24386d7f5d3SJohn Marino u_int8_t hardloopid[2][2]; /* N/A */ 24486d7f5d3SJohn Marino u_int8_t ctrlname[2][16+1]; /* N/A */ 24586d7f5d3SJohn Marino u_int8_t initiator_id; 24686d7f5d3SJohn Marino u_int8_t startup_option; 24786d7f5d3SJohn Marino #define MLY_STARTUP_IF_NO_CHANGE 0x0 24886d7f5d3SJohn Marino #define MLY_STARTUP_IF_NO_LUN_CHANGE 0x1 24986d7f5d3SJohn Marino #define MLY_STARTUP_IF_NO_LUN_OFFLINE 0x2 25086d7f5d3SJohn Marino #define MLY_STARTUP_IF_LUN0_NO_CHANGE 0x3 25186d7f5d3SJohn Marino #define MLY_STARTUP_IF_LUN0_NOT_OFFLINE 0x4 25286d7f5d3SJohn Marino #define MLY_STARTUP_ALWAYS 0x5 25386d7f5d3SJohn Marino 25486d7f5d3SJohn Marino u_int8_t res15[62]; 25586d7f5d3SJohn Marino } __packed; 25686d7f5d3SJohn Marino 25786d7f5d3SJohn Marino /* 25886d7f5d3SJohn Marino * 10.2 Physical Device Parameters 25986d7f5d3SJohn Marino */ 26086d7f5d3SJohn Marino struct mly_param_physical_device { 26186d7f5d3SJohn Marino u_int16_t tags; 26286d7f5d3SJohn Marino u_int16_t speed; 26386d7f5d3SJohn Marino u_int8_t width; 26486d7f5d3SJohn Marino u_int8_t combing:1; 26586d7f5d3SJohn Marino u_int8_t res1:7; 26686d7f5d3SJohn Marino u_int8_t res2[3]; 26786d7f5d3SJohn Marino } __packed; 26886d7f5d3SJohn Marino 26986d7f5d3SJohn Marino /* 27086d7f5d3SJohn Marino * 10.3 Logical Device Parameters 27186d7f5d3SJohn Marino */ 27286d7f5d3SJohn Marino struct mly_param_logical_device { 27386d7f5d3SJohn Marino u_int8_t type; /* see 8.2 */ 27486d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 27586d7f5d3SJohn Marino u_int16_t raid_device; 27686d7f5d3SJohn Marino u_int8_t res1; 27786d7f5d3SJohn Marino u_int8_t bios_geometry; /* BIOS control word? */ 27886d7f5d3SJohn Marino u_int8_t stripe_size; /* see 8.3 */ 27986d7f5d3SJohn Marino u_int8_t read_write_control; /* see 8.5 */ 28086d7f5d3SJohn Marino u_int8_t res2[8]; 28186d7f5d3SJohn Marino } __packed; 28286d7f5d3SJohn Marino 28386d7f5d3SJohn Marino /* 28486d7f5d3SJohn Marino * 12.3 Health Status Buffer 28586d7f5d3SJohn Marino * 28686d7f5d3SJohn Marino * Pad to 128 bytes. 28786d7f5d3SJohn Marino */ 28886d7f5d3SJohn Marino struct mly_health_status { 28986d7f5d3SJohn Marino u_int32_t uptime_us; /* N/A */ 29086d7f5d3SJohn Marino u_int32_t uptime_ms; /* N/A */ 29186d7f5d3SJohn Marino u_int32_t realtime; /* N/A */ 29286d7f5d3SJohn Marino u_int32_t res1; /* N/A */ 29386d7f5d3SJohn Marino u_int32_t change_counter; 29486d7f5d3SJohn Marino u_int32_t res2; /* N/A */ 29586d7f5d3SJohn Marino u_int32_t debug_message_index; /* N/A */ 29686d7f5d3SJohn Marino u_int32_t bios_message_index; /* N/A */ 29786d7f5d3SJohn Marino u_int32_t trace_page; /* N/A */ 29886d7f5d3SJohn Marino u_int32_t profiler_page; /* N/A */ 29986d7f5d3SJohn Marino u_int32_t next_event; 30086d7f5d3SJohn Marino u_int8_t res3[4 + 16 + 64]; /* N/A */ 30186d7f5d3SJohn Marino } __packed; 30286d7f5d3SJohn Marino 30386d7f5d3SJohn Marino /* 30486d7f5d3SJohn Marino * 14.2 Timeout Bit Format 30586d7f5d3SJohn Marino */ 30686d7f5d3SJohn Marino struct mly_timeout { 30786d7f5d3SJohn Marino u_int8_t value:6; 30886d7f5d3SJohn Marino u_int8_t scale:2; 30986d7f5d3SJohn Marino #define MLY_TIMEOUT_SECONDS 0x0 31086d7f5d3SJohn Marino #define MLY_TIMEOUT_MINUTES 0x1 31186d7f5d3SJohn Marino #define MLY_TIMEOUT_HOURS 0x2 31286d7f5d3SJohn Marino } __packed; 31386d7f5d3SJohn Marino 31486d7f5d3SJohn Marino /* 31586d7f5d3SJohn Marino * 14.3 Operation Device 31686d7f5d3SJohn Marino */ 31786d7f5d3SJohn Marino #define MLY_OPDEVICE_PHYSICAL_DEVICE 0x0 31886d7f5d3SJohn Marino #define MLY_OPDEVICE_RAID_DEVICE 0x1 31986d7f5d3SJohn Marino #define MLY_OPDEVICE_PHYSICAL_CHANNEL 0x2 32086d7f5d3SJohn Marino #define MLY_OPDEVICE_RAID_CHANNEL 0x3 32186d7f5d3SJohn Marino #define MLY_OPDEVICE_PHYSICAL_CONTROLLER 0x4 32286d7f5d3SJohn Marino #define MLY_OPDEVICE_RAID_CONTROLLER 0x5 32386d7f5d3SJohn Marino #define MLY_OPDEVICE_CONFIGURATION_GROUP 0x10 32486d7f5d3SJohn Marino 32586d7f5d3SJohn Marino /* 32686d7f5d3SJohn Marino * 14.4 Status Bit Format 32786d7f5d3SJohn Marino * 32886d7f5d3SJohn Marino * AKA Status Mailbox Format 32986d7f5d3SJohn Marino * 33086d7f5d3SJohn Marino * XXX format conflict between FSI and PG6 over the ordering of the 33186d7f5d3SJohn Marino * status and sense length fields. 33286d7f5d3SJohn Marino */ 33386d7f5d3SJohn Marino struct mly_status { 33486d7f5d3SJohn Marino u_int16_t command_id; 33586d7f5d3SJohn Marino u_int8_t status; 33686d7f5d3SJohn Marino u_int8_t sense_length; 33786d7f5d3SJohn Marino int32_t residue; 33886d7f5d3SJohn Marino } __packed; 33986d7f5d3SJohn Marino 34086d7f5d3SJohn Marino /* 34186d7f5d3SJohn Marino * 14.5 Command Control Bit (CCB) format 34286d7f5d3SJohn Marino * 34386d7f5d3SJohn Marino * This byte is unfortunately named. 34486d7f5d3SJohn Marino */ 34586d7f5d3SJohn Marino struct mly_command_control { 34686d7f5d3SJohn Marino u_int8_t force_unit_access:1; 34786d7f5d3SJohn Marino u_int8_t disable_page_out:1; 34886d7f5d3SJohn Marino u_int8_t res1:1; 34986d7f5d3SJohn Marino u_int8_t extended_sg_table:1; 35086d7f5d3SJohn Marino u_int8_t data_direction:1; 35186d7f5d3SJohn Marino #define MLY_CCB_WRITE 1 35286d7f5d3SJohn Marino #define MLY_CCB_READ 0 35386d7f5d3SJohn Marino u_int8_t res2:1; 35486d7f5d3SJohn Marino u_int8_t no_auto_sense:1; 35586d7f5d3SJohn Marino u_int8_t disable_disconnect:1; 35686d7f5d3SJohn Marino } __packed; 35786d7f5d3SJohn Marino 35886d7f5d3SJohn Marino /* 35986d7f5d3SJohn Marino * 15.0 Commands 36086d7f5d3SJohn Marino * 36186d7f5d3SJohn Marino * We use the command names as given by Mylex 36286d7f5d3SJohn Marino */ 36386d7f5d3SJohn Marino #define MDACMD_MEMCOPY 0x1 /* memory to memory copy */ 36486d7f5d3SJohn Marino #define MDACMD_SCSIPT 0x2 /* SCSI passthrough (small command) */ 36586d7f5d3SJohn Marino #define MDACMD_SCSILCPT 0x3 /* SCSI passthrough (large command) */ 36686d7f5d3SJohn Marino #define MDACMD_SCSI 0x4 /* SCSI command for logical/phyiscal device (small command) */ 36786d7f5d3SJohn Marino #define MDACMD_SCSILC 0x5 /* SCSI command for logical/phyiscal device (large command) */ 36886d7f5d3SJohn Marino #define MDACMD_IOCTL 0x20 /* Management command */ 36986d7f5d3SJohn Marino #define MDACMD_IOCTLCHECK 0x23 /* Validate management command (not implemented) */ 37086d7f5d3SJohn Marino 37186d7f5d3SJohn Marino /* 37286d7f5d3SJohn Marino * 16.0 IOCTL command 37386d7f5d3SJohn Marino * 37486d7f5d3SJohn Marino * We use the IOCTL names as given by Mylex 37586d7f5d3SJohn Marino * Note that only ioctls supported by the PCI controller family are listed 37686d7f5d3SJohn Marino */ 37786d7f5d3SJohn Marino #define MDACIOCTL_GETCONTROLLERINFO 0x1 37886d7f5d3SJohn Marino #define MDACIOCTL_GETLOGDEVINFOVALID 0x3 37986d7f5d3SJohn Marino #define MDACIOCTL_GETPHYSDEVINFOVALID 0x5 38086d7f5d3SJohn Marino #define MDACIOCTL_GETCONTROLLERSTATISTICS 0xb 38186d7f5d3SJohn Marino #define MDACIOCTL_GETLOGDEVSTATISTICS 0xd 38286d7f5d3SJohn Marino #define MDACIOCTL_GETPHYSDEVSTATISTICS 0xf 38386d7f5d3SJohn Marino #define MDACIOCTL_GETHEALTHSTATUS 0x11 38486d7f5d3SJohn Marino #define MDACIOCTL_GETEVENT 0x15 38586d7f5d3SJohn Marino /* flash update */ 38686d7f5d3SJohn Marino #define MDACIOCTL_STOREIMAGE 0x2c 38786d7f5d3SJohn Marino #define MDACIOCTL_READIMAGE 0x2d 38886d7f5d3SJohn Marino #define MDACIOCTL_FLASHIMAGES 0x2e 38986d7f5d3SJohn Marino /* battery backup unit */ 39086d7f5d3SJohn Marino #define MDACIOCTL_GET_SUBSYSTEM_DATA 0x70 39186d7f5d3SJohn Marino #define MDACIOCTL_SET_SUBSYSTEM_DATA 0x71 39286d7f5d3SJohn Marino /* non-data commands */ 39386d7f5d3SJohn Marino #define MDACIOCTL_STARTDISOCVERY 0x81 39486d7f5d3SJohn Marino #define MDACIOCTL_SETRAIDDEVSTATE 0x82 39586d7f5d3SJohn Marino #define MDACIOCTL_INITPHYSDEVSTART 0x84 39686d7f5d3SJohn Marino #define MDACIOCTL_INITPHYSDEVSTOP 0x85 39786d7f5d3SJohn Marino #define MDACIOCTL_INITRAIDDEVSTART 0x86 39886d7f5d3SJohn Marino #define MDACIOCTL_INITRAIDDEVSTOP 0x87 39986d7f5d3SJohn Marino #define MDACIOCTL_REBUILDRAIDDEVSTART 0x88 40086d7f5d3SJohn Marino #define MDACIOCTL_REBUILDRAIDDEVSTOP 0x89 40186d7f5d3SJohn Marino #define MDACIOCTL_MAKECONSISTENTDATASTART 0x8a 40286d7f5d3SJohn Marino #define MDACIOCTL_MAKECONSISTENTDATASTOP 0x8b 40386d7f5d3SJohn Marino #define MDACIOCTL_CONSISTENCYCHECKSTART 0x8c 40486d7f5d3SJohn Marino #define MDACIOCTL_CONSISTENCYCHECKSTOP 0x8d 40586d7f5d3SJohn Marino #define MDACIOCTL_SETMEMORYMAILBOX 0x8e 40686d7f5d3SJohn Marino #define MDACIOCTL_RESETDEVICE 0x90 40786d7f5d3SJohn Marino #define MDACIOCTL_FLUSHDEVICEDATA 0x91 40886d7f5d3SJohn Marino #define MDACIOCTL_PAUSEDEVICE 0x92 40986d7f5d3SJohn Marino #define MDACIOCTL_UNPAUSEDEVICE 0x93 41086d7f5d3SJohn Marino #define MDACIOCTL_LOCATEDEVICE 0x94 41186d7f5d3SJohn Marino #define MDACIOCTL_SETMASTERSLAVEMODE 0x95 41286d7f5d3SJohn Marino #define MDACIOCTL_SETREALTIMECLOCK 0xac 41386d7f5d3SJohn Marino /* RAID configuration */ 41486d7f5d3SJohn Marino #define MDACIOCTL_CREATENEWCONF 0xc0 41586d7f5d3SJohn Marino #define MDACIOCTL_DELETERAIDDEV 0xc1 41686d7f5d3SJohn Marino #define MDACIOCTL_REPLACEINTERNALDEV 0xc2 41786d7f5d3SJohn Marino #define MDACIOCTL_RENAMERAIDDEV 0xc3 41886d7f5d3SJohn Marino #define MDACIOCTL_ADDNEWCONF 0xc4 41986d7f5d3SJohn Marino #define MDACIOCTL_XLATEPHYSDEVTORAIDDEV 0xc5 42086d7f5d3SJohn Marino #define MDACIOCTL_MORE 0xc6 42186d7f5d3SJohn Marino #define MDACIOCTL_SETPHYSDEVPARAMETER 0xc8 42286d7f5d3SJohn Marino #define MDACIOCTL_GETPHYSDEVPARAMETER 0xc9 42386d7f5d3SJohn Marino #define MDACIOCTL_CLEARCONF 0xca 42486d7f5d3SJohn Marino #define MDACIOCTL_GETDEVCONFINFO 0xcb 42586d7f5d3SJohn Marino #define MDACIOCTL_GETGROUPCONFINFO 0xcc 42686d7f5d3SJohn Marino #define MDACIOCTL_GETFREESPACELIST 0xcd 42786d7f5d3SJohn Marino #define MDACIOCTL_GETLOGDEVPARAMETER 0xce 42886d7f5d3SJohn Marino #define MDACIOCTL_SETLOGDEVPARAMETER 0xcf 42986d7f5d3SJohn Marino #define MDACIOCTL_GETCONTROLLERPARAMETER 0xd0 43086d7f5d3SJohn Marino #define MDACIOCTL_SETCONTRLLERPARAMETER 0xd1 43186d7f5d3SJohn Marino #define MDACIOCTL_CLEARCONFSUSPMODE 0xd2 43286d7f5d3SJohn Marino #define MDACIOCTL_GETBDT_FOR_SYSDRIVE 0xe0 43386d7f5d3SJohn Marino 43486d7f5d3SJohn Marino /* 43586d7f5d3SJohn Marino * 17.1.4 Data Transfer Memory Address Without SG List 43686d7f5d3SJohn Marino */ 43786d7f5d3SJohn Marino struct mly_short_transfer { 43886d7f5d3SJohn Marino struct mly_sg_entry sg[2]; 43986d7f5d3SJohn Marino } __packed; 44086d7f5d3SJohn Marino 44186d7f5d3SJohn Marino /* 44286d7f5d3SJohn Marino * 17.1.5 Data Transfer Memory Address With SG List 44386d7f5d3SJohn Marino * 44486d7f5d3SJohn Marino * Note that only the first s/g table is currently used. 44586d7f5d3SJohn Marino */ 44686d7f5d3SJohn Marino struct mly_sg_transfer { 44786d7f5d3SJohn Marino u_int16_t entries[3]; 44886d7f5d3SJohn Marino u_int16_t res1; 44986d7f5d3SJohn Marino u_int64_t table_physaddr[3]; 45086d7f5d3SJohn Marino } __packed; 45186d7f5d3SJohn Marino 45286d7f5d3SJohn Marino /* 45386d7f5d3SJohn Marino * 17.1.3 Data Transfer Memory Address Format 45486d7f5d3SJohn Marino */ 45586d7f5d3SJohn Marino union mly_command_transfer { 45686d7f5d3SJohn Marino struct mly_short_transfer direct; 45786d7f5d3SJohn Marino struct mly_sg_transfer indirect; 45886d7f5d3SJohn Marino }; 45986d7f5d3SJohn Marino 46086d7f5d3SJohn Marino /* 46186d7f5d3SJohn Marino * 21.1 MDACIOCTL_SETREALTIMECLOCK 46286d7f5d3SJohn Marino * 21.7 MDACIOCTL_GETHEALTHSTATUS 46386d7f5d3SJohn Marino * 21.8 MDACIOCTL_GETCONTROLLERINFO 46486d7f5d3SJohn Marino * 21.9 MDACIOCTL_GETLOGDEVINFOVALID 46586d7f5d3SJohn Marino * 21.10 MDACIOCTL_GETPHYSDEVINFOVALID 46686d7f5d3SJohn Marino * 21.11 MDACIOCTL_GETPHYSDEVSTATISTICS 46786d7f5d3SJohn Marino * 21.12 MDACIOCTL_GETLOGDEVSTATISTICS 46886d7f5d3SJohn Marino * 21.13 MDACIOCTL_GETCONTROLLERSTATISTICS 46986d7f5d3SJohn Marino * 21.27 MDACIOCTL_GETBDT_FOR_SYSDRIVE 47086d7f5d3SJohn Marino * 23.4 MDACIOCTL_CREATENEWCONF 47186d7f5d3SJohn Marino * 23.5 MDACIOCTL_ADDNEWCONF 47286d7f5d3SJohn Marino * 23.8 MDACIOCTL_GETDEVCONFINFO 47386d7f5d3SJohn Marino * 23.9 MDACIOCTL_GETFREESPACELIST 47486d7f5d3SJohn Marino * 24.1 MDACIOCTL_MORE 47586d7f5d3SJohn Marino * 25.1 MDACIOCTL_GETPHYSDEVPARAMETER 47686d7f5d3SJohn Marino * 25.2 MDACIOCTL_SETPHYSDEVPARAMETER 47786d7f5d3SJohn Marino * 25.3 MDACIOCTL_GETLOGDEVPARAMETER 47886d7f5d3SJohn Marino * 25.4 MDACIOCTL_SETLOGDEVPARAMETER 47986d7f5d3SJohn Marino * 25.5 MDACIOCTL_GETCONTROLLERPARAMETER 48086d7f5d3SJohn Marino * 25.6 MDACIOCTL_SETCONTROLLERPARAMETER 48186d7f5d3SJohn Marino * 48286d7f5d3SJohn Marino * These commands just transfer data 48386d7f5d3SJohn Marino */ 48486d7f5d3SJohn Marino struct mly_ioctl_param_data { 48586d7f5d3SJohn Marino u_int8_t param[10]; 48686d7f5d3SJohn Marino union mly_command_transfer transfer; 48786d7f5d3SJohn Marino } __packed; 48886d7f5d3SJohn Marino 48986d7f5d3SJohn Marino /* 49086d7f5d3SJohn Marino * 21.2 MDACIOCTL_SETMEMORYMAILBOX 49186d7f5d3SJohn Marino */ 49286d7f5d3SJohn Marino struct mly_ioctl_param_setmemorymailbox { 49386d7f5d3SJohn Marino u_int8_t health_buffer_size; 49486d7f5d3SJohn Marino u_int8_t res1; 49586d7f5d3SJohn Marino u_int64_t health_buffer_physaddr; 49686d7f5d3SJohn Marino u_int64_t command_mailbox_physaddr; 49786d7f5d3SJohn Marino u_int64_t status_mailbox_physaddr; 49886d7f5d3SJohn Marino u_int64_t res2[2]; 49986d7f5d3SJohn Marino } __packed; 50086d7f5d3SJohn Marino 50186d7f5d3SJohn Marino /* 50286d7f5d3SJohn Marino * 21.8.2 MDACIOCTL_GETCONTROLLERINFO: Data Format 50386d7f5d3SJohn Marino */ 50486d7f5d3SJohn Marino struct mly_ioctl_getcontrollerinfo { 50586d7f5d3SJohn Marino u_int8_t res1; /* N/A */ 50686d7f5d3SJohn Marino u_int8_t interface_type; 50786d7f5d3SJohn Marino u_int8_t controller_type; 50886d7f5d3SJohn Marino u_int8_t res2; /* N/A */ 50986d7f5d3SJohn Marino u_int16_t interface_speed; 51086d7f5d3SJohn Marino u_int8_t interface_width; 51186d7f5d3SJohn Marino u_int8_t res3[9]; /* N/A */ 51286d7f5d3SJohn Marino char interface_name[16]; 51386d7f5d3SJohn Marino char controller_name[16]; 51486d7f5d3SJohn Marino u_int8_t res4[16]; /* N/A */ 51586d7f5d3SJohn Marino /* firmware release information */ 51686d7f5d3SJohn Marino u_int8_t fw_major; 51786d7f5d3SJohn Marino u_int8_t fw_minor; 51886d7f5d3SJohn Marino u_int8_t fw_turn; 51986d7f5d3SJohn Marino u_int8_t fw_build; 52086d7f5d3SJohn Marino u_int8_t fw_day; 52186d7f5d3SJohn Marino u_int8_t fw_month; 52286d7f5d3SJohn Marino u_int8_t fw_century; 52386d7f5d3SJohn Marino u_int8_t fw_year; 52486d7f5d3SJohn Marino /* hardware release information */ 52586d7f5d3SJohn Marino u_int8_t hw_revision; /* N/A */ 52686d7f5d3SJohn Marino u_int8_t res5[3]; /* N/A */ 52786d7f5d3SJohn Marino u_int8_t hw_release_day; /* N/A */ 52886d7f5d3SJohn Marino u_int8_t hw_release_month; /* N/A */ 52986d7f5d3SJohn Marino u_int8_t hw_release_century; /* N/A */ 53086d7f5d3SJohn Marino u_int8_t hw_release_year; /* N/A */ 53186d7f5d3SJohn Marino /* hardware manufacturing information */ 53286d7f5d3SJohn Marino u_int8_t batch_number; /* N/A */ 53386d7f5d3SJohn Marino u_int8_t res6; /* N/A */ 53486d7f5d3SJohn Marino u_int8_t plant_number; 53586d7f5d3SJohn Marino u_int8_t res7; 53686d7f5d3SJohn Marino u_int8_t hw_manuf_day; 53786d7f5d3SJohn Marino u_int8_t hw_manuf_month; 53886d7f5d3SJohn Marino u_int8_t hw_manuf_century; 53986d7f5d3SJohn Marino u_int8_t hw_manuf_year; 54086d7f5d3SJohn Marino u_int8_t max_pdd_per_xldd; 54186d7f5d3SJohn Marino u_int8_t max_ildd_per_xldd; 54286d7f5d3SJohn Marino u_int16_t nvram_size; 54386d7f5d3SJohn Marino u_int8_t max_number_of_xld; /* N/A */ 54486d7f5d3SJohn Marino u_int8_t res8[3]; /* N/A */ 54586d7f5d3SJohn Marino /* unique information per controller */ 54686d7f5d3SJohn Marino char serial_number[16]; 54786d7f5d3SJohn Marino u_int8_t res9[16]; /* N/A */ 54886d7f5d3SJohn Marino /* vendor information */ 54986d7f5d3SJohn Marino u_int8_t res10[3]; /* N/A */ 55086d7f5d3SJohn Marino u_int8_t oem_information; 55186d7f5d3SJohn Marino char vendor_name[16]; /* N/A */ 55286d7f5d3SJohn Marino /* other physical/controller/operation information */ 55386d7f5d3SJohn Marino u_int8_t bbu_present:1; 55486d7f5d3SJohn Marino u_int8_t active_clustering:1; 55586d7f5d3SJohn Marino u_int8_t res11:6; /* N/A */ 55686d7f5d3SJohn Marino u_int8_t res12[3]; /* N/A */ 55786d7f5d3SJohn Marino /* physical device scan information */ 55886d7f5d3SJohn Marino u_int8_t physical_scan_active:1; 55986d7f5d3SJohn Marino u_int8_t res13:7; /* N/A */ 56086d7f5d3SJohn Marino u_int8_t physical_scan_channel; 56186d7f5d3SJohn Marino u_int8_t physical_scan_target; 56286d7f5d3SJohn Marino u_int8_t physical_scan_lun; 56386d7f5d3SJohn Marino /* maximum command data transfer size */ 56486d7f5d3SJohn Marino u_int16_t maximum_block_count; 56586d7f5d3SJohn Marino u_int16_t maximum_sg_entries; 56686d7f5d3SJohn Marino /* logical/physical device counts */ 56786d7f5d3SJohn Marino u_int16_t logical_devices_present; 56886d7f5d3SJohn Marino u_int16_t logical_devices_critical; 56986d7f5d3SJohn Marino u_int16_t logical_devices_offline; 57086d7f5d3SJohn Marino u_int16_t physical_devices_present; 57186d7f5d3SJohn Marino u_int16_t physical_disks_present; 57286d7f5d3SJohn Marino u_int16_t physical_disks_critical; /* N/A */ 57386d7f5d3SJohn Marino u_int16_t physical_disks_offline; 57486d7f5d3SJohn Marino u_int16_t maximum_parallel_commands; 57586d7f5d3SJohn Marino /* channel and target ID information */ 57686d7f5d3SJohn Marino u_int8_t physical_channels_present; 57786d7f5d3SJohn Marino u_int8_t virtual_channels_present; 57886d7f5d3SJohn Marino u_int8_t physical_channels_possible; 57986d7f5d3SJohn Marino u_int8_t virtual_channels_possible; 58086d7f5d3SJohn Marino u_int8_t maximum_targets_possible[16]; /* N/A (6 and up) */ 58186d7f5d3SJohn Marino u_int8_t res14[12]; /* N/A */ 58286d7f5d3SJohn Marino /* memory/cache information */ 58386d7f5d3SJohn Marino u_int16_t memory_size; 58486d7f5d3SJohn Marino u_int16_t cache_size; 58586d7f5d3SJohn Marino u_int32_t valid_cache_size; /* N/A */ 58686d7f5d3SJohn Marino u_int32_t dirty_cache_size; /* N/A */ 58786d7f5d3SJohn Marino u_int16_t memory_speed; 58886d7f5d3SJohn Marino u_int8_t memory_width; 58986d7f5d3SJohn Marino u_int8_t memory_type:5; 59086d7f5d3SJohn Marino u_int8_t res15:1; /* N/A */ 59186d7f5d3SJohn Marino u_int8_t memory_parity:1; 59286d7f5d3SJohn Marino u_int8_t memory_ecc:1; 59386d7f5d3SJohn Marino char memory_information[16]; /* N/A */ 59486d7f5d3SJohn Marino /* execution memory information */ 59586d7f5d3SJohn Marino u_int16_t exmemory_size; 59686d7f5d3SJohn Marino u_int16_t l2cache_size; /* N/A */ 59786d7f5d3SJohn Marino u_int8_t res16[8]; /* N/A */ 59886d7f5d3SJohn Marino u_int16_t exmemory_speed; 59986d7f5d3SJohn Marino u_int8_t exmemory_width; 60086d7f5d3SJohn Marino u_int8_t exmemory_type:5; 60186d7f5d3SJohn Marino u_int8_t res17:1; /* N/A */ 60286d7f5d3SJohn Marino u_int8_t exmemory_parity:1; 60386d7f5d3SJohn Marino u_int8_t exmemory_ecc:1; 60486d7f5d3SJohn Marino char exmemory_name[16]; /* N/A */ 60586d7f5d3SJohn Marino /* CPU information */ 60686d7f5d3SJohn Marino struct { 60786d7f5d3SJohn Marino u_int16_t speed; 60886d7f5d3SJohn Marino u_int8_t type; 60986d7f5d3SJohn Marino u_int8_t number; 61086d7f5d3SJohn Marino u_int8_t res1[12]; /* N/A */ 61186d7f5d3SJohn Marino char name[16]; /* N/A */ 61286d7f5d3SJohn Marino } cpu[2] __packed; 61386d7f5d3SJohn Marino /* debugging/profiling/command time tracing information */ 61486d7f5d3SJohn Marino u_int16_t profiling_page; /* N/A */ 61586d7f5d3SJohn Marino u_int16_t profiling_programs; /* N/A */ 61686d7f5d3SJohn Marino u_int16_t time_trace_page; /* N/A */ 61786d7f5d3SJohn Marino u_int16_t time_trace_programs; /* N/A */ 61886d7f5d3SJohn Marino u_int8_t res18[8]; /* N/A */ 61986d7f5d3SJohn Marino /* error counters on physical devices */ 62086d7f5d3SJohn Marino u_int16_t physical_device_bus_resets; /* N/A */ 62186d7f5d3SJohn Marino u_int16_t physical_device_parity_errors; /* N/A */ 62286d7f5d3SJohn Marino u_int16_t physical_device_soft_errors; /* N/A */ 62386d7f5d3SJohn Marino u_int16_t physical_device_commands_failed; /* N/A */ 62486d7f5d3SJohn Marino u_int16_t physical_device_miscellaneous_errors; /* N/A */ 62586d7f5d3SJohn Marino u_int16_t physical_device_command_timeouts; /* N/A */ 62686d7f5d3SJohn Marino u_int16_t physical_device_selection_timeouts; /* N/A */ 62786d7f5d3SJohn Marino u_int16_t physical_device_retries; /* N/A */ 62886d7f5d3SJohn Marino u_int16_t physical_device_aborts; /* N/A */ 62986d7f5d3SJohn Marino u_int16_t physical_device_host_command_aborts; /* N/A */ 63086d7f5d3SJohn Marino u_int16_t physical_device_PFAs_detected; /* N/A */ 63186d7f5d3SJohn Marino u_int16_t physical_device_host_commands_failed; /* N/A */ 63286d7f5d3SJohn Marino u_int8_t res19[8]; /* N/A */ 63386d7f5d3SJohn Marino /* error counters on logical devices */ 63486d7f5d3SJohn Marino u_int16_t logical_device_soft_errors; /* N/A */ 63586d7f5d3SJohn Marino u_int16_t logical_device_commands_failed; /* N/A */ 63686d7f5d3SJohn Marino u_int16_t logical_device_host_command_aborts; /* N/A */ 63786d7f5d3SJohn Marino u_int16_t res20; /* N/A */ 63886d7f5d3SJohn Marino /* error counters on controller */ 63986d7f5d3SJohn Marino u_int16_t controller_parity_ecc_errors; 64086d7f5d3SJohn Marino u_int16_t controller_host_command_aborts; /* N/A */ 64186d7f5d3SJohn Marino u_int8_t res21[4]; /* N/A */ 64286d7f5d3SJohn Marino /* long duration activity information */ 64386d7f5d3SJohn Marino u_int16_t background_inits_active; 64486d7f5d3SJohn Marino u_int16_t logical_inits_active; 64586d7f5d3SJohn Marino u_int16_t physical_inits_active; 64686d7f5d3SJohn Marino u_int16_t consistency_checks_active; 64786d7f5d3SJohn Marino u_int16_t rebuilds_active; 64886d7f5d3SJohn Marino u_int16_t MORE_active; 64986d7f5d3SJohn Marino u_int16_t patrol_active; /* N/A */ 65086d7f5d3SJohn Marino u_int8_t long_operation_status; /* N/A */ 65186d7f5d3SJohn Marino u_int8_t res22; /* N/A */ 65286d7f5d3SJohn Marino /* flash ROM information */ 65386d7f5d3SJohn Marino u_int8_t flash_type; /* N/A */ 65486d7f5d3SJohn Marino u_int8_t res23; /* N/A */ 65586d7f5d3SJohn Marino u_int16_t flash_size; 65686d7f5d3SJohn Marino u_int32_t flash_maximum_age; 65786d7f5d3SJohn Marino u_int32_t flash_age; 65886d7f5d3SJohn Marino u_int8_t res24[4]; /* N/A */ 65986d7f5d3SJohn Marino char flash_name[16]; /* N/A */ 66086d7f5d3SJohn Marino /* firmware runtime information */ 66186d7f5d3SJohn Marino u_int8_t rebuild_rate; 66286d7f5d3SJohn Marino u_int8_t background_init_rate; 66386d7f5d3SJohn Marino u_int8_t init_rate; 66486d7f5d3SJohn Marino u_int8_t consistency_check_rate; 66586d7f5d3SJohn Marino u_int8_t res25[4]; /* N/A */ 66686d7f5d3SJohn Marino u_int32_t maximum_dp; 66786d7f5d3SJohn Marino u_int32_t free_dp; 66886d7f5d3SJohn Marino u_int32_t maximum_iop; 66986d7f5d3SJohn Marino u_int32_t free_iop; 67086d7f5d3SJohn Marino u_int16_t maximum_comb_length; 67186d7f5d3SJohn Marino u_int16_t maximum_configuration_groups; 67286d7f5d3SJohn Marino u_int8_t installation_abort:1; 67386d7f5d3SJohn Marino u_int8_t maintenance:1; 67486d7f5d3SJohn Marino u_int8_t res26:6; /* N/A */ 67586d7f5d3SJohn Marino u_int8_t res27[3]; /* N/A */ 67686d7f5d3SJohn Marino u_int8_t res28[32 + 512]; /* N/A */ 67786d7f5d3SJohn Marino } __packed; 67886d7f5d3SJohn Marino 67986d7f5d3SJohn Marino /* 68086d7f5d3SJohn Marino * 21.9.2 MDACIOCTL_GETLOGDEVINFOVALID 68186d7f5d3SJohn Marino */ 68286d7f5d3SJohn Marino struct mly_ioctl_getlogdevinfovalid { 68386d7f5d3SJohn Marino u_int8_t res1; /* N/A */ 68486d7f5d3SJohn Marino u_int8_t channel; 68586d7f5d3SJohn Marino u_int8_t target; 68686d7f5d3SJohn Marino u_int8_t lun; 68786d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 68886d7f5d3SJohn Marino u_int8_t raid_level; /* see 8.2 */ 68986d7f5d3SJohn Marino u_int8_t stripe_size; /* see 8.3 */ 69086d7f5d3SJohn Marino u_int8_t cache_line_size; /* see 8.4 */ 69186d7f5d3SJohn Marino u_int8_t read_write_control; /* see 8.5 */ 69286d7f5d3SJohn Marino u_int8_t consistency_check:1; 69386d7f5d3SJohn Marino u_int8_t rebuild:1; 69486d7f5d3SJohn Marino u_int8_t make_consistent:1; 69586d7f5d3SJohn Marino u_int8_t initialisation:1; 69686d7f5d3SJohn Marino u_int8_t migration:1; 69786d7f5d3SJohn Marino u_int8_t patrol:1; 69886d7f5d3SJohn Marino u_int8_t res2:2; /* N/A */ 69986d7f5d3SJohn Marino u_int8_t ar5_limit; 70086d7f5d3SJohn Marino u_int8_t ar5_algo; 70186d7f5d3SJohn Marino u_int16_t logical_device_number; 70286d7f5d3SJohn Marino u_int16_t bios_control; 70386d7f5d3SJohn Marino /* erorr counters */ 70486d7f5d3SJohn Marino u_int16_t soft_errors; /* N/A */ 70586d7f5d3SJohn Marino u_int16_t commands_failed; /* N/A */ 70686d7f5d3SJohn Marino u_int16_t host_command_aborts; /* N/A */ 70786d7f5d3SJohn Marino u_int16_t deferred_write_errors; /* N/A */ 70886d7f5d3SJohn Marino u_int8_t res3[8]; /* N/A */ 70986d7f5d3SJohn Marino /* device size information */ 71086d7f5d3SJohn Marino u_int8_t res4[2]; /* N/A */ 71186d7f5d3SJohn Marino u_int16_t device_block_size; 71286d7f5d3SJohn Marino u_int32_t original_device_size; /* N/A */ 71386d7f5d3SJohn Marino u_int32_t device_size; /* XXX "blocks or MB" Huh? */ 71486d7f5d3SJohn Marino u_int8_t res5[4]; /* N/A */ 71586d7f5d3SJohn Marino char device_name[32]; /* N/A */ 71686d7f5d3SJohn Marino u_int8_t inquiry[36]; 71786d7f5d3SJohn Marino u_int8_t res6[12]; /* N/A */ 71886d7f5d3SJohn Marino u_int64_t last_read_block; /* N/A */ 71986d7f5d3SJohn Marino u_int64_t last_written_block; /* N/A */ 72086d7f5d3SJohn Marino u_int64_t consistency_check_block; 72186d7f5d3SJohn Marino u_int64_t rebuild_block; 72286d7f5d3SJohn Marino u_int64_t make_consistent_block; 72386d7f5d3SJohn Marino u_int64_t initialisation_block; 72486d7f5d3SJohn Marino u_int64_t migration_block; 72586d7f5d3SJohn Marino u_int64_t patrol_block; /* N/A */ 72686d7f5d3SJohn Marino u_int8_t res7[64]; /* N/A */ 72786d7f5d3SJohn Marino } __packed; 72886d7f5d3SJohn Marino 72986d7f5d3SJohn Marino /* 73086d7f5d3SJohn Marino * 21.10.2 MDACIOCTL_GETPHYSDEVINFOVALID: Data Format 73186d7f5d3SJohn Marino */ 73286d7f5d3SJohn Marino struct mly_ioctl_getphysdevinfovalid { 73386d7f5d3SJohn Marino u_int8_t res1; 73486d7f5d3SJohn Marino u_int8_t channel; 73586d7f5d3SJohn Marino u_int8_t target; 73686d7f5d3SJohn Marino u_int8_t lun; 73786d7f5d3SJohn Marino u_int8_t raid_ft:1; /* configuration status */ 73886d7f5d3SJohn Marino u_int8_t res2:1; /* N/A */ 73986d7f5d3SJohn Marino u_int8_t local:1; 74086d7f5d3SJohn Marino u_int8_t res3:5; 74186d7f5d3SJohn Marino u_int8_t host_dead:1; /* multiple host/controller status *//* N/A */ 74286d7f5d3SJohn Marino u_int8_t host_connection_dead:1; /* N/A */ 74386d7f5d3SJohn Marino u_int8_t res4:6; /* N/A */ 74486d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 74586d7f5d3SJohn Marino u_int8_t width; 74686d7f5d3SJohn Marino u_int16_t speed; 74786d7f5d3SJohn Marino /* multiported physical device information */ 74886d7f5d3SJohn Marino u_int8_t ports_available; /* N/A */ 74986d7f5d3SJohn Marino u_int8_t ports_inuse; /* N/A */ 75086d7f5d3SJohn Marino u_int8_t res5[4]; 75186d7f5d3SJohn Marino u_int8_t ether_address[16]; /* N/A */ 75286d7f5d3SJohn Marino u_int16_t command_tags; 75386d7f5d3SJohn Marino u_int8_t consistency_check:1; /* N/A */ 75486d7f5d3SJohn Marino u_int8_t rebuild:1; /* N/A */ 75586d7f5d3SJohn Marino u_int8_t make_consistent:1; /* N/A */ 75686d7f5d3SJohn Marino u_int8_t initialisation:1; 75786d7f5d3SJohn Marino u_int8_t migration:1; /* N/A */ 75886d7f5d3SJohn Marino u_int8_t patrol:1; /* N/A */ 75986d7f5d3SJohn Marino u_int8_t res6:2; 76086d7f5d3SJohn Marino u_int8_t long_operation_status; /* N/A */ 76186d7f5d3SJohn Marino u_int8_t parity_errors; 76286d7f5d3SJohn Marino u_int8_t soft_errors; 76386d7f5d3SJohn Marino u_int8_t hard_errors; 76486d7f5d3SJohn Marino u_int8_t miscellaneous_errors; 76586d7f5d3SJohn Marino u_int8_t command_timeouts; /* N/A */ 76686d7f5d3SJohn Marino u_int8_t retries; /* N/A */ 76786d7f5d3SJohn Marino u_int8_t aborts; /* N/A */ 76886d7f5d3SJohn Marino u_int8_t PFAs_detected; /* N/A */ 76986d7f5d3SJohn Marino u_int8_t res7[6]; 77086d7f5d3SJohn Marino u_int16_t block_size; 77186d7f5d3SJohn Marino u_int32_t original_device_size; /* XXX "blocks or MB" Huh? */ 77286d7f5d3SJohn Marino u_int32_t device_size; /* XXX "blocks or MB" Huh? */ 77386d7f5d3SJohn Marino u_int8_t res8[4]; 77486d7f5d3SJohn Marino char name[16]; /* N/A */ 77586d7f5d3SJohn Marino u_int8_t res9[16 + 32]; 77686d7f5d3SJohn Marino u_int8_t inquiry[36]; 77786d7f5d3SJohn Marino u_int8_t res10[12 + 16]; 77886d7f5d3SJohn Marino u_int64_t last_read_block; /* N/A */ 77986d7f5d3SJohn Marino u_int64_t last_written_block; /* N/A */ 78086d7f5d3SJohn Marino u_int64_t consistency_check_block; /* N/A */ 78186d7f5d3SJohn Marino u_int64_t rebuild_block; /* N/A */ 78286d7f5d3SJohn Marino u_int64_t make_consistent_block; /* N/A */ 78386d7f5d3SJohn Marino u_int64_t initialisation_block; /* N/A */ 78486d7f5d3SJohn Marino u_int64_t migration_block; /* N/A */ 78586d7f5d3SJohn Marino u_int64_t patrol_block; /* N/A */ 78686d7f5d3SJohn Marino u_int8_t res11[256]; 78786d7f5d3SJohn Marino } __packed; 78886d7f5d3SJohn Marino 78986d7f5d3SJohn Marino union mly_devinfo { 79086d7f5d3SJohn Marino struct mly_ioctl_getlogdevinfovalid logdev; 79186d7f5d3SJohn Marino struct mly_ioctl_getphysdevinfovalid physdev; 79286d7f5d3SJohn Marino }; 79386d7f5d3SJohn Marino 79486d7f5d3SJohn Marino /* 79586d7f5d3SJohn Marino * 21.11.2 MDACIOCTL_GETPHYSDEVSTATISTICS: Data Format 79686d7f5d3SJohn Marino * 21.12.2 MDACIOCTL_GETLOGDEVSTATISTICS: Data Format 79786d7f5d3SJohn Marino */ 79886d7f5d3SJohn Marino struct mly_ioctl_getdevstatistics { 79986d7f5d3SJohn Marino u_int32_t uptime_ms; /* getphysedevstatistics only */ 80086d7f5d3SJohn Marino u_int8_t res1[5]; /* N/A */ 80186d7f5d3SJohn Marino u_int8_t channel; 80286d7f5d3SJohn Marino u_int8_t target; 80386d7f5d3SJohn Marino u_int8_t lun; 80486d7f5d3SJohn Marino u_int16_t raid_device; /* getlogdevstatistics only */ 80586d7f5d3SJohn Marino u_int8_t res2[2]; /* N/A */ 80686d7f5d3SJohn Marino /* total read/write performance including cache data */ 80786d7f5d3SJohn Marino u_int32_t total_reads; 80886d7f5d3SJohn Marino u_int32_t total_writes; 80986d7f5d3SJohn Marino u_int32_t total_read_size; 81086d7f5d3SJohn Marino u_int32_t total_write_size; 81186d7f5d3SJohn Marino /* cache read/write performance */ 81286d7f5d3SJohn Marino u_int32_t cache_reads; /* N/A */ 81386d7f5d3SJohn Marino u_int32_t cache_writes; /* N/A */ 81486d7f5d3SJohn Marino u_int32_t cache_read_size; /* N/A */ 81586d7f5d3SJohn Marino u_int32_t cache_write_size; /* N/A */ 81686d7f5d3SJohn Marino /* commands active/wait information */ 81786d7f5d3SJohn Marino u_int32_t command_waits_done; /* N/A */ 81886d7f5d3SJohn Marino u_int16_t active_commands; /* N/A */ 81986d7f5d3SJohn Marino u_int16_t waiting_commands; /* N/A */ 82086d7f5d3SJohn Marino u_int8_t res3[8]; /* N/A */ 82186d7f5d3SJohn Marino } __packed; 82286d7f5d3SJohn Marino 82386d7f5d3SJohn Marino /* 82486d7f5d3SJohn Marino * 21.13.2 MDACIOCTL_GETCONTROLLERSTATISTICS: Data Format 82586d7f5d3SJohn Marino */ 82686d7f5d3SJohn Marino struct mly_ioctl_getcontrollerstatistics { 82786d7f5d3SJohn Marino u_int32_t uptime_ms; /* N/A */ 82886d7f5d3SJohn Marino u_int8_t res1[12]; /* N/A */ 82986d7f5d3SJohn Marino /* target physical device performance data information */ 83086d7f5d3SJohn Marino u_int32_t target_physical_device_interrupts; /* N/A */ 83186d7f5d3SJohn Marino u_int32_t target_physical_device_stray_interrupts; /* N/A */ 83286d7f5d3SJohn Marino u_int8_t res2[8]; /* N/A */ 83386d7f5d3SJohn Marino u_int32_t target_physical_device_reads; /* N/A */ 83486d7f5d3SJohn Marino u_int32_t target_physical_device_writes; /* N/A */ 83586d7f5d3SJohn Marino u_int32_t target_physical_device_read_size; /* N/A */ 83686d7f5d3SJohn Marino u_int32_t target_physical_device_write_size; /* N/A */ 83786d7f5d3SJohn Marino /* host system performance data information */ 83886d7f5d3SJohn Marino u_int32_t host_system_interrupts; /* N/A */ 83986d7f5d3SJohn Marino u_int32_t host_system_stray_interrupts; /* N/A */ 84086d7f5d3SJohn Marino u_int32_t host_system_sent_interrupts; /* N/A */ 84186d7f5d3SJohn Marino u_int8_t res3[4]; /* N/A */ 84286d7f5d3SJohn Marino u_int32_t physical_device_reads; /* N/A */ 84386d7f5d3SJohn Marino u_int32_t physical_device_writes; /* N/A */ 84486d7f5d3SJohn Marino u_int32_t physical_device_read_size; /* N/A */ 84586d7f5d3SJohn Marino u_int32_t physical_device_write_size; /* N/A */ 84686d7f5d3SJohn Marino u_int32_t physical_device_cache_reads; /* N/A */ 84786d7f5d3SJohn Marino u_int32_t physical_device_cache_writes; /* N/A */ 84886d7f5d3SJohn Marino u_int32_t physical_device_cache_read_size; /* N/A */ 84986d7f5d3SJohn Marino u_int32_t physical_device_cache_write_size; /* N/A */ 85086d7f5d3SJohn Marino u_int32_t logical_device_reads; /* N/A */ 85186d7f5d3SJohn Marino u_int32_t logical_device_writes; /* N/A */ 85286d7f5d3SJohn Marino u_int32_t logical_device_read_size; /* N/A */ 85386d7f5d3SJohn Marino u_int32_t logical_device_write_size; /* N/A */ 85486d7f5d3SJohn Marino u_int32_t logical_device_cache_reads; /* N/A */ 85586d7f5d3SJohn Marino u_int32_t logical_device_cache_writes; /* N/A */ 85686d7f5d3SJohn Marino u_int32_t logical_device_cache_read_size; /* N/A */ 85786d7f5d3SJohn Marino u_int32_t logical_device_cache_write_size; /* N/A */ 85886d7f5d3SJohn Marino u_int16_t target_physical_device_commands_active; /* N/A */ 85986d7f5d3SJohn Marino u_int16_t target_physical_device_commands_waiting; /* N/A */ 86086d7f5d3SJohn Marino u_int16_t host_system_commands_active; /* N/A */ 86186d7f5d3SJohn Marino u_int16_t host_system_commands_waiting; /* N/A */ 86286d7f5d3SJohn Marino u_int8_t res4[48 + 64]; /* N/A */ 86386d7f5d3SJohn Marino } __packed; 86486d7f5d3SJohn Marino 86586d7f5d3SJohn Marino /* 86686d7f5d3SJohn Marino * 21.2 MDACIOCTL_SETRAIDDEVSTATE 86786d7f5d3SJohn Marino */ 86886d7f5d3SJohn Marino struct mly_ioctl_param_setraiddevstate { 86986d7f5d3SJohn Marino u_int8_t state; 87086d7f5d3SJohn Marino } __packed; 87186d7f5d3SJohn Marino 87286d7f5d3SJohn Marino /* 87386d7f5d3SJohn Marino * 21.27.2 MDACIOCTL_GETBDT_FOR_SYSDRIVE: Data Format 87486d7f5d3SJohn Marino */ 87586d7f5d3SJohn Marino #define MLY_MAX_BDT_ENTRIES 1022 87686d7f5d3SJohn Marino struct mly_ioctl_getbdt_for_sysdrive { 87786d7f5d3SJohn Marino u_int32_t num_of_bdt_entries; 87886d7f5d3SJohn Marino u_int32_t bad_data_block_address[MLY_MAX_BDT_ENTRIES]; 87986d7f5d3SJohn Marino } __packed; 88086d7f5d3SJohn Marino 88186d7f5d3SJohn Marino /* 88286d7f5d3SJohn Marino * 22.1 Physical Device Definition (PDD) 88386d7f5d3SJohn Marino */ 88486d7f5d3SJohn Marino struct mly_pdd { 88586d7f5d3SJohn Marino u_int8_t type; /* see 8.2 */ 88686d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 88786d7f5d3SJohn Marino u_int16_t raid_device; 88886d7f5d3SJohn Marino u_int32_t device_size; /* XXX "block or MB" Huh? */ 88986d7f5d3SJohn Marino u_int8_t controller; 89086d7f5d3SJohn Marino u_int8_t channel; 89186d7f5d3SJohn Marino u_int8_t target; 89286d7f5d3SJohn Marino u_int8_t lun; 89386d7f5d3SJohn Marino u_int32_t start_address; 89486d7f5d3SJohn Marino } __packed; 89586d7f5d3SJohn Marino 89686d7f5d3SJohn Marino /* 89786d7f5d3SJohn Marino * 22.2 RAID Device Use Definition (UDD) 89886d7f5d3SJohn Marino */ 89986d7f5d3SJohn Marino struct mly_udd { 90086d7f5d3SJohn Marino u_int8_t res1; 90186d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 90286d7f5d3SJohn Marino u_int16_t raid_device; 90386d7f5d3SJohn Marino u_int32_t start_address; 90486d7f5d3SJohn Marino } __packed; 90586d7f5d3SJohn Marino 90686d7f5d3SJohn Marino /* 90786d7f5d3SJohn Marino * RAID Device Definition (LDD) 90886d7f5d3SJohn Marino */ 90986d7f5d3SJohn Marino struct mly_ldd { 91086d7f5d3SJohn Marino u_int8_t type; /* see 8.2 */ 91186d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 91286d7f5d3SJohn Marino u_int16_t raid_device; 91386d7f5d3SJohn Marino u_int32_t device_size; /* XXX "block or MB" Huh? */ 91486d7f5d3SJohn Marino u_int8_t devices_used_count; 91586d7f5d3SJohn Marino u_int8_t stripe_size; /* see 8.3 */ 91686d7f5d3SJohn Marino u_int8_t cache_line_size; /* see 8.4 */ 91786d7f5d3SJohn Marino u_int8_t read_write_control; /* see 8.5 */ 91886d7f5d3SJohn Marino u_int32_t devices_used_size; /* XXX "block or MB" Huh? */ 91986d7f5d3SJohn Marino u_int16_t devices_used[32]; /* XXX actual size of this field unknown! */ 92086d7f5d3SJohn Marino } __packed; 92186d7f5d3SJohn Marino 92286d7f5d3SJohn Marino /* 92386d7f5d3SJohn Marino * Define a datastructure giving the smallest allocation that will hold 92486d7f5d3SJohn Marino * a PDD, UDD or LDD for MDACIOCTL_GETDEVCONFINFO. 92586d7f5d3SJohn Marino */ 92686d7f5d3SJohn Marino struct mly_devconf_hdr { 92786d7f5d3SJohn Marino u_int8_t type; /* see 8.2 */ 92886d7f5d3SJohn Marino u_int8_t state; /* see 8.1 */ 92986d7f5d3SJohn Marino u_int16_t raid_device; 93086d7f5d3SJohn Marino }; 93186d7f5d3SJohn Marino 93286d7f5d3SJohn Marino union mly_ioctl_devconfinfo { 93386d7f5d3SJohn Marino struct mly_pdd pdd; 93486d7f5d3SJohn Marino struct mly_udd udd; 93586d7f5d3SJohn Marino struct mly_ldd ldd; 93686d7f5d3SJohn Marino struct mly_devconf_hdr hdr; 93786d7f5d3SJohn Marino }; 93886d7f5d3SJohn Marino 93986d7f5d3SJohn Marino /* 94086d7f5d3SJohn Marino * 22.3 MDACIOCTL_RENAMERAIDDEV 94186d7f5d3SJohn Marino * 94286d7f5d3SJohn Marino * XXX this command is listed as transferring data, but does not define the data. 94386d7f5d3SJohn Marino */ 94486d7f5d3SJohn Marino struct mly_ioctl_param_renameraiddev { 94586d7f5d3SJohn Marino u_int8_t new_raid_device; 94686d7f5d3SJohn Marino } __packed; 94786d7f5d3SJohn Marino 94886d7f5d3SJohn Marino /* 94986d7f5d3SJohn Marino * 23.6.2 MDACIOCTL_XLATEPHYSDEVTORAIDDEV 95086d7f5d3SJohn Marino * 95186d7f5d3SJohn Marino * XXX documentation suggests this format will change 95286d7f5d3SJohn Marino */ 95386d7f5d3SJohn Marino struct mly_ioctl_param_xlatephysdevtoraiddev { 95486d7f5d3SJohn Marino u_int16_t raid_device; 95586d7f5d3SJohn Marino u_int8_t res1[2]; 95686d7f5d3SJohn Marino u_int8_t controller; 95786d7f5d3SJohn Marino u_int8_t channel; 95886d7f5d3SJohn Marino u_int8_t target; 95986d7f5d3SJohn Marino u_int8_t lun; 96086d7f5d3SJohn Marino } __packed; 96186d7f5d3SJohn Marino 96286d7f5d3SJohn Marino /* 96386d7f5d3SJohn Marino * 23.7 MDACIOCTL_GETGROUPCONFINFO 96486d7f5d3SJohn Marino */ 96586d7f5d3SJohn Marino struct mly_ioctl_param_getgroupconfinfo { 96686d7f5d3SJohn Marino u_int16_t group; 96786d7f5d3SJohn Marino u_int8_t res1[8]; 96886d7f5d3SJohn Marino union mly_command_transfer transfer; 96986d7f5d3SJohn Marino } __packed; 97086d7f5d3SJohn Marino 97186d7f5d3SJohn Marino /* 97286d7f5d3SJohn Marino * 23.9.2 MDACIOCTL_GETFREESPACELIST: Data Format 97386d7f5d3SJohn Marino * 97486d7f5d3SJohn Marino * The controller will populate as much of this structure as is provided, 97586d7f5d3SJohn Marino * or as is required to fully list the free space available. 97686d7f5d3SJohn Marino */ 97786d7f5d3SJohn Marino struct mly_ioctl_getfreespacelist_entry { 97886d7f5d3SJohn Marino u_int16_t raid_device; 97986d7f5d3SJohn Marino u_int8_t res1[6]; 98086d7f5d3SJohn Marino u_int32_t address; /* XXX "blocks or MB" Huh? */ 98186d7f5d3SJohn Marino u_int32_t size; /* XXX "blocks or MB" Huh? */ 98286d7f5d3SJohn Marino } __packed; 98386d7f5d3SJohn Marino 98486d7f5d3SJohn Marino struct mly_ioctl_getfrespacelist { 98586d7f5d3SJohn Marino u_int16_t returned_entries; 98686d7f5d3SJohn Marino u_int16_t total_entries; 98786d7f5d3SJohn Marino u_int8_t res1[12]; 98886d7f5d3SJohn Marino struct mly_ioctl_getfreespacelist_entry space[0]; /* expand to suit */ 98986d7f5d3SJohn Marino } __packed; 99086d7f5d3SJohn Marino 99186d7f5d3SJohn Marino /* 99286d7f5d3SJohn Marino * 27.1 MDACIOCTL_GETSUBSYSTEMDATA 99386d7f5d3SJohn Marino * 27.2 MDACIOCTL_SETSUBSYSTEMDATA 99486d7f5d3SJohn Marino * 99586d7f5d3SJohn Marino * PCI controller only supports a limited subset of the possible operations. 99686d7f5d3SJohn Marino * 99786d7f5d3SJohn Marino * XXX where does the status end up? (the command transfers no data) 99886d7f5d3SJohn Marino */ 99986d7f5d3SJohn Marino struct mly_ioctl_param_subsystemdata { 100086d7f5d3SJohn Marino u_int8_t operation:4; 100186d7f5d3SJohn Marino #define MLY_BBU_GETSTATUS 0x00 100286d7f5d3SJohn Marino #define MLY_BBU_SET_THRESHOLD 0x00 /* minutes in param[0,1] */ 100386d7f5d3SJohn Marino u_int8_t subsystem:4; 100486d7f5d3SJohn Marino #define MLY_SUBSYSTEM_BBU 0x01 100586d7f5d3SJohn Marino u_int parameter[3]; /* only for SETSUBSYSTEMDATA */ 100686d7f5d3SJohn Marino } __packed; 100786d7f5d3SJohn Marino 100886d7f5d3SJohn Marino struct mly_ioctl_getsubsystemdata_bbustatus { 100986d7f5d3SJohn Marino u_int16_t current_power; 101086d7f5d3SJohn Marino u_int16_t maximum_power; 101186d7f5d3SJohn Marino u_int16_t power_threshold; 101286d7f5d3SJohn Marino u_int8_t charge_level; 101386d7f5d3SJohn Marino u_int8_t hardware_version; 101486d7f5d3SJohn Marino u_int8_t battery_type; 101586d7f5d3SJohn Marino #define MLY_BBU_TYPE_UNKNOWN 0x00 101686d7f5d3SJohn Marino #define MLY_BBU_TYPE_NICAD 0x01 101786d7f5d3SJohn Marino #define MLY_BBU_TYPE_MISSING 0xfe 101886d7f5d3SJohn Marino u_int8_t res1; 101986d7f5d3SJohn Marino u_int8_t operation_status; 102086d7f5d3SJohn Marino #define MLY_BBU_STATUS_NO_SYNC 0x01 102186d7f5d3SJohn Marino #define MLY_BBU_STATUS_OUT_OF_SYNC 0x02 102286d7f5d3SJohn Marino #define MLY_BBU_STATUS_FIRST_WARNING 0x04 102386d7f5d3SJohn Marino #define MLY_BBU_STATUS_SECOND_WARNING 0x08 102486d7f5d3SJohn Marino #define MLY_BBU_STATUS_RECONDITIONING 0x10 102586d7f5d3SJohn Marino #define MLY_BBU_STATUS_DISCHARGING 0x20 102686d7f5d3SJohn Marino #define MLY_BBU_STATUS_FASTCHARGING 0x40 102786d7f5d3SJohn Marino u_int8_t res2; 102886d7f5d3SJohn Marino } __packed; 102986d7f5d3SJohn Marino 103086d7f5d3SJohn Marino /* 103186d7f5d3SJohn Marino * 28.9 MDACIOCTL_RESETDEVICE 103286d7f5d3SJohn Marino * 28.10 MDACIOCTL_FLUSHDEVICEDATA 103386d7f5d3SJohn Marino * 28.11 MDACIOCTL_PAUSEDEVICE 103486d7f5d3SJohn Marino * 28.12 MDACIOCTL_UNPAUSEDEVICE 103586d7f5d3SJohn Marino */ 103686d7f5d3SJohn Marino struct mly_ioctl_param_deviceoperation { 103786d7f5d3SJohn Marino u_int8_t operation_device; /* see 14.3 */ 103886d7f5d3SJohn Marino } __packed; 103986d7f5d3SJohn Marino 104086d7f5d3SJohn Marino /* 104186d7f5d3SJohn Marino * 31.1 Event Data Format 104286d7f5d3SJohn Marino */ 104386d7f5d3SJohn Marino struct mly_event { 104486d7f5d3SJohn Marino u_int32_t sequence_number; 104586d7f5d3SJohn Marino u_int32_t timestamp; 104686d7f5d3SJohn Marino u_int32_t code; 104786d7f5d3SJohn Marino u_int8_t controller; 104886d7f5d3SJohn Marino u_int8_t channel; 104986d7f5d3SJohn Marino u_int8_t target; /* also enclosure */ 105086d7f5d3SJohn Marino u_int8_t lun; /* also enclosure unit */ 105186d7f5d3SJohn Marino u_int8_t res1[4]; 105286d7f5d3SJohn Marino u_int32_t param; 105386d7f5d3SJohn Marino u_int8_t sense[40]; 105486d7f5d3SJohn Marino } __packed; 105586d7f5d3SJohn Marino 105686d7f5d3SJohn Marino /* 105786d7f5d3SJohn Marino * 31.2 MDACIOCTL_GETEVENT 105886d7f5d3SJohn Marino */ 105986d7f5d3SJohn Marino struct mly_ioctl_param_getevent { 106086d7f5d3SJohn Marino u_int16_t sequence_number_low; 106186d7f5d3SJohn Marino u_int8_t res1[8]; 106286d7f5d3SJohn Marino union mly_command_transfer transfer; 106386d7f5d3SJohn Marino } __packed; 106486d7f5d3SJohn Marino 106586d7f5d3SJohn Marino union mly_ioctl_param { 106686d7f5d3SJohn Marino struct mly_ioctl_param_data data; 106786d7f5d3SJohn Marino struct mly_ioctl_param_setmemorymailbox setmemorymailbox; 106886d7f5d3SJohn Marino struct mly_ioctl_param_setraiddevstate setraiddevstate; 106986d7f5d3SJohn Marino struct mly_ioctl_param_renameraiddev renameraiddev; 107086d7f5d3SJohn Marino struct mly_ioctl_param_xlatephysdevtoraiddev xlatephysdevtoraiddev; 107186d7f5d3SJohn Marino struct mly_ioctl_param_getgroupconfinfo getgroupconfinfo; 107286d7f5d3SJohn Marino struct mly_ioctl_param_subsystemdata subsystemdata; 107386d7f5d3SJohn Marino struct mly_ioctl_param_deviceoperation deviceoperation; 107486d7f5d3SJohn Marino struct mly_ioctl_param_getevent getevent; 107586d7f5d3SJohn Marino }; 107686d7f5d3SJohn Marino 107786d7f5d3SJohn Marino /* 107886d7f5d3SJohn Marino * 19 SCSI Command Format 107986d7f5d3SJohn Marino */ 108086d7f5d3SJohn Marino struct mly_command_address_physical { 108186d7f5d3SJohn Marino u_int8_t lun; 108286d7f5d3SJohn Marino u_int8_t target; 108386d7f5d3SJohn Marino u_int8_t channel:3; 108486d7f5d3SJohn Marino u_int8_t controller:5; 108586d7f5d3SJohn Marino } __packed; 108686d7f5d3SJohn Marino 108786d7f5d3SJohn Marino struct mly_command_address_logical { 108886d7f5d3SJohn Marino u_int16_t logdev; 108986d7f5d3SJohn Marino u_int8_t res1:3; 109086d7f5d3SJohn Marino u_int8_t controller:5; 109186d7f5d3SJohn Marino } __packed; 109286d7f5d3SJohn Marino 109386d7f5d3SJohn Marino union mly_command_address { 109486d7f5d3SJohn Marino struct mly_command_address_physical phys; 109586d7f5d3SJohn Marino struct mly_command_address_logical log; 109686d7f5d3SJohn Marino }; 109786d7f5d3SJohn Marino 109886d7f5d3SJohn Marino struct mly_command_generic { 109986d7f5d3SJohn Marino u_int16_t command_id; 110086d7f5d3SJohn Marino u_int8_t opcode; 110186d7f5d3SJohn Marino struct mly_command_control command_control; 110286d7f5d3SJohn Marino u_int32_t data_size; 110386d7f5d3SJohn Marino u_int64_t sense_buffer_address; 110486d7f5d3SJohn Marino union mly_command_address addr; 110586d7f5d3SJohn Marino struct mly_timeout timeout; 110686d7f5d3SJohn Marino u_int8_t maximum_sense_size; 110786d7f5d3SJohn Marino u_int8_t res1[11]; 110886d7f5d3SJohn Marino union mly_command_transfer transfer; 110986d7f5d3SJohn Marino } __packed; 111086d7f5d3SJohn Marino 111186d7f5d3SJohn Marino 111286d7f5d3SJohn Marino /* 111386d7f5d3SJohn Marino * 19.1 MDACMD_SCSI & MDACMD_SCSIPT 111486d7f5d3SJohn Marino */ 111586d7f5d3SJohn Marino #define MLY_CMD_SCSI_SMALL_CDB 10 111686d7f5d3SJohn Marino struct mly_command_scsi_small { 111786d7f5d3SJohn Marino u_int16_t command_id; 111886d7f5d3SJohn Marino u_int8_t opcode; 111986d7f5d3SJohn Marino struct mly_command_control command_control; 112086d7f5d3SJohn Marino u_int32_t data_size; 112186d7f5d3SJohn Marino u_int64_t sense_buffer_address; 112286d7f5d3SJohn Marino union mly_command_address addr; 112386d7f5d3SJohn Marino struct mly_timeout timeout; 112486d7f5d3SJohn Marino u_int8_t maximum_sense_size; 112586d7f5d3SJohn Marino u_int8_t cdb_length; 112686d7f5d3SJohn Marino u_int8_t cdb[MLY_CMD_SCSI_SMALL_CDB]; 112786d7f5d3SJohn Marino union mly_command_transfer transfer; 112886d7f5d3SJohn Marino } __packed; 112986d7f5d3SJohn Marino 113086d7f5d3SJohn Marino /* 113186d7f5d3SJohn Marino * 19.2 MDACMD_SCSILC & MDACMD_SCSILCPT 113286d7f5d3SJohn Marino */ 113386d7f5d3SJohn Marino struct mly_command_scsi_large { 113486d7f5d3SJohn Marino u_int16_t command_id; 113586d7f5d3SJohn Marino u_int8_t opcode; 113686d7f5d3SJohn Marino struct mly_command_control command_control; 113786d7f5d3SJohn Marino u_int32_t data_size; 113886d7f5d3SJohn Marino u_int64_t sense_buffer_address; 113986d7f5d3SJohn Marino union mly_command_address addr; 114086d7f5d3SJohn Marino struct mly_timeout timeout; 114186d7f5d3SJohn Marino u_int8_t maximum_sense_size; 114286d7f5d3SJohn Marino u_int8_t cdb_length; 114386d7f5d3SJohn Marino u_int16_t res1; 114486d7f5d3SJohn Marino u_int64_t cdb_physaddr; 114586d7f5d3SJohn Marino union mly_command_transfer transfer; 114686d7f5d3SJohn Marino } __packed; 114786d7f5d3SJohn Marino 114886d7f5d3SJohn Marino /* 114986d7f5d3SJohn Marino * 20.1 IOCTL Command Format: Internal Bus 115086d7f5d3SJohn Marino */ 115186d7f5d3SJohn Marino struct mly_command_ioctl { 115286d7f5d3SJohn Marino u_int16_t command_id; 115386d7f5d3SJohn Marino u_int8_t opcode; 115486d7f5d3SJohn Marino struct mly_command_control command_control; 115586d7f5d3SJohn Marino u_int32_t data_size; 115686d7f5d3SJohn Marino u_int64_t sense_buffer_address; 115786d7f5d3SJohn Marino union mly_command_address addr; 115886d7f5d3SJohn Marino struct mly_timeout timeout; 115986d7f5d3SJohn Marino u_int8_t maximum_sense_size; 116086d7f5d3SJohn Marino u_int8_t sub_ioctl; 116186d7f5d3SJohn Marino union mly_ioctl_param param; 116286d7f5d3SJohn Marino } __packed; 116386d7f5d3SJohn Marino 116486d7f5d3SJohn Marino /* 116586d7f5d3SJohn Marino * PG6: 8.2.2 116686d7f5d3SJohn Marino */ 116786d7f5d3SJohn Marino struct mly_command_mmbox { 116886d7f5d3SJohn Marino u_int32_t flag; 116986d7f5d3SJohn Marino u_int8_t data[60]; 117086d7f5d3SJohn Marino } __packed; 117186d7f5d3SJohn Marino 117286d7f5d3SJohn Marino union mly_command_packet { 117386d7f5d3SJohn Marino struct mly_command_generic generic; 117486d7f5d3SJohn Marino struct mly_command_scsi_small scsi_small; 117586d7f5d3SJohn Marino struct mly_command_scsi_large scsi_large; 117686d7f5d3SJohn Marino struct mly_command_ioctl ioctl; 117786d7f5d3SJohn Marino struct mly_command_mmbox mmbox; 117886d7f5d3SJohn Marino }; 117986d7f5d3SJohn Marino 118086d7f5d3SJohn Marino /* 118186d7f5d3SJohn Marino * PG6: 5.3 118286d7f5d3SJohn Marino */ 118386d7f5d3SJohn Marino #define MLY_I960RX_COMMAND_MAILBOX 0x10 118486d7f5d3SJohn Marino #define MLY_I960RX_STATUS_MAILBOX 0x18 118586d7f5d3SJohn Marino #define MLY_I960RX_IDBR 0x20 118686d7f5d3SJohn Marino #define MLY_I960RX_ODBR 0x2c 118786d7f5d3SJohn Marino #define MLY_I960RX_ERROR_STATUS 0x2e 118886d7f5d3SJohn Marino #define MLY_I960RX_INTERRUPT_STATUS 0x30 118986d7f5d3SJohn Marino #define MLY_I960RX_INTERRUPT_MASK 0x34 119086d7f5d3SJohn Marino 119186d7f5d3SJohn Marino #define MLY_STRONGARM_COMMAND_MAILBOX 0x50 119286d7f5d3SJohn Marino #define MLY_STRONGARM_STATUS_MAILBOX 0x58 119386d7f5d3SJohn Marino #define MLY_STRONGARM_IDBR 0x60 119486d7f5d3SJohn Marino #define MLY_STRONGARM_ODBR 0x61 119586d7f5d3SJohn Marino #define MLY_STRONGARM_ERROR_STATUS 0x63 119686d7f5d3SJohn Marino #define MLY_STRONGARM_INTERRUPT_STATUS 0x30 119786d7f5d3SJohn Marino #define MLY_STRONGARM_INTERRUPT_MASK 0x34 119886d7f5d3SJohn Marino 119986d7f5d3SJohn Marino /* 120086d7f5d3SJohn Marino * PG6: 5.4.3 Doorbell 0 120186d7f5d3SJohn Marino */ 120286d7f5d3SJohn Marino #define MLY_HM_CMDSENT (1<<0) 120386d7f5d3SJohn Marino #define MLY_HM_STSACK (1<<1) 120486d7f5d3SJohn Marino #define MLY_SOFT_RST (1<<3) 120586d7f5d3SJohn Marino #define MLY_AM_CMDSENT (1<<4) 120686d7f5d3SJohn Marino 120786d7f5d3SJohn Marino /* 120886d7f5d3SJohn Marino * PG6: 5.4.4 Doorbell 1 120986d7f5d3SJohn Marino * 121086d7f5d3SJohn Marino * Note that the documentation claims that these bits are set when the 121186d7f5d3SJohn Marino * status queue(s) are empty, wheras the Linux driver and experience 121286d7f5d3SJohn Marino * suggest they are set when there is status available. 121386d7f5d3SJohn Marino */ 121486d7f5d3SJohn Marino #define MLY_HM_STSREADY (1<<0) 121586d7f5d3SJohn Marino #define MLY_AM_STSREADY (1<<1) 121686d7f5d3SJohn Marino 121786d7f5d3SJohn Marino /* 121886d7f5d3SJohn Marino * PG6: 5.4.6 Doorbell 3 121986d7f5d3SJohn Marino */ 122086d7f5d3SJohn Marino #define MLY_MSG_EMPTY (1<<3) 122186d7f5d3SJohn Marino #define MLY_MSG_SPINUP 0x08 122286d7f5d3SJohn Marino #define MLY_MSG_RACE_RECOVERY_FAIL 0x60 122386d7f5d3SJohn Marino #define MLY_MSG_RACE_IN_PROGRESS 0x70 122486d7f5d3SJohn Marino #define MLY_MSG_RACE_ON_CRITICAL 0xb0 122586d7f5d3SJohn Marino #define MLY_MSG_PARITY_ERROR 0xf0 122686d7f5d3SJohn Marino 122786d7f5d3SJohn Marino /* 122886d7f5d3SJohn Marino * PG6: 5.4.8 Outbound Interrupt Mask 122986d7f5d3SJohn Marino */ 123086d7f5d3SJohn Marino #define MLY_INTERRUPT_MASK_DISABLE 0xff 123186d7f5d3SJohn Marino #define MLY_INTERRUPT_MASK_ENABLE (0xff & ~(1<<2)) 123286d7f5d3SJohn Marino 123386d7f5d3SJohn Marino /* 123486d7f5d3SJohn Marino * PG6: 8.2 Advanced Mailbox Scheme 123586d7f5d3SJohn Marino * 123686d7f5d3SJohn Marino * Note that this must be allocated on a 4k boundary, and all internal 123786d7f5d3SJohn Marino * fields must also reside on a 4k boundary. 123886d7f5d3SJohn Marino * We could dynamically size this structure, but the extra effort 123986d7f5d3SJohn Marino * is probably unjustified. Note that these buffers do not need to be 124086d7f5d3SJohn Marino * adjacent - we just group them to simplify allocation of the bus-visible 124186d7f5d3SJohn Marino * buffer. 124286d7f5d3SJohn Marino * 124386d7f5d3SJohn Marino * XXX Note that for some reason, if MLY_MMBOX_COMMANDS is > 64, the controller 124486d7f5d3SJohn Marino * fails to respond to the command at (MLY_MMBOX_COMMANDS - 64). It's not 124586d7f5d3SJohn Marino * wrapping to 0 at this point (determined by experimentation). This is not 124686d7f5d3SJohn Marino * consistent with the Linux driver's implementation. 124786d7f5d3SJohn Marino * Whilst it's handy to have lots of room for status returns in case we end up 124886d7f5d3SJohn Marino * being slow getting back to completed commands, it seems unlikely that we 124986d7f5d3SJohn Marino * would get 64 commands ahead of the controller on the submissions side, so 125086d7f5d3SJohn Marino * the current workaround is to simply limit the command ring to 64 entries. 125186d7f5d3SJohn Marino */ 125286d7f5d3SJohn Marino union mly_status_packet { 125386d7f5d3SJohn Marino struct mly_status status; 125486d7f5d3SJohn Marino struct { 125586d7f5d3SJohn Marino u_int32_t flag; 125686d7f5d3SJohn Marino u_int8_t data[4]; 125786d7f5d3SJohn Marino } __packed mmbox; 125886d7f5d3SJohn Marino }; 125986d7f5d3SJohn Marino union mly_health_region { 126086d7f5d3SJohn Marino struct mly_health_status status; 126186d7f5d3SJohn Marino u_int8_t pad[1024]; 126286d7f5d3SJohn Marino }; 126386d7f5d3SJohn Marino 126486d7f5d3SJohn Marino #define MLY_MMBOX_COMMANDS 64 126586d7f5d3SJohn Marino #define MLY_MMBOX_STATUS 512 126686d7f5d3SJohn Marino struct mly_mmbox { 126786d7f5d3SJohn Marino union mly_command_packet mmm_command[MLY_MMBOX_COMMANDS]; 126886d7f5d3SJohn Marino union mly_status_packet mmm_status[MLY_MMBOX_STATUS]; 126986d7f5d3SJohn Marino union mly_health_region mmm_health; 127086d7f5d3SJohn Marino } __packed; 1271