Deleted Added
full compact
if_cdce.c (194271) if_cdce.c (194677)
1/* $NetBSD: if_cdce.c,v 1.4 2004/10/24 12:50:54 augustss Exp $ */
2
3/*-
4 * Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com>
5 * Copyright (c) 2003-2005 Craig Boston
6 * Copyright (c) 2004 Daniel Hartmeier
7 * Copyright (c) 2009 Hans Petter Selasky
8 * All rights reserved.

--- 27 unchanged lines hidden (view full) ---

36 */
37
38/*
39 * USB Communication Device Class (Ethernet Networking Control Model)
40 * http://www.usb.org/developers/devclass_docs/usbcdc11.pdf
41 */
42
43#include <sys/cdefs.h>
1/* $NetBSD: if_cdce.c,v 1.4 2004/10/24 12:50:54 augustss Exp $ */
2
3/*-
4 * Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com>
5 * Copyright (c) 2003-2005 Craig Boston
6 * Copyright (c) 2004 Daniel Hartmeier
7 * Copyright (c) 2009 Hans Petter Selasky
8 * All rights reserved.

--- 27 unchanged lines hidden (view full) ---

36 */
37
38/*
39 * USB Communication Device Class (Ethernet Networking Control Model)
40 * http://www.usb.org/developers/devclass_docs/usbcdc11.pdf
41 */
42
43#include <sys/cdefs.h>
44__FBSDID("$FreeBSD: head/sys/dev/usb/net/if_cdce.c 194271 2009-06-15 22:38:05Z thompsa $");
44__FBSDID("$FreeBSD: head/sys/dev/usb/net/if_cdce.c 194677 2009-06-23 02:19:59Z thompsa $");
45
45
46#include "usbdevs.h"
46#include <sys/stdint.h>
47#include <sys/stddef.h>
48#include <sys/param.h>
49#include <sys/queue.h>
50#include <sys/types.h>
51#include <sys/systm.h>
52#include <sys/kernel.h>
53#include <sys/bus.h>
54#include <sys/linker_set.h>
55#include <sys/module.h>
56#include <sys/lock.h>
57#include <sys/mutex.h>
58#include <sys/condvar.h>
59#include <sys/sysctl.h>
60#include <sys/sx.h>
61#include <sys/unistd.h>
62#include <sys/callout.h>
63#include <sys/malloc.h>
64#include <sys/priv.h>
65
47#include <dev/usb/usb.h>
66#include <dev/usb/usb.h>
48#include <dev/usb/usb_mfunc.h>
49#include <dev/usb/usb_error.h>
67#include <dev/usb/usbdi.h>
68#include <dev/usb/usbdi_util.h>
50#include <dev/usb/usb_cdc.h>
69#include <dev/usb/usb_cdc.h>
70#include "usbdevs.h"
51
52#define USB_DEBUG_VAR cdce_debug
71
72#define USB_DEBUG_VAR cdce_debug
53
54#include <dev/usb/usb_core.h>
55#include <dev/usb/usb_lookup.h>
56#include <dev/usb/usb_process.h>
57#include <dev/usb/usb_debug.h>
73#include <dev/usb/usb_debug.h>
58#include <dev/usb/usb_request.h>
59#include <dev/usb/usb_busdma.h>
60#include <dev/usb/usb_util.h>
61#include <dev/usb/usb_parse.h>
62#include <dev/usb/usb_device.h>
74#include <dev/usb/usb_process.h>
75#include "usb_if.h"
63
64#include <dev/usb/net/usb_ethernet.h>
65#include <dev/usb/net/if_cdcereg.h>
66
67static device_probe_t cdce_probe;
68static device_attach_t cdce_attach;
69static device_detach_t cdce_detach;
70static device_suspend_t cdce_suspend;

--- 350 unchanged lines hidden (view full) ---

421 if (ppm[x] != NULL) {
422 m_freem(ppm[x]);
423 ppm[x] = NULL;
424 }
425 }
426}
427
428static void
76
77#include <dev/usb/net/usb_ethernet.h>
78#include <dev/usb/net/if_cdcereg.h>
79
80static device_probe_t cdce_probe;
81static device_attach_t cdce_attach;
82static device_detach_t cdce_detach;
83static device_suspend_t cdce_suspend;

--- 350 unchanged lines hidden (view full) ---

434 if (ppm[x] != NULL) {
435 m_freem(ppm[x]);
436 ppm[x] = NULL;
437 }
438 }
439}
440
441static void
429cdce_bulk_write_callback(struct usb_xfer *xfer)
442cdce_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
430{
443{
431 struct cdce_softc *sc = xfer->priv_sc;
444 struct cdce_softc *sc = usbd_xfer_softc(xfer);
432 struct ifnet *ifp = uether_getifp(&sc->sc_ue);
433 struct mbuf *m;
434 struct mbuf *mt;
435 uint32_t crc;
436 uint8_t x;
445 struct ifnet *ifp = uether_getifp(&sc->sc_ue);
446 struct mbuf *m;
447 struct mbuf *mt;
448 uint32_t crc;
449 uint8_t x;
450 int actlen, aframes;
437
451
452 usbd_xfer_status(xfer, &actlen, NULL, &aframes, NULL);
453
438 DPRINTFN(1, "\n");
439
440 switch (USB_GET_STATE(xfer)) {
441 case USB_ST_TRANSFERRED:
454 DPRINTFN(1, "\n");
455
456 switch (USB_GET_STATE(xfer)) {
457 case USB_ST_TRANSFERRED:
442 DPRINTFN(11, "transfer complete: "
443 "%u bytes in %u frames\n", xfer->actlen,
444 xfer->aframes);
458 DPRINTFN(11, "transfer complete: %u bytes in %u frames\n",
459 actlen, aframes);
445
446 ifp->if_opackets++;
447
448 /* free all previous TX buffers */
449 cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
450
451 /* FALLTHROUGH */
452 case USB_ST_SETUP:

--- 28 unchanged lines hidden (view full) ---

481 continue;
482 }
483 m = mt;
484 }
485 if (m->m_pkthdr.len > MCLBYTES) {
486 m->m_pkthdr.len = MCLBYTES;
487 }
488 sc->sc_tx_buf[x] = m;
460
461 ifp->if_opackets++;
462
463 /* free all previous TX buffers */
464 cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
465
466 /* FALLTHROUGH */
467 case USB_ST_SETUP:

--- 28 unchanged lines hidden (view full) ---

496 continue;
497 }
498 m = mt;
499 }
500 if (m->m_pkthdr.len > MCLBYTES) {
501 m->m_pkthdr.len = MCLBYTES;
502 }
503 sc->sc_tx_buf[x] = m;
489 xfer->frlengths[x] = m->m_len;
490 usbd_set_frame_data(xfer, m->m_data, x);
504 usbd_xfer_set_frame_data(xfer, x, m->m_data, m->m_len);
491
492 /*
493 * If there's a BPF listener, bounce a copy of
494 * this frame to him:
495 */
496 BPF_MTAP(ifp, m);
497 }
498 if (x != 0) {
505
506 /*
507 * If there's a BPF listener, bounce a copy of
508 * this frame to him:
509 */
510 BPF_MTAP(ifp, m);
511 }
512 if (x != 0) {
499 xfer->nframes = x;
513 usbd_xfer_set_frames(xfer, x);
514
500 usbd_transfer_submit(xfer);
501 }
502 break;
503
504 default: /* Error */
505 DPRINTFN(11, "transfer error, %s\n",
515 usbd_transfer_submit(xfer);
516 }
517 break;
518
519 default: /* Error */
520 DPRINTFN(11, "transfer error, %s\n",
506 usbd_errstr(xfer->error));
521 usbd_errstr(error));
507
508 /* free all previous TX buffers */
509 cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
510
511 /* count output errors */
512 ifp->if_oerrors++;
513
522
523 /* free all previous TX buffers */
524 cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
525
526 /* count output errors */
527 ifp->if_oerrors++;
528
514 if (xfer->error != USB_ERR_CANCELLED) {
529 if (error != USB_ERR_CANCELLED) {
515 /* try to clear stall first */
530 /* try to clear stall first */
516 xfer->flags.stall_pipe = 1;
531 usbd_xfer_set_stall(xfer);
517 goto tr_setup;
518 }
519 break;
520 }
521}
522
523static int32_t
524cdce_m_crc32_cb(void *arg, void *src, uint32_t count)

--- 24 unchanged lines hidden (view full) ---

549
550 ifp->if_drv_flags |= IFF_DRV_RUNNING;
551
552 /* start interrupt transfer */
553 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_RX]);
554 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
555
556 /* stall data write direction, which depends on USB mode */
532 goto tr_setup;
533 }
534 break;
535 }
536}
537
538static int32_t
539cdce_m_crc32_cb(void *arg, void *src, uint32_t count)

--- 24 unchanged lines hidden (view full) ---

564
565 ifp->if_drv_flags |= IFF_DRV_RUNNING;
566
567 /* start interrupt transfer */
568 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_RX]);
569 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
570
571 /* stall data write direction, which depends on USB mode */
557 usbd_transfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
572 usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
558
559 /* start data transfers */
560 cdce_start(ue);
561}
562
563static void
564cdce_stop(struct usb_ether *ue)
565{

--- 37 unchanged lines hidden (view full) ---

603static int
604cdce_resume(device_t dev)
605{
606 device_printf(dev, "Resuming\n");
607 return (0);
608}
609
610static void
573
574 /* start data transfers */
575 cdce_start(ue);
576}
577
578static void
579cdce_stop(struct usb_ether *ue)
580{

--- 37 unchanged lines hidden (view full) ---

618static int
619cdce_resume(device_t dev)
620{
621 device_printf(dev, "Resuming\n");
622 return (0);
623}
624
625static void
611cdce_bulk_read_callback(struct usb_xfer *xfer)
626cdce_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
612{
627{
613 struct cdce_softc *sc = xfer->priv_sc;
628 struct cdce_softc *sc = usbd_xfer_softc(xfer);
614 struct mbuf *m;
615 uint8_t x;
629 struct mbuf *m;
630 uint8_t x;
631 int actlen, aframes, len;
616
632
633 usbd_xfer_status(xfer, &actlen, NULL, &aframes, NULL);
634
617 switch (USB_GET_STATE(xfer)) {
618 case USB_ST_TRANSFERRED:
619
635 switch (USB_GET_STATE(xfer)) {
636 case USB_ST_TRANSFERRED:
637
620 DPRINTF("received %u bytes in %u frames\n",
621 xfer->actlen, xfer->aframes);
638 DPRINTF("received %u bytes in %u frames\n", actlen, aframes);
622
639
623 for (x = 0; x != xfer->aframes; x++) {
640 for (x = 0; x != aframes; x++) {
624
625 m = sc->sc_rx_buf[x];
626 sc->sc_rx_buf[x] = NULL;
641
642 m = sc->sc_rx_buf[x];
643 sc->sc_rx_buf[x] = NULL;
644 len = usbd_xfer_get_frame_len(xfer, x);
627
628 /* Strip off CRC added by Zaurus, if any */
645
646 /* Strip off CRC added by Zaurus, if any */
629 if ((sc->sc_flags & CDCE_FLAG_ZAURUS) &&
630 (xfer->frlengths[x] >= 14))
631 xfer->frlengths[x] -= 4;
647 if ((sc->sc_flags & CDCE_FLAG_ZAURUS) && len >= 14)
648 len -= 4;
632
649
633 if (xfer->frlengths[x] < sizeof(struct ether_header)) {
650 if (len < sizeof(struct ether_header)) {
634 m_freem(m);
635 continue;
636 }
637 /* queue up mbuf */
651 m_freem(m);
652 continue;
653 }
654 /* queue up mbuf */
638 uether_rxmbuf(&sc->sc_ue, m, xfer->frlengths[x]);
655 uether_rxmbuf(&sc->sc_ue, m, len);
639 }
640
641 /* FALLTHROUGH */
642 case USB_ST_SETUP:
643 /*
644 * TODO: Implement support for multi frame transfers,
645 * when the USB hardware supports it.
646 */
647 for (x = 0; x != 1; x++) {
648 if (sc->sc_rx_buf[x] == NULL) {
649 m = uether_newbuf();
650 if (m == NULL)
651 goto tr_stall;
652 sc->sc_rx_buf[x] = m;
653 } else {
654 m = sc->sc_rx_buf[x];
655 }
656
656 }
657
658 /* FALLTHROUGH */
659 case USB_ST_SETUP:
660 /*
661 * TODO: Implement support for multi frame transfers,
662 * when the USB hardware supports it.
663 */
664 for (x = 0; x != 1; x++) {
665 if (sc->sc_rx_buf[x] == NULL) {
666 m = uether_newbuf();
667 if (m == NULL)
668 goto tr_stall;
669 sc->sc_rx_buf[x] = m;
670 } else {
671 m = sc->sc_rx_buf[x];
672 }
673
657 usbd_set_frame_data(xfer, m->m_data, x);
658 xfer->frlengths[x] = m->m_len;
674 usbd_xfer_set_frame_data(xfer, x, m->m_data, m->m_len);
659 }
660 /* set number of frames and start hardware */
675 }
676 /* set number of frames and start hardware */
661 xfer->nframes = x;
677 usbd_xfer_set_frames(xfer, x);
662 usbd_transfer_submit(xfer);
663 /* flush any received frames */
664 uether_rxflush(&sc->sc_ue);
665 break;
666
667 default: /* Error */
668 DPRINTF("error = %s\n",
678 usbd_transfer_submit(xfer);
679 /* flush any received frames */
680 uether_rxflush(&sc->sc_ue);
681 break;
682
683 default: /* Error */
684 DPRINTF("error = %s\n",
669 usbd_errstr(xfer->error));
685 usbd_errstr(error));
670
686
671 if (xfer->error != USB_ERR_CANCELLED) {
687 if (error != USB_ERR_CANCELLED) {
672tr_stall:
673 /* try to clear stall first */
688tr_stall:
689 /* try to clear stall first */
674 xfer->flags.stall_pipe = 1;
675 xfer->nframes = 0;
690 usbd_xfer_set_stall(xfer);
691 usbd_xfer_set_frames(xfer, 0);
676 usbd_transfer_submit(xfer);
677 break;
678 }
679
680 /* need to free the RX-mbufs when we are cancelled */
681 cdce_free_queue(sc->sc_rx_buf, CDCE_FRAMES_MAX);
682 break;
683 }
684}
685
686static void
692 usbd_transfer_submit(xfer);
693 break;
694 }
695
696 /* need to free the RX-mbufs when we are cancelled */
697 cdce_free_queue(sc->sc_rx_buf, CDCE_FRAMES_MAX);
698 break;
699 }
700}
701
702static void
687cdce_intr_read_callback(struct usb_xfer *xfer)
703cdce_intr_read_callback(struct usb_xfer *xfer, usb_error_t error)
688{
704{
689 ; /* style fix */
705 int actlen;
706
707 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
708
690 switch (USB_GET_STATE(xfer)) {
691 case USB_ST_TRANSFERRED:
692
709 switch (USB_GET_STATE(xfer)) {
710 case USB_ST_TRANSFERRED:
711
693 DPRINTF("Received %d bytes\n",
694 xfer->actlen);
712 DPRINTF("Received %d bytes\n", actlen);
695
696 /* TODO: decode some indications */
697
698 /* FALLTHROUGH */
699 case USB_ST_SETUP:
700tr_setup:
713
714 /* TODO: decode some indications */
715
716 /* FALLTHROUGH */
717 case USB_ST_SETUP:
718tr_setup:
701 xfer->frlengths[0] = xfer->max_data_length;
719 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
702 usbd_transfer_submit(xfer);
703 break;
704
705 default: /* Error */
720 usbd_transfer_submit(xfer);
721 break;
722
723 default: /* Error */
706 if (xfer->error != USB_ERR_CANCELLED) {
724 if (error != USB_ERR_CANCELLED) {
707 /* start clear stall */
725 /* start clear stall */
708 xfer->flags.stall_pipe = 1;
726 usbd_xfer_set_stall(xfer);
709 goto tr_setup;
710 }
711 break;
712 }
713}
714
715static void
727 goto tr_setup;
728 }
729 break;
730 }
731}
732
733static void
716cdce_intr_write_callback(struct usb_xfer *xfer)
734cdce_intr_write_callback(struct usb_xfer *xfer, usb_error_t error)
717{
735{
718 ; /* style fix */
736 int actlen;
737
738 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
739
719 switch (USB_GET_STATE(xfer)) {
720 case USB_ST_TRANSFERRED:
721
740 switch (USB_GET_STATE(xfer)) {
741 case USB_ST_TRANSFERRED:
742
722 DPRINTF("Transferred %d bytes\n", xfer->actlen);
743 DPRINTF("Transferred %d bytes\n", actlen);
723
724 /* FALLTHROUGH */
725 case USB_ST_SETUP:
726tr_setup:
727#if 0
744
745 /* FALLTHROUGH */
746 case USB_ST_SETUP:
747tr_setup:
748#if 0
728 xfer->frlengths[0] = XXX;
749 usbd_xfer_set_frame_len(xfer, 0, XXX);
729 usbd_transfer_submit(xfer);
730#endif
731 break;
732
733 default: /* Error */
750 usbd_transfer_submit(xfer);
751#endif
752 break;
753
754 default: /* Error */
734 if (xfer->error != USB_ERR_CANCELLED) {
755 if (error != USB_ERR_CANCELLED) {
735 /* start clear stall */
756 /* start clear stall */
736 xfer->flags.stall_pipe = 1;
757 usbd_xfer_set_stall(xfer);
737 goto tr_setup;
738 }
739 break;
740 }
741}
742
743static int
744cdce_handle_request(device_t dev,
745 const void *req, void **pptr, uint16_t *plen,
746 uint16_t offset, uint8_t is_complete)
747{
748 return (ENXIO); /* use builtin handler */
749}
758 goto tr_setup;
759 }
760 break;
761 }
762}
763
764static int
765cdce_handle_request(device_t dev,
766 const void *req, void **pptr, uint16_t *plen,
767 uint16_t offset, uint8_t is_complete)
768{
769 return (ENXIO); /* use builtin handler */
770}