135326Sbostic /* 235326Sbostic * Copyright (c) 1988 Regents of the University of California. 335326Sbostic * All rights reserved. 435326Sbostic * 535326Sbostic * This code is derived from software contributed to Berkeley by 635326Sbostic * Digital Equipment Corp. 735326Sbostic * 835326Sbostic * Redistribution and use in source and binary forms are permitted 935326Sbostic * provided that the above copyright notice and this paragraph are 1035326Sbostic * duplicated in all such forms and that any documentation, 1135326Sbostic * advertising materials, and other materials related to such 1235326Sbostic * distribution and use acknowledge that the software was developed 1335326Sbostic * by the University of California, Berkeley. The name of the 1435326Sbostic * University may not be used to endorse or promote products derived 1535326Sbostic * from this software without specific prior written permission. 1635326Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1735326Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1835326Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1935326Sbostic * 20*36820Skarels * @(#)if_qe.c 7.11 (Berkeley) 02/17/89 2135326Sbostic */ 2227477Skjd 2327915Skarels /* from @(#)if_qe.c 1.15 (ULTRIX) 4/16/86 */ 24*36820Skarels 2527477Skjd /**************************************************************** 2627477Skjd * * 2727477Skjd * Licensed from Digital Equipment Corporation * 2827477Skjd * Copyright (c) * 2927477Skjd * Digital Equipment Corporation * 3027477Skjd * Maynard, Massachusetts * 3127477Skjd * 1985, 1986 * 3227477Skjd * All rights reserved. * 3327477Skjd * * 3427477Skjd * The Information in this software is subject to change * 3527477Skjd * without notice and should not be construed as a commitment * 3627477Skjd * by Digital Equipment Corporation. Digital makes no * 3727477Skjd * representations about the suitability of this software for * 3827477Skjd * any purpose. It is supplied "As Is" without expressed or * 3927477Skjd * implied warranty. * 4027477Skjd * * 4127477Skjd * If the Regents of the University of California or its * 4227477Skjd * licensees modify the software in a manner creating * 4327915Skarels * derivative copyright rights, appropriate copyright * 4427915Skarels * legends may be placed on the derivative work in addition * 4527477Skjd * to that set forth above. * 4627477Skjd * * 4727477Skjd ****************************************************************/ 4827477Skjd /* --------------------------------------------------------------------- 49*36820Skarels * Modification History 5027477Skjd * 5127477Skjd * 15-Apr-86 -- afd 5227477Skjd * Rename "unused_multi" to "qunused_multi" for extending Generic 5327477Skjd * kernel to MicroVAXen. 5427477Skjd * 5527477Skjd * 18-mar-86 -- jaw br/cvec changed to NOT use registers. 5627477Skjd * 5727477Skjd * 12 March 86 -- Jeff Chase 5827477Skjd * Modified to handle the new MCLGET macro 5927477Skjd * Changed if_qe_data.c to use more receive buffers 6027477Skjd * Added a flag to poke with adb to log qe_restarts on console 6127477Skjd * 6227477Skjd * 19 Oct 85 -- rjl 6327477Skjd * Changed the watch dog timer from 30 seconds to 3. VMS is using 6427477Skjd * less than 1 second in their's. Also turned the printf into an 6527477Skjd * mprintf. 6627477Skjd * 6727477Skjd * 09/16/85 -- Larry Cohen 68*36820Skarels * Add 43bsd alpha tape changes for subnet routing 6927477Skjd * 7027477Skjd * 1 Aug 85 -- rjl 7127477Skjd * Panic on a non-existent memory interrupt and the case where a packet 72*36820Skarels * was chained. The first should never happen because non-existant 7327477Skjd * memory interrupts cause a bus reset. The second should never happen 7427477Skjd * because we hang 2k input buffers on the device. 7527477Skjd * 7627477Skjd * 1 Aug 85 -- rich 7727477Skjd * Fixed the broadcast loopback code to handle Clusters without 7827477Skjd * wedging the system. 7927477Skjd * 8027477Skjd * 27 Feb. 85 -- ejf 8127477Skjd * Return default hardware address on ioctl request. 8227477Skjd * 8327477Skjd * 12 Feb. 85 -- ejf 8427477Skjd * Added internal extended loopback capability. 8527477Skjd * 8627477Skjd * 27 Dec. 84 -- rjl 8727477Skjd * Fixed bug that caused every other transmit descriptor to be used 8827477Skjd * instead of every descriptor. 8927477Skjd * 9027477Skjd * 21 Dec. 84 -- rjl 9127477Skjd * Added watchdog timer to mask hardware bug that causes device lockup. 9227477Skjd * 9327477Skjd * 18 Dec. 84 -- rjl 9427477Skjd * Reworked driver to use q-bus mapping routines. MicroVAX-I now does 9527477Skjd * copying instead of m-buf shuffleing. 9627477Skjd * A number of deficencies in the hardware/firmware were compensated 9727477Skjd * for. See comments in qestart and qerint. 9827477Skjd * 9927477Skjd * 14 Nov. 84 -- jf 10027477Skjd * Added usage counts for multicast addresses. 10127477Skjd * Updated general protocol support to allow access to the Ethernet 10227477Skjd * header. 10327477Skjd * 10427477Skjd * 04 Oct. 84 -- jf 10527477Skjd * Added support for new ioctls to add and delete multicast addresses 10627477Skjd * and set the physical address. 10727477Skjd * Add support for general protocols. 10827477Skjd * 10927477Skjd * 14 Aug. 84 -- rjl 11027477Skjd * Integrated Shannon changes. (allow arp above 1024 and ? ) 11127477Skjd * 11227477Skjd * 13 Feb. 84 -- rjl 11327477Skjd * 11427477Skjd * Initial version of driver. derived from IL driver. 115*36820Skarels * 11627477Skjd * --------------------------------------------------------------------- 11727477Skjd */ 118*36820Skarels 11927477Skjd #include "qe.h" 12027915Skarels #if NQE > 0 12127477Skjd /* 12227477Skjd * Digital Q-BUS to NI Adapter 12327477Skjd */ 12427915Skarels #include "param.h" 12527915Skarels #include "systm.h" 12627915Skarels #include "mbuf.h" 12727915Skarels #include "buf.h" 12827915Skarels #include "protosw.h" 12927915Skarels #include "socket.h" 13027915Skarels #include "vmmac.h" 13127915Skarels #include "ioctl.h" 13227915Skarels #include "errno.h" 13327915Skarels #include "syslog.h" 13427915Skarels #include "time.h" 13527915Skarels #include "kernel.h" 13627915Skarels 13727915Skarels #include "../net/if.h" 13827915Skarels #include "../net/netisr.h" 13927915Skarels #include "../net/route.h" 14027915Skarels 14127915Skarels #ifdef INET 14227915Skarels #include "../netinet/in.h" 14327915Skarels #include "../netinet/in_systm.h" 14427915Skarels #include "../netinet/in_var.h" 14527915Skarels #include "../netinet/ip.h" 14627915Skarels #include "../netinet/if_ether.h" 14727915Skarels #endif 14827915Skarels 14927915Skarels #ifdef NS 15027915Skarels #include "../netns/ns.h" 15127915Skarels #include "../netns/ns_if.h" 15227915Skarels #endif 15327915Skarels 15434530Skarels #include "../vax/pte.h" 15527915Skarels #include "../vax/cpu.h" 15627915Skarels #include "../vax/mtpr.h" 15727915Skarels #include "if_qereg.h" 15827915Skarels #include "if_uba.h" 15927915Skarels #include "../vaxuba/ubareg.h" 16027915Skarels #include "../vaxuba/ubavar.h" 161*36820Skarels 162*36820Skarels #if NQE == 1 && !defined(QNIVERT) 16330604Skarels #define NRCV 15 /* Receive descriptors */ 16430604Skarels #else 165*36820Skarels #define NRCV 10 /* Receive descriptors */ 16630604Skarels #endif 16727915Skarels #define NXMT 5 /* Transmit descriptors */ 16827915Skarels #define NTOT (NXMT + NRCV) 16934530Skarels 17034530Skarels #define QETIMEOUT 2 /* transmit timeout, must be > 1 */ 171*36820Skarels 17227915Skarels /* 17327915Skarels * This constant should really be 60 because the qna adds 4 bytes of crc. 17427915Skarels * However when set to 60 our packets are ignored by deuna's , 3coms are 17527915Skarels * okay ?????????????????????????????????????????? 17627915Skarels */ 17727915Skarels #define MINDATA 64 178*36820Skarels 17927915Skarels /* 18027915Skarels * Ethernet software status per interface. 18127915Skarels * 18227915Skarels * Each interface is referenced by a network interface structure, 18334530Skarels * qe_if, which the routing code uses to locate the interface. 18427915Skarels * This structure contains the output queue for the interface, its address, ... 18527915Skarels */ 18627915Skarels struct qe_softc { 18734530Skarels struct arpcom qe_ac; /* Ethernet common part */ 18834530Skarels #define qe_if qe_ac.ac_if /* network-visible interface */ 18934530Skarels #define qe_addr qe_ac.ac_enaddr /* hardware Ethernet address */ 19027915Skarels struct ifubinfo qe_uba; /* Q-bus resources */ 19127915Skarels struct ifrw qe_ifr[NRCV]; /* for receive buffers; */ 19227915Skarels struct ifxmt qe_ifw[NXMT]; /* for xmit buffers; */ 19327915Skarels int qe_flags; /* software state */ 19427915Skarels #define QEF_RUNNING 0x01 19527915Skarels #define QEF_SETADDR 0x02 19627915Skarels int setupaddr; /* mapping info for setup pkts */ 19736031Skarels int ipl; /* interrupt priority */ 19827915Skarels struct qe_ring *rringaddr; /* mapping info for rings */ 19927915Skarels struct qe_ring *tringaddr; /* "" */ 20027915Skarels struct qe_ring rring[NRCV+1]; /* Receive ring descriptors */ 20127915Skarels struct qe_ring tring[NXMT+1]; /* Transmit ring descriptors */ 20227915Skarels u_char setup_pkt[16][8]; /* Setup packet */ 20327915Skarels int rindex; /* Receive index */ 20427915Skarels int tindex; /* Transmit index */ 20527915Skarels int otindex; /* Old transmit index */ 20627915Skarels int qe_intvec; /* Interrupt vector */ 20727915Skarels struct qedevice *addr; /* device addr */ 20827915Skarels int setupqueued; /* setup packet queued */ 20927915Skarels int nxmit; /* Transmits in progress */ 21027915Skarels int qe_restarts; /* timeouts */ 21127915Skarels } qe_softc[NQE]; 21227915Skarels 21327915Skarels struct uba_device *qeinfo[NQE]; 214*36820Skarels 21527477Skjd extern struct timeval time; 216*36820Skarels 21734530Skarels int qeprobe(), qeattach(), qeintr(), qetimeout(); 21834530Skarels int qeinit(), qeoutput(), qeioctl(), qereset(); 219*36820Skarels 22027477Skjd u_short qestd[] = { 0 }; 22127477Skjd struct uba_driver qedriver = 22227477Skjd { qeprobe, 0, qeattach, 0, qestd, "qe", qeinfo }; 223*36820Skarels 22427477Skjd #define QEUNIT(x) minor(x) 22527477Skjd /* 22627915Skarels * The deqna shouldn't receive more than ETHERMTU + sizeof(struct ether_header) 22727477Skjd * but will actually take in up to 2048 bytes. To guard against the receiver 228*36820Skarels * chaining buffers (which we aren't prepared to handle) we allocate 2kb 22927477Skjd * size buffers. 23027477Skjd */ 23127477Skjd #define MAXPACKETSIZE 2048 /* Should really be ETHERMTU */ 23227477Skjd /* 23327477Skjd * Probe the QNA to see if it's there 23427477Skjd */ 23536031Skarels qeprobe(reg, ui) 23627477Skjd caddr_t reg; 23736031Skarels struct uba_device *ui; 23827477Skjd { 23927915Skarels register int br, cvec; /* r11, r10 value-result */ 24027477Skjd register struct qedevice *addr = (struct qedevice *)reg; 241*36820Skarels register struct qe_ring *rp; 24227477Skjd register struct qe_ring *prp; /* physical rp */ 24336031Skarels register int i; 24436031Skarels register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 245*36820Skarels 24628927Skarels #ifdef lint 24728927Skarels br = 0; cvec = br; br = cvec; 24828953Skarels qeintr(0); 24928927Skarels #endif 250*36820Skarels 25127477Skjd /* 252*36820Skarels * The QNA interrupts on i/o operations. To do an I/O operation 25327477Skjd * we have to setup the interface by transmitting a setup packet. 25427477Skjd */ 25527477Skjd addr->qe_csr = QE_RESET; 25635762Skarels addr->qe_csr &= ~QE_RESET; 25727477Skjd addr->qe_vector = (uba_hd[numuba].uh_lastiv -= 4); 258*36820Skarels 25927477Skjd /* 26027477Skjd * Map the communications area and the setup packet. 26127477Skjd */ 26227477Skjd sc->setupaddr = 26328953Skarels uballoc(0, (caddr_t)sc->setup_pkt, sizeof(sc->setup_pkt), 0); 26428953Skarels sc->rringaddr = (struct qe_ring *) uballoc(0, (caddr_t)sc->rring, 26528953Skarels sizeof(struct qe_ring) * (NTOT+2), 0); 26636031Skarels prp = (struct qe_ring *)UBAI_ADDR((int)sc->rringaddr); 267*36820Skarels 26827477Skjd /* 26927477Skjd * The QNA will loop the setup packet back to the receive ring 270*36820Skarels * for verification, therefore we initialize the first 27127477Skjd * receive & transmit ring descriptors and link the setup packet 27227477Skjd * to them. 27327477Skjd */ 27436031Skarels qeinitdesc(sc->tring, (caddr_t)UBAI_ADDR(sc->setupaddr), 27528953Skarels sizeof(sc->setup_pkt)); 27636031Skarels qeinitdesc(sc->rring, (caddr_t)UBAI_ADDR(sc->setupaddr), 27728953Skarels sizeof(sc->setup_pkt)); 278*36820Skarels 27927477Skjd rp = (struct qe_ring *)sc->tring; 28027477Skjd rp->qe_setup = 1; 28127477Skjd rp->qe_eomsg = 1; 28227477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 28327477Skjd rp->qe_valid = 1; 284*36820Skarels 28527477Skjd rp = (struct qe_ring *)sc->rring; 28627477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 28727477Skjd rp->qe_valid = 1; 288*36820Skarels 28927477Skjd /* 29027477Skjd * Get the addr off of the interface and place it into the setup 29127477Skjd * packet. This code looks strange due to the fact that the address 292*36820Skarels * is placed in the setup packet in col. major order. 29327477Skjd */ 29427477Skjd for( i = 0 ; i < 6 ; i++ ) 29527477Skjd sc->setup_pkt[i][1] = addr->qe_sta_addr[i]; 296*36820Skarels 29727477Skjd qesetup( sc ); 29827477Skjd /* 29927477Skjd * Start the interface and wait for the packet. 30027477Skjd */ 30136031Skarels (void) spl6(); 30227477Skjd addr->qe_csr = QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT; 30327477Skjd addr->qe_rcvlist_lo = (short)prp; 30427477Skjd addr->qe_rcvlist_hi = (short)((int)prp >> 16); 30527915Skarels prp += NRCV+1; 30627477Skjd addr->qe_xmtlist_lo = (short)prp; 30727477Skjd addr->qe_xmtlist_hi = (short)((int)prp >> 16); 30827477Skjd DELAY(10000); 30927477Skjd /* 31027915Skarels * All done with the bus resources. 31127477Skjd */ 31227915Skarels ubarelse(0, &sc->setupaddr); 31328953Skarels ubarelse(0, (int *)&sc->rringaddr); 31436031Skarels sc->ipl = br = qbgetpri(); 31527477Skjd return( sizeof(struct qedevice) ); 31627477Skjd } 317*36820Skarels 31827477Skjd /* 31927477Skjd * Interface exists: make available by filling in network interface 32027477Skjd * record. System will initialize the interface when it is ready 32127477Skjd * to accept packets. 32227477Skjd */ 32327477Skjd qeattach(ui) 32427477Skjd struct uba_device *ui; 32527477Skjd { 32627477Skjd register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 32734530Skarels register struct ifnet *ifp = &sc->qe_if; 32827477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 32927477Skjd register int i; 330*36820Skarels 33127477Skjd ifp->if_unit = ui->ui_unit; 33227477Skjd ifp->if_name = "qe"; 33327477Skjd ifp->if_mtu = ETHERMTU; 33427915Skarels ifp->if_flags = IFF_BROADCAST; 335*36820Skarels 33627477Skjd /* 33727477Skjd * Read the address from the prom and save it. 33827477Skjd */ 33927477Skjd for( i=0 ; i<6 ; i++ ) 340*36820Skarels sc->setup_pkt[i][1] = sc->qe_addr[i] = addr->qe_sta_addr[i] & 0xff; 34135762Skarels addr->qe_vector |= 1; 34235762Skarels printf("qe%d: %s, hardware address %s\n", ui->ui_unit, 34335762Skarels addr->qe_vector&01 ? "delqa":"deqna", 34434551Smarc ether_sprintf(sc->qe_addr)); 34535762Skarels addr->qe_vector &= ~1; 346*36820Skarels 34727477Skjd /* 34827477Skjd * Save the vector for initialization at reset time. 34927477Skjd */ 35027477Skjd sc->qe_intvec = addr->qe_vector; 351*36820Skarels 35227477Skjd ifp->if_init = qeinit; 35327477Skjd ifp->if_output = qeoutput; 35427477Skjd ifp->if_ioctl = qeioctl; 35527477Skjd ifp->if_reset = qereset; 35634530Skarels ifp->if_watchdog = qetimeout; 35727915Skarels sc->qe_uba.iff_flags = UBA_CANTWAIT; 35827477Skjd if_attach(ifp); 35927477Skjd } 360*36820Skarels 36127477Skjd /* 36227477Skjd * Reset of interface after UNIBUS reset. 36327477Skjd * If interface is on specified uba, reset its state. 36427477Skjd */ 36527477Skjd qereset(unit, uban) 36627477Skjd int unit, uban; 36727477Skjd { 36827477Skjd register struct uba_device *ui; 369*36820Skarels 37027915Skarels if (unit >= NQE || (ui = qeinfo[unit]) == 0 || ui->ui_alive == 0 || 37127477Skjd ui->ui_ubanum != uban) 37227477Skjd return; 37327477Skjd printf(" qe%d", unit); 37434530Skarels qe_softc[unit].qe_if.if_flags &= ~IFF_RUNNING; 37527477Skjd qeinit(unit); 37627477Skjd } 377*36820Skarels 37827477Skjd /* 379*36820Skarels * Initialization of interface. 38027477Skjd */ 38127477Skjd qeinit(unit) 38227477Skjd int unit; 38327477Skjd { 38427477Skjd register struct qe_softc *sc = &qe_softc[unit]; 38527477Skjd register struct uba_device *ui = qeinfo[unit]; 38627477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 38734530Skarels register struct ifnet *ifp = &sc->qe_if; 38827477Skjd register i; 38927477Skjd int s; 390*36820Skarels 39127477Skjd /* address not known */ 39227477Skjd if (ifp->if_addrlist == (struct ifaddr *)0) 39327477Skjd return; 39427915Skarels if (sc->qe_flags & QEF_RUNNING) 39527477Skjd return; 396*36820Skarels 39727915Skarels if ((ifp->if_flags & IFF_RUNNING) == 0) { 39827915Skarels /* 399*36820Skarels * map the communications area onto the device 40027915Skarels */ 40136031Skarels i = uballoc(0, (caddr_t)sc->rring, 40236031Skarels sizeof(struct qe_ring) * (NTOT+2), 0); 40336031Skarels if (i == 0) 40436031Skarels goto fail; 40536031Skarels sc->rringaddr = (struct qe_ring *)UBAI_ADDR(i); 40627915Skarels sc->tringaddr = sc->rringaddr + NRCV + 1; 40736031Skarels i = uballoc(0, (caddr_t)sc->setup_pkt, 40836031Skarels sizeof(sc->setup_pkt), 0); 40936031Skarels if (i == 0) 41036031Skarels goto fail; 41136031Skarels sc->setupaddr = UBAI_ADDR(i); 41227915Skarels /* 41327915Skarels * init buffers and maps 41427915Skarels */ 41527915Skarels if (if_ubaminit(&sc->qe_uba, ui->ui_ubanum, 41627915Skarels sizeof (struct ether_header), (int)btoc(MAXPACKETSIZE), 41727915Skarels sc->qe_ifr, NRCV, sc->qe_ifw, NXMT) == 0) { 41836031Skarels fail: 419*36820Skarels printf("qe%d: can't allocate uba resources\n", unit); 42034530Skarels sc->qe_if.if_flags &= ~IFF_UP; 42127915Skarels return; 42227915Skarels } 42327477Skjd } 42427477Skjd /* 42527477Skjd * Init the buffer descriptors and indexes for each of the lists and 42627477Skjd * loop them back to form a ring. 42727477Skjd */ 42827915Skarels for (i = 0; i < NRCV; i++) { 42927477Skjd qeinitdesc( &sc->rring[i], 43036031Skarels (caddr_t)UBAI_ADDR(sc->qe_ifr[i].ifrw_info), MAXPACKETSIZE); 43127477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 43227477Skjd sc->rring[i].qe_valid = 1; 43327477Skjd } 43428953Skarels qeinitdesc(&sc->rring[i], (caddr_t)NULL, 0); 435*36820Skarels 43627477Skjd sc->rring[i].qe_addr_lo = (short)sc->rringaddr; 43727477Skjd sc->rring[i].qe_addr_hi = (short)((int)sc->rringaddr >> 16); 43827477Skjd sc->rring[i].qe_chain = 1; 43927477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 44027477Skjd sc->rring[i].qe_valid = 1; 441*36820Skarels 44227915Skarels for( i = 0 ; i <= NXMT ; i++ ) 44328953Skarels qeinitdesc(&sc->tring[i], (caddr_t)NULL, 0); 44427477Skjd i--; 445*36820Skarels 44627477Skjd sc->tring[i].qe_addr_lo = (short)sc->tringaddr; 44727477Skjd sc->tring[i].qe_addr_hi = (short)((int)sc->tringaddr >> 16); 44827477Skjd sc->tring[i].qe_chain = 1; 44927477Skjd sc->tring[i].qe_flag = sc->tring[i].qe_status1 = QE_NOTYET; 45027477Skjd sc->tring[i].qe_valid = 1; 451*36820Skarels 45227477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 453*36820Skarels 45427477Skjd /* 455*36820Skarels * Take the interface out of reset, program the vector, 45627477Skjd * enable interrupts, and tell the world we are up. 45727477Skjd */ 45827477Skjd s = splimp(); 45927477Skjd addr->qe_vector = sc->qe_intvec; 46027477Skjd sc->addr = addr; 46127915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 46227915Skarels QE_RCV_INT | QE_ILOOP; 46327477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 46427477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 46527477Skjd ifp->if_flags |= IFF_UP | IFF_RUNNING; 46627915Skarels sc->qe_flags |= QEF_RUNNING; 46727477Skjd qesetup( sc ); 46827477Skjd qestart( unit ); 46927477Skjd splx( s ); 47027477Skjd } 471*36820Skarels 47227477Skjd /* 47327477Skjd * Start output on interface. 47427477Skjd * 47527477Skjd */ 47634530Skarels qestart(unit) 47734530Skarels int unit; 47827477Skjd { 47927477Skjd struct uba_device *ui = qeinfo[unit]; 48027477Skjd register struct qe_softc *sc = &qe_softc[unit]; 48127477Skjd register struct qedevice *addr; 48227477Skjd register struct qe_ring *rp; 48327477Skjd register index; 48428927Skarels struct mbuf *m; 48528927Skarels int buf_addr, len, s; 486*36820Skarels 487*36820Skarels 48827477Skjd s = splimp(); 48927477Skjd addr = (struct qedevice *)ui->ui_addr; 49027477Skjd /* 49127477Skjd * The deqna doesn't look at anything but the valid bit 49227477Skjd * to determine if it should transmit this packet. If you have 49327477Skjd * a ring and fill it the device will loop indefinately on the 49427477Skjd * packet and continue to flood the net with packets until you 49527477Skjd * break the ring. For this reason we never queue more than n-1 496*36820Skarels * packets in the transmit ring. 49727477Skjd * 49827477Skjd * The microcoders should have obeyed their own defination of the 49927477Skjd * flag and status words, but instead we have to compensate. 50027477Skjd */ 501*36820Skarels for( index = sc->tindex; 50227915Skarels sc->tring[index].qe_valid == 0 && sc->nxmit < (NXMT-1) ; 50327915Skarels sc->tindex = index = ++index % NXMT){ 50427477Skjd rp = &sc->tring[index]; 50527477Skjd if( sc->setupqueued ) { 50627477Skjd buf_addr = sc->setupaddr; 50727477Skjd len = 128; 50827477Skjd rp->qe_setup = 1; 50927477Skjd sc->setupqueued = 0; 51027477Skjd } else { 51134530Skarels IF_DEQUEUE(&sc->qe_if.if_snd, m); 51227477Skjd if( m == 0 ){ 51327477Skjd splx(s); 51427477Skjd return; 51527477Skjd } 51627915Skarels buf_addr = sc->qe_ifw[index].ifw_info; 51727915Skarels len = if_ubaput(&sc->qe_uba, &sc->qe_ifw[index], m); 51827477Skjd } 51927477Skjd /* 520*36820Skarels * Does buffer end on odd byte ? 52127477Skjd */ 52227477Skjd if( len & 1 ) { 52327477Skjd len++; 52427477Skjd rp->qe_odd_end = 1; 52527477Skjd } 52627477Skjd if( len < MINDATA ) 52727477Skjd len = MINDATA; 52827477Skjd rp->qe_buf_len = -(len/2); 52936031Skarels buf_addr = UBAI_ADDR(buf_addr); 53027477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 53127477Skjd rp->qe_addr_lo = (short)buf_addr; 53227477Skjd rp->qe_addr_hi = (short)(buf_addr >> 16); 53327477Skjd rp->qe_eomsg = 1; 53427477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 53527477Skjd rp->qe_valid = 1; 536*36820Skarels if (sc->nxmit++ == 0) 537*36820Skarels sc->qe_if.if_timer = QETIMEOUT; 538*36820Skarels 53927477Skjd /* 54027477Skjd * See if the xmit list is invalid. 54127477Skjd */ 54227477Skjd if( addr->qe_csr & QE_XL_INVALID ) { 54327477Skjd buf_addr = (int)(sc->tringaddr+index); 54427477Skjd addr->qe_xmtlist_lo = (short)buf_addr; 54527477Skjd addr->qe_xmtlist_hi = (short)(buf_addr >> 16); 54627477Skjd } 54727477Skjd } 54827477Skjd splx( s ); 54927477Skjd } 550*36820Skarels 55127477Skjd /* 55227477Skjd * Ethernet interface interrupt processor 55327477Skjd */ 55427477Skjd qeintr(unit) 55527477Skjd int unit; 55627477Skjd { 55727477Skjd register struct qe_softc *sc = &qe_softc[unit]; 55827477Skjd struct qedevice *addr = (struct qedevice *)qeinfo[unit]->ui_addr; 55936031Skarels int buf_addr, csr; 560*36820Skarels 561*36820Skarels /* 56236031Skarels splx(sc->ipl); 563*36820Skarels */ 564*36820Skarels (void) splimp(); 56527477Skjd csr = addr->qe_csr; 56627915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT | QE_ILOOP; 567*36820Skarels if( csr & QE_RCV_INT ) 56827477Skjd qerint( unit ); 56927477Skjd if( csr & QE_XMIT_INT ) 57027477Skjd qetint( unit ); 57127477Skjd if( csr & QE_NEX_MEM_INT ) 572*36820Skarels printf("qe%d: Nonexistent memory interrupt\n", unit); 573*36820Skarels 57427477Skjd if( addr->qe_csr & QE_RL_INVALID && sc->rring[sc->rindex].qe_status1 == QE_NOTYET ) { 57527477Skjd buf_addr = (int)&sc->rringaddr[sc->rindex]; 57627477Skjd addr->qe_rcvlist_lo = (short)buf_addr; 57727477Skjd addr->qe_rcvlist_hi = (short)(buf_addr >> 16); 57827477Skjd } 57927477Skjd } 580*36820Skarels 58127477Skjd /* 58227477Skjd * Ethernet interface transmit interrupt. 58327477Skjd */ 584*36820Skarels 58527477Skjd qetint(unit) 58627477Skjd int unit; 58727477Skjd { 58827477Skjd register struct qe_softc *sc = &qe_softc[unit]; 58927477Skjd register struct qe_ring *rp; 59027477Skjd register struct ifxmt *ifxp; 59128927Skarels int status1, setupflag; 59227477Skjd short len; 593*36820Skarels 594*36820Skarels 59527477Skjd while( sc->otindex != sc->tindex && sc->tring[sc->otindex].qe_status1 != QE_NOTYET && sc->nxmit > 0 ) { 59627477Skjd /* 59727477Skjd * Save the status words from the descriptor so that it can 59827477Skjd * be released. 59927477Skjd */ 60027477Skjd rp = &sc->tring[sc->otindex]; 60127477Skjd status1 = rp->qe_status1; 60227477Skjd setupflag = rp->qe_setup; 60327477Skjd len = (-rp->qe_buf_len) * 2; 60427477Skjd if( rp->qe_odd_end ) 60527477Skjd len++; 60627477Skjd /* 60727477Skjd * Init the buffer descriptor 60827477Skjd */ 60928953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 61027477Skjd if( --sc->nxmit == 0 ) 61134530Skarels sc->qe_if.if_timer = 0; 61227477Skjd if( !setupflag ) { 61327477Skjd /* 61427477Skjd * Do some statistics. 61527477Skjd */ 61634530Skarels sc->qe_if.if_opackets++; 61734530Skarels sc->qe_if.if_collisions += ( status1 & QE_CCNT ) >> 4; 61827915Skarels if (status1 & QE_ERROR) 61934530Skarels sc->qe_if.if_oerrors++; 62027477Skjd /* 62127477Skjd * If this was a broadcast packet loop it 62227915Skarels * back because the hardware can't hear its own 62327915Skarels * transmits. 62427477Skjd */ 62527915Skarels ifxp = &sc->qe_ifw[sc->otindex]; 62632086Skarels if (bcmp((caddr_t)((struct ether_header *)ifxp->ifw_addr)->ether_dhost, 62732086Skarels (caddr_t)etherbroadcastaddr, 62832086Skarels sizeof(etherbroadcastaddr)) == 0) 62932086Skarels qeread(sc, &ifxp->ifrw, 63032086Skarels len - sizeof(struct ether_header)); 63127915Skarels if (ifxp->ifw_xtofree) { 63227915Skarels m_freem(ifxp->ifw_xtofree); 63327915Skarels ifxp->ifw_xtofree = 0; 63427477Skjd } 63527477Skjd } 63627915Skarels sc->otindex = ++sc->otindex % NXMT; 63727477Skjd } 63827477Skjd qestart( unit ); 63927477Skjd } 640*36820Skarels 64127477Skjd /* 64227477Skjd * Ethernet interface receiver interrupt. 643*36820Skarels * If can't determine length from type, then have to drop packet. 644*36820Skarels * Othewise decapsulate packet based on type and pass to type specific 64527477Skjd * higher-level input routine. 64627477Skjd */ 64727477Skjd qerint(unit) 64827477Skjd int unit; 64927477Skjd { 65027477Skjd register struct qe_softc *sc = &qe_softc[unit]; 65127477Skjd register struct qe_ring *rp; 65227477Skjd int len, status1, status2; 65327477Skjd int bufaddr; 654*36820Skarels 65527477Skjd /* 65627477Skjd * Traverse the receive ring looking for packets to pass back. 65727477Skjd * The search is complete when we find a descriptor not in use. 65827477Skjd * 65927477Skjd * As in the transmit case the deqna doesn't honor it's own protocols 66027477Skjd * so there exists the possibility that the device can beat us around 66127477Skjd * the ring. The proper way to guard against this is to insure that 66227477Skjd * there is always at least one invalid descriptor. We chose instead 66327477Skjd * to make the ring large enough to minimize the problem. With a ring 66427477Skjd * size of 4 we haven't been able to see the problem. To be safe we 66527477Skjd * doubled that to 8. 66627477Skjd * 66727477Skjd */ 66827915Skarels for( ; sc->rring[sc->rindex].qe_status1 != QE_NOTYET ; sc->rindex = ++sc->rindex % NRCV ){ 66927477Skjd rp = &sc->rring[sc->rindex]; 67027477Skjd status1 = rp->qe_status1; 67127477Skjd status2 = rp->qe_status2; 67228953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 67327477Skjd if( (status1 & QE_MASK) == QE_MASK ) 67427477Skjd panic("qe: chained packet"); 67527915Skarels len = ((status1 & QE_RBL_HI) | (status2 & QE_RBL_LO)) + 60; 67634530Skarels sc->qe_if.if_ipackets++; 677*36820Skarels 67832086Skarels if (status1 & QE_ERROR) { 67932086Skarels if ((status1 & QE_RUNT) == 0) 68034530Skarels sc->qe_if.if_ierrors++; 68132086Skarels } else { 68227915Skarels /* 68327915Skarels * We don't process setup packets. 68427915Skarels */ 68527915Skarels if( !(status1 & QE_ESETUP) ) 68627915Skarels qeread(sc, &sc->qe_ifr[sc->rindex], 68727915Skarels len - sizeof(struct ether_header)); 68827477Skjd } 68927477Skjd /* 69027477Skjd * Return the buffer to the ring 69127477Skjd */ 69236031Skarels bufaddr = (int)UBAI_ADDR(sc->qe_ifr[sc->rindex].ifrw_info); 69327477Skjd rp->qe_buf_len = -((MAXPACKETSIZE)/2); 69427477Skjd rp->qe_addr_lo = (short)bufaddr; 69527477Skjd rp->qe_addr_hi = (short)((int)bufaddr >> 16); 69627477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 69727477Skjd rp->qe_valid = 1; 69827477Skjd } 69927477Skjd } 70027477Skjd /* 70127477Skjd * Ethernet output routine. 70227477Skjd * Encapsulate a packet of type family for the local net. 70327477Skjd * Use trailer local net encapsulation if enough data in first 70427477Skjd * packet leaves a multiple of 512 bytes of data in remainder. 70527477Skjd */ 70627477Skjd qeoutput(ifp, m0, dst) 70727477Skjd struct ifnet *ifp; 70827477Skjd struct mbuf *m0; 70927477Skjd struct sockaddr *dst; 71027477Skjd { 71127477Skjd int type, s, error; 71227477Skjd u_char edst[6]; 71327477Skjd struct in_addr idst; 71427477Skjd register struct qe_softc *is = &qe_softc[ifp->if_unit]; 71527477Skjd register struct mbuf *m = m0; 71627477Skjd register struct ether_header *eh; 71727477Skjd register int off; 71827915Skarels int usetrailers; 719*36820Skarels 72027915Skarels if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) { 72127915Skarels error = ENETDOWN; 72227915Skarels goto bad; 72327915Skarels } 72427915Skarels 72527477Skjd switch (dst->sa_family) { 726*36820Skarels 72727477Skjd #ifdef INET 72827477Skjd case AF_INET: 72927477Skjd idst = ((struct sockaddr_in *)dst)->sin_addr; 73034530Skarels if (!arpresolve(&is->qe_ac, m, &idst, edst, &usetrailers)) 73127477Skjd return (0); /* if not yet resolved */ 73227477Skjd off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len; 73327915Skarels if (usetrailers && off > 0 && (off & 0x1ff) == 0 && 73427915Skarels m->m_off >= MMINOFF + 2 * sizeof (u_short)) { 73527477Skjd type = ETHERTYPE_TRAIL + (off>>9); 73627477Skjd m->m_off -= 2 * sizeof (u_short); 73727477Skjd m->m_len += 2 * sizeof (u_short); 73827477Skjd *mtod(m, u_short *) = htons((u_short)ETHERTYPE_IP); 73927477Skjd *(mtod(m, u_short *) + 1) = htons((u_short)m->m_len); 74027915Skarels goto gottrailertype; 74127477Skjd } 74227477Skjd type = ETHERTYPE_IP; 74327477Skjd off = 0; 74427477Skjd goto gottype; 74527477Skjd #endif 74627915Skarels #ifdef NS 74727915Skarels case AF_NS: 74827915Skarels type = ETHERTYPE_NS; 74927915Skarels bcopy((caddr_t)&(((struct sockaddr_ns *)dst)->sns_addr.x_host), 75027915Skarels (caddr_t)edst, sizeof (edst)); 75127915Skarels off = 0; 75227915Skarels goto gottype; 75327915Skarels #endif 75427915Skarels 755*36820Skarels 75627477Skjd case AF_UNSPEC: 75727477Skjd eh = (struct ether_header *)dst->sa_data; 75827477Skjd bcopy((caddr_t)eh->ether_dhost, (caddr_t)edst, sizeof (edst)); 75927477Skjd type = eh->ether_type; 76027477Skjd goto gottype; 761*36820Skarels 76227477Skjd default: 76327915Skarels printf("qe%d: can't handle af%d\n", ifp->if_unit, 76427915Skarels dst->sa_family); 76527915Skarels error = EAFNOSUPPORT; 76627915Skarels goto bad; 76727477Skjd } 768*36820Skarels 76927915Skarels gottrailertype: 77027477Skjd /* 77127477Skjd * Packet to be sent as trailer: move first packet 77227477Skjd * (control information) to end of chain. 77327477Skjd */ 77427477Skjd while (m->m_next) 77527477Skjd m = m->m_next; 77627477Skjd m->m_next = m0; 77727477Skjd m = m0->m_next; 77827477Skjd m0->m_next = 0; 77927477Skjd m0 = m; 780*36820Skarels 78127477Skjd gottype: 78227477Skjd /* 78327477Skjd * Add local net header. If no space in first mbuf, 78427477Skjd * allocate another. 78527477Skjd */ 78627915Skarels if (m->m_off > MMAXOFF || 78727915Skarels MMINOFF + sizeof (struct ether_header) > m->m_off) { 78827477Skjd m = m_get(M_DONTWAIT, MT_HEADER); 78927477Skjd if (m == 0) { 79027477Skjd error = ENOBUFS; 79127477Skjd goto bad; 79227477Skjd } 79327477Skjd m->m_next = m0; 79427477Skjd m->m_off = MMINOFF; 79527477Skjd m->m_len = sizeof (struct ether_header); 79627477Skjd } else { 79727477Skjd m->m_off -= sizeof (struct ether_header); 79827477Skjd m->m_len += sizeof (struct ether_header); 79927477Skjd } 80027477Skjd eh = mtod(m, struct ether_header *); 80127477Skjd eh->ether_type = htons((u_short)type); 80227477Skjd bcopy((caddr_t)edst, (caddr_t)eh->ether_dhost, sizeof (edst)); 80334530Skarels bcopy((caddr_t)is->qe_addr, (caddr_t)eh->ether_shost, sizeof (is->qe_addr)); 804*36820Skarels 80527477Skjd /* 80627477Skjd * Queue message on interface, and start output if interface 80727477Skjd * not yet active. 80827477Skjd */ 80927477Skjd s = splimp(); 81027477Skjd if (IF_QFULL(&ifp->if_snd)) { 81127477Skjd IF_DROP(&ifp->if_snd); 81227477Skjd splx(s); 81327477Skjd m_freem(m); 81427477Skjd return (ENOBUFS); 81527477Skjd } 81627477Skjd IF_ENQUEUE(&ifp->if_snd, m); 81727477Skjd qestart(ifp->if_unit); 81827477Skjd splx(s); 81927477Skjd return (0); 820*36820Skarels 82127477Skjd bad: 82227477Skjd m_freem(m0); 82327477Skjd return (error); 82427477Skjd } 825*36820Skarels 826*36820Skarels 82727477Skjd /* 82827477Skjd * Process an ioctl request. 82927477Skjd */ 83027477Skjd qeioctl(ifp, cmd, data) 83127477Skjd register struct ifnet *ifp; 83227477Skjd int cmd; 83327477Skjd caddr_t data; 83427477Skjd { 83527477Skjd struct qe_softc *sc = &qe_softc[ifp->if_unit]; 83627477Skjd struct ifaddr *ifa = (struct ifaddr *)data; 83728927Skarels int s = splimp(), error = 0; 838*36820Skarels 83927477Skjd switch (cmd) { 840*36820Skarels 84127477Skjd case SIOCSIFADDR: 84227477Skjd ifp->if_flags |= IFF_UP; 84327477Skjd qeinit(ifp->if_unit); 84427477Skjd switch(ifa->ifa_addr.sa_family) { 84527477Skjd #ifdef INET 84627477Skjd case AF_INET: 84727477Skjd ((struct arpcom *)ifp)->ac_ipaddr = 84827477Skjd IA_SIN(ifa)->sin_addr; 84927477Skjd arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr); 85027477Skjd break; 85127477Skjd #endif 85227915Skarels #ifdef NS 85327915Skarels case AF_NS: 85427915Skarels { 85527915Skarels register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr); 856*36820Skarels 85727915Skarels if (ns_nullhost(*ina)) 85834530Skarels ina->x_host = *(union ns_host *)(sc->qe_addr); 85927915Skarels else 86027915Skarels qe_setaddr(ina->x_host.c_host, ifp->if_unit); 86127477Skjd break; 86227915Skarels } 86327915Skarels #endif 86427477Skjd } 86527477Skjd break; 86627915Skarels 86727915Skarels case SIOCSIFFLAGS: 86827915Skarels if ((ifp->if_flags & IFF_UP) == 0 && 86927915Skarels sc->qe_flags & QEF_RUNNING) { 87027915Skarels ((struct qedevice *) 87127915Skarels (qeinfo[ifp->if_unit]->ui_addr))->qe_csr = QE_RESET; 87227915Skarels sc->qe_flags &= ~QEF_RUNNING; 87330604Skarels } else if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) == 87430604Skarels IFF_RUNNING && (sc->qe_flags & QEF_RUNNING) == 0) 87528953Skarels qerestart(sc); 87627915Skarels break; 87727915Skarels 87827477Skjd default: 87927477Skjd error = EINVAL; 880*36820Skarels 88127477Skjd } 88228927Skarels splx(s); 88327477Skjd return (error); 88427477Skjd } 885*36820Skarels 88627915Skarels /* 88727915Skarels * set ethernet address for unit 88827915Skarels */ 88927915Skarels qe_setaddr(physaddr, unit) 89027915Skarels u_char *physaddr; 89127915Skarels int unit; 89227915Skarels { 89327915Skarels register struct qe_softc *sc = &qe_softc[unit]; 89427915Skarels register int i; 89527915Skarels 89627915Skarels for (i = 0; i < 6; i++) 89734530Skarels sc->setup_pkt[i][1] = sc->qe_addr[i] = physaddr[i]; 89827915Skarels sc->qe_flags |= QEF_SETADDR; 89934530Skarels if (sc->qe_if.if_flags & IFF_RUNNING) 90027915Skarels qesetup(sc); 90127915Skarels qeinit(unit); 90227915Skarels } 903*36820Skarels 904*36820Skarels 90527477Skjd /* 90627477Skjd * Initialize a ring descriptor with mbuf allocation side effects 90727477Skjd */ 90828953Skarels qeinitdesc(rp, addr, len) 90927477Skjd register struct qe_ring *rp; 91028953Skarels caddr_t addr; /* mapped address */ 91127477Skjd int len; 91227477Skjd { 91327477Skjd /* 91427477Skjd * clear the entire descriptor 91527477Skjd */ 91628953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 917*36820Skarels 91827477Skjd if( len ) { 91927477Skjd rp->qe_buf_len = -(len/2); 92028927Skarels rp->qe_addr_lo = (short)addr; 92128927Skarels rp->qe_addr_hi = (short)((int)addr >> 16); 92227477Skjd } 92327477Skjd } 92427477Skjd /* 92527477Skjd * Build a setup packet - the physical address will already be present 92627477Skjd * in first column. 92727477Skjd */ 92827477Skjd qesetup( sc ) 92927477Skjd struct qe_softc *sc; 93027477Skjd { 93128927Skarels register i, j; 932*36820Skarels 93327477Skjd /* 93427477Skjd * Copy the target address to the rest of the entries in this row. 93527477Skjd */ 93627477Skjd for ( j = 0; j < 6 ; j++ ) 93727477Skjd for ( i = 2 ; i < 8 ; i++ ) 93827477Skjd sc->setup_pkt[j][i] = sc->setup_pkt[j][1]; 93927477Skjd /* 94027477Skjd * Duplicate the first half. 94127477Skjd */ 94228953Skarels bcopy((caddr_t)sc->setup_pkt[0], (caddr_t)sc->setup_pkt[8], 64); 94327477Skjd /* 94427477Skjd * Fill in the broadcast address. 94527477Skjd */ 94627477Skjd for ( i = 0; i < 6 ; i++ ) 94727477Skjd sc->setup_pkt[i][2] = 0xff; 94827477Skjd sc->setupqueued++; 94927477Skjd } 95027915Skarels 95127477Skjd /* 95227477Skjd * Pass a packet to the higher levels. 95327477Skjd * We deal with the trailer protocol here. 95427477Skjd */ 95527915Skarels qeread(sc, ifrw, len) 95627477Skjd register struct qe_softc *sc; 95727477Skjd struct ifrw *ifrw; 95827477Skjd int len; 95927477Skjd { 96028927Skarels struct ether_header *eh; 96128927Skarels struct mbuf *m; 96236031Skarels int off, resid, s; 96327477Skjd struct ifqueue *inq; 964*36820Skarels 96527477Skjd /* 96627477Skjd * Deal with trailer protocol: if type is INET trailer 96727477Skjd * get true type from first 16-bit word past data. 96827477Skjd * Remember that type was trailer by setting off. 96927477Skjd */ 970*36820Skarels 97127477Skjd eh = (struct ether_header *)ifrw->ifrw_addr; 97227477Skjd eh->ether_type = ntohs((u_short)eh->ether_type); 97327477Skjd #define qedataaddr(eh, off, type) ((type)(((caddr_t)((eh)+1)+(off)))) 97427477Skjd if (eh->ether_type >= ETHERTYPE_TRAIL && 97527477Skjd eh->ether_type < ETHERTYPE_TRAIL+ETHERTYPE_NTRAILER) { 97627477Skjd off = (eh->ether_type - ETHERTYPE_TRAIL) * 512; 97727477Skjd if (off >= ETHERMTU) 97827477Skjd return; /* sanity */ 97927915Skarels eh->ether_type = ntohs(*qedataaddr(eh,off, u_short *)); 98027915Skarels resid = ntohs(*(qedataaddr(eh, off+2, u_short *))); 98127915Skarels if (off + resid > len) 98227915Skarels return; /* sanity */ 98327915Skarels len = off + resid; 98427915Skarels } else 98527477Skjd off = 0; 98627477Skjd if (len == 0) 98727477Skjd return; 988*36820Skarels 98927477Skjd /* 99027477Skjd * Pull packet off interface. Off is nonzero if packet 99127477Skjd * has trailing header; qeget will then force this header 99227477Skjd * information to be at the front, but we still have to drop 99327477Skjd * the type and length which are at the front of any trailer data. 99427477Skjd */ 99534530Skarels m = if_ubaget(&sc->qe_uba, ifrw, len, off, &sc->qe_if); 996*36820Skarels 99727477Skjd if (m == 0) 99827477Skjd return; 999*36820Skarels 100027477Skjd if (off) { 100127915Skarels struct ifnet *ifp; 100227915Skarels 100327915Skarels ifp = *(mtod(m, struct ifnet **)); 100427477Skjd m->m_off += 2 * sizeof (u_short); 100527477Skjd m->m_len -= 2 * sizeof (u_short); 100627915Skarels *(mtod(m, struct ifnet **)) = ifp; 100727477Skjd } 100827477Skjd switch (eh->ether_type) { 100927915Skarels 101027477Skjd #ifdef INET 101127477Skjd case ETHERTYPE_IP: 101227477Skjd schednetisr(NETISR_IP); 101327477Skjd inq = &ipintrq; 101427477Skjd break; 101527915Skarels 101627477Skjd case ETHERTYPE_ARP: 101734530Skarels arpinput(&sc->qe_ac, m); 101827477Skjd return; 101927477Skjd #endif 102027915Skarels #ifdef NS 102127915Skarels case ETHERTYPE_NS: 102227915Skarels schednetisr(NETISR_NS); 102327915Skarels inq = &nsintrq; 102427915Skarels break; 102527915Skarels 102627915Skarels #endif 1027*36820Skarels 102827477Skjd default: 102927915Skarels m_freem(m); 103027915Skarels return; 103127477Skjd } 1032*36820Skarels 103336031Skarels s = splimp(); 103427477Skjd if (IF_QFULL(inq)) { 103527477Skjd IF_DROP(inq); 103627477Skjd m_freem(m); 103736031Skarels } else 103836031Skarels IF_ENQUEUE(inq, m); 103936031Skarels splx(s); 104027477Skjd } 104127915Skarels 104227477Skjd /* 104334530Skarels * Watchdog timeout routine. There is a condition in the hardware that 104427477Skjd * causes the board to lock up under heavy load. This routine detects 104527477Skjd * the hang up and restarts the device. 104627477Skjd */ 104734530Skarels qetimeout(unit) 104834530Skarels int unit; 104927477Skjd { 105027477Skjd register struct qe_softc *sc; 1051*36820Skarels 105234530Skarels sc = &qe_softc[unit]; 105334530Skarels log(LOG_ERR, "qe%d: transmit timeout, restarted %d\n", 1054*36820Skarels unit, sc->qe_restarts++); 105534530Skarels qerestart(sc); 105627477Skjd } 105727477Skjd /* 105827477Skjd * Restart for board lockup problem. 105927477Skjd */ 106027915Skarels qerestart(sc) 106127477Skjd register struct qe_softc *sc; 106227477Skjd { 106334530Skarels register struct ifnet *ifp = &sc->qe_if; 106427477Skjd register struct qedevice *addr = sc->addr; 106527477Skjd register struct qe_ring *rp; 106627477Skjd register i; 1067*36820Skarels 106827477Skjd addr->qe_csr = QE_RESET; 1069*36820Skarels addr->qe_csr &= ~QE_RESET; 107027477Skjd qesetup( sc ); 107127915Skarels for (i = 0, rp = sc->tring; i < NXMT; rp++, i++) { 107227477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 107327477Skjd rp->qe_valid = 0; 107427477Skjd } 107527477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 107627915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 107727915Skarels QE_RCV_INT | QE_ILOOP; 107827477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 107927477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 108027915Skarels sc->qe_flags |= QEF_RUNNING; 108127915Skarels qestart(ifp->if_unit); 108227477Skjd } 108327477Skjd #endif 1084