Deleted Added
full compact
if_cdce.c (276701) if_cdce.c (277298)
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.

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

41 */
42
43/*
44 * USB Network Control Model (NCM)
45 * http://www.usb.org/developers/devclass_docs/NCM10.zip
46 */
47
48#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.

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

41 */
42
43/*
44 * USB Network Control Model (NCM)
45 * http://www.usb.org/developers/devclass_docs/NCM10.zip
46 */
47
48#include <sys/cdefs.h>
49__FBSDID("$FreeBSD: head/sys/dev/usb/net/if_cdce.c 276701 2015-01-05 15:04:17Z hselasky $");
49__FBSDID("$FreeBSD: head/sys/dev/usb/net/if_cdce.c 277298 2015-01-17 12:31:26Z br $");
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>

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

893 CDCE_LOCK_ASSERT(sc, MA_OWNED);
894
895 ifp->if_drv_flags |= IFF_DRV_RUNNING;
896
897 /* start interrupt transfer */
898 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_RX]);
899 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
900
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>

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

893 CDCE_LOCK_ASSERT(sc, MA_OWNED);
894
895 ifp->if_drv_flags |= IFF_DRV_RUNNING;
896
897 /* start interrupt transfer */
898 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_RX]);
899 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
900
901 /* stall data write direction, which depends on USB mode */
902 usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
901 /*
902 * Stall data write direction, which depends on USB mode.
903 *
904 * Some USB host stacks (e.g. Mac OS X) don't clears stall
905 * bit as it should, so set it in our host mode only.
906 */
907 if (usbd_get_mode(sc->sc_ue.ue_udev) == USB_MODE_HOST)
908 usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
903
904 /* start data transfers */
905 cdce_start(ue);
906}
907
908static void
909cdce_stop(struct usb_ether *ue)
910{

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

1060 }
1061 break;
1062 }
1063}
1064
1065static void
1066cdce_intr_write_callback(struct usb_xfer *xfer, usb_error_t error)
1067{
909
910 /* start data transfers */
911 cdce_start(ue);
912}
913
914static void
915cdce_stop(struct usb_ether *ue)
916{

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

1066 }
1067 break;
1068 }
1069}
1070
1071static void
1072cdce_intr_write_callback(struct usb_xfer *xfer, usb_error_t error)
1073{
1074 struct cdce_softc *sc = usbd_xfer_softc(xfer);
1075 struct usb_cdc_notification req;
1076 struct usb_page_cache *pc;
1077 uint32_t speed;
1068 int actlen;
1069
1070 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
1071
1072 switch (USB_GET_STATE(xfer)) {
1073 case USB_ST_TRANSFERRED:
1074
1075 DPRINTF("Transferred %d bytes\n", actlen);
1076
1077 /* FALLTHROUGH */
1078 case USB_ST_SETUP:
1079tr_setup:
1078 int actlen;
1079
1080 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
1081
1082 switch (USB_GET_STATE(xfer)) {
1083 case USB_ST_TRANSFERRED:
1084
1085 DPRINTF("Transferred %d bytes\n", actlen);
1086
1087 /* FALLTHROUGH */
1088 case USB_ST_SETUP:
1089tr_setup:
1080#if 0
1081 usbd_xfer_set_frame_len(xfer, 0, XXX);
1082 usbd_transfer_submit(xfer);
1083#endif
1090 /*
1091 * Inform host about connection. Required according to USB CDC
1092 * specification and communicating to Mac OS X USB host stack.
1093 * Some of the values seems ignored by Mac OS X though.
1094 */
1095 if (sc->sc_notify_state == CDCE_NOTIFY_NETWORK_CONNECTION) {
1096 req.bmRequestType = UCDC_NOTIFICATION;
1097 req.bNotification = UCDC_N_NETWORK_CONNECTION;
1098 req.wIndex[0] = sc->sc_ifaces_index[1];
1099 req.wIndex[1] = 0;
1100 USETW(req.wValue, 1); /* Connected */
1101 USETW(req.wLength, 0);
1102
1103 pc = usbd_xfer_get_frame(xfer, 0);
1104 usbd_copy_in(pc, 0, &req, sizeof(req));
1105 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
1106 usbd_xfer_set_frames(xfer, 1);
1107 usbd_transfer_submit(xfer);
1108 sc->sc_notify_state = CDCE_NOTIFY_SPEED_CHANGE;
1109
1110 } else if (sc->sc_notify_state == CDCE_NOTIFY_SPEED_CHANGE) {
1111 req.bmRequestType = UCDC_NOTIFICATION;
1112 req.bNotification = UCDC_N_CONNECTION_SPEED_CHANGE;
1113 req.wIndex[0] = sc->sc_ifaces_index[1];
1114 req.wIndex[1] = 0;
1115 USETW(req.wValue, 0);
1116 USETW(req.wLength, 8);
1117
1118 /* Peak theoretical bulk trasfer rate in bits/s */
1119 if (usbd_get_speed(sc->sc_ue.ue_udev) == USB_SPEED_HIGH)
1120 speed = (13 * 512 * 8 * 1000 * 8);
1121 else
1122 speed = (19 * 64 * 1 * 1000 * 8);
1123
1124 USETDW(req.data + 0, speed); /* Upstream bit rate */
1125 USETDW(req.data + 4, speed); /* Downstream bit rate */
1126
1127 pc = usbd_xfer_get_frame(xfer, 0);
1128 usbd_copy_in(pc, 0, &req, sizeof(req));
1129 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
1130 usbd_xfer_set_frames(xfer, 1);
1131 usbd_transfer_submit(xfer);
1132 sc->sc_notify_state = CDCE_NOTIFY_DONE;
1133 }
1084 break;
1085
1086 default: /* Error */
1087 if (error != USB_ERR_CANCELLED) {
1088 /* start clear stall */
1089 usbd_xfer_set_stall(xfer);
1090 goto tr_setup;
1091 }

--- 394 unchanged lines hidden ---
1134 break;
1135
1136 default: /* Error */
1137 if (error != USB_ERR_CANCELLED) {
1138 /* start clear stall */
1139 usbd_xfer_set_stall(xfer);
1140 goto tr_setup;
1141 }

--- 394 unchanged lines hidden ---