Merge commit '3ff195b011d7decf501a4d55aeed312731094796' into for-linus
[pandora-kernel.git] / include / linux / usb / cdc.h
1 /*
2  * USB Communications Device Class (CDC) definitions
3  *
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.
7  */
8
9 #ifndef __LINUX_USB_CDC_H
10 #define __LINUX_USB_CDC_H
11
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 #define USB_CDC_SUBCLASS_NCM                    0x0d
22
23 #define USB_CDC_PROTO_NONE                      0
24
25 #define USB_CDC_ACM_PROTO_AT_V25TER             1
26 #define USB_CDC_ACM_PROTO_AT_PCCA101            2
27 #define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE       3
28 #define USB_CDC_ACM_PROTO_AT_GSM                4
29 #define USB_CDC_ACM_PROTO_AT_3G                 5
30 #define USB_CDC_ACM_PROTO_AT_CDMA               6
31 #define USB_CDC_ACM_PROTO_VENDOR                0xff
32
33 #define USB_CDC_PROTO_EEM                       7
34
35 /*-------------------------------------------------------------------------*/
36
37 /*
38  * Class-Specific descriptors ... there are a couple dozen of them
39  */
40
41 #define USB_CDC_HEADER_TYPE             0x00    /* header_desc */
42 #define USB_CDC_CALL_MANAGEMENT_TYPE    0x01    /* call_mgmt_descriptor */
43 #define USB_CDC_ACM_TYPE                0x02    /* acm_descriptor */
44 #define USB_CDC_UNION_TYPE              0x06    /* union_desc */
45 #define USB_CDC_COUNTRY_TYPE            0x07
46 #define USB_CDC_NETWORK_TERMINAL_TYPE   0x0a    /* network_terminal_desc */
47 #define USB_CDC_ETHERNET_TYPE           0x0f    /* ether_desc */
48 #define USB_CDC_WHCM_TYPE               0x11
49 #define USB_CDC_MDLM_TYPE               0x12    /* mdlm_desc */
50 #define USB_CDC_MDLM_DETAIL_TYPE        0x13    /* mdlm_detail_desc */
51 #define USB_CDC_DMM_TYPE                0x14
52 #define USB_CDC_OBEX_TYPE               0x15
53 #define USB_CDC_NCM_TYPE                0x1a
54
55 /* "Header Functional Descriptor" from CDC spec  5.2.3.1 */
56 struct usb_cdc_header_desc {
57         __u8    bLength;
58         __u8    bDescriptorType;
59         __u8    bDescriptorSubType;
60
61         __le16  bcdCDC;
62 } __attribute__ ((packed));
63
64 /* "Call Management Descriptor" from CDC spec  5.2.3.2 */
65 struct usb_cdc_call_mgmt_descriptor {
66         __u8    bLength;
67         __u8    bDescriptorType;
68         __u8    bDescriptorSubType;
69
70         __u8    bmCapabilities;
71 #define USB_CDC_CALL_MGMT_CAP_CALL_MGMT         0x01
72 #define USB_CDC_CALL_MGMT_CAP_DATA_INTF         0x02
73
74         __u8    bDataInterface;
75 } __attribute__ ((packed));
76
77 /* "Abstract Control Management Descriptor" from CDC spec  5.2.3.3 */
78 struct usb_cdc_acm_descriptor {
79         __u8    bLength;
80         __u8    bDescriptorType;
81         __u8    bDescriptorSubType;
82
83         __u8    bmCapabilities;
84 } __attribute__ ((packed));
85
86 /* capabilities from 5.2.3.3 */
87
88 #define USB_CDC_COMM_FEATURE    0x01
89 #define USB_CDC_CAP_LINE        0x02
90 #define USB_CDC_CAP_BRK 0x04
91 #define USB_CDC_CAP_NOTIFY      0x08
92
93 /* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
94 struct usb_cdc_union_desc {
95         __u8    bLength;
96         __u8    bDescriptorType;
97         __u8    bDescriptorSubType;
98
99         __u8    bMasterInterface0;
100         __u8    bSlaveInterface0;
101         /* ... and there could be other slave interfaces */
102 } __attribute__ ((packed));
103
104 /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */
105 struct usb_cdc_country_functional_desc {
106         __u8    bLength;
107         __u8    bDescriptorType;
108         __u8    bDescriptorSubType;
109
110         __u8    iCountryCodeRelDate;
111         __le16  wCountyCode0;
112         /* ... and there can be a lot of country codes */
113 } __attribute__ ((packed));
114
115 /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */
116 struct usb_cdc_network_terminal_desc {
117         __u8    bLength;
118         __u8    bDescriptorType;
119         __u8    bDescriptorSubType;
120
121         __u8    bEntityId;
122         __u8    iName;
123         __u8    bChannelIndex;
124         __u8    bPhysicalInterface;
125 } __attribute__ ((packed));
126
127 /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
128 struct usb_cdc_ether_desc {
129         __u8    bLength;
130         __u8    bDescriptorType;
131         __u8    bDescriptorSubType;
132
133         __u8    iMACAddress;
134         __le32  bmEthernetStatistics;
135         __le16  wMaxSegmentSize;
136         __le16  wNumberMCFilters;
137         __u8    bNumberPowerFilters;
138 } __attribute__ ((packed));
139
140 /* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */
141 struct usb_cdc_dmm_desc {
142         __u8    bFunctionLength;
143         __u8    bDescriptorType;
144         __u8    bDescriptorSubtype;
145         __u16   bcdVersion;
146         __le16  wMaxCommand;
147 } __attribute__ ((packed));
148
149 /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */
150 struct usb_cdc_mdlm_desc {
151         __u8    bLength;
152         __u8    bDescriptorType;
153         __u8    bDescriptorSubType;
154
155         __le16  bcdVersion;
156         __u8    bGUID[16];
157 } __attribute__ ((packed));
158
159 /* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */
160 struct usb_cdc_mdlm_detail_desc {
161         __u8    bLength;
162         __u8    bDescriptorType;
163         __u8    bDescriptorSubType;
164
165         /* type is associated with mdlm_desc.bGUID */
166         __u8    bGuidDescriptorType;
167         __u8    bDetailData[0];
168 } __attribute__ ((packed));
169
170 /* "OBEX Control Model Functional Descriptor" */
171 struct usb_cdc_obex_desc {
172         __u8    bLength;
173         __u8    bDescriptorType;
174         __u8    bDescriptorSubType;
175
176         __le16  bcdVersion;
177 } __attribute__ ((packed));
178
179 /* "NCM Control Model Functional Descriptor" */
180 struct usb_cdc_ncm_desc {
181         __u8    bLength;
182         __u8    bDescriptorType;
183         __u8    bDescriptorSubType;
184
185         __le16  bcdNcmVersion;
186         __u8    bmNetworkCapabilities;
187 } __attribute__ ((packed));
188 /*-------------------------------------------------------------------------*/
189
190 /*
191  * Class-Specific Control Requests (6.2)
192  *
193  * section 3.6.2.1 table 4 has the ACM profile, for modems.
194  * section 3.8.2 table 10 has the ethernet profile.
195  *
196  * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant,
197  * heavily dependent on the encapsulated (proprietary) command mechanism.
198  */
199
200 #define USB_CDC_SEND_ENCAPSULATED_COMMAND       0x00
201 #define USB_CDC_GET_ENCAPSULATED_RESPONSE       0x01
202 #define USB_CDC_REQ_SET_LINE_CODING             0x20
203 #define USB_CDC_REQ_GET_LINE_CODING             0x21
204 #define USB_CDC_REQ_SET_CONTROL_LINE_STATE      0x22
205 #define USB_CDC_REQ_SEND_BREAK                  0x23
206 #define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
207 #define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
208 #define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
209 #define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
210 #define USB_CDC_GET_ETHERNET_STATISTIC          0x44
211 #define USB_CDC_GET_NTB_PARAMETERS              0x80
212 #define USB_CDC_GET_NET_ADDRESS                 0x81
213 #define USB_CDC_SET_NET_ADDRESS                 0x82
214 #define USB_CDC_GET_NTB_FORMAT                  0x83
215 #define USB_CDC_SET_NTB_FORMAT                  0x84
216 #define USB_CDC_GET_NTB_INPUT_SIZE              0x85
217 #define USB_CDC_SET_NTB_INPUT_SIZE              0x86
218 #define USB_CDC_GET_MAX_DATAGRAM_SIZE           0x87
219 #define USB_CDC_SET_MAX_DATAGRAM_SIZE           0x88
220 #define USB_CDC_GET_CRC_MODE                    0x89
221 #define USB_CDC_SET_CRC_MODE                    0x8a
222
223 /* Line Coding Structure from CDC spec 6.2.13 */
224 struct usb_cdc_line_coding {
225         __le32  dwDTERate;
226         __u8    bCharFormat;
227 #define USB_CDC_1_STOP_BITS                     0
228 #define USB_CDC_1_5_STOP_BITS                   1
229 #define USB_CDC_2_STOP_BITS                     2
230
231         __u8    bParityType;
232 #define USB_CDC_NO_PARITY                       0
233 #define USB_CDC_ODD_PARITY                      1
234 #define USB_CDC_EVEN_PARITY                     2
235 #define USB_CDC_MARK_PARITY                     3
236 #define USB_CDC_SPACE_PARITY                    4
237
238         __u8    bDataBits;
239 } __attribute__ ((packed));
240
241 /* table 62; bits in multicast filter */
242 #define USB_CDC_PACKET_TYPE_PROMISCUOUS         (1 << 0)
243 #define USB_CDC_PACKET_TYPE_ALL_MULTICAST       (1 << 1) /* no filter */
244 #define USB_CDC_PACKET_TYPE_DIRECTED            (1 << 2)
245 #define USB_CDC_PACKET_TYPE_BROADCAST           (1 << 3)
246 #define USB_CDC_PACKET_TYPE_MULTICAST           (1 << 4) /* filtered */
247
248
249 /*-------------------------------------------------------------------------*/
250
251 /*
252  * Class-Specific Notifications (6.3) sent by interrupt transfers
253  *
254  * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications
255  * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS
256  * RNDIS also defines its own bit-incompatible notifications
257  */
258
259 #define USB_CDC_NOTIFY_NETWORK_CONNECTION       0x00
260 #define USB_CDC_NOTIFY_RESPONSE_AVAILABLE       0x01
261 #define USB_CDC_NOTIFY_SERIAL_STATE             0x20
262 #define USB_CDC_NOTIFY_SPEED_CHANGE             0x2a
263
264 struct usb_cdc_notification {
265         __u8    bmRequestType;
266         __u8    bNotificationType;
267         __le16  wValue;
268         __le16  wIndex;
269         __le16  wLength;
270 } __attribute__ ((packed));
271
272 /*-------------------------------------------------------------------------*/
273
274 /*
275  * Class Specific structures and constants
276  *
277  * CDC NCM parameter structure, CDC NCM subclass 6.2.1
278  *
279  */
280
281 struct usb_cdc_ncm_ntb_parameter {
282         __le16  wLength;
283         __le16  bmNtbFormatSupported;
284         __le32  dwNtbInMaxSize;
285         __le16  wNdpInDivisor;
286         __le16  wNdpInPayloadRemainder;
287         __le16  wNdpInAlignment;
288         __le16  wPadding1;
289         __le32  dwNtbOutMaxSize;
290         __le16  wNdpOutDivisor;
291         __le16  wNdpOutPayloadRemainder;
292         __le16  wNdpOutAlignment;
293         __le16  wPadding2;
294 } __attribute__ ((packed));
295
296 /*
297  * CDC NCM transfer headers, CDC NCM subclass 3.2
298  */
299
300 #define NCM_NTH16_SIGN          0x484D434E /* NCMH */
301 #define NCM_NTH32_SIGN          0x686D636E /* ncmh */
302
303 struct usb_cdc_ncm_nth16 {
304         __le32  dwSignature;
305         __le16  wHeaderLength;
306         __le16  wSequence;
307         __le16  wBlockLength;
308         __le16  wFpIndex;
309 } __attribute__ ((packed));
310
311 struct usb_cdc_ncm_nth32 {
312         __le32  dwSignature;
313         __le16  wHeaderLength;
314         __le16  wSequence;
315         __le32  dwBlockLength;
316         __le32  dwFpIndex;
317 } __attribute__ ((packed));
318
319 /*
320  * CDC NCM datagram pointers, CDC NCM subclass 3.3
321  */
322
323 #define NCM_NDP16_CRC_SIGN      0x314D434E /* NCM1 */
324 #define NCM_NDP16_NOCRC_SIGN    0x304D434E /* NCM0 */
325 #define NCM_NDP32_CRC_SIGN      0x316D636E /* ncm1 */
326 #define NCM_NDP32_NOCRC_SIGN    0x306D636E /* ncm0 */
327
328 struct usb_cdc_ncm_ndp16 {
329         __le32  dwSignature;
330         __le16  wLength;
331         __le16  wNextFpIndex;
332         __u8    data[0];
333 } __attribute__ ((packed));
334
335 struct usb_cdc_ncm_ndp32 {
336         __le32  dwSignature;
337         __le16  wLength;
338         __le16  wReserved6;
339         __le32  dwNextFpIndex;
340         __le32  dwReserved12;
341         __u8    data[0];
342 } __attribute__ ((packed));
343
344 #endif /* __LINUX_USB_CDC_H */