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*39420Smckusick * @(#)if_qe.c 7.13 (Berkeley) 10/28/89 2135326Sbostic */ 2227477Skjd 2327915Skarels /* from @(#)if_qe.c 1.15 (ULTRIX) 4/16/86 */ 2436820Skarels 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 /* --------------------------------------------------------------------- 4936820Skarels * 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 6836820Skarels * 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 7236820Skarels * 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. 11536820Skarels * 11627477Skjd * --------------------------------------------------------------------- 11727477Skjd */ 11836820Skarels 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 15438985Skarels #ifdef ISO 15538985Skarels #include "../netiso/iso.h" 15638985Skarels #include "../netiso/iso_var.h" 15738985Skarels #include "../netiso/iso_snpac.h" 15838985Skarels extern struct snpa_cache all_es, all_is; 15938985Skarels #endif 16038985Skarels 16134530Skarels #include "../vax/pte.h" 16227915Skarels #include "../vax/cpu.h" 16327915Skarels #include "../vax/mtpr.h" 16427915Skarels #include "if_qereg.h" 16527915Skarels #include "if_uba.h" 16627915Skarels #include "../vaxuba/ubareg.h" 16727915Skarels #include "../vaxuba/ubavar.h" 16836820Skarels 16936820Skarels #if NQE == 1 && !defined(QNIVERT) 17030604Skarels #define NRCV 15 /* Receive descriptors */ 17130604Skarels #else 17236820Skarels #define NRCV 10 /* Receive descriptors */ 17330604Skarels #endif 17427915Skarels #define NXMT 5 /* Transmit descriptors */ 17527915Skarels #define NTOT (NXMT + NRCV) 17634530Skarels 17734530Skarels #define QETIMEOUT 2 /* transmit timeout, must be > 1 */ 178*39420Smckusick #define QESLOWTIMEOUT 10 /* timeout when no xmits in progress */ 17936820Skarels 18027915Skarels /* 18127915Skarels * This constant should really be 60 because the qna adds 4 bytes of crc. 18227915Skarels * However when set to 60 our packets are ignored by deuna's , 3coms are 18327915Skarels * okay ?????????????????????????????????????????? 18427915Skarels */ 18527915Skarels #define MINDATA 64 18636820Skarels 18727915Skarels /* 18827915Skarels * Ethernet software status per interface. 18927915Skarels * 19027915Skarels * Each interface is referenced by a network interface structure, 19134530Skarels * qe_if, which the routing code uses to locate the interface. 19227915Skarels * This structure contains the output queue for the interface, its address, ... 19327915Skarels */ 19427915Skarels struct qe_softc { 19534530Skarels struct arpcom qe_ac; /* Ethernet common part */ 19634530Skarels #define qe_if qe_ac.ac_if /* network-visible interface */ 19734530Skarels #define qe_addr qe_ac.ac_enaddr /* hardware Ethernet address */ 19827915Skarels struct ifubinfo qe_uba; /* Q-bus resources */ 19927915Skarels struct ifrw qe_ifr[NRCV]; /* for receive buffers; */ 20027915Skarels struct ifxmt qe_ifw[NXMT]; /* for xmit buffers; */ 20127915Skarels int qe_flags; /* software state */ 20227915Skarels #define QEF_RUNNING 0x01 20327915Skarels #define QEF_SETADDR 0x02 204*39420Smckusick #define QEF_FASTTIMEO 0x04 20527915Skarels int setupaddr; /* mapping info for setup pkts */ 20636031Skarels int ipl; /* interrupt priority */ 20727915Skarels struct qe_ring *rringaddr; /* mapping info for rings */ 20827915Skarels struct qe_ring *tringaddr; /* "" */ 20927915Skarels struct qe_ring rring[NRCV+1]; /* Receive ring descriptors */ 21027915Skarels struct qe_ring tring[NXMT+1]; /* Transmit ring descriptors */ 21127915Skarels u_char setup_pkt[16][8]; /* Setup packet */ 21227915Skarels int rindex; /* Receive index */ 21327915Skarels int tindex; /* Transmit index */ 21427915Skarels int otindex; /* Old transmit index */ 21527915Skarels int qe_intvec; /* Interrupt vector */ 21627915Skarels struct qedevice *addr; /* device addr */ 21727915Skarels int setupqueued; /* setup packet queued */ 21827915Skarels int nxmit; /* Transmits in progress */ 21927915Skarels int qe_restarts; /* timeouts */ 22027915Skarels } qe_softc[NQE]; 22127915Skarels 22227915Skarels struct uba_device *qeinfo[NQE]; 22336820Skarels 22427477Skjd extern struct timeval time; 22536820Skarels 22634530Skarels int qeprobe(), qeattach(), qeintr(), qetimeout(); 22738985Skarels int qeinit(), qeioctl(), qereset(), qestart(); 22836820Skarels 22927477Skjd u_short qestd[] = { 0 }; 23027477Skjd struct uba_driver qedriver = 23127477Skjd { qeprobe, 0, qeattach, 0, qestd, "qe", qeinfo }; 23236820Skarels 23327477Skjd #define QEUNIT(x) minor(x) 23427477Skjd /* 23527915Skarels * The deqna shouldn't receive more than ETHERMTU + sizeof(struct ether_header) 23627477Skjd * but will actually take in up to 2048 bytes. To guard against the receiver 23736820Skarels * chaining buffers (which we aren't prepared to handle) we allocate 2kb 23827477Skjd * size buffers. 23927477Skjd */ 24027477Skjd #define MAXPACKETSIZE 2048 /* Should really be ETHERMTU */ 24127477Skjd /* 24227477Skjd * Probe the QNA to see if it's there 24327477Skjd */ 24436031Skarels qeprobe(reg, ui) 24527477Skjd caddr_t reg; 24636031Skarels struct uba_device *ui; 24727477Skjd { 24827915Skarels register int br, cvec; /* r11, r10 value-result */ 24927477Skjd register struct qedevice *addr = (struct qedevice *)reg; 25036820Skarels register struct qe_ring *rp; 25127477Skjd register struct qe_ring *prp; /* physical rp */ 25236031Skarels register int i; 25336031Skarels register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 25436820Skarels 25528927Skarels #ifdef lint 25628927Skarels br = 0; cvec = br; br = cvec; 25728953Skarels qeintr(0); 25828927Skarels #endif 25936820Skarels 26027477Skjd /* 26136820Skarels * The QNA interrupts on i/o operations. To do an I/O operation 26227477Skjd * we have to setup the interface by transmitting a setup packet. 26327477Skjd */ 26427477Skjd addr->qe_csr = QE_RESET; 26535762Skarels addr->qe_csr &= ~QE_RESET; 26627477Skjd addr->qe_vector = (uba_hd[numuba].uh_lastiv -= 4); 26736820Skarels 26827477Skjd /* 26927477Skjd * Map the communications area and the setup packet. 27027477Skjd */ 27127477Skjd sc->setupaddr = 27228953Skarels uballoc(0, (caddr_t)sc->setup_pkt, sizeof(sc->setup_pkt), 0); 27328953Skarels sc->rringaddr = (struct qe_ring *) uballoc(0, (caddr_t)sc->rring, 27428953Skarels sizeof(struct qe_ring) * (NTOT+2), 0); 27536031Skarels prp = (struct qe_ring *)UBAI_ADDR((int)sc->rringaddr); 27636820Skarels 27727477Skjd /* 27827477Skjd * The QNA will loop the setup packet back to the receive ring 27936820Skarels * for verification, therefore we initialize the first 28027477Skjd * receive & transmit ring descriptors and link the setup packet 28127477Skjd * to them. 28227477Skjd */ 28336031Skarels qeinitdesc(sc->tring, (caddr_t)UBAI_ADDR(sc->setupaddr), 28428953Skarels sizeof(sc->setup_pkt)); 28536031Skarels qeinitdesc(sc->rring, (caddr_t)UBAI_ADDR(sc->setupaddr), 28628953Skarels sizeof(sc->setup_pkt)); 28736820Skarels 28827477Skjd rp = (struct qe_ring *)sc->tring; 28927477Skjd rp->qe_setup = 1; 29027477Skjd rp->qe_eomsg = 1; 29127477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 29227477Skjd rp->qe_valid = 1; 29336820Skarels 29427477Skjd rp = (struct qe_ring *)sc->rring; 29527477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 29627477Skjd rp->qe_valid = 1; 29736820Skarels 29827477Skjd /* 29927477Skjd * Get the addr off of the interface and place it into the setup 30027477Skjd * packet. This code looks strange due to the fact that the address 30136820Skarels * is placed in the setup packet in col. major order. 30227477Skjd */ 30327477Skjd for( i = 0 ; i < 6 ; i++ ) 30427477Skjd sc->setup_pkt[i][1] = addr->qe_sta_addr[i]; 30536820Skarels 30627477Skjd qesetup( sc ); 30727477Skjd /* 30827477Skjd * Start the interface and wait for the packet. 30927477Skjd */ 31036031Skarels (void) spl6(); 31127477Skjd addr->qe_csr = QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT; 31227477Skjd addr->qe_rcvlist_lo = (short)prp; 31327477Skjd addr->qe_rcvlist_hi = (short)((int)prp >> 16); 31427915Skarels prp += NRCV+1; 31527477Skjd addr->qe_xmtlist_lo = (short)prp; 31627477Skjd addr->qe_xmtlist_hi = (short)((int)prp >> 16); 31727477Skjd DELAY(10000); 31827477Skjd /* 31927915Skarels * All done with the bus resources. 32027477Skjd */ 32127915Skarels ubarelse(0, &sc->setupaddr); 32228953Skarels ubarelse(0, (int *)&sc->rringaddr); 32336031Skarels sc->ipl = br = qbgetpri(); 32427477Skjd return( sizeof(struct qedevice) ); 32527477Skjd } 32636820Skarels 32727477Skjd /* 32827477Skjd * Interface exists: make available by filling in network interface 32927477Skjd * record. System will initialize the interface when it is ready 33027477Skjd * to accept packets. 33127477Skjd */ 33227477Skjd qeattach(ui) 33327477Skjd struct uba_device *ui; 33427477Skjd { 33527477Skjd register struct qe_softc *sc = &qe_softc[ui->ui_unit]; 33634530Skarels register struct ifnet *ifp = &sc->qe_if; 33727477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 33827477Skjd register int i; 33936820Skarels 34027477Skjd ifp->if_unit = ui->ui_unit; 34127477Skjd ifp->if_name = "qe"; 34227477Skjd ifp->if_mtu = ETHERMTU; 34327915Skarels ifp->if_flags = IFF_BROADCAST; 34436820Skarels 34527477Skjd /* 34627477Skjd * Read the address from the prom and save it. 34727477Skjd */ 34827477Skjd for( i=0 ; i<6 ; i++ ) 34936820Skarels sc->setup_pkt[i][1] = sc->qe_addr[i] = addr->qe_sta_addr[i] & 0xff; 35035762Skarels addr->qe_vector |= 1; 35135762Skarels printf("qe%d: %s, hardware address %s\n", ui->ui_unit, 35235762Skarels addr->qe_vector&01 ? "delqa":"deqna", 35334551Smarc ether_sprintf(sc->qe_addr)); 35435762Skarels addr->qe_vector &= ~1; 35536820Skarels 35627477Skjd /* 35727477Skjd * Save the vector for initialization at reset time. 35827477Skjd */ 35927477Skjd sc->qe_intvec = addr->qe_vector; 36036820Skarels 36127477Skjd ifp->if_init = qeinit; 36238985Skarels ifp->if_output = ether_output; 36338985Skarels ifp->if_start = qestart; 36427477Skjd ifp->if_ioctl = qeioctl; 36527477Skjd ifp->if_reset = qereset; 36634530Skarels ifp->if_watchdog = qetimeout; 36727915Skarels sc->qe_uba.iff_flags = UBA_CANTWAIT; 36827477Skjd if_attach(ifp); 36927477Skjd } 37036820Skarels 37127477Skjd /* 37227477Skjd * Reset of interface after UNIBUS reset. 37327477Skjd * If interface is on specified uba, reset its state. 37427477Skjd */ 37527477Skjd qereset(unit, uban) 37627477Skjd int unit, uban; 37727477Skjd { 37827477Skjd register struct uba_device *ui; 37936820Skarels 38027915Skarels if (unit >= NQE || (ui = qeinfo[unit]) == 0 || ui->ui_alive == 0 || 38127477Skjd ui->ui_ubanum != uban) 38227477Skjd return; 38327477Skjd printf(" qe%d", unit); 38434530Skarels qe_softc[unit].qe_if.if_flags &= ~IFF_RUNNING; 38527477Skjd qeinit(unit); 38627477Skjd } 38736820Skarels 38827477Skjd /* 38936820Skarels * Initialization of interface. 39027477Skjd */ 39127477Skjd qeinit(unit) 39227477Skjd int unit; 39327477Skjd { 39427477Skjd register struct qe_softc *sc = &qe_softc[unit]; 39527477Skjd register struct uba_device *ui = qeinfo[unit]; 39627477Skjd register struct qedevice *addr = (struct qedevice *)ui->ui_addr; 39734530Skarels register struct ifnet *ifp = &sc->qe_if; 39827477Skjd register i; 39927477Skjd int s; 40036820Skarels 40127477Skjd /* address not known */ 40227477Skjd if (ifp->if_addrlist == (struct ifaddr *)0) 40327477Skjd return; 40427915Skarels if (sc->qe_flags & QEF_RUNNING) 40527477Skjd return; 40636820Skarels 40727915Skarels if ((ifp->if_flags & IFF_RUNNING) == 0) { 40827915Skarels /* 40936820Skarels * map the communications area onto the device 41027915Skarels */ 41136031Skarels i = uballoc(0, (caddr_t)sc->rring, 41236031Skarels sizeof(struct qe_ring) * (NTOT+2), 0); 41336031Skarels if (i == 0) 41436031Skarels goto fail; 41536031Skarels sc->rringaddr = (struct qe_ring *)UBAI_ADDR(i); 41627915Skarels sc->tringaddr = sc->rringaddr + NRCV + 1; 41736031Skarels i = uballoc(0, (caddr_t)sc->setup_pkt, 41836031Skarels sizeof(sc->setup_pkt), 0); 41936031Skarels if (i == 0) 42036031Skarels goto fail; 42136031Skarels sc->setupaddr = UBAI_ADDR(i); 42227915Skarels /* 42327915Skarels * init buffers and maps 42427915Skarels */ 42527915Skarels if (if_ubaminit(&sc->qe_uba, ui->ui_ubanum, 42627915Skarels sizeof (struct ether_header), (int)btoc(MAXPACKETSIZE), 42727915Skarels sc->qe_ifr, NRCV, sc->qe_ifw, NXMT) == 0) { 42836031Skarels fail: 42936820Skarels printf("qe%d: can't allocate uba resources\n", unit); 43034530Skarels sc->qe_if.if_flags &= ~IFF_UP; 43127915Skarels return; 43227915Skarels } 43327477Skjd } 43427477Skjd /* 43527477Skjd * Init the buffer descriptors and indexes for each of the lists and 43627477Skjd * loop them back to form a ring. 43727477Skjd */ 43827915Skarels for (i = 0; i < NRCV; i++) { 43927477Skjd qeinitdesc( &sc->rring[i], 44036031Skarels (caddr_t)UBAI_ADDR(sc->qe_ifr[i].ifrw_info), MAXPACKETSIZE); 44127477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 44227477Skjd sc->rring[i].qe_valid = 1; 44327477Skjd } 44428953Skarels qeinitdesc(&sc->rring[i], (caddr_t)NULL, 0); 44536820Skarels 44627477Skjd sc->rring[i].qe_addr_lo = (short)sc->rringaddr; 44727477Skjd sc->rring[i].qe_addr_hi = (short)((int)sc->rringaddr >> 16); 44827477Skjd sc->rring[i].qe_chain = 1; 44927477Skjd sc->rring[i].qe_flag = sc->rring[i].qe_status1 = QE_NOTYET; 45027477Skjd sc->rring[i].qe_valid = 1; 45136820Skarels 45227915Skarels for( i = 0 ; i <= NXMT ; i++ ) 45328953Skarels qeinitdesc(&sc->tring[i], (caddr_t)NULL, 0); 45427477Skjd i--; 45536820Skarels 45627477Skjd sc->tring[i].qe_addr_lo = (short)sc->tringaddr; 45727477Skjd sc->tring[i].qe_addr_hi = (short)((int)sc->tringaddr >> 16); 45827477Skjd sc->tring[i].qe_chain = 1; 45927477Skjd sc->tring[i].qe_flag = sc->tring[i].qe_status1 = QE_NOTYET; 46027477Skjd sc->tring[i].qe_valid = 1; 46136820Skarels 46227477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 46336820Skarels 46427477Skjd /* 46536820Skarels * Take the interface out of reset, program the vector, 46627477Skjd * enable interrupts, and tell the world we are up. 46727477Skjd */ 46827477Skjd s = splimp(); 46927477Skjd addr->qe_vector = sc->qe_intvec; 47027477Skjd sc->addr = addr; 47127915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 47227915Skarels QE_RCV_INT | QE_ILOOP; 47327477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 47427477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 47527477Skjd ifp->if_flags |= IFF_UP | IFF_RUNNING; 47627915Skarels sc->qe_flags |= QEF_RUNNING; 47727477Skjd qesetup( sc ); 47838985Skarels (void) qestart( ifp ); 479*39420Smckusick sc->qe_if.if_timer = QESLOWTIMEOUT; /* Start watchdog */ 48027477Skjd splx( s ); 48127477Skjd } 48236820Skarels 48327477Skjd /* 48427477Skjd * Start output on interface. 48527477Skjd * 48627477Skjd */ 48738985Skarels qestart(ifp) 48838985Skarels struct ifnet *ifp; 48927477Skjd { 49038985Skarels int unit = ifp->if_unit; 49127477Skjd struct uba_device *ui = qeinfo[unit]; 49227477Skjd register struct qe_softc *sc = &qe_softc[unit]; 49327477Skjd register struct qedevice *addr; 49427477Skjd register struct qe_ring *rp; 49527477Skjd register index; 49628927Skarels struct mbuf *m; 49728927Skarels int buf_addr, len, s; 49836820Skarels 49936820Skarels 50027477Skjd s = splimp(); 50127477Skjd addr = (struct qedevice *)ui->ui_addr; 50227477Skjd /* 50327477Skjd * The deqna doesn't look at anything but the valid bit 50427477Skjd * to determine if it should transmit this packet. If you have 50527477Skjd * a ring and fill it the device will loop indefinately on the 50627477Skjd * packet and continue to flood the net with packets until you 50727477Skjd * break the ring. For this reason we never queue more than n-1 50836820Skarels * packets in the transmit ring. 50927477Skjd * 51027477Skjd * The microcoders should have obeyed their own defination of the 51127477Skjd * flag and status words, but instead we have to compensate. 51227477Skjd */ 51336820Skarels for( index = sc->tindex; 51427915Skarels sc->tring[index].qe_valid == 0 && sc->nxmit < (NXMT-1) ; 51527915Skarels sc->tindex = index = ++index % NXMT){ 51627477Skjd rp = &sc->tring[index]; 51727477Skjd if( sc->setupqueued ) { 51827477Skjd buf_addr = sc->setupaddr; 51927477Skjd len = 128; 52027477Skjd rp->qe_setup = 1; 52127477Skjd sc->setupqueued = 0; 52227477Skjd } else { 52334530Skarels IF_DEQUEUE(&sc->qe_if.if_snd, m); 52427477Skjd if( m == 0 ){ 52527477Skjd splx(s); 52638985Skarels return (0); 52727477Skjd } 52827915Skarels buf_addr = sc->qe_ifw[index].ifw_info; 52927915Skarels len = if_ubaput(&sc->qe_uba, &sc->qe_ifw[index], m); 53027477Skjd } 53127477Skjd /* 53236820Skarels * Does buffer end on odd byte ? 53327477Skjd */ 53427477Skjd if( len & 1 ) { 53527477Skjd len++; 53627477Skjd rp->qe_odd_end = 1; 53727477Skjd } 53827477Skjd if( len < MINDATA ) 53927477Skjd len = MINDATA; 54027477Skjd rp->qe_buf_len = -(len/2); 54136031Skarels buf_addr = UBAI_ADDR(buf_addr); 54227477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 54327477Skjd rp->qe_addr_lo = (short)buf_addr; 54427477Skjd rp->qe_addr_hi = (short)(buf_addr >> 16); 54527477Skjd rp->qe_eomsg = 1; 54627477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 54727477Skjd rp->qe_valid = 1; 548*39420Smckusick if (sc->nxmit++ == 0) { 549*39420Smckusick sc->qe_flags |= QEF_FASTTIMEO; 55036820Skarels sc->qe_if.if_timer = QETIMEOUT; 551*39420Smckusick } 55236820Skarels 55327477Skjd /* 55427477Skjd * See if the xmit list is invalid. 55527477Skjd */ 55627477Skjd if( addr->qe_csr & QE_XL_INVALID ) { 55727477Skjd buf_addr = (int)(sc->tringaddr+index); 55827477Skjd addr->qe_xmtlist_lo = (short)buf_addr; 55927477Skjd addr->qe_xmtlist_hi = (short)(buf_addr >> 16); 56027477Skjd } 56127477Skjd } 56227477Skjd splx( s ); 56338985Skarels return (0); 56427477Skjd } 56536820Skarels 56627477Skjd /* 56727477Skjd * Ethernet interface interrupt processor 56827477Skjd */ 56927477Skjd qeintr(unit) 57027477Skjd int unit; 57127477Skjd { 57227477Skjd register struct qe_softc *sc = &qe_softc[unit]; 57327477Skjd struct qedevice *addr = (struct qedevice *)qeinfo[unit]->ui_addr; 57436031Skarels int buf_addr, csr; 57536820Skarels 57638985Skarels #ifdef notdef 57736031Skarels splx(sc->ipl); 57838985Skarels #else 57936820Skarels (void) splimp(); 58038985Skarels #endif 581*39420Smckusick if (!(sc->qe_flags & QEF_FASTTIMEO)) 582*39420Smckusick sc->qe_if.if_timer = QESLOWTIMEOUT; /* Restart timer clock */ 58327477Skjd csr = addr->qe_csr; 58427915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | QE_RCV_INT | QE_ILOOP; 58536820Skarels if( csr & QE_RCV_INT ) 58627477Skjd qerint( unit ); 58727477Skjd if( csr & QE_XMIT_INT ) 58827477Skjd qetint( unit ); 58927477Skjd if( csr & QE_NEX_MEM_INT ) 59036820Skarels printf("qe%d: Nonexistent memory interrupt\n", unit); 59136820Skarels 59227477Skjd if( addr->qe_csr & QE_RL_INVALID && sc->rring[sc->rindex].qe_status1 == QE_NOTYET ) { 59327477Skjd buf_addr = (int)&sc->rringaddr[sc->rindex]; 59427477Skjd addr->qe_rcvlist_lo = (short)buf_addr; 59527477Skjd addr->qe_rcvlist_hi = (short)(buf_addr >> 16); 59627477Skjd } 59727477Skjd } 59836820Skarels 59927477Skjd /* 60027477Skjd * Ethernet interface transmit interrupt. 60127477Skjd */ 60236820Skarels 60327477Skjd qetint(unit) 60427477Skjd int unit; 60527477Skjd { 60627477Skjd register struct qe_softc *sc = &qe_softc[unit]; 60727477Skjd register struct qe_ring *rp; 60827477Skjd register struct ifxmt *ifxp; 60928927Skarels int status1, setupflag; 61027477Skjd short len; 61136820Skarels 61236820Skarels 61327477Skjd while( sc->otindex != sc->tindex && sc->tring[sc->otindex].qe_status1 != QE_NOTYET && sc->nxmit > 0 ) { 61427477Skjd /* 61527477Skjd * Save the status words from the descriptor so that it can 61627477Skjd * be released. 61727477Skjd */ 61827477Skjd rp = &sc->tring[sc->otindex]; 61927477Skjd status1 = rp->qe_status1; 62027477Skjd setupflag = rp->qe_setup; 62127477Skjd len = (-rp->qe_buf_len) * 2; 62227477Skjd if( rp->qe_odd_end ) 62327477Skjd len++; 62427477Skjd /* 62527477Skjd * Init the buffer descriptor 62627477Skjd */ 62728953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 628*39420Smckusick if( --sc->nxmit == 0 ) { 629*39420Smckusick sc->qe_flags &= ~QEF_FASTTIMEO; 630*39420Smckusick sc->qe_if.if_timer = QESLOWTIMEOUT; 631*39420Smckusick } 63227477Skjd if( !setupflag ) { 63327477Skjd /* 63427477Skjd * Do some statistics. 63527477Skjd */ 63634530Skarels sc->qe_if.if_opackets++; 63734530Skarels sc->qe_if.if_collisions += ( status1 & QE_CCNT ) >> 4; 63827915Skarels if (status1 & QE_ERROR) 63934530Skarels sc->qe_if.if_oerrors++; 64027477Skjd /* 64127477Skjd * If this was a broadcast packet loop it 64227915Skarels * back because the hardware can't hear its own 64327915Skarels * transmits. 64427477Skjd */ 64527915Skarels ifxp = &sc->qe_ifw[sc->otindex]; 64632086Skarels if (bcmp((caddr_t)((struct ether_header *)ifxp->ifw_addr)->ether_dhost, 64732086Skarels (caddr_t)etherbroadcastaddr, 64832086Skarels sizeof(etherbroadcastaddr)) == 0) 64932086Skarels qeread(sc, &ifxp->ifrw, 65032086Skarels len - sizeof(struct ether_header)); 65127915Skarels if (ifxp->ifw_xtofree) { 65227915Skarels m_freem(ifxp->ifw_xtofree); 65327915Skarels ifxp->ifw_xtofree = 0; 65427477Skjd } 65527477Skjd } 65627915Skarels sc->otindex = ++sc->otindex % NXMT; 65727477Skjd } 65838985Skarels (void) qestart( &sc->qe_if ); 65927477Skjd } 66036820Skarels 66127477Skjd /* 66227477Skjd * Ethernet interface receiver interrupt. 66336820Skarels * If can't determine length from type, then have to drop packet. 66436820Skarels * Othewise decapsulate packet based on type and pass to type specific 66527477Skjd * higher-level input routine. 66627477Skjd */ 66727477Skjd qerint(unit) 66827477Skjd int unit; 66927477Skjd { 67027477Skjd register struct qe_softc *sc = &qe_softc[unit]; 67127477Skjd register struct qe_ring *rp; 67227477Skjd int len, status1, status2; 67327477Skjd int bufaddr; 67436820Skarels 67527477Skjd /* 67627477Skjd * Traverse the receive ring looking for packets to pass back. 67727477Skjd * The search is complete when we find a descriptor not in use. 67827477Skjd * 67927477Skjd * As in the transmit case the deqna doesn't honor it's own protocols 68027477Skjd * so there exists the possibility that the device can beat us around 68127477Skjd * the ring. The proper way to guard against this is to insure that 68227477Skjd * there is always at least one invalid descriptor. We chose instead 68327477Skjd * to make the ring large enough to minimize the problem. With a ring 68427477Skjd * size of 4 we haven't been able to see the problem. To be safe we 68527477Skjd * doubled that to 8. 68627477Skjd * 68727477Skjd */ 68827915Skarels for( ; sc->rring[sc->rindex].qe_status1 != QE_NOTYET ; sc->rindex = ++sc->rindex % NRCV ){ 68927477Skjd rp = &sc->rring[sc->rindex]; 69027477Skjd status1 = rp->qe_status1; 69127477Skjd status2 = rp->qe_status2; 69228953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 69327477Skjd if( (status1 & QE_MASK) == QE_MASK ) 69427477Skjd panic("qe: chained packet"); 69527915Skarels len = ((status1 & QE_RBL_HI) | (status2 & QE_RBL_LO)) + 60; 69634530Skarels sc->qe_if.if_ipackets++; 69736820Skarels 69832086Skarels if (status1 & QE_ERROR) { 69932086Skarels if ((status1 & QE_RUNT) == 0) 70034530Skarels sc->qe_if.if_ierrors++; 70132086Skarels } else { 70227915Skarels /* 70327915Skarels * We don't process setup packets. 70427915Skarels */ 70527915Skarels if( !(status1 & QE_ESETUP) ) 70627915Skarels qeread(sc, &sc->qe_ifr[sc->rindex], 70727915Skarels len - sizeof(struct ether_header)); 70827477Skjd } 70927477Skjd /* 71027477Skjd * Return the buffer to the ring 71127477Skjd */ 71236031Skarels bufaddr = (int)UBAI_ADDR(sc->qe_ifr[sc->rindex].ifrw_info); 71327477Skjd rp->qe_buf_len = -((MAXPACKETSIZE)/2); 71427477Skjd rp->qe_addr_lo = (short)bufaddr; 71527477Skjd rp->qe_addr_hi = (short)((int)bufaddr >> 16); 71627477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 71727477Skjd rp->qe_valid = 1; 71827477Skjd } 71927477Skjd } 72036820Skarels 72127477Skjd /* 72227477Skjd * Process an ioctl request. 72327477Skjd */ 72427477Skjd qeioctl(ifp, cmd, data) 72527477Skjd register struct ifnet *ifp; 72627477Skjd int cmd; 72727477Skjd caddr_t data; 72827477Skjd { 72927477Skjd struct qe_softc *sc = &qe_softc[ifp->if_unit]; 73027477Skjd struct ifaddr *ifa = (struct ifaddr *)data; 73128927Skarels int s = splimp(), error = 0; 73236820Skarels 73327477Skjd switch (cmd) { 73436820Skarels 73527477Skjd case SIOCSIFADDR: 73627477Skjd ifp->if_flags |= IFF_UP; 73727477Skjd qeinit(ifp->if_unit); 73838985Skarels switch(ifa->ifa_addr->sa_family) { 73927477Skjd #ifdef INET 74027477Skjd case AF_INET: 74127477Skjd ((struct arpcom *)ifp)->ac_ipaddr = 74227477Skjd IA_SIN(ifa)->sin_addr; 74327477Skjd arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr); 74427477Skjd break; 74527477Skjd #endif 74627915Skarels #ifdef NS 74727915Skarels case AF_NS: 74827915Skarels { 74927915Skarels register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr); 75036820Skarels 75127915Skarels if (ns_nullhost(*ina)) 75234530Skarels ina->x_host = *(union ns_host *)(sc->qe_addr); 75327915Skarels else 75427915Skarels qe_setaddr(ina->x_host.c_host, ifp->if_unit); 75527477Skjd break; 75627915Skarels } 75727915Skarels #endif 75827477Skjd } 75927477Skjd break; 76027915Skarels 76127915Skarels case SIOCSIFFLAGS: 76227915Skarels if ((ifp->if_flags & IFF_UP) == 0 && 76327915Skarels sc->qe_flags & QEF_RUNNING) { 76427915Skarels ((struct qedevice *) 76527915Skarels (qeinfo[ifp->if_unit]->ui_addr))->qe_csr = QE_RESET; 76627915Skarels sc->qe_flags &= ~QEF_RUNNING; 76730604Skarels } else if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) == 76830604Skarels IFF_RUNNING && (sc->qe_flags & QEF_RUNNING) == 0) 76928953Skarels qerestart(sc); 77027915Skarels break; 77127915Skarels 77227477Skjd default: 77327477Skjd error = EINVAL; 77436820Skarels 77527477Skjd } 77628927Skarels splx(s); 77727477Skjd return (error); 77827477Skjd } 77936820Skarels 78027915Skarels /* 78127915Skarels * set ethernet address for unit 78227915Skarels */ 78327915Skarels qe_setaddr(physaddr, unit) 78427915Skarels u_char *physaddr; 78527915Skarels int unit; 78627915Skarels { 78727915Skarels register struct qe_softc *sc = &qe_softc[unit]; 78827915Skarels register int i; 78927915Skarels 79027915Skarels for (i = 0; i < 6; i++) 79134530Skarels sc->setup_pkt[i][1] = sc->qe_addr[i] = physaddr[i]; 79227915Skarels sc->qe_flags |= QEF_SETADDR; 79334530Skarels if (sc->qe_if.if_flags & IFF_RUNNING) 79427915Skarels qesetup(sc); 79527915Skarels qeinit(unit); 79627915Skarels } 79736820Skarels 79836820Skarels 79927477Skjd /* 80027477Skjd * Initialize a ring descriptor with mbuf allocation side effects 80127477Skjd */ 80228953Skarels qeinitdesc(rp, addr, len) 80327477Skjd register struct qe_ring *rp; 80428953Skarels caddr_t addr; /* mapped address */ 80527477Skjd int len; 80627477Skjd { 80727477Skjd /* 80827477Skjd * clear the entire descriptor 80927477Skjd */ 81028953Skarels bzero((caddr_t)rp, sizeof(struct qe_ring)); 81136820Skarels 81227477Skjd if( len ) { 81327477Skjd rp->qe_buf_len = -(len/2); 81428927Skarels rp->qe_addr_lo = (short)addr; 81528927Skarels rp->qe_addr_hi = (short)((int)addr >> 16); 81627477Skjd } 81727477Skjd } 81827477Skjd /* 81927477Skjd * Build a setup packet - the physical address will already be present 82027477Skjd * in first column. 82127477Skjd */ 82227477Skjd qesetup( sc ) 82327477Skjd struct qe_softc *sc; 82427477Skjd { 82528927Skarels register i, j; 82636820Skarels 82727477Skjd /* 82827477Skjd * Copy the target address to the rest of the entries in this row. 82927477Skjd */ 83027477Skjd for ( j = 0; j < 6 ; j++ ) 83127477Skjd for ( i = 2 ; i < 8 ; i++ ) 83227477Skjd sc->setup_pkt[j][i] = sc->setup_pkt[j][1]; 83327477Skjd /* 83427477Skjd * Duplicate the first half. 83527477Skjd */ 83628953Skarels bcopy((caddr_t)sc->setup_pkt[0], (caddr_t)sc->setup_pkt[8], 64); 83727477Skjd /* 83838985Skarels * Fill in the broadcast (and ISO multicast) address(es). 83927477Skjd */ 84038985Skarels for ( i = 0; i < 6 ; i++ ) { 84127477Skjd sc->setup_pkt[i][2] = 0xff; 84238985Skarels #ifdef ISO 84338985Skarels sc->setup_pkt[i][3] = all_es.sc_snpa[i]; 84438985Skarels sc->setup_pkt[i][4] = all_is.sc_snpa[i]; 84538985Skarels #endif 84638985Skarels } 84727477Skjd sc->setupqueued++; 84827477Skjd } 84927915Skarels 85027477Skjd /* 85127477Skjd * Pass a packet to the higher levels. 85227477Skjd * We deal with the trailer protocol here. 85327477Skjd */ 85427915Skarels qeread(sc, ifrw, len) 85527477Skjd register struct qe_softc *sc; 85627477Skjd struct ifrw *ifrw; 85727477Skjd int len; 85827477Skjd { 85928927Skarels struct ether_header *eh; 86028927Skarels struct mbuf *m; 86136031Skarels int off, resid, s; 86227477Skjd struct ifqueue *inq; 86336820Skarels 86427477Skjd /* 86527477Skjd * Deal with trailer protocol: if type is INET trailer 86627477Skjd * get true type from first 16-bit word past data. 86727477Skjd * Remember that type was trailer by setting off. 86827477Skjd */ 86936820Skarels 87027477Skjd eh = (struct ether_header *)ifrw->ifrw_addr; 87127477Skjd eh->ether_type = ntohs((u_short)eh->ether_type); 87227477Skjd #define qedataaddr(eh, off, type) ((type)(((caddr_t)((eh)+1)+(off)))) 87327477Skjd if (eh->ether_type >= ETHERTYPE_TRAIL && 87427477Skjd eh->ether_type < ETHERTYPE_TRAIL+ETHERTYPE_NTRAILER) { 87527477Skjd off = (eh->ether_type - ETHERTYPE_TRAIL) * 512; 87627477Skjd if (off >= ETHERMTU) 87727477Skjd return; /* sanity */ 87827915Skarels eh->ether_type = ntohs(*qedataaddr(eh,off, u_short *)); 87927915Skarels resid = ntohs(*(qedataaddr(eh, off+2, u_short *))); 88027915Skarels if (off + resid > len) 88127915Skarels return; /* sanity */ 88227915Skarels len = off + resid; 88327915Skarels } else 88427477Skjd off = 0; 88527477Skjd if (len == 0) 88627477Skjd return; 88736820Skarels 88827477Skjd /* 88927477Skjd * Pull packet off interface. Off is nonzero if packet 89027477Skjd * has trailing header; qeget will then force this header 89127477Skjd * information to be at the front, but we still have to drop 89227477Skjd * the type and length which are at the front of any trailer data. 89327477Skjd */ 89434530Skarels m = if_ubaget(&sc->qe_uba, ifrw, len, off, &sc->qe_if); 89536820Skarels 89638985Skarels if (m) 89738985Skarels ether_input(&sc->qe_if, eh, m); 89827477Skjd } 89927915Skarels 90027477Skjd /* 90134530Skarels * Watchdog timeout routine. There is a condition in the hardware that 90227477Skjd * causes the board to lock up under heavy load. This routine detects 90327477Skjd * the hang up and restarts the device. 90427477Skjd */ 90534530Skarels qetimeout(unit) 90634530Skarels int unit; 90727477Skjd { 90827477Skjd register struct qe_softc *sc; 90936820Skarels 91034530Skarels sc = &qe_softc[unit]; 911*39420Smckusick #ifdef notdef 91234530Skarels log(LOG_ERR, "qe%d: transmit timeout, restarted %d\n", 91336820Skarels unit, sc->qe_restarts++); 914*39420Smckusick #endif 91534530Skarels qerestart(sc); 91627477Skjd } 91727477Skjd /* 91827477Skjd * Restart for board lockup problem. 91927477Skjd */ 92027915Skarels qerestart(sc) 92127477Skjd register struct qe_softc *sc; 92227477Skjd { 92334530Skarels register struct ifnet *ifp = &sc->qe_if; 92427477Skjd register struct qedevice *addr = sc->addr; 92527477Skjd register struct qe_ring *rp; 92627477Skjd register i; 92736820Skarels 92827477Skjd addr->qe_csr = QE_RESET; 92936820Skarels addr->qe_csr &= ~QE_RESET; 93027477Skjd qesetup( sc ); 93127915Skarels for (i = 0, rp = sc->tring; i < NXMT; rp++, i++) { 93227477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET; 93327477Skjd rp->qe_valid = 0; 93427477Skjd } 93527477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0; 93627915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT | 93727915Skarels QE_RCV_INT | QE_ILOOP; 93827477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr; 93927477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16); 94027915Skarels sc->qe_flags |= QEF_RUNNING; 94138985Skarels (void) qestart(ifp); 94227477Skjd } 94327477Skjd #endif 944