New ARP system, supports IPv4 over any hardware link. trunk
authoris <is@NetBSD.org>
Sat, 15 Mar 1997 18:09:08 +0000
branchtrunk
changeset 26231 674db9eaff68
parent 26230 b4e938ab23ae
child 26232 8392039cebe8
New ARP system, supports IPv4 over any hardware link. Some of the stuff (e.g., rarpd, bootpd, dhcpd etc., libsa) still will only support Ethernet. Tcpdump itself should be ok, but libpcap needs lot of work. For the detailed change history, look at the commit log entries for the is-newarp branch.
sys/Makefile
sys/arch/alpha/alpha/machdep.c
sys/arch/alpha/conf/files.alpha
sys/arch/alpha/stand/netboot/dev_net.c
sys/arch/alpha/stand/setnetbootinfo/setnetbootinfo.c
sys/arch/alpha/tc/asc.c
sys/arch/alpha/tc/ascvar.h
sys/arch/amiga/amiga/machdep.c
sys/arch/amiga/conf/files.amiga
sys/arch/amiga/dev/if_ae.c
sys/arch/amiga/dev/if_bah.c
sys/arch/amiga/dev/if_ed.c
sys/arch/amiga/dev/if_es.c
sys/arch/amiga/dev/if_le.c
sys/arch/amiga/dev/if_levar.h
sys/arch/amiga/dev/if_qn.c
sys/arch/arm32/conf/files.arm32
sys/arch/arm32/mainbus/if_es.c
sys/arch/arm32/podulebus/icside.c
sys/arch/arm32/podulebus/icside_io.c
sys/arch/arm32/podulebus/icside_io_asm.S
sys/arch/arm32/podulebus/icsidereg.h
sys/arch/arm32/podulebus/if_ea.c
sys/arch/arm32/podulebus/if_eb.c
sys/arch/arm32/podulebus/if_eh.c
sys/arch/arm32/podulebus/if_ie.c
sys/arch/arm32/podulebus/rapide.c
sys/arch/arm32/podulebus/rapide_io_asm.S
sys/arch/arm32/podulebus/rapidereg.h
sys/arch/arm32/rc7500/if_es.c
sys/arch/atari/atari/machdep.c
sys/arch/atari/conf/files.atari
sys/arch/atari/include/intr.h
sys/arch/hp300/dev/if_le.c
sys/arch/hp300/dev/if_levar.h
sys/arch/hp300/stand/common/conf.c
sys/arch/hp300/stand/common/netio.c
sys/arch/i386/i386/genassym.cf
sys/arch/m68k/m68k/kgdb_m68k.c
sys/arch/mac68k/conf/RAMDISK
sys/arch/mac68k/conf/files.mac68k
sys/arch/mac68k/dev/if_ae.c
sys/arch/mac68k/dev/if_ae_nubus.c
sys/arch/mac68k/dev/if_aereg.h
sys/arch/mac68k/dev/if_aevar.h
sys/arch/mac68k/dev/sbc_obio.c
sys/arch/mac68k/dev/sbcvar.h
sys/arch/mac68k/mac68k/machdep.c
sys/arch/mac68k/nubus/if_ae_nubus.c
sys/arch/mac68k/obio/sbc_obio.c
sys/arch/mips/mips/trap.c
sys/arch/mvme68k/dev/if_le.c
sys/arch/mvme68k/stand/netboot/dev_net.c
sys/arch/pc532/conf/files.pc532
sys/arch/pc532/dev/lpt.c
sys/arch/pc532/dev/ncr5380.c
sys/arch/pc532/include/kcore.h
sys/arch/pica/conf/files.pica
sys/arch/pica/dev/if_sn.c
sys/arch/pica/pica/trap.c
sys/arch/pmax/pmax/pmax_trap.c
sys/arch/powerpc/stand/net.c
sys/arch/powerpc/stand/netif_of.c
sys/arch/sparc/conf/files.sparc
sys/arch/sparc/dev/if_ie.c
sys/arch/sparc/dev/if_le.c
sys/arch/sparc/dev/if_levar.h
sys/arch/sparc/sparc/cpuvar.h
sys/arch/sparc/sparc/intr.c
sys/arch/sparc/stand/net.c
sys/arch/sparc/stand/netif_sun.c
sys/arch/sun3/conf/GENERIC3X
sys/arch/sun3/conf/KGDB3X
sys/arch/sun3/conf/files.sun3
sys/arch/sun3/dev/dma.c
sys/arch/sun3/dev/dmareg.h
sys/arch/sun3/dev/dmavar.h
sys/arch/sun3/dev/esp.c
sys/arch/sun3/dev/i82586.h
sys/arch/sun3/dev/if_ie.c
sys/arch/sun3/dev/if_ie_obio.c
sys/arch/sun3/dev/if_ie_vme.c
sys/arch/sun3/dev/if_ie_vmes.c
sys/arch/sun3/dev/if_ievar.h
sys/arch/sun3/dev/if_le.c
sys/arch/sun3/stand/libsa/netif_sun.c
sys/arch/sun3x/conf/GENERIC
sys/arch/sun3x/dev/dma.c
sys/arch/sun3x/dev/dmareg.h
sys/arch/sun3x/dev/dmavar.h
sys/arch/sun3x/dev/esp.c
sys/arch/sun3x/dev/espreg.h
sys/arch/sun3x/dev/espvar.h
sys/arch/sun3x/dev/if_le.c
sys/arch/sun3x/sun3x/kgdb_machdep.c
sys/arch/vax/conf/files.vax
sys/arch/vax/if/if_de.c
sys/arch/vax/if/if_le.c
sys/arch/vax/if/if_qe.c
sys/conf/files
sys/conf/newvers.sh
sys/dev/clock_subr.c
sys/dev/clock_subr.h
sys/dev/dec/if_le_dec.c
sys/dev/eisa/files.eisa
sys/dev/eisa/if_ep_eisa.c
sys/dev/eisa/if_fea.c
sys/dev/ic/aha.c
sys/dev/ic/ahareg.h
sys/dev/ic/ahavar.h
sys/dev/ic/am7990.c
sys/dev/ic/am7990reg.h
sys/dev/ic/am7990var.h
sys/dev/ic/elink3.c
sys/dev/ic/elink3var.h
sys/dev/ic/mb86960.c
sys/dev/ic/mb86960var.h
sys/dev/ic/ncr53c9x.c
sys/dev/ic/ncr53c9xreg.h
sys/dev/ic/ncr53c9xvar.h
sys/dev/ic/pdq_ifsubr.c
sys/dev/ic/pdqvar.h
sys/dev/isa/aha_isa.c
sys/dev/isa/files.isa
sys/dev/isa/if_ate.c
sys/dev/isa/if_ed.c
sys/dev/isa/if_eg.c
sys/dev/isa/if_el.c
sys/dev/isa/if_ep_isa.c
sys/dev/isa/if_fe.c
sys/dev/isa/if_fmv.c
sys/dev/isa/if_hp.c
sys/dev/isa/if_ie.c
sys/dev/isa/if_iy.c
sys/dev/isa/if_le_isa.c
sys/dev/isa/if_levar.h
sys/dev/ofw/files.ofw
sys/dev/ofw/ofnet.c
sys/dev/pci/files.pci
sys/dev/pci/if_de.c
sys/dev/pci/if_devar.h
sys/dev/pci/if_ep_pci.c
sys/dev/pci/if_fpa.c
sys/dev/pci/if_le_pci.c
sys/dev/pci/if_levar.h
sys/dev/tc/files.tc
sys/dev/tc/if_fta.c
sys/dev/tc/if_le_dec.c
sys/dev/tc/if_le_ibus.c
sys/dev/tc/if_le_ioasic.c
sys/dev/tc/if_le_tc.c
sys/dev/tc/if_levar.h
sys/ipkdb/ipkdb.h
sys/ipkdb/ipkdb_if.c
sys/ipkdb/ipkdb_ipkdb.c
sys/ipkdb/ipkdb_slip.c
sys/kern/kgdb_stub.c
sys/lib/libsa/arp.c
sys/lib/libsa/dev_net.c
sys/lib/libsa/dev_net.h
sys/lib/libsa/ether.c
sys/lib/libsa/net.c
sys/lib/libsa/rarp.c
sys/net/bpf.c
sys/net/ethertypes.h
sys/net/if.c
sys/net/if.h
sys/net/if_arc.h
sys/net/if_arcsubr.c
sys/net/if_arp.h
sys/net/if_atmsubr.c
sys/net/if_ether.h
sys/net/if_ethersubr.c
sys/net/if_fddi.h
sys/net/if_fddisubr.c
sys/net/if_tun.c
sys/netinet/if_arc.h
sys/netinet/if_arp.c
sys/netinet/if_arp.h
sys/netinet/if_ether.c
sys/netinet/if_ether.h
sys/netinet/if_inarp.h
sys/netinet/in.c
sys/netiso/clnp_input.c
sys/netiso/if_eon.c
sys/netiso/iso_snpac.c
sys/nfs/nfs_boot.c
sys/sys/kgdb.h
sys/sys/param.h
--- a/sys/Makefile	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/Makefile	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.11 1996/11/09 03:26:25 chuck Exp $
+#	$NetBSD: Makefile,v 1.12 1997/03/15 18:09:08 is Exp $
 
 # The ``rm -rf''s used below are safe because rm doesn't follow symbolic
 # links.
@@ -6,7 +6,7 @@
 SUBDIR+= arch/${MACHINE}
 
 .if (${MACHINE_ARCH} != "alpha" && ${MACHINE_ARCH} != "mips")
-SUBDIR+= lkm
+# XXX SUBDIR+= lkm
 .endif
 
 LFILES=	errno.h fcntl.h poll.h syslog.h termios.h
--- a/sys/arch/alpha/alpha/machdep.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/alpha/alpha/machdep.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.66 1997/03/12 04:42:22 cgd Exp $	*/
+/*	$NetBSD: machdep.c,v 1.67 1997/03/15 18:09:10 is Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -82,7 +82,7 @@
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #include <netinet/ip_var.h>
 #endif
 #ifdef NS
--- a/sys/arch/alpha/conf/files.alpha	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/alpha/conf/files.alpha	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.alpha,v 1.39 1997/03/12 01:54:23 cgd Exp $
+#	$NetBSD: files.alpha,v 1.40 1997/03/15 18:09:12 is Exp $
 #
 # alpha-specific configuration info
 
--- a/sys/arch/alpha/stand/netboot/dev_net.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/alpha/stand/netboot/dev_net.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dev_net.c,v 1.2 1997/01/16 01:21:37 cgd Exp $	*/
+/*	$NetBSD: dev_net.c,v 1.3 1997/03/15 18:09:13 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -53,9 +53,9 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 
+#include <lib/libsa/if_ether.h>
 #include <lib/libsa/stand.h>
 #include <lib/libsa/net.h>
 #include <lib/libsa/netif.h>
--- a/sys/arch/alpha/stand/setnetbootinfo/setnetbootinfo.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/alpha/stand/setnetbootinfo/setnetbootinfo.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: setnetbootinfo.c,v 1.2 1997/01/24 01:53:06 cgd Exp $	*/
+/*	$NetBSD: setnetbootinfo.c,v 1.3 1997/03/15 18:09:15 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Christopher G. Demetriou
@@ -40,7 +40,7 @@
 #include <sys/socket.h>						/* XXX */
 #include <net/if.h>						/* XXX */
 #include <netinet/in.h>						/* XXX */
-#include <netinet/if_ether.h>
+#include <sys/lib/libsa/if_ether.h>
 
 #include "stand/common/bbinfo.h"
 
--- a/sys/arch/alpha/tc/asc.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/alpha/tc/asc.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: asc.c,v 1.1 1997/02/27 01:19:40 thorpej Exp $	*/
+/*	$NetBSD: asc.c,v 1.2 1997/03/15 18:09:16 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Jason R. Thorpe.
--- a/sys/arch/alpha/tc/ascvar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/alpha/tc/ascvar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ascvar.h,v 1.1 1997/02/27 01:19:41 thorpej Exp $	*/
+/*	$NetBSD: ascvar.h,v 1.2 1997/03/15 18:09:17 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Jason R. Thorpe.
--- a/sys/arch/amiga/amiga/machdep.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/amiga/machdep.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.82 1996/12/17 07:32:54 is Exp $	*/
+/*	$NetBSD: machdep.c,v 1.83 1997/03/15 18:09:18 is Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -113,8 +113,8 @@
 
 #ifdef INET
 #include <netinet/in.h>
-#ifdef NETHER
-#include <netinet/if_ether.h>
+#ifdef NARP
+#include <netinet/if_inarp.h>
 #endif
 #include <netinet/ip_var.h>
 #endif 
@@ -1336,7 +1336,7 @@
 netintr()
 {
 #ifdef INET
-#if NETHER > 0
+#if NARP > 0
 	if (netisr & (1 << NETISR_ARP)) {
 		netisr &= ~(1 << NETISR_ARP);
 		arpintr();
--- a/sys/arch/amiga/conf/files.amiga	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/conf/files.amiga	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.amiga,v 1.51 1996/12/16 16:17:31 is Exp $
+#	$NetBSD: files.amiga,v 1.52 1997/03/15 18:09:20 is Exp $
 
 # maxpartitions must be first item in files.${ARCH}.newconf
 maxpartitions 16			# NOTE THAT AMIGA IS SPECIAL!
@@ -124,24 +124,24 @@
 attach	le at zbus with le_zbus
 file	arch/amiga/dev/if_le.c		le_zbus needs-flag
 
-device	ed:	ifnet, ether
+device	ed:	ifnet, ether, arp
 attach	ed at zbus with ed_zbus
 file	arch/amiga/dev/if_ed.c		ed_zbus needs-flag
 
 # C=/Ameristar A2060 / 560
-device	bah: ifnet, arc
+device	bah: ifnet, arc, arp
 attach	bah at zbus with bah_zbus
 file	arch/amiga/dev/if_bah.c		bah_zbus needs-flag
 
-device	es:	ifnet, ether
+device	es:	ifnet, ether, arp
 attach	es at zbus
 file	arch/amiga/dev/if_es.c		es needs-flag
 
-device	qn:	ifnet, ether
+device	qn:	ifnet, ether, arp
 attach	qn at zbus
 file	arch/amiga/dev/if_qn.c		qn needs-flag
 
-device	ae:	ifnet, ether
+device	ae:	ifnet, ether, arp
 attach	ae at zbus
 file	arch/amiga/dev/if_ae.c		ae needs-count
 
--- a/sys/arch/amiga/dev/if_ae.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_ae.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ae.c,v 1.12 1996/12/23 09:10:13 veego Exp $	*/
+/*	$NetBSD: if_ae.c,v 1.13 1997/03/15 18:09:21 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Bernd Ernesti and Klaus Burkert. All rights reserved.
@@ -72,15 +72,14 @@
 #include <sys/device.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -122,7 +121,7 @@
 struct	ae_softc {
 	struct	device sc_dev;
 	struct	isr sc_isr;
-	struct	arpcom sc_arpcom;	/* common Ethernet structures */
+	struct	ethercom sc_ethercom;	/* common Ethernet structures */
 	void	*sc_base;	/* base address of board */
 	struct	aereg1 *sc_r1;	/* LANCE registers */
 	struct	aereg2 *sc_r2;	/* dual-port RAM */
@@ -153,7 +152,7 @@
 int	aeput __P((char *, struct mbuf *));
 struct	mbuf *aeget __P((struct ae_softc *, u_char *, int));
 int	aeioctl __P((struct ifnet *, u_long, caddr_t));
-void	aesetladrf __P((struct arpcom *, u_int16_t *));
+void	aesetladrf __P((struct ethercom *, u_int16_t *));
 
 struct cfattach ae_ca = {
 	sizeof(struct ae_softc), aematch, aeattach
@@ -193,9 +192,10 @@
 	register struct aereg2 *aer2;
 	struct zbus_args *zap;
 	struct ae_softc *sc = (void *)self;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	unsigned long ser;
 	int s = splhigh ();
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	zap =(struct zbus_args *)aux;
 
@@ -217,16 +217,16 @@
 	 * Manufacturer decides the 3 first bytes, i.e. ethernet vendor ID.
 	 */
 
-	sc->sc_arpcom.ac_enaddr[0] = 0x00;
-	sc->sc_arpcom.ac_enaddr[1] = 0x60;
-	sc->sc_arpcom.ac_enaddr[2] = 0x30;
+	myaddr[0] = 0x00;
+	myaddr[1] = 0x60;
+	myaddr[2] = 0x30;
 
-	sc->sc_arpcom.ac_enaddr[3] = (ser >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[4] = (ser >> 8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[5] = ser & 0xff;
+	myaddr[3] = (ser >> 16) & 0xff;
+	myaddr[4] = (ser >> 8) & 0xff;
+	myaddr[5] = ser & 0xff;
 
 	printf("%s: hardware address %s 32K", sc->sc_dev.dv_xname,
-		ether_sprintf(sc->sc_arpcom.ac_enaddr));
+		ether_sprintf(myaddr));
 
 	aestop(sc);
 	delay(100);
@@ -247,7 +247,7 @@
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
 
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -267,7 +267,7 @@
 	struct ae_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 
 	aereset(sc);
 }
@@ -289,7 +289,7 @@
 	register struct ae_softc *sc;
 {        
 #if NBPFILTER > 0
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 #endif
 	/*
 	 * This structure is referenced from the CARD's/PCnet-ISA's point
@@ -311,12 +311,12 @@
 		aer2->aer2_mode = AE_MODE;
 	/* you know: no BYTE access.... */
 	aer2->aer2_padr[0] =
-		(sc->sc_arpcom.ac_enaddr[0] << 8) | sc->sc_arpcom.ac_enaddr[1];
+		(LLADDR(ifp->if_sadl)[0] << 8) | LLADDR(ifp->if_sadl)[1];
 	aer2->aer2_padr[1] =
-		(sc->sc_arpcom.ac_enaddr[2] << 8) | sc->sc_arpcom.ac_enaddr[3];
+		(LLADDR(ifp->if_sadl)[2] << 8) | LLADDR(ifp->if_sadl)[3];
 	aer2->aer2_padr[2] =
-		(sc->sc_arpcom.ac_enaddr[4] << 8) | sc->sc_arpcom.ac_enaddr[5];
-	aesetladrf(&sc->sc_arpcom, aer2->aer2_ladrf);
+		(LLADDR(ifp->if_sadl)[4] << 8) | LLADDR(ifp->if_sadl)[5];
+	aesetladrf(&sc->sc_ethercom, aer2->aer2_ladrf);
 
 	sc->sc_no_td = sc->sc_tmd = sc->sc_rmd = 0;
 
@@ -360,7 +360,7 @@
 	struct ae_softc *sc;
 {
 	register struct aereg1 *aer1 = sc->sc_r1;
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	register struct aereg2 *aemem = (struct aereg2 *) 0x8000;
 
 	register int timo = 0;
@@ -508,7 +508,7 @@
 {
 	register struct ae_softc *sc = arg;
 	register struct aereg1 *aer1;
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	register u_int16_t stat;
 
 	/* if not even initialized, don't do anything further.. */
@@ -581,7 +581,7 @@
 {
 	register int bix = (sc->sc_tmd - sc->sc_no_td + AETBUF) % AETBUF;
 	struct aetmd *tmd = &sc->sc_r2->aer2_tmd[bix];
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	if (tmd->tmd1 & AE_OWN) {
 #ifdef AEDEBUG
@@ -645,7 +645,7 @@
 aerint(sc)
 	struct ae_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	register int bix = sc->sc_rmd;
 	register struct aermd *rmd = &sc->sc_r2->aer2_rmd[bix];
 
@@ -706,7 +706,7 @@
 	u_char *buf;
 	int len;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
     	struct mbuf *m;
 	struct ether_header *eh;
 
@@ -745,7 +745,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			sizeof(eh->ether_dhost)) != 0) {
 			    m_freem(m);
 			    return;
@@ -921,7 +921,7 @@
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == 0)
 		return (0);
-	m->m_pkthdr.rcvif = &sc->sc_arpcom.ac_if;
+	m->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
 	m->m_pkthdr.len = totlen;
 	len = MHLEN;
 	top = 0;
@@ -978,7 +978,7 @@
 #ifdef INET
 		case AF_INET:
 			aeinit(sc);	
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -988,11 +988,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				wcopyto(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			aeinit(sc); /* does ae_setaddr() */
 			break;
 		    }
@@ -1041,8 +1040,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom):
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom):
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -1067,10 +1066,10 @@
  */
 void 
 aesetladrf(ac, af)
-	struct arpcom *ac;
+	struct ethercom *ac;
 	u_int16_t *af;
 {
-	struct ifnet *ifp = &ac->ac_if; 
+	struct ifnet *ifp = &ac->ec_if; 
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_int32_t crc;
--- a/sys/arch/amiga/dev/if_bah.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_bah.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bah.c,v 1.25 1996/12/23 09:10:15 veego Exp $ */
+/*	$NetBSD: if_bah.c,v 1.26 1997/03/15 18:09:23 is Exp $ */
 
 /*
  * Copyright (c) 1994, 1995 Ignatios Souvatzis
@@ -63,14 +63,13 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.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>
+#include <netinet/if_inarp.h>
 #include <netinet/if_arc.h>
 #endif
 
@@ -255,8 +254,6 @@
 	printf(": link addr 0x%02x(%d)\n", linkaddress, linkaddress);
 #endif
 
-	sc->sc_arccom.ac_anaddr = linkaddress;
-
 	/* clear the int mask... */
 
 	sc->sc_base->status = sc->sc_intmask = 0;
@@ -287,7 +284,7 @@
 	ifp->if_mtu = ARCMTU;
 
 	if_attach(ifp);
-	arc_ifattach(ifp);
+	arc_ifattach(ifp, linkaddress);
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_ARCNET, ARC_HDRLEN);
@@ -364,10 +361,9 @@
 	printf("%s: reset: card reset, link addr = 0x%02x (%ld)\n",
 	    sc->sc_dev.dv_xname, linkaddress, linkaddress);
 #endif
-	sc->sc_arccom.ac_anaddr = linkaddress;
 
 	/* tell the routing level about the (possibly changed) link address */
-	arc_ifattach(ifp);
+	arc_ifattach(ifp, linkaddress);
 
 	/* POR is NMI, but we need it below: */
 	sc->sc_intmask = ARC_RECON|ARC_POR;
--- a/sys/arch/amiga/dev/if_ed.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_ed.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ed.c,v 1.24 1996/12/23 09:10:16 veego Exp $	*/
+/*	$NetBSD: if_ed.c,v 1.25 1997/03/15 18:09:24 is Exp $	*/
 
 /*
  * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
@@ -29,14 +29,14 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -71,7 +71,7 @@
 	struct	device sc_dev;
 	struct	isr sc_isr;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	u_char	volatile *nic_addr;	/* NIC (DS8390) I/O address */
 
@@ -104,7 +104,7 @@
 void ed_reset __P((struct ed_softc *));
 void ed_init __P((struct ed_softc *));
 void ed_stop __P((struct ed_softc *));
-void ed_getmcaf __P((struct arpcom *, u_long *));
+void ed_getmcaf __P((struct ethercom *, u_long *));
 u_short ed_put __P((struct ed_softc *, struct mbuf *, caddr_t));
 
 #define inline	/* XXX for debugging porpoises */
@@ -207,7 +207,7 @@
 	struct ed_softc *sc = (void *)self;
 	struct zbus_args *zap = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_char *prom;
 	int i;
 
@@ -255,7 +255,7 @@
 	 * read the ethernet address from the board
 	 */
 	for (i = 0; i < ETHER_ADDR_LEN; i++)
-		sc->sc_arpcom.ac_enaddr[i] = *(prom + 2 * i);
+		myaddr[i] = *(prom + 2 * i);
 
 	/* Set interface to stopped condition (reset). */
 	ed_stop(sc);
@@ -271,10 +271,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Print additional info when attached. */
-	printf(": address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": address %s\n", ether_sprintf(myaddr));
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -333,7 +333,7 @@
 	struct ed_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 
 	ed_reset(sc);
 }
@@ -345,7 +345,7 @@
 ed_init(sc)
 	struct ed_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i, s;
 	u_long mcaf[2];
 
@@ -358,7 +358,7 @@
 
 	/* Reset transmitter flags. */
 	sc->xmit_busy = 0;
-	sc->sc_arpcom.ac_if.if_timer = 0;
+	ifp->if_timer = 0;
 
 	sc->txb_inuse = 0;
 	sc->txb_new = 0;
@@ -411,10 +411,10 @@
 
 	/* Copy out our station address. */
 	for (i = 0; i < ETHER_ADDR_LEN; ++i)
-		NIC_PUT(sc, ED_P1_PAR0 + i, sc->sc_arpcom.ac_enaddr[i]);
+		NIC_PUT(sc, ED_P1_PAR0 + i, LLADDR(ifp->if_sadl)[i]);
 
 	/* Set multicast filter on chip. */
-	ed_getmcaf(&sc->sc_arpcom, mcaf);
+	ed_getmcaf(&sc->sc_ethercom, mcaf);
 	for (i = 0; i < 8; i++)
 		NIC_PUT(sc, ED_P1_MAR0 + i, ((u_char *)mcaf)[i]);
 
@@ -461,7 +461,7 @@
 ed_xmit(sc)
 	struct ed_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_short len;
 
 	len = sc->txb_len[sc->txb_next_tx];
@@ -526,7 +526,7 @@
 		return;
 	}
 
-	IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+	IF_DEQUEUE(&ifp->if_snd, m);
 	if (m == 0) {
 		/*
 		 * We are using the !OACTIVE flag to indicate to the outside
@@ -559,8 +559,8 @@
 
 #if NBPFILTER > 0
 	/* Tap off here if there is a BPF listener. */
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m0);
+	if (ifp->if_bpf)
+		bpf_mtap(ifp->if_bpf, m0);
 #endif
 
 	m_freem(m0);
@@ -576,12 +576,14 @@
 ed_rint(sc)
 	struct ed_softc *sc;
 {
-	u_char boundary, current;
+	struct ifnet *ifp;
+	caddr_t packet_ptr;
 	u_short len;
 	u_char nlen;
+	u_char boundary, current;
 	struct ed_ring packet_hdr;
-	caddr_t packet_ptr;
 
+	ifp = &sc->sc_ethercom.ec_if;
 loop:
 	/* Set NIC to page 1 registers to get 'current' pointer. */
 	NIC_PUT(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STA);
@@ -659,13 +661,13 @@
 			/* Go get packet. */
 			ed_get_packet(sc, packet_ptr + sizeof(struct ed_ring),
 			    len - sizeof(struct ed_ring));
-			++sc->sc_arpcom.ac_if.if_ipackets;
+			++ifp->if_ipackets;
 		} else {
 			/* Really BAD.  The ring pointers are corrupted. */
 			log(LOG_ERR,
 			    "%s: NIC memory corrupt - invalid packet length %d\n",
 			    sc->sc_dev.dv_xname, len);
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++ifp->if_ierrors;
 			ed_reset(sc);
 			return;
 		}
@@ -692,6 +694,7 @@
 	void *arg;
 {
 	struct ed_softc *sc = arg;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_char isr;
 
 	/* Set NIC to page 0 registers. */
@@ -742,27 +745,27 @@
 				}
 
 				/* Update output errors counter. */
-				++sc->sc_arpcom.ac_if.if_oerrors;
+				++ifp->if_oerrors;
 			} else {
 				/*
 				 * Update total number of successfully
 				 * transmitted packets.
 				 */
-				++sc->sc_arpcom.ac_if.if_opackets;
+				++ifp->if_opackets;
 			}
 
 			/* Reset TX busy and output active flags. */
 			sc->xmit_busy = 0;
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			ifp->if_flags &= ~IFF_OACTIVE;
 
 			/* Clear watchdog timer. */
-			sc->sc_arpcom.ac_if.if_timer = 0;
+			ifp->if_timer = 0;
 
 			/*
 			 * Add in total number of collisions on last
 			 * transmission.
 			 */
-			sc->sc_arpcom.ac_if.if_collisions += collisions;
+			ifp->if_collisions += collisions;
 
 			/*
 			 * Decrement buffer in-use count if not zero (can only
@@ -787,7 +790,7 @@
 			 * fixed in later revs.  -DG
 			 */
 			if (isr & ED_ISR_OVW) {
-				++sc->sc_arpcom.ac_if.if_ierrors;
+				++ifp->if_ierrors;
 #ifdef DIAGNOSTIC
 				log(LOG_WARNING,
 				    "%s: warning - receiver ring buffer overrun\n",
@@ -802,7 +805,7 @@
 				 * missed packet.
 				 */
 				if (isr & ED_ISR_RXE) {
-					++sc->sc_arpcom.ac_if.if_ierrors;
+					++ifp->if_ierrors;
 #ifdef ED_DEBUG
 					printf("%s: receive error %x\n",
 					    sc->sc_dev.dv_xname,
@@ -826,8 +829,8 @@
 		 * to start output on the interface.  This is done after
 		 * handling the receiver to give the receiver priority.
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-			ed_start(&sc->sc_arpcom.ac_if);
+		if ((ifp->if_flags & IFF_OACTIVE) == 0)
+			ed_start(ifp);
 
 		/*
 		 * Return NIC CR to standard state: page 0, remote DMA
@@ -879,7 +882,7 @@
 #ifdef INET
 		case AF_INET:
 			ed_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -890,11 +893,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			/* Set new address. */
 			ed_init(sc);
 			break;
@@ -936,8 +938,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -970,6 +972,9 @@
 {
 	struct ether_header *eh;
 	struct mbuf *m;
+	struct ifnet *ifp;
+
+	ifp = &sc->sc_ethercom.ec_if;
 
 	/* round length to word boundry */
 	len = (len + 1) & ~1;
@@ -978,7 +983,7 @@
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == 0)
 		return;
-	m->m_pkthdr.rcvif = &sc->sc_arpcom.ac_if;
+	m->m_pkthdr.rcvif = ifp;
 	m->m_pkthdr.len = len;
 	m->m_len = 0;
 
@@ -1009,17 +1014,17 @@
 	 * Check if there's a BPF listener on this interface.  If so, hand off
 	 * the raw packet to bpf.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf) {
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m);
+	if (ifp->if_bpf) {
+		bpf_mtap(ifp->if_bpf, m);
 
 		/*
 		 * 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 ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -1029,7 +1034,7 @@
 
 	/* Fix up data start offset in mbuf to point past ether header. */
 	m_adj(m, sizeof(struct ether_header));
-	ether_input(&sc->sc_arpcom.ac_if, eh, m);
+	ether_input(ifp, eh, m);
 }
 
 /*
@@ -1130,10 +1135,10 @@
  */
 void
 ed_getmcaf(ac, af)
-	struct arpcom *ac;
+	struct ethercom *ac;
 	u_long *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ac->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
--- a/sys/arch/amiga/dev/if_es.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_es.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_es.c,v 1.16 1996/12/23 09:10:17 veego Exp $	*/
+/*	$NetBSD: if_es.c,v 1.17 1997/03/15 18:09:25 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Michael L. Hitch
@@ -48,15 +48,14 @@
 #include <sys/device.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -85,7 +84,7 @@
 struct	es_softc {
 	struct	device sc_dev;
 	struct	isr sc_isr;
-	struct	arpcom sc_arpcom;	/* common Ethernet structures */
+	struct	ethercom sc_ethercom;	/* common Ethernet structures */
 	void	*sc_base;		/* base address of board */
 	short	sc_iflags;
 	unsigned short sc_intctl;
@@ -160,8 +159,9 @@
 {
 	struct es_softc *sc = (void *)self;
 	struct zbus_args *zap = aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	unsigned long ser;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	sc->sc_base = zap->va;
 
@@ -169,18 +169,18 @@
 	 * Manufacturer decides the 3 first bytes, i.e. ethernet vendor ID.
 	 * (Currently only Ameristar.)
 	 */
-	sc->sc_arpcom.ac_enaddr[0] = 0x00;
-	sc->sc_arpcom.ac_enaddr[1] = 0x00;
-	sc->sc_arpcom.ac_enaddr[2] = 0x9f;
+	myaddr[0] = 0x00;
+	myaddr[1] = 0x00;
+	myaddr[2] = 0x9f;
 
 	/*
 	 * Serial number for board contains last 3 bytes.
 	 */
 	ser = (unsigned long) zap->serno;
 
-	sc->sc_arpcom.ac_enaddr[3] = (ser >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[4] = (ser >>  8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[5] = (ser      ) & 0xff;
+	myaddr[3] = (ser >> 16) & 0xff;
+	myaddr[4] = (ser >>  8) & 0xff;
+	myaddr[5] = (ser      ) & 0xff;
 
 	/* Initialize ifnet structure. */
 	bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
@@ -194,10 +194,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Print additional info when attached. */
-	printf(": address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": address %s\n", ether_sprintf(myaddr));
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -250,7 +250,7 @@
 esinit(sc)
 	struct es_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	union smcregs *smc = sc->sc_base;
 	int s;
 
@@ -272,9 +272,9 @@
 	smc->b1.bsr = BSR_BANK1;	/* Select bank 1 */
 	smc->b1.cr = CR_RAM32K | CR_NO_WAIT_ST | CR_SET_SQLCH;
 	smc->b1.ctr = CTR_AUTO_RLSE;
-	smc->b1.iar[0] = *((unsigned short *) &sc->sc_arpcom.ac_enaddr[0]);
-	smc->b1.iar[1] = *((unsigned short *) &sc->sc_arpcom.ac_enaddr[2]);
-	smc->b1.iar[2] = *((unsigned short *) &sc->sc_arpcom.ac_enaddr[4]);
+	smc->b1.iar[0] = *((unsigned short *) &LLADDR(ifp->if_sadl)[0]);
+	smc->b1.iar[1] = *((unsigned short *) &LLADDR(ifp->if_sadl)[2]);
+	smc->b1.iar[2] = *((unsigned short *) &LLADDR(ifp->if_sadl)[4]);
 	smc->b2.bsr = BSR_BANK2;	/* Select bank 2 */
 	smc->b2.mmucr = MMUCR_RESET;
 	smc->b0.bsr = BSR_BANK0;	/* Select bank 0 */
@@ -300,6 +300,7 @@
 	void *arg;
 {
 	struct es_softc *sc = arg;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_short intsts, intact;
 	union smcregs *smc;
 	int s = splnet();
@@ -307,7 +308,7 @@
 	smc = sc->sc_base;
 #ifdef ESDEBUG
 	while ((smc->b2.bsr & BSR_MASK) != BSR_BANK2 &&
-	    sc->sc_arpcom.ac_if.if_flags & IFF_RUNNING) {
+	    ifp->if_flags & IFF_RUNNING) {
 		printf("%s: intr BSR not 2: %04x\n", sc->sc_dev.dv_xname,
 		    smc->b2.bsr);
 		smc->b2.bsr = BSR_BANK2;
@@ -357,7 +358,7 @@
 			while (smc->b2.mmucr & MMUCR_BUSY)
 				;
 			smc->b2.pnr = save_pnr;
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			ifp->if_flags &= ~IFF_OACTIVE;
 		}
 #ifdef ESDEBUG
 		else if (esdebug || 1)
@@ -386,7 +387,7 @@
 		    intsts);
 		smc->b2.ist = ACK_RX_OVRN;
 		printf ("->%02x\n", smc->b2.ist);
-		sc->sc_arpcom.ac_if.if_ierrors++;
+		ifp->if_ierrors++;
 	}
 	if (intact & IST_TX_EMPTY) {
 		u_short ecr;
@@ -413,7 +414,7 @@
 			smc->b0.bsr = BSR_BANK0;
 			ecr = smc->b0.ecr;	/* Get error counters */
 			if (ecr & 0xff00)
-				sc->sc_arpcom.ac_if.if_collisions += ((ecr >> 8) & 15) +
+				ifp->if_collisions += ((ecr >> 8) & 15) +
 				    ((ecr >> 11) & 0x1e);
 			smc->b2.bsr = BSR_BANK2;
 #if 0
@@ -463,7 +464,7 @@
 			smc->b0.bsr = BSR_BANK0;
 			smc->b0.tcr |= TCR_TXENA;
 			smc->b2.bsr = BSR_BANK2;
-			sc->sc_arpcom.ac_if.if_oerrors++;
+			ifp->if_oerrors++;
 			sc->sc_intctl |= MSK_TX_EMPTY | MSK_TX;
 		} else {
 			/*
@@ -545,6 +546,7 @@
 	int i;
 #endif
 
+	ifp = &sc->sc_ethercom.ec_if;
 #ifdef ESDEBUG
 	if (esdebug)
 		printf ("%s: esrint fifo %04x", sc->sc_dev.dv_xname,
@@ -592,7 +594,7 @@
 		smc->b2.mmucr = MMUCR_REMRLS_RX;
 		while (smc->b2.mmucr & MMUCR_BUSY)
 			;
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++ifp->if_ierrors;
 #ifdef ESDEBUG
 		if (--sc->sc_smcbusy) {
 			printf("%s: esrintr busy on bad packet exit\n",
@@ -650,7 +652,6 @@
 	}
 #endif
 #endif /* USEPKTBUF */
-	ifp = &sc->sc_arpcom.ac_if;
 	ifp->if_ipackets++;
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == NULL)
@@ -714,17 +715,17 @@
 	 * Check if there's a BPF listener on this interface.  If so, hand off
 	 * the raw packet to bpf.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf) {
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, top);
+	if (ifp->if_bpf) {
+		bpf_mtap(ifp->if_bpf, top);
 
 		/*
 		 * 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 ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(top);
 			return;
@@ -749,7 +750,7 @@
 	struct es_softc *sc;
 {
 
-	esstart(&sc->sc_arpcom.ac_if);
+	esstart(&sc->sc_ethercom.ec_if);
 }
 
 void
@@ -775,7 +776,7 @@
 	int i;
 	u_char active_pnr;
 
-	if ((sc->sc_arpcom.ac_if.if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
+	if ((sc->sc_ethercom.ec_if.if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
 	    IFF_RUNNING)
 		return;
 
@@ -798,7 +799,7 @@
 		 * Sneak a peek at the next packet to get the length
 		 * and see if the SMC 91C90 can accept it.
 		 */
-		m = sc->sc_arpcom.ac_if.if_snd.ifq_head;
+		m = sc->sc_ethercom.ec_if.if_snd.ifq_head;
 		if (!m)
 			break;
 #ifdef ESDEBUG
@@ -819,7 +820,7 @@
 			if ((smc->b2.arr & ARR_FAILED) == 0)
 				break;
 		if (smc->b2.arr & ARR_FAILED) {
-			sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags |= IFF_OACTIVE;
 			sc->sc_intctl |= MSK_ALLOC;
 			break;
 		}
@@ -832,7 +833,7 @@
 		smc->b2.bsr = BSR_BANK2;
 		}
 #endif
-		IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+		IF_DEQUEUE(&sc->sc_ethercom.ec_if.if_snd, m);
 		smc->b2.ptr = PTR_AUTOINCR;
 		(void) smc->b2.mmucr;
 		data = (u_short *)&smc->b2.data;
@@ -929,7 +930,7 @@
 			    start_ptr, end_ptr, SWAP(smc->b2.ptr));
 			--sc->sc_smcbusy;
 #endif
-			IF_PREPEND(&sc->sc_arpcom.ac_if.if_snd, m0);
+			IF_PREPEND(&sc->sc_ethercom.ec_if.if_snd, m0);
 			esinit(sc);	/* It's really hosed - reset */
 			return;
 		}
@@ -938,11 +939,11 @@
 			printf("%s: esstart - PNR changed %x->%x\n",
 			    sc->sc_dev.dv_xname, active_pnr, smc->b2.pnr);
 #if NBPFILTER > 0
-		if (sc->sc_arpcom.ac_if.if_bpf)
-			bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m0);
+		if (sc->sc_ethercom.ec_if.if_bpf)
+			bpf_mtap(sc->sc_ethercom.ec_if.if_bpf, m0);
 #endif
 		m_freem(m0);
-		sc->sc_arpcom.ac_if.if_opackets++;	/* move to interrupt? */
+		sc->sc_ethercom.ec_if.if_opackets++;	/* move to interrupt? */
 		sc->sc_intctl |= MSK_TX_EMPTY | MSK_TX;
 	}
 	smc->b2.msk = sc->sc_intctl;
@@ -981,7 +982,7 @@
 #ifdef INET
 		case AF_INET:
 			esinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -991,11 +992,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			/* Set new address. */
 			esinit(sc);
 			break;
@@ -1045,8 +1045,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -1085,7 +1085,7 @@
 	struct es_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 
 	esreset(sc);
 }
--- a/sys/arch/amiga/dev/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.22 1996/12/23 09:10:18 veego Exp $	*/
+/*	$NetBSD: if_le.c,v 1.23 1997/03/15 18:09:26 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -49,10 +49,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/cpu.h>
@@ -132,6 +133,7 @@
 	struct am7990_softc *sc = &lesc->sc_am7990;
 	struct zbus_args *zap = aux;
 	u_long ser;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	lesc->sc_r1 = (struct lereg1 *)(lestd[1] + (int)zap->va);
 	sc->sc_mem = (void *)(lestd[2] + (int)zap->va);
@@ -156,17 +158,17 @@
 	case 514:
 		/* Commodore */
 		sc->sc_memsize = 32768;
-		sc->sc_arpcom.ac_enaddr[0] = 0x00;
-		sc->sc_arpcom.ac_enaddr[1] = 0x80;
-		sc->sc_arpcom.ac_enaddr[2] = 0x10;
+		sc->sc_enaddr[0] = 0x00;
+		sc->sc_enaddr[1] = 0x80;
+		sc->sc_enaddr[2] = 0x10;
 		break;
 
 	case 1053:
 		/* Ameristar */
 		sc->sc_memsize = 32768;
-		sc->sc_arpcom.ac_enaddr[0] = 0x00;
-		sc->sc_arpcom.ac_enaddr[1] = 0x00;
-		sc->sc_arpcom.ac_enaddr[2] = 0x9f;
+		sc->sc_enaddr[0] = 0x00;
+		sc->sc_enaddr[1] = 0x00;
+		sc->sc_enaddr[2] = 0x9f;
 		break;
 
 	default:
@@ -177,9 +179,9 @@
 	 * Serial number for board is used as host ID.
 	 */
 	ser = (u_long)zap->serno;
-	sc->sc_arpcom.ac_enaddr[3] = (ser >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[4] = (ser >>  8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[5] = (ser      ) & 0xff;
+	sc->sc_enaddr[3] = (ser >> 16) & 0xff;
+	sc->sc_enaddr[4] = (ser >>  8) & 0xff;
+	sc->sc_enaddr[5] = (ser      ) & 0xff;
 
 	am7990_config(sc);
 
--- a/sys/arch/amiga/dev/if_levar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_levar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_levar.h,v 1.3 1996/05/07 00:46:45 thorpej Exp $	*/
+/*	$NetBSD: if_levar.h,v 1.4 1997/03/15 18:09:27 is Exp $	*/
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -45,7 +45,7 @@
  * Ethernet software status per interface.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface.
+ * ethercom.ec_if, which the routing code uses to locate the interface.
  * This structure contains the output queue for the interface, its address, ...
  */
 struct le_softc {
--- a/sys/arch/amiga/dev/if_qn.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/amiga/dev/if_qn.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_qn.c,v 1.10 1996/12/23 09:10:19 veego Exp $	*/
+/*	$NetBSD: if_qn.c,v 1.11 1997/03/15 18:09:28 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Mika Kortelainen
@@ -91,15 +91,14 @@
 #include <sys/errno.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -132,7 +131,7 @@
 struct	qn_softc {
 	struct	device sc_dev;
 	struct	isr sc_isr;
-	struct	arpcom sc_arpcom;	/* Common ethernet structures */
+	struct	ethercom sc_ethercom;	/* Common ethernet structures */
 	u_char	volatile *sc_base;
 	u_char	volatile *sc_nic_base;
 	u_short	volatile *nic_fifo;
@@ -213,7 +212,8 @@
 {
 	struct zbus_args *zap;
 	struct qn_softc *sc = (struct qn_softc *)self;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	zap = (struct zbus_args *)aux;
 
@@ -234,12 +234,12 @@
 	 * The ethernet address of the board (1st three bytes are the vendor
 	 * address, the rest is the serial number of the board).
 	 */
-	sc->sc_arpcom.ac_enaddr[0] = 0x5c;
-	sc->sc_arpcom.ac_enaddr[1] = 0x5c;
-	sc->sc_arpcom.ac_enaddr[2] = 0x00;
-	sc->sc_arpcom.ac_enaddr[3] = (zap->serno >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[4] = (zap->serno >> 8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[5] = zap->serno & 0xff;
+	myaddr[0] = 0x5c;
+	myaddr[1] = 0x5c;
+	myaddr[2] = 0x00;
+	myaddr[3] = (zap->serno >> 16) & 0xff;
+	myaddr[4] = (zap->serno >> 8) & 0xff;
+	myaddr[5] = zap->serno & 0xff;
 
 	/* set interface to stopped condition (reset) */
 	qnstop(sc);
@@ -256,10 +256,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 #ifdef QN_DEBUG
-	printf(": hardware address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": hardware address %s\n", ether_sprintf(myaddr));
 #endif
 
 #if NBPFILTER > 0
@@ -280,14 +280,14 @@
 qninit(sc)
 	struct qn_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_short i;
 	static retry = 0;
 
 	*sc->nic_r_mask   = NIC_R_MASK;
 	*sc->nic_t_mode   = NO_LOOPBACK;
 
-	if (sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) {
+	if (sc->sc_ethercom.ec_if.if_flags & IFF_PROMISC) {
 		*sc->nic_r_mode = PROMISCUOUS_MODE;
 		log(LOG_INFO, "qn: Promiscuous mode (not tested)\n");
 	} else
@@ -297,8 +297,8 @@
 	for (i = 0; i < ETHER_ADDR_LEN; i++)
 		*((u_short volatile *)(sc->sc_nic_base+
 				       QNET_HARDWARE_ADDRESS+2*i)) =
-		    ((((u_short)sc->sc_arpcom.ac_enaddr[i]) << 8) |
-		    sc->sc_arpcom.ac_enaddr[i]);
+		    ((((u_short)LLADDR(ifp->if_sadl)[i]) << 8) |
+		    LLADDR(ifp->if_sadl)[i]);
 
 	ifp->if_flags |= IFF_RUNNING;
 	ifp->if_flags &= ~IFF_OACTIVE;
@@ -330,7 +330,7 @@
 	struct qn_softc *sc = ifp->if_softc;
 
 	log(LOG_INFO, "qn: device timeout (watchdog)\n");
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++sc->sc_ethercom.ec_if.if_oerrors;
 
 	qnreset(sc);
 }
@@ -419,7 +419,7 @@
 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
 		return;
 
-	IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+	IF_DEQUEUE(&ifp->if_snd, m);
 	if (m == 0)
 		return;
 
@@ -460,7 +460,7 @@
 	sc->transmit_pending = 1;
 	*sc->nic_t_mask = INT_TMT_OK | INT_SIXTEEN_COL;
 
-	sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+	ifp->if_flags |= IFF_OACTIVE;
 	ifp->if_timer = 2;
 }
 
@@ -581,7 +581,7 @@
 	if (len & 1)
 		len++;
 
-	m->m_pkthdr.rcvif = &sc->sc_arpcom.ac_if;
+	m->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
 	m->m_pkthdr.len = len;
 	m->m_len = 0;
 	head = m;
@@ -634,10 +634,10 @@
 		 * no BPF listeners. And in prom. mode we have to check
 		 * if the packet is really ours...
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* not bcast or mcast */
 		    bcmp(eh->ether_dhost,
-        	        sc->sc_arpcom.ac_enaddr,
+        	        LLADDR(ifp->if_sadl),
 		        ETHER_ADDR_LEN) != 0) {
 			m_freem(head);
 			return;
@@ -646,7 +646,7 @@
 #endif
 
 	m_adj(head, sizeof(struct ether_header));
-	ether_input(&sc->sc_arpcom.ac_if, eh, head);
+	ether_input(&sc->sc_ethercom.ec_if, eh, head);
 	return;
 
 bad:
@@ -679,19 +679,19 @@
 #ifdef QN_DEBUG
 		log(LOG_INFO, "Overflow\n");
 #endif
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 	}
 	if (rstat & R_INT_CRC_ERR) {
 #ifdef QN_DEBUG
 		log(LOG_INFO, "CRC Error\n");
 #endif
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 	}
 	if (rstat & R_INT_ALG_ERR) {
 #ifdef QN_DEBUG
 		log(LOG_INFO, "Alignment error\n");
 #endif
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 	}
 	if (rstat & R_INT_SRT_PKT) {
 		/* Short packet (these may occur and are
@@ -701,13 +701,13 @@
 #ifdef QN_DEBUG
 		log(LOG_INFO, "Short packet\n");
 #endif
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 	}
 	if (rstat & 0x4040) {
 #ifdef QN_DEBUG
 		log(LOG_INFO, "Bus read error\n");
 #endif
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 		qnreset(sc);
 	}
 
@@ -742,7 +742,7 @@
 			    "%s: received a %s packet? (%u bytes)\n",
 			    sc->sc_dev.dv_xname,
 			    len < ETHER_HDR_SIZE ? "partial" : "big", len);
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++sc->sc_ethercom.ec_if.if_ierrors;
 			continue;
 		}
 #endif
@@ -756,7 +756,7 @@
 		/* Read the packet. */
 		qn_get_packet(sc, len);
 
-		++sc->sc_arpcom.ac_if.if_ipackets;
+		++sc->sc_ethercom.ec_if.if_ipackets;
 	}
 
 #ifdef QN_DEBUG
@@ -810,7 +810,7 @@
 			 * Update total number of successfully
 			 * transmitted packets.
 			 */
-			sc->sc_arpcom.ac_if.if_opackets++;
+			sc->sc_ethercom.ec_if.if_opackets++;
 		}
 
 		if (tint & T_SIXTEEN_COL) {
@@ -821,8 +821,8 @@
 #ifdef QN_DEBUG1
 			qn_dump(sc);
 #endif
-			sc->sc_arpcom.ac_if.if_oerrors++;
-			sc->sc_arpcom.ac_if.if_collisions += 16;
+			sc->sc_ethercom.ec_if.if_oerrors++;
+			sc->sc_ethercom.ec_if.if_collisions += 16;
 			sc->transmit_pending = 0;
 		}
 
@@ -832,10 +832,10 @@
 			/* Must return transmission interrupt mask. */
 			return_tintmask = 1;
 		} else {
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 
 			/* Clear watchdog timer. */
-			sc->sc_arpcom.ac_if.if_timer = 0;
+			sc->sc_ethercom.ec_if.if_timer = 0;
 		}
 	} else
 		return_tintmask = 1;
@@ -846,8 +846,8 @@
 	if (rint != 0)
 		qn_rint(sc, rint);
 
-	if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-		qnstart(&sc->sc_arpcom.ac_if);
+	if ((sc->sc_ethercom.ec_if.if_flags & IFF_OACTIVE) == 0)
+		qnstart(&sc->sc_ethercom.ec_if);
 	else if (return_tintmask == 1)
 		*sc->nic_t_mask = tintmask;
 
@@ -886,7 +886,7 @@
 		case AF_INET:
 			qnstop(sc);
 			qninit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -896,11 +896,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			qnstop(sc);
 			qninit(sc);
 			break;
@@ -949,8 +948,8 @@
 		log(LOG_INFO, "qnioctl: multicast not done yet\n");
 #if 0
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -990,7 +989,7 @@
 	log(LOG_INFO, "r_mask    : %04x\n", *sc->nic_r_mask);
 	log(LOG_INFO, "r_mode    : %04x\n", *sc->nic_r_mode);
 	log(LOG_INFO, "pending   : %02x\n", sc->transmit_pending);
-	log(LOG_INFO, "if_flags  : %04x\n", sc->sc_arpcom.ac_if.if_flags);
+	log(LOG_INFO, "if_flags  : %04x\n", sc->sc_ethercom.ec_if.if_flags);
 }
 #endif
 
--- a/sys/arch/arm32/conf/files.arm32	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/conf/files.arm32	Sat Mar 15 18:09:08 1997 +0000
@@ -46,7 +46,7 @@
 major   {md = 18}
 
 # Standard parallal driver
-device  lpt: tty, ether, ifnet
+device  lpt: tty, ether, ifnet, arp
 attach	lpt at mainbus
 file    arch/arm32/mainbus/lpt.c		lpt needs-flag
 major   {lpt = 8}
@@ -98,23 +98,23 @@
 file	arch/arm32/podulebus/podulebus_io_asm.S	podulebus
 
 # Ethernet devices
-device ea: ether, ifnet
+device ea: ether, ifnet, arp
 attach ea at podulebus
 file	arch/arm32/podulebus/if_ea.c		ea
 
-device eb: ether, ifnet
+device eb: ether, ifnet, arp
 attach eb at podulebus
 file	arch/arm32/podulebus/if_eb.c		eb
 
-device eh: ether, ifnet
+device eh: ether, ifnet, arp
 attach eh at podulebus
 file	arch/arm32/podulebus/if_eh.c		eh
 
-device ie: ether, ifnet
+device ie: ether, ifnet, arp
 attach ie at podulebus
 file	arch/arm32/podulebus/if_ie.c		ie
 
-device es: ether, ifnet
+device es: ether, ifnet, arp
 attach es at mainbus
 file  arch/arm32/mainbus/if_es.c		es
 
--- a/sys/arch/arm32/mainbus/if_es.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/mainbus/if_es.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_es.c,v 1.6 1997/02/04 02:23:35 mark Exp $ */
+/* $NetBSD: if_es.c,v 1.7 1997/03/15 18:09:32 is Exp $ */
 
 /*
  * Copyright (c) 1996, Danny C Tsen.
@@ -54,15 +54,14 @@
 #include <sys/device.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -89,7 +88,7 @@
 struct	es_softc {
 	struct	device sc_dev;
 	irqhandler_t sc_ih;
-	struct	arpcom sc_arpcom;	/* common Ethernet structures */
+	struct	ethercom sc_ethercom;	/* common Ethernet structures */
 	u_int	sc_base;	/* base address of board */
 	int	nrxovrn;
 	u_int	sc_intctl;
@@ -163,7 +162,7 @@
 
 /*
  * XXX - FIX ME
- * fake a ethernet address.
+ * fake an Ethernet address.
  */
 unsigned long vendor_id = 0x007f00;	/* just make one */
 
@@ -174,8 +173,9 @@
 {
 	struct es_softc *sc = (void *)self;
 	struct mainbus_attach_args *mbap = aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	unsigned long ser;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	sc->sc_base = mbap->mb_iobase;
 
@@ -184,17 +184,17 @@
 	 * Manufacturer decides the 3 first bytes, i.e. ethernet vendor ID.
 	 * (Currently only Ameristar.)
 	 */
-	sc->sc_arpcom.ac_enaddr[0] = (vendor_id >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[1] = (vendor_id >> 8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[2] = vendor_id & 0xff;
+	myaddr[0] = (vendor_id >> 16) & 0xff;
+	myaddr[1] = (vendor_id >> 8) & 0xff;
+	myaddr[2] = vendor_id & 0xff;
 
 	/*
 	 * XXX We should have a serial number on board!!!!
 	 * Serial number for board contains last 3 bytes.
 	 */
-	sc->sc_arpcom.ac_enaddr[3] = (ser >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[4] = (ser >>  8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[5] = (ser      ) & 0xff;
+	myaddr[3] = (ser >> 16) & 0xff;
+	myaddr[4] = (ser >>  8) & 0xff;
+	myaddr[5] = (ser      ) & 0xff;
 
 	/* Initialize ifnet structure. */
 	bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
@@ -208,10 +208,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Print additional info when attached. */
-	printf(": address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": address %s\n", ether_sprintf(myaddr));
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -265,7 +265,7 @@
 esinit(sc)
 	struct es_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	register u_int iobase = sc->sc_base;
 	int s;
 
@@ -292,9 +292,9 @@
 	outl(iobase + BANKSEL, BSR_BANK1);
 	outl(iobase + B1CR, (CR_ALLONES | CR_NO_WAIT_ST | CR_16BIT));
 	outl(iobase + B1CTR, CTR_AUTO_RLSE);
-	outl(iobase + B1IAR1, *((u_short *) &sc->sc_arpcom.ac_enaddr[0]));
-	outl(iobase + B1IAR3, *((u_short *) &sc->sc_arpcom.ac_enaddr[2]));
-	outl(iobase + B1IAR5, *((u_short *) &sc->sc_arpcom.ac_enaddr[4]));
+	outl(iobase + B1IAR1, *((u_short *) LLADDR(ifp->if_sadl)[0]));
+	outl(iobase + B1IAR3, *((u_short *) LLADDR(ifp->if_sadl)[2]));
+	outl(iobase + B1IAR5, *((u_short *) LLADDR(ifp->if_sadl)[4]));
 
 	outl(iobase + BANKSEL, BSR_BANK2);
 	outl(iobase + B2MMUCR, MMUCR_RESET);
@@ -338,7 +338,7 @@
 
 #ifdef ESDEBUG
 	while ((smc->b2.bsr & BSR_BANKMSK) != BSR_BANK2 &&
-	    sc->sc_arpcom.ac_if.if_flags & IFF_RUNNING) {
+	    sc->sc_ethercom.ec_if.if_flags & IFF_RUNNING) {
 		printf("%s: intr BSR not 2: %04x\n", sc->sc_dev.dv_xname,
 		    smc->b2.bsr);
 		smc->b2.bsr = BSR_BANK2;
@@ -379,7 +379,7 @@
 		    intsts);
 		outb(iobase + B2IST, ACK_RX_OVRN);
 		printf ("->%02x\n", inb(iobase + B2IST));
-		sc->sc_arpcom.ac_if.if_ierrors++;
+		sc->sc_ethercom.ec_if.if_ierrors++;
 		if (sc->nrxovrn++ >= 10) {
 			outl(iobase + B2MMUCR, MMUCR_RESET);
 			sc->nrxovrn = 0;
@@ -403,7 +403,7 @@
 					break;
 			}
 			outb(iobase + B2PNR, save_pnr);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 #ifdef ESDEBUG
 		else if (esdebug || 1) {
@@ -439,7 +439,7 @@
 			outl(iobase + BANKSEL, BSR_BANK0);
 			ecr = inl(iobase + B0ECR);	/* Get error counters */
 			if (ecr & ECR_CCMSK)
-				sc->sc_arpcom.ac_if.if_collisions += (ecr & 0x0f) +
+				sc->sc_ethercom.ec_if.if_collisions += (ecr & 0x0f) +
 				    ((ecr >> 4) & 0x0f);
 			outl(iobase + BANKSEL, BSR_BANK2);
 		}
@@ -482,7 +482,7 @@
 			outl(iobase + BANKSEL, BSR_BANK0);
 			outl(iobase + B0TCR, inl(iobase + B0TCR) | TCR_TXENA);
 			outl(iobase + BANKSEL, BSR_BANK2);
-			sc->sc_arpcom.ac_if.if_oerrors++;
+			sc->sc_ethercom.ec_if.if_oerrors++;
 			sc->sc_intctl |= MSK_TX_EMPTY | MSK_TX;
 		} else {
 			/*
@@ -515,7 +515,7 @@
 	}
 
 	/* output packets */
-	estint(&sc->sc_arpcom.ac_if);
+	estint(&sc->sc_ethercom.ec_if);
 
 #ifdef ESDEBUG
 	while ((smc->b2.bsr & BSR_BANKMSK) != BSR_BANK2) {
@@ -593,7 +593,7 @@
 		outl(iobase + B2MMUCR, MMUCR_REMRLS_RX);
 		while (inl(iobase + B2MMUCR) & MMUCR_BUSY)
 			;
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 #ifdef ESDEBUG
 		if (--sc->sc_smcbusy) {
 			printf("%s: esrintr busy on bad packet exit\n",
@@ -635,7 +635,7 @@
 #endif
 
 	pktlen -= sizeof(struct ether_header);
-	ifp = &sc->sc_arpcom.ac_if;
+	ifp = &sc->sc_ethercom.ec_if;
 	ifp->if_ipackets++;
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == NULL)
@@ -677,18 +677,18 @@
 	 * Check if there's a BPF listener on this interface.  If so, hand off
 	 * the raw packet to bpf.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf) {
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf, pktbuf, pktlen);
-		/* bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, top);*/
+	if (sc->sc_ethercom.ec_if.if_bpf) {
+		bpf_tap(sc->sc_ethercom.ec_if.if_bpf, pktbuf, pktlen);
+		/* bpf_mtap(sc->sc_ethercom.ec_if.if_bpf, top);*/
 
 		/*
 		 * 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 ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(top);
 			return;
@@ -731,9 +731,9 @@
 	int i;
 	u_char active_pnr;
 
-	if ((sc->sc_arpcom.ac_if.if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
+	if ((sc->sc_ethercom.ec_if.if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
 	    IFF_RUNNING) {
-		IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+		IF_DEQUEUE(&sc->sc_ethercom.ec_if.if_snd, m);
 		if (m)
 			m_freem(m);
 		return;
@@ -751,7 +751,7 @@
 	}
 #endif
 
-	IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+	IF_DEQUEUE(&sc->sc_ethercom.ec_if.if_snd, m);
 	if (!m)
 		return;
 
@@ -776,8 +776,8 @@
 	}
 
 #if NBPFILTER > 0
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf, (char *)pktbuf, len);
+	if (sc->sc_ethercom.ec_if.if_bpf)
+		bpf_tap(sc->sc_ethercom.ec_if.if_bpf, (char *)pktbuf, len);
 #endif
 
 	pktctlw = 0;
@@ -790,7 +790,7 @@
 	}
 
 	if (inb(iobase + B2ARR) & ARR_FAILED) {
-		sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+		sc->sc_ethercom.ec_if.if_flags |= IFF_OACTIVE;
 		sc->sc_intctl |= MSK_ALLOC;
 		goto esstart_out;
 	}
@@ -814,7 +814,7 @@
 		printf("%s: esstart - PNR changed %x->%x\n",
 		    sc->sc_dev.dv_xname, active_pnr, inb(iobase + B2PNR));
 
-	sc->sc_arpcom.ac_if.if_opackets++;	/* move to interrupt? */
+	sc->sc_ethercom.ec_if.if_opackets++;	/* move to interrupt? */
 	sc->sc_intctl |= MSK_TX_EMPTY | MSK_TX;
 
 esstart_out:
@@ -855,7 +855,7 @@
 #ifdef INET
 		case AF_INET:
 			esinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -865,11 +865,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN));
 			/* Set new address. */
 			esinit(sc);
 			break;
@@ -918,8 +917,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -958,7 +957,7 @@
 	struct es_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->.if_oerrors;
 
 	esreset(sc);
 }
--- a/sys/arch/arm32/podulebus/icside.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/icside.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: icside.c,v 1.1 1997/02/23 03:57:45 mark Exp $	*/
+/*	$NetBSD: icside.c,v 1.2 1997/03/15 18:09:33 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
--- a/sys/arch/arm32/podulebus/icside_io.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/icside_io.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: icside_io.c,v 1.1 1997/02/23 03:57:46 mark Exp $	*/
+/*	$NetBSD: icside_io.c,v 1.2 1997/03/15 18:09:34 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe.
--- a/sys/arch/arm32/podulebus/icside_io_asm.S	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/icside_io_asm.S	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: icside_io_asm.S,v 1.1 1997/02/23 03:57:47 mark Exp $	*/
+/*	$NetBSD: icside_io_asm.S,v 1.2 1997/03/15 18:09:35 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe.
--- a/sys/arch/arm32/podulebus/icsidereg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/icsidereg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: icsidereg.h,v 1.1 1997/02/23 03:57:46 mark Exp $	*/
+/*	$NetBSD: icsidereg.h,v 1.2 1997/03/15 18:09:35 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
--- a/sys/arch/arm32/podulebus/if_ea.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/if_ea.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ea.c,v 1.12 1996/10/14 23:50:20 mark Exp $ */
+/* $NetBSD: if_ea.c,v 1.13 1997/03/15 18:09:36 is Exp $ */
 
 /*
  * Copyright (c) 1995 Mark Brinicombe
@@ -64,13 +64,14 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -125,7 +126,7 @@
 	podule_t *sc_podule;		/* Our podule */
 	int sc_podule_number;		/* Our podule number */
 	u_int sc_iobase;		/* base I/O addr */
-	struct arpcom sc_arpcom;	/* ethernet common */
+	struct ethercom sc_ethercom;	/* Ethernet common */
 	char sc_pktbuf[EA_BUFSIZ]; 	/* frame buffer */
 	int sc_config1;			/* Current config1 bits */
 	int sc_config2;			/* Current config2 bits */
@@ -281,9 +282,10 @@
 {
 	struct ea_softc *sc = (void *)self;
 	struct podule_attach_args *pa = (void *)aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int loop;
 	int sum;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 /*	dprintf(("Attaching %s...\n", sc->sc_dev.dv_xname));*/
 
@@ -305,9 +307,9 @@
 	WriteShort(sc->sc_iobase + EA_8005_CONFIG1, EA_BUFCODE_STATION_ADDR0);
 	
 	for (sum = 0, loop = 0; loop < ETHER_ADDR_LEN; ++loop) {
-		sc->sc_arpcom.ac_enaddr[loop] =
+		myaddr[loop] =
 		    ReadByte(sc->sc_iobase + EA_8005_BUFWIN);
-		sum += sc->sc_arpcom.ac_enaddr[loop];
+		sum += myaddr[loop];
 	}
 
 /*
@@ -318,17 +320,17 @@
  */
 
 	if (sum == 0) {
-		sc->sc_arpcom.ac_enaddr[0] = 0x00;
-		sc->sc_arpcom.ac_enaddr[1] = 0x00;
-		sc->sc_arpcom.ac_enaddr[2] = bootconfig.machine_id[3];
-		sc->sc_arpcom.ac_enaddr[3] = bootconfig.machine_id[2];
-		sc->sc_arpcom.ac_enaddr[4] = bootconfig.machine_id[1];
-		sc->sc_arpcom.ac_enaddr[5] = bootconfig.machine_id[0];
+		myaddr[0] = 0x00;
+		myaddr[1] = 0x00;
+		myaddr[2] = bootconfig.machine_id[3];
+		myaddr[3] = bootconfig.machine_id[2];
+		myaddr[4] = bootconfig.machine_id[1];
+		myaddr[5] = bootconfig.machine_id[0];
 	}
 
 	/* Print out some information for the user. */
 
-	printf(" SEEQ8005 address %s", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(" SEEQ8005 address %s", ether_sprintf(myaddr));
 
 	sc->sc_irqclaimed = 0;
 
@@ -367,7 +369,7 @@
 
 /*	dprintf(("Attaching interface...\n"));*/
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Finally, attach to bpf filter if it is present. */
 
@@ -661,7 +663,7 @@
 
 	/* Cancel any watchdog timer */
 	
-	sc->sc_arpcom.ac_if.if_timer = 0;
+	sc->sc_ethercom.ec_if.if_timer = 0;
 }
 
 
@@ -699,7 +701,9 @@
 	struct ea_softc *sc;
 {
 	u_int iobase = sc->sc_iobase;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int loop;
+	
 
 	dprintf(("ea_hardreset()\n"));
 
@@ -727,7 +731,8 @@
 	WriteShort(sc->sc_iobase + EA_8005_CONFIG1,
 	    sc->sc_config1 | EA_BUFCODE_STATION_ADDR0);
 	for (loop = 0; loop < ETHER_ADDR_LEN; ++loop) {
-		WriteByte(sc->sc_iobase + EA_8005_BUFWIN, sc->sc_arpcom.ac_enaddr[loop]);
+		WriteByte(sc->sc_iobase + EA_8005_BUFWIN,
+		    LLADDR(ifp->if_sadl)[loop]);
 	}
 }
 
@@ -846,7 +851,7 @@
 ea_init(sc)
 	struct ea_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_int iobase = sc->sc_iobase;
 	int s;
 
@@ -947,12 +952,12 @@
 
 	/* Don't do anything if output is active. */
 
-	if (sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE)
+	if (ifp->if_flags & IFF_OACTIVE)
 		return;
 
 	/* Mark interface as output active */
 	
-	sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+	ifp->if_flags |= IFF_OACTIVE;
 
 	/* tx packets */
 
@@ -973,16 +978,19 @@
 {
 	u_int iobase = sc->sc_iobase;
 	struct mbuf *m, *m0;
+	struct ifnet *ifp;
 	int len;
 
+	ifp = &sc->sc_ethercom.ec_if;
+
 /* Dequeue the next datagram. */
 
-	IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m0);
+	IF_DEQUEUE(&ifp->if_snd, m0);
 
 /* If there's nothing to send, return. */
 
 	if (!m0) {
-		sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+		ifp->if_flags &= ~IFF_OACTIVE;
 		sc->sc_config2 |= EA_CFG2_OUTPUT;
 		WriteShort(iobase + EA_8005_CONFIG2, sc->sc_config2);
 #ifdef EA_TX_DEBUG
@@ -993,8 +1001,8 @@
 
 	/* Give the packet to the bpf, if any. */
 #if NBPFILTER > 0
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m0);
+	if (ifp->if_bpf)
+		bpf_mtap(ifp->if_bpf, m0);
 #endif
 
 #ifdef EA_TX_DEBUG
@@ -1134,9 +1142,9 @@
  */
 
 		if (txstatus & EA_TXHDR_COLLISION) {
-			sc->sc_arpcom.ac_if.if_collisions++;
+			ifp->if_collisions++;
 		} else if (txstatus & EA_TXHDR_ERROR_MASK) {
-			sc->sc_arpcom.ac_if.if_oerrors++;
+			ifp->if_oerrors++;
 		}
 
 /*		if (txstatus & EA_TXHDR_ERROR_MASK) {
@@ -1144,7 +1152,7 @@
 		}*/
 
 		if (txstatus & EA_PKTHDR_DONE) {
-			sc->sc_arpcom.ac_if.if_opackets++;
+			ifp->if_opackets++;
 
 			/* Tx next packet */
 
@@ -1166,7 +1174,7 @@
 
 /* Install a watchdog timer needed atm to fixed rx lockups */
 
-		sc->sc_arpcom.ac_if.if_timer = EA_TIMEOUT;
+		ifp->if_timer = EA_TIMEOUT;
 
 /* Processes the received packets */
 		eagetpackets(sc);
@@ -1201,6 +1209,9 @@
 	int pack;
 	int status;
 	u_int rxstatus;
+	struct ifnet *ifp;
+
+	ifp = &sc->sc_ethercom.ec_if;
 
 /* We start from the last rx pointer position */
 
@@ -1247,7 +1258,7 @@
 /* Did we have any errors ? then note error and go to next packet */
 
 		if (status & 0x0f) {
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++ifp->if_ierrors;
 			printf("rx packet error (%02x) - dropping packet\n", status & 0x0f);
 /*			sc->sc_config2 |= EA_CFG2_OUTPUT;
 			WriteShort(iobase + EA_8005_CONFIG2, sc->sc_config2);
@@ -1260,7 +1271,7 @@
 /* Is the packet too big ? - this will probably be trapped above as a receive error */
 
 		if (len > ETHER_MAX_LEN) {
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++ifp->if_ierrors;
 			printf("rx packet size error len=%d\n", len);
 			sc->sc_config2 |= EA_CFG2_OUTPUT;
 			WriteShort(iobase + EA_8005_CONFIG2, sc->sc_config2);
@@ -1276,7 +1287,7 @@
 		dprintf(("%s-->", ether_sprintf(sc->sc_pktbuf+6)));
 		dprintf(("%s\n", ether_sprintf(sc->sc_pktbuf)));
 #endif
-		sc->sc_arpcom.ac_if.if_ipackets++;
+		ifp->if_ipackets++;
 		/* Pass data up to upper levels. */
 		earead(sc, (caddr_t)sc->sc_pktbuf, len);
 
@@ -1316,14 +1327,16 @@
 {
 	register struct ether_header *eh;
 	struct mbuf *m;
+	struct ifnet *ifp;
 
+	ifp = &sc->sc_ethercom.ec_if;
 	eh = (struct ether_header *)buf;
 	len -= sizeof(struct ether_header);
 	if (len <= 0)
 		return;
 
 	/* Pull packet off interface. */
-	m = eaget(buf, len, &sc->sc_arpcom.ac_if);
+	m = eaget(buf, len, ifp);
 	if (m == 0)
 		return;
 
@@ -1332,18 +1345,18 @@
 	 * Check if there's a BPF listener on this interface.
 	 * If so, hand off the raw packet to bpf.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf) {
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf, buf, len + sizeof(struct ether_header));
-/*		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m);*/
+	if (ifp->if_bpf) {
+		bpf_tap(ifp->if_bpf, buf, len + sizeof(struct ether_header));
+/*		bpf_mtap(ifp->if_bpf, m);*/
 
 		/*
 		 * 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 ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -1351,7 +1364,7 @@
 	}
 #endif
 
-	ether_input(&sc->sc_arpcom.ac_if, eh, m);
+	ether_input(ifp, eh, m);
 }
 
 /*
@@ -1448,7 +1461,7 @@
 		switch (ifa->ifa_addr->sa_family) {
 #ifdef INET
 		case AF_INET:
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			dprintf(("Interface ea is coming up (AF_INET)\n"));
 			ea_init(sc);
 			break;
@@ -1461,11 +1474,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			/* Set new address. */
 			dprintf(("Interface ea is coming up (AF_NS)\n"));
 			ea_init(sc);
@@ -1536,7 +1548,7 @@
 	struct ea_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	sc->sc_arpcom.ac_if.if_oerrors++;
+	ifp->if_oerrors++;
 	dprintf(("ea_watchdog: "));
 	dprintf(("st=%04x\n", ReadShort(sc->sc_iobase + EA_8005_STATUS)));
 
@@ -1544,8 +1556,8 @@
 
 	ea_reinit(sc);
 
-/*	sc->sc_arpcom.ac_if.if_timer = EA_TIMEOUT;*/
-	sc->sc_arpcom.ac_if.if_timer = 0;
+/*	ifp->if_timer = EA_TIMEOUT;*/
+	ifp->if_timer = 0;
 }
 
 /* End of if_ea.c */
--- a/sys/arch/arm32/podulebus/if_eb.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/if_eb.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_eb.c,v 1.11 1996/10/14 23:50:21 mark Exp $ */
+/* $NetBSD: if_eb.c,v 1.12 1997/03/15 18:09:37 is Exp $ */
 
 /*
  * Copyright (c) 1995 Mark Brinicombe
@@ -64,13 +64,14 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -125,7 +126,7 @@
 	podule_t *sc_podule;		/* Our podule */
 	int sc_podule_number;		/* Our podule number */
 	u_int sc_iobase;		/* base I/O addr */
-	struct arpcom sc_arpcom;	/* ethernet common */
+	struct ethercom sc_ethercom;	/* ethernet common */
 	char sc_pktbuf[EB_BUFSIZ]; 	/* frame buffer */
 	int sc_config1;			/* Current config1 bits */
 	int sc_config2;			/* Current config2 bits */
@@ -282,10 +283,11 @@
 {
 	struct eb_softc *sc = (void *)self;
 	struct podule_attach_args *pa = (void *)aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int loop;
 	int sum;
 	int id;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 /*	dprintf(("Attaching %s...\n", sc->sc_dev.dv_xname));*/
 
@@ -307,9 +309,9 @@
 	WriteShort(sc->sc_iobase + EB_8004_CONFIG1, EB_BUFCODE_STATION_ADDR);
 	
 	for (sum = 0, loop = 0; loop < ETHER_ADDR_LEN; ++loop) {
-		sc->sc_arpcom.ac_enaddr[loop] =
+		myaddr[loop] =
 		    ReadByte(sc->sc_iobase + EB_8004_BUFWIN);
-		sum += sc->sc_arpcom.ac_enaddr[loop];
+		sum += myaddr[loop];
 	}
 
 /*
@@ -325,12 +327,12 @@
  */
 
 	if (sum == 0 || sum == 0x10) {
-		sc->sc_arpcom.ac_enaddr[0] = 0x00;
-		sc->sc_arpcom.ac_enaddr[1] = 0x00;
-		sc->sc_arpcom.ac_enaddr[2] = 0xa4;
-		sc->sc_arpcom.ac_enaddr[3] = bootconfig.machine_id[2] + 0x10;
-		sc->sc_arpcom.ac_enaddr[4] = bootconfig.machine_id[1];
-		sc->sc_arpcom.ac_enaddr[5] = bootconfig.machine_id[0];
+		myaddr[0] = 0x00;
+		myaddr[1] = 0x00;
+		myaddr[2] = 0xa4;
+		myaddr[3] = bootconfig.machine_id[2] + 0x10;
+		myaddr[4] = bootconfig.machine_id[1];
+		myaddr[5] = bootconfig.machine_id[0];
 	}
 
 	/* Get the product ID */
@@ -341,9 +343,11 @@
 	/* Print out some information for the user. */
 
 	if ((id & 0xf0) == 0xa0)
-		printf(" SEEQ80C04 rev %x address %s", id & 0x0f, ether_sprintf(sc->sc_arpcom.ac_enaddr));
+		printf(" SEEQ80C04 rev %x address %s", id & 0x0f,
+		    ether_sprintf(myaddr));
 	else
-		printf(" SEEQ???? rev %02x address %s", id, ether_sprintf(sc->sc_arpcom.ac_enaddr));
+		printf(" SEEQ???? rev %02x address %s", id,
+		    ether_sprintf(myaddr);
 
 	sc->sc_irqclaimed = 0;
 
@@ -380,7 +384,7 @@
 
 /*	dprintf(("Attaching interface...\n"));*/
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Finally, attach to bpf filter if it is present. */
 
@@ -679,7 +683,7 @@
 
 	/* Cancel any watchdog timer */
 	
-	sc->sc_arpcom.ac_if.if_timer = 0;
+	sc->sc_ethercom.ec_if.if_timer = 0;
 }
 
 
@@ -718,6 +722,9 @@
 {
 	u_int iobase = sc->sc_iobase;
 	int loop;
+	struct ifnet *ifp;
+
+	ifp = &sc->sc_ethercom.ec_if;
 
 	dprintf(("eb_hardreset()\n"));
 
@@ -745,7 +752,8 @@
 	WriteShort(sc->sc_iobase + EB_8004_CONFIG1,
 	    sc->sc_config1 | EB_BUFCODE_STATION_ADDR);
 	for (loop = 0; loop < ETHER_ADDR_LEN; ++loop) {
-		WriteByte(sc->sc_iobase + EB_8004_BUFWIN, sc->sc_arpcom.ac_enaddr[loop]);
+		WriteByte(sc->sc_iobase + EB_8004_BUFWIN,
+		    LLADDR(ifp->if_sadl)[loop]);
 	}
 }
 
@@ -868,7 +876,7 @@
 eb_init(sc)
 	struct eb_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_int iobase = sc->sc_iobase;
 	int s;
 
@@ -969,12 +977,12 @@
 
 	/* Don't do anything if output is active. */
 
-	if (sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE)
+	if (ifp->if_flags & IFF_OACTIVE)
 		return;
 
 	/* Mark interface as output active */
 	
-	sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+	ifp->if_flags |= IFF_OACTIVE;
 
 	/* tx packets */
 
@@ -995,16 +1003,19 @@
 {
 	u_int iobase = sc->sc_iobase;
 	struct mbuf *m, *m0;
+	struct ifnet *ifp;
 	int len;
 
+	ifp = &sc->sc_ethercom.ec_if;
+
 /* Dequeue the next datagram. */
 
-	IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m0);
+	IF_DEQUEUE(&ifp->if_snd, m0);
 
 /* If there's nothing to send, return. */
 
 	if (!m0) {
-		sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+		ifp->if_flags &= ~IFF_OACTIVE;
 		sc->sc_config2 |= EB_CFG2_OUTPUT;
 		WriteShort(iobase + EB_8004_CONFIG2, sc->sc_config2);
 #ifdef EB_TX_DEBUG
@@ -1015,8 +1026,8 @@
 
 	/* Give the packet to the bpf, if any. */
 #if NBPFILTER > 0
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m0);
+	if (ifp->if_bpf)
+		bpf_mtap(ifp->if_bpf, m0);
 #endif
 
 #ifdef EB_TX_DEBUG
@@ -1108,6 +1119,7 @@
 	void *arg;
 {
 	register struct eb_softc *sc = arg;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_int iobase = sc->sc_iobase;
 	int status, s;
 	u_int txstatus;
@@ -1156,9 +1168,9 @@
  */
 
 		if (txstatus & EB_TXHDR_COLLISION) {
-			sc->sc_arpcom.ac_if.if_collisions++;
+			ifp->if_collisions++;
 		} else if (txstatus & EB_TXHDR_ERROR_MASK) {
-			sc->sc_arpcom.ac_if.if_oerrors++;
+			ifp->if_oerrors++;
 		}
 
 /*		if (txstatus & EB_TXHDR_ERROR_MASK) {
@@ -1166,7 +1178,7 @@
 		}*/
 
 		if (txstatus & EB_PKTHDR_DONE) {
-			sc->sc_arpcom.ac_if.if_opackets++;
+			ifp->if_opackets++;
 
 			/* Tx next packet */
 
@@ -1188,7 +1200,7 @@
 
 /* Install a watchdog timer needed atm to fixed rx lockups */
 
-		sc->sc_arpcom.ac_if.if_timer = EB_TIMEOUT;
+		ifp->if_timer = EB_TIMEOUT;
 
 /* Processes the received packets */
 		ebgetpackets(sc);
@@ -1214,6 +1226,7 @@
 ebgetpackets(sc)
 	struct eb_softc *sc;
 {
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_int iobase = sc->sc_iobase;
 	int addr;
 	int len;
@@ -1268,7 +1281,7 @@
 /* Did we have any errors ? then note error and go to next packet */
 
 		if (status & 0x0f) {
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++ifp->if_ierrors;
 			printf("rx packet error (%02x) - dropping packet\n", status & 0x0f);
 			sc->sc_config2 |= EB_CFG2_OUTPUT;
 			WriteShort(iobase + EB_8004_CONFIG2, sc->sc_config2);
@@ -1281,7 +1294,7 @@
 /* Is the packet too big ? - this will probably be trapped above as a receive error */
 
 		if (len > ETHER_MAX_LEN) {
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++ifp->if_ierrors;
 			printf("rx packet size error len=%d\n", len);
 			sc->sc_config2 |= EB_CFG2_OUTPUT;
 			WriteShort(iobase + EB_8004_CONFIG2, sc->sc_config2);
@@ -1297,7 +1310,7 @@
 		dprintf(("%s-->", ether_sprintf(sc->sc_pktbuf+6)));
 		dprintf(("%s\n", ether_sprintf(sc->sc_pktbuf)));
 #endif
-		sc->sc_arpcom.ac_if.if_ipackets++;
+		ifp->if_ipackets++;
 		/* Pass data up to upper levels. */
 		ebread(sc, (caddr_t)sc->sc_pktbuf, len);
 
@@ -1336,15 +1349,17 @@
 	int len;
 {
 	register struct ether_header *eh;
+	struct ifnet *ifp;
 	struct mbuf *m;
 
+	ifp = &sc->sc_ethercom.ec_if;
 	eh = (struct ether_header *)buf;
 	len -= sizeof(struct ether_header);
 	if (len <= 0)
 		return;
 
 	/* Pull packet off interface. */
-	m = ebget(buf, len, &sc->sc_arpcom.ac_if);
+	m = ebget(buf, len, ifp);
 	if (m == 0)
 		return;
 
@@ -1353,18 +1368,18 @@
 	 * Check if there's a BPF listener on this interface.
 	 * If so, hand off the raw packet to bpf.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf) {
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf, buf, len + sizeof(struct ether_header));
-/*		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m);*/
+	if (ifp->if_bpf) {
+		bpf_tap(ifp->if_bpf, buf, len + sizeof(struct ether_header));
+/*		bpf_mtap(ifp->if_bpf, m);*/
 
 		/*
 		 * 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 ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -1372,7 +1387,7 @@
 	}
 #endif
 
-	ether_input(&sc->sc_arpcom.ac_if, eh, m);
+	ether_input(ifp, eh, m);
 }
 
 /*
@@ -1469,7 +1484,7 @@
 		switch (ifa->ifa_addr->sa_family) {
 #ifdef INET
 		case AF_INET:
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			dprintf(("Interface eb is coming up (AF_INET)\n"));
 			eb_init(sc);
 			break;
@@ -1482,11 +1497,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN;
 			/* Set new address. */
 			dprintf(("Interface eb is coming up (AF_NS)\n"));
 			eb_init(sc);
@@ -1557,7 +1571,7 @@
 	struct eb_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	sc->sc_arpcom.ac_if.if_oerrors++;
+	ifp->if_oerrors++;
 	dprintf(("eb_watchdog: "));
 	dprintf(("st=%04x\n", ReadShort(sc->sc_iobase + EB_8004_STATUS)));
 
@@ -1567,7 +1581,7 @@
 
 /*	printf("%s: Reinitialised\n", sc->sc_dev.dv_xname);*/
 
-	sc->sc_arpcom.ac_if.if_timer = 0;
+	ifp->if_timer = 0;
 }
 
 /* End of if_eb.c */
--- a/sys/arch/arm32/podulebus/if_eh.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/if_eh.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_eh.c,v 1.14 1997/01/06 04:48:00 mark Exp $ */
+/* $NetBSD: if_eh.c,v 1.15 1997/03/15 18:09:38 is Exp $ */
 
 /*
  * Copyright (c) 1995 Melvin Tang-Richardson.
@@ -83,15 +83,14 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -132,7 +131,7 @@
 	irqhandler_t	sc_ih;
 
 	/* Network subsystem interface */
-	struct arpcom	sc_arpcom;
+	struct ethercom	sc_ethercom;
 	int 		promisc;
 
 	/* Driver defined state variables */
@@ -236,10 +235,11 @@
 {
 	struct eh_softc *sc = (void *) self;
 	struct podule_attach_args *pa = (void *)aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int irq;
 	int counter;
 	int temp;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	/* Check a few things about the attach args */
 
@@ -400,18 +400,18 @@
 	 * Do what we do for the EtherB card as this card uses the same slot
 	 */
 
-	sc->sc_arpcom.ac_enaddr[0] = 0x00;
-	sc->sc_arpcom.ac_enaddr[1] = 0x00;
-	sc->sc_arpcom.ac_enaddr[2] = 0xa4;
-	sc->sc_arpcom.ac_enaddr[3] = bootconfig.machine_id[2] + 0x10;
-	sc->sc_arpcom.ac_enaddr[4] = bootconfig.machine_id[1];
-	sc->sc_arpcom.ac_enaddr[5] = bootconfig.machine_id[0];
+	myaddr[0] = 0x00;
+	myaddr[1] = 0x00;
+	myaddr[2] = 0xa4;
+	myaddr[3] = bootconfig.machine_id[2] + 0x10;
+	myaddr[4] = bootconfig.machine_id[1];
+	myaddr[5] = bootconfig.machine_id[0];
 
 	/* Copy the ether addr cards filter */
 
 	PAGE(1);
 	for (counter=0; counter<6; counter++)
-		SetReg(((counter+1)<<2), sc->sc_arpcom.ac_enaddr[counter]);
+		SetReg(((counter+1)<<2), myaddr[counter]);
 	PAGE(0);
 
 	/* Fill in my application form to attach to the networking system */
@@ -426,7 +426,7 @@
 	/* Signed, dated then sent */
 
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Attach to bpf filter if it is present. */
 
@@ -436,7 +436,7 @@
 
 	/* Not print some stuff for the attach line, starting with the address */
 
-	PRINTF(" address %s", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	PRINTF(" address %s", ether_sprintf(myaddr));
 
 	/* Now the transfer mode we're operating in */
 
@@ -526,14 +526,14 @@
 
 		/* Copy a frame out of the mbufs */
 
-		IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+		IF_DEQUEUE(&ifp->if_snd, m);
 		if ( !m )
 			break;
 
 		/* Give the packet to the bpf, if any. */
 #if NBPFILTER > 0
-		if (sc->sc_arpcom.ac_if.if_bpf)
-			bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m);
+		if (ifp->if_bpf)
+			bpf_mtap(ifp->if_bpf, m);
 #endif
 
 	        buffer = txbuf;
@@ -600,7 +600,7 @@
 #ifdef INET
 		case AF_INET:
 			ehinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 		default:
@@ -640,7 +640,7 @@
 	struct eh_softc *sc = ifp->if_softc;
 
 	log (LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname );
-	sc->sc_arpcom.ac_if.if_oerrors++;
+	ifp->if_oerrors++;
 
 	ehinit (sc);
 }
@@ -877,10 +877,13 @@
 ehinit(sc)
 	struct eh_softc *sc;
 {
+	struct ifnet *ifp;
 	int card_freestart;
 	int counter;
 	register int s;
 
+	ifp = &sc->sc_ethercom.ec_if;
+
 	s = splhigh();	/* XXX - jasper */
 
 	PAGE(0);
@@ -902,8 +905,8 @@
 	if ( card_freestart > sc->sc_physend ) {
 		printf ( "eh: card short of ram %02x required %02x present\n",
 		    card_freestart, sc->sc_physstart );
-	        sc->sc_arpcom.ac_if.if_flags &= ~IFF_RUNNING;
-		sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+	        ifp->if_flags &= ~IFF_RUNNING;
+		ifp->if_flags |= IFF_OACTIVE;
 		splx(s);    /* XXX -japser */
 		return;
 	}
@@ -965,7 +968,7 @@
 	SetReg ( EH_CURR,   sc->sc_nxtpkt >> 8 );
 
 	for ( counter=0; counter<6; counter++ )
-		SetReg ( ((counter+1)<<2), sc->sc_arpcom.ac_enaddr[counter] );
+		SetReg ( ((counter+1)<<2), LLADDR(ifp->if_sadl)[counter] );
 
 	/* Put controller into start mode COM = 0x22 */
 
@@ -977,10 +980,10 @@
 
 	/* Interface is up */
 
-	sc->sc_arpcom.ac_if.if_flags |= IFF_RUNNING;
-	sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+	ifp->if_flags |= IFF_RUNNING;
+	ifp->if_flags &= ~IFF_OACTIVE;
 
-	ehstart(&sc->sc_arpcom.ac_if);
+	ehstart(ifp);
 	splx(s);    /* XXX -japser */
 }
 
@@ -1005,7 +1008,7 @@
 eh_rint(sc)
 	struct eh_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *top, **mp, *m;
 	struct ether_header eh;
 /*	struct ether_header *eh;*/
@@ -1141,7 +1144,7 @@
 					len+=m0->m_len;
 				}
 
-				bpf_tap(sc->sc_arpcom.ac_if.if_bpf, buf, len);*/
+				bpf_tap(ifp->if_bpf, buf, len);*/
 
 				struct mbuf m0;
 				m0.m_len = sizeof(struct ether_header);
@@ -1157,7 +1160,7 @@
 				 */
 				if ((ifp->if_flags & IFF_PROMISC) &&
 				    (eh.ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-				    bcmp(eh.ether_dhost, sc->sc_arpcom.ac_enaddr,
+				    bcmp(eh.ether_dhost, LLADDR(ifp->if_sadl),
 					    sizeof(eh.ether_dhost)) != 0) {
 					m_freem(m);
 					goto skip;
@@ -1229,7 +1232,7 @@
 	}
 
 	if ( isr & ISR_PTX ) {
-		struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+		struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 		int status;
 		INTR_ACK ( ISR_PTX );
 		ifp->if_timer=0;
--- a/sys/arch/arm32/podulebus/if_ie.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/if_ie.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ie.c,v 1.12 1997/01/06 04:48:01 mark Exp $ */
+/* $NetBSD: if_ie.c,v 1.13 1997/03/15 18:09:39 is Exp $ */
 
 /*
  * Copyright (c) 1995 Melvin Tang-Richardson.
@@ -78,15 +78,14 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -136,7 +135,7 @@
 	int		sc_rom;
 	int		sc_ram;
 	int		sc_control;
-	struct arpcom	sc_arpcom;
+	struct ethercom	sc_ethercom;
 	int		promisc;
 	int		sc_irqmode;
 
@@ -317,10 +316,10 @@
 {
 	struct ie_softc *sc = (void *)self;
 	struct podule_attach_args *pa = (void *)aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i;
 	char idrom[32];
-	u_char *hwaddr = sc->sc_arpcom.ac_enaddr;
+	u_int8_t hwaddr[ETHER_ADDR_LEN];
 
 	/* Check a few things about the attach args */
 
@@ -464,13 +463,13 @@
 	
 	/* Signed, dated then sent */
         if_attach (ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, hwaddr);
 
 	/* "Hmm," said nuts, "what if the attach fails" */
     
 	/* Write some pretty things on the annoucement line */
 	printf ( " %s using %dk card ram",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr),
+	    ether_sprintf(hwaddr),
 	    ((NRXBUF*IE_RXBUF_SIZE)+(NTXBUF*IE_TXBUF_SIZE))/1024 );
 
 #if NBPFILTER > 0
@@ -635,7 +634,7 @@
 #ifdef INET
 		case AF_INET:
 		    ieinit(sc);
-		    arp_ifinit(&sc->sc_arpcom, ifa );
+		    arp_ifinit(ifp, ifa );
 		    break;
 #endif
 		default:
@@ -714,7 +713,7 @@
 	struct ie_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 	iereset(sc);
 }
 
@@ -871,12 +870,15 @@
 ieinit(sc)
 	struct ie_softc *sc;
 {
+    struct ifnet *ifp;
     struct ie_sys_ctl_block scb;
     struct ie_config_cmd cmd;
     struct ie_iasetup_cmd iasetup_cmd;
     u_long ptr = IE_IBASE + IE_SCB_OFF + sizeof scb;
     int n;
 
+    ifp = &sc->sc_ethercom.ec_if;
+
     bzero ( &scb, sizeof(scb) );
 
     /* Send the configure command */
@@ -919,7 +921,7 @@
     iasetup_cmd.com.ie_cmd_cmd = IE_CMD_IASETUP | IE_CMD_LAST;
     iasetup_cmd.com.ie_cmd_link = 0xffff;
 
-    bcopy ( sc->sc_arpcom.ac_enaddr, (caddr_t) &iasetup_cmd.ie_address,
+    bcopy ( LLADDR(ifp->if_sadl), (caddr_t) &iasetup_cmd.ie_address,
 	 	sizeof (iasetup_cmd.ie_address) );
 
     if ( command_and_wait(sc, IE_CU_START, &scb, &iasetup_cmd, ptr, sizeof cmd,
@@ -945,8 +947,8 @@
     /* meminit */
     ptr = setup_rfa(sc, ptr);
 
-    sc->sc_arpcom.ac_if.if_flags |= IFF_RUNNING;
-    sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+    ifp->if_flags |= IFF_RUNNING;
+    ifp->if_flags &= ~IFF_OACTIVE;
 
     /* Setup transmit buffers */
 
@@ -1147,7 +1149,7 @@
     if ( m==0 )
 	return 0;
 
-    m->m_pkthdr.rcvif = &sc->sc_arpcom.ac_if;
+    m->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
     m->m_pkthdr.len = totlen;
     len = MHLEN;
     top = 0;
@@ -1270,9 +1272,12 @@
     int status;
     struct ie_recv_frame_desc rfd;
     struct mbuf *m=0;
+    struct ifnet *ifp;
     struct ether_header eh;
     int last;
 
+    ifp = &sc->sc_ethercom.ec_if;
+
     ie2host(sc, sc->rframes[num], &rfd, sizeof rfd );
     status = rfd.ie_fd_status;
 
@@ -1302,7 +1307,7 @@
     }
 
     if ( m==0 ) {
-	sc->sc_arpcom.ac_if.if_ierrors++;
+	ifp->if_ierrors++;
 	return;
     }
 
@@ -1312,13 +1317,13 @@
 */
 
 #if NBFILTER > 0
-    if ( sc->sc_arpcom.ac_if.if_bpf ) {
-	bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m );
+    if ( ifp->if_bpf ) {
+	bpf_mtap(ifp->if_bpf, m );
     };
 #endif
 
-    ether_input ( &sc->sc_arpcom.ac_if, &eh, m );
-    sc->sc_arpcom.ac_if.if_ipackets++;
+    ether_input ( ifp, &eh, m );
+    ifp->if_ipackets++;
 }
 
 void
@@ -1348,7 +1353,7 @@
 	    if ( !--times_thru ) {
 		printf ( "IERINT: Uh oh. Nuts, look at this bit!!!\n" );
     		ie2host ( sc, IE_IBASE + IE_SCB_OFF, &scb, sizeof scb );
-		sc->sc_arpcom.ac_if.if_ierrors += scb.ie_err_crc +
+		sc->sc_ethercom.ec_if.if_ierrors += scb.ie_err_crc +
 						  scb.ie_err_align +
 						  scb.ie_err_resource +
 						  scb.ie_err_overrun;
@@ -1415,7 +1420,7 @@
 
     if (status & IE_ST_RNR) {
 	printf ( "ie: receiver not ready\n" );
-	sc->sc_arpcom.ac_if.if_ierrors++;
+	sc->sc_ethercom.ec_if.if_ierrors++;
 	iereset(sc);
     }
 
@@ -1479,7 +1484,7 @@
     command_and_wait(sc, IE_CU_START, &scb, &xc, sc->xmit_cmds[sc->xctail]
 			, sizeof xc, IE_STAT_COMPL);
 
-    sc->sc_arpcom.ac_if.if_timer = 5;
+    sc->sc_ethercom.ec_if.if_timer = 5;
 }
 /*
  * Start sending all the queued buffers.
@@ -1511,7 +1516,7 @@
 			break;
 		}
 
-		IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+		IF_DEQUEUE(&ifp->if_snd, m);
 		if (!m)
 			break;
 
@@ -1531,8 +1536,8 @@
 		len = max(len, ETHER_MIN_LEN);
 
 #if NBPFILTER > 0
-		if ( sc->sc_arpcom.ac_if.if_bpf )
-		    bpf_tap(sc->sc_arpcom.ac_if.if_bpf, txbuf, len);
+		if ( ifp->if_bpf )
+		    bpf_tap(ifp->if_bpf, txbuf, len);
 #endif
 
 		/* When we write directly to the card we dont need this */
@@ -1559,7 +1564,7 @@
 ietint(sc)
 	struct ie_softc *sc;
 {
-    struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+    struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
     int status;
 
--- a/sys/arch/arm32/podulebus/rapide.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/rapide.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: rapide.c,v 1.1 1997/02/23 04:00:31 mark Exp $	*/
+/*	$NetBSD: rapide.c,v 1.2 1997/03/15 18:09:40 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
--- a/sys/arch/arm32/podulebus/rapide_io_asm.S	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/rapide_io_asm.S	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: rapide_io_asm.S,v 1.1 1997/02/23 04:00:32 mark Exp $	*/
+/*	$NetBSD: rapide_io_asm.S,v 1.2 1997/03/15 18:09:41 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe.
--- a/sys/arch/arm32/podulebus/rapidereg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/podulebus/rapidereg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: rapidereg.h,v 1.1 1997/02/23 04:00:32 mark Exp $	*/
+/*	$NetBSD: rapidereg.h,v 1.2 1997/03/15 18:09:42 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
--- a/sys/arch/arm32/rc7500/if_es.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/arm32/rc7500/if_es.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_es.c,v 1.6 1997/02/04 02:23:35 mark Exp $ */
+/* $NetBSD: if_es.c,v 1.7 1997/03/15 18:09:32 is Exp $ */
 
 /*
  * Copyright (c) 1996, Danny C Tsen.
@@ -54,15 +54,14 @@
 #include <sys/device.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -89,7 +88,7 @@
 struct	es_softc {
 	struct	device sc_dev;
 	irqhandler_t sc_ih;
-	struct	arpcom sc_arpcom;	/* common Ethernet structures */
+	struct	ethercom sc_ethercom;	/* common Ethernet structures */
 	u_int	sc_base;	/* base address of board */
 	int	nrxovrn;
 	u_int	sc_intctl;
@@ -163,7 +162,7 @@
 
 /*
  * XXX - FIX ME
- * fake a ethernet address.
+ * fake an Ethernet address.
  */
 unsigned long vendor_id = 0x007f00;	/* just make one */
 
@@ -174,8 +173,9 @@
 {
 	struct es_softc *sc = (void *)self;
 	struct mainbus_attach_args *mbap = aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	unsigned long ser;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	sc->sc_base = mbap->mb_iobase;
 
@@ -184,17 +184,17 @@
 	 * Manufacturer decides the 3 first bytes, i.e. ethernet vendor ID.
 	 * (Currently only Ameristar.)
 	 */
-	sc->sc_arpcom.ac_enaddr[0] = (vendor_id >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[1] = (vendor_id >> 8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[2] = vendor_id & 0xff;
+	myaddr[0] = (vendor_id >> 16) & 0xff;
+	myaddr[1] = (vendor_id >> 8) & 0xff;
+	myaddr[2] = vendor_id & 0xff;
 
 	/*
 	 * XXX We should have a serial number on board!!!!
 	 * Serial number for board contains last 3 bytes.
 	 */
-	sc->sc_arpcom.ac_enaddr[3] = (ser >> 16) & 0xff;
-	sc->sc_arpcom.ac_enaddr[4] = (ser >>  8) & 0xff;
-	sc->sc_arpcom.ac_enaddr[5] = (ser      ) & 0xff;
+	myaddr[3] = (ser >> 16) & 0xff;
+	myaddr[4] = (ser >>  8) & 0xff;
+	myaddr[5] = (ser      ) & 0xff;
 
 	/* Initialize ifnet structure. */
 	bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
@@ -208,10 +208,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Print additional info when attached. */
-	printf(": address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": address %s\n", ether_sprintf(myaddr));
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -265,7 +265,7 @@
 esinit(sc)
 	struct es_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	register u_int iobase = sc->sc_base;
 	int s;
 
@@ -292,9 +292,9 @@
 	outl(iobase + BANKSEL, BSR_BANK1);
 	outl(iobase + B1CR, (CR_ALLONES | CR_NO_WAIT_ST | CR_16BIT));
 	outl(iobase + B1CTR, CTR_AUTO_RLSE);
-	outl(iobase + B1IAR1, *((u_short *) &sc->sc_arpcom.ac_enaddr[0]));
-	outl(iobase + B1IAR3, *((u_short *) &sc->sc_arpcom.ac_enaddr[2]));
-	outl(iobase + B1IAR5, *((u_short *) &sc->sc_arpcom.ac_enaddr[4]));
+	outl(iobase + B1IAR1, *((u_short *) LLADDR(ifp->if_sadl)[0]));
+	outl(iobase + B1IAR3, *((u_short *) LLADDR(ifp->if_sadl)[2]));
+	outl(iobase + B1IAR5, *((u_short *) LLADDR(ifp->if_sadl)[4]));
 
 	outl(iobase + BANKSEL, BSR_BANK2);
 	outl(iobase + B2MMUCR, MMUCR_RESET);
@@ -338,7 +338,7 @@
 
 #ifdef ESDEBUG
 	while ((smc->b2.bsr & BSR_BANKMSK) != BSR_BANK2 &&
-	    sc->sc_arpcom.ac_if.if_flags & IFF_RUNNING) {
+	    sc->sc_ethercom.ec_if.if_flags & IFF_RUNNING) {
 		printf("%s: intr BSR not 2: %04x\n", sc->sc_dev.dv_xname,
 		    smc->b2.bsr);
 		smc->b2.bsr = BSR_BANK2;
@@ -379,7 +379,7 @@
 		    intsts);
 		outb(iobase + B2IST, ACK_RX_OVRN);
 		printf ("->%02x\n", inb(iobase + B2IST));
-		sc->sc_arpcom.ac_if.if_ierrors++;
+		sc->sc_ethercom.ec_if.if_ierrors++;
 		if (sc->nrxovrn++ >= 10) {
 			outl(iobase + B2MMUCR, MMUCR_RESET);
 			sc->nrxovrn = 0;
@@ -403,7 +403,7 @@
 					break;
 			}
 			outb(iobase + B2PNR, save_pnr);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 #ifdef ESDEBUG
 		else if (esdebug || 1) {
@@ -439,7 +439,7 @@
 			outl(iobase + BANKSEL, BSR_BANK0);
 			ecr = inl(iobase + B0ECR);	/* Get error counters */
 			if (ecr & ECR_CCMSK)
-				sc->sc_arpcom.ac_if.if_collisions += (ecr & 0x0f) +
+				sc->sc_ethercom.ec_if.if_collisions += (ecr & 0x0f) +
 				    ((ecr >> 4) & 0x0f);
 			outl(iobase + BANKSEL, BSR_BANK2);
 		}
@@ -482,7 +482,7 @@
 			outl(iobase + BANKSEL, BSR_BANK0);
 			outl(iobase + B0TCR, inl(iobase + B0TCR) | TCR_TXENA);
 			outl(iobase + BANKSEL, BSR_BANK2);
-			sc->sc_arpcom.ac_if.if_oerrors++;
+			sc->sc_ethercom.ec_if.if_oerrors++;
 			sc->sc_intctl |= MSK_TX_EMPTY | MSK_TX;
 		} else {
 			/*
@@ -515,7 +515,7 @@
 	}
 
 	/* output packets */
-	estint(&sc->sc_arpcom.ac_if);
+	estint(&sc->sc_ethercom.ec_if);
 
 #ifdef ESDEBUG
 	while ((smc->b2.bsr & BSR_BANKMSK) != BSR_BANK2) {
@@ -593,7 +593,7 @@
 		outl(iobase + B2MMUCR, MMUCR_REMRLS_RX);
 		while (inl(iobase + B2MMUCR) & MMUCR_BUSY)
 			;
-		++sc->sc_arpcom.ac_if.if_ierrors;
+		++sc->sc_ethercom.ec_if.if_ierrors;
 #ifdef ESDEBUG
 		if (--sc->sc_smcbusy) {
 			printf("%s: esrintr busy on bad packet exit\n",
@@ -635,7 +635,7 @@
 #endif
 
 	pktlen -= sizeof(struct ether_header);
-	ifp = &sc->sc_arpcom.ac_if;
+	ifp = &sc->sc_ethercom.ec_if;
 	ifp->if_ipackets++;
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == NULL)
@@ -677,18 +677,18 @@
 	 * Check if there's a BPF listener on this interface.  If so, hand off
 	 * the raw packet to bpf.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf) {
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf, pktbuf, pktlen);
-		/* bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, top);*/
+	if (sc->sc_ethercom.ec_if.if_bpf) {
+		bpf_tap(sc->sc_ethercom.ec_if.if_bpf, pktbuf, pktlen);
+		/* bpf_mtap(sc->sc_ethercom.ec_if.if_bpf, top);*/
 
 		/*
 		 * 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 ((sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC) &&
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(top);
 			return;
@@ -731,9 +731,9 @@
 	int i;
 	u_char active_pnr;
 
-	if ((sc->sc_arpcom.ac_if.if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
+	if ((sc->sc_ethercom.ec_if.if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
 	    IFF_RUNNING) {
-		IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+		IF_DEQUEUE(&sc->sc_ethercom.ec_if.if_snd, m);
 		if (m)
 			m_freem(m);
 		return;
@@ -751,7 +751,7 @@
 	}
 #endif
 
-	IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+	IF_DEQUEUE(&sc->sc_ethercom.ec_if.if_snd, m);
 	if (!m)
 		return;
 
@@ -776,8 +776,8 @@
 	}
 
 #if NBPFILTER > 0
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf, (char *)pktbuf, len);
+	if (sc->sc_ethercom.ec_if.if_bpf)
+		bpf_tap(sc->sc_ethercom.ec_if.if_bpf, (char *)pktbuf, len);
 #endif
 
 	pktctlw = 0;
@@ -790,7 +790,7 @@
 	}
 
 	if (inb(iobase + B2ARR) & ARR_FAILED) {
-		sc->sc_arpcom.ac_if.if_flags |= IFF_OACTIVE;
+		sc->sc_ethercom.ec_if.if_flags |= IFF_OACTIVE;
 		sc->sc_intctl |= MSK_ALLOC;
 		goto esstart_out;
 	}
@@ -814,7 +814,7 @@
 		printf("%s: esstart - PNR changed %x->%x\n",
 		    sc->sc_dev.dv_xname, active_pnr, inb(iobase + B2PNR));
 
-	sc->sc_arpcom.ac_if.if_opackets++;	/* move to interrupt? */
+	sc->sc_ethercom.ec_if.if_opackets++;	/* move to interrupt? */
 	sc->sc_intctl |= MSK_TX_EMPTY | MSK_TX;
 
 esstart_out:
@@ -855,7 +855,7 @@
 #ifdef INET
 		case AF_INET:
 			esinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -865,11 +865,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN));
 			/* Set new address. */
 			esinit(sc);
 			break;
@@ -918,8 +917,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -958,7 +957,7 @@
 	struct es_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->.if_oerrors;
 
 	esreset(sc);
 }
--- a/sys/arch/atari/atari/machdep.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/atari/atari/machdep.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.38 1997/03/10 14:44:27 leo Exp $	*/
+/*	$NetBSD: machdep.c,v 1.39 1997/03/15 18:09:43 is Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -1142,7 +1142,7 @@
 /*
  * Network interrupt handling
  */
-#include "ether.h"
+#include "arp.h"
 #include "ppp.h"
 
 #ifdef NPPP
@@ -1151,7 +1151,7 @@
 #ifdef INET
 void	ipintr __P((void));
 #endif
-#if NETHER > 0
+#if NARP > 0
 void	arpintr __P((void));
 #endif
 #ifdef NS
@@ -1165,7 +1165,7 @@
 netintr()
 {
 #ifdef INET
-#if NETHER > 0
+#if NARP > 0
 	if (netisr & (1 << NETISR_ARP)) {
 		netisr &= ~(1 << NETISR_ARP);
 		arpintr();
--- a/sys/arch/atari/conf/files.atari	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/atari/conf/files.atari	Sat Mar 15 18:09:08 1997 +0000
@@ -1,6 +1,6 @@
 #
-#	$NetBSD: files.atari,v 1.32 1997/03/10 09:44:53 leo Exp $
-#
+#	$NetBSD: files.atari,v 1.33 1997/03/15 18:09:44 is Exp $
+
 
 maxpartitions 16
 
--- a/sys/arch/atari/include/intr.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/atari/include/intr.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.1 1997/02/26 12:18:50 leo Exp $	*/
+/*	$NetBSD: intr.h,v 1.2 1997/03/15 18:09:46 is Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
--- a/sys/arch/hp300/dev/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/hp300/dev/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.37 1997/01/30 09:18:53 thorpej Exp $	*/
+/*	$NetBSD: if_le.c,v 1.38 1997/03/15 18:09:47 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -49,10 +49,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
@@ -178,10 +179,10 @@
 	 * Read the ethernet address off the board, one nibble at a time.
 	 */
 	cp = (char *)(lestd[3] + (int)addr);
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++) {
-		sc->sc_arpcom.ac_enaddr[i] = (*++cp & 0xF) << 4;
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++) {
+		sc->sc_enaddr[i] = (*++cp & 0xF) << 4;
 		cp++;
-		sc->sc_arpcom.ac_enaddr[i] |= *++cp & 0xF;
+		sc->sc_enaddr[i] |= *++cp & 0xF;
 		cp++;
 	}
 
--- a/sys/arch/hp300/dev/if_levar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/hp300/dev/if_levar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_levar.h,v 1.6 1997/01/30 09:18:54 thorpej Exp $	*/
+/*	$NetBSD: if_levar.h,v 1.7 1997/03/15 18:09:48 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -43,7 +43,7 @@
  * Ethernet software status per interface.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface.
+ * ethercom.ec_if, which the routing code uses to locate the interface.
  * This structure contains the output queue for the interface, its address, ...
  */
 struct	le_softc {
--- a/sys/arch/hp300/stand/common/conf.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/hp300/stand/common/conf.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: conf.c,v 1.1 1997/02/04 03:52:16 thorpej Exp $	*/
+/*	$NetBSD: conf.c,v 1.2 1997/03/15 18:09:49 is Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -40,7 +40,7 @@
 
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <lib/libsa/if_ether.h>
 #include <netinet/in_systm.h>
 
 #include <lib/libsa/stand.h>
--- a/sys/arch/hp300/stand/common/netio.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/hp300/stand/common/netio.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: netio.c,v 1.1 1997/02/04 03:52:40 thorpej Exp $	*/
+/*	$NetBSD: netio.c,v 1.2 1997/03/15 18:09:50 is Exp $	*/
 
 /*
  * Copyright (c) 1995, 1996 Jason R. Thorpe
@@ -54,7 +54,7 @@
 
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <lib/libsa/if_ether.h>
 #include <netinet/in_systm.h>
 
 #include <lib/libsa/stand.h>
--- a/sys/arch/i386/i386/genassym.cf	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/i386/i386/genassym.cf	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.1 1997/02/26 23:50:07 mycroft Exp $
+#	$NetBSD: genassym.cf,v 1.2 1997/03/15 18:09:51 is Exp $
 
 #
 # Copyright (c) 1995, 1997 Charles M. Hannum.  All rights reserved.
--- a/sys/arch/m68k/m68k/kgdb_m68k.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/m68k/m68k/kgdb_m68k.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: kgdb_m68k.c,v 1.1 1997/02/12 00:58:01 gwr Exp $	*/
+/*	$NetBSD: kgdb_m68k.c,v 1.2 1997/03/15 18:09:53 is Exp $	*/
 
 /*
  * Copyright (c) 1990, 1993
--- a/sys/arch/mac68k/conf/RAMDISK	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/conf/RAMDISK	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: RAMDISK,v 1.10 1997/02/14 06:27:20 scottr Exp $
+#	$NetBSD: RAMDISK,v 1.11 1997/03/15 18:09:54 is Exp $
 #
 # Generic mac68k kernel with built-in RAM disk image.
 
--- a/sys/arch/mac68k/conf/files.mac68k	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/conf/files.mac68k	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.mac68k,v 1.62 1997/03/06 02:14:51 briggs Exp $
+#	$NetBSD: files.mac68k,v 1.63 1997/03/15 18:09:55 is Exp $
 
 # mac68k-specific configuration info
 
@@ -45,7 +45,7 @@
 attach	grf at grfbus
 file	arch/mac68k/dev/grf.c		grf needs-flag
 
-device	ae: ifnet, ether
+device	ae: ifnet, ether, arp
 attach	ae at nubus with ae_nubus
 file	arch/mac68k/dev/if_ae_nubus.c	ae_nubus
 file	arch/mac68k/dev/if_ae.c		ae
--- a/sys/arch/mac68k/dev/if_ae.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/dev/if_ae.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ae.c,v 1.57 1997/03/04 15:12:04 scottr Exp $	*/
+/*	$NetBSD: if_ae.c,v 1.58 1997/03/15 18:09:56 is Exp $	*/
 
 /*
  * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
@@ -35,14 +35,14 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -129,8 +129,9 @@
  * Do bus-independent setup.
  */
 int
-aesetup(sc)
+aesetup(sc, lladdr)
 	struct ae_softc *sc;
+	u_int8_t *lladdr;
 {
 	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
 	int i;
@@ -175,10 +176,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, lladdr);
 
 	/* Print additional info when attached. */
-	printf(": address %s, ", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": address %s, ", ether_sprintf(lladdr));
 
 	printf("type %s, %dKB memory\n", sc->type_str, sc->mem_size / 1024);
 
--- a/sys/arch/mac68k/dev/if_ae_nubus.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/dev/if_ae_nubus.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ae_nubus.c,v 1.6 1997/03/10 17:55:15 scottr Exp $	*/
+/*	$NetBSD: if_ae_nubus.c,v 1.7 1997/03/15 18:09:59 is Exp $	*/
 
 /*
  * Copyright (C) 1997 Scott Reynolds
@@ -40,10 +40,11 @@
 #include <sys/systm.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/bus.h>
@@ -114,13 +115,14 @@
 {
 	struct ae_softc *sc = (struct ae_softc *) self;
 	struct nubus_attach_args *na = (struct nubus_attach_args *) aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ec.ec_if;
 	bus_space_tag_t bst;
 	bus_space_handle_t bsh;
 	int success;
 #ifdef AE_OLD_GET_ENADDR
 	int i;
 #endif
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	bst = na->na_tag;
 	if (bus_space_map(bst, NUBUS_SLOT2PA(na->slot), NBMEMSIZE,
@@ -163,10 +165,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (AE_ROM_OFFSET + i * 2));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -190,10 +192,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (DP_ROM_OFFSET + i * 2));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -222,10 +224,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (FE_ROM_OFFSET + i));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -261,10 +263,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (GC_ROM_OFFSET + i * 4));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -290,7 +292,7 @@
 			printf(": failed to map register space\n");
 			break;
 		}
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -308,7 +310,7 @@
 	}
 
 	ifp->if_watchdog = ae_nb_watchdog;	/* Override watchdog */
-	if (aesetup(sc)) {
+	if (aesetup(sc, myaddr)) {
 		bus_space_unmap(bst, bsh, NBMEMSIZE);
 		return;
 	}
@@ -413,7 +415,7 @@
 #endif
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 
 	aereset(sc);
 }
--- a/sys/arch/mac68k/dev/if_aereg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/dev/if_aereg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_aereg.h,v 1.14 1997/02/24 07:34:20 scottr Exp $	*/
+/*	$NetBSD: if_aereg.h,v 1.15 1997/03/15 18:09:59 is Exp $	*/
 
 /*
  * National Semiconductor DS8390 NIC register definitions.
--- a/sys/arch/mac68k/dev/if_aevar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/dev/if_aevar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_aevar.h,v 1.5 1997/02/28 08:56:07 scottr Exp $	*/
+/*	$NetBSD: if_aevar.h,v 1.6 1997/03/15 18:10:01 is Exp $	*/
 
 /*
  * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
@@ -29,7 +29,7 @@
 
 /*	struct	intrhand sc_ih;	*/
 
-	struct arpcom sc_arpcom;/* ethernet common */
+	struct ethercom sc_ec;	/* ethernet common */
 	int	sc_flags;	/* interface flags, from config */
 
 	char	type_str[INTERFACE_NAME_LEN];	/* type string */
@@ -58,7 +58,7 @@
 int	ae_size_card_memory __P((
 	    bus_space_tag_t, bus_space_handle_t, int));
 
-int	aesetup __P((struct ae_softc *));
+int	aesetup __P((struct ae_softc *, u_int8_t *));
 void	aeintr __P((void *, int));
 int	aeioctl __P((struct ifnet *, u_long, caddr_t));
 void	aestart __P((struct ifnet *));
@@ -71,4 +71,4 @@
 struct mbuf *aeget __P((struct ae_softc *, int, int));
 
 int	ae_put __P((struct ae_softc *, struct mbuf *, int));
-void	ae_getmcaf __P((struct arpcom *, u_char *));
+void	ae_getmcaf __P((struct ethercom *, u_char *));
--- a/sys/arch/mac68k/dev/sbc_obio.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/dev/sbc_obio.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sbc_obio.c,v 1.1 1997/03/01 20:18:59 scottr Exp $	*/
+/*	$NetBSD: sbc_obio.c,v 1.2 1997/03/15 18:10:01 is Exp $	*/
 
 /*
  * Copyright (C) 1996,1997 Scott Reynolds.  All rights reserved.
--- a/sys/arch/mac68k/dev/sbcvar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/dev/sbcvar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sbcvar.h,v 1.1 1997/03/01 20:19:00 scottr Exp $	*/
+/*	$NetBSD: sbcvar.h,v 1.2 1997/03/15 18:10:03 is Exp $	*/
 
 /*
  * Copyright (C) 1996 Scott Reynolds.  All rights reserved.
--- a/sys/arch/mac68k/mac68k/machdep.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/mac68k/machdep.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.134 1997/02/14 06:15:30 scottr Exp $	*/
+/*	$NetBSD: machdep.c,v 1.135 1997/03/15 18:10:06 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Jason R. Thorpe.  All rights reserved.
@@ -133,7 +133,7 @@
 
 #include <machine/viareg.h>
 #include "macrom.h"
-#include "ether.h"
+#include "arp.h"
 
 /* The following is used externally (sysctl_hw) */
 char    machine[] = "mac68k";	/* cpu "architecture" */
@@ -1227,7 +1227,7 @@
 netintr()
 {
 #ifdef INET
-#if NETHER
+#if NARP
 	if (netisr & (1 << NETISR_ARP)) {
 		netisr &= ~(1 << NETISR_ARP);
 		arpintr();
--- a/sys/arch/mac68k/nubus/if_ae_nubus.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/nubus/if_ae_nubus.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ae_nubus.c,v 1.6 1997/03/10 17:55:15 scottr Exp $	*/
+/*	$NetBSD: if_ae_nubus.c,v 1.7 1997/03/15 18:09:59 is Exp $	*/
 
 /*
  * Copyright (C) 1997 Scott Reynolds
@@ -40,10 +40,11 @@
 #include <sys/systm.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/bus.h>
@@ -114,13 +115,14 @@
 {
 	struct ae_softc *sc = (struct ae_softc *) self;
 	struct nubus_attach_args *na = (struct nubus_attach_args *) aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ec.ec_if;
 	bus_space_tag_t bst;
 	bus_space_handle_t bsh;
 	int success;
 #ifdef AE_OLD_GET_ENADDR
 	int i;
 #endif
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	bst = na->na_tag;
 	if (bus_space_map(bst, NUBUS_SLOT2PA(na->slot), NBMEMSIZE,
@@ -163,10 +165,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (AE_ROM_OFFSET + i * 2));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -190,10 +192,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (DP_ROM_OFFSET + i * 2));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -222,10 +224,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (FE_ROM_OFFSET + i));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -261,10 +263,10 @@
 #ifdef AE_OLD_GET_ENADDR
 		/* Get station address from on-board ROM */
 		for (i = 0; i < ETHER_ADDR_LEN; ++i)
-			sc->sc_arpcom.ac_enaddr[i] =
+			myaddr[i] =
 			    bus_space_read_1(bst, bsh, (GC_ROM_OFFSET + i * 4));
 #else
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -290,7 +292,7 @@
 			printf(": failed to map register space\n");
 			break;
 		}
-		if (ae_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr)) {
+		if (ae_nb_get_enaddr(na, myaddr)) {
 			printf(": can't find MAC address\n");
 			break;
 		}
@@ -308,7 +310,7 @@
 	}
 
 	ifp->if_watchdog = ae_nb_watchdog;	/* Override watchdog */
-	if (aesetup(sc)) {
+	if (aesetup(sc, myaddr)) {
 		bus_space_unmap(bst, bsh, NBMEMSIZE);
 		return;
 	}
@@ -413,7 +415,7 @@
 #endif
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 
 	aereset(sc);
 }
--- a/sys/arch/mac68k/obio/sbc_obio.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mac68k/obio/sbc_obio.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sbc_obio.c,v 1.1 1997/03/01 20:18:59 scottr Exp $	*/
+/*	$NetBSD: sbc_obio.c,v 1.2 1997/03/15 18:10:01 is Exp $	*/
 
 /*
  * Copyright (C) 1996,1997 Scott Reynolds.  All rights reserved.
--- a/sys/arch/mips/mips/trap.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mips/mips/trap.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.50 1996/10/13 21:37:49 jonathan Exp $	*/
+/*	$NetBSD: trap.c,v 1.51 1997/03/15 18:10:10 is Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -82,7 +82,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #include <netinet/ip_var.h>
 
 #include "ppp.h"
--- a/sys/arch/mvme68k/dev/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mvme68k/dev/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.11 1997/01/31 01:53:06 thorpej Exp $	*/
+/*	$NetBSD: if_le.c,v 1.12 1997/03/15 18:10:12 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -49,10 +49,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <vm/vm.h>
@@ -141,7 +142,7 @@
 	sc->sc_addr = (u_long)sc->sc_mem;
 	sc->sc_memsize = 4 * NBPG;	/* XXX */
 
-	myetheraddr(sc->sc_arpcom.ac_enaddr);
+	myetheraddr(sc->sc_enaddr);
 
 	sc->sc_copytodesc = am7990_copytobuf_contig;
 	sc->sc_copyfromdesc = am7990_copyfrombuf_contig;
--- a/sys/arch/mvme68k/stand/netboot/dev_net.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/mvme68k/stand/netboot/dev_net.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dev_net.c,v 1.4 1996/05/17 21:08:44 chuck Exp $ */
+/*	$NetBSD: dev_net.c,v 1.5 1997/03/15 18:10:13 is Exp $ */
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -52,7 +52,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include "if_ether.h"
 #include <netinet/in_systm.h>
 
 #include <machine/prom.h>
--- a/sys/arch/pc532/conf/files.pc532	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pc532/conf/files.pc532	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.pc532,v 1.28 1997/03/01 09:50:30 matthias Exp $
+#	$NetBSD: files.pc532,v 1.29 1997/03/15 18:10:15 is Exp $
 #
 # new style config file for pc532 architecture
 #
@@ -27,7 +27,7 @@
 attach	scn at mainbus
 file	arch/pc532/dev/scn.c		scn needs-flag
 
-device	lpt: ether, ifnet
+device	lpt: ether, ifnet, arp
 attach	lpt at mainbus
 file	arch/pc532/dev/lpt.c		lpt needs-count
 
--- a/sys/arch/pc532/dev/lpt.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pc532/dev/lpt.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: lpt.c,v 1.18 1997/01/11 10:58:12 matthias Exp $	*/
+/*	$NetBSD: lpt.c,v 1.19 1997/03/15 18:10:16 is Exp $	*/
 
 /*
  * Copyright (c) 1994 Matthias Pfaller.
@@ -78,16 +78,17 @@
 #include "bpfilter.h"
 #include <sys/mbuf.h>
 #include <sys/socket.h>
+
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.h>
+
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #if NBPFILTER > 0
 #include <sys/time.h>
 #include <net/bpf.h>
@@ -153,7 +154,7 @@
 #define	LPT_NOPRIME	0x40	/* don't prime on open */
 
 #if defined(INET) && defined(PLIP)
-	struct	arpcom	sc_arpcom;
+	struct	ethercom sc_ethercom;
 	u_char		*sc_ifbuf;
 	int		sc_ifierrs;	/* consecutive input errors */
 	int		sc_ifoerrs;	/* consecutive output errors */
@@ -290,7 +291,7 @@
 		return EBUSY;
 
 #if defined(INET) && defined(PLIP)
-	if (sc->sc_arpcom.ac_if.if_flags & IFF_UP)
+	if (sc->sc_ethercom.ec_if.if_flags & IFF_UP)
 		return EBUSY;
 #endif
 
@@ -446,7 +447,7 @@
 	volatile struct i8255 *i8255 = sc->sc_i8255;
 
 #if defined(INET) && defined(PLIP)
-	if (sc->sc_arpcom.ac_if.if_flags & IFF_UP) {
+	if (sc->sc_ethercom.ec_if.if_flags & IFF_UP) {
 		i8255->port_a &= ~LPA_ACKENABLE;
 		sc->sc_pending |= PLIP_IPENDING;
 		softintr(sc->sc_ifsoftint);
@@ -505,7 +506,7 @@
 	struct lpt_softc *sc;
 	int unit;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	sc->sc_ifbuf = NULL;
 	sprintf(ifp->if_xname, "plip%d", unit);
@@ -573,42 +574,37 @@
 		break;
 
 	case SIOCSIFADDR:
+		sdl = ifp->if_sadl;
 		if (ifa->ifa_addr->sa_family == AF_INET) {
 			if (!sc->sc_ifbuf)
 				sc->sc_ifbuf =
 					malloc(PLIPMTU + ifp->if_hdrlen,
 					       M_DEVBUF, M_WAITOK);
-			sc->sc_arpcom.ac_enaddr[0] = 0xfc;
-			sc->sc_arpcom.ac_enaddr[1] = 0xfc;
+			LLADDR(sdl)[0] = 0xfc;
+			LLADDR(sdl)[1] = 0xfc;
 			bcopy((caddr_t)&IA_SIN(ifa)->sin_addr,
-			      (caddr_t)&sc->sc_arpcom.ac_enaddr[2], 4);
+			      LLADDR(sdl)[2], 4);
 #if defined(COMPAT_PLIP10)
 			if (ifp->if_flags & IFF_LINK0) {
 				int i;
-				sc->sc_arpcom.ac_enaddr[0] = 0xfd;
-				sc->sc_arpcom.ac_enaddr[1] = 0xfd;
+				LLADDR(sdl)[0] = 0xfd;
+				LLADDR(sdl)[1] = 0xfd;
 				for (i = sc->sc_adrcksum = 0; i < 5; i++)
-					sc->sc_adrcksum += sc->sc_arpcom.ac_enaddr[i];
+					sc->sc_adrcksum += LLADDR(sdl)[i];
 				sc->sc_adrcksum *= 2;
 			}
 #endif
 #if 0
-			for (ifa = ifp->if_addrlist.tqh_first; ifa != 0;
-			    ifa = ifa->ifa_list.tqe_next)
-				if ((sdl = (struct sockaddr_dl *)ifa->ifa_addr) &&
-				    sdl->sdl_family == AF_LINK) {
-					sdl->sdl_type = IFT_ETHER;
-					sdl->sdl_alen = ifp->if_addrlen;
-					bcopy((caddr_t)((struct arpcom *)ifp)->ac_enaddr,
-					      LLADDR(sdl), ifp->if_addrlen);
-					break;
-				}
+			if (sdl) {
+				sdl->sdl_type = IFT_ETHER;
+				sdl->sdl_alen = ifp->if_addrlen;
+			}
 #endif
 			ifp->if_flags |= IFF_RUNNING | IFF_UP;
 			sc->sc_i8255->port_control = LPT_IRQDISABLE;
 			sc->sc_i8255->port_b = 0;
 			sc->sc_i8255->port_a |= LPA_ACKENABLE;
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 		} else
 			error = EAFNOSUPPORT;
 		break;
@@ -741,7 +737,7 @@
 plipinput(sc)
 	struct lpt_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	volatile struct i8255 *i8255 = sc->sc_i8255;
 	struct mbuf *m;
 	struct ether_header *eh;
@@ -764,11 +760,11 @@
 
 		switch (minibuf[0]) {
 		case 0xfc:
-			p[0] = p[ 6] = ifp->ac_enaddr[0];
-			p[1] = p[ 7] = ifp->ac_enaddr[1];
-			p[2] = p[ 8] = ifp->ac_enaddr[2];
-			p[3] = p[ 9] = ifp->ac_enaddr[3];
-			p[4] = p[10] = ifp->ac_enaddr[4];
+			p[0] = p[ 6] = LLADDR(ifp->if_sadl)[0];
+			p[1] = p[ 7] = LLADDR(ifp->if_sadl)[1];
+			p[2] = p[ 8] = LLADDR(ifp->if_sadl)[2];
+			p[3] = p[ 9] = LLADDR(ifp->if_sadl)[3];
+			p[4] = p[10] = LLADDR(ifp->if_sadl)[4];
 			p += 5;
 			if ((cksum = plipreceive(i8255, p, 1)) < 0) goto err;
 			p += 6;
@@ -946,7 +942,7 @@
 	void *arg;
 {
 	struct lpt_softc *sc = arg;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	volatile struct i8255 *i8255 = sc->sc_i8255;
 	struct mbuf *m0, *m;
 	u_char minibuf[4], cksum;
--- a/sys/arch/pc532/dev/ncr5380.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pc532/dev/ncr5380.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ncr5380.c,v 1.10 1996/08/27 21:56:32 cgd Exp $	*/
+/*	$NetBSD: ncr5380.c,v 1.11 1997/03/15 18:10:18 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman.
--- a/sys/arch/pc532/include/kcore.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pc532/include/kcore.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: kcore.h,v 1.1 1997/02/08 09:33:03 matthias Exp $	*/
+/*	$NetBSD: kcore.h,v 1.2 1997/03/15 18:10:21 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Matthias Pfaller.
--- a/sys/arch/pica/conf/files.pica	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pica/conf/files.pica	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.pica,v 1.4 1996/03/27 11:02:20 jonathan Exp $
+#	$NetBSD: files.pica,v 1.5 1997/03/15 18:10:23 is Exp $
 maxpartitions 8
 maxusers 2 8 64
 
@@ -24,7 +24,7 @@
 file	arch/pica/pica/clock_mc.c	clock
 
 #	Ethernet chip
-device sn: ifnet, ether
+device sn: ifnet, ether, arp
 attach sn at pica
 file	arch/pica/dev/if_sn.c		sn	needs-count
 
--- a/sys/arch/pica/dev/if_sn.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pica/dev/if_sn.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_sn.c,v 1.8 1996/10/13 03:31:25 christos Exp $	*/
+/*	$NetBSD: if_sn.c,v 1.9 1997/03/15 18:10:25 is Exp $	*/
 
 /*
  * National Semiconductor  SONIC Driver
@@ -25,15 +25,14 @@
 #include <machine/autoconf.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -96,9 +95,8 @@
 
 struct sn_softc {
 	struct	device sc_dev;
-	struct	arpcom sc_ac;
-#define	sc_if		sc_ac.ac_if	/* network visible interface */
-#define	sc_enaddr	sc_ac.ac_enaddr	/* hardware ethernet address */
+	struct	ethercom sc_ec;
+#define	sc_if		sc_ec.ec_if	/* network visible interface */
 
 	struct sonic_reg *sc_csr;	/* hardware pointer */
 	dma_softc_t	__dma;		/* stupid macro ... */
@@ -256,7 +254,7 @@
 void mtd_free __P((struct mtd *));
 struct mtd *mtd_alloc __P((void));
 
-int sngetaddr __P((struct sn_softc *sc));
+int sngetaddr __P((struct sn_softc *sc, uchar *ap));
 int sninit __P((struct sn_softc *sc));
 int snstop __P((struct sn_softc *sc));
 int sonicput __P((struct sn_softc *sc, struct mbuf *m0));
@@ -294,6 +292,7 @@
 	struct ifnet *ifp = &sc->sc_if;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
 	int p, pp;
+	uchar myaddr[ETHER_ADDR_LEN];
 
 	sc->sc_csr = (struct sonic_reg *)BUS_CVTADDR(ca);
 
@@ -342,8 +341,8 @@
 #if 0
 	camdump(sc);
 #endif
-	sngetaddr(sc);
-	printf(" address %s\n", ether_sprintf(sc->sc_enaddr));
+	sngetaddr(sc, myaddr);
+	printf(" address %s\n", ether_sprintf(myaddr));
 
 #if 0
 printf("\nsonic buffers: rra=0x%x cda=0x%x rda=0x%x tda=0x%x rba=0x%x\n",
@@ -365,7 +364,7 @@
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
 #endif
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 }
 
 int
@@ -565,7 +564,7 @@
 
 	/* program the CAM with our address */
 	caminitialise();
-	camentry(0, sc->sc_enaddr);
+	camentry(0, LLADDR(sc->sc_if.if_sadl));
 	camprogram(sc);
 
 	/* get it to read resource descriptors */
@@ -777,8 +776,9 @@
  *  have to fetch it from nv ram.
  */
 int 
-sngetaddr(sc)
+sngetaddr(sc, ap)
 	struct sn_softc *sc;
+	uchar *ap;
 {
 	unsigned i, x, y;
 	char   *cp, *ea;
@@ -789,26 +789,26 @@
 	sc->sc_csr->s_cep = 0;
 	i = sc->sc_csr->s_cap2;
 	wbflush();
-	sc->sc_enaddr[5] = i >> 8;
-	sc->sc_enaddr[4] = i;
+	ap[5] = i >> 8;
+	ap[4] = i;
 	i = sc->sc_csr->s_cap1;
 	wbflush();
-	sc->sc_enaddr[3] = i >> 8;
-	sc->sc_enaddr[2] = i;
+	ap[3] = i >> 8;
+	ap[2] = i;
 	i = sc->sc_csr->s_cap0;
 	wbflush();
-	sc->sc_enaddr[1] = i >> 8;
-	sc->sc_enaddr[0] = i;
+	ap[1] = i >> 8;
+	ap[0] = i;
 
 	sc->sc_csr->s_cr = 0;
 	wbflush();
 #else
-	sc->sc_enaddr[0] = 0x08;
-	sc->sc_enaddr[1] = 0x00;
-	sc->sc_enaddr[2] = 0x20;
-	sc->sc_enaddr[3] = 0xa0;
-	sc->sc_enaddr[4] = 0x66;
-	sc->sc_enaddr[5] = 0x54;
+	ap[0] = 0x08;
+	ap[1] = 0x00;
+	ap[2] = 0x20;
+	ap[3] = 0xa0;
+	ap[4] = 0x66;
+	ap[5] = 0x54;
 #endif	
 	return (0);
 }
@@ -1239,12 +1239,12 @@
 	 * If so, hand off the raw packet to enet, then discard things
 	 * not destined for us (but be sure to keep broadcast/multicast).
 	 */
-	if (sc->sc_if.if_bpf) {
+	if (ifp->if_bpf) {
 		bpf_tap(sc->sc_if.if_bpf, pkt,
 		    len + sizeof(struct ether_header));
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (et->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(et->ether_dhost, sc->sc_enaddr,
+		    bcmp(et->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(et->ether_dhost)) != 0)
 			return;
 	}
--- a/sys/arch/pica/pica/trap.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pica/pica/trap.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.7 1996/10/13 08:15:40 jonathan Exp $	*/
+/*	$NetBSD: trap.c,v 1.8 1997/03/15 18:10:27 is Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -84,7 +84,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #include <netinet/ip_var.h>
 
 struct	proc *machFPCurProcPtr;		/* pointer to last proc to use FP */
--- a/sys/arch/pmax/pmax/pmax_trap.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/pmax/pmax/pmax_trap.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmax_trap.c,v 1.39 1996/10/13 03:39:54 christos Exp $	*/
+/*	$NetBSD: pmax_trap.c,v 1.40 1997/03/15 18:10:30 is Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -82,9 +82,10 @@
 #include <sys/mbuf.h>
 #include <netinet/in.h>
 #include <net/if.h>
-#include <netinet/if_ether.h>
+#include <net/if_ether.h>
+#include <netinet/if_inarp.h>
 
-struct ifnet; struct arpcom;
+struct ifnet; struct ethercom;
 #include <dev/ic/am7990var.h>		/* Lance interrupt for kn01 */
 
 #include "asc.h"
--- a/sys/arch/powerpc/stand/net.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/powerpc/stand/net.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: net.c,v 1.1 1996/09/30 16:35:01 ws Exp $	*/
+/*	$NetBSD: net.c,v 1.2 1997/03/15 18:10:32 is Exp $	*/
 
 /*
  * Copyright (C) 1995 Wolfgang Solfrank.
@@ -54,9 +54,9 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 
+#include "if_ether.h"
 #include "stand.h"
 #include "net.h"
 #include "netif.h"
--- a/sys/arch/powerpc/stand/netif_of.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/powerpc/stand/netif_of.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: netif_of.c,v 1.1 1996/09/30 16:35:02 ws Exp $	*/
+/*	$NetBSD: netif_of.c,v 1.2 1997/03/15 18:10:33 is Exp $	*/
 
 /*
  * Copyright (C) 1995 Wolfgang Solfrank.
@@ -47,9 +47,9 @@
 #include <net/if.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 
+#include "if_ether.h"
 #include "stand.h"
 #include "net.h"
 #include "netif.h"
--- a/sys/arch/sparc/conf/files.sparc	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/conf/files.sparc	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.sparc,v 1.37 1997/03/15 02:36:00 christos Exp $
+#	$NetBSD: files.sparc,v 1.38 1997/03/15 18:10:34 is Exp $
 
 # @(#)files.sparc	8.1 (Berkeley) 7/19/93
 # sparc-specific configuration info
@@ -137,7 +137,7 @@
 attach le at sbus, ledma, lebuffer, obio
 file	arch/sparc/dev/if_le.c		le
 
-device ie: ifnet, ether
+device ie: ifnet, ether, arp
 attach ie at obio, vmes, vmel
 file	arch/sparc/dev/if_ie.c		ie
 
--- a/sys/arch/sparc/dev/if_ie.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/dev/if_ie.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ie.c,v 1.27 1996/12/10 22:54:59 pk Exp $	*/
+/*	$NetBSD: if_ie.c,v 1.28 1997/03/15 18:10:37 is Exp $	*/
 
 /*-
  * Copyright (c) 1993, 1994, 1995 Charles Hannum.
@@ -113,8 +113,7 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.h>
 
 #if NBPFILTER > 0
 #include <net/bpf.h>
@@ -126,7 +125,7 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -232,7 +231,7 @@
 	u_int sc_msize;         /* how much RAM we have/use */
 	caddr_t sc_reg;         /* KVA of car's register */
 
-	struct arpcom sc_arpcom;/* system arpcom structure */
+	struct ethercom sc_ethercom;/* system ethercom structure */
 
 	void (*reset_586) __P((struct ie_softc *));
 				/* card dependent reset function */
@@ -505,10 +504,11 @@
 {
 	struct ie_softc *sc = (void *) self;
 	struct confargs *ca = aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	extern void myetheraddr(u_char *);	/* should be elsewhere */
 	register struct bootpath *bp;
 	int     pri = ca->ca_ra.ra_intr[0].int_pri;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	/*
 	 * *note*: we don't detect the difference between a VME3E and
@@ -643,7 +643,7 @@
 		return;
 	}
 
-	myetheraddr(sc->sc_arpcom.ac_enaddr);
+	myetheraddr(myaddr);
 
 	if (ie_setupram(sc) == 0) {
 		printf(": RAM CONFIG FAILED!\n");
@@ -660,10 +660,10 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	printf(" pri %d address %s, type %s\n", pri,
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr),
+	    ether_sprintf(myaddr),
 	    ie_hardware_names[sc->hard_type]);
 
 #if NBPFILTER > 0
@@ -706,7 +706,7 @@
 	struct ie_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 
 	iereset(sc);
 }
@@ -768,7 +768,7 @@
 
 	if (status & IE_ST_RNR) {
 		printf("%s: receiver not ready\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_ierrors++;
+		sc->sc_ethercom.ec_if.if_ierrors++;
 		iereset(sc);
 	}
 
@@ -799,9 +799,9 @@
 		status = sc->rframes[i]->ie_fd_status;
 
 		if ((status & IE_FD_COMPLETE) && (status & IE_FD_OK)) {
-			sc->sc_arpcom.ac_if.if_ipackets++;
+			sc->sc_ethercom.ec_if.if_ipackets++;
 			if (!--timesthru) {
-				sc->sc_arpcom.ac_if.if_ierrors +=
+				sc->sc_ethercom.ec_if.if_ierrors +=
 				    SWAP(scb->ie_err_crc) +
 				    SWAP(scb->ie_err_align) +
 				    SWAP(scb->ie_err_resource) +
@@ -838,8 +838,8 @@
 {
 	int status;
 
-	sc->sc_arpcom.ac_if.if_timer = 0;
-	sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+	sc->sc_ethercom.ec_if.if_timer = 0;
+	sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 
 	status = sc->xmit_cmds[sc->xctail]->ie_xmit_status;
 
@@ -847,25 +847,25 @@
 		printf("ietint: command still busy!\n");
 
 	if (status & IE_STAT_OK) {
-		sc->sc_arpcom.ac_if.if_opackets++;
-		sc->sc_arpcom.ac_if.if_collisions +=
+		sc->sc_ethercom.ec_if.if_opackets++;
+		sc->sc_ethercom.ec_if.if_collisions +=
 		  SWAP(status & IE_XS_MAXCOLL);
 	} else if (status & IE_STAT_ABORT) {
 		printf("%s: send aborted\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 	} else if (status & IE_XS_NOCARRIER) {
 		printf("%s: no carrier\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 	} else if (status & IE_XS_LOSTCTS) {
 		printf("%s: lost CTS\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 	} else if (status & IE_XS_UNDERRUN) {
 		printf("%s: DMA underrun\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 	} else if (status & IE_XS_EXCMAX) {
 		printf("%s: too many collisions\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_collisions += 16;
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_collisions += 16;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 	}
 
 	/*
@@ -883,7 +883,7 @@
 	sc->xmit_busy = 0;
 	sc->xctail = (sc->xctail + 1) % NTXBUF;
 
-	iestart(&sc->sc_arpcom.ac_if);
+	iestart(&sc->sc_ethercom.ec_if);
 }
 
 /*
@@ -919,8 +919,11 @@
 	struct ether_header *eh;
 	int *to_bpf;
 {
+	struct ifnet *ifp;
 	int i;
 
+	ifp = &sc->sc_ethercom.ec_if;
+
 	switch(sc->promisc) {
 	case IFF_ALLMULTI:
 		/*
@@ -928,11 +931,11 @@
 		 * destined for us.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0); /* BPF gets this packet if anybody cares */
+		*to_bpf = (sc->sc_ethercom.ec_if.if_bpf != 0); /* BPF gets this packet if anybody cares */
 #endif
 		if (eh->ether_dhost[0] & 1)
 			return 1;
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr)) return 1;
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl))) return 1;
 		return 0;
 
 	case IFF_PROMISC:
@@ -940,10 +943,11 @@
 		 * Receiving all packets.  These need to be passed on to BPF.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.if_bpf != 0);
 #endif
 		/* If for us, accept and hand up to BPF */
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr)) return 1;
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
+		    return 1;
 
 #if NBPFILTER > 0
 		if (*to_bpf)
@@ -977,14 +981,14 @@
 		 * time.  Whew!  (Hope this is a fast machine...)
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.if_bpf != 0);
 #endif
 		/* We want to see multicasts. */
 		if (eh->ether_dhost[0] & 1)
 			return 1;
 
 		/* We want to see our own packets */
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 
 		/* Anything else goes to BPF but nothing else. */
@@ -1004,7 +1008,7 @@
 		 * of here as quickly as possible.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.if_bpf != 0);
 #endif
 		return 1;
 	}
@@ -1069,8 +1073,8 @@
 	 * If BPF is listening on this interface, let it see the packet before
 	 * we push it on the wire.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf,
+	if (sc->sc_ethercom.ec_if.if_bpf)
+		bpf_tap(sc->sc_ethercom.ec_if.if_bpf,
 		    sc->xmit_cbuffs[sc->xctail],
 		    SWAP(sc->xmit_buffs[sc->xctail]->ie_xmit_flags));
 #endif
@@ -1093,7 +1097,7 @@
 	command_and_wait(sc, IE_CU_START, 0, 0);
 
 	sc->xmit_busy = 1;
-	sc->sc_arpcom.ac_if.if_timer = 5;
+	sc->sc_ethercom.ec_if.if_timer = 5;
 }
 
 /*
@@ -1140,7 +1144,7 @@
 	 */
 	if (!check_eh(sc, ehp, to_bpf)) {
 		ie_drop_packet_buffer(sc);
-		sc->sc_arpcom.ac_if.if_ierrors--; /* just this case, it's not an error */
+		sc->sc_ethercom.ec_if.if_ierrors--; /* just this case, it's not an error */
 		return -1;
 	}
 	totlen -= (offset = sizeof *ehp);
@@ -1152,7 +1156,7 @@
 	}
 
 	m = *mp;
-	m->m_pkthdr.rcvif = &sc->sc_arpcom.ac_if;
+	m->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
 	m->m_len = MHLEN;
 	resid = m->m_pkthdr.len = totlen;
 	top = 0;
@@ -1309,7 +1313,7 @@
 #else
 		if (ieget(sc, &m, &eh, 0)) {
 #endif
-			sc->sc_arpcom.ac_if.if_ierrors++;
+			sc->sc_ethercom.ec_if.if_ierrors++;
 			return;
 		}
 	}
@@ -1344,7 +1348,7 @@
 		m0.m_next = m;
 
 		/* Pass it up. */
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, &m0);
+		bpf_mtap(sc->sc_ethercom.ec_if.if_bpf, &m0);
 	}
 	/*
 	 * A signal passed up from the filtering code indicating that the
@@ -1368,7 +1372,7 @@
 	/*
 	 * Finally pass this packet up to higher layers.
 	 */
-	ether_input(&sc->sc_arpcom.ac_if, &eh, m);
+	ether_input(&sc->sc_ethercom.ec_if, &eh, m);
 }
 
 static void
@@ -1426,7 +1430,7 @@
 	}
 
 	do {
-		IF_DEQUEUE(&sc->sc_arpcom.ac_if.if_snd, m);
+		IF_DEQUEUE(&sc->sc_ethercom.ec_if.if_snd, m);
 		if (!m)
 			break;
 
@@ -1514,8 +1518,8 @@
 	printf("%s: reset\n", sc->sc_dev.dv_xname);
 
 	/* Clear OACTIVE in case we're called from watchdog (frozen xmit). */
-	sc->sc_arpcom.ac_if.if_flags &= ~(IFF_UP | IFF_OACTIVE);
-	ieioctl(&sc->sc_arpcom.ac_if, SIOCSIFFLAGS, 0);
+	sc->sc_ethercom.ec_if.if_flags &= ~(IFF_UP | IFF_OACTIVE);
+	ieioctl(&sc->sc_ethercom.ec_if, SIOCSIFFLAGS, 0);
 
 	/*
 	 * Stop i82586 dead in its tracks.
@@ -1531,8 +1535,8 @@
 		panic("ie disappeared!\n");
 #endif
 
-	sc->sc_arpcom.ac_if.if_flags |= IFF_UP;
-	ieioctl(&sc->sc_arpcom.ac_if, SIOCSIFFLAGS, 0);
+	sc->sc_ethercom.ec_if.if_flags |= IFF_UP;
+	ieioctl(&sc->sc_ethercom.ec_if, SIOCSIFFLAGS, 0);
 
 	splx(s);
 }
@@ -1890,7 +1894,7 @@
 		cmd->com.ie_cmd_cmd = IE_CMD_IASETUP | IE_CMD_LAST;
 		cmd->com.ie_cmd_link = SWAP(0xffff);
 
-		(sc->memcopy)(sc->sc_arpcom.ac_enaddr,
+		(sc->memcopy)(LLADDR(ifp->if_sadl),
 		      (caddr_t)&cmd->ie_address, sizeof cmd->ie_address);
 
 		if (command_and_wait(sc, IE_CU_START, cmd, IE_STAT_COMPL) ||
@@ -1916,7 +1920,7 @@
 	 */
 	setup_bufs(sc);
 
-	sc->sc_arpcom.ac_if.if_flags |= IFF_RUNNING; /* tell higher levels that we are here */
+	sc->sc_ethercom.ec_if.if_flags |= IFF_RUNNING; /* tell higher levels that we are here */
 
 	sc->scb->ie_recv_list = MK_16(sc->sc_maddr, sc->rframes[0]);
 	command_and_wait(sc, IE_RU_START, 0, 0);
@@ -1959,7 +1963,7 @@
 #ifdef INET
 		case AF_INET:
 			ieinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1970,11 +1974,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			/* Set new address. */
 			ieinit(sc);
 			break;
@@ -2022,8 +2025,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom):
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom):
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2053,12 +2056,12 @@
 	 * Step through the list of addresses.
 	 */
 	sc->mcast_count = 0;
-	ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
+	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
 	while (enm) {
 		if (sc->mcast_count >= MAXMCAST ||
 		    bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
-			sc->sc_arpcom.ac_if.if_flags |= IFF_ALLMULTI;
-			ieioctl(&sc->sc_arpcom.ac_if, SIOCSIFFLAGS, (void *)0);
+			sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI;
+			ieioctl(&sc->sc_ethercom.ec_if, SIOCSIFFLAGS, (void *)0);
 			goto setflag;
 		}
 
--- a/sys/arch/sparc/dev/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/dev/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.43 1997/03/10 22:58:22 pk Exp $	*/
+/*	$NetBSD: if_le.c,v 1.44 1997/03/15 18:10:38 is Exp $	*/
 
 /*-
  * Copyright (c) 1996
@@ -54,10 +54,11 @@
 #include <sys/malloc.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
@@ -147,7 +148,7 @@
 	struct le_softc *lesc = (struct le_softc *)sc;
 
 	if (CPU_ISSUN4M && lesc->sc_dma) {
-		struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+		struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 		if (ifp->if_flags & IFF_LINK0)
 			lesc->sc_dma->sc_regs->csr |= DE_AUI_TP;
@@ -167,7 +168,7 @@
 	struct le_softc *lesc = (struct le_softc *)sc;
 
 	if (CPU_ISSUN4M && lesc->sc_dma) {
-		struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+		struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 		/* 
 		 * Check if the user has requested a certain cable type, and
@@ -332,7 +333,7 @@
 		break;
 	}
 
-	myetheraddr(sc->sc_arpcom.ac_enaddr);
+	myetheraddr(sc->sc_enaddr);
 
 	sc->sc_copytodesc = am7990_copytobuf_contig;
 	sc->sc_copyfromdesc = am7990_copyfrombuf_contig;
--- a/sys/arch/sparc/dev/if_levar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/dev/if_levar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_levar.h,v 1.5 1996/05/07 01:27:32 thorpej Exp $	*/
+/*	$NetBSD: if_levar.h,v 1.6 1997/03/15 18:10:39 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -43,7 +43,7 @@
  * Ethernet software status per interface.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface.
+ * ethercom.ec_if, which the routing code uses to locate the interface.
  * This structure contains the output queue for the interface, its address, ...
  */
 struct	le_softc {
--- a/sys/arch/sparc/sparc/cpuvar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/sparc/cpuvar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpuvar.h,v 1.1 1997/03/11 00:55:24 pk Exp $ */
+/*	$NetBSD: cpuvar.h,v 1.2 1997/03/15 18:10:41 is Exp $ */
 
 /*
  *  Copyright (c) 1996 The NetBSD Foundation, Inc.
--- a/sys/arch/sparc/sparc/intr.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/sparc/intr.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.17 1996/10/20 19:32:42 pk Exp $ */
+/*	$NetBSD: intr.c,v 1.18 1997/03/15 18:10:42 is Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -63,7 +63,7 @@
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #include <netinet/ip_var.h>
 #endif
 #ifdef NS
--- a/sys/arch/sparc/stand/net.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/stand/net.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: net.c,v 1.3 1996/05/04 19:36:01 pk Exp $	*/
+/*	$NetBSD: net.c,v 1.4 1997/03/15 18:10:43 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -52,7 +52,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include "if_ether.h"
 #include <netinet/in_systm.h>
 
 #include "stand.h"
--- a/sys/arch/sparc/stand/netif_sun.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sparc/stand/netif_sun.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: netif_sun.c,v 1.2 1995/09/18 21:31:48 pk Exp $	*/
+/*	$NetBSD: netif_sun.c,v 1.3 1997/03/15 18:10:45 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -44,7 +44,7 @@
 #include <net/if.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include "if_ether.h"
 #include <netinet/in_systm.h>
 
 #include "stand.h"
--- a/sys/arch/sun3/conf/GENERIC3X	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/conf/GENERIC3X	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: GENERIC3X,v 1.1 1997/02/24 03:53:52 jeremy Exp $
+#	$NetBSD: GENERIC3X,v 1.2 1997/03/15 18:10:59 is Exp $
 #
 # GENERIC Sun3x (3/80, 3/470)
 # Supports root on: le0, sd*
--- a/sys/arch/sun3/conf/KGDB3X	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/conf/KGDB3X	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: KGDB3X,v 1.1 1997/02/24 03:53:52 jeremy Exp $
+#	$NetBSD: KGDB3X,v 1.2 1997/03/15 18:10:59 is Exp $
 #
 # GENERIC Sun3x (3/80, 3/470)
 # Supports root on: le0, sd*
--- a/sys/arch/sun3/conf/files.sun3	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/conf/files.sun3	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.sun3,v 1.35 1997/03/13 20:30:19 gwr Exp $
+#	$NetBSD: files.sun3,v 1.36 1997/03/15 18:10:46 is Exp $
 
 #
 # sun3-specific configuration info
@@ -103,7 +103,7 @@
 attach intreg at obio
 file arch/sun3/sun3/intreg.c		intreg
 
-device ie: ifnet, ether
+device ie: ifnet, ether, arp
 attach ie at obio with ie_obio
 attach ie at vmes with ie_vmes
 file arch/sun3/dev/if_ie_obio.c		ie_obio
--- a/sys/arch/sun3/dev/dma.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/dma.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dma.c,v 1.2 1997/02/24 15:02:23 gwr Exp $ */
+/*	$NetBSD: dma.c,v 1.3 1997/03/15 18:11:00 is Exp $ */
 
 /*
  * Copyright (c) 1994 Paul Kranenburg.  All rights reserved.
--- a/sys/arch/sun3/dev/dmareg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/dmareg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmareg.h,v 1.1.1.1 1997/02/24 01:45:13 jeremy Exp $ */
+/*	$NetBSD: dmareg.h,v 1.2 1997/03/15 18:11:01 is Exp $ */
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/arch/sun3/dev/dmavar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/dmavar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmavar.h,v 1.1.1.1 1997/02/24 01:45:13 jeremy Exp $ */
+/*	$NetBSD: dmavar.h,v 1.2 1997/03/15 18:11:02 is Exp $ */
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/arch/sun3/dev/esp.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/esp.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: esp.c,v 1.1.1.1 1997/02/24 01:45:13 jeremy Exp $	*/
+/*	$NetBSD: esp.c,v 1.2 1997/03/15 18:11:03 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
--- a/sys/arch/sun3/dev/i82586.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/i82586.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: i82586.h,v 1.5 1997/02/13 20:40:11 gwr Exp $ */
+/*	$NetBSD: i82586.h,v 1.6 1997/03/15 18:10:48 is Exp $ */
 
 /*-
  * Copyright (c) 1992, University of Vermont and State Agricultural College.
--- a/sys/arch/sun3/dev/if_ie.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/if_ie.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ie.c,v 1.19 1997/03/10 21:45:01 gwr Exp $ */
+/*	$NetBSD: if_ie.c,v 1.20 1997/03/15 18:10:49 is Exp $ */
 
 /*-
  * Copyright (c) 1993, 1994, 1995 Charles Hannum.
@@ -113,8 +113,7 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.h>
 
 #if NBPFILTER > 0
 #include <net/bpf.h>
@@ -126,7 +125,7 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -374,7 +373,7 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_addr);
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
 #endif
@@ -463,7 +462,7 @@
 	struct ie_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_if.if_oerrors;
+	++ifp->if_oerrors;
 	iereset(sc);
 }
 
@@ -606,9 +605,11 @@
 ietint(sc)
 	struct ie_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_if;
+	struct ifnet *ifp;
 	int status;
 
+	ifp = &sc->sc_if;
+
 	ifp->if_timer = 0;
 	ifp->if_flags &= ~IFF_OACTIVE;
 
@@ -707,8 +708,11 @@
 	struct ether_header *eh;
 	int *to_bpf;
 {
+	struct ifnet *ifp;
 	int i;
 
+	ifp = &sc->sc_if;
+
 	switch (sc->promisc) {
 	case IFF_ALLMULTI:
 		/*
@@ -717,11 +721,11 @@
 		 */
 #if NBPFILTER > 0
 		/* BPF gets this packet if anybody cares */
-		*to_bpf = (sc->sc_if.if_bpf != 0);
+		*to_bpf = (ifp->if_bpf != 0);
 #endif
 		if (eh->ether_dhost[0] & 1)
 			return 1;
-		if (ether_equal(eh->ether_dhost, sc->sc_addr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 		return 0;
 
@@ -730,10 +734,10 @@
 		 * Receiving all packets.  These need to be passed on to BPF.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_if.if_bpf != 0);
+		*to_bpf = (ifp->if_bpf != 0);
 #endif
 		/* If for us, accept and hand up to BPF */
-		if (ether_equal(eh->ether_dhost, sc->sc_addr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 
 #if NBPFILTER > 0
@@ -769,14 +773,14 @@
 		 * time.  Whew!  (Hope this is a fast machine...)
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_if.if_bpf != 0);
+		*to_bpf = (ifp->if_bpf != 0);
 #endif
 		/* We want to see multicasts. */
 		if (eh->ether_dhost[0] & 1)
 			return 1;
 
 		/* We want to see our own packets */
-		if (ether_equal(eh->ether_dhost, sc->sc_addr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 
 		/* Anything else goes to BPF but nothing else. */
@@ -796,7 +800,7 @@
 		 * as quickly as possible.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_if.if_bpf != 0);
+		*to_bpf = (ifp->if_bpf != 0);
 #endif
 		return 1;
 	}
@@ -860,6 +864,9 @@
 iexmit(sc)
 	struct ie_softc *sc;
 {
+	struct ifnet *ifp;
+
+	ifp = &sc->sc_if;
 
 #ifdef IEDEBUG
 	if (sc->sc_debug & IED_XMIT)
@@ -872,8 +879,8 @@
 	 * If BPF is listening on this interface, let it see the packet before
 	 * we push it on the wire.
 	 */
-	if (sc->sc_if.if_bpf)
-		bpf_tap(sc->sc_if.if_bpf,
+	if (ifp->if_bpf)
+		bpf_tap(ifp->if_bpf,
 		    sc->xmit_cbuffs[sc->xctail],
 		    SWAP(sc->xmit_buffs[sc->xctail]->ie_xmit_flags));
 #endif
@@ -895,7 +902,7 @@
 	    vtop16sw(sc, (void*) sc->xmit_cmds[sc->xctail]);
 	cmd_and_wait(sc, IE_CU_START, 0, 0);
 
-	sc->sc_if.if_timer = 5;
+	ifp->if_timer = 5;
 }
 
 /*
@@ -1525,7 +1532,9 @@
 {
 	volatile struct ie_sys_ctl_block *scb = sc->scb;
 	void *ptr;
+	struct ifnet *ifp;
 
+	ifp = &sc->sc_if;
 	ptr = sc->buf_area;	/* XXX - Use scb instead? */
 
 	/*
@@ -1560,7 +1569,7 @@
 		cmd->com.ie_cmd_cmd = IE_CMD_IASETUP | IE_CMD_LAST;
 		cmd->com.ie_cmd_link = SWAP(0xffff);
 
-		(sc->sc_bcopy)(sc->sc_addr,
+		(sc->sc_bcopy)(LLADDR(ifp->if_sadl),
 		    (caddr_t)&cmd->ie_address, sizeof(cmd->ie_address));
 
 		if (cmd_and_wait(sc, IE_CU_START, cmd, IE_STAT_COMPL) ||
@@ -1588,8 +1597,8 @@
 	iememinit(sc);
 
 	/* tell higher levels that we are here */
-	sc->sc_if.if_flags |= IFF_RUNNING;
-	sc->sc_if.if_flags &= ~IFF_OACTIVE;
+	ifp->if_flags |= IFF_RUNNING;
+	ifp->if_flags &= ~IFF_OACTIVE;
 
 	sc->scb->ie_recv_list =
 	    vtop16sw(sc, (void*) sc->rframes[0]);
@@ -1633,7 +1642,7 @@
 #ifdef INET
 		case AF_INET:
 			ieinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1644,11 +1653,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_addr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_addr,
-				    sizeof(sc->sc_addr));
+				    LLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
 			/* Set new address. */
 			ieinit(sc);
 			break;
@@ -1697,8 +1705,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -1723,17 +1731,20 @@
 {
 	struct ether_multi *enm;
 	struct ether_multistep step;
+	struct ifnet *ifp;
+
+	ifp = &sc->sc_if;
 
 	/*
 	 * Step through the list of addresses.
 	 */
 	sc->mcast_count = 0;
-	ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
+	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
 	while (enm) {
 		if (sc->mcast_count >= MAXMCAST ||
 		    bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
-			sc->sc_if.if_flags |= IFF_ALLMULTI;
-			ieioctl(&sc->sc_if, SIOCSIFFLAGS, (void *)0);
+			ifp->if_flags |= IFF_ALLMULTI;
+			ieioctl(ifp, SIOCSIFFLAGS, (void *)0);
 			goto setflag;
 		}
 		bcopy(enm->enm_addrlo, &sc->mcast_addrs[sc->mcast_count], 6);
--- a/sys/arch/sun3/dev/if_ie_obio.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/if_ie_obio.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ie_obio.c,v 1.8 1997/01/27 19:40:48 gwr Exp $	*/
+/*	$NetBSD: if_ie_obio.c,v 1.9 1997/03/15 18:10:51 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -46,13 +46,14 @@
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <net/if.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
--- a/sys/arch/sun3/dev/if_ie_vme.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/if_ie_vme.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ie_vme.c,v 1.7 1997/01/27 19:40:49 gwr Exp $	*/
+/*	$NetBSD: if_ie_vme.c,v 1.8 1997/03/15 18:10:52 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -46,13 +46,14 @@
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <net/if.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
--- a/sys/arch/sun3/dev/if_ie_vmes.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/if_ie_vmes.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ie_vmes.c,v 1.7 1997/01/27 19:40:49 gwr Exp $	*/
+/*	$NetBSD: if_ie_vmes.c,v 1.8 1997/03/15 18:10:52 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -46,13 +46,14 @@
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <net/if.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
--- a/sys/arch/sun3/dev/if_ievar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/if_ievar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ievar.h,v 1.8 1997/02/13 20:43:18 gwr Exp $	*/
+/*	$NetBSD: if_ievar.h,v 1.9 1997/03/15 18:10:53 is Exp $	*/
 
 /*
  * Machine-dependent glue for the Intel Ethernet (ie) driver.
@@ -56,9 +56,12 @@
 struct ie_softc {
 	struct device sc_dev;	/* device structure */
 
-	struct arpcom sc_arpcom;/* system arpcom structure */
-#define	sc_if	sc_arpcom.ac_if 		/* network-visible interface */
-#define	sc_addr	sc_arpcom.ac_enaddr		/* hardware Ethernet address */
+	struct ethercom sc_ethercom;/* system ethercom structure */
+#define	sc_if	sc_ethercom.ec_if 		/* network-visible interface */
+
+	/* XXX: This is used only during attach. */
+	u_int8_t sc_addr[ETHER_ADDR_LEN];
+	u_int8_t sc_pad1[2];
 
 	int     sc_debug;	/* See IEDEBUG */
 
--- a/sys/arch/sun3/dev/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/dev/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.35 1997/01/27 16:57:12 gwr Exp $	*/
+/*	$NetBSD: if_le.c,v 1.36 1997/03/15 18:10:54 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -46,10 +46,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
@@ -150,7 +151,7 @@
 	sc->sc_addr = (u_long)sc->sc_mem & 0xffffff;
 	sc->sc_conf3 = LE_C3_BSWP;
 
-	idprom_etheraddr(sc->sc_arpcom.ac_enaddr);
+	idprom_etheraddr(sc->sc_enaddr);
 
 	sc->sc_copytodesc = am7990_copytobuf_contig;
 	sc->sc_copyfromdesc = am7990_copyfrombuf_contig;
--- a/sys/arch/sun3/stand/libsa/netif_sun.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3/stand/libsa/netif_sun.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: netif_sun.c,v 1.5 1997/02/05 17:39:25 gwr Exp $	*/
+/*	$NetBSD: netif_sun.c,v 1.6 1997/03/15 18:10:56 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -44,7 +44,7 @@
 #include <net/if.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include "if_ether.h"
 #include <netinet/in_systm.h>
 
 #include <machine/control.h>
--- a/sys/arch/sun3x/conf/GENERIC	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/conf/GENERIC	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: GENERIC,v 1.1 1997/02/24 03:53:52 jeremy Exp $
+#	$NetBSD: GENERIC,v 1.2 1997/03/15 18:10:59 is Exp $
 #
 # GENERIC Sun3x (3/80, 3/470)
 # Supports root on: le0, sd*
--- a/sys/arch/sun3x/dev/dma.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/dma.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dma.c,v 1.2 1997/02/24 15:02:23 gwr Exp $ */
+/*	$NetBSD: dma.c,v 1.3 1997/03/15 18:11:00 is Exp $ */
 
 /*
  * Copyright (c) 1994 Paul Kranenburg.  All rights reserved.
--- a/sys/arch/sun3x/dev/dmareg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/dmareg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmareg.h,v 1.1.1.1 1997/02/24 01:45:13 jeremy Exp $ */
+/*	$NetBSD: dmareg.h,v 1.2 1997/03/15 18:11:01 is Exp $ */
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/arch/sun3x/dev/dmavar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/dmavar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmavar.h,v 1.1.1.1 1997/02/24 01:45:13 jeremy Exp $ */
+/*	$NetBSD: dmavar.h,v 1.2 1997/03/15 18:11:02 is Exp $ */
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/arch/sun3x/dev/esp.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/esp.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: esp.c,v 1.1.1.1 1997/02/24 01:45:13 jeremy Exp $	*/
+/*	$NetBSD: esp.c,v 1.2 1997/03/15 18:11:03 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
--- a/sys/arch/sun3x/dev/espreg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/espreg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: espreg.h,v 1.1.1.1 1997/02/24 01:45:14 jeremy Exp $ */
+/*	$NetBSD: espreg.h,v 1.2 1997/03/15 18:11:04 is Exp $ */
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/arch/sun3x/dev/espvar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/espvar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: espvar.h,v 1.1.1.1 1997/02/24 01:45:14 jeremy Exp $	*/
+/*	$NetBSD: espvar.h,v 1.2 1997/03/15 18:11:05 is Exp $	*/
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/arch/sun3x/dev/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/dev/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.4 1997/01/27 22:14:19 gwr Exp $	*/
+/*	$NetBSD: if_le.c,v 1.5 1997/03/15 18:11:06 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -46,10 +46,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <machine/autoconf.h>
@@ -153,7 +154,7 @@
 	sc->sc_mem = dvma_mapin(lesc->sc_kmem, LE_MEMSIZE, 0);
 	sc->sc_addr = dvma_kvtopa(sc->sc_mem, ca->ca_bustype);
 
-	idprom_etheraddr(sc->sc_arpcom.ac_enaddr);
+	idprom_etheraddr(sc->sc_enaddr);
 
 	sc->sc_copytodesc = am7990_copytobuf_contig;
 	sc->sc_copyfromdesc = am7990_copyfrombuf_contig;
--- a/sys/arch/sun3x/sun3x/kgdb_machdep.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/sun3x/sun3x/kgdb_machdep.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: kgdb_machdep.c,v 1.2 1997/02/18 16:10:00 gwr Exp $	*/
+/*	$NetBSD: kgdb_machdep.c,v 1.3 1997/03/15 18:11:07 is Exp $	*/
 
 /*
  * Copyright (c) 1990, 1993
--- a/sys/arch/vax/conf/files.vax	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/vax/conf/files.vax	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#       $NetBSD: files.vax,v 1.26 1997/03/15 16:32:16 ragge Exp $
+#       $NetBSD: files.vax,v 1.27 1997/03/15 18:11:09 is Exp $
 #
 # new style config file for vax architecture
 #
@@ -73,17 +73,17 @@
 attach	uda at uba
 file    arch/vax/uba/uda.c		uda | mtc
 
-device	de:ifnet, ether
+device	de:ifnet, ether, arp
 attach	de at uba
 file	arch/vax/if/if_de.c		de needs-flag
 
 # DEQNA/DELQA used on Qbus
-device	qe:ifnet, ether
+device	qe:ifnet, ether, arp
 attach	qe at uba
 file	arch/vax/if/if_qe.c		qe needs-flag
 
 # DEBNA/DEBNT Ethernet Adapter
-device	ni:ifnet, ether
+device	ni:ifnet, ether, arp
 attach	ni at bi
 file	arch/vax/bi/ni.c		ni needs-flag
 
--- a/sys/arch/vax/if/if_de.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/vax/if/if_de.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_de.c,v 1.25 1996/11/15 03:11:19 thorpej Exp $	*/
+/*	$NetBSD: if_de.c,v 1.26 1997/03/15 18:11:10 is Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
@@ -60,15 +60,14 @@
 #include <machine/sid.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -109,10 +108,9 @@
  */
 struct	de_softc {
 	struct	device ds_dev;	/* Configuration common part */
-	struct	arpcom ds_ac;		/* Ethernet common part */
+	struct	ethercom ds_ec;		/* Ethernet common part */
 	struct	dedevice *ds_vaddr;	/* Virtual address of this interface */
-#define	ds_if	ds_ac.ac_if		/* network-visible interface */
-#define	ds_addr	ds_ac.ac_enaddr		/* hardware Ethernet address */
+#define	ds_if	ds_ec.ec_if		/* network-visible interface */
 	int	ds_flags;
 #define	DSF_RUNNING	2		/* board is enabled */
 #define	DSF_SETADDR	4		/* physical address is changed */
@@ -176,6 +174,7 @@
 	struct dedevice *addr;
 	char *c;
 	int csr1;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	addr = (struct dedevice *)ua->ua_addr;
 	ds->ds_vaddr = addr;
@@ -218,10 +217,9 @@
 	(void)dewait(ds, "read addr ");
 
 	ubarelse((void *)ds->ds_dev.dv_parent, &ds->ds_ubaddr);
- 	bcopy((caddr_t)&ds->ds_pcbb.pcbb2, (caddr_t)ds->ds_addr,
-	    sizeof (ds->ds_addr));
+ 	bcopy((caddr_t)&ds->ds_pcbb.pcbb2, myaddr, sizeof (myaddr));
 	printf("%s: hardware address %s\n", ds->ds_dev.dv_xname,
-		ether_sprintf(ds->ds_addr));
+		ether_sprintf(myaddr));
 	ifp->if_ioctl = deioctl;
 	ifp->if_start = destart;
 	ds->ds_deuba.iff_flags = UBA_CANTWAIT;
@@ -230,7 +228,7 @@
 	ds->ds_deuba.iff_flags |= UBA_NEEDBDP;
 #endif
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 }
 
 /*
@@ -605,7 +603,7 @@
 		switch (ifa->ifa_addr->sa_family) {
 #ifdef INET
 		case AF_INET:
-			arp_ifinit(&ds->ds_ac, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -614,7 +612,8 @@
 			register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
 			
 			if (ns_nullhost(*ina))
-				ina->x_host = *(union ns_host *)(ds->ds_addr);
+				ina->x_host = 
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				de_setaddr(ina->x_host.c_host, ds);
 			break;
@@ -661,7 +660,7 @@
 	addr->pclow = PCSR0_INTE|CMD_GETCMD;
 	if (dewait(ds, "address change") == 0) {
 		ds->ds_flags |= DSF_SETADDR;
-		bcopy((caddr_t) physaddr, (caddr_t) ds->ds_addr, 6);
+		bcopy((caddr_t) physaddr, LLADDR(ds->ds_if.if_sadl), 6);
 	}
 }
 
--- a/sys/arch/vax/if/if_le.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/vax/if/if_le.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.5 1997/03/15 16:32:17 ragge Exp $	*/
+/*	$NetBSD: if_le.c,v 1.6 1997/03/15 18:11:11 is Exp $	*/
 
 #define LEDEBUG	 1		/* debug-level: 0 or 1 */
 /* #define LE_CHIP_IS_POKEY	/* does VS2000 need this ??? */
@@ -51,10 +51,11 @@
 #include <sys/reboot.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #if INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 /*
@@ -204,12 +205,13 @@
 	/*
 	 * Get the ethernet address out of rom
 	 */
-	for (i = 0; i < sizeof(sc->sc_am7990.sc_arpcom.ac_enaddr); i++) {
+	for (i = 0; i < sizeof(sc->sc_am7990.sc_enaddr); i++) {
 		int *eaddr = (void*)uvax_phys2virt(ca->ca_enaddr);
-		sc->sc_am7990.sc_arpcom.ac_enaddr[i] = (u_char)eaddr[i];
+		sc->sc_am7990.sc_enaddr[i] = (u_char)eaddr[i];
 	}
 
-	bcopy(self->dv_xname, sc->sc_am7990.sc_arpcom.ac_if.if_xname, IFNAMSIZ);
+	bcopy(self->dv_xname, sc->sc_am7990.sc_ethercom.ec_if.if_xname,
+	    IFNAMSIZ);
 	am7990_config(&sc->sc_am7990);
 
 #ifdef LEDEBUG
--- a/sys/arch/vax/if/if_qe.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/arch/vax/if/if_qe.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_qe.c,v 1.19 1997/02/12 17:57:39 ragge Exp $ */
+/*	$NetBSD: if_qe.c,v 1.20 1997/03/15 18:11:12 is Exp $ */
 
 /*
  * Copyright (c) 1988 Regents of the University of California.
@@ -151,15 +151,14 @@
 #include <sys/kernel.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -200,9 +199,8 @@
  */
 struct	qe_softc {
 	struct	device qe_dev;		/* Configuration common part	*/
-	struct	arpcom qe_ac;		/* Ethernet common part 	*/
-#define	qe_if	qe_ac.ac_if		/* network-visible interface 	*/
-#define	qe_addr	qe_ac.ac_enaddr		/* hardware Ethernet address 	*/
+	struct	ethercom qe_ec;		/* Ethernet common part 	*/
+#define	qe_if	qe_ec.ec_if		/* network-visible interface 	*/
 	struct	ifubinfo qe_uba;	/* Q-bus resources 		*/
 	struct	ifrw qe_ifr[NRCV]; /*	for receive buffers;	*/
 	struct	ifxmt qe_ifw[NXMT]; /*	for xmit buffers;	*/
@@ -360,6 +358,7 @@
 	struct	ifnet *ifp = (struct ifnet *)&sc->qe_if;
 	struct qedevice *addr =(struct qedevice *)ua->ua_addr;
 	int i;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	printf("\n");
 	sc->qe_vaddr = addr;
@@ -375,12 +374,12 @@
 	 * Read the address from the prom and save it.
 	 */
 	for (i = 0; i < 6; i++)
-		sc->setup_pkt[i][1] = sc->qe_addr[i] =
+		sc->setup_pkt[i][1] = myaddr[i] =
 		    addr->qe_sta_addr[i] & 0xff;
 	addr->qe_vector |= 1;
 	printf("qe%d: %s, hardware address %s\n", sc->qe_dev.dv_unit,
 		addr->qe_vector&01 ? "delqa":"deqna",
-		ether_sprintf(sc->qe_addr));
+		ether_sprintf(myaddr));
 	addr->qe_vector &= ~1;
 
 	/*
@@ -393,7 +392,7 @@
 	ifp->if_watchdog = qetimeout;
 	sc->qe_uba.iff_flags = UBA_CANTWAIT;
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 }
 
 /*
@@ -778,7 +777,7 @@
 		switch(ifa->ifa_addr->sa_family) {
 #ifdef INET
 		case AF_INET:
-			arp_ifinit(&sc->qe_ac, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -787,7 +786,8 @@
 			register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
 
 			if (ns_nullhost(*ina))
-				ina->x_host = *(union ns_host *)(sc->qe_addr);
+				ina->x_host = 
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
 				qe_setaddr(ina->x_host.c_host, sc);
 			break;
@@ -828,7 +828,8 @@
 	register int i;
 
 	for (i = 0; i < 6; i++)
-		sc->setup_pkt[i][1] = sc->qe_addr[i] = physaddr[i];
+		sc->setup_pkt[i][1] = LLADDR(sc->qe_if.if_sadl)[i] 
+		    = physaddr[i];
 	sc->qe_flags |= QEF_SETADDR;
 	if (sc->qe_if.if_flags & IFF_RUNNING)
 		qesetup(sc);
--- a/sys/conf/files	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/conf/files	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.118 1997/03/12 01:56:18 cgd Exp $
+#	$NetBSD: files,v 1.119 1997/03/15 18:11:14 is Exp $
 
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
@@ -24,6 +24,9 @@
 define	ether
 define	fddi
 
+# devices ARPing IPv4 pull this in:
+define	arp
+
 # Device description for machine-independent IPKDB code.
 define	ipkdb
 
@@ -66,11 +69,11 @@
 file	dev/ic/uha.c		uha
 
 # 3Com Etherlink-III Ethernet controller
-device	ep: ether, ifnet
+device	ep: arp, ether, ifnet
 file	dev/ic/elink3.c		ep
 
 # LANCE and PCnet Ethernet controllers
-device	le: ether, ifnet
+device	le: arp, ether, ifnet
 file	dev/ic/am7990.c		le
 
 # NCR 5380 SCSI Bus Controller
@@ -302,8 +305,8 @@
 file netccitt/pk_subr.c			ccitt
 file netccitt/pk_timer.c		ccitt
 file netccitt/pk_usrreq.c		ccitt
+file netinet/if_arp.c			arp		needs-flag
 file netinet/if_atm.c			atm
-file netinet/if_ether.c			ether
 file netinet/igmp.c			inet
 file netinet/in.c			inet
 file netinet/in_pcb.c			inet
--- a/sys/conf/newvers.sh	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/conf/newvers.sh	Sat Mar 15 18:09:08 1997 +0000
@@ -1,6 +1,6 @@
 #!/bin/sh -
 #
-#	$NetBSD: newvers.sh,v 1.24 1997/01/31 09:28:05 thorpej Exp $
+#	$NetBSD: newvers.sh,v 1.25 1997/03/15 18:11:15 is Exp $
 #
 # Copyright (c) 1984, 1986, 1990, 1993
 #	The Regents of the University of California.  All rights reserved.
@@ -45,7 +45,7 @@
 id=`basename ${d}`
 
 ost="NetBSD"
-osr="1.2C"
+osr="1.2D"
 
 echo "char ostype[] = \"${ost}\";" > vers.c
 echo "char osrelease[] = \"${osr}\";" >> vers.c
--- a/sys/dev/clock_subr.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/clock_subr.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: clock_subr.c,v 1.2 1997/02/20 00:32:15 gwr Exp $	*/
+/*	$NetBSD: clock_subr.c,v 1.3 1997/03/15 18:11:16 is Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
--- a/sys/dev/clock_subr.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/clock_subr.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: clock_subr.h,v 1.1 1997/02/19 23:29:28 gwr Exp $	*/
+/*	$NetBSD: clock_subr.h,v 1.2 1997/03/15 18:11:17 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
--- a/sys/dev/dec/if_le_dec.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/dec/if_le_dec.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_dec.c,v 1.3 1996/10/13 01:38:38 christos Exp $	*/
+/*	$NetBSD: if_le_dec.c,v 1.4 1997/03/15 18:12:04 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -49,10 +49,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <dev/ic/am7990reg.h>
@@ -87,8 +88,8 @@
 	/*
 	 * Get the ethernet address out of rom
 	 */
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++) {
-		sc->sc_arpcom.ac_enaddr[i] = *eap;
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++) {
+		sc->sc_enaddr[i] = *eap;
 		eap += 4;
 	}
 
--- a/sys/dev/eisa/files.eisa	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/eisa/files.eisa	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.eisa,v 1.12 1996/09/01 00:10:55 mycroft Exp $
+#	$NetBSD: files.eisa,v 1.13 1997/03/15 18:11:18 is Exp $
 #
 # Config.new file and device description for machine-independent EISA code.
 # Included by ports that need it.  Requires that the SCSI files be
@@ -34,6 +34,6 @@
 file	dev/eisa/if_ep_eisa.c		ep_eisa
 
 # DEC DEFEA EISA FDDI Controller
-device	fea: pdq, fddi, ifnet
+device	fea: pdq, fddi, ifnet, arp
 attach	fea at eisa
 file	dev/eisa/if_fea.c		fea
--- a/sys/dev/eisa/if_ep_eisa.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/eisa/if_ep_eisa.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ep_eisa.c,v 1.10 1997/02/18 10:51:06 jonathan Exp $	*/
+/*	$NetBSD: if_ep_eisa.c,v 1.11 1997/03/15 18:11:19 is Exp $	*/
 
 /*
  * Copyright (c) 1994 Herb Peyerl <hpeyerl@beer.org>
@@ -44,15 +44,15 @@
 
 #include <net/if.h>
 #include <net/if_dl.h>
+#include <net/if_ether.h>   
 #include <net/if_types.h>
-#include <net/netisr.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>   
+#include <netinet/if_inarp.h>   
 #endif
 
 #ifdef NS
--- a/sys/dev/eisa/if_fea.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/eisa/if_fea.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_fea.c,v 1.12 1997/03/05 08:02:03 mikel Exp $	*/
+/*	$NetBSD: if_fea.c,v 1.13 1997/03/15 18:11:20 is Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -50,7 +50,10 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/route.h>
+
+#if defined(__NetBSD__)
+#include <net/if_ether.h>
+#endif
 
 #include "bpfilter.h"
 #if NBPFILTER > 0
@@ -63,8 +66,12 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
+#if defined(__NetBSD__)
+#include <netinet/if_inarp.h>
+#else
 #include <netinet/if_ether.h>
 #endif
+#endif
 
 #if defined(__FreeBSD__)
 #include <netinet/if_fddi.h>
@@ -521,8 +528,6 @@
 	return;
     }
 
-    bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, sc->sc_ac.ac_enaddr, 6);
-
     pdq_ifattach(sc, pdq_eisa_ifwatchdog);
 
     if (eisa_intr_map(ea->ea_ec, irq, &ih)) {
--- a/sys/dev/ic/aha.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/aha.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: aha.c,v 1.2 1997/02/26 04:52:13 sommerfe Exp $	*/
+/*	$NetBSD: aha.c,v 1.3 1997/03/15 18:11:21 is Exp $	*/
 
 #undef AHADIAG
 #ifdef DDB
--- a/sys/dev/ic/ahareg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/ahareg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ahareg.h,v 1.1 1997/02/07 17:37:29 mycroft Exp $	*/
+/*	$NetBSD: ahareg.h,v 1.2 1997/03/15 18:11:23 is Exp $	*/
 
 /*
  * Copyright (c) 1994, 1996 Charles M. Hannum.  All rights reserved.
--- a/sys/dev/ic/ahavar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/ahavar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ahavar.h,v 1.1 1997/02/07 17:37:30 mycroft Exp $	*/
+/*	$NetBSD: ahavar.h,v 1.2 1997/03/15 18:11:23 is Exp $	*/
 
 /*
  * Copyright (c) 1994, 1996 Charles M. Hannum.  All rights reserved.
--- a/sys/dev/ic/am7990.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/am7990.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: am7990.c,v 1.25 1997/03/09 21:12:39 leo Exp $	*/
+/*	$NetBSD: am7990.c,v 1.26 1997/03/15 18:11:25 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -52,10 +52,12 @@
 #include <sys/errno.h>
 
 #include <net/if.h>
+#include <net/if_dl.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
@@ -96,7 +98,7 @@
 
 hide void am7990_shutdown __P((void *));
 
-#define	ifp	(&sc->sc_arpcom.ac_if)
+#define	ifp	(&sc->sc_ethercom.ec_if)
 
 #ifdef	sun3	/* XXX what do we do about this?!  --thorpej */
 static inline u_int16_t ether_cmp __P((void *, void *));
@@ -162,7 +164,7 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -193,7 +195,7 @@
 		panic("am7990_config: weird memory size");
 	}
 
-	printf(": address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf(": address %s\n", ether_sprintf(sc->sc_enaddr));
 	printf("%s: %d receive buffers, %d transmit buffers\n",
 	    sc->sc_dev.dv_xname, sc->sc_nrbuf, sc->sc_ntbuf);
 
@@ -253,12 +255,12 @@
 #endif
 		init.init_mode = LE_MODE_NORMAL;
 	init.init_padr[0] =
-	    (sc->sc_arpcom.ac_enaddr[1] << 8) | sc->sc_arpcom.ac_enaddr[0];
+	    (LLADDR(ifp->if_sadl)[1] << 8) | LLADDR(ifp->if_sadl)[0];
 	init.init_padr[1] =
-	    (sc->sc_arpcom.ac_enaddr[3] << 8) | sc->sc_arpcom.ac_enaddr[2];
+	    (LLADDR(ifp->if_sadl)[3] << 8) | LLADDR(ifp->if_sadl)[2];
 	init.init_padr[2] =
-	    (sc->sc_arpcom.ac_enaddr[5] << 8) | sc->sc_arpcom.ac_enaddr[4];
-	am7990_setladrf(&sc->sc_arpcom, init.init_ladrf);
+	    (LLADDR(ifp->if_sadl)[5] << 8) | LLADDR(ifp->if_sadl)[4];
+	am7990_setladrf(&sc->sc_ethercom, init.init_ladrf);
 
 	sc->sc_last_rd = 0;
 	sc->sc_first_td = sc->sc_last_td = sc->sc_no_td = 0;
@@ -489,7 +491,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    ETHER_CMP(eh->ether_dhost, sc->sc_arpcom.ac_enaddr)) {
+		    ETHER_CMP(eh->ether_dhost, LLADDR(ifp->if_sadl))) {
 			m_freem(m);
 			return;
 		}
@@ -505,7 +507,7 @@
 	 * destination address (garbage will usually not match).
 	 * Of course, this precludes multicast support...
 	 */
-	if (ETHER_CMP(eh->ether_dhost, sc->sc_arpcom.ac_enaddr) &&
+	if (ETHER_CMP(eh->ether_dhost, LLADDR(ifp->if_sadl)) &&
 	    ETHER_CMP(eh->ether_dhost, etherbroadcastaddr)) {
 		m_freem(m);
 		return;
@@ -866,7 +868,7 @@
 #ifdef INET
 		case AF_INET:
 			am7990_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -876,11 +878,12 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
+			else {
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl),
+				    sizeof(sc->sc_enaddr));
+			}	
 			/* Set new address. */
 			am7990_init(sc);
 			break;
@@ -937,8 +940,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -1028,10 +1031,10 @@
  */
 void
 am7990_setladrf(ac, af)
-	struct arpcom *ac;
+	struct ethercom *ac;
 	u_int16_t *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ac->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_int32_t crc;
--- a/sys/dev/ic/am7990reg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/am7990reg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: am7990reg.h,v 1.2 1997/03/09 21:12:41 leo Exp $	*/
+/*	$NetBSD: am7990reg.h,v 1.3 1997/03/15 18:11:26 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
--- a/sys/dev/ic/am7990var.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/am7990var.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: am7990var.h,v 1.10 1997/03/09 21:12:42 leo Exp $	*/
+/*	$NetBSD: am7990var.h,v 1.11 1997/03/15 18:11:27 is Exp $	*/
 
 /*
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -41,7 +41,7 @@
  * Ethernet software status per device.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface. 
+ * ethercom.ec_if, which the routing code uses to locate the interface. 
  * This structure contains the output queue for the interface, its address, ...
  *
  * NOTE: this structure MUST be the first element in machine-dependent
@@ -52,7 +52,7 @@
  */
 struct am7990_softc {
 	struct	device sc_dev;		/* base device glue */
-	struct	arpcom sc_arpcom;	/* Ethernet common part */
+	struct	ethercom sc_ethercom;	/* Ethernet common part */
 
 	/*
 	 * Memory functions:
@@ -110,6 +110,8 @@
 #ifdef LEDEBUG
 	int	sc_debug;
 #endif
+	u_int8_t sc_enaddr[6];
+	u_int8_t sc_pad[2];
 };
 
 /* Export this to machine-dependent drivers. */
@@ -120,7 +122,7 @@
 int am7990_ioctl __P((struct ifnet *, u_long, caddr_t));
 void am7990_meminit __P((struct am7990_softc *));
 void am7990_reset __P((struct am7990_softc *));
-void am7990_setladrf __P((struct arpcom *, u_int16_t *));
+void am7990_setladrf __P((struct ethercom *, u_int16_t *));
 void am7990_start __P((struct ifnet *));
 void am7990_stop __P((struct am7990_softc *));
 void am7990_watchdog __P((struct ifnet *));
--- a/sys/dev/ic/elink3.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/elink3.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: elink3.c,v 1.20 1997/02/18 10:51:15 jonathan Exp $	*/
+/*	$NetBSD: elink3.c,v 1.21 1997/03/15 18:11:29 is Exp $	*/
 
 /*
  * Copyright (c) 1996, 1997 Jonathan Stone <jonathan@NetBSD.org>
@@ -44,17 +44,17 @@
 #include <sys/device.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
 #include <net/if_dl.h>
+#include <net/if_ether.h>
 #include <net/if_types.h>
-#include <net/netisr.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -143,10 +143,11 @@
 	struct ep_softc *sc;
 	u_short chipset;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 	u_int16_t i;
+	u_int8_t myla[6];
 
 	printf("%s: ", sc->sc_dev.dv_xname);
 
@@ -169,11 +170,11 @@
 		if (epbusyeeprom(sc))
 			return;
 		x = bus_space_read_2(iot, ioh, EP_W0_EEPROM_DATA);
-		sc->sc_arpcom.ac_enaddr[(i << 1)] = x >> 8;
-		sc->sc_arpcom.ac_enaddr[(i << 1) + 1] = x;
+		myla[(i << 1)] = x >> 8;
+		myla[(i << 1) + 1] = x;
 	}
 
-	printf("MAC address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf("MAC address %s\n", ether_sprintf(myla));
 
 	/*
 	 * Vortex-based (3c59x, eisa)? and Boomerang (3c900)cards allow
@@ -258,10 +259,10 @@
 	    IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
 
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myla);
 
 #if NBPFILTER > 0
-	bpfattach(&sc->sc_arpcom.ac_if.if_bpf, ifp, DLT_EN10MB,
+	bpfattach(&sc->sc_ethercom.ec_if.if_bpf, ifp, DLT_EN10MB,
 		  sizeof(struct ether_header));
 #endif
 
@@ -419,7 +420,7 @@
 epinit(sc)
 	register struct ep_softc *sc;
 {
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 	int i;
@@ -445,7 +446,7 @@
 	GO_WINDOW(2);
 	for (i = 0; i < 6; i++)	/* Reload the ether_addr. */
 		bus_space_write_1(iot, ioh, EP_W2_ADDR_0 + i,
-		    sc->sc_arpcom.ac_enaddr[i]);
+		    LLADDR(ifp->if_sadl)[i]);
 
 	/*
 	 * Reset the station-address receive filter.
@@ -501,7 +502,7 @@
 epsetfilter(sc)
 	register struct ep_softc *sc;
 {
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	GO_WINDOW(1);		/* Window 1 is operating window */
 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, EP_COMMAND, SET_RX_FILTER |
@@ -519,7 +520,7 @@
 epsetlink(sc)
 	register struct ep_softc *sc;
 {
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 
@@ -748,26 +749,26 @@
 	GO_WINDOW(1);
 
 	if (fifost & FIFOS_RX_UNDERRUN) {
-		if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
+		if (sc->sc_ethercom.ec_if.if_flags & IFF_DEBUG)
 			printf("%s: RX underrun\n", sc->sc_dev.dv_xname);
 		epreset(sc);
 		return 0;
 	}
 
 	if (fifost & FIFOS_RX_STATUS_OVERRUN) {
-		if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
+		if (sc->sc_ethercom.ec_if.if_flags & IFF_DEBUG)
 			printf("%s: RX Status overrun\n", sc->sc_dev.dv_xname);
 		return 1;
 	}
 
 	if (fifost & FIFOS_RX_OVERRUN) {
-		if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
+		if (sc->sc_ethercom.ec_if.if_flags & IFF_DEBUG)
 			printf("%s: RX overrun\n", sc->sc_dev.dv_xname);
 		return 1;
 	}
 
 	if (fifost & FIFOS_TX_OVERRUN) {
-		if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
+		if (sc->sc_ethercom.ec_if.if_flags & IFF_DEBUG)
 			printf("%s: TX overrun\n", sc->sc_dev.dv_xname);
 		epreset(sc);
 		return 0;
@@ -793,14 +794,14 @@
 		bus_space_write_1(iot, ioh, EP_W1_TX_STATUS, 0x0);
 
 		if (i & TXS_JABBER) {
-			++sc->sc_arpcom.ac_if.if_oerrors;
-			if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
+			++sc->sc_ethercom.ec_if.if_oerrors;
+			if (sc->sc_ethercom.ec_if.if_flags & IFF_DEBUG)
 				printf("%s: jabber (%x)\n",
 				       sc->sc_dev.dv_xname, i);
 			epreset(sc);
 		} else if (i & TXS_UNDERRUN) {
-			++sc->sc_arpcom.ac_if.if_oerrors;
-			if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG)
+			++sc->sc_ethercom.ec_if.if_oerrors;
+			if (sc->sc_ethercom.ec_if.if_flags & IFF_DEBUG)
 				printf("%s: fifo underrun (%x) @%d\n",
 				       sc->sc_dev.dv_xname, i,
 				       sc->tx_start_thresh);
@@ -810,9 +811,9 @@
 			sc->tx_succ_ok = 0;
 			epreset(sc);
 		} else if (i & TXS_MAX_COLLISION) {
-			++sc->sc_arpcom.ac_if.if_collisions;
+			++sc->sc_ethercom.ec_if.if_collisions;
 			bus_space_write_2(iot, ioh, EP_COMMAND, TX_ENABLE);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		} else
 			sc->tx_succ_ok = (sc->tx_succ_ok+1) & 127;
 	}
@@ -825,7 +826,7 @@
 	register struct ep_softc *sc = arg;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_int16_t status;
 	int ret = 0;
 
@@ -851,8 +852,8 @@
 		if (status & S_RX_COMPLETE)
 			epread(sc);
 		if (status & S_TX_AVAIL) {
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
-			epstart(&sc->sc_arpcom.ac_if);
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
+			epstart(&sc->sc_ethercom.ec_if);
 		}
 		if (status & S_CARD_FAILURE) {
 			printf("%s: adapter failure (%x)\n",
@@ -876,7 +877,7 @@
 {
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *m;
 	struct ether_header *eh;
 	int len;
@@ -944,7 +945,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(sc->sc_ethercom.ec_if.if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -1000,7 +1001,7 @@
 {
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *top, **mp, *m;
 	int len, remaining;
 	int sh;
@@ -1153,7 +1154,7 @@
 #ifdef INET
 		case AF_INET:
 			epinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(&sc->sc_ethercom.ec_if, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1162,12 +1163,12 @@
 			register struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
 
 			if (ns_nullhost(*ina))
-				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				ina->x_host = *(union ns_host *)
+				    LLADDR(ifp->if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(ifp->if_sadl),
+				    ifp->if_addrlen);
 			/* Set new address. */
 			epinit(sc);
 			break;
@@ -1209,8 +1210,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -1250,7 +1251,7 @@
 	struct ep_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++sc->sc_ethercom.ec_if.if_oerrors;
 
 	epreset(sc);
 }
--- a/sys/dev/ic/elink3var.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/elink3var.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: elink3var.h,v 1.10 1997/02/18 10:51:17 jonathan Exp $	*/
+/*	$NetBSD: elink3var.h,v 1.11 1997/03/15 18:11:30 is Exp $	*/
 
 /*
  * Copyright (c) 1994 Herb Peyerl <hpeyerl@beer.org>
@@ -37,7 +37,7 @@
 	struct device sc_dev;
 	void *sc_ih;
 
-	struct arpcom sc_arpcom;	/* Ethernet common part		*/
+	struct ethercom sc_ethercom;	/* Ethernet common part		*/
 	bus_space_tag_t sc_iot;		/* bus cookie			*/
 	bus_space_handle_t sc_ioh;	/* bus i/o handle		*/
 	u_int	ep_connectors;		/* Connectors on this card.	*/
--- a/sys/dev/ic/mb86960.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/mb86960.c	Sat Mar 15 18:09:08 1997 +0000
@@ -58,14 +58,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -167,7 +168,7 @@
 	struct	device sc_dev;
 	void	*sc_ih;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	/* Set by probe() and not modified in later phases. */
 	enum	fe_type type;	/* interface type code */
@@ -194,11 +195,10 @@
 	/* Multicast address filter management. */
 	u_char	filter_change;	/* MARs must be changed ASAP. */
 	u_char	filter[FE_FILTER_LEN];	/* new filter value. */
+
+	u_int8_t sc_enaddr[ETHER_ADDR_LEN];
 };
 
-/* Frequently accessed members in arpcom. */
-#define sc_enaddr	sc_arpcom.ac_enaddr
-
 /* Standard driver entry points.  These can be static. */
 int	feprobe		__P((struct device *, void *, void *));
 void	feattach	__P((struct device *, struct device *, void *));
@@ -224,7 +224,7 @@
 void	fe_write_mbufs	__P((struct fe_softc *, struct mbuf *));
 static inline
 void	fe_droppacket	__P((struct fe_softc *));
-void	fe_getmcaf	__P((struct arpcom *, u_char *));
+void	fe_getmcaf	__P((struct ethercom *, u_char *));
 void	fe_setmode	__P((struct fe_softc *));
 void	fe_loadmar	__P((struct fe_softc *));
 #if FE_DEBUG >= 1
@@ -994,7 +994,7 @@
 	struct fe_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Stop the 86960. */
 	fe_stop(sc);
@@ -1063,11 +1063,11 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	/* Print additional info when attached. */
 	printf(": address %s, type %s\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr), sc->typestr);
+	    ether_sprintf(sc->sc_enaddr), sc->typestr);
 #if FE_DEBUG >= 3
 	{
 		int buf, txb, bbw, sbw, ram;
@@ -1214,7 +1214,7 @@
 #endif
 
 	/* Record how many packets are lost by this accident. */
-	sc->sc_arpcom.ac_if.if_oerrors += sc->txb_sched + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_oerrors += sc->txb_sched + sc->txb_count;
 
 	fe_reset(sc);
 }
@@ -1237,7 +1237,7 @@
 fe_init(sc)
 	struct fe_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i;
 
 #if FE_DEBUG >= 3
@@ -1399,7 +1399,7 @@
 	 * We use longer timeout for multiple packet transmission.
 	 * I'm not sure this timer value is appropriate.  FIXME.
 	 */
-	sc->sc_arpcom.ac_if.if_timer = 1 + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_timer = 1 + sc->txb_count;
 
 	/* Update txb variables. */
 	sc->txb_sched = sc->txb_count;
@@ -1577,7 +1577,7 @@
 	struct fe_softc *sc;
 	u_char tstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int left;
 	int col;
 
@@ -1716,7 +1716,7 @@
 	struct fe_softc *sc;
 	u_char rstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int len;
 	u_char status;
 	int i;
@@ -1898,7 +1898,7 @@
 		if (sc->filter_change &&
 		    sc->txb_count == 0 && sc->txb_sched == 0) {
 			fe_loadmar(sc);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 
 		/*
@@ -1907,8 +1907,8 @@
 		 * after handling the receiver interrupt to give the
 		 * receive operation priority.
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-			fe_start(&sc->sc_arpcom.ac_if);
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_OACTIVE) == 0)
+			fe_start(&sc->sc_ethercom.ec_if);
 
 		/*
 		 * Get interrupt conditions, masking unneeded flags.
@@ -1949,7 +1949,7 @@
 #ifdef INET
 		case AF_INET:
 			fe_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1959,11 +1959,13 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)(sc->sc_enaddr);
+			else {
+				bcopy(ina->x_host.c_host, sc->sc_enaddr,
+				    ETHER_ADDR_LEN);
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			fe_init(sc);
 			break;
@@ -2011,8 +2013,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2044,7 +2046,7 @@
 {
 	struct ether_header *eh;
 	struct mbuf *m;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Allocate a header mbuf. */
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
@@ -2105,7 +2107,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-	  	    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+	  	    bcmp(eh->ether_dhost, sc->sc_enaddr,
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return (1);
@@ -2186,7 +2188,7 @@
 		log(LOG_ERR, "%s: got a %s packet (%u bytes) to send\n",
 		    sc->sc_dev.dv_xname,
 		    totlen < ETHER_HDR_SIZE ? "partial" : "big", totlen);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 		return;
 	}
 #endif
@@ -2270,11 +2272,11 @@
  * list of multicast addresses we need to listen to.
  */
 void
-fe_getmcaf(ac, af)
-	struct arpcom *ac;
+fe_getmcaf(ec, af)
+	struct ethercom *ec;
 	u_char *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ec->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
@@ -2293,7 +2295,7 @@
 		goto allmulti;
 
 	af[0] = af[1] = af[2] = af[3] = af[4] = af[5] = af[6] = af[7] = 0x00;
-	ETHER_FIRST_MULTI(step, ac, enm);
+	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    sizeof(enm->enm_addrlo)) != 0) {
@@ -2345,7 +2347,7 @@
 fe_setmode(sc)
 	struct fe_softc *sc;
 {
-	int flags = sc->sc_arpcom.ac_if.if_flags;
+	int flags = sc->sc_ethercom.ec_if.if_flags;
 
 	/*
 	 * If the interface is not running, we postpone the update
@@ -2392,7 +2394,7 @@
 	/*
 	 * Find the new multicast filter value.
 	 */
-	fe_getmcaf(&sc->sc_arpcom, sc->filter);
+	fe_getmcaf(&sc->sc_ethercom, sc->filter);
 	sc->filter_change = 1;
 
 #if FE_DEBUG >= 3
--- a/sys/dev/ic/mb86960var.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/mb86960var.h	Sat Mar 15 18:09:08 1997 +0000
@@ -58,14 +58,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -167,7 +168,7 @@
 	struct	device sc_dev;
 	void	*sc_ih;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	/* Set by probe() and not modified in later phases. */
 	enum	fe_type type;	/* interface type code */
@@ -194,11 +195,10 @@
 	/* Multicast address filter management. */
 	u_char	filter_change;	/* MARs must be changed ASAP. */
 	u_char	filter[FE_FILTER_LEN];	/* new filter value. */
+
+	u_int8_t sc_enaddr[ETHER_ADDR_LEN];
 };
 
-/* Frequently accessed members in arpcom. */
-#define sc_enaddr	sc_arpcom.ac_enaddr
-
 /* Standard driver entry points.  These can be static. */
 int	feprobe		__P((struct device *, void *, void *));
 void	feattach	__P((struct device *, struct device *, void *));
@@ -224,7 +224,7 @@
 void	fe_write_mbufs	__P((struct fe_softc *, struct mbuf *));
 static inline
 void	fe_droppacket	__P((struct fe_softc *));
-void	fe_getmcaf	__P((struct arpcom *, u_char *));
+void	fe_getmcaf	__P((struct ethercom *, u_char *));
 void	fe_setmode	__P((struct fe_softc *));
 void	fe_loadmar	__P((struct fe_softc *));
 #if FE_DEBUG >= 1
@@ -994,7 +994,7 @@
 	struct fe_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Stop the 86960. */
 	fe_stop(sc);
@@ -1063,11 +1063,11 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	/* Print additional info when attached. */
 	printf(": address %s, type %s\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr), sc->typestr);
+	    ether_sprintf(sc->sc_enaddr), sc->typestr);
 #if FE_DEBUG >= 3
 	{
 		int buf, txb, bbw, sbw, ram;
@@ -1214,7 +1214,7 @@
 #endif
 
 	/* Record how many packets are lost by this accident. */
-	sc->sc_arpcom.ac_if.if_oerrors += sc->txb_sched + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_oerrors += sc->txb_sched + sc->txb_count;
 
 	fe_reset(sc);
 }
@@ -1237,7 +1237,7 @@
 fe_init(sc)
 	struct fe_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i;
 
 #if FE_DEBUG >= 3
@@ -1399,7 +1399,7 @@
 	 * We use longer timeout for multiple packet transmission.
 	 * I'm not sure this timer value is appropriate.  FIXME.
 	 */
-	sc->sc_arpcom.ac_if.if_timer = 1 + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_timer = 1 + sc->txb_count;
 
 	/* Update txb variables. */
 	sc->txb_sched = sc->txb_count;
@@ -1577,7 +1577,7 @@
 	struct fe_softc *sc;
 	u_char tstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int left;
 	int col;
 
@@ -1716,7 +1716,7 @@
 	struct fe_softc *sc;
 	u_char rstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int len;
 	u_char status;
 	int i;
@@ -1898,7 +1898,7 @@
 		if (sc->filter_change &&
 		    sc->txb_count == 0 && sc->txb_sched == 0) {
 			fe_loadmar(sc);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 
 		/*
@@ -1907,8 +1907,8 @@
 		 * after handling the receiver interrupt to give the
 		 * receive operation priority.
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-			fe_start(&sc->sc_arpcom.ac_if);
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_OACTIVE) == 0)
+			fe_start(&sc->sc_ethercom.ec_if);
 
 		/*
 		 * Get interrupt conditions, masking unneeded flags.
@@ -1949,7 +1949,7 @@
 #ifdef INET
 		case AF_INET:
 			fe_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1959,11 +1959,13 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)(sc->sc_enaddr);
+			else {
+				bcopy(ina->x_host.c_host, sc->sc_enaddr,
+				    ETHER_ADDR_LEN);
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			fe_init(sc);
 			break;
@@ -2011,8 +2013,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2044,7 +2046,7 @@
 {
 	struct ether_header *eh;
 	struct mbuf *m;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Allocate a header mbuf. */
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
@@ -2105,7 +2107,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-	  	    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+	  	    bcmp(eh->ether_dhost, sc->sc_enaddr,
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return (1);
@@ -2186,7 +2188,7 @@
 		log(LOG_ERR, "%s: got a %s packet (%u bytes) to send\n",
 		    sc->sc_dev.dv_xname,
 		    totlen < ETHER_HDR_SIZE ? "partial" : "big", totlen);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 		return;
 	}
 #endif
@@ -2270,11 +2272,11 @@
  * list of multicast addresses we need to listen to.
  */
 void
-fe_getmcaf(ac, af)
-	struct arpcom *ac;
+fe_getmcaf(ec, af)
+	struct ethercom *ec;
 	u_char *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ec->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
@@ -2293,7 +2295,7 @@
 		goto allmulti;
 
 	af[0] = af[1] = af[2] = af[3] = af[4] = af[5] = af[6] = af[7] = 0x00;
-	ETHER_FIRST_MULTI(step, ac, enm);
+	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    sizeof(enm->enm_addrlo)) != 0) {
@@ -2345,7 +2347,7 @@
 fe_setmode(sc)
 	struct fe_softc *sc;
 {
-	int flags = sc->sc_arpcom.ac_if.if_flags;
+	int flags = sc->sc_ethercom.ec_if.if_flags;
 
 	/*
 	 * If the interface is not running, we postpone the update
@@ -2392,7 +2394,7 @@
 	/*
 	 * Find the new multicast filter value.
 	 */
-	fe_getmcaf(&sc->sc_arpcom, sc->filter);
+	fe_getmcaf(&sc->sc_ethercom, sc->filter);
 	sc->filter_change = 1;
 
 #if FE_DEBUG >= 3
--- a/sys/dev/ic/ncr53c9x.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/ncr53c9x.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ncr53c9x.c,v 1.2 1997/02/27 13:59:32 briggs Exp $	*/
+/*	$NetBSD: ncr53c9x.c,v 1.3 1997/03/15 18:11:31 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
--- a/sys/dev/ic/ncr53c9xreg.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/ncr53c9xreg.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ncr53c9xreg.h,v 1.1 1997/02/27 01:12:08 thorpej Exp $	*/
+/*	$NetBSD: ncr53c9xreg.h,v 1.2 1997/03/15 18:11:32 is Exp $	*/
 
 /*
  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
--- a/sys/dev/ic/ncr53c9xvar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/ncr53c9xvar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ncr53c9xvar.h,v 1.2 1997/02/27 13:59:34 briggs Exp $	*/
+/*	$NetBSD: ncr53c9xvar.h,v 1.3 1997/03/15 18:11:33 is Exp $	*/
 
 /*
  * Copyright (c) 1997 Jason R. Thorpe.
--- a/sys/dev/ic/pdq_ifsubr.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/pdq_ifsubr.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: pdq_ifsubr.c,v 1.7 1997/02/20 17:53:50 is Exp $	*/
+/*	$NetBSD: pdq_ifsubr.c,v 1.8 1997/03/15 18:11:34 is Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -52,7 +52,15 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
+
+#if !defined(__NetBSD__)
 #include <net/route.h>
+#endif
+
+#if defined(__NetBSD__)
+#include <net/if_ether.h>
+#endif
+
 
 #include "bpfilter.h"
 #if NBPFILTER > 0
@@ -65,8 +73,12 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
+#if defined(__NetBSD__)
+#include <netinet/if_inarp.h>
+#else
 #include <netinet/if_ether.h>
 #endif
+#endif
 #if defined(__FreeBSD__)
 #include <netinet/if_fddi.h>
 #else
@@ -158,7 +170,7 @@
 pdq_ifstart(
     struct ifnet *ifp)
 {
-    pdq_softc_t *sc = (pdq_softc_t *) ((caddr_t) ifp - offsetof(pdq_softc_t, sc_ac.ac_if));
+    pdq_softc_t *sc = (pdq_softc_t *) ((caddr_t) ifp - offsetof(pdq_softc_t, sc_ec.ec_if));
     struct ifqueue *ifq = &ifp->if_snd;
     struct mbuf *m;
     int tx = 0;
@@ -204,7 +216,11 @@
     if ((fh->fddi_fc & (FDDIFC_L|FDDIFC_F)) != FDDIFC_LLC_ASYNC ||
 	((sc->sc_if.if_flags & IFF_PROMISC) &&
 	 (fh->fddi_dhost[0] & 1) == 0 && /* !mcast and !bcast */
+#ifdef __NetBSD__
+	 bcmp(fh->fddi_dhost, LLADDR(sc->sc_ec.ec_if.if_sadl),
+#else
 	 bcmp(fh->fddi_dhost, sc->sc_ac.ac_enaddr,
+#endif
 	     sizeof(fh->fddi_dhost)) != 0)) {
 	m_freem(m);
 	return;
@@ -256,7 +272,7 @@
     struct ether_multistep step;
     struct ether_multi *enm;
 
-    ETHER_FIRST_MULTI(step, &sc->sc_ac, enm);
+    ETHER_FIRST_MULTI(step, &sc->sc_ec, enm);
     while (enm != NULL && num_addrs > 0) {
 	((u_short *) addr->lanaddr_bytes)[0] = ((u_short *) enm->enm_addrlo)[0];
 	((u_short *) addr->lanaddr_bytes)[1] = ((u_short *) enm->enm_addrlo)[1];
@@ -273,7 +289,7 @@
     ioctl_cmd_t cmd,
     caddr_t data)
 {
-    pdq_softc_t *sc = (pdq_softc_t *) ((caddr_t) ifp - offsetof(pdq_softc_t, sc_ac.ac_if));
+    pdq_softc_t *sc = (pdq_softc_t *) ((caddr_t) ifp - offsetof(pdq_softc_t, sc_ec.ec_if));
     int s, error = 0;
 
     s = splimp();
@@ -287,7 +303,7 @@
 #if defined(INET)
 		case AF_INET: {
 		    pdq_ifinit(sc);
-		    arp_ifinit(&sc->sc_ac, ifa);
+		    arp_ifinit(ifp, ifa);
 		    break;
 		}
 #endif /* INET */
@@ -300,12 +316,11 @@
 		case AF_NS: {
 		    struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
 		    if (ns_nullhost(*ina)) {
-			ina->x_host = *(union ns_host *)(sc->sc_ac.ac_enaddr);
+			ina->x_host = *(union ns_host *)LLADDR(ifp->if_sadl);
 		    } else {
 			ifp->if_flags &= ~IFF_RUNNING;
 			bcopy((caddr_t)ina->x_host.c_host,
-			      (caddr_t)sc->sc_ac.ac_enaddr,
-			      sizeof sc->sc_ac.ac_enaddr);
+			      LLADDR(ifp->if_sadl), ifp->if_data.ifi_addrlen);
 		    }
 
 		    pdq_ifinit(sc);
@@ -332,9 +347,9 @@
 	     * Update multicast listeners
 	     */
 	    if (cmd == SIOCADDMULTI)
-		error = ether_addmulti((struct ifreq *)data, &sc->sc_ac);
+		error = ether_addmulti((struct ifreq *)data, &sc->sc_ec);
 	    else
-		error = ether_delmulti((struct ifreq *)data, &sc->sc_ac);
+		error = ether_delmulti((struct ifreq *)data, &sc->sc_ec);
 
 	    if (error == ENETRESET) {
 		if (sc->sc_if.if_flags & IFF_RUNNING)
@@ -378,7 +393,7 @@
     ifp->if_start = pdq_ifstart;
   
     if_attach(ifp);
-    fddi_ifattach(ifp);
+    fddi_ifattach(ifp, (caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes);
 #if NBPFILTER > 0
     PDQ_BPFATTACH(sc, DLT_FDDI, sizeof(struct fddi_header));
 #endif
--- a/sys/dev/ic/pdqvar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ic/pdqvar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: pdqvar.h,v 1.11 1996/10/25 21:33:37 cgd Exp $	*/
+/*	$NetBSD: pdqvar.h,v 1.12 1997/03/15 18:11:35 is Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -203,8 +203,13 @@
 #elif defined(__FreeBSD__)
     struct kern_devconf *sc_kdc;	/* freebsd cruft */
 #endif
+#if defined(__NetBSD__)
+    struct ethercom sc_ec;
+#define	sc_if		sc_ec.ec_if
+#else
     struct arpcom sc_ac;
 #define	sc_if		sc_ac.ac_if
+#endif
     pdq_t *sc_pdq;
 #if !defined(__NetBSD__)
     pdq_bus_ioport_t sc_iobase;
--- a/sys/dev/isa/aha_isa.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/aha_isa.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: aha_isa.c,v 1.1 1997/02/07 17:37:32 mycroft Exp $	*/
+/*	$NetBSD: aha_isa.c,v 1.2 1997/03/15 18:11:36 is Exp $	*/
 
 /*
  * Copyright (c) 1994, 1996 Charles M. Hannum.  All rights reserved.
--- a/sys/dev/isa/files.isa	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/files.isa	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.isa,v 1.26 1997/02/07 17:37:34 mycroft Exp $
+#	$NetBSD: files.isa,v 1.27 1997/03/15 18:11:37 is Exp $
 #
 # Config.new file and device description for machine-independent ISA code.
 # Included by ports that need it.  Requires that the SCSI files be
@@ -128,17 +128,17 @@
 
 # National Semiconductor DS8390/WD83C690-based boards
 # (WD/SMC 80x3 family, SMC Ultra [8216], 3Com 3C503, NE[12]000, and clones)
-device	ed: ether, ifnet
+device	ed: ether, ifnet, arp
 attach	ed at isa
 file	dev/isa/if_ed.c			ed
 
 # 3Com 3C505
-device	eg: ether, ifnet
+device	eg: ether, ifnet, arp
 attach	eg at isa
 file	dev/isa/if_eg.c			eg
 
 # 3Com 3C501
-device	el: ether, ifnet
+device	el: ether, ifnet, arp
 attach	el at isa
 file	dev/isa/if_el.c			el
 
@@ -148,31 +148,31 @@
 
 # Fujitsu MB8696[05]-based boards
 # (Allied Telesis AT1700)
-device	fe: ether, ifnet
+device	fe: ether, ifnet, arp
 attach	fe at isa
 file	dev/isa/if_fe.c			fe
 
 # HP Lan Ethernet controllers
 # XXX currently broken
-#device hp: ether, ifnet
+#device hp: ether, ifnet, arp
 #attach	hp at isa
 #file	dev/isa/if_hp.c			hp
 
 # Intel i82586-based boards
 # (AT&T StarLAN 10, AT&T EN100, AT&T StarLAN Fiber, 3Com 3C507)
-device	ie: ether, ifnet, elink
+device	ie: ether, ifnet, elink, arp
 attach	ie at isa
 file	dev/isa/if_ie.c			ie
 
 # Intel i82595-based boards.
 # (Intel EtherExpress PRO)
-device  iy: ether, ifnet         
+device  iy: ether, ifnet, arp
 attach	iy at isa
 file    dev/isa/if_iy.c			iy
 
 # XXX ???
 # XXX NOT IN TREE?
-#device	ix: ether, ifnet
+#device	ix: ether, ifnet, arp
 #attach	ix at isa
 #file	dev/isa/if_ix.c			ix
 
--- a/sys/dev/isa/if_ate.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_ate.c	Sat Mar 15 18:09:08 1997 +0000
@@ -58,14 +58,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -167,7 +168,7 @@
 	struct	device sc_dev;
 	void	*sc_ih;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	/* Set by probe() and not modified in later phases. */
 	enum	fe_type type;	/* interface type code */
@@ -194,11 +195,10 @@
 	/* Multicast address filter management. */
 	u_char	filter_change;	/* MARs must be changed ASAP. */
 	u_char	filter[FE_FILTER_LEN];	/* new filter value. */
+
+	u_int8_t sc_enaddr[ETHER_ADDR_LEN];
 };
 
-/* Frequently accessed members in arpcom. */
-#define sc_enaddr	sc_arpcom.ac_enaddr
-
 /* Standard driver entry points.  These can be static. */
 int	feprobe		__P((struct device *, void *, void *));
 void	feattach	__P((struct device *, struct device *, void *));
@@ -224,7 +224,7 @@
 void	fe_write_mbufs	__P((struct fe_softc *, struct mbuf *));
 static inline
 void	fe_droppacket	__P((struct fe_softc *));
-void	fe_getmcaf	__P((struct arpcom *, u_char *));
+void	fe_getmcaf	__P((struct ethercom *, u_char *));
 void	fe_setmode	__P((struct fe_softc *));
 void	fe_loadmar	__P((struct fe_softc *));
 #if FE_DEBUG >= 1
@@ -994,7 +994,7 @@
 	struct fe_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Stop the 86960. */
 	fe_stop(sc);
@@ -1063,11 +1063,11 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	/* Print additional info when attached. */
 	printf(": address %s, type %s\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr), sc->typestr);
+	    ether_sprintf(sc->sc_enaddr), sc->typestr);
 #if FE_DEBUG >= 3
 	{
 		int buf, txb, bbw, sbw, ram;
@@ -1214,7 +1214,7 @@
 #endif
 
 	/* Record how many packets are lost by this accident. */
-	sc->sc_arpcom.ac_if.if_oerrors += sc->txb_sched + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_oerrors += sc->txb_sched + sc->txb_count;
 
 	fe_reset(sc);
 }
@@ -1237,7 +1237,7 @@
 fe_init(sc)
 	struct fe_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i;
 
 #if FE_DEBUG >= 3
@@ -1399,7 +1399,7 @@
 	 * We use longer timeout for multiple packet transmission.
 	 * I'm not sure this timer value is appropriate.  FIXME.
 	 */
-	sc->sc_arpcom.ac_if.if_timer = 1 + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_timer = 1 + sc->txb_count;
 
 	/* Update txb variables. */
 	sc->txb_sched = sc->txb_count;
@@ -1577,7 +1577,7 @@
 	struct fe_softc *sc;
 	u_char tstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int left;
 	int col;
 
@@ -1716,7 +1716,7 @@
 	struct fe_softc *sc;
 	u_char rstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int len;
 	u_char status;
 	int i;
@@ -1898,7 +1898,7 @@
 		if (sc->filter_change &&
 		    sc->txb_count == 0 && sc->txb_sched == 0) {
 			fe_loadmar(sc);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 
 		/*
@@ -1907,8 +1907,8 @@
 		 * after handling the receiver interrupt to give the
 		 * receive operation priority.
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-			fe_start(&sc->sc_arpcom.ac_if);
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_OACTIVE) == 0)
+			fe_start(&sc->sc_ethercom.ec_if);
 
 		/*
 		 * Get interrupt conditions, masking unneeded flags.
@@ -1949,7 +1949,7 @@
 #ifdef INET
 		case AF_INET:
 			fe_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1959,11 +1959,13 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)(sc->sc_enaddr);
+			else {
+				bcopy(ina->x_host.c_host, sc->sc_enaddr,
+				    ETHER_ADDR_LEN);
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			fe_init(sc);
 			break;
@@ -2011,8 +2013,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2044,7 +2046,7 @@
 {
 	struct ether_header *eh;
 	struct mbuf *m;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Allocate a header mbuf. */
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
@@ -2105,7 +2107,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-	  	    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+	  	    bcmp(eh->ether_dhost, sc->sc_enaddr,
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return (1);
@@ -2186,7 +2188,7 @@
 		log(LOG_ERR, "%s: got a %s packet (%u bytes) to send\n",
 		    sc->sc_dev.dv_xname,
 		    totlen < ETHER_HDR_SIZE ? "partial" : "big", totlen);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 		return;
 	}
 #endif
@@ -2270,11 +2272,11 @@
  * list of multicast addresses we need to listen to.
  */
 void
-fe_getmcaf(ac, af)
-	struct arpcom *ac;
+fe_getmcaf(ec, af)
+	struct ethercom *ec;
 	u_char *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ec->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
@@ -2293,7 +2295,7 @@
 		goto allmulti;
 
 	af[0] = af[1] = af[2] = af[3] = af[4] = af[5] = af[6] = af[7] = 0x00;
-	ETHER_FIRST_MULTI(step, ac, enm);
+	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    sizeof(enm->enm_addrlo)) != 0) {
@@ -2345,7 +2347,7 @@
 fe_setmode(sc)
 	struct fe_softc *sc;
 {
-	int flags = sc->sc_arpcom.ac_if.if_flags;
+	int flags = sc->sc_ethercom.ec_if.if_flags;
 
 	/*
 	 * If the interface is not running, we postpone the update
@@ -2392,7 +2394,7 @@
 	/*
 	 * Find the new multicast filter value.
 	 */
-	fe_getmcaf(&sc->sc_arpcom, sc->filter);
+	fe_getmcaf(&sc->sc_ethercom, sc->filter);
 	sc->filter_change = 1;
 
 #if FE_DEBUG >= 3
--- a/sys/dev/isa/if_ed.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_ed.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ed.c,v 1.106 1996/11/17 04:11:18 mikel Exp $	*/
+/*	$NetBSD: if_ed.c,v 1.107 1997/03/15 18:11:39 is Exp $	*/
 
 /*
  * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
@@ -31,14 +31,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -67,7 +68,7 @@
 	struct	device sc_dev;
 	void *sc_ih;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	char	*type_str;	/* pointer to type string */
 	u_char	vendor;		/* interface vendor */
@@ -112,6 +113,8 @@
 	u_char	rec_page_start;	/* first page of RX ring-buffer */
 	u_char	rec_page_stop;	/* last page of RX ring-buffer */
 	u_char	next_packet;	/* pointer to next unread RX packet */
+
+	u_int8_t sc_enaddr[6];
 };
 
 int edprobe __P((struct device *, void *, void *));
@@ -138,7 +141,7 @@
 
 #define inline	/* XXX for debugging porpoises */
 
-void ed_getmcaf __P((struct arpcom *, u_long *));
+void ed_getmcaf __P((struct ethercom *, u_long *));
 void edread __P((struct ed_softc *, int, int));
 struct mbuf *edget __P((struct ed_softc *, int, int));
 static inline void ed_rint __P((struct ed_softc *));
@@ -529,7 +532,7 @@
 
 	/* Get station address from on-board ROM. */
 	for (i = 0; i < ETHER_ADDR_LEN; ++i)
-		sc->sc_arpcom.ac_enaddr[i] =
+		sc->sc_enaddr[i] =
 		    bus_space_read_1(iot, ioh, asicbase + ED_WD_PROM + i);
 
 	/*
@@ -809,7 +812,7 @@
 	    ED_3COM_CR_EALO | ED_3COM_CR_XSEL);
 
 	for (i = 0; i < ETHER_ADDR_LEN; ++i)
-		sc->sc_arpcom.ac_enaddr[i] = NIC_GET(iot, ioh, nicbase, i);
+		sc->sc_enaddr[i] = NIC_GET(iot, ioh, nicbase, i);
 
 	/*
 	 * Unmap PROM - select NIC registers.  The proper setting of the
@@ -1206,10 +1209,10 @@
 
 	ed_pio_readmem(sc, 0, romdata, 16);
 	for (n = 0; n < ETHER_ADDR_LEN; n++)
-		sc->sc_arpcom.ac_enaddr[n] = romdata[n*(sc->isa16bit+1)];
+		sc->sc_enaddr[n] = romdata[n*(sc->isa16bit+1)];
 
 #ifdef GWETHER
-	if (sc->arpcom.ac_enaddr[2] == 0x86)
+	if (sc->sc_enaddr[2] == 0x86)
 		sc->type_str = "Gateway AT";
 #endif /* GWETHER */
 
@@ -1245,7 +1248,7 @@
 	struct ed_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int asicbase;
 
 	/*
@@ -1290,11 +1293,11 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	/* Print additional info when attached. */
 	printf("\n%s: address %s, ", sc->sc_dev.dv_xname,
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	    ether_sprintf(sc->sc_enaddr));
 
 	if (sc->type_str)
 		printf("type %s ", sc->type_str);
@@ -1376,7 +1379,7 @@
 	struct ed_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++sc->sc_ethercom.ec_if.if_oerrors;
 
 	edreset(sc);
 }
@@ -1390,7 +1393,7 @@
 {
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int nicbase = sc->nic_base, asicbase = sc->asic_base;
 	int i;
 	u_long mcaf[2];
@@ -1466,10 +1469,10 @@
 	/* Copy out our station address. */
 	for (i = 0; i < ETHER_ADDR_LEN; ++i)
 		NIC_PUT(iot, ioh, nicbase, ED_P1_PAR0 + i,
-		    sc->sc_arpcom.ac_enaddr[i]);
+		    LLADDR(ifp->if_sadl)[i]);
 
 	/* Set multicast filter on chip. */
-	ed_getmcaf(&sc->sc_arpcom, mcaf);
+	ed_getmcaf(&sc->sc_ethercom, mcaf);
 	for (i = 0; i < 8; i++)
 		NIC_PUT(iot, ioh, nicbase, ED_P1_MAR0 + i, ((u_char *)mcaf)[i]);
 
@@ -1543,7 +1546,7 @@
 {
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int nicbase = sc->nic_base;
 	u_short len;
 
@@ -1798,7 +1801,7 @@
 			log(LOG_ERR,
 			    "%s: NIC memory corrupt - invalid packet length %d\n",
 			    sc->sc_dev.dv_xname, len);
-			++sc->sc_arpcom.ac_if.if_ierrors;
+			++sc->sc_ethercom.ec_if.if_ierrors;
 			edreset(sc);
 			return;
 		}
@@ -1827,7 +1830,7 @@
 	struct ed_softc *sc = arg;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int nicbase = sc->nic_base, asicbase = sc->asic_base;
 	u_char isr;
 
@@ -2054,7 +2057,7 @@
 #ifdef INET
 		case AF_INET:
 			edinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -2065,11 +2068,11 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
+			else {
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			edinit(sc);
 			break;
@@ -2111,8 +2114,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2143,7 +2146,7 @@
 	struct ed_softc *sc;
 	int buf, len;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *m;
 	struct ether_header *eh;
 
@@ -2174,7 +2177,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -2452,7 +2455,7 @@
 	int src;
 	u_short total_len;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *top, **mp, *m;
 	int len;
 
@@ -2494,11 +2497,11 @@
  * need to listen to.
  */
 void
-ed_getmcaf(ac, af)
-	struct arpcom *ac;
+ed_getmcaf(ec, af)
+	struct ethercom *ec;
 	u_long *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ec->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
@@ -2520,7 +2523,7 @@
 	}
 
 	af[0] = af[1] = 0;
-	ETHER_FIRST_MULTI(step, ac, enm);
+	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    sizeof(enm->enm_addrlo)) != 0) {
--- a/sys/dev/isa/if_eg.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_eg.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_eg.c,v 1.32 1996/10/21 22:40:50 thorpej Exp $	*/
+/*	$NetBSD: if_eg.c,v 1.33 1997/03/15 18:11:40 is Exp $	*/
 
 /*
  * Copyright (c) 1993 Dean Huxley <dean@fsa.ca>
@@ -52,17 +52,17 @@
 #include <sys/device.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -103,7 +103,7 @@
 struct eg_softc {
 	struct device sc_dev;
 	void *sc_ih;
-	struct arpcom sc_arpcom;	/* Ethernet common part */
+	struct ethercom sc_ethercom;	/* Ethernet common part */
 	bus_space_tag_t sc_iot;		/* bus space identifier */
 	bus_space_handle_t sc_ioh;	/* i/o handle */
 	u_int8_t eg_rom_major;		/* Cards ROM version (major number) */ 
@@ -397,7 +397,8 @@
 	struct isa_attach_args *ia = aux;
 	bus_space_tag_t iot = ia->ia_iot;
 	bus_space_handle_t ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 
 	printf("\n");
 
@@ -431,11 +432,11 @@
 		egprintpcb(sc);
 		return;
 	}
-	bcopy(&sc->eg_pcb[2], sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN);
+	bcopy(&sc->eg_pcb[2], myaddr, ETHER_ADDR_LEN);
 
 	printf("%s: ROM v%d.%02d %dk address %s\n", self->dv_xname,
 	    sc->eg_rom_major, sc->eg_rom_minor, sc->eg_ram,
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	    ether_sprintf(myaddr));
 
 	sc->eg_pcb[0] = EG_CMD_SETEADDR; /* Set station address */
 	if (egwritePCB(sc) != 0) {
@@ -466,7 +467,7 @@
 	
 	/* Now we can attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 	
 #if NBPFILTER > 0
 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
@@ -480,7 +481,7 @@
 eginit(sc)
 	register struct eg_softc *sc;
 {
-	register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	register struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 
@@ -676,13 +677,13 @@
 			if (sc->eg_pcb[6] || sc->eg_pcb[7]) {
 				DPRINTF(("%s: packet dropped\n",
 				    sc->sc_dev.dv_xname));
-				sc->sc_arpcom.ac_if.if_oerrors++;
+				sc->sc_ethercom.ec_if.if_oerrors++;
 			} else
-				sc->sc_arpcom.ac_if.if_opackets++;
-			sc->sc_arpcom.ac_if.if_collisions +=
+				sc->sc_ethercom.ec_if.if_opackets++;
+			sc->sc_ethercom.ec_if.if_collisions +=
 			    sc->eg_pcb[8] & 0xf;
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
-			egstart(&sc->sc_arpcom.ac_if);
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
+			egstart(&sc->sc_ethercom.ec_if);
 			serviced = 1;
 			break;
 
@@ -725,7 +726,7 @@
 	caddr_t buf;
 	int len;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *m;
 	struct ether_header *eh;
 	
@@ -764,7 +765,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -786,7 +787,7 @@
 	caddr_t buf;
 	int totlen;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *top, **mp, *m;
 	int len;
 
@@ -845,7 +846,7 @@
 #ifdef INET
 		case AF_INET:
 			eginit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -855,11 +856,10 @@
 				
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				   *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				   *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
 			/* Set new address. */
 			eginit(sc);
 			break;
@@ -929,7 +929,7 @@
 	struct eg_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	sc->sc_arpcom.ac_if.if_oerrors++;
+	sc->sc_ethercom.ec_if.if_oerrors++;
 
 	egreset(sc);
 }
--- a/sys/dev/isa/if_el.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_el.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_el.c,v 1.43 1996/10/21 22:40:53 thorpej Exp $	*/
+/*	$NetBSD: if_el.c,v 1.44 1997/03/15 18:11:41 is Exp $	*/
 
 /*
  * Copyright (c) 1994, Matthew E. Kimmel.  Permission is hereby granted
@@ -33,12 +33,14 @@
 #include <net/if_dl.h>
 #include <net/if_types.h>
 
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -76,7 +78,7 @@
 	struct device sc_dev;
 	void *sc_ih;
 
-	struct arpcom sc_arpcom;	/* ethernet common */
+	struct ethercom sc_ethercom;	/* ethernet common */
 	bus_space_tag_t sc_iot;		/* bus space identifier */
 	bus_space_handle_t sc_ioh;	/* i/o handle */
 };
@@ -190,7 +192,8 @@
 	struct isa_attach_args *ia = aux;
 	bus_space_tag_t iot = ia->ia_iot;
 	bus_space_handle_t ioh;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 	u_int8_t i;
 
 	printf("\n");
@@ -214,7 +217,7 @@
 	/* Now read the address. */
 	for (i = 0; i < ETHER_ADDR_LEN; i++) {
 		bus_space_write_1(iot, ioh, EL_GPBL, i);
-		sc->sc_arpcom.ac_enaddr[i] = bus_space_read_1(iot, ioh, EL_EAW);
+		myaddr[i] = bus_space_read_1(iot, ioh, EL_EAW);
 	}
 
 	/* Stop the board. */
@@ -231,11 +234,10 @@
 	/* Now we can attach the interface. */
 	DPRINTF(("Attaching interface...\n"));
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 	/* Print out some information for the user. */
-	printf("%s: address %s\n", self->dv_xname,
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr));
+	printf("%s: address %s\n", self->dv_xname, ether_sprintf(myaddr));
 
 	/* Finally, attach to bpf filter if it is present. */
 #if NBPFILTER > 0
@@ -293,7 +295,8 @@
 	bus_space_write_1(iot, ioh, EL_AC, 0);
 
 	for (i = 0; i < ETHER_ADDR_LEN; i++)
-		bus_space_write_1(iot, ioh, i, sc->sc_arpcom.ac_enaddr[i]);
+		bus_space_write_1(iot, ioh, i,
+		    LLADDR(sc->sc_ethercom.ec_if.if_sadl)[i]);
 }
 
 /*
@@ -303,7 +306,7 @@
 elinit(sc)
 	struct el_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 
@@ -517,7 +520,7 @@
 			DPRINTF(("overflow.\n"));
 			el_hardreset(sc);
 			/* Put board back into receive mode. */
-			if (sc->sc_arpcom.ac_if.if_flags & IFF_PROMISC)
+			if (sc->sc_ethercom.ec_if.if_flags & IFF_PROMISC)
 				bus_space_write_1(iot, ioh, EL_RXC,
 				    EL_RXC_AGF | EL_RXC_DSHORT | EL_RXC_DDRIB |
 				    EL_RXC_DOFLOW | EL_RXC_PROMISC);
@@ -559,7 +562,7 @@
 	register struct el_softc *sc;
 	int len;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct mbuf *m;
 	struct ether_header *eh;
 
@@ -598,7 +601,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+		    bcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return;
@@ -621,7 +624,7 @@
 	struct el_softc *sc;
 	int totlen;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 	struct mbuf *top, **mp, *m;
@@ -690,7 +693,7 @@
 #ifdef INET
 		case AF_INET:
 			elinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -701,11 +704,10 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
 			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
 			/* Set new address. */
 			elinit(sc);
 			break;
@@ -761,7 +763,7 @@
 	struct el_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	sc->sc_arpcom.ac_if.if_oerrors++;
+	sc->sc_ethercom.ec_if.if_oerrors++;
 
 	elreset(sc);
 }
--- a/sys/dev/isa/if_ep_isa.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_ep_isa.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ep_isa.c,v 1.9 1997/02/18 10:51:09 jonathan Exp $	*/
+/*	$NetBSD: if_ep_isa.c,v 1.10 1997/03/15 18:11:42 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Jason R. Thorpe <thorpej@beer.org>
@@ -47,14 +47,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
--- a/sys/dev/isa/if_fe.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_fe.c	Sat Mar 15 18:09:08 1997 +0000
@@ -58,14 +58,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -167,7 +168,7 @@
 	struct	device sc_dev;
 	void	*sc_ih;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	/* Set by probe() and not modified in later phases. */
 	enum	fe_type type;	/* interface type code */
@@ -194,11 +195,10 @@
 	/* Multicast address filter management. */
 	u_char	filter_change;	/* MARs must be changed ASAP. */
 	u_char	filter[FE_FILTER_LEN];	/* new filter value. */
+
+	u_int8_t sc_enaddr[ETHER_ADDR_LEN];
 };
 
-/* Frequently accessed members in arpcom. */
-#define sc_enaddr	sc_arpcom.ac_enaddr
-
 /* Standard driver entry points.  These can be static. */
 int	feprobe		__P((struct device *, void *, void *));
 void	feattach	__P((struct device *, struct device *, void *));
@@ -224,7 +224,7 @@
 void	fe_write_mbufs	__P((struct fe_softc *, struct mbuf *));
 static inline
 void	fe_droppacket	__P((struct fe_softc *));
-void	fe_getmcaf	__P((struct arpcom *, u_char *));
+void	fe_getmcaf	__P((struct ethercom *, u_char *));
 void	fe_setmode	__P((struct fe_softc *));
 void	fe_loadmar	__P((struct fe_softc *));
 #if FE_DEBUG >= 1
@@ -994,7 +994,7 @@
 	struct fe_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Stop the 86960. */
 	fe_stop(sc);
@@ -1063,11 +1063,11 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	/* Print additional info when attached. */
 	printf(": address %s, type %s\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr), sc->typestr);
+	    ether_sprintf(sc->sc_enaddr), sc->typestr);
 #if FE_DEBUG >= 3
 	{
 		int buf, txb, bbw, sbw, ram;
@@ -1214,7 +1214,7 @@
 #endif
 
 	/* Record how many packets are lost by this accident. */
-	sc->sc_arpcom.ac_if.if_oerrors += sc->txb_sched + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_oerrors += sc->txb_sched + sc->txb_count;
 
 	fe_reset(sc);
 }
@@ -1237,7 +1237,7 @@
 fe_init(sc)
 	struct fe_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i;
 
 #if FE_DEBUG >= 3
@@ -1399,7 +1399,7 @@
 	 * We use longer timeout for multiple packet transmission.
 	 * I'm not sure this timer value is appropriate.  FIXME.
 	 */
-	sc->sc_arpcom.ac_if.if_timer = 1 + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_timer = 1 + sc->txb_count;
 
 	/* Update txb variables. */
 	sc->txb_sched = sc->txb_count;
@@ -1577,7 +1577,7 @@
 	struct fe_softc *sc;
 	u_char tstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int left;
 	int col;
 
@@ -1716,7 +1716,7 @@
 	struct fe_softc *sc;
 	u_char rstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int len;
 	u_char status;
 	int i;
@@ -1898,7 +1898,7 @@
 		if (sc->filter_change &&
 		    sc->txb_count == 0 && sc->txb_sched == 0) {
 			fe_loadmar(sc);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 
 		/*
@@ -1907,8 +1907,8 @@
 		 * after handling the receiver interrupt to give the
 		 * receive operation priority.
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-			fe_start(&sc->sc_arpcom.ac_if);
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_OACTIVE) == 0)
+			fe_start(&sc->sc_ethercom.ec_if);
 
 		/*
 		 * Get interrupt conditions, masking unneeded flags.
@@ -1949,7 +1949,7 @@
 #ifdef INET
 		case AF_INET:
 			fe_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1959,11 +1959,13 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)(sc->sc_enaddr);
+			else {
+				bcopy(ina->x_host.c_host, sc->sc_enaddr,
+				    ETHER_ADDR_LEN);
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			fe_init(sc);
 			break;
@@ -2011,8 +2013,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2044,7 +2046,7 @@
 {
 	struct ether_header *eh;
 	struct mbuf *m;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Allocate a header mbuf. */
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
@@ -2105,7 +2107,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-	  	    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+	  	    bcmp(eh->ether_dhost, sc->sc_enaddr,
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return (1);
@@ -2186,7 +2188,7 @@
 		log(LOG_ERR, "%s: got a %s packet (%u bytes) to send\n",
 		    sc->sc_dev.dv_xname,
 		    totlen < ETHER_HDR_SIZE ? "partial" : "big", totlen);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 		return;
 	}
 #endif
@@ -2270,11 +2272,11 @@
  * list of multicast addresses we need to listen to.
  */
 void
-fe_getmcaf(ac, af)
-	struct arpcom *ac;
+fe_getmcaf(ec, af)
+	struct ethercom *ec;
 	u_char *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ec->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
@@ -2293,7 +2295,7 @@
 		goto allmulti;
 
 	af[0] = af[1] = af[2] = af[3] = af[4] = af[5] = af[6] = af[7] = 0x00;
-	ETHER_FIRST_MULTI(step, ac, enm);
+	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    sizeof(enm->enm_addrlo)) != 0) {
@@ -2345,7 +2347,7 @@
 fe_setmode(sc)
 	struct fe_softc *sc;
 {
-	int flags = sc->sc_arpcom.ac_if.if_flags;
+	int flags = sc->sc_ethercom.ec_if.if_flags;
 
 	/*
 	 * If the interface is not running, we postpone the update
@@ -2392,7 +2394,7 @@
 	/*
 	 * Find the new multicast filter value.
 	 */
-	fe_getmcaf(&sc->sc_arpcom, sc->filter);
+	fe_getmcaf(&sc->sc_ethercom, sc->filter);
 	sc->filter_change = 1;
 
 #if FE_DEBUG >= 3
--- a/sys/dev/isa/if_fmv.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_fmv.c	Sat Mar 15 18:09:08 1997 +0000
@@ -58,14 +58,15 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
+
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -167,7 +168,7 @@
 	struct	device sc_dev;
 	void	*sc_ih;
 
-	struct	arpcom sc_arpcom;	/* ethernet common */
+	struct	ethercom sc_ethercom;	/* ethernet common */
 
 	/* Set by probe() and not modified in later phases. */
 	enum	fe_type type;	/* interface type code */
@@ -194,11 +195,10 @@
 	/* Multicast address filter management. */
 	u_char	filter_change;	/* MARs must be changed ASAP. */
 	u_char	filter[FE_FILTER_LEN];	/* new filter value. */
+
+	u_int8_t sc_enaddr[ETHER_ADDR_LEN];
 };
 
-/* Frequently accessed members in arpcom. */
-#define sc_enaddr	sc_arpcom.ac_enaddr
-
 /* Standard driver entry points.  These can be static. */
 int	feprobe		__P((struct device *, void *, void *));
 void	feattach	__P((struct device *, struct device *, void *));
@@ -224,7 +224,7 @@
 void	fe_write_mbufs	__P((struct fe_softc *, struct mbuf *));
 static inline
 void	fe_droppacket	__P((struct fe_softc *));
-void	fe_getmcaf	__P((struct arpcom *, u_char *));
+void	fe_getmcaf	__P((struct ethercom *, u_char *));
 void	fe_setmode	__P((struct fe_softc *));
 void	fe_loadmar	__P((struct fe_softc *));
 #if FE_DEBUG >= 1
@@ -994,7 +994,7 @@
 	struct fe_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
 	struct cfdata *cf = sc->sc_dev.dv_cfdata;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Stop the 86960. */
 	fe_stop(sc);
@@ -1063,11 +1063,11 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	/* Print additional info when attached. */
 	printf(": address %s, type %s\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr), sc->typestr);
+	    ether_sprintf(sc->sc_enaddr), sc->typestr);
 #if FE_DEBUG >= 3
 	{
 		int buf, txb, bbw, sbw, ram;
@@ -1214,7 +1214,7 @@
 #endif
 
 	/* Record how many packets are lost by this accident. */
-	sc->sc_arpcom.ac_if.if_oerrors += sc->txb_sched + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_oerrors += sc->txb_sched + sc->txb_count;
 
 	fe_reset(sc);
 }
@@ -1237,7 +1237,7 @@
 fe_init(sc)
 	struct fe_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int i;
 
 #if FE_DEBUG >= 3
@@ -1399,7 +1399,7 @@
 	 * We use longer timeout for multiple packet transmission.
 	 * I'm not sure this timer value is appropriate.  FIXME.
 	 */
-	sc->sc_arpcom.ac_if.if_timer = 1 + sc->txb_count;
+	sc->sc_ethercom.ec_if.if_timer = 1 + sc->txb_count;
 
 	/* Update txb variables. */
 	sc->txb_sched = sc->txb_count;
@@ -1577,7 +1577,7 @@
 	struct fe_softc *sc;
 	u_char tstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int left;
 	int col;
 
@@ -1716,7 +1716,7 @@
 	struct fe_softc *sc;
 	u_char rstat;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int len;
 	u_char status;
 	int i;
@@ -1898,7 +1898,7 @@
 		if (sc->filter_change &&
 		    sc->txb_count == 0 && sc->txb_sched == 0) {
 			fe_loadmar(sc);
-			sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 		}
 
 		/*
@@ -1907,8 +1907,8 @@
 		 * after handling the receiver interrupt to give the
 		 * receive operation priority.
 		 */
-		if ((sc->sc_arpcom.ac_if.if_flags & IFF_OACTIVE) == 0)
-			fe_start(&sc->sc_arpcom.ac_if);
+		if ((sc->sc_ethercom.ec_if.if_flags & IFF_OACTIVE) == 0)
+			fe_start(&sc->sc_ethercom.ec_if);
 
 		/*
 		 * Get interrupt conditions, masking unneeded flags.
@@ -1949,7 +1949,7 @@
 #ifdef INET
 		case AF_INET:
 			fe_init(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1959,11 +1959,13 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)(sc->sc_enaddr);
+			else {
+				bcopy(ina->x_host.c_host, sc->sc_enaddr,
+				    ETHER_ADDR_LEN);
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			fe_init(sc);
 			break;
@@ -2011,8 +2013,8 @@
 	case SIOCDELMULTI:
 		/* Update our multicast list. */
 		error = (command == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom) :
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom) :
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2044,7 +2046,7 @@
 {
 	struct ether_header *eh;
 	struct mbuf *m;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	/* Allocate a header mbuf. */
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
@@ -2105,7 +2107,7 @@
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0 &&
 		    (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
-	  	    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+	  	    bcmp(eh->ether_dhost, sc->sc_enaddr,
 			    sizeof(eh->ether_dhost)) != 0) {
 			m_freem(m);
 			return (1);
@@ -2186,7 +2188,7 @@
 		log(LOG_ERR, "%s: got a %s packet (%u bytes) to send\n",
 		    sc->sc_dev.dv_xname,
 		    totlen < ETHER_HDR_SIZE ? "partial" : "big", totlen);
-		sc->sc_arpcom.ac_if.if_oerrors++;
+		sc->sc_ethercom.ec_if.if_oerrors++;
 		return;
 	}
 #endif
@@ -2270,11 +2272,11 @@
  * list of multicast addresses we need to listen to.
  */
 void
-fe_getmcaf(ac, af)
-	struct arpcom *ac;
+fe_getmcaf(ec, af)
+	struct ethercom *ec;
 	u_char *af;
 {
-	struct ifnet *ifp = &ac->ac_if;
+	struct ifnet *ifp = &ec->ec_if;
 	struct ether_multi *enm;
 	register u_char *cp, c;
 	register u_long crc;
@@ -2293,7 +2295,7 @@
 		goto allmulti;
 
 	af[0] = af[1] = af[2] = af[3] = af[4] = af[5] = af[6] = af[7] = 0x00;
-	ETHER_FIRST_MULTI(step, ac, enm);
+	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    sizeof(enm->enm_addrlo)) != 0) {
@@ -2345,7 +2347,7 @@
 fe_setmode(sc)
 	struct fe_softc *sc;
 {
-	int flags = sc->sc_arpcom.ac_if.if_flags;
+	int flags = sc->sc_ethercom.ec_if.if_flags;
 
 	/*
 	 * If the interface is not running, we postpone the update
@@ -2392,7 +2394,7 @@
 	/*
 	 * Find the new multicast filter value.
 	 */
-	fe_getmcaf(&sc->sc_arpcom, sc->filter);
+	fe_getmcaf(&sc->sc_ethercom, sc->filter);
 	sc->filter_change = 1;
 
 #if FE_DEBUG >= 3
--- a/sys/dev/isa/if_hp.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_hp.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_hp.c,v 1.23 1996/10/13 01:37:49 christos Exp $	*/
+/*	$NetBSD: if_hp.c,v 1.24 1997/03/15 18:11:44 is Exp $	*/
 
 /* XXX THIS DRIVER IS BROKEN.  IT WILL NOT EVEN COMPILE. */
 
@@ -66,15 +66,14 @@
 #include <sys/syslog.h>
 
 #include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -117,9 +116,8 @@
  * This structure contains the output queue for the interface, its address, ...
  */
 struct hp_softc {
-	struct arpcom ns_ac;	/* Ethernet common part */
+	struct ethercom ns_ec;	/* Ethernet common part */
 #define	ns_if		ns_ac.ac_if	/* network-visible interface */
-#define	ns_addrp	ns_ac.ac_enaddr	/* hardware Ethernet address */
 	int     ns_flags;
 #define	DSF_LOCK	1	/* block re-entering enstart */
 	int     ns_oactive;
@@ -137,6 +135,8 @@
 #if NBPFILTER > 0
 	caddr_t ns_bpf;
 #endif
+	u_int8_t ns_addrp[ETHER_ADDR_LEN]; /* hardware Ethernet address */
+	
 }
         hp_softc[NHP];
 #define	ENBUFSIZE	(sizeof(struct ether_header) + ETHERMTU + 2 + ETHER_MIN_LEN)
--- a/sys/dev/isa/if_ie.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_ie.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ie.c,v 1.56 1996/11/05 07:17:23 mikel Exp $	*/
+/*	$NetBSD: if_ie.c,v 1.57 1997/03/15 18:11:46 is Exp $	*/
 
 /*-
  * Copyright (c) 1993, 1994, 1995 Charles Hannum.
@@ -121,8 +121,8 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/netisr.h>
-#include <net/route.h>
+#include <net/if_ether.h>
+
 
 #if NBPFILTER > 0
 #include <net/bpf.h>
@@ -134,7 +134,7 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -232,7 +232,7 @@
 	caddr_t sc_maddr;
 	u_int sc_msize;
 
-	struct arpcom sc_arpcom;
+	struct ethercom sc_ethercom;
 
 	void (*reset_586) __P((struct ie_softc *));
 	void (*chan_attn) __P((struct ie_softc *));
@@ -264,6 +264,8 @@
 #ifdef IEDEBUG
 	int sc_debug;
 #endif
+	u_int8_t sc_enaddr[6];
+	u_int8_t sc_pad[2];
 };
 
 void iewatchdog __P((struct ifnet *));
@@ -749,14 +751,14 @@
 	 * save it in the softc for use by the 586 setup code.
 	 */
 	eaddrtemp = ee16_read_eeprom(sc, IEE16_EEPROM_ENET_HIGH);
-	sc->sc_arpcom.ac_enaddr[1] = eaddrtemp & 0xFF;
-	sc->sc_arpcom.ac_enaddr[0] = eaddrtemp >> 8;
+	sc->sc_enaddr[1] = eaddrtemp & 0xFF;
+	sc->sc_enaddr[0] = eaddrtemp >> 8;
 	eaddrtemp = ee16_read_eeprom(sc, IEE16_EEPROM_ENET_MID);
-	sc->sc_arpcom.ac_enaddr[3] = eaddrtemp & 0xFF;
-	sc->sc_arpcom.ac_enaddr[2] = eaddrtemp >> 8;
+	sc->sc_enaddr[3] = eaddrtemp & 0xFF;
+	sc->sc_enaddr[2] = eaddrtemp >> 8;
 	eaddrtemp = ee16_read_eeprom(sc, IEE16_EEPROM_ENET_LOW);
-	sc->sc_arpcom.ac_enaddr[5] = eaddrtemp & 0xFF;
-	sc->sc_arpcom.ac_enaddr[4] = eaddrtemp >> 8;
+	sc->sc_enaddr[5] = eaddrtemp & 0xFF;
+	sc->sc_enaddr[4] = eaddrtemp >> 8;
 
 	/* disable the board interrupts */
 	outb(PORT + IEE16_IRQ, sc->irq_encoded);
@@ -789,7 +791,7 @@
 {
 	struct ie_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 
 	bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
 	ifp->if_softc = sc;
@@ -801,14 +803,14 @@
 
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, sc->sc_enaddr);
 
 	printf(": address %s, type %s R%d\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr),
+	    ether_sprintf(sc->sc_enaddr),
 	    ie_hardware_names[sc->hard_type], sc->hard_vers + 1);
 
 #if NBPFILTER > 0
-	bpfattach(&sc->sc_arpcom.ac_if.if_bpf, ifp, DLT_EN10MB,
+	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB,
 	    sizeof(struct ether_header));
 #endif
 
@@ -827,7 +829,7 @@
 	struct ie_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++ifp->if_oerrors;
 	iereset(sc);
 }
 
@@ -839,6 +841,7 @@
 	void *arg;
 {
 	struct ie_softc *sc = arg;
+	struct ifnet *ifp = arg;
 	register u_short status;
 
 	/* Clear the interrupt latch on the 3C507. */
@@ -883,7 +886,7 @@
 
 	if (status & IE_ST_RNR) {
 		printf("%s: receiver not ready\n", sc->sc_dev.dv_xname);
-		sc->sc_arpcom.ac_if.if_ierrors++;
+		ifp->if_ierrors++;
 		iereset(sc);
 	}
 
@@ -915,16 +918,19 @@
 	struct ie_softc *sc;
 {
 	volatile struct ie_sys_ctl_block *scb = sc->scb;
+	struct ifnet *ifp;
 	int i, status;
 	static int timesthru = 1024;
 
+	ifp = &sc->sc_ethercom.ec_if;
+
 	i = sc->rfhead;
 	for (;;) {
 		status = sc->rframes[i]->ie_fd_status;
 
 		if ((status & IE_FD_COMPLETE) && (status & IE_FD_OK)) {
 			if (!--timesthru) {
-				sc->sc_arpcom.ac_if.if_ierrors +=
+				ifp->if_ierrors +=
 				    scb->ie_err_crc + scb->ie_err_align +
 				    scb->ie_err_resource + scb->ie_err_overrun;
 				scb->ie_err_crc = scb->ie_err_align =
@@ -956,7 +962,7 @@
 ietint(sc)
 	struct ie_softc *sc;
 {
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int status;
 
 	ifp->if_timer = 0;
@@ -1047,8 +1053,11 @@
 	struct ether_header *eh;
 	int *to_bpf;
 {
+	struct ifnet *ifp;
 	int i;
 
+	ifp = &sc->sc_ethercom.ec_if;
+
 	switch (sc->promisc) {
 	case IFF_ALLMULTI:
 		/*
@@ -1056,11 +1065,11 @@
 		 * destined for us.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0); /* BPF gets this packet if anybody cares */
+		*to_bpf = (ifp->if_bpf != 0); /* BPF gets this packet if anybody cares */
 #endif
 		if (eh->ether_dhost[0] & 1)
 			return 1;
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 		return 0;
 
@@ -1069,10 +1078,10 @@
 		 * Receiving all packets.  These need to be passed on to BPF.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0);
+		*to_bpf = (ifp->if_bpf != 0);
 #endif
 		/* If for us, accept and hand up to BPF */
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 
 #if NBPFILTER > 0
@@ -1107,14 +1116,14 @@
 		 * time.  Whew!  (Hope this is a fast machine...)
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.if_bpf != 0);
 #endif
 		/* We want to see multicasts. */
 		if (eh->ether_dhost[0] & 1)
 			return 1;
 
 		/* We want to see our own packets */
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, LLADDR(ifp->if_sadl)))
 			return 1;
 
 		/* Anything else goes to BPF but nothing else. */
@@ -1134,7 +1143,7 @@
 		 * of here as quickly as possible.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.if_bpf != 0);
 #endif
 		return 1;
 	}
@@ -1203,8 +1212,8 @@
 	 * If BPF is listening on this interface, let it see the packet before
 	 * we push it on the wire.
 	 */
-	if (sc->sc_arpcom.ac_if.if_bpf)
-		bpf_tap(sc->sc_arpcom.ac_if.if_bpf,
+	if (sc->sc_ethercom.ec_if.if_bpf)
+		bpf_tap(sc->sc_ethercom.ec_if.if_bpf,
 		    sc->xmit_cbuffs[sc->xctail],
 		    sc->xmit_buffs[sc->xctail]->ie_xmit_flags);
 #endif
@@ -1225,7 +1234,7 @@
 	sc->scb->ie_command_list = MK_16(MEM, sc->xmit_cmds[sc->xctail]);
 	command_and_wait(sc, IE_CU_START, 0, 0);
 
-	sc->sc_arpcom.ac_if.if_timer = 5;
+	sc->sc_ethercom.ec_if.if_timer = 5;
 }
 
 /*
@@ -1268,7 +1277,7 @@
 	 * we are either running BPF or doing multicasting.
 	 */
 	if (!check_eh(sc, ehp, to_bpf)) {
-		sc->sc_arpcom.ac_if.if_ierrors--; /* just this case, it's not an error */
+		sc->sc_ethercom.ec_if.if_ierrors--; /* just this case, it's not an error */
 		return 0;
 	}
 
@@ -1277,7 +1286,7 @@
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == 0)
 		return 0;
-	m->m_pkthdr.rcvif = &sc->sc_arpcom.ac_if;
+	m->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
 	m->m_pkthdr.len = totlen;
 	len = MHLEN;
 	top = 0;
@@ -1384,7 +1393,7 @@
 		ie_drop_packet_buffer(sc);
 	}
 	if (m == 0) {
-		sc->sc_arpcom.ac_if.if_ierrors++;
+		sc->sc_ethercom.ec_if.if_ierrors++;
 		return;
 	}
 
@@ -1410,7 +1419,7 @@
 		m0.m_next = m;
 
 		/* Pass it up. */
-		bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, &m0);
+		bpf_mtap(sc->sc_ethercom.ec_if.if_bpf, &m0);
 
 		/*
 		 * A signal passed up from the filtering code indicating that
@@ -1436,8 +1445,8 @@
 	/*
 	 * Finally pass this packet up to higher layers.
 	 */
-	ether_input(&sc->sc_arpcom.ac_if, &eh, m);
-	sc->sc_arpcom.ac_if.if_ipackets++;
+	ether_input(&sc->sc_ethercom.ec_if, &eh, m);
+	sc->sc_ethercom.ec_if.if_ipackets++;
 }
 
 void
@@ -1786,7 +1795,7 @@
 slel_get_address(sc)
 	struct ie_softc *sc;
 {
-	u_char *addr = sc->sc_arpcom.ac_enaddr;
+	u_char *addr = sc->sc_enaddr;
 	int i;
 
 	for (i = 0; i < ETHER_ADDR_LEN; i++)
@@ -2046,6 +2055,7 @@
 	struct ie_softc *sc;
 {
 	volatile struct ie_sys_ctl_block *scb = sc->scb;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	void *ptr;
 
 	ptr = (void *)ALIGN(scb + 1);
@@ -2083,7 +2093,7 @@
 		cmd->com.ie_cmd_cmd = IE_CMD_IASETUP | IE_CMD_LAST;
 		cmd->com.ie_cmd_link = 0xffff;
 
-		bcopy(sc->sc_arpcom.ac_enaddr, (caddr_t)&cmd->ie_address,
+		bcopy(LLADDR(ifp->if_sadl), (caddr_t)&cmd->ie_address,
 		    sizeof cmd->ie_address);
 
 		if (command_and_wait(sc, IE_CU_START, cmd, IE_STAT_COMPL) ||
@@ -2109,8 +2119,8 @@
 	 */
 	iememinit(ptr, sc);
 
-	sc->sc_arpcom.ac_if.if_flags |= IFF_RUNNING;
-	sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+	sc->sc_ethercom.ec_if.if_flags |= IFF_RUNNING;
+	sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
 
 	sc->scb->ie_recv_list = MK_16(MEM, sc->rframes[0]);
 	command_and_wait(sc, IE_RU_START, 0, 0);
@@ -2163,7 +2173,7 @@
 #ifdef INET
 		case AF_INET:
 			ieinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -2174,11 +2184,11 @@
 
 			if (ns_nullhost(*ina))
 				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
-			else
-				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    *(union ns_host *)LLADDR(ifp->if_sadl);
+			else {
+				bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
+				    ETHER_ADDR_LEN);
+			}
 			/* Set new address. */
 			ieinit(sc);
 			break;
@@ -2226,8 +2236,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom):
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom):
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -2252,17 +2262,20 @@
 {
 	struct ether_multi *enm;
 	struct ether_multistep step;
+	struct ifnet *ifp;
+
+	ifp = &sc->sc_ethercom.ec_if;
 
 	/*
 	 * Step through the list of addresses.
 	 */
 	sc->mcast_count = 0;
-	ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
+	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
 	while (enm) {
 		if (sc->mcast_count >= MAXMCAST ||
 		    bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
-			sc->sc_arpcom.ac_if.if_flags |= IFF_ALLMULTI;
-			ieioctl(&sc->sc_arpcom.ac_if, SIOCSIFFLAGS, (void *)0);
+			ifp->if_flags |= IFF_ALLMULTI;
+			ieioctl(ifp, SIOCSIFFLAGS, (void *)0);
 			goto setflag;
 		}
 
--- a/sys/dev/isa/if_iy.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_iy.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iy.c,v 1.9 1996/10/21 22:41:03 thorpej Exp $	*/
+/*	$NetBSD: if_iy.c,v 1.10 1997/03/15 18:11:47 is Exp $	*/
 /* #define IYDEBUG */
 /* #define IYMEMDEBUG */
 /*-
@@ -49,8 +49,8 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/netisr.h>
-#include <net/route.h>
+
+#include <net/if_ether.h>
 
 #if NBPFILTER > 0
 #include <net/bpf.h>
@@ -62,7 +62,7 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #ifdef NS
@@ -80,8 +80,8 @@
 #include <dev/isa/isavar.h>
 #include <dev/ic/i82595reg.h>
 
-#define	ETHER_MIN_LEN	64
-#define	ETHER_MAX_LEN	1518
+#define	ETHER_MIN_LEN	(ETHERMIN + sizeof(struct ether_header) + 4)
+#define	ETHER_MAX_LEN	(ETHERMTU + sizeof(struct ether_header) + 4)
 
 /*
  * Ethernet status, per interface.
@@ -93,7 +93,7 @@
 	bus_space_tag_t sc_iot;
 	bus_space_handle_t sc_ioh;
 
-	struct arpcom sc_arpcom;
+	struct ethercom sc_ethercom;
 
 #define MAX_MBS 8
 	struct mbuf *mb[MAX_MBS];
@@ -124,9 +124,6 @@
 
 void iy_intr_rx __P((struct iy_softc *));
 void iy_intr_tx __P((struct iy_softc *));
-void eepro_reset_595 __P((struct iy_softc *));
-int eepro_probe __P((struct iy_softc *, struct isa_attach_args *));
-u_short eepro_read_eeprom __P((struct iy_softc *, int));
 
 void iyreset __P((struct iy_softc *));
 void iy_readframe __P((struct iy_softc *, int));
@@ -139,7 +136,9 @@
 void iymbuffill __P((void *)); 
 void iymbufempty __P((void *));
 void iyprobemem __P((struct iy_softc *));
-
+static __inline void eepromwritebit __P((bus_space_tag_t, bus_space_handle_t,
+    int));
+static __inline int eepromreadbit __P((bus_space_tag_t, bus_space_handle_t));
 /*
  * void iymeminit __P((void *, struct iy_softc *));
  * static int iy_mc_setup __P((struct iy_softc *, void *));
@@ -155,8 +154,10 @@
 int iyprobe __P((struct device *, void *, void *));
 void iyattach __P((struct device *, struct device *, void *));
 
-static u_int16_t eepromread __P((bus_space_tag_t, bus_space_handle_t, 
-				 bus_size_t, int));
+static u_int16_t eepromread __P((bus_space_tag_t, bus_space_handle_t, int));
+
+static int eepromreadall __P((bus_space_tag_t, bus_space_handle_t, u_int16_t *,
+    int));
 
 struct cfattach iy_ca = {
 	sizeof(struct iy_softc), iyprobe, iyattach
@@ -174,88 +175,59 @@
 	struct device *parent;
 	void *match, *aux;
 {
-	struct iy_softc *sc = match;
 	struct isa_attach_args *ia = aux;
-
 	u_int16_t eaddr[8];
 
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
 
-	int i;
-
-	u_int16_t checksum = 0;
-	u_int16_t eepromtmp;
 	u_int8_t c, d;
 
 	iot = ia->ia_iot;
 	
 	if (bus_space_map(iot, ia->ia_iobase, 16, 0, &ioh))
-		goto out;
-
-	/* check here for addresses already given to other devices */
-
+		return 0;
 
 	/* try to find the round robin sig: */
 
 	c = bus_space_read_1(iot, ioh, ID_REG);
-	if (c & ID_REG_MASK != ID_REG_SIG)
+	if ((c & ID_REG_MASK) != ID_REG_SIG)
 		goto out;
 
 	d = bus_space_read_1(iot, ioh, ID_REG);
-	if (d & ID_REG_MASK != ID_REG_SIG)
+	if ((d & ID_REG_MASK) != ID_REG_SIG)
 		goto out;
 
 	if (((d-c) & R_ROBIN_BITS) != 0x40)
 		goto out;
 		
 	d = bus_space_read_1(iot, ioh, ID_REG);
-	if (d & ID_REG_MASK != ID_REG_SIG)
+	if ((d & ID_REG_MASK) != ID_REG_SIG)
 		goto out;
 
 	if (((d-c) & R_ROBIN_BITS) != 0x80)
 		goto out;
 		
 	d = bus_space_read_1(iot, ioh, ID_REG);
-	if (d & ID_REG_MASK != ID_REG_SIG)
+	if ((d & ID_REG_MASK) != ID_REG_SIG)
 		goto out;
 
 	if (((d-c) & R_ROBIN_BITS) != 0xC0)
 		goto out;
 		
 	d = bus_space_read_1(iot, ioh, ID_REG);
-	if (d & ID_REG_MASK != ID_REG_SIG)
+	if ((d & ID_REG_MASK) != ID_REG_SIG)
 		goto out;
 
 	if (((d-c) & R_ROBIN_BITS) != 0x00)
 		goto out;
 		
 #ifdef IYDEBUG
-		printf("eepro_probe verified working ID reg.\n");
+		printf("iyprobe verified working ID reg.\n");
 #endif
 	
-	for (i=0; i<64; ++i) {
-		eepromtmp = eepromread(iot, ioh, EEPROM_REG, i);
-		checksum += eepromtmp;
-		if (i<(sizeof(eaddr)/sizeof(*eaddr)))
-			eaddr[i] = eepromtmp;
-	}
-	if (checksum != EEPP_CHKSUM)
-		printf("wrong EEPROM checksum 0x%x should be 0x%x\n",
-		    checksum, EEPP_CHKSUM);
-		
-	
-	if ((eaddr[EEPPEther0] != eepromread(iot, ioh, EEPROM_REG, EEPPEther0a)) &&
-	    (eaddr[EEPPEther1] != eepromread(iot, ioh, EEPROM_REG, EEPPEther1a)) &&
-	    (eaddr[EEPPEther2] != eepromread(iot, ioh, EEPROM_REG, EEPPEther2a)))
-		printf("EEPROM Ethernet address differs from copy\n");
-	
-        sc->sc_arpcom.ac_enaddr[1] = eaddr[EEPPEther0] & 0xFF;
-        sc->sc_arpcom.ac_enaddr[0] = eaddr[EEPPEther0] >> 8;
-        sc->sc_arpcom.ac_enaddr[3] = eaddr[EEPPEther1] & 0xFF;
-        sc->sc_arpcom.ac_enaddr[2] = eaddr[EEPPEther1] >> 8;
-        sc->sc_arpcom.ac_enaddr[5] = eaddr[EEPPEther2] & 0xFF;
-        sc->sc_arpcom.ac_enaddr[4] = eaddr[EEPPEther2] >> 8;
+	if (eepromreadall(iot, ioh, eaddr, 8))
+		goto out;
 	
 	if (ia->ia_irq == IRQUNK)
 		ia->ia_irq = eepro_irqmap[eaddr[EEPPW1] & EEPP_Int];
@@ -263,24 +235,17 @@
 	if (ia->ia_irq >= sizeof(eepro_revirqmap))
 		goto out;
 
-	if ((sc->mappedirq = eepro_revirqmap[ia->ia_irq]) == -1)
+	if (eepro_revirqmap[ia->ia_irq] == 0xff)
 		goto out;
 
-	sc->hard_vers = eaddr[EEPW6] & EEPP_BoardRev;
-
 	/* now lets reset the chip */
 	
 	bus_space_write_1(iot, ioh, COMMAND_REG, RESET_CMD);
 	delay(200);
 	
-	/*
-	 * XXX Sould always unmap, but we can't yet.
-	 * XXX Need to squish "indirect" first.
-	 */
        	ia->ia_iosize = 16;
 
-	sc->sc_iot = iot;
-	sc->sc_ioh = ioh;
+	bus_space_unmap(iot, ioh, 16);
 	return 1;		/* found */
 out:
 	bus_space_unmap(iot, ioh, 16);
@@ -294,16 +259,30 @@
 {
 	struct iy_softc *sc = (void *)self;
 	struct isa_attach_args *ia = aux;
-	struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
+	unsigned temp;
+	u_int16_t eaddr[8];
+	u_int8_t myaddr[ETHER_ADDR_LEN];
+	int eirq;
 
-	/*
-	 * XXX Should re-map io and mem, but can't
-	 * XXX until we squish "indirect" brokenness.
-	 */
-	iot = sc->sc_iot;			/* XXX */
-	ioh = sc->sc_ioh;		/* XXX */
+	iot = ia->ia_iot;
+	
+	if (bus_space_map(iot, ia->ia_iobase, 16, 0, &ioh))
+		panic("Can't bus_space_map in iyattach");
+
+	sc->sc_iot = iot;
+	sc->sc_ioh = ioh;
+
+	sc->mappedirq = eepro_revirqmap[ia->ia_irq];
+
+	/* now let's reset the chip */
+	
+	bus_space_write_1(iot, ioh, COMMAND_REG, RESET_CMD);
+	delay(200);
+	
+	iyprobemem(sc);
 
 	bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
 	ifp->if_softc = sc;
@@ -311,24 +290,51 @@
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS;
 					/* XXX todo: | IFF_MULTICAST */
 
-	iyprobemem(sc);
-
 	ifp->if_ioctl = iyioctl;
 	ifp->if_watchdog = iywatchdog;
 
+	(void)eepromreadall(iot, ioh, eaddr, 8);
+	sc->hard_vers = eaddr[EEPW6] & EEPP_BoardRev;
+
+#ifdef DIAGNOSTICS
+	if ((eaddr[EEPPEther0] != 
+	     eepromread(iot, ioh, EEPPEther0a)) &&
+	    (eaddr[EEPPEther1] != 
+	     eepromread(iot, ioh, EEPPEther1a)) &&
+	    (eaddr[EEPPEther2] != 
+	     eepromread(iot, ioh, EEPPEther2a)))
+
+		printf("EEPROM Ethernet address differs from copy\n");
+#endif
+
+        myaddr[1] = eaddr[EEPPEther0] & 0xFF;
+        myaddr[0] = eaddr[EEPPEther0] >> 8;
+        myaddr[3] = eaddr[EEPPEther1] & 0xFF;
+        myaddr[2] = eaddr[EEPPEther1] >> 8;
+        myaddr[5] = eaddr[EEPPEther2] & 0xFF;
+        myaddr[4] = eaddr[EEPPEther2] >> 8;
+	
 	/* Attach the interface. */
 	if_attach(ifp);
-	ether_ifattach(ifp);
-	printf(": address %s, chip rev. %d, %d kB SRAM\n",
-	    ether_sprintf(sc->sc_arpcom.ac_enaddr),
+	ether_ifattach(ifp, myaddr);
+	printf(": address %s, rev. %d, %d kB\n",
+	    ether_sprintf(myaddr),
 	    sc->hard_vers, sc->sram/1024);
+
+	eirq = eepro_irqmap[eaddr[EEPPW1] & EEPP_Int];
+	if (eirq != ia->ia_irq)
+		printf("%s: EEPROM irq setting %d ignored\n",
+		    sc->sc_dev.dv_xname, eirq);
+
 #if NBPFILTER > 0
-	bpfattach(&sc->sc_arpcom.ac_if.if_bpf, ifp, DLT_EN10MB,
-	    sizeof(struct ether_header));
+	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
 #endif
 
 	sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE, 
 	    IPL_NET, iyintr, sc);
+
+	temp = bus_space_read_1(iot, ioh, INT_NO_REG);
+	bus_space_write_1(iot, ioh, INT_NO_REG, (temp & 0xf8) | sc->mappedirq);
 }
 
 void
@@ -372,7 +378,7 @@
 #endif
 	sc->tx_start = sc->tx_end = sc->rx_size;
 	sc->tx_last = 0;
-	sc->sc_arpcom.ac_if.if_flags &= ~(IFF_RUNNING|IFF_OACTIVE);
+	sc->sc_ethercom.ec_if.if_flags &= ~(IFF_RUNNING|IFF_OACTIVE);
 
 	iymbufempty((void *)sc);
 }
@@ -401,7 +407,7 @@
 	iot = sc->sc_iot;
 	ioh = sc->sc_ioh;
 
-	ifp = &sc->sc_arpcom.ac_if;
+	ifp = &sc->sc_ethercom.ec_if;
 #ifdef IYDEBUG
 	printf("ifp is %p\n", ifp);
 #endif
@@ -413,12 +419,12 @@
 		bus_space_write_1(iot, ioh, EEPROM_REG, temp & ~0x10);
 	
 	for (i=0; i<6; ++i) {
-		bus_space_write_1(iot, ioh, I_ADD(i), sc->sc_arpcom.ac_enaddr[i]);
+		bus_space_write_1(iot, ioh, I_ADD(i), LLADDR(ifp->if_sadl)[i]);
 	}
 
 	temp = bus_space_read_1(iot, ioh, REG1);
-	bus_space_write_1(iot, ioh, REG1, temp | XMT_CHAIN_INT | XMT_CHAIN_ERRSTOP |
-	    RCV_DISCARD_BAD);
+	bus_space_write_1(iot, ioh, REG1,
+	    temp | XMT_CHAIN_INT | XMT_CHAIN_ERRSTOP | RCV_DISCARD_BAD);
 	
 	temp = bus_space_read_1(iot, ioh, RECV_MODES_REG);
 	bus_space_write_1(iot, ioh, RECV_MODES_REG, temp | MATCH_BRDCST);
@@ -431,7 +437,7 @@
 #endif
 
 
-	DELAY(500000); /* for the hardware to test for the connector */
+	delay(500000); /* for the hardware to test for the connector */
 
 	temp = bus_space_read_1(iot, ioh, MEDIA_SELECT);
 #ifdef IYDEBUG
@@ -446,11 +452,11 @@
 		break;
 
 	case IFF_LINK1:
-		temp = temp & ~TPE_BIT | BNC_BIT;
+		temp = (temp & ~TPE_BIT) | BNC_BIT;
 		break;
  
 	case IFF_LINK0|IFF_LINK1:
-		temp = temp & ~BNC_BIT | TPE_BIT;
+		temp = (temp & ~BNC_BIT) | TPE_BIT;
 		break;
 	default:
 		/* nothing; leave as it is */
@@ -463,6 +469,8 @@
 	    temp, "\020\1LnkInDis\2PolCor\3TPE\4JabberDis\5NoAport\6BNC");
 #endif
 
+	bus_space_write_1(iot, ioh, 0, BANK_SEL(0));
+	bus_space_write_1(iot, ioh, INT_MASK_REG, ALL_INTS);
 	bus_space_write_1(iot, ioh, 0, BANK_SEL(1));
 
 	temp = bus_space_read_1(iot, ioh, INT_NO_REG);
@@ -505,7 +513,7 @@
 	sc->rx_start = 0;
 
 	bus_space_write_1(iot, ioh, 0, SEL_RESET_CMD);
-	DELAY(200);
+	delay(200);
 
 	bus_space_write_2(iot, ioh, XMT_ADDR_REG, sc->rx_size);
 
@@ -704,42 +712,39 @@
 
 
 static __inline void
-eepromwritebit(iot, ioh, ioff, what) 
+eepromwritebit(iot, ioh, what) 
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
-	bus_size_t ioff;
 	int what;
 {
-	bus_space_write_1(iot, ioh, ioff, what);
+	bus_space_write_1(iot, ioh, EEPROM_REG, what);
 	delay(1);
-	bus_space_write_1(iot, ioh, ioff, what|EESK);
+	bus_space_write_1(iot, ioh, EEPROM_REG, what|EESK);
 	delay(1);
-	bus_space_write_1(iot, ioh, ioff, what);
+	bus_space_write_1(iot, ioh, EEPROM_REG, what);
 	delay(1);
 }
 
 static __inline int
-eepromreadbit(iot, ioh, ioff) 
+eepromreadbit(iot, ioh) 
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
-	bus_size_t ioff;
 {
 	int b; 
 
-	bus_space_write_1(iot, ioh, ioff, EECS|EESK); 
+	bus_space_write_1(iot, ioh, EEPROM_REG, EECS|EESK); 
 	delay(1);
-	b = bus_space_read_1(iot, ioh, ioff);
-	bus_space_write_1(iot, ioh, ioff, EECS);
+	b = bus_space_read_1(iot, ioh, EEPROM_REG);
+	bus_space_write_1(iot, ioh, EEPROM_REG, EECS);
 	delay(1);
 
 	return ((b & EEDO) != 0);
 }
 
 static u_int16_t
-eepromread(iot, ioh, ioff, offset)
+eepromread(iot, ioh, offset)
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
-	bus_size_t ioff;
 	int offset;
 {
 	volatile int i;
@@ -748,30 +753,30 @@
 
 	bus_space_write_1(iot, ioh, 0, BANK_SEL(2));
 	delay(1);
-	bus_space_write_1(iot, ioh, ioff, EECS); /* XXXX??? */
+	bus_space_write_1(iot, ioh, EEPROM_REG, EECS); /* XXXX??? */
 	delay(1);
 	
-	eepromwritebit(iot, ioh, ioff, EECS|EEDI);
-	eepromwritebit(iot, ioh, ioff, EECS|EEDI);
-	eepromwritebit(iot, ioh, ioff, EECS);
+	eepromwritebit(iot, ioh, EECS|EEDI);
+	eepromwritebit(iot, ioh, EECS|EEDI);
+	eepromwritebit(iot, ioh, EECS);
 	
 	for (j=5; j>=0; --j) {
 		if ((offset>>j) & 1) 
-			eepromwritebit(iot, ioh, ioff, EECS|EEDI);
+			eepromwritebit(iot, ioh, EECS|EEDI);
 		else
-			eepromwritebit(iot, ioh, ioff, EECS);
+			eepromwritebit(iot, ioh, EECS);
 	}
 
 	for (readval=0, i=0; i<16; ++i) {
 		readval<<=1;
-		readval |= eepromreadbit(iot, ioh, ioff);
+		readval |= eepromreadbit(iot, ioh);
 	}
 
-	bus_space_write_1(iot, ioh, ioff, 0|EESK);
+	bus_space_write_1(iot, ioh, EEPROM_REG, 0|EESK);
 	delay(1);
-	bus_space_write_1(iot, ioh, ioff, 0);
+	bus_space_write_1(iot, ioh, EEPROM_REG, 0);
 
-	bus_space_write_1(iot, ioh, ioff, BANK_SEL(0));
+	bus_space_write_1(iot, ioh, COMMAND_REG, BANK_SEL(0));
 
 	return readval;
 }
@@ -787,7 +792,7 @@
 	struct iy_softc *sc = ifp->if_softc;
 
 	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
-	++sc->sc_arpcom.ac_if.if_oerrors;
+	++sc->sc_ethercom.ec_if.if_oerrors;
 	iyreset(sc);
 }
 
@@ -819,7 +824,7 @@
 			printf("\n");
 	}
 #endif
-	if ((status & (RX_INT | TX_INT) == 0))
+	if (((status & (RX_INT | TX_INT)) == 0))
 		return 0;
 
 	if (status & RX_INT) {
@@ -844,7 +849,7 @@
 	struct ifnet *ifp;
 	int len;
 
-	ifp = &sc->sc_arpcom.ac_if;
+	ifp = &sc->sc_ethercom.ec_if;
 
 	m = sc->mb[sc->next_mb];
 	sc->mb[sc->next_mb] = 0;
@@ -913,8 +918,10 @@
 		bpf_mtap(ifp->if_bpf, top);
 		if ((ifp->if_flags & IFF_PROMISC) &&
 		    (eh->ether_dhost[0] & 1) == 0 &&
-		    bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr, 
-				sizeof(eh->ether_dhost)) != 0) {
+		    bcmp(eh->ether_dhost,
+		    	LLADDR(sc->sc_ethercom.ec_if.if_sadl), 
+			sizeof(eh->ether_dhost)) != 0) {
+
 			m_freem(top);
 			return;
 		}
@@ -940,7 +947,7 @@
 
 	iot = sc->sc_iot;
 	ioh = sc->sc_ioh;
-	ifp = &sc->sc_arpcom.ac_if;
+	ifp = &sc->sc_ethercom.ec_if;
 
 	rxadrs = sc->rx_start;
 	bus_space_write_2(iot, ioh, HOST_ADDR_REG, rxadrs);
@@ -980,7 +987,7 @@
 	struct ifnet *ifp;
 	u_int txstatus, txstat2, txlen, txnext;
 
-	ifp = &sc->sc_arpcom.ac_if;
+	ifp = &sc->sc_ethercom.ec_if;
 	iot = sc->sc_iot;
 	ioh = sc->sc_ioh;
 
@@ -1056,11 +1063,12 @@
 		 * destined for us.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.iy_bpf != 0); /* BPF gets this packet if anybody cares */
+		*to_bpf = (sc->sc_ethercom.ec_if.iy_bpf != 0); /* BPF gets this packet if anybody cares */
 #endif
 		if (eh->ether_dhost[0] & 1)
 			return 1;
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, 
+		    LLADDR(sc->sc_ethercom.ec_if.if_sadl)))
 			return 1;
 		return 0;
 
@@ -1069,10 +1077,10 @@
 		 * Receiving all packets.  These need to be passed on to BPF.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.iy_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.iy_bpf != 0);
 #endif
 		/* If for us, accept and hand up to BPF */
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, LLADDR(sc->sc_ethercom.ec_if.if_sadl)))
 			return 1;
 
 #if NBPFILTER > 0
@@ -1107,14 +1115,14 @@
 		 * time.  Whew!  (Hope this is a fast machine...)
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.iy_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.iy_bpf != 0);
 #endif
 		/* We want to see multicasts. */
 		if (eh->ether_dhost[0] & 1)
 			return 1;
 
 		/* We want to see our own packets */
-		if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr))
+		if (ether_equal(eh->ether_dhost, LLADDR(sc->sc_ethercom.ec_if.if_sadl)))
 			return 1;
 
 		/* Anything else goes to BPF but nothing else. */
@@ -1134,7 +1142,7 @@
 		 * of here as quickly as possible.
 		 */
 #if NBPFILTER > 0
-		*to_bpf = (sc->sc_arpcom.ac_if.iy_bpf != 0);
+		*to_bpf = (sc->sc_ethercom.ec_if.iy_bpf != 0);
 #endif
 		return 1;
 	}
@@ -1176,7 +1184,7 @@
 #ifdef INET
 		case AF_INET:
 			iyinit(sc);
-			arp_ifinit(&sc->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 #ifdef NS
@@ -1186,12 +1194,12 @@
 			struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
 
 			if (ns_nullhost(*ina))
-				ina->x_host =
-				    *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+				ina->x_host = *(union ns_host *)
+				    LLADDR(sc->sc_ethercom.ec_if.if_sadl);
 			else
 				bcopy(ina->x_host.c_host,
-				    sc->sc_arpcom.ac_enaddr,
-				    sizeof(sc->sc_arpcom.ac_enaddr));
+				    LLADDR(sc->sc_ethercom.ec_if.if_sadl),
+				    ETHER_ADDR_LEN);
 			/* Set new address. */
 			iyinit(sc);
 			break;
@@ -1240,8 +1248,8 @@
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		error = (cmd == SIOCADDMULTI) ?
-		    ether_addmulti(ifr, &sc->sc_arpcom):
-		    ether_delmulti(ifr, &sc->sc_arpcom);
+		    ether_addmulti(ifr, &sc->sc_ethercom):
+		    ether_delmulti(ifr, &sc->sc_ethercom);
 
 		if (error == ENETRESET) {
 			/*
@@ -1272,12 +1280,13 @@
 	 * Step through the list of addresses.
 	 */
 	sc->mcast_count = 0;
-	ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
+	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
 	while (enm) {
 		if (sc->mcast_count >= MAXMCAST ||
 		    bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
-			sc->sc_arpcom.ac_if.if_flags |= IFF_ALLMULTI;
-			iyioctl(&sc->sc_arpcom.ac_if, SIOCSIFFLAGS, (void *)0);
+			sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI;
+			iyioctl(&sc->sc_ethercom.ec_if, SIOCSIFFLAGS,
+			    (void *)0);
 			goto setflag;
 		}
 
@@ -1357,6 +1366,8 @@
 	iot = sc->sc_iot;
 	ioh = sc->sc_ioh;
 
+	bus_space_write_1(iot, ioh, COMMAND_REG, BANK_SEL(0));
+	delay(1);
 	bus_space_write_2(iot, ioh, HOST_ADDR_REG, 4096-2);
 	bus_space_write_2(iot, ioh, MEM_PORT_REG, 0);
 
@@ -1422,3 +1433,32 @@
 	}
 	sc->tx_size = testing - sc->rx_size;
 }
+
+static int
+eepromreadall(iot, ioh, wordp, maxi)
+	bus_space_tag_t iot;
+	bus_space_handle_t ioh;
+	u_int16_t *wordp;
+	int maxi;
+{
+	int i;
+	u_int16_t checksum, tmp;
+
+	checksum = 0;
+
+	for (i=0; i<EEPP_LENGTH; ++i) {
+		tmp = eepromread(iot, ioh, i);
+		checksum += tmp;
+		if (i<maxi)
+			wordp[i] = tmp;
+	}
+
+	if (checksum != EEPP_CHKSUM) {
+#ifdef IYDEBUG
+		printf("wrong EEPROM checksum 0x%x should be 0x%x\n",
+		    checksum, EEPP_CHKSUM);
+#endif
+		return 1;
+	}
+	return 0;
+}
--- a/sys/dev/isa/if_le_isa.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_le_isa.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_isa.c,v 1.8 1997/02/12 23:36:04 thorpej Exp $	*/
+/*	$NetBSD: if_le_isa.c,v 1.9 1997/03/15 18:11:48 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -49,10 +49,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <vm/vm.h>
@@ -221,17 +222,17 @@
 	goto bad;
 
 found:
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++)
-		sc->sc_arpcom.ac_enaddr[i] = bus_space_read_1(iot, ioh, port);
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++)
+		sc->sc_enaddr[i] = bus_space_read_1(iot, ioh, port);
 
 #if 0
 	sum =
-	    (sc->sc_arpcom.ac_enaddr[0] <<  2) +
-	    (sc->sc_arpcom.ac_enaddr[1] << 10) +
-	    (sc->sc_arpcom.ac_enaddr[2] <<  1) +
-	    (sc->sc_arpcom.ac_enaddr[3] <<  9) +
-	    (sc->sc_arpcom.ac_enaddr[4] <<  0) +
-	    (sc->sc_arpcom.ac_enaddr[5] <<  8);
+	    (sc->sc_enaddr[0] <<  2) +
+	    (sc->sc_enaddr[1] << 10) +
+	    (sc->sc_enaddr[2] <<  1) +
+	    (sc->sc_enaddr[3] <<  9) +
+	    (sc->sc_enaddr[4] <<  0) +
+	    (sc->sc_enaddr[5] <<  8);
 	sum = (sum & 0xffff) + (sum >> 16);
 	sum = (sum & 0xffff) + (sum >> 16);
 
@@ -290,8 +291,8 @@
 	/*
 	 * Extract the physical MAC address from the ROM.
 	 */
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++)
-		sc->sc_arpcom.ac_enaddr[i] = bus_space_read_1(iot, ioh, i);
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++)
+		sc->sc_enaddr[i] = bus_space_read_1(iot, ioh, i);
 
 	/*
 	 * XXX INDIRECT BROKENNESS!
@@ -331,8 +332,8 @@
 	/*
 	 * Extract the physical MAC address from the ROM.
 	 */
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++)
-		sc->sc_arpcom.ac_enaddr[i] = bus_space_read_1(iot, ioh, i * 2);
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++)
+		sc->sc_enaddr[i] = bus_space_read_1(iot, ioh, i * 2);
 
 	/*
 	 * XXX INDIRECT BROKENNESS!
--- a/sys/dev/isa/if_levar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/isa/if_levar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_levar.h,v 1.7 1996/12/02 05:44:18 thorpej Exp $	*/
+/*	$NetBSD: if_levar.h,v 1.8 1997/03/15 18:11:49 is Exp $	*/
 
 /*
  * LANCE Ethernet driver header file
@@ -40,7 +40,7 @@
  * Ethernet software status per interface.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface.
+ * ethercom.ec_if, which the routing code uses to locate the interface.
  * This structure contains the output queue for the interface, its address, ...
  */
 struct le_softc {
--- a/sys/dev/ofw/files.ofw	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ofw/files.ofw	Sat Mar 15 18:09:08 1997 +0000
@@ -11,7 +11,7 @@
 
 # Generic net support
 define	ipkdbofn { [ disable = 0 ] }
-device	ofnet: ether, ifnet, ipkdbofn
+device	ofnet: ether, ifnet, ipkdbofn, arp
 attach	ofnet at openfirm
 file	dev/ofw/ofnet.c			ofnet | ipkdb_ofn needs-flag
 attach	ipkdbif at ipkdbofn with ipkdb_ofn
--- a/sys/dev/ofw/ofnet.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/ofw/ofnet.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofnet.c,v 1.4 1996/10/16 19:33:21 ws Exp $	*/
+/*	$NetBSD: ofnet.c,v 1.5 1997/03/15 18:11:51 is Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -41,10 +41,11 @@
 #include <sys/syslog.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <dev/ofw/openfirm.h>
@@ -67,7 +68,7 @@
 	struct device sc_dev;
 	int sc_phandle;
 	int sc_ihandle;
-	struct arpcom sc_arpcom;
+	struct ethercom sc_ethercom;
 };
 
 static int ofnprobe __P((struct device *, void *, void *));
@@ -119,10 +120,11 @@
 	void *aux;
 {
 	struct ofn_softc *of = (void *)self;
-	struct ifnet *ifp = &of->sc_arpcom.ac_if;
+	struct ifnet *ifp = &of->sc_ethercom.ec_if;
 	struct ofprobe *ofp = aux;
 	char path[256];
 	int l;
+	u_int8_t myaddr[ETHER_ADDR_LEN];
 	
 	of->sc_phandle = ofp->phandle;
 #if NIPKDB_OFN > 0
@@ -138,10 +140,10 @@
 	    || (path[l] = 0, !(of->sc_ihandle = OF_open(path))))
 		panic("ofnattach: unable to open");
 	if (OF_getprop(ofp->phandle, "mac-address",
-		       of->sc_arpcom.ac_enaddr, sizeof of->sc_arpcom.ac_enaddr)
+		       myaddr, sizeof myaddr)
 	    < 0)
 		panic("ofnattach: no max-address");
-	printf(": address %s\n", ether_sprintf(of->sc_arpcom.ac_enaddr));
+	printf(": address %s\n", ether_sprintf(myaddr));
 	
 	bcopy(of->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
 	ifp->if_softc = of;
@@ -151,11 +153,10 @@
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS;
 
 	if_attach(ifp);
-	ether_ifattach(ifp);
+	ether_ifattach(ifp, myaddr);
 
 #if NBPFILTER > 0
-	bpfattach(&of->sc_arpcom.ac_if.if_bpf, ifp, DLT_EN10MB,
-		  sizeof(struct ether_header));
+	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, sizeof(struct ether_header));
 #endif
 
 	dk_establish(0, self);					/* XXX */
@@ -167,7 +168,7 @@
 ofnread(of)
 	struct ofn_softc *of;
 {
-	struct ifnet *ifp = &of->sc_arpcom.ac_if;
+	struct ifnet *ifp = &of->sc_ethercom.ec_if;
 	struct ether_header *eh;
 	struct mbuf *m, **mp, *head;
 	int l, len;
@@ -250,7 +251,7 @@
 ofninit(of)
 	struct ofn_softc *of;
 {
-	struct ifnet *ifp = &of->sc_arpcom.ac_if;
+	struct ifnet *ifp = &of->sc_ethercom.ec_if;
 
 	if (ifp->if_flags & IFF_RUNNING)
 		return;
@@ -267,7 +268,7 @@
 	struct ofn_softc *of;
 {
 	untimeout(ofntimer, of);
-	of->sc_arpcom.ac_if.if_flags &= ~IFF_RUNNING;
+	of->sc_ethercom.ec_if.if_flags &= ~IFF_RUNNING;
 }
 
 static void
@@ -336,7 +337,7 @@
 		switch (ifa->ifa_addr->sa_family) {
 #ifdef	INET
 		case AF_INET:
-			arp_ifinit(&of->sc_arpcom, ifa);
+			arp_ifinit(ifp, ifa);
 			break;
 #endif
 		default:
@@ -371,7 +372,7 @@
 	struct ofn_softc *of = ifp->if_softc;
 	
 	log(LOG_ERR, "%s: device timeout\n", of->sc_dev.dv_xname);
-	of->sc_arpcom.ac_if.if_oerrors++;
+	ifp->if_oerrors++;
 	ofnstop(of);
 	ofninit(of);
 }
@@ -384,7 +385,7 @@
 	int unit = kip->unit - 1;
 	
 	if (ipkdb_of)
-		ipkdbattach(kip, &ipkdb_of->sc_arpcom);
+		ipkdbattach(kip, &ipkdb_of->sc_ethercom);
 }
 
 static void
--- a/sys/dev/pci/files.pci	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/files.pci	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.pci,v 1.22 1997/03/12 06:39:47 cgd Exp $
+#	$NetBSD: files.pci,v 1.23 1997/03/15 18:11:53 is Exp $
 #
 # Config.new file and device description for machine-independent PCI code.
 # Included by ports that need it.  Requires that the SCSI files be
@@ -26,7 +26,7 @@
 file	dev/pci/isp_pci.c		isp_pci
 
 # Ethernet driver for DC21040-based boards
-device	de: ether, ifnet
+device	de: ether, ifnet, arp
 attach	de at pci
 file	dev/pci/if_de.c			de
 
@@ -41,7 +41,7 @@
 file	dev/pci/if_ep_pci.c		ep_pci
 
 # Digital DEFPA PCI FDDI Controller
-device	fpa: pdq, fddi, ifnet
+device	fpa: pdq, fddi, ifnet, arp
 attach	fpa at pci
 file	dev/pci/if_fpa.c		fpa
 
--- a/sys/dev/pci/if_de.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/if_de.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_de.c,v 1.33 1997/03/06 22:32:20 thorpej Exp $	*/
+/*	$NetBSD: if_de.c,v 1.34 1997/03/15 18:11:55 is Exp $	*/
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -57,8 +57,15 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
+
+#if defined(__NetBSD__)
+#include <net/if_ether.h>
+#endif
+
+#if !defined(__NetBSD__)
 #include <net/route.h>
 #include <net/netisr.h>
+#endif
 
 #include "bpfilter.h"
 #if NBPFILTER > 0
@@ -71,8 +78,12 @@
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
+#if defined(__NetBSD__)
+#include <netinet/if_inarp.h>
+#else
 #include <netinet/if_ether.h>
 #endif
+#endif
 
 #ifdef NS
 #include <netns/ns.h>
@@ -2634,7 +2645,7 @@
     sc->tulip_flags |= TULIP_WANTSETUP;
     sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN;
     sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED;
-    if (sc->tulip_ac.ac_multicnt > 14) {
+    if (TULIP_MULTICAST_CNT > 14) {
 	unsigned hash;
 	/*
 	 * If we have more than 14 multicasts, we have
@@ -2645,21 +2656,21 @@
 	bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata));
 	hash = tulip_mchash(etherbroadcastaddr);
 	sp[hash >> 4] |= 1 << (hash & 0xF);
-	ETHER_FIRST_MULTI(step, &sc->tulip_ac, enm);
+	ETHER_FIRST_MULTI(step, &TULIP_ETHERCOM, enm);
 	while (enm != NULL) {
 	    hash = tulip_mchash(enm->enm_addrlo);
 	    sp[hash >> 4] |= 1 << (hash & 0xF);
 	    ETHER_NEXT_MULTI(step, enm);
 	}
 	sc->tulip_flags |= TULIP_WANTHASH;
-	sp[39] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[0]; 
-	sp[40] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[1]; 
-	sp[41] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[2];
+	sp[39] = ((u_int16_t *) sc->tulip_hwaddr)[0]; 
+	sp[40] = ((u_int16_t *) sc->tulip_hwaddr)[1]; 
+	sp[41] = ((u_int16_t *) sc->tulip_hwaddr)[2];
     } else {
 	/*
 	 * Else can get perfect filtering for 16 addresses.
 	 */
-	ETHER_FIRST_MULTI(step, &sc->tulip_ac, enm);
+	ETHER_FIRST_MULTI(step, &TULIP_ETHERCOM, enm);
 	for (; enm != NULL; i++) {
 	    *sp++ = ((u_int16_t *) enm->enm_addrlo)[0]; 
 	    *sp++ = ((u_int16_t *) enm->enm_addrlo)[1]; 
@@ -2677,9 +2688,9 @@
 	 * Pad the rest with our hardware address
 	 */
 	for (; i < 16; i++) {
-	    *sp++ = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[0]; 
-	    *sp++ = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[1]; 
-	    *sp++ = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[2];
+	    *sp++ = ((u_int16_t *) sc->tulip_hwaddr)[0]; 
+	    *sp++ = ((u_int16_t *) sc->tulip_hwaddr)[1]; 
+	    *sp++ = ((u_int16_t *) sc->tulip_hwaddr)[2];
 	}
     }
 }
@@ -2935,7 +2946,7 @@
 #endif
 	    if ((sc->tulip_if.if_flags & IFF_PROMISC)
 		    && (eh.ether_dhost[0] & 1) == 0
-		    && !TULIP_ADDREQUAL(eh.ether_dhost, sc->tulip_ac.ac_enaddr))
+		    && !TULIP_ADDREQUAL(eh.ether_dhost, sc->tulip_hwaddr))
 		    goto next;
 	    accept = 1;
 	    sc->tulip_flags |= TULIP_RXACT;
@@ -3454,7 +3465,7 @@
 #ifdef INET
 		case AF_INET: {
 		    tulip_init(sc);
-		    arp_ifinit(&sc->tulip_ac, ifa);
+		    arp_ifinit(TULIP_ARPINITPAR, ifa);
 		    break;
 		}
 #endif /* INET */
@@ -3468,12 +3479,17 @@
 		case AF_NS: {
 		    struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
 		    if (ns_nullhost(*ina)) {
-			ina->x_host = *(union ns_host *)(sc->tulip_ac.ac_enaddr);
+			ina->x_host = *(union ns_host *)(sc->tulip_hwaddr);
 		    } else {
 			ifp->if_flags &= ~IFF_RUNNING;
 			bcopy((caddr_t)ina->x_host.c_host,
-			      (caddr_t)sc->tulip_ac.ac_enaddr,
-			      sizeof sc->tulip_ac.ac_enaddr);
+			      (caddr_t)sc->tulip_hwaddr,
+			      ETHER_ADDR_LEN);
+#if defined(__NetBSD__)
+			bcopy((caddr_t)ina->x_host.c_host,
+			      LLADDR(ifp->if_sadl),
+			      ETHER_ADDR_LEN);
+#endif
 		    }
 		    tulip_init(sc);
 		    break;
@@ -3488,9 +3504,9 @@
 	    break;
 	}
 	case SIOCGIFADDR: {
-	    bcopy((caddr_t) sc->tulip_ac.ac_enaddr,
+	    bcopy((caddr_t) sc->tulip_hwaddr,
 		  (caddr_t) ((struct sockaddr *)&ifr->ifr_data)->sa_data,
-		  6);
+		  ETHER_ADDR_LEN);
 	    break;
 	}
 
@@ -3523,9 +3539,9 @@
 	     * Update multicast listeners
 	     */
 	    if (cmd == SIOCADDMULTI)
-		error = ether_addmulti(ifr, &sc->tulip_ac);
+		error = ether_addmulti(ifr, &TULIP_ETHERCOM);
 	    else
-		error = ether_delmulti(ifr, &sc->tulip_ac);
+		error = ether_delmulti(ifr, &TULIP_ETHERCOM);
 
 	    if (error == ENETRESET) {
 		tulip_addr_filter(sc);		/* reset multicast filtering */
@@ -3961,7 +3977,9 @@
     ether_attach(ifp);
 #else
     if_attach(ifp);
-#if defined(__NetBSD__) || (defined(__FreeBSD__) && BSD >= 199506)
+#if defined(__NetBSD__)
+    ether_ifattach(ifp, sc->tulip_hwaddr);
+#elif (defined(__FreeBSD__) && BSD >= 199506)
     ether_ifattach(ifp);
 #endif
 #endif /* __bsdi__ */
--- a/sys/dev/pci/if_devar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/if_devar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_devar.h,v 1.4 1997/03/06 22:32:24 thorpej Exp $	*/
+/*	$NetBSD: if_devar.h,v 1.5 1997/03/15 18:11:57 is Exp $	*/
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -466,8 +466,10 @@
     bus_space_tag_t tulip_bustag;
     bus_space_handle_t tulip_bushandle;	/* CSR region handle */
     pci_chipset_tag_t tulip_pc;
+    struct ethercom tulip_ec;
+#else
+    struct arpcom tulip_ac;
 #endif
-    struct arpcom tulip_ac;
     tulip_regfile_t tulip_csrs;
     u_int32_t tulip_flags;
 #define	TULIP_WANTSETUP		0x00000001
@@ -591,6 +593,9 @@
     tulip_srom_connection_t tulip_conntype;
     tulip_desc_t tulip_rxdescs[TULIP_RXDESCS];
     tulip_desc_t tulip_txdescs[TULIP_TXDESCS];
+#if defined(__NetBSD__)
+    u_int8_t tulip_enaddr[ETHER_ADDR_LEN];
+#endif
 };
 
 #if defined(TULIP_HDR_DATA)
@@ -811,11 +816,14 @@
 extern struct cfdriver de_cd;
 #define	TULIP_UNIT_TO_SOFTC(unit)	((tulip_softc_t *) de_cd.cd_devs[unit])
 #define TULIP_IFP_TO_SOFTC(ifp)         ((tulip_softc_t *)((ifp)->if_softc))
-#define	tulip_xname			tulip_ac.ac_if.if_xname
+#define	tulip_xname			tulip_ec.ec_if.if_xname
 #define	tulip_unit			tulip_dev.dv_unit
 #define	loudprintf			printf
 #define	TULIP_PRINTF_FMT		"%s"
 #define	TULIP_PRINTF_ARGS		sc->tulip_xname
+#define TULIP_ETHERCOM			sc->tulip_ec
+#define TULIP_MULTICAST_CNT		sc->tulip_ec.ec_multicnt
+#define TULIP_ARPINITPAR		ifp
 #if defined(__alpha__)
 /* XXX XXX NEED REAL DMA MAPPING SUPPORT XXX XXX */
 #define TULIP_KVATOPHYS(sc, va)		alpha_XXX_dmamap((vm_offset_t)(va))
@@ -833,12 +841,36 @@
 #define	TULIP_BURSTSIZE(unit)		3
 #endif
 
+#ifndef TULIP_ETHERCOM		
+#define TULIP_ETHERCOM			sc->tulip_ac
+#endif
+
+#ifndef TULIP_MULTICAST_CNT		
+#define TULIP_MULTICAST_CNT		sc->tulip_ac.ac_multicnt
+#endif
+
+#ifndef TULIP_ARPINITPAR		
+#define TULIP_ARPINITPAR		&sc->tulip_ac
+#endif
+
+#if defined(__NetBSD__)
+#define	tulip_if	tulip_ec.ec_if
+#define	tulip_name	tulip_ec.ec_if.if_name
+#ifndef tulip_unit
+#define	tulip_unit	tulip_ec.ec_if.if_unit
+#endif
+#define	tulip_hwaddr	tulip_enaddr
+#define tulip_bpf	tulip_ec.ec_if.if_bpf
+
+#else /* __NetBSD__ */
+
 #define	tulip_if	tulip_ac.ac_if
+#define	tulip_name	tulip_ac.ac_if.if_name
 #ifndef tulip_unit
 #define	tulip_unit	tulip_ac.ac_if.if_unit
 #endif
-#define	tulip_name	tulip_ac.ac_if.if_name
 #define	tulip_hwaddr	tulip_ac.ac_enaddr
+#endif /* __NetBSD__ */
 
 #if !defined(tulip_bpf) && (!defined(__bsdi__) || _BSDI_VERSION >= 199401)
 #define	tulip_bpf	tulip_ac.ac_if.if_bpf
--- a/sys/dev/pci/if_ep_pci.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/if_ep_pci.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ep_pci.c,v 1.18 1997/02/18 10:51:12 jonathan Exp $	*/
+/*	$NetBSD: if_ep_pci.c,v 1.19 1997/03/15 18:11:58 is Exp $	*/
 
 /*
  * Copyright (c) 1994 Herb Peyerl <hpeyerl@beer.org>
@@ -46,12 +46,14 @@
 #include <net/if_dl.h>
 #include <net/if_types.h>
 
+#include <net/if_ether.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>
+#include <netinet/if_inarp.h>
 #endif
  
 #ifdef NS
--- a/sys/dev/pci/if_fpa.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/if_fpa.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_fpa.c,v 1.16 1996/12/05 01:25:26 cgd Exp $	*/
+/*	$NetBSD: if_fpa.c,v 1.17 1997/03/15 18:11:59 is Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -51,7 +51,9 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
+#if !defined(__NetBSD__)
 #include <net/route.h>
+#endif
 
 #include "bpfilter.h"
 #if NBPFILTER > 0
@@ -59,10 +61,18 @@
 #include <net/bpfdesc.h>
 #endif
 
+#if defined(__NetBSD__)
+#include <net/if_ether.h>
+#endif
+
 #ifdef INET
 #include <netinet/in.h>
+#if defined(__NetBSD__)
+#include <netinet/if_inarp.h>
+#else
 #include <netinet/if_ether.h>
 #endif
+#endif
 #if defined(__FreeBSD__)
 #include <netinet/if_fddi.h>
 #else
@@ -207,7 +217,6 @@
 	free((void *) sc, M_DEVBUF);
 	return;
     }
-    bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, sc->sc_ac.ac_enaddr, 6);
     pdqs_pci[unit] = sc;
     pdq_ifattach(sc, pdq_pci_ifwatchdog);
     pci_map_int(config_id, pdq_pci_ifintr, (void*) sc, &net_imask);
@@ -334,7 +343,8 @@
 	return;
     }
 
-    bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, sc->sc_ac.ac_enaddr, 6);
+    bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes,
+	LLADDR(ifp->if_sadl), 6);
 
     pdq_ifattach(sc, pdq_pci_ifwatchdog);
 
@@ -438,7 +448,8 @@
 	return;
     }
 
-    bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, sc->sc_ac.ac_enaddr, 6);
+    bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes,
+	LLADDR(sc->sc_if.if_sadl), 6);
     pdq_ifattach(sc, pdq_pci_ifwatchdog);
 
     if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin,
--- a/sys/dev/pci/if_le_pci.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/if_le_pci.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_pci.c,v 1.14 1996/12/05 01:25:27 cgd Exp $	*/
+/*	$NetBSD: if_le_pci.c,v 1.15 1997/03/15 18:12:00 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -53,10 +53,11 @@
 #include <vm/vm_param.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <vm/vm.h>
@@ -194,8 +195,8 @@
 	/*
 	 * Extract the physical MAC address from the ROM.
 	 */
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++)
-		sc->sc_arpcom.ac_enaddr[i] = bus_space_read_1(iot, ioh, i);
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++)
+		sc->sc_enaddr[i] = bus_space_read_1(iot, ioh, i);
 
 	sc->sc_mem = malloc(16384, M_DEVBUF, M_NOWAIT);
 	if (sc->sc_mem == 0) {
--- a/sys/dev/pci/if_levar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/pci/if_levar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_levar.h,v 1.3 1996/10/21 22:56:46 thorpej Exp $	*/
+/*	$NetBSD: if_levar.h,v 1.4 1997/03/15 18:12:01 is Exp $	*/
 
 /*
  * LANCE Ethernet driver header file
@@ -20,7 +20,7 @@
  * Ethernet software status per interface.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface.
+ * ethercom.ec_if, which the routing code uses to locate the interface.
  * This structure contains the output queue for the interface, its address, ...
  */
 struct le_softc {
--- a/sys/dev/tc/files.tc	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/files.tc	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files.tc,v 1.5 1996/05/20 00:45:02 thorpej Exp $
+#	$NetBSD: files.tc,v 1.6 1997/03/15 18:12:02 is Exp $
 #
 # Config.new file and device description for machine-independent
 # TurboChannel code.  Included by ports that need it.
@@ -15,6 +15,6 @@
 # file	dev/tc/if_le_tc.c		le_tc
 
 # DEC DEFTA TC FDDI Controller
-device	fta: pdq, fddi, ifnet
+device	fta: pdq, fddi, ifnet, arp
 attach	fta at tc
 file	dev/tc/if_fta.c			fta
--- a/sys/dev/tc/if_fta.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/if_fta.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_fta.c,v 1.8 1996/12/05 01:25:32 cgd Exp $	*/
+/*	$NetBSD: if_fta.c,v 1.9 1997/03/15 18:12:03 is Exp $	*/
 
 /*-
  * Copyright (c) 1996 Matt Thomas <matt@3am-software.com>
@@ -48,9 +48,13 @@
 
 #include <net/if.h>
 #include <net/if_types.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
+#if defined(__NetBSD__)
+#include <netinet/if_inarp.h>
+#else
 #include <netinet/if_ether.h>
 #endif
 #include <net/if_fddi.h>
@@ -112,7 +116,10 @@
 	printf("%s: initialization failed\n", sc->sc_dev.dv_xname);
 	return;
     }
+#if !defined(__NetBSD__)
     bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, sc->sc_ac.ac_enaddr, 6);
+#endif
+
     pdq_ifattach(sc, NULL);
 
     tc_intr_establish(parent, ta->ta_cookie, TC_IPL_NET,
--- a/sys/dev/tc/if_le_dec.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/if_le_dec.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_dec.c,v 1.3 1996/10/13 01:38:38 christos Exp $	*/
+/*	$NetBSD: if_le_dec.c,v 1.4 1997/03/15 18:12:04 is Exp $	*/
 
 /*-
  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
@@ -49,10 +49,11 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <dev/ic/am7990reg.h>
@@ -87,8 +88,8 @@
 	/*
 	 * Get the ethernet address out of rom
 	 */
-	for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++) {
-		sc->sc_arpcom.ac_enaddr[i] = *eap;
+	for (i = 0; i < sizeof(sc->sc_enaddr); i++) {
+		sc->sc_enaddr[i] = *eap;
 		eap += 4;
 	}
 
--- a/sys/dev/tc/if_le_ibus.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/if_le_ibus.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_ibus.c,v 1.3 1996/05/20 23:19:16 jonathan Exp $	*/
+/*	$NetBSD: if_le_ibus.c,v 1.4 1997/03/15 18:12:05 is Exp $	*/
 
 /*
  * Copyright 1996 The Board of Trustees of The Leland Stanford
@@ -30,7 +30,7 @@
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <dev/ic/am7990reg.h>
--- a/sys/dev/tc/if_le_ioasic.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/if_le_ioasic.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_ioasic.c,v 1.3 1996/12/05 01:25:33 cgd Exp $	*/
+/*	$NetBSD: if_le_ioasic.c,v 1.4 1997/03/15 18:12:05 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Carnegie-Mellon University.
@@ -42,7 +42,7 @@
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <dev/ic/am7990reg.h>
--- a/sys/dev/tc/if_le_tc.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/if_le_tc.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le_tc.c,v 1.3 1996/12/05 01:25:34 cgd Exp $	*/
+/*	$NetBSD: if_le_tc.c,v 1.4 1997/03/15 18:12:06 is Exp $	*/
 
 /*
  * Copyright (c) 1996 Carnegie-Mellon University.
@@ -42,7 +42,7 @@
 
 #ifdef INET
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #endif
 
 #include <dev/ic/am7990reg.h>
--- a/sys/dev/tc/if_levar.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/dev/tc/if_levar.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_levar.h,v 1.3 1996/05/07 02:24:58 thorpej Exp $	*/
+/*	$NetBSD: if_levar.h,v 1.4 1997/03/15 18:12:07 is Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -56,7 +56,7 @@
  * Ethernet software status per interface.
  *
  * Each interface is referenced by a network interface structure,
- * arpcom.ac_if, which the routing code uses to locate the interface.
+ * ethercom.ec_if, which the routing code uses to locate the interface.
  * This structure contains the output queue for the interface, its address, ...
  */
 struct le_softc {
--- a/sys/ipkdb/ipkdb.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/ipkdb/ipkdb.h	Sat Mar 15 18:09:08 1997 +0000
@@ -77,7 +77,7 @@
 	char	gotbuf[32*1024];
 	char	*got;
 	int	gotlen;
-	struct arpcom *arp;
+	struct ethercom *arp;
 	struct cfdata *cfp;
 	char	*name;		/* to be filled by the driver */
 	int	port;		/* to be filled by the driver */
@@ -125,10 +125,10 @@
  */
 extern void ipkdbrint __P((struct ipkdb_if *kip, struct ifnet *ifp));
 extern void ipkdbgotpkt __P((struct ipkdb_if *kip, char *pkt, int len));
-extern __inline void ipkdbattach __P((struct ipkdb_if *kip, struct arpcom *arp));
+extern __inline void ipkdbattach __P((struct ipkdb_if *kip, struct ethercom *arp));
 extern __inline void ipkdbattach(kip, arp)
 	struct ipkdb_if *kip;
-	struct arpcom *arp;
+	struct ethercom *arp;
 {
 	if (!kip->arp)
 		kip->arp = arp;
--- a/sys/ipkdb/ipkdb_if.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/ipkdb/ipkdb_if.c	Sat Mar 15 18:09:08 1997 +0000
@@ -37,9 +37,10 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 
 #include <ipkdb/ipkdb.h>
 #include <machine/ipkdb.h>
@@ -124,7 +125,7 @@
 ipkdbread(kip)
 	struct ipkdb_if *kip;
 {
-	struct ifnet *ifp = &kip->arp->ac_if;
+	struct ifnet *ifp = &kip->arp->ec_if;
 	struct ether_header *eh;
 	struct mbuf *m, **mp, *head = 0;
 	int l, len;
@@ -177,8 +178,8 @@
 	 * Check if there's a bp filter listening on this interface.
 	 * If so, hand off the raw packet to bpf.
 	 */
-	if (kip->arp->ac_if.if_bpf)
-		bpf_mtap(kip->arp->ac_if.if_bpf, head);
+	if (kip->arp->ec_if.if_bpf)
+		bpf_mtap(kip->arp->ec_if.if_bpf, head);
 
 	/*
 	 * Note that the interface cannot be in promiscuous mode if
@@ -233,7 +234,7 @@
 	struct ipkdb_if *kip;
 	struct ifnet *ifp;
 {
-	if (kip && kip->arp && ifp == &kip->arp->ac_if)
+	if (kip && kip->arp && ifp == &kip->arp->ec_if)
 		while (kip->gotlen > 0)
 			ipkdbread(kip);
 }
@@ -272,7 +273,7 @@
 	struct ifaddr *ap;
 
 	if (kip->arp) {
-		for (ap = kip->arp->ac_if.if_addrlist.tqh_first; ap; ap = ap->ifa_list.tqe_next) {
+		for (ap = kip->arp->ec_if.if_addrlist.tqh_first; ap; ap = ap->ifa_list.tqe_next) {
 			if (ap->ifa_addr->sa_family == AF_INET) {
 				ipkdbcopy(&((struct sockaddr_in *)ap->ifa_addr)->sin_addr,
 					 kip->myinetaddr, sizeof kip->myinetaddr);
--- a/sys/ipkdb/ipkdb_ipkdb.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/ipkdb/ipkdb_ipkdb.c	Sat Mar 15 18:09:08 1997 +0000
@@ -35,11 +35,11 @@
 #include <sys/systm.h>
 
 #include <net/if.h>
-#include <net/route.h>
+#include <net/if_ether.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 #include <netinet/in.h>
 #include <netinet/ip.h>
 #include <netinet/ip_var.h>
--- a/sys/ipkdb/ipkdb_slip.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/ipkdb/ipkdb_slip.c	Sat Mar 15 18:09:08 1997 +0000
@@ -33,9 +33,10 @@
 #include <sys/device.h>
 
 #include <net/if.h>
+#include <net/if_ether.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 
 #include <ipkdb/ipkdb.h>
 #include <machine/ipkdb.h>
--- a/sys/kern/kgdb_stub.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/kern/kgdb_stub.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: kgdb_stub.c,v 1.2 1997/02/18 16:45:10 gwr Exp $	*/
+/*	$NetBSD: kgdb_stub.c,v 1.3 1997/03/15 18:12:11 is Exp $	*/
 
 /*
  * Copyright (c) 1990, 1993
--- a/sys/lib/libsa/arp.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/lib/libsa/arp.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: arp.c,v 1.15 1996/10/13 02:28:58 christos Exp $	*/
+/*	$NetBSD: arp.c,v 1.16 1997/03/15 18:12:13 is Exp $	*/
 
 /*
  * Copyright (c) 1992 Regents of the University of California.
@@ -44,11 +44,11 @@
 #include <net/if.h>
 #include <netinet/in.h>
 
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 
 #include <string.h>
 
+#include "if_ether.h"
 #include "stand.h"
 #include "net.h"
 
--- a/sys/lib/libsa/dev_net.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/lib/libsa/dev_net.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dev_net.c,v 1.7 1997/03/14 21:03:43 gwr Exp $	*/
+/*	$NetBSD: dev_net.c,v 1.8 1997/03/15 18:12:14 is Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include "if_ether.h"
 #include <netinet/in_systm.h>
 
 #include "stand.h"
--- a/sys/lib/libsa/dev_net.h	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/lib/libsa/dev_net.h	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: dev_net.h,v 1.2 1997/03/11 18:23:56 gwr Exp $	*/
+/*	$NetBSD: dev_net.h,v 1.3 1997/03/15 18:12:14 is Exp $	*/
 
 int	net_open __P((struct open_file *, ...));
 int	net_close __P((struct open_file *));
--- a/sys/lib/libsa/ether.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/lib/libsa/ether.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ether.c,v 1.8 1996/10/13 02:29:00 christos Exp $	*/
+/*	$NetBSD: ether.c,v 1.9 1997/03/15 18:12:15 is Exp $	*/
 
 /*
  * Copyright (c) 1992 Regents of the University of California.
@@ -46,10 +46,10 @@
 #include <net/if.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
 
+#include "if_ether.h"
 #include "stand.h"
 #include "net.h"
 #include "netif.h"
--- a/sys/lib/libsa/net.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/lib/libsa/net.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: net.c,v 1.14 1996/10/13 02:29:02 christos Exp $	*/
+/*	$NetBSD: net.c,v 1.15 1997/03/15 18:12:16 is Exp $	*/
 
 /*
  * Copyright (c) 1992 Regents of the University of California.
@@ -47,13 +47,13 @@
 #include <net/if.h>
 
 #include <netinet/in.h>
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
 #include <netinet/ip_var.h>
 #include <netinet/udp.h>
 #include <netinet/udp_var.h>
 
+#include "if_ether.h"
 #include "stand.h"
 #include "net.h"
 
--- a/sys/lib/libsa/rarp.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/lib/libsa/rarp.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: rarp.c,v 1.13 1996/10/13 02:29:05 christos Exp $	*/
+/*	$NetBSD: rarp.c,v 1.14 1997/03/15 18:12:17 is Exp $	*/
 
 /*
  * Copyright (c) 1992 Regents of the University of California.
@@ -43,11 +43,11 @@
 #include <net/if.h>
 #include <netinet/in.h>
 
-#include <netinet/if_ether.h>
 #include <netinet/in_systm.h>
 
 #include <string.h>
 
+#include "if_ether.h"
 #include "stand.h"
 #include "net.h"
 #include "netif.h"
--- a/sys/net/bpf.c	Sat Mar 15 17:08:28 1997 +0000
+++ b/sys/net/bpf.c	Sat Mar 15 18:09:08 1997 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: bpf.c,v 1.33 1997/02/21 23:59:35 thorpej Exp $	*/
+/*	$NetBSD: bpf.c,v 1.34 1997/03/15 18:12:18 is Exp $	*/
 
 /*
  * Copyright (c) 1990, 1991, 1993
@@ -71,9 +71,11 @@
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
 
+#include <net/if_ether.h>
+
 #include <netinet/in.h>
 #include <netinet/if_arc.h>
-#include <netinet/if_ether.h>
+#include <netinet/if_inarp.h>
 
 /*
  * Older BSDs don't have kernel malloc.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/net/ethertypes.h	Sat Mar 15 18:09:08 1997 +0000
@@ -0,0 +1,64 @@
+/*	$NetBSD: ethertypes.h,v 1.2 1997/03/15 18:12:19 is Exp $	*/
+
+/*
+ * Copyright (c) 1982, 1986, 1993
+ *	The Regents of the University of California.  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, 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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