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