1*946f45ceSmarco /* $OpenBSD: amireg.h,v 1.30 2008/10/22 18:42:29 marco Exp $ */ 2ebaedd01Smickey 3ebaedd01Smickey /* 4ebaedd01Smickey * Copyright (c) 2000 Michael Shalayeff 5473e8dcaSmarco * Copyright (c) 2005 Marco Peereboom 6ebaedd01Smickey * All rights reserved. 7ebaedd01Smickey * 8ebaedd01Smickey * Redistribution and use in source and binary forms, with or without 9ebaedd01Smickey * modification, are permitted provided that the following conditions 10ebaedd01Smickey * are met: 11ebaedd01Smickey * 1. Redistributions of source code must retain the above copyright 12ebaedd01Smickey * notice, this list of conditions and the following disclaimer. 13ebaedd01Smickey * 2. Redistributions in binary form must reproduce the above copyright 14ebaedd01Smickey * notice, this list of conditions and the following disclaimer in the 15ebaedd01Smickey * documentation and/or other materials provided with the distribution. 16ebaedd01Smickey * 17ebaedd01Smickey * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18ebaedd01Smickey * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19ebaedd01Smickey * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20ebaedd01Smickey * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 21ebaedd01Smickey * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22ebaedd01Smickey * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23ebaedd01Smickey * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24ebaedd01Smickey * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 25ebaedd01Smickey * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 26ebaedd01Smickey * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27ebaedd01Smickey * THE POSSIBILITY OF SUCH DAMAGE. 28ebaedd01Smickey */ 29ebaedd01Smickey 30ebaedd01Smickey #define AMI_MAX_PDRIVES (75) 31ebaedd01Smickey #define AMI_MAX_LDRIVES 8 32ebaedd01Smickey #define AMI_MAX_SPANDEPTH 4 33ebaedd01Smickey #define AMI_MAX_DEVDEPTH 8 3433dde987Smarco #define AMI_MAX_TARGET 16 35ebaedd01Smickey 36ebaedd01Smickey #define AMI_BIG_MAX_PDRIVES (256) 37ebaedd01Smickey #define AMI_BIG_MAX_LDRIVES 40 38ebaedd01Smickey #define AMI_BIG_MAX_SPANDEPTH 8 39ebaedd01Smickey #define AMI_BIG_MAX_DEVDEPTH 32 40ebaedd01Smickey 41051bc45aSmarco #define AMI_MAXCMDS 126 /* theoretical limit is 250 */ 42ebaedd01Smickey #define AMI_SECTOR_SIZE 512 43ebaedd01Smickey #define AMI_MAXOFFSETS 26 44ebaedd01Smickey #define AMI_SGEPERCMD 32 /* to prevent page boundary crossing */ 45400dd348Smarco #define AMI_MAX_BUSYWAIT 10 /* wait up to 10 usecs */ 46191ce3f2Smarco #define AMI_MAX_POLLWAIT 1000000 /* wait up to 1000 000 usecs */ 47711ce438Skrw #define AMI_MAXIOCTLCMDS 1 /* number of parallel ioctl calls */ 48711ce438Skrw #define AMI_MAXPROCS 2 /* number of processors on a channel */ 49711ce438Skrw #define AMI_MAXRAWCMDS 2 /* number of parallel processor cmds */ 50ebaedd01Smickey 51ebaedd01Smickey #define AMI_MAXFER (AMI_MAXOFFSETS * PAGE_SIZE) 52ebaedd01Smickey 53ebaedd01Smickey #define AMI_QIDB 0x20 54ebaedd01Smickey #define AMI_QIDB_EXEC 0x01 55ebaedd01Smickey #define AMI_QIDB_ACK 0x02 56ebaedd01Smickey #define AMI_QODB 0x2c 57ebaedd01Smickey #define AMI_QODB_READY 0x10001234 58ebaedd01Smickey 59ebaedd01Smickey #define AMI_SCMD 0x10 60ebaedd01Smickey #define AMI_SCMD_EXEC 0x10 61ebaedd01Smickey #define AMI_SCMD_ACK 0x08 62ebaedd01Smickey #define AMI_SMBSTAT 0x10 63ebaedd01Smickey #define AMI_SMBST_BUSY 0x10 64ebaedd01Smickey #define AMI_SIEM 0x11 65ebaedd01Smickey #define AMI_SEIM_ENA 0xc0 66ebaedd01Smickey #define AMI_SMBADDR 0x14 67ebaedd01Smickey #define AMI_SMBENA 0x18 68ebaedd01Smickey #define AMI_ISTAT 0x1a 69ebaedd01Smickey #define AMI_ISTAT_PEND 0x40 70ebaedd01Smickey 71ebaedd01Smickey /* commands */ 72ebaedd01Smickey #define AMI_READ 0x01 73ebaedd01Smickey #define AMI_WRITE 0x02 74fc109205Smickey #define AMI_PASSTHRU 0x03 /* pass scsi cdb to the device */ 75ebaedd01Smickey #define AMI_EINQUIRY 0x04 /* extended inquiry */ 76ebaedd01Smickey #define AMI_INQUIRY 0x05 /* inquiry */ 77ebaedd01Smickey #define AMI_CHSTATE 0x06 /* pad[0] -- state */ 78ebaedd01Smickey #define AMI_STATE_ON 3 79ebaedd01Smickey #define AMI_STATE_FAIL 4 80ebaedd01Smickey #define AMI_STATE_SPARE 6 815760a079Smarco #define AMI_RCONFIG 0x07 /* read configuration up to 4 spans */ 825760a079Smarco #define AMI_REBUILDPD 0x08 /* rebuild physical drive */ 83ebaedd01Smickey #define AMI_CHECK 0x09 /* check consistency */ 84ebaedd01Smickey #define AMI_FLUSH 0x0a 85ebaedd01Smickey #define AMI_ILDRIVE 0x0b /* init logical drive */ 86ebaedd01Smickey #define AMI_EINQUIRY3 0x0c 87fc109205Smickey #define AMI_DCHDR 0x14 /* get/set dedicated channel/drives */ 88ebaedd01Smickey #define AMI_GRBLDPROGR 0x18 /* get rebuild progress */ 89ebaedd01Smickey #define AMI_GCHECKPROGR 0x19 /* get check consistency progress */ 90ebaedd01Smickey #define AMI_GILDRPROGR 0x1b /* get init logical drive progress */ 91ebaedd01Smickey #define AMI_WRCONFIG 0x20 /* write configuration up to 4 spans */ 92ebaedd01Smickey #define AMI_RWRCONFIG 0x21 /* raid write config */ 93ebaedd01Smickey #define AMI_RRDCONFIG 0x22 /* raid read config */ 94ebaedd01Smickey #define AMI_GRBLDRATE 0x23 /* get rebuild rate */ 95ebaedd01Smickey #define AMI_SRBLDRATE 0x24 /* set rebuild rate */ 96ebaedd01Smickey #define AMI_UPLDCFGUT 0x25 /* upload config utility */ 97ebaedd01Smickey #define AMI_UPLDRVPROP 0x26 /* update logical drive property */ 98ebaedd01Smickey #define AMI_ABRTREBLD 0x28 /* abort rebuild */ 99ebaedd01Smickey #define AMI_ABRTCHECK 0x29 /* abort check consistency */ 100ebaedd01Smickey #define AMI_ABRTILDRV 0x2b /* abort init logical drive */ 101ebaedd01Smickey #define AMI_WRBLOCK 0x2c /* flash write block */ 102ebaedd01Smickey #define AMI_PRGFLASH 0x2d /* flash program */ 103ebaedd01Smickey #define AMI_SFLUSHINTV 0x2e /* channel == cache flush interval */ 104ebaedd01Smickey #define AMI_PCHIPSETVAL 0x2f /* program chipset values */ 105ebaedd01Smickey #define AMI_CS_NEPTUNE 0x61 106ebaedd01Smickey #define AMI_CS_OTHER 0xe1 107ebaedd01Smickey #define AMI_CS_TRITON 0xe2 108ebaedd01Smickey #define AMI_SNEG 0x30 /* scsi sync negotiation get/ena/dis */ 109ebaedd01Smickey #define AMI_SNEG_GET 1 110ebaedd01Smickey #define AMI_SNEG_SET 2 111ebaedd01Smickey #define AMI_QTAG 0x31 /* scsi queue tag get/set */ 112ebaedd01Smickey #define AMI_QTAG_GET 1 113ebaedd01Smickey #define AMI_QTAG_SET 2 114ebaedd01Smickey #define AMI_GSUPARAM 0x32 /* get spinup parameters */ 115ebaedd01Smickey #define AMI_SSUPARAM 0x33 /* set spinup parameters */ 116ebaedd01Smickey #define AMI_GDROAMINFO 0x34 117ebaedd01Smickey #define AMI_GMACHID 0x36 /* get machine id */ 118ebaedd01Smickey #define AMI_BIOSPDATA 0x40 /* get bios private data */ 119ebaedd01Smickey #define AMI_I2OCFGDLG 0x41 /* I2O config dialog */ 120ebaedd01Smickey #define AMI_GCACHESTAT 0x50 /* get cache statistics */ 121ebaedd01Smickey #define AMI_SPEAKER 0x51 /* speaker control */ 122ebaedd01Smickey #define AMI_SPKR_OFF 0 123ebaedd01Smickey #define AMI_SPKR_ON 1 124ebaedd01Smickey #define AMI_SPKR_SHUT 2 125ebaedd01Smickey #define AMI_SPKR_GVAL 3 1269d1bf941Smarco #define AMI_SPKR_TEST 4 127ebaedd01Smickey #define AMI_GDUMP 0x52 /* get error condition in text */ 128ebaedd01Smickey #define AMI_SENSEDUMPA 0x53 /* get SCSI sense dump area */ 129ebaedd01Smickey #define AMI_STDIAG 0x54 /* start diagnostics -- 2.1 */ 130ebaedd01Smickey #define AMI_FRAID_PF 0x55 /* get/set flexraid power fail */ 131ebaedd01Smickey #define AMI_GFRAIDPF 1 132ebaedd01Smickey #define AMI_SFRAIDPF 2 133fc109205Smickey #define AMI_FRAIDVS 0x56 /* get/set flexraid virtual sizing */ 134ebaedd01Smickey #define AMI_GFRAIDVS 1 135ebaedd01Smickey #define AMI_SFRAIDVS 2 136ebaedd01Smickey #define AMI_BBMANAGE 0x57 /* bad block manage */ 137ebaedd01Smickey #define AMI_RECONSTRUCT 0x60 /* begin reconstruction */ 138ebaedd01Smickey #define AMI_GRECONSTRUCT 0x61 /* get reconstruction progress */ 139ebaedd01Smickey #define AMI_BIOSSTAT 0x62 /* enable/disable bios */ 140ebaedd01Smickey #define AMI_RDCFGDSK 0x63 /* read configuration from disk */ 141ebaedd01Smickey #define AMI_AREBUILD 0x64 /* get/set autorebuild/battery charge */ 142ebaedd01Smickey #define AMI_GUCAP 1 /* get ultra capabilities */ 143ebaedd01Smickey #define AMI_SUCAP 2 /* set ultra capability */ 144ebaedd01Smickey #define AMI_GARBLD 3 145ebaedd01Smickey #define AMI_SARBLD 4 146ebaedd01Smickey #define AMI_GFCC 5 /* get fast charge counter */ 147ebaedd01Smickey #define AMI_SFCC 6 /* set fast charge counter */ 148ebaedd01Smickey #define AMI_GCUCAP 7 /* get channel ultra capabilities */ 149ebaedd01Smickey #define AMI_SCUCAP 8 /* set channel ultra capabilities */ 150ebaedd01Smickey #define AMI_SFD 0x66 /* set factory defaults */ 151ebaedd01Smickey #define AMI_RDCONFIG8 0x67 /* read configuration up to 8 spans */ 152ebaedd01Smickey #define AMI_WRCONFIG8 0x68 /* write config up to 8 spans */ 153ebaedd01Smickey #define AMI_ESENSEDUMPA 0x69 /* extended scsi dump area */ 154ebaedd01Smickey #define AMI_RERRC 0x6a /* reset error counter */ 155ebaedd01Smickey #define AMI_BOOTUP 0x6b /* ena/dis physical drive boot up */ 156ebaedd01Smickey #define AMI_ENCLOSURE 0x6c /* get/set enclosure type */ 157ebaedd01Smickey #define AMI_WRCFGD 0x6c /* write config disk -- 2.1 */ 158ebaedd01Smickey #define AMI_HAPIRRLD 0x6e 159ebaedd01Smickey #define AMI_LDRVRIGHTS 0x6f 160ebaedd01Smickey #define AMI_CLUSTERING 0x70 161ebaedd01Smickey #define AMI_GCHPROP 0x71 /* get channel properties */ 162ebaedd01Smickey #define AMI_SCHTERM 0x72 /* set channel termination */ 163ebaedd01Smickey #define AMI_TERM_DISABLE 0 164ebaedd01Smickey #define AMI_TERM_ENABLE 1 165ebaedd01Smickey #define AMI_TERM_HIGH 2 166ebaedd01Smickey #define AMI_TERM_WIDE 3 167ebaedd01Smickey #define AMI_TERM_DFLT 16 168ebaedd01Smickey #define AMI_QUIETCH 0x73 /* quiet channel */ 169ebaedd01Smickey #define AMI_ACTIVATECH 0x74 /* activate channel */ 170ebaedd01Smickey #define AMI_STARTU 0x75 /* start unit, pad[0] -- sync/async */ 171ebaedd01Smickey #define AMI_STARTU_SYNC 1 172ebaedd01Smickey #define AMI_STARTU_ASYN 2 173ebaedd01Smickey #define AMI_STOPU 0x76 /* stop unit */ 174ebaedd01Smickey #define AMI_GERRC 0x77 /* get error counter */ 175ebaedd01Smickey #define AMI_GBTDS 0x78 /* get boot time drive status */ 176ebaedd01Smickey #define AMI_FMTPROG 0x79 177ebaedd01Smickey #define AMI_RCAPCMD 0x7a /* read capacity */ 178ebaedd01Smickey #define AMI_WRCRX 0x7b 179ebaedd01Smickey #define AMI_RDCRX 0x7c 180ebaedd01Smickey #define AMI_GINID 0x7d /* get initiator id */ 181ebaedd01Smickey #define AMI_HAPICMD 0x7e 182ebaedd01Smickey #define AMI_SINID 0x7f /* set initiator id */ 183ebaedd01Smickey #define AMI_SMARTMSEL 0x80 184ebaedd01Smickey #define AMI_SPSTARTU 0x85 /* special start unit command */ 185ebaedd01Smickey #define AMI_NVFAILHIST 0x90 186ebaedd01Smickey #define AMI_DCMDABRT 0x91 187ebaedd01Smickey #define AMI_GDRIVEHIST 0x92 /* get drive history */ 188ebaedd01Smickey #define AMI_GESENSE 0x93 /* get extended sense data dump */ 189ebaedd01Smickey #define AMI_ADAPTER 0x95 /* save/restore adapter params */ 190ebaedd01Smickey #define AMI_ADP_SAVE 0 191ebaedd01Smickey #define AMI_ADP_LOAD 1 192ebaedd01Smickey #define AMI_RESET 0x96 /* adapter reset */ 193ebaedd01Smickey #define AMI_PRGCLASS 0x97 /* program class code */ 194ebaedd01Smickey #define AMI_UPHTML 0x98 /* upload html utility */ 195ebaedd01Smickey #define AMI_NEWCFG 0x99 196ebaedd01Smickey #define AMI_NEWOP 0xa0 197ebaedd01Smickey #define AMI_FCOP 0xa1 198ebaedd01Smickey #define AMI_FC_PROCEED 0x02 199ebaedd01Smickey #define AMI_FC_DELLDRV 0x03 200ebaedd01Smickey #define AMI_FC_RDCONF 0x04 201ebaedd01Smickey #define AMI_FC_RDFCONF 0x05 202ebaedd01Smickey #define AMI_FC_GCONFDSK 0x06 203ebaedd01Smickey #define AMI_FC_CHLDNO 0x07 204ebaedd01Smickey #define AMI_FC_CMPCTCFG 0x08 205ebaedd01Smickey #define AMI_FC_DRVGRP 0x09 206ebaedd01Smickey #define AMI_FC_GLOOPINF 0x0a 207ebaedd01Smickey #define AMI_FC_CHLOOPID 0x0b 208ebaedd01Smickey #define AMI_FC_GNSCH 0x0c 209ebaedd01Smickey #define AMI_FC_WRCONF 0x0d 210ebaedd01Smickey #define AMI_FC_PRODINF 0x0e 211ebaedd01Smickey #define AMI_FC_EINQ3 0x0f 2124fcc9d5dSmarco #define AMI_FC_EINQ4 0x1f 213ebaedd01Smickey #define AMI_FC_EINQ3_SOLICITED_NOTIFY 0x01 214ebaedd01Smickey #define AMI_FC_EINQ3_SOLICITED_FULL 0x02 215ebaedd01Smickey #define AMI_FC_EINQ3_UNSOLICITED 0x03 216ebaedd01Smickey #define AMI_MISC 0xa4 21794d7d32fSmarco #define AMI_GET_BGI 0x13 218001b382fSmarco #define AMI_GET_IO_CMPL 0x5b 219001b382fSmarco #define AMI_SET_IO_CMPL 0x5c 220ebaedd01Smickey #define AMI_CHFUNC 0xa9 221ebaedd01Smickey #define AMI_MANAGE 0xb0 /* manage functions */ 222ebaedd01Smickey #define AMI_MGR_LUN 0x00 223ebaedd01Smickey #define AMI_MGR_THERM 0x01 224ebaedd01Smickey #define AMI_MGR_EEPROM 0x02 225ebaedd01Smickey #define AMI_MGR_LDNAMES 0x03 226ebaedd01Smickey #define AMI_MGR_FCWWN 0x04 227ebaedd01Smickey #define AMI_MGR_CFGACC 0x05 228ebaedd01Smickey #define AMI_HSPDIAG 0xb1 229ebaedd01Smickey #define AMI_GESENSEINFO 0xb2 /* get extended sense info */ 230ebaedd01Smickey #define AMI_SYSFLUSH 0xfe /* flush system */ 231ebaedd01Smickey 232ebaedd01Smickey /* command structures */ 233ebaedd01Smickey struct ami_iocmd { 234ebaedd01Smickey u_int8_t acc_cmd; 235ebaedd01Smickey u_int8_t acc_id; 236ebaedd01Smickey union { 237ebaedd01Smickey #define acc_mbox _._ami_mbox 238ebaedd01Smickey struct { 239ebaedd01Smickey u_int16_t amb_nsect; 240ebaedd01Smickey u_int32_t amb_lba; 241ebaedd01Smickey u_int32_t amb_data; 242ebaedd01Smickey u_int8_t amb_ldn; /* logical drive no */ 243ebaedd01Smickey u_int8_t amb_nsge; 244ebaedd01Smickey u_int8_t amb_reserved; 245a4bdad68Sdlg } __packed _ami_mbox; 246ebaedd01Smickey 247ebaedd01Smickey #define acc_io _._ami_io 248ebaedd01Smickey struct { 249ebaedd01Smickey u_int8_t aio_channel; 250ebaedd01Smickey u_int8_t aio_param; 251ebaedd01Smickey u_int8_t aio_pad[4]; 252ebaedd01Smickey u_int32_t aio_data; 253ebaedd01Smickey u_int8_t aio_pad1[3]; 254a4bdad68Sdlg } __packed _ami_io; 255ebaedd01Smickey 2567bceb969Sdlg #define acc_passthru _._ami_passthru 257ebaedd01Smickey struct { 258ebaedd01Smickey u_int16_t apt_dummy0; 259ebaedd01Smickey u_int32_t apt_dummy1; 260ebaedd01Smickey u_int32_t apt_data; 261ebaedd01Smickey u_int8_t apt_dummy2; 262ebaedd01Smickey u_int8_t apt_dummy3; 263ebaedd01Smickey u_int8_t apt_reserved; 264a4bdad68Sdlg } __packed _ami_passthru; 265ebaedd01Smickey 266ebaedd01Smickey #define acc_ldrv _._ami_ldrv 267ebaedd01Smickey struct { 268ebaedd01Smickey u_int16_t ald_dummy0; 269ebaedd01Smickey u_int32_t ald_dummy1; 270ebaedd01Smickey u_int32_t ald_data; 271ebaedd01Smickey u_int8_t ald_ldrv; 272ebaedd01Smickey u_int8_t ald_dummy2; 273ebaedd01Smickey u_int8_t ald_reserved; 274a4bdad68Sdlg } __packed _ami_ldrv; 275a4bdad68Sdlg } __packed _; 276ebaedd01Smickey u_int8_t acc_busy; 277ebaedd01Smickey u_int8_t acc_nstat; 278ebaedd01Smickey u_int8_t acc_status; 279ebaedd01Smickey #define AMI_MAXSTATACK 0x2e 280ebaedd01Smickey u_int8_t acc_cmplidl[AMI_MAXSTATACK]; 281ebaedd01Smickey u_int8_t acc_poll; 282ebaedd01Smickey u_int8_t acc_ack; 2832d7b028aSmickey u_int8_t acc_pad[0x3e]; /* pad to 128 bytes */ 284a4bdad68Sdlg } __packed; 285ebaedd01Smickey 286ebaedd01Smickey struct ami_sgent { 287ebaedd01Smickey u_int32_t asg_addr; 288ebaedd01Smickey u_int32_t asg_len; 289a4bdad68Sdlg } __packed; 290ebaedd01Smickey 291ebaedd01Smickey struct ami_iocmd64 { 292ebaedd01Smickey u_int8_t acc_cmd; 293ebaedd01Smickey u_int8_t acc_id; 294ebaedd01Smickey union { 295ebaedd01Smickey struct { 296ebaedd01Smickey u_int16_t amb_nsect; 297ebaedd01Smickey u_int32_t amb_lba; 298ebaedd01Smickey u_int32_t amb_reserved1; 299ebaedd01Smickey u_int8_t amb_ldn; /* logical drive no */ 300ebaedd01Smickey u_int8_t amb_nsge; /* high bit == 1 */ 301ebaedd01Smickey u_int8_t amb_reserved; 302a4bdad68Sdlg } __packed _ami_mbox; 303ebaedd01Smickey 304ebaedd01Smickey struct { 305ebaedd01Smickey u_int8_t aio_channel; 306ebaedd01Smickey u_int8_t aio_param; 307ebaedd01Smickey u_int8_t aio_pad[4]; 308ebaedd01Smickey u_int32_t aio_data; 309ebaedd01Smickey u_int8_t aio_pad1[3]; 310a4bdad68Sdlg } __packed _ami_io; 311ebaedd01Smickey 312ebaedd01Smickey struct { 313ebaedd01Smickey u_int16_t apt_dummy0; 314ebaedd01Smickey u_int32_t apt_dummy1; 315ebaedd01Smickey u_int32_t apt_data; 316ebaedd01Smickey u_int8_t apt_dummy2; 317ebaedd01Smickey u_int8_t apt_dummy3; 318ebaedd01Smickey u_int8_t apt_reserved; 319a4bdad68Sdlg } __packed _ami_passthru; 320ebaedd01Smickey 321ebaedd01Smickey struct { 322ebaedd01Smickey u_int16_t ald_dummy0; 323ebaedd01Smickey u_int32_t ald_dummy1; 324ebaedd01Smickey u_int32_t ald_data; 325ebaedd01Smickey u_int8_t ald_ldrv; 326ebaedd01Smickey u_int8_t ald_dummy2; 327ebaedd01Smickey u_int8_t ald_reserved; 328a4bdad68Sdlg } __packed _ami_ldrv; 329a4bdad68Sdlg } __packed _; 330ebaedd01Smickey u_int8_t acc_busy; 331ebaedd01Smickey u_int32_t acc_data_l; 332ebaedd01Smickey u_int32_t acc_data_h; 333ebaedd01Smickey u_int32_t acc_reserved; 334ebaedd01Smickey u_int8_t acc_nstat; 335ebaedd01Smickey u_int8_t acc_status; 336ebaedd01Smickey u_int8_t acc_cmplidl[AMI_MAXSTATACK]; 337ebaedd01Smickey u_int8_t acc_poll; 338ebaedd01Smickey u_int8_t acc_ack; 3392d7b028aSmickey u_int8_t acc_pad[0x32]; /* pad to 128 bytes */ 340a4bdad68Sdlg } __packed; 341ebaedd01Smickey 342ebaedd01Smickey struct ami_sgent64 { 343ebaedd01Smickey u_int32_t asg_addr_l; 344ebaedd01Smickey u_int32_t asg_addr_h; 345ebaedd01Smickey u_int32_t asg_len; 346a4bdad68Sdlg } __packed; 347ebaedd01Smickey 348ebaedd01Smickey struct ami_passthrough { 349ebaedd01Smickey u_int8_t apt_param; 350ebaedd01Smickey #define AMI_PTPARAM(t,a,l) (((l) << 7) | (((a) & 1) << 3) | ((t) & 3)) 351ebaedd01Smickey #define AMI_TIMEOUT_6 0 352ebaedd01Smickey #define AMI_TIMEOUT_60 1 353ebaedd01Smickey #define AMI_TIMEOUT_10m 2 354ebaedd01Smickey #define AMI_TIMEOUT_3h 3 355ebaedd01Smickey u_int8_t apt_ldn; 356ebaedd01Smickey u_int8_t apt_channel; 357ebaedd01Smickey u_int8_t apt_target; 358ebaedd01Smickey u_int8_t apt_qtag; 359ebaedd01Smickey u_int8_t apt_qact; 360ebaedd01Smickey #define AMI_MAX_CDB 10 361ebaedd01Smickey u_int8_t apt_cdb[AMI_MAX_CDB]; 362ebaedd01Smickey u_int8_t apt_ncdb; 363ebaedd01Smickey u_int8_t apt_nsense; 364ebaedd01Smickey #define AMI_MAX_SENSE 32 365ebaedd01Smickey u_int8_t apt_sense[AMI_MAX_SENSE]; 3663f46cb50Sdlg u_int8_t apt_nsge; 367ebaedd01Smickey u_int8_t apt_scsistat; 368ebaedd01Smickey u_int32_t apt_data; 369ebaedd01Smickey u_int32_t apt_datalen; 370a4bdad68Sdlg } __packed; 371ebaedd01Smickey 372ebaedd01Smickey struct ami_inquiry { 373ebaedd01Smickey u_int8_t ain_maxcmd; 374ebaedd01Smickey u_int8_t ain_rbldrate; /* rebuild rate %% */ 375ebaedd01Smickey u_int8_t ain_targets; /* max targets per channel */ 376ebaedd01Smickey u_int8_t ain_channels; 377ebaedd01Smickey u_int8_t ain_fwver[4]; 378ebaedd01Smickey u_int16_t ain_flashage; 379ebaedd01Smickey u_int8_t ain_chipset; /* parity generation policy */ 380ebaedd01Smickey u_int8_t ain_ramsize; 381ebaedd01Smickey u_int8_t ain_flushintv; 382ebaedd01Smickey u_int8_t ain_biosver[4]; 383ebaedd01Smickey u_int8_t ain_brdtype; 384ebaedd01Smickey u_int8_t ain_scsisensealert; 385ebaedd01Smickey u_int8_t ain_wrcfgcnt; /* write config count */ 386ebaedd01Smickey u_int8_t ain_drvinscnt; /* drive insertion count */ 387ebaedd01Smickey u_int8_t ain_insdrv; /* inserted drive */ 388ebaedd01Smickey u_int8_t ain_battery; /* battery status */ 389ebaedd01Smickey u_int8_t ain_reserved; 390ebaedd01Smickey 391ebaedd01Smickey u_int8_t ain_nlogdrv; 392ebaedd01Smickey u_int8_t ain_reserved1[3]; 393ebaedd01Smickey u_int32_t ain_ldsize[AMI_MAX_LDRIVES]; 394ebaedd01Smickey u_int8_t ain_ldprop[AMI_MAX_LDRIVES]; 395ebaedd01Smickey u_int8_t ain_ldstat[AMI_MAX_LDRIVES]; 396ebaedd01Smickey 397ebaedd01Smickey u_int8_t ain_pdstat[AMI_MAX_PDRIVES]; 398ebaedd01Smickey u_int8_t ain_predictivefailure; 399ebaedd01Smickey 400ebaedd01Smickey u_int8_t ain_pdfmtinp[AMI_MAX_PDRIVES]; 401ebaedd01Smickey u_int8_t ain_reserved2[AMI_MAX_PDRIVES]; 402ebaedd01Smickey 403ebaedd01Smickey u_int32_t ain_esize; /* extended data size */ 404ebaedd01Smickey u_int16_t ain_ssid; /* subsystem id */ 405ebaedd01Smickey u_int16_t ain_ssvid; /* subsystem vendor id */ 406ebaedd01Smickey u_int32_t ain_signature; 407ebaedd01Smickey #define AMI_SIGN431 0xfffe0001 408ebaedd01Smickey #define AMI_SIGN438 0xfffd0002 409ebaedd01Smickey #define AMI_SIGN762 0xfffc0003 410ebaedd01Smickey #define AMI_SIGNT5 0xfffb0004 411ebaedd01Smickey #define AMI_SIGN466 0xfffa0005 412a4bdad68Sdlg } __packed; 413ebaedd01Smickey 4144fcc9d5dSmarco #define MAX_NOTIFY_SIZE 0x80 4154fcc9d5dSmarco #define CUR_NOTIFY_SIZE (sizeof(struct ami_notify)) 416a4bdad68Sdlg struct ami_notify { 4174fcc9d5dSmarco u_int32_t ano_eventcounter; /* incremented for changes */ 4184fcc9d5dSmarco 4194fcc9d5dSmarco u_int8_t ano_paramcounter; /* param change */ 4204fcc9d5dSmarco u_int8_t ano_paramid; /* param modified */ 4214fcc9d5dSmarco #define AMI_PARAM_RBLD_RATE 0x01 /* new rebuild rate */ 4224fcc9d5dSmarco #define AMI_PARAM_CACHE_FLUSH_INTERVAL 0x02 /* new cache flush interval */ 4234fcc9d5dSmarco #define AMI_PARAM_SENSE_ALERT 0x03 /* pd caused check condition */ 4244fcc9d5dSmarco #define AMI_PARAM_DRIVE_INSERTED 0x04 /* pd inserted */ 4254fcc9d5dSmarco #define AMI_PARAM_BATTERY_STATUS 0x05 /* battery status */ 4264fcc9d5dSmarco #define AMI_PARAM_NVRAM_EVENT_ALERT 0x06 /* NVRAM # of entries */ 4274fcc9d5dSmarco #define AMI_PARAM_PATROL_READ_UPDATE 0x07 /* # pd done with patrol read */ 4284fcc9d5dSmarco #define AMI_PARAM_PATROL_READ_STATUS 0x08 /* 0 stopped 4294fcc9d5dSmarco * 2 aborted 4304fcc9d5dSmarco * 4 started */ 4314fcc9d5dSmarco 4324fcc9d5dSmarco u_int16_t ano_paramval; /* new val modified param */ 4334fcc9d5dSmarco 4344fcc9d5dSmarco u_int8_t ano_writeconfcounter; /* write config */ 4354fcc9d5dSmarco u_int8_t ano_writeconfrsvd[3]; 4364fcc9d5dSmarco 4374fcc9d5dSmarco u_int8_t ano_ldopcounter; /* ld op started/completed */ 4384fcc9d5dSmarco u_int8_t ano_ldopid; /* ld modified */ 4394fcc9d5dSmarco u_int8_t ano_ldopcmd; /* ld operation */ 4404fcc9d5dSmarco #define AMI_LDCMD_CHKCONSISTANCY 0x01 4414fcc9d5dSmarco #define AMI_LDCMD_INITIALIZE 0x02 4424fcc9d5dSmarco #define AMI_LDCMD_RECONSTRUCTION 0x03 4434fcc9d5dSmarco u_int8_t ano_ldopstatus; /* status of the operation */ 4444fcc9d5dSmarco #define AMI_LDOP_SUCCESS 0x00 4454fcc9d5dSmarco #define AMI_LDOP_FAILED 0x01 4464fcc9d5dSmarco #define AMI_LDOP_ABORTED 0x02 4474fcc9d5dSmarco #define AMI_LDOP_CORRECTED 0x03 4484fcc9d5dSmarco #define AMI_LDOP_STARTED 0x04 4494fcc9d5dSmarco 4504fcc9d5dSmarco u_int8_t ano_ldstatecounter; /* change of ld state */ 4514fcc9d5dSmarco u_int8_t ano_ldstateid; /* ld state changed */ 4524fcc9d5dSmarco u_int8_t ano_ldstatenew; /* new state */ 4534fcc9d5dSmarco u_int8_t ano_ldstateold; /* old state */ 4544fcc9d5dSmarco #define AMI_RDRV_OFFLINE 0 4554fcc9d5dSmarco #define AMI_RDRV_DEGRADED 1 4564fcc9d5dSmarco #define AMI_RDRV_OPTIMAL 2 4574fcc9d5dSmarco #define AMI_RDRV_DELETED 3 4584fcc9d5dSmarco 4594fcc9d5dSmarco u_int8_t ano_pdstatecounter; /* change of pd state */ 4604fcc9d5dSmarco u_int8_t ano_pdstateid; /* pd state changed */ 4614fcc9d5dSmarco u_int8_t ano_pdstatenew; /* new state */ 4624fcc9d5dSmarco u_int8_t ano_pdstateold; /* old state */ 4634fcc9d5dSmarco #define AMI_PD_UNCNF 0 4644fcc9d5dSmarco #define AMI_PD_ONLINE 3 4654fcc9d5dSmarco #define AMI_PD_FAILED 4 4664fcc9d5dSmarco #define AMI_PD_RBLD 5 4674fcc9d5dSmarco #define AMI_PD_HOTSPARE 6 4684fcc9d5dSmarco 4694fcc9d5dSmarco u_int8_t ano_pdfmtcounter; /* pd format started/over */ 4704fcc9d5dSmarco u_int8_t ano_pdfmtid; /* pd id */ 4714fcc9d5dSmarco u_int8_t ano_pdfmtval; /* format started/over */ 4724fcc9d5dSmarco #define AMI_PDFMT_START 0x01 4734fcc9d5dSmarco #define AMI_PDFMT_OVER 0x02 4744fcc9d5dSmarco u_int8_t ano_pdfmtrsvd; 4754fcc9d5dSmarco 4764fcc9d5dSmarco u_int8_t ano_targxfercounter; /* SCSI-2 Xfer rate change */ 4774fcc9d5dSmarco u_int8_t ano_targxferid; /* pd that changed */ 4784fcc9d5dSmarco u_int8_t ano_targxferval; /* new xfer parameters */ 4794fcc9d5dSmarco u_int8_t ano_targxferrsvd; 4804fcc9d5dSmarco 4814fcc9d5dSmarco u_int8_t ano_fclidchgcounter; /* loop id changed */ 4824fcc9d5dSmarco u_int8_t ano_fclidpdid; /* pd id */ 4834fcc9d5dSmarco u_int8_t ano_fclid0; /* loop id on fc loop 0 */ 4844fcc9d5dSmarco u_int8_t ano_fclid1; /* loop id on fc loop 1 */ 4854fcc9d5dSmarco 4864fcc9d5dSmarco u_int8_t ano_fclstatecounter; /* loop state changed */ 4874fcc9d5dSmarco u_int8_t ano_fclstate0; /* state of fc loop 0 */ 4884fcc9d5dSmarco u_int8_t ano_fclstate1; /* state of fc loop 1 */ 4894fcc9d5dSmarco #define AMI_FCLOOP_FAILED 0 4904fcc9d5dSmarco #define AMI_FCLOOP_ACTIVE 1 4914fcc9d5dSmarco #define AMI_FCLOOP_TRANSIENT 2 4924fcc9d5dSmarco u_int8_t ano_fclstatersvd; 493a4bdad68Sdlg } __packed; 4944fcc9d5dSmarco 495ebaedd01Smickey struct ami_fc_einquiry { 496ebaedd01Smickey u_int32_t ain_size; /* size of this structure */ 497ebaedd01Smickey 498ebaedd01Smickey /* notify */ 4994fcc9d5dSmarco struct ami_notify ain_notify; 5004fcc9d5dSmarco u_int8_t ain_notifyrsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE]; 501ebaedd01Smickey 502ebaedd01Smickey u_int8_t ain_rbldrate; /* rebuild rate %% */ 503ebaedd01Smickey u_int8_t ain_flushintvl; 504ebaedd01Smickey u_int8_t ain_sensealert; 505ebaedd01Smickey u_int8_t ain_drvinscnt; /* drive insertion count */ 506ebaedd01Smickey u_int8_t ain_battery; /* battery status */ 507ebaedd01Smickey 508ebaedd01Smickey u_int8_t ain_nlogdrv; 509ebaedd01Smickey u_int8_t ain_recon[AMI_BIG_MAX_LDRIVES / 8]; 510ebaedd01Smickey u_int16_t ain_stat[AMI_BIG_MAX_LDRIVES / 8]; 511ebaedd01Smickey 512ebaedd01Smickey u_int32_t ain_ldsize[AMI_BIG_MAX_LDRIVES]; 513ebaedd01Smickey u_int8_t ain_ldprop[AMI_BIG_MAX_LDRIVES]; 514ebaedd01Smickey u_int8_t ain_ldstat[AMI_BIG_MAX_LDRIVES]; 515ebaedd01Smickey 5165d4072b7Smarco u_int8_t ain_pdstat[AMI_BIG_MAX_PDRIVES]; 5171e1a51daSmarco u_int16_t ain_pdfmtinp[AMI_BIG_MAX_PDRIVES / 16]; 518fc109205Smickey u_int8_t ain_pdrates[80]; /* pdrv xfer rates */ 5195d4072b7Smarco u_int8_t ain_pad[263]; /* pad to 1k */ 520a4bdad68Sdlg } __packed; 521ebaedd01Smickey 522ebaedd01Smickey struct ami_fc_prodinfo { 523ebaedd01Smickey u_int32_t api_size; /* size of this structure */ 524ebaedd01Smickey u_int32_t api_config; 525ebaedd01Smickey u_int8_t api_fwver[16]; 526ebaedd01Smickey u_int8_t api_biosver[16]; 527ebaedd01Smickey u_int8_t api_product[80]; 528ebaedd01Smickey u_int8_t api_maxcmd; 529ebaedd01Smickey u_int8_t api_channels; 530ebaedd01Smickey u_int8_t api_fcloops; 531ebaedd01Smickey u_int8_t api_memtype; 532ebaedd01Smickey u_int32_t api_signature; 533ebaedd01Smickey u_int16_t api_ramsize; 534ebaedd01Smickey u_int16_t api_ssid; 535ebaedd01Smickey u_int16_t api_ssvid; 536ebaedd01Smickey u_int8_t api_nnotify; 537a4bdad68Sdlg } __packed; 538ebaedd01Smickey 539ebaedd01Smickey struct ami_diskarray { 540ebaedd01Smickey u_int8_t ada_nld; 541ebaedd01Smickey u_int8_t ada_pad[3]; 542ebaedd01Smickey struct { 543ebaedd01Smickey u_int8_t adl_spandepth; 544ebaedd01Smickey u_int8_t adl_raidlvl; 545ebaedd01Smickey u_int8_t adl_rdahead; 546ebaedd01Smickey u_int8_t adl_stripesz; 547ebaedd01Smickey u_int8_t adl_status; 548ebaedd01Smickey u_int8_t adl_wrpolicy; 549ebaedd01Smickey u_int8_t adl_directio; 550ebaedd01Smickey u_int8_t adl_nstripes; 551ebaedd01Smickey struct { 552ebaedd01Smickey u_int32_t ads_start; 553ebaedd01Smickey u_int32_t ads_length; /* blocks */ 554ebaedd01Smickey struct { 555ebaedd01Smickey u_int8_t add_channel; 556ebaedd01Smickey u_int8_t add_target; 557a4bdad68Sdlg } __packed ads_devs[AMI_MAX_DEVDEPTH]; 558a4bdad68Sdlg } __packed adl_spans[AMI_MAX_SPANDEPTH]; 559a4bdad68Sdlg } __packed ada_ldrv[AMI_MAX_LDRIVES]; 560ebaedd01Smickey struct { 561ebaedd01Smickey u_int8_t adp_type; /* SCSI device type */ 562ebaedd01Smickey u_int8_t adp_ostatus; /* status during config */ 563ebaedd01Smickey u_int8_t adp_tagdepth; /* level of tagging */ 564ebaedd01Smickey u_int8_t adp_sneg; /* sync negotiation */ 565ebaedd01Smickey u_int32_t adp_size; 566a4bdad68Sdlg } __packed ada_pdrv[AMI_MAX_PDRIVES]; 567a4bdad68Sdlg } __packed; 568ebaedd01Smickey 569d12ab0b2Smarco struct ami_big_diskarray { 570d12ab0b2Smarco u_int8_t ada_nld; 571d12ab0b2Smarco u_int8_t ada_pad[3]; 572db2730c1Smarco #define ald ada_ldrv 573d12ab0b2Smarco struct { 574d12ab0b2Smarco u_int8_t adl_spandepth; 575d12ab0b2Smarco u_int8_t adl_raidlvl; 576d12ab0b2Smarco u_int8_t adl_rdahead; 577d12ab0b2Smarco u_int8_t adl_stripesz; 578d12ab0b2Smarco u_int8_t adl_status; 579d12ab0b2Smarco u_int8_t adl_wrpolicy; 580d12ab0b2Smarco u_int8_t adl_directio; 581d12ab0b2Smarco u_int8_t adl_nstripes; 582db2730c1Smarco #define asp adl_spans 583d12ab0b2Smarco struct { 584d12ab0b2Smarco u_int32_t ads_start; 585d12ab0b2Smarco u_int32_t ads_length; /* blocks */ 586db2730c1Smarco #define adv ads_devs 587d12ab0b2Smarco struct { 588d12ab0b2Smarco u_int8_t add_channel; 589d12ab0b2Smarco u_int8_t add_target; 590a4bdad68Sdlg } __packed ads_devs[AMI_BIG_MAX_DEVDEPTH]; 591a4bdad68Sdlg } __packed adl_spans[AMI_BIG_MAX_SPANDEPTH]; 592a4bdad68Sdlg } __packed ada_ldrv[AMI_BIG_MAX_LDRIVES]; 593db2730c1Smarco #define apd ada_pdrv 594d12ab0b2Smarco struct { 595d12ab0b2Smarco u_int8_t adp_type; /* SCSI device type */ 596d12ab0b2Smarco u_int8_t adp_ostatus; /* status during config */ 597d12ab0b2Smarco u_int8_t adp_tagdepth; /* level of tagging */ 598d12ab0b2Smarco u_int8_t adp_sneg; /* sync negotiation */ 599d12ab0b2Smarco u_int32_t adp_size; 600a4bdad68Sdlg } __packed ada_pdrv[AMI_BIG_MAX_PDRIVES]; 601a4bdad68Sdlg } __packed; 602d12ab0b2Smarco 603ebaedd01Smickey struct ami_scsisense { 604ebaedd01Smickey u_int8_t ase_end; 605ebaedd01Smickey struct { 606ebaedd01Smickey u_int8_t asd_channel; 607ebaedd01Smickey u_int8_t asd_target; 608ebaedd01Smickey u_int16_t asd_errcode; 609ebaedd01Smickey u_int16_t asd_sense; 610ebaedd01Smickey u_int16_t asd_addarea1; 611ebaedd01Smickey u_int16_t asd_addarea2; 612ebaedd01Smickey u_int16_t asd_cmdspec0; 613ebaedd01Smickey u_int16_t asd_cmdspec1; 614ebaedd01Smickey u_int16_t asd_asc_ascq; 615a4bdad68Sdlg } __packed ase_dump[5]; 616a4bdad68Sdlg } __packed; 617ebaedd01Smickey 618ebaedd01Smickey struct ami_escsisense { 619ebaedd01Smickey u_int8_t ase_end; 620ebaedd01Smickey struct { 621ebaedd01Smickey u_int8_t asd_channel; 622ebaedd01Smickey u_int8_t asd_target; 623ebaedd01Smickey u_int16_t asd_errcode; 624ebaedd01Smickey u_int16_t asd_sense; 625ebaedd01Smickey u_int16_t asd_addarea1; 626ebaedd01Smickey u_int16_t asd_addarea2; 627ebaedd01Smickey u_int16_t asd_cmdspec0; 628ebaedd01Smickey u_int16_t asd_cmdspec1; 629ebaedd01Smickey u_int16_t asd_asc_ascq; 630ebaedd01Smickey u_int16_t asd_extarea; 631a4bdad68Sdlg } __packed ase_dump[5]; 632a4bdad68Sdlg } __packed; 633ebaedd01Smickey 634ebaedd01Smickey struct ami_cachestats { 635ebaedd01Smickey u_int32_t acs_total; 636ebaedd01Smickey u_int32_t acs_hits; 637a4bdad68Sdlg } __packed; 638ebaedd01Smickey 639ebaedd01Smickey struct ami_drivehistory { 640ebaedd01Smickey struct { 641ebaedd01Smickey u_int8_t adh_error; 642ebaedd01Smickey #define AMI_ADHERR_TIMEOUT(e) ((e) & 15) 643ebaedd01Smickey #define AMI_ADHERR_PARITY(e) (((e) >> 4) & 15) 644ebaedd01Smickey u_int8_t adh_throttle; 645a4bdad68Sdlg } __packed adh_err[3][16]; /* channels * drives */ 646ebaedd01Smickey u_int8_t adh_failidx; 647ebaedd01Smickey struct { 648ebaedd01Smickey u_int8_t adh_tag; 649ebaedd01Smickey #define AMI_ADHTAG_CH(t) ((t) & 7) 650ebaedd01Smickey #define AMI_ADHTAG_TARG(t) (((t) >> 3) & 15) 651ebaedd01Smickey #define AMI_ADHTAG_VALID(t) ((t) & 0x80) 652ebaedd01Smickey u_int8_t reason; 653ebaedd01Smickey #define AMI_ADHERR_MEDIA 1 654ebaedd01Smickey #define AMI_ADHERR_NMEDIA 2 655ebaedd01Smickey #define AMI_ADHERR_CMDTMO 3 656ebaedd01Smickey #define AMI_ADHERR_SELTMO 4 657ebaedd01Smickey #define AMI_ADHERR_HAFAIL 5 658ebaedd01Smickey #define AMI_ADHERR_REASSIGN 6 659ebaedd01Smickey #define AMI_ADHERR_CMDFAIL 7 660ebaedd01Smickey #define AMI_ADHERR_OTHER 8 661ebaedd01Smickey 662ebaedd01Smickey #define AMI_FAILHISTORY 10 663a4bdad68Sdlg } __packed adh_fail[AMI_FAILHISTORY]; 664a4bdad68Sdlg } __packed; 665ebaedd01Smickey 66694d7d32fSmarco struct ami_progress { 66794d7d32fSmarco u_int32_t apr_progress; 66894d7d32fSmarco } __packed; 669