#ifndef _EFE_H
#define _EFE_H
#ifdef __cplusplus
extern "C" {
#endif
#define VENDOR_ID 0x10B8
#define DEVICE_ID 0x0005
#define RESET_DELAY 1
#define RESET_TEST_CYCLES 16
#define STOP_DELAY 10
#define STOP_DELAY_CYCLES 160
#define MII_DELAY 1
#define MII_DELAY_CYCLES 16
#define EEPROM_DELAY 3
#define EEPROM_WORDSZ 16
#define AT93C46_ADDRLEN 6
#define AT93C56_ADDRLEN 8
#define FLAG_RUNNING (1UL << 0)
#define FLAG_SUSPENDED (1UL << 1)
#define MCHASHL 64
#define MCHASHSZ 16
#define BURSTLEN 0x3F
#define RXDESCL 128
#define TXDESCL 128
#define BUFSZ 1536
#define CSR_COMMAND 0x00
#define CSR_INTSTAT 0x04
#define CSR_INTMASK 0x08
#define CSR_GENCTL 0x0C
#define CSR_NVCTL 0x10
#define CSR_EECTL 0x14
#define CSR_PBLCNT 0x18
#define CSR_TEST 0x1C
#define CSR_CRCCNT 0x20
#define CSR_ALICNT 0x24
#define CSR_MPCNT 0x28
#define CSR_RXFIFO 0x2C
#define CSR_MMCTL 0x30
#define CSR_MMDATA 0x34
#define CSR_MMCFG 0x38
#define CSR_IPG 0x3C
#define CSR_LAN0 0x40
#define CSR_LAN1 0x44
#define CSR_LAN2 0x48
#define CSR_IDCHK 0x4C
#define CSR_MC0 0x50
#define CSR_MC1 0x54
#define CSR_MC2 0x58
#define CSR_MC3 0x5C
#define CSR_RXCON 0x60
#define CSR_RXSTAT 0x64
#define CSR_RXCNT 0x68
#define CSR_RXTEST 0x6C
#define CSR_TXCON 0x70
#define CSR_TXSTAT 0x74
#define CSR_TDPAR 0x78
#define CSR_TXTEST 0x7C
#define CSR_PRFDAR 0x80
#define CSR_PRCDAR 0x84
#define CSR_PRHDAR 0x88
#define CSR_PRFLAR 0x8C
#define CSR_PRDLGTH 0x90
#define CSR_PRFCNT 0x94
#define CSR_PRLCAR 0x98
#define CSR_PRLPAR 0x9C
#define CSR_PREFAR 0xA0
#define CSR_PRSTAT 0xA4
#define CSR_PRBUF 0xA8
#define CSR_RDNCAR 0xAC
#define CSR_PRCPTHR 0xB0
#define CSR_ROMDATA 0xB4
#define CSR_PREEMPR 0xBC
#define CSR_PTFDAR 0xC0
#define CSR_PTCDAR 0xC4
#define CSR_PTHDAR 0xC8
#define CSR_PTFLAR 0xCC
#define CSR_PTDLGTH 0xD0
#define CSR_PTFCNT 0xD4
#define CSR_PTLCAR 0xD8
#define CSR_ETXTHR 0xDC
#define CSR_PTETXC 0xE0
#define CSR_PTSTAT 0xE4
#define CSR_PTBUF 0xE8
#define CSR_PTFDAR2 0xEC
#define CSR_FEVTR 0xF0
#define CSR_FEVTRMSKR 0xF4
#define CSR_FPRSTSTR 0xF8
#define CSR_FFRCEVTR 0xFF
#define COMMAND_STOP_RX (1UL << 0)
#define COMMAND_START_RX (1UL << 1)
#define COMMAND_TXQUEUED (1UL << 2)
#define COMMAND_RXQUEUED (1UL << 3)
#define COMMAND_NEXTFRAME (1UL << 4)
#define COMMAND_STOP_TDMA (1UL << 5)
#define COMMAND_STOP_RDMA (1UL << 6)
#define COMMAND_TXUGO (1UL << 7)
#define INTSTAT_RCC (1UL << 0)
#define INTSTAT_HCC (1UL << 1)
#define INTSTAT_RQE (1UL << 2)
#define INTSTAT_OVW (1UL << 3)
#define INTSTAT_RXE (1UL << 4)
#define INTSTAT_TXC (1UL << 5)
#define INTSTAT_TCC (1UL << 6)
#define INTSTAT_TQE (1UL << 7)
#define INTSTAT_TXU (1UL << 8)
#define INTSTAT_CNT (1UL << 9)
#define INTSTAT_PREI (1UL << 10)
#define INTSTAT_RCT (1UL << 11)
#define INTSTAT_FATAL (1UL << 12)
#define INTSTAT_PME (1UL << 14)
#define INTSTAT_GP2 (1UL << 15)
#define INTSTAT_ACTV (1UL << 16)
#define INTSTAT_RXIDLE (1UL << 17)
#define INTSTAT_TXIDLE (1UL << 18)
#define INTSTAT_RCIP (1UL << 19)
#define INTSTAT_TCIP (1UL << 20)
#define INTSTAT_RBE (1UL << 21)
#define INTSTAT_RCTS (1UL << 22)
#define INTSTAT_RSV (1UL << 23)
#define INTSTAT_DPE (1UL << 24)
#define INTSTAT_APE (1UL << 25)
#define INTSTAT_PMA (1UL << 26)
#define INTSTAT_PTA (1UL << 27)
#define INTMASK_RCC (1UL << 0)
#define INTMASK_HCC (1UL << 1)
#define INTMASK_RQE (1UL << 2)
#define INTMASK_OVW (1UL << 3)
#define INTMASK_RXE (1UL << 4)
#define INTMASK_TXC (1UL << 5)
#define INTMASK_TCC (1UL << 6)
#define INTMASK_TQE (1UL << 7)
#define INTMASK_TXU (1UL << 8)
#define INTMASK_CNT (1UL << 9)
#define INTMASK_PREI (1UL << 10)
#define INTMASK_RCT (1UL << 11)
#define INTMASK_FATAL (1UL << 12)
#define INTMASK_PME (1UL << 14)
#define INTMASK_GP2 (1UL << 15)
#define GENCTL_RESET (1UL << 0)
#define GENCTL_INT (1UL << 1)
#define GENCTL_SWINT (1UL << 2)
#define GENCTL_PWRDWN (1UL << 3)
#define GENCTL_ONECOPY (1UL << 4)
#define GENCTL_BE (1UL << 5)
#define GENCTL_RDP (1UL << 6)
#define GENCTL_TDP (1UL << 7)
#define GENCTL_RFT_32 (0UL << 8)
#define GENCTL_RFT_64 (1UL << 8)
#define GENCTL_RFT_96 (2UL << 8)
#define GENCTL_RFT_128 (3UL << 8)
#define GENCTL_MRM (1UL << 10)
#define GENCTL_MRL (1UL << 11)
#define GENCTL_SOFT0 (1UL << 12)
#define GENCTL_SOFT1 (1UL << 13)
#define GENCTL_RSTPHY (1UL << 14)
#define GENCTL_SCLK (1UL << 16)
#define GENCTL_RD (1UL << 17)
#define GENCTL_MPE (1UL << 18)
#define GENCTL_PME (1UL << 19)
#define GENCTL_PS_00 (0UL << 20)
#define GENCTL_PS_01 (1UL << 20)
#define GENCTL_PS_10 (2UL << 20)
#define GENCTL_PS_11 (3UL << 20)
#define GENCTL_OPLE (1UL << 22)
#define NVCTL_EMM (1UL << 0)
#define NVCTL_CRS (1UL << 1)
#define NVCTL_GPOE1 (1UL << 2)
#define NVCTL_GPOE2 (1UL << 3)
#define NVCTL_GPIO1 (1UL << 4)
#define NVCTL_GPIO2 (1UL << 5)
#define NVCTL_CB_MODE (1UL << 6)
#define NVCTL_IPG_DLY 7
#define EECTL_ENABLE (1UL << 0)
#define EECTL_EECS (1UL << 1)
#define EECTL_EESK (1UL << 2)
#define EECTL_EEDI (1UL << 3)
#define EECTL_EEDO (1UL << 4)
#define EECTL_EERDY (1UL << 5)
#define EECTL_SIZE (1UL << 6)
#define TEST_CLOCK (1UL << 3)
#define MMCTL_READ (1UL << 0)
#define MMCTL_WRITE (1UL << 1)
#define MMCTL_RESPONDER (1UL << 3)
#define MMCTL_PHYREG 4
#define MMCTL_PHYADDR 9
#define MMCFG_SME (1UL << 0)
#define MMCFG_EN694 (1UL << 1)
#define MMCFG_694LNK (1UL << 2)
#define MMCFG_PHY (1UL << 3)
#define MMCFG_SMI (1UL << 4)
#define MMCFG_ALTCS (1UL << 5)
#define MMCFG_ALTDATA (1UL << 6)
#define MMCFG_STXC (1UL << 14)
#define MMCFG_SNTXC (1UL << 15)
#define RXCON_SEP (1UL << 0)
#define RXCON_RRF (1UL << 1)
#define RXCON_RBF (1UL << 2)
#define RXCON_RMF (1UL << 3)
#define RXCON_RIIA (1UL << 4)
#define RXCON_PROMISC (1UL << 5)
#define RXCON_MONITOR (1UL << 6)
#define RXCON_ERE (1UL << 7)
#define RXCON_EB_INT (0UL << 8)
#define RXCON_EB_16K (1UL << 8)
#define RXCON_EB_32K (2UL << 8)
#define RXCON_EB_128K (3UL << 8)
#define RXSTAT_PRI (1UL << 0)
#define RXSTAT_FAE (1UL << 1)
#define RXSTAT_CRC (1UL << 2)
#define RXSTAT_MP (1UL << 3)
#define RXSTAT_MAR (1UL << 4)
#define RXSTAT_BAR (1UL << 5)
#define RXSTAT_RD (1UL << 6)
#define RXSTAT_NSV (1UL << 12)
#define RXSTAT_FLE (1UL << 13)
#define RXSTAT_HC (1UL << 14)
#define RXSTAT_OWNER (1UL << 15)
#define RXCTL_FRAGLIST (1UL << 0)
#define RXCTL_LFFORM (1UL << 1)
#define RXCTL_HEADER (1UL << 2)
#define TXCON_ETE (1UL << 0)
#define TXCON_LB_0 (0UL << 1)
#define TXCON_LB_1 (1UL << 1)
#define TXCON_LB_2 (2UL << 1)
#define TXCON_LB_3 (3UL << 1)
#define TXCON_SLOT 3
#define TXSTAT_PTX (1UL << 0)
#define TXSTAT_ND (1UL << 1)
#define TXSTAT_COLL (1UL << 2)
#define TXSTAT_CSL (1UL << 3)
#define TXSTAT_UFLO (1UL << 4)
#define TXSTAT_CDH (1UL << 5)
#define TXSTAT_OWC (1UL << 6)
#define TXSTAT_DEFER (1UL << 7)
#define TXSTAT_CCNT 8
#define TXSTAT_CCNTMASK 0x1F
#define TXSTAT_EXCOLL (1UL << 12)
#define TXSTAT_OWNER (1UL << 15)
#define TXCTL_FRAGLIST (1UL << 0)
#define TXCTL_LFFORM (1UL << 1)
#define TXCTL_IAF (1UL << 2)
#define TXCTL_NOCRC (1UL << 3)
#define TXCTL_LASTDESCR (1UL << 4)
#define GETCSR(efep, reg) \
ddi_get32((efep)->efe_regs_acch, \
(efep)->efe_regs + ((reg) / sizeof (uint32_t)))
#define PUTCSR(efep, reg, val) \
ddi_put32((efep)->efe_regs_acch, \
(efep)->efe_regs + ((reg) / sizeof (uint32_t)), (val))
#define CLRBIT(efep, reg, bit) \
PUTCSR(efep, reg, (GETCSR(efep, reg) & ~(bit)))
#define SETBIT(efep, reg, bit) \
PUTCSR(efep, reg, (GETCSR(efep, reg) | (bit)))
#define DESCSZ(x) (sizeof (efe_desc_t) * (x))
#define BUFPSZ(x) (sizeof (efe_buf_t *) * (x))
#define DESCADDR(rp, x) ((rp)->r_dmac.dmac_address + DESCSZ(x))
#define DESCLEN(rp) ((rp)->r_len)
#define BUFADDR(bp) ((bp)->b_dmac.dmac_address)
#define BUFLEN(bp) ((bp)->b_len)
#define NEXTDESC(rp, x) (((x) + 1) % (rp)->r_len)
#define NEXTDESCADDR(rp, x) DESCADDR(rp, NEXTDESC(rp, x))
#define GETDESC(rp, x) (&(rp)->r_descp[(x)])
#define GETDESC16(rp, addr) \
ddi_get16((rp)->r_acch, (addr))
#define PUTDESC16(rp, addr, val) \
ddi_put16((rp)->r_acch, (addr), (val))
#define GETDESC32(rp, addr) \
ddi_get32((rp)->r_acch, (addr))
#define PUTDESC32(rp, addr, val) \
ddi_put32((rp)->r_acch, (addr), (val))
#define SYNCDESC(rp, x, type) \
(void) ddi_dma_sync((rp)->r_dmah, DESCSZ(x), \
sizeof (efe_desc_t), (type))
#define GETBUF(rp, x) ((rp)->r_bufpp[(x)])
#define SYNCBUF(bp, type) \
(void) ddi_dma_sync((bp)->b_dmah, 0, (bp)->b_len, (type))
typedef struct {
uint16_t d_status;
uint16_t d_len;
uint32_t d_bufaddr;
uint16_t d_buflen;
uint16_t d_control;
uint32_t d_next;
} efe_desc_t;
typedef struct {
ddi_dma_handle_t b_dmah;
ddi_acc_handle_t b_acch;
ddi_dma_cookie_t b_dmac;
size_t b_len;
caddr_t b_kaddr;
} efe_buf_t;
typedef struct {
ddi_dma_handle_t r_dmah;
ddi_acc_handle_t r_acch;
ddi_dma_cookie_t r_dmac;
size_t r_len;
efe_desc_t *r_descp;
efe_buf_t **r_bufpp;
} efe_ring_t;
typedef struct {
dev_info_t *efe_dip;
mii_handle_t efe_miih;
mac_handle_t efe_mh;
uint32_t *efe_regs;
ddi_acc_handle_t efe_regs_acch;
ddi_intr_handle_t efe_intrh;
kmutex_t efe_intrlock;
kmutex_t efe_txlock;
int efe_flags;
boolean_t efe_promisc;
uint8_t efe_macaddr[ETHERADDRL];
uint_t efe_mccount[MCHASHL];
uint16_t efe_mchash[MCHASHL / MCHASHSZ];
efe_ring_t *efe_rx_ring;
uint_t efe_rx_desc;
efe_ring_t *efe_tx_ring;
uint_t efe_tx_desc;
uint_t efe_tx_sent;
uint64_t efe_multircv;
uint64_t efe_brdcstrcv;
uint64_t efe_multixmt;
uint64_t efe_brdcstxmt;
uint64_t efe_norcvbuf;
uint64_t efe_ierrors;
uint64_t efe_noxmtbuf;
uint64_t efe_oerrors;
uint64_t efe_collisions;
uint64_t efe_rbytes;
uint64_t efe_ipackets;
uint64_t efe_obytes;
uint64_t efe_opackets;
uint64_t efe_uflo;
uint64_t efe_oflo;
uint64_t efe_align_errors;
uint64_t efe_fcs_errors;
uint64_t efe_first_collisions;
uint64_t efe_tx_late_collisions;
uint64_t efe_defer_xmts;
uint64_t efe_ex_collisions;
uint64_t efe_macxmt_errors;
uint64_t efe_carrier_errors;
uint64_t efe_toolong_errors;
uint64_t efe_macrcv_errors;
uint64_t efe_runt_errors;
uint64_t efe_jabber_errors;
} efe_t;
#ifdef __cplusplus
}
#endif
#endif