xref: /linux-6.15/include/uapi/linux/usb/functionfs.h (revision e500d497)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
25e1ddb48SDavid Howells #ifndef _UAPI__LINUX_FUNCTIONFS_H__
35e1ddb48SDavid Howells #define _UAPI__LINUX_FUNCTIONFS_H__
45e1ddb48SDavid Howells 
55e1ddb48SDavid Howells 
6c26cee81SDavid Sands #include <linux/const.h>
75e1ddb48SDavid Howells #include <linux/types.h>
85e1ddb48SDavid Howells #include <linux/ioctl.h>
95e1ddb48SDavid Howells 
105e1ddb48SDavid Howells #include <linux/usb/ch9.h>
115e1ddb48SDavid Howells 
125e1ddb48SDavid Howells 
135e1ddb48SDavid Howells enum {
145e1ddb48SDavid Howells 	FUNCTIONFS_DESCRIPTORS_MAGIC = 1,
15ac8dde11SMichal Nazarewicz 	FUNCTIONFS_STRINGS_MAGIC = 2,
16ac8dde11SMichal Nazarewicz 	FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3,
175e1ddb48SDavid Howells };
185e1ddb48SDavid Howells 
19ac8dde11SMichal Nazarewicz enum functionfs_flags {
20ac8dde11SMichal Nazarewicz 	FUNCTIONFS_HAS_FS_DESC = 1,
21ac8dde11SMichal Nazarewicz 	FUNCTIONFS_HAS_HS_DESC = 2,
22ac8dde11SMichal Nazarewicz 	FUNCTIONFS_HAS_SS_DESC = 4,
23f0175ab5SAndrzej Pietrasiewicz 	FUNCTIONFS_HAS_MS_OS_DESC = 8,
241b0bf88fSRobert Baldyga 	FUNCTIONFS_VIRTUAL_ADDR = 16,
255e33f6fdSRobert Baldyga 	FUNCTIONFS_EVENTFD = 32,
2654dfce6dSFelix Hädicke 	FUNCTIONFS_ALL_CTRL_RECIP = 64,
274368c28aSFelix Hädicke 	FUNCTIONFS_CONFIG0_SETUP = 128,
28ac8dde11SMichal Nazarewicz };
295e1ddb48SDavid Howells 
305e1ddb48SDavid Howells /* Descriptor of an non-audio endpoint */
315e1ddb48SDavid Howells struct usb_endpoint_descriptor_no_audio {
325e1ddb48SDavid Howells 	__u8  bLength;
335e1ddb48SDavid Howells 	__u8  bDescriptorType;
345e1ddb48SDavid Howells 
355e1ddb48SDavid Howells 	__u8  bEndpointAddress;
365e1ddb48SDavid Howells 	__u8  bmAttributes;
375e1ddb48SDavid Howells 	__le16 wMaxPacketSize;
385e1ddb48SDavid Howells 	__u8  bInterval;
395e1ddb48SDavid Howells } __attribute__((packed));
405e1ddb48SDavid Howells 
41c26cee81SDavid Sands /**
42c26cee81SDavid Sands  * struct usb_dfu_functional_descriptor - DFU Functional descriptor
43c26cee81SDavid Sands  * @bLength:		Size of the descriptor (bytes)
44c26cee81SDavid Sands  * @bDescriptorType:	USB_DT_DFU_FUNCTIONAL
45c26cee81SDavid Sands  * @bmAttributes:	DFU attributes
46c26cee81SDavid Sands  * @wDetachTimeOut:	Maximum time to wait after DFU_DETACH (ms, le16)
47c26cee81SDavid Sands  * @wTransferSize:	Maximum number of bytes per control-write (le16)
48c26cee81SDavid Sands  * @bcdDFUVersion:	DFU Spec version (BCD, le16)
49c26cee81SDavid Sands  */
50c26cee81SDavid Sands struct usb_dfu_functional_descriptor {
51c26cee81SDavid Sands 	__u8  bLength;
52c26cee81SDavid Sands 	__u8  bDescriptorType;
53c26cee81SDavid Sands 	__u8  bmAttributes;
54c26cee81SDavid Sands 	__le16 wDetachTimeOut;
55c26cee81SDavid Sands 	__le16 wTransferSize;
56c26cee81SDavid Sands 	__le16 bcdDFUVersion;
57c26cee81SDavid Sands } __attribute__ ((packed));
58c26cee81SDavid Sands 
59c26cee81SDavid Sands /* from DFU functional descriptor bmAttributes */
60c26cee81SDavid Sands #define DFU_FUNC_ATT_CAN_DOWNLOAD	_BITUL(0)
61c26cee81SDavid Sands #define DFU_FUNC_ATT_CAN_UPLOAD		_BITUL(1)
62c26cee81SDavid Sands #define DFU_FUNC_ATT_MANIFEST_TOLERANT	_BITUL(2)
63c26cee81SDavid Sands #define DFU_FUNC_ATT_WILL_DETACH	_BITUL(3)
64c26cee81SDavid Sands 
65c26cee81SDavid Sands 
661df22b4eSMichal Nazarewicz struct usb_functionfs_descs_head_v2 {
671df22b4eSMichal Nazarewicz 	__le32 magic;
681df22b4eSMichal Nazarewicz 	__le32 length;
691df22b4eSMichal Nazarewicz 	__le32 flags;
701df22b4eSMichal Nazarewicz 	/*
711df22b4eSMichal Nazarewicz 	 * __le32 fs_count, hs_count, fs_count; must be included manually in
721df22b4eSMichal Nazarewicz 	 * the structure taking flags into consideration.
731df22b4eSMichal Nazarewicz 	 */
741df22b4eSMichal Nazarewicz } __attribute__((packed));
751df22b4eSMichal Nazarewicz 
7609122141SMichal Nazarewicz /* Legacy format, deprecated as of 3.14. */
7709122141SMichal Nazarewicz struct usb_functionfs_descs_head {
7809122141SMichal Nazarewicz 	__le32 magic;
7909122141SMichal Nazarewicz 	__le32 length;
8009122141SMichal Nazarewicz 	__le32 fs_count;
8109122141SMichal Nazarewicz 	__le32 hs_count;
8209122141SMichal Nazarewicz } __attribute__((packed, deprecated));
835e1ddb48SDavid Howells 
84f0175ab5SAndrzej Pietrasiewicz /* MS OS Descriptor header */
85f0175ab5SAndrzej Pietrasiewicz struct usb_os_desc_header {
86f0175ab5SAndrzej Pietrasiewicz 	__u8	interface;
87f0175ab5SAndrzej Pietrasiewicz 	__le32	dwLength;
88f0175ab5SAndrzej Pietrasiewicz 	__le16	bcdVersion;
89f0175ab5SAndrzej Pietrasiewicz 	__le16	wIndex;
90f0175ab5SAndrzej Pietrasiewicz 	union {
91f0175ab5SAndrzej Pietrasiewicz 		struct {
92f0175ab5SAndrzej Pietrasiewicz 			__u8	bCount;
93f0175ab5SAndrzej Pietrasiewicz 			__u8	Reserved;
94f0175ab5SAndrzej Pietrasiewicz 		};
95f0175ab5SAndrzej Pietrasiewicz 		__le16	wCount;
96f0175ab5SAndrzej Pietrasiewicz 	};
97f0175ab5SAndrzej Pietrasiewicz } __attribute__((packed));
98f0175ab5SAndrzej Pietrasiewicz 
99f0175ab5SAndrzej Pietrasiewicz struct usb_ext_compat_desc {
100f0175ab5SAndrzej Pietrasiewicz 	__u8	bFirstInterfaceNumber;
101f0175ab5SAndrzej Pietrasiewicz 	__u8	Reserved1;
10261fbf203SDmitry Antipov 	__struct_group(/* no tag */, IDs, /* no attrs */,
103f0175ab5SAndrzej Pietrasiewicz 		__u8	CompatibleID[8];
104f0175ab5SAndrzej Pietrasiewicz 		__u8	SubCompatibleID[8];
10561fbf203SDmitry Antipov 	);
106f0175ab5SAndrzej Pietrasiewicz 	__u8	Reserved2[6];
107f0175ab5SAndrzej Pietrasiewicz };
108f0175ab5SAndrzej Pietrasiewicz 
109f0175ab5SAndrzej Pietrasiewicz struct usb_ext_prop_desc {
110f0175ab5SAndrzej Pietrasiewicz 	__le32	dwSize;
111f0175ab5SAndrzej Pietrasiewicz 	__le32	dwPropertyDataType;
112f0175ab5SAndrzej Pietrasiewicz 	__le16	wPropertyNameLength;
113f0175ab5SAndrzej Pietrasiewicz } __attribute__((packed));
114f0175ab5SAndrzej Pietrasiewicz 
1157b07a2a7SPaul Cercueil /* Flags for usb_ffs_dmabuf_transfer_req->flags (none for now) */
1167b07a2a7SPaul Cercueil #define USB_FFS_DMABUF_TRANSFER_MASK	0x0
1177b07a2a7SPaul Cercueil 
1187b07a2a7SPaul Cercueil /**
1197b07a2a7SPaul Cercueil  * struct usb_ffs_dmabuf_transfer_req - Transfer request for a DMABUF object
1207b07a2a7SPaul Cercueil  * @fd:		file descriptor of the DMABUF object
1217b07a2a7SPaul Cercueil  * @flags:	one or more USB_FFS_DMABUF_TRANSFER_* flags
1227b07a2a7SPaul Cercueil  * @length:	number of bytes used in this DMABUF for the data transfer.
1237b07a2a7SPaul Cercueil  *		Should generally be set to the DMABUF's size.
1247b07a2a7SPaul Cercueil  */
1257b07a2a7SPaul Cercueil struct usb_ffs_dmabuf_transfer_req {
1267b07a2a7SPaul Cercueil 	int fd;
1277b07a2a7SPaul Cercueil 	__u32 flags;
1287b07a2a7SPaul Cercueil 	__u64 length;
1297b07a2a7SPaul Cercueil } __attribute__((packed));
1307b07a2a7SPaul Cercueil 
131f0175ab5SAndrzej Pietrasiewicz #ifndef __KERNEL__
1325e1ddb48SDavid Howells 
133c26cee81SDavid Sands /**
134c26cee81SDavid Sands  * DOC: descriptors
135c26cee81SDavid Sands  *
1365e1ddb48SDavid Howells  * Descriptors format:
1375e1ddb48SDavid Howells  *
138c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1395e1ddb48SDavid Howells  * | off | name      | type         | description                          |
140c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
141ac8dde11SMichal Nazarewicz  * |   0 | magic     | LE32         | FUNCTIONFS_DESCRIPTORS_MAGIC_V2      |
142c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
143ac8dde11SMichal Nazarewicz  * |   4 | length    | LE32         | length of the whole data chunk       |
144c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
145ac8dde11SMichal Nazarewicz  * |   8 | flags     | LE32         | combination of functionfs_flags      |
146c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
14796a420d2SVincent Pelletier  * |     | eventfd   | LE32         | eventfd file descriptor              |
148c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
149ac8dde11SMichal Nazarewicz  * |     | fs_count  | LE32         | number of full-speed descriptors     |
150c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
151ac8dde11SMichal Nazarewicz  * |     | hs_count  | LE32         | number of high-speed descriptors     |
152c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
153ac8dde11SMichal Nazarewicz  * |     | ss_count  | LE32         | number of super-speed descriptors    |
154c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
155f0175ab5SAndrzej Pietrasiewicz  * |     | os_count  | LE32         | number of MS OS descriptors          |
156c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
157ac8dde11SMichal Nazarewicz  * |     | fs_descrs | Descriptor[] | list of full-speed descriptors       |
158c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
159ac8dde11SMichal Nazarewicz  * |     | hs_descrs | Descriptor[] | list of high-speed descriptors       |
160c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
161ac8dde11SMichal Nazarewicz  * |     | ss_descrs | Descriptor[] | list of super-speed descriptors      |
162c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
163f0175ab5SAndrzej Pietrasiewicz  * |     | os_descrs | OSDesc[]     | list of MS OS descriptors            |
164c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
165ac8dde11SMichal Nazarewicz  *
166ac8dde11SMichal Nazarewicz  * Depending on which flags are set, various fields may be missing in the
167ac8dde11SMichal Nazarewicz  * structure.  Any flags that are not recognised cause the whole block to be
168ac8dde11SMichal Nazarewicz  * rejected with -ENOSYS.
169ac8dde11SMichal Nazarewicz  *
17051c208c7SMichal Nazarewicz  * Legacy descriptors format (deprecated as of 3.14):
171ac8dde11SMichal Nazarewicz  *
172c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
173ac8dde11SMichal Nazarewicz  * | off | name      | type         | description                          |
174c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
175ac8dde11SMichal Nazarewicz  * |   0 | magic     | LE32         | FUNCTIONFS_DESCRIPTORS_MAGIC         |
176c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1775e1ddb48SDavid Howells  * |   4 | length    | LE32         | length of the whole data chunk       |
178c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1795e1ddb48SDavid Howells  * |   8 | fs_count  | LE32         | number of full-speed descriptors     |
180c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1815e1ddb48SDavid Howells  * |  12 | hs_count  | LE32         | number of high-speed descriptors     |
182c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1835e1ddb48SDavid Howells  * |  16 | fs_descrs | Descriptor[] | list of full-speed descriptors       |
184c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1855e1ddb48SDavid Howells  * |     | hs_descrs | Descriptor[] | list of high-speed descriptors       |
186c26cee81SDavid Sands  * +-----+-----------+--------------+--------------------------------------+
1875e1ddb48SDavid Howells  *
188ac8dde11SMichal Nazarewicz  * All numbers must be in little endian order.
189ac8dde11SMichal Nazarewicz  *
190ac8dde11SMichal Nazarewicz  * Descriptor[] is an array of valid USB descriptors which have the following
191ac8dde11SMichal Nazarewicz  * format:
1925e1ddb48SDavid Howells  *
193c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
1945e1ddb48SDavid Howells  * | off | name            | type | description              |
195c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
1965e1ddb48SDavid Howells  * |   0 | bLength         | U8   | length of the descriptor |
197c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
1985e1ddb48SDavid Howells  * |   1 | bDescriptorType | U8   | descriptor type          |
199c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
2005e1ddb48SDavid Howells  * |   2 | payload         |      | descriptor's payload     |
201c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
202f0175ab5SAndrzej Pietrasiewicz  *
203f0175ab5SAndrzej Pietrasiewicz  * OSDesc[] is an array of valid MS OS Feature Descriptors which have one of
204f0175ab5SAndrzej Pietrasiewicz  * the following formats:
205f0175ab5SAndrzej Pietrasiewicz  *
206c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
207f0175ab5SAndrzej Pietrasiewicz  * | off | name            | type | description              |
208c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
209*e500d497SRandy Dunlap  * |   0 | interface       | U8   | related interface number |
210c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
211f0175ab5SAndrzej Pietrasiewicz  * |   1 | dwLength        | U32  | length of the descriptor |
212c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
213f0175ab5SAndrzej Pietrasiewicz  * |   5 | bcdVersion      | U16  | currently supported: 1   |
214c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
215f0175ab5SAndrzej Pietrasiewicz  * |   7 | wIndex          | U16  | currently supported: 4   |
216c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
217f0175ab5SAndrzej Pietrasiewicz  * |   9 | bCount          | U8   | number of ext. compat.   |
218c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
219f0175ab5SAndrzej Pietrasiewicz  * |  10 | Reserved        | U8   | 0                        |
220c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
221f0175ab5SAndrzej Pietrasiewicz  * |  11 | ExtCompat[]     |      | list of ext. compat. d.  |
222c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
223f0175ab5SAndrzej Pietrasiewicz  *
224c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
225f0175ab5SAndrzej Pietrasiewicz  * | off | name            | type | description              |
226c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
227*e500d497SRandy Dunlap  * |   0 | interface       | U8   | related interface number |
228c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
229f0175ab5SAndrzej Pietrasiewicz  * |   1 | dwLength        | U32  | length of the descriptor |
230c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
231f0175ab5SAndrzej Pietrasiewicz  * |   5 | bcdVersion      | U16  | currently supported: 1   |
232c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
233f0175ab5SAndrzej Pietrasiewicz  * |   7 | wIndex          | U16  | currently supported: 5   |
234c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
235f0175ab5SAndrzej Pietrasiewicz  * |   9 | wCount          | U16  | number of ext. compat.   |
236c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
237f0175ab5SAndrzej Pietrasiewicz  * |  11 | ExtProp[]       |      | list of ext. prop. d.    |
238c26cee81SDavid Sands  * +-----+-----------------+------+--------------------------+
239f0175ab5SAndrzej Pietrasiewicz  *
240*e500d497SRandy Dunlap  * ExtCompat[] is an array of valid Extended Compatibility descriptors
241f0175ab5SAndrzej Pietrasiewicz  * which have the following format:
242f0175ab5SAndrzej Pietrasiewicz  *
243c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
244f0175ab5SAndrzej Pietrasiewicz  * | off | name                  | type | description                         |
245c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
246f0175ab5SAndrzej Pietrasiewicz  * |   0 | bFirstInterfaceNumber | U8   | index of the interface or of the 1st|
247c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
248f0175ab5SAndrzej Pietrasiewicz  * |     |                       |      | interface in an IAD group           |
249c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
2501f7da4f8SVincent Pelletier  * |   1 | Reserved              | U8   | 1                                   |
251c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
252f0175ab5SAndrzej Pietrasiewicz  * |   2 | CompatibleID          | U8[8]| compatible ID string                |
253c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
254f0175ab5SAndrzej Pietrasiewicz  * |  10 | SubCompatibleID       | U8[8]| subcompatible ID string             |
255c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
256f0175ab5SAndrzej Pietrasiewicz  * |  18 | Reserved              | U8[6]| 0                                   |
257c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
258f0175ab5SAndrzej Pietrasiewicz  *
259f0175ab5SAndrzej Pietrasiewicz  * ExtProp[] is an array of valid Extended Properties descriptors
260f0175ab5SAndrzej Pietrasiewicz  * which have the following format:
261f0175ab5SAndrzej Pietrasiewicz  *
262c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
263f0175ab5SAndrzej Pietrasiewicz  * | off | name                  | type | description                         |
264c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
265f0175ab5SAndrzej Pietrasiewicz  * |   0 | dwSize                | U32  | length of the descriptor            |
266c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
267f0175ab5SAndrzej Pietrasiewicz  * |   4 | dwPropertyDataType    | U32  | 1..7                                |
268c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
269f0175ab5SAndrzej Pietrasiewicz  * |   8 | wPropertyNameLength   | U16  | bPropertyName length (NL)           |
270c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
271f0175ab5SAndrzej Pietrasiewicz  * |  10 | bPropertyName         |U8[NL]| name of this property               |
272c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
273f0175ab5SAndrzej Pietrasiewicz  * |10+NL| dwPropertyDataLength  | U32  | bPropertyData length (DL)           |
274c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
275f0175ab5SAndrzej Pietrasiewicz  * |14+NL| bProperty             |U8[DL]| payload of this property            |
276c26cee81SDavid Sands  * +-----+-----------------------+------+-------------------------------------+
2775e1ddb48SDavid Howells  */
2785e1ddb48SDavid Howells 
2795e1ddb48SDavid Howells struct usb_functionfs_strings_head {
2805e1ddb48SDavid Howells 	__le32 magic;
2815e1ddb48SDavid Howells 	__le32 length;
2825e1ddb48SDavid Howells 	__le32 str_count;
2835e1ddb48SDavid Howells 	__le32 lang_count;
2845e1ddb48SDavid Howells } __attribute__((packed));
2855e1ddb48SDavid Howells 
2865e1ddb48SDavid Howells /*
2875e1ddb48SDavid Howells  * Strings format:
2885e1ddb48SDavid Howells  *
2895e1ddb48SDavid Howells  * | off | name       | type                  | description                |
2905e1ddb48SDavid Howells  * |-----+------------+-----------------------+----------------------------|
2915e1ddb48SDavid Howells  * |   0 | magic      | LE32                  | FUNCTIONFS_STRINGS_MAGIC   |
2925e1ddb48SDavid Howells  * |   4 | length     | LE32                  | length of the data chunk   |
2935e1ddb48SDavid Howells  * |   8 | str_count  | LE32                  | number of strings          |
2945e1ddb48SDavid Howells  * |  12 | lang_count | LE32                  | number of languages        |
2955e1ddb48SDavid Howells  * |  16 | stringtab  | StringTab[lang_count] | table of strings per lang  |
2965e1ddb48SDavid Howells  *
2975e1ddb48SDavid Howells  * For each language there is one stringtab entry (ie. there are lang_count
298*e500d497SRandy Dunlap  * stringtab entries).  Each StringTab has following format:
2995e1ddb48SDavid Howells  *
3005e1ddb48SDavid Howells  * | off | name    | type              | description                        |
3015e1ddb48SDavid Howells  * |-----+---------+-------------------+------------------------------------|
3025e1ddb48SDavid Howells  * |   0 | lang    | LE16              | language code                      |
3035e1ddb48SDavid Howells  * |   2 | strings | String[str_count] | array of strings in given language |
3045e1ddb48SDavid Howells  *
3055e1ddb48SDavid Howells  * For each string there is one strings entry (ie. there are str_count
3065e1ddb48SDavid Howells  * string entries).  Each String is a NUL terminated string encoded in
3075e1ddb48SDavid Howells  * UTF-8.
3085e1ddb48SDavid Howells  */
3095e1ddb48SDavid Howells 
3105e1ddb48SDavid Howells #endif
3115e1ddb48SDavid Howells 
3125e1ddb48SDavid Howells 
3135e1ddb48SDavid Howells /*
3145e1ddb48SDavid Howells  * Events are delivered on the ep0 file descriptor, when the user mode driver
3155e1ddb48SDavid Howells  * reads from this file descriptor after writing the descriptors.  Don't
3165e1ddb48SDavid Howells  * stop polling this descriptor.
3175e1ddb48SDavid Howells  */
3185e1ddb48SDavid Howells 
3195e1ddb48SDavid Howells enum usb_functionfs_event_type {
3205e1ddb48SDavid Howells 	FUNCTIONFS_BIND,
3215e1ddb48SDavid Howells 	FUNCTIONFS_UNBIND,
3225e1ddb48SDavid Howells 
3235e1ddb48SDavid Howells 	FUNCTIONFS_ENABLE,
3245e1ddb48SDavid Howells 	FUNCTIONFS_DISABLE,
3255e1ddb48SDavid Howells 
3265e1ddb48SDavid Howells 	FUNCTIONFS_SETUP,
3275e1ddb48SDavid Howells 
3285e1ddb48SDavid Howells 	FUNCTIONFS_SUSPEND,
3295e1ddb48SDavid Howells 	FUNCTIONFS_RESUME
3305e1ddb48SDavid Howells };
3315e1ddb48SDavid Howells 
3325e1ddb48SDavid Howells /* NOTE:  this structure must stay the same size and layout on
3335e1ddb48SDavid Howells  * both 32-bit and 64-bit kernels.
3345e1ddb48SDavid Howells  */
3355e1ddb48SDavid Howells struct usb_functionfs_event {
3365e1ddb48SDavid Howells 	union {
3375e1ddb48SDavid Howells 		/* SETUP: packet; DATA phase i/o precedes next event
3385e1ddb48SDavid Howells 		 *(setup.bmRequestType & USB_DIR_IN) flags direction */
3395e1ddb48SDavid Howells 		struct usb_ctrlrequest	setup;
3405e1ddb48SDavid Howells 	} __attribute__((packed)) u;
3415e1ddb48SDavid Howells 
3425e1ddb48SDavid Howells 	/* enum usb_functionfs_event_type */
3435e1ddb48SDavid Howells 	__u8				type;
3445e1ddb48SDavid Howells 	__u8				_pad[3];
3455e1ddb48SDavid Howells } __attribute__((packed));
3465e1ddb48SDavid Howells 
3475e1ddb48SDavid Howells 
3485e1ddb48SDavid Howells /* Endpoint ioctls */
3495e1ddb48SDavid Howells /* The same as in gadgetfs */
3505e1ddb48SDavid Howells 
3515e1ddb48SDavid Howells /* IN transfers may be reported to the gadget driver as complete
3525e1ddb48SDavid Howells  *	when the fifo is loaded, before the host reads the data;
3535e1ddb48SDavid Howells  * OUT transfers may be reported to the host's "client" driver as
3545e1ddb48SDavid Howells  *	complete when they're sitting in the FIFO unread.
3555e1ddb48SDavid Howells  * THIS returns how many bytes are "unclaimed" in the endpoint fifo
3565e1ddb48SDavid Howells  * (needed for precise fault handling, when the hardware allows it)
3575e1ddb48SDavid Howells  */
3585e1ddb48SDavid Howells #define	FUNCTIONFS_FIFO_STATUS	_IO('g', 1)
3595e1ddb48SDavid Howells 
3605e1ddb48SDavid Howells /* discards any unclaimed data in the fifo. */
3615e1ddb48SDavid Howells #define	FUNCTIONFS_FIFO_FLUSH	_IO('g', 2)
3625e1ddb48SDavid Howells 
3635e1ddb48SDavid Howells /* resets endpoint halt+toggle; used to implement set_interface.
3645e1ddb48SDavid Howells  * some hardware (like pxa2xx) can't support this.
3655e1ddb48SDavid Howells  */
3665e1ddb48SDavid Howells #define	FUNCTIONFS_CLEAR_HALT	_IO('g', 3)
3675e1ddb48SDavid Howells 
3685e1ddb48SDavid Howells /* Specific for functionfs */
3695e1ddb48SDavid Howells 
3705e1ddb48SDavid Howells /*
3715e1ddb48SDavid Howells  * Returns reverse mapping of an interface.  Called on EP0.  If there
3725e1ddb48SDavid Howells  * is no such interface returns -EDOM.  If function is not active
3735e1ddb48SDavid Howells  * returns -ENODEV.
3745e1ddb48SDavid Howells  */
3755e1ddb48SDavid Howells #define	FUNCTIONFS_INTERFACE_REVMAP	_IO('g', 128)
3765e1ddb48SDavid Howells 
3775e1ddb48SDavid Howells /*
378222155deSJerry Zhang  * Returns real bEndpointAddress of an endpoint. If endpoint shuts down
379222155deSJerry Zhang  * during the call, returns -ESHUTDOWN.
3805e1ddb48SDavid Howells  */
3815e1ddb48SDavid Howells #define	FUNCTIONFS_ENDPOINT_REVMAP	_IO('g', 129)
3825e1ddb48SDavid Howells 
383c559a353SRobert Baldyga /*
384222155deSJerry Zhang  * Returns endpoint descriptor. If endpoint shuts down during the call,
385222155deSJerry Zhang  * returns -ESHUTDOWN.
386c559a353SRobert Baldyga  */
387c559a353SRobert Baldyga #define	FUNCTIONFS_ENDPOINT_DESC	_IOR('g', 130, \
388c559a353SRobert Baldyga 					     struct usb_endpoint_descriptor)
389c559a353SRobert Baldyga 
3907b07a2a7SPaul Cercueil /*
3917b07a2a7SPaul Cercueil  * Attach the DMABUF object, identified by its file descriptor, to the
3927b07a2a7SPaul Cercueil  * data endpoint. Returns zero on success, and a negative errno value
3937b07a2a7SPaul Cercueil  * on error.
3947b07a2a7SPaul Cercueil  */
3957b07a2a7SPaul Cercueil #define FUNCTIONFS_DMABUF_ATTACH	_IOW('g', 131, int)
3965e1ddb48SDavid Howells 
3975e1ddb48SDavid Howells 
3987b07a2a7SPaul Cercueil /*
3997b07a2a7SPaul Cercueil  * Detach the given DMABUF object, identified by its file descriptor,
4007b07a2a7SPaul Cercueil  * from the data endpoint. Returns zero on success, and a negative
4017b07a2a7SPaul Cercueil  * errno value on error. Note that closing the endpoint's file
4027b07a2a7SPaul Cercueil  * descriptor will automatically detach all attached DMABUFs.
4037b07a2a7SPaul Cercueil  */
4047b07a2a7SPaul Cercueil #define FUNCTIONFS_DMABUF_DETACH	_IOW('g', 132, int)
4057b07a2a7SPaul Cercueil 
4067b07a2a7SPaul Cercueil /*
4077b07a2a7SPaul Cercueil  * Enqueue the previously attached DMABUF to the transfer queue.
4087b07a2a7SPaul Cercueil  * The argument is a structure that packs the DMABUF's file descriptor,
4097b07a2a7SPaul Cercueil  * the size in bytes to transfer (which should generally correspond to
4107b07a2a7SPaul Cercueil  * the size of the DMABUF), and a 'flags' field which is unused
4117b07a2a7SPaul Cercueil  * for now. Returns zero on success, and a negative errno value on
4127b07a2a7SPaul Cercueil  * error.
4137b07a2a7SPaul Cercueil  */
4147b07a2a7SPaul Cercueil #define FUNCTIONFS_DMABUF_TRANSFER	_IOW('g', 133, \
4157b07a2a7SPaul Cercueil 					     struct usb_ffs_dmabuf_transfer_req)
4167b07a2a7SPaul Cercueil 
4175e1ddb48SDavid Howells #endif /* _UAPI__LINUX_FUNCTIONFS_H__ */
418