add general ether_ioctl call in net/if_ethersubr.c,
authormickey <mickey@openbsd.org>
Sun, 5 May 1996 13:36:23 +0000 (13:36 +0000)
committermickey <mickey@openbsd.org>
Sun, 5 May 1996 13:36:23 +0000 (13:36 +0000)
NS,IPX,X.25 special processing is now handled in there.
reflect this amazing addition in all the ether ifaces.
ppl, pls check the stuff.

33 files changed:
sys/arch/amiga/dev/if_ae.c
sys/arch/amiga/dev/if_ed.c
sys/arch/amiga/dev/if_es.c
sys/arch/amiga/dev/if_qn.c
sys/arch/amiga/isa/if_isaed.c
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/mac68k/dev/if_ae.c
sys/arch/mac68k/dev/if_sn.c
sys/arch/mvme68k/dev/if_ie.c
sys/arch/mvme68k/dev/if_le.c
sys/arch/pica/dev/if_sn.c
sys/arch/sparc/dev/if_ie.c
sys/arch/sun3/dev/if_ie.c
sys/arch/vax/if/if_de.c
sys/arch/vax/if/if_qe.c
sys/dev/eisa/if_ep_eisa.c
sys/dev/ic/am7990.c
sys/dev/ic/elink3.c
sys/dev/isa/if_ed.c
sys/dev/isa/if_eg.c
sys/dev/isa/if_el.c
sys/dev/isa/if_ep.c [new file with mode: 0644]
sys/dev/isa/if_ep_isa.c
sys/dev/isa/if_fe.c
sys/dev/isa/if_hp.c
sys/dev/isa/if_ie.c
sys/dev/pci/if_de.c
sys/dev/pci/if_ep_pci.c
sys/dev/pcmcia/if_ep_pcmcia.c
sys/net/if_ethersubr.c

index c0c91a3..57d9e7f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ae.c,v 1.5 1996/05/02 06:44:02 niklas Exp $        */
+/*     $OpenBSD: if_ae.c,v 1.6 1996/05/05 13:36:23 mickey Exp $        */
 /*     $NetBSD: if_ae.c,v 1.7 1996/04/21 21:11:40 veego Exp $  */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-#if defined(CCITT) && defined(LLC)
-#include <sys/socketvar.h>  
-#include <netccitt/x25.h>
-#include <net/if_dl.h>
-#include <net/if_llc.h>
-#include <netccitt/dll.h>
-#include <netccitt/llc_var.h>
-#include <netccitt/pk.h> 
-#include <netccitt/pk_var.h>
-#include <netccitt/pk_extern.h>
-#endif  
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -967,6 +950,11 @@ aeioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -978,22 +966,6 @@ aeioctl(ifp, cmd, data)
                        aeinit(sc);     
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               wcopyto(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       aeinit(sc); /* does ae_setaddr() */
-                       break;
-                   }
 #endif
                default:
                        aeinit(sc);
@@ -1001,16 +973,6 @@ aeioctl(ifp, cmd, data)
                }
                break;
 
-#if defined(CCITT) && defined(LLC)
-       case SIOCSIFCONF_X25:
-               ifp->if_flags |= IFF_UP;
-               ifa->ifa_rtrequest = cons_rtrequest; /* XXX */
-               error = x25_llcglue(PRC_IFUP, ifa->ifa_addr);
-               if (error == 0)
-                       aeinit(sc);
-               break;
-#endif /* CCITT && LLC */
-
        case SIOCSIFFLAGS:
                if ((ifp->if_flags & IFF_UP) == 0 &&
                    (ifp->if_flags & IFF_RUNNING) != 0) {
index e38ac42..c2fb9e8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ed.c,v 1.4 1996/05/02 06:44:04 niklas Exp $        */
+/*     $OpenBSD: if_ed.c,v 1.5 1996/05/05 13:36:29 mickey Exp $        */
 /*     $NetBSD: if_ed.c,v 1.20 1996/04/21 21:11:44 veego Exp $ */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -870,6 +865,11 @@ ed_ioctl(ifp, command, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (command) {
 
        case SIOCSIFADDR:
@@ -881,24 +881,6 @@ ed_ioctl(ifp, command, data)
                        ed_init(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       ed_init(sc);
-                       break;
-                   }
 #endif
                default:
                        ed_init(sc);
index b8da7a1..d053af2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_es.c,v 1.5 1996/05/04 14:04:04 niklas Exp $        */
+/*     $OpenBSD: if_es.c,v 1.6 1996/05/05 13:36:33 mickey Exp $        */
 /*     $NetBSD: if_es.c,v 1.12 1996/05/01 15:55:28 mhitch Exp $        */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <machine/cpu.h>
 #include <machine/mtpr.h>
 #include <amiga/amiga/device.h>
@@ -972,6 +967,11 @@ esioctl(ifp, command, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               aplx(s);
+               return error;
+       }
+
        switch (command) {
 
        case SIOCSIFADDR:
@@ -983,23 +983,6 @@ esioctl(ifp, command, data)
                        esinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       esinit(sc);
-                       break;
-                   }
 #endif
                default:
                        esinit(sc);
index a34342e..1ab3733 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_qn.c,v 1.5 1996/05/02 06:44:08 niklas Exp $        */
+/*     $OpenBSD: if_qn.c,v 1.6 1996/05/05 13:36:38 mickey Exp $        */
 /*     $NetBSD: if_qn.c,v 1.5 1996/04/21 21:11:50 veego Exp $  */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <machine/cpu.h>
 #include <machine/mtpr.h>
 #include <amiga/amiga/device.h>
@@ -877,6 +872,11 @@ qnioctl(ifp, command, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (command) {
 
        case SIOCSIFADDR:
@@ -889,23 +889,6 @@ qnioctl(ifp, command, data)
                        qninit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       qnstop(sc);
-                       qninit(sc);
-                       break;
-                   }
 #endif
                default:
                        log(LOG_INFO, "qn:sa_family:default (not tested)\n");
index 7302b5d..c4e35eb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_isaed.c,v 1.4 1996/05/02 06:30:26 niklas Exp $     */
+/*     $OpenBSD: if_isaed.c,v 1.5 1996/05/05 13:36:46 mickey Exp $     */
 
 /*
  * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -2157,6 +2152,11 @@ edioctl(ifp, cmd, data)
                return ENXIO;           /* may be ignored, oh well. */
        }
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -2168,24 +2168,6 @@ edioctl(ifp, cmd, data)
                        edinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       edinit(sc);
-                       break;
-                   }
 #endif
                default:
                        edinit(sc);
index 1104d51..de1d1d3 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include "bpfilter.h"
 #if NBPFILTER > 0
 #include <net/bpf.h>
@@ -1445,6 +1440,11 @@ ea_ioctl(ifp, cmd, data)
 
        s = splimp();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -1458,25 +1458,6 @@ ea_ioctl(ifp, cmd, data)
                        dprintf(("Interface ea is coming up (AF_INET)\n"));
                        ea_init(sc);
                        break;
-#endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       dprintf(("Interface ea is coming up (AF_NS)\n"));
-                       ea_init(sc);
-                       break;
-                   }
 #endif
                default:
                        dprintf(("Interface ea is coming up (default)\n"));
index a433d38..5075b95 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include "bpfilter.h"
 #if NBPFILTER > 0
 #include <net/bpf.h>
@@ -1464,6 +1459,11 @@ eb_ioctl(ifp, cmd, data)
 
        s = splimp();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -1477,25 +1477,6 @@ eb_ioctl(ifp, cmd, data)
                        dprintf(("Interface eb is coming up (AF_INET)\n"));
                        eb_init(sc);
                        break;
-#endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       dprintf(("Interface eb is coming up (AF_NS)\n"));
-                       eb_init(sc);
-                       break;
-                   }
 #endif
                default:
                        dprintf(("Interface eb is coming up (default)\n"));
index ab47663..a9b8306 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 /****************************************************************************/
 /* Some useful definitions **************************************************/
 /****************************************************************************/
@@ -555,6 +550,11 @@ ehioctl(ifp, cmd, data)
        int s = splimp ();
        int error = 0;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
        case SIOCSIFADDR:
                ifp->if_flags |= IFF_UP;
index ecc8269..8ea7517 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 /* Import our data structres */
 
 #include "if_iereg.h"
@@ -579,6 +574,11 @@ int ieioctl ( struct ifnet *ifp, u_long cmd, caddr_t data )
 
     s=splimp();
 
+    if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+       splx(s);
+       return error;
+    }
+
     switch ( cmd )
     {
        case SIOCSIFADDR:
index 53bb0fb..0897e54 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -1033,6 +1028,11 @@ aeioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -1044,24 +1044,6 @@ aeioctl(ifp, cmd, data)
                        aeinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-                       /* XXX - This code is probably wrong. */
-               case AF_NS:
-                       {
-                               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);
-                               else
-                                       bcopy(ina->x_host.c_host,
-                                           sc->sc_arpcom.ac_enaddr,
-                                           sizeof(sc->sc_arpcom.ac_enaddr));
-                               /* Set new address. */
-                               aeinit(sc);
-                               break;
-                       }
 #endif
                default:
                        aeinit(sc);
index d2dd319..3a6051a 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-#ifdef RMP
-#include <netrmp/rmp.h>
-#include <netrmp/rmp_var.h>
-#endif
-
 #include <vm/vm.h>
 
 #include "bpfilter.h"
@@ -388,6 +378,11 @@ snioctl(ifp, cmd, data)
        int     s = splnet(), err = 0;
        int     temp;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -400,23 +395,6 @@ snioctl(ifp, cmd, data)
                        arp_ifinit(&sc->sc_ac, ifa);
                        break;
 #endif
-#ifdef NS
-               case AF_NS:
-                       {
-                               struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
-
-                               if (ns_nullhost(*ina)) {
-                                       ina->x_host = *(union ns_host *)(sc->sc_enaddr);
-                               } else {
-                                       /* XXX
-                                        * add an extra i/f address to
-                                        * sonic filter
-                                        */
-                               }
-                       }
-                       (void)sninit(ifp->if_unit);
-                       break;
-#endif /* NS */
                default:
                        (void)sninit(ifp->if_unit);
                        break;
index f4c4ecd..2370698 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ie.c,v 1.4 1996/04/28 11:06:04 deraadt Exp $ */
+/*     $OpenBSD: if_ie.c,v 1.5 1996/05/05 13:37:27 mickey Exp $ */
 
 /*-
  * Copyright (c) 1995 Theo de Raadt
@@ -127,11 +127,6 @@ Mode of operation:
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <vm/vm.h>
 
 /*
@@ -1831,6 +1826,11 @@ ieioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch(cmd) {
 
        case SIOCSIFADDR:
@@ -1843,24 +1843,6 @@ ieioctl(ifp, cmd, data)
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
 #endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
-
-                       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));
-                       /* Set new address. */
-                       ieinit(sc);
-                       break;
-                   }
-#endif /* NS */
                default:
                        ieinit(sc);
                        break;
index 89dfcfc..d98d976 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_le.c,v 1.4 1996/04/28 11:06:05 deraadt Exp $ */
+/*     $OpenBSD: if_le.c,v 1.5 1996/05/05 13:37:32 mickey Exp $ */
 
 /*-
  * Copyright (c) 1982, 1992, 1993
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-#ifdef APPLETALK
-#include <netddp/atalk.h>
-#endif
-
 #include <machine/cpu.h>
 #include <machine/autoconf.h>
 #include <machine/pmap.h>
@@ -827,6 +818,11 @@ leioctl(ifp, cmd, data)
        register struct lereg1 *ler1;
        int s = splnet(), error = 0;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               retun error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -838,27 +834,6 @@ leioctl(ifp, cmd, data)
                        (void)leinit(ifp->if_unit);
                        arp_ifinit(&sc->sc_ac, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
-
-                       if (ns_nullhost(*ina))
-                               ina->x_host = *(union ns_host *)(sc->sc_addr);
-                       else {
-                               /*
-                                * The manual says we can't change the address
-                                * while the receiver is armed,
-                                * so reset everything
-                                */
-                               ifp->if_flags &= ~IFF_RUNNING;
-                               bcopy((caddr_t)ina->x_host.c_host,
-                                   (caddr_t)sc->sc_addr, sizeof(sc->sc_addr));
-                       }
-                       (void)leinit(ifp->if_unit);     /* does le_setaddr() */
-                       break;
-                   }
 #endif
                default:
                        (void)leinit(ifp->if_unit);
index 12f815a..47fd54a 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-#ifdef RMP
-#include <netrmp/rmp.h>
-#include <netrmp/rmp_var.h>
-#endif
-
 #include <vm/vm.h>
 
 #include "bpfilter.h"
@@ -377,6 +367,11 @@ snioctl(ifp, cmd, data)
        int     s = splnet(), err = 0;
        int     temp;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -389,23 +384,6 @@ snioctl(ifp, cmd, data)
                        arp_ifinit(&sc->sc_ac, ifa);
                        break;
 #endif
-#ifdef NS
-               case AF_NS:
-                       {
-                               struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
-
-                               if (ns_nullhost(*ina)) {
-                                       ina->x_host = *(union ns_host *)(sc->sc_addr);
-                               } else {
-                                       /* XXX
-                                        * add an extra i/f address to
-                                        * sonic filter
-                                        */
-                               }
-                       }
-                       (void)sninit(ifp->if_unit);
-                       break;
-#endif /* NS */
                default:
                        (void)sninit(ifp->if_unit);
                        break;
index 9646afb..20aa520 100644 (file)
@@ -129,11 +129,6 @@ Mode of operation:
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <vm/vm.h>
 
 /*
@@ -1932,6 +1927,11 @@ ieioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch(cmd) {
 
        case SIOCSIFADDR:
@@ -1944,24 +1944,6 @@ ieioctl(ifp, cmd, data)
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
 #endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
-
-                       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));
-                       /* Set new address. */
-                       ieinit(sc);
-                       break;
-                   }
-#endif /* NS */
                default:
                        ieinit(sc);
                        break;
index eafc268..3309c3d 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <vm/vm.h>
 
 /*
@@ -1568,6 +1563,11 @@ ieioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -1580,24 +1580,6 @@ ieioctl(ifp, cmd, data)
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
 #endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
-
-                       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));
-                       /* Set new address. */
-                       ieinit(sc);
-                       break;
-                   }
-#endif /* NS */
                default:
                        ieinit(sc);
                        break;
index 997d43d..9e40f50 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #ifdef ISO
 #include <netiso/iso.h>
 #include <netiso/iso_var.h>
@@ -580,6 +575,11 @@ deioctl(ifp, cmd, data)
        register struct de_softc *ds = de_cd.cd_devs[ifp->if_unit];
        int s = splnet(), error = 0;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -591,18 +591,6 @@ deioctl(ifp, cmd, data)
                case AF_INET:
                        arp_ifinit(&ds->ds_ac, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
-                       
-                       if (ns_nullhost(*ina))
-                               ina->x_host = *(union ns_host *)(ds->ds_addr);
-                       else
-                               de_setaddr(ina->x_host.c_host,ifp->if_unit);
-                       break;
-                   }
 #endif
                }
                break;
index 6e1eaec..ab0e59e 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #ifdef ISO
 #include <netiso/iso.h>
 #include <netiso/iso_var.h>
@@ -771,6 +766,11 @@ qeioctl(ifp, cmd, data)
        struct ifaddr *ifa = (struct ifaddr *)data;
        int s = splnet(), error = 0;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -781,18 +781,6 @@ qeioctl(ifp, cmd, data)
                case AF_INET:
                        arp_ifinit(&sc->qe_ac, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
-
-                       if (ns_nullhost(*ina))
-                               ina->x_host = *(union ns_host *)(sc->qe_addr);
-                       else
-                               qe_setaddr(ina->x_host.c_host, ifp->if_unit);
-                       break;
-                   }
 #endif
                }
                break;
index dc27528..2145d35 100644 (file)
 #include <netinet/if_ether.h>   
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif 
-        
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
index 15d4909..2b243bd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: am7990.c,v 1.6 1996/05/02 13:51:45 deraadt Exp $      */
+/*     $OpenBSD: am7990.c,v 1.7 1996/05/05 13:39:31 mickey Exp $       */
 /*     $NetBSD: am7990.c,v 1.18 1996/04/22 02:40:50 christos Exp $     */
 
 /*-
 #include <netinet/ip.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-#if defined(CCITT) && defined(LLC)
-#include <sys/socketvar.h>
-#include <netccitt/x25.h>
-#include <netccitt/pk.h>
-#include <netccitt/pk_var.h>
-#include <netccitt/pk_extern.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -772,6 +759,11 @@ leioctl(ifp, cmd, data)
 
        s = splimp();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -783,23 +775,6 @@ leioctl(ifp, cmd, data)
                        leinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       leinit(sc);
-                       break;
-                   }
 #endif
                default:
                        leinit(sc);
@@ -807,16 +782,6 @@ leioctl(ifp, cmd, data)
                }
                break;
 
-#if defined(CCITT) && defined(LLC)
-       case SIOCSIFCONF_X25:
-               ifp->if_flags |= IFF_UP;
-               ifa->ifa_rtrequest = cons_rtrequest; /* XXX */
-               error = x25_llcglue(PRC_IFUP, ifa->ifa_addr);
-               if (error == 0)
-                       leinit(sc);
-               break;
-#endif /* CCITT && LLC */
-
        case SIOCSIFFLAGS:
                if ((ifp->if_flags & IFF_UP) == 0 &&
                    (ifp->if_flags & IFF_RUNNING) != 0) {
index f1cd49a..36ef547 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -783,6 +778,11 @@ epioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -794,23 +794,6 @@ epioctl(ifp, cmd, data)
                        epinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       epinit(sc);
-                       break;
-                   }
 #endif
                default:
                        epinit(sc);
index 8f2499c..db1654f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ed.c,v 1.12 1996/04/29 14:16:31 hvozda Exp $       */
+/*     $OpenBSD: if_ed.c,v 1.13 1996/05/05 13:38:19 mickey Exp $       */
 /*     $NetBSD: if_ed.c,v 1.93 1996/04/11 22:28:55 cgd Exp $   */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -2211,6 +2206,11 @@ edioctl(ifp, cmd, data)
                return ENXIO;           /* may be ignored, oh well. */
        }
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -2222,24 +2222,6 @@ edioctl(ifp, cmd, data)
                        edinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       edinit(sc);
-                       break;
-                   }
 #endif
                default:
                        edinit(sc);
index 6a52e9d..c51baf8 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -740,6 +735,11 @@ egioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -751,23 +751,6 @@ egioctl(ifp, cmd, data)
                        eginit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       eginit(sc);
-                       break;
-                   }
 #endif
                default:
                        eginit(sc);
index ea75115..8a1a0eb 100644 (file)
@@ -1,4 +1,4 @@
-/*    $OpenBSD: if_el.c,v 1.7 1996/04/21 22:23:48 deraadt Exp $       */
+/*    $OpenBSD: if_el.c,v 1.8 1996/05/05 13:38:27 mickey Exp $       */
 /*     $NetBSD: if_el.c,v 1.36 1996/04/11 22:29:07 cgd Exp $   */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -626,6 +621,11 @@ elioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -637,24 +637,6 @@ elioctl(ifp, cmd, data)
                        elinit(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       elinit(sc);
-                       break;
-                   }
 #endif
                default:
                        elinit(sc);
diff --git a/sys/dev/isa/if_ep.c b/sys/dev/isa/if_ep.c
new file mode 100644 (file)
index 0000000..b6ca5cc
--- /dev/null
@@ -0,0 +1,1503 @@
+/*     $OpenBSD: if_ep.c,v 1.14 1996/05/05 13:38:29 mickey Exp $       */
+/*     $NetBSD: if_ep.c,v 1.90 1996/04/11 22:29:15 cgd Exp $   */
+
+/*
+ * Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca>
+ * 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 Herb Peyerl.
+ * 4. The name of Herb Peyerl may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "pcmcia.h"
+#include "bpfilter.h"
+#include "ep.h"
+
+#include <sys/param.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/errno.h>
+#include <sys/syslog.h>
+#include <sys/select.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+
+#include <net/if.h>
+#include <net/netisr.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>
+#endif
+
+#if NBPFILTER > 0
+#include <net/bpf.h>
+#include <net/bpfdesc.h>
+#endif
+
+#include "pci.h"
+
+#include <machine/cpu.h>
+#include <machine/pio.h>
+
+#include <dev/isa/isavar.h>
+#include <dev/isa/if_epreg.h>
+#include <dev/isa/elink.h>
+
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcidevs.h>
+
+/* PCI constants */
+#define PCI_VENDORID(x)                ((x) & 0xFFFF)
+#define PCI_CHIPID(x)          (((x) >> 16) & 0xFFFF)
+#define PCI_CONN               0x48    /* Connector type */
+#define PCI_CBMA               0x10    /* Configuration Base Memory Address */
+
+
+#define ETHER_MIN_LEN  64
+#define ETHER_MAX_LEN   1518
+#define ETHER_ADDR_LEN  6
+/*
+ * Ethernet software status per interface.
+ */
+struct ep_softc {
+       struct device sc_dev;
+       void *sc_ih;
+
+       struct arpcom sc_arpcom;        /* Ethernet common part         */
+       int     ep_iobase;              /* i/o bus address              */
+       char    ep_connectors;          /* Connectors on this card.     */
+#define MAX_MBS        8                       /* # of mbufs we keep around    */
+       struct mbuf *mb[MAX_MBS];       /* spare mbuf storage.          */
+       int     next_mb;                /* Which mbuf to use next.      */
+       int     last_mb;                /* Last mbuf.                   */
+       int     tx_start_thresh;        /* Current TX_start_thresh.     */
+       int     tx_succ_ok;             /* # packets sent in sequence   */
+                                       /* w/o underrun                 */
+       u_char  bustype;
+#define EP_BUS_ISA             0x0
+#define        EP_BUS_PCMCIA           0x1
+#define        EP_BUS_EISA             0x2
+#define EP_BUS_PCI             0x3
+
+#define EP_IS_BUS_32(a)        ((a) & 0x2)
+
+       u_char  pcmcia_flags;
+#define EP_REATTACH            0x01
+#define EP_ABSENT              0x02
+};
+
+static int epprobe __P((struct device *, void *, void *));
+static void epattach __P((struct device *, struct device *, void *));
+
+/* XXX the following two structs should be different. */
+#if NEP_ISA > 0
+struct cfattach ep_isa_ca = {
+       sizeof(struct ep_softc), epprobe, epattach
+};
+#endif
+
+#if NEP_PCI > 0
+struct cfattach ep_pci_ca = {
+       sizeof(struct ep_softc), epprobe, epattach
+};
+#endif
+
+
+struct cfdriver ep_cd = {
+       NULL, "ep", DV_IFNET
+};
+
+int epintr __P((void *));
+static int epstatus __P((struct ep_softc *));
+void epinit __P((struct ep_softc *));
+int epioctl __P((struct ifnet *, u_long, caddr_t));
+void epstart __P((struct ifnet *));
+void epwatchdog __P((int));
+void epreset __P((struct ep_softc *));
+void epread __P((struct ep_softc *));
+struct mbuf *epget __P((struct ep_softc *, int));
+void epmbuffill __P((void *));
+void epmbufempty __P((struct ep_softc *));
+void epstop __P((struct ep_softc *));
+void epsetfilter __P((struct ep_softc *));
+void epsetlink __P((struct ep_softc *));
+static void epconfig __P((struct ep_softc *, u_int));
+
+static u_short epreadeeprom __P((int id_port, int offset));
+static int epbusyeeprom __P((struct ep_softc *));
+
+#define MAXEPCARDS 20  /* if you have 21 cards in your machine... you lose */
+
+static struct epcard {
+       int     iobase;
+       int     irq;
+       char    available;
+       char    bustype;
+} epcards[MAXEPCARDS];
+static int nepcards;
+
+static void
+epaddcard(iobase, irq, bustype)
+       int iobase;
+       int irq;
+       char bustype;
+{
+
+       if (nepcards >= MAXEPCARDS)
+               return;
+       epcards[nepcards].iobase = iobase;
+       epcards[nepcards].irq = (irq == 2) ? 9 : irq;
+       epcards[nepcards].available = 1;
+       epcards[nepcards].bustype = bustype;
+       nepcards++;
+}
+       
+#if NEP_PCMCIA > 0
+#include <dev/pcmcia/pcmciavar.h>
+
+int ep_pcmcia_match __P((struct device *, void *, void *));
+void ep_pcmcia_attach __P((struct device *, struct device *, void *));
+int ep_pcmcia_detach __P((struct device *));
+
+static int ep_pcmcia_isa_attach __P((struct device *, void *,
+                               void *, struct pcmcia_link *));
+static int epmod __P((struct pcmcia_link *, struct device *,
+                     struct pcmcia_conf *, struct cfdata * cf));
+static int ep_remove __P((struct pcmcia_link *, struct device *));
+
+struct cfattach ep_pcmcia_ca = {
+       sizeof(struct ep_softc), ep_pcmcia_match, epattach, ep_pcmcia_detach
+};
+
+/* additional setup needed for pcmcia devices */
+static int
+ep_pcmcia_isa_attach(parent, match, aux, pc_link)
+       struct device   *parent;
+       void            *match;
+       void            *aux;
+       struct pcmcia_link *pc_link;
+{
+       struct ep_softc *sc = (void *) match;
+/*     struct cfdata  *cf = sc->sc_dev.dv_cfdata;*/
+       struct isa_attach_args *ia = aux;
+/*     struct pcmciadevs *dev = pc_link->device;*/
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+       int             i;
+       extern int      ifqmaxlen;
+
+       outw(ia->ia_iobase + EP_COMMAND, WINDOW_SELECT | 0);
+       outw(ia->ia_iobase + EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ);
+       outw(ia->ia_iobase + EP_W0_RESOURCE_CFG, 0x3f00);
+
+       /*
+        * ok til here. Now try to figure out which link we have.
+        * try coax first...
+        */
+#ifdef EP_COAX_DEFAULT
+       outw(ia->ia_iobase + EP_W0_ADDRESS_CFG, 0xC000);
+#else
+       /* COAX as default is reported to be a problem */
+       outw(ia->ia_iobase + EP_W0_ADDRESS_CFG, 0x0000);
+#endif
+       ifp->if_snd.ifq_maxlen = ifqmaxlen;
+
+       epaddcard(ia->ia_iobase, ia->ia_irq, EP_BUS_PCMCIA);
+
+       for (i = 0; i < nepcards; i++) {
+               if (epcards[i].available == 0)
+                       continue;
+               if (ia->ia_iobase != IOBASEUNK &&
+                   ia->ia_iobase != epcards[i].iobase)
+                       continue;
+               if (ia->ia_irq != IRQUNK &&
+                   ia->ia_irq != epcards[i].irq)
+                       continue;
+               goto good;
+       }
+       return 0;
+
+good:
+
+       epcards[i].available = 0;
+       ia->ia_iobase = epcards[i].iobase;
+       ia->ia_irq = epcards[i].irq;
+       ia->ia_iosize = 0x10;
+       ia->ia_msize = 0;
+
+       sc->bustype = epcards[i].bustype;
+       sc->pcmcia_flags = (pc_link->flags & PCMCIA_REATTACH) ? EP_REATTACH:0;
+       return 1;
+}
+
+/* modify config entry */
+static int
+epmod(pc_link, self, pc_cf, cf)
+       struct pcmcia_link *pc_link;
+       struct device  *self;
+       struct pcmcia_conf *pc_cf;
+       struct cfdata  *cf;
+{
+       int             err;
+/*     struct pcmciadevs *dev = pc_link->device;*/
+/*     struct ep_softc *sc = (void *) self;*/
+
+       if ((err = PCMCIA_BUS_CONFIG(pc_link->adapter, pc_link, self,
+                                    pc_cf, cf)) != 0) {
+               printf("bus_config failed %d\n", err);
+               return err;
+       }
+
+       if (pc_cf->io[0].len > 0x10)
+           pc_cf->io[0].len = 0x10;
+#if 0
+       pc_cf->cfgtype = DOSRESET;
+#endif
+       pc_cf->cfgtype = 1;
+
+       return 0;
+}
+
+static int
+ep_remove(pc_link, self)
+       struct pcmcia_link *pc_link;
+       struct device  *self;
+{
+       struct ep_softc *sc = (void *) self;
+       struct ifnet   *ifp = &sc->sc_arpcom.ac_if;
+       if_down(ifp);
+       epstop(sc);
+       ifp->if_flags &= ~(IFF_RUNNING | IFF_UP);
+       sc->pcmcia_flags = EP_ABSENT;
+       return PCMCIA_BUS_UNCONFIG(pc_link->adapter, pc_link);
+}
+
+static struct pcmcia_3com {
+       struct pcmcia_device pcd;
+} pcmcia_3com = {
+       {"PCMCIA 3COM 3C589", epmod, ep_pcmcia_isa_attach, NULL, ep_remove}
+};
+
+struct pcmciadevs pcmcia_ep_devs[] = {
+       {
+               "ep", 0, "3Com Corporation", "3C589",
+#if 0
+               "TP/BNC LAN Card Ver. 1a", "000001",
+#else
+               NULL, NULL,
+#endif
+               (void *) -1, (void *) &pcmcia_3com
+       },
+#if 0
+       {
+               "ep", 0, "3Com Corporation", "3C589", "TP/BNC LAN Card Ver. 2a", "000002",
+               (void *) -1, (void *) &pcmcia_3com
+       },
+#endif
+       { NULL }
+};
+#define nep_pcmcia_devs sizeof(pcmcia_ep_devs)/sizeof(pcmcia_ep_devs[0])
+
+int
+ep_pcmcia_match(parent, match, aux)
+       struct device *parent;
+       void *match, *aux;
+{
+       return pcmcia_slave_match(parent, match, aux, pcmcia_ep_devs,
+                                 nep_pcmcia_devs);
+}
+
+void
+ep_pcmcia_attach(parent, self, aux)
+       struct device *parent, *self;
+       void *aux;
+{
+       struct pcmcia_attach_args *paa = aux;
+       
+       printf("ep_pcmcia_attach %p %p %p\n", parent, self, aux);
+       delay(2000000);
+       if (!pcmcia_configure(parent, self, paa->paa_link)) {
+               struct ep_softc *sc = (void *)self;
+               sc->pcmcia_flags |= EP_ABSENT;
+               printf(": not attached\n");
+       }
+}
+
+/*
+ * No detach; network devices are too well linked into the rest of the
+ * kernel.
+ */
+int
+ep_pcmcia_detach(self)
+       struct device *self;
+{
+       return EBUSY;
+}
+
+#endif
+
+
+/*
+ * 3c579 cards on the EISA bus are probed by their slot number. 3c509
+ * cards on the ISA bus are probed in ethernet address order. The probe
+ * sequence requires careful orchestration, and we'd like like to allow
+ * the irq and base address to be wildcarded. So, we probe all the cards
+ * the first time epprobe() is called. On subsequent calls we look for
+ * matching cards.
+ */
+int
+epprobe(parent, match, aux)
+       struct device *parent;
+       void *match, *aux;
+{
+       struct ep_softc *sc = match;
+       struct isa_attach_args *ia = aux;
+       static int probed;
+       int slot, iobase, i;
+       u_short vendor, model;
+       int k, k2;
+
+#if NPCI > 0
+       extern struct cfdriver pci_cd;
+
+       if (parent->dv_cfdata->cf_driver == &pci_cd) {
+               struct pci_attach_args *pa = (struct pci_attach_args *) aux;
+
+               if (PCI_VENDORID(pa->pa_id) != PCI_VENDOR_3COM)
+                       return 0;
+
+               switch (PCI_CHIPID(pa->pa_id)) {
+               case PCI_PRODUCT_3COM_3C590:
+               case PCI_PRODUCT_3COM_3C595:
+                       break;
+               default:
+                       return 0;
+               }
+
+               if (nepcards >= MAXEPCARDS)
+                       return 0;
+
+               epcards[nepcards++].available = 0;
+               return 1;
+       }
+#endif
+
+       if (!probed) {
+               probed = 1;
+
+               /* find all EISA cards */
+               for (slot = 1; slot < 16; slot++) {
+                       iobase = 0x1000 * slot;
+
+                       vendor = htons(inw(iobase + EISA_VENDOR));
+                       if (vendor != MFG_ID)
+                               continue;
+
+                       model = htons(inw(iobase + EISA_MODEL));
+                       if ((model & 0xfff0) != PROD_ID) {
+#ifndef trusted
+                               printf("epprobe: ignoring model %04x\n", model);
+#endif
+                               continue;
+                       }
+
+                       outb(iobase + EISA_CONTROL, EISA_ENABLE | EISA_RESET);
+                       delay(10);
+                       outb(iobase + EISA_CONTROL, EISA_ENABLE);
+                       /* Wait for reset? */
+                       delay(1000);
+
+                       k = inw(iobase + EP_W0_ADDRESS_CFG);
+                       k = (k & 0x1f) * 0x10 + 0x200;
+
+                       k2 = inw(iobase + EP_W0_RESOURCE_CFG);
+                       k2 >>= 12;
+                       epaddcard(iobase, k2, EP_BUS_EISA);
+               }
+
+               for (slot = 0; slot < 10; slot++) {
+                       elink_reset();
+                       elink_idseq(ELINK_509_POLY);
+
+                       /* Untag all the adapters so they will talk to us. */
+                       if (slot == 0)
+                               outb(ELINK_ID_PORT, TAG_ADAPTER + 0);
+
+                       vendor =
+                           htons(epreadeeprom(ELINK_ID_PORT, EEPROM_MFG_ID));
+                       if (vendor != MFG_ID)
+                               continue;
+
+                       model =
+                           htons(epreadeeprom(ELINK_ID_PORT, EEPROM_PROD_ID));
+                       if ((model & 0xfff0) != PROD_ID) {
+#ifndef trusted
+                               printf("epprobe: ignoring model %04x\n", model);
+#endif
+                               continue;
+                       }
+
+                       k = epreadeeprom(ELINK_ID_PORT, EEPROM_ADDR_CFG);
+                       k = (k & 0x1f) * 0x10 + 0x200;
+
+                       k2 = epreadeeprom(ELINK_ID_PORT, EEPROM_RESOURCE_CFG);
+                       k2 >>= 12;
+                       epaddcard(k, k2, EP_BUS_ISA);
+
+                       /* so card will not respond to contention again */
+                       outb(ELINK_ID_PORT, TAG_ADAPTER + 1);
+
+                       /*
+                        * XXX: this should probably not be done here
+                        * because it enables the drq/irq lines from
+                        * the board. Perhaps it should be done after
+                        * we have checked for irq/drq collisions?
+                        */
+                       outb(ELINK_ID_PORT, ACTIVATE_ADAPTER_TO_CONFIG);
+               }
+               /* XXX should we sort by ethernet address? */
+       }
+
+       for (i = 0; i < nepcards; i++) {
+               if (epcards[i].available == 0)
+                       continue;
+               if (ia->ia_iobase != IOBASEUNK &&
+                   ia->ia_iobase != epcards[i].iobase)
+                       continue;
+               if (ia->ia_irq != IRQUNK &&
+                   ia->ia_irq != epcards[i].irq)
+                       continue;
+               goto good;
+       }
+       return 0;
+
+good:
+       epcards[i].available = 0;
+       sc->bustype = epcards[i].bustype;
+       ia->ia_iobase = epcards[i].iobase;
+       ia->ia_irq = epcards[i].irq;
+       ia->ia_iosize = 0x10;
+       ia->ia_msize = 0;
+       return 1;
+}
+
+static void
+epconfig(sc, conn)
+       struct ep_softc *sc;
+       u_int conn;
+{
+       u_short i;
+
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+
+       sc->ep_connectors = 0;
+       printf(": ");
+       if (conn & IS_AUI) {
+               printf("aui");
+               sc->ep_connectors |= AUI;
+       }
+       if (conn & IS_BNC) {
+               if (sc->ep_connectors)
+                       printf("/");
+               printf("bnc");
+               sc->ep_connectors |= BNC;
+       }
+       if (conn & IS_UTP) {
+               if (sc->ep_connectors)
+                       printf("/");
+               printf("utp");
+               sc->ep_connectors |= UTP;
+       }
+       if (!sc->ep_connectors)
+               printf("no connectors!");
+
+       /*
+        * Read the station address from the eeprom
+        */
+       for (i = 0; i < 3; i++) {
+               u_short x;
+               if (epbusyeeprom(sc))
+                       return;
+               outw(BASE + EP_W0_EEPROM_COMMAND, READ_EEPROM | i);
+               if (epbusyeeprom(sc))
+                       return;
+               x = inw(BASE + EP_W0_EEPROM_DATA);
+               sc->sc_arpcom.ac_enaddr[(i << 1)] = x >> 8;
+               sc->sc_arpcom.ac_enaddr[(i << 1) + 1] = x;
+       }
+
+       printf(" address %s\n", ether_sprintf(sc->sc_arpcom.ac_enaddr));
+
+       ifp->if_unit = sc->sc_dev.dv_unit;
+       ifp->if_name = ep_cd.cd_name;
+       ifp->if_start = epstart;
+       ifp->if_ioctl = epioctl;
+       ifp->if_watchdog = epwatchdog;
+       ifp->if_flags =
+           IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
+
+       if ((sc->pcmcia_flags & EP_REATTACH) == 0) {
+               if_attach(ifp);
+               ether_ifattach(ifp);
+
+#if NBPFILTER > 0
+               bpfattach(&sc->sc_arpcom.ac_if.if_bpf, ifp, DLT_EN10MB,
+                         sizeof(struct ether_header));
+#endif
+       }
+       sc->tx_start_thresh = 20;       /* probably a good starting point. */
+}
+
+static void
+epattach(parent, self, aux)
+       struct device *parent, *self;
+       void *aux;
+{
+       struct ep_softc *sc = (void *)self;
+       u_short conn = 0;
+#if NPCI > 0
+       extern struct cfdriver pci_cd;
+
+       if (parent->dv_cfdata->cf_driver == &pci_cd) {
+               struct pci_attach_args *pa = aux;
+               int iobase;
+               u_short i;
+
+               if (pci_map_io(pa->pa_tag, PCI_CBMA, &iobase)) {
+                       printf("%s: couldn't map io\n", sc->sc_dev.dv_xname);
+                       return;
+               }
+               sc->bustype = EP_BUS_PCI;
+               sc->ep_iobase = iobase; /* & 0xfffffff0 */
+               i = pci_conf_read(pa->pa_bc, pa->pa_tag, PCI_CONN);
+
+               /*
+                * Bits 13,12,9 of the isa adapter are the same as bits 
+                * 5,4,3 of the pci adapter
+                */
+               if (i & IS_PCI_AUI)
+                       conn |= IS_AUI;
+               if (i & IS_PCI_BNC)
+                       conn |= IS_BNC;
+               if (i & IS_PCI_UTP)
+                       conn |= IS_UTP;
+
+               GO_WINDOW(0);
+       }
+       else
+#endif
+       {
+               struct isa_attach_args *ia = aux;
+
+               sc->ep_iobase = ia->ia_iobase;
+               GO_WINDOW(0);
+               conn = inw(ia->ia_iobase + EP_W0_CONFIG_CTRL);
+       }
+
+       epconfig(sc, conn);
+
+
+#if NPCI > 0
+       if (parent->dv_cfdata->cf_driver == &pci_cd) {
+               struct pci_attach_args *pa = aux;
+
+               pci_conf_write(pa->pa_bc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
+                              pci_conf_read(pa->pa_bc, pa->pa_tag,
+                                            PCI_COMMAND_STATUS_REG) |
+                              PCI_COMMAND_MASTER_ENABLE);
+
+               sc->sc_ih = pci_map_int(pa->pa_tag, IPL_NET, epintr, sc);
+               if (sc->sc_ih == NULL) {
+                       printf("%s: couldn't map interrupt\n",
+                              sc->sc_dev.dv_xname);
+                       return;
+               }
+               epstop(sc);
+       }
+       else
+#endif
+       {
+               struct isa_attach_args *ia = aux;
+               sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq,
+                   IST_EDGE, IPL_NET, epintr, sc, sc->sc_dev.dv_xname);
+       }
+}
+
+/*
+ * The order in here seems important. Otherwise we may not receive
+ * interrupts. ?!
+ */
+void
+epinit(sc)
+       register struct ep_softc *sc;
+{
+       register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+       int i;
+
+       while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)
+               ;
+
+       if (sc->bustype != EP_BUS_PCI) {
+               GO_WINDOW(0);
+               outw(BASE + EP_W0_CONFIG_CTRL, 0);
+               outw(BASE + EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ);
+       }
+
+       if (sc->bustype == EP_BUS_PCMCIA) {
+#ifdef EP_COAX_DEFAULT
+               outw(BASE + EP_W0_ADDRESS_CFG,3<<14);
+#else
+               outw(BASE + EP_W0_ADDRESS_CFG,0<<14);
+#endif
+               outw(BASE + EP_W0_RESOURCE_CFG, 0x3f00);
+       }
+
+       GO_WINDOW(2);
+       for (i = 0; i < 6; i++) /* Reload the ether_addr. */
+               outb(BASE + EP_W2_ADDR_0 + i, sc->sc_arpcom.ac_enaddr[i]);
+
+       outw(BASE + EP_COMMAND, RX_RESET);
+       outw(BASE + EP_COMMAND, TX_RESET);
+
+       GO_WINDOW(1);           /* Window 1 is operating window */
+       for (i = 0; i < 31; i++)
+               inb(BASE + EP_W1_TX_STATUS);
+
+       outw(BASE + EP_COMMAND, SET_RD_0_MASK | S_CARD_FAILURE | 
+                               S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
+       outw(BASE + EP_COMMAND, SET_INTR_MASK | S_CARD_FAILURE |
+                               S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
+
+       /*
+        * Attempt to get rid of any stray interrupts that occured during
+        * configuration.  On the i386 this isn't possible because one may
+        * already be queued.  However, a single stray interrupt is
+        * unimportant.
+        */
+       outw(BASE + EP_COMMAND, ACK_INTR | 0xff);
+
+       epsetfilter(sc);
+       epsetlink(sc);
+
+       outw(BASE + EP_COMMAND, RX_ENABLE);
+       outw(BASE + EP_COMMAND, TX_ENABLE);
+
+       epmbuffill(sc);
+
+       /* Interface is now `running', with no output active. */
+       ifp->if_flags |= IFF_RUNNING;
+       ifp->if_flags &= ~IFF_OACTIVE;
+
+       /* Attempt to start output, if any. */
+       epstart(ifp);
+}
+
+void
+epsetfilter(sc)
+       register struct ep_softc *sc;
+{
+       register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+
+       GO_WINDOW(1);           /* Window 1 is operating window */
+       outw(BASE + EP_COMMAND, SET_RX_FILTER |
+           FIL_INDIVIDUAL | FIL_BRDCST |
+           ((ifp->if_flags & IFF_MULTICAST) ? FIL_MULTICAST : 0 ) |
+           ((ifp->if_flags & IFF_PROMISC) ? FIL_PROMISC : 0 ));
+}
+
+void
+epsetlink(sc)
+       register struct ep_softc *sc;
+{
+       register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+
+       /*
+        * you can `ifconfig (link0|-link0) ep0' to get the following
+        * behaviour:
+        *      -link0  disable AUI/UTP. enable BNC.
+        *      link0   disable BNC. enable AUI.
+        *      link1   if the card has a UTP connector, and link0 is
+        *              set too, then you get the UTP port.
+        */
+       GO_WINDOW(4);
+       outw(BASE + EP_W4_MEDIA_TYPE, DISABLE_UTP);
+       if (!(ifp->if_flags & IFF_LINK0) && (sc->ep_connectors & BNC)) {
+               if (sc->bustype == EP_BUS_PCMCIA) {
+                       GO_WINDOW(0);
+                       outw(BASE + EP_W0_ADDRESS_CFG,3<<14);
+                       GO_WINDOW(1);
+               }
+               outw(BASE + EP_COMMAND, START_TRANSCEIVER);
+               delay(1000);
+       }
+       if (ifp->if_flags & IFF_LINK0) {
+               outw(BASE + EP_COMMAND, STOP_TRANSCEIVER);
+               delay(1000);
+               if ((ifp->if_flags & IFF_LINK1) && (sc->ep_connectors & UTP)) {
+                       if (sc->bustype == EP_BUS_PCMCIA) {
+                               GO_WINDOW(0);
+                               outw(BASE + EP_W0_ADDRESS_CFG,0<<14);
+                               GO_WINDOW(4);
+                       }
+                       outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP);
+               }
+       }
+       GO_WINDOW(1);
+}
+
+/*
+ * Start outputting on the interface.
+ * Always called as splnet().
+ */
+void
+epstart(ifp)
+       struct ifnet *ifp;
+{
+       register struct ep_softc *sc = ep_cd.cd_devs[ifp->if_unit];
+       struct mbuf *m, *m0;
+       int sh, len, pad;
+
+       /* Don't transmit if interface is busy or not running */
+       if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
+               return;
+
+startagain:
+       /* Sneak a peek at the next packet */
+       m0 = ifp->if_snd.ifq_head;
+       if (m0 == 0)
+               return;
+
+       /* We need to use m->m_pkthdr.len, so require the header */
+       if ((m0->m_flags & M_PKTHDR) == 0)
+               panic("epstart: no header mbuf");
+       len = m0->m_pkthdr.len;
+
+       pad = (4 - len) & 3;
+
+       /*
+        * The 3c509 automatically pads short packets to minimum ethernet
+        * length, but we drop packets that are too large. Perhaps we should
+        * truncate them instead?
+        */
+       if (len + pad > ETHER_MAX_LEN) {
+               /* packet is obviously too large: toss it */
+               ++ifp->if_oerrors;
+               IF_DEQUEUE(&ifp->if_snd, m0);
+               m_freem(m0);
+               goto readcheck;
+       }
+
+       if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) {
+               outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4));
+               /* not enough room in FIFO */
+               ifp->if_flags |= IFF_OACTIVE;
+               return;
+       } else {
+               outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 2044);
+       }
+
+       IF_DEQUEUE(&ifp->if_snd, m0);
+       if (m0 == 0)            /* not really needed */
+               return;
+
+       outw(BASE + EP_COMMAND, SET_TX_START_THRESH |
+           (len / 4 + sc->tx_start_thresh));
+
+#if NBPFILTER > 0
+       if (ifp->if_bpf)
+               bpf_mtap(ifp->if_bpf, m0);
+#endif
+
+       /*
+        * Do the output at splhigh() so that an interrupt from another device
+        * won't cause a FIFO underrun.
+        */
+       sh = splhigh();
+
+       outw(BASE + EP_W1_TX_PIO_WR_1, len);
+       outw(BASE + EP_W1_TX_PIO_WR_1, 0xffff); /* Second dword meaningless */
+       if (EP_IS_BUS_32(sc->bustype)) {
+               for (m = m0; m; ) {
+                       if (m->m_len > 3)
+                               outsl(BASE + EP_W1_TX_PIO_WR_1,
+                                     mtod(m, caddr_t), m->m_len / 4);
+                       if (m->m_len & 3)
+                               outsb(BASE + EP_W1_TX_PIO_WR_1,
+                                     mtod(m, caddr_t) + (m->m_len & ~3),
+                                     m->m_len & 3);
+                       MFREE(m, m0);
+                       m = m0;
+               }
+       } else {
+               for (m = m0; m; ) {
+                       if (m->m_len > 1)
+                               outsw(BASE + EP_W1_TX_PIO_WR_1,
+                                     mtod(m, caddr_t), m->m_len / 2);
+                       if (m->m_len & 1)
+                               outb(BASE + EP_W1_TX_PIO_WR_1,
+                                    *(mtod(m, caddr_t) + m->m_len - 1));
+                       MFREE(m, m0);
+                       m = m0;
+               }
+       }
+       while (pad--)
+               outb(BASE + EP_W1_TX_PIO_WR_1, 0);
+
+       splx(sh);
+
+       ++ifp->if_opackets;
+
+readcheck:
+       if ((inw(BASE + EP_W1_RX_STATUS) & ERR_INCOMPLETE) == 0) {
+               /* We received a complete packet. */
+               u_short status = inw(BASE + EP_STATUS);
+
+               if ((status & S_INTR_LATCH) == 0) {
+                       /*
+                        * No interrupt, read the packet and continue
+                        * Is  this supposed to happen? Is my motherboard 
+                        * completely busted?
+                        */
+                       epread(sc);
+               }
+               else
+                       /* Got an interrupt, return so that it gets serviced. */
+                       return;
+       }
+       else {
+               /* Check if we are stuck and reset [see XXX comment] */
+               if (epstatus(sc)) {
+                       if (ifp->if_flags & IFF_DEBUG)
+                               printf("%s: adapter reset\n",
+                                      sc->sc_dev.dv_xname);
+                       epreset(sc);
+               }
+       }
+
+       goto startagain;
+}
+
+
+/*
+ * XXX: The 3c509 card can get in a mode where both the fifo status bit
+ *     FIFOS_RX_OVERRUN and the status bit ERR_INCOMPLETE are set
+ *     We detect this situation and we reset the adapter.
+ *     It happens at times when there is a lot of broadcast traffic
+ *     on the cable (once in a blue moon).
+ */
+static int
+epstatus(sc)
+       register struct ep_softc *sc;
+{
+       u_short fifost;
+
+       /*
+        * Check the FIFO status and act accordingly
+        */
+       GO_WINDOW(4);
+       fifost = inw(BASE + EP_W4_FIFO_DIAG);
+       GO_WINDOW(1);
+
+       if (fifost & FIFOS_RX_UNDERRUN) {
+               if (sc->sc_arpcom.ac_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)
+                       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)
+                       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)
+                       printf("%s: TX overrun\n", sc->sc_dev.dv_xname);
+               epreset(sc);
+               return 0;
+       }
+
+       return 0;
+}
+
+
+static void
+eptxstat(sc)
+       register struct ep_softc *sc;
+{
+       int i;
+
+       /*
+        * We need to read+write TX_STATUS until we get a 0 status
+        * in order to turn off the interrupt flag.
+        */
+       while ((i = inb(BASE + EP_W1_TX_STATUS)) & TXS_COMPLETE) {
+               outb(BASE + 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)
+                               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)
+                               printf("%s: fifo underrun (%x) @%d\n",
+                                      sc->sc_dev.dv_xname, i,
+                                      sc->tx_start_thresh);
+                       if (sc->tx_succ_ok < 100)
+                                   sc->tx_start_thresh = min(ETHER_MAX_LEN,
+                                           sc->tx_start_thresh + 20);
+                       sc->tx_succ_ok = 0;
+                       epreset(sc);
+               } else if (i & TXS_MAX_COLLISION) {
+                       ++sc->sc_arpcom.ac_if.if_collisions;
+                       outw(BASE + EP_COMMAND, TX_ENABLE);
+                       sc->sc_arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+               } else
+                       sc->tx_succ_ok = (sc->tx_succ_ok+1) & 127;
+                       
+       }
+}
+
+int
+epintr(arg)
+       void *arg;
+{
+       register struct ep_softc *sc = arg;
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+       u_short status;
+       int ret = 0;
+
+       for (;;) {
+               outw(BASE + EP_COMMAND, C_INTR_LATCH);
+
+               status = inw(BASE + EP_STATUS);
+
+               if ((status & (S_TX_COMPLETE | S_TX_AVAIL |
+                              S_RX_COMPLETE | S_CARD_FAILURE)) == 0)
+                       break;
+
+               ret = 1;
+
+               /*
+                * Acknowledge any interrupts.  It's important that we do this
+                * first, since there would otherwise be a race condition.
+                * Due to the i386 interrupt queueing, we may get spurious
+                * interrupts occasionally.
+                */
+               outw(BASE + EP_COMMAND, ACK_INTR | status);
+
+               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);
+               }
+               if (status & S_CARD_FAILURE) {
+                       printf("%s: adapter failure (%x)\n",
+                              sc->sc_dev.dv_xname, status);
+                       epreset(sc);
+                       return (1);
+               }
+               if (status & S_TX_COMPLETE) {
+                       eptxstat(sc);
+                       epstart(ifp);
+               }
+       }       
+
+       /* no more interrupts */
+       return (ret);
+}
+
+void
+epread(sc)
+       register struct ep_softc *sc;
+{
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+       struct mbuf *m;
+       struct ether_header *eh;
+       int len;
+
+       len = inw(BASE + EP_W1_RX_STATUS);
+
+again:
+       if (ifp->if_flags & IFF_DEBUG) {
+               int err = len & ERR_MASK;
+               char *s = NULL;
+
+               if (len & ERR_INCOMPLETE)
+                       s = "incomplete packet";
+               else if (err == ERR_OVERRUN)
+                       s = "packet overrun";
+               else if (err == ERR_RUNT)
+                       s = "runt packet";
+               else if (err == ERR_ALIGNMENT)
+                       s = "bad alignment";
+               else if (err == ERR_CRC)
+                       s = "bad crc";
+               else if (err == ERR_OVERSIZE)
+                       s = "oversized packet";
+               else if (err == ERR_DRIBBLE)
+                       s = "dribble bits";
+
+               if (s)
+                       printf("%s: %s\n", sc->sc_dev.dv_xname, s);
+       }
+
+       if (len & ERR_INCOMPLETE)
+               return;
+
+       if (len & ERR_RX) {
+               ++ifp->if_ierrors;
+               goto abort;
+       }
+
+       len &= RX_BYTES_MASK;   /* Lower 11 bits = RX bytes. */
+
+       /* Pull packet off interface. */
+       m = epget(sc, len);
+       if (m == 0) {
+               ifp->if_ierrors++;
+               goto abort;
+       }
+
+       ++ifp->if_ipackets;
+
+       /* We assume the header fit entirely in one mbuf. */
+       eh = mtod(m, struct ether_header *);
+
+#if NBPFILTER > 0
+       /*
+        * Check if there's a BPF listener on this interface.
+        * If so, hand off the raw packet to BPF.
+        */
+       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 ((ifp->if_flags & IFF_PROMISC) &&
+                   (eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
+                   bcmp(eh->ether_dhost, sc->sc_arpcom.ac_enaddr,
+                           sizeof(eh->ether_dhost)) != 0) {
+                       m_freem(m);
+                       return;
+               }
+       }
+#endif
+
+       /* We assume the header fit entirely in one mbuf. */
+       m_adj(m, sizeof(struct ether_header));
+       ether_input(ifp, eh, m);
+
+       /*
+        * In periods of high traffic we can actually receive enough
+        * packets so that the fifo overrun bit will be set at this point,
+        * even though we just read a packet. In this case we
+        * are not going to receive any more interrupts. We check for
+        * this condition and read again until the fifo is not full.
+        * We could simplify this test by not using epstatus(), but
+        * rechecking the RX_STATUS register directly. This test could
+        * result in unnecessary looping in cases where there is a new
+        * packet but the fifo is not full, but it will not fix the
+        * stuck behavior.
+        *
+        * Even with this improvement, we still get packet overrun errors
+        * which are hurting performance. Maybe when I get some more time
+        * I'll modify epread() so that it can handle RX_EARLY interrupts.
+        */
+       if (epstatus(sc)) {
+               len = inw(BASE + EP_W1_RX_STATUS);
+               /* Check if we are stuck and reset [see XXX comment] */
+               if (len & ERR_INCOMPLETE) {
+                       if (ifp->if_flags & IFF_DEBUG)
+                               printf("%s: adapter reset\n",
+                                      sc->sc_dev.dv_xname);
+                       epreset(sc);
+                       return;
+               }
+               goto again;
+       }
+
+       return;
+
+abort:
+       outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK);
+       while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)
+               ;
+}
+
+struct mbuf *
+epget(sc, totlen)
+       struct ep_softc *sc;
+       int totlen;
+{
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+       struct mbuf *top, **mp, *m;
+       int len;
+       int sh;
+
+       m = sc->mb[sc->next_mb];
+       sc->mb[sc->next_mb] = 0;
+       if (m == 0) {
+               MGETHDR(m, M_DONTWAIT, MT_DATA);
+               if (m == 0)
+                       return 0;
+       } else {
+               /* If the queue is no longer full, refill. */
+               if (sc->last_mb == sc->next_mb)
+                       timeout(epmbuffill, sc, 1);
+               /* Convert one of our saved mbuf's. */
+               sc->next_mb = (sc->next_mb + 1) % MAX_MBS;
+               m->m_data = m->m_pktdat;
+               m->m_flags = M_PKTHDR;
+       }
+       m->m_pkthdr.rcvif = ifp;
+       m->m_pkthdr.len = totlen;
+       len = MHLEN;
+       top = 0;
+       mp = &top;
+
+       /*
+        * We read the packet at splhigh() so that an interrupt from another
+        * device doesn't cause the card's buffer to overflow while we're
+        * reading it.  We may still lose packets at other times.
+        */
+       sh = splhigh();
+
+       while (totlen > 0) {
+               if (top) {
+                       m = sc->mb[sc->next_mb];
+                       sc->mb[sc->next_mb] = 0;
+                       if (m == 0) {
+                               MGET(m, M_DONTWAIT, MT_DATA);
+                               if (m == 0) {
+                                       splx(sh);
+                                       m_freem(top);
+                                       return 0;
+                               }
+                       } else {
+                               sc->next_mb = (sc->next_mb + 1) % MAX_MBS;
+                       }
+                       len = MLEN;
+               }
+               if (totlen >= MINCLSIZE) {
+                       MCLGET(m, M_DONTWAIT);
+                       if (m->m_flags & M_EXT)
+                               len = MCLBYTES;
+               }
+               len = min(totlen, len);
+               if (EP_IS_BUS_32(sc->bustype)) {
+                       if (len > 3) {
+                               len &= ~3;
+                               insl(BASE + EP_W1_RX_PIO_RD_1,
+                                    mtod(m, caddr_t), len / 4);
+                       } else
+                               insb(BASE + EP_W1_RX_PIO_RD_1,
+                                    mtod(m, caddr_t), len);
+               } else {
+                       if (len > 1) {
+                               len &= ~1;
+                               insw(BASE + EP_W1_RX_PIO_RD_1,
+                                    mtod(m, caddr_t), len / 2);
+                       } else
+                               *(mtod(m, caddr_t)) =
+                                   inb(BASE + EP_W1_RX_PIO_RD_1);
+               }
+               m->m_len = len;
+               totlen -= len;
+               *mp = m;
+               mp = &m->m_next;
+       }
+
+       outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK);
+       while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)
+               ;
+
+       splx(sh);
+
+       return top;
+}
+
+int
+epioctl(ifp, cmd, data)
+       register struct ifnet *ifp;
+       u_long cmd;
+       caddr_t data;
+{
+       struct ep_softc *sc = ep_cd.cd_devs[ifp->if_unit];
+       struct ifaddr *ifa = (struct ifaddr *)data;
+       struct ifreq *ifr = (struct ifreq *)data;
+       int s, error = 0;
+
+       s = splnet();
+
+       if (sc->bustype == EP_BUS_PCMCIA &&
+           (sc->pcmcia_flags & EP_ABSENT)) {
+           if_down(ifp);
+           printf("%s: device offline\n", sc->sc_dev.dv_xname);
+           splx(s);
+           return ENXIO;
+       }
+
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
+       switch (cmd) {
+
+       case SIOCSIFADDR:
+               ifp->if_flags |= IFF_UP;
+
+               switch (ifa->ifa_addr->sa_family) {
+#ifdef INET
+               case AF_INET:
+                       epinit(sc);
+                       arp_ifinit(&sc->sc_arpcom, ifa);
+                       break;
+#endif
+               default:
+                       epinit(sc);
+                       break;
+               }
+               break;
+
+       case SIOCSIFFLAGS:
+               if ((ifp->if_flags & IFF_UP) == 0 &&
+                   (ifp->if_flags & IFF_RUNNING) != 0) {
+                       /*
+                        * If interface is marked down and it is running, then
+                        * stop it.
+                        */
+                       epstop(sc);
+                       ifp->if_flags &= ~IFF_RUNNING;
+               } else if ((ifp->if_flags & IFF_UP) != 0 &&
+                          (ifp->if_flags & IFF_RUNNING) == 0) {
+                       /*
+                        * If interface is marked up and it is stopped, then
+                        * start it.
+                        */
+                       epinit(sc);
+               } else {
+                       /*
+                        * deal with flags changes:
+                        * IFF_MULTICAST, IFF_PROMISC,
+                        * IFF_LINK0, IFF_LINK1,
+                        */
+                       epsetfilter(sc);
+                       epsetlink(sc);
+               }
+               break;
+
+       case SIOCADDMULTI:
+       case SIOCDELMULTI:
+               error = (cmd == SIOCADDMULTI) ?
+                   ether_addmulti(ifr, &sc->sc_arpcom) :
+                   ether_delmulti(ifr, &sc->sc_arpcom);
+
+               if (error == ENETRESET) {
+                       /*
+                        * Multicast list has changed; set the hardware filter
+                        * accordingly.
+                        */
+                       epreset(sc);
+                       error = 0;
+               }
+               break;
+
+       default:
+               error = EINVAL;
+               break;
+       }
+
+       splx(s);
+       return (error);
+}
+
+void
+epreset(sc)
+       struct ep_softc *sc;
+{
+       int s;
+
+       s = splnet();
+       epstop(sc);
+       epinit(sc);
+       splx(s);
+}
+
+void
+epwatchdog(unit)
+       int unit;
+{
+       struct ep_softc *sc = ep_cd.cd_devs[unit];
+
+       log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
+       ++sc->sc_arpcom.ac_if.if_oerrors;
+
+       epreset(sc);
+}
+
+void
+epstop(sc)
+       register struct ep_softc *sc;
+{
+
+       outw(BASE + EP_COMMAND, RX_DISABLE);
+       outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK);
+       while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)
+               ;
+       outw(BASE + EP_COMMAND, TX_DISABLE);
+       outw(BASE + EP_COMMAND, STOP_TRANSCEIVER);
+       outw(BASE + EP_COMMAND, RX_RESET);
+       outw(BASE + EP_COMMAND, TX_RESET);
+       outw(BASE + EP_COMMAND, C_INTR_LATCH);
+       outw(BASE + EP_COMMAND, SET_RD_0_MASK);
+       outw(BASE + EP_COMMAND, SET_INTR_MASK);
+       outw(BASE + EP_COMMAND, SET_RX_FILTER);
+
+       epmbufempty(sc);
+}
+
+/*
+ * We get eeprom data from the id_port given an offset into the
+ * eeprom.  Basically; after the ID_sequence is sent to all of
+ * the cards; they enter the ID_CMD state where they will accept
+ * command requests. 0x80-0xbf loads the eeprom data.  We then
+ * read the port 16 times and with every read; the cards check
+ * for contention (ie: if one card writes a 0 bit and another
+ * writes a 1 bit then the host sees a 0. At the end of the cycle;
+ * each card compares the data on the bus; if there is a difference
+ * then that card goes into ID_WAIT state again). In the meantime;
+ * one bit of data is returned in the AX register which is conveniently
+ * returned to us by inb().  Hence; we read 16 times getting one
+ * bit of data with each read.
+ */
+static u_short
+epreadeeprom(id_port, offset)
+       int     id_port;
+       int     offset;
+{
+       int i, data = 0;
+
+       outb(id_port, 0x80 + offset);
+       delay(1000);
+       for (i = 0; i < 16; i++)
+               data = (data << 1) | (inw(id_port) & 1);
+       return (data);
+}
+
+static int
+epbusyeeprom(sc)
+       struct ep_softc *sc;
+{
+       int i = 100, j;
+
+       if (sc->bustype == EP_BUS_PCMCIA) {
+               delay(1000);
+               return 0;
+       }
+
+       while (i--) {
+               j = inw(BASE + EP_W0_EEPROM_COMMAND);
+               if (j & EEPROM_BUSY)
+                       delay(100);
+               else
+                       break;
+       }
+       if (!i) {
+               printf("\n%s: eeprom failed to come ready\n",
+                   sc->sc_dev.dv_xname);
+               return (1);
+       }
+       if (j & EEPROM_TST_MODE) {
+               printf("\n%s: erase pencil mark, or disable plug-n-play mode!\n",
+                   sc->sc_dev.dv_xname);
+               return (1);
+       }
+       return (0);
+}
+
+void
+epmbuffill(arg)
+       void *arg;
+{
+       struct ep_softc *sc = arg;
+       int s, i;
+
+       s = splnet();
+       i = sc->last_mb;
+       do {
+               if (sc->mb[i] == NULL)
+                       MGET(sc->mb[i], M_DONTWAIT, MT_DATA);
+               if (sc->mb[i] == NULL)
+                       break;
+               i = (i + 1) % MAX_MBS;
+       } while (i != sc->next_mb);
+       sc->last_mb = i;
+       /* If the queue was not filled, try again. */
+       if (sc->last_mb != sc->next_mb)
+               timeout(epmbuffill, sc, 1);
+       splx(s);
+}
+
+void
+epmbufempty(sc)
+       struct ep_softc *sc;
+{
+       int s, i;
+
+       s = splnet();
+       for (i = 0; i<MAX_MBS; i++) {
+               if (sc->mb[i]) {
+                       m_freem(sc->mb[i]);
+                       sc->mb[i] = NULL;
+               }
+       }
+       sc->last_mb = sc->next_mb = 0;
+       untimeout(epmbuffill, sc);
+       splx(s);
+}
index 6891551..ddb6a3a 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
index 3c8a4f7..041544a 100644 (file)
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
@@ -1936,6 +1931,11 @@ fe_ioctl(ifp, command, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (command) {
 
        case SIOCSIFADDR:
@@ -1947,23 +1947,6 @@ fe_ioctl(ifp, command, data)
                        fe_init(sc);
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                   {
-                       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);
-                       else
-                               bcopy(ina->x_host.c_host,
-                                   sc->sc_arpcom.ac_enaddr,
-                                   sizeof(sc->sc_arpcom.ac_enaddr));
-                       /* Set new address. */
-                       fe_init(sc);
-                       break;
-                   }
 #endif
                default:
                        fe_init(sc);
index 96cf87f..c4e48e2 100644 (file)
@@ -1,4 +1,4 @@
-/*    $OpenBSD: if_hp.c,v 1.3 1996/03/08 16:43:03 niklas Exp $       */
+/*    $OpenBSD: if_hp.c,v 1.4 1996/05/05 13:38:41 mickey Exp $       */
 /*    $NetBSD: if_hp.c,v 1.21 1995/12/24 02:31:31 mycroft Exp $       */
 
 /* XXX THIS DRIVER IS BROKEN.  IT WILL NOT EVEN COMPILE. */
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include "bpfilter.h"
 #if NBPFILTER > 0
 #include <sys/select.h>
@@ -929,6 +924,10 @@ hpioctl(ifp, cmd, data)
        struct ifreq *ifr = (struct ifreq *) data;
        int     s = splnet(), error = 0;
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
 
        switch (cmd) {
 
@@ -943,27 +942,6 @@ hpioctl(ifp, cmd, data)
                            IA_SIN(ifa)->sin_addr;
                        arpwhohas((struct arpcom *) ifp, &IA_SIN(ifa)->sin_addr);
                        break;
-#endif
-#ifdef NS
-               case AF_NS:
-                       {
-                               register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr);
-
-                               if (ns_nullhost(*ina))
-                                       ina->x_host = *(union ns_host *) (ns->ns_addrp);
-                               else {
-                                       /*
-                                                        * The manual says we can't change the address
-                                                        * while the receiver is armed,
-                                                        * so reset everything
-                                                        */
-                                       ifp->if_flags &= ~IFF_RUNNING;
-                                       bcopy((caddr_t) ina->x_host.c_host,
-                                           (caddr_t) ns->ns_addrp, sizeof(ns->ns_addrp));
-                               }
-                               hpinit(ifp->if_unit);   /* does hp_setaddr() */
-                               break;
-                       }
 #endif
                default:
                        hpinit(ifp->if_unit);
index 49cd7b2..d224f87 100644 (file)
@@ -1,4 +1,4 @@
-/*    $OpenBSD: if_ie.c,v 1.7 1996/04/21 22:24:03 deraadt Exp $       */
+/*    $OpenBSD: if_ie.c,v 1.8 1996/05/05 13:38:46 mickey Exp $       */
 /*     $NetBSD: if_ie.c,v 1.47 1996/04/11 22:29:27 cgd Exp $   */
 
 /*-
@@ -138,11 +138,6 @@ iomem, and to make 16-pointers, we subtract sc_maddr and and with 0xffff.
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <vm/vm.h>
 
 #include <machine/cpu.h>
@@ -2122,6 +2117,11 @@ ieioctl(ifp, cmd, data)
 
        s = splnet();
 
+       if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+               splx(s);
+               return error;
+       }
+
        switch (cmd) {
 
        case SIOCSIFADDR:
@@ -2134,24 +2134,6 @@ ieioctl(ifp, cmd, data)
                        arp_ifinit(&sc->sc_arpcom, ifa);
                        break;
 #endif
-#ifdef NS
-               /* XXX - This code is probably wrong. */
-               case AF_NS:
-                   {
-                       struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
-
-                       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));
-                       /* Set new address. */
-                       ieinit(sc);
-                       break;
-                   }
-#endif /* NS */
                default:
                        ieinit(sc);
                        break;
index 0eaa370..bf310e4 100644 (file)
@@ -1,4 +1,4 @@
-/*    $OpenBSD: if_de.c,v 1.6 1996/04/21 22:25:13 deraadt Exp $       */
+/*    $OpenBSD: if_de.c,v 1.7 1996/05/05 13:38:58 mickey Exp $       */
 /*    $NetBSD: if_de.c,v 1.17 1996/04/01 19:37:54 cgd Exp $       */
 
 /*-
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #include <vm/vm.h>
 #include <vm/vm_kern.h>
 #include <vm/vm_param.h>
@@ -1942,6 +1937,11 @@ tulip_ioctl(
 
     s = splnet();
 
+    if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
+       splx(s);
+       return error;
+    }
+
     switch (cmd) {
        case SIOCSIFADDR: {
            ifp->if_flags |= IFF_UP;
@@ -1955,27 +1955,6 @@ tulip_ioctl(
                }
 #endif /* INET */
 
-#ifdef NS
-               /*
-                * This magic copied from if_is.c; I don't use XNS,
-                * so I have no way of telling if this actually
-                * works or not.
-                */
-               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);
-                   } 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);
-                   }
-                   tulip_init(sc);
-                   break;
-               }
-#endif /* NS */
-
                default: {
                    tulip_init(sc);
                    break;
index 9c81c92..94f0270 100644 (file)
 #include <netinet/if_ether.h>
 #endif
  
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-  
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
index b3595aa..22d6998 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ep_pcmcia.c,v 1.1 1996/05/03 07:58:23 deraadt Exp $       */
+/*     $OpenBSD: if_ep_pcmcia.c,v 1.2 1996/05/05 13:39:22 mickey Exp $       */
 /*     $NetBSD: if_ep.c,v 1.90 1996/04/11 22:29:15 cgd Exp $   */
 
 /*
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef NS
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
 #if NBPFILTER > 0
 #include <net/bpf.h>
 #include <net/bpfdesc.h>
index 07b7748..b1a6713 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ethersubr.c,v 1.8 1996/05/02 13:45:45 deraadt Exp $        */
+/*     $OpenBSD: if_ethersubr.c,v 1.9 1996/05/05 13:39:50 mickey Exp $ */
 /*     $NetBSD: if_ethersubr.c,v 1.18 1996/02/13 22:00:14 christos Exp $       */
 
 /*
 #endif
 
 #if defined(LLC) && defined(CCITT)
-extern struct ifqueue pkintrq;
+#include <sys/socketvar.h>
+#include <netccitt/x25.h>
 #endif
 
 u_char etherbroadcastaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 #define senderr(e) { error = (e); goto bad;}
 
+
+int
+ether_ioctl(ifp, arp, cmd, data)
+       register struct ifnet *ifp;
+       struct arpcom *arp;
+       u_long cmd;
+       caddr_t data;
+{
+       struct ifaddr *ifa = (struct ifaddr *)data;
+       struct ifreq *ifr = (struct ifreq *)data;
+
+       switch (cmd) {
+
+#if    defined(CCITT) && defined(LLC)
+       case SIOCSIFCONF_X25:
+               ifp->if_flags |= IFF_UP;
+               ifa->ifa_rtrequest = cons_rtrequest;
+               error = x25_llcglue(PRC_IFUP, ifa->ifa_addr);
+               break;
+#endif /* CCITT && LLC */
+       case SIOCSIFADDR:
+               switch (ifa->ifa_addr->sa_family) {
+#ifdef IPX
+               case AF_IPX:
+                   {
+                       struct ipx_addr *ina = &IA_SIPX(ifa)->sipx_addr;
+
+                       if (ipx_nullhost(*ina))
+                               ina->ipx_host =
+                                       *(union ipx_host *)(arp->ac_enaddr);
+                       else
+                               bcopy (ina->ipx_host.c_host,
+                                      arp->ac_enaddr, sizeof(arp->ac_enaddr));
+                       break;
+                   }
+#endif /* IPX */
+#ifdef NS
+               /* XXX - This code is probably wrong. */
+               case AF_NS:
+                   {
+                       struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
+
+                       if (ns_nullhost(*ina))
+                               ina->x_host =
+                                       *(union ns_host *)(arp->ac_enaddr);
+                       else
+                               bcopy(ina->x_host.c_host,
+                                     arp->ac_enaddr, sizeof(arp->ac_enaddr));
+                       break;
+                   }
+#endif /* NS */
+               }
+               break;
+
+       default:
+               break;
+       }
+       return 0;
+}
+
 /*
  * Ethernet output routine.
  * Encapsulate a packet of type family for the local net.
@@ -163,8 +224,8 @@ ether_output(ifp, m0, dst, rt0)
 #endif
 #ifdef IPX
        case AF_IPX:
-               etype = htons(ETHERTYPE_IPX);
-               bcopy((caddr_t)&(((struct sockaddr_ipx *)dst)->sipx_addr.ipx_host),
+               etype = htons(satosipx(dst)->sipx_type);
+               bcopy((caddr_t)&satosipx(dst)->sipx_addr.ipx_host,
                    (caddr_t)edst, sizeof (edst));
                if (!bcmp((caddr_t)edst, (caddr_t)&ipx_thishost, sizeof(edst)))
                        return (looutput(ifp, m, dst, rt));
@@ -367,7 +428,11 @@ ether_input(ifp, eh, m)
                return;
 #endif
 #ifdef IPX
-       case ETHERTYPE_IPX:
+       case ETHERTYPE_8022:
+       case ETHERTYPE_8022TR:
+       case ETHERTYPE_8023:
+       case ETHERTYPE_SNAP:
+       case ETHERTYPE_II:
                schednetisr(NETISR_IPX);
                inq = &ipxintrq;
                break;