#ifndef _IF_GEMVAR_H
#define _IF_GEMVAR_H
#include <sys/queue.h>
#include <sys/timeout.h>
#define GEM_NTXSEGS 16
#define GEM_TXQUEUELEN 64
#define GEM_NTXDESC (GEM_TXQUEUELEN * GEM_NTXSEGS)
#define GEM_NTXDESC_MASK (GEM_NTXDESC - 1)
#define GEM_NEXTTX(x) ((x + 1) & GEM_NTXDESC_MASK)
struct gem_sxd {
struct mbuf *sd_mbuf;
bus_dmamap_t sd_map;
};
#define GEM_NRXDESC 128
#define GEM_NRXDESC_MASK (GEM_NRXDESC - 1)
#define GEM_NEXTRX(x) ((x + 1) & GEM_NRXDESC_MASK)
struct gem_control_data {
struct gem_desc gcd_txdescs[GEM_NTXDESC];
struct gem_desc gcd_rxdescs[GEM_NRXDESC];
};
#define GEM_CDOFF(x) offsetof(struct gem_control_data, x)
#define GEM_CDTXOFF(x) GEM_CDOFF(gcd_txdescs[(x)])
#define GEM_CDRXOFF(x) GEM_CDOFF(gcd_rxdescs[(x)])
struct gem_rxsoft {
struct mbuf *rxs_mbuf;
bus_dmamap_t rxs_dmamap;
};
struct gem_txthresh_tab {
u_int32_t txth_opmode;
const char *txth_name;
};
struct gem_stats {
u_long ts_tx_uf;
u_long ts_tx_to;
u_long ts_tx_ec;
u_long ts_tx_lc;
};
struct gem_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;
void *sc_ih;
bus_space_tag_t sc_bustag;
bus_dma_tag_t sc_dmatag;
bus_dmamap_t sc_dmamap;
bus_space_handle_t sc_h1;
bus_space_handle_t sc_h2;
#if 0
bus_space_handle_t sc_seb;
bus_space_handle_t sc_erx;
bus_space_handle_t sc_etx;
bus_space_handle_t sc_mac;
bus_space_handle_t sc_mif;
#endif
int sc_burst;
int sc_mif_config;
int sc_pci;
u_int sc_variant;
#define GEM_UNKNOWN 0
#define GEM_SUN_GEM 1
#define GEM_SUN_ERI 2
#define GEM_APPLE_GMAC 3
#define GEM_APPLE_K2_GMAC 4
#define GEM_IS_APPLE(sc) \
((sc)->sc_variant == GEM_APPLE_GMAC || \
(sc)->sc_variant == GEM_APPLE_K2_GMAC)
u_int sc_flags;
#define GEM_GIGABIT 0x0001
struct gem_stats sc_stats;
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 gem_sxd sc_txd[GEM_NTXDESC];
u_int32_t sc_tx_cnt, sc_tx_prod, sc_tx_cons;
struct gem_rxsoft sc_rxsoft[GEM_NRXDESC];
struct if_rxring sc_rx_ring;
u_int32_t sc_rx_prod, sc_rx_cons;
struct gem_control_data *sc_control_data;
#define sc_txdescs sc_control_data->gcd_txdescs
#define sc_rxdescs sc_control_data->gcd_rxdescs
int sc_txfree;
int sc_txnext;
u_int32_t sc_tdctl_ch;
u_int32_t sc_tdctl_er;
u_int32_t sc_setup_fsls;
int sc_rxfifosize;
u_int32_t sc_rx_fifo_wr_ptr;
u_int32_t sc_rx_fifo_rd_ptr;
struct timeout sc_rx_watchdog;
int sc_inited;
int sc_debug;
void (*sc_hwreset)(struct gem_softc *);
void (*sc_hwinit)(struct gem_softc *);
};
#define GEM_DMA_READ(_sc, _a) \
(((_sc)->sc_pci) ? lemtoh64(_a) : bemtoh64(_a))
#define GEM_DMA_WRITE(_sc, _a, _v) \
(((_sc)->sc_pci) ? htolem64((_a), (_v)) : htobem64((_a), (_v)))
#define GEM_MEDIA_NEEDSRESET(sc, newbits) \
(((sc)->sc_opmode & OPMODE_MEDIA_BITS) != \
((newbits) & OPMODE_MEDIA_BITS))
#define GEM_CDTXADDR(sc, x) ((sc)->sc_cddma + GEM_CDTXOFF((x)))
#define GEM_CDRXADDR(sc, x) ((sc)->sc_cddma + GEM_CDRXOFF((x)))
#define GEM_CDSPADDR(sc) ((sc)->sc_cddma + GEM_CDSPOFF)
#define GEM_CDTXSYNC(sc, x, n, ops) \
do { \
int __x, __n; \
\
__x = (x); \
__n = (n); \
\
\
if ((__x + __n) > GEM_NTXDESC) { \
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
GEM_CDTXOFF(__x), sizeof(struct gem_desc) * \
(GEM_NTXDESC - __x), (ops)); \
__n -= (GEM_NTXDESC - __x); \
__x = 0; \
} \
\
\
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
GEM_CDTXOFF(__x), sizeof(struct gem_desc) * __n, (ops)); \
} while (0)
#define GEM_CDRXSYNC(sc, x, ops) \
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
GEM_CDRXOFF((x)), sizeof(struct gem_desc), (ops))
#define GEM_CDSPSYNC(sc, ops) \
bus_dmamap_sync((sc)->sc_dmatag, (sc)->sc_cddmamap, \
GEM_CDSPOFF, GEM_SETUP_PACKET_LEN, (ops))
#define GEM_INIT_RXDESC(sc, x) \
do { \
struct gem_rxsoft *__rxs = &sc->sc_rxsoft[(x)]; \
struct gem_desc *__rxd = &sc->sc_rxdescs[(x)]; \
struct mbuf *__m = __rxs->rxs_mbuf; \
\
GEM_DMA_WRITE((sc), &__rxd->gd_addr, \
__rxs->rxs_dmamap->dm_segs[0].ds_addr); \
GEM_DMA_WRITE((sc), &__rxd->gd_flags, \
(((__m->m_ext.ext_size)<<GEM_RD_BUFSHIFT) \
& GEM_RD_BUFSIZE) | GEM_RD_OWN); \
GEM_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
} while (0)
#ifdef _KERNEL
int gem_intr(void *);
int gem_mediachange(struct ifnet *);
void gem_mediastatus(struct ifnet *, struct ifmediareq *);
void gem_config(struct gem_softc *);
void gem_unconfig(struct gem_softc *);
void gem_reset(struct gem_softc *);
int gem_intr(void *);
#endif
#endif