--- Net2/arch/i386/isa/if_we.c 2018/04/24 18:12:06 1.1.1.3 +++ Net2/arch/i386/isa/if_we.c 2018/04/24 18:20:09 1.1.1.4 @@ -33,17 +33,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)if_we.c 7.3 (Berkeley) 5/21/91 - * - * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE - * -------------------- ----- ---------------------- - * CURRENT PATCH LEVEL: 3 00047 - * -------------------- ----- ---------------------- - * - * 20 Sep 92 Barry Lustig WD8013 16 bit mode -- enable - * with "option WD8013". - * 19 Sep 92 Michael Galassi Fixed multiboard routing - * 09 Sep 92 Mike Durkin Fix Danpex EW-2016 & other 8013 clones + * from: @(#)if_we.c 7.3 (Berkeley) 5/21/91 + * if_we.c,v 1.10 1993/05/20 10:40:48 deraadt Exp */ /* @@ -53,18 +44,28 @@ * * 92.09.19 - Changes to allow multiple we interfaces in one box. * Allowed interupt handler to look at unit other than 0 - * Bdry was static, made it into an array w/ one entry per - * interface. nerd@percival.rain.com (Michael Galassi) * * BPF Packet Filter Support added by Marc Frajola, 12/30/92 * Input & other routines re-written by David Greenman, 1/2/93 * BPF trailer support added by David Greenman, 1/7/93 * - * $Log: if_we.c,v $ - * Revision 1.1.1.3 2018/04/24 18:12:06 root - * NetBSD 0.8 + * if_we.c,v + * Revision 1.10 1993/05/20 10:40:48 deraadt + * we driver prints same ethernet address message as other drivers + * + * Revision 1.9 1993/05/18 18:19:01 cgd + * make kernel select interface be one-stop shopping & clean it all up. + * + * Revision 1.8 1993/05/01 19:12:45 mycroft + * Fix error in last change. B-P + * + * Revision 1.7 1993/04/30 23:48:35 mycroft + * Move bpfattach() call into weattach(). * - * Revision 1.5 1993/04/10 15:58:56 glass + * Revision 1.6 1993/04/29 09:33:21 mycroft + * Fix total bogosity in the receiver code. + * + * Revision 1.5 1993/04/10 15:58:56 glass * Fixed so they are useable when compiled with options NS. Not that I know * anyone who will..... * @@ -99,6 +100,7 @@ #include "ioctl.h" #include "errno.h" #include "syslog.h" +#include "select.h" #include "net/if.h" #include "net/if_types.h" @@ -158,9 +160,6 @@ struct we_softc { u_char we_flags; /* software state */ #define WDF_RUNNING 0x01 #define WDF_TXBUSY 0x02 -#if NBPFILTER > 0 -#define WDF_ATTACHED 0x80 -#endif u_char we_type; /* interface type code */ u_short we_vector; /* interrupt vector */ @@ -172,6 +171,10 @@ struct we_softc { caddr_t we_vmem_ring; /* receive ring RAM vaddress */ caddr_t we_vmem_end; /* receive ring RAM end */ caddr_t we_bpf; /* Magic Cookie for BPF */ + +#ifdef WEDEBUG + int fae, crc, mpa; +#endif } we_softc[NWE]; int weprobe(), weattach(), weintr(), westart(); @@ -346,16 +349,21 @@ weattach(is) bcopy(sc->we_addr, LLADDR(sdl), ETHER_ADDR_LEN); } -#if NBPFILTER > 0 - sc->we_flags &= ~WDF_ATTACHED; /* Make sure BPF attach flag clear */ +#ifdef WEDEBUG + sc->fae = sc->crc = sc->mpa = 0; #endif /* * Banner... */ - printf("we%d: %saddr %s\n", is->id_unit, - (sc->we_type & WD_ETHERNET) ? "enet" : "slan", + printf("we%d: %s address %s\n", is->id_unit, + (sc->we_type & WD_ETHERNET) ? "ethernet" : "starlan", ether_sprintf(sc->we_addr)); + +#if NBPFILTER > 0 + bpfattach(&sc->we_bpf, ifp, DLT_EN10MB, + sizeof(struct ether_header)); +#endif } /* @@ -401,7 +409,6 @@ wewatchdog(unit) { weinit(unit);*/ } -static Bdry[NWE]; /* 19 Sep 92*/ /* * Initialization of interface (really just DS8390). */ @@ -413,14 +420,6 @@ weinit(unit) union we_command wecmd; int i, s; -#if NBPFILTER > 0 - if ((sc->we_flags & WDF_ATTACHED) == 0) { - bpfattach(&sc->we_bpf, ifp, DLT_EN10MB, - sizeof(struct ether_header)); - sc->we_flags |= WDF_ATTACHED; - } -#endif - /* address not known */ if (ifp->if_addrlist == (struct ifaddr *)0) return; @@ -433,7 +432,6 @@ weinit(unit) * this is stock code...please see the National manual for details. */ s = splhigh(); - Bdry[unit] = 0; /* 19 Sep 92*/ wecmd.cs_byte = inb(sc->we_io_nic_addr + WD_P0_COMMAND); wecmd.cs_stp = 1; wecmd.cs_sta = 0; @@ -462,7 +460,7 @@ weinit(unit) outb(sc->we_io_nic_addr + WD_P1_PAR0 + i, sc->we_addr[i]); for (i = 0; i < ETHER_ADDR_LEN; ++i) /* == broadcast addr */ outb(sc->we_io_nic_addr + WD_P1_MAR0 + i, 0xff); - outb(sc->we_io_nic_addr + WD_P1_CURR, WD_TXBUF_SIZE); + outb(sc->we_io_nic_addr + WD_P1_CURR, WD_TXBUF_SIZE + 1); wecmd.cs_ps = 0; wecmd.cs_stp = 0; wecmd.cs_sta = 1; @@ -638,11 +636,19 @@ loop: /* receiver error */ if (weisr.is_rxe) { + ++sc->we_if.if_ierrors; /* need to read these registers to clear status */ +#ifndef WEDEBUG (void) inb(sc->we_io_nic_addr + 0xD); (void) inb(sc->we_io_nic_addr + 0xE); (void) inb(sc->we_io_nic_addr + 0xF); - ++sc->we_if.if_ierrors; +#else + sc->fae += inb(sc->we_io_nic_addr + 0xD); + sc->crc += inb(sc->we_io_nic_addr + 0xE); + sc->mpa += inb(sc->we_io_nic_addr + 0xF); + printf ("we%d: ierr %d fae %d crc %d mpa\n", + unit, sc->fae, sc->crc, sc->mpa); +#endif } /* normal transmit complete */ @@ -702,11 +708,11 @@ werint(unit) wecmd.cs_ps = 0; outb(sc->we_io_nic_addr + WD_P0_COMMAND, wecmd.cs_byte); bnry = inb(sc->we_io_nic_addr + WD_P0_BNRY); + if (++bnry >= sc->we_vmem_size / WD_PAGE_SIZE) + bnry = WD_TXBUF_SIZE; wecmd.cs_ps = 1; outb(sc->we_io_nic_addr + WD_P0_COMMAND, wecmd.cs_byte); curr = inb(sc->we_io_nic_addr + WD_P1_CURR); - if(Bdry[unit]) /* 19 Sep 92*/ - bnry = Bdry[unit]; while (bnry != curr) { @@ -724,32 +730,23 @@ outofbufs: wecmd.cs_ps = 0; outb(sc->we_io_nic_addr + WD_P0_COMMAND, wecmd.cs_byte); - /* advance on chip Boundry register */ - if((caddr_t) wer + WD_PAGE_SIZE - 1 > sc->we_vmem_end) { + if (len > 30 && len <= ETHERMTU+100) + bnry = wer->we_next_packet; + else bnry = curr; + + /* watch out for NIC overflow, reset Boundry if invalid */ + if ((bnry - 1) < WD_TXBUF_SIZE) { + outb(sc->we_io_nic_addr + WD_P0_BNRY, + (sc->we_vmem_size / WD_PAGE_SIZE) - 1); bnry = WD_TXBUF_SIZE; - outb(sc->we_io_nic_addr + WD_P0_BNRY, - sc->we_vmem_size / WD_PAGE_SIZE-1); - - } else { - if (len > 30 && len <= ETHERMTU+100) - bnry = wer->we_next_packet; - else bnry = curr; - - /* watch out for NIC overflow, reset Boundry if invalid */ - if ((bnry - 1) < WD_TXBUF_SIZE) { - outb(sc->we_io_nic_addr + WD_P0_BNRY, - (sc->we_vmem_size / WD_PAGE_SIZE) - 1); - bnry = WD_TXBUF_SIZE; - } else - outb(sc->we_io_nic_addr + WD_P0_BNRY, bnry-1); - } + } else + outb(sc->we_io_nic_addr + WD_P0_BNRY, bnry-1); /* refresh our copy of CURR */ wecmd.cs_ps = 1; outb(sc->we_io_nic_addr + WD_P0_COMMAND, wecmd.cs_byte); curr = inb(sc->we_io_nic_addr + WD_P1_CURR); } - Bdry[unit] = bnry; /* 19 Sep 92*/ } /*