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