1 // SPDX-License-Identifier: GPL-2.0 << 2 /* 1 /* 3 * USB CDC common helpers !! 2 * USB Communications Device Class (CDC) definitions 4 * 3 * 5 * Copyright (c) 2015 Oliver Neukum <oneukum@s !! 4 * CDC says how to talk to lots of different types of network adapters, >> 5 * notably ethernet adapters and various modems. It's used mostly with >> 6 * firmware based USB peripherals. 6 */ 7 */ >> 8 7 #ifndef __LINUX_USB_CDC_H 9 #ifndef __LINUX_USB_CDC_H 8 #define __LINUX_USB_CDC_H 10 #define __LINUX_USB_CDC_H 9 11 10 #include <uapi/linux/usb/cdc.h> !! 12 #include <linux/types.h> >> 13 >> 14 #define USB_CDC_SUBCLASS_ACM 0x02 >> 15 #define USB_CDC_SUBCLASS_ETHERNET 0x06 >> 16 #define USB_CDC_SUBCLASS_WHCM 0x08 >> 17 #define USB_CDC_SUBCLASS_DMM 0x09 >> 18 #define USB_CDC_SUBCLASS_MDLM 0x0a >> 19 #define USB_CDC_SUBCLASS_OBEX 0x0b >> 20 #define USB_CDC_SUBCLASS_EEM 0x0c >> 21 >> 22 #define USB_CDC_PROTO_NONE 0 >> 23 >> 24 #define USB_CDC_ACM_PROTO_AT_V25TER 1 >> 25 #define USB_CDC_ACM_PROTO_AT_PCCA101 2 >> 26 #define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3 >> 27 #define USB_CDC_ACM_PROTO_AT_GSM 4 >> 28 #define USB_CDC_ACM_PROTO_AT_3G 5 >> 29 #define USB_CDC_ACM_PROTO_AT_CDMA 6 >> 30 #define USB_CDC_ACM_PROTO_VENDOR 0xff >> 31 >> 32 #define USB_CDC_PROTO_EEM 7 >> 33 >> 34 /*-------------------------------------------------------------------------*/ 11 35 12 /* 36 /* 13 * inofficial magic numbers !! 37 * Class-Specific descriptors ... there are a couple dozen of them 14 */ 38 */ 15 39 16 #define CDC_PHONET_MAGIC_NUMBER 0xAB !! 40 #define USB_CDC_HEADER_TYPE 0x00 /* header_desc */ >> 41 #define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */ >> 42 #define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */ >> 43 #define USB_CDC_UNION_TYPE 0x06 /* union_desc */ >> 44 #define USB_CDC_COUNTRY_TYPE 0x07 >> 45 #define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */ >> 46 #define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */ >> 47 #define USB_CDC_WHCM_TYPE 0x11 >> 48 #define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */ >> 49 #define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */ >> 50 #define USB_CDC_DMM_TYPE 0x14 >> 51 #define USB_CDC_OBEX_TYPE 0x15 >> 52 >> 53 /* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ >> 54 struct usb_cdc_header_desc { >> 55 __u8 bLength; >> 56 __u8 bDescriptorType; >> 57 __u8 bDescriptorSubType; >> 58 >> 59 __le16 bcdCDC; >> 60 } __attribute__ ((packed)); >> 61 >> 62 /* "Call Management Descriptor" from CDC spec 5.2.3.2 */ >> 63 struct usb_cdc_call_mgmt_descriptor { >> 64 __u8 bLength; >> 65 __u8 bDescriptorType; >> 66 __u8 bDescriptorSubType; >> 67 >> 68 __u8 bmCapabilities; >> 69 #define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01 >> 70 #define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02 >> 71 >> 72 __u8 bDataInterface; >> 73 } __attribute__ ((packed)); >> 74 >> 75 /* "Abstract Control Management Descriptor" from CDC spec 5.2.3.3 */ >> 76 struct usb_cdc_acm_descriptor { >> 77 __u8 bLength; >> 78 __u8 bDescriptorType; >> 79 __u8 bDescriptorSubType; >> 80 >> 81 __u8 bmCapabilities; >> 82 } __attribute__ ((packed)); >> 83 >> 84 /* capabilities from 5.2.3.3 */ >> 85 >> 86 #define USB_CDC_COMM_FEATURE 0x01 >> 87 #define USB_CDC_CAP_LINE 0x02 >> 88 #define USB_CDC_CAP_BRK 0x04 >> 89 #define USB_CDC_CAP_NOTIFY 0x08 >> 90 >> 91 /* "Union Functional Descriptor" from CDC spec 5.2.3.8 */ >> 92 struct usb_cdc_union_desc { >> 93 __u8 bLength; >> 94 __u8 bDescriptorType; >> 95 __u8 bDescriptorSubType; >> 96 >> 97 __u8 bMasterInterface0; >> 98 __u8 bSlaveInterface0; >> 99 /* ... and there could be other slave interfaces */ >> 100 } __attribute__ ((packed)); >> 101 >> 102 /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */ >> 103 struct usb_cdc_country_functional_desc { >> 104 __u8 bLength; >> 105 __u8 bDescriptorType; >> 106 __u8 bDescriptorSubType; >> 107 >> 108 __u8 iCountryCodeRelDate; >> 109 __le16 wCountyCode0; >> 110 /* ... and there can be a lot of country codes */ >> 111 } __attribute__ ((packed)); >> 112 >> 113 /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */ >> 114 struct usb_cdc_network_terminal_desc { >> 115 __u8 bLength; >> 116 __u8 bDescriptorType; >> 117 __u8 bDescriptorSubType; >> 118 >> 119 __u8 bEntityId; >> 120 __u8 iName; >> 121 __u8 bChannelIndex; >> 122 __u8 bPhysicalInterface; >> 123 } __attribute__ ((packed)); >> 124 >> 125 /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ >> 126 struct usb_cdc_ether_desc { >> 127 __u8 bLength; >> 128 __u8 bDescriptorType; >> 129 __u8 bDescriptorSubType; >> 130 >> 131 __u8 iMACAddress; >> 132 __le32 bmEthernetStatistics; >> 133 __le16 wMaxSegmentSize; >> 134 __le16 wNumberMCFilters; >> 135 __u8 bNumberPowerFilters; >> 136 } __attribute__ ((packed)); >> 137 >> 138 /* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */ >> 139 struct usb_cdc_dmm_desc { >> 140 __u8 bFunctionLength; >> 141 __u8 bDescriptorType; >> 142 __u8 bDescriptorSubtype; >> 143 __u16 bcdVersion; >> 144 __le16 wMaxCommand; >> 145 } __attribute__ ((packed)); >> 146 >> 147 /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */ >> 148 struct usb_cdc_mdlm_desc { >> 149 __u8 bLength; >> 150 __u8 bDescriptorType; >> 151 __u8 bDescriptorSubType; >> 152 >> 153 __le16 bcdVersion; >> 154 __u8 bGUID[16]; >> 155 } __attribute__ ((packed)); >> 156 >> 157 /* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */ >> 158 struct usb_cdc_mdlm_detail_desc { >> 159 __u8 bLength; >> 160 __u8 bDescriptorType; >> 161 __u8 bDescriptorSubType; >> 162 >> 163 /* type is associated with mdlm_desc.bGUID */ >> 164 __u8 bGuidDescriptorType; >> 165 __u8 bDetailData[0]; >> 166 } __attribute__ ((packed)); >> 167 >> 168 /* "OBEX Control Model Functional Descriptor" */ >> 169 struct usb_cdc_obex_desc { >> 170 __u8 bLength; >> 171 __u8 bDescriptorType; >> 172 __u8 bDescriptorSubType; >> 173 >> 174 __le16 bcdVersion; >> 175 } __attribute__ ((packed)); >> 176 >> 177 /*-------------------------------------------------------------------------*/ 17 178 18 /* 179 /* 19 * parsing CDC headers !! 180 * Class-Specific Control Requests (6.2) >> 181 * >> 182 * section 3.6.2.1 table 4 has the ACM profile, for modems. >> 183 * section 3.8.2 table 10 has the ethernet profile. >> 184 * >> 185 * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant, >> 186 * heavily dependent on the encapsulated (proprietary) command mechanism. >> 187 */ >> 188 >> 189 #define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00 >> 190 #define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01 >> 191 #define USB_CDC_REQ_SET_LINE_CODING 0x20 >> 192 #define USB_CDC_REQ_GET_LINE_CODING 0x21 >> 193 #define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22 >> 194 #define USB_CDC_REQ_SEND_BREAK 0x23 >> 195 #define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 >> 196 #define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41 >> 197 #define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42 >> 198 #define USB_CDC_SET_ETHERNET_PACKET_FILTER 0x43 >> 199 #define USB_CDC_GET_ETHERNET_STATISTIC 0x44 >> 200 >> 201 /* Line Coding Structure from CDC spec 6.2.13 */ >> 202 struct usb_cdc_line_coding { >> 203 __le32 dwDTERate; >> 204 __u8 bCharFormat; >> 205 #define USB_CDC_1_STOP_BITS 0 >> 206 #define USB_CDC_1_5_STOP_BITS 1 >> 207 #define USB_CDC_2_STOP_BITS 2 >> 208 >> 209 __u8 bParityType; >> 210 #define USB_CDC_NO_PARITY 0 >> 211 #define USB_CDC_ODD_PARITY 1 >> 212 #define USB_CDC_EVEN_PARITY 2 >> 213 #define USB_CDC_MARK_PARITY 3 >> 214 #define USB_CDC_SPACE_PARITY 4 >> 215 >> 216 __u8 bDataBits; >> 217 } __attribute__ ((packed)); >> 218 >> 219 /* table 62; bits in multicast filter */ >> 220 #define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0) >> 221 #define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */ >> 222 #define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2) >> 223 #define USB_CDC_PACKET_TYPE_BROADCAST (1 << 3) >> 224 #define USB_CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */ >> 225 >> 226 >> 227 /*-------------------------------------------------------------------------*/ >> 228 >> 229 /* >> 230 * Class-Specific Notifications (6.3) sent by interrupt transfers >> 231 * >> 232 * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications >> 233 * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS >> 234 * RNDIS also defines its own bit-incompatible notifications 20 */ 235 */ 21 236 22 struct usb_cdc_parsed_header { !! 237 #define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00 23 struct usb_cdc_union_desc *usb_cdc_uni !! 238 #define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01 24 struct usb_cdc_header_desc *usb_cdc_he !! 239 #define USB_CDC_NOTIFY_SERIAL_STATE 0x20 25 !! 240 #define USB_CDC_NOTIFY_SPEED_CHANGE 0x2a 26 struct usb_cdc_call_mgmt_descriptor *u !! 241 27 struct usb_cdc_acm_descriptor *usb_cdc !! 242 struct usb_cdc_notification { 28 struct usb_cdc_country_functional_desc !! 243 __u8 bmRequestType; 29 struct usb_cdc_network_terminal_desc * !! 244 __u8 bNotificationType; 30 struct usb_cdc_ether_desc *usb_cdc_eth !! 245 __le16 wValue; 31 struct usb_cdc_dmm_desc *usb_cdc_dmm_d !! 246 __le16 wIndex; 32 struct usb_cdc_mdlm_desc *usb_cdc_mdlm !! 247 __le16 wLength; 33 struct usb_cdc_mdlm_detail_desc *usb_c !! 248 } __attribute__ ((packed)); 34 struct usb_cdc_obex_desc *usb_cdc_obex << 35 struct usb_cdc_ncm_desc *usb_cdc_ncm_d << 36 struct usb_cdc_mbim_desc *usb_cdc_mbim << 37 struct usb_cdc_mbim_extended_desc *usb << 38 << 39 bool phonet_magic_present; << 40 }; << 41 << 42 struct usb_interface; << 43 int cdc_parse_cdc_header(struct usb_cdc_parsed << 44 struct usb_int << 45 u8 *buffer, << 46 int buflen); << 47 249 48 #endif /* __LINUX_USB_CDC_H */ 250 #endif /* __LINUX_USB_CDC_H */ 49 251
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.