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 --- |