xref: /openbmc/u-boot/include/linux/usb/cdc.h (revision 57dc53a72460e8e301fa1cc7951b41db8e731485)
123cd1385SRemy Bohmer /*
223cd1385SRemy Bohmer  * USB Communications Device Class (CDC) definitions
323cd1385SRemy Bohmer  *
423cd1385SRemy Bohmer  * CDC says how to talk to lots of different types of network adapters,
523cd1385SRemy Bohmer  * notably ethernet adapters and various modems.  It's used mostly with
623cd1385SRemy Bohmer  * firmware based USB peripherals.
723cd1385SRemy Bohmer  *
8*a187559eSBin Meng  * Ported to U-Boot by: Thomas Smits <ts.smits@gmail.com> and
923cd1385SRemy Bohmer  *                      Remy Bohmer <linux@bohmer.net>
1023cd1385SRemy Bohmer  */
1123cd1385SRemy Bohmer 
1223cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_ACM			0x02
1323cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_ETHERNET		0x06
1423cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_WHCM			0x08
1523cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_DMM			0x09
1623cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_MDLM			0x0a
1723cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_OBEX			0x0b
1823cd1385SRemy Bohmer 
1923cd1385SRemy Bohmer #define USB_CDC_PROTO_NONE			0
2023cd1385SRemy Bohmer 
2123cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_V25TER		1
2223cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_PCCA101		2
2323cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE	3
2423cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_GSM		4
2523cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_3G			5
2623cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_CDMA		6
2723cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_VENDOR		0xff
2823cd1385SRemy Bohmer 
2923cd1385SRemy Bohmer /*-------------------------------------------------------------------------*/
3023cd1385SRemy Bohmer 
3123cd1385SRemy Bohmer /*
3223cd1385SRemy Bohmer  * Class-Specific descriptors ... there are a couple dozen of them
3323cd1385SRemy Bohmer  */
3423cd1385SRemy Bohmer 
3523cd1385SRemy Bohmer #define USB_CDC_HEADER_TYPE		0x00	/* header_desc */
3623cd1385SRemy Bohmer #define USB_CDC_CALL_MANAGEMENT_TYPE	0x01	/* call_mgmt_descriptor */
3723cd1385SRemy Bohmer #define USB_CDC_ACM_TYPE		0x02	/* acm_descriptor */
3823cd1385SRemy Bohmer #define USB_CDC_UNION_TYPE		0x06	/* union_desc */
3923cd1385SRemy Bohmer #define USB_CDC_COUNTRY_TYPE		0x07
4023cd1385SRemy Bohmer #define USB_CDC_NETWORK_TERMINAL_TYPE	0x0a	/* network_terminal_desc */
4123cd1385SRemy Bohmer #define USB_CDC_ETHERNET_TYPE		0x0f	/* ether_desc */
4223cd1385SRemy Bohmer #define USB_CDC_WHCM_TYPE		0x11
4323cd1385SRemy Bohmer #define USB_CDC_MDLM_TYPE		0x12	/* mdlm_desc */
4423cd1385SRemy Bohmer #define USB_CDC_MDLM_DETAIL_TYPE	0x13	/* mdlm_detail_desc */
4523cd1385SRemy Bohmer #define USB_CDC_DMM_TYPE		0x14
4623cd1385SRemy Bohmer #define USB_CDC_OBEX_TYPE		0x15
4723cd1385SRemy Bohmer 
4823cd1385SRemy Bohmer /* "Header Functional Descriptor" from CDC spec  5.2.3.1 */
4923cd1385SRemy Bohmer struct usb_cdc_header_desc {
5023cd1385SRemy Bohmer 	__u8	bLength;
5123cd1385SRemy Bohmer 	__u8	bDescriptorType;
5223cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
5323cd1385SRemy Bohmer 
5423cd1385SRemy Bohmer 	__le16	bcdCDC;
5523cd1385SRemy Bohmer } __attribute__ ((packed));
5623cd1385SRemy Bohmer 
5723cd1385SRemy Bohmer /* "Call Management Descriptor" from CDC spec  5.2.3.2 */
5823cd1385SRemy Bohmer struct usb_cdc_call_mgmt_descriptor {
5923cd1385SRemy Bohmer 	__u8	bLength;
6023cd1385SRemy Bohmer 	__u8	bDescriptorType;
6123cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
6223cd1385SRemy Bohmer 
6323cd1385SRemy Bohmer 	__u8	bmCapabilities;
6423cd1385SRemy Bohmer #define USB_CDC_CALL_MGMT_CAP_CALL_MGMT		0x01
6523cd1385SRemy Bohmer #define USB_CDC_CALL_MGMT_CAP_DATA_INTF		0x02
6623cd1385SRemy Bohmer 
6723cd1385SRemy Bohmer 	__u8	bDataInterface;
6823cd1385SRemy Bohmer } __attribute__ ((packed));
6923cd1385SRemy Bohmer 
7023cd1385SRemy Bohmer /* "Abstract Control Management Descriptor" from CDC spec  5.2.3.3 */
7123cd1385SRemy Bohmer struct usb_cdc_acm_descriptor {
7223cd1385SRemy Bohmer 	__u8	bLength;
7323cd1385SRemy Bohmer 	__u8	bDescriptorType;
7423cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
7523cd1385SRemy Bohmer 
7623cd1385SRemy Bohmer 	__u8	bmCapabilities;
7723cd1385SRemy Bohmer } __attribute__ ((packed));
7823cd1385SRemy Bohmer 
7923cd1385SRemy Bohmer /* capabilities from 5.2.3.3 */
8023cd1385SRemy Bohmer 
8123cd1385SRemy Bohmer #define USB_CDC_COMM_FEATURE	0x01
8223cd1385SRemy Bohmer #define USB_CDC_CAP_LINE	0x02
8323cd1385SRemy Bohmer #define USB_CDC_CAP_BRK	0x04
8423cd1385SRemy Bohmer #define USB_CDC_CAP_NOTIFY	0x08
8523cd1385SRemy Bohmer 
8623cd1385SRemy Bohmer /* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
8723cd1385SRemy Bohmer struct usb_cdc_union_desc {
8823cd1385SRemy Bohmer 	__u8	bLength;
8923cd1385SRemy Bohmer 	__u8	bDescriptorType;
9023cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
9123cd1385SRemy Bohmer 
9223cd1385SRemy Bohmer 	__u8	bMasterInterface0;
9323cd1385SRemy Bohmer 	__u8	bSlaveInterface0;
9423cd1385SRemy Bohmer 	/* ... and there could be other slave interfaces */
9523cd1385SRemy Bohmer } __attribute__ ((packed));
9623cd1385SRemy Bohmer 
9723cd1385SRemy Bohmer /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */
9823cd1385SRemy Bohmer struct usb_cdc_country_functional_desc {
9923cd1385SRemy Bohmer 	__u8	bLength;
10023cd1385SRemy Bohmer 	__u8	bDescriptorType;
10123cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
10223cd1385SRemy Bohmer 
10323cd1385SRemy Bohmer 	__u8	iCountryCodeRelDate;
10423cd1385SRemy Bohmer 	__le16	wCountyCode0;
10523cd1385SRemy Bohmer 	/* ... and there can be a lot of country codes */
10623cd1385SRemy Bohmer } __attribute__ ((packed));
10723cd1385SRemy Bohmer 
10823cd1385SRemy Bohmer /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */
10923cd1385SRemy Bohmer struct usb_cdc_network_terminal_desc {
11023cd1385SRemy Bohmer 	__u8	bLength;
11123cd1385SRemy Bohmer 	__u8	bDescriptorType;
11223cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
11323cd1385SRemy Bohmer 
11423cd1385SRemy Bohmer 	__u8	bEntityId;
11523cd1385SRemy Bohmer 	__u8	iName;
11623cd1385SRemy Bohmer 	__u8	bChannelIndex;
11723cd1385SRemy Bohmer 	__u8	bPhysicalInterface;
11823cd1385SRemy Bohmer } __attribute__ ((packed));
11923cd1385SRemy Bohmer 
12023cd1385SRemy Bohmer /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
12123cd1385SRemy Bohmer struct usb_cdc_ether_desc {
12223cd1385SRemy Bohmer 	__u8	bLength;
12323cd1385SRemy Bohmer 	__u8	bDescriptorType;
12423cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
12523cd1385SRemy Bohmer 
12623cd1385SRemy Bohmer 	__u8	iMACAddress;
12723cd1385SRemy Bohmer 	__le32	bmEthernetStatistics;
12823cd1385SRemy Bohmer 	__le16	wMaxSegmentSize;
12923cd1385SRemy Bohmer 	__le16	wNumberMCFilters;
13023cd1385SRemy Bohmer 	__u8	bNumberPowerFilters;
13123cd1385SRemy Bohmer } __attribute__ ((packed));
13223cd1385SRemy Bohmer 
13323cd1385SRemy Bohmer /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */
13423cd1385SRemy Bohmer struct usb_cdc_mdlm_desc {
13523cd1385SRemy Bohmer 	__u8	bLength;
13623cd1385SRemy Bohmer 	__u8	bDescriptorType;
13723cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
13823cd1385SRemy Bohmer 
13923cd1385SRemy Bohmer 	__le16	bcdVersion;
14023cd1385SRemy Bohmer 	__u8	bGUID[16];
14123cd1385SRemy Bohmer } __attribute__ ((packed));
14223cd1385SRemy Bohmer 
14323cd1385SRemy Bohmer /* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */
14423cd1385SRemy Bohmer struct usb_cdc_mdlm_detail_desc {
14523cd1385SRemy Bohmer 	__u8	bLength;
14623cd1385SRemy Bohmer 	__u8	bDescriptorType;
14723cd1385SRemy Bohmer 	__u8	bDescriptorSubType;
14823cd1385SRemy Bohmer 
14923cd1385SRemy Bohmer 	/* type is associated with mdlm_desc.bGUID */
15023cd1385SRemy Bohmer 	__u8	bGuidDescriptorType;
15123cd1385SRemy Bohmer 	__u8	bDetailData[0];
15223cd1385SRemy Bohmer } __attribute__ ((packed));
15323cd1385SRemy Bohmer 
15423cd1385SRemy Bohmer /*-------------------------------------------------------------------------*/
15523cd1385SRemy Bohmer 
15623cd1385SRemy Bohmer /*
15723cd1385SRemy Bohmer  * Class-Specific Control Requests (6.2)
15823cd1385SRemy Bohmer  *
15923cd1385SRemy Bohmer  * section 3.6.2.1 table 4 has the ACM profile, for modems.
16023cd1385SRemy Bohmer  * section 3.8.2 table 10 has the ethernet profile.
1617612a43dSVitaly Kuzmichev  *
1627612a43dSVitaly Kuzmichev  * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant,
1637612a43dSVitaly Kuzmichev  * heavily dependent on the encapsulated (proprietary) command mechanism.
16423cd1385SRemy Bohmer  */
16523cd1385SRemy Bohmer 
16623cd1385SRemy Bohmer #define USB_CDC_SEND_ENCAPSULATED_COMMAND	0x00
16723cd1385SRemy Bohmer #define USB_CDC_GET_ENCAPSULATED_RESPONSE	0x01
16823cd1385SRemy Bohmer #define USB_CDC_REQ_SET_LINE_CODING		0x20
16923cd1385SRemy Bohmer #define USB_CDC_REQ_GET_LINE_CODING		0x21
17023cd1385SRemy Bohmer #define USB_CDC_REQ_SET_CONTROL_LINE_STATE	0x22
17123cd1385SRemy Bohmer #define USB_CDC_REQ_SEND_BREAK			0x23
17223cd1385SRemy Bohmer #define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS	0x40
17323cd1385SRemy Bohmer #define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER	0x41
17423cd1385SRemy Bohmer #define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER	0x42
17523cd1385SRemy Bohmer #define USB_CDC_SET_ETHERNET_PACKET_FILTER	0x43
17623cd1385SRemy Bohmer #define USB_CDC_GET_ETHERNET_STATISTIC		0x44
17723cd1385SRemy Bohmer 
17823cd1385SRemy Bohmer /* Line Coding Structure from CDC spec 6.2.13 */
17923cd1385SRemy Bohmer struct usb_cdc_line_coding {
18023cd1385SRemy Bohmer 	__le32	dwDTERate;
18123cd1385SRemy Bohmer 	__u8	bCharFormat;
18223cd1385SRemy Bohmer #define USB_CDC_1_STOP_BITS			0
18323cd1385SRemy Bohmer #define USB_CDC_1_5_STOP_BITS			1
18423cd1385SRemy Bohmer #define USB_CDC_2_STOP_BITS			2
18523cd1385SRemy Bohmer 
18623cd1385SRemy Bohmer 	__u8	bParityType;
18723cd1385SRemy Bohmer #define USB_CDC_NO_PARITY			0
18823cd1385SRemy Bohmer #define USB_CDC_ODD_PARITY			1
18923cd1385SRemy Bohmer #define USB_CDC_EVEN_PARITY			2
19023cd1385SRemy Bohmer #define USB_CDC_MARK_PARITY			3
19123cd1385SRemy Bohmer #define USB_CDC_SPACE_PARITY			4
19223cd1385SRemy Bohmer 
19323cd1385SRemy Bohmer 	__u8	bDataBits;
19423cd1385SRemy Bohmer } __attribute__ ((packed));
19523cd1385SRemy Bohmer 
19623cd1385SRemy Bohmer /* table 62; bits in multicast filter */
19723cd1385SRemy Bohmer #define	USB_CDC_PACKET_TYPE_PROMISCUOUS		(1 << 0)
19823cd1385SRemy Bohmer #define	USB_CDC_PACKET_TYPE_ALL_MULTICAST	(1 << 1) /* no filter */
19923cd1385SRemy Bohmer #define	USB_CDC_PACKET_TYPE_DIRECTED		(1 << 2)
20023cd1385SRemy Bohmer #define	USB_CDC_PACKET_TYPE_BROADCAST		(1 << 3)
20123cd1385SRemy Bohmer #define	USB_CDC_PACKET_TYPE_MULTICAST		(1 << 4) /* filtered */
20223cd1385SRemy Bohmer 
20323cd1385SRemy Bohmer /*-------------------------------------------------------------------------*/
20423cd1385SRemy Bohmer 
20523cd1385SRemy Bohmer /*
20623cd1385SRemy Bohmer  * Class-Specific Notifications (6.3) sent by interrupt transfers
20723cd1385SRemy Bohmer  *
20823cd1385SRemy Bohmer  * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications
2097612a43dSVitaly Kuzmichev  * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS
2107612a43dSVitaly Kuzmichev  * RNDIS also defines its own bit-incompatible notifications
21123cd1385SRemy Bohmer  */
21223cd1385SRemy Bohmer 
21323cd1385SRemy Bohmer #define USB_CDC_NOTIFY_NETWORK_CONNECTION	0x00
21423cd1385SRemy Bohmer #define USB_CDC_NOTIFY_RESPONSE_AVAILABLE	0x01
21523cd1385SRemy Bohmer #define USB_CDC_NOTIFY_SERIAL_STATE		0x20
21623cd1385SRemy Bohmer #define USB_CDC_NOTIFY_SPEED_CHANGE		0x2a
21723cd1385SRemy Bohmer 
21823cd1385SRemy Bohmer struct usb_cdc_notification {
21923cd1385SRemy Bohmer 	__u8	bmRequestType;
22023cd1385SRemy Bohmer 	__u8	bNotificationType;
22123cd1385SRemy Bohmer 	__le16	wValue;
22223cd1385SRemy Bohmer 	__le16	wIndex;
22323cd1385SRemy Bohmer 	__le16	wLength;
22423cd1385SRemy Bohmer } __attribute__ ((packed));
225