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