xref: /freebsd-12.1/sys/dev/vx/if_vx.c (revision 68742e0d)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1994 Herb Peyerl <[email protected]>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Herb Peyerl.
18  * 4. The name of Herb Peyerl may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  *
33  */
34 
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37 
38 /*
39  * Created from if_ep.c driver by Fred Gray ([email protected]) to support
40  * the 3c590 family.
41  */
42 
43 /*
44  *	Modified from the FreeBSD 1.1.5.1 version by:
45  *		 	Andres Vega Garcia
46  *			INRIA - Sophia Antipolis, France
47  *			[email protected]
48  */
49 
50 /*
51  *  Promiscuous mode added and interrupt logic slightly changed
52  *  to reduce the number of adapter failures. Transceiver select
53  *  logic changed to use value from EEPROM. Autoconfiguration
54  *  features added.
55  *  Done by:
56  *          Serge Babkin
57  *          Chelindbank (Chelyabinsk, Russia)
58  *          [email protected]
59  */
60 
61 
62 #include <sys/param.h>
63 #include <sys/systm.h>
64 #include <sys/sockio.h>
65 #include <sys/kernel.h>
66 #include <sys/malloc.h>
67 #include <sys/mbuf.h>
68 #include <sys/socket.h>
69 
70 #include <net/if.h>
71 #include <net/if_var.h>
72 
73 #include <net/ethernet.h>
74 #include <net/if_dl.h>
75 #include <net/if_types.h>
76 
77 #include <machine/bus.h>
78 
79 #include <sys/bus.h>
80 
81 #include <net/bpf.h>
82 
83 #include <dev/vx/if_vxreg.h>
84 #include <dev/vx/if_vxvar.h>
85 
86 #define ETHER_MAX_LEN	1518
87 #define ETHER_ADDR_LEN	6
88 #define ETHER_ALIGN 	2
89 
90 static struct connector_entry {
91 	int bit;
92 	char *name;
93 } conn_tab[VX_CONNECTORS] = {
94 
95 #define CONNECTOR_UTP	0
96 	{
97 		0x08, "utp"
98 	},
99 #define CONNECTOR_AUI	1
100 	{
101 		0x20, "aui"
102 	},
103 /* dummy */
104 	{
105 		0, "???"
106 	},
107 #define CONNECTOR_BNC	3
108 	{
109 		0x10, "bnc"
110 	},
111 #define CONNECTOR_TX	4
112 	{
113 		0x02, "tx"
114 	},
115 #define CONNECTOR_FX	5
116 	{
117 		0x04, "fx"
118 	},
119 #define CONNECTOR_MII	6
120 	{
121 		0x40, "mii"
122 	},
123 	{
124 		0, "???"
125 	}
126 };
127 
128 static void vx_txstat(struct vx_softc *);
129 static int vx_status(struct vx_softc *);
130 static void vx_init(void *);
131 static void vx_init_locked(struct vx_softc *);
132 static int vx_ioctl(struct ifnet *, u_long, caddr_t);
133 static void vx_start(struct ifnet *);
134 static void vx_start_locked(struct ifnet *);
135 static void vx_watchdog(void *);
136 static void vx_reset(struct vx_softc *);
137 static void vx_read(struct vx_softc *);
138 static struct mbuf *vx_get(struct vx_softc *, u_int);
139 static void vx_mbuf_fill(void *);
140 static void vx_mbuf_empty(struct vx_softc *);
141 static void vx_setfilter(struct vx_softc *);
142 static void vx_getlink(struct vx_softc *);
143 static void vx_setlink(struct vx_softc *);
144 
145 int
vx_attach(device_t dev)146 vx_attach(device_t dev)
147 {
148 	struct vx_softc *sc = device_get_softc(dev);
149 	struct ifnet *ifp;
150 	int i;
151 	u_char eaddr[6];
152 
153 	ifp = sc->vx_ifp = if_alloc(IFT_ETHER);
154 	if (ifp == NULL) {
155 		device_printf(dev, "can not if_alloc()\n");
156 		return 0;
157 	}
158 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
159 
160 	mtx_init(&sc->vx_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
161 	    MTX_DEF);
162 	callout_init_mtx(&sc->vx_callout, &sc->vx_mtx, 0);
163 	callout_init_mtx(&sc->vx_watchdog, &sc->vx_mtx, 0);
164 	GO_WINDOW(0);
165 	CSR_WRITE_2(sc, VX_COMMAND, GLOBAL_RESET);
166 	VX_BUSY_WAIT;
167 
168 	vx_getlink(sc);
169 
170 	/*
171          * Read the station address from the eeprom
172          */
173 	GO_WINDOW(0);
174 	for (i = 0; i < 3; i++) {
175 		int x;
176 
177 		if (vx_busy_eeprom(sc)) {
178 			mtx_destroy(&sc->vx_mtx);
179 			if_free(ifp);
180 			return 0;
181 		}
182 		CSR_WRITE_2(sc, VX_W0_EEPROM_COMMAND, EEPROM_CMD_RD
183 		    | (EEPROM_OEM_ADDR0 + i));
184 		if (vx_busy_eeprom(sc)) {
185 			mtx_destroy(&sc->vx_mtx);
186 			if_free(ifp);
187 			return 0;
188 		}
189 		x = CSR_READ_2(sc, VX_W0_EEPROM_DATA);
190 		eaddr[(i << 1)] = x >> 8;
191 		eaddr[(i << 1) + 1] = x;
192 	}
193 
194 	ifp->if_snd.ifq_maxlen = ifqmaxlen;
195 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
196 	ifp->if_start = vx_start;
197 	ifp->if_ioctl = vx_ioctl;
198 	ifp->if_init = vx_init;
199 	ifp->if_softc = sc;
200 
201 	ether_ifattach(ifp, eaddr);
202 
203 	sc->vx_tx_start_thresh = 20;	/* probably a good starting point. */
204 
205 	VX_LOCK(sc);
206 	vx_stop(sc);
207 	VX_UNLOCK(sc);
208 
209 	gone_by_fcp101_dev(dev);
210 
211 	return 1;
212 }
213 
214 /*
215  * The order in here seems important. Otherwise we may not receive
216  * interrupts. ?!
217  */
218 static void
vx_init(void * xsc)219 vx_init(void *xsc)
220 {
221 	struct vx_softc *sc = (struct vx_softc *)xsc;
222 
223 	VX_LOCK(sc);
224 	vx_init_locked(sc);
225 	VX_UNLOCK(sc);
226 }
227 
228 static void
vx_init_locked(struct vx_softc * sc)229 vx_init_locked(struct vx_softc *sc)
230 {
231 	struct ifnet *ifp = sc->vx_ifp;
232 	int i;
233 
234 	VX_LOCK_ASSERT(sc);
235 
236 	VX_BUSY_WAIT;
237 
238 	GO_WINDOW(2);
239 
240 	for (i = 0; i < 6; i++)	/* Reload the ether_addr. */
241 		CSR_WRITE_1(sc, VX_W2_ADDR_0 + i, IF_LLADDR(sc->vx_ifp)[i]);
242 
243 	CSR_WRITE_2(sc, VX_COMMAND, RX_RESET);
244 	VX_BUSY_WAIT;
245 	CSR_WRITE_2(sc, VX_COMMAND, TX_RESET);
246 	VX_BUSY_WAIT;
247 
248 	GO_WINDOW(1);		/* Window 1 is operating window */
249 	for (i = 0; i < 31; i++)
250 		CSR_READ_1(sc, VX_W1_TX_STATUS);
251 
252 	CSR_WRITE_2(sc, VX_COMMAND, SET_RD_0_MASK | S_CARD_FAILURE |
253 	    S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
254 	CSR_WRITE_2(sc, VX_COMMAND, SET_INTR_MASK | S_CARD_FAILURE |
255 	    S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
256 
257 	/*
258          * Attempt to get rid of any stray interrupts that occurred during
259          * configuration.  On the i386 this isn't possible because one may
260          * already be queued.  However, a single stray interrupt is
261          * unimportant.
262          */
263 	CSR_WRITE_2(sc, VX_COMMAND, ACK_INTR | 0xff);
264 
265 	vx_setfilter(sc);
266 	vx_setlink(sc);
267 
268 	CSR_WRITE_2(sc, VX_COMMAND, RX_ENABLE);
269 	CSR_WRITE_2(sc, VX_COMMAND, TX_ENABLE);
270 
271 	vx_mbuf_fill(sc);
272 
273 	/* Interface is now `running', with no output active. */
274 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
275 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
276 	callout_reset(&sc->vx_watchdog, hz, vx_watchdog, sc);
277 
278 	/* Attempt to start output, if any. */
279 	vx_start_locked(ifp);
280 }
281 
282 static void
vx_setfilter(struct vx_softc * sc)283 vx_setfilter(struct vx_softc *sc)
284 {
285 	struct ifnet *ifp = sc->vx_ifp;
286 
287 	VX_LOCK_ASSERT(sc);
288 	GO_WINDOW(1);		/* Window 1 is operating window */
289 	CSR_WRITE_2(sc, VX_COMMAND, SET_RX_FILTER |
290 	    FIL_INDIVIDUAL | FIL_BRDCST | FIL_MULTICAST |
291 	    ((ifp->if_flags & IFF_PROMISC) ? FIL_PROMISC : 0));
292 }
293 
294 static void
vx_getlink(struct vx_softc * sc)295 vx_getlink(struct vx_softc *sc)
296 {
297 	int n, k;
298 
299 	GO_WINDOW(3);
300 	sc->vx_connectors = CSR_READ_2(sc, VX_W3_RESET_OPT) & 0x7f;
301 	for (n = 0, k = 0; k < VX_CONNECTORS; k++) {
302 		if (sc->vx_connectors & conn_tab[k].bit) {
303 			if (n > 0)
304 				printf("/");
305 			printf("%s", conn_tab[k].name);
306 			n++;
307 		}
308 	}
309 	if (sc->vx_connectors == 0) {
310 		printf("no connectors!\n");
311 		return;
312 	}
313 	GO_WINDOW(3);
314 	sc->vx_connector =
315 	    (CSR_READ_4(sc, VX_W3_INTERNAL_CFG) & INTERNAL_CONNECTOR_MASK)
316 	    >> INTERNAL_CONNECTOR_BITS;
317 	if (sc->vx_connector & 0x10) {
318 		sc->vx_connector &= 0x0f;
319 		printf("[*%s*]", conn_tab[(int)sc->vx_connector].name);
320 		printf(": disable 'auto select' with DOS util!\n");
321 	} else {
322 		printf("[*%s*]\n", conn_tab[(int)sc->vx_connector].name);
323 	}
324 }
325 
326 static void
vx_setlink(struct vx_softc * sc)327 vx_setlink(struct vx_softc *sc)
328 {
329 	struct ifnet *ifp = sc->vx_ifp;
330 	int i, j, k;
331 	char *reason, *warning;
332 	static int prev_flags;
333 	static signed char prev_conn = -1;
334 
335 	VX_LOCK_ASSERT(sc);
336 	if (prev_conn == -1)
337 		prev_conn = sc->vx_connector;
338 
339 	/*
340          * S.B.
341          *
342          * Now behavior was slightly changed:
343          *
344          * if any of flags link[0-2] is used and its connector is
345          * physically present the following connectors are used:
346          *
347          *   link0 - AUI * highest precedence
348          *   link1 - BNC
349          *   link2 - UTP * lowest precedence
350          *
351          * If none of them is specified then
352          * connector specified in the EEPROM is used
353          * (if present on card or UTP if not).
354          */
355 	i = sc->vx_connector;	/* default in EEPROM */
356 	reason = "default";
357 	warning = NULL;
358 
359 	if (ifp->if_flags & IFF_LINK0) {
360 		if (sc->vx_connectors & conn_tab[CONNECTOR_AUI].bit) {
361 			i = CONNECTOR_AUI;
362 			reason = "link0";
363 		} else {
364 			warning = "aui not present! (link0)";
365 		}
366 	} else if (ifp->if_flags & IFF_LINK1) {
367 		if (sc->vx_connectors & conn_tab[CONNECTOR_BNC].bit) {
368 			i = CONNECTOR_BNC;
369 			reason = "link1";
370 		} else {
371 			warning = "bnc not present! (link1)";
372 		}
373 	} else if (ifp->if_flags & IFF_LINK2) {
374 		if (sc->vx_connectors & conn_tab[CONNECTOR_UTP].bit) {
375 			i = CONNECTOR_UTP;
376 			reason = "link2";
377 		} else {
378 			warning = "utp not present! (link2)";
379 		}
380 	} else if ((sc->vx_connectors & conn_tab[(int)sc->vx_connector].bit) == 0) {
381 		warning = "strange connector type in EEPROM.";
382 		reason = "forced";
383 		i = CONNECTOR_UTP;
384 	}
385 	/* Avoid unnecessary message. */
386 	k = (prev_flags ^ ifp->if_flags) & (IFF_LINK0 | IFF_LINK1 | IFF_LINK2);
387 	if ((k != 0) || (prev_conn != i)) {
388 		if (warning != NULL)
389 			if_printf(ifp, "warning: %s\n", warning);
390 		if_printf(ifp, "selected %s. (%s)\n", conn_tab[i].name, reason);
391 	}
392 	/* Set the selected connector. */
393 	GO_WINDOW(3);
394 	j = CSR_READ_4(sc, VX_W3_INTERNAL_CFG) & ~INTERNAL_CONNECTOR_MASK;
395 	CSR_WRITE_4(sc, VX_W3_INTERNAL_CFG, j | (i << INTERNAL_CONNECTOR_BITS));
396 
397 	/* First, disable all. */
398 	CSR_WRITE_2(sc, VX_COMMAND, STOP_TRANSCEIVER);
399 	DELAY(800);
400 	GO_WINDOW(4);
401 	CSR_WRITE_2(sc, VX_W4_MEDIA_TYPE, 0);
402 
403 	/* Second, enable the selected one. */
404 	switch (i) {
405 	case CONNECTOR_UTP:
406 		GO_WINDOW(4);
407 		CSR_WRITE_2(sc, VX_W4_MEDIA_TYPE, ENABLE_UTP);
408 		break;
409 	case CONNECTOR_BNC:
410 		CSR_WRITE_2(sc, VX_COMMAND, START_TRANSCEIVER);
411 		DELAY(800);
412 		break;
413 	case CONNECTOR_TX:
414 	case CONNECTOR_FX:
415 		GO_WINDOW(4);
416 		CSR_WRITE_2(sc, VX_W4_MEDIA_TYPE, LINKBEAT_ENABLE);
417 		break;
418 	default:		/* AUI and MII fall here */
419 		break;
420 	}
421 	GO_WINDOW(1);
422 
423 	prev_flags = ifp->if_flags;
424 	prev_conn = i;
425 }
426 
427 static void
vx_start(struct ifnet * ifp)428 vx_start(struct ifnet *ifp)
429 {
430 	struct vx_softc *sc = ifp->if_softc;
431 
432 	VX_LOCK(sc);
433 	vx_start_locked(ifp);
434 	VX_UNLOCK(sc);
435 }
436 
437 static void
vx_start_locked(struct ifnet * ifp)438 vx_start_locked(struct ifnet *ifp)
439 {
440 	struct vx_softc *sc = ifp->if_softc;
441 	struct mbuf *m;
442 	int len, pad;
443 
444 	VX_LOCK_ASSERT(sc);
445 
446 	/* Don't transmit if interface is busy or not running */
447 	if ((sc->vx_ifp->if_drv_flags &
448 	    (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
449 		return;
450 
451 startagain:
452 	/* Sneak a peek at the next packet */
453 	m = ifp->if_snd.ifq_head;
454 	if (m == NULL) {
455 		return;
456 	}
457 	/* We need to use m->m_pkthdr.len, so require the header */
458 	M_ASSERTPKTHDR(m);
459 	len = m->m_pkthdr.len;
460 
461 	pad = (4 - len) & 3;
462 
463 	/*
464          * The 3c509 automatically pads short packets to minimum ethernet
465 	 * length, but we drop packets that are too large. Perhaps we should
466 	 * truncate them instead?
467          */
468 	if (len + pad > ETHER_MAX_LEN) {
469 		/* packet is obviously too large: toss it */
470 		if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
471 		IF_DEQUEUE(&ifp->if_snd, m);
472 		m_freem(m);
473 		goto readcheck;
474 	}
475 	VX_BUSY_WAIT;
476 	if (CSR_READ_2(sc, VX_W1_FREE_TX) < len + pad + 4) {
477 		CSR_WRITE_2(sc, VX_COMMAND,
478 		    SET_TX_AVAIL_THRESH | ((len + pad + 4) >> 2));
479 		/* not enough room in FIFO - make sure */
480 		if (CSR_READ_2(sc, VX_W1_FREE_TX) < len + pad + 4) {
481 			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
482 			sc->vx_timer = 1;
483 			return;
484 		}
485 	}
486 	CSR_WRITE_2(sc, VX_COMMAND, SET_TX_AVAIL_THRESH | (8188 >> 2));
487 	IF_DEQUEUE(&ifp->if_snd, m);
488 	if (m == NULL)		/* not really needed */
489 		return;
490 
491 	VX_BUSY_WAIT;
492 	CSR_WRITE_2(sc, VX_COMMAND, SET_TX_START_THRESH |
493 	    ((len / 4 + sc->vx_tx_start_thresh) >> 2));
494 
495 	BPF_MTAP(sc->vx_ifp, m);
496 
497 	/*
498          * Do the output at splhigh() so that an interrupt from another device
499          * won't cause a FIFO underrun.
500 	 *
501 	 * XXX: Can't enforce that anymore.
502          */
503 
504 	CSR_WRITE_4(sc, VX_W1_TX_PIO_WR_1, len | TX_INDICATE);
505 
506 	while (m) {
507 		if (m->m_len > 3)
508 			bus_space_write_multi_4(sc->vx_bst, sc->vx_bsh,
509 			    VX_W1_TX_PIO_WR_1, (u_int32_t *)mtod(m, caddr_t),
510 			    m->m_len / 4);
511 		if (m->m_len & 3)
512 			bus_space_write_multi_1(sc->vx_bst, sc->vx_bsh,
513 			    VX_W1_TX_PIO_WR_1,
514 			    mtod(m, caddr_t) + (m->m_len & ~3), m->m_len & 3);
515 		m = m_free(m);
516 	}
517 	while (pad--)
518 		CSR_WRITE_1(sc, VX_W1_TX_PIO_WR_1, 0);	/* Padding */
519 
520 	if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
521 	sc->vx_timer = 1;
522 
523 readcheck:
524 	if ((CSR_READ_2(sc, VX_W1_RX_STATUS) & ERR_INCOMPLETE) == 0) {
525 		/* We received a complete packet. */
526 
527 		if ((CSR_READ_2(sc, VX_STATUS) & S_INTR_LATCH) == 0) {
528 			/*
529 		         * No interrupt, read the packet and continue
530 		         * Is this supposed to happen?  Is my motherboard
531 		         * completely busted?
532 		         */
533 			vx_read(sc);
534 		} else
535 			/*
536 			 * Got an interrupt, return so that it gets
537 			 * serviced.
538 			 */
539 			return;
540 	} else {
541 		/* Check if we are stuck and reset [see XXX comment] */
542 		if (vx_status(sc)) {
543 			if (ifp->if_flags & IFF_DEBUG)
544 				if_printf(ifp, "adapter reset\n");
545 			vx_reset(sc);
546 		}
547 	}
548 
549 	goto startagain;
550 }
551 
552 /*
553  * XXX: The 3c509 card can get in a mode where both the fifo status bit
554  *      FIFOS_RX_OVERRUN and the status bit ERR_INCOMPLETE are set
555  *      We detect this situation and we reset the adapter.
556  *      It happens at times when there is a lot of broadcast traffic
557  *      on the cable (once in a blue moon).
558  */
559 static int
vx_status(struct vx_softc * sc)560 vx_status(struct vx_softc *sc)
561 {
562 	struct ifnet *ifp;
563 	int fifost;
564 
565 	VX_LOCK_ASSERT(sc);
566 
567 	/*
568          * Check the FIFO status and act accordingly
569          */
570 	GO_WINDOW(4);
571 	fifost = CSR_READ_2(sc, VX_W4_FIFO_DIAG);
572 	GO_WINDOW(1);
573 
574 	ifp = sc->vx_ifp;
575 	if (fifost & FIFOS_RX_UNDERRUN) {
576 		if (ifp->if_flags & IFF_DEBUG)
577 			if_printf(ifp, "RX underrun\n");
578 		vx_reset(sc);
579 		return 0;
580 	}
581 	if (fifost & FIFOS_RX_STATUS_OVERRUN) {
582 		if (ifp->if_flags & IFF_DEBUG)
583 			if_printf(ifp, "RX Status overrun\n");
584 		return 1;
585 	}
586 	if (fifost & FIFOS_RX_OVERRUN) {
587 		if (ifp->if_flags & IFF_DEBUG)
588 			if_printf(ifp, "RX overrun\n");
589 		return 1;
590 	}
591 	if (fifost & FIFOS_TX_OVERRUN) {
592 		if (ifp->if_flags & IFF_DEBUG)
593 			if_printf(ifp, "TX overrun\n");
594 		vx_reset(sc);
595 		return 0;
596 	}
597 	return 0;
598 }
599 
600 static void
vx_txstat(struct vx_softc * sc)601 vx_txstat(struct vx_softc *sc)
602 {
603 	struct ifnet *ifp;
604 	int i;
605 
606 	VX_LOCK_ASSERT(sc);
607 
608 	/*
609         * We need to read+write TX_STATUS until we get a 0 status
610         * in order to turn off the interrupt flag.
611         */
612 	ifp = sc->vx_ifp;
613 	while ((i = CSR_READ_1(sc, VX_W1_TX_STATUS)) & TXS_COMPLETE) {
614 		CSR_WRITE_1(sc, VX_W1_TX_STATUS, 0x0);
615 
616 		if (i & TXS_JABBER) {
617 			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
618 			if (ifp->if_flags & IFF_DEBUG)
619 				if_printf(ifp, "jabber (%x)\n", i);
620 			vx_reset(sc);
621 		} else if (i & TXS_UNDERRUN) {
622 			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
623 			if (ifp->if_flags & IFF_DEBUG)
624 				if_printf(ifp, "fifo underrun (%x) @%d\n", i,
625 				    sc->vx_tx_start_thresh);
626 			if (sc->vx_tx_succ_ok < 100)
627 				sc->vx_tx_start_thresh =
628 				    min(ETHER_MAX_LEN,
629 					sc->vx_tx_start_thresh + 20);
630 			sc->vx_tx_succ_ok = 0;
631 			vx_reset(sc);
632 		} else if (i & TXS_MAX_COLLISION) {
633 			if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1);
634 			CSR_WRITE_2(sc, VX_COMMAND, TX_ENABLE);
635 			ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
636 		} else
637 			sc->vx_tx_succ_ok = (sc->vx_tx_succ_ok + 1) & 127;
638 	}
639 }
640 
641 void
vx_intr(void * voidsc)642 vx_intr(void *voidsc)
643 {
644 	short status;
645 	struct vx_softc *sc = voidsc;
646 	struct ifnet *ifp = sc->vx_ifp;
647 
648 	VX_LOCK(sc);
649 	for (;;) {
650 		CSR_WRITE_2(sc, VX_COMMAND, C_INTR_LATCH);
651 
652 		status = CSR_READ_2(sc, VX_STATUS);
653 
654 		if ((status & (S_TX_COMPLETE | S_TX_AVAIL |
655 		    S_RX_COMPLETE | S_CARD_FAILURE)) == 0)
656 			break;
657 
658 		/*
659 		 * Acknowledge any interrupts.  It's important that we do this
660 		 * first, since there would otherwise be a race condition.
661 		 * Due to the i386 interrupt queueing, we may get spurious
662 		 * interrupts occasionally.
663 		 */
664 		CSR_WRITE_2(sc, VX_COMMAND, ACK_INTR | status);
665 
666 		if (status & S_RX_COMPLETE)
667 			vx_read(sc);
668 		if (status & S_TX_AVAIL) {
669 			sc->vx_timer = 0;
670 			sc->vx_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
671 			vx_start_locked(sc->vx_ifp);
672 		}
673 		if (status & S_CARD_FAILURE) {
674 			if_printf(ifp, "adapter failure (%x)\n", status);
675 			sc->vx_timer = 0;
676 			vx_reset(sc);
677 			break;
678 		}
679 		if (status & S_TX_COMPLETE) {
680 			sc->vx_timer = 0;
681 			vx_txstat(sc);
682 			vx_start_locked(ifp);
683 		}
684 	}
685 	VX_UNLOCK(sc);
686 
687 	/* no more interrupts */
688 	return;
689 }
690 
691 static void
vx_read(struct vx_softc * sc)692 vx_read(struct vx_softc *sc)
693 {
694 	struct ifnet *ifp = sc->vx_ifp;
695 	struct mbuf *m;
696 	struct ether_header *eh;
697 	u_int len;
698 
699 	VX_LOCK_ASSERT(sc);
700 	len = CSR_READ_2(sc, VX_W1_RX_STATUS);
701 again:
702 
703 	if (ifp->if_flags & IFF_DEBUG) {
704 		int err = len & ERR_MASK;
705 		char *s = NULL;
706 
707 		if (len & ERR_INCOMPLETE)
708 			s = "incomplete packet";
709 		else if (err == ERR_OVERRUN)
710 			s = "packet overrun";
711 		else if (err == ERR_RUNT)
712 			s = "runt packet";
713 		else if (err == ERR_ALIGNMENT)
714 			s = "bad alignment";
715 		else if (err == ERR_CRC)
716 			s = "bad crc";
717 		else if (err == ERR_OVERSIZE)
718 			s = "oversized packet";
719 		else if (err == ERR_DRIBBLE)
720 			s = "dribble bits";
721 
722 		if (s)
723 			if_printf(ifp, "%s\n", s);
724 	}
725 	if (len & ERR_INCOMPLETE)
726 		return;
727 
728 	if (len & ERR_RX) {
729 		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
730 		goto abort;
731 	}
732 	len &= RX_BYTES_MASK;	/* Lower 11 bits = RX bytes. */
733 
734 	/* Pull packet off interface. */
735 	m = vx_get(sc, len);
736 	if (m == NULL) {
737 		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
738 		goto abort;
739 	}
740 	if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
741 
742 	{
743 		struct mbuf *m0;
744 
745 		m0 = m_devget(mtod(m, char *), m->m_pkthdr.len, ETHER_ALIGN,
746 		    ifp, NULL);
747 		if (m0 == NULL) {
748 			if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
749 			goto abort;
750 		}
751 		m_freem(m);
752 		m = m0;
753 	}
754 
755 	/* We assume the header fit entirely in one mbuf. */
756 	eh = mtod(m, struct ether_header *);
757 
758 	/*
759          * XXX: Some cards seem to be in promiscuous mode all the time.
760          * we need to make sure we only get our own stuff always.
761          * bleah!
762          */
763 
764 	if (!(ifp->if_flags & IFF_PROMISC)
765 	    && (eh->ether_dhost[0] & 1) == 0	/* !mcast and !bcast */
766 	    && bcmp(eh->ether_dhost, IF_LLADDR(sc->vx_ifp),
767 	    ETHER_ADDR_LEN) != 0) {
768 		m_freem(m);
769 		return;
770 	}
771 	VX_UNLOCK(sc);
772 	(*ifp->if_input)(ifp, m);
773 	VX_LOCK(sc);
774 
775 	/*
776         * In periods of high traffic we can actually receive enough
777         * packets so that the fifo overrun bit will be set at this point,
778         * even though we just read a packet. In this case we
779         * are not going to receive any more interrupts. We check for
780         * this condition and read again until the fifo is not full.
781         * We could simplify this test by not using vx_status(), but
782         * rechecking the RX_STATUS register directly. This test could
783         * result in unnecessary looping in cases where there is a new
784         * packet but the fifo is not full, but it will not fix the
785         * stuck behavior.
786         *
787         * Even with this improvement, we still get packet overrun errors
788         * which are hurting performance. Maybe when I get some more time
789         * I'll modify vx_read() so that it can handle RX_EARLY interrupts.
790         */
791 	if (vx_status(sc)) {
792 		len = CSR_READ_2(sc, VX_W1_RX_STATUS);
793 		/* Check if we are stuck and reset [see XXX comment] */
794 		if (len & ERR_INCOMPLETE) {
795 			if (ifp->if_flags & IFF_DEBUG)
796 				if_printf(ifp, "adapter reset\n");
797 			vx_reset(sc);
798 			return;
799 		}
800 		goto again;
801 	}
802 	return;
803 
804 abort:
805 	CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK);
806 }
807 
808 static struct mbuf *
vx_get(struct vx_softc * sc,u_int totlen)809 vx_get(struct vx_softc *sc, u_int totlen)
810 {
811 	struct ifnet *ifp = sc->vx_ifp;
812 	struct mbuf *top, **mp, *m;
813 	int len;
814 
815 	VX_LOCK_ASSERT(sc);
816 	m = sc->vx_mb[sc->vx_next_mb];
817 	sc->vx_mb[sc->vx_next_mb] = NULL;
818 	if (m == NULL) {
819 		MGETHDR(m, M_NOWAIT, MT_DATA);
820 		if (m == NULL)
821 			return NULL;
822 	} else {
823 		/* If the queue is no longer full, refill. */
824 		if (sc->vx_last_mb == sc->vx_next_mb &&
825 		    sc->vx_buffill_pending == 0) {
826 			callout_reset(&sc->vx_callout, hz / 100, vx_mbuf_fill,
827 			    sc);
828 			sc->vx_buffill_pending = 1;
829 		}
830 		/* Convert one of our saved mbuf's. */
831 		sc->vx_next_mb = (sc->vx_next_mb + 1) % MAX_MBS;
832 		m->m_data = m->m_pktdat;
833 		m->m_flags = M_PKTHDR;
834 		bzero(&m->m_pkthdr, sizeof(m->m_pkthdr));
835 	}
836 	m->m_pkthdr.rcvif = ifp;
837 	m->m_pkthdr.len = totlen;
838 	len = MHLEN;
839 	top = NULL;
840 	mp = &top;
841 
842 	/*
843          * We read the packet at splhigh() so that an interrupt from another
844          * device doesn't cause the card's buffer to overflow while we're
845          * reading it.  We may still lose packets at other times.
846 	 *
847 	 * XXX: Can't enforce this anymore.
848          */
849 
850 	/*
851          * Since we don't set allowLargePackets bit in MacControl register,
852          * we can assume that totlen <= 1500bytes.
853          * The while loop will be performed iff we have a packet with
854          * MLEN < m_len < MINCLSIZE.
855          */
856 	while (totlen > 0) {
857 		if (top) {
858 			m = sc->vx_mb[sc->vx_next_mb];
859 			sc->vx_mb[sc->vx_next_mb] = NULL;
860 			if (m == NULL) {
861 				MGET(m, M_NOWAIT, MT_DATA);
862 				if (m == NULL) {
863 					m_freem(top);
864 					return NULL;
865 				}
866 			} else {
867 				sc->vx_next_mb = (sc->vx_next_mb + 1) % MAX_MBS;
868 			}
869 			len = MLEN;
870 		}
871 		if (totlen >= MINCLSIZE) {
872 			if (MCLGET(m, M_NOWAIT))
873 				len = MCLBYTES;
874 		}
875 		len = min(totlen, len);
876 		if (len > 3)
877 			bus_space_read_multi_4(sc->vx_bst, sc->vx_bsh,
878 			    VX_W1_RX_PIO_RD_1, mtod(m, u_int32_t *), len / 4);
879 		if (len & 3) {
880 			bus_space_read_multi_1(sc->vx_bst, sc->vx_bsh,
881 			    VX_W1_RX_PIO_RD_1, mtod(m, u_int8_t *) + (len & ~3),
882 			    len & 3);
883 		}
884 		m->m_len = len;
885 		totlen -= len;
886 		*mp = m;
887 		mp = &m->m_next;
888 	}
889 
890 	CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK);
891 
892 	return top;
893 }
894 
895 
896 static int
vx_ioctl(struct ifnet * ifp,u_long cmd,caddr_t data)897 vx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
898 {
899 	struct vx_softc *sc = ifp->if_softc;
900 	struct ifreq *ifr = (struct ifreq *) data;
901 	int error = 0;
902 
903 	switch (cmd) {
904 	case SIOCSIFFLAGS:
905 		VX_LOCK(sc);
906 		if ((ifp->if_flags & IFF_UP) == 0 &&
907 		    (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
908 			/*
909 	                 * If interface is marked up and it is stopped, then
910 	                 * start it.
911 	                 */
912 			vx_stop(sc);
913 			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
914 		} else if ((ifp->if_flags & IFF_UP) != 0 &&
915 		    (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
916 			/*
917 	                 * If interface is marked up and it is stopped, then
918 	                 * start it.
919 	                 */
920 			vx_init_locked(sc);
921 		} else {
922 			/*
923 	                 * deal with flags changes:
924 	                 * IFF_MULTICAST, IFF_PROMISC,
925 	                 * IFF_LINK0, IFF_LINK1,
926 	                 */
927 			vx_setfilter(sc);
928 			vx_setlink(sc);
929 		}
930 		VX_UNLOCK(sc);
931 		break;
932 
933 	case SIOCSIFMTU:
934 		/*
935 	         * Set the interface MTU.
936 	         */
937 		VX_LOCK(sc);
938 		if (ifr->ifr_mtu > ETHERMTU) {
939 			error = EINVAL;
940 		} else {
941 			ifp->if_mtu = ifr->ifr_mtu;
942 		}
943 		VX_UNLOCK(sc);
944 		break;
945 
946 	case SIOCADDMULTI:
947 	case SIOCDELMULTI:
948 		/*
949 		 * Multicast list has changed; set the hardware filter
950 		 * accordingly.
951 		 */
952 		VX_LOCK(sc);
953 		vx_reset(sc);
954 		VX_UNLOCK(sc);
955 		error = 0;
956 		break;
957 
958 
959 	default:
960 		error = ether_ioctl(ifp, cmd, data);
961 		break;
962 	}
963 
964 	return (error);
965 }
966 
967 static void
vx_reset(struct vx_softc * sc)968 vx_reset(struct vx_softc *sc)
969 {
970 
971 	VX_LOCK_ASSERT(sc);
972 	vx_stop(sc);
973 	vx_init_locked(sc);
974 }
975 
976 static void
vx_watchdog(void * arg)977 vx_watchdog(void *arg)
978 {
979 	struct vx_softc *sc;
980 	struct ifnet *ifp;
981 
982 	sc = arg;
983 	VX_LOCK_ASSERT(sc);
984 	callout_reset(&sc->vx_watchdog, hz, vx_watchdog, sc);
985 	if (sc->vx_timer == 0 || --sc->vx_timer > 0)
986 		return;
987 
988 	ifp = sc->vx_ifp;
989 	if (ifp->if_flags & IFF_DEBUG)
990 		if_printf(ifp, "device timeout\n");
991 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
992 	vx_start_locked(ifp);
993 	vx_intr(sc);
994 }
995 
996 void
vx_stop(struct vx_softc * sc)997 vx_stop(struct vx_softc *sc)
998 {
999 
1000 	VX_LOCK_ASSERT(sc);
1001 	sc->vx_timer = 0;
1002 	callout_stop(&sc->vx_watchdog);
1003 
1004 	CSR_WRITE_2(sc, VX_COMMAND, RX_DISABLE);
1005 	CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK);
1006 	VX_BUSY_WAIT;
1007 	CSR_WRITE_2(sc, VX_COMMAND, TX_DISABLE);
1008 	CSR_WRITE_2(sc, VX_COMMAND, STOP_TRANSCEIVER);
1009 	DELAY(800);
1010 	CSR_WRITE_2(sc, VX_COMMAND, RX_RESET);
1011 	VX_BUSY_WAIT;
1012 	CSR_WRITE_2(sc, VX_COMMAND, TX_RESET);
1013 	VX_BUSY_WAIT;
1014 	CSR_WRITE_2(sc, VX_COMMAND, C_INTR_LATCH);
1015 	CSR_WRITE_2(sc, VX_COMMAND, SET_RD_0_MASK);
1016 	CSR_WRITE_2(sc, VX_COMMAND, SET_INTR_MASK);
1017 	CSR_WRITE_2(sc, VX_COMMAND, SET_RX_FILTER);
1018 
1019 	vx_mbuf_empty(sc);
1020 }
1021 
1022 int
vx_busy_eeprom(struct vx_softc * sc)1023 vx_busy_eeprom(struct vx_softc *sc)
1024 {
1025 	int j, i = 100;
1026 
1027 	while (i--) {
1028 		j = CSR_READ_2(sc, VX_W0_EEPROM_COMMAND);
1029 		if (j & EEPROM_BUSY)
1030 			DELAY(100);
1031 		else
1032 			break;
1033 	}
1034 	if (!i) {
1035 		if_printf(sc->vx_ifp, "eeprom failed to come ready\n");
1036 		return (1);
1037 	}
1038 	return (0);
1039 }
1040 
1041 static void
vx_mbuf_fill(void * sp)1042 vx_mbuf_fill(void *sp)
1043 {
1044 	struct vx_softc *sc = (struct vx_softc *)sp;
1045 	int i;
1046 
1047 	VX_LOCK_ASSERT(sc);
1048 	i = sc->vx_last_mb;
1049 	do {
1050 		if (sc->vx_mb[i] == NULL)
1051 			MGET(sc->vx_mb[i], M_NOWAIT, MT_DATA);
1052 		if (sc->vx_mb[i] == NULL)
1053 			break;
1054 		i = (i + 1) % MAX_MBS;
1055 	} while (i != sc->vx_next_mb);
1056 	sc->vx_last_mb = i;
1057 	/* If the queue was not filled, try again. */
1058 	if (sc->vx_last_mb != sc->vx_next_mb) {
1059 		callout_reset(&sc->vx_callout, hz / 100, vx_mbuf_fill, sc);
1060 		sc->vx_buffill_pending = 1;
1061 	} else {
1062 		sc->vx_buffill_pending = 0;
1063 	}
1064 }
1065 
1066 static void
vx_mbuf_empty(struct vx_softc * sc)1067 vx_mbuf_empty(struct vx_softc *sc)
1068 {
1069 	int i;
1070 
1071 	VX_LOCK_ASSERT(sc);
1072 	for (i = 0; i < MAX_MBS; i++) {
1073 		if (sc->vx_mb[i]) {
1074 			m_freem(sc->vx_mb[i]);
1075 			sc->vx_mb[i] = NULL;
1076 		}
1077 	}
1078 	sc->vx_last_mb = sc->vx_next_mb = 0;
1079 	if (sc->vx_buffill_pending != 0)
1080 		callout_stop(&sc->vx_callout);
1081 }
1082