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 * 844562Sbostic * %sccs.include.redist.c% 935326Sbostic * 10*47677Stef * @(#)if_qe.c 7.20 (Berkeley) 03/28/91 1135326Sbostic */ 1227477Skjd 1327915Skarels /* from @(#)if_qe.c 1.15 (ULTRIX) 4/16/86 */ 1436820Skarels 1527477Skjd /**************************************************************** 1627477Skjd * * 1727477Skjd * Licensed from Digital Equipment Corporation * 1827477Skjd * Copyright (c) * 1927477Skjd * Digital Equipment Corporation * 2027477Skjd * Maynard, Massachusetts * 2127477Skjd * 1985, 1986 * 2227477Skjd * All rights reserved. * 2327477Skjd * * 2427477Skjd * The Information in this software is subject to change * 2527477Skjd * without notice and should not be construed as a commitment * 2627477Skjd * by Digital Equipment Corporation. Digital makes no * 2727477Skjd * representations about the suitability of this software for * 2827477Skjd * any purpose. It is supplied "As Is" without expressed or * 2927477Skjd * implied warranty. * 3027477Skjd * * 3127477Skjd * If the Regents of the University of California or its * 3227477Skjd * licensees modify the software in a manner creating * 3327915Skarels * derivative copyright rights, appropriate copyright * 3427915Skarels * legends may be placed on the derivative work in addition * 3527477Skjd * to that set forth above. * 3627477Skjd * * 3727477Skjd ****************************************************************/ 3827477Skjd /* --------------------------------------------------------------------- 3936820Skarels * Modification History 4027477Skjd * 4127477Skjd * 15-Apr-86 -- afd 4227477Skjd * Rename "unused_multi" to "qunused_multi" for extending Generic 4327477Skjd * kernel to MicroVAXen. 4427477Skjd * 4527477Skjd * 18-mar-86 -- jaw br/cvec changed to NOT use registers. 4627477Skjd * 4727477Skjd * 12 March 86 -- Jeff Chase 4827477Skjd * Modified to handle the new MCLGET macro 4927477Skjd * Changed if_qe_data.c to use more receive buffers 5027477Skjd * Added a flag to poke with adb to log qe_restarts on console 5127477Skjd * 5227477Skjd * 19 Oct 85 -- rjl 5327477Skjd * Changed the watch dog timer from 30 seconds to 3. VMS is using 5427477Skjd * less than 1 second in their's. Also turned the printf into an 5527477Skjd * mprintf. 5627477Skjd * 5727477Skjd * 09/16/85 -- Larry Cohen 5836820Skarels * Add 43bsd alpha tape changes for subnet routing 5927477Skjd * 6027477Skjd * 1 Aug 85 -- rjl 6127477Skjd * Panic on a non-existent memory interrupt and the case where a packet 6236820Skarels * was chained. The first should never happen because non-existant 6327477Skjd * memory interrupts cause a bus reset. The second should never happen 6427477Skjd * because we hang 2k input buffers on the device. 6527477Skjd * 6627477Skjd * 1 Aug 85 -- rich 6727477Skjd * Fixed the broadcast loopback code to handle Clusters without 6827477Skjd * wedging the system. 6927477Skjd * 7027477Skjd * 27 Feb. 85 -- ejf 7127477Skjd * Return default hardware address on ioctl request. 7227477Skjd * 7327477Skjd * 12 Feb. 85 -- ejf 7427477Skjd * Added internal extended loopback capability. 7527477Skjd * 7627477Skjd * 27 Dec. 84 -- rjl 7727477Skjd * Fixed bug that caused every other transmit descriptor to be used 7827477Skjd * instead of every descriptor. 7927477Skjd * 8027477Skjd * 21 Dec. 84 -- rjl 8127477Skjd * Added watchdog timer to mask hardware bug that causes device lockup. 8227477Skjd * 8327477Skjd * 18 Dec. 84 -- rjl 8427477Skjd * Reworked driver to use q-bus mapping routines. MicroVAX-I now does 8527477Skjd * copying instead of m-buf shuffleing. 8627477Skjd * A number of deficencies in the hardware/firmware were compensated 8727477Skjd * for. See comments in qestart and qerint. 8827477Skjd * 8927477Skjd * 14 Nov. 84 -- jf 9027477Skjd * Added usage counts for multicast addresses. 9127477Skjd * Updated general protocol support to allow access to the Ethernet 9227477Skjd * header. 9327477Skjd * 9427477Skjd * 04 Oct. 84 -- jf 9527477Skjd * Added support for new ioctls to add and delete multicast addresses 9627477Skjd * and set the physical address. 9727477Skjd * Add support for general protocols. 9827477Skjd * 9927477Skjd * 14 Aug. 84 -- rjl 10027477Skjd * Integrated Shannon changes. (allow arp above 1024 and ? ) 10127477Skjd * 10227477Skjd * 13 Feb. 84 -- rjl 10327477Skjd * 10427477Skjd * Initial version of driver. derived from IL driver. 10536820Skarels * 10627477Skjd * --------------------------------------------------------------------- 10727477Skjd */ 10836820Skarels 10927477Skjd #include "qe.h" 11027915Skarels #if NQE > 0 11127477Skjd /* 11227477Skjd * Digital Q-BUS to NI Adapter 11327477Skjd */ 11445801Sbostic #include "sys/param.h" 11545801Sbostic #include "sys/systm.h" 11645801Sbostic #include "sys/mbuf.h" 11745801Sbostic #include "sys/buf.h" 11845801Sbostic #include "sys/protosw.h" 11945801Sbostic #include "sys/socket.h" 12045801Sbostic #include "sys/vmmac.h" 12145801Sbostic #include "sys/ioctl.h" 12245801Sbostic #include "sys/errno.h" 12345801Sbostic #include "sys/syslog.h" 12445801Sbostic #include "sys/time.h" 12545801Sbostic #include "sys/kernel.h" 12627915Skarels 12745801Sbostic #include "net/if.h" 12845801Sbostic #include "net/netisr.h" 12945801Sbostic #include "net/route.h" 13027915Skarels 13127915Skarels #ifdef INET 13245801Sbostic #include "netinet/in.h" 13345801Sbostic #include "netinet/in_systm.h" 13445801Sbostic #include "netinet/in_var.h" 13545801Sbostic #include "netinet/ip.h" 13645801Sbostic #include "netinet/if_ether.h" 13727915Skarels #endif 13827915Skarels 13927915Skarels #ifdef NS 14045801Sbostic #include "netns/ns.h" 14145801Sbostic #include "netns/ns_if.h" 14227915Skarels #endif 14327915Skarels 14438985Skarels #ifdef ISO 14545801Sbostic #include "netiso/iso.h" 14645801Sbostic #include "netiso/iso_var.h" 14745657Ssklower extern char all_es_snpa[], all_is_snpa[], all_l1is_snpa[], all_l2is_snpa[]; 14838985Skarels #endif 14938985Skarels 15045801Sbostic #include "../include/pte.h" 15145801Sbostic #include "../include/cpu.h" 15245801Sbostic #include "../include/mtpr.h" 15327915Skarels #include "if_qereg.h" 15427915Skarels #include "if_uba.h" 15545801Sbostic #include "../uba/ubareg.h" 15645801Sbostic #include "../uba/ubavar.h" 15736820Skarels 15836820Skarels #if NQE == 1 && !defined(QNIVERT) 15930604Skarels #define NRCV 15 /* Receive descriptors */ 16030604Skarels #else 16136820Skarels #define NRCV 10 /* Receive descriptors */ 16230604Skarels #endif 16327915Skarels #define NXMT 5 /* Transmit descriptors */ 16427915Skarels #define NTOT (NXMT + NRCV) 16534530Skarels 16634530Skarels #define QETIMEOUT 2 /* transmit timeout, must be > 1 */ 16739448Smckusick #define QESLOWTIMEOUT 40 /* timeout when no xmits in progress */ 16836820Skarels 16944950Ssklower #define MINDATA 60 17036820Skarels 17127915Skarels /* 17227915Skarels * Ethernet software status per interface. 17327915Skarels * 17427915Skarels * Each interface is referenced by a network interface structure, 17534530Skarels * qe_if, which the routing code uses to locate the interface. 17627915Skarels * This structure contains the output queue for the interface, its address, ... 17727915Skarels */ 17827915Skarels struct qe_softc { 17934530Skarels struct arpcom qe_ac; /* Ethernet common part */ 18034530Skarels #define qe_if qe_ac.ac_if /* network-visible interface */ 18134530Skarels #define qe_addr qe_ac.ac_enaddr /* hardware Ethernet address */ 18227915Skarels struct ifubinfo qe_uba; /* Q-bus resources */ 18327915Skarels struct ifrw qe_ifr[NRCV]; /* for receive buffers; */ 18427915Skarels struct ifxmt qe_ifw[NXMT]; /* for xmit buffers; */ 18527915Skarels int qe_flags; /* software state */ 18627915Skarels #define QEF_RUNNING 0x01 18727915Skarels #define QEF_SETADDR 0x02 18839420Smckusick #define QEF_FASTTIMEO 0x04 18927915Skarels int setupaddr; /* mapping info for setup pkts */ 19036031Skarels int ipl; /* interrupt priority */ 19127915Skarels struct qe_ring *rringaddr; /* mapping info for rings */ 19227915Skarels struct qe_ring *tringaddr; /* "" */ 19327915Skarels struct qe_ring rring[NRCV+1]; /* Receive ring descriptors */ 19427915Skarels struct qe_ring tring[NXMT+1]; /* Transmit ring descriptors */ 19527915Skarels u_char setup_pkt[16][8]; /* Setup packet */ 19627915Skarels int rindex; /* Receive index */ 19727915Skarels int tindex; /* Transmit index */ 19827915Skarels int otindex; /* Old transmit index */ 19927915Skarels int qe_intvec; /* Interrupt vector */ 20027915Skarels struct qedevice *addr; /* device addr */ 20127915Skarels int setupqueued; /* setup packet queued */ 20227915Skarels int nxmit; /* Transmits in progress */ 20327915Skarels int qe_restarts; /* timeouts */ 20427915Skarels } qe_softc[NQE]; 20527915Skarels 20627915Skarels struct uba_device *qeinfo[NQE]; 20736820Skarels 20827477Skjd extern struct timeval time; 20936820Skarels 21034530Skarels int qeprobe(), qeattach(), qeintr(), qetimeout(); 21138985Skarels int qeinit(), qeioctl(), qereset(), qestart(); 21236820Skarels 21327477Skjd u_short qestd[] = { 0 }; 21427477Skjd struct uba_driver qedriver = 21527477Skjd { qeprobe, 0, qeattach, 0, qestd, "qe", qeinfo }; 21636820Skarels 21727477Skjd #define QEUNIT(x) minor(x) 21827477Skjd /* 21927915Skarels * The deqna shouldn't receive more than ETHERMTU + sizeof(struct ether_header) 22027477Skjd * but will actually take in up to 2048 bytes. To guard against the receiver 22136820Skarels * chaining buffers (which we aren't prepared to handle) we allocate 2kb 22227477Skjd * size buffers. 22327477Skjd */ 22427477Skjd #define MAXPACKETSIZE 2048 /* Should really be ETHERMTU */ 22527477Skjd /* 22627477Skjd * Probe the QNA to see if it's there 22727477Skjd */ 22836031Skarels qeprobe(reg, ui) 22927477Skjd caddr_t reg; 23036031Skarels struct uba_device *ui; 23127477Skjd { 23227915Skarels register int br, cvec; /* r11, r10 value-result */ 23327477Skjd register struct qedevice *addr = (struct qedevice *)reg; 23436820Skarels register struct qe_ring *rp; 23527477Skjd register struct qe_ring *prp; /* physical rp */ 23636031Skarels register int i; 23736031Skarels register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 23836820Skarels 23928927Skarels #ifdef lint 24028927Skarels br = 0; cvec = br; br = cvec; 24128953Skarels qeintr(0); 24228927Skarels #endif 24336820Skarels 24427477Skjd /* 24536820Skarels * The QNA interrupts on i/o operations. To do an I/O operation 24627477Skjd * we have to setup the interface by transmitting a setup packet. 24727477Skjd */ 24827477Skjd addr->qe_csr = QE_RESET; 24935762Skarels addr->qe_csr &= ~QE_RESET; 25027477Skjd addr->qe_vector = (uba_hd[numuba].uh_lastiv -= 4); 25136820Skarels 25227477Skjd /* 25327477Skjd * Map the communications area and the setup packet. 25427477Skjd */ 25527477Skjd sc->setupaddr = 25628953Skarels uballoc(0, (caddr_t)sc->setup_pkt, sizeof(sc->setup_pkt), 0); 25728953Skarels sc->rringaddr = (struct qe_ring *) uballoc(0, (caddr_t)sc->rring, 25828953Skarels sizeof(struct qe_ring) * (NTOT+2), 0); 25936031Skarels prp = (struct qe_ring *)UBAI_ADDR((int)sc->rringaddr); 26036820Skarels 26127477Skjd /* 26227477Skjd * The QNA will loop the setup packet back to the receive ring 26336820Skarels * for verification, therefore we initialize the first 26427477Skjd * receive & transmit ring descriptors and link the setup packet 26527477Skjd * to them. 26627477Skjd */ 26736031Skarels qeinitdesc(sc->tring, (caddr_t)UBAI_ADDR(sc->setupaddr), 26828953Skarels sizeof(sc->setup_pkt)); 26936031Skarels qeinitdesc(sc->rring, (caddr_t)UBAI_ADDR(sc->setupaddr), 27028953Skarels sizeof(sc->setup_pkt)); 27136820Skarels 27227477Skjd rp = (struct qe_ring *)sc->tring; 27327477Skjd rp->qe_setup = 1; 27427477Skjd rp->qe_eomsg = 1; 27527477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 27627477Skjd rp->qe_valid = 1; 27736820Skarels 27827477Skjd rp = (struct qe_ring *)sc->rring; 27927477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 28027477Skjd rp->qe_valid = 1; 28136820Skarels 28227477Skjd /* 28327477Skjd * Get the addr off of the interface and place it into the setup 28427477Skjd * packet. This code looks strange due to the fact that the address 28536820Skarels * is placed in the setup packet in col. major order. 28627477Skjd */ 28727477Skjd for( i = 0 ; i < 6 ; i++ ) 28827477Skjd sc->setup_pkt[i][1] = addr->qe_sta_addr[i]; 28936820Skarels 29027477Skjd qesetup( sc ); 29127477Skjd /* 29227477Skjd * Start the interface and wait for the packet. 29327477Skjd */ 29436031Skarels (void) spl6(); 29527477Skjd addr->qe_csr = QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT; 29627477Skjd addr->qe_rcvlist_lo = (short)prp; 29727477Skjd addr->qe_rcvlist_hi = (short)((int)prp >> 16); 29827915Skarels prp += NRCV+1; 29927477Skjd addr->qe_xmtlist_lo = (short)prp; 30027477Skjd addr->qe_xmtlist_hi = (short)((int)prp >> 16); 30127477Skjd DELAY(10000); 30227477Skjd /* 30327915Skarels * All done with the bus resources. 30427477Skjd */ 30527915Skarels ubarelse(0, &sc->setupaddr); 30628953Skarels ubarelse(0, (int *)&sc->rringaddr); 30736031Skarels sc->ipl = br = qbgetpri(); 30827477Skjd return( sizeof(struct qedevice) ); 30927477Skjd } 31036820Skarels 31127477Skjd /* 31227477Skjd * Interface exists: make available by filling in network interface 31327477Skjd * record. System will initialize the interface when it is ready 31427477Skjd * to accept packets. 31527477Skjd */ 31627477Skjd qeattach(ui) 31727477Skjd struct uba_device *ui; 31827477Skjd { 31927477Skjd register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 32034530Skarels register struct ifnet *ifp = &sc->qe_if; 32127477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 32227477Skjd register int i; 32336820Skarels 32427477Skjd ifp->if_unit = ui->ui_unit; 32527477Skjd ifp->if_name = "qe"; 32627477Skjd ifp->if_mtu = ETHERMTU; 32745657Ssklower /* 32845657Ssklower * The Deqna is cable of transmitting broadcasts, but 32945657Ssklower * doesn't listen to its own. 33045657Ssklower */ 33145657Ssklower ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX; 33236820Skarels 33327477Skjd /* 33427477Skjd * Read the address from the prom and save it. 33527477Skjd */ 33627477Skjd for( i=0 ; i<6 ; i++ ) 33736820Skarels sc->setup_pkt[i][1] = sc->qe_addr[i] = addr->qe_sta_addr[i] & 0xff; 33835762Skarels addr->qe_vector |= 1; 33935762Skarels printf("qe%d: %s, hardware address %s\n", ui->ui_unit, 34035762Skarels addr->qe_vector&01 ? "delqa":"deqna", 34134551Smarc ether_sprintf(sc->qe_addr)); 34235762Skarels addr->qe_vector &= ~1; 34336820Skarels 34427477Skjd /* 34527477Skjd * Save the vector for initialization at reset time. 34627477Skjd */ 34727477Skjd sc->qe_intvec = addr->qe_vector; 34836820Skarels 34927477Skjd ifp->if_init = qeinit; 35038985Skarels ifp->if_output = ether_output; 35138985Skarels ifp->if_start = qestart; 35227477Skjd ifp->if_ioctl = qeioctl; 35327477Skjd ifp->if_reset = qereset; 35434530Skarels ifp->if_watchdog = qetimeout; 35527915Skarels sc->qe_uba.iff_flags = UBA_CANTWAIT; 35627477Skjd if_attach(ifp); 35727477Skjd } 35836820Skarels 35927477Skjd /* 36027477Skjd * Reset of interface after UNIBUS reset. 36127477Skjd * If interface is on specified uba, reset its state. 36227477Skjd */ 36327477Skjd qereset(unit, uban) 36427477Skjd int unit, uban; 36527477Skjd { 36627477Skjd register struct uba_device *ui; 36736820Skarels 36827915Skarels if (unit >= NQE || (ui = qeinfo[unit]) == 0 || ui->ui_alive == 0 || 36927477Skjd ui->ui_ubanum != uban) 37027477Skjd return; 37127477Skjd printf(" qe%d", unit); 37234530Skarels qe_softc[unit].qe_if.if_flags &= ~IFF_RUNNING; 37327477Skjd qeinit(unit); 37427477Skjd } 37536820Skarels 37627477Skjd /* 37736820Skarels * Initialization of interface. 37827477Skjd */ 37927477Skjd qeinit(unit) 38027477Skjd int unit; 38127477Skjd { 38227477Skjd register struct qe_softc *sc = &qe_softc[unit]; 38327477Skjd register struct uba_device *ui = qeinfo[unit]; 38427477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 38534530Skarels register struct ifnet *ifp = &sc->qe_if; 38627477Skjd register i; 38727477Skjd int s; 38836820Skarels 38927477Skjd /* address not known */ 39027477Skjd if (ifp->if_addrlist == (struct ifaddr *)0) 39127477Skjd return; 39227915Skarels if (sc->qe_flags & QEF_RUNNING) 39327477Skjd return; 39436820Skarels 39527915Skarels if ((ifp->if_flags & IFF_RUNNING) == 0) { 39627915Skarels /* 39736820Skarels * map the communications area onto the device 39827915Skarels */ 39936031Skarels i = uballoc(0, (caddr_t)sc->rring, 40036031Skarels sizeof(struct qe_ring) * (NTOT+2), 0); 40136031Skarels if (i == 0) 40236031Skarels goto fail; 40336031Skarels sc->rringaddr = (struct qe_ring *)UBAI_ADDR(i); 40427915Skarels sc->tringaddr = sc->rringaddr + NRCV + 1; 40536031Skarels i = uballoc(0, (caddr_t)sc->setup_pkt, 40636031Skarels sizeof(sc->setup_pkt), 0); 40736031Skarels if (i == 0) 40836031Skarels goto fail; 40936031Skarels sc->setupaddr = UBAI_ADDR(i); 41027915Skarels /* 41127915Skarels * init buffers and maps 41227915Skarels */ 41327915Skarels if (if_ubaminit(&sc->qe_uba, ui->ui_ubanum, 41427915Skarels sizeof (struct ether_header), (int)btoc(MAXPACKETSIZE), 41527915Skarels sc->qe_ifr, NRCV, sc->qe_ifw, NXMT) == 0) { 41636031Skarels fail: 41736820Skarels printf("qe%d: can't allocate uba resources\n", unit); 41834530Skarels sc->qe_if.if_flags &= ~IFF_UP; 41927915Skarels return; 42027915Skarels } 42127477Skjd } 42227477Skjd /* 42327477Skjd * Init the buffer descriptors and indexes for each of the lists and 42427477Skjd * loop them back to form a ring. 42527477Skjd */ 42627915Skarels for (i = 0; i < NRCV; i++) { 42727477Skjd qeinitdesc( &sc->rring[i], 42836031Skarels (caddr_t)UBAI_ADDR(sc->qe_ifr[i].ifrw_info), MAXPACKETSIZE); 42927477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 43027477Skjd sc->rring[i].qe_valid = 1; 43127477Skjd } 43228953Skarels qeinitdesc(&sc->rring[i], (caddr_t)NULL, 0); 43336820Skarels 43427477Skjd sc->rring[i].qe_addr_lo = (short)sc->rringaddr; 43527477Skjd sc->rring[i].qe_addr_hi = (short)((int)sc->rringaddr >> 16); 43627477Skjd sc->rring[i].qe_chain = 1; 43727477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 43827477Skjd sc->rring[i].qe_valid = 1; 43936820Skarels 44027915Skarels for( i = 0 ; i <= NXMT ; i++ ) 44128953Skarels qeinitdesc(&sc->tring[i], (caddr_t)NULL, 0); 44227477Skjd i--; 44336820Skarels 44427477Skjd sc->tring[i].qe_addr_lo = (short)sc->tringaddr; 44527477Skjd sc->tring[i].qe_addr_hi = (short)((int)sc->tringaddr >> 16); 44627477Skjd sc->tring[i].qe_chain = 1; 44727477Skjd sc->tring[i].qe_flag = sc->tring[i].qe_status1 = QE_NOTYET; 44827477Skjd sc->tring[i].qe_valid = 1; 44936820Skarels 45027477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 45136820Skarels 45227477Skjd /* 45336820Skarels * Take the interface out of reset, program the vector, 45427477Skjd * enable interrupts, and tell the world we are up. 45527477Skjd */ 45627477Skjd s = splimp(); 45727477Skjd addr->qe_vector = sc->qe_intvec; 45827477Skjd sc->addr = addr; 45927915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 46027915Skarels QE_RCV_INT | QE_ILOOP; 46127477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 46227477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 46327477Skjd ifp->if_flags |= IFF_UP | IFF_RUNNING; 46427915Skarels sc->qe_flags |= QEF_RUNNING; 46527477Skjd qesetup( sc ); 46638985Skarels (void) qestart( ifp ); 46739420Smckusick sc->qe_if.if_timer = QESLOWTIMEOUT; /* Start watchdog */ 46827477Skjd splx( s ); 46927477Skjd } 47036820Skarels 47127477Skjd /* 47227477Skjd * Start output on interface. 47327477Skjd * 47427477Skjd */ 47538985Skarels qestart(ifp) 47638985Skarels struct ifnet *ifp; 47727477Skjd { 47838985Skarels int unit = ifp->if_unit; 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; 48636820Skarels 48736820Skarels 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 49636820Skarels * 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 */ 50136820Skarels 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); 51438985Skarels return (0); 51527477Skjd } 51627915Skarels buf_addr = sc->qe_ifw[index].ifw_info; 51727915Skarels len = if_ubaput(&sc->qe_uba, &sc->qe_ifw[index], m); 51827477Skjd } 51944950Ssklower if( len < MINDATA ) 52044950Ssklower len = MINDATA; 52127477Skjd /* 52236820Skarels * Does buffer end on odd byte ? 52327477Skjd */ 52427477Skjd if( len & 1 ) { 52527477Skjd len++; 52627477Skjd rp->qe_odd_end = 1; 52727477Skjd } 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; 53639420Smckusick if (sc->nxmit++ == 0) { 53739420Smckusick sc->qe_flags |= QEF_FASTTIMEO; 53836820Skarels sc->qe_if.if_timer = QETIMEOUT; 53939420Smckusick } 54036820Skarels 54127477Skjd /* 54227477Skjd * See if the xmit list is invalid. 54327477Skjd */ 54427477Skjd if( addr->qe_csr & QE_XL_INVALID ) { 54527477Skjd buf_addr = (int)(sc->tringaddr+index); 54627477Skjd addr->qe_xmtlist_lo = (short)buf_addr; 54727477Skjd addr->qe_xmtlist_hi = (short)(buf_addr >> 16); 54827477Skjd } 54927477Skjd } 55027477Skjd splx( s ); 55138985Skarels return (0); 55227477Skjd } 55336820Skarels 55427477Skjd /* 55527477Skjd * Ethernet interface interrupt processor 55627477Skjd */ 55727477Skjd qeintr(unit) 55827477Skjd int unit; 55927477Skjd { 56027477Skjd register struct qe_softc *sc = &qe_softc[unit]; 56127477Skjd struct qedevice *addr = (struct qedevice *)qeinfo[unit]->ui_addr; 56236031Skarels int buf_addr, csr; 56336820Skarels 56438985Skarels #ifdef notdef 56536031Skarels splx(sc->ipl); 56638985Skarels #else 56736820Skarels (void) splimp(); 56838985Skarels #endif 56939420Smckusick if (!(sc->qe_flags & QEF_FASTTIMEO)) 57039420Smckusick sc->qe_if.if_timer = QESLOWTIMEOUT; /* Restart timer clock */ 57127477Skjd csr = addr->qe_csr; 57227915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT | QE_ILOOP; 57336820Skarels if( csr & QE_RCV_INT ) 57427477Skjd qerint( unit ); 57527477Skjd if( csr & QE_XMIT_INT ) 57627477Skjd qetint( unit ); 57727477Skjd if( csr & QE_NEX_MEM_INT ) 57836820Skarels printf("qe%d: Nonexistent memory interrupt\n", unit); 57936820Skarels 58027477Skjd if( addr->qe_csr & QE_RL_INVALID && sc->rring[sc->rindex].qe_status1 == QE_NOTYET ) { 58127477Skjd buf_addr = (int)&sc->rringaddr[sc->rindex]; 58227477Skjd addr->qe_rcvlist_lo = (short)buf_addr; 58327477Skjd addr->qe_rcvlist_hi = (short)(buf_addr >> 16); 58427477Skjd } 58527477Skjd } 58636820Skarels 58727477Skjd /* 58827477Skjd * Ethernet interface transmit interrupt. 58927477Skjd */ 59036820Skarels 59127477Skjd qetint(unit) 59227477Skjd int unit; 59327477Skjd { 59427477Skjd register struct qe_softc *sc = &qe_softc[unit]; 59527477Skjd register struct qe_ring *rp; 59627477Skjd register struct ifxmt *ifxp; 59728927Skarels int status1, setupflag; 59827477Skjd short len; 59936820Skarels 60036820Skarels 60127477Skjd while( sc->otindex != sc->tindex && sc->tring[sc->otindex].qe_status1 != QE_NOTYET && sc->nxmit > 0 ) { 60227477Skjd /* 60327477Skjd * Save the status words from the descriptor so that it can 60427477Skjd * be released. 60527477Skjd */ 60627477Skjd rp = &sc->tring[sc->otindex]; 60727477Skjd status1 = rp->qe_status1; 60827477Skjd setupflag = rp->qe_setup; 60927477Skjd len = (-rp->qe_buf_len) * 2; 61027477Skjd if( rp->qe_odd_end ) 61127477Skjd len++; 61227477Skjd /* 61327477Skjd * Init the buffer descriptor 61427477Skjd */ 61528953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 61639420Smckusick if( --sc->nxmit == 0 ) { 61739420Smckusick sc->qe_flags &= ~QEF_FASTTIMEO; 61839420Smckusick sc->qe_if.if_timer = QESLOWTIMEOUT; 61939420Smckusick } 62027477Skjd if( !setupflag ) { 62127477Skjd /* 62227477Skjd * Do some statistics. 62327477Skjd */ 62434530Skarels sc->qe_if.if_opackets++; 62534530Skarels sc->qe_if.if_collisions += ( status1 & QE_CCNT ) >> 4; 62627915Skarels if (status1 & QE_ERROR) 62734530Skarels sc->qe_if.if_oerrors++; 62827915Skarels ifxp = &sc->qe_ifw[sc->otindex]; 62927915Skarels if (ifxp->ifw_xtofree) { 63027915Skarels m_freem(ifxp->ifw_xtofree); 63127915Skarels ifxp->ifw_xtofree = 0; 63227477Skjd } 63327477Skjd } 63427915Skarels sc->otindex = ++sc->otindex % NXMT; 63527477Skjd } 63638985Skarels (void) qestart( &sc->qe_if ); 63727477Skjd } 63836820Skarels 63927477Skjd /* 64027477Skjd * Ethernet interface receiver interrupt. 64136820Skarels * If can't determine length from type, then have to drop packet. 64236820Skarels * Othewise decapsulate packet based on type and pass to type specific 64327477Skjd * higher-level input routine. 64427477Skjd */ 64527477Skjd qerint(unit) 64627477Skjd int unit; 64727477Skjd { 64827477Skjd register struct qe_softc *sc = &qe_softc[unit]; 64927477Skjd register struct qe_ring *rp; 650*47677Stef register int nrcv = 0; 65127477Skjd int len, status1, status2; 65227477Skjd int bufaddr; 65336820Skarels 65427477Skjd /* 65527477Skjd * Traverse the receive ring looking for packets to pass back. 65627477Skjd * The search is complete when we find a descriptor not in use. 65727477Skjd * 65827477Skjd * As in the transmit case the deqna doesn't honor it's own protocols 65927477Skjd * so there exists the possibility that the device can beat us around 66027477Skjd * the ring. The proper way to guard against this is to insure that 66127477Skjd * there is always at least one invalid descriptor. We chose instead 66227477Skjd * to make the ring large enough to minimize the problem. With a ring 66327477Skjd * size of 4 we haven't been able to see the problem. To be safe we 66427477Skjd * doubled that to 8. 66527477Skjd * 66627477Skjd */ 667*47677Stef while (sc->rring[sc->rindex].qe_status1 == QE_NOTYET && nrcv < NRCV) { 668*47677Stef /* 669*47677Stef * We got an interrupt but did not find an input packet 670*47677Stef * where we expected one to be, probably because the ring 671*47677Stef * was overrun. 672*47677Stef * We search forward to find a valid packet and start 673*47677Stef * processing from there. If no valid packet is found it 674*47677Stef * means we processed all the packets during a previous 675*47677Stef * interrupt and that the QE_RCV_INT bit was set while 676*47677Stef * we were processing one of these earlier packets. In 677*47677Stef * this case we can safely ignore the interrupt (by dropping 678*47677Stef * through the code below). 679*47677Stef */ 680*47677Stef sc->rindex = (sc->rindex + 1) % NRCV; 681*47677Stef nrcv++; 682*47677Stef } 683*47677Stef if (nrcv && nrcv < NRCV) 684*47677Stef log(LOG_ERR, "qe%d: ring overrun, resync'd by skipping %d\n", 685*47677Stef unit, nrcv); 686*47677Stef 68727915Skarels for( ; sc->rring[sc->rindex].qe_status1 != QE_NOTYET ; sc->rindex = ++sc->rindex % NRCV ){ 68827477Skjd rp = &sc->rring[sc->rindex]; 68927477Skjd status1 = rp->qe_status1; 69027477Skjd status2 = rp->qe_status2; 69128953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 69227477Skjd if( (status1 & QE_MASK) == QE_MASK ) 69327477Skjd panic("qe: chained packet"); 69427915Skarels len = ((status1 & QE_RBL_HI) | (status2 & QE_RBL_LO)) + 60; 69534530Skarels sc->qe_if.if_ipackets++; 69636820Skarels 69732086Skarels if (status1 & QE_ERROR) { 69832086Skarels if ((status1 & QE_RUNT) == 0) 69934530Skarels sc->qe_if.if_ierrors++; 70032086Skarels } else { 70127915Skarels /* 70227915Skarels * We don't process setup packets. 70327915Skarels */ 70427915Skarels if( !(status1 & QE_ESETUP) ) 70527915Skarels qeread(sc, &sc->qe_ifr[sc->rindex], 70627915Skarels len - sizeof(struct ether_header)); 70727477Skjd } 70827477Skjd /* 70927477Skjd * Return the buffer to the ring 71027477Skjd */ 71136031Skarels bufaddr = (int)UBAI_ADDR(sc->qe_ifr[sc->rindex].ifrw_info); 71227477Skjd rp->qe_buf_len = -((MAXPACKETSIZE)/2); 71327477Skjd rp->qe_addr_lo = (short)bufaddr; 71427477Skjd rp->qe_addr_hi = (short)((int)bufaddr >> 16); 71527477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 71627477Skjd rp->qe_valid = 1; 71727477Skjd } 71827477Skjd } 71936820Skarels 72027477Skjd /* 72127477Skjd * Process an ioctl request. 72227477Skjd */ 72327477Skjd qeioctl(ifp, cmd, data) 72427477Skjd register struct ifnet *ifp; 72527477Skjd int cmd; 72627477Skjd caddr_t data; 72727477Skjd { 72827477Skjd struct qe_softc *sc = &qe_softc[ifp->if_unit]; 72927477Skjd struct ifaddr *ifa = (struct ifaddr *)data; 73028927Skarels int s = splimp(), error = 0; 73136820Skarels 73227477Skjd switch (cmd) { 73336820Skarels 73427477Skjd case SIOCSIFADDR: 73527477Skjd ifp->if_flags |= IFF_UP; 73627477Skjd qeinit(ifp->if_unit); 73738985Skarels switch(ifa->ifa_addr->sa_family) { 73827477Skjd #ifdef INET 73927477Skjd case AF_INET: 74027477Skjd ((struct arpcom *)ifp)->ac_ipaddr = 74127477Skjd IA_SIN(ifa)->sin_addr; 74227477Skjd arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr); 74327477Skjd break; 74427477Skjd #endif 74527915Skarels #ifdef NS 74627915Skarels case AF_NS: 74727915Skarels { 74827915Skarels register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr); 74936820Skarels 75027915Skarels if (ns_nullhost(*ina)) 75134530Skarels ina->x_host = *(union ns_host *)(sc->qe_addr); 75227915Skarels else 75327915Skarels qe_setaddr(ina->x_host.c_host, ifp->if_unit); 75427477Skjd break; 75527915Skarels } 75627915Skarels #endif 75727477Skjd } 75827477Skjd break; 75927915Skarels 76027915Skarels case SIOCSIFFLAGS: 76127915Skarels if ((ifp->if_flags & IFF_UP) == 0 && 76227915Skarels sc->qe_flags & QEF_RUNNING) { 76327915Skarels ((struct qedevice *) 76427915Skarels (qeinfo[ifp->if_unit]->ui_addr))->qe_csr = QE_RESET; 76527915Skarels sc->qe_flags &= ~QEF_RUNNING; 76630604Skarels } else if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) == 76730604Skarels IFF_RUNNING && (sc->qe_flags & QEF_RUNNING) == 0) 76828953Skarels qerestart(sc); 76927915Skarels break; 77027915Skarels 77127477Skjd default: 77227477Skjd error = EINVAL; 77336820Skarels 77427477Skjd } 77528927Skarels splx(s); 77627477Skjd return (error); 77727477Skjd } 77836820Skarels 77927915Skarels /* 78027915Skarels * set ethernet address for unit 78127915Skarels */ 78227915Skarels qe_setaddr(physaddr, unit) 78327915Skarels u_char *physaddr; 78427915Skarels int unit; 78527915Skarels { 78627915Skarels register struct qe_softc *sc = &qe_softc[unit]; 78727915Skarels register int i; 78827915Skarels 78927915Skarels for (i = 0; i < 6; i++) 79034530Skarels sc->setup_pkt[i][1] = sc->qe_addr[i] = physaddr[i]; 79127915Skarels sc->qe_flags |= QEF_SETADDR; 79234530Skarels if (sc->qe_if.if_flags & IFF_RUNNING) 79327915Skarels qesetup(sc); 79427915Skarels qeinit(unit); 79527915Skarels } 79636820Skarels 79736820Skarels 79827477Skjd /* 79927477Skjd * Initialize a ring descriptor with mbuf allocation side effects 80027477Skjd */ 80128953Skarels qeinitdesc(rp, addr, len) 80227477Skjd register struct qe_ring *rp; 80328953Skarels caddr_t addr; /* mapped address */ 80427477Skjd int len; 80527477Skjd { 80627477Skjd /* 80727477Skjd * clear the entire descriptor 80827477Skjd */ 80928953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 81036820Skarels 81127477Skjd if( len ) { 81227477Skjd rp->qe_buf_len = -(len/2); 81328927Skarels rp->qe_addr_lo = (short)addr; 81428927Skarels rp->qe_addr_hi = (short)((int)addr >> 16); 81527477Skjd } 81627477Skjd } 81727477Skjd /* 81827477Skjd * Build a setup packet - the physical address will already be present 81927477Skjd * in first column. 82027477Skjd */ 82127477Skjd qesetup( sc ) 82227477Skjd struct qe_softc *sc; 82327477Skjd { 82428927Skarels register i, j; 82536820Skarels 82627477Skjd /* 82727477Skjd * Copy the target address to the rest of the entries in this row. 82827477Skjd */ 82927477Skjd for ( j = 0; j < 6 ; j++ ) 83027477Skjd for ( i = 2 ; i < 8 ; i++ ) 83127477Skjd sc->setup_pkt[j][i] = sc->setup_pkt[j][1]; 83227477Skjd /* 83327477Skjd * Duplicate the first half. 83427477Skjd */ 83528953Skarels bcopy((caddr_t)sc->setup_pkt[0], (caddr_t)sc->setup_pkt[8], 64); 83627477Skjd /* 83738985Skarels * Fill in the broadcast (and ISO multicast) address(es). 83827477Skjd */ 83938985Skarels for ( i = 0; i < 6 ; i++ ) { 84027477Skjd sc->setup_pkt[i][2] = 0xff; 84138985Skarels #ifdef ISO 84243337Ssklower sc->setup_pkt[i][3] = all_es_snpa[i]; 84343337Ssklower sc->setup_pkt[i][4] = all_is_snpa[i]; 84445657Ssklower sc->setup_pkt[i][5] = all_l1is_snpa[i]; 84545657Ssklower sc->setup_pkt[i][6] = all_l2is_snpa[i]; 84638985Skarels #endif 84738985Skarels } 84827477Skjd sc->setupqueued++; 84927477Skjd } 85027915Skarels 85127477Skjd /* 85227477Skjd * Pass a packet to the higher levels. 85327477Skjd * We deal with the trailer protocol here. 85427477Skjd */ 85527915Skarels qeread(sc, ifrw, len) 85627477Skjd register struct qe_softc *sc; 85727477Skjd struct ifrw *ifrw; 85827477Skjd int len; 85927477Skjd { 86028927Skarels struct ether_header *eh; 86128927Skarels struct mbuf *m; 86236031Skarels int off, resid, s; 86327477Skjd struct ifqueue *inq; 86436820Skarels 86527477Skjd /* 86627477Skjd * Deal with trailer protocol: if type is INET trailer 86727477Skjd * get true type from first 16-bit word past data. 86827477Skjd * Remember that type was trailer by setting off. 86927477Skjd */ 87036820Skarels 87127477Skjd eh = (struct ether_header *)ifrw->ifrw_addr; 87227477Skjd eh->ether_type = ntohs((u_short)eh->ether_type); 87327477Skjd #define qedataaddr(eh, off, type) ((type)(((caddr_t)((eh)+1)+(off)))) 87427477Skjd if (eh->ether_type >= ETHERTYPE_TRAIL && 87527477Skjd eh->ether_type < ETHERTYPE_TRAIL+ETHERTYPE_NTRAILER) { 87627477Skjd off = (eh->ether_type - ETHERTYPE_TRAIL) * 512; 87727477Skjd if (off >= ETHERMTU) 87827477Skjd return; /* sanity */ 87927915Skarels eh->ether_type = ntohs(*qedataaddr(eh,off, u_short *)); 88027915Skarels resid = ntohs(*(qedataaddr(eh, off+2, u_short *))); 88127915Skarels if (off + resid > len) 88227915Skarels return; /* sanity */ 88327915Skarels len = off + resid; 88427915Skarels } else 88527477Skjd off = 0; 88627477Skjd if (len == 0) 88727477Skjd return; 88836820Skarels 88927477Skjd /* 89027477Skjd * Pull packet off interface. Off is nonzero if packet 89127477Skjd * has trailing header; qeget will then force this header 89227477Skjd * information to be at the front, but we still have to drop 89327477Skjd * the type and length which are at the front of any trailer data. 89427477Skjd */ 89534530Skarels m = if_ubaget(&sc->qe_uba, ifrw, len, off, &sc->qe_if); 89636820Skarels 89738985Skarels if (m) 89838985Skarels ether_input(&sc->qe_if, eh, m); 89927477Skjd } 90027915Skarels 90127477Skjd /* 90234530Skarels * Watchdog timeout routine. There is a condition in the hardware that 90327477Skjd * causes the board to lock up under heavy load. This routine detects 90427477Skjd * the hang up and restarts the device. 90527477Skjd */ 90634530Skarels qetimeout(unit) 90734530Skarels int unit; 90827477Skjd { 90927477Skjd register struct qe_softc *sc; 91036820Skarels 91134530Skarels sc = &qe_softc[unit]; 91239420Smckusick #ifdef notdef 91334530Skarels log(LOG_ERR, "qe%d: transmit timeout, restarted %d\n", 91436820Skarels unit, sc->qe_restarts++); 91539420Smckusick #endif 91634530Skarels qerestart(sc); 91727477Skjd } 91827477Skjd /* 91927477Skjd * Restart for board lockup problem. 92027477Skjd */ 92127915Skarels qerestart(sc) 92227477Skjd register struct qe_softc *sc; 92327477Skjd { 92434530Skarels register struct ifnet *ifp = &sc->qe_if; 92527477Skjd register struct qedevice *addr = sc->addr; 92627477Skjd register struct qe_ring *rp; 92727477Skjd register i; 92836820Skarels 92927477Skjd addr->qe_csr = QE_RESET; 93036820Skarels addr->qe_csr &= ~QE_RESET; 93127477Skjd qesetup( sc ); 93227915Skarels for (i = 0, rp = sc->tring; i < NXMT; rp++, i++) { 93327477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 93427477Skjd rp->qe_valid = 0; 93527477Skjd } 93627477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 93727915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 93827915Skarels QE_RCV_INT | QE_ILOOP; 93927477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 94027477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 94127915Skarels sc->qe_flags |= QEF_RUNNING; 94238985Skarels (void) qestart(ifp); 94327477Skjd } 94427477Skjd #endif 945