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