diff options
Diffstat (limited to 'sys/dev/pci/if_wxvar.h')
-rw-r--r-- | sys/dev/pci/if_wxvar.h | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/sys/dev/pci/if_wxvar.h b/sys/dev/pci/if_wxvar.h new file mode 100644 index 00000000000..ece97e9eb73 --- /dev/null +++ b/sys/dev/pci/if_wxvar.h @@ -0,0 +1,407 @@ +/* $OpenBSD: if_wxvar.h,v 1.1 2000/02/11 14:51:50 jason Exp $ */ + +/* + * Copyright (c) 1999, Traakan Software + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/pci/if_wxvar.h,v 1.4 2000/01/23 03:18:14 mjacob Exp $ + */ + +/* + * Softc definitions for the Intel Gigabit Ethernet driver. + * + * Guidance and inspiration from David Greenman's + * if_fxp driver gratefully acknowledged here. + */ + +/* + * Platform specific defines and inline functions go here. + * Look further below for more generic structures. + */ + +#if defined(__NetBSD__) +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <sys/errno.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/device.h> +#include <net/if.h> +#if defined(SIOCSIFMEDIA) +#include <net/if_media.h> +#endif +#include <net/if_types.h> +#include <net/if_dl.h> +#include <net/route.h> +#include <net/netisr.h> + +#include "bpfilter.h" +#if NBPFILTER > 0 +#include <net/bpf.h> +#include <net/bpfdesc.h> +#endif + +#ifdef INET +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/in_var.h> +#include <netinet/ip.h> +#endif +#ifdef NS +#include <netns/ns.h> +#include <netns/ns_if.h> +#endif +#include <vm/vm.h> +#include <vm/vm_param.h> +#include <vm/vm_kern.h> +#include <net/if_ether.h> +#if defined(INET) +#include <netinet/if_inarp.h> +#endif +#include <machine/bus.h> +#include <machine/intr.h> +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/pcidevs.h> +#include <dev/pci/if_wxreg.h> + +struct wxmdvar { + struct device dev; /* generic device structures */ + void * ih; /* interrupt handler cookie */ + struct ethercom ethercom; /* ethernet common part */ + pci_chipset_tag_t pci_pc; + pcitag_t pci_tag; + u_int8_t enaddr[6]; /* our mac address */ + u_int32_t cmdw; + bus_space_tag_t st; /* bus space tag */ + bus_space_handle_t sh; /* bus space handle */ + struct ifmedia ifm; + struct wx_softc * next; +}; +#define wx_dev w.dev +#define wx_enaddr w.enaddr +#define wx_cmdw w.cmdw +#define wx_media w.ifm +#define wx_next w.next + +#define wx_if w.ethercom.ec_if +#define wx_name w.dev.dv_xname + +#define IOCTL_CMD_TYPE u_long +#define WXMALLOC(len) malloc(len, M_DEVBUF, M_NOWAIT) +#define WXFREE(ptr) free(ptr, M_DEVBUF) +#define SOFTC_IFP(ifp) ifp->if_softc +#define WX_BPFTAP_ARG(ifp) (ifp)->if_bpf +#define TIMEOUT(sc, func, arg, time) timeout(func, arg, time) +#define VTIMEOUT(sc, func, arg, time) timeout(func, arg, time) +#define UNTIMEOUT(f, arg, sc) untimeout(f, arg) +#define INLINE inline + +#define vm_offset_t vaddr_t +#ifndef IFM_1000_SX +#define IFM_1000_SX IFM_1000_FX +#endif +#define READ_CSR _read_csr +#define WRITE_CSR _write_csr + +#elif defined(__FreeBSD__) +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/if_media.h> +#ifdef NS +#include <netns/ns.h> +#include <netns/ns_if.h> +#endif +#include <net/bpf.h> +#include <sys/sockio.h> +#include <sys/bus.h> +#include <machine/bus.h> +#include <sys/rman.h> +#include <machine/resource.h> +#include <net/ethernet.h> +#include <net/if_arp.h> +#include <vm/vm.h> +#include <vm/pmap.h> +#include <machine/clock.h> +#include <pci/pcivar.h> +#include <pci/pcireg.h> +#include <pci/if_wxreg.h> + +#include "opt_bdg.h" +#ifdef BRIDGE +#include <net/if_types.h> +#include <net/bridge.h> +#endif + +struct wxmdvar { + struct device * dev; /* backpointer to device */ + struct arpcom arpcom; /* per-interface network data */ + struct resource * mem; /* resource descriptor for registers */ + struct resource * irq; /* resource descriptor for interrupt */ + void * ih; /* interrupt handler cookie */ + u_int16_t cmdw; + struct callout_handle sch; /* handle for timeouts */ + char name[8]; + bus_space_tag_t st; /* bus space tag */ + bus_space_handle_t sh; /* bus space handle */ + struct ifmedia ifm; + struct wx_softc * next; +}; +#define wx_dev w.dev +#define wx_enaddr w.arpcom.ac_enaddr +#define wx_cmdw w.cmdw +#define wx_media w.ifm +#define wx_next w.next + +#define wx_if w.arpcom.ac_if +#define wx_name w.name + +#define IOCTL_CMD_TYPE u_long +#define WXMALLOC(len) malloc(len, M_DEVBUF, M_NOWAIT) +#define WXFREE(ptr) free(ptr, M_DEVBUF) +#define SOFTC_IFP(ifp) ifp->if_softc +#define WX_BPFTAP_ARG(ifp) ifp +#define VTIMEOUT(sc, func, arg, time) (void) timeout(func, arg, time) +#define TIMEOUT(sc, func, arg, time) (sc)->w.sch = timeout(func, arg, time) +#define UNTIMEOUT(f, arg, sc) untimeout(f, arg, (sc)->w.sch) +#define INLINE __inline + +#define READ_CSR(sc, reg) \ + bus_space_read_4((sc)->w.st, (sc)->w.sh, (reg)) +#define WRITE_CSR(sc, reg, val) \ + bus_space_write_4((sc)->w.st, (sc)->w.sh, (reg), (val)) + +#elif defined(__OpenBSD__) +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <sys/errno.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/device.h> + +#include <net/if.h> +#include <net/if_dl.h> +#include <net/if_types.h> +#include <net/if_media.h> + +#ifdef INET +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/in_var.h> +#include <netinet/ip.h> +#include <netinet/if_ether.h> +#endif +#ifdef NS +#include <netns/ns.h> +#include <netns/ns_if.h> +#endif + +#include "bpfilter.h" +#if NBPFILTER > 0 +#include <net/bpf.h> +#include <net/bpfdesc.h> +#endif + +#include <vm/vm.h> +#include <vm/vm_param.h> +#include <vm/vm_kern.h> +#include <machine/bus.h> +#include <machine/intr.h> +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/pcidevs.h> +#include <dev/pci/if_wxreg.h> + +struct wxmdvar { + struct device dev; /* generic device structures */ + void * ih; /* interrupt handler cookie */ + struct arpcom arpcom; /* ethernet common part */ + pci_chipset_tag_t pci_pc; + pcitag_t pci_tag; + u_int32_t cmdw; + bus_space_tag_t st; /* bus space tag */ + bus_space_handle_t sh; /* bus space handle */ + struct ifmedia ifm; + struct wx_softc * next; +}; +#define wx_dev w.dev +#define wx_enaddr w.arpcom.ac_enaddr +#define wx_cmdw w.cmdw +#define wx_media w.ifm +#define wx_next w.next + +#define wx_if w.arpcom.ac_if +#define wx_name w.dev.dv_xname + +#define IOCTL_CMD_TYPE u_long +#define WXMALLOC(len) malloc(len, M_DEVBUF, M_NOWAIT) +#define WXFREE(ptr) free(ptr, M_DEVBUF) +#define SOFTC_IFP(ifp) ifp->if_softc +#define WX_BPFTAP_ARG(ifp) (ifp)->if_bpf +#define TIMEOUT(sc, func, arg, time) timeout(func, arg, time) +#define VTIMEOUT(sc, func, arg, time) timeout(func, arg, time) +#define UNTIMEOUT(f, arg, sc) untimeout(f, arg) +#define INLINE inline + +#define vm_offset_t vaddr_t +#define READ_CSR _read_csr +#define WRITE_CSR _write_csr + +#endif + + +/* + * Transmit soft descriptor, used to manage packets as they come in. + */ +typedef struct rxpkt { + struct mbuf *dptr; /* pointer to receive frame */ + u_int32_t dma_addr; /* dma address */ +} rxpkt_t; + + +/* + * Transmit soft descriptor, used to manage packets as they are transmitted. + */ +typedef struct txpkt { + struct txpkt *next; /* next in a chain */ + struct mbuf *dptr; /* pointer to mbuf being sent */ + u_int32_t sidx; /* start index */ + u_int32_t eidx; /* end index */ +} txpkt_t; + + +typedef struct wx_softc { + /* + * OS dependent storage... must be first... + */ + struct wxmdvar w; + + /* + * misc goodies + */ + u_int32_t : 18, + wx_no_flow : 1, + wx_ilos : 1, + wx_no_ilos : 1, + wx_debug : 1, + linkup : 1, + all_mcasts : 1, + revision : 8; /* chip revision */ + + u_int16_t wx_cfg1; + u_int16_t wx_txint_delay; + u_int32_t wx_ienable; /* current ienable to use */ + u_int32_t wx_dcr; /* dcr used */ + u_int32_t wx_icr; /* last icr */ + + /* + * Statistics, soft && hard + */ + u_int32_t wx_intr; + u_int32_t wx_linkintr; + u_int32_t wx_rxintr; + u_int32_t wx_xmitgc; + u_int32_t wx_xmitpullup; + u_int32_t wx_xmitcluster; + u_int32_t wx_xmitputback; + u_int32_t wx_xmitwanted; + u_int32_t wx_xmitblocked; + u_int32_t wx_xmitblocked1; + u_int32_t wx_xmitrunt; + u_int32_t wx_rxnobuf; + + /* + * Soft copies of multicast addresses. We're only + * using (right now) the rest of the receive address + * registers- not the hashed multicast table. + */ + u_int8_t wx_mcaddr[WX_RAL_TAB_SIZE-1][6]; + u_int8_t wx_nmca; /* # active multicast addrs */ + + + /* + * Receive Management + * We have software and shared memory rings in a buddy store format. + */ + wxrd_t *rdescriptors; /* receive descriptor ring */ + rxpkt_t *rbase; /* base of soft rdesc list */ + u_int16_t rnxt; /* next descriptor to check */ + u_int16_t _pad; + struct mbuf *rpending; /* pending partial packet */ + + /* + * Transmit Management + * We have software and shared memory rings in a buddy store format. + */ + txpkt_t *tbase; /* base of soft soft management */ + txpkt_t *tbsyf, *tbsyl; /* linked busy list */ + wxtd_t *tdescriptors; /* transmit descriptor ring */ + u_int16_t tnxtfree; /* next free index (circular) */ + u_int16_t tactive; /* # active */ +} wx_softc_t; + +/* + * We offset the the receive frame header by two bytes so that the actual + * payload is 32 bit aligned. On platforms that require strict structure + * alignment, this means that the ethernet frame header may have to be shifted + * to align it at interrupt time, but because it's such a small amount + * (fourteen bytes) and processors have gotten pretty fast, that's okay. + * It may even turn out on some platforms that this doesn't have to happen. + */ +#define WX_RX_OFFSET_VALUE 2 + +/* + * Tunable Parameters. + * + * Descriptor lengths must be in multiples of 8. + */ +#define WX_MAX_TDESC 256 /* number of transmit descriptors */ +#define T_NXT_IDX(x) ((x + 1) & (WX_MAX_TDESC - 1)) +#define T_PREV_IDX(x) ((x - 1) & (WX_MAX_TDESC - 1)) +#define WX_MAX_RDESC 64 /* number of receive descriptors */ +#ifdef PADDED_CELL +#define RXINCR 2 +#else +#define RXINCR 1 +#endif +#define R_NXT_IDX(x) ((x + RXINCR) & (WX_MAX_RDESC - 1)) +#define R_PREV_IDX(x) ((x - RXINCR) & (WX_MAX_RDESC - 1)) |