#include <sys/rndsource.h>
#define RTK_ETHER_ALIGN 2
#define RTK_RXSTAT_LEN 4
#ifdef __NO_STRICT_ALIGNMENT
#define RE_ETHER_ALIGN 0
#else
#define RE_ETHER_ALIGN 2
#endif
struct rtk_type {
uint16_t rtk_vid;
uint16_t rtk_did;
int rtk_basetype;
#define RTK_8129 1
#define RTK_8139 2
#define RTK_8139CPLUS 3
#define RTK_8169 4
#define RTK_8168 5
#define RTK_8101E 6
const char *rtk_name;
};
struct rtk_mii_frame {
uint8_t mii_stdelim;
uint8_t mii_opcode;
uint8_t mii_phyaddr;
uint8_t mii_regaddr;
uint8_t mii_turnaround;
uint16_t mii_data;
};
#define RTK_MII_STARTDELIM 0x01
#define RTK_MII_READOP 0x02
#define RTK_MII_WRITEOP 0x01
#define RTK_MII_TURNAROUND 0x02
#ifdef dreamcast
#define RTK_RX_BUF_SZ RTK_RXBUF_16
#else
#define RTK_RX_BUF_SZ RTK_RXBUF_64
#endif
#define RTK_RXBUFLEN RTK_RXBUF_LEN(RTK_RX_BUF_SZ)
#define RTK_TX_LIST_CNT 4
#define RE_RING_ALIGN 256
#define RE_RX_DESC_CNT_8139 64
#define RE_TX_DESC_CNT_8139 64
#define RE_RX_DESC_CNT_8169 256
#define RE_TX_DESC_CNT_8169 1024
#define RE_NTXDESC_RSVD 4
struct re_rxsoft {
struct mbuf *rxs_mbuf;
bus_dmamap_t rxs_dmamap;
};
struct re_txq {
struct mbuf *txq_mbuf;
bus_dmamap_t txq_dmamap;
int txq_descidx;
int txq_nsegs;
};
struct re_list_data {
struct re_txq re_txq[RE_TX_DESC_CNT_8169];
int re_txq_considx;
int re_txq_prodidx;
int re_txq_free;
bus_dmamap_t re_tx_list_map;
struct re_desc *re_tx_list;
int re_tx_free;
int re_tx_nextfree;
int re_tx_desc_cnt;
bus_dma_segment_t re_tx_listseg;
int re_tx_listnseg;
struct re_rxsoft re_rxsoft[RE_RX_DESC_CNT_8169];
int re_rx_desc_cnt;
bus_dmamap_t re_rx_list_map;
struct re_desc *re_rx_list;
int re_rx_prodidx;
bus_dma_segment_t re_rx_listseg;
int re_rx_listnseg;
};
struct rtk_tx_desc {
SIMPLEQ_ENTRY(rtk_tx_desc) txd_q;
struct mbuf *txd_mbuf;
bus_dmamap_t txd_dmamap;
bus_addr_t txd_txaddr;
bus_addr_t txd_txstat;
};
struct rtk_softc {
device_t sc_dev;
struct ethercom ethercom;
struct mii_data mii;
uint32_t sc_hwrev;
struct callout rtk_tick_ch;
bus_space_tag_t rtk_btag;
bus_space_handle_t rtk_bhandle;
bus_size_t rtk_bsize;
u_int sc_quirk;
#define RTKQ_8129 0x00000001
#define RTKQ_8139CPLUS 0x00000002
#define RTKQ_8169NONS 0x00000004
#define RTKQ_PCIE 0x00000008
#define RTKQ_MACLDPS 0x00000010
#define RTKQ_DESCV2 0x00000020
#define RTKQ_NOJUMBO 0x00000040
#define RTKQ_NOEECMD 0x00000080
#define RTKQ_MACSTAT 0x00000100
#define RTKQ_CMDSTOP 0x00000200
#define RTKQ_PHYWAKE_PM 0x00000400
#define RTKQ_RXDV_GATED 0x00000800
#define RTKQ_IM_HW 0x00001000
#define RTKQ_TXRXEN_LATER 0x00002000
#define RTKQ_EARLYOFF 0x00004000
bus_dma_tag_t sc_dmat;
bus_dma_segment_t sc_dmaseg;
int sc_dmanseg;
bus_dmamap_t recv_dmamap;
uint8_t *rtk_rx_buf;
struct rtk_tx_desc rtk_tx_descs[RTK_TX_LIST_CNT];
SIMPLEQ_HEAD(, rtk_tx_desc) rtk_tx_free;
SIMPLEQ_HEAD(, rtk_tx_desc) rtk_tx_dirty;
struct re_list_data re_ldata;
struct mbuf *re_head;
struct mbuf *re_tail;
uint32_t re_rxlenmask;
int re_testmode;
int sc_flags;
#define RTK_ATTACHED 0x00000001
#define RTK_ENABLED 0x00000002
#define RTK_IS_ENABLED(sc) ((sc)->sc_flags & RTK_ENABLED)
int sc_txthresh;
int sc_rev;
int (*sc_enable) (struct rtk_softc *);
void (*sc_disable) (struct rtk_softc *);
krndsource_t rnd_source;
kmutex_t sc_lock;
u_short sc_if_flags;
};
#define RE_TX_DESC_CNT(sc) ((sc)->re_ldata.re_tx_desc_cnt)
#define RE_TX_LIST_SZ(sc) (RE_TX_DESC_CNT(sc) * sizeof(struct re_desc))
#define RE_NEXT_TX_DESC(sc, x) (((x) + 1) & (RE_TX_DESC_CNT(sc) - 1))
#define RE_RX_DESC_CNT(sc) ((sc)->re_ldata.re_rx_desc_cnt)
#define RE_RX_LIST_SZ (RE_RX_DESC_CNT(sc) * sizeof(struct re_desc))
#define RE_NEXT_RX_DESC(sc, x) (((x) + 1) & (RE_RX_DESC_CNT(sc) - 1))
#define RE_TX_QLEN(sc) 256
#define RE_NEXT_TXQ(sc, x) (((x) + 1) & (RE_TX_QLEN(sc) - 1))
#define RE_TXDESCSYNC(sc, idx, ops) \
bus_dmamap_sync((sc)->sc_dmat, \
(sc)->re_ldata.re_tx_list_map, \
sizeof(struct re_desc) * (idx), \
sizeof(struct re_desc), \
(ops))
#define RE_RXDESCSYNC(sc, idx, ops) \
bus_dmamap_sync((sc)->sc_dmat, \
(sc)->re_ldata.re_rx_list_map, \
sizeof(struct re_desc) * (idx), \
sizeof(struct re_desc), \
(ops))
#define RE_IP4CSUMTX_MINLEN 28
#define RE_IP4CSUMTX_PADLEN (ETHER_HDR_LEN + RE_IP4CSUMTX_MINLEN)
#define RE_RX_DMAMEM_SZ (RE_RX_LIST_SZ + RE_IP4CSUMTX_PADLEN)
#define RE_TXPADOFF RE_RX_LIST_SZ
#define RE_TXPADDADDR(sc) \
((sc)->re_ldata.re_rx_list_map->dm_segs[0].ds_addr + RE_TXPADOFF)
#define RTK_TXTH_MAX RTK_TXTH_1536
#define CSR_WRITE_4(sc, reg, val) \
bus_space_write_4(sc->rtk_btag, sc->rtk_bhandle, reg, val)
#define CSR_WRITE_2(sc, reg, val) \
bus_space_write_2(sc->rtk_btag, sc->rtk_bhandle, reg, val)
#define CSR_WRITE_1(sc, reg, val) \
bus_space_write_1(sc->rtk_btag, sc->rtk_bhandle, reg, val)
#define CSR_READ_4(sc, reg) \
bus_space_read_4(sc->rtk_btag, sc->rtk_bhandle, reg)
#define CSR_READ_2(sc, reg) \
bus_space_read_2(sc->rtk_btag, sc->rtk_bhandle, reg)
#define CSR_READ_1(sc, reg) \
bus_space_read_1(sc->rtk_btag, sc->rtk_bhandle, reg)
#define RTK_TIMEOUT 1000
#define RTK_PCI_LOIO 0x10
#define RTK_PCI_LOMEM 0x14
#ifdef _KERNEL
uint16_t rtk_read_eeprom(struct rtk_softc *, int, int);
void rtk_setmulti(struct rtk_softc *);
void rtk_attach(struct rtk_softc *);
int rtk_detach(struct rtk_softc *);
int rtk_activate(device_t, enum devact);
int rtk_intr(void *);
#endif