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