root/include/uapi/linux/usb/cdc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
   2 /*
   3  * USB Communications Device Class (CDC) definitions
   4  *
   5  * CDC says how to talk to lots of different types of network adapters,
   6  * notably ethernet adapters and various modems.  It's used mostly with
   7  * firmware based USB peripherals.
   8  */
   9 
  10 #ifndef __UAPI_LINUX_USB_CDC_H
  11 #define __UAPI_LINUX_USB_CDC_H
  12 
  13 #include <linux/types.h>
  14 
  15 #define USB_CDC_SUBCLASS_ACM                    0x02
  16 #define USB_CDC_SUBCLASS_ETHERNET               0x06
  17 #define USB_CDC_SUBCLASS_WHCM                   0x08
  18 #define USB_CDC_SUBCLASS_DMM                    0x09
  19 #define USB_CDC_SUBCLASS_MDLM                   0x0a
  20 #define USB_CDC_SUBCLASS_OBEX                   0x0b
  21 #define USB_CDC_SUBCLASS_EEM                    0x0c
  22 #define USB_CDC_SUBCLASS_NCM                    0x0d
  23 #define USB_CDC_SUBCLASS_MBIM                   0x0e
  24 
  25 #define USB_CDC_PROTO_NONE                      0
  26 
  27 #define USB_CDC_ACM_PROTO_AT_V25TER             1
  28 #define USB_CDC_ACM_PROTO_AT_PCCA101            2
  29 #define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE       3
  30 #define USB_CDC_ACM_PROTO_AT_GSM                4
  31 #define USB_CDC_ACM_PROTO_AT_3G                 5
  32 #define USB_CDC_ACM_PROTO_AT_CDMA               6
  33 #define USB_CDC_ACM_PROTO_VENDOR                0xff
  34 
  35 #define USB_CDC_PROTO_EEM                       7
  36 
  37 #define USB_CDC_NCM_PROTO_NTB                   1
  38 #define USB_CDC_MBIM_PROTO_NTB                  2
  39 
  40 /*-------------------------------------------------------------------------*/
  41 
  42 /*
  43  * Class-Specific descriptors ... there are a couple dozen of them
  44  */
  45 
  46 #define USB_CDC_HEADER_TYPE             0x00    /* header_desc */
  47 #define USB_CDC_CALL_MANAGEMENT_TYPE    0x01    /* call_mgmt_descriptor */
  48 #define USB_CDC_ACM_TYPE                0x02    /* acm_descriptor */
  49 #define USB_CDC_UNION_TYPE              0x06    /* union_desc */
  50 #define USB_CDC_COUNTRY_TYPE            0x07
  51 #define USB_CDC_NETWORK_TERMINAL_TYPE   0x0a    /* network_terminal_desc */
  52 #define USB_CDC_ETHERNET_TYPE           0x0f    /* ether_desc */
  53 #define USB_CDC_WHCM_TYPE               0x11
  54 #define USB_CDC_MDLM_TYPE               0x12    /* mdlm_desc */
  55 #define USB_CDC_MDLM_DETAIL_TYPE        0x13    /* mdlm_detail_desc */
  56 #define USB_CDC_DMM_TYPE                0x14
  57 #define USB_CDC_OBEX_TYPE               0x15
  58 #define USB_CDC_NCM_TYPE                0x1a
  59 #define USB_CDC_MBIM_TYPE               0x1b
  60 #define USB_CDC_MBIM_EXTENDED_TYPE      0x1c
  61 
  62 /* "Header Functional Descriptor" from CDC spec  5.2.3.1 */
  63 struct usb_cdc_header_desc {
  64         __u8    bLength;
  65         __u8    bDescriptorType;
  66         __u8    bDescriptorSubType;
  67 
  68         __le16  bcdCDC;
  69 } __attribute__ ((packed));
  70 
  71 /* "Call Management Descriptor" from CDC spec  5.2.3.2 */
  72 struct usb_cdc_call_mgmt_descriptor {
  73         __u8    bLength;
  74         __u8    bDescriptorType;
  75         __u8    bDescriptorSubType;
  76 
  77         __u8    bmCapabilities;
  78 #define USB_CDC_CALL_MGMT_CAP_CALL_MGMT         0x01
  79 #define USB_CDC_CALL_MGMT_CAP_DATA_INTF         0x02
  80 
  81         __u8    bDataInterface;
  82 } __attribute__ ((packed));
  83 
  84 /* "Abstract Control Management Descriptor" from CDC spec  5.2.3.3 */
  85 struct usb_cdc_acm_descriptor {
  86         __u8    bLength;
  87         __u8    bDescriptorType;
  88         __u8    bDescriptorSubType;
  89 
  90         __u8    bmCapabilities;
  91 } __attribute__ ((packed));
  92 
  93 /* capabilities from 5.2.3.3 */
  94 
  95 #define USB_CDC_COMM_FEATURE    0x01
  96 #define USB_CDC_CAP_LINE        0x02
  97 #define USB_CDC_CAP_BRK         0x04
  98 #define USB_CDC_CAP_NOTIFY      0x08
  99 
 100 /* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
 101 struct usb_cdc_union_desc {
 102         __u8    bLength;
 103         __u8    bDescriptorType;
 104         __u8    bDescriptorSubType;
 105 
 106         __u8    bMasterInterface0;
 107         __u8    bSlaveInterface0;
 108         /* ... and there could be other slave interfaces */
 109 } __attribute__ ((packed));
 110 
 111 /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */
 112 struct usb_cdc_country_functional_desc {
 113         __u8    bLength;
 114         __u8    bDescriptorType;
 115         __u8    bDescriptorSubType;
 116 
 117         __u8    iCountryCodeRelDate;
 118         __le16  wCountyCode0;
 119         /* ... and there can be a lot of country codes */
 120 } __attribute__ ((packed));
 121 
 122 /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */
 123 struct usb_cdc_network_terminal_desc {
 124         __u8    bLength;
 125         __u8    bDescriptorType;
 126         __u8    bDescriptorSubType;
 127 
 128         __u8    bEntityId;
 129         __u8    iName;
 130         __u8    bChannelIndex;
 131         __u8    bPhysicalInterface;
 132 } __attribute__ ((packed));
 133 
 134 /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
 135 struct usb_cdc_ether_desc {
 136         __u8    bLength;
 137         __u8    bDescriptorType;
 138         __u8    bDescriptorSubType;
 139 
 140         __u8    iMACAddress;
 141         __le32  bmEthernetStatistics;
 142         __le16  wMaxSegmentSize;
 143         __le16  wNumberMCFilters;
 144         __u8    bNumberPowerFilters;
 145 } __attribute__ ((packed));
 146 
 147 /* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */
 148 struct usb_cdc_dmm_desc {
 149         __u8    bFunctionLength;
 150         __u8    bDescriptorType;
 151         __u8    bDescriptorSubtype;
 152         __u16   bcdVersion;
 153         __le16  wMaxCommand;
 154 } __attribute__ ((packed));
 155 
 156 /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */
 157 struct usb_cdc_mdlm_desc {
 158         __u8    bLength;
 159         __u8    bDescriptorType;
 160         __u8    bDescriptorSubType;
 161 
 162         __le16  bcdVersion;
 163         __u8    bGUID[16];
 164 } __attribute__ ((packed));
 165 
 166 /* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */
 167 struct usb_cdc_mdlm_detail_desc {
 168         __u8    bLength;
 169         __u8    bDescriptorType;
 170         __u8    bDescriptorSubType;
 171 
 172         /* type is associated with mdlm_desc.bGUID */
 173         __u8    bGuidDescriptorType;
 174         __u8    bDetailData[0];
 175 } __attribute__ ((packed));
 176 
 177 /* "OBEX Control Model Functional Descriptor" */
 178 struct usb_cdc_obex_desc {
 179         __u8    bLength;
 180         __u8    bDescriptorType;
 181         __u8    bDescriptorSubType;
 182 
 183         __le16  bcdVersion;
 184 } __attribute__ ((packed));
 185 
 186 /* "NCM Control Model Functional Descriptor" */
 187 struct usb_cdc_ncm_desc {
 188         __u8    bLength;
 189         __u8    bDescriptorType;
 190         __u8    bDescriptorSubType;
 191 
 192         __le16  bcdNcmVersion;
 193         __u8    bmNetworkCapabilities;
 194 } __attribute__ ((packed));
 195 
 196 /* "MBIM Control Model Functional Descriptor" */
 197 struct usb_cdc_mbim_desc {
 198         __u8    bLength;
 199         __u8    bDescriptorType;
 200         __u8    bDescriptorSubType;
 201 
 202         __le16  bcdMBIMVersion;
 203         __le16  wMaxControlMessage;
 204         __u8    bNumberFilters;
 205         __u8    bMaxFilterSize;
 206         __le16  wMaxSegmentSize;
 207         __u8    bmNetworkCapabilities;
 208 } __attribute__ ((packed));
 209 
 210 /* "MBIM Extended Functional Descriptor" from CDC MBIM spec 1.0 errata-1 */
 211 struct usb_cdc_mbim_extended_desc {
 212         __u8    bLength;
 213         __u8    bDescriptorType;
 214         __u8    bDescriptorSubType;
 215 
 216         __le16  bcdMBIMExtendedVersion;
 217         __u8    bMaxOutstandingCommandMessages;
 218         __le16  wMTU;
 219 } __attribute__ ((packed));
 220 
 221 /*-------------------------------------------------------------------------*/
 222 
 223 /*
 224  * Class-Specific Control Requests (6.2)
 225  *
 226  * section 3.6.2.1 table 4 has the ACM profile, for modems.
 227  * section 3.8.2 table 10 has the ethernet profile.
 228  *
 229  * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant,
 230  * heavily dependent on the encapsulated (proprietary) command mechanism.
 231  */
 232 
 233 #define USB_CDC_SEND_ENCAPSULATED_COMMAND       0x00
 234 #define USB_CDC_GET_ENCAPSULATED_RESPONSE       0x01
 235 #define USB_CDC_REQ_SET_LINE_CODING             0x20
 236 #define USB_CDC_REQ_GET_LINE_CODING             0x21
 237 #define USB_CDC_REQ_SET_CONTROL_LINE_STATE      0x22
 238 #define USB_CDC_REQ_SEND_BREAK                  0x23
 239 #define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
 240 #define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
 241 #define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
 242 #define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
 243 #define USB_CDC_GET_ETHERNET_STATISTIC          0x44
 244 #define USB_CDC_GET_NTB_PARAMETERS              0x80
 245 #define USB_CDC_GET_NET_ADDRESS                 0x81
 246 #define USB_CDC_SET_NET_ADDRESS                 0x82
 247 #define USB_CDC_GET_NTB_FORMAT                  0x83
 248 #define USB_CDC_SET_NTB_FORMAT                  0x84
 249 #define USB_CDC_GET_NTB_INPUT_SIZE              0x85
 250 #define USB_CDC_SET_NTB_INPUT_SIZE              0x86
 251 #define USB_CDC_GET_MAX_DATAGRAM_SIZE           0x87
 252 #define USB_CDC_SET_MAX_DATAGRAM_SIZE           0x88
 253 #define USB_CDC_GET_CRC_MODE                    0x89
 254 #define USB_CDC_SET_CRC_MODE                    0x8a
 255 
 256 /* Line Coding Structure from CDC spec 6.2.13 */
 257 struct usb_cdc_line_coding {
 258         __le32  dwDTERate;
 259         __u8    bCharFormat;
 260 #define USB_CDC_1_STOP_BITS                     0
 261 #define USB_CDC_1_5_STOP_BITS                   1
 262 #define USB_CDC_2_STOP_BITS                     2
 263 
 264         __u8    bParityType;
 265 #define USB_CDC_NO_PARITY                       0
 266 #define USB_CDC_ODD_PARITY                      1
 267 #define USB_CDC_EVEN_PARITY                     2
 268 #define USB_CDC_MARK_PARITY                     3
 269 #define USB_CDC_SPACE_PARITY                    4
 270 
 271         __u8    bDataBits;
 272 } __attribute__ ((packed));
 273 
 274 /* table 62; bits in multicast filter */
 275 #define USB_CDC_PACKET_TYPE_PROMISCUOUS         (1 << 0)
 276 #define USB_CDC_PACKET_TYPE_ALL_MULTICAST       (1 << 1) /* no filter */
 277 #define USB_CDC_PACKET_TYPE_DIRECTED            (1 << 2)
 278 #define USB_CDC_PACKET_TYPE_BROADCAST           (1 << 3)
 279 #define USB_CDC_PACKET_TYPE_MULTICAST           (1 << 4) /* filtered */
 280 
 281 
 282 /*-------------------------------------------------------------------------*/
 283 
 284 /*
 285  * Class-Specific Notifications (6.3) sent by interrupt transfers
 286  *
 287  * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications
 288  * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS
 289  * RNDIS also defines its own bit-incompatible notifications
 290  */
 291 
 292 #define USB_CDC_NOTIFY_NETWORK_CONNECTION       0x00
 293 #define USB_CDC_NOTIFY_RESPONSE_AVAILABLE       0x01
 294 #define USB_CDC_NOTIFY_SERIAL_STATE             0x20
 295 #define USB_CDC_NOTIFY_SPEED_CHANGE             0x2a
 296 
 297 struct usb_cdc_notification {
 298         __u8    bmRequestType;
 299         __u8    bNotificationType;
 300         __le16  wValue;
 301         __le16  wIndex;
 302         __le16  wLength;
 303 } __attribute__ ((packed));
 304 
 305 struct usb_cdc_speed_change {
 306         __le32  DLBitRRate;     /* contains the downlink bit rate (IN pipe) */
 307         __le32  ULBitRate;      /* contains the uplink bit rate (OUT pipe) */
 308 } __attribute__ ((packed));
 309 
 310 /*-------------------------------------------------------------------------*/
 311 
 312 /*
 313  * Class Specific structures and constants
 314  *
 315  * CDC NCM NTB parameters structure, CDC NCM subclass 6.2.1
 316  *
 317  */
 318 
 319 struct usb_cdc_ncm_ntb_parameters {
 320         __le16  wLength;
 321         __le16  bmNtbFormatsSupported;
 322         __le32  dwNtbInMaxSize;
 323         __le16  wNdpInDivisor;
 324         __le16  wNdpInPayloadRemainder;
 325         __le16  wNdpInAlignment;
 326         __le16  wPadding1;
 327         __le32  dwNtbOutMaxSize;
 328         __le16  wNdpOutDivisor;
 329         __le16  wNdpOutPayloadRemainder;
 330         __le16  wNdpOutAlignment;
 331         __le16  wNtbOutMaxDatagrams;
 332 } __attribute__ ((packed));
 333 
 334 /*
 335  * CDC NCM transfer headers, CDC NCM subclass 3.2
 336  */
 337 
 338 #define USB_CDC_NCM_NTH16_SIGN          0x484D434E /* NCMH */
 339 #define USB_CDC_NCM_NTH32_SIGN          0x686D636E /* ncmh */
 340 
 341 struct usb_cdc_ncm_nth16 {
 342         __le32  dwSignature;
 343         __le16  wHeaderLength;
 344         __le16  wSequence;
 345         __le16  wBlockLength;
 346         __le16  wNdpIndex;
 347 } __attribute__ ((packed));
 348 
 349 struct usb_cdc_ncm_nth32 {
 350         __le32  dwSignature;
 351         __le16  wHeaderLength;
 352         __le16  wSequence;
 353         __le32  dwBlockLength;
 354         __le32  dwNdpIndex;
 355 } __attribute__ ((packed));
 356 
 357 /*
 358  * CDC NCM datagram pointers, CDC NCM subclass 3.3
 359  */
 360 
 361 #define USB_CDC_NCM_NDP16_CRC_SIGN      0x314D434E /* NCM1 */
 362 #define USB_CDC_NCM_NDP16_NOCRC_SIGN    0x304D434E /* NCM0 */
 363 #define USB_CDC_NCM_NDP32_CRC_SIGN      0x316D636E /* ncm1 */
 364 #define USB_CDC_NCM_NDP32_NOCRC_SIGN    0x306D636E /* ncm0 */
 365 
 366 #define USB_CDC_MBIM_NDP16_IPS_SIGN     0x00535049 /* IPS<sessionID> : IPS0 for now */
 367 #define USB_CDC_MBIM_NDP32_IPS_SIGN     0x00737069 /* ips<sessionID> : ips0 for now */
 368 #define USB_CDC_MBIM_NDP16_DSS_SIGN     0x00535344 /* DSS<sessionID> */
 369 #define USB_CDC_MBIM_NDP32_DSS_SIGN     0x00737364 /* dss<sessionID> */
 370 
 371 /* 16-bit NCM Datagram Pointer Entry */
 372 struct usb_cdc_ncm_dpe16 {
 373         __le16  wDatagramIndex;
 374         __le16  wDatagramLength;
 375 } __attribute__((__packed__));
 376 
 377 /* 16-bit NCM Datagram Pointer Table */
 378 struct usb_cdc_ncm_ndp16 {
 379         __le32  dwSignature;
 380         __le16  wLength;
 381         __le16  wNextNdpIndex;
 382         struct  usb_cdc_ncm_dpe16 dpe16[0];
 383 } __attribute__ ((packed));
 384 
 385 /* 32-bit NCM Datagram Pointer Entry */
 386 struct usb_cdc_ncm_dpe32 {
 387         __le32  dwDatagramIndex;
 388         __le32  dwDatagramLength;
 389 } __attribute__((__packed__));
 390 
 391 /* 32-bit NCM Datagram Pointer Table */
 392 struct usb_cdc_ncm_ndp32 {
 393         __le32  dwSignature;
 394         __le16  wLength;
 395         __le16  wReserved6;
 396         __le32  dwNextNdpIndex;
 397         __le32  dwReserved12;
 398         struct  usb_cdc_ncm_dpe32 dpe32[0];
 399 } __attribute__ ((packed));
 400 
 401 /* CDC NCM subclass 3.2.1 and 3.2.2 */
 402 #define USB_CDC_NCM_NDP16_INDEX_MIN                     0x000C
 403 #define USB_CDC_NCM_NDP32_INDEX_MIN                     0x0010
 404 
 405 /* CDC NCM subclass 3.3.3 Datagram Formatting */
 406 #define USB_CDC_NCM_DATAGRAM_FORMAT_CRC                 0x30
 407 #define USB_CDC_NCM_DATAGRAM_FORMAT_NOCRC               0X31
 408 
 409 /* CDC NCM subclass 4.2 NCM Communications Interface Protocol Code */
 410 #define USB_CDC_NCM_PROTO_CODE_NO_ENCAP_COMMANDS        0x00
 411 #define USB_CDC_NCM_PROTO_CODE_EXTERN_PROTO             0xFE
 412 
 413 /* CDC NCM subclass 5.2.1 NCM Functional Descriptor, bmNetworkCapabilities */
 414 #define USB_CDC_NCM_NCAP_ETH_FILTER                     (1 << 0)
 415 #define USB_CDC_NCM_NCAP_NET_ADDRESS                    (1 << 1)
 416 #define USB_CDC_NCM_NCAP_ENCAP_COMMAND                  (1 << 2)
 417 #define USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE              (1 << 3)
 418 #define USB_CDC_NCM_NCAP_CRC_MODE                       (1 << 4)
 419 #define USB_CDC_NCM_NCAP_NTB_INPUT_SIZE                 (1 << 5)
 420 
 421 /* CDC NCM subclass Table 6-3: NTB Parameter Structure */
 422 #define USB_CDC_NCM_NTB16_SUPPORTED                     (1 << 0)
 423 #define USB_CDC_NCM_NTB32_SUPPORTED                     (1 << 1)
 424 
 425 /* CDC NCM subclass Table 6-3: NTB Parameter Structure */
 426 #define USB_CDC_NCM_NDP_ALIGN_MIN_SIZE                  0x04
 427 #define USB_CDC_NCM_NTB_MAX_LENGTH                      0x1C
 428 
 429 /* CDC NCM subclass 6.2.5 SetNtbFormat */
 430 #define USB_CDC_NCM_NTB16_FORMAT                        0x00
 431 #define USB_CDC_NCM_NTB32_FORMAT                        0x01
 432 
 433 /* CDC NCM subclass 6.2.7 SetNtbInputSize */
 434 #define USB_CDC_NCM_NTB_MIN_IN_SIZE                     2048
 435 #define USB_CDC_NCM_NTB_MIN_OUT_SIZE                    2048
 436 
 437 /* NTB Input Size Structure */
 438 struct usb_cdc_ncm_ndp_input_size {
 439         __le32  dwNtbInMaxSize;
 440         __le16  wNtbInMaxDatagrams;
 441         __le16  wReserved;
 442 } __attribute__ ((packed));
 443 
 444 /* CDC NCM subclass 6.2.11 SetCrcMode */
 445 #define USB_CDC_NCM_CRC_NOT_APPENDED                    0x00
 446 #define USB_CDC_NCM_CRC_APPENDED                        0x01
 447 
 448 #endif /* __UAPI_LINUX_USB_CDC_H */

/* [<][>][^][v][top][bottom][index][help] */