#ifndef _DEV_ATA_ATAREG_H_
#define _DEV_ATA_ATAREG_H_
struct ataparams {
u_int16_t atap_config;
#define WDC_CFG_ATAPI_MASK 0xc000
#define WDC_CFG_ATAPI 0x8000
#define ATA_CFG_REMOVABLE 0x0080
#define ATA_CFG_FIXED 0x0040
#define ATAPI_CFG_TYPE_MASK 0x1f00
#define ATAPI_CFG_TYPE(x) (((x) & ATAPI_CFG_TYPE_MASK) >> 8)
#define ATAPI_CFG_TYPE_DIRECT 0x00
#define ATAPI_CFG_TYPE_SEQUENTIAL 0x01
#define ATAPI_CFG_TYPE_CDROM 0x05
#define ATAPI_CFG_TYPE_OPTICAL 0x07
#define ATAPI_CFG_TYPE_NODEVICE 0x1F
#define ATAPI_CFG_REMOV 0x0080
#define ATAPI_CFG_DRQ_MASK 0x0060
#define ATAPI_CFG_STD_DRQ 0x0000
#define ATAPI_CFG_IRQ_DRQ 0x0020
#define ATAPI_CFG_ACCEL_DRQ 0x0040
#define ATAPI_CFG_CMD_MASK 0x0003
#define ATAPI_CFG_CMD_12 0x0000
#define ATAPI_CFG_CMD_16 0x0001
u_int16_t atap_cylinders;
u_int16_t __reserved1;
u_int16_t atap_heads;
u_int16_t __retired1[2];
u_int16_t atap_sectors;
u_int16_t __retired2[3];
u_int8_t atap_serial[20];
u_int16_t __retired3[2];
u_int16_t __obsolete1;
u_int8_t atap_revision[8];
u_int8_t atap_model[40];
u_int16_t atap_multi;
u_int16_t __reserved2;
u_int16_t atap_capabilities1;
#define WDC_CAP_IORDY 0x0800
#define WDC_CAP_IORDY_DSBL 0x0400
#define WDC_CAP_LBA 0x0200
#define WDC_CAP_DMA 0x0100
#define ATA_CAP_STBY 0x2000
#define ATAPI_CAP_INTERL_DMA 0x8000
#define ATAPI_CAP_CMD_QUEUE 0x4000
#define ATAPI_CAP_OVERLP 0x2000
#define ATAPI_CAP_ATA_RST 0x1000
u_int16_t atap_capabilities2;
#if BYTE_ORDER == LITTLE_ENDIAN
u_int8_t __junk2;
u_int8_t atap_oldpiotiming;
u_int8_t __junk3;
u_int8_t atap_olddmatiming;
#else
u_int8_t atap_oldpiotiming;
u_int8_t __junk2;
u_int8_t atap_olddmatiming;
u_int8_t __junk3;
#endif
u_int16_t atap_extensions;
#define WDC_EXT_UDMA_MODES 0x0004
#define WDC_EXT_MODES 0x0002
#define WDC_EXT_GEOM 0x0001
u_int16_t atap_curcylinders;
u_int16_t atap_curheads;
u_int16_t atap_cursectors;
u_int16_t atap_curcapacity[2];
u_int16_t atap_curmulti;
#define WDC_MULTI_VALID 0x0100
#define WDC_MULTI_MASK 0x00ff
u_int16_t atap_capacity[2];
u_int16_t __retired4;
#if BYTE_ORDER == LITTLE_ENDIAN
u_int8_t atap_dmamode_supp;
u_int8_t atap_dmamode_act;
u_int8_t atap_piomode_supp;
u_int8_t __junk4;
#else
u_int8_t atap_dmamode_act;
u_int8_t atap_dmamode_supp;
u_int8_t __junk4;
u_int8_t atap_piomode_supp;
#endif
u_int16_t atap_dmatiming_mimi;
u_int16_t atap_dmatiming_recom;
u_int16_t atap_piotiming;
u_int16_t atap_piotiming_iordy;
u_int16_t __reserved3[2];
u_int16_t atap_pkt_br;
u_int16_t atap_pkt_bsyclr;
u_int16_t __reserved4[2];
u_int16_t atap_queuedepth;
#define WDC_QUEUE_DEPTH_MASK 0x1f
u_int16_t atap_sata_caps;
#define SATA_SIGNAL_GEN1 0x0002
#define SATA_SIGNAL_GEN2 0x0004
#define SATA_NATIVE_CMDQ 0x0100
#define SATA_HOST_PWR_MGMT 0x0200
u_int16_t atap_sata_reserved;
u_int16_t atap_sata_features_supp;
#define SATA_NONZERO_OFFSETS 0x0002
#define SATA_DMA_SETUP_AUTO 0x0004
#define SATA_DRIVE_PWR_MGMT 0x0008
u_int16_t atap_sata_features_en;
u_int16_t atap_ata_major;
#define WDC_VER_ATA1 0x0002
#define WDC_VER_ATA2 0x0004
#define WDC_VER_ATA3 0x0008
#define WDC_VER_ATA4 0x0010
#define WDC_VER_ATA5 0x0020
#define WDC_VER_ATA6 0x0040
#define WDC_VER_ATA7 0x0080
#define WDC_VER_ATA8 0x0100
#define WDC_VER_ATA9 0x0200
#define WDC_VER_ATA10 0x0400
#define WDC_VER_ATA11 0x0800
#define WDC_VER_ATA12 0x1000
#define WDC_VER_ATA13 0x2000
#define WDC_VER_ATA14 0x4000
u_int16_t atap_ata_minor;
u_int16_t atap_cmd_set1;
#define WDC_CMD1_NOP 0x4000
#define WDC_CMD1_RB 0x2000
#define WDC_CMD1_WB 0x1000
#define WDC_CMD1_HPA 0x0400
#define WDC_CMD1_DVRST 0x0200
#define WDC_CMD1_SRV 0x0100
#define WDC_CMD1_RLSE 0x0080
#define WDC_CMD1_AHEAD 0x0040
#define WDC_CMD1_CACHE 0x0020
#define WDC_CMD1_PKT 0x0010
#define WDC_CMD1_PM 0x0008
#define WDC_CMD1_REMOV 0x0004
#define WDC_CMD1_SEC 0x0002
#define WDC_CMD1_SMART 0x0001
u_int16_t atap_cmd_set2;
#define ATAPI_CMD2_FCE 0x2000
#define ATAPI_CMD2_FC 0x1000
#define ATAPI_CMD2_DCO 0x0800
#define ATAPI_CMD2_48AD 0x0400
#define ATAPI_CMD2_AAM 0x0200
#define ATAPI_CMD2_SM 0x0100
#define ATAPI_CMD2_SF 0x0040
#define ATAPI_CMD2_PUIS 0x0020
#define WDC_CMD2_RMSN 0x0010
#define ATA_CMD2_APM 0x0008
#define ATA_CMD2_CFA 0x0004
#define ATA_CMD2_RWQ 0x0002
#define WDC_CMD2_DM 0x0001
u_int16_t atap_cmd_ext;
#define ATAPI_CMDE_IIUF 0x2000
#define ATAPI_CMDE_MSER 0x0004
#define ATAPI_CMDE_TEST 0x0002
#define ATAPI_CMDE_SLOG 0x0001
u_int16_t atap_cmd1_en;
u_int16_t atap_cmd2_en;
u_int16_t atap_cmd_def;
#if BYTE_ORDER == LITTLE_ENDIAN
u_int8_t atap_udmamode_supp;
u_int8_t atap_udmamode_act;
#else
u_int8_t atap_udmamode_act;
u_int8_t atap_udmamode_supp;
#endif
u_int16_t atap_seu_time;
u_int16_t atap_eseu_time;
u_int16_t atap_apm_val;
u_int16_t atap_mpasswd_rev;
u_int16_t atap_hwreset_res;
#define ATA_HWRES_CBLID 0x2000
#define ATA_HWRES_D1_PDIAG 0x0800
#define ATA_HWRES_D1_CSEL 0x0400
#define ATA_HWRES_D1_JUMP 0x0200
#define ATA_HWRES_D0_SEL 0x0040
#define ATA_HWRES_D0_DASP 0x0020
#define ATA_HWRES_D0_PDIAG 0x0010
#define ATA_HWRES_D0_DIAG 0x0008
#define ATA_HWRES_D0_CSEL 0x0004
#define ATA_HWRES_D0_JUMP 0x0002
#if BYTE_ORDER == LITTLE_ENDIAN
u_int8_t atap_acoustic_val;
u_int8_t atap_acoustic_def;
#else
u_int8_t atap_acoustic_def;
u_int8_t atap_acoustic_val;
#endif
u_int16_t __reserved6[5];
u_int16_t atap_max_lba[4];
u_int16_t __reserved7[23];
u_int16_t atap_rmsn_supp;
#define WDC_RMSN_SUPP_MASK 0x0003
#define WDC_RMSN_SUPP 0x0001
u_int16_t atap_sec_st;
#define WDC_SEC_LEV_MAX 0x0100
#define WDC_SEC_ESE_SUPP 0x0020
#define WDC_SEC_EXP 0x0010
#define WDC_SEC_FROZEN 0x0008
#define WDC_SEC_LOCKED 0x0004
#define WDC_SEC_EN 0x0002
#define WDC_SEC_SUPP 0x0001
u_int16_t __reserved8[31];
u_int16_t atap_cfa_power;
#define ATAPI_CFA_MAX_MASK 0x0FFF
#define ATAPI_CFA_MODE1_DIS 0x1000
#define ATAPI_CFA_MODE1_REQ 0x2000
#define ATAPI_CFA_WORD160 0x8000
u_int16_t __reserved9[15];
u_int8_t atap_media_serial[60];
u_int16_t __reserved10[49];
#if BYTE_ORDER == LITTLE_ENDIAN
u_int8_t atap_signature;
u_int8_t atap_checksum;
#else
u_int8_t atap_checksum;
u_int8_t atap_signature;
#endif
};
#endif