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