#ifndef _DWC_EQOS_VAR_H
#define _DWC_EQOS_VAR_H
#include <sys/queue.h>
#include <sys/workqueue.h>
#include <dev/ic/dwc_eqos_reg.h>
#define EQOS_DMA_DESC_COUNT 256
#define EQOS_DMA_RXBUF_COUNT (EQOS_DMA_DESC_COUNT * 2)
#define EQOS_DMA_PBL_DEFAULT 8
struct eqos_rxbuf {
struct eqos_softc *sc;
void *vaddr;
bus_addr_t paddr;
SLIST_ENTRY(eqos_rxbuf) next;
};
struct eqos_bufmap {
bus_dmamap_t map;
struct mbuf *mbuf;
};
struct eqos_ring {
struct eqos_softc *sc;
bus_dmamap_t desc_map;
bus_dma_segment_t desc_dmaseg;
struct eqos_dma_desc *desc_ring;
bus_addr_t desc_ring_paddr;
struct eqos_bufmap buf_map[EQOS_DMA_DESC_COUNT];
u_int cur, next, queued, count;
};
struct eqos_rxdata {
bus_dmamap_t map;
bus_dma_segment_t seg;
void *vaddr;
bus_addr_t paddr;
struct eqos_rxbuf rxbuf[EQOS_DMA_RXBUF_COUNT];
SLIST_HEAD(, eqos_rxbuf) freelist;
kmutex_t freelist_mtx;
};
struct eqos_softc {
device_t sc_dev;
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
bus_dma_tag_t sc_dmat;
int sc_phy_id;
uint32_t sc_csr_clock;
uint32_t sc_clock_range;
uint32_t sc_hw_feature[4];
uint32_t sc_dma_txpbl;
uint32_t sc_dma_rxpbl;
struct ethercom sc_ec;
struct mii_data sc_mii;
callout_t sc_stat_ch;
kmutex_t sc_lock;
kmutex_t sc_txlock;
u_short sc_if_flags;
bool sc_txrunning;
struct eqos_ring sc_tx;
struct eqos_ring sc_rx;
struct eqos_rxdata sc_rxdata;
struct workqueue *sc_wq;
struct work sc_rxwork;
void *sc_tx_si;
bool sc_rx_discarding;
struct mbuf *sc_rx_receiving_m;
struct mbuf *sc_rx_receiving_m_last;
krndsource_t sc_rndsource;
struct sysctllog *sc_sysctllog;
uint32_t sc_debug;
struct evcnt sc_ev_intr;
struct evcnt sc_ev_rxintr;
struct evcnt sc_ev_txintr;
struct evcnt sc_ev_mac;
struct evcnt sc_ev_mtl;
struct evcnt sc_ev_mtl_debugdata;
struct evcnt sc_ev_mtl_rxovfis;
struct evcnt sc_ev_mtl_txovfis;
struct evcnt sc_ev_status;
struct evcnt sc_ev_rwt;
struct evcnt sc_ev_excol;
struct evcnt sc_ev_lcol;
struct evcnt sc_ev_exdef;
struct evcnt sc_ev_lcarr;
struct evcnt sc_ev_ncarr;
struct evcnt sc_ev_tjt;
};
int eqos_attach(struct eqos_softc *);
int eqos_intr(void *);
#endif