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*53367Ssklower * @(#)if_qe.c 7.21 (Berkeley) 05/04/92
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 */
qeprobe(reg,ui)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 */
qereset(unit,uban)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 */
qeinit(unit)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 */
qeintr(unit)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
qetint(unit)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 */
qerint(unit)64527477Skjd qerint(unit)
64627477Skjd int unit;
64727477Skjd {
64827477Skjd register struct qe_softc *sc = &qe_softc[unit];
64927477Skjd register struct qe_ring *rp;
65047677Stef 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 */
66747677Stef while (sc->rring[sc->rindex].qe_status1 == QE_NOTYET && nrcv < NRCV) {
66847677Stef /*
66947677Stef * We got an interrupt but did not find an input packet
67047677Stef * where we expected one to be, probably because the ring
67147677Stef * was overrun.
67247677Stef * We search forward to find a valid packet and start
67347677Stef * processing from there. If no valid packet is found it
67447677Stef * means we processed all the packets during a previous
67547677Stef * interrupt and that the QE_RCV_INT bit was set while
67647677Stef * we were processing one of these earlier packets. In
67747677Stef * this case we can safely ignore the interrupt (by dropping
67847677Stef * through the code below).
67947677Stef */
68047677Stef sc->rindex = (sc->rindex + 1) % NRCV;
68147677Stef nrcv++;
68247677Stef }
68347677Stef if (nrcv && nrcv < NRCV)
68447677Stef log(LOG_ERR, "qe%d: ring overrun, resync'd by skipping %d\n",
68547677Stef unit, nrcv);
68647677Stef
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 */
qeioctl(ifp,cmd,data)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 */
qe_setaddr(physaddr,unit)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 */
qeinitdesc(rp,addr,len)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 */
qeread(sc,ifrw,len)85527915Skarels qeread(sc, ifrw, len)
85627477Skjd register struct qe_softc *sc;
85727477Skjd struct ifrw *ifrw;
85827477Skjd int len;
85927477Skjd {
860*53367Ssklower struct ether_header *eh, ehm;
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 */
895*53367Ssklower bcopy((caddr_t)eh, (caddr_t)&ehm, sizeof(ehm));
89634530Skarels m = if_ubaget(&sc->qe_uba, ifrw, len, off, &sc->qe_if);
89736820Skarels
89838985Skarels if (m)
899*53367Ssklower ether_input(&sc->qe_if, &ehm, m);
90027477Skjd }
90127915Skarels
90227477Skjd /*
90334530Skarels * Watchdog timeout routine. There is a condition in the hardware that
90427477Skjd * causes the board to lock up under heavy load. This routine detects
90527477Skjd * the hang up and restarts the device.
90627477Skjd */
qetimeout(unit)90734530Skarels qetimeout(unit)
90834530Skarels int unit;
90927477Skjd {
91027477Skjd register struct qe_softc *sc;
91136820Skarels
91234530Skarels sc = &qe_softc[unit];
91339420Smckusick #ifdef notdef
91434530Skarels log(LOG_ERR, "qe%d: transmit timeout, restarted %d\n",
91536820Skarels unit, sc->qe_restarts++);
91639420Smckusick #endif
91734530Skarels qerestart(sc);
91827477Skjd }
91927477Skjd /*
92027477Skjd * Restart for board lockup problem.
92127477Skjd */
qerestart(sc)92227915Skarels qerestart(sc)
92327477Skjd register struct qe_softc *sc;
92427477Skjd {
92534530Skarels register struct ifnet *ifp = &sc->qe_if;
92627477Skjd register struct qedevice *addr = sc->addr;
92727477Skjd register struct qe_ring *rp;
92827477Skjd register i;
92936820Skarels
93027477Skjd addr->qe_csr = QE_RESET;
93136820Skarels addr->qe_csr &= ~QE_RESET;
93227477Skjd qesetup( sc );
93327915Skarels for (i = 0, rp = sc->tring; i < NXMT; rp++, i++) {
93427477Skjd rp->qe_flag = rp->qe_status1 = QE_NOTYET;
93527477Skjd rp->qe_valid = 0;
93627477Skjd }
93727477Skjd sc->nxmit = sc->otindex = sc->tindex = sc->rindex = 0;
93827915Skarels addr->qe_csr = QE_RCV_ENABLE | QE_INT_ENABLE | QE_XMIT_INT |
93927915Skarels QE_RCV_INT | QE_ILOOP;
94027477Skjd addr->qe_rcvlist_lo = (short)sc->rringaddr;
94127477Skjd addr->qe_rcvlist_hi = (short)((int)sc->rringaddr >> 16);
94227915Skarels sc->qe_flags |= QEF_RUNNING;
94338985Skarels (void) qestart(ifp);
94427477Skjd }
94527477Skjd #endif
946