xref: /netbsd-src/sys/dev/usb/if_kue.c (revision 4472dbe5e3bd91ef2540bada7a7ca7384627ff9b)
1 /*	$NetBSD: if_kue.c,v 1.29 2000/06/01 14:28:58 augustss Exp $	*/
2 /*
3  * Copyright (c) 1997, 1998, 1999, 2000
4  *	Bill Paul <wpaul@ee.columbia.edu>.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Bill Paul.
17  * 4. Neither the name of the author nor the names of any co-contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31  * THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * $FreeBSD: src/sys/dev/usb/if_kue.c,v 1.14 2000/01/14 01:36:15 wpaul Exp $
34  */
35 
36 /*
37  * Kawasaki LSI KL5KUSB101B USB to ethernet adapter driver.
38  *
39  * Written by Bill Paul <wpaul@ee.columbia.edu>
40  * Electrical Engineering Department
41  * Columbia University, New York City
42  */
43 
44 /*
45  * The KLSI USB to ethernet adapter chip contains an USB serial interface,
46  * ethernet MAC and embedded microcontroller (called the QT Engine).
47  * The chip must have firmware loaded into it before it will operate.
48  * Packets are passed between the chip and host via bulk transfers.
49  * There is an interrupt endpoint mentioned in the software spec, however
50  * it's currently unused. This device is 10Mbps half-duplex only, hence
51  * there is no media selection logic. The MAC supports a 128 entry
52  * multicast filter, though the exact size of the filter can depend
53  * on the firmware. Curiously, while the software spec describes various
54  * ethernet statistics counters, my sample adapter and firmware combination
55  * claims not to support any statistics counters at all.
56  *
57  * Note that once we load the firmware in the device, we have to be
58  * careful not to load it again: if you restart your computer but
59  * leave the adapter attached to the USB controller, it may remain
60  * powered on and retain its firmware. In this case, we don't need
61  * to load the firmware a second time.
62  *
63  * Special thanks to Rob Furr for providing an ADS Technologies
64  * adapter for development and testing. No monkeys were harmed during
65  * the development of this driver.
66  */
67 
68 /*
69  * Ported to NetBSD and somewhat rewritten by Lennart Augustsson.
70  */
71 
72 /*
73  * TODO:
74  * only use kue_do_request for downloading firmware.
75  * more DPRINTF
76  * proper cleanup on errors
77  */
78 #if defined(__NetBSD__)
79 #include "opt_inet.h"
80 #include "opt_ns.h"
81 #include "bpfilter.h"
82 #include "rnd.h"
83 #elif defined(__OpenBSD__)
84 #include "bpfilter.h"
85 #endif
86 
87 #include <sys/param.h>
88 #include <sys/systm.h>
89 #include <sys/sockio.h>
90 #include <sys/mbuf.h>
91 #include <sys/malloc.h>
92 #include <sys/kernel.h>
93 #include <sys/socket.h>
94 
95 #if defined(__FreeBSD__)
96 
97 #include <net/ethernet.h>
98 #include <machine/clock.h>	/* for DELAY */
99 #include <sys/bus.h>
100 
101 #elif defined(__NetBSD__) || defined(__OpenBSD__)
102 
103 #include <sys/device.h>
104 #if NRND > 0
105 #include <sys/rnd.h>
106 #endif
107 
108 #endif
109 
110 #include <net/if.h>
111 #if defined(__NetBSD__) || defined(__FreeBSD__)
112 #include <net/if_arp.h>
113 #endif
114 #include <net/if_dl.h>
115 
116 #if defined(__NetBSD__) || defined(__OpenBSD__)
117 #define BPF_MTAP(ifp, m) bpf_mtap((ifp)->if_bpf, (m))
118 #else
119 #define BPF_MTAP(ifp, m) bpf_mtap((ifp), (m))
120 #endif
121 
122 #if defined(__FreeBSD__) || NBPFILTER > 0
123 #include <net/bpf.h>
124 #endif
125 
126 #if defined(__NetBSD__)
127 #include <net/if_ether.h>
128 #ifdef INET
129 #include <netinet/in.h>
130 #include <netinet/if_inarp.h>
131 #endif
132 #endif /* defined (__NetBSD__) */
133 
134 #if defined(__OpenBSD__)
135 #ifdef INET
136 #include <netinet/in.h>
137 #include <netinet/in_systm.h>
138 #include <netinet/in_var.h>
139 #include <netinet/ip.h>
140 #include <netinet/if_ether.h>
141 #endif
142 #endif /* defined (__OpenBSD__) */
143 
144 #if defined(__NetBSD__) || defined(__OpenBSD__)
145 #ifdef NS
146 #include <netns/ns.h>
147 #include <netns/ns_if.h>
148 #endif
149 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
150 
151 #include <dev/usb/usb.h>
152 #include <dev/usb/usbdi.h>
153 #include <dev/usb/usbdi_util.h>
154 #include <dev/usb/usbdevs.h>
155 
156 #ifdef __FreeBSD__
157 #include <dev/usb/usb_ethersubr.h>
158 #endif
159 
160 #include <dev/usb/if_kuereg.h>
161 #include <dev/usb/kue_fw.h>
162 
163 #ifdef KUE_DEBUG
164 #define DPRINTF(x)	if (kuedebug) logprintf x
165 #define DPRINTFN(n,x)	if (kuedebug >= (n)) logprintf x
166 int	kuedebug = 0;
167 #else
168 #define DPRINTF(x)
169 #define DPRINTFN(n,x)
170 #endif
171 
172 /*
173  * Various supported device vendors/products.
174  */
175 Static struct kue_type kue_devs[] = {
176 	{ USB_VENDOR_AOX, USB_PRODUCT_AOX_USB101 },
177 	{ USB_VENDOR_ADS, USB_PRODUCT_ADS_UBS10BT },
178 	{ USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC10T },
179 	{ USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_EA101 },
180 	{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET },
181 	{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET2 },
182 	{ USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_E45 },
183 	{ USB_VENDOR_3COM, USB_PRODUCT_3COM_3C19250 },
184 	{ USB_VENDOR_3COM, USB_PRODUCT_3COM_3C460 },
185 	{ USB_VENDOR_COREGA, USB_PRODUCT_COREGA_ETHER_USB_T },
186 	{ USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650C },
187 	{ USB_VENDOR_SMC, USB_PRODUCT_SMC_2102USB },
188 	{ USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10T },
189 	{ USB_VENDOR_KLSI, USB_PRODUCT_KLSI_DUH3E10BT },
190 	{ 0, 0 }
191 };
192 
193 USB_DECLARE_DRIVER(kue);
194 
195 Static int kue_tx_list_init(struct kue_softc *);
196 Static int kue_rx_list_init(struct kue_softc *);
197 Static int kue_newbuf(struct kue_softc *, struct kue_chain *,struct mbuf *);
198 Static int kue_send(struct kue_softc *, struct mbuf *, int);
199 Static int kue_open_pipes(struct kue_softc *);
200 Static void kue_rxeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
201 Static void kue_txeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
202 Static void kue_start(struct ifnet *);
203 Static int kue_ioctl(struct ifnet *, u_long, caddr_t);
204 Static void kue_init(void *);
205 Static void kue_stop(struct kue_softc *);
206 Static void kue_watchdog(struct ifnet *);
207 
208 Static void kue_setmulti(struct kue_softc *);
209 Static void kue_reset(struct kue_softc *);
210 
211 Static usbd_status kue_ctl(struct kue_softc *, int, u_int8_t,
212 			   u_int16_t, void *, u_int32_t);
213 Static usbd_status kue_setword(struct kue_softc *, u_int8_t, u_int16_t);
214 Static int kue_is_warm(struct kue_softc *);
215 Static int kue_load_fw(struct kue_softc *);
216 
217 #if defined(__FreeBSD__)
218 #ifndef lint
219 static const char rcsid[] =
220   "$FreeBSD: src/sys/dev/usb/if_kue.c,v 1.14 2000/01/14 01:36:15 wpaul Exp $";
221 #endif
222 
223 Static void kue_rxstart(struct ifnet *);
224 Static void kue_shutdown(device_t);
225 
226 Static struct usb_qdat kue_qdat;
227 
228 Static device_method_t kue_methods[] = {
229 	/* Device interface */
230 	DEVMETHOD(device_probe,		kue_match),
231 	DEVMETHOD(device_attach,	kue_attach),
232 	DEVMETHOD(device_detach,	kue_detach),
233 	DEVMETHOD(device_shutdown,	kue_shutdown),
234 
235 	{ 0, 0 }
236 };
237 
238 Static driver_t kue_driver = {
239 	"kue",
240 	kue_methods,
241 	sizeof(struct kue_softc)
242 };
243 
244 Static devclass_t kue_devclass;
245 
246 DRIVER_MODULE(if_kue, uhub, kue_driver, kue_devclass, usbd_driver_load, 0);
247 
248 #endif /* __FreeBSD__ */
249 
250 #define KUE_DO_REQUEST(dev, req, data)			\
251 	usbd_do_request_flags(dev, req, data, USBD_NO_TSLEEP, NULL)
252 
253 Static usbd_status
254 kue_setword(struct kue_softc *sc, u_int8_t breq, u_int16_t word)
255 {
256 	usb_device_request_t	req;
257 	usbd_status		err;
258 	int			s;
259 
260 	DPRINTFN(10,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
261 
262 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
263 	req.bRequest = breq;
264 	USETW(req.wValue, word);
265 	USETW(req.wIndex, 0);
266 	USETW(req.wLength, 0);
267 
268 	s = splusb();
269 	err = KUE_DO_REQUEST(sc->kue_udev, &req, NULL);
270 	splx(s);
271 
272 	return (err);
273 }
274 
275 Static usbd_status
276 kue_ctl(struct kue_softc *sc, int rw, u_int8_t breq, u_int16_t val,
277 	void *data, u_int32_t len)
278 {
279 	usb_device_request_t	req;
280 	usbd_status		err;
281 	int			s;
282 
283 	DPRINTFN(10,("%s: %s: enter, len=%d\n", USBDEVNAME(sc->kue_dev),
284 		     __FUNCTION__, len));
285 
286 	if (rw == KUE_CTL_WRITE)
287 		req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
288 	else
289 		req.bmRequestType = UT_READ_VENDOR_DEVICE;
290 
291 	req.bRequest = breq;
292 	USETW(req.wValue, val);
293 	USETW(req.wIndex, 0);
294 	USETW(req.wLength, len);
295 
296 	s = splusb();
297 	err = KUE_DO_REQUEST(sc->kue_udev, &req, data);
298 	splx(s);
299 
300 	return (err);
301 }
302 
303 Static int
304 kue_is_warm(struct kue_softc *sc)
305 {
306 	usbd_status		err;
307 	usb_device_request_t	req;
308 
309 	/* Just issue some random command. */
310 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
311 	req.bRequest = KUE_CMD_GET_ETHER_DESCRIPTOR;
312 	USETW(req.wValue, 0);
313 	USETW(req.wIndex, 0);
314 	USETW(req.wLength, sizeof(sc->kue_desc));
315 
316 	err = usbd_do_request(sc->kue_udev, &req, &sc->kue_desc);
317 
318 	return (!err);
319 }
320 
321 Static int
322 kue_load_fw(struct kue_softc *sc)
323 {
324 	usbd_status		err;
325 
326 	DPRINTFN(1,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
327 
328 	/*
329 	 * First, check if we even need to load the firmware.
330 	 * If the device was still attached when the system was
331 	 * rebooted, it may already have firmware loaded in it.
332 	 * If this is the case, we don't need to do it again.
333 	 * And in fact, if we try to load it again, we'll hang,
334 	 * so we have to avoid this condition if we don't want
335 	 * to look stupid.
336 	 *
337 	 * We can test this quickly by issuing a request that
338 	 * is only valid after firmware download.
339 	 */
340 	if (kue_is_warm(sc)) {
341 		printf("%s: warm boot, no firmware download\n",
342 		       USBDEVNAME(sc->kue_dev));
343 		return (0);
344 	}
345 
346 	printf("%s: cold boot, downloading firmware\n",
347 	       USBDEVNAME(sc->kue_dev));
348 
349 	/* Load code segment */
350 	DPRINTFN(1,("%s: kue_load_fw: download code_seg\n",
351 		    USBDEVNAME(sc->kue_dev)));
352 	err = kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN,
353 	    0, kue_code_seg, sizeof(kue_code_seg));
354 	if (err) {
355 		printf("%s: failed to load code segment: %s\n",
356 		    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
357 			return (EIO);
358 	}
359 
360 	/* Load fixup segment */
361 	DPRINTFN(1,("%s: kue_load_fw: download fix_seg\n",
362 		    USBDEVNAME(sc->kue_dev)));
363 	err = kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN,
364 	    0, kue_fix_seg, sizeof(kue_fix_seg));
365 	if (err) {
366 		printf("%s: failed to load fixup segment: %s\n",
367 		    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
368 			return (EIO);
369 	}
370 
371 	/* Send trigger command. */
372 	DPRINTFN(1,("%s: kue_load_fw: download trig_seg\n",
373 		    USBDEVNAME(sc->kue_dev)));
374 	err = kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN,
375 	    0, kue_trig_seg, sizeof(kue_trig_seg));
376 	if (err) {
377 		printf("%s: failed to load trigger segment: %s\n",
378 		    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
379 			return (EIO);
380 	}
381 
382 	usbd_delay_ms(sc->kue_udev, 10);
383 
384 	/*
385 	 * Reload device descriptor.
386 	 * Why? The chip without the firmware loaded returns
387 	 * one revision code. The chip with the firmware
388 	 * loaded and running returns a *different* revision
389 	 * code. This confuses the quirk mechanism, which is
390 	 * dependent on the revision data.
391 	 */
392 	(void)usbd_reload_device_desc(sc->kue_udev);
393 
394 	DPRINTFN(1,("%s: %s: done\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
395 
396 	/* Reset the adapter. */
397 	kue_reset(sc);
398 
399 	return (0);
400 }
401 
402 Static void
403 kue_setmulti(struct kue_softc *sc)
404 {
405 	struct ifnet		*ifp = GET_IFP(sc);
406 #if defined(__FreeBSD__)
407 	struct ifmultiaddr	*ifma;
408 #elif defined(__NetBSD__) || defined(__OpenBSD__)
409 	struct ether_multi	*enm;
410 	struct ether_multistep	step;
411 #endif
412 	int			i;
413 
414 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
415 
416 	if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
417 		sc->kue_rxfilt |= KUE_RXFILT_ALLMULTI;
418 		sc->kue_rxfilt &= ~KUE_RXFILT_MULTICAST;
419 		kue_setword(sc, KUE_CMD_SET_PKT_FILTER, sc->kue_rxfilt);
420 		return;
421 	}
422 
423 	sc->kue_rxfilt &= ~KUE_RXFILT_ALLMULTI;
424 
425 	i = 0;
426 #if defined(__FreeBSD__)
427 	for (ifma = ifp->if_multiaddrs.lh_first; ifma != NULL;
428 	    ifma = ifma->ifma_link.le_next) {
429 		if (ifma->ifma_addr->sa_family != AF_LINK)
430 			continue;
431 		/*
432 		 * If there are too many addresses for the
433 		 * internal filter, switch over to allmulti mode.
434 		 */
435 		if (i == KUE_MCFILTCNT(sc))
436 			break;
437 		bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
438 		    KUE_MCFILT(sc, i), ETHER_ADDR_LEN);
439 		i++;
440 	}
441 #elif defined(__NetBSD__) || defined(__OpenBSD__)
442 #if defined (__NetBSD__)
443 	ETHER_FIRST_MULTI(step, &sc->kue_ec, enm);
444 #else
445 	ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
446 #endif
447 	while (enm != NULL) {
448 		if (i == KUE_MCFILTCNT(sc))
449 			break;
450 #if 0
451 		if (memcmp(enm->enm_addrlo,
452 			   enm->enm_addrhi, ETHER_ADDR_LEN) != 0) {
453 			ifp->if_flags |= IFF_ALLMULTI;
454 			/* XXX what now? */
455 			return;
456 		}
457 #endif
458 		memcpy(KUE_MCFILT(sc, i), enm->enm_addrlo, ETHER_ADDR_LEN);
459 		ETHER_NEXT_MULTI(step, enm);
460 		i++;
461 	}
462 #endif
463 
464 	if (i == KUE_MCFILTCNT(sc))
465 		sc->kue_rxfilt |= KUE_RXFILT_ALLMULTI;
466 	else {
467 		sc->kue_rxfilt |= KUE_RXFILT_MULTICAST;
468 		kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SET_MCAST_FILTERS,
469 		    i, sc->kue_mcfilters, i * ETHER_ADDR_LEN);
470 	}
471 
472 	kue_setword(sc, KUE_CMD_SET_PKT_FILTER, sc->kue_rxfilt);
473 }
474 
475 /*
476  * Issue a SET_CONFIGURATION command to reset the MAC. This should be
477  * done after the firmware is loaded into the adapter in order to
478  * bring it into proper operation.
479  */
480 Static void
481 kue_reset(struct kue_softc *sc)
482 {
483 	usbd_status		err;
484 
485 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
486 
487 	err = usbd_set_config_no(sc->kue_udev, KUE_CONFIG_NO, 0);
488 	if (err)
489 		printf("%s: reset failed\n", USBDEVNAME(sc->kue_dev));
490 
491 	/* Wait a little while for the chip to get its brains in order. */
492 	usbd_delay_ms(sc->kue_udev, 10);
493 }
494 
495 /*
496  * Probe for a KLSI chip.
497  */
498 USB_MATCH(kue)
499 {
500 	USB_MATCH_START(kue, uaa);
501 	struct kue_type			*t;
502 
503 	DPRINTFN(25,("kue_match: enter\n"));
504 
505 	if (uaa->iface != NULL)
506 		return (UMATCH_NONE);
507 
508 	for (t = kue_devs; t->kue_vid != 0; t++)
509 		if (uaa->vendor == t->kue_vid && uaa->product == t->kue_did)
510 			return (UMATCH_VENDOR_PRODUCT);
511 
512 	return (UMATCH_NONE);
513 }
514 
515 /*
516  * Attach the interface. Allocate softc structures, do
517  * setup and ethernet/BPF attach.
518  */
519 USB_ATTACH(kue)
520 {
521 	USB_ATTACH_START(kue, sc, uaa);
522 	char			devinfo[1024];
523 	int			s;
524 	struct ifnet		*ifp;
525 	usbd_device_handle	dev = uaa->device;
526 	usbd_interface_handle	iface;
527 	usbd_status		err;
528 	usb_interface_descriptor_t	*id;
529 	usb_endpoint_descriptor_t	*ed;
530 	int			i;
531 
532 #ifdef __FreeBSD__
533 	bzero(sc, sizeof(struct kue_softc));
534 #endif
535 
536 	DPRINTFN(5,(" : kue_attach: sc=%p, dev=%p", sc, dev));
537 
538 	usbd_devinfo(dev, 0, devinfo);
539 	USB_ATTACH_SETUP;
540 	printf("%s: %s\n", USBDEVNAME(sc->kue_dev), devinfo);
541 
542 	err = usbd_set_config_no(dev, KUE_CONFIG_NO, 0);
543 	if (err) {
544 		printf("%s: setting config no failed\n",
545 		    USBDEVNAME(sc->kue_dev));
546 		USB_ATTACH_ERROR_RETURN;
547 	}
548 
549 	sc->kue_udev = dev;
550 	sc->kue_product = uaa->product;
551 	sc->kue_vendor = uaa->vendor;
552 
553 	/* Load the firmware into the NIC. */
554 	if (kue_load_fw(sc)) {
555 		printf("%s: loading firmware failed\n",
556 		    USBDEVNAME(sc->kue_dev));
557 		USB_ATTACH_ERROR_RETURN;
558 	}
559 
560 	err = usbd_device2interface_handle(dev, KUE_IFACE_IDX, &iface);
561 	if (err) {
562 		printf("%s: getting interface handle failed\n",
563 		    USBDEVNAME(sc->kue_dev));
564 		USB_ATTACH_ERROR_RETURN;
565 	}
566 
567 	sc->kue_iface = iface;
568 	id = usbd_get_interface_descriptor(iface);
569 
570 	/* Find endpoints. */
571 	for (i = 0; i < id->bNumEndpoints; i++) {
572 		ed = usbd_interface2endpoint_descriptor(iface, i);
573 		if (ed == NULL) {
574 			printf("%s: couldn't get ep %d\n",
575 			    USBDEVNAME(sc->kue_dev), i);
576 			USB_ATTACH_ERROR_RETURN;
577 		}
578 		if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
579 		    UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
580 			sc->kue_ed[KUE_ENDPT_RX] = ed->bEndpointAddress;
581 		} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
582 			   UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
583 			sc->kue_ed[KUE_ENDPT_TX] = ed->bEndpointAddress;
584 		} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
585 			   UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT) {
586 			sc->kue_ed[KUE_ENDPT_INTR] = ed->bEndpointAddress;
587 		}
588 	}
589 
590 	if (sc->kue_ed[KUE_ENDPT_RX] == 0 || sc->kue_ed[KUE_ENDPT_TX] == 0) {
591 		printf("%s: missing endpoint\n", USBDEVNAME(sc->kue_dev));
592 		USB_ATTACH_ERROR_RETURN;
593 	}
594 
595 	/* Read ethernet descriptor */
596 	err = kue_ctl(sc, KUE_CTL_READ, KUE_CMD_GET_ETHER_DESCRIPTOR,
597 	    0, &sc->kue_desc, sizeof(sc->kue_desc));
598 	if (err) {
599 		printf("%s: could not read Ethernet descriptor\n",
600 		    USBDEVNAME(sc->kue_dev));
601 		USB_ATTACH_ERROR_RETURN;
602 	}
603 
604 	sc->kue_mcfilters = malloc(KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN,
605 	    M_USBDEV, M_NOWAIT);
606 	if (sc->kue_mcfilters == NULL) {
607 		printf("%s: no memory for multicast filter buffer\n",
608 		    USBDEVNAME(sc->kue_dev));
609 		USB_ATTACH_ERROR_RETURN;
610 	}
611 
612 	s = splimp();
613 
614 	/*
615 	 * A KLSI chip was detected. Inform the world.
616 	 */
617 #if defined(__FreeBSD__)
618 	printf("%s: Ethernet address: %6D\n", USBDEVNAME(sc->kue_dev),
619 	    sc->kue_desc.kue_macaddr, ":");
620 
621 	bcopy(sc->kue_desc.kue_macaddr,
622 	    (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
623 
624 	ifp = GET_IFP(sc);
625 	ifp->if_softc = sc;
626 	ifp->if_unit = sc->kue_unit;
627 	ifp->if_name = "kue";
628 	ifp->if_mtu = ETHERMTU;
629 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
630 	ifp->if_ioctl = kue_ioctl;
631 	ifp->if_output = ether_output;
632 	ifp->if_start = kue_start;
633 	ifp->if_watchdog = kue_watchdog;
634 	ifp->if_init = kue_init;
635 	ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
636 
637 	kue_qdat.ifp = ifp;
638 	kue_qdat.if_rxstart = kue_rxstart;
639 
640 	/*
641 	 * Call MI attach routines.
642 	 */
643 	if_attach(ifp);
644 	ether_ifattach(ifp);
645 	bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
646 	usb_register_netisr();
647 
648 #elif defined(__NetBSD__) || defined(__OpenBSD__)
649 
650 	printf("%s: Ethernet address %s\n", USBDEVNAME(sc->kue_dev),
651 	    ether_sprintf(sc->kue_desc.kue_macaddr));
652 
653 	/* Initialize interface info.*/
654 	ifp = GET_IFP(sc);
655 	ifp->if_softc = sc;
656 	ifp->if_mtu = ETHERMTU;
657 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
658 	ifp->if_ioctl = kue_ioctl;
659 	ifp->if_start = kue_start;
660 	ifp->if_watchdog = kue_watchdog;
661 #if defined(__OpenBSD__)
662 	ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
663 #endif
664 	strncpy(ifp->if_xname, USBDEVNAME(sc->kue_dev), IFNAMSIZ);
665 
666 	/* Attach the interface. */
667 	if_attach(ifp);
668 	Ether_ifattach(ifp, sc->kue_desc.kue_macaddr);
669 
670 #if NBPFILTER > 0
671 	bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB,
672 		  sizeof(struct ether_header));
673 #endif
674 #if NRND > 0
675 	rnd_attach_source(&sc->rnd_source, USBDEVNAME(sc->kue_dev),
676 	    RND_TYPE_NET, 0);
677 #endif
678 
679 #endif /* __NetBSD__ */
680 	sc->kue_attached = 1;
681 	splx(s);
682 
683 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->kue_udev,
684 			   USBDEV(sc->kue_dev));
685 
686 	USB_ATTACH_SUCCESS_RETURN;
687 }
688 
689 USB_DETACH(kue)
690 {
691 	USB_DETACH_START(kue, sc);
692 	struct ifnet		*ifp = GET_IFP(sc);
693 	int			s;
694 
695 	s = splusb();		/* XXX why? */
696 
697 	if (sc->kue_mcfilters != NULL) {
698 		free(sc->kue_mcfilters, M_USBDEV);
699 		sc->kue_mcfilters = NULL;
700 	}
701 
702 	if (!sc->kue_attached) {
703 		/* Detached before attached finished, so just bail out. */
704 		splx(s);
705 		return (0);
706 	}
707 
708 	if (ifp->if_flags & IFF_RUNNING)
709 		kue_stop(sc);
710 
711 #if defined(__NetBSD__)
712 #if NRND > 0
713 	rnd_detach_source(&sc->rnd_source);
714 #endif
715 #if NBPFILTER > 0
716 	bpfdetach(ifp);
717 #endif
718 	ether_ifdetach(ifp);
719 #endif /* __NetBSD__ */
720 
721 	if_detach(ifp);
722 
723 #ifdef DIAGNOSTIC
724 	if (sc->kue_ep[KUE_ENDPT_TX] != NULL ||
725 	    sc->kue_ep[KUE_ENDPT_RX] != NULL ||
726 	    sc->kue_ep[KUE_ENDPT_INTR] != NULL)
727 		printf("%s: detach has active endpoints\n",
728 		       USBDEVNAME(sc->kue_dev));
729 #endif
730 
731 	sc->kue_attached = 0;
732 	splx(s);
733 
734 	return (0);
735 }
736 
737 #if defined(__NetBSD__) || defined(__OpenBSD__)
738 int
739 kue_activate(device_ptr_t self, enum devact act)
740 {
741 	struct kue_softc *sc = (struct kue_softc *)self;
742 
743 	DPRINTFN(2,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
744 
745 	switch (act) {
746 	case DVACT_ACTIVATE:
747 		return (EOPNOTSUPP);
748 		break;
749 
750 	case DVACT_DEACTIVATE:
751 #if defined(__NetBSD__)
752 		/* Deactivate the interface. */
753 		if_deactivate(&sc->kue_ec.ec_if);
754 #endif
755 		sc->kue_dying = 1;
756 		break;
757 	}
758 	return (0);
759 }
760 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
761 
762 /*
763  * Initialize an RX descriptor and attach an MBUF cluster.
764  */
765 Static int
766 kue_newbuf(struct kue_softc *sc, struct kue_chain *c, struct mbuf *m)
767 {
768 	struct mbuf		*m_new = NULL;
769 
770 	DPRINTFN(10,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
771 
772 	if (m == NULL) {
773 		MGETHDR(m_new, M_DONTWAIT, MT_DATA);
774 		if (m_new == NULL) {
775 			printf("%s: no memory for rx list "
776 			    "-- packet dropped!\n", USBDEVNAME(sc->kue_dev));
777 			return (ENOBUFS);
778 		}
779 
780 		MCLGET(m_new, M_DONTWAIT);
781 		if (!(m_new->m_flags & M_EXT)) {
782 			printf("%s: no memory for rx list "
783 			    "-- packet dropped!\n", USBDEVNAME(sc->kue_dev));
784 			m_freem(m_new);
785 			return (ENOBUFS);
786 		}
787 		m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
788 	} else {
789 		m_new = m;
790 		m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
791 		m_new->m_data = m_new->m_ext.ext_buf;
792 	}
793 
794 	c->kue_mbuf = m_new;
795 
796 	return (0);
797 }
798 
799 Static int
800 kue_rx_list_init(struct kue_softc *sc)
801 {
802 	struct kue_cdata	*cd;
803 	struct kue_chain	*c;
804 	int			i;
805 
806 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
807 
808 	cd = &sc->kue_cdata;
809 	for (i = 0; i < KUE_RX_LIST_CNT; i++) {
810 		c = &cd->kue_rx_chain[i];
811 		c->kue_sc = sc;
812 		c->kue_idx = i;
813 		if (kue_newbuf(sc, c, NULL) == ENOBUFS)
814 			return (ENOBUFS);
815 		if (c->kue_xfer == NULL) {
816 			c->kue_xfer = usbd_alloc_xfer(sc->kue_udev);
817 			if (c->kue_xfer == NULL)
818 				return (ENOBUFS);
819 			c->kue_buf = usbd_alloc_buffer(c->kue_xfer, KUE_BUFSZ);
820 			if (c->kue_buf == NULL)
821 				return (ENOBUFS); /* XXX free xfer */
822 		}
823 	}
824 
825 	return (0);
826 }
827 
828 Static int
829 kue_tx_list_init(struct kue_softc *sc)
830 {
831 	struct kue_cdata	*cd;
832 	struct kue_chain	*c;
833 	int			i;
834 
835 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev), __FUNCTION__));
836 
837 	cd = &sc->kue_cdata;
838 	for (i = 0; i < KUE_TX_LIST_CNT; i++) {
839 		c = &cd->kue_tx_chain[i];
840 		c->kue_sc = sc;
841 		c->kue_idx = i;
842 		c->kue_mbuf = NULL;
843 		if (c->kue_xfer == NULL) {
844 			c->kue_xfer = usbd_alloc_xfer(sc->kue_udev);
845 			if (c->kue_xfer == NULL)
846 				return (ENOBUFS);
847 			c->kue_buf = usbd_alloc_buffer(c->kue_xfer, KUE_BUFSZ);
848 			if (c->kue_buf == NULL)
849 				return (ENOBUFS);
850 		}
851 	}
852 
853 	return (0);
854 }
855 
856 #ifdef __FreeBSD__
857 Static void
858 kue_rxstart(struct ifnet *ifp)
859 {
860 	struct kue_softc	*sc;
861 	struct kue_chain	*c;
862 
863 	sc = ifp->if_softc;
864 	c = &sc->kue_cdata.kue_rx_chain[sc->kue_cdata.kue_rx_prod];
865 
866 	if (kue_newbuf(sc, c, NULL) == ENOBUFS) {
867 		ifp->if_ierrors++;
868 		return;
869 	}
870 
871 	/* Setup new transfer. */
872 	usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX],
873 	    c, c->kue_buf, KUE_BUFSZ, USBD_SHORT_XFER_OK | USBD_NO_COPY,
874 	    USBD_NO_TIMEOUT, kue_rxeof);
875 	usbd_transfer(c->kue_xfer);
876 }
877 #endif
878 
879 /*
880  * A frame has been uploaded: pass the resulting mbuf chain up to
881  * the higher level protocols.
882  */
883 Static void
884 kue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
885 {
886 	struct kue_chain	*c = priv;
887 	struct kue_softc	*sc = c->kue_sc;
888 	struct ifnet		*ifp = GET_IFP(sc);
889 	struct mbuf		*m;
890 	int			total_len = 0;
891 #if defined(__NetBSD__) || defined(__OpenBSD__)
892 	int			s;
893 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
894 
895 	DPRINTFN(10,("%s: %s: enter status=%d\n", USBDEVNAME(sc->kue_dev),
896 		     __FUNCTION__, status));
897 
898 	if (sc->kue_dying)
899 		return;
900 
901 	if (!(ifp->if_flags & IFF_RUNNING))
902 		return;
903 
904 	if (status != USBD_NORMAL_COMPLETION) {
905 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
906 			return;
907 		sc->kue_rx_errs++;
908 		if (usbd_ratecheck(&sc->kue_rx_notice)) {
909 			printf("%s: %u usb errors on rx: %s\n",
910 			    USBDEVNAME(sc->kue_dev), sc->kue_rx_errs,
911 			    usbd_errstr(status));
912 			sc->kue_rx_errs = 0;
913 		}
914 		if (status == USBD_STALLED)
915 			usbd_clear_endpoint_stall(sc->kue_ep[KUE_ENDPT_RX]);
916 		goto done;
917 	}
918 
919 	usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL);
920 
921 	DPRINTFN(10,("%s: %s: total_len=%d len=%d\n", USBDEVNAME(sc->kue_dev),
922 		     __FUNCTION__, total_len,
923 		     UGETW(mtod(c->kue_mbuf, u_int8_t *))));
924 
925 	if (total_len <= 1)
926 		goto done;
927 
928 	m = c->kue_mbuf;
929 	/* copy data to mbuf */
930 	memcpy(mtod(m, char*), c->kue_buf, total_len);
931 
932 	/* No errors; receive the packet. */
933 	total_len = UGETW(mtod(m, u_int8_t *));
934 	m_adj(m, sizeof(u_int16_t));
935 
936 	if (total_len < sizeof(struct ether_header)) {
937 		ifp->if_ierrors++;
938 		goto done;
939 	}
940 
941 	ifp->if_ipackets++;
942 	m->m_pkthdr.len = m->m_len = total_len;
943 
944 #if defined(__FreeBSD__)
945 	m->m_pkthdr.rcvif = (struct ifnet *)&kue_qdat;
946 	/* Put the packet on the special USB input queue. */
947 	usb_ether_input(m);
948 
949 	return;
950 
951 #elif defined(__NetBSD__) || defined(__OpenBSD__)
952 	m->m_pkthdr.rcvif = ifp;
953 
954 	s = splimp();
955 
956 	/* XXX ugly */
957 	if (kue_newbuf(sc, c, NULL) == ENOBUFS) {
958 		ifp->if_ierrors++;
959 		goto done1;
960 	}
961 
962 #if NBPFILTER > 0
963 	/*
964 	 * Handle BPF listeners. Let the BPF user see the packet, but
965 	 * don't pass it up to the ether_input() layer unless it's
966 	 * a broadcast packet, multicast packet, matches our ethernet
967 	 * address or the interface is in promiscuous mode.
968 	 */
969 	if (ifp->if_bpf) {
970 #if defined(__NetBSD__)
971 		struct ether_header *eh = mtod(m, struct ether_header *);
972 		BPF_MTAP(ifp, m);
973 		if ((ifp->if_flags & IFF_PROMISC) &&
974 		    memcmp(eh->ether_dhost, LLADDR(ifp->if_sadl),
975 			   ETHER_ADDR_LEN) &&
976 		    !(eh->ether_dhost[0] & 1)) {
977 			m_freem(m);
978 			goto done1;
979 		}
980 #else
981 		BPF_MTAP(ifp, m);
982 #endif
983 	}
984 #endif
985 
986 	DPRINTFN(10,("%s: %s: deliver %d\n", USBDEVNAME(sc->kue_dev),
987 		    __FUNCTION__, m->m_len));
988 	IF_INPUT(ifp, m);
989  done1:
990 	splx(s);
991 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
992 
993  done:
994 
995 	/* Setup new transfer. */
996 	usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX],
997 	    c, c->kue_buf, KUE_BUFSZ, USBD_SHORT_XFER_OK | USBD_NO_COPY,
998 	    USBD_NO_TIMEOUT, kue_rxeof);
999 	usbd_transfer(c->kue_xfer);
1000 
1001 	DPRINTFN(10,("%s: %s: start rx\n", USBDEVNAME(sc->kue_dev),
1002 		    __FUNCTION__));
1003 }
1004 
1005 /*
1006  * A frame was downloaded to the chip. It's safe for us to clean up
1007  * the list buffers.
1008  */
1009 
1010 Static void
1011 kue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
1012 {
1013 	struct kue_chain	*c = priv;
1014 	struct kue_softc	*sc = c->kue_sc;
1015 	struct ifnet		*ifp = GET_IFP(sc);
1016 	int			s;
1017 
1018 	if (sc->kue_dying)
1019 		return;
1020 
1021 	s = splimp();
1022 
1023 	DPRINTFN(10,("%s: %s: enter status=%d\n", USBDEVNAME(sc->kue_dev),
1024 		    __FUNCTION__, status));
1025 
1026 	ifp->if_timer = 0;
1027 	ifp->if_flags &= ~IFF_OACTIVE;
1028 
1029 	if (status != USBD_NORMAL_COMPLETION) {
1030 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
1031 			splx(s);
1032 			return;
1033 		}
1034 		ifp->if_oerrors++;
1035 		printf("%s: usb error on tx: %s\n", USBDEVNAME(sc->kue_dev),
1036 		    usbd_errstr(status));
1037 		if (status == USBD_STALLED)
1038 			usbd_clear_endpoint_stall(sc->kue_ep[KUE_ENDPT_TX]);
1039 		splx(s);
1040 		return;
1041 	}
1042 
1043 	ifp->if_opackets++;
1044 
1045 #if defined(__FreeBSD__)
1046 	c->kue_mbuf->m_pkthdr.rcvif = ifp;
1047 	usb_tx_done(c->kue_mbuf);
1048 	c->kue_mbuf = NULL;
1049 #elif defined(__NetBSD__) || defined(__OpenBSD__)
1050 	m_freem(c->kue_mbuf);
1051 	c->kue_mbuf = NULL;
1052 
1053 	if (ifp->if_snd.ifq_head != NULL)
1054 		kue_start(ifp);
1055 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
1056 
1057 	splx(s);
1058 }
1059 
1060 Static int
1061 kue_send(struct kue_softc *sc, struct mbuf *m, int idx)
1062 {
1063 	int			total_len;
1064 	struct kue_chain	*c;
1065 	usbd_status		err;
1066 
1067 	DPRINTFN(10,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1068 
1069 	c = &sc->kue_cdata.kue_tx_chain[idx];
1070 
1071 	/*
1072 	 * Copy the mbuf data into a contiguous buffer, leaving two
1073 	 * bytes at the beginning to hold the frame length.
1074 	 */
1075 	m_copydata(m, 0, m->m_pkthdr.len, c->kue_buf + 2);
1076 	c->kue_mbuf = m;
1077 
1078 	total_len = m->m_pkthdr.len + 2;
1079 	/* XXX what's this? */
1080 	total_len += 64 - (total_len % 64);
1081 
1082 	/* Frame length is specified in the first 2 bytes of the buffer. */
1083 	c->kue_buf[0] = (u_int8_t)m->m_pkthdr.len;
1084 	c->kue_buf[1] = (u_int8_t)(m->m_pkthdr.len >> 8);
1085 
1086 	usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_TX],
1087 	    c, c->kue_buf, total_len, USBD_NO_COPY, USBD_DEFAULT_TIMEOUT, kue_txeof);
1088 
1089 	/* Transmit */
1090 	err = usbd_transfer(c->kue_xfer);
1091 	if (err != USBD_IN_PROGRESS) {
1092 		printf("%s: kue_send error=%s\n", USBDEVNAME(sc->kue_dev),
1093 		       usbd_errstr(err));
1094 		kue_stop(sc);
1095 		return (EIO);
1096 	}
1097 
1098 	sc->kue_cdata.kue_tx_cnt++;
1099 
1100 	return (0);
1101 }
1102 
1103 Static void
1104 kue_start(struct ifnet *ifp)
1105 {
1106 	struct kue_softc	*sc = ifp->if_softc;
1107 	struct mbuf		*m_head = NULL;
1108 
1109 	DPRINTFN(10,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1110 
1111 	if (sc->kue_dying)
1112 		return;
1113 
1114 	if (ifp->if_flags & IFF_OACTIVE)
1115 		return;
1116 
1117 	IF_DEQUEUE(&ifp->if_snd, m_head);
1118 	if (m_head == NULL)
1119 		return;
1120 
1121 	if (kue_send(sc, m_head, 0)) {
1122 		IF_PREPEND(&ifp->if_snd, m_head);
1123 		ifp->if_flags |= IFF_OACTIVE;
1124 		return;
1125 	}
1126 
1127 #if NBPFILTER > 0
1128 	/*
1129 	 * If there's a BPF listener, bounce a copy of this frame
1130 	 * to him.
1131 	 */
1132 	if (ifp->if_bpf)
1133 		BPF_MTAP(ifp, m_head);
1134 #endif
1135 
1136 	ifp->if_flags |= IFF_OACTIVE;
1137 
1138 	/*
1139 	 * Set a timeout in case the chip goes out to lunch.
1140 	 */
1141 	ifp->if_timer = 5;
1142 }
1143 
1144 Static void
1145 kue_init(void *xsc)
1146 {
1147 	struct kue_softc	*sc = xsc;
1148 	struct ifnet		*ifp = GET_IFP(sc);
1149 	int			s;
1150 	u_char			*eaddr;
1151 
1152 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1153 
1154 	if (ifp->if_flags & IFF_RUNNING)
1155 		return;
1156 
1157 	s = splimp();
1158 
1159 #if defined(__FreeBSD__) || defined(__OpenBSD__)
1160 	eaddr = sc->arpcom.ac_enaddr;
1161 #elif defined(__NetBSD__)
1162 	eaddr = LLADDR(ifp->if_sadl);
1163 #endif /* defined(__NetBSD__) */
1164 	/* Set MAC address */
1165 	kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SET_MAC, 0, eaddr, ETHER_ADDR_LEN);
1166 
1167 	sc->kue_rxfilt = KUE_RXFILT_UNICAST | KUE_RXFILT_BROADCAST;
1168 
1169 	 /* If we want promiscuous mode, set the allframes bit. */
1170 	if (ifp->if_flags & IFF_PROMISC)
1171 		sc->kue_rxfilt |= KUE_RXFILT_PROMISC;
1172 
1173 	kue_setword(sc, KUE_CMD_SET_PKT_FILTER, sc->kue_rxfilt);
1174 
1175 	/* I'm not sure how to tune these. */
1176 #if 0
1177 	/*
1178 	 * Leave this one alone for now; setting it
1179 	 * wrong causes lockups on some machines/controllers.
1180 	 */
1181 	kue_setword(sc, KUE_CMD_SET_SOFS, 1);
1182 #endif
1183 	kue_setword(sc, KUE_CMD_SET_URB_SIZE, 64);
1184 
1185 	/* Init TX ring. */
1186 	if (kue_tx_list_init(sc) == ENOBUFS) {
1187 		printf("%s: tx list init failed\n", USBDEVNAME(sc->kue_dev));
1188 		splx(s);
1189 		return;
1190 	}
1191 
1192 	/* Init RX ring. */
1193 	if (kue_rx_list_init(sc) == ENOBUFS) {
1194 		printf("%s: rx list init failed\n", USBDEVNAME(sc->kue_dev));
1195 		splx(s);
1196 		return;
1197 	}
1198 
1199 	/* Load the multicast filter. */
1200 	kue_setmulti(sc);
1201 
1202 	if (sc->kue_ep[KUE_ENDPT_RX] == NULL) {
1203 		if (kue_open_pipes(sc)) {
1204 			splx(s);
1205 			return;
1206 		}
1207 	}
1208 
1209 	ifp->if_flags |= IFF_RUNNING;
1210 	ifp->if_flags &= ~IFF_OACTIVE;
1211 
1212 	splx(s);
1213 }
1214 
1215 Static int
1216 kue_open_pipes(struct kue_softc *sc)
1217 {
1218 	usbd_status		err;
1219 	struct kue_chain	*c;
1220 	int			i;
1221 
1222 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1223 
1224 	/* Open RX and TX pipes. */
1225 	err = usbd_open_pipe(sc->kue_iface, sc->kue_ed[KUE_ENDPT_RX],
1226 	    USBD_EXCLUSIVE_USE, &sc->kue_ep[KUE_ENDPT_RX]);
1227 	if (err) {
1228 		printf("%s: open rx pipe failed: %s\n",
1229 		    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1230 		return (EIO);
1231 	}
1232 
1233 	err = usbd_open_pipe(sc->kue_iface, sc->kue_ed[KUE_ENDPT_TX],
1234 	    USBD_EXCLUSIVE_USE, &sc->kue_ep[KUE_ENDPT_TX]);
1235 	if (err) {
1236 		printf("%s: open tx pipe failed: %s\n",
1237 		    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1238 		return (EIO);
1239 	}
1240 
1241 	/* Start up the receive pipe. */
1242 	for (i = 0; i < KUE_RX_LIST_CNT; i++) {
1243 		c = &sc->kue_cdata.kue_rx_chain[i];
1244 		usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX],
1245 		    c, c->kue_buf, KUE_BUFSZ,
1246 		    USBD_SHORT_XFER_OK | USBD_NO_COPY, USBD_NO_TIMEOUT,
1247 		    kue_rxeof);
1248 		DPRINTFN(5,("%s: %s: start read\n", USBDEVNAME(sc->kue_dev),
1249 			    __FUNCTION__));
1250 		usbd_transfer(c->kue_xfer);
1251 	}
1252 
1253 	return (0);
1254 }
1255 
1256 Static int
1257 kue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1258 {
1259 	struct kue_softc	*sc = ifp->if_softc;
1260 #if defined(__NetBSD__) || defined(__OpenBSD__)
1261 	struct ifaddr 		*ifa = (struct ifaddr *)data;
1262 	struct ifreq		*ifr = (struct ifreq *)data;
1263 #endif
1264 	int			s, error = 0;
1265 
1266 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1267 
1268 	if (sc->kue_dying)
1269 		return (EIO);
1270 
1271 	s = splimp();
1272 
1273 	switch(command) {
1274 #if defined(__FreeBSD__)
1275 	case SIOCSIFADDR:
1276 	case SIOCGIFADDR:
1277 	case SIOCSIFMTU:
1278 		error = ether_ioctl(ifp, command, data);
1279 		break;
1280 #elif defined(__NetBSD__) || defined(__OpenBSD__)
1281 	case SIOCSIFADDR:
1282 		ifp->if_flags |= IFF_UP;
1283 		kue_init(sc);
1284 
1285 		switch (ifa->ifa_addr->sa_family) {
1286 #ifdef INET
1287 		case AF_INET:
1288 #if defined(__NetBSD__)
1289 			arp_ifinit(ifp, ifa);
1290 #else
1291 			arp_ifinit(&sc->arpcom, ifa);
1292 #endif
1293 			break;
1294 #endif /* INET */
1295 #ifdef NS
1296 		case AF_NS:
1297 		    {
1298 			struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
1299 
1300 			if (ns_nullhost(*ina))
1301 				ina->x_host = *(union ns_host *)
1302 					LLADDR(ifp->if_sadl);
1303 			else
1304 				memcpy(LLADDR(ifp->if_sadl),
1305 				       ina->x_host.c_host,
1306 				       ifp->if_addrlen);
1307 			break;
1308 		    }
1309 #endif /* NS */
1310 		}
1311 		break;
1312 
1313 	case SIOCSIFMTU:
1314 		if (ifr->ifr_mtu > ETHERMTU)
1315 			error = EINVAL;
1316 		else
1317 			ifp->if_mtu = ifr->ifr_mtu;
1318 		break;
1319 
1320 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
1321 
1322 	case SIOCSIFFLAGS:
1323 		if (ifp->if_flags & IFF_UP) {
1324 			if (ifp->if_flags & IFF_RUNNING &&
1325 			    ifp->if_flags & IFF_PROMISC &&
1326 			    !(sc->kue_if_flags & IFF_PROMISC)) {
1327 				sc->kue_rxfilt |= KUE_RXFILT_PROMISC;
1328 				kue_setword(sc, KUE_CMD_SET_PKT_FILTER,
1329 				    sc->kue_rxfilt);
1330 			} else if (ifp->if_flags & IFF_RUNNING &&
1331 			    !(ifp->if_flags & IFF_PROMISC) &&
1332 			    sc->kue_if_flags & IFF_PROMISC) {
1333 				sc->kue_rxfilt &= ~KUE_RXFILT_PROMISC;
1334 				kue_setword(sc, KUE_CMD_SET_PKT_FILTER,
1335 				    sc->kue_rxfilt);
1336 			} else if (!(ifp->if_flags & IFF_RUNNING))
1337 				kue_init(sc);
1338 		} else {
1339 			if (ifp->if_flags & IFF_RUNNING)
1340 				kue_stop(sc);
1341 		}
1342 		sc->kue_if_flags = ifp->if_flags;
1343 		error = 0;
1344 		break;
1345 	case SIOCADDMULTI:
1346 	case SIOCDELMULTI:
1347 		kue_setmulti(sc);
1348 		error = 0;
1349 		break;
1350 	default:
1351 		error = EINVAL;
1352 		break;
1353 	}
1354 
1355 	splx(s);
1356 
1357 	return (error);
1358 }
1359 
1360 Static void
1361 kue_watchdog(struct ifnet *ifp)
1362 {
1363 	struct kue_softc	*sc = ifp->if_softc;
1364 
1365 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1366 
1367 	if (sc->kue_dying)
1368 		return;
1369 
1370 	ifp->if_oerrors++;
1371 	printf("%s: watchdog timeout\n", USBDEVNAME(sc->kue_dev));
1372 
1373 	/*
1374 	 * The polling business is a kludge to avoid allowing the
1375 	 * USB code to call tsleep() in usbd_delay_ms(), which will
1376 	 * kill us since the watchdog routine is invoked from
1377 	 * interrupt context.
1378 	 */
1379 	usbd_set_polling(sc->kue_udev, 1);
1380 	kue_stop(sc);
1381 	kue_init(sc);
1382 	usbd_set_polling(sc->kue_udev, 0);
1383 
1384 	if (ifp->if_snd.ifq_head != NULL)
1385 		kue_start(ifp);
1386 }
1387 
1388 /*
1389  * Stop the adapter and free any mbufs allocated to the
1390  * RX and TX lists.
1391  */
1392 Static void
1393 kue_stop(struct kue_softc *sc)
1394 {
1395 	usbd_status		err;
1396 	struct ifnet		*ifp;
1397 	int			i;
1398 
1399 	DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->kue_dev),__FUNCTION__));
1400 
1401 	ifp = GET_IFP(sc);
1402 	ifp->if_timer = 0;
1403 
1404 	/* Stop transfers. */
1405 	if (sc->kue_ep[KUE_ENDPT_RX] != NULL) {
1406 		err = usbd_abort_pipe(sc->kue_ep[KUE_ENDPT_RX]);
1407 		if (err) {
1408 			printf("%s: abort rx pipe failed: %s\n",
1409 			    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1410 		}
1411 		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_RX]);
1412 		if (err) {
1413 			printf("%s: close rx pipe failed: %s\n",
1414 			    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1415 		}
1416 		sc->kue_ep[KUE_ENDPT_RX] = NULL;
1417 	}
1418 
1419 	if (sc->kue_ep[KUE_ENDPT_TX] != NULL) {
1420 		err = usbd_abort_pipe(sc->kue_ep[KUE_ENDPT_TX]);
1421 		if (err) {
1422 			printf("%s: abort tx pipe failed: %s\n",
1423 			    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1424 		}
1425 		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_TX]);
1426 		if (err) {
1427 			printf("%s: close tx pipe failed: %s\n",
1428 			    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1429 		}
1430 		sc->kue_ep[KUE_ENDPT_TX] = NULL;
1431 	}
1432 
1433 	if (sc->kue_ep[KUE_ENDPT_INTR] != NULL) {
1434 		err = usbd_abort_pipe(sc->kue_ep[KUE_ENDPT_INTR]);
1435 		if (err) {
1436 			printf("%s: abort intr pipe failed: %s\n",
1437 			    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1438 		}
1439 		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_INTR]);
1440 		if (err) {
1441 			printf("%s: close intr pipe failed: %s\n",
1442 			    USBDEVNAME(sc->kue_dev), usbd_errstr(err));
1443 		}
1444 		sc->kue_ep[KUE_ENDPT_INTR] = NULL;
1445 	}
1446 
1447 	/* Free RX resources. */
1448 	for (i = 0; i < KUE_RX_LIST_CNT; i++) {
1449 		if (sc->kue_cdata.kue_rx_chain[i].kue_mbuf != NULL) {
1450 			m_freem(sc->kue_cdata.kue_rx_chain[i].kue_mbuf);
1451 			sc->kue_cdata.kue_rx_chain[i].kue_mbuf = NULL;
1452 		}
1453 		if (sc->kue_cdata.kue_rx_chain[i].kue_xfer != NULL) {
1454 			usbd_free_xfer(sc->kue_cdata.kue_rx_chain[i].kue_xfer);
1455 			sc->kue_cdata.kue_rx_chain[i].kue_xfer = NULL;
1456 		}
1457 	}
1458 
1459 	/* Free TX resources. */
1460 	for (i = 0; i < KUE_TX_LIST_CNT; i++) {
1461 		if (sc->kue_cdata.kue_tx_chain[i].kue_mbuf != NULL) {
1462 			m_freem(sc->kue_cdata.kue_tx_chain[i].kue_mbuf);
1463 			sc->kue_cdata.kue_tx_chain[i].kue_mbuf = NULL;
1464 		}
1465 		if (sc->kue_cdata.kue_tx_chain[i].kue_xfer != NULL) {
1466 			usbd_free_xfer(sc->kue_cdata.kue_tx_chain[i].kue_xfer);
1467 			sc->kue_cdata.kue_tx_chain[i].kue_xfer = NULL;
1468 		}
1469 	}
1470 
1471 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1472 }
1473 
1474 #ifdef __FreeBSD__
1475 /*
1476  * Stop all chip I/O so that the kernel's probe routines don't
1477  * get confused by errant DMAs when rebooting.
1478  */
1479 Static void
1480 kue_shutdown(device_t dev)
1481 {
1482 	struct kue_softc	*sc;
1483 
1484 	sc = device_get_softc(dev);
1485 
1486 	kue_stop(sc);
1487 }
1488 #endif
1489