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