#ifndef _IF_CASVAR_H
#define _IF_CASVAR_H
#include <sys/queue.h>
#include <sys/timeout.h>
#define CAS_PAGE_SIZE 8192
#define CAS_NTXSEGS 16
#define CAS_TXQUEUELEN 64
#define CAS_NTXDESC (CAS_TXQUEUELEN * CAS_NTXSEGS)
#define CAS_NTXDESC_MASK (CAS_NTXDESC - 1)
#define CAS_NEXTTX(x) ((x + 1) & CAS_NTXDESC_MASK)
struct cas_sxd {
struct mbuf *sd_mbuf;
bus_dmamap_t sd_map;
};
#define CAS_NRXDESC 128
#define CAS_NRXDESC_MASK (CAS_NRXDESC - 1)
#define CAS_NRXCOMP 256
#define CAS_NRXCOMP_MASK (CAS_NRXCOMP - 1)
#define CAS_NEXTRX(x) ((x + 1) & CAS_NRXCOMP_MASK)
struct cas_control_data {
struct cas_desc ccd_txdescs[CAS_NTXDESC];
struct cas_comp ccd_rxcomps[CAS_NRXCOMP];
struct cas_desc ccd_rxdescs[CAS_NRXDESC];
char ccd_unused[CAS_PAGE_SIZE - CAS_NRXDESC * 16];
struct cas_desc ccd_rxdescs2[CAS_NRXDESC];
};
#define CAS_CDOFF(x) offsetof(struct cas_control_data, x)
#define CAS_CDTXOFF(x) CAS_CDOFF(ccd_txdescs[(x)])
#define CAS_CDRXOFF(x) CAS_CDOFF(ccd_rxdescs[(x)])
#define CAS_CDRXOFF2(x) CAS_CDOFF(ccd_rxdescs2[(x)])
#define CAS_CDRXCOFF(x) CAS_CDOFF(ccd_rxcomps[(x)])
struct cas_rxsoft {
bus_dmamap_t rxs_dmamap;
bus_dma_segment_t rxs_dmaseg;
caddr_t rxs_kva;
};
struct cas_softc {
struct device sc_dev;
struct arpcom sc_arpcom;
struct mii_data sc_mii;
#define sc_media sc_mii.mii_media
struct timeout sc_tick_ch;
bus_space_tag_t sc_memt;
bus_space_handle_t sc_memh;
void *sc_ih;
bus_dma_tag_t sc_dmatag;
bus_dmamap_t sc_dmamap;
int sc_burst;
int sc_phys[2];
int sc_mif_config;
bus_dma_segment_t sc_cdseg;
int sc_cdnseg;
bus_dmamap_t sc_cddmamap;
#define sc_cddma sc_cddmamap->dm_segs[0].ds_addr
struct cas_sxd sc_txd[CAS_NTXDESC];
u_int32_t sc_tx_cnt, sc_tx_prod, sc_tx_cons;
struct cas_rxsoft sc_rxsoft[CAS_NRXDESC];
struct cas_rxsoft sc_rxsoft2[CAS_NRXDESC];
struct cas_control_data *sc_control_data;
#define sc_txdescs sc_control_data->ccd_txdescs
#define sc_rxdescs sc_control_data->ccd_rxdescs
#define sc_rxdescs2 sc_control_data->ccd_rxdescs2
#define sc_rxcomps sc_control_data->ccd_rxcomps
int sc_rxptr;
int sc_rxfifosize;
int sc_rxdptr;
int sc_rev;
int sc_inited;
int sc_debug;
};
#define CAS_PLUS(sc) (sc->sc_rev > 0x10)
#define CAS_DMA_READ(v) letoh64(v)
#define CAS_DMA_WRITE(v) htole64(v)
#define CAS_CDTXADDR(sc, x) ((sc)->sc_cddma + CAS_CDTXOFF((x)))
#define CAS_CDRXADDR(sc, x) ((sc)->sc_cddma + CAS_CDRXOFF((x)))
#define CAS_CDRXADDR2(sc, x) ((sc)->sc_cddma + CAS_CDRXOFF2((x)))
#define CAS_CDRXCADDR(sc, x) ((sc)->sc_cddma + CAS_CDRXCOFF((x)))
#define CAS_CDTXSYNC(sc, x, n, ops) \
do { \
int __x, __n; \
\
__x = (x); \
__n = (n); \
\
\
if ((__x + __n) > CAS_NTXDESC) { \
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
CAS_CDTXOFF(__x), sizeof(struct cas_desc) * \
(CAS_NTXDESC - __x), (ops)); \
__n -= (CAS_NTXDESC - __x); \
__x = 0; \
} \
\
\
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
CAS_CDTXOFF(__x), sizeof(struct cas_desc) * __n, (ops)); \
} while (0)
#define CAS_CDRXSYNC(sc, x, ops) \
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
CAS_CDRXOFF((x)), sizeof(struct cas_desc), (ops))
#define CAS_CDRXCSYNC(sc, x, ops) \
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
CAS_CDRXCOFF((x)), sizeof(struct cas_desc), (ops))
#define CAS_INIT_RXDESC(sc, d, s) \
do { \
struct cas_rxsoft *__rxs = &sc->sc_rxsoft[(s)]; \
struct cas_desc *__rxd = &sc->sc_rxdescs[(d)]; \
\
__rxd->cd_addr = \
CAS_DMA_WRITE(__rxs->rxs_dmamap->dm_segs[0].ds_addr); \
__rxd->cd_flags = \
CAS_DMA_WRITE((s)); \
CAS_CDRXSYNC((sc), (d), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
} while (0)
#endif