#define AMI_MAX_PDRIVES (75)
#define AMI_MAX_LDRIVES 8
#define AMI_MAX_SPANDEPTH 4
#define AMI_MAX_DEVDEPTH 8
#define AMI_MAX_TARGET 16
#define AMI_BIG_MAX_PDRIVES (256)
#define AMI_BIG_MAX_LDRIVES 40
#define AMI_BIG_MAX_SPANDEPTH 8
#define AMI_BIG_MAX_DEVDEPTH 32
#define AMI_MAXCMDS 126
#define AMI_SECTOR_SIZE 512
#define AMI_MAXOFFSETS 26
#define AMI_SGEPERCMD 32
#define AMI_MAX_BUSYWAIT 10
#define AMI_MAX_POLLWAIT 1000000
#define AMI_MAXIOCTLCMDS 1
#define AMI_MAXPROCS 2
#define AMI_MAXRAWCMDS 2
#define AMI_MAXFER (AMI_MAXOFFSETS * PAGE_SIZE)
#define AMI_QIDB 0x20
#define AMI_QIDB_EXEC 0x01
#define AMI_QIDB_ACK 0x02
#define AMI_QODB 0x2c
#define AMI_QODB_READY 0x10001234
#define AMI_SCMD 0x10
#define AMI_SCMD_EXEC 0x10
#define AMI_SCMD_ACK 0x08
#define AMI_SMBSTAT 0x10
#define AMI_SMBST_BUSY 0x10
#define AMI_SIEM 0x11
#define AMI_SEIM_ENA 0xc0
#define AMI_SMBADDR 0x14
#define AMI_SMBENA 0x18
#define AMI_ISTAT 0x1a
#define AMI_ISTAT_PEND 0x40
#define AMI_READ 0x01
#define AMI_WRITE 0x02
#define AMI_PASSTHRU 0x03
#define AMI_EINQUIRY 0x04
#define AMI_INQUIRY 0x05
#define AMI_CHSTATE 0x06
#define AMI_STATE_ON 3
#define AMI_STATE_FAIL 4
#define AMI_STATE_SPARE 6
#define AMI_RCONFIG 0x07
#define AMI_REBUILDPD 0x08
#define AMI_CHECK 0x09
#define AMI_FLUSH 0x0a
#define AMI_ILDRIVE 0x0b
#define AMI_EINQUIRY3 0x0c
#define AMI_DCHDR 0x14
#define AMI_GRBLDPROGR 0x18
#define AMI_GCHECKPROGR 0x19
#define AMI_GILDRPROGR 0x1b
#define AMI_WRCONFIG 0x20
#define AMI_RWRCONFIG 0x21
#define AMI_RRDCONFIG 0x22
#define AMI_GRBLDRATE 0x23
#define AMI_SRBLDRATE 0x24
#define AMI_UPLDCFGUT 0x25
#define AMI_UPLDRVPROP 0x26
#define AMI_ABRTREBLD 0x28
#define AMI_ABRTCHECK 0x29
#define AMI_ABRTILDRV 0x2b
#define AMI_WRBLOCK 0x2c
#define AMI_PRGFLASH 0x2d
#define AMI_SFLUSHINTV 0x2e
#define AMI_PCHIPSETVAL 0x2f
#define AMI_CS_NEPTUNE 0x61
#define AMI_CS_OTHER 0xe1
#define AMI_CS_TRITON 0xe2
#define AMI_SNEG 0x30
#define AMI_SNEG_GET 1
#define AMI_SNEG_SET 2
#define AMI_QTAG 0x31
#define AMI_QTAG_GET 1
#define AMI_QTAG_SET 2
#define AMI_GSUPARAM 0x32
#define AMI_SSUPARAM 0x33
#define AMI_GDROAMINFO 0x34
#define AMI_GMACHID 0x36
#define AMI_BIOSPDATA 0x40
#define AMI_I2OCFGDLG 0x41
#define AMI_GCACHESTAT 0x50
#define AMI_SPEAKER 0x51
#define AMI_SPKR_OFF 0
#define AMI_SPKR_ON 1
#define AMI_SPKR_SHUT 2
#define AMI_SPKR_GVAL 3
#define AMI_SPKR_TEST 4
#define AMI_GDUMP 0x52
#define AMI_SENSEDUMPA 0x53
#define AMI_STDIAG 0x54
#define AMI_FRAID_PF 0x55
#define AMI_GFRAIDPF 1
#define AMI_SFRAIDPF 2
#define AMI_FRAIDVS 0x56
#define AMI_GFRAIDVS 1
#define AMI_SFRAIDVS 2
#define AMI_BBMANAGE 0x57
#define AMI_RECONSTRUCT 0x60
#define AMI_GRECONSTRUCT 0x61
#define AMI_BIOSSTAT 0x62
#define AMI_RDCFGDSK 0x63
#define AMI_AREBUILD 0x64
#define AMI_GUCAP 1
#define AMI_SUCAP 2
#define AMI_GARBLD 3
#define AMI_SARBLD 4
#define AMI_GFCC 5
#define AMI_SFCC 6
#define AMI_GCUCAP 7
#define AMI_SCUCAP 8
#define AMI_SFD 0x66
#define AMI_RDCONFIG8 0x67
#define AMI_WRCONFIG8 0x68
#define AMI_ESENSEDUMPA 0x69
#define AMI_RERRC 0x6a
#define AMI_BOOTUP 0x6b
#define AMI_ENCLOSURE 0x6c
#define AMI_WRCFGD 0x6c
#define AMI_HAPIRRLD 0x6e
#define AMI_LDRVRIGHTS 0x6f
#define AMI_CLUSTERING 0x70
#define AMI_GCHPROP 0x71
#define AMI_SCHTERM 0x72
#define AMI_TERM_DISABLE 0
#define AMI_TERM_ENABLE 1
#define AMI_TERM_HIGH 2
#define AMI_TERM_WIDE 3
#define AMI_TERM_DFLT 16
#define AMI_QUIETCH 0x73
#define AMI_ACTIVATECH 0x74
#define AMI_STARTU 0x75
#define AMI_STARTU_SYNC 1
#define AMI_STARTU_ASYN 2
#define AMI_STOPU 0x76
#define AMI_GERRC 0x77
#define AMI_GBTDS 0x78
#define AMI_FMTPROG 0x79
#define AMI_RCAPCMD 0x7a
#define AMI_WRCRX 0x7b
#define AMI_RDCRX 0x7c
#define AMI_GINID 0x7d
#define AMI_HAPICMD 0x7e
#define AMI_SINID 0x7f
#define AMI_SMARTMSEL 0x80
#define AMI_SPSTARTU 0x85
#define AMI_NVFAILHIST 0x90
#define AMI_DCMDABRT 0x91
#define AMI_GDRIVEHIST 0x92
#define AMI_GESENSE 0x93
#define AMI_ADAPTER 0x95
#define AMI_ADP_SAVE 0
#define AMI_ADP_LOAD 1
#define AMI_RESET 0x96
#define AMI_PRGCLASS 0x97
#define AMI_UPHTML 0x98
#define AMI_NEWCFG 0x99
#define AMI_NEWOP 0xa0
#define AMI_FCOP 0xa1
#define AMI_FC_PROCEED 0x02
#define AMI_FC_DELLDRV 0x03
#define AMI_FC_RDCONF 0x04
#define AMI_FC_RDFCONF 0x05
#define AMI_FC_GCONFDSK 0x06
#define AMI_FC_CHLDNO 0x07
#define AMI_FC_CMPCTCFG 0x08
#define AMI_FC_DRVGRP 0x09
#define AMI_FC_GLOOPINF 0x0a
#define AMI_FC_CHLOOPID 0x0b
#define AMI_FC_GNSCH 0x0c
#define AMI_FC_WRCONF 0x0d
#define AMI_FC_PRODINF 0x0e
#define AMI_FC_EINQ3 0x0f
#define AMI_FC_EINQ4 0x1f
#define AMI_FC_EINQ3_SOLICITED_NOTIFY 0x01
#define AMI_FC_EINQ3_SOLICITED_FULL 0x02
#define AMI_FC_EINQ3_UNSOLICITED 0x03
#define AMI_MISC 0xa4
#define AMI_GET_BGI 0x13
#define AMI_GET_IO_CMPL 0x5b
#define AMI_SET_IO_CMPL 0x5c
#define AMI_CHFUNC 0xa9
#define AMI_MANAGE 0xb0
#define AMI_MGR_LUN 0x00
#define AMI_MGR_THERM 0x01
#define AMI_MGR_EEPROM 0x02
#define AMI_MGR_LDNAMES 0x03
#define AMI_MGR_FCWWN 0x04
#define AMI_MGR_CFGACC 0x05
#define AMI_HSPDIAG 0xb1
#define AMI_GESENSEINFO 0xb2
#define AMI_SYSFLUSH 0xfe
struct ami_iocmd {
u_int8_t acc_cmd;
u_int8_t acc_id;
union {
#define acc_mbox _._ami_mbox
struct {
u_int16_t amb_nsect;
u_int32_t amb_lba;
u_int32_t amb_data;
u_int8_t amb_ldn;
u_int8_t amb_nsge;
u_int8_t amb_reserved;
} __packed _ami_mbox;
#define acc_io _._ami_io
struct {
u_int8_t aio_channel;
u_int8_t aio_param;
u_int8_t aio_pad[4];
u_int32_t aio_data;
u_int8_t aio_pad1[3];
} __packed _ami_io;
#define acc_passthru _._ami_passthru
struct {
u_int16_t apt_dummy0;
u_int32_t apt_dummy1;
u_int32_t apt_data;
u_int8_t apt_dummy2;
u_int8_t apt_dummy3;
u_int8_t apt_reserved;
} __packed _ami_passthru;
#define acc_ldrv _._ami_ldrv
struct {
u_int16_t ald_dummy0;
u_int32_t ald_dummy1;
u_int32_t ald_data;
u_int8_t ald_ldrv;
u_int8_t ald_dummy2;
u_int8_t ald_reserved;
} __packed _ami_ldrv;
} __packed _;
u_int8_t acc_busy;
u_int8_t acc_nstat;
u_int8_t acc_status;
#define AMI_MAXSTATACK 0x2e
u_int8_t acc_cmplidl[AMI_MAXSTATACK];
u_int8_t acc_poll;
u_int8_t acc_ack;
u_int8_t acc_pad[0x3e];
} __packed;
struct ami_sgent {
u_int32_t asg_addr;
u_int32_t asg_len;
} __packed;
struct ami_iocmd64 {
u_int8_t acc_cmd;
u_int8_t acc_id;
union {
struct {
u_int16_t amb_nsect;
u_int32_t amb_lba;
u_int32_t amb_reserved1;
u_int8_t amb_ldn;
u_int8_t amb_nsge;
u_int8_t amb_reserved;
} __packed _ami_mbox;
struct {
u_int8_t aio_channel;
u_int8_t aio_param;
u_int8_t aio_pad[4];
u_int32_t aio_data;
u_int8_t aio_pad1[3];
} __packed _ami_io;
struct {
u_int16_t apt_dummy0;
u_int32_t apt_dummy1;
u_int32_t apt_data;
u_int8_t apt_dummy2;
u_int8_t apt_dummy3;
u_int8_t apt_reserved;
} __packed _ami_passthru;
struct {
u_int16_t ald_dummy0;
u_int32_t ald_dummy1;
u_int32_t ald_data;
u_int8_t ald_ldrv;
u_int8_t ald_dummy2;
u_int8_t ald_reserved;
} __packed _ami_ldrv;
} __packed _;
u_int8_t acc_busy;
u_int32_t acc_data_l;
u_int32_t acc_data_h;
u_int32_t acc_reserved;
u_int8_t acc_nstat;
u_int8_t acc_status;
u_int8_t acc_cmplidl[AMI_MAXSTATACK];
u_int8_t acc_poll;
u_int8_t acc_ack;
u_int8_t acc_pad[0x32];
} __packed;
struct ami_sgent64 {
u_int32_t asg_addr_l;
u_int32_t asg_addr_h;
u_int32_t asg_len;
} __packed;
struct ami_passthrough {
u_int8_t apt_param;
#define AMI_PTPARAM(t,a,l) (((l) << 7) | (((a) & 1) << 3) | ((t) & 3))
#define AMI_TIMEOUT_6 0
#define AMI_TIMEOUT_60 1
#define AMI_TIMEOUT_10m 2
#define AMI_TIMEOUT_3h 3
u_int8_t apt_ldn;
u_int8_t apt_channel;
u_int8_t apt_target;
u_int8_t apt_qtag;
u_int8_t apt_qact;
#define AMI_MAX_CDB 10
u_int8_t apt_cdb[AMI_MAX_CDB];
u_int8_t apt_ncdb;
u_int8_t apt_nsense;
#define AMI_MAX_SENSE 32
u_int8_t apt_sense[AMI_MAX_SENSE];
u_int8_t apt_nsge;
u_int8_t apt_scsistat;
u_int32_t apt_data;
u_int32_t apt_datalen;
} __packed;
struct ami_inquiry {
u_int8_t ain_maxcmd;
u_int8_t ain_rbldrate;
u_int8_t ain_targets;
u_int8_t ain_channels;
u_int8_t ain_fwver[4];
u_int16_t ain_flashage;
u_int8_t ain_chipset;
u_int8_t ain_ramsize;
u_int8_t ain_flushintv;
u_int8_t ain_biosver[4];
u_int8_t ain_brdtype;
u_int8_t ain_scsisensealert;
u_int8_t ain_wrcfgcnt;
u_int8_t ain_drvinscnt;
u_int8_t ain_insdrv;
u_int8_t ain_battery;
u_int8_t ain_reserved;
u_int8_t ain_nlogdrv;
u_int8_t ain_reserved1[3];
u_int32_t ain_ldsize[AMI_MAX_LDRIVES];
u_int8_t ain_ldprop[AMI_MAX_LDRIVES];
u_int8_t ain_ldstat[AMI_MAX_LDRIVES];
u_int8_t ain_pdstat[AMI_MAX_PDRIVES];
u_int8_t ain_predictivefailure;
u_int8_t ain_pdfmtinp[AMI_MAX_PDRIVES];
u_int8_t ain_reserved2[AMI_MAX_PDRIVES];
u_int32_t ain_esize;
u_int16_t ain_ssid;
u_int16_t ain_ssvid;
u_int32_t ain_signature;
#define AMI_SIGN431 0xfffe0001
#define AMI_SIGN438 0xfffd0002
#define AMI_SIGN762 0xfffc0003
#define AMI_SIGNT5 0xfffb0004
#define AMI_SIGN466 0xfffa0005
} __packed;
#define MAX_NOTIFY_SIZE 0x80
#define CUR_NOTIFY_SIZE (sizeof(struct ami_notify))
struct ami_notify {
u_int32_t ano_eventcounter;
u_int8_t ano_paramcounter;
u_int8_t ano_paramid;
#define AMI_PARAM_RBLD_RATE 0x01
#define AMI_PARAM_CACHE_FLUSH_INTERVAL 0x02
#define AMI_PARAM_SENSE_ALERT 0x03
#define AMI_PARAM_DRIVE_INSERTED 0x04
#define AMI_PARAM_BATTERY_STATUS 0x05
#define AMI_PARAM_NVRAM_EVENT_ALERT 0x06
#define AMI_PARAM_PATROL_READ_UPDATE 0x07
#define AMI_PARAM_PATROL_READ_STATUS 0x08
u_int16_t ano_paramval;
u_int8_t ano_writeconfcounter;
u_int8_t ano_writeconfrsvd[3];
u_int8_t ano_ldopcounter;
u_int8_t ano_ldopid;
u_int8_t ano_ldopcmd;
#define AMI_LDCMD_CHKCONSISTANCY 0x01
#define AMI_LDCMD_INITIALIZE 0x02
#define AMI_LDCMD_RECONSTRUCTION 0x03
u_int8_t ano_ldopstatus;
#define AMI_LDOP_SUCCESS 0x00
#define AMI_LDOP_FAILED 0x01
#define AMI_LDOP_ABORTED 0x02
#define AMI_LDOP_CORRECTED 0x03
#define AMI_LDOP_STARTED 0x04
u_int8_t ano_ldstatecounter;
u_int8_t ano_ldstateid;
u_int8_t ano_ldstatenew;
u_int8_t ano_ldstateold;
#define AMI_RDRV_OFFLINE 0
#define AMI_RDRV_DEGRADED 1
#define AMI_RDRV_OPTIMAL 2
#define AMI_RDRV_DELETED 3
u_int8_t ano_pdstatecounter;
u_int8_t ano_pdstateid;
u_int8_t ano_pdstatenew;
u_int8_t ano_pdstateold;
#define AMI_PD_UNCNF 0
#define AMI_PD_ONLINE 3
#define AMI_PD_FAILED 4
#define AMI_PD_RBLD 5
#define AMI_PD_HOTSPARE 6
u_int8_t ano_pdfmtcounter;
u_int8_t ano_pdfmtid;
u_int8_t ano_pdfmtval;
#define AMI_PDFMT_START 0x01
#define AMI_PDFMT_OVER 0x02
u_int8_t ano_pdfmtrsvd;
u_int8_t ano_targxfercounter;
u_int8_t ano_targxferid;
u_int8_t ano_targxferval;
u_int8_t ano_targxferrsvd;
u_int8_t ano_fclidchgcounter;
u_int8_t ano_fclidpdid;
u_int8_t ano_fclid0;
u_int8_t ano_fclid1;
u_int8_t ano_fclstatecounter;
u_int8_t ano_fclstate0;
u_int8_t ano_fclstate1;
#define AMI_FCLOOP_FAILED 0
#define AMI_FCLOOP_ACTIVE 1
#define AMI_FCLOOP_TRANSIENT 2
u_int8_t ano_fclstatersvd;
} __packed;
struct ami_fc_einquiry {
u_int32_t ain_size;
struct ami_notify ain_notify;
u_int8_t ain_notifyrsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE];
u_int8_t ain_rbldrate;
u_int8_t ain_flushintvl;
u_int8_t ain_sensealert;
u_int8_t ain_drvinscnt;
u_int8_t ain_battery;
u_int8_t ain_nlogdrv;
u_int8_t ain_recon[AMI_BIG_MAX_LDRIVES / 8];
u_int16_t ain_stat[AMI_BIG_MAX_LDRIVES / 8];
u_int32_t ain_ldsize[AMI_BIG_MAX_LDRIVES];
u_int8_t ain_ldprop[AMI_BIG_MAX_LDRIVES];
u_int8_t ain_ldstat[AMI_BIG_MAX_LDRIVES];
u_int8_t ain_pdstat[AMI_BIG_MAX_PDRIVES];
u_int16_t ain_pdfmtinp[AMI_BIG_MAX_PDRIVES / 16];
u_int8_t ain_pdrates[80];
u_int8_t ain_pad[263];
} __packed;
struct ami_fc_prodinfo {
u_int32_t api_size;
u_int32_t api_config;
u_int8_t api_fwver[16];
u_int8_t api_biosver[16];
u_int8_t api_product[80];
u_int8_t api_maxcmd;
u_int8_t api_channels;
u_int8_t api_fcloops;
u_int8_t api_memtype;
u_int32_t api_signature;
u_int16_t api_ramsize;
u_int16_t api_ssid;
u_int16_t api_ssvid;
u_int8_t api_nnotify;
} __packed;
struct ami_diskarray {
u_int8_t ada_nld;
u_int8_t ada_pad[3];
struct {
u_int8_t adl_spandepth;
u_int8_t adl_raidlvl;
u_int8_t adl_rdahead;
u_int8_t adl_stripesz;
u_int8_t adl_status;
u_int8_t adl_wrpolicy;
u_int8_t adl_directio;
u_int8_t adl_nstripes;
struct {
u_int32_t ads_start;
u_int32_t ads_length;
struct {
u_int8_t add_channel;
u_int8_t add_target;
} __packed ads_devs[AMI_MAX_DEVDEPTH];
} __packed adl_spans[AMI_MAX_SPANDEPTH];
} __packed ada_ldrv[AMI_MAX_LDRIVES];
struct {
u_int8_t adp_type;
u_int8_t adp_ostatus;
u_int8_t adp_tagdepth;
u_int8_t adp_sneg;
u_int32_t adp_size;
} __packed ada_pdrv[AMI_MAX_PDRIVES];
} __packed;
struct ami_big_diskarray {
u_int8_t ada_nld;
u_int8_t ada_pad[3];
#define ald ada_ldrv
struct {
u_int8_t adl_spandepth;
u_int8_t adl_raidlvl;
u_int8_t adl_rdahead;
u_int8_t adl_stripesz;
u_int8_t adl_status;
u_int8_t adl_wrpolicy;
u_int8_t adl_directio;
u_int8_t adl_nstripes;
#define asp adl_spans
struct {
u_int32_t ads_start;
u_int32_t ads_length;
#define adv ads_devs
struct {
u_int8_t add_channel;
u_int8_t add_target;
} __packed ads_devs[AMI_BIG_MAX_DEVDEPTH];
} __packed adl_spans[AMI_BIG_MAX_SPANDEPTH];
} __packed ada_ldrv[AMI_BIG_MAX_LDRIVES];
#define apd ada_pdrv
struct {
u_int8_t adp_type;
u_int8_t adp_ostatus;
u_int8_t adp_tagdepth;
u_int8_t adp_sneg;
u_int32_t adp_size;
} __packed ada_pdrv[AMI_BIG_MAX_PDRIVES];
} __packed;
struct ami_scsisense {
u_int8_t ase_end;
struct {
u_int8_t asd_channel;
u_int8_t asd_target;
u_int16_t asd_errcode;
u_int16_t asd_sense;
u_int16_t asd_addarea1;
u_int16_t asd_addarea2;
u_int16_t asd_cmdspec0;
u_int16_t asd_cmdspec1;
u_int16_t asd_asc_ascq;
} __packed ase_dump[5];
} __packed;
struct ami_escsisense {
u_int8_t ase_end;
struct {
u_int8_t asd_channel;
u_int8_t asd_target;
u_int16_t asd_errcode;
u_int16_t asd_sense;
u_int16_t asd_addarea1;
u_int16_t asd_addarea2;
u_int16_t asd_cmdspec0;
u_int16_t asd_cmdspec1;
u_int16_t asd_asc_ascq;
u_int16_t asd_extarea;
} __packed ase_dump[5];
} __packed;
struct ami_cachestats {
u_int32_t acs_total;
u_int32_t acs_hits;
} __packed;
struct ami_drivehistory {
struct {
u_int8_t adh_error;
#define AMI_ADHERR_TIMEOUT(e) ((e) & 15)
#define AMI_ADHERR_PARITY(e) (((e) >> 4) & 15)
u_int8_t adh_throttle;
} __packed adh_err[3][16];
u_int8_t adh_failidx;
struct {
u_int8_t adh_tag;
#define AMI_ADHTAG_CH(t) ((t) & 7)
#define AMI_ADHTAG_TARG(t) (((t) >> 3) & 15)
#define AMI_ADHTAG_VALID(t) ((t) & 0x80)
u_int8_t reason;
#define AMI_ADHERR_MEDIA 1
#define AMI_ADHERR_NMEDIA 2
#define AMI_ADHERR_CMDTMO 3
#define AMI_ADHERR_SELTMO 4
#define AMI_ADHERR_HAFAIL 5
#define AMI_ADHERR_REASSIGN 6
#define AMI_ADHERR_CMDFAIL 7
#define AMI_ADHERR_OTHER 8
#define AMI_FAILHISTORY 10
} __packed adh_fail[AMI_FAILHISTORY];
} __packed;
struct ami_progress {
u_int32_t apr_progress;
} __packed;