summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMats O Jansson <maja@cvs.openbsd.org>1997-09-10 08:28:43 +0000
committerMats O Jansson <maja@cvs.openbsd.org>1997-09-10 08:28:43 +0000
commit7ee17d6b3862934e2abfa86ded9fdde7be1133ca (patch)
treedfb678cb72706fd77e4d70fadd0027a3c1b87ce0 /sys/arch
parentf901e1c269a36d910c1f51b683c3ce6dd98ac417 (diff)
Sync with NetBSD 970516. -moj
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/vax/if/if_de.c26
-rw-r--r--sys/arch/vax/if/if_le.c44
-rw-r--r--sys/arch/vax/if/if_qe.c207
-rw-r--r--sys/arch/vax/if/if_qereg.h11
4 files changed, 218 insertions, 70 deletions
diff --git a/sys/arch/vax/if/if_de.c b/sys/arch/vax/if/if_de.c
index 0984fb92d44..f9ab288aef9 100644
--- a/sys/arch/vax/if/if_de.c
+++ b/sys/arch/vax/if/if_de.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: if_de.c,v 1.9 1997/05/28 23:10:59 niklas Exp $ */
-/* $NetBSD: if_de.c,v 1.25 1996/11/15 03:11:19 thorpej Exp $ */
+/* $OpenBSD: if_de.c,v 1.10 1997/09/10 08:28:39 maja Exp $ */
+/* $NetBSD: if_de.c,v 1.27 1997/04/19 15:02:29 ragge Exp $ */
/*
* Copyright (c) 1982, 1986, 1989 Regents of the University of California.
@@ -91,8 +91,8 @@ extern char all_es_snpa[], all_is_snpa[];
#include <vax/uba/ubareg.h>
#include <vax/uba/ubavar.h>
-#define NXMT 3 /* number of transmit buffers */
-#define NRCV 7 /* number of receive buffers (must be > 1) */
+#define NXMT 3 /* number of transmit buffers */
+#define NRCV 7 /* number of receive buffers (must be > 1) */
int dedebug = 0;
@@ -145,16 +145,16 @@ int dematch __P((struct device *, void *, void *));
void deattach __P((struct device *, struct device *, void *));
int dewait __P((struct de_softc *, char *));
void deinit __P((struct de_softc *));
-int deioctl __P((struct ifnet *, u_long, caddr_t));
+int deioctl __P((struct ifnet *, u_long, caddr_t));
void dereset __P((int));
-void destart __P((struct ifnet *));
+void destart __P((struct ifnet *));
void deread __P((struct de_softc *, struct ifrw *, int));
-void derecv __P((int));
+void derecv __P((int));
void de_setaddr __P((u_char *, struct de_softc *));
void deintr __P((int));
-struct cfdriver de_cd = {
+struct cfdriver de_cd = {
NULL, "de", DV_IFNET
};
@@ -362,7 +362,7 @@ void
destart(ifp)
struct ifnet *ifp;
{
- int len;
+ int len;
register struct de_softc *ds = ifp->if_softc;
volatile struct dedevice *addr = ds->ds_vaddr;
register struct de_ring *rp;
@@ -495,7 +495,7 @@ deintr(unit)
* If input error just drop packet.
* Otherwise purge input buffered data path and examine
* packet to determine type. If can't determine length
- * from type, then have to drop packet. Othewise decapsulate
+ * from type, then have to drop packet. Othewise decapsulate
* packet based on type and pass to type specific higher-level
* input routine.
*/
@@ -557,7 +557,7 @@ deread(ds, ifrw, len)
int len;
{
struct ether_header *eh;
- struct mbuf *m;
+ struct mbuf *m;
/*
* Deal with trailer protocol: if type is trailer type
@@ -689,7 +689,7 @@ dematch(parent, match, aux)
void *match, *aux;
{
struct uba_attach_args *ua = aux;
- volatile struct dedevice *addr = (struct dedevice *)ua->ua_addr;
+ volatile struct dedevice *addr = (struct dedevice *)ua->ua_addr;
int i;
/*
@@ -720,7 +720,7 @@ dematch(parent, match, aux)
DELAY(50000);
ua->ua_ivec = deintr;
- ua->ua_reset = dereset; /* Wish to be called after ubareset */
+ ua->ua_reset = dereset; /* Wish to be called after ubareset */
return 1;
}
diff --git a/sys/arch/vax/if/if_le.c b/sys/arch/vax/if/if_le.c
index 67ab2fec5e4..2982f30160b 100644
--- a/sys/arch/vax/if/if_le.c
+++ b/sys/arch/vax/if/if_le.c
@@ -1,7 +1,6 @@
-/* $OpenBSD: if_le.c,v 1.2 1997/05/29 00:04:32 niklas Exp $ */
-/* $NetBSD: if_le.c,v 1.3 1996/10/13 03:34:53 christos Exp $ */
+/* $OpenBSD: if_le.c,v 1.3 1997/09/10 08:28:40 maja Exp $ */
+/* $NetBSD: if_le.c,v 1.8 1997/04/21 22:04:23 ragge Exp $ */
-#define LEDEBUG 1 /* debug-level: 0 or 1 */
/* #define LE_CHIP_IS_POKEY /* does VS2000 need this ??? */
/*-
@@ -49,6 +48,7 @@
#include <sys/syslog.h>
#include <sys/socket.h>
#include <sys/device.h>
+#include <sys/reboot.h>
#include <net/if.h>
@@ -69,6 +69,7 @@
#include <machine/uvax.h>
#include <machine/ka410.h>
#include <machine/vsbus.h>
+#include <machine/rpb.h>
#include <dev/ic/am7990reg.h>
#define LE_NEED_BUF_CONTIG
@@ -104,12 +105,15 @@ struct cfattach le_ca = {
sizeof(struct le_softc), lematch, leattach
};
-integrate void
+hide void lewrcsr __P ((struct am7990_softc *, u_int16_t, u_int16_t));
+hide u_int16_t lerdcsr __P ((struct am7990_softc *, u_int16_t));
+
+hide void
lewrcsr(sc, port, val)
- struct le_softc *sc;
+ struct am7990_softc *sc;
u_int16_t port, val;
{
- struct lereg1 *ler1 = sc->sc_r1;
+ struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
#ifdef LE_CHIP_IS_POKEY
LEWREG(port, ler1->ler1_rap);
@@ -120,12 +124,12 @@ lewrcsr(sc, port, val)
#endif
}
-integrate u_int16_t
+hide u_int16_t
lerdcsr(sc, port)
- struct le_softc *sc;
+ struct am7990_softc *sc;
u_int16_t port;
{
- struct lereg1 *ler1 = sc->sc_r1;
+ struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
u_int16_t val;
#ifdef LE_CHIP_IS_POKEY
@@ -138,6 +142,12 @@ lerdcsr(sc, port)
return (val);
}
+integrate void
+lehwinit(sc)
+ struct am7990_softc *sc;
+{
+}
+
int
lematch(parent, match, aux)
struct device *parent;
@@ -176,6 +186,10 @@ leattach(parent, self, aux)
sc->sc_am7990.sc_mem = le_iomem;
sc->sc_am7990.sc_addr = le_ioaddr;
sc->sc_am7990.sc_memsize = LE_IOSIZE;
+ sc->sc_am7990.sc_wrcsr = lewrcsr;
+ sc->sc_am7990.sc_rdcsr = lerdcsr;
+ sc->sc_am7990.sc_hwinit = lehwinit;
+ sc->sc_am7990.sc_nocarrier = NULL;
xdebug(("leattach: mem=%x, addr=%x, size=%x (%d)\n",
sc->sc_am7990.sc_mem, sc->sc_am7990.sc_addr,
@@ -204,12 +218,14 @@ leattach(parent, self, aux)
vsbus_intr_register(ca, am7990_intr, &sc->sc_am7990);
vsbus_intr_enable(ca);
-}
-integrate void
-lehwinit(sc)
- struct le_softc *sc;
-{
+ /*
+ * Register this device as boot device if we booted from it.
+ * This will fail if there are more than one le in a machine,
+ * fortunately there may be only one.
+ */
+ if (B_TYPE(bootdev) == BDEV_LE)
+ booted_from = self;
}
#ifdef LE_CHIP_IS_POKEY
diff --git a/sys/arch/vax/if/if_qe.c b/sys/arch/vax/if/if_qe.c
index 9b26d02f754..0ba98510161 100644
--- a/sys/arch/vax/if/if_qe.c
+++ b/sys/arch/vax/if/if_qe.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: if_qe.c,v 1.8 1997/05/29 00:04:32 niklas Exp $ */
-/* $NetBSD: if_qe.c,v 1.18 1996/10/13 03:34:55 christos Exp $ */
+/* $OpenBSD: if_qe.c,v 1.9 1997/09/10 08:28:41 maja Exp $ */
+/* $NetBSD: if_qe.c,v 1.22 1997/05/02 17:11:24 ragge Exp $ */
/*
* Copyright (c) 1988 Regents of the University of California.
@@ -39,29 +39,29 @@
* @(#)if_qe.c 7.20 (Berkeley) 3/28/91
*/
-/* from @(#)if_qe.c 1.15 (ULTRIX) 4/16/86 */
+/* from @(#)if_qe.c 1.15 (ULTRIX) 4/16/86 */
/****************************************************************
* *
- * Licensed from Digital Equipment Corporation *
- * Copyright (c) *
- * Digital Equipment Corporation *
- * Maynard, Massachusetts *
- * 1985, 1986 *
- * All rights reserved. *
+ * Licensed from Digital Equipment Corporation *
+ * Copyright (c) *
+ * Digital Equipment Corporation *
+ * Maynard, Massachusetts *
+ * 1985, 1986 *
+ * All rights reserved. *
* *
- * The Information in this software is subject to change *
+ * The Information in this software is subject to change *
* without notice and should not be construed as a commitment *
- * by Digital Equipment Corporation. Digital makes no *
+ * by Digital Equipment Corporation. Digital makes no *
* representations about the suitability of this software for *
* any purpose. It is supplied "As Is" without expressed or *
- * implied warranty. *
+ * implied warranty. *
* *
- * If the Regents of the University of California or its *
- * licensees modify the software in a manner creating *
- * derivative copyright rights, appropriate copyright *
- * legends may be placed on the derivative work in addition *
- * to that set forth above. *
+ * If the Regents of the University of California or its *
+ * licensees modify the software in a manner creating *
+ * derivative copyright rights, appropriate copyright *
+ * legends may be placed on the derivative work in addition *
+ * to that set forth above. *
* *
****************************************************************/
/* ---------------------------------------------------------------------
@@ -71,7 +71,7 @@
* Rename "unused_multi" to "qunused_multi" for extending Generic
* kernel to MicroVAXen.
*
- * 18-mar-86 -- jaw br/cvec changed to NOT use registers.
+ * 18-mar-86 -- jaw br/cvec changed to NOT use registers.
*
* 12 March 86 -- Jeff Chase
* Modified to handle the new MCLGET macro
@@ -80,11 +80,11 @@
*
* 19 Oct 85 -- rjl
* Changed the watch dog timer from 30 seconds to 3. VMS is using
- * less than 1 second in their's. Also turned the printf into an
+ * less than 1 second in their's. Also turned the printf into an
* mprintf.
*
* 09/16/85 -- Larry Cohen
- * Add 43bsd alpha tape changes for subnet routing
+ * Add 43bsd alpha tape changes for subnet routing
*
* 1 Aug 85 -- rjl
* Panic on a non-existent memory interrupt and the case where a packet
@@ -93,8 +93,8 @@
* because we hang 2k input buffers on the device.
*
* 1 Aug 85 -- rich
- * Fixed the broadcast loopback code to handle Clusters without
- * wedging the system.
+ * Fixed the broadcast loopback code to handle Clusters without
+ * wedging the system.
*
* 27 Feb. 85 -- ejf
* Return default hardware address on ioctl request.
@@ -110,7 +110,7 @@
* Added watchdog timer to mask hardware bug that causes device lockup.
*
* 18 Dec. 84 -- rjl
- * Reworked driver to use q-bus mapping routines. MicroVAX-I now does
+ * Reworked driver to use q-bus mapping routines. MicroVAX-I now does
* copying instead of m-buf shuffleing.
* A number of deficencies in the hardware/firmware were compensated
* for. See comments in qestart and qerint.
@@ -137,7 +137,11 @@
/*
* Digital Q-BUS to NI Adapter
+ * supports DEQNA and DELQA in DEQNA-mode.
*/
+
+#include "bpfilter.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
@@ -174,20 +178,32 @@
extern char all_es_snpa[], all_is_snpa[], all_l1is_snpa[], all_l2is_snpa[];
#endif
+#if defined(CCITT) && defined(LLC)
+#include <sys/socketvar.h>
+#include <netccitt/x25.h>
+#include <netccitt/pk.h>
+#include <netccitt/pk_var.h>
+#include <netccitt/pk_extern.h>
+#endif
+
+#if NBPFILTER > 0
+#include <net/bpf.h>
+#include <net/bpfdesc.h>
+#endif
+
#include <machine/pte.h>
#include <machine/cpu.h>
-#include <machine/mtpr.h>
#include <vax/if/if_qereg.h>
#include <vax/if/if_uba.h>
#include <vax/uba/ubareg.h>
#include <vax/uba/ubavar.h>
-#define NRCV 15 /* Receive descriptors */
-#define NXMT 5 /* Transmit descriptors */
+#define NRCV 15 /* Receive descriptors */
+#define NXMT 5 /* Transmit descriptors */
#define NTOT (NXMT + NRCV)
-#define QETIMEOUT 2 /* transmit timeout, must be > 1 */
+#define QETIMEOUT 2 /* transmit timeout, must be > 1 */
#define QESLOWTIMEOUT 40 /* timeout when no xmits in progress */
#define MINDATA 60
@@ -205,8 +221,8 @@ struct qe_softc {
#define qe_if qe_ac.ac_if /* network-visible interface */
#define qe_addr qe_ac.ac_enaddr /* hardware Ethernet address */
struct ifubinfo qe_uba; /* Q-bus resources */
- struct ifrw qe_ifr[NRCV]; /* for receive buffers; */
- struct ifxmt qe_ifw[NXMT]; /* for xmit buffers; */
+ struct ifrw qe_ifr[NRCV]; /* for receive buffers; */
+ struct ifxmt qe_ifw[NXMT]; /* for xmit buffers; */
struct qedevice *qe_vaddr;
int qe_flags; /* software state */
#define QEF_RUNNING 0x01
@@ -216,15 +232,16 @@ struct qe_softc {
int ipl; /* interrupt priority */
struct qe_ring *rringaddr; /* mapping info for rings */
struct qe_ring *tringaddr; /* "" */
- struct qe_ring rring[NRCV+1]; /* Receive ring descriptors */
- struct qe_ring tring[NXMT+1]; /* Xmit ring descriptors */
+ struct qe_ring rring[NRCV+1]; /* Receive ring descriptors */
+ struct qe_ring tring[NXMT+1]; /* Xmit ring descriptors */
u_char setup_pkt[16][8]; /* Setup packet */
int rindex; /* Receive index */
int tindex; /* Transmit index */
int otindex; /* Old transmit index */
int qe_intvec; /* Interrupt vector */
- struct qedevice *addr; /* device addr */
+ struct qedevice *addr; /* device addr */
int setupqueued; /* setup packet queued */
+ int setuplength; /* length if setup packet */
int nxmit; /* Transmits in progress */
int qe_restarts; /* timeouts */
};
@@ -253,7 +270,7 @@ struct cfattach qe_ca = {
sizeof(struct qe_softc), qematch, qeattach
};
-#define QEUNIT(x) minor(x)
+#define QEUNIT(x) minor(x)
/*
* The deqna shouldn't receive more than ETHERMTU + sizeof(struct ether_header)
* but will actually take in up to 2048 bytes. To guard against the receiver
@@ -273,8 +290,8 @@ qematch(parent, match, aux)
struct qe_softc *sc = match;
struct uba_attach_args *ua = aux;
struct uba_softc *ubasc = (struct uba_softc *)parent;
- struct qe_ring *rp;
- struct qe_ring *prp; /* physical rp */
+ struct qe_ring *rp;
+ struct qe_ring *prp; /* physical rp */
volatile struct qedevice *addr = (struct qedevice *)ua->ua_addr;
int i;
@@ -370,7 +387,8 @@ qeattach(parent, self, aux)
* The Deqna is cable of transmitting broadcasts, but
* doesn't listen to its own.
*/
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS |
+ IFF_MULTICAST;
/*
* Read the address from the prom and save it.
@@ -395,6 +413,10 @@ qeattach(parent, self, aux)
sc->qe_uba.iff_flags = UBA_CANTWAIT;
if_attach(ifp);
ether_ifattach(ifp);
+
+#if NBPFILTER > 0
+ bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
+#endif
}
/*
@@ -444,7 +466,7 @@ qeinit(sc)
sizeof(sc->setup_pkt), 0);
if (i == 0)
goto fail;
- sc->setupaddr = UBAI_ADDR(i);
+ sc->setupaddr = UBAI_ADDR(i);
/*
* init buffers and maps
*/
@@ -541,7 +563,7 @@ qestart(ifp)
rp = &sc->tring[index];
if( sc->setupqueued ) {
buf_addr = sc->setupaddr;
- len = 128;
+ len = sc->setuplength;
rp->qe_setup = 1;
sc->setupqueued = 0;
} else {
@@ -550,6 +572,10 @@ qestart(ifp)
splx(s);
return;
}
+#if NBPFILTER > 0
+ if (ifp->if_bpf)
+ bpf_mtap(ifp->if_bpf, m);
+#endif
buf_addr = sc->qe_ifw[index].ifw_info;
len = if_ubaput(&sc->qe_uba, &sc->qe_ifw[index], m);
}
@@ -769,6 +795,7 @@ qeioctl(ifp, cmd, data)
{
struct qe_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
+ struct ifreq *ifr = (struct ifreq *)data;
int s = splnet(), error = 0;
switch (cmd) {
@@ -805,6 +832,28 @@ qeioctl(ifp, cmd, data)
} else if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) ==
IFF_RUNNING && (sc->qe_flags & QEF_RUNNING) == 0)
qerestart(sc);
+ else
+ qeinit(sc);
+
+ break;
+
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ /*
+ * Update our multicast list.
+ */
+ error = (cmd == SIOCADDMULTI) ?
+ ether_addmulti(ifr, &sc->qe_ac):
+ ether_delmulti(ifr, &sc->qe_ac);
+
+ if (error == ENETRESET) {
+ /*
+ * Multicast list has changed; set the hardware filter
+ * accordingly.
+ */
+ qeinit(sc);
+ error = 0;
+ }
break;
default:
@@ -840,7 +889,7 @@ qe_setaddr(physaddr, sc)
void
qeinitdesc(rp, addr, len)
register struct qe_ring *rp;
- caddr_t addr; /* mapped address */
+ caddr_t addr; /* mapped address */
int len;
{
/*
@@ -880,12 +929,54 @@ qesetup(sc)
for (i = 0; i < 6; i++) {
sc->setup_pkt[i][2] = 0xff;
#ifdef ISO
+ /*
+ * XXX layer violation, should use SIOCADDMULTI.
+ * Will definitely break with IPmulticast.
+ */
+
sc->setup_pkt[i][3] = all_es_snpa[i];
sc->setup_pkt[i][4] = all_is_snpa[i];
sc->setup_pkt[i][5] = all_l1is_snpa[i];
sc->setup_pkt[i][6] = all_l2is_snpa[i];
#endif
}
+ if (sc->qe_if.if_flags & IFF_PROMISC) {
+ sc->setuplength = QE_PROMISC;
+ /* XXX no IFF_ALLMULTI support in 4.4bsd */
+ } else if (sc->qe_if.if_flags & IFF_ALLMULTI) {
+ sc->setuplength = QE_ALLMULTI;
+ } else {
+ register k;
+ struct ether_multi *enm;
+ struct ether_multistep step;
+ /*
+ * Step through our list of multicast addresses, putting them
+ * in the third through fourteenth address slots of the setup
+ * packet. (See the DEQNA manual to understand the peculiar
+ * layout of the bytes within the setup packet.) If we have
+ * too many multicast addresses, or if we have to listen to
+ * a range of multicast addresses, turn on reception of all
+ * multicasts.
+ */
+ sc->setuplength = QE_SOMEMULTI;
+ i = 2;
+ k = 0;
+ ETHER_FIRST_MULTI(step, &sc->qe_ac, enm);
+ while (enm != NULL) {
+ if ((++i > 7 && k != 0) ||
+ bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
+ sc->setuplength = QE_ALLMULTI;
+ break;
+ }
+ if (i > 7) {
+ i = 1;
+ k = 8;
+ }
+ for (j = 0; j < 6; j++)
+ sc->setup_pkt[j+k][i] = enm->enm_addrlo[j];
+ ETHER_NEXT_MULTI(step, enm);
+ }
+ }
sc->setupqueued++;
}
@@ -899,8 +990,9 @@ qeread(sc, ifrw, len)
struct ifrw *ifrw;
int len;
{
+ struct ifnet *ifp = (struct ifnet *)&sc->qe_if;
struct ether_header *eh;
- struct mbuf *m;
+ struct mbuf *m;
/*
* Deal with trailer protocol: if type is INET trailer
@@ -925,9 +1017,42 @@ if (m) {
*(((u_long *)m->m_data)+1),
*(((u_long *)m->m_data)+2),
*(((u_long *)m->m_data)+3)
-); }
+; }
#endif
+#if NBPFILTER > 0
+ /*
+ * Check for a BPF filter; if so, hand it up.
+ * Note that we have to stick an extra mbuf up front, because
+ * bpf_mtap expects to have the ether header at the front.
+ * It doesn't matter that this results in an ill-formatted mbuf chain,
+ * since BPF just looks at the data. (It doesn't try to free the mbuf,
+ * tho' it will make a copy for tcpdump.)
+ */
+ if (sc->qe_if.if_bpf) {
+ struct mbuf m0;
+ m0.m_len = sizeof (struct ether_header);
+ m0.m_data = (caddr_t)eh;
+ m0.m_next = m;
+
+ /* Pass it up */
+ bpf_mtap(sc->qe_if.if_bpf, &m0);
+
+ /*
+ * Note that the interface cannot be in promiscuous mode if
+ * there are no BPF listeners. And if we are in promiscuous
+ * mode, we have to check if this packet is really ours.
+ */
+ if ((ifp->if_flags & IFF_PROMISC) &&
+ (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
+ bcmp(eh->ether_dhost, sc->qe_addr,
+ sizeof(eh->ether_dhost)) != 0) {
+ m_freem(m);
+ return;
+ }
+ }
+#endif /* NBPFILTER > 0 */
+
if (m)
ether_input((struct ifnet *)&sc->qe_if, eh, m);
}
diff --git a/sys/arch/vax/if/if_qereg.h b/sys/arch/vax/if/if_qereg.h
index 99ed1a45657..bac037498c8 100644
--- a/sys/arch/vax/if/if_qereg.h
+++ b/sys/arch/vax/if/if_qereg.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: if_qereg.h,v 1.2 1997/05/29 00:04:33 niklas Exp $ */
-/* $NetBSD: if_qereg.h,v 1.1 1995/03/30 20:26:41 ragge Exp $ */
+/* $OpenBSD: if_qereg.h,v 1.3 1997/09/10 08:28:42 maja Exp $ */
+/* $NetBSD: if_qereg.h,v 1.2 1997/05/15 20:10:23 ragge Exp $ */
/*
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved.
@@ -171,3 +171,10 @@ struct qe_ring {
#define QE_NOTYET 0x8000 /* Descriptor not in use yet */
#define QE_INUSE 0x4000 /* Descriptor being used by QNA */
#define QE_MASK 0xc000 /* Lastnot/error/used mask */
+
+/*
+ * Values for the length of the setup packet that control reception filter.
+ */
+#define QE_SOMEMULTI 128 /* Receive up to 12 multicasts */
+#define QE_ALLMULTI 129 /* Receive all multicasts */
+#define QE_PROMISC 130 /* Receive all packets */