#define TWE_MAX_UNITS 16
#define TWE_MAXOFFSETS 62
#define TWE_MAXCMDS 255
#define TWE_SECTOR_SIZE 512
#define TWE_ALIGN 512
#define TWE_MAXFER (TWE_MAXOFFSETS * PAGE_SIZE)
#define TWE_CONTROL 0x00
#define TWE_CTRL_CHOSTI 0x00080000
#define TWE_CTRL_CATTNI 0x00040000
#define TWE_CTRL_MCMDI 0x00020000
#define TWE_CTRL_MRDYI 0x00010000
#define TWE_CTRL_ECMDI 0x00008000
#define TWE_CTRL_ERDYI 0x00004000
#define TWE_CTRL_CERR 0x00000200
#define TWE_CTRL_SRST 0x00000100
#define TWE_CTRL_EINT 0x00000080
#define TWE_CTRL_MINT 0x00000040
#define TWE_CTRL_HOSTI 0x00000020
#define TWE_STATUS 0x04
#define TWE_STAT_MAJV 0xf0000000
#define TWE_MAJV(st) (((st) >> 28) & 0xf)
#define TWE_STAT_MINV 0x0f000000
#define TWE_MINV(st) (((st) >> 24) & 0xf)
#define TWE_STAT_PCIPAR 0x00800000
#define TWE_STAT_QUEUEE 0x00400000
#define TWE_STAT_CPUERR 0x00200000
#define TWE_STAT_PCIABR 0x00100000
#define TWE_STAT_HOSTI 0x00080000
#define TWE_STAT_ATTNI 0x00040000
#define TWE_STAT_CMDI 0x00020000
#define TWE_STAT_RDYI 0x00010000
#define TWE_STAT_CQF 0x00008000
#define TWE_STAT_RQE 0x00004000
#define TWE_STAT_CPURDY 0x00002000
#define TWE_STAT_CQR 0x00001000
#define TWE_STAT_FLAGS 0x00fff000
#define TWE_STAT_BITS "\020\015cqr\016cpurdy\017rqe\20cqf" \
"\021rdyi\022cmdi\023attni\024hosti\025pciabr\026cpuerr\027queuee\030pcipar"
#define TWE_COMMANDQUEUE 0x08
#define TWE_CMD_NOP 0x0200
#define TWE_CMD_INIT 0x0301
#define TWE_CMD_READ 0x0362
#define TWE_CMD_WRITE 0x0363
#define TWE_CMD_RDVRFY 0x0364
#define TWE_CMD_VERIFY 0x0365
#define TWE_CMD_ZRFUNIT 0x0208
#define TWE_CMD_RPLUNIT 0x0209
#define TWE_CMD_HOTSWAP 0x020a
#define TWE_CMD_SETATA 0x020c
#define TWE_CMD_FLUSH 0x020e
#define TWE_CMD_ABORT 0x020f
#define TWE_CMD_QSTAT 0x0210
#define TWE_CMD_GPARAM 0x0252
#define TWE_CMD_SPARAM 0x0253
#define TWE_CMD_NEWUNIT 0x0214
#define TWE_CMD_DELUNIT 0x0215
#define TWE_CMD_RBLUNIT 0x0217
#define TWE_CMD_SECINF 0x021a
#define TWE_CMD_AEN 0x021c
#define TWE_CMD_CMDPK 0x021d
#define TWE_READYQUEUE 0x0c
#define TWE_READYID(u) (((u) >> 4) & 0xff)
#define TWE_PARAM_ALL 0x000
#define TWE_PARAM_DSUM 0x002
#define TWE_PARAM_UC 0x003
#define TWE_PARAM_DC 0x200
#define TWE_PARAM_UI 0x300
#define TWE_PARAM_AEN 0x401
#define TWE_PARAM_VER 0x402
#define TWE_PARAM_CTRL 0x403
#define TWE_PARAM_FTRS 0x404
#define TWE_PARAM_DIR 0xffff
#define TWE_AEN_QEMPTY 0x0000
#define TWE_AEN_SRST 0x0001
#define TWE_AEN_DMIRROR 0x0002
#define TWE_AEN_CERROR 0x0003
#define TWE_AEN_RBFAIL 0x0004
#define TWE_AEN_RBDONE 0x0005
#define TWE_AEN_ILLUN 0x0006
#define TWE_AEN_INDONE 0x0007
#define TWE_AEN_DSHUT 0x0008
#define TWE_AEN_APORT 0x0009
#define TWE_AEN_DRVERR 0x000a
#define TWE_AEN_RBSTART 0x000b
#define TWE_AEN_ISTART 0x000c
#define TWE_AEN_TUN 0x0015
#define TWE_AEN_QFULL 0x00ff
struct twe_param {
u_int16_t table_id;
u_int8_t param_id;
u_int8_t param_size;
u_int8_t data[1];
} __packed;
struct twe_segs {
u_int32_t twes_addr;
u_int32_t twes_len;
} __packed;
struct twe_cmd {
u_int16_t cmd_op;
u_int8_t cmd_index;
u_int8_t cmd_unit_host;
#define TWE_UNITHOST(u, h) (((u) & 0xf) | ((h) << 4))
u_int8_t cmd_status;
u_int8_t cmd_flags;
#define TWE_FLAGS_CACHEDISABLE 0x01
union {
struct {
u_int16_t count;
u_int32_t lba;
struct twe_segs segs[TWE_MAXOFFSETS];
u_int32_t pad;
} __packed _cmd_io;
#define cmd_io _._cmd_io
struct {
u_int16_t count;
struct twe_segs segs[TWE_MAXOFFSETS];
} __packed _cmd_param;
#define cmd_param _._cmd_param
struct {
u_int16_t msgcr;
u_int32_t rdy_q_ptr;
} __packed _cmd_init;
#define cmd_init _._cmd_init
struct {
u_int8_t action;
#define TWE_HSWAP_REMOVE 0
#define TWE_HSWAP_ADDCBOD 1
#define TWE_HSWAP_ADDSPARE 2
u_int8_t port;
} __packed _cmd_aport;
#define cmd_hswap _._cmd_hswap
struct {
u_int8_t feature;
#define TWE_ATA_WCE 0x02
#define TWE_ATA_NWCE 0x82
u_int8_t mode;
u_int16_t units;
u_int16_t persist;
} __packed _cmd_ata;
#define cmd_ata _._cmd_ata
u_int16_t cmd_status;
struct {
u_int8_t action;
#define TWE_REBUILD_NOP 0
#define TWE_REBUILD_STOP 2
#define TWE_REBUILD_START 4
#define TWE_REBUILD_STARTU 5
#define TWE_REBUILD_CS 0x80
u_int8_t subunit;
} __packed _cmd_rebuild;
#define cmd_rebuild _._cmd_rebuild
} _;
} __packed;