]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/usb/net/if_udav.c
MFV r365636: libarchive: import fix for WARNS=6 builds in testing bits
[FreeBSD/FreeBSD.git] / sys / dev / usb / net / if_udav.c
1 /*      $NetBSD: if_udav.c,v 1.2 2003/09/04 15:17:38 tsutsui Exp $      */
2 /*      $nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $   */
3 /*      $FreeBSD$       */
4 /*-
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  * Copyright (c) 2003
8  *     Shingo WATANABE <nabe@nabechan.org>.  All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the author nor the names of any co-contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  */
35
36 /*
37  * DM9601(DAVICOM USB to Ethernet MAC Controller with Integrated 10/100 PHY)
38  * The spec can be found at the following url.
39  *   http://ptm2.cc.utu.fi/ftp/network/cards/DM9601/From_NET/DM9601-DS-P01-930914.pdf
40  */
41
42 /*
43  * TODO:
44  *      Interrupt Endpoint support
45  *      External PHYs
46  */
47
48 #include <sys/cdefs.h>
49 __FBSDID("$FreeBSD$");
50
51 #include <sys/stdint.h>
52 #include <sys/stddef.h>
53 #include <sys/param.h>
54 #include <sys/queue.h>
55 #include <sys/types.h>
56 #include <sys/systm.h>
57 #include <sys/socket.h>
58 #include <sys/kernel.h>
59 #include <sys/bus.h>
60 #include <sys/module.h>
61 #include <sys/lock.h>
62 #include <sys/mutex.h>
63 #include <sys/condvar.h>
64 #include <sys/sysctl.h>
65 #include <sys/sx.h>
66 #include <sys/unistd.h>
67 #include <sys/callout.h>
68 #include <sys/malloc.h>
69 #include <sys/priv.h>
70
71 #include <net/if.h>
72 #include <net/if_var.h>
73 #include <net/if_media.h>
74
75 #include <dev/mii/mii.h>
76 #include <dev/mii/miivar.h>
77
78 #include <dev/usb/usb.h>
79 #include <dev/usb/usbdi.h>
80 #include <dev/usb/usbdi_util.h>
81 #include "usbdevs.h"
82
83 #include "miibus_if.h"
84
85 #define USB_DEBUG_VAR udav_debug
86 #include <dev/usb/usb_debug.h>
87 #include <dev/usb/usb_process.h>
88
89 #include <dev/usb/net/usb_ethernet.h>
90 #include <dev/usb/net/if_udavreg.h>
91
92 /* prototypes */
93
94 static device_probe_t udav_probe;
95 static device_attach_t udav_attach;
96 static device_detach_t udav_detach;
97
98 static usb_callback_t udav_bulk_write_callback;
99 static usb_callback_t udav_bulk_read_callback;
100 static usb_callback_t udav_intr_callback;
101
102 static uether_fn_t udav_attach_post;
103 static uether_fn_t udav_init;
104 static uether_fn_t udav_stop;
105 static uether_fn_t udav_start;
106 static uether_fn_t udav_tick;
107 static uether_fn_t udav_setmulti;
108 static uether_fn_t udav_setpromisc;
109
110 static int      udav_csr_read(struct udav_softc *, uint16_t, void *, int);
111 static int      udav_csr_write(struct udav_softc *, uint16_t, void *, int);
112 static uint8_t  udav_csr_read1(struct udav_softc *, uint16_t);
113 static int      udav_csr_write1(struct udav_softc *, uint16_t, uint8_t);
114 static void     udav_reset(struct udav_softc *);
115 static int      udav_ifmedia_upd(struct ifnet *);
116 static void     udav_ifmedia_status(struct ifnet *, struct ifmediareq *);
117
118 static miibus_readreg_t udav_miibus_readreg;
119 static miibus_writereg_t udav_miibus_writereg;
120 static miibus_statchg_t udav_miibus_statchg;
121
122 static const struct usb_config udav_config[UDAV_N_TRANSFER] = {
123         [UDAV_BULK_DT_WR] = {
124                 .type = UE_BULK,
125                 .endpoint = UE_ADDR_ANY,
126                 .direction = UE_DIR_OUT,
127                 .bufsize = (MCLBYTES + 2),
128                 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
129                 .callback = udav_bulk_write_callback,
130                 .timeout = 10000,       /* 10 seconds */
131         },
132
133         [UDAV_BULK_DT_RD] = {
134                 .type = UE_BULK,
135                 .endpoint = UE_ADDR_ANY,
136                 .direction = UE_DIR_IN,
137                 .bufsize = (MCLBYTES + 3),
138                 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
139                 .callback = udav_bulk_read_callback,
140                 .timeout = 0,   /* no timeout */
141         },
142
143         [UDAV_INTR_DT_RD] = {
144                 .type = UE_INTERRUPT,
145                 .endpoint = UE_ADDR_ANY,
146                 .direction = UE_DIR_IN,
147                 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
148                 .bufsize = 0,   /* use wMaxPacketSize */
149                 .callback = udav_intr_callback,
150         },
151 };
152
153 static device_method_t udav_methods[] = {
154         /* Device interface */
155         DEVMETHOD(device_probe, udav_probe),
156         DEVMETHOD(device_attach, udav_attach),
157         DEVMETHOD(device_detach, udav_detach),
158
159         /* MII interface */
160         DEVMETHOD(miibus_readreg, udav_miibus_readreg),
161         DEVMETHOD(miibus_writereg, udav_miibus_writereg),
162         DEVMETHOD(miibus_statchg, udav_miibus_statchg),
163
164         DEVMETHOD_END
165 };
166
167 static driver_t udav_driver = {
168         .name = "udav",
169         .methods = udav_methods,
170         .size = sizeof(struct udav_softc),
171 };
172
173 static devclass_t udav_devclass;
174
175 static const STRUCT_USB_HOST_ID udav_devs[] = {
176         /* ShanTou DM9601 USB NIC */
177         {USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_DM9601, 0)},
178         /* ShanTou ST268 USB NIC */
179         {USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_ST268, 0)},
180         /* Corega USB-TXC */
181         {USB_VPI(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_FETHER_USB_TXC, 0)},
182         /* ShanTou AMD8515 USB NIC */
183         {USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_ADM8515, 0)},
184         /* Kontron AG USB Ethernet */
185         {USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_DM9601, 0)},
186         {USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_JP1082,
187             UDAV_FLAG_NO_PHY)},
188 };
189
190 DRIVER_MODULE(udav, uhub, udav_driver, udav_devclass, NULL, 0);
191 DRIVER_MODULE(miibus, udav, miibus_driver, miibus_devclass, 0, 0);
192 MODULE_DEPEND(udav, uether, 1, 1, 1);
193 MODULE_DEPEND(udav, usb, 1, 1, 1);
194 MODULE_DEPEND(udav, ether, 1, 1, 1);
195 MODULE_DEPEND(udav, miibus, 1, 1, 1);
196 MODULE_VERSION(udav, 1);
197 USB_PNP_HOST_INFO(udav_devs);
198
199 static const struct usb_ether_methods udav_ue_methods = {
200         .ue_attach_post = udav_attach_post,
201         .ue_start = udav_start,
202         .ue_init = udav_init,
203         .ue_stop = udav_stop,
204         .ue_tick = udav_tick,
205         .ue_setmulti = udav_setmulti,
206         .ue_setpromisc = udav_setpromisc,
207         .ue_mii_upd = udav_ifmedia_upd,
208         .ue_mii_sts = udav_ifmedia_status,
209 };
210
211 static const struct usb_ether_methods udav_ue_methods_nophy = {
212         .ue_attach_post = udav_attach_post,
213         .ue_start = udav_start,
214         .ue_init = udav_init,
215         .ue_stop = udav_stop,
216         .ue_setmulti = udav_setmulti,
217         .ue_setpromisc = udav_setpromisc,
218 };
219
220 #ifdef USB_DEBUG
221 static int udav_debug = 0;
222
223 static SYSCTL_NODE(_hw_usb, OID_AUTO, udav, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
224     "USB udav");
225 SYSCTL_INT(_hw_usb_udav, OID_AUTO, debug, CTLFLAG_RWTUN, &udav_debug, 0,
226     "Debug level");
227 #endif
228
229 #define UDAV_SETBIT(sc, reg, x) \
230         udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) | (x))
231
232 #define UDAV_CLRBIT(sc, reg, x) \
233         udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) & ~(x))
234
235 static void
236 udav_attach_post(struct usb_ether *ue)
237 {
238         struct udav_softc *sc = uether_getsc(ue);
239
240         /* reset the adapter */
241         udav_reset(sc);
242
243         /* Get Ethernet Address */
244         udav_csr_read(sc, UDAV_PAR, ue->ue_eaddr, ETHER_ADDR_LEN);
245 }
246
247 static int
248 udav_probe(device_t dev)
249 {
250         struct usb_attach_arg *uaa = device_get_ivars(dev);
251
252         if (uaa->usb_mode != USB_MODE_HOST)
253                 return (ENXIO);
254         if (uaa->info.bConfigIndex != UDAV_CONFIG_INDEX)
255                 return (ENXIO);
256         if (uaa->info.bIfaceIndex != UDAV_IFACE_INDEX)
257                 return (ENXIO);
258
259         return (usbd_lookup_id_by_uaa(udav_devs, sizeof(udav_devs), uaa));
260 }
261
262 static int
263 udav_attach(device_t dev)
264 {
265         struct usb_attach_arg *uaa = device_get_ivars(dev);
266         struct udav_softc *sc = device_get_softc(dev);
267         struct usb_ether *ue = &sc->sc_ue;
268         uint8_t iface_index;
269         int error;
270
271         sc->sc_flags = USB_GET_DRIVER_INFO(uaa);
272
273         device_set_usb_desc(dev);
274
275         mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF);
276
277         iface_index = UDAV_IFACE_INDEX;
278         error = usbd_transfer_setup(uaa->device, &iface_index,
279             sc->sc_xfer, udav_config, UDAV_N_TRANSFER, sc, &sc->sc_mtx);
280         if (error) {
281                 device_printf(dev, "allocating USB transfers failed\n");
282                 goto detach;
283         }
284
285         /*
286          * The JP1082 has an unusable PHY and provides no link information.
287          */
288         if (sc->sc_flags & UDAV_FLAG_NO_PHY) {
289                 ue->ue_methods = &udav_ue_methods_nophy;
290                 sc->sc_flags |= UDAV_FLAG_LINK;
291         } else {
292                 ue->ue_methods = &udav_ue_methods;
293         }
294
295         ue->ue_sc = sc;
296         ue->ue_dev = dev;
297         ue->ue_udev = uaa->device;
298         ue->ue_mtx = &sc->sc_mtx;
299
300         error = uether_ifattach(ue);
301         if (error) {
302                 device_printf(dev, "could not attach interface\n");
303                 goto detach;
304         }
305
306         return (0);                     /* success */
307
308 detach:
309         udav_detach(dev);
310         return (ENXIO);                 /* failure */
311 }
312
313 static int
314 udav_detach(device_t dev)
315 {
316         struct udav_softc *sc = device_get_softc(dev);
317         struct usb_ether *ue = &sc->sc_ue;
318
319         usbd_transfer_unsetup(sc->sc_xfer, UDAV_N_TRANSFER);
320         uether_ifdetach(ue);
321         mtx_destroy(&sc->sc_mtx);
322
323         return (0);
324 }
325
326 #if 0
327 static int
328 udav_mem_read(struct udav_softc *sc, uint16_t offset, void *buf,
329     int len)
330 {
331         struct usb_device_request req;
332
333         len &= 0xff;
334
335         req.bmRequestType = UT_READ_VENDOR_DEVICE;
336         req.bRequest = UDAV_REQ_MEM_READ;
337         USETW(req.wValue, 0x0000);
338         USETW(req.wIndex, offset);
339         USETW(req.wLength, len);
340
341         return (uether_do_request(&sc->sc_ue, &req, buf, 1000));
342 }
343
344 static int
345 udav_mem_write(struct udav_softc *sc, uint16_t offset, void *buf,
346     int len)
347 {
348         struct usb_device_request req;
349
350         len &= 0xff;
351
352         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
353         req.bRequest = UDAV_REQ_MEM_WRITE;
354         USETW(req.wValue, 0x0000);
355         USETW(req.wIndex, offset);
356         USETW(req.wLength, len);
357
358         return (uether_do_request(&sc->sc_ue, &req, buf, 1000));
359 }
360
361 static int
362 udav_mem_write1(struct udav_softc *sc, uint16_t offset,
363     uint8_t ch)
364 {
365         struct usb_device_request req;
366
367         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
368         req.bRequest = UDAV_REQ_MEM_WRITE1;
369         USETW(req.wValue, ch);
370         USETW(req.wIndex, offset);
371         USETW(req.wLength, 0x0000);
372
373         return (uether_do_request(&sc->sc_ue, &req, NULL, 1000));
374 }
375 #endif
376
377 static int
378 udav_csr_read(struct udav_softc *sc, uint16_t offset, void *buf, int len)
379 {
380         struct usb_device_request req;
381
382         len &= 0xff;
383
384         req.bmRequestType = UT_READ_VENDOR_DEVICE;
385         req.bRequest = UDAV_REQ_REG_READ;
386         USETW(req.wValue, 0x0000);
387         USETW(req.wIndex, offset);
388         USETW(req.wLength, len);
389
390         return (uether_do_request(&sc->sc_ue, &req, buf, 1000));
391 }
392
393 static int
394 udav_csr_write(struct udav_softc *sc, uint16_t offset, void *buf, int len)
395 {
396         struct usb_device_request req;
397
398         offset &= 0xff;
399         len &= 0xff;
400
401         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
402         req.bRequest = UDAV_REQ_REG_WRITE;
403         USETW(req.wValue, 0x0000);
404         USETW(req.wIndex, offset);
405         USETW(req.wLength, len);
406
407         return (uether_do_request(&sc->sc_ue, &req, buf, 1000));
408 }
409
410 static uint8_t
411 udav_csr_read1(struct udav_softc *sc, uint16_t offset)
412 {
413         uint8_t val;
414
415         udav_csr_read(sc, offset, &val, 1);
416         return (val);
417 }
418
419 static int
420 udav_csr_write1(struct udav_softc *sc, uint16_t offset,
421     uint8_t ch)
422 {
423         struct usb_device_request req;
424
425         offset &= 0xff;
426
427         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
428         req.bRequest = UDAV_REQ_REG_WRITE1;
429         USETW(req.wValue, ch);
430         USETW(req.wIndex, offset);
431         USETW(req.wLength, 0x0000);
432
433         return (uether_do_request(&sc->sc_ue, &req, NULL, 1000));
434 }
435
436 static void
437 udav_init(struct usb_ether *ue)
438 {
439         struct udav_softc *sc = ue->ue_sc;
440         struct ifnet *ifp = uether_getifp(&sc->sc_ue);
441
442         UDAV_LOCK_ASSERT(sc, MA_OWNED);
443
444         /*
445          * Cancel pending I/O
446          */
447         udav_stop(ue);
448
449         /* set MAC address */
450         udav_csr_write(sc, UDAV_PAR, IF_LLADDR(ifp), ETHER_ADDR_LEN);
451
452         /* initialize network control register */
453
454         /* disable loopback  */
455         UDAV_CLRBIT(sc, UDAV_NCR, UDAV_NCR_LBK0 | UDAV_NCR_LBK1);
456
457         /* Initialize RX control register */
458         UDAV_SETBIT(sc, UDAV_RCR, UDAV_RCR_DIS_LONG | UDAV_RCR_DIS_CRC);
459
460         /* load multicast filter and update promiscious mode bit */
461         udav_setpromisc(ue);
462
463         /* enable RX */
464         UDAV_SETBIT(sc, UDAV_RCR, UDAV_RCR_RXEN);
465
466         /* clear POWER_DOWN state of internal PHY */
467         UDAV_SETBIT(sc, UDAV_GPCR, UDAV_GPCR_GEP_CNTL0);
468         UDAV_CLRBIT(sc, UDAV_GPR, UDAV_GPR_GEPIO0);
469
470         usbd_xfer_set_stall(sc->sc_xfer[UDAV_BULK_DT_WR]);
471
472         ifp->if_drv_flags |= IFF_DRV_RUNNING;
473         udav_start(ue);
474 }
475
476 static void
477 udav_reset(struct udav_softc *sc)
478 {
479         int i;
480
481         /* Select PHY */
482 #if 1
483         /*
484          * XXX: force select internal phy.
485          *      external phy routines are not tested.
486          */
487         UDAV_CLRBIT(sc, UDAV_NCR, UDAV_NCR_EXT_PHY);
488 #else
489         if (sc->sc_flags & UDAV_EXT_PHY)
490                 UDAV_SETBIT(sc, UDAV_NCR, UDAV_NCR_EXT_PHY);
491         else
492                 UDAV_CLRBIT(sc, UDAV_NCR, UDAV_NCR_EXT_PHY);
493 #endif
494
495         UDAV_SETBIT(sc, UDAV_NCR, UDAV_NCR_RST);
496
497         for (i = 0; i < UDAV_TX_TIMEOUT; i++) {
498                 if (!(udav_csr_read1(sc, UDAV_NCR) & UDAV_NCR_RST))
499                         break;
500                 if (uether_pause(&sc->sc_ue, hz / 100))
501                         break;
502         }
503
504         uether_pause(&sc->sc_ue, hz / 100);
505 }
506
507 static u_int
508 udav_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
509 {
510         uint8_t *hashtbl = arg;
511         int h;
512
513         h = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN) >> 26;
514         hashtbl[h / 8] |= 1 << (h % 8);
515
516         return (1);
517 }
518
519 static void
520 udav_setmulti(struct usb_ether *ue)
521 {
522         struct udav_softc *sc = ue->ue_sc;
523         struct ifnet *ifp = uether_getifp(&sc->sc_ue);
524         uint8_t hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
525
526         UDAV_LOCK_ASSERT(sc, MA_OWNED);
527
528         if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
529                 UDAV_SETBIT(sc, UDAV_RCR, UDAV_RCR_ALL|UDAV_RCR_PRMSC);
530                 return;
531         }
532
533         /* first, zot all the existing hash bits */
534         memset(hashtbl, 0x00, sizeof(hashtbl));
535         hashtbl[7] |= 0x80;     /* broadcast address */
536         udav_csr_write(sc, UDAV_MAR, hashtbl, sizeof(hashtbl));
537
538         /* now program new ones */
539         if_foreach_llmaddr(ifp, udav_hash_maddr, hashtbl);
540
541         /* disable all multicast */
542         UDAV_CLRBIT(sc, UDAV_RCR, UDAV_RCR_ALL);
543
544         /* write hash value to the register */
545         udav_csr_write(sc, UDAV_MAR, hashtbl, sizeof(hashtbl));
546 }
547
548 static void
549 udav_setpromisc(struct usb_ether *ue)
550 {
551         struct udav_softc *sc = ue->ue_sc;
552         struct ifnet *ifp = uether_getifp(&sc->sc_ue);
553         uint8_t rxmode;
554
555         rxmode = udav_csr_read1(sc, UDAV_RCR);
556         rxmode &= ~(UDAV_RCR_ALL | UDAV_RCR_PRMSC);
557
558         if (ifp->if_flags & IFF_PROMISC)
559                 rxmode |= UDAV_RCR_ALL | UDAV_RCR_PRMSC;
560         else if (ifp->if_flags & IFF_ALLMULTI)
561                 rxmode |= UDAV_RCR_ALL;
562
563         /* write new mode bits */
564         udav_csr_write1(sc, UDAV_RCR, rxmode);
565 }
566
567 static void
568 udav_start(struct usb_ether *ue)
569 {
570         struct udav_softc *sc = ue->ue_sc;
571
572         /*
573          * start the USB transfers, if not already started:
574          */
575         usbd_transfer_start(sc->sc_xfer[UDAV_INTR_DT_RD]);
576         usbd_transfer_start(sc->sc_xfer[UDAV_BULK_DT_RD]);
577         usbd_transfer_start(sc->sc_xfer[UDAV_BULK_DT_WR]);
578 }
579
580 static void
581 udav_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
582 {
583         struct udav_softc *sc = usbd_xfer_softc(xfer);
584         struct ifnet *ifp = uether_getifp(&sc->sc_ue);
585         struct usb_page_cache *pc;
586         struct mbuf *m;
587         int extra_len;
588         int temp_len;
589         uint8_t buf[2];
590
591         switch (USB_GET_STATE(xfer)) {
592         case USB_ST_TRANSFERRED:
593                 DPRINTFN(11, "transfer complete\n");
594                 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
595
596                 /* FALLTHROUGH */
597         case USB_ST_SETUP:
598 tr_setup:
599                 if ((sc->sc_flags & UDAV_FLAG_LINK) == 0) {
600                         /*
601                          * don't send anything if there is no link !
602                          */
603                         return;
604                 }
605                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
606
607                 if (m == NULL)
608                         return;
609                 if (m->m_pkthdr.len > MCLBYTES)
610                         m->m_pkthdr.len = MCLBYTES;
611                 if (m->m_pkthdr.len < UDAV_MIN_FRAME_LEN) {
612                         extra_len = UDAV_MIN_FRAME_LEN - m->m_pkthdr.len;
613                 } else {
614                         extra_len = 0;
615                 }
616
617                 temp_len = (m->m_pkthdr.len + extra_len);
618
619                 /*
620                  * the frame length is specified in the first 2 bytes of the
621                  * buffer
622                  */
623                 buf[0] = (uint8_t)(temp_len);
624                 buf[1] = (uint8_t)(temp_len >> 8);
625
626                 temp_len += 2;
627
628                 pc = usbd_xfer_get_frame(xfer, 0);
629                 usbd_copy_in(pc, 0, buf, 2);
630                 usbd_m_copy_in(pc, 2, m, 0, m->m_pkthdr.len);
631
632                 if (extra_len)
633                         usbd_frame_zero(pc, temp_len - extra_len, extra_len);
634                 /*
635                  * if there's a BPF listener, bounce a copy
636                  * of this frame to him:
637                  */
638                 BPF_MTAP(ifp, m);
639
640                 m_freem(m);
641
642                 usbd_xfer_set_frame_len(xfer, 0, temp_len);
643                 usbd_transfer_submit(xfer);
644                 return;
645
646         default:                        /* Error */
647                 DPRINTFN(11, "transfer error, %s\n",
648                     usbd_errstr(error));
649
650                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
651
652                 if (error != USB_ERR_CANCELLED) {
653                         /* try to clear stall first */
654                         usbd_xfer_set_stall(xfer);
655                         goto tr_setup;
656                 }
657                 return;
658         }
659 }
660
661 static void
662 udav_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
663 {
664         struct udav_softc *sc = usbd_xfer_softc(xfer);
665         struct usb_ether *ue = &sc->sc_ue;
666         struct ifnet *ifp = uether_getifp(ue);
667         struct usb_page_cache *pc;
668         struct udav_rxpkt stat;
669         int len;
670         int actlen;
671
672         usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
673
674         switch (USB_GET_STATE(xfer)) {
675         case USB_ST_TRANSFERRED:
676
677                 if (actlen < (int)(sizeof(stat) + ETHER_CRC_LEN)) {
678                         if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
679                         goto tr_setup;
680                 }
681                 pc = usbd_xfer_get_frame(xfer, 0);
682                 usbd_copy_out(pc, 0, &stat, sizeof(stat));
683                 actlen -= sizeof(stat);
684                 len = min(actlen, le16toh(stat.pktlen));
685                 len -= ETHER_CRC_LEN;
686
687                 if (stat.rxstat & UDAV_RSR_LCS) {
688                         if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1);
689                         goto tr_setup;
690                 }
691                 if (stat.rxstat & UDAV_RSR_ERR) {
692                         if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
693                         goto tr_setup;
694                 }
695                 uether_rxbuf(ue, pc, sizeof(stat), len);
696                 /* FALLTHROUGH */
697         case USB_ST_SETUP:
698 tr_setup:
699                 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
700                 usbd_transfer_submit(xfer);
701                 uether_rxflush(ue);
702                 return;
703
704         default:                        /* Error */
705                 DPRINTF("bulk read error, %s\n",
706                     usbd_errstr(error));
707
708                 if (error != USB_ERR_CANCELLED) {
709                         /* try to clear stall first */
710                         usbd_xfer_set_stall(xfer);
711                         goto tr_setup;
712                 }
713                 return;
714         }
715 }
716
717 static void
718 udav_intr_callback(struct usb_xfer *xfer, usb_error_t error)
719 {
720         switch (USB_GET_STATE(xfer)) {
721         case USB_ST_TRANSFERRED:
722         case USB_ST_SETUP:
723 tr_setup:
724                 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
725                 usbd_transfer_submit(xfer);
726                 return;
727
728         default:                        /* Error */
729                 if (error != USB_ERR_CANCELLED) {
730                         /* try to clear stall first */
731                         usbd_xfer_set_stall(xfer);
732                         goto tr_setup;
733                 }
734                 return;
735         }
736 }
737
738 static void
739 udav_stop(struct usb_ether *ue)
740 {
741         struct udav_softc *sc = ue->ue_sc;
742         struct ifnet *ifp = uether_getifp(&sc->sc_ue);
743
744         UDAV_LOCK_ASSERT(sc, MA_OWNED);
745
746         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
747         if (!(sc->sc_flags & UDAV_FLAG_NO_PHY))
748                 sc->sc_flags &= ~UDAV_FLAG_LINK;
749
750         /*
751          * stop all the transfers, if not already stopped:
752          */
753         usbd_transfer_stop(sc->sc_xfer[UDAV_BULK_DT_WR]);
754         usbd_transfer_stop(sc->sc_xfer[UDAV_BULK_DT_RD]);
755         usbd_transfer_stop(sc->sc_xfer[UDAV_INTR_DT_RD]);
756
757         udav_reset(sc);
758 }
759
760 static int
761 udav_ifmedia_upd(struct ifnet *ifp)
762 {
763         struct udav_softc *sc = ifp->if_softc;
764         struct mii_data *mii = GET_MII(sc);
765         struct mii_softc *miisc;
766         int error;
767
768         UDAV_LOCK_ASSERT(sc, MA_OWNED);
769
770         sc->sc_flags &= ~UDAV_FLAG_LINK;
771         LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
772                 PHY_RESET(miisc);
773         error = mii_mediachg(mii);
774         return (error);
775 }
776
777 static void
778 udav_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
779 {
780         struct udav_softc *sc = ifp->if_softc;
781         struct mii_data *mii = GET_MII(sc);
782
783         UDAV_LOCK(sc);
784         mii_pollstat(mii);
785         ifmr->ifm_active = mii->mii_media_active;
786         ifmr->ifm_status = mii->mii_media_status;
787         UDAV_UNLOCK(sc);
788 }
789
790 static void
791 udav_tick(struct usb_ether *ue)
792 {
793         struct udav_softc *sc = ue->ue_sc;
794         struct mii_data *mii = GET_MII(sc);
795
796         UDAV_LOCK_ASSERT(sc, MA_OWNED);
797
798         mii_tick(mii);
799         if ((sc->sc_flags & UDAV_FLAG_LINK) == 0
800             && mii->mii_media_status & IFM_ACTIVE &&
801             IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
802                 sc->sc_flags |= UDAV_FLAG_LINK;
803                 udav_start(ue);
804         }
805 }
806
807 static int
808 udav_miibus_readreg(device_t dev, int phy, int reg)
809 {
810         struct udav_softc *sc = device_get_softc(dev);
811         uint16_t data16;
812         uint8_t val[2];
813         int locked;
814
815         /* XXX: one PHY only for the internal PHY */
816         if (phy != 0)
817                 return (0);
818
819         locked = mtx_owned(&sc->sc_mtx);
820         if (!locked)
821                 UDAV_LOCK(sc);
822
823         /* select internal PHY and set PHY register address */
824         udav_csr_write1(sc, UDAV_EPAR,
825             UDAV_EPAR_PHY_ADR0 | (reg & UDAV_EPAR_EROA_MASK));
826
827         /* select PHY operation and start read command */
828         udav_csr_write1(sc, UDAV_EPCR, UDAV_EPCR_EPOS | UDAV_EPCR_ERPRR);
829
830         /* XXX: should we wait? */
831
832         /* end read command */
833         UDAV_CLRBIT(sc, UDAV_EPCR, UDAV_EPCR_ERPRR);
834
835         /* retrieve the result from data registers */
836         udav_csr_read(sc, UDAV_EPDRL, val, 2);
837
838         data16 = (val[0] | (val[1] << 8));
839
840         DPRINTFN(11, "phy=%d reg=0x%04x => 0x%04x\n",
841             phy, reg, data16);
842
843         if (!locked)
844                 UDAV_UNLOCK(sc);
845         return (data16);
846 }
847
848 static int
849 udav_miibus_writereg(device_t dev, int phy, int reg, int data)
850 {
851         struct udav_softc *sc = device_get_softc(dev);
852         uint8_t val[2];
853         int locked;
854
855         /* XXX: one PHY only for the internal PHY */
856         if (phy != 0)
857                 return (0);
858
859         locked = mtx_owned(&sc->sc_mtx);
860         if (!locked)
861                 UDAV_LOCK(sc);
862
863         /* select internal PHY and set PHY register address */
864         udav_csr_write1(sc, UDAV_EPAR,
865             UDAV_EPAR_PHY_ADR0 | (reg & UDAV_EPAR_EROA_MASK));
866
867         /* put the value to the data registers */
868         val[0] = (data & 0xff);
869         val[1] = (data >> 8) & 0xff;
870         udav_csr_write(sc, UDAV_EPDRL, val, 2);
871
872         /* select PHY operation and start write command */
873         udav_csr_write1(sc, UDAV_EPCR, UDAV_EPCR_EPOS | UDAV_EPCR_ERPRW);
874
875         /* XXX: should we wait? */
876
877         /* end write command */
878         UDAV_CLRBIT(sc, UDAV_EPCR, UDAV_EPCR_ERPRW);
879
880         if (!locked)
881                 UDAV_UNLOCK(sc);
882         return (0);
883 }
884
885 static void
886 udav_miibus_statchg(device_t dev)
887 {
888         /* nothing to do */
889 }