#include "mvs_if.h"
#define CHIP_PCIEIC 0x1900
#define CHIP_PCIEIM 0x1910
#define CHIP_PCIIC 0x1d58
#define CHIP_PCIIM 0x1d5c
#define CHIP_MIC 0x1d60
#define CHIP_MIM 0x1d64
#define CHIP_SOC_MIC 0x20
#define CHIP_SOC_MIM 0x24
#define IC_ERR_IRQ (1 << 0)
#define IC_DONE_IRQ (1 << 1)
#define IC_HC0 0x000001ff
#define IC_HC_SHIFT 9
#define IC_HC1 (IC_HC0 << IC_HC_SHIFT)
#define IC_ERR_HC0 0x00000055
#define IC_DONE_HC0 0x000000aa
#define IC_ERR_HC1 (IC_ERR_HC0 << IC_HC_SHIFT)
#define IC_DONE_HC1 (IC_DONE_HC0 << IC_HC_SHIFT)
#define IC_HC0_COAL_DONE (1 << 8)
#define IC_HC1_COAL_DONE (1 << 17)
#define IC_PCI_ERR (1 << 18)
#define IC_TRAN_COAL_LO_DONE (1 << 19)
#define IC_TRAN_COAL_HI_DONE (1 << 20)
#define IC_ALL_PORTS_COAL_DONE (1 << 21)
#define IC_GPIO_INT (1 << 22)
#define IC_SELF_INT (1 << 23)
#define IC_TWSI_INT (1 << 24)
#define IC_MAIN_RSVD (0xfe000000)
#define IC_MAIN_RSVD_5 (0xfff10000)
#define IC_MAIN_RSVD_SOC (0xfffffec0)
#define CHIP_SOC_LED 0x2C
#define CHIP_SOC_HC0_MASK(num) (0xff >> ((4 - (num)) * 2))
#define CHIP_ICC 0x18008
#define CHIP_ICC_ALL_PORTS (1 << 4)
#define CHIP_ICT 0x180cc
#define CHIP_ITT 0x180d0
#define CHIP_TRAN_COAL_CAUSE_LO 0x18088
#define CHIP_TRAN_COAL_CAUSE_HI 0x1808c
#define HC_SIZE 0x10000
#define HC_OFFSET 0x20000
#define HC_BASE(hc) ((hc) * HC_SIZE + HC_OFFSET)
#define HC_CFG 0x0
#define HC_CFG_TIMEOUT_MASK (0xff << 0)
#define HC_CFG_NODMABS (1 << 8)
#define HC_CFG_NOEDMABS (1 << 9)
#define HC_CFG_NOPRDBS (1 << 10)
#define HC_CFG_TIMEOUTEN (1 << 16)
#define HC_CFG_COALDIS(p) (1 << ((p) + 24))
#define HC_RQOP 0x4
#define HC_RQIP 0x8
#define HC_ICT 0xc
#define HC_ICT_SAICOALT_MASK 0x000000ff
#define HC_ITT 0x10
#define HC_ITT_SAITMTH_MASK 0x00ffffff
#define HC_IC 0x14
#define HC_IC_DONE(p) (1 << (p))
#define HC_IC_COAL (1 << 4)
#define HC_IC_DEV(p) (1 << ((p) + 8))
#define PORT_SIZE 0x2000
#define PORT_OFFSET 0x2000
#define PORT_BASE(hc) ((hc) * PORT_SIZE + PORT_OFFSET)
#define EDMA_CFG 0x0
#define EDMA_CFG_RESERVED (0x1f << 0)
#define EDMA_CFG_ESATANATVCMDQUE (1 << 5)
#define EDMA_CFG_ERDBSZ (1 << 8)
#define EDMA_CFG_EQUE (1 << 9)
#define EDMA_CFG_ERDBSZEXT (1 << 11)
#define EDMA_CFG_RESERVED2 (1 << 12)
#define EDMA_CFG_EWRBUFFERLEN (1 << 13)
#define EDMA_CFG_EDEVERR (1 << 14)
#define EDMA_CFG_EEDMAFBS (1 << 16)
#define EDMA_CFG_ECUTTHROUGHEN (1 << 17)
#define EDMA_CFG_EEARLYCOMPLETIONEN (1 << 18)
#define EDMA_CFG_EEDMAQUELEN (1 << 19)
#define EDMA_CFG_EHOSTQUEUECACHEEN (1 << 22)
#define EDMA_CFG_EMASKRXPM (1 << 23)
#define EDMA_CFG_RESUMEDIS (1 << 24)
#define EDMA_CFG_EDMAFBS (1 << 26)
#define EDMA_T 0x4
#define EDMA_IEC 0x8
#define EDMA_IEM 0xc
#define EDMA_IE_EDEVERR (1 << 2)
#define EDMA_IE_EDEVDIS (1 << 3)
#define EDMA_IE_EDEVCON (1 << 4)
#define EDMA_IE_SERRINT (1 << 5)
#define EDMA_IE_ESELFDIS (1 << 7)
#define EDMA_IE_ETRANSINT (1 << 8)
#define EDMA_IE_EIORDYERR (1 << 12)
#define EDMA_IE_LINKXERR_SATACRC (1 << 0)
#define EDMA_IE_LINKXERR_INTERNALFIFO (1 << 1)
#define EDMA_IE_LINKXERR_LINKLAYERRESET (1 << 2)
#define EDMA_IE_LINKXERR_OTHERERRORS (1 << 3)
#define EDMA_IE_LINKTXERR_FISTXABORTED (1 << 4)
#define EDMA_IE_LINKCTLRXERR(x) ((x) << 13)
#define EDMA_IE_LINKDATARXERR(x) ((x) << 17)
#define EDMA_IE_LINKCTLTXERR(x) ((x) << 21)
#define EDMA_IE_LINKDATATXERR(x) ((x) << 26)
#define EDMA_IE_TRANSPROTERR (1U << 31)
#define EDMA_IE_TRANSIENT (EDMA_IE_LINKCTLRXERR(0x0b) | \
EDMA_IE_LINKCTLTXERR(0x1f))
#define EDMA_REQQBAH 0x10
#define EDMA_REQQIP 0x14
#define EDMA_REQQOP 0x18
#define EDMA_REQQP_ERQQP_SHIFT 5
#define EDMA_REQQP_ERQQP_MASK 0x000003e0
#define EDMA_REQQP_ERQQBAP_MASK 0x00000c00
#define EDMA_REQQP_ERQQBA_MASK 0xfffff000
#define EDMA_RESQBAH 0x1c
#define EDMA_RESQIP 0x20
#define EDMA_RESQOP 0x24
#define EDMA_RESQP_ERPQP_SHIFT 3
#define EDMA_RESQP_ERPQP_MASK 0x000000f8
#define EDMA_RESQP_ERPQBAP_MASK 0x00000300
#define EDMA_RESQP_ERPQBA_MASK 0xfffffc00
#define EDMA_CMD 0x28
#define EDMA_CMD_EENEDMA (1 << 0)
#define EDMA_CMD_EDSEDMA (1 << 1)
#define EDMA_CMD_EATARST (1 << 2)
#define EDMA_CMD_EEDMAFRZ (1 << 4)
#define EDMA_TC 0x2c
#define EDMA_S 0x30
#define EDMA_S_EDEVQUETAG(s) ((s) & 0x0000001f)
#define EDMA_S_EDEVDIR_WRITE (0 << 5)
#define EDMA_S_EDEVDIR_READ (1 << 5)
#define EDMA_S_ECACHEEMPTY (1 << 6)
#define EDMA_S_EDMAIDLE (1 << 7)
#define EDMA_S_ESTATE(s) (((s) & 0x0000ff00) >> 8)
#define EDMA_S_EIOID(s) (((s) & 0x003f0000) >> 16)
#define EDMA_IORT 0x34
#define EDMA_CDT 0x40
#define EDMA_HC 0x60
#define EDMA_UNKN_RESD 0x6C
#define EDMA_CQDCQOS(x) (0x90 + ((x) << 2)
#define ATA_DATA 0x100
#define ATA_FEATURE 0x104
#define ATA_F_DMA 0x01
#define ATA_F_OVL 0x02
#define ATA_ERROR 0x104
#define ATA_E_ILI 0x01
#define ATA_E_NM 0x02
#define ATA_E_ABORT 0x04
#define ATA_E_MCR 0x08
#define ATA_E_IDNF 0x10
#define ATA_E_MC 0x20
#define ATA_E_UNC 0x40
#define ATA_E_ICRC 0x80
#define ATA_E_ATAPI_SENSE_MASK 0xf0
#define ATA_COUNT 0x108
#define ATA_IREASON 0x108
#define ATA_I_CMD 0x01
#define ATA_I_IN 0x02
#define ATA_I_RELEASE 0x04
#define ATA_I_TAGMASK 0xf8
#define ATA_SECTOR 0x10c
#define ATA_CYL_LSB 0x110
#define ATA_CYL_MSB 0x114
#define ATA_DRIVE 0x118
#define ATA_D_LBA 0x40
#define ATA_D_IBM 0xa0
#define ATA_COMMAND 0x11c
#define ATA_STATUS 0x11c
#define ATA_S_ERROR 0x01
#define ATA_S_INDEX 0x02
#define ATA_S_CORR 0x04
#define ATA_S_DRQ 0x08
#define ATA_S_DSC 0x10
#define ATA_S_SERVICE 0x10
#define ATA_S_DWF 0x20
#define ATA_S_DMA 0x20
#define ATA_S_READY 0x40
#define ATA_S_BUSY 0x80
#define ATA_CONTROL 0x120
#define ATA_A_IDS 0x02
#define ATA_A_RESET 0x04
#define ATA_A_4BIT 0x08
#define ATA_A_HOB 0x80
#define ATA_ALTSTAT 0x120
#define ATAPI_P_READ (ATA_S_DRQ | ATA_I_IN)
#define ATAPI_P_WRITE (ATA_S_DRQ)
#define ATAPI_P_CMDOUT (ATA_S_DRQ | ATA_I_CMD)
#define ATAPI_P_DONEDRQ (ATA_S_DRQ | ATA_I_CMD | ATA_I_IN)
#define ATAPI_P_DONE (ATA_I_CMD | ATA_I_IN)
#define ATAPI_P_ABORT 0
#define DMA_C 0x224
#define DMA_C_START (1 << 0)
#define DMA_C_READ (1 << 3)
#define DMA_C_DREGIONVALID (1 << 8)
#define DMA_C_DREGIONLAST (1 << 9)
#define DMA_C_CONTFROMPREV (1 << 10)
#define DMA_C_DRBC(n) (((n) & 0xffff) << 16)
#define DMA_S 0x228
#define DMA_S_ACT (1 << 0)
#define DMA_S_ERR (1 << 1)
#define DMA_S_PAUSED (1 << 2)
#define DMA_S_LAST (1 << 3)
#define DMA_DTLBA 0x22c
#define DMA_DTLBA_MASK 0xfffffff0
#define DMA_DTHBA 0x230
#define DMA_DRLA 0x234
#define DMA_DRHA 0x238
#define SATA_SS 0x300
#define SATA_SS_DET_MASK 0x0000000f
#define SATA_SS_DET_NO_DEVICE 0x00000000
#define SATA_SS_DET_DEV_PRESENT 0x00000001
#define SATA_SS_DET_PHY_ONLINE 0x00000003
#define SATA_SS_DET_PHY_OFFLINE 0x00000004
#define SATA_SS_SPD_MASK 0x000000f0
#define SATA_SS_SPD_NO_SPEED 0x00000000
#define SATA_SS_SPD_GEN1 0x00000010
#define SATA_SS_SPD_GEN2 0x00000020
#define SATA_SS_SPD_GEN3 0x00000030
#define SATA_SS_IPM_MASK 0x00000f00
#define SATA_SS_IPM_NO_DEVICE 0x00000000
#define SATA_SS_IPM_ACTIVE 0x00000100
#define SATA_SS_IPM_PARTIAL 0x00000200
#define SATA_SS_IPM_SLUMBER 0x00000600
#define SATA_SE 0x304
#define SATA_SEIM 0x340
#define SATA_SE_DATA_CORRECTED 0x00000001
#define SATA_SE_COMM_CORRECTED 0x00000002
#define SATA_SE_DATA_ERR 0x00000100
#define SATA_SE_COMM_ERR 0x00000200
#define SATA_SE_PROT_ERR 0x00000400
#define SATA_SE_HOST_ERR 0x00000800
#define SATA_SE_PHY_CHANGED 0x00010000
#define SATA_SE_PHY_IERROR 0x00020000
#define SATA_SE_COMM_WAKE 0x00040000
#define SATA_SE_DECODE_ERR 0x00080000
#define SATA_SE_PARITY_ERR 0x00100000
#define SATA_SE_CRC_ERR 0x00200000
#define SATA_SE_HANDSHAKE_ERR 0x00400000
#define SATA_SE_LINKSEQ_ERR 0x00800000
#define SATA_SE_TRANSPORT_ERR 0x01000000
#define SATA_SE_UNKNOWN_FIS 0x02000000
#define SATA_SC 0x308
#define SATA_SC_DET_MASK 0x0000000f
#define SATA_SC_DET_IDLE 0x00000000
#define SATA_SC_DET_RESET 0x00000001
#define SATA_SC_DET_DISABLE 0x00000004
#define SATA_SC_SPD_MASK 0x000000f0
#define SATA_SC_SPD_NO_SPEED 0x00000000
#define SATA_SC_SPD_SPEED_GEN1 0x00000010
#define SATA_SC_SPD_SPEED_GEN2 0x00000020
#define SATA_SC_SPD_SPEED_GEN3 0x00000030
#define SATA_SC_IPM_MASK 0x00000f00
#define SATA_SC_IPM_NONE 0x00000000
#define SATA_SC_IPM_DIS_PARTIAL 0x00000100
#define SATA_SC_IPM_DIS_SLUMBER 0x00000200
#define SATA_SC_SPM_MASK 0x0000f000
#define SATA_SC_SPM_NONE 0x00000000
#define SATA_SC_SPM_PARTIAL 0x00001000
#define SATA_SC_SPM_SLUMBER 0x00002000
#define SATA_SC_SPM_ACTIVE 0x00004000
#define SATA_LTM 0x30c
#define SATA_PHYM3 0x310
#define SATA_PHYM4 0x314
#define SATA_PHYM1 0x32c
#define SATA_PHYM2 0x330
#define SATA_BISTC 0x334
#define SATA_BISTDW1 0x338
#define SATA_BISTDW2 0x33c
#define SATA_SATAICFG 0x050
#define SATA_SATAICFG_REFCLKCNF_20MHZ (0 << 0)
#define SATA_SATAICFG_REFCLKCNF_25MHZ (1 << 0)
#define SATA_SATAICFG_REFCLKCNF_30MHZ (2 << 0)
#define SATA_SATAICFG_REFCLKCNF_40MHZ (3 << 0)
#define SATA_SATAICFG_REFCLKCNF_MASK (3 << 0)
#define SATA_SATAICFG_REFCLKDIV_1 (0 << 2)
#define SATA_SATAICFG_REFCLKDIV_2 (1 << 2)
#define SATA_SATAICFG_REFCLKDIV_4 (2 << 2)
#define SATA_SATAICFG_REFCLKDIV_3 (3 << 2)
#define SATA_SATAICFG_REFCLKDIV_MASK (3 << 2)
#define SATA_SATAICFG_REFCLKFEEDDIV_50 (0 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_60 (1 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_75 (2 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_90 (3 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_MASK (3 << 4)
#define SATA_SATAICFG_PHYSSCEN (1 << 6)
#define SATA_SATAICFG_GEN2EN (1 << 7)
#define SATA_SATAICFG_COMMEN (1 << 8)
#define SATA_SATAICFG_PHYSHUTDOWN (1 << 9)
#define SATA_SATAICFG_TARGETMODE (1 << 10)
#define SATA_SATAICFG_COMCHANNEL (1 << 11)
#define SATA_SATAICFG_IGNOREBSY (1 << 24)
#define SATA_SATAICFG_LINKRSTEN (1 << 25)
#define SATA_SATAICFG_CMDRETXDS (1 << 26)
#define SATA_SATAICTL 0x344
#define SATA_SATAICTL_PMPTX_MASK 0x0000000f
#define SATA_SATAICTL_PMPTX_SHIFT 0
#define SATA_SATAICTL_VUM (1 << 8)
#define SATA_SATAICTL_VUS (1 << 9)
#define SATA_SATAICTL_EDMAACT (1 << 16)
#define SATA_SATAICTL_CLEARSTAT (1 << 24)
#define SATA_SATAICTL_SRST (1 << 25)
#define SATA_SATAITC 0x348
#define SATA_SATAIS 0x34c
#define SATA_VU 0x35c
#define SATA_FISC 0x360
#define SATA_FISC_FISWAIT4RDYEN_B0 (1 << 0)
#define SATA_FISC_FISWAIT4RDYEN_B1 (1 << 1)
#define SATA_FISC_FISWAIT4RDYEN_B2 (1 << 2)
#define SATA_FISC_FISWAIT4RDYEN_B3 (1 << 3)
#define SATA_FISC_FISWAIT4RDYEN_B4 (1 << 4)
#define SATA_FISC_FISWAIT4RDYEN_B5 (1 << 5)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B0 (1 << 8)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B1 (1 << 9)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B2 (1 << 10)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B3 (1 << 11)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B4 (1 << 12)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B5 (1 << 13)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B6 (1 << 14)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B7 (1 << 15)
#define SATA_FISC_FISDMAACTIVATESYNCRESP (1 << 16)
#define SATA_FISC_FISUNRECTYPECONT (1 << 17)
#define SATA_FISIC 0x364
#define SATA_FISIM 0x368
#define SATA_FISDW0 0x370
#define SATA_FISDW1 0x374
#define SATA_FISDW2 0x378
#define SATA_FISDW3 0x37c
#define SATA_FISDW4 0x380
#define SATA_FISDW5 0x384
#define SATA_FISDW6 0x388
#define SATA_PHYM9_GEN2 0x398
#define SATA_PHYM9_GEN1 0x39c
#define SATA_PHYCFG_OFS 0x3a0
#define MVS_MAX_PORTS 8
#define MVS_MAX_SLOTS 32
#define MVS_SG_ENTRIES (btoc(maxphys) + 1)
struct mvs_crqb {
uint32_t cprdbl;
uint32_t cprdbh;
uint16_t ctrlflg;
#define MVS_CRQB_READ 0x0001
#define MVS_CRQB_TAG_MASK 0x003e
#define MVS_CRQB_TAG_SHIFT 1
#define MVS_CRQB_PMP_MASK 0xf000
#define MVS_CRQB_PMP_SHIFT 12
uint8_t cmd[22];
} __packed;
struct mvs_crqb_gen2e {
uint32_t cprdbl;
uint32_t cprdbh;
uint32_t ctrlflg;
#define MVS_CRQB2E_READ 0x00000001
#define MVS_CRQB2E_DTAG_MASK 0x0000003e
#define MVS_CRQB2E_DTAG_SHIFT 1
#define MVS_CRQB2E_PMP_MASK 0x0000f000
#define MVS_CRQB2E_PMP_SHIFT 12
#define MVS_CRQB2E_CPRD 0x00010000
#define MVS_CRQB2E_HTAG_MASK 0x003e0000
#define MVS_CRQB2E_HTAG_SHIFT 17
uint32_t drbc;
uint8_t cmd[16];
} __packed;
struct mvs_eprd {
uint32_t prdbal;
uint32_t bytecount;
#define MVS_EPRD_MASK 0x0000ffff
#define MVS_EPRD_MAX (MVS_EPRD_MASK + 1)
#define MVS_EPRD_EOF 0x80000000
uint32_t prdbah;
uint32_t resv;
} __packed;
#define MVS_CRQB_OFFSET 0
#define MVS_CRQB_SIZE 32
#define MVS_CRQB_MASK 0x000003e0
#define MVS_CRQB_SHIFT 5
#define MVS_CRQB_TO_ADDR(slot) ((slot) << MVS_CRQB_SHIFT)
#define MVS_ADDR_TO_CRQB(addr) (((addr) & MVS_CRQB_MASK) >> MVS_CRQB_SHIFT)
#define MVS_EPRD_OFFSET (MVS_CRQB_OFFSET + MVS_CRQB_SIZE * MVS_MAX_SLOTS)
#define MVS_EPRD_SIZE (MVS_SG_ENTRIES * 16)
#define MVS_WORKRQ_SIZE (MVS_EPRD_OFFSET + MVS_EPRD_SIZE * MVS_MAX_SLOTS)
struct mvs_crpb {
uint16_t id;
#define MVS_CRPB_TAG_MASK 0x001F
#define MVS_CRPB_TAG_SHIFT 0
uint16_t rspflg;
#define MVS_CRPB_EDMASTS_MASK 0x007F
#define MVS_CRPB_EDMASTS_SHIFT 0
#define MVS_CRPB_ATASTS_MASK 0xFF00
#define MVS_CRPB_ATASTS_SHIFT 8
uint32_t ts;
} __packed;
#define MVS_CRPB_OFFSET 0
#define MVS_CRPB_SIZE sizeof(struct mvs_crpb)
#define MVS_CRPB_MASK 0x000000f8
#define MVS_CRPB_SHIFT 3
#define MVS_CRPB_TO_ADDR(slot) ((slot) << MVS_CRPB_SHIFT)
#define MVS_ADDR_TO_CRPB(addr) (((addr) & MVS_CRPB_MASK) >> MVS_CRPB_SHIFT)
#define MVS_WORKRP_SIZE (MVS_CRPB_OFFSET + MVS_CRPB_SIZE * MVS_MAX_SLOTS)
#define ATA_IRQ_RID 0
#define ATA_INTR_FLAGS (INTR_MPSAFE|INTR_TYPE_BIO|INTR_ENTROPY)
struct ata_dmaslot {
bus_dmamap_t data_map;
bus_addr_t addr;
uint16_t len;
};
struct mvs_dma {
bus_dma_tag_t workrq_tag;
bus_dmamap_t workrq_map;
uint8_t *workrq;
bus_addr_t workrq_bus;
bus_dma_tag_t workrp_tag;
bus_dmamap_t workrp_map;
uint8_t *workrp;
bus_addr_t workrp_bus;
bus_dma_tag_t data_tag;
};
enum mvs_slot_states {
MVS_SLOT_EMPTY,
MVS_SLOT_LOADING,
MVS_SLOT_RUNNING,
MVS_SLOT_EXECUTING
};
struct mvs_slot {
device_t dev;
int slot;
int tag;
enum mvs_slot_states state;
u_int eprd_offset;
union ccb *ccb;
struct ata_dmaslot dma;
struct callout timeout;
};
struct mvs_device {
int revision;
int mode;
u_int bytecount;
u_int atapi;
u_int tags;
u_int caps;
};
enum mvs_edma_mode {
MVS_EDMA_UNKNOWN,
MVS_EDMA_OFF,
MVS_EDMA_ON,
MVS_EDMA_QUEUED,
MVS_EDMA_NCQ,
};
struct mvs_channel {
device_t dev;
int unit;
struct resource *r_mem;
struct resource *r_irq;
void *ih;
struct mvs_dma dma;
struct cam_sim *sim;
struct cam_path *path;
int quirks;
#define MVS_Q_GENI 1
#define MVS_Q_GENII 2
#define MVS_Q_GENIIE 4
#define MVS_Q_SOC 8
#define MVS_Q_CT 16
#define MVS_Q_SOC65 32
int pm_level;
struct mvs_slot slot[MVS_MAX_SLOTS];
union ccb *hold[MVS_MAX_SLOTS];
int holdtag[MVS_MAX_SLOTS];
struct mtx mtx;
int devices;
int pm_present;
enum mvs_edma_mode curr_mode;
int fbs_enabled;
uint32_t oslots;
uint32_t otagspd[16];
uint32_t rslots;
uint32_t aslots;
uint32_t eslots;
uint32_t toslots;
int numrslots;
int numrslotspd[16];
int numpslots;
int numdslots;
int numtslots;
int numtslotspd[16];
int numhslots;
int recoverycmd;
int fatalerr;
int lastslot;
int taggedtarget;
int resetting;
int resetpolldiv;
int out_idx;
int in_idx;
u_int transfersize;
u_int donecount;
u_int basic_dma;
u_int fake_busy;
union ccb *frozen;
struct callout pm_timer;
struct callout reset_timer;
struct mvs_device user[16];
struct mvs_device curr[16];
};
struct mvs_controller {
device_t dev;
int r_rid;
struct resource *r_mem;
struct rman sc_iomem;
struct mvs_controller_irq {
struct resource *r_irq;
void *handle;
int r_irq_rid;
} irq;
int quirks;
int channels;
int ccc;
int cccc;
struct mtx mtx;
int gmim;
int pmim;
int mim;
int msi;
int msia;
struct {
void (*function)(void *);
void *argument;
} interrupt[MVS_MAX_PORTS];
};
enum mvs_err_type {
MVS_ERR_NONE,
MVS_ERR_INVALID,
MVS_ERR_INNOCENT,
MVS_ERR_TFE,
MVS_ERR_SATA,
MVS_ERR_TIMEOUT,
MVS_ERR_NCQ,
};
struct mvs_intr_arg {
void *arg;
u_int cause;
};
#define ATA_INB(res, offset) \
bus_read_1((res), (offset))
#define ATA_INW(res, offset) \
bus_read_2((res), (offset))
#define ATA_INL(res, offset) \
bus_read_4((res), (offset))
#define ATA_INSW(res, offset, addr, count) \
bus_read_multi_2((res), (offset), (addr), (count))
#define ATA_INSW_STRM(res, offset, addr, count) \
bus_read_multi_stream_2((res), (offset), (addr), (count))
#define ATA_INSL(res, offset, addr, count) \
bus_read_multi_4((res), (offset), (addr), (count))
#define ATA_INSL_STRM(res, offset, addr, count) \
bus_read_multi_stream_4((res), (offset), (addr), (count))
#define ATA_OUTB(res, offset, value) \
bus_write_1((res), (offset), (value))
#define ATA_OUTW(res, offset, value) \
bus_write_2((res), (offset), (value))
#define ATA_OUTL(res, offset, value) \
bus_write_4((res), (offset), (value));
#define ATA_OUTSW(res, offset, addr, count) \
bus_write_multi_2((res), (offset), (addr), (count))
#define ATA_OUTSW_STRM(res, offset, addr, count) \
bus_write_multi_stream_2((res), (offset), (addr), (count))
#define ATA_OUTSL(res, offset, addr, count) \
bus_write_multi_4((res), (offset), (addr), (count))
#define ATA_OUTSL_STRM(res, offset, addr, count) \
bus_write_multi_stream_4((res), (offset), (addr), (count))