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