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