1*27915Skarels /* @(#)if_qe.c 6.1 (Berkeley) 05/09/86 */ 227477Skjd 3*27915Skarels /* from @(#)if_qe.c 1.15 (ULTRIX) 4/16/86 */ 427477Skjd 527477Skjd 627477Skjd /**************************************************************** 727477Skjd * * 827477Skjd * Licensed from Digital Equipment Corporation * 927477Skjd * Copyright (c) * 1027477Skjd * Digital Equipment Corporation * 1127477Skjd * Maynard, Massachusetts * 1227477Skjd * 1985, 1986 * 1327477Skjd * All rights reserved. * 1427477Skjd * * 1527477Skjd * The Information in this software is subject to change * 1627477Skjd * without notice and should not be construed as a commitment * 1727477Skjd * by Digital Equipment Corporation. Digital makes no * 1827477Skjd * representations about the suitability of this software for * 1927477Skjd * any purpose. It is supplied "As Is" without expressed or * 2027477Skjd * implied warranty. * 2127477Skjd * * 2227477Skjd * If the Regents of the University of California or its * 2327477Skjd * licensees modify the software in a manner creating * 24*27915Skarels * derivative copyright rights, appropriate copyright * 25*27915Skarels * legends may be placed on the derivative work in addition * 2627477Skjd * to that set forth above. * 2727477Skjd * * 2827477Skjd ****************************************************************/ 2927477Skjd /* --------------------------------------------------------------------- 3027477Skjd * Modification History 3127477Skjd * 3227477Skjd * 15-Apr-86 -- afd 3327477Skjd * Rename "unused_multi" to "qunused_multi" for extending Generic 3427477Skjd * kernel to MicroVAXen. 3527477Skjd * 3627477Skjd * 18-mar-86 -- jaw br/cvec changed to NOT use registers. 3727477Skjd * 3827477Skjd * 12 March 86 -- Jeff Chase 3927477Skjd * Modified to handle the new MCLGET macro 4027477Skjd * Changed if_qe_data.c to use more receive buffers 4127477Skjd * Added a flag to poke with adb to log qe_restarts on console 4227477Skjd * 4327477Skjd * 19 Oct 85 -- rjl 4427477Skjd * Changed the watch dog timer from 30 seconds to 3. VMS is using 4527477Skjd * less than 1 second in their's. Also turned the printf into an 4627477Skjd * mprintf. 4727477Skjd * 4827477Skjd * 09/16/85 -- Larry Cohen 4927477Skjd * Add 43bsd alpha tape changes for subnet routing 5027477Skjd * 5127477Skjd * 1 Aug 85 -- rjl 5227477Skjd * Panic on a non-existent memory interrupt and the case where a packet 5327477Skjd * was chained. The first should never happen because non-existant 5427477Skjd * memory interrupts cause a bus reset. The second should never happen 5527477Skjd * because we hang 2k input buffers on the device. 5627477Skjd * 5727477Skjd * 1 Aug 85 -- rich 5827477Skjd * Fixed the broadcast loopback code to handle Clusters without 5927477Skjd * wedging the system. 6027477Skjd * 6127477Skjd * 27 Feb. 85 -- ejf 6227477Skjd * Return default hardware address on ioctl request. 6327477Skjd * 6427477Skjd * 12 Feb. 85 -- ejf 6527477Skjd * Added internal extended loopback capability. 6627477Skjd * 6727477Skjd * 27 Dec. 84 -- rjl 6827477Skjd * Fixed bug that caused every other transmit descriptor to be used 6927477Skjd * instead of every descriptor. 7027477Skjd * 7127477Skjd * 21 Dec. 84 -- rjl 7227477Skjd * Added watchdog timer to mask hardware bug that causes device lockup. 7327477Skjd * 7427477Skjd * 18 Dec. 84 -- rjl 7527477Skjd * Reworked driver to use q-bus mapping routines. MicroVAX-I now does 7627477Skjd * copying instead of m-buf shuffleing. 7727477Skjd * A number of deficencies in the hardware/firmware were compensated 7827477Skjd * for. See comments in qestart and qerint. 7927477Skjd * 8027477Skjd * 14 Nov. 84 -- jf 8127477Skjd * Added usage counts for multicast addresses. 8227477Skjd * Updated general protocol support to allow access to the Ethernet 8327477Skjd * header. 8427477Skjd * 8527477Skjd * 04 Oct. 84 -- jf 8627477Skjd * Added support for new ioctls to add and delete multicast addresses 8727477Skjd * and set the physical address. 8827477Skjd * Add support for general protocols. 8927477Skjd * 9027477Skjd * 14 Aug. 84 -- rjl 9127477Skjd * Integrated Shannon changes. (allow arp above 1024 and ? ) 9227477Skjd * 9327477Skjd * 13 Feb. 84 -- rjl 9427477Skjd * 9527477Skjd * Initial version of driver. derived from IL driver. 9627477Skjd * 9727477Skjd * --------------------------------------------------------------------- 9827477Skjd */ 9927477Skjd 10027477Skjd #include "qe.h" 101*27915Skarels #if NQE > 0 10227477Skjd /* 10327477Skjd * Digital Q-BUS to NI Adapter 10427477Skjd */ 105*27915Skarels #include "../machine/pte.h" 106*27915Skarels 107*27915Skarels #include "param.h" 108*27915Skarels #include "systm.h" 109*27915Skarels #include "mbuf.h" 110*27915Skarels #include "buf.h" 111*27915Skarels #include "protosw.h" 112*27915Skarels #include "socket.h" 113*27915Skarels #include "vmmac.h" 114*27915Skarels #include "ioctl.h" 115*27915Skarels #include "errno.h" 116*27915Skarels #include "syslog.h" 117*27915Skarels #include "time.h" 118*27915Skarels #include "kernel.h" 119*27915Skarels 120*27915Skarels #include "../net/if.h" 121*27915Skarels #include "../net/netisr.h" 122*27915Skarels #include "../net/route.h" 123*27915Skarels 124*27915Skarels #ifdef INET 125*27915Skarels #include "../netinet/in.h" 126*27915Skarels #include "../netinet/in_systm.h" 127*27915Skarels #include "../netinet/in_var.h" 128*27915Skarels #include "../netinet/ip.h" 129*27915Skarels #include "../netinet/if_ether.h" 130*27915Skarels #endif 131*27915Skarels 132*27915Skarels #ifdef NS 133*27915Skarels #include "../netns/ns.h" 134*27915Skarels #include "../netns/ns_if.h" 135*27915Skarels #endif 136*27915Skarels 137*27915Skarels #include "../vax/cpu.h" 138*27915Skarels #include "../vax/mtpr.h" 139*27915Skarels #include "if_qereg.h" 140*27915Skarels #include "if_uba.h" 141*27915Skarels #include "../vaxuba/ubareg.h" 142*27915Skarels #include "../vaxuba/ubavar.h" 14327477Skjd 144*27915Skarels #define NRCV 25 /* Receive descriptors */ 145*27915Skarels #define NXMT 5 /* Transmit descriptors */ 146*27915Skarels #define NTOT (NXMT + NRCV) 147*27915Skarels 148*27915Skarels /* 149*27915Skarels * This constant should really be 60 because the qna adds 4 bytes of crc. 150*27915Skarels * However when set to 60 our packets are ignored by deuna's , 3coms are 151*27915Skarels * okay ?????????????????????????????????????????? 152*27915Skarels */ 153*27915Skarels #define MINDATA 64 154*27915Skarels 155*27915Skarels /* 156*27915Skarels * Ethernet software status per interface. 157*27915Skarels * 158*27915Skarels * Each interface is referenced by a network interface structure, 159*27915Skarels * is_if, which the routing code uses to locate the interface. 160*27915Skarels * This structure contains the output queue for the interface, its address, ... 161*27915Skarels */ 162*27915Skarels struct qe_softc { 163*27915Skarels struct arpcom is_ac; /* Ethernet common part */ 164*27915Skarels #define is_if is_ac.ac_if /* network-visible interface */ 165*27915Skarels #define is_addr is_ac.ac_enaddr /* hardware Ethernet address */ 166*27915Skarels struct ifubinfo qe_uba; /* Q-bus resources */ 167*27915Skarels struct ifrw qe_ifr[NRCV]; /* for receive buffers; */ 168*27915Skarels struct ifxmt qe_ifw[NXMT]; /* for xmit buffers; */ 169*27915Skarels int qe_flags; /* software state */ 170*27915Skarels #define QEF_RUNNING 0x01 171*27915Skarels #define QEF_SETADDR 0x02 172*27915Skarels int setupaddr; /* mapping info for setup pkts */ 173*27915Skarels struct qe_ring *rringaddr; /* mapping info for rings */ 174*27915Skarels struct qe_ring *tringaddr; /* "" */ 175*27915Skarels struct qe_ring rring[NRCV+1]; /* Receive ring descriptors */ 176*27915Skarels struct qe_ring tring[NXMT+1]; /* Transmit ring descriptors */ 177*27915Skarels u_char setup_pkt[16][8]; /* Setup packet */ 178*27915Skarels int rindex; /* Receive index */ 179*27915Skarels int tindex; /* Transmit index */ 180*27915Skarels int otindex; /* Old transmit index */ 181*27915Skarels int qe_intvec; /* Interrupt vector */ 182*27915Skarels struct qedevice *addr; /* device addr */ 183*27915Skarels int setupqueued; /* setup packet queued */ 184*27915Skarels int nxmit; /* Transmits in progress */ 185*27915Skarels int timeout; /* watchdog */ 186*27915Skarels int qe_restarts; /* timeouts */ 187*27915Skarels } qe_softc[NQE]; 188*27915Skarels 189*27915Skarels struct uba_device *qeinfo[NQE]; 190*27915Skarels 19127477Skjd extern struct timeval time; 19227477Skjd extern timeout(); 19327477Skjd 19427477Skjd int qeprobe(), qeattach(), qeint(), qewatch(); 19527477Skjd int qeinit(),qeoutput(),qeioctl(),qereset(),qewatch(); 19627477Skjd 19727477Skjd u_short qestd[] = { 0 }; 19827477Skjd struct uba_driver qedriver = 19927477Skjd { qeprobe, 0, qeattach, 0, qestd, "qe", qeinfo }; 20027477Skjd 20127477Skjd #define QE_TIMEO (15) 20227477Skjd #define QEUNIT(x) minor(x) 20327477Skjd static int mask = 0x3ffff; /* address mask */ 20427477Skjd int qewatchrun = 0; /* watchdog running */ 20527477Skjd /* 206*27915Skarels * The deqna shouldn't receive more than ETHERMTU + sizeof(struct ether_header) 20727477Skjd * but will actually take in up to 2048 bytes. To guard against the receiver 20827477Skjd * chaining buffers (which we aren't prepared to handle) we allocate 2kb 20927477Skjd * size buffers. 21027477Skjd */ 21127477Skjd #define MAXPACKETSIZE 2048 /* Should really be ETHERMTU */ 21227477Skjd /* 21327477Skjd * Probe the QNA to see if it's there 21427477Skjd */ 21527477Skjd qeprobe(reg) 21627477Skjd caddr_t reg; 21727477Skjd { 218*27915Skarels register int br, cvec; /* r11, r10 value-result */ 21927477Skjd register struct qedevice *addr = (struct qedevice *)reg; 22027477Skjd register struct qe_ring *rp; 22127477Skjd register struct qe_ring *prp; /* physical rp */ 22227477Skjd register int i, j, ncl; 22327477Skjd static int next=0; /* softc index */ 22427477Skjd register struct qe_softc *sc = &qe_softc[next++]; 22527477Skjd 22627477Skjd /* 22727477Skjd * Set the address mask for the particular cpu 22827477Skjd */ 229*27915Skarels mask = 0x3ffff; 23027477Skjd 23127477Skjd /* 23227477Skjd * The QNA interrupts on i/o operations. To do an I/O operation 23327477Skjd * we have to setup the interface by transmitting a setup packet. 23427477Skjd */ 23527477Skjd addr->qe_csr = QE_RESET; 23627477Skjd addr->qe_vector = (uba_hd[numuba].uh_lastiv -= 4); 23727477Skjd 23827477Skjd /* 23927477Skjd * Map the communications area and the setup packet. 24027477Skjd */ 24127477Skjd sc->setupaddr = 24227477Skjd uballoc(0, sc->setup_pkt, sizeof(sc->setup_pkt), 0); 24327477Skjd sc->rringaddr = (struct qe_ring *) 244*27915Skarels uballoc(0, sc->rring, sizeof(struct qe_ring) * (NTOT+2), 0); 24527477Skjd prp = (struct qe_ring *)((int)sc->rringaddr & mask); 24627477Skjd 24727477Skjd /* 24827477Skjd * The QNA will loop the setup packet back to the receive ring 24927477Skjd * for verification, therefore we initialize the first 25027477Skjd * receive & transmit ring descriptors and link the setup packet 25127477Skjd * to them. 25227477Skjd */ 25327477Skjd qeinitdesc( sc->tring, sc->setupaddr & mask, sizeof(sc->setup_pkt)); 25427477Skjd qeinitdesc( sc->rring, sc->setupaddr & mask, sizeof(sc->setup_pkt)); 25527477Skjd 25627477Skjd rp = (struct qe_ring *)sc->tring; 25727477Skjd rp->qe_setup = 1; 25827477Skjd rp->qe_eomsg = 1; 25927477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 26027477Skjd rp->qe_valid = 1; 26127477Skjd 26227477Skjd rp = (struct qe_ring *)sc->rring; 26327477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 26427477Skjd rp->qe_valid = 1; 26527477Skjd 26627477Skjd /* 26727477Skjd * Get the addr off of the interface and place it into the setup 26827477Skjd * packet. This code looks strange due to the fact that the address 26927477Skjd * is placed in the setup packet in col. major order. 27027477Skjd */ 27127477Skjd for( i = 0 ; i < 6 ; i++ ) 27227477Skjd sc->setup_pkt[i][1] = addr->qe_sta_addr[i]; 27327477Skjd 27427477Skjd qesetup( sc ); 27527477Skjd /* 27627477Skjd * Start the interface and wait for the packet. 27727477Skjd */ 27827477Skjd j = cvec; 27927477Skjd addr->qe_csr = QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT; 28027477Skjd addr->qe_rcvlist_lo = (short)prp; 28127477Skjd addr->qe_rcvlist_hi = (short)((int)prp >> 16); 282*27915Skarels prp += NRCV+1; 28327477Skjd addr->qe_xmtlist_lo = (short)prp; 28427477Skjd addr->qe_xmtlist_hi = (short)((int)prp >> 16); 28527477Skjd DELAY(10000); 28627477Skjd /* 287*27915Skarels * All done with the bus resources. 28827477Skjd */ 289*27915Skarels ubarelse(0, &sc->setupaddr); 290*27915Skarels ubarelse(0, &sc->rringaddr); 29127477Skjd if( cvec == j ) 29227477Skjd return 0; /* didn't interrupt */ 29327477Skjd 29427477Skjd return( sizeof(struct qedevice) ); 29527477Skjd } 29627477Skjd 29727477Skjd /* 29827477Skjd * Interface exists: make available by filling in network interface 29927477Skjd * record. System will initialize the interface when it is ready 30027477Skjd * to accept packets. 30127477Skjd */ 30227477Skjd qeattach(ui) 30327477Skjd struct uba_device *ui; 30427477Skjd { 30527477Skjd register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 30627477Skjd register struct ifnet *ifp = &sc->is_if; 30727477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 30827477Skjd register int i; 30927477Skjd 31027477Skjd ifp->if_unit = ui->ui_unit; 31127477Skjd ifp->if_name = "qe"; 31227477Skjd ifp->if_mtu = ETHERMTU; 313*27915Skarels ifp->if_flags = IFF_BROADCAST; 31427477Skjd 31527477Skjd /* 31627477Skjd * Read the address from the prom and save it. 31727477Skjd */ 31827477Skjd for( i=0 ; i<6 ; i++ ) 31927477Skjd sc->setup_pkt[i][1] = sc->is_addr[i] = addr->qe_sta_addr[i] & 0xff; 32027477Skjd 32127477Skjd /* 32227477Skjd * Save the vector for initialization at reset time. 32327477Skjd */ 32427477Skjd sc->qe_intvec = addr->qe_vector; 32527477Skjd 32627477Skjd ifp->if_init = qeinit; 32727477Skjd ifp->if_output = qeoutput; 32827477Skjd ifp->if_ioctl = qeioctl; 32927477Skjd ifp->if_reset = qereset; 330*27915Skarels sc->qe_uba.iff_flags = UBA_CANTWAIT; 33127477Skjd if_attach(ifp); 33227477Skjd } 33327477Skjd 33427477Skjd /* 33527477Skjd * Reset of interface after UNIBUS reset. 33627477Skjd * If interface is on specified uba, reset its state. 33727477Skjd */ 33827477Skjd qereset(unit, uban) 33927477Skjd int unit, uban; 34027477Skjd { 34127477Skjd register struct uba_device *ui; 34227477Skjd 343*27915Skarels if (unit >= NQE || (ui = qeinfo[unit]) == 0 || ui->ui_alive == 0 || 34427477Skjd ui->ui_ubanum != uban) 34527477Skjd return; 34627477Skjd printf(" qe%d", unit); 347*27915Skarels qe_softc[unit].is_if.if_flags &= ~IFF_RUNNING; 34827477Skjd qeinit(unit); 34927477Skjd } 35027477Skjd 35127477Skjd /* 35227477Skjd * Initialization of interface. 35327477Skjd */ 35427477Skjd qeinit(unit) 35527477Skjd int unit; 35627477Skjd { 35727477Skjd register struct qe_softc *sc = &qe_softc[unit]; 35827477Skjd register struct uba_device *ui = qeinfo[unit]; 35927477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 36027477Skjd register struct ifnet *ifp = &sc->is_if; 36127477Skjd register i; 36227477Skjd int s; 36327477Skjd 36427477Skjd /* address not known */ 36527477Skjd if (ifp->if_addrlist == (struct ifaddr *)0) 36627477Skjd return; 367*27915Skarels if (sc->qe_flags & QEF_RUNNING) 36827477Skjd return; 36927477Skjd 370*27915Skarels if ((ifp->if_flags & IFF_RUNNING) == 0) { 371*27915Skarels /* 372*27915Skarels * map the communications area onto the device 373*27915Skarels */ 374*27915Skarels sc->rringaddr = (struct qe_ring *)((int)uballoc(0, sc->rring, 375*27915Skarels sizeof(struct qe_ring) * (NTOT+2), 0) & mask); 376*27915Skarels sc->tringaddr = sc->rringaddr + NRCV + 1; 377*27915Skarels sc->setupaddr = uballoc(0, sc->setup_pkt, 378*27915Skarels sizeof(sc->setup_pkt), 0) & mask; 379*27915Skarels /* 380*27915Skarels * init buffers and maps 381*27915Skarels */ 382*27915Skarels if (if_ubaminit(&sc->qe_uba, ui->ui_ubanum, 383*27915Skarels sizeof (struct ether_header), (int)btoc(MAXPACKETSIZE), 384*27915Skarels sc->qe_ifr, NRCV, sc->qe_ifw, NXMT) == 0) { 385*27915Skarels printf("qe%d: can't initialize\n", unit); 386*27915Skarels sc->is_if.if_flags &= ~IFF_UP; 387*27915Skarels return; 388*27915Skarels } 38927477Skjd } 39027477Skjd /* 39127477Skjd * Init the buffer descriptors and indexes for each of the lists and 39227477Skjd * loop them back to form a ring. 39327477Skjd */ 394*27915Skarels for (i = 0; i < NRCV; i++) { 39527477Skjd qeinitdesc( &sc->rring[i], 396*27915Skarels sc->qe_ifr[i].ifrw_info & mask, MAXPACKETSIZE); 39727477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 39827477Skjd sc->rring[i].qe_valid = 1; 39927477Skjd } 40027477Skjd qeinitdesc( &sc->rring[i], NULL, 0 ); 40127477Skjd 40227477Skjd sc->rring[i].qe_addr_lo = (short)sc->rringaddr; 40327477Skjd sc->rring[i].qe_addr_hi = (short)((int)sc->rringaddr >> 16); 40427477Skjd sc->rring[i].qe_chain = 1; 40527477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 40627477Skjd sc->rring[i].qe_valid = 1; 40727477Skjd 408*27915Skarels for( i = 0 ; i <= NXMT ; i++ ) 40927477Skjd qeinitdesc( &sc->tring[i], NULL, 0 ); 41027477Skjd i--; 41127477Skjd 41227477Skjd sc->tring[i].qe_addr_lo = (short)sc->tringaddr; 41327477Skjd sc->tring[i].qe_addr_hi = (short)((int)sc->tringaddr >> 16); 41427477Skjd sc->tring[i].qe_chain = 1; 41527477Skjd sc->tring[i].qe_flag = sc->tring[i].qe_status1 = QE_NOTYET; 41627477Skjd sc->tring[i].qe_valid = 1; 41727477Skjd 41827477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 41927477Skjd 42027477Skjd /* 42127477Skjd * Take the interface out of reset, program the vector, 42227477Skjd * enable interrupts, and tell the world we are up. 42327477Skjd */ 42427477Skjd s = splimp(); 42527477Skjd addr->qe_vector = sc->qe_intvec; 42627477Skjd sc->addr = addr; 427*27915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 428*27915Skarels QE_RCV_INT | QE_ILOOP; 42927477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 43027477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 43127477Skjd ifp->if_flags |= IFF_UP | IFF_RUNNING; 432*27915Skarels sc->qe_flags |= QEF_RUNNING; 43327477Skjd qesetup( sc ); 43427477Skjd qestart( unit ); 43527477Skjd splx( s ); 43627477Skjd 43727477Skjd } 43827477Skjd 43927477Skjd /* 44027477Skjd * Start output on interface. 44127477Skjd * 44227477Skjd */ 44327477Skjd qestart(dev) 44427477Skjd dev_t dev; 44527477Skjd { 44627477Skjd int unit = QEUNIT(dev); 44727477Skjd struct uba_device *ui = qeinfo[unit]; 44827477Skjd register struct qe_softc *sc = &qe_softc[unit]; 44927477Skjd register struct qedevice *addr; 45027477Skjd register struct qe_ring *rp; 45127477Skjd register index; 45227477Skjd struct mbuf *m, *m0; 45327477Skjd int buf_addr, len, j, s; 45427477Skjd 45527477Skjd 45627477Skjd s = splimp(); 45727477Skjd addr = (struct qedevice *)ui->ui_addr; 45827477Skjd /* 45927477Skjd * The deqna doesn't look at anything but the valid bit 46027477Skjd * to determine if it should transmit this packet. If you have 46127477Skjd * a ring and fill it the device will loop indefinately on the 46227477Skjd * packet and continue to flood the net with packets until you 46327477Skjd * break the ring. For this reason we never queue more than n-1 46427477Skjd * packets in the transmit ring. 46527477Skjd * 46627477Skjd * The microcoders should have obeyed their own defination of the 46727477Skjd * flag and status words, but instead we have to compensate. 46827477Skjd */ 46927477Skjd for( index = sc->tindex; 470*27915Skarels sc->tring[index].qe_valid == 0 && sc->nxmit < (NXMT-1) ; 471*27915Skarels sc->tindex = index = ++index % NXMT){ 47227477Skjd rp = &sc->tring[index]; 47327477Skjd if( sc->setupqueued ) { 47427477Skjd buf_addr = sc->setupaddr; 47527477Skjd len = 128; 47627477Skjd rp->qe_setup = 1; 47727477Skjd sc->setupqueued = 0; 47827477Skjd } else { 47927477Skjd IF_DEQUEUE(&sc->is_if.if_snd, m); 48027477Skjd if( m == 0 ){ 48127477Skjd splx(s); 48227477Skjd return; 48327477Skjd } 484*27915Skarels buf_addr = sc->qe_ifw[index].ifw_info; 485*27915Skarels len = if_ubaput(&sc->qe_uba, &sc->qe_ifw[index], m); 48627477Skjd } 48727477Skjd /* 48827477Skjd * Does buffer end on odd byte ? 48927477Skjd */ 49027477Skjd if( len & 1 ) { 49127477Skjd len++; 49227477Skjd rp->qe_odd_end = 1; 49327477Skjd } 49427477Skjd if( len < MINDATA ) 49527477Skjd len = MINDATA; 49627477Skjd rp->qe_buf_len = -(len/2); 49727477Skjd buf_addr &= mask; 49827477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 49927477Skjd rp->qe_addr_lo = (short)buf_addr; 50027477Skjd rp->qe_addr_hi = (short)(buf_addr >> 16); 50127477Skjd rp->qe_eomsg = 1; 50227477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 50327477Skjd rp->qe_valid = 1; 50427477Skjd sc->nxmit++; 50527477Skjd /* 50627477Skjd * If the watchdog time isn't running kick it. 50727477Skjd */ 50827477Skjd sc->timeout=1; 50927477Skjd if( !qewatchrun++ ) 51027477Skjd timeout(qewatch,0,QE_TIMEO); 51127477Skjd 51227477Skjd /* 51327477Skjd * See if the xmit list is invalid. 51427477Skjd */ 51527477Skjd if( addr->qe_csr & QE_XL_INVALID ) { 51627477Skjd buf_addr = (int)(sc->tringaddr+index); 51727477Skjd addr->qe_xmtlist_lo = (short)buf_addr; 51827477Skjd addr->qe_xmtlist_hi = (short)(buf_addr >> 16); 51927477Skjd } 52027477Skjd } 52127477Skjd splx( s ); 52227477Skjd } 52327477Skjd 52427477Skjd /* 52527477Skjd * Ethernet interface interrupt processor 52627477Skjd */ 52727477Skjd qeintr(unit) 52827477Skjd int unit; 52927477Skjd { 53027477Skjd register struct qe_softc *sc = &qe_softc[unit]; 53127477Skjd register struct ifnet *ifp = &sc->is_if; 53227477Skjd struct qedevice *addr = (struct qedevice *)qeinfo[unit]->ui_addr; 53327477Skjd int s, buf_addr, csr; 53427477Skjd 53527477Skjd s = splimp(); 53627477Skjd csr = addr->qe_csr; 537*27915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT | QE_ILOOP; 53827477Skjd if( csr & QE_RCV_INT ) 53927477Skjd qerint( unit ); 54027477Skjd if( csr & QE_XMIT_INT ) 54127477Skjd qetint( unit ); 54227477Skjd if( csr & QE_NEX_MEM_INT ) 54327477Skjd panic("qe: Non existant memory interrupt"); 54427477Skjd 54527477Skjd if( addr->qe_csr & QE_RL_INVALID && sc->rring[sc->rindex].qe_status1 == QE_NOTYET ) { 54627477Skjd buf_addr = (int)&sc->rringaddr[sc->rindex]; 54727477Skjd addr->qe_rcvlist_lo = (short)buf_addr; 54827477Skjd addr->qe_rcvlist_hi = (short)(buf_addr >> 16); 54927477Skjd } 55027477Skjd splx( s ); 55127477Skjd } 55227477Skjd 55327477Skjd /* 55427477Skjd * Ethernet interface transmit interrupt. 55527477Skjd */ 55627477Skjd 55727477Skjd qetint(unit) 55827477Skjd int unit; 55927477Skjd { 56027477Skjd register struct qe_softc *sc = &qe_softc[unit]; 56127477Skjd register struct mbuf *mp, *mp0; 56227477Skjd register first, index; 56327477Skjd register struct qe_ring *rp; 56427477Skjd register struct ifxmt *ifxp; 56527477Skjd int i, status1, status2, setupflag; 56627477Skjd short len; 56727477Skjd 56827477Skjd 56927477Skjd while( sc->otindex != sc->tindex && sc->tring[sc->otindex].qe_status1 != QE_NOTYET && sc->nxmit > 0 ) { 57027477Skjd /* 57127477Skjd * Save the status words from the descriptor so that it can 57227477Skjd * be released. 57327477Skjd */ 57427477Skjd rp = &sc->tring[sc->otindex]; 57527477Skjd status1 = rp->qe_status1; 57627477Skjd status2 = rp->qe_status2; 57727477Skjd setupflag = rp->qe_setup; 57827477Skjd len = (-rp->qe_buf_len) * 2; 57927477Skjd if( rp->qe_odd_end ) 58027477Skjd len++; 58127477Skjd /* 58227477Skjd * Init the buffer descriptor 58327477Skjd */ 58427477Skjd bzero( rp, sizeof(struct qe_ring)); 58527477Skjd if( --sc->nxmit == 0 ) 58627477Skjd sc->timeout = 0; 58727477Skjd if( !setupflag ) { 58827477Skjd /* 58927477Skjd * Do some statistics. 59027477Skjd */ 59127477Skjd sc->is_if.if_opackets++; 59227477Skjd sc->is_if.if_collisions += ( status1 & QE_CCNT ) >> 4; 593*27915Skarels if (status1 & QE_ERROR) 59427477Skjd sc->is_if.if_oerrors++; 59527477Skjd /* 59627477Skjd * If this was a broadcast packet loop it 597*27915Skarels * back because the hardware can't hear its own 598*27915Skarels * transmits. 59927477Skjd */ 600*27915Skarels ifxp = &sc->qe_ifw[sc->otindex]; 601*27915Skarels if (bcmp((caddr_t)ifxp->ifw_addr, 602*27915Skarels (caddr_t)etherbroadcastaddr, 603*27915Skarels sizeof(etherbroadcastaddr)) == 0) 604*27915Skarels qeread(sc, &ifxp->ifrw, len); 605*27915Skarels if (ifxp->ifw_xtofree) { 606*27915Skarels m_freem(ifxp->ifw_xtofree); 607*27915Skarels ifxp->ifw_xtofree = 0; 60827477Skjd } 60927477Skjd } 610*27915Skarels sc->otindex = ++sc->otindex % NXMT; 61127477Skjd } 61227477Skjd qestart( unit ); 61327477Skjd } 61427477Skjd 61527477Skjd /* 61627477Skjd * Ethernet interface receiver interrupt. 61727477Skjd * If can't determine length from type, then have to drop packet. 61827477Skjd * Othewise decapsulate packet based on type and pass to type specific 61927477Skjd * higher-level input routine. 62027477Skjd */ 62127477Skjd qerint(unit) 62227477Skjd int unit; 62327477Skjd { 62427477Skjd register struct qe_softc *sc = &qe_softc[unit]; 62527477Skjd register struct ifnet *ifp = &sc->is_if; 62627477Skjd register struct qe_ring *rp; 62727477Skjd int len, status1, status2; 62827477Skjd int bufaddr; 62927477Skjd struct ether_header *eh; 63027477Skjd 63127477Skjd /* 63227477Skjd * Traverse the receive ring looking for packets to pass back. 63327477Skjd * The search is complete when we find a descriptor not in use. 63427477Skjd * 63527477Skjd * As in the transmit case the deqna doesn't honor it's own protocols 63627477Skjd * so there exists the possibility that the device can beat us around 63727477Skjd * the ring. The proper way to guard against this is to insure that 63827477Skjd * there is always at least one invalid descriptor. We chose instead 63927477Skjd * to make the ring large enough to minimize the problem. With a ring 64027477Skjd * size of 4 we haven't been able to see the problem. To be safe we 64127477Skjd * doubled that to 8. 64227477Skjd * 64327477Skjd */ 644*27915Skarels for( ; sc->rring[sc->rindex].qe_status1 != QE_NOTYET ; sc->rindex = ++sc->rindex % NRCV ){ 64527477Skjd rp = &sc->rring[sc->rindex]; 64627477Skjd status1 = rp->qe_status1; 64727477Skjd status2 = rp->qe_status2; 64827477Skjd bzero( rp, sizeof(struct qe_ring)); 64927477Skjd if( (status1 & QE_MASK) == QE_MASK ) 65027477Skjd panic("qe: chained packet"); 651*27915Skarels len = ((status1 & QE_RBL_HI) | (status2 & QE_RBL_LO)) + 60; 65227477Skjd sc->is_if.if_ipackets++; 65327477Skjd 654*27915Skarels if (status1 & QE_ERROR) 655*27915Skarels sc->is_if.if_ierrors++; 656*27915Skarels else { 657*27915Skarels /* 658*27915Skarels * We don't process setup packets. 659*27915Skarels */ 660*27915Skarels if( !(status1 & QE_ESETUP) ) 661*27915Skarels qeread(sc, &sc->qe_ifr[sc->rindex], 662*27915Skarels len - sizeof(struct ether_header)); 66327477Skjd } 66427477Skjd /* 66527477Skjd * Return the buffer to the ring 66627477Skjd */ 667*27915Skarels bufaddr = (int)sc->qe_ifr[sc->rindex].ifrw_info & mask; 66827477Skjd rp->qe_buf_len = -((MAXPACKETSIZE)/2); 66927477Skjd rp->qe_addr_lo = (short)bufaddr; 67027477Skjd rp->qe_addr_hi = (short)((int)bufaddr >> 16); 67127477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 67227477Skjd rp->qe_valid = 1; 67327477Skjd } 67427477Skjd } 67527477Skjd /* 67627477Skjd * Ethernet output routine. 67727477Skjd * Encapsulate a packet of type family for the local net. 67827477Skjd * Use trailer local net encapsulation if enough data in first 67927477Skjd * packet leaves a multiple of 512 bytes of data in remainder. 68027477Skjd */ 68127477Skjd qeoutput(ifp, m0, dst) 68227477Skjd struct ifnet *ifp; 68327477Skjd struct mbuf *m0; 68427477Skjd struct sockaddr *dst; 68527477Skjd { 68627477Skjd int type, s, error; 68727477Skjd u_char edst[6]; 68827477Skjd struct in_addr idst; 68927477Skjd struct protosw *pr; 69027477Skjd register struct qe_softc *is = &qe_softc[ifp->if_unit]; 69127477Skjd register struct mbuf *m = m0; 69227477Skjd register struct ether_header *eh; 69327477Skjd register int off; 694*27915Skarels int usetrailers; 69527477Skjd 696*27915Skarels if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) { 697*27915Skarels error = ENETDOWN; 698*27915Skarels goto bad; 699*27915Skarels } 700*27915Skarels 70127477Skjd switch (dst->sa_family) { 70227477Skjd 70327477Skjd #ifdef INET 70427477Skjd case AF_INET: 70527477Skjd idst = ((struct sockaddr_in *)dst)->sin_addr; 706*27915Skarels if (!arpresolve(&is->is_ac, m, &idst, edst, &usetrailers)) 70727477Skjd return (0); /* if not yet resolved */ 70827477Skjd off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len; 709*27915Skarels if (usetrailers && off > 0 && (off & 0x1ff) == 0 && 710*27915Skarels m->m_off >= MMINOFF + 2 * sizeof (u_short)) { 71127477Skjd type = ETHERTYPE_TRAIL + (off>>9); 71227477Skjd m->m_off -= 2 * sizeof (u_short); 71327477Skjd m->m_len += 2 * sizeof (u_short); 71427477Skjd *mtod(m, u_short *) = htons((u_short)ETHERTYPE_IP); 71527477Skjd *(mtod(m, u_short *) + 1) = htons((u_short)m->m_len); 716*27915Skarels goto gottrailertype; 71727477Skjd } 71827477Skjd type = ETHERTYPE_IP; 71927477Skjd off = 0; 72027477Skjd goto gottype; 72127477Skjd #endif 722*27915Skarels #ifdef NS 723*27915Skarels case AF_NS: 724*27915Skarels type = ETHERTYPE_NS; 725*27915Skarels bcopy((caddr_t)&(((struct sockaddr_ns *)dst)->sns_addr.x_host), 726*27915Skarels (caddr_t)edst, sizeof (edst)); 727*27915Skarels off = 0; 728*27915Skarels goto gottype; 729*27915Skarels #endif 730*27915Skarels 73127477Skjd 73227477Skjd case AF_UNSPEC: 73327477Skjd eh = (struct ether_header *)dst->sa_data; 73427477Skjd bcopy((caddr_t)eh->ether_dhost, (caddr_t)edst, sizeof (edst)); 73527477Skjd type = eh->ether_type; 73627477Skjd goto gottype; 73727477Skjd 73827477Skjd default: 739*27915Skarels printf("qe%d: can't handle af%d\n", ifp->if_unit, 740*27915Skarels dst->sa_family); 741*27915Skarels error = EAFNOSUPPORT; 742*27915Skarels goto bad; 74327477Skjd } 74427477Skjd 745*27915Skarels gottrailertype: 74627477Skjd /* 74727477Skjd * Packet to be sent as trailer: move first packet 74827477Skjd * (control information) to end of chain. 74927477Skjd */ 75027477Skjd while (m->m_next) 75127477Skjd m = m->m_next; 75227477Skjd m->m_next = m0; 75327477Skjd m = m0->m_next; 75427477Skjd m0->m_next = 0; 75527477Skjd m0 = m; 75627477Skjd 75727477Skjd gottype: 75827477Skjd /* 75927477Skjd * Add local net header. If no space in first mbuf, 76027477Skjd * allocate another. 76127477Skjd */ 762*27915Skarels if (m->m_off > MMAXOFF || 763*27915Skarels MMINOFF + sizeof (struct ether_header) > m->m_off) { 76427477Skjd m = m_get(M_DONTWAIT, MT_HEADER); 76527477Skjd if (m == 0) { 76627477Skjd error = ENOBUFS; 76727477Skjd goto bad; 76827477Skjd } 76927477Skjd m->m_next = m0; 77027477Skjd m->m_off = MMINOFF; 77127477Skjd m->m_len = sizeof (struct ether_header); 77227477Skjd } else { 77327477Skjd m->m_off -= sizeof (struct ether_header); 77427477Skjd m->m_len += sizeof (struct ether_header); 77527477Skjd } 77627477Skjd eh = mtod(m, struct ether_header *); 77727477Skjd eh->ether_type = htons((u_short)type); 77827477Skjd bcopy((caddr_t)edst, (caddr_t)eh->ether_dhost, sizeof (edst)); 77927477Skjd bcopy((caddr_t)is->is_addr, (caddr_t)eh->ether_shost, sizeof (is->is_addr)); 78027477Skjd 78127477Skjd /* 78227477Skjd * Queue message on interface, and start output if interface 78327477Skjd * not yet active. 78427477Skjd */ 78527477Skjd s = splimp(); 78627477Skjd if (IF_QFULL(&ifp->if_snd)) { 78727477Skjd IF_DROP(&ifp->if_snd); 78827477Skjd splx(s); 78927477Skjd m_freem(m); 79027477Skjd return (ENOBUFS); 79127477Skjd } 79227477Skjd IF_ENQUEUE(&ifp->if_snd, m); 79327477Skjd qestart(ifp->if_unit); 79427477Skjd splx(s); 79527477Skjd return (0); 79627477Skjd 79727477Skjd bad: 79827477Skjd m_freem(m0); 79927477Skjd return (error); 80027477Skjd } 80127477Skjd 80227477Skjd 80327477Skjd /* 80427477Skjd * Process an ioctl request. 80527477Skjd */ 80627477Skjd qeioctl(ifp, cmd, data) 80727477Skjd register struct ifnet *ifp; 80827477Skjd int cmd; 80927477Skjd caddr_t data; 81027477Skjd { 81127477Skjd struct qe_softc *sc = &qe_softc[ifp->if_unit]; 81227477Skjd struct ifaddr *ifa = (struct ifaddr *)data; 813*27915Skarels int i, s = splimp(), error = 0; 81427477Skjd 81527477Skjd switch (cmd) { 81627477Skjd 81727477Skjd case SIOCSIFADDR: 81827477Skjd ifp->if_flags |= IFF_UP; 81927477Skjd qeinit(ifp->if_unit); 82027477Skjd switch(ifa->ifa_addr.sa_family) { 82127477Skjd #ifdef INET 82227477Skjd case AF_INET: 82327477Skjd ((struct arpcom *)ifp)->ac_ipaddr = 82427477Skjd IA_SIN(ifa)->sin_addr; 82527477Skjd arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr); 82627477Skjd break; 82727477Skjd #endif 828*27915Skarels #ifdef NS 829*27915Skarels case AF_NS: 830*27915Skarels { 831*27915Skarels register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr); 832*27915Skarels 833*27915Skarels if (ns_nullhost(*ina)) 834*27915Skarels ina->x_host = *(union ns_host *)(sc->is_addr); 835*27915Skarels else 836*27915Skarels qe_setaddr(ina->x_host.c_host, ifp->if_unit); 83727477Skjd break; 838*27915Skarels } 839*27915Skarels #endif 84027477Skjd } 84127477Skjd break; 842*27915Skarels 843*27915Skarels case SIOCSIFFLAGS: 844*27915Skarels if ((ifp->if_flags & IFF_UP) == 0 && 845*27915Skarels sc->qe_flags & QEF_RUNNING) { 846*27915Skarels ((struct qedevice *) 847*27915Skarels (qeinfo[ifp->if_unit]->ui_addr))->qe_csr = QE_RESET; 848*27915Skarels sc->qe_flags &= ~QEF_RUNNING; 849*27915Skarels } else if (ifp->if_flags & IFF_UP && 850*27915Skarels (sc->qe_flags & QEF_RUNNING) == 0) 851*27915Skarels qerestart(ifp->if_unit); 852*27915Skarels break; 853*27915Skarels 85427477Skjd default: 85527477Skjd error = EINVAL; 85627477Skjd 85727477Skjd } 85827477Skjd done: splx(s); 85927477Skjd return (error); 86027477Skjd } 86127477Skjd 862*27915Skarels /* 863*27915Skarels * set ethernet address for unit 864*27915Skarels */ 865*27915Skarels qe_setaddr(physaddr, unit) 866*27915Skarels u_char *physaddr; 867*27915Skarels int unit; 868*27915Skarels { 869*27915Skarels register struct qe_softc *sc = &qe_softc[unit]; 870*27915Skarels struct uba_device *ui = qeinfo[unit]; 871*27915Skarels struct qedevice *addr = (struct qedevice *)ui->ui_addr; 872*27915Skarels register int i; 873*27915Skarels 874*27915Skarels for (i = 0; i < 6; i++) 875*27915Skarels sc->setup_pkt[i][1] = sc->is_addr[i] = physaddr[i]; 876*27915Skarels sc->qe_flags |= QEF_SETADDR; 877*27915Skarels if (sc->is_if.if_flags & IFF_RUNNING) 878*27915Skarels qesetup(sc); 879*27915Skarels qeinit(unit); 880*27915Skarels } 88127477Skjd 88227477Skjd 88327477Skjd /* 88427477Skjd * Initialize a ring descriptor with mbuf allocation side effects 88527477Skjd */ 88627477Skjd qeinitdesc( rp, buf, len ) 88727477Skjd register struct qe_ring *rp; 88827477Skjd char *buf; /* mapped address */ 88927477Skjd int len; 89027477Skjd { 89127477Skjd /* 89227477Skjd * clear the entire descriptor 89327477Skjd */ 89427477Skjd bzero( rp, sizeof(struct qe_ring)); 89527477Skjd 89627477Skjd if( len ) { 89727477Skjd rp->qe_buf_len = -(len/2); 89827477Skjd rp->qe_addr_lo = (short)buf; 89927477Skjd rp->qe_addr_hi = (short)((int)buf >> 16); 90027477Skjd } 90127477Skjd } 90227477Skjd /* 90327477Skjd * Build a setup packet - the physical address will already be present 90427477Skjd * in first column. 90527477Skjd */ 90627477Skjd qesetup( sc ) 90727477Skjd struct qe_softc *sc; 90827477Skjd { 90927477Skjd int i, j, offset = 0, next = 3; 91027477Skjd 91127477Skjd /* 91227477Skjd * Copy the target address to the rest of the entries in this row. 91327477Skjd */ 91427477Skjd for ( j = 0; j < 6 ; j++ ) 91527477Skjd for ( i = 2 ; i < 8 ; i++ ) 91627477Skjd sc->setup_pkt[j][i] = sc->setup_pkt[j][1]; 91727477Skjd /* 91827477Skjd * Duplicate the first half. 91927477Skjd */ 92027477Skjd bcopy(sc->setup_pkt, sc->setup_pkt[8], 64); 92127477Skjd /* 92227477Skjd * Fill in the broadcast address. 92327477Skjd */ 92427477Skjd for ( i = 0; i < 6 ; i++ ) 92527477Skjd sc->setup_pkt[i][2] = 0xff; 92627477Skjd sc->setupqueued++; 92727477Skjd } 928*27915Skarels 92927477Skjd /* 93027477Skjd * Pass a packet to the higher levels. 93127477Skjd * We deal with the trailer protocol here. 93227477Skjd */ 933*27915Skarels qeread(sc, ifrw, len) 93427477Skjd register struct qe_softc *sc; 93527477Skjd struct ifrw *ifrw; 93627477Skjd int len; 93727477Skjd { 93827477Skjd struct ether_header *eh, swloop_eh; 93927477Skjd struct mbuf *m, *swloop_tmp1, *swloop_tmp2; 94027477Skjd struct protosw *pr; 94127477Skjd int off, resid; 94227477Skjd struct ifqueue *inq; 94327477Skjd 94427477Skjd /* 94527477Skjd * Deal with trailer protocol: if type is INET trailer 94627477Skjd * get true type from first 16-bit word past data. 94727477Skjd * Remember that type was trailer by setting off. 94827477Skjd */ 94927477Skjd 95027477Skjd eh = (struct ether_header *)ifrw->ifrw_addr; 95127477Skjd eh->ether_type = ntohs((u_short)eh->ether_type); 95227477Skjd #define qedataaddr(eh, off, type) ((type)(((caddr_t)((eh)+1)+(off)))) 95327477Skjd if (eh->ether_type >= ETHERTYPE_TRAIL && 95427477Skjd eh->ether_type < ETHERTYPE_TRAIL+ETHERTYPE_NTRAILER) { 95527477Skjd off = (eh->ether_type - ETHERTYPE_TRAIL) * 512; 95627477Skjd if (off >= ETHERMTU) 95727477Skjd return; /* sanity */ 958*27915Skarels eh->ether_type = ntohs(*qedataaddr(eh,off, u_short *)); 959*27915Skarels resid = ntohs(*(qedataaddr(eh, off+2, u_short *))); 960*27915Skarels if (off + resid > len) 961*27915Skarels return; /* sanity */ 962*27915Skarels len = off + resid; 963*27915Skarels } else 96427477Skjd off = 0; 96527477Skjd if (len == 0) 96627477Skjd return; 96727477Skjd 96827477Skjd /* 96927477Skjd * Pull packet off interface. Off is nonzero if packet 97027477Skjd * has trailing header; qeget will then force this header 97127477Skjd * information to be at the front, but we still have to drop 97227477Skjd * the type and length which are at the front of any trailer data. 97327477Skjd */ 974*27915Skarels m = if_ubaget(&sc->qe_uba, ifrw, len, off, &sc->is_if); 97527477Skjd 97627477Skjd if (m == 0) 97727477Skjd return; 97827477Skjd 97927477Skjd if (off) { 980*27915Skarels struct ifnet *ifp; 981*27915Skarels 982*27915Skarels ifp = *(mtod(m, struct ifnet **)); 98327477Skjd m->m_off += 2 * sizeof (u_short); 98427477Skjd m->m_len -= 2 * sizeof (u_short); 985*27915Skarels *(mtod(m, struct ifnet **)) = ifp; 98627477Skjd } 98727477Skjd switch (eh->ether_type) { 988*27915Skarels 98927477Skjd #ifdef INET 99027477Skjd case ETHERTYPE_IP: 99127477Skjd schednetisr(NETISR_IP); 99227477Skjd inq = &ipintrq; 99327477Skjd break; 994*27915Skarels 99527477Skjd case ETHERTYPE_ARP: 99627477Skjd arpinput(&sc->is_ac, m); 99727477Skjd return; 99827477Skjd #endif 999*27915Skarels #ifdef NS 1000*27915Skarels case ETHERTYPE_NS: 1001*27915Skarels schednetisr(NETISR_NS); 1002*27915Skarels inq = &nsintrq; 1003*27915Skarels break; 1004*27915Skarels 1005*27915Skarels #endif 1006*27915Skarels 100727477Skjd default: 1008*27915Skarels m_freem(m); 1009*27915Skarels return; 101027477Skjd } 101127477Skjd 101227477Skjd if (IF_QFULL(inq)) { 101327477Skjd IF_DROP(inq); 101427477Skjd m_freem(m); 101527477Skjd return; 101627477Skjd } 101727477Skjd IF_ENQUEUE(inq, m); 101827477Skjd } 1019*27915Skarels 102027477Skjd /* 102127477Skjd * Watchdog timer routine. There is a condition in the hardware that 102227477Skjd * causes the board to lock up under heavy load. This routine detects 102327477Skjd * the hang up and restarts the device. 102427477Skjd */ 102527477Skjd qewatch() 102627477Skjd { 102727477Skjd register struct qe_softc *sc; 102827477Skjd register int i; 102927477Skjd int inprogress=0; 103027477Skjd 1031*27915Skarels for (i = 0; i < NQE; i++) { 103227477Skjd sc = &qe_softc[i]; 1033*27915Skarels if (sc->timeout) 1034*27915Skarels if (++sc->timeout > 3 ) { 1035*27915Skarels log(LOG_ERR, 1036*27915Skarels "qerestart: restarted qe%d %d\n", 1037*27915Skarels i, ++sc->qe_restarts); 1038*27915Skarels qerestart(sc); 1039*27915Skarels } else 104027477Skjd inprogress++; 104127477Skjd } 104227477Skjd if( inprogress ){ 104327477Skjd timeout(qewatch, 0, QE_TIMEO); 104427477Skjd qewatchrun++; 104527477Skjd } else 104627477Skjd qewatchrun=0; 104727477Skjd } 104827477Skjd /* 104927477Skjd * Restart for board lockup problem. 105027477Skjd */ 1051*27915Skarels qerestart(sc) 105227477Skjd register struct qe_softc *sc; 105327477Skjd { 105427477Skjd register struct ifnet *ifp = &sc->is_if; 105527477Skjd register struct qedevice *addr = sc->addr; 105627477Skjd register struct qe_ring *rp; 105727477Skjd register i; 105827477Skjd 105927477Skjd addr->qe_csr = QE_RESET; 106027477Skjd sc->timeout = 0; 106127477Skjd qesetup( sc ); 1062*27915Skarels for (i = 0, rp = sc->tring; i < NXMT; rp++, i++) { 106327477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 106427477Skjd rp->qe_valid = 0; 106527477Skjd } 106627477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 1067*27915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 1068*27915Skarels QE_RCV_INT | QE_ILOOP; 106927477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 107027477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 1071*27915Skarels sc->qe_flags |= QEF_RUNNING; 1072*27915Skarels qestart(ifp->if_unit); 107327477Skjd } 107427477Skjd #endif 1075