diff options
Diffstat (limited to 'i386')
-rw-r--r-- | i386/bogus/ne.h | 1 | ||||
-rw-r--r-- | i386/i386at/autoconf.c | 13 | ||||
-rw-r--r-- | i386/i386at/conf.c | 20 | ||||
-rw-r--r-- | i386/i386at/if_ne.c | 1081 | ||||
-rw-r--r-- | i386/i386at/if_nereg.h | 66 |
5 files changed, 0 insertions, 1181 deletions
diff --git a/i386/bogus/ne.h b/i386/bogus/ne.h deleted file mode 100644 index 607585b..0000000 --- a/i386/bogus/ne.h +++ /dev/null @@ -1 +0,0 @@ -#define NNE 2 diff --git a/i386/i386at/autoconf.c b/i386/i386at/autoconf.c index 5efc00a..5f49361 100644 --- a/i386/i386at/autoconf.c +++ b/i386/i386at/autoconf.c @@ -59,12 +59,6 @@ extern struct bus_driver eaha_driver; extern int eaha_intr(); #endif /* NEAHA */ -#include <ne.h> -#if NNE > 0 -extern struct bus_driver nedriver; -extern int neintr(); -#endif /* NNE */ - #include <ns8390.h> #if NNS8390 > 0 extern struct bus_driver ns8390driver; @@ -257,13 +251,6 @@ struct bus_device bus_device_init[] = { { &eaha_driver, "tz", 7, 0, 0x0,0, 0, '?', 0, 0, 7, 0, }, #endif /* NEAHA > 0*/ -#if NNE > 0 -{&nedriver, "ne", 0, neintr, 0x280,0x4000,0xd0000, - '?', 0, -1, -1, 0, 0, 0, SPL_SIX, 5}, -{&nedriver, "ne", 1, neintr, 0x300,0x4000,0xd0000, - '?', 0, -1, -1, 0, 0, 0, SPL_SIX, 10}, -#endif /* NNE > 0 */ - #if NNS8390 > 0 /* "wd" and "el" */ {&ns8390driver, "wd", 0, ns8390intr, 0x280,0x2000,0xd0000, diff --git a/i386/i386at/conf.c b/i386/i386at/conf.c index de45d23..3090aa3 100644 --- a/i386/i386at/conf.c +++ b/i386/i386at/conf.c @@ -54,15 +54,6 @@ extern int wtopen(), wtread(), wtwrite(), wtclose(); #define wtname "wt" #endif /* NWT > 0 */ -#include <ne.h> -#if NNE > 0 -extern int neopen(), neoutput(), negetstat(), nesetstat(), nesetinput(); -#ifdef FIPC -extern int nefoutput(); -#endif /* FIPC */ -#define nename "ne" -#endif /* NNE > 0 */ - #include <ns8390.h> #if NNS8390 > 0 extern int wd8003open(), eliiopen(); @@ -217,17 +208,6 @@ struct dev_ops dev_name_list[] = nodev }, #endif /* NWT > 0 */ -#if NNE > 0 - { nename, neopen, nulldev, nulldev, - neoutput, negetstat, nesetstat, nulldev, -#ifdef FIPC - nesetinput, nulldev, nefoutput, 0, -#else - nesetinput, nulldev, nulldev, 0, -#endif /* FIPC */ - nodev }, -#endif - #if NAT3C501 > 0 { at3c501name, at3c501open, nulldev, nulldev, at3c501output,at3c501getstat, at3c501setstat, nomap, diff --git a/i386/i386at/if_ne.c b/i386/i386at/if_ne.c deleted file mode 100644 index 9a950d6..0000000 --- a/i386/i386at/if_ne.c +++ /dev/null @@ -1,1081 +0,0 @@ -/*- - * Copyright (c) 1990, 1991 William F. Jolitz. - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if_ne.c 7.4 (Berkeley) 5/21/91 - */ - -/* - * NE2000 Ethernet driver - * - * Parts inspired from Tim Tucker's if_wd driver for the wd8003, - * insight on the ne2000 gained from Robert Clements PC/FTP driver. - */ - -#include <ne.h> - - -#if NNE > 0 -#ifdef MACH_KERNEL - -#include <kern/time_out.h> -#include <device/device_types.h> -#include <device/errno.h> -#include <device/io_req.h> -#include <device/if_hdr.h> -#include <device/if_ether.h> -#include <device/net_status.h> -#include <device/net_io.h> -#include <i386at/ds8390.h> -#include <i386at/if_nereg.h> -#include <i386/ipl.h> -#include <chips/busses.h> -#ifdef FIPC -#include <ipc/fipc.h> -#endif /* FIPC */ - -#else MACH_KERNEL - -#include <sys/param.h> -#include <mach/vm_param.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/table.h> -#include <sys/buf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/vmmac.h> -#include <sys/ioctl.h> -#include <sys/errno.h> -#include <sys/syslog.h> -#include <vm/vm_kern.h> - -#include <net/if.h> -#include <net/if_types.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/in_var.h> -#include <netinet/ip.h> -#include <netinet/if_ether.h> - -#include <netns/ns.h> -#include <netns/ns_if.h> - - -#include <i386/ipl.h> -#include <i386at/atbus.h> -#include <i386at/ds8390.h> -#include <i386at/if_nereg.h> -#include <i386/handler.h> -#include <i386/dispatcher.h> -int ether_output(); -int neioctl(); - -#endif - - -int neprobe(); -void neattach(); -int neintr(); -int nestart(); -int neinit(); - -static vm_offset_t ne_std[NNE] = {0}; -static struct bus_device *ne_info[NNE]; -struct bus_driver nedriver = - { neprobe, 0, neattach, 0, ne_std, "ne", ne_info, 0, 0, 0 }; - -#define ETHER_MIN_LEN 64 -#define ETHER_MAX_LEN 1536 -#define SPLNET spl6 -/* - * Ethernet software status per interface. - * - * Each interface is referenced by a network interface structure, - * ns_if, which the routing code uses to locate the interface. - * This structure contains the output queue for the interface, its address, ... - */ -typedef struct { - -#ifdef MACH_KERNEL - struct ifnet ds_if; - u_char ds_addr[6]; -#else MACH_KERNEL - struct arpcom ns_ac; /* Ethernet common part */ -#define ds_if ns_ac.ac_if /* network-visible interface */ -#define ds_addr ns_ac.ac_enaddr /* hardware Ethernet address */ -#endif MACH_KERNEL - - int ns_flags; -#define DSF_LOCK 1 /* block re-entering enstart */ -#define DSF_RUNNING 2 - int ns_oactive ; - int ns_mask ; - int ns_ba; /* byte addr in buffer ram of inc pkt */ - int ns_cur; /* current page being filled */ - struct prhdr ns_ph; /* hardware header of incoming packet*/ - struct ether_header ns_eh; /* header of incoming packet */ - u_char ns_pb[2048 /*ETHERMTU+sizeof(long)*/]; - short ns_txstart; /* transmitter buffer start */ - short ns_rxend; /* recevier buffer end */ - short ns_rxbndry; /* recevier buffer boundary */ - caddr_t ns_port; /* i/o port base */ - short ns_mode; /* word/byte mode */ - int mode; - short card_present; -#ifndef MACH_KERNEL - ihandler_t handler; - ihandler_id_t *handler_id; -#endif MACH_KERNEL - -} ne_softc_t; -ne_softc_t ne_softc[NNE]; - -#define PAT(n) (0xa55a + 37*(n)) - -u_short boarddata[16]; - -/* - * Fetch from onboard ROM/RAM - */ -nefetch (ns, up, ad, len) ne_softc_t *ns; caddr_t up; { - u_char cmd; - caddr_t nec = ns->ns_port; - int counter = 10000; - int t_len; - unsigned char last_word[2]; - char odd; - - cmd = inb (nec + ds_cmd); - outb (nec + ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_START); - - /* Setup remote dma */ - outb (nec + ds0_isr, DSIS_RDC); - - t_len = len; - if ((ns->ns_mode & DSDC_WTS) && len&1) { - odd=1; - t_len++; /* roundup to words */ - } else odd=0; - - outb (nec+ds0_rbcr0, t_len); - outb (nec+ds0_rbcr1, t_len>>8); - outb (nec+ds0_rsar0, ad); - outb (nec+ds0_rsar1, ad>>8); - - /* Execute & extract from card */ - outb (nec+ds_cmd, DSCM_RREAD|DSCM_PG0|DSCM_START); - - if (ns->ns_mode & DSDC_WTS) - if (odd) { - linw (nec+ne_data, up, len/2); - *(last_word) = inw(nec+ne_data); /* get last word */ - *(up+len-1) = last_word[0]; /* last byte */ - } else { - linw (nec+ne_data, up, len/2); - } - else - linb (nec+ne_data, up, len); - - - /* Wait till done, then shutdown feature */ - while ((inb (nec+ds0_isr) & DSIS_RDC) == 0 && counter-- > 0) - ; - - outb (nec+ds0_isr, DSIS_RDC); - outb (nec+ds_cmd, cmd); -} - -/* - * Put to onboard RAM - */ -neput (ns, up, ad, len) ne_softc_t *ns; caddr_t up; { - u_char cmd; - caddr_t nec = ns->ns_port; - int counter = 10000; - int t_len; - int odd; - unsigned char last_word[2]; - - cmd = inb(nec+ds_cmd); - outb (nec+ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_START); - - /* Setup for remote dma */ - outb (nec+ds0_isr, DSIS_RDC); - - t_len = len; - if ((ns->ns_mode & DSDC_WTS) && len&1) { - odd = 1; - t_len++; /* roundup to words */ - } else odd = 0; - - outb (nec+ds0_rbcr0, t_len); - outb (nec+ds0_rbcr1, t_len>>8); - outb (nec+ds0_rsar0, ad); - outb (nec+ds0_rsar1, ad>>8); - - /* Execute & stuff to card */ - outb (nec+ds_cmd, DSCM_RWRITE|DSCM_PG0|DSCM_START); - if (ns->ns_mode & DSDC_WTS) { - if (odd) { - loutw (nec+ne_data, up, len/2); - last_word[0] = *(up+len-1); - outw (nec+ne_data, (unsigned short) *(last_word)); - } - else { - loutw (nec+ne_data, up, len/2); - } - } - else - loutb (nec+ne_data, up, len); - - - /* Wait till done, then shutdown feature */ - while ((inb (nec+ds0_isr) & DSIS_RDC) == 0 && counter-- > 0) - ; - - outb (nec+ds0_isr, DSIS_RDC); - outb (nec+ds_cmd, cmd); -} - -int -neprobe(port, dev) -struct bus_device *dev; -{ - int val, i, sum, bytemode = 1, pat; - int unit = dev->unit; - ne_softc_t *ns = &ne_softc[unit]; - caddr_t nec; - - if ((unsigned) unit >= NNE) - return(0); - - nec = (caddr_t) ns->ns_port = dev->address; - - if (ns->card_present) { - printf("ne%s : card already present in port %x\n", - unit, nec); - return(0); - } - - if (bytemode) { - /* Byte Transfers, Burst Mode Select, Fifo at 8 bytes */ - ns->ns_mode = DSDC_BMS|DSDC_FT1; - ns->ns_txstart = TBUF8; - ns->ns_rxend = RBUFEND8; - } else { -word: - /* Word Transfers, Burst Mode Select, Fifo at 8 bytes */ - ns->ns_mode = DSDC_WTS|DSDC_BMS|DSDC_FT1; - ns->ns_txstart = TBUF16; - ns->ns_rxend = RBUFEND16; - bytemode = 0; - } - - /* Reset the bastard */ - val = inb(nec + ne_reset); - delay(200); - outb(nec + ne_reset, val); - delay(200); - - outb(nec + ds_cmd, DSCM_STOP|DSCM_NODMA); - - i = 10000; - while ((inb(nec + ds0_isr) & DSIS_RESET) == 0 && i-- > 0); - if (i < 0) return (0); - - outb(nec + ds0_isr, 0xff); - outb(nec + ds0_dcr, ns->ns_mode); - outb(nec + ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_STOP); - delay(1000); - - /* Check cmd reg and fail if not right */ - if ((i = inb(nec + ds_cmd)) != (DSCM_NODMA|DSCM_PG0|DSCM_STOP)) - return(0); - - outb(nec + ds0_tcr, DSTC_LB0); - outb(nec + ds0_rcr, DSRC_MON); - outb(nec + ds0_pstart, ns->ns_txstart+PKTSZ); - outb(nec + ds0_pstop, ns->ns_rxend); - outb(nec + ds0_bnry, ns->ns_rxend); - outb(nec + ds0_imr, 0); - outb(nec + ds0_isr, 0); - outb(nec + ds_cmd, DSCM_NODMA|DSCM_PG1|DSCM_STOP); - outb(nec + ds1_curr, ns->ns_txstart+PKTSZ); - outb(nec + ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_STOP); - -#ifdef NEDEBUG -#define RCON 37 - { int i, rom; - - rom=1; - printf("ne ram "); - - for (i = 0; i < 0xfff0; i+=4) { - pat = PAT(i); - neput(ns, &pat,i,4); - nefetch(ns, &pat,i,4); - if (pat == PAT(i)) { - if (rom) { - rom=0; - printf(" %x", i); - } - } else { - if (!rom) { - rom=1; - printf("..%x ", i); - } - } - pat=0; - neput(ns, &pat,i,4); - } - printf("\n"); - } -#endif - - /* - * <groan> detect difference between units - * solely by where the RAM is decoded. - */ - pat = PAT(0); - neput (ns, &pat, ns->ns_txstart*DS_PGSIZE, 4); - nefetch(ns, &pat, ns->ns_txstart*DS_PGSIZE, 4); - if (pat != PAT(0)) { - if (bytemode) - goto word; - else return (0); - } - - - /* Extract board address */ - nefetch (ns, (caddr_t)boarddata, 0, sizeof(boarddata)); - - for(i=0; i < 6; i++) - ns->ds_addr[i] = boarddata[i]; - ns->card_present = 1; - return (1); -} - -/* - * Interface exists: make available by filling in network interface - * record. System will initialize the interface when it is ready - * to accept packets. We get the ethernet address here. - */ -void -neattach(dev) -struct bus_device *dev; -{ - short unit = dev->unit; - ne_softc_t *ns = &ne_softc[unit]; - register struct ifnet *ifp = &(ns->ds_if); - - if ((unsigned) unit >= NNE) - return; - -#ifdef MACH_KERNEL - take_dev_irq(dev); -#else MACH_KERNEL - /* setup intr handler */ - ns->handler.ih_level = dev->dev_pic; - ns->handler.ih_handler = dev->dev_intr[0]; - ns->handler.ih_resolver = i386_resolver; - ns->handler.ih_rdev = dev; - ns->handler.ih_stats.intr_type = INTR_DEVICE; - ns->handler.ih_stats.intr_cnt = 0; - ns->handler.ih_hparam[0].intparam = unit; - if ((ns->handler_id = handler_add(&ns->handler)) != NULL) - handler_enable(ns->handler_id); - else - panic("Unable to add NEx000 interrupt handler"); -#endif MACH_KERNEL - printf (", port = %x, spl = %d, pic = %d, [%s].", - dev->address, dev->sysdep, dev->sysdep1, - ether_sprintf(ns->ds_addr)); -#ifndef MACH_KERNEL - ns->ns_ac.ac_bcastaddr = (u_char *)etherbroadcastaddr; - ns->ns_ac.ac_arphrd = ARPHRD_ETHER; -#endif MACH_KERNEL - ns->ns_flags = 0; - ns->mode = 0; - ifp->if_unit = unit; - ifp->if_mtu = ETHERMTU; - ifp->if_flags = IFF_BROADCAST; -#ifdef MACH_KERNEL - ifp->if_header_size = sizeof(struct ether_header); - ifp->if_header_format = HDR_ETHERNET; - ifp->if_address_size = 6; - ifp->if_address = (char *)&ns->ds_addr[0]; - if_init_queues(ifp); -#else MACH_KERNEL - ifp->if_name = nedriver.driver_dname; - ifp->if_init = neinit; - ifp->if_output = ether_output; - ifp->if_start = nestart; - ifp->if_ioctl = neioctl; - ifp->if_reset = nereset; - ifp->if_watchdog= 0; - if_attach(ifp); -#endif MACH_KERNEL -} - -/* - * Initialization of interface; set up initialization block - * and transmit/receive descriptor rings. - */ -neinit(unit) - int unit; -{ - ne_softc_t *ns = &ne_softc[unit]; - struct ifnet *ifp = &ns->ds_if; - int i; char *cp; - int oldpri; - caddr_t nec = ns->ns_port; - -#ifndef MACH_KERNEL - if (ifp->if_addrlist == (struct ifaddr *)0) return; -#endif MACH_KERNEL - - oldpri = SPLNET(); - - outb(nec+ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_STOP); - - /* Word Transfer select, Burst Mode Select, Fifo at 8 bytes */ - outb(nec+ds0_dcr, ns->ns_mode); - - /* clear remote byte count resigters */ - outb (nec+ds0_rbcr0, 0); - outb (nec+ds0_rbcr1, 0); - - /* don't store incoming packets into memory for now */ - outb (nec+ds0_rcr, DSRC_MON); - - /* place NIC in internal loopback mode */ - outb(nec+ds0_tcr, DSTC_LB0); - - /* initialize transmit/recieve (ring-buffer) Page Start */ - outb (nec+ds0_tpsr, 0); - outb (nec+ds0_pstart, ns->ns_txstart+PKTSZ); - - /* initialize reciever (ring-buffer) Page Stop and Boundary */ - outb (nec+ds0_pstop, ns->ns_rxend); - outb (nec+ds0_bnry, ns->ns_txstart+PKTSZ); - - /* clear all interrupts */ - outb (nec+ds0_isr, 0xff); - - /* enable the interrupts that we care about */ - outb (nec+ds0_imr, IMR_ENABLE); - - /* set physical address on ethernet */ - outb (nec+ds_cmd, DSCM_NODMA|DSCM_PG1|DSCM_STOP); - for (i=0 ; i < 6 ; i++) outb(nec+ds1_par0+i,ns->ds_addr[i]); - - ns->ns_cur = ns->ns_txstart+PKTSZ + 1; - outb (nec+ds1_curr, ns->ns_cur); - - /* XXX deal with Reciever Configuration Register */ - /* clr logical address hash filter for now */ - for (i=0 ; i < 8 ; i++) outb(nec+ds1_mar0+i,0xff); - - /* set page 0 registers */ - outb (nec+ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_STOP); - outb (nec+ds0_rcr, DSRC_AB); - - /* take unit out of loopback mode */ - outb (nec+ds0_tcr, 0); - - ns->ds_if.if_flags |= IFF_RUNNING; - ns->ns_flags &= ~(DSF_LOCK|DSF_RUNNING); - ns->ns_oactive = 0; ns->ns_mask = ~0; - splx(oldpri); - nestart(unit); - return(1); -} - -/* - * Setup output on interface. - * Get another datagram to send off of the interface queue, - * and map it to the interface before starting the output. - * called only at splimp or interrupt level. - */ -nestart(unit) -int unit; -{ - ne_softc_t *ns = &ne_softc[unit]; - struct ifnet *ifp = &ns->ds_if; - int buffer; - int len, i, total,t; - caddr_t nec = ns->ns_port; -#ifdef MACH_KERNEL - io_req_t m; - -#else MACH_KERNEL - struct mbuf *m0, *m; -#endif MACH_KERNEL - - /* - * The DS8390 has only one transmit buffer, if it is busy we - * must wait until the transmit interrupt completes. - */ - outb(nec+ds_cmd,DSCM_NODMA|DSCM_START); - - if (ns->ns_flags & DSF_LOCK) - goto done; - - if (inb(nec+ds_cmd) & DSCM_TRANS) - goto done; - - if ((ns->ds_if.if_flags & IFF_RUNNING) == 0) - goto done; - - IF_DEQUEUE(&ns->ds_if.if_snd, m); - if (m == 0) - goto done; - - /* - * Copy the mbuf chain into the transmit buffer - */ - - ns->ns_flags |= DSF_LOCK; /* prevent entering nestart */ - buffer = ns->ns_txstart*DS_PGSIZE; -#ifdef MACH_KERNEL - total = m->io_count; - neput(ns, m->io_data, buffer, total); -#else MACH_KERNEL - t = 0; len = i = 0; - for (m0 = m; m != 0; m = m->m_next) - t += m->m_len; - - m = m0; - total = t; - for (m0 = m; m != 0; ) { - - if (m->m_len&1 && t > m->m_len) { - neput(ns, mtod(m, caddr_t), buffer, m->m_len - 1); - t -= m->m_len - 1; - buffer += m->m_len - 1; - m->m_data += m->m_len - 1; - m->m_len = 1; - m = m_pullup(m, 2); - } else { - neput(ns, mtod(m, caddr_t), buffer, m->m_len); - buffer += m->m_len; - t -= m->m_len; - MFREE(m, m0); - m = m0; - } - } -#endif MACH_KERNEL - /* - * Init transmit length registers, and set transmit start flag. - */ - - len = total; - if (len < ETHER_MIN_LEN) len = ETHER_MIN_LEN; - outb(nec+ds0_tbcr0,len&0xff); - outb(nec+ds0_tbcr1,(len>>8)&0xff); - outb(nec+ds0_tpsr, ns->ns_txstart); - outb(nec+ds_cmd, DSCM_TRANS|DSCM_NODMA|DSCM_START); - -#ifdef MACH_KERNEL - iodone(m); - m = 0; -done: -#endif MACH_KERNEL -} - -/* buffer successor/predecessor in ring? */ -#define succ(n) (((n)+1 >= ns->ns_rxend) ? (ns->ns_txstart+PKTSZ) : (n)+1) -#define pred(n) (((n)-1 < (ns->ns_txstart+PKTSZ)) ? ns->ns_rxend-1 : (n)-1) - -/* - * Controller interrupt. - */ -neintr(unit) -{ - ne_softc_t *ns = &ne_softc[unit]; - u_char cmd,isr; - caddr_t nec = ns->ns_port; - - /* Save cmd, clear interrupt */ - cmd = inb (nec+ds_cmd); - isr = inb (nec+ds0_isr); -loop: - outb(nec+ds_cmd,DSCM_NODMA|DSCM_START); - outb(nec+ds0_isr, isr); - - /* Receiver error */ - if (isr & DSIS_RXE) { - (void) inb(nec+ds0_rsr); - /* need to read these registers to clear status */ - ns->ds_if.if_ierrors++; - } - - /* Counters overflowed, reading the registers resets them */ - if (isr & DSIS_CTRS) { - (void) inb(nec+ds0_cntr0); - (void) inb(nec+ds0_cntr1); - (void) inb(nec+ds0_cntr2); - } - - - /* We received something; rummage thru tiny ring buffer */ - if (isr & (DSIS_RX|DSIS_RXE|DSIS_ROVRN)) { - u_char pend,lastfree; - - outb(nec+ds_cmd, DSCM_START|DSCM_NODMA|DSCM_PG1); - pend = inb(nec+ds1_curr); - outb(nec+ds_cmd, DSCM_START|DSCM_NODMA|DSCM_PG0); - - /* Something in the buffer? */ - while (pend != ns->ns_cur) { - /* Extract header from microcephalic board */ - nefetch(ns, &ns->ns_ph,ns->ns_cur*DS_PGSIZE, - sizeof(ns->ns_ph)); - ns->ns_ba = ns->ns_cur*DS_PGSIZE+sizeof(ns->ns_ph); - - /* Incipient paranoia */ - if (ns->ns_ph.pr_status == DSRS_RPC || - /* for dequna's */ - ns->ns_ph.pr_status == 0x21) { - if (nerecv(ns)) - ns->ns_cur = ns->ns_ph.pr_nxtpg ; - else { - outb(nec+ds0_bnry, pred(ns->ns_cur)); - goto short_load; - } - } -#ifdef NEDEBUG - else { - printf("cur %x pnd %x lfr %x ", - ns->ns_cur, pend, lastfree); - printf("nxt %x len %x ", ns->ns_ph.pr_nxtpg, - (ns->ns_ph.pr_sz1<<8)+ ns->ns_ph.pr_sz0); - printf("Bogus Sts %x\n", ns->ns_ph.pr_status); - ns->ns_cur = pend; - } -#endif - outb(nec+ds0_bnry, pred(ns->ns_cur)); - outb(nec+ds_cmd, DSCM_START|DSCM_NODMA|DSCM_PG1); - pend = inb(nec+ds1_curr); - outb(nec+ds_cmd, DSCM_START|DSCM_NODMA|DSCM_PG0); - } -short_load: - outb(nec+ds_cmd, DSCM_START|DSCM_NODMA); - } - - /* Transmit error */ - if (isr & DSIS_TXE) { - ns->ns_flags &= ~DSF_LOCK; - /* Need to read these registers to clear status */ - ns->ds_if.if_collisions += inb(nec+ds0_tbcr0); - ns->ds_if.if_oerrors++; - } - - /* Packet Transmitted */ - if (isr & DSIS_TX) { - ns->ns_flags &= ~DSF_LOCK; - ++ns->ds_if.if_opackets; - ns->ds_if.if_collisions += inb(nec+ds0_tbcr0); - } - - /* Receiver ovverun? */ - if (isr & DSIS_ROVRN) { - outb(nec+ds0_rbcr0, 0); - outb(nec+ds0_rbcr1, 0); - outb(nec+ds0_tcr, DSTC_LB0); - outb(nec+ds0_rcr, DSRC_MON); - outb(nec+ds_cmd, DSCM_START|DSCM_NODMA); - outb(nec+ds0_rcr, DSRC_AB); - outb(nec+ds0_tcr, 0); - } - - /* Any more to send? */ - outb (nec+ds_cmd, DSCM_NODMA|DSCM_PG0|DSCM_START); - nestart(unit); - outb (nec+ds_cmd, cmd); - outb (nec+ds0_imr, IMR_ENABLE); - - /* Still more to do? */ - isr = inb (nec+ds0_isr); - if(isr) goto loop; - - return 0; -} - -/* - * Ethernet interface receiver interface. - * If input error just drop packet. - * Otherwise examine packet to determine type. If can't determine length - * from type, then have to drop packet. Othewise decapsulate - * packet based on type and pass to type specific higher-level - * input routine. - */ -nerecv(ns) - ne_softc_t *ns; -{ -#ifdef MACH_KERNEL - ipc_kmsg_t new_kmsg; - struct ether_header *ehp; - struct packet_header *pkt; - register struct ifnet *ifp = &ns->ds_if; -#ifdef FIPC - char *fipc_buf; -#endif -#else MACH_KERNEL - struct mbuf *top, **mp, *m, *p; -#endif MACH_KERNEL - int len, l; - int epkt; - - ns->ds_if.if_ipackets++; - len = ns->ns_ph.pr_sz0 + (ns->ns_ph.pr_sz1<<8); - if(len < ETHER_MIN_LEN || len > ETHER_MAX_LEN) - return 0; - - nefetch(ns, &ns->ns_eh, ns->ns_ba, sizeof(struct ether_header)); - -#ifndef MACH_KERNEL - ns->ns_eh.ether_type = ntohs((u_short)ns->ns_eh.ether_type); -#endif MACH_KERNEL - ns->ns_ba += sizeof(struct ether_header); - - /* don't forget checksum! */ - len -= (sizeof(struct ether_header) + sizeof(long)); -#ifdef MACH_KERNEL -#ifdef FIPC - if (ns->ns_eh.ether_type == FIPC_MSG_TYPE) /* fipc packet */ - { - /* We need to hand the whole packet to the handler. */ - - fipc_recvs++; - - fipc_buf = get_fipc_buffer (len, TRUE, TRUE); - - if (fipc_buf == NULL) - { - ns->ds_if.if_rcvdrops++; - return(0); - } - nefetch (ns, fipc_buf, ns->ns_ba, len); - - fipc_packet (fipc_buf, ns->ns_eh); - } - else /* net_kmsg */ - { -#endif /* FIPC */ - new_kmsg = net_kmsg_get(); - - if (new_kmsg == IKM_NULL) { - ns->ds_if.if_rcvdrops++; - return(0); - } - - ehp = (struct ether_header *) (&net_kmsg(new_kmsg)->header[0]); - pkt = (struct packet_header *)(&net_kmsg(new_kmsg)->packet[0]); - *ehp = ns->ns_eh; - - nefetch(ns, (char *) (pkt + 1), ns->ns_ba, len); - - pkt->type = ehp->ether_type; - - pkt->length = len + sizeof(struct packet_header); - net_packet(ifp, new_kmsg, pkt->length, ethernet_priority(new_kmsg)); -#ifdef FIPC - } -#endif - -#else MACH_KERNEL -/**/ - epkt = ns->ns_ba + len; - - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == 0) - return (0); - - m->m_pkthdr.rcvif = &ns->ds_if; - m->m_pkthdr.len = len; - m->m_len = MHLEN; - - top = 0; - mp = ⊤ - while (len > 0) { - if (top) { - MGET(m, M_DONTWAIT, MT_DATA); - if (m == 0) { - m_freem(top); - return (0); - } - m->m_len = MLEN; - } - l = min(len, epkt - ns->ns_ba); - if (l >= MINCLSIZE) { - MCLGET(m, M_DONTWAIT); - if (m->m_flags & M_EXT) - m->m_len = l = min(len, MCLBYTES); - else - l = m->m_len; - } else { - /* - * Place initial small packet/header at end of mbuf. - */ - if (l < m->m_len) { - if (top == 0 && len + max_linkhdr <= m->m_len) - m->m_data += max_linkhdr; - m->m_len = l; - } else - l = m->m_len; - } - nefetch(ns, mtod(m, caddr_t), ns->ns_ba, l); - ns->ns_ba += l; - *mp = m; - mp = &m->m_next; - len -= l; - } -/**/ - if (top == 0) return 0; /* NEED MODIFY HERE !!! */ - - ether_input(&ns->ds_if, &ns->ns_eh, top); -#endif MACH_KERNEL - return 1; -} - -#ifdef MACH_KERNEL -neopen(dev, flag) -dev_t dev; -int flag; -{ - register int unit = minor(dev); - - if (!ne_softc[unit].card_present || unit < 0 || unit >= NNE) - return (ENXIO); - - ne_softc[unit].ds_if.if_flags |= IFF_UP; - neinit(unit); - return(0); -} - -#ifdef FIPC -nefoutput(dev, ior) -dev_t dev; -io_req_t ior; -{ - register int unit = minor(dev); - - if (!ne_softc[unit].card_present || unit < 0 || unit >= NNE) - return (ENXIO); - - return (net_fwrite(&ne_softc[unit].ds_if, nestart, ior)); -} -#endif - -neoutput(dev, ior) -dev_t dev; -io_req_t ior; -{ - register int unit = minor(dev); - - if (!ne_softc[unit].card_present || unit < 0 || unit >= NNE) - return (ENXIO); - - return (net_write(&ne_softc[unit].ds_if, nestart, ior)); -} - -nesetinput(dev, receive_port, priority, filter, filter_count) -dev_t dev; -mach_port_t receive_port; -int priority; -filter_t filter[]; -unsigned int filter_count; -{ - register int unit = minor(dev); - - if (!ne_softc[unit].card_present || unit < 0 || unit >= NNE) - return (ENXIO); - - return (net_set_filter(&ne_softc[unit].ds_if, - receive_port, priority, - filter, filter_count)); -} - -negetstat(dev, flavor, status, count) -dev_t dev; -int flavor; -dev_status_t status; -unsigned int *count; -{ - register int unit = minor(dev); - - if (!ne_softc[unit].card_present || unit < 0 || unit >= NNE) - return (ENXIO); - - return (net_getstat(&ne_softc[unit].ds_if, - flavor, - status, - count)); -} - -nesetstat(dev, flavor, status, count) -dev_t dev; -int flavor; -dev_status_t status; -unsigned int count; -{ - register int unit = minor(dev); - register ne_softc_t *ns; - - if (!ne_softc[unit].card_present || unit < 0 || unit >= NNE) - return (ENXIO); - - ns = &ne_softc[unit]; - - switch(flavor) { - case NET_STATUS: { - register struct net_status *s = (struct net_status *)status; - int mode = 0; - if (count < NET_STATUS_COUNT) - return(D_INVALID_SIZE); -#define MOD_ENAL 1 -#define MOD_PROM 2 - if (s->flags & IFF_ALLMULTI) - mode |= MOD_ENAL; - if (s->flags & IFF_PROMISC) - mode |= MOD_PROM; - - if (ns->mode != mode) { - ns->mode = mode; - if (ns->ns_flags & DSF_RUNNING) { - ns->ns_flags &= ~(DSF_LOCK | DSF_RUNNING); - neinit(unit); - } - } - break; - } - default : - return (D_INVALID_OPERATION); - } - return (D_SUCCESS); -} - -#else MACH_KERNEL - -/* - * Process an ioctl request. - */ -neioctl(ifp, cmd, data) - register struct ifnet *ifp; - int cmd; - caddr_t data; -{ - register struct ifaddr *ifa = (struct ifaddr *)data; - ne_softc_t *ns = &ne_softc[ifp->if_unit]; - struct ifreq *ifr = (struct ifreq *)data; - int s = splimp(), error = 0; - - - switch (cmd) { - - case SIOCSIFADDR: - ifp->if_flags |= IFF_UP; - - switch (ifa->ifa_addr->sa_family) { - case AF_INET: - neinit(ifp->if_unit); /* before arpwhohas */ - ((struct arpcom *)ifp)->ac_ipaddr = - IA_SIN(ifa)->sin_addr; - arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr); - break; - case AF_NS: - { - register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr); - - if (ns_nullhost(*ina)) - ina->x_host = *(union ns_host *)(ns->ds_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)ns->ds_addr, sizeof(ns->ds_addr)); - } - neinit(ifp->if_unit); /* does ne_setaddr() */ - break; - } - default: - neinit(ifp->if_unit); - break; - } - break; - - case SIOCSIFFLAGS: - if ((ifp->if_flags & IFF_UP) == 0 && - ifp->if_flags & IFF_RUNNING) { - ifp->if_flags &= ~IFF_RUNNING; - outb(ns->ns_port + ds_cmd, DSCM_STOP|DSCM_NODMA); - } else if (ifp->if_flags & IFF_UP && - (ifp->if_flags & IFF_RUNNING) == 0) - neinit(ifp->if_unit); - break; - -#ifdef notdef - case SIOCGHWADDR: - bcopy((caddr_t)ns->ds_addr, (caddr_t) &ifr->ifr_data, - sizeof(ns->ds_addr)); - break; -#endif - - default: - error = EINVAL; - } - splx(s); - return (error); -} - -/* - * Reset of interface. - */ -nereset(unit, uban) - int unit, uban; -{ - if (unit >= NNE) - return; - printf("ne%d: reset\n", unit); - ne_softc[unit].ns_flags &= ~DSF_LOCK; - neinit(unit); -} -#endif MACH_KERNEL -#endif diff --git a/i386/i386at/if_nereg.h b/i386/i386at/if_nereg.h deleted file mode 100644 index a6b5a82..0000000 --- a/i386/i386at/if_nereg.h +++ /dev/null @@ -1,66 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if_nereg.h 7.1 (Berkeley) 5/9/91 - */ - -/* - * NE1000/2000 Ethernet Card registers - */ - -/* This card uses a DS8390 Ethernet controller in at the beginning of - its i/o space */ - -#define ne_data 0x10 /* Data Transfer port */ -#define ne_reset 0x1F /* Card Reset port */ - -#define PKTSZ 6 /* Size of transmit buffer */ - -/* Span of memory on an NE2000 */ -#define TBUF16 0x40 /* Starting location of Transmit Buffer */ -#define RBUFEND16 0x80 /* Ending location of Receive Buffer */ - -/* Span of memory on an NE1000 */ -#define TBUF8 0x20 /* Starting location of Transmit Buffer */ -#define RBUFEND8 0x40 /* Ending location of Receive Buffer */ - -#if 0 -#define PKTSZ 3*512 /* Size of transmit buffer */ - -/* Span of memory on an NE2000 */ -#define TBUF16 (16*1024) /* Starting location of Transmit Buffer */ -#define RBUFEND16 (32*1024) /* Ending location of Receive Buffer */ - -/* Span of memory on an NE1000 */ -#define TBUF8 (8*1024) /* Starting location of Transmit Buffer */ -#define RBUFEND8 (16*1024) /* Ending location of Receive Buffer */ -#endif |