sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget&/translations/zh_CN/driver-api/usb/usbmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/driver-api/usb/usbmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/driver-api/usb/usbmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/driver-api/usb/usbmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/driver-api/usb/usbmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/driver-api/usb/usbmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhtarget)}(h.. _usb-hostside-api:h]h}(h]h ]h"]h$]h&]refidusb-hostside-apiuh1hhKhhhhh@/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb.rstubhsection)}(hhh](htitle)}(hThe Linux-USB Host Side APIh]hThe Linux-USB Host Side API}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hIntroduction to USB on Linuxh]hIntroduction to USB on Linux}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXA Universal Serial Bus (USB) is used to connect a host, such as a PC or workstation, to a number of peripheral devices. USB uses a tree structure, with the host as the root (the system's master), hubs as interior nodes, and peripherals as leaves (and slaves). Modern PCs support several such trees of USB devices, usually a few USB 3.0 (5 GBit/s) or USB 3.1 (10 GBit/s) and some legacy USB 2.0 (480 MBit/s) busses just in case.h]hXA Universal Serial Bus (USB) is used to connect a host, such as a PC or workstation, to a number of peripheral devices. USB uses a tree structure, with the host as the root (the system’s master), hubs as interior nodes, and peripherals as leaves (and slaves). Modern PCs support several such trees of USB devices, usually a few USB 3.0 (5 GBit/s) or USB 3.1 (10 GBit/s) and some legacy USB 2.0 (480 MBit/s) busses just in case.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hXvThat master/slave asymmetry was designed-in for a number of reasons, one being ease of use. It is not physically possible to mistake upstream and downstream or it does not matter with a type C plug (or they are built into the peripheral). Also, the host software doesn't need to deal with distributed auto-configuration since the pre-designated master node manages all that.h]hXxThat master/slave asymmetry was designed-in for a number of reasons, one being ease of use. It is not physically possible to mistake upstream and downstream or it does not matter with a type C plug (or they are built into the peripheral). Also, the host software doesn’t need to deal with distributed auto-configuration since the pre-designated master node manages all that.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXXKernel developers added USB support to Linux early in the 2.2 kernel series and have been developing it further since then. Besides support for each new generation of USB, various host controllers gained support, new drivers for peripherals have been added and advanced features for latency measurement and improved power management introduced.h]hXXKernel developers added USB support to Linux early in the 2.2 kernel series and have been developing it further since then. Besides support for each new generation of USB, various host controllers gained support, new drivers for peripherals have been added and advanced features for latency measurement and improved power management introduced.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX,Linux can run inside USB devices as well as on the hosts that control the devices. But USB device drivers running inside those peripherals don't do the same things as the ones running inside hosts, so they've been given a different name: *gadget drivers*. This document does not cover gadget drivers.h](hLinux can run inside USB devices as well as on the hosts that control the devices. But USB device drivers running inside those peripherals don’t do the same things as the ones running inside hosts, so they’ve been given a different name: }(hjhhhNhNubhemphasis)}(h*gadget drivers*h]hgadget drivers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.. This document does not cover gadget drivers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]introduction-to-usb-on-linuxah ]h"]introduction to usb on linuxah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hUSB Host-Side API Modelh]hUSB Host-Side API Model}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhK&ubh)}(hXHost-side drivers for USB devices talk to the "usbcore" APIs. There are two. One is intended for *general-purpose* drivers (exposed through driver frameworks), and the other is for drivers that are *part of the core*. Such core drivers include the *hub* driver (which manages trees of USB devices) and several different kinds of *host controller drivers*, which control individual busses.h](heHost-side drivers for USB devices talk to the “usbcore” APIs. There are two. One is intended for }(hj=hhhNhNubj )}(h*general-purpose*h]hgeneral-purpose}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubhT drivers (exposed through driver frameworks), and the other is for drivers that are }(hj=hhhNhNubj )}(h*part of the core*h]hpart of the core}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubh . Such core drivers include the }(hj=hhhNhNubj )}(h*hub*h]hhub}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubhL driver (which manages trees of USB devices) and several different kinds of }(hj=hhhNhNubj )}(h*host controller drivers*h]hhost controller drivers}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubh", which control individual busses.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK(hj,hhubh)}(h;The device model seen by USB drivers is relatively complex.h]h;The device model seen by USB drivers is relatively complex.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hj,hhubh bullet_list)}(hhh](h list_item)}(hUSB supports four kinds of data transfers (control, bulk, interrupt, and isochronous). Two of them (control and bulk) use bandwidth as it's available, while the other two (interrupt and isochronous) are scheduled to provide guaranteed bandwidth. h]h)}(hUSB supports four kinds of data transfers (control, bulk, interrupt, and isochronous). Two of them (control and bulk) use bandwidth as it's available, while the other two (interrupt and isochronous) are scheduled to provide guaranteed bandwidth.h]hUSB supports four kinds of data transfers (control, bulk, interrupt, and isochronous). Two of them (control and bulk) use bandwidth as it’s available, while the other two (interrupt and isochronous) are scheduled to provide guaranteed bandwidth.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hX!The device description model includes one or more "configurations" per device, only one of which is active at a time. Devices are supposed to be capable of operating at lower than their top speeds and may provide a BOS descriptor showing the lowest speed they remain fully operational at. h]h)}(hX The device description model includes one or more "configurations" per device, only one of which is active at a time. Devices are supposed to be capable of operating at lower than their top speeds and may provide a BOS descriptor showing the lowest speed they remain fully operational at.h]hX$The device description model includes one or more “configurations” per device, only one of which is active at a time. Devices are supposed to be capable of operating at lower than their top speeds and may provide a BOS descriptor showing the lowest speed they remain fully operational at.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hFrom USB 3.0 on configurations have one or more "functions", which provide a common functionality and are grouped together for purposes of power management. h]h)}(hFrom USB 3.0 on configurations have one or more "functions", which provide a common functionality and are grouped together for purposes of power management.h]hFrom USB 3.0 on configurations have one or more “functions”, which provide a common functionality and are grouped together for purposes of power management.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKh]h int ep_type}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chK hj6ubh definition)}(hhh]h)}(hThe endpoint type to return human-readable name for. If it's not any of the types: USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT}, usually got by usb_endpoint_type(), the string 'unknown' will be returned.h]hThe endpoint type to return human-readable name for. If it’s not any of the types: USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT}, usually got by usb_endpoint_type(), the string ‘unknown’ will be returned.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjVubah}(h]h ]h"]h$]h&]uh1jThj6ubeh}(h]h ]h"]h$]h&]uh1j4hjShK hj1ubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_otg_state_string (C function)c.usb_otg_state_stringhNtauh1jhjhhhNhNubj )}(hhh](j)}(h]jA)}j4jdsbc.usb_speed_stringasbuh1hhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubjv)}(hspeedh]hspeed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj&hKbubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj&hKbubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj&hKbhjhhubj)}(hhh]h)}(h)Returns human readable-name of the speed.h]h)Returns human readable-name of the speed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chK]hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj&hKbubeh}(h]h ](jfunctioneh"]h$]h&]j jj j j j j j juh1j hhhjhNhNubj)}(h**Parameters** ``enum usb_device_speed speed`` The speed to return human-readable name for. If it's not any of the speeds defined in usb_device_speed enum, string for USB_SPEED_UNKNOWN will be returned.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKahjubj0)}(hhh]j5)}(h``enum usb_device_speed speed`` The speed to return human-readable name for. If it's not any of the speeds defined in usb_device_speed enum, string for USB_SPEED_UNKNOWN will be returned.h](j;)}(h``enum usb_device_speed speed``h]j)}(hj5h]henum usb_device_speed speed}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chK_hj/ubjU)}(hhh]h)}(hThe speed to return human-readable name for. If it's not any of the speeds defined in usb_device_speed enum, string for USB_SPEED_UNKNOWN will be returned.h]hThe speed to return human-readable name for. If it’s not any of the speeds defined in usb_device_speed enum, string for USB_SPEED_UNKNOWN will be returned.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chK^hjKubah}(h]h ]h"]h$]h&]uh1jThj/ubeh}(h]h ]h"]h$]h&]uh1j4hjJhK_hj,ubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"usb_get_maximum_speed (C function)c.usb_get_maximum_speedhNtauh1jhjhhhNhNubj )}(hhh](j)}(h@enum usb_device_speed usb_get_maximum_speed (struct device *dev)h]j)}(h?enum usb_device_speed usb_get_maximum_speed(struct device *dev)h](j)}(hjh]henum}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKrubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKrubh)}(hhh]jv)}(husb_device_speedh]husb_device_speed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4usb_get_maximum_speedsbc.usb_get_maximum_speedasbuh1hhjhhhjhKrubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKrubjp)}(husb_get_maximum_speedh]jv)}(hjh]husb_get_maximum_speed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKrubj)}(h(struct device *dev)h]j)}(hstruct device *devh](j)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_get_maximum_speedasbuh1hhjubj/)}(h h]h }(hj9hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjGhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKrubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKrubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKrhjhhubj)}(hhh]h)}(h7Get maximum requested speed for a given USB controller.h]h7Get maximum requested speed for a given USB controller.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKkhj{hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKrubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjhNhNubj)}(h**Parameters** ``struct device *dev`` Pointer to the given USB controller device **Description** The function gets the maximum speed string from property "maximum-speed", and returns the corresponding enum usb_device_speed.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKohjubj0)}(hhh]j5)}(hB``struct device *dev`` Pointer to the given USB controller device h](j;)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKmhjubjU)}(hhh]h)}(h*Pointer to the given USB controller deviceh]h*Pointer to the given USB controller device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKmhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKmhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKohjubh)}(h~The function gets the maximum speed string from property "maximum-speed", and returns the corresponding enum usb_device_speed.h]hThe function gets the maximum speed string from property “maximum-speed”, and returns the corresponding enum usb_device_speed.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKohjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_get_maximum_ssp_rate (C function)c.usb_get_maximum_ssp_ratehNtauh1jhjhhhNhNubj )}(hhh](j)}(h?enum usb_ssp_rate usb_get_maximum_ssp_rate (struct device *dev)h]j)}(h>enum usb_ssp_rate usb_get_maximum_ssp_rate(struct device *dev)h](j)}(hjh]henum}(hj? hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj; hhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKubj/)}(h h]h }(hjM hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj; hhhjL hKubh)}(hhh]jv)}(h usb_ssp_rateh]h usb_ssp_rate}(hj^ hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj[ ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj` modnameN classnameNj8j;)}j>]jA)}j4usb_get_maximum_ssp_ratesbc.usb_get_maximum_ssp_rateasbuh1hhj; hhhjL hKubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj; hhhjL hKubjp)}(husb_get_maximum_ssp_rateh]jv)}(hj| h]husb_get_maximum_ssp_rate}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ](jjeh"]h$]h&]jjuh1johj; hhhjL hKubj)}(h(struct device *dev)h]j)}(hstruct device *devh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]jz c.usb_get_maximum_ssp_rateasbuh1hhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hdevh]hdev}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj; hhhjL hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj7 hhhjL hKubah}(h]j2 ah ](jjeh"]h$]h&]jj)jhuh1jhjL hKhj4 hhubj)}(hhh]h)}(hUGet the signaling rate generation and lane count of a SuperSpeed Plus capable device.h]hUGet the signaling rate generation and lane count of a SuperSpeed Plus capable device.}(hj- hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhj* hhubah}(h]h ]h"]h$]h&]uh1jhj4 hhhjL hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jE j jE j j juh1j hhhjhNhNubj)}(hX/**Parameters** ``struct device *dev`` Pointer to the given USB controller device **Description** If the string from "maximum-speed" property is super-speed-plus-genXxY where 'X' is the generation number and 'Y' is the number of lanes, then this function returns the corresponding enum usb_ssp_rate.h](h)}(h**Parameters**h]j)}(hjO h]h Parameters}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjI ubj0)}(hhh]j5)}(hB``struct device *dev`` Pointer to the given USB controller device h](j;)}(h``struct device *dev``h]j)}(hjn h]hstruct device *dev}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl ubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjh ubjU)}(hhh]h)}(h*Pointer to the given USB controller deviceh]h*Pointer to the given USB controller device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThjh ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhje ubah}(h]h ]h"]h$]h&]uh1j/hjI ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjI ubh)}(hIf the string from "maximum-speed" property is super-speed-plus-genXxY where 'X' is the generation number and 'Y' is the number of lanes, then this function returns the corresponding enum usb_ssp_rate.h]hIf the string from “maximum-speed” property is super-speed-plus-genXxY where ‘X’ is the generation number and ‘Y’ is the number of lanes, then this function returns the corresponding enum usb_ssp_rate.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjI ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_state_string (C function)c.usb_state_stringhNtauh1jhjhhhNhNubj )}(hhh](j)}(h;const char * usb_state_string (enum usb_device_state state)h]j)}(h9const char *usb_state_string(enum usb_device_state state)h](j)}(hj h]hconst}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj hhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj hhhj hKubj@)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj hhhj hKubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj hhhj hKubj_)}(hjbh]h*}(hj& hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj hhhj hKubjp)}(husb_state_stringh]jv)}(husb_state_stringh]husb_state_string}(hj7 hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3 ubah}(h]h ](jjeh"]h$]h&]jjuh1johj hhhj hKubj)}(h(enum usb_device_state state)h]j)}(henum usb_device_state stateh](j)}(hjh]henum}(hjS hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjO ubj/)}(h h]h }(hj` hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjO ubh)}(hhh]jv)}(husb_device_stateh]husb_device_state}(hjq hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjn ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjs modnameN classnameNj8j;)}j>]jA)}j4j9 sbc.usb_state_stringasbuh1hhjO ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjO ubjv)}(hstateh]hstate}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjO ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjK ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hKhj hhubj)}(hhh]h)}(h*Returns human readable name for the state.h]h*Returns human readable name for the state.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj j j j j j juh1j hhhjhNhNubj)}(h**Parameters** ``enum usb_device_state state`` The state to return a human-readable name for. If it's not any of the states devices in usb_device_state_string enum, the string UNKNOWN will be returned.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhj ubj0)}(hhh]j5)}(h``enum usb_device_state state`` The state to return a human-readable name for. If it's not any of the states devices in usb_device_state_string enum, the string UNKNOWN will be returned.h](j;)}(h``enum usb_device_state state``h]j)}(hj h]henum usb_device_state state}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhj ubjU)}(hhh]h)}(hThe state to return a human-readable name for. If it's not any of the states devices in usb_device_state_string enum, the string UNKNOWN will be returned.h]hThe state to return a human-readable name for. If it’s not any of the states devices in usb_device_state_string enum, the string UNKNOWN will be returned.}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhj ubah}(h]h ]h"]h$]h&]uh1j/hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j-usb_get_role_switch_default_mode (C function)"c.usb_get_role_switch_default_modehNtauh1jhjhhhNhNubj )}(hhh](j)}(hFenum usb_dr_mode usb_get_role_switch_default_mode (struct device *dev)h]j)}(hEenum usb_dr_mode usb_get_role_switch_default_mode(struct device *dev)h](j)}(hjh]henum}(hjd hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj` hhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKubj/)}(h h]h }(hjr hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj` hhhjq hKubh)}(hhh]jv)}(h usb_dr_modeh]h usb_dr_mode}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]jA)}j4 usb_get_role_switch_default_modesb"c.usb_get_role_switch_default_modeasbuh1hhj` hhhjq hKubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj` hhhjq hKubjp)}(h usb_get_role_switch_default_modeh]jv)}(hj h]h usb_get_role_switch_default_mode}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ](jjeh"]h$]h&]jjuh1johj` hhhjq hKubj)}(h(struct device *dev)h]j)}(hstruct device *devh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]j "c.usb_get_role_switch_default_modeasbuh1hhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hdevh]hdev}(hj( hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj` hhhjq hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj\ hhhjq hKubah}(h]jW ah ](jjeh"]h$]h&]jj)jhuh1jhjq hKhjY hhubj)}(hhh]h)}(h!Get default mode for given deviceh]h!Get default mode for given device}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjO hhubah}(h]h ]h"]h$]h&]uh1jhjY hhhjq hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj j jj j j juh1j hhhjhNhNubj)}(h**Parameters** ``struct device *dev`` Pointer to the given device **Description** The function gets string from property 'role-switch-default-mode', and returns the corresponding enum usb_dr_mode.h](h)}(h**Parameters**h]j)}(hjt h]h Parameters}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjn ubj0)}(hhh]j5)}(h3``struct device *dev`` Pointer to the given device h](j;)}(h``struct device *dev``h]j)}(hj h]hstruct device *dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhj ubjU)}(hhh]h)}(hPointer to the given deviceh]hPointer to the given device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhj ubah}(h]h ]h"]h$]h&]uh1j/hjn ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjn ubh)}(hrThe function gets string from property 'role-switch-default-mode', and returns the corresponding enum usb_dr_mode.h]hvThe function gets string from property ‘role-switch-default-mode’, and returns the corresponding enum usb_dr_mode.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjn ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j usb_decode_interval (C function)c.usb_decode_intervalhNtauh1jhjhhhNhNubj )}(hhh](j)}(hiunsigned int usb_decode_interval (const struct usb_endpoint_descriptor *epd, enum usb_device_speed speed)h]j)}(hhunsigned int usb_decode_interval(const struct usb_endpoint_descriptor *epd, enum usb_device_speed speed)h](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKubj/)}(h h]h }(hj"hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj!hKubj@)}(hinth]hint}(hj0hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhj!hKubj/)}(h h]h }(hj>hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj!hKubjp)}(husb_decode_intervalh]jv)}(husb_decode_intervalh]husb_decode_interval}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj!hKubj)}(hH(const struct usb_endpoint_descriptor *epd, enum usb_device_speed speed)h](j)}(h)const struct usb_endpoint_descriptor *epdh](j)}(hj h]hconst}(hjlhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhubj/)}(h h]h }(hjyhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jRsbc.usb_decode_intervalasbuh1hhjhubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhubjv)}(hepdh]hepd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjdubj)}(henum usb_device_speed speedh](j)}(hjh]henum}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_device_speedh]husb_device_speed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_decode_intervalasbuh1hhjubj/)}(h h]h }(hj5hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hspeedh]hspeed}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjdubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj!hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj!hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj!hKhjhhubj)}(hhh]h)}(h4Decode bInterval into the time expressed in 1us unith]h4Decode bInterval into the time expressed in 1us unit}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjhNhNubj)}(hX**Parameters** ``const struct usb_endpoint_descriptor *epd`` The descriptor of the endpoint ``enum usb_device_speed speed`` The speed that the endpoint works as **Description** Function returns the interval expressed in 1us unit for servicing endpoint for data transfers.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjubj0)}(hhh](j5)}(hM``const struct usb_endpoint_descriptor *epd`` The descriptor of the endpoint h](j;)}(h-``const struct usb_endpoint_descriptor *epd``h]j)}(hjh]h)const struct usb_endpoint_descriptor *epd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjubjU)}(hhh]h)}(hThe descriptor of the endpointh]hThe descriptor of the endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(hE``enum usb_device_speed speed`` The speed that the endpoint works as h](j;)}(h``enum usb_device_speed speed``h]j)}(hjh]henum usb_device_speed speed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjubjU)}(hhh]h)}(h$The speed that the endpoint works ash]h$The speed that the endpoint works as}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj"h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjubh)}(h^Function returns the interval expressed in 1us unit for servicing endpoint for data transfers.h]h^Function returns the interval expressed in 1us unit for servicing endpoint for data transfers.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&of_usb_get_dr_mode_by_phy (C function)c.of_usb_get_dr_mode_by_phyhNtauh1jhjhhhNhNubj )}(hhh](j)}(hMenum usb_dr_mode of_usb_get_dr_mode_by_phy (struct device_node *np, int arg0)h]j)}(hLenum usb_dr_mode of_usb_get_dr_mode_by_phy(struct device_node *np, int arg0)h](j)}(hjh]henum}(hjghhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjchhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chM"ubj/)}(h h]h }(hjuhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjchhhjthM"ubh)}(hhh]jv)}(h usb_dr_modeh]h usb_dr_mode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4of_usb_get_dr_mode_by_physbc.of_usb_get_dr_mode_by_phyasbuh1hhjchhhjthM"ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjchhhjthM"ubjp)}(hof_usb_get_dr_mode_by_phyh]jv)}(hjh]hof_usb_get_dr_mode_by_phy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjchhhjthM"ubj)}(h"(struct device_node *np, int arg0)h](j)}(hstruct device_node *nph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h device_nodeh]h device_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.of_usb_get_dr_mode_by_phyasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hnph]hnp}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint arg0h](j@)}(hinth]hint}(hjDhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj@ubj/)}(h h]h }(hjRhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj@ubjv)}(harg0h]harg0}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjchhhjthM"ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhjthM"ubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1jhjthM"hj\hhubj)}(hhh]h)}(h_Get dual role mode for the controller device which is associated with the given phy device_nodeh]h_Get dual role mode for the controller device which is associated with the given phy device_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj\hhhjthM"ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjhNhNubj)}(hX**Parameters** ``struct device_node *np`` Pointer to the given phy device_node ``int arg0`` phandle args[0] for phy's with #phy-cells >= 1, or -1 for phys which do not have phy-cells **Description** In dts a usb controller associates with phy devices. The function gets the string from property 'dr_mode' of the controller associated with the given phy device node, and returns the correspondig enum usb_dr_mode.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjubj0)}(hhh](j5)}(h@``struct device_node *np`` Pointer to the given phy device_node h](j;)}(h``struct device_node *np``h]j)}(hjh]hstruct device_node *np}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjubjU)}(hhh]h)}(h$Pointer to the given phy device_nodeh]h$Pointer to the given phy device_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]u5h1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(hh``int arg0`` phandle args[0] for phy's with #phy-cells >= 1, or -1 for phys which do not have phy-cells h](j;)}(h ``int arg0``h]j)}(hjh]hint arg0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjubjU)}(hhh]h)}(hZphandle args[0] for phy's with #phy-cells >= 1, or -1 for phys which do not have phy-cellsh]h\phandle args[0] for phy’s with #phy-cells >= 1, or -1 for phys which do not have phy-cells}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj@h]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjubh)}(hIn dts a usb controller associates with phy devices. The function gets the string from property 'dr_mode' of the controller associated with the given phy device node, and returns the correspondig enum usb_dr_mode.h]hIn dts a usb controller associates with phy devices. The function gets the string from property ‘dr_mode’ of the controller associated with the given phy device node, and returns the correspondig enum usb_dr_mode.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$of_usb_host_tpl_support (C function)c.of_usb_host_tpl_supporthNtauh1jhjhhhNhNubj )}(hhh](j)}(h5bool of_usb_host_tpl_support (struct device_node *np)h]j)}(h4bool of_usb_host_tpl_support(struct device_node *np)h](j@)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMUubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMUubjp)}(hof_usb_host_tpl_supporth]jv)}(hof_usb_host_tpl_supporth]hof_usb_host_tpl_support}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMUubj)}(h(struct device_node *np)h]j)}(hstruct device_node *nph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h device_nodeh]h device_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.of_usb_host_tpl_supportasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hnph]hnp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMUubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj}hhhjhMUubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjhMUhjzhhubj)}(hhh]h)}(hWto get if Targeted Peripheral List is supported for given targeted hosts (non-PC hosts)h]hWto get if Targeted Peripheral List is supported for given targeted hosts (non-PC hosts)}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMOhjBhhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjhMUubeh}(h]h ](jfunctioneh"]h$]h&]j jj j]j j]j j juh1j hhhjhNhNubj)}(h**Parameters** ``struct device_node *np`` Pointer to the given device_node **Description** The function gets if the targeted hosts support TPL or noth](h)}(h**Parameters**h]j)}(hjgh]h Parameters}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMShjaubj0)}(hhh]j5)}(h<``struct device_node *np`` Pointer to the given device_node h](j;)}(h``struct device_node *np``h]j)}(hjh]hstruct device_node *np}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMQhjubjU)}(hhh]h)}(h Pointer to the given device_nodeh]h Pointer to the given device_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMQhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMQhj}ubah}(h]h ]h"]h$]h&]uh1j/hjaubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMShjaubh)}(h:The function gets if the targeted hosts support TPL or noth]h:The function gets if the targeted hosts support TPL or not}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMShjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#of_usb_update_otg_caps (C function)c.of_usb_update_otg_capshNtauh1jhjhhhNhNubj )}(hhh](j)}(hRint of_usb_update_otg_caps (struct device_node *np, struct usb_otg_caps *otg_caps)h]j)}(hQint of_usb_update_otg_caps(struct device_node *np, struct usb_otg_caps *otg_caps)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMcubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMcubjp)}(hof_usb_update_otg_capsh]jv)}(hof_usb_update_otg_capsh]hof_usb_update_otg_caps}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMcubj)}(h7(struct device_node *np, struct usb_otg_caps *otg_caps)h](j)}(hstruct device_node *nph](j)}(hjh]hstruct}(hjChhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj?ubj/)}(h h]h }(hjPhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?ubh)}(hhh]jv)}(h device_nodeh]h device_node}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjcmodnameN classnameNj8j;)}j>]jA)}j4j)sbc.of_usb_update_otg_capsasbuh1hhj?ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj?ubjv)}(hnph]hnp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;ubj)}(hstruct usb_otg_caps *otg_capsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_otg_capsh]h usb_otg_caps}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j}c.of_usb_update_otg_capsasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hotg_capsh]hotg_caps}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMcubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMchjhhubj)}(hhh]h)}(hHto update usb otg capabilities according to the passed properties in DT.h]hHto update usb otg capabilities according to the passed properties in DT.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chM\hj3hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMcubeh}(h]h ](jfunctioneh"]h$]h&]j jj jNj jNj j juh1j hhhjhNhNubj)}(h**Parameters** ``struct device_node *np`` Pointer to the given device_node ``struct usb_otg_caps *otg_caps`` Pointer to the target usb_otg_caps to be set **Description** The function updates the otg capabilitiesh](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chM`hjRubj0)}(hhh](j5)}(h<``struct device_node *np`` Pointer to the given device_node h](j;)}(h``struct device_node *np``h]j)}(hjwh]hstruct device_node *np}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chM^hjqubjU)}(hhh]h)}(h Pointer to the given device_nodeh]h Pointer to the given device_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM^hjubah}(h]h ]h"]h$]h&]uh1jThjqubeh}(h]h ]h"]h$]h&]uh1j4hjhM^hjnubj5)}(hO``struct usb_otg_caps *otg_caps`` Pointer to the target usb_otg_caps to be set h](j;)}(h!``struct usb_otg_caps *otg_caps``h]j)}(hjh]hstruct usb_otg_caps *otg_caps}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chM_hjubjU)}(hhh]h)}(h,Pointer to the target usb_otg_caps to be seth]h,Pointer to the target usb_otg_caps to be set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM_hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhM_hjnubeh}(h]h ]h"]h$]h&]uh1j/hjRubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMahjRubh)}(h)The function updates the otg capabilitiesh]h)The function updates the otg capabilities}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMahjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_of_get_companion_dev (C function)c.usb_of_get_companion_devhNtauh1jhjhhhNhNubj )}(hhh](j)}(h=struct device * usb_of_get_companion_dev (struct device *dev)h]j)}(h;struct device *usb_of_get_companion_dev(struct device *dev)h](j)}(hjh]hstruct}(hj0hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj,hhh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMubj/)}(h h]h }(hj>hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,hhhj=hMubh)}(hhh]jv)}(hdeviceh]hdevice}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjQmodnameN classnameNj8j;)}j>]jA)}j4usb_of_get_companion_devsbc.usb_of_get_companion_devasbuh1hhj,hhhj=hMubj/)}(h h]h }(hjphhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,hhhj=hMubj_)}(hjbh]h*}(hj~hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj,hhhj=hMubjp)}(husb_of_get_companion_devh]jv)}(hjmh]husb_of_get_companion_dev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johj,hhhj=hMubj)}(h(struct device *dev)h]j)}(hstruct device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jkc.usb_of_get_companion_devasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhj,hhhj=hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj=hMubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj=hMhj%hhubj)}(hhh]h)}(hFind the companion deviceh]hFind the companion device}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhj(hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj=hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jCj jCj j juh1j hhhjhNhNubj)}(hX5**Parameters** ``struct device *dev`` the device pointer to find a companion **Description** Find the companion device from platform bus. Takes a reference to the returned struct device which needs to be dropped after use. **Return** On success, a pointer to the companion device, ``NULL`` on failure.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjGubj0)}(hhh]j5)}(h>``struct device *dev`` the device pointer to find a companion h](j;)}(h``struct device *dev``h]j)}(hjlh]hstruct device *dev}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1j:h_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjfubjU)}(hhh]h)}(h&the device pointer to find a companionh]h&the device pointer to find a companion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjfubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjcubah}(h]h ]h"]h$]h&]uh1j/hjGubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjGubh)}(h,Find the companion device from platform bus.h]h,Find the companion device from platform bus.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjGubh)}(hTTakes a reference to the returned struct device which needs to be dropped after use.h]hTTakes a reference to the returned struct device which needs to be dropped after use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjGubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjGubh)}(hCOn success, a pointer to the companion device, ``NULL`` on failure.h](h/On success, a pointer to the companion device, }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:120: ./drivers/usb/common/common.chMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hoIn addition, some functions useful for creating debugging output are defined in ``drivers/usb/common/debug.c``.h](hPIn addition, some functions useful for creating debugging output are defined in }(hjhhhNhNubj)}(h``drivers/usb/common/debug.c``h]hdrivers/usb/common/debug.c}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK{hjhhubh)}(h.. _usb_header:h]h}(h]h ]h"]h$]h&]h usb-headeruh1hhK~hjhhhhubeh}(h](usb-standard-typesjeh ]h"](usb-standard types usb_chapter9eh$]h&]uh1hhhhhhhhKnexpect_referenced_by_name}jLjsexpect_referenced_by_id}jjsubh)}(hhh](h)}(hHost-Side Data Types and Macrosh]hHost-Side Data Types and Macros}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShhhhhKubh)}(hX The host side API exposes several layers to drivers, some of which are more necessary than others. These support lifecycle models for host side drivers and devices, and support passing buffers through usbcore to some HCD that performs the I/O for the device driver.h]hX The host side API exposes several layers to drivers, some of which are more necessary than others. These support lifecycle models for host side drivers and devices, and support passing buffers through usbcore to some HCD that performs the I/O for the device driver.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_host_endpoint (C struct)c.usb_host_endpointhNtauh1jhjShhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhNubj )}(hhh](j)}(husb_host_endpointh]j)}(hstruct usb_host_endpointh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKubjp)}(husb_host_endpointh]jv)}(hjh]husb_host_endpoint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h'host-side endpoint descriptor and queueh]h'host-side endpoint descriptor and queue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK2hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j juh1j hhhjShjhNubj)}(hX&**Definition**:: struct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct usb_ss_ep_comp_descriptor ss_ep_comp; struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp; struct usb_eusb2_isoc_ep_comp_descriptor eusb2_isoc_ep_comp; struct list_head urb_list; void *hcpriv; struct ep_device *ep_dev; unsigned char *extra; int extralen; int enabled; int streams; }; **Members** ``desc`` descriptor for this endpoint, wMaxPacketSize in native byteorder ``ss_ep_comp`` SuperSpeed companion descriptor for this endpoint ``ssp_isoc_ep_comp`` SuperSpeedPlus isoc companion descriptor for this endpoint ``eusb2_isoc_ep_comp`` eUSB2 isoc companion descriptor for this endpoint ``urb_list`` urbs queued to this endpoint; maintained by usbcore ``hcpriv`` for use by HCD; typically holds hardware dma queue head (QH) with one or more transfer descriptors (TDs) per urb ``ep_dev`` ep_device for sysfs info ``extra`` descriptors following this endpoint in the configuration ``extralen`` how many bytes of "extra" are valid ``enabled`` URBs may be submitted to this endpoint ``streams`` number of USB-3 streams allocated on the endpointh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK6hjubh literal_block)}(hXstruct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct usb_ss_ep_comp_descriptor ss_ep_comp; struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp; struct usb_eusb2_isoc_ep_comp_descriptor eusb2_isoc_ep_comp; struct list_head urb_list; void *hcpriv; struct ep_device *ep_dev; unsigned char *extra; int extralen; int enabled; int streams; };h]hXstruct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct usb_ss_ep_comp_descriptor ss_ep_comp; struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp; struct usb_eusb2_isoc_ep_comp_descriptor eusb2_isoc_ep_comp; struct list_head urb_list; void *hcpriv; struct ep_device *ep_dev; unsigned char *extra; int extralen; int enabled; int streams; };}hj sbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK8hjubh)}(h **Members**h]j)}(hjh]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKFhjubj0)}(hhh](j5)}(hJ``desc`` descriptor for this endpoint, wMaxPacketSize in native byteorder h](j;)}(h``desc``h]j)}(hj=h]hdesc}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK4hj7ubjU)}(hhh]h)}(h@descriptor for this endpoint, wMaxPacketSize in native byteorderh]h@descriptor for this endpoint, wMaxPacketSize in native byteorder}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhK4hjSubah}(h]h ]h"]h$]h&]uh1jThj7ubeh}(h]h ]h"]h$]h&]uh1j4hjRhK4hj4ubj5)}(hA``ss_ep_comp`` SuperSpeed companion descriptor for this endpoint h](j;)}(h``ss_ep_comp``h]j)}(hjvh]h ss_ep_comp}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK5hjpubjU)}(hhh]h)}(h1SuperSpeed companion descriptor for this endpointh]h1SuperSpeed companion descriptor for this endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK5hjubah}(h]h ]h"]h$]h&]uh1jThjpubeh}(h]h ]h"]h$]h&]uh1j4hjhK5hj4ubj5)}(hP``ssp_isoc_ep_comp`` SuperSpeedPlus isoc companion descriptor for this endpoint h](j;)}(h``ssp_isoc_ep_comp``h]j)}(hjh]hssp_isoc_ep_comp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK6hjubjU)}(hhh]h)}(h:SuperSpeedPlus isoc companion descriptor for this endpointh]h:SuperSpeedPlus isoc companion descriptor for this endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK6hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhK6hj4ubj5)}(hI``eusb2_isoc_ep_comp`` eUSB2 isoc companion descriptor for this endpoint h](j;)}(h``eusb2_isoc_ep_comp``h]j)}(hjh]heusb2_isoc_ep_comp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK7hjubjU)}(hhh]h)}(h1eUSB2 isoc companion descriptor for this endpointh]h1eUSB2 isoc companion descriptor for this endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK7hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhK7hj4ubj5)}(hA``urb_list`` urbs queued to this endpoint; maintained by usbcore h](j;)}(h ``urb_list``h]j)}(hj!h]hurb_list}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK8hjubjU)}(hhh]h)}(h3urbs queued to this endpoint; maintained by usbcoreh]h3urbs queued to this endpoint; maintained by usbcore}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hK8hj7ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj6hK8hj4ubj5)}(h|``hcpriv`` for use by HCD; typically holds hardware dma queue head (QH) with one or more transfer descriptors (TDs) per urb h](j;)}(h ``hcpriv``h]j)}(hjZh]hhcpriv}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK:hjTubjU)}(hhh]h)}(hpfor use by HCD; typically holds hardware dma queue head (QH) with one or more transfer descriptors (TDs) per urbh]hpfor use by HCD; typically holds hardware dma queue head (QH) with one or more transfer descriptors (TDs) per urb}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK9hjpubah}(h]h ]h"]h$]h&]uh1jThjTubeh}(h]h ]h"]h$]h&]uh1j4hjohK:hj4ubj5)}(h$``ep_dev`` ep_device for sysfs info h](j;)}(h ``ep_dev``h]j)}(hjh]hep_dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK;hjubjU)}(hhh]h)}(hep_device for sysfs infoh]hep_device for sysfs info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK;hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhK;hj4ubj5)}(hC``extra`` descriptors following this endpoint in the configuration h](j;)}(h ``extra``h]j)}(hjh]hextra}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj9ubjU)}(hhh]h)}(h&URBs may be submitted to this endpointh]h&URBs may be submitted to this endpoint}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThK>hjUubah}(h]h ]h"]h$]h&]uh1jThj9ubeh}(h]h ]h"]h$]h&]uh1j4hjThK>hj4ubj5)}(h=``streams`` number of USB-3 streams allocated on the endpointh](j;)}(h ``streams``h]j)}(hjxh]hstreams}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK>hjrubjU)}(hhh]h)}(h1number of USB-3 streams allocated on the endpointh]h1number of USB-3 streams allocated on the endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK?hjubah}(h]h ]h"]h$]h&]uh1jThjrubeh}(h]h ]h"]h$]h&]uh1j4hjhK>hj4ubeh}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKBhjShhubh)}(hUSB requests are always queued to a given endpoint, identified by a descriptor within an active interface in a given USB configuration.h]hUSB requests are always queued to a given endpoint, identified by a descriptor within an active interface in a given USB configuration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhK@hjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_interface (C struct)c.usb_interfacehNtauh1jhjShhhjhNubj )}(hhh](j)}(h usb_interfaceh]j)}(hstruct usb_interfaceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKFubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKFubjp)}(h usb_interfaceh]jv)}(hjh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKFubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKFubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKFhjhhubj)}(hhh]h)}(hwhat usb device drivers talk toh]hwhat usb device drivers talk to}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj8hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKFubeh}(h]h ](jstructeh"]h$]h&]j jj jSj jSj j juh1j hhhjShjhNubj)}(hX **Definition**:: struct usb_interface { struct usb_host_interface *altsetting; struct usb_host_interface *cur_altsetting; unsigned num_altsetting; struct usb_interface_assoc_descriptor *intf_assoc; int minor; enum usb_interface_condition condition; unsigned sysfs_files_created:1; unsigned ep_devs_created:1; unsigned unregistering:1; unsigned needs_remote_wakeup:1; unsigned needs_altsetting0:1; unsigned needs_binding:1; unsigned resetting_device:1; unsigned authorized:1; enum usb_wireless_status wireless_status; struct work_struct wireless_status_work; struct device dev; struct device *usb_dev; struct work_struct reset_ws; }; **Members** ``altsetting`` array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order. ``cur_altsetting`` the current altsetting. ``num_altsetting`` number of altsettings defined. ``intf_assoc`` interface association descriptor ``minor`` the minor number assigned to this interface, if this interface is bound to a driver that uses the USB major number. If this interface does not use the USB major, this field should be unused. The driver should set this value in the probe() function of the driver, after it has been assigned a minor number from the USB core by calling usb_register_dev(). ``condition`` binding state of the interface: not bound, binding (in probe()), bound to a driver, or unbinding (in disconnect()) ``sysfs_files_created`` sysfs attributes exist ``ep_devs_created`` endpoint child pseudo-devices exist ``unregistering`` flag set when the interface is being unregistered ``needs_remote_wakeup`` flag set when the driver requires remote-wakeup capability during autosuspend. ``needs_altsetting0`` flag set when a set-interface request for altsetting 0 has been deferred. ``needs_binding`` flag set when the driver should be re-probed or unbound following a reset or suspend operation it doesn't support. ``resetting_device`` USB core reset the device, so use alt setting 0 as current; needs bandwidth alloc after reset. ``authorized`` This allows to (de)authorize individual interfaces instead a whole device in contrast to the device authorization. ``wireless_status`` if the USB device uses a receiver/emitter combo, whether the emitter is connected. ``wireless_status_work`` Used for scheduling wireless status changes from atomic context. ``dev`` driver model's view of this device ``usb_dev`` if an interface is bound to the USB major, this will point to the sysfs representation for that device. ``reset_ws`` Used for scheduling resets from atomic context.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh:}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjWubj )}(hXstruct usb_interface { struct usb_host_interface *altsetting; struct usb_host_interface *cur_altsetting; unsigned num_altsetting; struct usb_interface_assoc_descriptor *intf_assoc; int minor; enum usb_interface_condition condition; unsigned sysfs_files_created:1; unsigned ep_devs_created:1; unsigned unregistering:1; unsigned needs_remote_wakeup:1; unsigned needs_altsetting0:1; unsigned needs_binding:1; unsigned resetting_device:1; unsigned authorized:1; enum usb_wireless_status wireless_status; struct work_struct wireless_status_work; struct device dev; struct device *usb_dev; struct work_struct reset_ws; };h]hXstruct usb_interface { struct usb_host_interface *altsetting; struct usb_host_interface *cur_altsetting; unsigned num_altsetting; struct usb_interface_assoc_descriptor *intf_assoc; int minor; enum usb_interface_condition condition; unsigned sysfs_files_created:1; unsigned ep_devs_created:1; unsigned unregistering:1; unsigned needs_remote_wakeup:1; unsigned needs_altsetting0:1; unsigned needs_binding:1; unsigned resetting_device:1; unsigned authorized:1; enum usb_wireless_status wireless_status; struct work_struct wireless_status_work; struct device dev; struct device *usb_dev; struct work_struct reset_ws; };}hjxsbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjWubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjWubj0)}(hhh](j5)}(h``altsetting`` array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order. h](j;)}(h``altsetting``h]j)}(hjh]h altsetting}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(harray of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.h]harray of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h+``cur_altsetting`` the current altsetting. h](j;)}(h``cur_altsetting``h]j)}(hjh]hcur_altsetting}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hthe current altsetting.h]hthe current altsetting.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h2``num_altsetting`` number of altsettings defined. h](j;)}(h``num_altsetting``h]j)}(hjh]hnum_altsetting}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hnumber of altsettings defined.h]hnumber of altsettings defined.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKhj1ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj0hKhjubj5)}(h0``intf_assoc`` interface association descriptor h](j;)}(h``intf_assoc``h]j)}(hjTh]h intf_assoc}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjNubjU)}(hhh]h)}(h interface association descriptorh]h interface association descriptor}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihKhjjubah}(h]h ]h"]h$]h&]uh1jThjNubeh}(h]h ]h"]h$]h&]uh1j4hjihKhjubj5)}(hXm``minor`` the minor number assigned to this interface, if this interface is bound to a driver that uses the USB major number. If this interface does not use the USB major, this field should be unused. The driver should set this value in the probe() function of the driver, after it has been assigned a minor number from the USB core by calling usb_register_dev(). h](j;)}(h ``minor``h]j)}(hjh]hminor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hXbthe minor number assigned to this interface, if this interface is bound to a driver that uses the USB major number. If this interface does not use the USB major, this field should be unused. The driver should set this value in the probe() function of the driver, after it has been assigned a minor number from the USB core by calling usb_register_dev().h]hXbthe minor number assigned to this interface, if this interface is bound to a driver that uses the USB major number. If this interface does not use the USB major, this field should be unused. The driver should set this value in the probe() function of the driver, after it has been assigned a minor number from the USB core by calling usb_register_dev().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h``condition`` binding state of the interface: not bound, binding (in probe()), bound to a driver, or unbinding (in disconnect()) h](j;)}(h ``condition``h]j)}(hjh]h condition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hrbinding state of the interface: not bound, binding (in probe()), bound to a driver, or unbinding (in disconnect())h]hrbinding state of the interface: not bound, binding (in probe()), bound to a driver, or unbinding (in disconnect())}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h/``sysfs_files_created`` sysfs attributes exist h](j;)}(h``sysfs_files_created``h]j)}(hjh]hsysfs_files_created}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hsysfs attributes existh]hsysfs attributes exist}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h8``ep_devs_created`` endpoint child pseudo-devices exist h](j;)}(h``ep_devs_created``h]j)}(hj:h]hep_devs_created}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj4ubjU)}(hhh]h)}(h#endpoint child pseudo-devices existh]h#endpoint child pseudo-devices exist}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhKhjPubah}(h]h ]h"]h$]h&]uh1jThj4ubeh}(h]h ]h"]h$]h&]uh1j4hjOhKhjubj5)}(hD``unregistering`` flag set when the interface is being unregistered h](j;)}(h``unregistering``h]j)}(hjsh]h unregistering}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjmubjU)}(hhh]h)}(h1flag set when the interface is being unregisteredh]h1flag set when the interface is being unregistered}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjmubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(hg``needs_remote_wakeup`` flag set when the driver requires remote-wakeup capability during autosuspend. h](j;)}(h``needs_remote_wakeup``h]j)}(hjh]hneeds_remote_wakeup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hNflag set when the driver requires remote-wakeup capability during autosuspend.h]hNflag set when the driver requires remote-wakeup capability during autosuspend.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h```needs_altsetting0`` flag set when a set-interface request for altsetting 0 has been deferred. h](j;)}(h``needs_altsetting0``h]j)}(hjh]hneeds_altsetting0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hIflag set when a set-interface request for altsetting 0 has been deferred.h]hIflag set when a set-interface request for altsetting 0 has been deferred.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(h``needs_binding`` flag set when the driver should be re-probed or unbound following a reset or suspend operation it doesn't support. h](j;)}(h``needs_binding``h]j)}(hj h]h needs_binding}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hrflag set when the driver should be re-probed or unbound following a reset or suspend operation it doesn't support.h]htflag set when the driver should be re-probed or unbound following a reset or suspend operation it doesn’t support.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj6ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj5hKhjubj5)}(ht``resetting_device`` USB core reset the device, so use alt setting 0 as current; needs bandwidth alloc after reset. h](j;)}(h``resetting_device``h]j)}(hjZh]hresetting_device}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjTubjU)}(hhh]h)}(h^USB core reset the device, so use alt setting 0 as current; needs bandwidth alloc after reset.h]h^USB core reset the device, so use alt setting 0 as current; needs bandwidth alloc after reset.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjpubah}(h]h ]h"]h$]h&]uh1jThjTubeh}(h]h ]h"]h$]h&]uh1j4hjohKhjubj5)}(h``authorized`` This allows to (de)authorize individual interfaces instead a whole device in contrast to the device authorization. h](j;)}(h``authorized``h]j)}(hjh]h authorized}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hrThis allows to (de)authorize individual interfaces instead a whole device in contrast to the device authorization.h]hrThis allows to (de)authorize individual interfaces instead a whole device in contrast to the device authorization.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(hg``wireless_status`` if the USB device uses a receiver/emitter combo, whether the emitter is connected. h](j;)}(h``wireless_status``h]j)}(hjh]hwireless_status}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubjU)}(hhh]h)}(hRif the USB device uses a receiver/emitter combo, whether the emitter is connected.h]hRif the USB device uses a receiver/emitter combo, whether the emitter is connected.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(hZ``wireless_status_work`` Used for scheduling wireless status changes from atomic context. h](j;)}(h``wireless_status_work``h]j)}(hj h]hwireless_status_work}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj ubjU)}(hhh]h)}(h@Used for scheduling wireless status changes from atomic context.h]h@Used for scheduling wireless status changes from atomic context.}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhjubj5)}(h+``dev`` driver model's view of this device h](j;)}(h``dev``h]j)}(hjB h]hdev}(hjD hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj< ubjU)}(hhh]h)}(h"driver model's view of this deviceh]h$driver model’s view of this device}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjW hKhjX ubah}(h]h ]h"]h$]h&]uh1jThj< ubeh}(h]h ]h"]h$]h&]uh1j4hjW hKhjubj5)}(ht``usb_dev`` if an interface is bound to the USB major, this will point to the sysfs representation for that device. h](j;)}(h ``usb_dev``h]j)}(hj{ h]husb_dev}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhju ubjU)}(hhh]h)}(hgif an interface is bound to the USB major, this will point to the sysfs representation for that device.h]hgif an interface is bound to the USB major, this will point to the sysfs representation for that device.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj ubah}(h]h ]h"]h$]h&]uh1jThju ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhjubj5)}(h<``reset_ws`` Used for scheduling resets from atomic context.h](j;)}(h ``reset_ws``h]j)}(hj h]hreset_ws}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj ubjU)}(hhh]h)}(h/Used for scheduling resets from atomic context.h]h/Used for scheduling resets from atomic context.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhjubeh}(h]h ]h"]h$]h&]uh1j/hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjShhubh)}(hXUSB device drivers attach to interfaces on a physical device. Each interface encapsulates a single high level function, such as feeding an audio stream to a speaker or reporting a change in a volume control. Many USB devices only have one interface. The protocol used to talk to an interface's endpoints can be defined in a usb "class" specification, or by a product's vendor. The (default) control endpoint is part of every interface, but is never listed among the interface's descriptors.h]hXUSB device drivers attach to interfaces on a physical device. Each interface encapsulates a single high level function, such as feeding an audio stream to a speaker or reporting a change in a volume control. Many USB devices only have one interface. The protocol used to talk to an interface’s endpoints can be defined in a usb “class” specification, or by a product’s vendor. The (default) control endpoint is part of every interface, but is never listed among the interface’s descriptors.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjShhubh)}(hThe driver that is bound to the interface can use standard driver model calls such as dev_get_drvdata() on the dev member of this structure.h]hThe driver that is bound to the interface can use standard driver model calls such as dev_get_drvdata() on the dev member of this structure.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjShhubh)}(hXEach interface may have alternate settings. The initial configuration of a device sets altsetting 0, but the device driver can change that setting using usb_set_interface(). Alternate settings are often used to control the use of periodic endpoints, such as by having different endpoints use different amounts of reserved USB bandwidth. All standards-conformant USB devices that use isochronous endpoints will use them in non-default settings.h]hXEach interface may have alternate settings. The initial configuration of a device sets altsetting 0, but the device driver can change that setting using usb_set_interface(). Alternate settings are often used to control the use of periodic endpoints, such as by having different endpoints use different amounts of reserved USB bandwidth. All standards-conformant USB devices that use isochronous endpoints will use them in non-default settings.}(hj,!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjShhubh)}(hXaThe USB specification says that alternate setting numbers must run from 0 to one less than the total number of alternate settings. But some devices manage to mess this up, and the structures aren't necessarily stored in numerical order anyhow. Use usb_altnum_to_altsetting() to look up an alternate setting in the altsetting array based on its number.h]hXcThe USB specification says that alternate setting numbers must run from 0 to one less than the total number of alternate settings. But some devices manage to mess this up, and the structures aren’t necessarily stored in numerical order anyhow. Use usb_altnum_to_altsetting() to look up an alternate setting in the altsetting array based on its number.}(hj;!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhKhjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_set_intfdata (C function)c.usb_set_intfdatahNtauh1jhjShhhjhNubj )}(hhh](j)}(h>void usb_set_intfdata (struct usb_interface *intf, void *data)h]j)}(h=void usb_set_intfdata(struct usb_interface *intf, void *data)h](j@)}(hvoidh]hvoid}(hjc!hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj_!hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM%ubj/)}(h h]h }(hjr!hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_!hhhjq!hM%ubjp)}(husb_set_intfdatah]jv)}(husb_set_intfdatah]husb_set_intfdata}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1johj_!hhhjq!hM%ubj)}(h((struct usb_interface *intf, void *data)h](j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hj!hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj!ubj/)}(h h]h }(hj!hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj!ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj!modnameN classnameNj8j;)}j>]jA)}j4j!sbc.usb_set_intfdataasbuh1hhj!ubj/)}(h h]h }(hj!hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj!ubj_)}(hjbh]h*}(hj!hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj!ubjv)}(hintfh]hintf}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h void *datah](j@)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj"ubj/)}(h h]h }(hj "hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj"ubj_)}(hjbh]h*}(hj."hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj"ubjv)}(hdatah]hdata}(hj;"hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubeh}(h]h ]h"]h$]h&]jjuh1jhj_!hhhjq!hM%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj[!hhhjq!hM%ubah}(h]jV!ah ](jjeh"]h$]h&]jj)jhuh1jhjq!hM%hjX!hhubj)}(hhh]h)}(h0associate driver-specific data with an interfaceh]h0associate driver-specific data with an interface}(hje"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjb"hhubah}(h]h ]h"]h$]h&]uh1jhjX!hhhjq!hM%ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j}"j j}"j j juh1j hhhjShjhNubj)}(hXq**Parameters** ``struct usb_interface *intf`` USB interface ``void *data`` driver data **Description** Drivers can use this function in their probe() callbacks to associate driver-specific data with an interface. Note that there is generally no need to clear the driver-data pointer even if some drivers do so for historical or implementation-specific reasons.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj"ubj0)}(hhh](j5)}(h-``struct usb_interface *intf`` USB interface h](j;)}(h``struct usb_interface *intf``h]j)}(hj"h]hstruct usb_interface *intf}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj"ubjU)}(hhh]h)}(h USB interfaceh]h USB interface}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jThj"ubeh}(h]h ]h"]h$]h&]uh1j4hj"hMhj"ubj5)}(h``void *data`` driver data h](j;)}(h``void *data``h]j)}(hj"h]h void *data}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj"ubjU)}(hhh]h)}(h driver datah]h driver data}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jThj"ubeh}(h]h ]h"]h$]h&]uh1j4hj"hMhj"ubeh}(h]h ]h"]h$]h&]uh1j/hj"ubh)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj"ubh)}(hmDrivers can use this function in their probe() callbacks to associate driver-specific data with an interface.h]hmDrivers can use this function in their probe() callbacks to associate driver-specific data with an interface.}(hj0#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj"ubh)}(hNote that there is generally no need to clear the driver-data pointer even if some drivers do so for historical or implementation-specific reasons.h]hNote that there is generally no need to clear the driver-data pointer even if some drivers do so for historical or implementation-specific reasons.}(hj?#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM"hj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_interface_cache (C struct)c.usb_interface_cachehNtauh1jhjShhhjhNubj )}(hhh](j)}(husb_interface_cacheh]j)}(hstruct usb_interface_cacheh](j)}(hjh]hstruct}(hjn#hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjj#hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM(ubj/)}(h h]h }(hj|#hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjj#hhhj{#hM(ubjp)}(husb_interface_cacheh]jv)}(hjh#h]husb_interface_cache}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1johjj#hhhj{#hM(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjf#hhhj{#hM(ubah}(h]ja#ah ](jjeh"]h$]h&]jj)jhuh1jhj{#hM(hjc#hhubj)}(hhh]h)}(h.long-term representation of a device interfaceh]h.long-term representation of a device interface}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMShj#hhubah}(h]h ]h"]h$]h&]uh1jhjc#hhhj{#hM(ubeh}(h]h ](jstructeh"]h$]h&]j jj j#j j#j j juh1j hhhjShjhNubj)}(hX**Definition**:: struct usb_interface_cache { unsigned num_altsetting; struct kref ref; struct usb_host_interface altsetting[]; }; **Members** ``num_altsetting`` number of altsettings defined. ``ref`` reference counter. ``altsetting`` variable-length array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh:}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMWhj#ubj )}(h}struct usb_interface_cache { unsigned num_altsetting; struct kref ref; struct usb_host_interface altsetting[]; };h]h}struct usb_interface_cache { unsigned num_altsetting; struct kref ref; struct usb_host_interface altsetting[]; };}hj#sbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMYhj#ubh)}(h **Members**h]j)}(hj#h]hMembers}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM_hj#ubj0)}(hhh](j5)}(h2``num_altsetting`` number of altsettings defined. h](j;)}(h``num_altsetting``h]j)}(hj$h]hnum_altsetting}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMUhj$ubjU)}(hhh]h)}(hnumber of altsettings defined.h]hnumber of altsettings defined.}(hj6$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2$hMUhj3$ubah}(h]h ]h"]h$]h&]uh1jThj$ubeh}(h]h ]h"]h$]h&]uh1j4hj2$hMUhj$ubj5)}(h``ref`` reference counter. h](j;)}(h``ref``h]j)}(hjV$h]href}(hjX$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT$ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMVhjP$ubjU)}(hhh]h)}(hreference counter.h]hreference counter.}(hjo$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk$hMVhjl$ubah}(h]h ]h"]h$]h&]uh1jThjP$ubeh}(h]h ]h"]h$]h&]uh1j4hjk$hMVhj$ubj5)}(h``altsetting`` variable-length array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.h](j;)}(h``altsetting``h]j)}(hj$h]h altsetting}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMXhj$ubjU)}(hhh]h)}(hvariable-length array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.h]hvariable-length array of interface structures, one for each alternate setting that may be selected. Each one includes a set of endpoint configurations. They will be in no particular order.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMWhj$ubah}(h]h ]h"]h$]h&]uh1jThj$ubeh}(h]h ]h"]h$]h&]uh1j4hj$hMXhj$ubeh}(h]h ]h"]h$]h&]uh1j/hj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h**Description**h]j)}(hj$h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM\hjShhubh)}(hXUThese structures persist for the lifetime of a usb_device, unlike struct usb_interface (which persists only as long as its configuration is installed). The altsetting arrays can be accessed through these structures at any time, permitting comparison of configurations and providing support for the /sys/kernel/debug/usb/devices pseudo-file.h]hXUThese structures persist for the lifetime of a usb_device, unlike struct usb_interface (which persists only as long as its configuration is installed). The altsetting arrays can be accessed through these structures at any time, permitting comparison of configurations and providing support for the /sys/kernel/debug/usb/devices pseudo-file.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMZhjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_host_config (C struct)c.usb_host_confighNtauh1jhjShhhjhNubj )}(hhh](j)}(husb_host_configh]j)}(hstruct usb_host_configh](j)}(hjh]hstruct}(hj%hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj %hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMcubj/)}(h h]h }(hj%hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj %hhhj%hMcubjp)}(husb_host_configh]jv)}(hj %h]husb_host_config}(hj0%hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,%ubah}(h]h ](jjeh"]h$]h&]jjuh1johj %hhhj%hMcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj%hMcubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj%hMchj%hhubj)}(hhh]h)}(h*representation of a device's configurationh]h,representation of a device’s configuration}(hjR%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMnhjO%hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj%hMcubeh}(h]h ](jstructeh"]h$]h&]j jj jj%j jj%j j juh1j hhhjShjhNubj)}(hX**Definition**:: struct usb_host_config { struct usb_config_descriptor desc; char *string; struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS]; struct usb_interface *interface[USB_MAXINTERFACES]; struct usb_interface_cache *intf_cache[USB_MAXINTERFACES]; unsigned char *extra; int extralen; }; **Members** ``desc`` the device's configuration descriptor. ``string`` pointer to the cached version of the iConfiguration string, if present for this configuration. ``intf_assoc`` list of any interface association descriptors in this config ``interface`` array of pointers to usb_interface structures, one for each interface in the configuration. The number of interfaces is stored in desc.bNumInterfaces. These pointers are valid only while the configuration is active. ``intf_cache`` array of pointers to usb_interface_cache structures, one for each interface in the configuration. These structures exist for the entire life of the device. ``extra`` pointer to buffer containing all extra descriptors associated with this configuration (those preceding the first interface descriptor). ``extralen`` length of the extra descriptors buffer.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjv%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr%ubh:}(hjr%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMrhjn%ubj )}(hX>struct usb_host_config { struct usb_config_descriptor desc; char *string; struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS]; struct usb_interface *interface[USB_MAXINTERFACES]; struct usb_interface_cache *intf_cache[USB_MAXINTERFACES]; unsigned char *extra; int extralen; };h]hX>struct usb_host_config { struct usb_config_descriptor desc; char *string; struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS]; struct usb_interface *interface[USB_MAXINTERFACES]; struct usb_interface_cache *intf_cache[USB_MAXINTERFACES]; unsigned char *extra; int extralen; };}hj%sbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMthjn%ubh)}(h **Members**h]j)}(hj%h]hMembers}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM~hjn%ubj0)}(hhh](j5)}(h0``desc`` the device's configuration descriptor. h](j;)}(h``desc``h]j)}(hj%h]hdesc}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMphj%ubjU)}(hhh]h)}(h&the device's configuration descriptor.h]h(the device’s configuration descriptor.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMphj%ubah}(h]h ]h"]h$]h&]uh1jThj%ubeh}(h]h ]h"]h$]h&]uh1j4hj%hMphj%ubj5)}(hj``string`` pointer to the cached version of the iConfiguration string, if present for this configuration. h](j;)}(h ``string``h]j)}(hj%h]hstring}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMrhj%ubjU)}(hhh]h)}(h^pointer to the cached version of the iConfiguration string, if present for this configuration.h]h^pointer to the cached version of the iConfiguration string, if present for this configuration.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMqhj&ubah}(h]h ]h"]h$]h&]uh1jThj%ubeh}(h]h ]h"]h$]h&]uh1j4hj &hMrhj%ubj5)}(hL``intf_assoc`` list of any interface association descriptors in this config h](j;)}(h``intf_assoc``h]j)}(hj2&h]h intf_assoc}(hj4&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0&ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMshj,&ubjU)}(hhh]h)}(hhub_delay + wHubDelay + tTPTransmissionDelay (40ns) Will be used as wValue for SetIsochDelay requests. ``use_generic_driver`` ask driver core to reprobe using the generic driver.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubh:}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMGhj(ubj )}(hX0struct usb_device { int devnum; char devpath[16]; u32 route; enum usb_device_state state; enum usb_device_speed speed; unsigned int rx_lanes; unsigned int tx_lanes; enum usb_ssp_rate ssp_rate; struct usb_tt *tt; int ttport; unsigned int toggle[2]; struct usb_device *parent; struct usb_bus *bus; struct usb_host_endpoint ep0; struct device dev; struct usb_device_descriptor descriptor; struct usb_host_bos *bos; struct usb_host_config *config; struct usb_host_config *actconfig; struct usb_host_endpoint *ep_in[16]; struct usb_host_endpoint *ep_out[16]; char **rawdescriptors; unsigned short bus_mA; u8 portnum; u8 level; u8 devaddr; unsigned can_submit:1; unsigned persist_enabled:1; unsigned reset_in_progress:1; unsigned have_langid:1; unsigned authorized:1; unsigned authenticated:1; unsigned lpm_capable:1; unsigned lpm_devinit_allow:1; unsigned usb2_hw_lpm_capable:1; unsigned usb2_hw_lpm_besl_capable:1; unsigned usb2_hw_lpm_enabled:1; unsigned usb2_hw_lpm_allowed:1; unsigned usb3_lpm_u1_enabled:1; unsigned usb3_lpm_u2_enabled:1; int string_langid; char *product; char *manufacturer; char *serial; struct list_head filelist; int maxchild; u32 quirks; atomic_t urbnum; unsigned long active_duration; unsigned long connect_time; unsigned do_remote_wakeup:1; unsigned reset_resume:1; unsigned port_is_suspended:1; enum usb_link_tunnel_mode tunnel_mode; int slot_id; struct usb2_lpm_parameters l1_params; struct usb3_lpm_parameters u1_params; struct usb3_lpm_parameters u2_params; unsigned lpm_disable_count; u16 hub_delay; unsigned use_generic_driver:1; };h]hX0struct usb_device { int devnum; char devpath[16]; u32 route; enum usb_device_state state; enum usb_device_speed speed; unsigned int rx_lanes; unsigned int tx_lanes; enum usb_ssp_rate ssp_rate; struct usb_tt *tt; int ttport; unsigned int toggle[2]; struct usb_device *parent; struct usb_bus *bus; struct usb_host_endpoint ep0; struct device dev; struct usb_device_descriptor descriptor; struct usb_host_bos *bos; struct usb_host_config *config; struct usb_host_config *actconfig; struct usb_host_endpoint *ep_in[16]; struct usb_host_endpoint *ep_out[16]; char **rawdescriptors; unsigned short bus_mA; u8 portnum; u8 level; u8 devaddr; unsigned can_submit:1; unsigned persist_enabled:1; unsigned reset_in_progress:1; unsigned have_langid:1; unsigned authorized:1; unsigned authenticated:1; unsigned lpm_capable:1; unsigned lpm_devinit_allow:1; unsigned usb2_hw_lpm_capable:1; unsigned usb2_hw_lpm_besl_capable:1; unsigned usb2_hw_lpm_enabled:1; unsigned usb2_hw_lpm_allowed:1; unsigned usb3_lpm_u1_enabled:1; unsigned usb3_lpm_u2_enabled:1; int string_langid; char *product; char *manufacturer; char *serial; struct list_head filelist; int maxchild; u32 quirks; atomic_t urbnum; unsigned long active_duration; unsigned long connect_time; unsigned do_remote_wakeup:1; unsigned reset_resume:1; unsigned port_is_suspended:1; enum usb_link_tunnel_mode tunnel_mode; int slot_id; struct usb2_lpm_parameters l1_params; struct usb3_lpm_parameters u1_params; struct usb3_lpm_parameters u2_params; unsigned lpm_disable_count; u16 hub_delay; unsigned use_generic_driver:1; };}hj7(sbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMIhj(ubh)}(h **Members**h]j)}(hjH(h]hMembers}(hjJ(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF(ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj(ubj0)}(hhh](j5)}(h/``devnum`` device number; address on a USB bus h](j;)}(h ``devnum``h]j)}(hjg(h]hdevnum}(hji(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje(ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMEhja(ubjU)}(hhh]h)}(h#device number; address on a USB bush]h#device number; address on a USB bus}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|(hMEhj}(ubah}(h]h ]h"]h$]h&]uh1jThja(ubeh}(h]h ]h"]h$]h&]uh1j4hj|(hMEhj^(ubj5)}(hC``devpath`` device ID string for use in messages (e.g., /port/...) h](j;)}(h ``devpath``h]j)}(hj(h]hdevpath}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMFhj(ubjU)}(hhh]h)}(h6device ID string for use in messages (e.g., /port/...)h]h6device ID string for use in messages (e.g., /port/...)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMFhj(ubah}(h]h ]h"]h$]h&]uh1jThj(ubeh}(h]h ]h"]h$]h&]uh1j4hj(hMFhj^(ubj5)}(h5``route`` tree topology hex string for use with xHCI h](j;)}(h ``route``h]j)}(hj(h]hroute}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMGhj(ubjU)}(hhh]h)}(h*tree topology hex string for use with xHCIh]h*tree topology hex string for use with xHCI}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMGhj(ubah}(h]h ]h"]h$]h&]uh1jThj(ubeh}(h]h ]h"]h$]h&]uh1j4hj(hMGhj^(ubj5)}(h7``state`` device state: configured, not attached, etc. h](j;)}(h ``state``h]j)}(hj)h]hstate}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMHhj )ubjU)}(hhh]h)}(h,device state: configured, not attached, etc.h]h,device state: configured, not attached, etc.}(hj+)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj')hMHhj()ubah}(h]h ]h"]h$]h&]uh1jThj )ubeh}(h]h ]h"]h$]h&]uh1j4hj')hMHhj^(ubj5)}(h1``speed`` device speed: high/full/low (or error) h](j;)}(h ``speed``h]j)}(hjK)h]hspeed}(hjM)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI)ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMIhjE)ubjU)}(hhh]h)}(h&device speed: high/full/low (or error)h]h&device speed: high/full/low (or error)}(hjd)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`)hMIhja)ubah}(h]h ]h"]h$]h&]uh1jThjE)ubeh}(h]h ]h"]h$]h&]uh1j4hj`)hMIhj^(ubj5)}(hG``rx_lanes`` number of rx lanes in use, USB 3.2 adds dual-lane support h](j;)}(h ``rx_lanes``h]j)}(hj)h]hrx_lanes}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMJhj~)ubjU)}(hhh]h)}(h9number of rx lanes in use, USB 3.2 adds dual-lane supporth]h9number of rx lanes in use, USB 3.2 adds dual-lane support}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMJhj)ubah}(h]h ]h"]h$]h&]uh1jThj~)ubeh}(h]h ]h"]h$]h&]uh1j4hj)hMJhj^(ubj5)}(hG``tx_lanes`` number of tx lanes in use, USB 3.2 adds dual-lane support h](j;)}(h ``tx_lanes``h]j)}(hj)h]htx_lanes}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMKhj)ubjU)}(hhh]h)}(h9number of tx lanes in use, USB 3.2 adds dual-lane supporth]h9number of tx lanes in use, USB 3.2 adds dual-lane support}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMKhj)ubah}(h]h ]h"]h$]h&]uh1jThj)ubeh}(h]h ]h"]h$]h&]uh1j4hj)hMKhj^(ubj5)}(h?``ssp_rate`` SuperSpeed Plus phy signaling rate and lane count h](j;)}(h ``ssp_rate``h]j)}(hj)h]hssp_rate}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMLhj)ubjU)}(hhh]h)}(h1SuperSpeed Plus phy signaling rate and lane counth]h1SuperSpeed Plus phy signaling rate and lane count}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj *hMLhj *ubah}(h]h ]h"]h$]h&]uh1jThj)ubeh}(h]h ]h"]h$]h&]uh1j4hj *hMLhj^(ubj5)}(hP``tt`` Transaction Translator info; used with low/full speed dev, highspeed hub h](j;)}(h``tt``h]j)}(hj/*h]htt}(hj1*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-*ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMMhj)*ubjU)}(hhh]h)}(hHTransaction Translator info; used with low/full speed dev, highspeed hubh]hHTransaction Translator info; used with low/full speed dev, highspeed hub}(hjH*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjD*hMMhjE*ubah}(h]h ]h"]h$]h&]uh1jThj)*ubeh}(h]h ]h"]h$]h&]uh1j4hjD*hMMhj^(ubj5)}(h&``ttport`` device port on that tt hub h](j;)}(h ``ttport``h]j)}(hjh*h]httport}(hjj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf*ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMNhjb*ubjU)}(hhh]h)}(hdevice port on that tt hubh]hdevice port on that tt hub}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}*hMNhj~*ubah}(h]h ]h"]h$]h&]uh1jThjb*ubeh}(h]h ]h"]h$]h&]uh1j4hj}*hMNhj^(ubj5)}(hK``toggle`` one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints h](j;)}(h ``toggle``h]j)}(hj*h]htoggle}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMOhj*ubjU)}(hhh]h)}(h?one bit for each endpoint, with ([0] = IN, [1] = OUT) endpointsh]h?one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMOhj*ubah}(h]h ]h"]h$]h&]uh1jThj*ubeh}(h]h ]h"]h$]h&]uh1j4hj*hMOhj^(ubj5)}(h*``parent`` our hub, unless we're the root h](j;)}(h ``parent``h]j)}(hj*h]hparent}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMPhj*ubjU)}(hhh]h)}(hour hub, unless we're the rooth]h our hub, unless we’re the root}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMPhj*ubah}(h]h ]h"]h$]h&]uh1jThj*ubeh}(h]h ]h"]h$]h&]uh1j4hj*hMPhj^(ubj5)}(h``bus`` bus we're part of h](j;)}(h``bus``h]j)}(hj+h]hbus}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMQhj +ubjU)}(hhh]h)}(hbus we're part ofh]hbus we’re part of}(hj,+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(+hMQhj)+ubah}(h]h ]h"]h$]h&]uh1jThj +ubeh}(h]h ]h"]h$]h&]uh1j4hj(+hMQhj^(ubj5)}(h/``ep0`` endpoint 0 data (default control pipe) h](j;)}(h``ep0``h]j)}(hjL+h]hep0}(hjN+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ+ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMRhjF+ubjU)}(hhh]h)}(h&endpoint 0 data (default control pipe)h]h&endpoint 0 data (default control pipe)}(hje+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhja+hMRhjb+ubah}(h]h ]h"]h$]h&]uh1jThjF+ubeh}(h]h ]h"]h$]h&]uh1j4hja+hMRhj^(ubj5)}(h!``dev`` generic device interface h](j;)}(h``dev``h]j)}(hj+h]hdev}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMShj+ubjU)}(hhh]h)}(hgeneric device interfaceh]hgeneric device interface}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMShj+ubah}(h]h ]h"]h$]h&]uh1jThj+ubeh}(h]h ]h"]h$]h&]uh1j4hj+hMShj^(ubj5)}(h%``descriptor`` USB device descriptor h](j;)}(h``descriptor``h]j)}(hj+h]h descriptor}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMThj+ubjU)}(hhh]h)}(hUSB device descriptorh]hUSB device descriptor}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMThj+ubah}(h]h ]h"]h$]h&]uh1jThj+ubeh}(h]h ]h"]h$]h&]uh1j4hj+hMThj^(ubj5)}(h&``bos`` USB device BOS descriptor set h](j;)}(h``bos``h]j)}(hj+h]hbos}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMUhj+ubjU)}(hhh]h)}(hUSB device BOS descriptor seth]hUSB device BOS descriptor set}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ,hMUhj ,ubah}(h]h ]h"]h$]h&]uh1jThj+ubeh}(h]h ]h"]h$]h&]uh1j4hj ,hMUhj^(ubj5)}(h'``config`` all of the device's configs h](j;)}(h ``config``h]j)}(hj0,h]hconfig}(hj2,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.,ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMVhj*,ubjU)}(hhh]h)}(hall of the device's configsh]hall of the device’s configs}(hjI,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjE,hMVhjF,ubah}(h]h ]h"]h$]h&]uh1jThj*,ubeh}(h]h ]h"]h$]h&]uh1j4hjE,hMVhj^(ubj5)}(h'``actconfig`` the active configuration h](j;)}(h ``actconfig``h]j)}(hji,h]h actconfig}(hjk,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg,ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMWhjc,ubjU)}(hhh]h)}(hthe active configurationh]hthe active configuration}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~,hMWhj,ubah}(h]h ]h"]h$]h&]uh1jThjc,ubeh}(h]h ]h"]h$]h&]uh1j4hj~,hMWhj^(ubj5)}(h ``ep_in`` array of IN endpoints h](j;)}(h ``ep_in``h]j)}(hj,h]hep_in}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMXhj,ubjU)}(hhh]h)}(harray of IN endpointsh]harray of IN endpoints}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMXhj,ubah}(h]h ]h"]h$]h&]uh1jThj,ubeh}(h]h ]h"]h$]h&]uh1j4hj,hMXhj^(ubj5)}(h"``ep_out`` array of OUT endpoints h](j;)}(h ``ep_out``h]j)}(hj,h]hep_out}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMYhj,ubjU)}(hhh]h)}(harray of OUT endpointsh]harray of OUT endpoints}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMYhj,ubah}(h]h ]h"]h$]h&]uh1jThj,ubeh}(h]h ]h"]h$]h&]uh1j4hj,hMYhj^(ubj5)}(h3``rawdescriptors`` raw descriptors for each config h](j;)}(h``rawdescriptors``h]j)}(hj-h]hrawdescriptors}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMZhj-ubjU)}(hhh]h)}(hraw descriptors for each configh]hraw descriptors for each config}(hj--hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)-hMZhj*-ubah}(h]h ]h"]h$]h&]uh1jThj-ubeh}(h]h ]h"]h$]h&]uh1j4hj)-hMZhj^(ubj5)}(h*``bus_mA`` Current available from the bus h](j;)}(h ``bus_mA``h]j)}(hjM-h]hbus_mA}(hjO-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK-ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM[hjG-ubjU)}(hhh]h)}(hCurrent available from the bush]hCurrent available from the bus}(hjf-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb-hM[hjc-ubah}(h]h ]h"]h$]h&]uh1jThjG-ubeh}(h]h ]h"]h$]h&]uh1j4hjb-hM[hj^(ubj5)}(h*``portnum`` parent port number (origin 1) h](j;)}(h ``portnum``h]j)}(hj-h]hportnum}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM\hj-ubjU)}(hhh]h)}(hparent port number (origin 1)h]hparent port number (origin 1)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM\hj-ubah}(h]h ]h"]h$]h&]uh1jThj-ubeh}(h]h ]h"]h$]h&]uh1j4hj-hM\hj^(ubj5)}(h&``level`` number of USB hub ancestors h](j;)}(h ``level``h]j)}(hj-h]hlevel}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM]hj-ubjU)}(hhh]h)}(hnumber of USB hub ancestorsh]hnumber of USB hub ancestors}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM]hj-ubah}(h]h ]h"]h$]h&]uh1jThj-ubeh}(h]h ]h"]h$]h&]uh1j4hj-hM]hj^(ubj5)}(hI``devaddr`` device address, XHCI: assigned by HW, others: same as devnum h](j;)}(h ``devaddr``h]j)}(hj-h]hdevaddr}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM^hj-ubjU)}(hhh]h)}(hhub_delay + wHubDelay + tTPTransmissionDelay (40ns) Will be used as wValue for SetIsochDelay requests. h](j;)}(h ``hub_delay``h]j)}(hj5h]h hub_delay}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj5ubjU)}(hhh]h)}(hcached value consisting of: parent->hub_delay + wHubDelay + tTPTransmissionDelay (40ns) Will be used as wValue for SetIsochDelay requests.h]hcached value consisting of: parent->hub_delay + wHubDelay + tTPTransmissionDelay (40ns) Will be used as wValue for SetIsochDelay requests.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj5ubah}(h]h ]h"]h$]h&]uh1jThj5ubeh}(h]h ]h"]h$]h&]uh1j4hj5hMhj^(ubj5)}(hK``use_generic_driver`` ask driver core to reprobe using the generic driver.h](j;)}(h``use_generic_driver``h]j)}(hj5h]huse_generic_driver}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj5ubjU)}(hhh]h)}(h4ask driver core to reprobe using the generic driver.h]h4ask driver core to reprobe using the generic driver.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj5ubah}(h]h ]h"]h$]h&]uh1jThj5ubeh}(h]h ]h"]h$]h&]uh1j4hj5hMhj^(ubeh}(h]h ]h"]h$]h&]uh1j/hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h **Notes**h]j)}(hj 6h]hNotes}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(h[Usbcore drivers should not set usbdev->state directly. Instead use usb_set_device_state().h]h[Usbcore drivers should not set usbdev->state directly. Instead use usb_set_device_state().}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j usb_hub_for_each_child (C macro)c.usb_hub_for_each_childhNtauh1jhjShhhjhNubj )}(hhh](j)}(husb_hub_for_each_childh]j)}(husb_hub_for_each_childh]jp)}(husb_hub_for_each_childh]jv)}(hjA6h]husb_hub_for_each_child}(hjK6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjG6ubah}(h]h ](jjeh"]h$]h&]jjuh1johjC6hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj?6hhhj^6hMubah}(h]j:6ah ](jjeh"]h$]h&]jj)jhuh1jhj^6hMhj<6hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj<6hhhj^6hMubeh}(h]h ](jmacroeh"]h$]h&]j jj jw6j jw6j j juh1j hhhjShjhNubh)}(h/``usb_hub_for_each_child (hdev, port1, child)``h]j)}(hj}6h]h+usb_hub_for_each_child (hdev, port1, child)}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{6ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh block_quote)}(h*iterate over all child devices on the hub h]h)}(h)iterate over all child devices on the hubh]h)iterate over all child devices on the hub}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj6ubah}(h]h ]h"]h$]h&]uh1j6hj6hMhjShhubj)}(h**Parameters** ``hdev`` USB device belonging to the usb hub ``port1`` portnum associated with child device ``child`` child device pointerh](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj6ubj0)}(hhh](j5)}(h-``hdev`` USB device belonging to the usb hub h](j;)}(h``hdev``h]j)}(hj6h]hhdev}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj6ubjU)}(hhh]h)}(h#USB device belonging to the usb hubh]h#USB device belonging to the usb hub}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1jThj6ubeh}(h]h ]h"]h$]h&]uh1j4hj6hMhj6ubj5)}(h/``port1`` portnum associated with child device h](j;)}(h ``port1``h]j)}(hj 7h]hport1}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 7ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj7ubjU)}(hhh]h)}(h$portnum associated with child deviceh]h$portnum associated with child device}(hj%7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!7hMhj"7ubah}(h]h ]h"]h$]h&]uh1jThj7ubeh}(h]h ]h"]h$]h&]uh1j4hj!7hMhj6ubj5)}(h``child`` child device pointerh](j;)}(h ``child``h]j)}(hjE7h]hchild}(hjG7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC7ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj?7ubjU)}(hhh]h)}(hchild device pointerh]hchild device pointer}(hj^7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj[7ubah}(h]h ]h"]h$]h&]uh1jThj?7ubeh}(h]h ]h"]h$]h&]uh1j4hjZ7hMhj6ubeh}(h]h ]h"]h$]h&]uh1j/hj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"usb_interface_claimed (C function)c.usb_interface_claimedhNtauh1jhjShhhjhNubj )}(hhh](j)}(h7int usb_interface_claimed (struct usb_interface *iface)h]j)}(h6int usb_interface_claimed(struct usb_interface *iface)h](j@)}(hinth]hint}(hj7hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj7hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hj7hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj7hhhj7hMubjp)}(husb_interface_claimedh]jv)}(husb_interface_claimedh]husb_interface_claimed}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1johj7hhhj7hMubj)}(h(struct usb_interface *iface)h]j)}(hstruct usb_interface *ifaceh](j)}(hjh]hstruct}(hj7hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj7ubj/)}(h h]h }(hj7hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj7ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj7modnameN classnameNj8j;)}j>]jA)}j4j7sbc.usb_interface_claimedasbuh1hhj7ubj/)}(h h]h }(hj8hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj7ubj_)}(hjbh]h*}(hj(8hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj7ubjv)}(hifaceh]hiface}(hj58hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7ubah}(h]h ]h"]h$]h&]jjuh1jhj7hhhj7hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj7hhhj7hMubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1jhj7hMhj7hhubj)}(hhh]h)}(h(returns true iff an interface is claimedh]h(returns true iff an interface is claimed}(hj_8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMthj\8hhubah}(h]h ]h"]h$]h&]uh1jhj7hhhj7hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jw8j jw8j j juh1j hhhjShjhNubj)}(hXX**Parameters** ``struct usb_interface *iface`` the interface being checked **Return** ``true`` (nonzero) iff the interface is claimed, else ``false`` (zero). **Note** Callers must own the driver model's usb bus readlock. So driver probe() entries don't need extra locking, but other call contexts may need to explicitly claim that lock.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMxhj{8ubj0)}(hhh]j5)}(h<``struct usb_interface *iface`` the interface being checked h](j;)}(h``struct usb_interface *iface``h]j)}(hj8h]hstruct usb_interface *iface}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMuhj8ubjU)}(hhh]h)}(hthe interface being checkedh]hthe interface being checked}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMuhj8ubah}(h]h ]h"]h$]h&]uh1jThj8ubeh}(h]h ]h"]h$]h&]uh1j4hj8hMuhj8ubah}(h]h ]h"]h$]h&]uh1j/hj{8ubh)}(h **Return**h]j)}(hj8h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMwhj{8ubh)}(hG``true`` (nonzero) iff the interface is claimed, else ``false`` (zero).h](j)}(h``true``h]htrue}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh. (nonzero) iff the interface is claimed, else }(hj8hhhNhNubj)}(h ``false``h]hfalse}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh (zero).}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMwhj{8ubh)}(h**Note**h]j)}(hj"9h]hNote}(hj$9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 9ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMzhj{8ubh)}(hCallers must own the driver model's usb bus readlock. So driver probe() entries don't need extra locking, but other call contexts may need to explicitly claim that lock.h]hCallers must own the driver model’s usb bus readlock. So driver probe() entries don’t need extra locking, but other call contexts may need to explicitly claim that lock.}(hj89hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMzhj{8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_make_path (C function)c.usb_make_pathhNtauh1jhjShhhjhNubj )}(hhh](j)}(hBint usb_make_path (struct usb_device *dev, char *buf, size_t size)h]j)}(hAint usb_make_path(struct usb_device *dev, char *buf, size_t size)h](j@)}(hinth]hint}(hjg9hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjc9hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hjv9hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjc9hhhju9hMubjp)}(h usb_make_pathh]jv)}(h usb_make_pathh]h usb_make_path}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1johjc9hhhju9hMubj)}(h0(struct usb_device *dev, char *buf, size_t size)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj9hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj9ubj/)}(h h]h }(hj9hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj9modnameN classnameNj8j;)}j>]jA)}j4j9sbc.usb_make_pathasbuh1hhj9ubj/)}(h h]h }(hj9hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9ubj_)}(hjbh]h*}(hj9hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj9ubjv)}(hdevh]hdev}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(h char *bufh](j@)}(hcharh]hchar}(hj:hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj:ubj/)}(h h]h }(hj$:hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj:ubj_)}(hjbh]h*}(hj2:hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj:ubjv)}(hbufh]hbuf}(hj?:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(h size_t sizeh](h)}(hhh]jv)}(hsize_th]hsize_t}(hj[:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjX:ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj]:modnameN classnameNj8j;)}j>]j9c.usb_make_pathasbuh1hhjT:ubj/)}(h h]h }(hjy:hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjT:ubjv)}(hsizeh]hsize}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjT:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubeh}(h]h ]h"]h$]h&]jjuh1jhjc9hhhju9hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_9hhhju9hMubah}(h]jZ9ah ](jjeh"]h$]h&]jj)jhuh1jhju9hMhj\9hhubj)}(hhh]h)}(h*returns stable device path in the usb treeh]h*returns stable device path in the usb tree}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:hhubah}(h]h ]h"]h$]h&]uh1jhj\9hhhju9hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j:j j:j j juh1j hhhjShjhNubj)}(hX**Parameters** ``struct usb_device *dev`` the device whose path is being constructed ``char *buf`` where to put the string ``size_t size`` how big is "buf"? **Return** Length of the string (> 0) or negative if size was too small. **Note** This identifier is intended to be "stable", reflecting physical paths in hardware such as physical bus addresses for host controllers or ports on USB hubs. That makes it stay the same until systems are physically reconfigured, by re-cabling a tree of USB devices or by moving USB host controllers. Adding and removing devices, including virtual root hubs in host controller driver modules, does not change these path identifiers; neither does rebooting or re-enumerating. These are more useful identifiers than changeable ("unstable") ones like bus numbers or device addresses. **Description** With a partial exception for devices connected to USB 2.0 root hubs, these identifiers are also predictable. So long as the device tree isn't changed, plugging any USB device into a given hub port always gives it the same path. Because of the use of "companion" controllers, devices connected to ports on USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are high speed, and a different one if they are full or low speed.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubj0)}(hhh](j5)}(hF``struct usb_device *dev`` the device whose path is being constructed h](j;)}(h``struct usb_device *dev``h]j)}(hj:h]hstruct usb_device *dev}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubjU)}(hhh]h)}(h*the device whose path is being constructedh]h*the device whose path is being constructed}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jThj:ubeh}(h]h ]h"]h$]h&]uh1j4hj;hMhj:ubj5)}(h&``char *buf`` where to put the string h](j;)}(h ``char *buf``h]j)}(hj+;h]h char *buf}(hj-;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj);ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj%;ubjU)}(hhh]h)}(hwhere to put the stringh]hwhere to put the string}(hjD;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@;hMhjA;ubah}(h]h ]h"]h$]h&]uh1jThj%;ubeh}(h]h ]h"]h$]h&]uh1j4hj@;hMhj:ubj5)}(h"``size_t size`` how big is "buf"? h](j;)}(h``size_t size``h]j)}(hjd;h]h size_t size}(hjf;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb;ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj^;ubjU)}(hhh]h)}(hhow big is "buf"?h]hhow big is “buf”?}(hj};hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy;hMhjz;ubah}(h]h ]h"]h$]h&]uh1jThj^;ubeh}(h]h ]h"]h$]h&]uh1j4hjy;hMhj:ubeh}(h]h ]h"]h$]h&]uh1j/hj:ubh)}(h **Return**h]j)}(hj;h]hReturn}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubh)}(h=Length of the string (> 0) or negative if size was too small.h]h=Length of the string (> 0) or negative if size was too small.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubh)}(h**Note**h]j)}(hj;h]hNote}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubh)}(hXDThis identifier is intended to be "stable", reflecting physical paths in hardware such as physical bus addresses for host controllers or ports on USB hubs. That makes it stay the same until systems are physically reconfigured, by re-cabling a tree of USB devices or by moving USB host controllers. Adding and removing devices, including virtual root hubs in host controller driver modules, does not change these path identifiers; neither does rebooting or re-enumerating. These are more useful identifiers than changeable ("unstable") ones like bus numbers or device addresses.h]hXLThis identifier is intended to be “stable”, reflecting physical paths in hardware such as physical bus addresses for host controllers or ports on USB hubs. That makes it stay the same until systems are physically reconfigured, by re-cabling a tree of USB devices or by moving USB host controllers. Adding and removing devices, including virtual root hubs in host controller driver modules, does not change these path identifiers; neither does rebooting or re-enumerating. These are more useful identifiers than changeable (“unstable”) ones like bus numbers or device addresses.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubh)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubh)}(hXWith a partial exception for devices connected to USB 2.0 root hubs, these identifiers are also predictable. So long as the device tree isn't changed, plugging any USB device into a given hub port always gives it the same path. Because of the use of "companion" controllers, devices connected to ports on USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are high speed, and a different one if they are full or low speed.h]hXWith a partial exception for devices connected to USB 2.0 root hubs, these identifiers are also predictable. So long as the device tree isn’t changed, plugging any USB device into a given hub port always gives it the same path. Because of the use of “companion” controllers, devices connected to ports on USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are high speed, and a different one if they are full or low speed.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jUSB_DEVICE (C macro) c.USB_DEVICEhNtauh1jhjShhhjhNubj )}(hhh](j)}(h USB_DEVICEh]j)}(h USB_DEVICEh]jp)}(h USB_DEVICEh]jv)}(hj,<h]h USB_DEVICE}(hj6<hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj2<ubah}(h]h ](jjeh"]h$]h&]jjuh1johj.<hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj*<hhhjI<hMubah}(h]j%<ah ](jjeh"]h$]h&]jj)jhuh1jhjI<hMhj'<hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj'<hhhjI<hMubeh}(h]h ](jmacroeh"]h$]h&]j jj jb<j jb<j j juh1j hhhjShjhNubh)}(h``USB_DEVICE (vend, prod)``h]j)}(hjh<h]hUSB_DEVICE (vend, prod)}(hjj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf<ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj6)}(h-macro used to describe a specific usb device h]h)}(h,macro used to describe a specific usb deviceh]h,macro used to describe a specific usb device}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj~<ubah}(h]h ]h"]h$]h&]uh1j6hj<hMhjShhubj)}(h**Parameters** ``vend`` the 16 bit USB Vendor ID ``prod`` the 16 bit USB Product ID **Description** This macro is used to create a struct usb_device_id that matches a specific device.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj<ubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hj<h]hvend}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj<ubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jThj<ubeh}(h]h ]h"]h$]h&]uh1j4hj<hMhj<ubj5)}(h#``prod`` the 16 bit USB Product ID h](j;)}(h``prod``h]j)}(hj<h]hprod}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj<ubjU)}(hhh]h)}(hthe 16 bit USB Product IDh]hthe 16 bit USB Product ID}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj =hMhj =ubah}(h]h ]h"]h$]h&]uh1jThj<ubeh}(h]h ]h"]h$]h&]uh1j4hj =hMhj<ubeh}(h]h ]h"]h$]h&]uh1j/hj<ubh)}(h**Description**h]j)}(hj0=h]h Description}(hj2=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.=ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj<ubh)}(hSThis macro is used to create a struct usb_device_id that matches a specific device.h]hSThis macro is used to create a struct usb_device_id that matches a specific device.}(hjF=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jUSB_DEVICE_VER (C macro)c.USB_DEVICE_VERhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_DEVICE_VERh]j)}(hUSB_DEVICE_VERh]jp)}(hUSB_DEVICE_VERh]jv)}(hjo=h]hUSB_DEVICE_VER}(hjy=hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhju=ubah}(h]h ](jjeh"]h$]h&]jjuh1johjq=hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjm=hhhj=hMubah}(h]jh=ah ](jjeh"]h$]h&]jj)jhuh1jhj=hMhjj=hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjj=hhhj=hMubeh}(h]h ](jmacroeh"]h$]h&]j jj j=j j=j j juh1j hhhjShjhNubh)}(h'``USB_DEVICE_VER (vend, prod, lo, hi)``h]j)}(hj=h]h#USB_DEVICE_VER (vend, prod, lo, hi)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj6)}(h4describe a specific usb device with a version range h]h)}(h3describe a specific usb device with a version rangeh]h3describe a specific usb device with a version range}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj=ubah}(h]h ]h"]h$]h&]uh1j6hj=hMhjShhubj)}(hX**Parameters** ``vend`` the 16 bit USB Vendor ID ``prod`` the 16 bit USB Product ID ``lo`` the bcdDevice_lo value ``hi`` the bcdDevice_hi value **Description** This macro is used to create a struct usb_device_id that matches a specific device, with a version range.h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj=ubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hj=h]hvend}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj=ubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jThj=ubeh}(h]h ]h"]h$]h&]uh1j4hj>hMhj=ubj5)}(h#``prod`` the 16 bit USB Product ID h](j;)}(h``prod``h]j)}(hj8>h]hprod}(hj:>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6>ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj2>ubjU)}(hhh]h)}(hthe 16 bit USB Product IDh]hthe 16 bit USB Product ID}(hjQ>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM>hMhjN>ubah}(h]h ]h"]h$]h&]uh1jThj2>ubeh}(h]h ]h"]h$]h&]uh1j4hjM>hMhj=ubj5)}(h``lo`` the bcdDevice_lo value h](j;)}(h``lo``h]j)}(hjq>h]hlo}(hjs>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo>ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjk>ubjU)}(hhh]h)}(hthe bcdDevice_lo valueh]hthe bcdDevice_lo value}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jThjk>ubeh}(h]h ]h"]h$]h&]uh1j4hj>hMhj=ubj5)}(h``hi`` the bcdDevice_hi value h](j;)}(h``hi``h]j)}(hj>h]hhi}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj>ubjU)}(hhh]h)}(hthe bcdDevice_hi valueh]hthe bcdDevice_hi value}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jThj>ubeh}(h]h ]h"]h$]h&]uh1j4hj>hMhj=ubeh}(h]h ]h"]h$]h&]uh1j/hj=ubh)}(h**Description**h]j)}(hj>h]h Description}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj=ubh)}(hiThis macro is used to create a struct usb_device_id that matches a specific device, with a version range.h]hiThis macro is used to create a struct usb_device_id that matches a specific device, with a version range.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$USB_DEVICE_INTERFACE_CLASS (C macro)c.USB_DEVICE_INTERFACE_CLASShNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_DEVICE_INTERFACE_CLASSh]j)}(hUSB_DEVICE_INTERFACE_CLASSh]jp)}(hUSB_DEVICE_INTERFACE_CLASSh]jv)}(hj$?h]hUSB_DEVICE_INTERFACE_CLASS}(hj.?hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*?ubah}(h]h ](jjeh"]h$]h&]jjuh1johj&?hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj"?hhhjA?hMubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhjA?hMhj?hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj?hhhjA?hMubeh}(h]h ](jmacroeh"]h$]h&]j jj jZ?j jZ?j j juh1j hhhjShjhNubh)}(h/``USB_DEVICE_INTERFACE_CLASS (vend, prod, cl)``h]j)}(hj`?h]h+USB_DEVICE_INTERFACE_CLASS (vend, prod, cl)}(hjb?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^?ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj6)}(h6describe a usb device with a specific interface class h]h)}(h5describe a usb device with a specific interface classh]h5describe a usb device with a specific interface class}(hjz?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjv?ubah}(h]h ]h"]h$]h&]uh1j6hj?hMhjShhubj)}(h**Parameters** ``vend`` the 16 bit USB Vendor ID ``prod`` the 16 bit USB Product ID ``cl`` bInterfaceClass value **Description** This macro is used to create a struct usb_device_id that matches a specific interface class of devices.h](h)}(h**Parameters**h]j)}(hj?h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj?ubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hj?h]hvend}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj?ubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jThj?ubeh}(h]h ]h"]h$]h&]uh1j4hj?hMhj?ubj5)}(h#``prod`` the 16 bit USB Product ID h](j;)}(h``prod``h]j)}(hj?h]hprod}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj?ubjU)}(hhh]h)}(hthe 16 bit USB Product IDh]hthe 16 bit USB Product ID}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1jThj?ubeh}(h]h ]h"]h$]h&]uh1j4hj@hMhj?ubj5)}(h``cl`` bInterfaceClass value h](j;)}(h``cl``h]j)}(hj&@h]hcl}(hj(@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$@ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj @ubjU)}(hhh]h)}(hbInterfaceClass valueh]hbInterfaceClass value}(hj?@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;@hMhj<@ubah}(h]h ]h"]h$]h&]uh1jThj @ubeh}(h]h ]h"]h$]h&]uh1j4hj;@hMhj?ubeh}(h]h ]h"]h$]h&]uh1j/hj?ubh)}(h**Description**h]j)}(hja@h]h Description}(hjc@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_@ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj?ubh)}(hgThis macro is used to create a struct usb_device_id that matches a specific interface class of devices.h]hgThis macro is used to create a struct usb_device_id that matches a specific interface class of devices.}(hjw@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'USB_DEVICE_INTERFACE_PROTOCOL (C macro)c.USB_DEVICE_INTERFACE_PROTOCOLhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_DEVICE_INTERFACE_PROTOCOLh]j)}(hUSB_DEVICE_INTERFACE_PROTOCOLh]jp)}(hUSB_DEVICE_INTERFACE_PROTOCOLh]jv)}(hj@h]hUSB_DEVICE_INTERFACE_PROTOCOL}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1johj@hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM ubah}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhj@hM ubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1jhj@hM hj@hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj@hhhj@hM ubeh}(h]h ](jmacroeh"]h$]h&]j jj j@j j@j j juh1j hhhjShjhNubh)}(h2``USB_DEVICE_INTERFACE_PROTOCOL (vend, prod, pr)``h]j)}(hj@h]h.USB_DEVICE_INTERFACE_PROTOCOL (vend, prod, pr)}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM hjShhubj6)}(h9describe a usb device with a specific interface protocol h]h)}(h8describe a usb device with a specific interface protocolh]h8describe a usb device with a specific interface protocol}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj@ubah}(h]h ]h"]h$]h&]uh1j6hjAhMhjShhubj)}(h**Parameters** ``vend`` the 16 bit USB Vendor ID ``prod`` the 16 bit USB Product ID ``pr`` bInterfaceProtocol value **Description** This macro is used to create a struct usb_device_id that matches a specific interface protocol of devices.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj Aubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hj0Ah]hvend}(hj2AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.Aubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj*AubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hjIAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEAhMhjFAubah}(h]h ]h"]h$]h&]uh1jThj*Aubeh}(h]h ]h"]h$]h&]uh1j4hjEAhMhj'Aubj5)}(h#``prod`` the 16 bit USB Product ID h](j;)}(h``prod``h]j)}(hjiAh]hprod}(hjkAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgAubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjcAubjU)}(hhh]h)}(hthe 16 bit USB Product IDh]hthe 16 bit USB Product ID}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~AhMhjAubah}(h]h ]h"]h$]h&]uh1jThjcAubeh}(h]h ]h"]h$]h&]uh1j4hj~AhMhj'Aubj5)}(h ``pr`` bInterfaceProtocol value h](j;)}(h``pr``h]j)}(hjAh]hpr}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjAubjU)}(hhh]h)}(hbInterfaceProtocol valueh]hbInterfaceProtocol value}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMhjAubah}(h]h ]h"]h$]h&]uh1jThjAubeh}(h]h ]h"]h$]h&]uh1j4hjAhMhj'Aubeh}(h]h ]h"]h$]h&]uh1j/hj Aubh)}(h**Description**h]j)}(hjAh]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj Aubh)}(hjThis macro is used to create a struct usb_device_id that matches a specific interface protocol of devices.h]hjThis macro is used to create a struct usb_device_id that matches a specific interface protocol of devices.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj Aubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%USB_DEVICE_INTERFACE_NUMBER (C macro)c.USB_DEVICE_INTERFACE_NUMBERhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_DEVICE_INTERFACE_NUMBERh]j)}(hUSB_DEVICE_INTERFACE_NUMBERh]jp)}(hUSB_DEVICE_INTERFACE_NUMBERh]jv)}(hjBh]hUSB_DEVICE_INTERFACE_NUMBER}(hj&BhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj"Bubah}(h]h ](jjeh"]h$]h&]jjuh1johjBhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjBhhhj9BhMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhj9BhMhjBhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjBhhhj9BhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jRBj jRBj j juh1j hhhjShjhNubh)}(h1``USB_DEVICE_INTERFACE_NUMBER (vend, prod, num)``h]j)}(hjXBh]h-USB_DEVICE_INTERFACE_NUMBER (vend, prod, num)}(hjZBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVBubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj6)}(h7describe a usb device with a specific interface number h]h)}(h6describe a usb device with a specific interface numberh]h6describe a usb device with a specific interface number}(hjrBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjnBubah}(h]h ]h"]h$]h&]uh1j6hjBhMhjShhubj)}(h**Parameters** ``vend`` the 16 bit USB Vendor ID ``prod`` the 16 bit USB Product ID ``num`` bInterfaceNumber value **Description** This macro is used to create a struct usb_device_id that matches a specific interface number of devices.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjBubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hjBh]hvend}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjBubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhMhjBubah}(h]h ]h"]h$]h&]uh1jThjBubeh}(h]h ]h"]h$]h&]uh1j4hjBhMhjBubj5)}(h#``prod`` the 16 bit USB Product ID h](j;)}(h``prod``h]j)}(hjBh]hprod}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjBubjU)}(hhh]h)}(hthe 16 bit USB Product IDh]hthe 16 bit USB Product ID}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhMhjBubah}(h]h ]h"]h$]h&]uh1jThjBubeh}(h]h ]h"]h$]h&]uh1j4hjBhMhjBubj5)}(h``num`` bInterfaceNumber value h](j;)}(h``num``h]j)}(hjCh]hnum}(hj ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjCubjU)}(hhh]h)}(hbInterfaceNumber valueh]hbInterfaceNumber value}(hj7ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ChMhj4Cubah}(h]h ]h"]h$]h&]uh1jThjCubeh}(h]h ]h"]h$]h&]uh1j4hj3ChMhjBubeh}(h]h ]h"]h$]h&]uh1j/hjBubh)}(h**Description**h]j)}(hjYCh]h Description}(hj[ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWCubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjBubh)}(hhThis macro is used to create a struct usb_device_id that matches a specific interface number of devices.h]hhThis macro is used to create a struct usb_device_id that matches a specific interface number of devices.}(hjoChhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jUSB_DEVICE_INFO (C macro)c.USB_DEVICE_INFOhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_DEVICE_INFOh]j)}(hUSB_DEVICE_INFOh]jp)}(hUSB_DEVICE_INFOh]jv)}(hjCh]hUSB_DEVICE_INFO}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjCubah}(h]h ](jjeh"]h$]h&]jjuh1johjChhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM*ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjChM*ubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhjChM*hjChhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjChhhjChM*ubeh}(h]h ](jmacroeh"]h$]h&]j jj jCj jCj j juh1j hhhjShjhNubh)}(h ``USB_DEVICE_INFO (cl, sc, pr)``h]j)}(hjCh]hUSB_DEVICE_INFO (cl, sc, pr)}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM,hjShhubj6)}(h.macro used to describe a class of usb devices h]h)}(h-macro used to describe a class of usb devicesh]h-macro used to describe a class of usb devices}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM"hjCubah}(h]h ]h"]h$]h&]uh1j6hjChM"hjShhubj)}(h**Parameters** ``cl`` bDeviceClass value ``sc`` bDeviceSubClass value ``pr`` bDeviceProtocol value **Description** This macro is used to create a struct usb_device_id that matches a specific class of devices.h](h)}(h**Parameters**h]j)}(hj Dh]h Parameters}(hj DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM&hjDubj0)}(hhh](j5)}(h``cl`` bDeviceClass value h](j;)}(h``cl``h]j)}(hj(Dh]hcl}(hj*DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&Dubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM#hj"DubjU)}(hhh]h)}(hbDeviceClass valueh]hbDeviceClass value}(hjADhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=DhM#hj>Dubah}(h]h ]h"]h$]h&]uh1jThj"Dubeh}(h]h ]h"]h$]h&]uh1j4hj=DhM#hjDubj5)}(h``sc`` bDeviceSubClass value h](j;)}(h``sc``h]j)}(hjaDh]hsc}(hjcDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_Dubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM$hj[DubjU)}(hhh]h)}(hbDeviceSubClass valueh]hbDeviceSubClass value}(hjzDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvDhM$hjwDubah}(h]h ]h"]h$]h&]uh1jThj[Dubeh}(h]h ]h"]h$]h&]uh1j4hjvDhM$hjDubj5)}(h``pr`` bDeviceProtocol value h](j;)}(h``pr``h]j)}(hjDh]hpr}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM%hjDubjU)}(hhh]h)}(hbDeviceProtocol valueh]hbDeviceProtocol value}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhM%hjDubah}(h]h ]h"]h$]h&]uh1jThjDubeh}(h]h ]h"]h$]h&]uh1j4hjDhM%hjDubeh}(h]h ]h"]h$]h&]uh1j/hjDubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM'hjDubh)}(h]This macro is used to create a struct usb_device_id that matches a specific class of devices.h]h]This macro is used to create a struct usb_device_id that matches a specific class of devices.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM'hjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jUSB_INTERFACE_INFO (C macro)c.USB_INTERFACE_INFOhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_INTERFACE_INFOh]j)}(hUSB_INTERFACE_INFOh]jp)}(hUSB_INTERFACE_INFOh]jv)}(hjEh]hUSB_INTERFACE_INFO}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubah}(h]h ](jjeh"]h$]h&]jjuh1johjEhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM9ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjEhhhj1EhM9ubah}(h]j Eah ](jjeh"]h$]h&]jj)jhuh1jhj1EhM9hjEhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjEhhhj1EhM9ubeh}(h]h ](jmacroeh"]h$]h&]j jj jJEj jJEj j juh1j hhhjShjhNubh)}(h#``USB_INTERFACE_INFO (cl, sc, pr)``h]j)}(hjPEh]hUSB_INTERFACE_INFO (cl, sc, pr)}(hjREhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNEubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM;hjShhubj6)}(h1macro used to describe a class of usb interfaces h]h)}(h0macro used to describe a class of usb interfacesh]h0macro used to describe a class of usb interfaces}(hjjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM1hjfEubah}(h]h ]h"]h$]h&]uh1j6hjxEhM1hjShhubj)}(h**Parameters** ``cl`` bInterfaceClass value ``sc`` bInterfaceSubClass value ``pr`` bInterfaceProtocol value **Description** This macro is used to create a struct usb_device_id that matches a specific class of interfaces.h](h)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM5hjEubj0)}(hhh](j5)}(h``cl`` bInterfaceClass value h](j;)}(h``cl``h]j)}(hjEh]hcl}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM2hjEubjU)}(hhh]h)}(hbInterfaceClass valueh]hbInterfaceClass value}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhM2hjEubah}(h]h ]h"]h$]h&]uh1jThjEubeh}(h]h ]h"]h$]h&]uh1j4hjEhM2hjEubj5)}(h ``sc`` bInterfaceSubClass value h](j;)}(h``sc``h]j)}(hjEh]hsc}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM3hjEubjU)}(hhh]h)}(hbInterfaceSubClass valueh]hbInterfaceSubClass value}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhM3hjEubah}(h]h ]h"]h$]h&]uh1jThjEubeh}(h]h ]h"]h$]h&]uh1j4hjEhM3hjEubj5)}(h ``pr`` bInterfaceProtocol value h](j;)}(h``pr``h]j)}(hjFh]hpr}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM4hjFubjU)}(hhh]h)}(hbInterfaceProtocol valueh]hbInterfaceProtocol value}(hj/FhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+FhM4hj,Fubah}(h]h ]h"]h$]h&]uh1jThjFubeh}(h]h ]h"]h$]h&]uh1j4hj+FhM4hjEubeh}(h]h ]h"]h$]h&]uh1j/hjEubh)}(h**Description**h]j)}(hjQFh]h Description}(hjSFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOFubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM6hjEubh)}(h`This macro is used to create a struct usb_device_id that matches a specific class of interfaces.h]h`This macro is used to create a struct usb_device_id that matches a specific class of interfaces.}(hjgFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM6hjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'USB_DEVICE_AND_INTERFACE_INFO (C macro)c.USB_DEVICE_AND_INTERFACE_INFOhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_DEVICE_AND_INTERFACE_INFOh]j)}(hUSB_DEVICE_AND_INTERFACE_INFOh]jp)}(hUSB_DEVICE_AND_INTERFACE_INFOh]jv)}(hjFh]hUSB_DEVICE_AND_INTERFACE_INFO}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjFubah}(h]h ](jjeh"]h$]h&]jjuh1johjFhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjFhhhjFhMMubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1j9hjFhMMhjFhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjFhhhjFhMMubeh}(h]h ](jmacroeh"]h$]h&]j jj jFj jFj j juh1j hhhjShjhNubh)}(h:``USB_DEVICE_AND_INTERFACE_INFO (vend, prod, cl, sc, pr)``h]j)}(hjFh]h6USB_DEVICE_AND_INTERFACE_INFO (vend, prod, cl, sc, pr)}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMOhjShhubj6)}(h>describe a specific usb device with a class of usb interfaces h]h)}(h=describe a specific usb device with a class of usb interfacesh]h=describe a specific usb device with a class of usb interfaces}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM@hjFubah}(h]h ]h"]h$]h&]uh1j6hjFhM@hjShhubj)}(hX**Parameters** ``vend`` the 16 bit USB Vendor ID ``prod`` the 16 bit USB Product ID ``cl`` bInterfaceClass value ``sc`` bInterfaceSubClass value ``pr`` bInterfaceProtocol value **Description** This macro is used to create a struct usb_device_id that matches a specific device with a specific class of interfaces. This is especially useful when explicitly matching devices that have vendor specific bDeviceClass values, but standards-compliant interfaces.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMDhjFubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hj Gh]hvend}(hj"GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMAhjGubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hj9GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5GhMAhj6Gubah}(h]h ]h"]h$]h&]uh1jThjGubeh}(h]h ]h"]h$]h&]uh1j4hj5GhMAhjGubj5)}(h#``prod`` the 16 bit USB Product ID h](j;)}(h``prod``h]j)}(hjYGh]hprod}(hj[GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWGubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMBhjSGubjU)}(hhh]h)}(hthe 16 bit USB Product IDh]hthe 16 bit USB Product ID}(hjrGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnGhMBhjoGubah}(h]h ]h"]h$]h&]uh1jThjSGubeh}(h]h ]h"]h$]h&]uh1j4hjnGhMBhjGubj5)}(h``cl`` bInterfaceClass value h](j;)}(h``cl``h]j)}(hjGh]hcl}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMChjGubjU)}(hhh]h)}(hbInterfaceClass valueh]hbInterfaceClass value}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMChjGubah}(h]h ]h"]h$]h&]uh1jThjGubeh}(h]h ]h"]h$]h&]uh1j4hjGhMChjGubj5)}(h ``sc`` bInterfaceSubClass value h](j;)}(h``sc``h]j)}(hjGh]hsc}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMDhjGubjU)}(hhh]h)}(hbInterfaceSubClass valueh]hbInterfaceSubClass value}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMDhjGubah}(h]h ]h"]h$]h&]uh1jThjGubeh}(h]h ]h"]h$]h&]uh1j4hjGhMDhjGubj5)}(h ``pr`` bInterfaceProtocol value h](j;)}(h``pr``h]j)}(hjHh]hpr}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMEhjGubjU)}(hhh]h)}(hbInterfaceProtocol valueh]hbInterfaceProtocol value}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhMEhjHubah}(h]h ]h"]h$]h&]uh1jThjGubeh}(h]h ]h"]h$]h&]uh1j4hjHhMEhjGubeh}(h]h ]h"]h$]h&]uh1j/hjFubh)}(h**Description**h]j)}(hj?Hh]h Description}(hjAHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Hubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMGhjFubh)}(hwThis macro is used to create a struct usb_device_id that matches a specific device with a specific class of interfaces.h]hwThis macro is used to create a struct usb_device_id that matches a specific device with a specific class of interfaces.}(hjUHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMGhjFubh)}(hThis is especially useful when explicitly matching devices that have vendor specific bDeviceClass values, but standards-compliant interfaces.h]hThis is especially useful when explicitly matching devices that have vendor specific bDeviceClass values, but standards-compliant interfaces.}(hjdHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMJhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'USB_VENDOR_AND_INTERFACE_INFO (C macro)c.USB_VENDOR_AND_INTERFACE_INFOhNtauh1jhjShhhjhNubj )}(hhh](j)}(hUSB_VENDOR_AND_INTERFACE_INFOh]j)}(hUSB_VENDOR_AND_INTERFACE_INFOh]jp)}(hUSB_VENDOR_AND_INTERFACE_INFOh]jv)}(hjHh]hUSB_VENDOR_AND_INTERFACE_INFO}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjHubah}(h]h ](jjeh"]h$]h&]jjuh1johjHhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMcubah}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhjHhMcubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjHhMchjHhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjHhhhjHhMcubeh}(h]h ](jmacroeh"]h$]h&]j jj jHj jHj j juh1j hhhjShjhNubh)}(h4``USB_VENDOR_AND_INTERFACE_INFO (vend, cl, sc, pr)``h]j)}(hjHh]h0USB_VENDOR_AND_INTERFACE_INFO (vend, cl, sc, pr)}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMehjShhubj6)}(h>describe a specific usb vendor with a class of usb interfaces h]h)}(h=describe a specific usb vendor with a class of usb interfacesh]h=describe a specific usb vendor with a class of usb interfaces}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMWhjHubah}(h]h ]h"]h$]h&]uh1j6hjHhMWhjShhubj)}(hX**Parameters** ``vend`` the 16 bit USB Vendor ID ``cl`` bInterfaceClass value ``sc`` bInterfaceSubClass value ``pr`` bInterfaceProtocol value **Description** This macro is used to create a struct usb_device_id that matches a specific vendor with a specific class of interfaces. This is especially useful when explicitly matching devices that have vendor specific bDeviceClass values, but standards-compliant interfaces.h](h)}(h**Parameters**h]j)}(hjHh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM[hjHubj0)}(hhh](j5)}(h"``vend`` the 16 bit USB Vendor ID h](j;)}(h``vend``h]j)}(hjIh]hvend}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMXhjIubjU)}(hhh]h)}(hthe 16 bit USB Vendor IDh]hthe 16 bit USB Vendor ID}(hj6IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2IhMXhj3Iubah}(h]h ]h"]h$]h&]uh1jThjIubeh}(h]h ]h"]h$]h&]uh1j4hj2IhMXhjIubj5)}(h``cl`` bInterfaceClass value h](j;)}(h``cl``h]j)}(hjVIh]hcl}(hjXIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTIubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMYhjPIubjU)}(hhh]h)}(hbInterfaceClass valueh]hbInterfaceClass value}(hjoIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkIhMYhjlIubah}(h]h ]h"]h$]h&]uh1jThjPIubeh}(h]h ]h"]h$]h&]uh1j4hjkIhMYhjIubj5)}(h ``sc`` bInterfaceSubClass value h](j;)}(h``sc``h]j)}(hjIh]hsc}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMZhjIubjU)}(hhh]h)}(hbInterfaceSubClass valueh]hbInterfaceSubClass value}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMZhjIubah}(h]h ]h"]h$]h&]uh1jThjIubeh}(h]h ]h"]h$]h&]uh1j4hjIhMZhjIubj5)}(h ``pr`` bInterfaceProtocol value h](j;)}(h``pr``h]j)}(hjIh]hpr}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM[hjIubjU)}(hhh]h)}(hbInterfaceProtocol valueh]hbInterfaceProtocol value}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM[hjIubah}(h]h ]h"]h$]h&]uh1jThjIubeh}(h]h ]h"]h$]h&]uh1j4hjIhM[hjIubeh}(h]h ]h"]h$]h&]uh1j/hjHubh)}(h**Description**h]j)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM]hjHubh)}(hwThis macro is used to create a struct usb_device_id that matches a specific vendor with a specific class of interfaces.h]hwThis macro is used to create a struct usb_device_id that matches a specific vendor with a specific class of interfaces.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM]hjHubh)}(hThis is especially useful when explicitly matching devices that have vendor specific bDeviceClass values, but standards-compliant interfaces.h]hThis is especially useful when explicitly matching devices that have vendor specific bDeviceClass values, but standards-compliant interfaces.}(hj(JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM`hjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_driver (C struct) c.usb_driverhNtauh1jhjShhhjhNubj )}(hhh](j)}(h usb_driverh]j)}(hstruct usb_driverh](j)}(hjh]hstruct}(hjWJhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjSJhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMfubj/)}(h h]h }(hjeJhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjSJhhhjdJhMfubjp)}(h usb_driverh]jv)}(hjQJh]h usb_driver}(hjwJhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsJubah}(h]h ](jjeh"]h$]h&]jjuh1johjSJhhhjdJhMfubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjOJhhhjdJhMfubah}(h]jJJah ](jjeh"]h$]h&]jj)jhuh1jhjdJhMfhjLJhhubj)}(hhh]h)}(h*identifies USB interface driver to usbcoreh]h*identifies USB interface driver to usbcore}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjJhhubah}(h]h ]h"]h$]h&]uh1jhjLJhhhjdJhMfubeh}(h]h ](jstructeh"]h$]h&]j jj jJj jJj j juh1j hhhjShjhNubj)}(hX<**Definition**:: struct usb_driver { const char *name; int (*probe) (struct usb_interface *intf, const struct usb_device_id *id); void (*disconnect) (struct usb_interface *intf); int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code, void *buf); int (*suspend) (struct usb_interface *intf, pm_message_t message); int (*resume) (struct usb_interface *intf); int (*reset_resume)(struct usb_interface *intf); int (*pre_reset)(struct usb_interface *intf); int (*post_reset)(struct usb_interface *intf); void (*shutdown)(struct usb_interface *intf); const struct usb_device_id *id_table; const struct attribute_group **dev_groups; struct usb_dynids dynids; struct device_driver driver; unsigned int no_dynamic_id:1; unsigned int supports_autosuspend:1; unsigned int disable_hub_initiated_lpm:1; unsigned int soft_unbind:1; }; **Members** ``name`` The driver name should be unique among USB drivers, and should normally be the same as the module name. ``probe`` Called to see if the driver is willing to manage a particular interface on a device. If it is, probe returns zero and uses usb_set_intfdata() to associate driver-specific data with the interface. It may also use usb_set_interface() to specify the appropriate altsetting. If unwilling to manage the interface, return -ENODEV, if genuine IO errors occurred, an appropriate negative errno value. ``disconnect`` Called when the interface is no longer accessible, usually because its device has been (or is being) disconnected or the driver module is being unloaded. ``unlocked_ioctl`` Used for drivers that want to talk to userspace through the "usbfs" filesystem. This lets devices provide ways to expose information to user space regardless of where they do (or don't) show up otherwise in the filesystem. ``suspend`` Called when the device is going to be suspended by the system either from system sleep or runtime suspend context. The return value will be ignored in system sleep context, so do NOT try to continue using the device if suspend fails in this case. Instead, let the resume or reset-resume routine recover from the failure. ``resume`` Called when the device is being resumed by the system. ``reset_resume`` Called when the suspended device has been reset instead of being resumed. ``pre_reset`` Called by usb_reset_device() when the device is about to be reset. This routine must not return until the driver has no active URBs for the device, and no more URBs may be submitted until the post_reset method is called. ``post_reset`` Called by usb_reset_device() after the device has been reset ``shutdown`` Called at shut-down time to quiesce the device. ``id_table`` USB drivers use ID table to support hotplugging. Export this with MODULE_DEVICE_TABLE(usb,...). This must be set or your driver's probe function will never get called. ``dev_groups`` Attributes attached to the device that will be created once it is bound to the driver. ``dynids`` used internally to hold the list of dynamically added device ids for this driver. ``driver`` The driver-model core driver structure. ``no_dynamic_id`` if set to 1, the USB core will not allow dynamic ids to be added to this driver by preventing the sysfs file from being created. ``supports_autosuspend`` if set to 0, the USB core will not allow autosuspend for interfaces bound to this driver. ``disable_hub_initiated_lpm`` if set to 1, the USB core will not allow hubs to initiate lower power link state transitions when an idle timeout occurs. Device-initiated USB 3.0 link PM will still be allowed. ``soft_unbind`` if set to 1, the USB core will not kill URBs and disable endpoints before calling the driver's disconnect method.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh:}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjJubj )}(hXzstruct usb_driver { const char *name; int (*probe) (struct usb_interface *intf, const struct usb_device_id *id); void (*disconnect) (struct usb_interface *intf); int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code, void *buf); int (*suspend) (struct usb_interface *intf, pm_message_t message); int (*resume) (struct usb_interface *intf); int (*reset_resume)(struct usb_interface *intf); int (*pre_reset)(struct usb_interface *intf); int (*post_reset)(struct usb_interface *intf); void (*shutdown)(struct usb_interface *intf); const struct usb_device_id *id_table; const struct attribute_group **dev_groups; struct usb_dynids dynids; struct device_driver driver; unsigned int no_dynamic_id:1; unsigned int supports_autosuspend:1; unsigned int disable_hub_initiated_lpm:1; unsigned int soft_unbind:1; };h]hXzstruct usb_driver { const char *name; int (*probe) (struct usb_interface *intf, const struct usb_device_id *id); void (*disconnect) (struct usb_interface *intf); int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code, void *buf); int (*suspend) (struct usb_interface *intf, pm_message_t message); int (*resume) (struct usb_interface *intf); int (*reset_resume)(struct usb_interface *intf); int (*pre_reset)(struct usb_interface *intf); int (*post_reset)(struct usb_interface *intf); void (*shutdown)(struct usb_interface *intf); const struct usb_device_id *id_table; const struct attribute_group **dev_groups; struct usb_dynids dynids; struct device_driver driver; unsigned int no_dynamic_id:1; unsigned int supports_autosuspend:1; unsigned int disable_hub_initiated_lpm:1; unsigned int soft_unbind:1; };}hjJsbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjJubh)}(h **Members**h]j)}(hjJh]hMembers}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjJubj0)}(hhh](j5)}(hq``name`` The driver name should be unique among USB drivers, and should normally be the same as the module name. h](j;)}(h``name``h]j)}(hjKh]hname}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjKubjU)}(hhh]h)}(hgThe driver name should be unique among USB drivers, and should normally be the same as the module name.h]hgThe driver name should be unique among USB drivers, and should normally be the same as the module name.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjKubah}(h]h ]h"]h$]h&]uh1jThjKubeh}(h]h ]h"]h$]h&]uh1j4hjKhMhjJubj5)}(hX``probe`` Called to see if the driver is willing to manage a particular interface on a device. If it is, probe returns zero and uses usb_set_intfdata() to associate driver-specific data with the interface. It may also use usb_set_interface() to specify the appropriate altsetting. If unwilling to manage the interface, return -ENODEV, if genuine IO errors occurred, an appropriate negative errno value. h](j;)}(h ``probe``h]j)}(hj@Kh]hprobe}(hjBKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Kubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:KubjU)}(hhh]h)}(hXCalled to see if the driver is willing to manage a particular interface on a device. If it is, probe returns zero and uses usb_set_intfdata() to associate driver-specific data with the interface. It may also use usb_set_interface() to specify the appropriate altsetting. If unwilling to manage the interface, return -ENODEV, if genuine IO errors occurred, an appropriate negative errno value.h]hXCalled to see if the driver is willing to manage a particular interface on a device. If it is, probe returns zero and uses usb_set_intfdata() to associate driver-specific data with the interface. It may also use usb_set_interface() to specify the appropriate altsetting. If unwilling to manage the interface, return -ENODEV, if genuine IO errors occurred, an appropriate negative errno value.}(hjYKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjVKubah}(h]h ]h"]h$]h&]uh1jThj:Kubeh}(h]h ]h"]h$]h&]uh1j4hjUKhMhjJubj5)}(h``disconnect`` Called when the interface is no longer accessible, usually because its device has been (or is being) disconnected or the driver module is being unloaded. h](j;)}(h``disconnect``h]j)}(hjzKh]h disconnect}(hj|KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxKubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjtKubjU)}(hhh]h)}(hCalled when the interface is no longer accessible, usually because its device has been (or is being) disconnected or the driver module is being unloaded.h]hCalled when the interface is no longer accessible, usually because its device has been (or is being) disconnected or the driver module is being unloaded.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjKubah}(h]h ]h"]h$]h&]uh1jThjtKubeh}(h]h ]h"]h$]h&]uh1j4hjKhMhjJubj5)}(h``unlocked_ioctl`` Used for drivers that want to talk to userspace through the "usbfs" filesystem. This lets devices provide ways to expose information to user space regardless of where they do (or don't) show up otherwise in the filesystem. h](j;)}(h``unlocked_ioctl``h]j)}(hjKh]hunlocked_ioctl}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjKubjU)}(hhh]h)}(hUsed for drivers that want to talk to userspace through the "usbfs" filesystem. This lets devices provide ways to expose information to user space regardless of where they do (or don't) show up otherwise in the filesystem.h]hUsed for drivers that want to talk to userspace through the “usbfs” filesystem. This lets devices provide ways to expose information to user space regardless of where they do (or don’t) show up otherwise in the filesystem.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjKubah}(h]h ]h"]h$]h&]uh1jThjKubeh}(h]h ]h"]h$]h&]uh1j4hjKhMhjJubj5)}(hXM``suspend`` Called when the device is going to be suspended by the system either from system sleep or runtime suspend context. The return value will be ignored in system sleep context, so do NOT try to continue using the device if suspend fails in this case. Instead, let the resume or reset-resume routine recover from the failure. h](j;)}(h ``suspend``h]j)}(hjKh]hsuspend}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjKubjU)}(hhh]h)}(hX@Called when the device is going to be suspended by the system either from system sleep or runtime suspend context. The return value will be ignored in system sleep context, so do NOT try to continue using the device if suspend fails in this case. Instead, let the resume or reset-resume routine recover from the failure.h]hX@Called when the device is going to be suspended by the system either from system sleep or runtime suspend context. The return value will be ignored in system sleep context, so do NOT try to continue using the device if suspend fails in this case. Instead, let the resume or reset-resume routine recover from the failure.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjLubah}(h]h ]h"]h$]h&]uh1jThjKubeh}(h]h ]h"]h$]h&]uh1j4hjLhMhjJubj5)}(hB``resume`` Called when the device is being resumed by the system. h](j;)}(h ``resume``h]j)}(hj(Lh]hresume}(hj*LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&Lubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj"LubjU)}(hhh]h)}(h6Called when the device is being resumed by the system.h]h6Called when the device is being resumed by the system.}(hjALhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=LhMhj>Lubah}(h]h ]h"]h$]h&]uh1jThj"Lubeh}(h]h ]h"]h$]h&]uh1j4hj=LhMhjJubj5)}(h[``reset_resume`` Called when the suspended device has been reset instead of being resumed. h](j;)}(h``reset_resume``h]j)}(hjaLh]h reset_resume}(hjcLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_Lubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj[LubjU)}(hhh]h)}(hICalled when the suspended device has been reset instead of being resumed.h]hICalled when the suspended device has been reset instead of being resumed.}(hjzLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjwLubah}(h]h ]h"]h$]h&]uh1jThj[Lubeh}(h]h ]h"]h$]h&]uh1j4hjvLhMhjJubj5)}(h``pre_reset`` Called by usb_reset_device() when the device is about to be reset. This routine must not return until the driver has no active URBs for the device, and no more URBs may be submitted until the post_reset method is called. h](j;)}(h ``pre_reset``h]j)}(hjLh]h pre_reset}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjLubjU)}(hhh]h)}(hCalled by usb_reset_device() when the device is about to be reset. This routine must not return until the driver has no active URBs for the device, and no more URBs may be submitted until the post_reset method is called.h]hCalled by usb_reset_device() when the device is about to be reset. This routine must not return until the driver has no active URBs for the device, and no more URBs may be submitted until the post_reset method is called.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjLubah}(h]h ]h"]h$]h&]uh1jThjLubeh}(h]h ]h"]h$]h&]uh1j4hjLhMhjJubj5)}(hL``post_reset`` Called by usb_reset_device() after the device has been reset h](j;)}(h``post_reset``h]j)}(hjLh]h post_reset}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjLubjU)}(hhh]h)}(hCalled when the device is going to be suspended by the system.h]h>Called when the device is going to be suspended by the system.}(hj*QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&QhMhj'Qubah}(h]h ]h"]h$]h&]uh1jThj Qubeh}(h]h ]h"]h$]h&]uh1j4hj&QhMhj!Pubj5)}(hB``resume`` Called when the device is being resumed by the system. h](j;)}(h ``resume``h]j)}(hjJQh]hresume}(hjLQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHQubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjDQubjU)}(hhh]h)}(h6Called when the device is being resumed by the system.h]h6Called when the device is being resumed by the system.}(hjcQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_QhMhj`Qubah}(h]h ]h"]h$]h&]uh1jThjDQubeh}(h]h ]h"]h$]h&]uh1j4hj_QhMhj!Pubj5)}(h``choose_configuration`` If non-NULL, called instead of the default usb_choose_configuration(). If this returns an error then we'll go on to call the normal usb_choose_configuration(). h](j;)}(h``choose_configuration``h]j)}(hjQh]hchoose_configuration}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj}QubjU)}(hhh]h)}(hIf non-NULL, called instead of the default usb_choose_configuration(). If this returns an error then we'll go on to call the normal usb_choose_configuration().h]hIf non-NULL, called instead of the default usb_choose_configuration(). If this returns an error then we’ll go on to call the normal usb_choose_configuration().}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjQubah}(h]h ]h"]h$]h&]uh1jThj}Qubeh}(h]h ]h"]h$]h&]uh1j4hjQhMhj!Pubj5)}(hf``dev_groups`` Attributes attached to the device that will be created once it is bound to the driver. h](j;)}(h``dev_groups``h]j)}(hjQh]h dev_groups}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjQubjU)}(hhh]h)}(hVAttributes attached to the device that will be created once it is bound to the driver.h]hVAttributes attached to the device that will be created once it is bound to the driver.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjQubah}(h]h ]h"]h$]h&]uh1jThjQubeh}(h]h ]h"]h$]h&]uh1j4hjQhMhj!Pubj5)}(h3``driver`` The driver-model core driver structure. h](j;)}(h ``driver``h]j)}(hjQh]hdriver}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjQubjU)}(hhh]h)}(h'The driver-model core driver structure.h]h'The driver-model core driver structure.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj RhMhj Rubah}(h]h ]h"]h$]h&]uh1jThjQubeh}(h]h ]h"]h$]h&]uh1j4hj RhMhj!Pubj5)}(hW``id_table`` used with **match\(\)** to select better matching driver at probe() time. h](j;)}(h ``id_table``h]j)}(hj0Rh]hid_table}(hj2RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.Rubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj*RubjU)}(hhh]h)}(hIused with **match\(\)** to select better matching driver at probe() time.h](h used with }(hjIRhhhNhNubj)}(h **match\(\)**h]h match()}(hjQRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIRubh2 to select better matching driver at probe() time.}(hjIRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjFRubah}(h]h ]h"]h$]h&]uh1jThj*Rubeh}(h]h ]h"]h$]h&]uh1j4hjERhMhj!Pubj5)}(hp``supports_autosuspend`` if set to 0, the USB core will not allow autosuspend for devices bound to this driver. h](j;)}(h``supports_autosuspend``h]j)}(hj|Rh]hsupports_autosuspend}(hj~RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzRubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjvRubjU)}(hhh]h)}(hVif set to 0, the USB core will not allow autosuspend for devices bound to this driver.h]hVif set to 0, the USB core will not allow autosuspend for devices bound to this driver.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjRubah}(h]h ]h"]h$]h&]uh1jThjvRubeh}(h]h ]h"]h$]h&]uh1j4hjRhMhj!Pubj5)}(h``generic_subclass`` if set to 1, the generic USB driver's probe, disconnect, resume and suspend functions will be called in addition to the driver's own, so this part of the setup does not need to be replicated.h](j;)}(h``generic_subclass``h]j)}(hjRh]hgeneric_subclass}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjRubjU)}(hhh]h)}(hif set to 1, the generic USB driver's probe, disconnect, resume and suspend functions will be called in addition to the driver's own, so this part of the setup does not need to be replicated.h]hif set to 1, the generic USB driver’s probe, disconnect, resume and suspend functions will be called in addition to the driver’s own, so this part of the setup does not need to be replicated.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjRubah}(h]h ]h"]h$]h&]uh1jThjRubeh}(h]h ]h"]h$]h&]uh1j4hjRhMhj!Pubeh}(h]h ]h"]h$]h&]uh1j/hjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h**Description**h]j)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXUSB drivers must provide all the fields listed above except driver, match, and id_table.h]hXUSB drivers must provide all the fields listed above except driver, match, and id_table.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_class_driver (C struct)c.usb_class_driverhNtauh1jhjShhhjhNubj )}(hhh](j)}(husb_class_driverh]j)}(hstruct usb_class_driverh](j)}(hjh]hstruct}(hj7ShhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj3ShhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hjEShhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj3ShhhjDShMubjp)}(husb_class_driverh]jv)}(hj1Sh]husb_class_driver}(hjWShhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjSSubah}(h]h ](jjeh"]h$]h&]jjuh1johj3ShhhjDShMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj/ShhhjDShMubah}(h]j*Sah ](jjeh"]h$]h&]jj)jhuh1jhjDShMhj,Shhubj)}(hhh]h)}(h>identifies a USB driver that wants to use the USB major numberh]h>identifies a USB driver that wants to use the USB major number}(hjyShhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjvShhubah}(h]h ]h"]h$]h&]uh1jhj,ShhhjDShMubeh}(h]h ](jstructeh"]h$]h&]j jj jSj jSj j juh1j hhhjShjhNubj)}(hX**Definition**:: struct usb_class_driver { char *name; char *(*devnode)(const struct device *dev, umode_t *mode); const struct file_operations *fops; int minor_base; }; **Members** ``name`` the usb class device name for this driver. Will show up in sysfs. ``devnode`` Callback to provide a naming hint for a possible device node to create. ``fops`` pointer to the struct file_operations of this driver. ``minor_base`` the start of the minor range for this driver.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh:}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjSubj )}(hstruct usb_class_driver { char *name; char *(*devnode)(const struct device *dev, umode_t *mode); const struct file_operations *fops; int minor_base; };h]hstruct usb_class_driver { char *name; char *(*devnode)(const struct device *dev, umode_t *mode); const struct file_operations *fops; int minor_base; };}hjSsbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjSubh)}(h **Members**h]j)}(hjSh]hMembers}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM#hjSubj0)}(hhh](j5)}(hL``name`` the usb class device name for this driver. Will show up in sysfs. h](j;)}(h``name``h]j)}(hjSh]hname}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjSubjU)}(hhh]h)}(hBthe usb class device name for this driver. Will show up in sysfs.h]hBthe usb class device name for this driver. Will show up in sysfs.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jThjSubeh}(h]h ]h"]h$]h&]uh1j4hjShMhjSubj5)}(hT``devnode`` Callback to provide a naming hint for a possible device node to create. h](j;)}(h ``devnode``h]j)}(hjTh]hdevnode}(hj!ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjTubjU)}(hhh]h)}(hGCallback to provide a naming hint for a possible device node to create.h]hGCallback to provide a naming hint for a possible device node to create.}(hj8ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj5Tubah}(h]h ]h"]h$]h&]uh1jThjTubeh}(h]h ]h"]h$]h&]uh1j4hj4ThMhjSubj5)}(h?``fops`` pointer to the struct file_operations of this driver. h](j;)}(h``fops``h]j)}(hjYTh]hfops}(hj[ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWTubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjSTubjU)}(hhh]h)}(h5pointer to the struct file_operations of this driver.h]h5pointer to the struct file_operations of this driver.}(hjrThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnThMhjoTubah}(h]h ]h"]h$]h&]uh1jThjSTubeh}(h]h ]h"]h$]h&]uh1j4hjnThMhjSubj5)}(h<``minor_base`` the start of the minor range for this driver.h](j;)}(h``minor_base``h]j)}(hjTh]h minor_base}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjTubjU)}(hhh]h)}(h-the start of the minor range for this driver.h]h-the start of the minor range for this driver.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjTubah}(h]h ]h"]h$]h&]uh1jThjTubeh}(h]h ]h"]h$]h&]uh1j4hjThMhjSubeh}(h]h ]h"]h$]h&]uh1j/hjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h**Description**h]j)}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hThis structure is used for the usb_register_dev() and usb_deregister_dev() functions, to consolidate a number of the parameters used for them.h]hThis structure is used for the usb_register_dev() and usb_deregister_dev() functions, to consolidate a number of the parameters used for them.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jmodule_usb_driver (C macro)c.module_usb_driverhNtauh1jhjShhhjhNubj )}(hhh](j)}(hmodule_usb_driverh]j)}(hmodule_usb_driverh]jp)}(hmodule_usb_driverh]jv)}(hj Uh]hmodule_usb_driver}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubah}(h]h ](jjeh"]h$]h&]jjuh1johjUhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM=ubah}(h]h ]h"]h$]h&]jjjuh1jjjhj Uhhhj*UhM=ubah}(h]jUah ](jjeh"]h$]h&]jj)jhuh1jhj*UhM=hjUhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjUhhhj*UhM=ubeh}(h]h ](jmacroeh"]h$]h&]j jj jCUj jCUj j juh1j hhhjShjhNubh)}(h$``module_usb_driver (__usb_driver)``h]j)}(hjIUh]h module_usb_driver (__usb_driver)}(hjKUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGUubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM?hjShhubj6)}(h*Helper macro for registering a USB driver h]h)}(h)Helper macro for registering a USB driverh]h)Helper macro for registering a USB driver}(hjcUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM6hj_Uubah}(h]h ]h"]h$]h&]uh1j6hjqUhM6hjShhubj)}(hX!**Parameters** ``__usb_driver`` usb_driver struct **Description** Helper macro for USB drivers which do not do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it replaces module_init() and module_exit()h](h)}(h**Parameters**h]j)}(hj~Uh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|Uubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM:hjxUubj0)}(hhh]j5)}(h#``__usb_driver`` usb_driver struct h](j;)}(h``__usb_driver``h]j)}(hjUh]h __usb_driver}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM7hjUubjU)}(hhh]h)}(husb_driver structh]husb_driver struct}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM7hjUubah}(h]h ]h"]h$]h&]uh1jThjUubeh}(h]h ]h"]h$]h&]uh1j4hjUhM7hjUubah}(h]h ]h"]h$]h&]uh1j/hjxUubh)}(h**Description**h]j)}(hjUh]h Description}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM9hjxUubh)}(hHelper macro for USB drivers which do not do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it replaces module_init() and module_exit()h]hHelper macro for USB drivers which do not do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it replaces module_init() and module_exit()}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM9hjxUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jurb (C struct)c.urbhNtauh1jhjShhhjhNubj )}(hhh](j)}(hurbh]j)}(h struct urbh](j)}(hjh]hstruct}(hjVhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjVhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM@ubj/)}(h h]h }(hj+VhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjVhhhj*VhM@ubjp)}(hurbh]jv)}(hjVh]hurb}(hj=VhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9Vubah}(h]h ](jjeh"]h$]h&]jjuh1johjVhhhj*VhM@ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjVhhhj*VhM@ubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1jhj*VhM@hjVhhubj)}(hhh]h)}(hUSB Request Blockh]hUSB Request Block}(hj_VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj\Vhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhj*VhM@ubeh}(h]h ](jstructeh"]h$]h&]j jj jwVj jwVj j juh1j hhhjShjhNubj)}(hX**Definition**:: struct urb { struct list_head urb_list; struct list_head anchor_list; struct usb_anchor *anchor; struct usb_device *dev; struct usb_host_endpoint *ep; unsigned int pipe; unsigned int stream_id; int status; unsigned int transfer_flags; void *transfer_buffer; dma_addr_t transfer_dma; struct scatterlist *sg; int num_mapped_sgs; int num_sgs; u32 transfer_buffer_length; u32 actual_length; unsigned char *setup_packet; dma_addr_t setup_dma; int start_frame; int number_of_packets; int interval; int error_count; void *context; usb_complete_t complete; struct usb_iso_packet_descriptor iso_frame_desc[]; }; **Members** ``urb_list`` For use by current owner of the URB. ``anchor_list`` membership in the list of an anchor ``anchor`` to anchor URBs to a common mooring ``dev`` Identifies the USB device to perform the request. ``ep`` Points to the endpoint's data structure. Will eventually replace **pipe**. ``pipe`` Holds endpoint number, direction, type, and more. Create these values with the eight macros available; usb_{snd,rcv}TYPEpipe(dev,endpoint), where the TYPE is "ctrl" (control), "bulk", "int" (interrupt), or "iso" (isochronous). For example usb_sndbulkpipe() or usb_rcvintpipe(). Endpoint numbers range from zero to fifteen. Note that "in" endpoint two is a different endpoint (and pipe) from "out" endpoint two. The current configuration controls the existence, type, and maximum packet size of any given endpoint. ``stream_id`` the endpoint's stream ID for bulk streams ``status`` This is read in non-iso completion functions to get the status of the particular request. ISO requests only use it to tell whether the URB was unlinked; detailed status for each frame is in the fields of the iso_frame-desc. ``transfer_flags`` A variety of flags may be used to affect how URB submission, unlinking, or operation are handled. Different kinds of URB can use different flags. ``transfer_buffer`` This identifies the buffer to (or from) which the I/O request will be performed unless URB_NO_TRANSFER_DMA_MAP is set (however, do not leave garbage in transfer_buffer even then). This buffer must be suitable for DMA; allocate it with kmalloc() or equivalent. For transfers to "in" endpoints, contents of this buffer will be modified. This buffer is used for the data stage of control transfers. ``transfer_dma`` When transfer_flags includes URB_NO_TRANSFER_DMA_MAP, the device driver is saying that it provided this DMA address, which the host controller driver should use in preference to the transfer_buffer. ``sg`` scatter gather buffer list, the buffer size of each element in the list (except the last) must be divisible by the endpoint's max packet size if no_sg_constraint isn't set in 'struct usb_bus' ``num_mapped_sgs`` (internal) number of mapped sg entries ``num_sgs`` number of entries in the sg list ``transfer_buffer_length`` How big is transfer_buffer. The transfer may be broken up into chunks according to the current maximum packet size for the endpoint, which is a function of the configuration and is encoded in the pipe. When the length is zero, neither transfer_buffer nor transfer_dma is used. ``actual_length`` This is read in non-iso completion functions, and it tells how many bytes (out of transfer_buffer_length) were transferred. It will normally be the same as requested, unless either an error was reported or a short read was performed. The URB_SHORT_NOT_OK transfer flag may be used to make such short reads be reported as errors. ``setup_packet`` Only used for control transfers, this points to eight bytes of setup data. Control transfers always start by sending this data to the device. Then transfer_buffer is read or written, if needed. ``setup_dma`` DMA pointer for the setup packet. The caller must not use this field; setup_packet must point to a valid buffer. ``start_frame`` Returns the initial frame for isochronous transfers. ``number_of_packets`` Lists the number of ISO transfer buffers. ``interval`` Specifies the polling interval for interrupt or isochronous transfers. The units are frames (milliseconds) for full and low speed devices, and microframes (1/8 millisecond) for highspeed and SuperSpeed devices. ``error_count`` Returns the number of ISO transfers that reported errors. ``context`` For use in completion functions. This normally points to request-specific driver context. ``complete`` Completion handler. This URB is passed as the parameter to the completion function. The completion function may then do what it likes with the URB, including resubmitting or freeing it. ``iso_frame_desc`` Used to provide arrays of ISO transfer buffers and to collect the transfer status for each buffer.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh:}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj{Vubj )}(hXstruct urb { struct list_head urb_list; struct list_head anchor_list; struct usb_anchor *anchor; struct usb_device *dev; struct usb_host_endpoint *ep; unsigned int pipe; unsigned int stream_id; int status; unsigned int transfer_flags; void *transfer_buffer; dma_addr_t transfer_dma; struct scatterlist *sg; int num_mapped_sgs; int num_sgs; u32 transfer_buffer_length; u32 actual_length; unsigned char *setup_packet; dma_addr_t setup_dma; int start_frame; int number_of_packets; int interval; int error_count; void *context; usb_complete_t complete; struct usb_iso_packet_descriptor iso_frame_desc[]; };h]hXstruct urb { struct list_head urb_list; struct list_head anchor_list; struct usb_anchor *anchor; struct usb_device *dev; struct usb_host_endpoint *ep; unsigned int pipe; unsigned int stream_id; int status; unsigned int transfer_flags; void *transfer_buffer; dma_addr_t transfer_dma; struct scatterlist *sg; int num_mapped_sgs; int num_sgs; u32 transfer_buffer_length; u32 actual_length; unsigned char *setup_packet; dma_addr_t setup_dma; int start_frame; int number_of_packets; int interval; int error_count; void *context; usb_complete_t complete; struct usb_iso_packet_descriptor iso_frame_desc[]; };}hjVsbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj{Vubh)}(h **Members**h]j)}(hjVh]hMembers}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj{Vubj0)}(hhh](j5)}(h2``urb_list`` For use by current owner of the URB. h](j;)}(h ``urb_list``h]j)}(hjVh]hurb_list}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjVubjU)}(hhh]h)}(h$For use by current owner of the URB.h]h$For use by current owner of the URB.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jThjVubeh}(h]h ]h"]h$]h&]uh1j4hjVhMhjVubj5)}(h4``anchor_list`` membership in the list of an anchor h](j;)}(h``anchor_list``h]j)}(hjWh]h anchor_list}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjVubjU)}(hhh]h)}(h#membership in the list of an anchorh]h#membership in the list of an anchor}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jThjVubeh}(h]h ]h"]h$]h&]uh1j4hjWhMhjVubj5)}(h.``anchor`` to anchor URBs to a common mooring h](j;)}(h ``anchor``h]j)}(hj>Wh]hanchor}(hj@WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubjU)}(hhh]h)}(hbUsed to provide arrays of ISO transfer buffers and to collect the transfer status for each buffer.h]hbUsed to provide arrays of ISO transfer buffers and to collect the transfer status for each buffer.}(hj]\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjY\hMhjZ\ubah}(h]h ]h"]h$]h&]uh1jThj>\ubeh}(h]h ]h"]h$]h&]uh1j4hjY\hMhjVubeh}(h]h ]h"]h$]h&]uh1j/hj{Vubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubh)}(h**Description**h]j)}(hj\h]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXLThis structure identifies USB transfer requests. URBs must be allocated by calling usb_alloc_urb() and freed with a call to usb_free_urb(). Initialization may be done using various usb_fill_*_urb() functions. URBs are submitted using usb_submit_urb(), and pending requests may be canceled using usb_unlink_urb() or usb_kill_urb().h]hXLThis structure identifies USB transfer requests. URBs must be allocated by calling usb_alloc_urb() and freed with a call to usb_free_urb(). Initialization may be done using various usb_fill_*_urb() functions. URBs are submitted using usb_submit_urb(), and pending requests may be canceled using usb_unlink_urb() or usb_kill_urb().}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hData Transfer Buffers:h]hData Transfer Buffers:}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXNormally drivers provide I/O buffers allocated with kmalloc() or otherwise taken from the general page pool. That is provided by transfer_buffer (control requests also use setup_packet), and host controller drivers perform a dma mapping (and unmapping) for each buffer transferred. Those mapping operations can be expensive on some platforms (perhaps using a dma bounce buffer or talking to an IOMMU), although they're cheap on commodity x86 and ppc hardware.h]hXNormally drivers provide I/O buffers allocated with kmalloc() or otherwise taken from the general page pool. That is provided by transfer_buffer (control requests also use setup_packet), and host controller drivers perform a dma mapping (and unmapping) for each buffer transferred. Those mapping operations can be expensive on some platforms (perhaps using a dma bounce buffer or talking to an IOMMU), although they’re cheap on commodity x86 and ppc hardware.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXAlternatively, drivers may pass the URB_NO_TRANSFER_DMA_MAP transfer flag, which tells the host controller driver that no such mapping is needed for the transfer_buffer since the device driver is DMA-aware. For example, a device driver might allocate a DMA buffer with usb_alloc_coherent() or call usb_buffer_map(). When this transfer flag is provided, host controller drivers will attempt to use the dma address found in the transfer_dma field rather than determining a dma address themselves.h]hXAlternatively, drivers may pass the URB_NO_TRANSFER_DMA_MAP transfer flag, which tells the host controller driver that no such mapping is needed for the transfer_buffer since the device driver is DMA-aware. For example, a device driver might allocate a DMA buffer with usb_alloc_coherent() or call usb_buffer_map(). When this transfer flag is provided, host controller drivers will attempt to use the dma address found in the transfer_dma field rather than determining a dma address themselves.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXNote that transfer_buffer must still be set if the controller does not support DMA (as indicated by hcd_uses_dma()) and when talking to root hub. If you have to transfer between highmem zone and the device on such controller, create a bounce buffer or bail out with an error. If transfer_buffer cannot be set (is in highmem) and the controller is DMA capable, assign NULL to it, so that usbmon knows not to use the value. The setup_packet must always be set, so it cannot be located in highmem.h]hXNote that transfer_buffer must still be set if the controller does not support DMA (as indicated by hcd_uses_dma()) and when talking to root hub. If you have to transfer between highmem zone and the device on such controller, create a bounce buffer or bail out with an error. If transfer_buffer cannot be set (is in highmem) and the controller is DMA capable, assign NULL to it, so that usbmon knows not to use the value. The setup_packet must always be set, so it cannot be located in highmem.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hInitialization:h]hInitialization:}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXGAll URBs submitted must initialize the dev, pipe, transfer_flags (may be zero), and complete fields. All URBs must also initialize transfer_buffer and transfer_buffer_length. They may provide the URB_SHORT_NOT_OK transfer flag, indicating that short reads are to be treated as errors; that flag is invalid for write requests.h]hXGAll URBs submitted must initialize the dev, pipe, transfer_flags (may be zero), and complete fields. All URBs must also initialize transfer_buffer and transfer_buffer_length. They may provide the URB_SHORT_NOT_OK transfer flag, indicating that short reads are to be treated as errors; that flag is invalid for write requests.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hBulk URBs may use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers should always terminate with a short packet, even if it means adding an extra zero length packet.h]hBulk URBs may use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers should always terminate with a short packet, even if it means adding an extra zero length packet.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hControl URBs must provide a valid pointer in the setup_packet field. Unlike the transfer_buffer, the setup_packet may not be mapped for DMA beforehand.h]hControl URBs must provide a valid pointer in the setup_packet field. Unlike the transfer_buffer, the setup_packet may not be mapped for DMA beforehand.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXInterrupt URBs must provide an interval, saying how often (in milliseconds or, for highspeed devices, 125 microsecond units) to poll for transfers. After the URB has been submitted, the interval field reflects how the transfer was actually scheduled. The polling interval may be more frequent than requested. For example, some controllers have a maximum interval of 32 milliseconds, while others support intervals of up to 1024 milliseconds. Isochronous URBs also have transfer intervals. (Note that for isochronous endpoints, as well as high speed interrupt endpoints, the encoding of the transfer interval in the endpoint descriptor is logarithmic. Device drivers must convert that value to linear units themselves.)h]hXInterrupt URBs must provide an interval, saying how often (in milliseconds or, for highspeed devices, 125 microsecond units) to poll for transfers. After the URB has been submitted, the interval field reflects how the transfer was actually scheduled. The polling interval may be more frequent than requested. For example, some controllers have a maximum interval of 32 milliseconds, while others support intervals of up to 1024 milliseconds. Isochronous URBs also have transfer intervals. (Note that for isochronous endpoints, as well as high speed interrupt endpoints, the encoding of the transfer interval in the endpoint descriptor is logarithmic. Device drivers must convert that value to linear units themselves.)}(hj#]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hXIf an isochronous endpoint queue isn't already running, the host controller will schedule a new URB to start as soon as bandwidth utilization allows. If the queue is running then a new URB will be scheduled to start in the first transfer slot following the end of the preceding URB, if that slot has not already expired. If the slot has expired (which can happen when IRQ delivery is delayed for a long time), the scheduling behavior depends on the URB_ISO_ASAP flag. If the flag is clear then the URB will be scheduled to start in the expired slot, implying that some of its packets will not be transferred; if the flag is set then the URB will be scheduled in the first unexpired slot, breaking the queue's synchronization. Upon URB completion, the start_frame field will be set to the (micro)frame number in which the transfer was scheduled. Ranges for frame counter values are HC-specific and can go from as low as 256 to as high as 65536 frames.h]hXIf an isochronous endpoint queue isn’t already running, the host controller will schedule a new URB to start as soon as bandwidth utilization allows. If the queue is running then a new URB will be scheduled to start in the first transfer slot following the end of the preceding URB, if that slot has not already expired. If the slot has expired (which can happen when IRQ delivery is delayed for a long time), the scheduling behavior depends on the URB_ISO_ASAP flag. If the flag is clear then the URB will be scheduled to start in the expired slot, implying that some of its packets will not be transferred; if the flag is set then the URB will be scheduled in the first unexpired slot, breaking the queue’s synchronization. Upon URB completion, the start_frame field will be set to the (micro)frame number in which the transfer was scheduled. Ranges for frame counter values are HC-specific and can go from as low as 256 to as high as 65536 frames.}(hj2]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hX4Isochronous URBs have a different data transfer model, in part because the quality of service is only "best effort". Callers provide specially allocated URBs, with number_of_packets worth of iso_frame_desc structures at the end. Each such packet is an individual ISO transfer. Isochronous URBs are normally queued, submitted by drivers to arrange that transfers are at least double buffered, and then explicitly resubmitted in completion handlers, so that data (such as audio or video) streams at as constant a rate as the host controller scheduler can support.h]hX8Isochronous URBs have a different data transfer model, in part because the quality of service is only “best effort”. Callers provide specially allocated URBs, with number_of_packets worth of iso_frame_desc structures at the end. Each such packet is an individual ISO transfer. Isochronous URBs are normally queued, submitted by drivers to arrange that transfers are at least double buffered, and then explicitly resubmitted in completion handlers, so that data (such as audio or video) streams at as constant a rate as the host controller scheduler can support.}(hjA]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjShhubh)}(hCompletion Callbacks:h]hCompletion Callbacks:}(hjP]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM(hjShhubh)}(hXQThe completion callback is made in_interrupt(), and one of the first things that a completion handler should do is check the status field. The status field is provided for all URBs. It is used to report unlinked URBs, and status for all non-ISO transfers. It should not be examined before the URB is returned to the completion handler.h]hXQThe completion callback is made in_interrupt(), and one of the first things that a completion handler should do is check the status field. The status field is provided for all URBs. It is used to report unlinked URBs, and status for all non-ISO transfers. It should not be examined before the URB is returned to the completion handler.}(hj_]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM*hjShhubh)}(h]The context field is normally used to link URBs back to the relevant driver or request state.h]h]The context field is normally used to link URBs back to the relevant driver or request state.}(hjn]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM0hjShhubh)}(hWhen the completion callback is invoked for non-isochronous URBs, the actual_length field tells how many bytes were transferred. This field is updated even when the URB terminated with an error or was unlinked.h]hWhen the completion callback is invoked for non-isochronous URBs, the actual_length field tells how many bytes were transferred. This field is updated even when the URB terminated with an error or was unlinked.}(hj}]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM3hjShhubh)}(hXISO transfer status is reported in the status and actual_length fields of the iso_frame_desc array, and the number of errors is reported in error_count. Completion callbacks for ISO transfers will normally (re)submit URBs to ensure a constant transfer rate.h]hXISO transfer status is reported in the status and actual_length fields of the iso_frame_desc array, and the number of errors is reported in error_count. Completion callbacks for ISO transfers will normally (re)submit URBs to ensure a constant transfer rate.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM7hjShhubh)}(hNote that even fields marked "public" should not be touched by the driver when the urb is owned by the hcd, that is, since the call to usb_submit_urb() till the entry into the completion routine.h]hNote that even fields marked “public” should not be touched by the driver when the urb is owned by the hcd, that is, since the call to usb_submit_urb() till the entry into the completion routine.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM<hjShhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_fill_control_urb (C function)c.usb_fill_control_urbhNtauh1jhjShhhjhNubj )}(hhh](j)}(hvoid usb_fill_control_urb (struct urb *urb, struct usb_device *dev, unsigned int pipe, unsigned char *setup_packet, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context)h]j)}(hvoid usb_fill_control_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, unsigned char *setup_packet, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context)h](j@)}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj]hhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj]hhhj]hMubjp)}(husb_fill_control_urbh]jv)}(husb_fill_control_urbh]husb_fill_control_urb}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1johj]hhhj]hMubj)}(h(struct urb *urb, struct usb_device *dev, unsigned int pipe, unsigned char *setup_packet, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context)h](j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj^hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj]ubj/)}(h h]h }(hj ^hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj]ubh)}(hhh]jv)}(hurbh]hurb}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj ^modnameN classnameNj8j;)}j>]jA)}j4j]sbc.usb_fill_control_urbasbuh1hhj]ubj/)}(h h]h }(hj>^hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj]ubj_)}(hjbh]h*}(hjL^hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj]ubjv)}(hurbh]hurb}(hjY^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjr^hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjn^ubj/)}(h h]h }(hj^hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjn^ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj^modnameN classnameNj8j;)}j>]j:^c.usb_fill_control_urbasbuh1hhjn^ubj/)}(h h]h }(hj^hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjn^ubj_)}(hjbh]h*}(hj^hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjn^ubjv)}(hdevh]hdev}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjn^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hj^hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj^ubj/)}(h h]h }(hj^hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj^ubj@)}(hinth]hint}(hj^hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj^ubj/)}(h h]h }(hj _hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj^ubjv)}(hpipeh]hpipe}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hunsigned char *setup_packeth](j@)}(hunsignedh]hunsigned}(hj3_hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj/_ubj/)}(h h]h }(hjA_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj/_ubj@)}(hcharh]hchar}(hjO_hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj/_ubj/)}(h h]h }(hj]_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj/_ubj_)}(hjbh]h*}(hjk_hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj/_ubjv)}(h setup_packeth]h setup_packet}(hjx_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj/_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hvoid *transfer_bufferh](j@)}(hvoidh]hvoid}(hj_hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj_ubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_ubj_)}(hjbh]h*}(hj_hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj_ubjv)}(htransfer_bufferh]htransfer_buffer}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hint buffer_lengthh](j@)}(hinth]hint}(hj_hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj_ubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_ubjv)}(h buffer_lengthh]h buffer_length}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(husb_complete_t complete_fnh](h)}(hhh]jv)}(husb_complete_th]husb_complete_t}(hj `hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj `modnameN classnameNj8j;)}j>]j:^c.usb_fill_control_urbasbuh1hhj`ubj/)}(h h]h }(hj)`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj`ubjv)}(h complete_fnh]h complete_fn}(hj7`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(h void *contexth](j@)}(hvoidh]hvoid}(hjP`hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjL`ubj/)}(h h]h }(hj^`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjL`ubj_)}(hjbh]h*}(hjl`hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjL`ubjv)}(hcontexth]hcontext}(hjy`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjL`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhj]hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhj]hMubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhj]hMhj]hhubj)}(hhh]h)}(hinitializes a control urbh]hinitializes a control urb}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMjhj`hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j`j j`j j juh1j hhhjShjhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to the urb to initialize. ``struct usb_device *dev`` pointer to the struct usb_device for this urb. ``unsigned int pipe`` the endpoint pipe ``unsigned char *setup_packet`` pointer to the setup_packet buffer. The buffer must be suitable for DMA. ``void *transfer_buffer`` pointer to the transfer buffer. The buffer must be suitable for DMA. ``int buffer_length`` length of the transfer buffer ``usb_complete_t complete_fn`` pointer to the usb_complete_t function ``void *context`` what to set the urb context to. **Description** Initializes a control urb with the proper information needed to submit it to a device. The transfer buffer and the setup_packet buffer will most likely be filled or read via DMA. The simplest way to get a buffer that can be DMAed to is allocating it via kmalloc() or equivalent, even for very small buffers. If the buffers are embedded in a bigger structure, there is a risk that the buffer itself, the previous fields and/or the next fields are corrupted due to cache incoherencies; or slowed down if they are evicted from the cache. For more information, check :c:type:`struct urb `.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMnhj`ubj0)}(hhh](j5)}(h6``struct urb *urb`` pointer to the urb to initialize. h](j;)}(h``struct urb *urb``h]j)}(hj`h]hstruct urb *urb}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMkhj`ubjU)}(hhh]h)}(h!pointer to the urb to initialize.h]h!pointer to the urb to initialize.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hMkhj`ubah}(h]h ]h"]h$]h&]uh1jThj`ubeh}(h]h ]h"]h$]h&]uh1j4hj`hMkhj`ubj5)}(hJ``struct usb_device *dev`` pointer to the struct usb_device for this urb. h](j;)}(h``struct usb_device *dev``h]j)}(hjah]hstruct usb_device *dev}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMlhjaubjU)}(hhh]h)}(h.pointer to the struct usb_device for this urb.h]h.pointer to the struct usb_device for this urb.}(hj6ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ahMlhj3aubah}(h]h ]h"]h$]h&]uh1jThjaubeh}(h]h ]h"]h$]h&]uh1j4hj2ahMlhj`ubj5)}(h(``unsigned int pipe`` the endpoint pipe h](j;)}(h``unsigned int pipe``h]j)}(hjVah]hunsigned int pipe}(hjXahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTaubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMmhjPaubjU)}(hhh]h)}(hthe endpoint pipeh]hthe endpoint pipe}(hjoahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkahMmhjlaubah}(h]h ]h"]h$]h&]uh1jThjPaubeh}(h]h ]h"]h$]h&]uh1j4hjkahMmhj`ubj5)}(hi``unsigned char *setup_packet`` pointer to the setup_packet buffer. The buffer must be suitable for DMA. h](j;)}(h``unsigned char *setup_packet``h]j)}(hjah]hunsigned char *setup_packet}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMohjaubjU)}(hhh]h)}(hHpointer to the setup_packet buffer. The buffer must be suitable for DMA.h]hHpointer to the setup_packet buffer. The buffer must be suitable for DMA.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMnhjaubah}(h]h ]h"]h$]h&]uh1jThjaubeh}(h]h ]h"]h$]h&]uh1j4hjahMohj`ubj5)}(h_``void *transfer_buffer`` pointer to the transfer buffer. The buffer must be suitable for DMA. h](j;)}(h``void *transfer_buffer``h]j)}(hjah]hvoid *transfer_buffer}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMqhjaubjU)}(hhh]h)}(hDpointer to the transfer buffer. The buffer must be suitable for DMA.h]hDpointer to the transfer buffer. The buffer must be suitable for DMA.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMphjaubah}(h]h ]h"]h$]h&]uh1jThjaubeh}(h]h ]h"]h$]h&]uh1j4hjahMqhj`ubj5)}(h4``int buffer_length`` length of the transfer buffer h](j;)}(h``int buffer_length``h]j)}(hjbh]hint buffer_length}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMrhjaubjU)}(hhh]h)}(hlength of the transfer bufferh]hlength of the transfer buffer}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMrhjbubah}(h]h ]h"]h$]h&]uh1jThjaubeh}(h]h ]h"]h$]h&]uh1j4hjbhMrhj`ubj5)}(hF``usb_complete_t complete_fn`` pointer to the usb_complete_t function h](j;)}(h``usb_complete_t complete_fn``h]j)}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:bubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMshj6bubjU)}(hhh]h)}(h&pointer to the usb_complete_t functionh]h&pointer to the usb_complete_t function}(hjUbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQbhMshjRbubah}(h]h ]h"]h$]h&]uh1jThj6bubeh}(h]h ]h"]h$]h&]uh1j4hjQbhMshj`ubj5)}(h2``void *context`` what to set the urb context to. h](j;)}(h``void *context``h]j)}(hjubh]h void *context}(hjwbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsbubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMthjobubjU)}(hhh]h)}(hwhat to set the urb context to.h]hwhat to set the urb context to.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMthjbubah}(h]h ]h"]h$]h&]uh1jThjobubeh}(h]h ]h"]h$]h&]uh1j4hjbhMthj`ubeh}(h]h ]h"]h$]h&]uh1j/hj`ubh)}(h**Description**h]j)}(hjbh]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMvhj`ubh)}(hVInitializes a control urb with the proper information needed to submit it to a device.h]hVInitializes a control urb with the proper information needed to submit it to a device.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMvhj`ubh)}(hXThe transfer buffer and the setup_packet buffer will most likely be filled or read via DMA. The simplest way to get a buffer that can be DMAed to is allocating it via kmalloc() or equivalent, even for very small buffers. If the buffers are embedded in a bigger structure, there is a risk that the buffer itself, the previous fields and/or the next fields are corrupted due to cache incoherencies; or slowed down if they are evicted from the cache. For more information, check :c:type:`struct urb `.h](hXThe transfer buffer and the setup_packet buffer will most likely be filled or read via DMA. The simplest way to get a buffer that can be DMAed to is allocating it via kmalloc() or equivalent, even for very small buffers. If the buffers are embedded in a bigger structure, there is a risk that the buffer itself, the previous fields and/or the next fields are corrupted due to cache incoherencies; or slowed down if they are evicted from the cache. For more information, check }(hjbhhhNhNubh)}(h:c:type:`struct urb `h]j)}(hjbh]h struct urb}(hjbhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]refdocdriver-api/usb/usb refdomainjreftypetype refexplicitrefwarnj8j;)}j>]sb reftargeturbuh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMyhjbubh.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjchMyhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_fill_bulk_urb (C function)c.usb_fill_bulk_urbhNtauh1jhjShhhjhNubj )}(hhh](j)}(hvoid usb_fill_bulk_urb (struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context)h]j)}(hvoid usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context)h](j@)}(hvoidh]hvoid}(hj-chhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj)chhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hj]jA)}j4jPcsbc.usb_fill_bulk_urbasbuh1hhjfcubj/)}(h h]h }(hjchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjfcubj_)}(hjbh]h*}(hjchhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjfcubjv)}(hurbh]hurb}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjfcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubj)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjchhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjcubj/)}(h h]h }(hjchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjcubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjcubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjcmodnameN classnameNj8j;)}j>]jcc.usb_fill_bulk_urbasbuh1hhjcubj/)}(h h]h }(hjdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjcubj_)}(hjbh]h*}(hj&dhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjcubjv)}(hdevh]hdev}(hj3dhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hjLdhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjHdubj/)}(h h]h }(hjZdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjHdubj@)}(hinth]hint}(hjhdhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjHdubj/)}(h h]h }(hjvdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjHdubjv)}(hpipeh]hpipe}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjHdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubj)}(hvoid *transfer_bufferh](j@)}(hvoidh]hvoid}(hjdhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjdubj/)}(h h]h }(hjdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjdubj_)}(hjbh]h*}(hjdhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjdubjv)}(htransfer_bufferh]htransfer_buffer}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubj)}(hint buffer_lengthh](j@)}(hinth]hint}(hjdhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjdubj/)}(h h]h }(hjdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjdubjv)}(h buffer_lengthh]h buffer_length}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubj)}(husb_complete_t complete_fnh](h)}(hhh]jv)}(husb_complete_th]husb_complete_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjeubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjemodnameN classnameNj8j;)}j>]jcc.usb_fill_bulk_urbasbuh1hhjeubj/)}(h h]h }(hj5ehhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjeubjv)}(h complete_fnh]h complete_fn}(hjCehhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubj)}(h void *contexth](j@)}(hvoidh]hvoid}(hj\ehhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjXeubj/)}(h h]h }(hjjehhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjXeubj_)}(hjbh]h*}(hjxehhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjXeubjv)}(hcontexth]hcontext}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjXeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbcubeh}(h]h ]h"]h$]h&]jjuh1jhj)chhhj;chMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%chhhj;chMubah}(h]j cah ](jjeh"]h$]h&]jj)jhuh1jhj;chMhj"chhubj)}(hhh]h)}(h#macro to help initialize a bulk urbh]h#macro to help initialize a bulk urb}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjehhubah}(h]h ]h"]h$]h&]uh1jhj"chhhj;chMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jej jej j juh1j hhhjShjhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to the urb to initialize. ``struct usb_device *dev`` pointer to the struct usb_device for this urb. ``unsigned int pipe`` the endpoint pipe ``void *transfer_buffer`` pointer to the transfer buffer. The buffer must be suitable for DMA. ``int buffer_length`` length of the transfer buffer ``usb_complete_t complete_fn`` pointer to the usb_complete_t function ``void *context`` what to set the urb context to. **Description** Initializes a bulk urb with the proper information needed to submit it to a device. Refer to usb_fill_control_urb() for a description of the requirements for transfer_buffer.h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjeubj0)}(hhh](j5)}(h6``struct urb *urb`` pointer to the urb to initialize. h](j;)}(h``struct urb *urb``h]j)}(hjeh]hstruct urb *urb}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjeubjU)}(hhh]h)}(h!pointer to the urb to initialize.h]h!pointer to the urb to initialize.}(hj fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1jThjeubeh}(h]h ]h"]h$]h&]uh1j4hjfhMhjeubj5)}(hJ``struct usb_device *dev`` pointer to the struct usb_device for this urb. h](j;)}(h``struct usb_device *dev``h]j)}(hj)fh]hstruct usb_device *dev}(hj+fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'fubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj#fubjU)}(hhh]h)}(h.pointer to the struct usb_device for this urb.h]h.pointer to the struct usb_device for this urb.}(hjBfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>fhMhj?fubah}(h]h ]h"]h$]h&]uh1jThj#fubeh}(h]h ]h"]h$]h&]uh1j4hj>fhMhjeubj5)}(h(``unsigned int pipe`` the endpoint pipe h](j;)}(h``unsigned int pipe``h]j)}(hjbfh]hunsigned int pipe}(hjdfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`fubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj\fubjU)}(hhh]h)}(hthe endpoint pipeh]hthe endpoint pipe}(hj{fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwfhMhjxfubah}(h]h ]h"]h$]h&]uh1jThj\fubeh}(h]h ]h"]h$]h&]uh1j4hjwfhMhjeubj5)}(h_``void *transfer_buffer`` pointer to the transfer buffer. The buffer must be suitable for DMA. h](j;)}(h``void *transfer_buffer``h]j)}(hjfh]hvoid *transfer_buffer}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjfubjU)}(hhh]h)}(hDpointer to the transfer buffer. The buffer must be suitable for DMA.h]hDpointer to the transfer buffer. The buffer must be suitable for DMA.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjfubah}(h]h ]h"]h$]h&]uh1jThjfubeh}(h]h ]h"]h$]h&]uh1j4hjfhMhjeubj5)}(h4``int buffer_length`` length of the transfer buffer h](j;)}(h``int buffer_length``h]j)}(hjfh]hint buffer_length}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjfubjU)}(hhh]h)}(hlength of the transfer bufferh]hlength of the transfer buffer}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1jThjfubeh}(h]h ]h"]h$]h&]uh1j4hjfhMhjeubj5)}(hF``usb_complete_t complete_fn`` pointer to the usb_complete_t function h](j;)}(h``usb_complete_t complete_fn``h]j)}(hjgh]husb_complete_t complete_fn}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj gubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjgubjU)}(hhh]h)}(h&pointer to the usb_complete_t functionh]h&pointer to the usb_complete_t function}(hj'ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#ghMhj$gubah}(h]h ]h"]h$]h&]uh1jThjgubeh}(h]h ]h"]h$]h&]uh1j4hj#ghMhjeubj5)}(h2``void *context`` what to set the urb context to. h](j;)}(h``void *context``h]j)}(hjGgh]h void *context}(hjIghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEgubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjAgubjU)}(hhh]h)}(hwhat to set the urb context to.h]hwhat to set the urb context to.}(hj`ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\ghMhj]gubah}(h]h ]h"]h$]h&]uh1jThjAgubeh}(h]h ]h"]h$]h&]uh1j4hj\ghMhjeubeh}(h]h ]h"]h$]h&]uh1j/hjeubh)}(h**Description**h]j)}(hjgh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjeubh)}(hSInitializes a bulk urb with the proper information needed to submit it to a device.h]hSInitializes a bulk urb with the proper information needed to submit it to a device.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjeubh)}(hZRefer to usb_fill_control_urb() for a description of the requirements for transfer_buffer.h]hZRefer to usb_fill_control_urb() for a description of the requirements for transfer_buffer.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_fill_int_urb (C function)c.usb_fill_int_urbhNtauh1jhjShhhjhNubj )}(hhh](j)}(hvoid usb_fill_int_urb (struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context, int interval)h]j)}(hvoid usb_fill_int_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context, int interval)h](j@)}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjghhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjghhhjghMubjp)}(husb_fill_int_urbh]jv)}(husb_fill_int_urbh]husb_fill_int_urb}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjgubah}(h]h ](jjeh"]h$]h&]jjuh1johjghhhjghMubj)}(h(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context, int interval)h](j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjhhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhubj/)}(h h]h }(hj hhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubh)}(hhh]jv)}(hurbh]hurb}(hj1hhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj.hubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj3hmodnameN classnameNj8j;)}j>]jA)}j4jgsbc.usb_fill_int_urbasbuh1hhjhubj/)}(h h]h }(hjQhhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubj_)}(hjbh]h*}(hj_hhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhubjv)}(hurbh]hurb}(hjlhhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjhhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhubj/)}(h h]h }(hjhhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjhmodnameN classnameNj8j;)}j>]jMhc.usb_fill_int_urbasbuh1hhjhubj/)}(h h]h }(hjhhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubj_)}(hjbh]h*}(hjhhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhubjv)}(hdevh]hdev}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hjhhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubj@)}(hinth]hint}(hjihhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhubjv)}(hpipeh]hpipe}(hj-ihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(hvoid *transfer_bufferh](j@)}(hvoidh]hvoid}(hjFihhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjBiubj/)}(h h]h }(hjTihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjBiubj_)}(hjbh]h*}(hjbihhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjBiubjv)}(htransfer_bufferh]htransfer_buffer}(hjoihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjBiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(hint buffer_lengthh](j@)}(hinth]hint}(hjihhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjiubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjiubjv)}(h buffer_lengthh]h buffer_length}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(husb_complete_t complete_fnh](h)}(hhh]jv)}(husb_complete_th]husb_complete_t}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjimodnameN classnameNj8j;)}j>]jMhc.usb_fill_int_urbasbuh1hhjiubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjiubjv)}(h complete_fnh]h complete_fn}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(h void *contexth](j@)}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjjubj/)}(h h]h }(hjjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjjubj_)}(hjbh]h*}(hj!jhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjjubjv)}(hcontexth]hcontext}(hj.jhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubj)}(h int intervalh](j@)}(hinth]hint}(hjGjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjCjubj/)}(h h]h }(hjUjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjCjubjv)}(hintervalh]hinterval}(hjcjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjCjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj hubeh}(h]h ]h"]h$]h&]jjuh1jhjghhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjghhhjghMubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjghMhjghhubj)}(hhh]h)}(h(macro to help initialize a interrupt urbh]h(macro to help initialize a interrupt urb}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jjj jjj j juh1j hhhjShjhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to the urb to initialize. ``struct usb_device *dev`` pointer to the struct usb_device for this urb. ``unsigned int pipe`` the endpoint pipe ``void *transfer_buffer`` pointer to the transfer buffer. The buffer must be suitable for DMA. ``int buffer_length`` length of the transfer buffer ``usb_complete_t complete_fn`` pointer to the usb_complete_t function ``void *context`` what to set the urb context to. ``int interval`` what to set the urb interval to, encoded like the endpoint descriptor's bInterval value. **Description** Initializes a interrupt urb with the proper information needed to submit it to a device. Refer to usb_fill_control_urb() for a description of the requirements for transfer_buffer. Note that High Speed and SuperSpeed(+) interrupt endpoints use a logarithmic encoding of the endpoint interval, and express polling intervals in microframes (eight per millisecond) rather than in frames (one per millisecond).h](h)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjubj0)}(hhh](j5)}(h6``struct urb *urb`` pointer to the urb to initialize. h](j;)}(h``struct urb *urb``h]j)}(hjjh]hstruct urb *urb}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjubjU)}(hhh]h)}(h!pointer to the urb to initialize.h]h!pointer to the urb to initialize.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjjubah}(h]h ]h"]h$]h&]uh1jThjjubeh}(h]h ]h"]h$]h&]uh1j4hjjhMhjjubj5)}(hJ``struct usb_device *dev`` pointer to the struct usb_device for this urb. h](j;)}(h``struct usb_device *dev``h]j)}(hjkh]hstruct usb_device *dev}(hj khhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjkubjU)}(hhh]h)}(h.pointer to the struct usb_device for this urb.h]h.pointer to the struct usb_device for this urb.}(hj khhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjkubah}(h]h ]h"]h$]h&]uh1jThjkubeh}(h]h ]h"]h$]h&]uh1j4hjkhMhjjubj5)}(h(``unsigned int pipe`` the endpoint pipe h](j;)}(h``unsigned int pipe``h]j)}(hj@kh]hunsigned int pipe}(hjBkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>kubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhj:kubjU)}(hhh]h)}(hthe endpoint pipeh]hthe endpoint pipe}(hjYkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUkhMhjVkubah}(h]h ]h"]h$]h&]uh1jThj:kubeh}(h]h ]h"]h$]h&]uh1j4hjUkhMhjjubj5)}(h_``void *transfer_buffer`` pointer to the transfer buffer. The buffer must be suitable for DMA. h](j;)}(h``void *transfer_buffer``h]j)}(hjykh]hvoid *transfer_buffer}(hj{khhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwkubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjskubjU)}(hhh]h)}(hDpointer to the transfer buffer. The buffer must be suitable for DMA.h]hDpointer to the transfer buffer. The buffer must be suitable for DMA.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjkubah}(h]h ]h"]h$]h&]uh1jThjskubeh}(h]h ]h"]h$]h&]uh1j4hjkhMhjjubj5)}(h4``int buffer_length`` length of the transfer buffer h](j;)}(h``int buffer_length``h]j)}(hjkh]hint buffer_length}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjkubjU)}(hhh]h)}(hlength of the transfer bufferh]hlength of the transfer buffer}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjkubah}(h]h ]h"]h$]h&]uh1jThjkubeh}(h]h ]h"]h$]h&]uh1j4hjkhMhjjubj5)}(hF``usb_complete_t complete_fn`` pointer to the usb_complete_t function h](j;)}(h``usb_complete_t complete_fn``h]j)}(hjkh]husb_complete_t complete_fn}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjkubjU)}(hhh]h)}(h&pointer to the usb_complete_t functionh]h&pointer to the usb_complete_t function}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMhjlubah}(h]h ]h"]h$]h&]uh1jThjkubeh}(h]h ]h"]h$]h&]uh1j4hjlhMhjjubj5)}(h2``void *context`` what to set the urb context to. h](j;)}(h``void *context``h]j)}(hj%lh]h void *context}(hj'lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#lubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjlubjU)}(hhh]h)}(hwhat to set the urb context to.h]hwhat to set the urb context to.}(hj>lhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:lhMhj;lubah}(h]h ]h"]h$]h&]uh1jThjlubeh}(h]h ]h"]h$]h&]uh1j4hj:lhMhjjubj5)}(hj``int interval`` what to set the urb interval to, encoded like the endpoint descriptor's bInterval value. h](j;)}(h``int interval``h]j)}(hj^lh]h int interval}(hj`lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\lubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjXlubjU)}(hhh]h)}(hXwhat to set the urb interval to, encoded like the endpoint descriptor's bInterval value.h]hZwhat to set the urb interval to, encoded like the endpoint descriptor’s bInterval value.}(hjwlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjtlubah}(h]h ]h"]h$]h&]uh1jThjXlubeh}(h]h ]h"]h$]h&]uh1j4hjslhMhjjubeh}(h]h ]h"]h$]h&]uh1j/hjjubh)}(h**Description**h]j)}(hjlh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjubh)}(hXInitializes a interrupt urb with the proper information needed to submit it to a device.h]hXInitializes a interrupt urb with the proper information needed to submit it to a device.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjubh)}(hZRefer to usb_fill_control_urb() for a description of the requirements for transfer_buffer.h]hZRefer to usb_fill_control_urb() for a description of the requirements for transfer_buffer.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjubh)}(hNote that High Speed and SuperSpeed(+) interrupt endpoints use a logarithmic encoding of the endpoint interval, and express polling intervals in microframes (eight per millisecond) rather than in frames (one per millisecond).h]hNote that High Speed and SuperSpeed(+) interrupt endpoints use a logarithmic encoding of the endpoint interval, and express polling intervals in microframes (eight per millisecond) rather than in frames (one per millisecond).}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_urb_dir_in (C function)c.usb_urb_dir_inhNtauh1jhjShhhjhNubj )}(hhh](j)}(h$int usb_urb_dir_in (struct urb *urb)h]j)}(h#int usb_urb_dir_in(struct urb *urb)h](j@)}(hinth]hint}(hjlhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjlhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM ubj/)}(h h]h }(hj mhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjlhhhj mhM ubjp)}(husb_urb_dir_inh]jv)}(husb_urb_dir_inh]husb_urb_dir_in}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjmubah}(h]h ](jjeh"]h$]h&]jjuh1johjlhhhj mhM ubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj:mhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj6mubj/)}(h h]h }(hjGmhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj6mubh)}(hhh]jv)}(hurbh]hurb}(hjXmhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUmubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjZmmodnameN classnameNj8j;)}j>]jA)}j4j msbc.usb_urb_dir_inasbuh1hhj6mubj/)}(h h]h }(hjxmhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj6mubj_)}(hjbh]h*}(hjmhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj6mubjv)}(hurbh]hurb}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj6mubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2mubah}(h]h ]h"]h$]h&]jjuh1jhjlhhhj mhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhj mhM ubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhj mhM hjlhhubj)}(hhh]h)}(h(check if an URB describes an IN transferh]h(check if an URB describes an IN transfer}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjmhhubah}(h]h ]h"]h$]h&]uh1jhjlhhhj mhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jmj jmj j juh1j hhhjShjhNubj)}(h**Parameters** ``struct urb *urb`` URB to be checked **Return** 1 if **urb** describes an IN transfer (device-to-host), otherwise 0.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhM hjmubj0)}(hhh]j5)}(h&``struct urb *urb`` URB to be checked h](j;)}(h``struct urb *urb``h]j)}(hjmh]hstruct urb *urb}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjmubjU)}(hhh]h)}(hURB to be checkedh]hURB to be checked}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMhjnubah}(h]h ]h"]h$]h&]uh1jThjmubeh}(h]h ]h"]h$]h&]uh1j4hjnhMhjmubah}(h]h ]h"]h$]h&]uh1j/hjmubh)}(h **Return**h]j)}(hj9nh]hReturn}(hj;nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7nubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjmubh)}(hD1 if **urb** describes an IN transfer (device-to-host), otherwise 0.h](h1 if }(hjOnhhhNhNubj)}(h**urb**h]hurb}(hjWnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOnubh8 describes an IN transfer (device-to-host), otherwise 0.}(hjOnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_urb_dir_out (C function)c.usb_urb_dir_outhNtauh1jhjShhhjhNubj )}(hhh](j)}(h%int usb_urb_dir_out (struct urb *urb)h]j)}(h$int usb_urb_dir_out(struct urb *urb)h](j@)}(hinth]hint}(hjnhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjnhhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hjnhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjnhhhjnhMubjp)}(husb_urb_dir_outh]jv)}(husb_urb_dir_outh]husb_urb_dir_out}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjnubah}(h]h ](jjeh"]h$]h&]jjuh1johjnhhhjnhMubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjnhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjnubj/)}(h h]h }(hjnhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjnubh)}(hhh]jv)}(hurbh]hurb}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjnubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjnmodnameN classnameNj8j;)}j>]jA)}j4jnsbc.usb_urb_dir_outasbuh1hhjnubj/)}(h h]h }(hj ohhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjnubj_)}(hjbh]h*}(hjohhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjnubjv)}(hurbh]hurb}(hj&ohhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubah}(h]h ]h"]h$]h&]jjuh1jhjnhhhjnhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjnhMhjnhhubj)}(hhh]h)}(h)check if an URB describes an OUT transferh]h)check if an URB describes an OUT transfer}(hjPohhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjMohhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjnhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jhoj jhoj j juh1j hhhjShjhNubj)}(h**Parameters** ``struct urb *urb`` URB to be checked **Return** 1 if **urb** describes an OUT transfer (host-to-device), otherwise 0.h](h)}(h**Parameters**h]j)}(hjroh]h Parameters}(hjtohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpoubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjloubj0)}(hhh]j5)}(h&``struct urb *urb`` URB to be checked h](j;)}(h``struct urb *urb``h]j)}(hjoh]hstruct urb *urb}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1j:hW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjoubjU)}(hhh]h)}(hURB to be checkedh]hURB to be checked}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMhjoubah}(h]h ]h"]h$]h&]uh1jThjoubeh}(h]h ]h"]h$]h&]uh1j4hjohMhjoubah}(h]h ]h"]h$]h&]uh1j/hjloubh)}(h **Return**h]j)}(hjoh]hReturn}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjloubh)}(hE1 if **urb** describes an OUT transfer (host-to-device), otherwise 0.h](h1 if }(hjohhhNhNubj)}(h**urb**h]hurb}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh9 describes an OUT transfer (host-to-device), otherwise 0.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhjloubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_sg_request (C struct)c.usb_sg_requesthNtauh1jhjShhhjhNubj )}(hhh](j)}(husb_sg_requesth]j)}(hstruct usb_sg_requesth](j)}(hjh]hstruct}(hj#phhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjphhhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMubj/)}(h h]h }(hj1phhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjphhhj0phMubjp)}(husb_sg_requesth]jv)}(hjph]husb_sg_request}(hjCphhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj?pubah}(h]h ](jjeh"]h$]h&]jjuh1johjphhhj0phMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhj0phMubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhj0phMhjphhubj)}(hhh]h)}(hsupport for scatter/gather I/Oh]hsupport for scatter/gather I/O}(hjephhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMhhjbphhubah}(h]h ]h"]h$]h&]uh1jhjphhhj0phMubeh}(h]h ](jstructeh"]h$]h&]j jj j}pj j}pj j juh1j hhhjShjhNubj)}(h**Definition**:: struct usb_sg_request { int status; size_t bytes; }; **Members** ``status`` zero indicates success, else negative errno ``bytes`` counts bytes transferred.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubh:}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:136: ./include/linux/usb.hhMlhjpubj )}(h]jA)}j4jrsbc.usb_init_urbasbuh1hhjrubj/)}(h h]h }(hj]rhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjrubj_)}(hjbh]h*}(hjkrhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjrubjv)}(hurbh]hurb}(hjxrhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubah}(h]h ]h"]h$]h&]jjuh1jhjqhhhjqhK,ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjqhK,ubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjqhK,hjqhhubj)}(hhh]h)}(h8initializes a urb so that it can be used by a USB driverh]h8initializes a urb so that it can be used by a USB driver}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjrhhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjqhK,ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jrj jrj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to the urb to initialize **Description** Initializes a urb so that the USB subsystem can use it properly. If a urb is created with a call to usb_alloc_urb() it is not necessary to call this function. Only use this if you allocate the space for a struct urb on your own. If you call this function, be careful when freeing the memory for your urb that it is no longer in use by the USB core. Only use this function if you _really_ understand what you are doing.h](h)}(h**Parameters**h]j)}(hjrh]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK#hjrubj0)}(hhh]j5)}(h5``struct urb *urb`` pointer to the urb to initialize h](j;)}(h``struct urb *urb``h]j)}(hjrh]hstruct urb *urb}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK hjrubjU)}(hhh]h)}(h pointer to the urb to initializeh]h pointer to the urb to initialize}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhK hjrubah}(h]h ]h"]h$]h&]uh1jThjrubeh}(h]h ]h"]h$]h&]uh1j4hjrhK hjrubah}(h]h ]h"]h$]h&]uh1j/hjrubh)}(h**Description**h]j)}(hjsh]h Description}(hj shhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK"hjrubh)}(h@Initializes a urb so that the USB subsystem can use it properly.h]h@Initializes a urb so that the USB subsystem can use it properly.}(hj4shhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK"hjrubh)}(hXIf a urb is created with a call to usb_alloc_urb() it is not necessary to call this function. Only use this if you allocate the space for a struct urb on your own. If you call this function, be careful when freeing the memory for your urb that it is no longer in use by the USB core.h]hXIf a urb is created with a call to usb_alloc_urb() it is not necessary to call this function. Only use this if you allocate the space for a struct urb on your own. If you call this function, be careful when freeing the memory for your urb that it is no longer in use by the USB core.}(hjCshhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK$hjrubh)}(hEOnly use this function if you _really_ understand what you are doing.h]hEOnly use this function if you _really_ understand what you are doing.}(hjRshhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK*hjrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_alloc_urb (C function)c.usb_alloc_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h=struct urb * usb_alloc_urb (int iso_packets, gfp_t mem_flags)h]j)}(h;struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags)h](j)}(hjh]hstruct}(hjshhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj}shhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKGubj/)}(h h]h }(hjshhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}shhhjshKGubh)}(hhh]jv)}(hurbh]hurb}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjsmodnameN classnameNj8j;)}j>]jA)}j4 usb_alloc_urbsbc.usb_alloc_urbasbuh1hhj}shhhjshKGubj/)}(h h]h }(hjshhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}shhhjshKGubj_)}(hjbh]h*}(hjshhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj}shhhjshKGubjp)}(h usb_alloc_urbh]jv)}(hjsh]h usb_alloc_urb}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubah}(h]h ](jjeh"]h$]h&]jjuh1johj}shhhjshKGubj)}(h"(int iso_packets, gfp_t mem_flags)h](j)}(hint iso_packetsh](j@)}(hinth]hint}(hjshhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjsubj/)}(h h]h }(hj thhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjsubjv)}(h iso_packetsh]h iso_packets}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubj)}(hgfp_t mem_flagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hj3thhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0tubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj5tmodnameN classnameNj8j;)}j>]jsc.usb_alloc_urbasbuh1hhj,tubj/)}(h h]h }(hjQthhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,tubjv)}(h mem_flagsh]h mem_flags}(hj_thhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,tubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubeh}(h]h ]h"]h$]h&]jjuh1jhj}shhhjshKGubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjyshhhjshKGubah}(h]jtsah ](jjeh"]h$]h&]jj)jhuh1jhjshKGhjvshhubj)}(hhh]h)}(h)creates a new urb for a USB driver to useh]h)creates a new urb for a USB driver to use}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK8hjthhubah}(h]h ]h"]h$]h&]uh1jhjvshhhjshKGubeh}(h]h ](jfunctioneh"]h$]h&]j jj jtj jtj j juh1j hhhjqhNhNubj)}(hX^**Parameters** ``int iso_packets`` number of iso packets for this urb ``gfp_t mem_flags`` the type of memory to allocate, see kmalloc() for a list of valid options for this. **Description** Creates an urb for the USB driver to use, initializes a few internal structures, increments the usage counter, and returns a pointer to it. If the driver want to use this urb for interrupt, control, or bulk endpoints, pass '0' as the number of iso packets. The driver must call usb_free_urb() when it is finished with the urb. **Return** A pointer to the new urb, or ``NULL`` if no memory is available.h](h)}(h**Parameters**h]j)}(hjth]h Parameters}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK]jA)}j4jusbc.usb_free_urbasbuh1hhjvubj/)}(h h]h }(hjVvhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjvubj_)}(hjbh]h*}(hjdvhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjvubjv)}(hurbh]hurb}(hjqvhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubah}(h]h ]h"]h$]h&]jjuh1jhjuhhhjuhK^ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjuhK^ubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1jhjuhK^hjuhhubj)}(hhh]h)}(h@frees the memory used by a urb when all users of it are finishedh]h@frees the memory used by a urb when all users of it are finished}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKUhjvhhubah}(h]h ]h"]h$]h&]uh1jhjuhhhjuhK^ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jvj jvj j juh1j hhhjqhNhNubj)}(hXa**Parameters** ``struct urb *urb`` pointer to the urb to free, may be NULL **Description** Must be called when a user of a urb is finished with it. When the last user of the urb calls this function, the memory of the urb is freed. **Note** The transfer buffer associated with the urb is not freed unless the URB_FREE_BUFFER transfer flag is set.h](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKYhjvubj0)}(hhh]j5)}(h<``struct urb *urb`` pointer to the urb to free, may be NULL h](j;)}(h``struct urb *urb``h]j)}(hjvh]hstruct urb *urb}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKVhjvubjU)}(hhh]h)}(h'pointer to the urb to free, may be NULLh]h'pointer to the urb to free, may be NULL}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhKVhjvubah}(h]h ]h"]h$]h&]uh1jThjvubeh}(h]h ]h"]h$]h&]uh1j4hjvhKVhjvubah}(h]h ]h"]h$]h&]uh1j/hjvubh)}(h**Description**h]j)}(hjwh]h Description}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKXhjvubh)}(hMust be called when a user of a urb is finished with it. When the last user of the urb calls this function, the memory of the urb is freed.h]hMust be called when a user of a urb is finished with it. When the last user of the urb calls this function, the memory of the urb is freed.}(hj-whhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKXhjvubh)}(h**Note**h]j)}(hj>wh]hNote}(hj@whhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]jA)}j4 usb_get_urbsb c.usb_get_urbasbuh1hhjwhhhjwhKoubj/)}(h h]h }(hjwhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjwhhhjwhKoubj_)}(hjbh]h*}(hjwhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjwhhhjwhKoubjp)}(h usb_get_urbh]jv)}(hjwh]h usb_get_urb}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjwubah}(h]h ](jjeh"]h$]h&]jjuh1johjwhhhjwhKoubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjwhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjwubj/)}(h h]h }(hj xhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjwubh)}(hhh]jv)}(hurbh]hurb}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjxubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjxmodnameN classnameNj8j;)}j>]jw c.usb_get_urbasbuh1hhjwubj/)}(h h]h }(hj9xhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjwubj_)}(hjbh]h*}(hjGxhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjwubjv)}(hurbh]hurb}(hjTxhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubah}(h]h ]h"]h$]h&]jjuh1jhjwhhhjwhKoubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj{whhhjwhKoubah}(h]jvwah ](jjeh"]h$]h&]jj)jhuh1jhjwhKohjxwhhubj)}(hhh]h)}(h)increments the reference count of the urbh]h)increments the reference count of the urb}(hj~xhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKfhj{xhhubah}(h]h ]h"]h$]h&]uh1jhjxwhhhjwhKoubeh}(h]h ](jfunctioneh"]h$]h&]j jj jxj jxj j juh1j hhhjqhNhNubj)}(hXK**Parameters** ``struct urb *urb`` pointer to the urb to modify, may be NULL **Description** This must be called whenever a urb is transferred from a device driver to a host controller driver. This allows proper reference counting to happen for urbs. **Return** A pointer to the urb with the incremented reference counter.h](h)}(h**Parameters**h]j)}(hjxh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKjhjxubj0)}(hhh]j5)}(h>``struct urb *urb`` pointer to the urb to modify, may be NULL h](j;)}(h``struct urb *urb``h]j)}(hjxh]hstruct urb *urb}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKghjxubjU)}(hhh]h)}(h)pointer to the urb to modify, may be NULLh]h)pointer to the urb to modify, may be NULL}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhKghjxubah}(h]h ]h"]h$]h&]uh1jThjxubeh}(h]h ]h"]h$]h&]uh1j4hjxhKghjxubah}(h]h ]h"]h$]h&]uh1j/hjxubh)}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKihjxubh)}(hThis must be called whenever a urb is transferred from a device driver to a host controller driver. This allows proper reference counting to happen for urbs.h]hThis must be called whenever a urb is transferred from a device driver to a host controller driver. This allows proper reference counting to happen for urbs.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKihjxubh)}(h **Return**h]j)}(hj!yh]hReturn}(hj#yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKmhjxubh)}(h]jA)}j4jysbc.usb_anchor_urbasbuh1hhjyubj/)}(h h]h }(hjyhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjyubj_)}(hjbh]h*}(hjyhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjyubjv)}(hurbh]hurb}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubj)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjzhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjzubj/)}(h h]h }(hj"zhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hj3zhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0zubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj5zmodnameN classnameNj8j;)}j>]jyc.usb_anchor_urbasbuh1hhjzubj/)}(h h]h }(hjQzhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubj_)}(hjbh]h*}(hj_zhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjzubjv)}(hanchorh]hanchor}(hjlzhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubeh}(h]h ]h"]h$]h&]jjuh1jhjbyhhhjtyhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^yhhhjtyhKubah}(h]jYyah ](jjeh"]h$]h&]jj)jhuh1jhjtyhKhj[yhhubj)}(hhh]h)}(h$anchors an URB while it is processedh]h$anchors an URB while it is processed}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKxhjzhhubah}(h]h ]h"]h$]h&]uh1jhj[yhhhjtyhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jzj jzj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct urb *urb`` pointer to the urb to anchor ``struct usb_anchor *anchor`` pointer to the anchor **Description** This can be called to have access to URBs which are to be executed without bothering to track themh](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK|hjzubj0)}(hhh](j5)}(h1``struct urb *urb`` pointer to the urb to anchor h](j;)}(h``struct urb *urb``h]j)}(hjzh]hstruct urb *urb}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKyhjzubjU)}(hhh]h)}(hpointer to the urb to anchorh]hpointer to the urb to anchor}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhKyhjzubah}(h]h ]h"]h$]h&]uh1jThjzubeh}(h]h ]h"]h$]h&]uh1j4hjzhKyhjzubj5)}(h4``struct usb_anchor *anchor`` pointer to the anchor h](j;)}(h``struct usb_anchor *anchor``h]j)}(hj{h]hstruct usb_anchor *anchor}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKzhj {ubjU)}(hhh]h)}(hpointer to the anchorh]hpointer to the anchor}(hj){hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%{hKzhj&{ubah}(h]h ]h"]h$]h&]uh1jThj {ubeh}(h]h ]h"]h$]h&]uh1j4hj%{hKzhjzubeh}(h]h ]h"]h$]h&]uh1j/hjzubh)}(h**Description**h]j)}(hjK{h]h Description}(hjM{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI{ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK|hjzubh)}(hbThis can be called to have access to URBs which are to be executed without bothering to track themh]hbThis can be called to have access to URBs which are to be executed without bothering to track them}(hja{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chK|hjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_unanchor_urb (C function)c.usb_unanchor_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h'void usb_unanchor_urb (struct urb *urb)h]j)}(h&void usb_unanchor_urb(struct urb *urb)h](j@)}(hvoidh]hvoid}(hj{hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj{hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKubj/)}(h h]h }(hj{hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj{hhhj{hKubjp)}(husb_unanchor_urbh]jv)}(husb_unanchor_urbh]husb_unanchor_urb}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1johj{hhhj{hKubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj{hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj{ubj/)}(h h]h }(hj{hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj{ubh)}(hhh]jv)}(hurbh]hurb}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj{modnameN classnameNj8j;)}j>]jA)}j4j{sbc.usb_unanchor_urbasbuh1hhj{ubj/)}(h h]h }(hj |hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj{ubj_)}(hjbh]h*}(hj|hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj{ubjv)}(hurbh]hurb}(hj&|hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubah}(h]h ]h"]h$]h&]jjuh1jhj{hhhj{hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj{hhhj{hKubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhj{hKhj{hhubj)}(hhh]h)}(hunanchors an URBh]hunanchors an URB}(hjP|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjM|hhubah}(h]h ]h"]h$]h&]uh1jhj{hhhj{hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jh|j jh|j j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct urb *urb`` pointer to the urb to anchor **Description** Call this to stop the system keeping track of this URBh](h)}(h**Parameters**h]j)}(hjr|h]h Parameters}(hjt|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp|ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjl|ubj0)}(hhh]j5)}(h1``struct urb *urb`` pointer to the urb to anchor h](j;)}(h``struct urb *urb``h]j)}(hj|h]hstruct urb *urb}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj|ubjU)}(hhh]h)}(hpointer to the urb to anchorh]hpointer to the urb to anchor}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hKhj|ubah}(h]h ]h"]h$]h&]uh1jThj|ubeh}(h]h ]h"]h$]h&]uh1j4hj|hKhj|ubah}(h]h ]h"]h$]h&]uh1j/hjl|ubh)}(h**Description**h]j)}(hj|h]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjl|ubh)}(h6Call this to stop the system keeping track of this URBh]h6Call this to stop the system keeping track of this URB}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjl|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j usb_pipe_type_check (C function)c.usb_pipe_type_checkhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hCint usb_pipe_type_check (struct usb_device *dev, unsigned int pipe)h]j)}(hBint usb_pipe_type_check(struct usb_device *dev, unsigned int pipe)h](j@)}(hinth]hint}(hj}hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj }hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKubj/)}(h h]h }(hj }hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj }hhhj}hKubjp)}(husb_pipe_type_checkh]jv)}(husb_pipe_type_checkh]husb_pipe_type_check}(hj2}hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj.}ubah}(h]h ](jjeh"]h$]h&]jjuh1johj }hhhj}hKubj)}(h+(struct usb_device *dev, unsigned int pipe)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjN}hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjJ}ubj/)}(h h]h }(hj[}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjJ}ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjl}hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhji}ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjn}modnameN classnameNj8j;)}j>]jA)}j4j4}sbc.usb_pipe_type_checkasbuh1hhjJ}ubj/)}(h h]h }(hj}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjJ}ubj_)}(hjbh]h*}(hj}hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjJ}ubjv)}(hdevh]hdev}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjJ}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjF}ubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hj}hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj}ubj/)}(h h]h }(hj}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}ubj@)}(hinth]hint}(hj}hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj}ubj/)}(h h]h }(hj}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}ubjv)}(hpipeh]hpipe}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjF}ubeh}(h]h ]h"]h$]h&]jjuh1jhj }hhhj}hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj }hhhj}hKubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhj}hKhj}hhubj)}(hhh]h)}(h0sanity check of a specific pipe for a usb deviceh]h0sanity check of a specific pipe for a usb device}(hj"~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj~hhubah}(h]h ]h"]h$]h&]uh1jhj}hhhj}hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj j:~j j:~j j juh1j hhhjqhNhNubj)}(hX:**Parameters** ``struct usb_device *dev`` struct usb_device to be checked ``unsigned int pipe`` pipe to check **Description** This performs a light-weight sanity check for the endpoint in the given usb device. It returns 0 if the pipe is valid for the specific usb device, otherwise a negative error code.h](h)}(h**Parameters**h]j)}(hjD~h]h Parameters}(hjF~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB~ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj>~ubj0)}(hhh](j5)}(h;``struct usb_device *dev`` struct usb_device to be checked h](j;)}(h``struct usb_device *dev``h]j)}(hjc~h]hstruct usb_device *dev}(hje~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja~ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj]~ubjU)}(hhh]h)}(hstruct usb_device to be checkedh]hstruct usb_device to be checked}(hj|~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx~hKhjy~ubah}(h]h ]h"]h$]h&]uh1jThj]~ubeh}(h]h ]h"]h$]h&]uh1j4hjx~hKhjZ~ubj5)}(h$``unsigned int pipe`` pipe to check h](j;)}(h``unsigned int pipe``h]j)}(hj~h]hunsigned int pipe}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj~ubjU)}(hhh]h)}(h pipe to checkh]h pipe to check}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hKhj~ubah}(h]h ]h"]h$]h&]uh1jThj~ubeh}(h]h ]h"]h$]h&]uh1j4hj~hKhjZ~ubeh}(h]h ]h"]h$]h&]uh1j/hj>~ubh)}(h**Description**h]j)}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj>~ubh)}(hThis performs a light-weight sanity check for the endpoint in the given usb device. It returns 0 if the pipe is valid for the specific usb device, otherwise a negative error code.h]hThis performs a light-weight sanity check for the endpoint in the given usb device. It returns 0 if the pipe is valid for the specific usb device, otherwise a negative error code.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj>~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"usb_urb_ep_type_check (C function)c.usb_urb_ep_type_checkhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h1int usb_urb_ep_type_check (const struct urb *urb)h]j)}(h0int usb_urb_ep_type_check(const struct urb *urb)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKubj/)}(h h]h }(hj+hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj*hKubjp)}(husb_urb_ep_type_checkh]jv)}(husb_urb_ep_type_checkh]husb_urb_ep_type_check}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj*hKubj)}(h(const struct urb *urb)h]j)}(hconst struct urb *urbh](j)}(hj h]hconst}(hjYhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjUubj/)}(h h]h }(hjfhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubj)}(hjh]hstruct}(hjthhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjUubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubh)}(hhh]jv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4j?sbc.usb_urb_ep_type_checkasbuh1hhjUubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjUubjv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hKhjhhubj)}(hhh]h)}(h)sanity check of endpoint in the given urbh]h)sanity check of endpoint in the given urb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(h**Parameters** ``const struct urb *urb`` urb to be checked **Description** This performs a light-weight sanity check for the endpoint in the given urb. It returns 0 if the urb contains a valid endpoint, otherwise a negative error code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjubj0)}(hhh]j5)}(h,``const struct urb *urb`` urb to be checked h](j;)}(h``const struct urb *urb``h]j)}(hj8h]hconst struct urb *urb}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj2ubjU)}(hhh]h)}(hurb to be checkedh]hurb to be checked}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhKhjNubah}(h]h ]h"]h$]h&]uh1jThj2ubeh}(h]h ]h"]h$]h&]uh1j4hjMhKhj/ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjsh]h Description}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjubh)}(hThis performs a light-weight sanity check for the endpoint in the given urb. It returns 0 if the urb contains a valid endpoint, otherwise a negative error code.h]hThis performs a light-weight sanity check for the endpoint in the given urb. It returns 0 if the urb contains a valid endpoint, otherwise a negative error code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_submit_urb (C function)c.usb_submit_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h5int usb_submit_urb (struct urb *urb, gfp_t mem_flags)h]j)}(h4int usb_submit_urb(struct urb *urb, gfp_t mem_flags)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMpubj/)}(h h]h }(hjǀhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjƀhMpubjp)}(husb_submit_urbh]jv)}(husb_submit_urbh]husb_submit_urb}(hjـhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjՀubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjƀhMpubj)}(h"(struct urb *urb, gfp_t mem_flags)h](j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jۀsbc.usb_submit_urbasbuh1hhjubj/)}(h h]h }(hj3hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjAhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hurbh]hurb}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t mem_flagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjgubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjlmodnameN classnameNj8j;)}j>]j/c.usb_submit_urbasbuh1hhjcubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjcubjv)}(h mem_flagsh]h mem_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjƀhMpubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjƀhMpubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjƀhMphjhhubj)}(hhh]h)}(h6issue an asynchronous transfer request for an endpointh]h6issue an asynchronous transfer request for an endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjƀhMpubeh}(h]h ](jfunctioneh"]h$]h&]j jj j؁j j؁j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to the urb describing the request ``gfp_t mem_flags`` the type of memory to allocate, see kmalloc() for a list of valid options for this. **Description** This submits a transfer request, and transfers control of the URB describing that request to the USB subsystem. Request completion will be indicated later, asynchronously, by calling the completion handler. The three types of completion are success, error, and unlink (a software-induced fault, also called "request cancellation"). URBs may be submitted in interrupt context. The caller must have correctly initialized the URB before submitting it. Functions such as usb_fill_bulk_urb() and usb_fill_control_urb() are available to ensure that most fields are correctly initialized, for the particular kind of transfer, although they will not initialize any transfer flags. If the submission is successful, the complete() callback from the URB will be called exactly once, when the USB core and Host Controller Driver (HCD) are finished with the URB. When the completion function is called, control of the URB is returned to the device driver which issued the request. The completion handler may then immediately free or reuse that URB. With few exceptions, USB device drivers should never access URB fields provided by usbcore or the HCD until its complete() is called. The exceptions relate to periodic transfer scheduling. For both interrupt and isochronous urbs, as part of successful URB submission urb->interval is modified to reflect the actual transfer period used (normally some power of two units). And for isochronous urbs, urb->start_frame is modified to reflect when the URB's transfers were scheduled to start. Not all isochronous transfer scheduling policies will work, but most host controller drivers should easily handle ISO queues going from now until 10-200 msec into the future. Drivers should try to keep at least one or two msec of data in the queue; many controllers require that new transfers start at least 1 msec in the future when they are added. If the driver is unable to keep up and the queue empties out, the behavior for new submissions is governed by the URB_ISO_ASAP flag. If the flag is set, or if the queue is idle, then the URB is always assigned to the first available (and not yet expired) slot in the endpoint's schedule. If the flag is not set and the queue is active then the URB is always assigned to the next slot in the schedule following the end of the endpoint's previous URB, even if that slot is in the past. When a packet is assigned in this way to a slot that has already expired, the packet is not transmitted and the corresponding usb_iso_packet_descriptor's status field will return -EXDEV. If this would happen to all the packets in the URB, submission fails with a -EXDEV error code. For control endpoints, the synchronous usb_control_msg() call is often used (in non-interrupt context) instead of this call. That is often used through convenience wrappers, for the requests that are standardized in the USB 2.0 specification. For bulk endpoints, a synchronous usb_bulk_msg() call is available. Request Queuing: URBs may be submitted to endpoints before previous ones complete, to minimize the impact of interrupt latencies and system overhead on data throughput. With that queuing policy, an endpoint's queue would never be empty. This is required for continuous isochronous data streams, and may also be required for some kinds of interrupt transfers. Such queuing also maximizes bandwidth utilization by letting USB controllers start work on later requests before driver software has finished the completion processing for earlier (successful) requests. As of Linux 2.6, all USB endpoint transfer queues support depths greater than one. This was previously a HCD-specific behavior, except for ISO transfers. Non-isochronous endpoint queues are inactive during cleanup after faults (transfer errors or cancellation). Reserved Bandwidth Transfers: Periodic transfers (interrupt or isochronous) are performed repeatedly, using the interval specified in the urb. Submitting the first urb to the endpoint reserves the bandwidth necessary to make those transfers. If the USB subsystem can't allocate sufficient bandwidth to perform the periodic request, submitting such a periodic request should fail. For devices under xHCI, the bandwidth is reserved at configuration time, or when the alt setting is selected. If there is not enough bus bandwidth, the configuration/alt setting request will fail. Therefore, submissions to periodic endpoints on devices under xHCI should never fail due to bandwidth constraints. Device drivers must explicitly request that repetition, by ensuring that some URB is always on the endpoint's queue (except possibly for short periods during completion callbacks). When there is no longer an urb queued, the endpoint's bandwidth reservation is canceled. This means drivers can use their completion handlers to ensure they keep bandwidth they need, by reinitializing and resubmitting the just-completed urb until the driver longer needs that periodic bandwidth. Memory Flags: The general rules for how to decide which mem_flags to use are the same as for kmalloc. There are four different possible values; GFP_KERNEL, GFP_NOFS, GFP_NOIO and GFP_ATOMIC. GFP_NOFS is not ever used, as it has not been implemented yet. GFP_ATOMIC is used when (a) you are inside a completion handler, an interrupt, bottom half, tasklet or timer, or (b) you are holding a spinlock or rwlock (does not apply to semaphores), or (c) current->state != TASK_RUNNING, this is the case only after you've changed it. GFP_NOIO is used in the block io path and error handling of storage devices. All other situations use GFP_KERNEL. Some more specific rules for mem_flags can be inferred, such as (1) start_xmit, timeout, and receive methods of network drivers must use GFP_ATOMIC (they are called with a spinlock held); (2) queuecommand methods of scsi drivers must use GFP_ATOMIC (also called with a spinlock held); (3) If you use a kernel thread with a network driver you must use GFP_NOIO, unless (b) or (c) apply; (4) after you have done a down() you can use GFP_KERNEL, unless (b) or (c) apply or your are in a storage driver's block io path; (5) USB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; and (6) changing firmware on a running storage or net device uses GFP_NOIO, unless b) or c) apply **Return** 0 on successful submissions. A negative error number otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj܁ubj0)}(hhh](j5)}(h>``struct urb *urb`` pointer to the urb describing the request h](j;)}(h``struct urb *urb``h]j)}(hjh]hstruct urb *urb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjubjU)}(hhh]h)}(h)pointer to the urb describing the requesth]h)pointer to the urb describing the request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjubj5)}(hh``gfp_t mem_flags`` the type of memory to allocate, see kmalloc() for a list of valid options for this. h](j;)}(h``gfp_t mem_flags``h]j)}(hj:h]hgfp_t mem_flags}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj4ubjU)}(hhh]h)}(hSthe type of memory to allocate, see kmalloc() for a list of valid options for this.h]hSthe type of memory to allocate, see kmalloc() for a list of valid options for this.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhjPubah}(h]h ]h"]h$]h&]uh1jThj4ubeh}(h]h ]h"]h$]h&]uh1j4hjOhKhjubeh}(h]h ]h"]h$]h&]uh1j/hj܁ubh)}(h**Description**h]j)}(hjvh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj܁ubh)}(hXLThis submits a transfer request, and transfers control of the URB describing that request to the USB subsystem. Request completion will be indicated later, asynchronously, by calling the completion handler. The three types of completion are success, error, and unlink (a software-induced fault, also called "request cancellation").h]hXPThis submits a transfer request, and transfers control of the URB describing that request to the USB subsystem. Request completion will be indicated later, asynchronously, by calling the completion handler. The three types of completion are success, error, and unlink (a software-induced fault, also called “request cancellation”).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj܁ubh)}(h+URBs may be submitted in interrupt context.h]h+URBs may be submitted in interrupt context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj܁ubh)}(hX)The caller must have correctly initialized the URB before submitting it. Functions such as usb_fill_bulk_urb() and usb_fill_control_urb() are available to ensure that most fields are correctly initialized, for the particular kind of transfer, although they will not initialize any transfer flags.h]hX)The caller must have correctly initialized the URB before submitting it. Functions such as usb_fill_bulk_urb() and usb_fill_control_urb() are available to ensure that most fields are correctly initialized, for the particular kind of transfer, although they will not initialize any transfer flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj܁ubh)}(hXlIf the submission is successful, the complete() callback from the URB will be called exactly once, when the USB core and Host Controller Driver (HCD) are finished with the URB. When the completion function is called, control of the URB is returned to the device driver which issued the request. The completion handler may then immediately free or reuse that URB.h]hXlIf the submission is successful, the complete() callback from the URB will be called exactly once, when the USB core and Host Controller Driver (HCD) are finished with the URB. When the completion function is called, control of the URB is returned to the device driver which issued the request. The completion handler may then immediately free or reuse that URB.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chKhj܁ubh)}(hXWith few exceptions, USB device drivers should never access URB fields provided by usbcore or the HCD until its complete() is called. The exceptions relate to periodic transfer scheduling. For both interrupt and isochronous urbs, as part of successful URB submission urb->interval is modified to reflect the actual transfer period used (normally some power of two units). And for isochronous urbs, urb->start_frame is modified to reflect when the URB's transfers were scheduled to start.h]hXWith few exceptions, USB device drivers should never access URB fields provided by usbcore or the HCD until its complete() is called. The exceptions relate to periodic transfer scheduling. For both interrupt and isochronous urbs, as part of successful URB submission urb->interval is modified to reflect the actual transfer period used (normally some power of two units). And for isochronous urbs, urb->start_frame is modified to reflect when the URB’s transfers were scheduled to start.}(hjȂhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj܁ubh)}(hX`Not all isochronous transfer scheduling policies will work, but most host controller drivers should easily handle ISO queues going from now until 10-200 msec into the future. Drivers should try to keep at least one or two msec of data in the queue; many controllers require that new transfers start at least 1 msec in the future when they are added. If the driver is unable to keep up and the queue empties out, the behavior for new submissions is governed by the URB_ISO_ASAP flag. If the flag is set, or if the queue is idle, then the URB is always assigned to the first available (and not yet expired) slot in the endpoint's schedule. If the flag is not set and the queue is active then the URB is always assigned to the next slot in the schedule following the end of the endpoint's previous URB, even if that slot is in the past. When a packet is assigned in this way to a slot that has already expired, the packet is not transmitted and the corresponding usb_iso_packet_descriptor's status field will return -EXDEV. If this would happen to all the packets in the URB, submission fails with a -EXDEV error code.h]hXfNot all isochronous transfer scheduling policies will work, but most host controller drivers should easily handle ISO queues going from now until 10-200 msec into the future. Drivers should try to keep at least one or two msec of data in the queue; many controllers require that new transfers start at least 1 msec in the future when they are added. If the driver is unable to keep up and the queue empties out, the behavior for new submissions is governed by the URB_ISO_ASAP flag. If the flag is set, or if the queue is idle, then the URB is always assigned to the first available (and not yet expired) slot in the endpoint’s schedule. If the flag is not set and the queue is active then the URB is always assigned to the next slot in the schedule following the end of the endpoint’s previous URB, even if that slot is in the past. When a packet is assigned in this way to a slot that has already expired, the packet is not transmitted and the corresponding usb_iso_packet_descriptor’s status field will return -EXDEV. If this would happen to all the packets in the URB, submission fails with a -EXDEV error code.}(hjׂhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM hj܁ubh)}(hX7For control endpoints, the synchronous usb_control_msg() call is often used (in non-interrupt context) instead of this call. That is often used through convenience wrappers, for the requests that are standardized in the USB 2.0 specification. For bulk endpoints, a synchronous usb_bulk_msg() call is available.h]hX7For control endpoints, the synchronous usb_control_msg() call is often used (in non-interrupt context) instead of this call. That is often used through convenience wrappers, for the requests that are standardized in the USB 2.0 specification. For bulk endpoints, a synchronous usb_bulk_msg() call is available.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj܁ubh)}(hRequest Queuing:h]hRequest Queuing:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM#hj܁ubh)}(hX"URBs may be submitted to endpoints before previous ones complete, to minimize the impact of interrupt latencies and system overhead on data throughput. With that queuing policy, an endpoint's queue would never be empty. This is required for continuous isochronous data streams, and may also be required for some kinds of interrupt transfers. Such queuing also maximizes bandwidth utilization by letting USB controllers start work on later requests before driver software has finished the completion processing for earlier (successful) requests.h]hX$URBs may be submitted to endpoints before previous ones complete, to minimize the impact of interrupt latencies and system overhead on data throughput. With that queuing policy, an endpoint’s queue would never be empty. This is required for continuous isochronous data streams, and may also be required for some kinds of interrupt transfers. Such queuing also maximizes bandwidth utilization by letting USB controllers start work on later requests before driver software has finished the completion processing for earlier (successful) requests.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM%hj܁ubh)}(hXAs of Linux 2.6, all USB endpoint transfer queues support depths greater than one. This was previously a HCD-specific behavior, except for ISO transfers. Non-isochronous endpoint queues are inactive during cleanup after faults (transfer errors or cancellation).h]hXAs of Linux 2.6, all USB endpoint transfer queues support depths greater than one. This was previously a HCD-specific behavior, except for ISO transfers. Non-isochronous endpoint queues are inactive during cleanup after faults (transfer errors or cancellation).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM.hj܁ubh)}(hReserved Bandwidth Transfers:h]hReserved Bandwidth Transfers:}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM3hj܁ubh)}(hX^Periodic transfers (interrupt or isochronous) are performed repeatedly, using the interval specified in the urb. Submitting the first urb to the endpoint reserves the bandwidth necessary to make those transfers. If the USB subsystem can't allocate sufficient bandwidth to perform the periodic request, submitting such a periodic request should fail.h]hX`Periodic transfers (interrupt or isochronous) are performed repeatedly, using the interval specified in the urb. Submitting the first urb to the endpoint reserves the bandwidth necessary to make those transfers. If the USB subsystem can’t allocate sufficient bandwidth to perform the periodic request, submitting such a periodic request should fail.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM5hj܁ubh)}(hX9For devices under xHCI, the bandwidth is reserved at configuration time, or when the alt setting is selected. If there is not enough bus bandwidth, the configuration/alt setting request will fail. Therefore, submissions to periodic endpoints on devices under xHCI should never fail due to bandwidth constraints.h]hX9For devices under xHCI, the bandwidth is reserved at configuration time, or when the alt setting is selected. If there is not enough bus bandwidth, the configuration/alt setting request will fail. Therefore, submissions to periodic endpoints on devices under xHCI should never fail due to bandwidth constraints.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM;hj܁ubh)}(hXDevice drivers must explicitly request that repetition, by ensuring that some URB is always on the endpoint's queue (except possibly for short periods during completion callbacks). When there is no longer an urb queued, the endpoint's bandwidth reservation is canceled. This means drivers can use their completion handlers to ensure they keep bandwidth they need, by reinitializing and resubmitting the just-completed urb until the driver longer needs that periodic bandwidth.h]hXDevice drivers must explicitly request that repetition, by ensuring that some URB is always on the endpoint’s queue (except possibly for short periods during completion callbacks). When there is no longer an urb queued, the endpoint’s bandwidth reservation is canceled. This means drivers can use their completion handlers to ensure they keep bandwidth they need, by reinitializing and resubmitting the just-completed urb until the driver longer needs that periodic bandwidth.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMAhj܁ubh)}(h Memory Flags:h]h Memory Flags:}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMIhj܁ubh)}(hThe general rules for how to decide which mem_flags to use are the same as for kmalloc. There are four different possible values; GFP_KERNEL, GFP_NOFS, GFP_NOIO and GFP_ATOMIC.h]hThe general rules for how to decide which mem_flags to use are the same as for kmalloc. There are four different possible values; GFP_KERNEL, GFP_NOFS, GFP_NOIO and GFP_ATOMIC.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMKhj܁ubh)}(h>GFP_NOFS is not ever used, as it has not been implemented yet.h]h>GFP_NOFS is not ever used, as it has not been implemented yet.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMPhj܁ubj0)}(hhh]j5)}(hXGFP_ATOMIC is used when (a) you are inside a completion handler, an interrupt, bottom half, tasklet or timer, or (b) you are holding a spinlock or rwlock (does not apply to semaphores), or (c) current->state != TASK_RUNNING, this is the case only after you've changed it. h](j;)}(hGFP_ATOMIC is used whenh]hGFP_ATOMIC is used when}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMXhjubjU)}(hhh]henumerated_list)}(hhh](j)}(hTyou are inside a completion handler, an interrupt, bottom half, tasklet or timer, orh]h)}(hTyou are inside a completion handler, an interrupt, bottom half, tasklet or timer, orh]hTyou are inside a completion handler, an interrupt, bottom half, tasklet or timer, or}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMShjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hGyou are holding a spinlock or rwlock (does not apply to semaphores), orh]h)}(hGyou are holding a spinlock or rwlock (does not apply to semaphores), orh]hGyou are holding a spinlock or rwlock (does not apply to semaphores), or}(hjƃhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMUhjƒubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hOcurrent->state != TASK_RUNNING, this is the case only after you've changed it. h]h)}(hNcurrent->state != TASK_RUNNING, this is the case only after you've changed it.h]hPcurrent->state != TASK_RUNNING, this is the case only after you’ve changed it.}(hj߃hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMWhjۃubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]enumtype loweralphaprefix(suffix)uh1jhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMXhjubah}(h]h ]h"]h$]h&]uh1j/hj܁ubh)}(hLGFP_NOIO is used in the block io path and error handling of storage devices.h]hLGFP_NOIO is used in the block io path and error handling of storage devices.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMZhj܁ubh)}(h$All other situations use GFP_KERNEL.h]h$All other situations use GFP_KERNEL.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM]hj܁ubj0)}(hhh]j5)}(hXSome more specific rules for mem_flags can be inferred, such as (1) start_xmit, timeout, and receive methods of network drivers must use GFP_ATOMIC (they are called with a spinlock held); (2) queuecommand methods of scsi drivers must use GFP_ATOMIC (also called with a spinlock held); (3) If you use a kernel thread with a network driver you must use GFP_NOIO, unless (b) or (c) apply; (4) after you have done a down() you can use GFP_KERNEL, unless (b) or (c) apply or your are in a storage driver's block io path; (5) USB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; and (6) changing firmware on a running storage or net device uses GFP_NOIO, unless b) or c) apply h](j;)}(h?Some more specific rules for mem_flags can be inferred, such ash]h?Some more specific rules for mem_flags can be inferred, such as}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMjhj3ubjU)}(hhh]j)}(hhh](j)}(hwstart_xmit, timeout, and receive methods of network drivers must use GFP_ATOMIC (they are called with a spinlock held);h]h)}(hwstart_xmit, timeout, and receive methods of network drivers must use GFP_ATOMIC (they are called with a spinlock held);h]hwstart_xmit, timeout, and receive methods of network drivers must use GFP_ATOMIC (they are called with a spinlock held);}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM`hjLubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(h\queuecommand methods of scsi drivers must use GFP_ATOMIC (also called with a spinlock held);h]h)}(h\queuecommand methods of scsi drivers must use GFP_ATOMIC (also called with a spinlock held);h]h\queuecommand methods of scsi drivers must use GFP_ATOMIC (also called with a spinlock held);}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMbhjeubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(h`If you use a kernel thread with a network driver you must use GFP_NOIO, unless (b) or (c) apply;h]h)}(h`If you use a kernel thread with a network driver you must use GFP_NOIO, unless (b) or (c) apply;h]h`If you use a kernel thread with a network driver you must use GFP_NOIO, unless (b) or (c) apply;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMdhj~ubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(h}after you have done a down() you can use GFP_KERNEL, unless (b) or (c) apply or your are in a storage driver's block io path;h]h)}(h}after you have done a down() you can use GFP_KERNEL, unless (b) or (c) apply or your are in a storage driver's block io path;h]hafter you have done a down() you can use GFP_KERNEL, unless (b) or (c) apply or your are in a storage driver’s block io path;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMfhjubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hHUSB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; andh]h)}(hjh]hHUSB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; and}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhhjubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hZchanging firmware on a running storage or net device uses GFP_NOIO, unless b) or c) apply h]h)}(hYchanging firmware on a running storage or net device uses GFP_NOIO, unless b) or c) applyh]hYchanging firmware on a running storage or net device uses GFP_NOIO, unless b) or c) apply}(hj̄hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMihjȄubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]jarabicjjjjuh1jhjFubah}(h]h ]h"]h$]h&]uh1jThj3ubeh}(h]h ]h"]h$]h&]uh1j4hjEhMjhj0ubah}(h]h ]h"]h$]h&]uh1j/hj܁ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMlhj܁ubh)}(h?0 on successful submissions. A negative error number otherwise.h]h?0 on successful submissions. A negative error number otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM#hj܁ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_unlink_urb (C function)c.usb_unlink_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h$int usb_unlink_urb (struct urb *urb)h]j)}(h#int usb_unlink_urb(struct urb *urb)h](j@)}(hinth]hint}(hjAhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj=hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjPhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj=hhhjOhMubjp)}(husb_unlink_urbh]jv)}(husb_unlink_urbh]husb_unlink_urb}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubah}(h]h ](jjeh"]h$]h&]jjuh1johj=hhhjOhMubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj~hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubh)}(hhh]jv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jdsbc.usb_unlink_urbasbuh1hhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubj_)}(hjbh]h*}(hjʅhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjzubjv)}(hurbh]hurb}(hjׅhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubah}(h]h ]h"]h$]h&]jjuh1jhj=hhhjOhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj9hhhjOhMubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhjOhMhj6hhubj)}(hhh]h)}(h/abort/cancel a transfer request for an endpointh]h/abort/cancel a transfer request for an endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMLhjhhubah}(h]h ]h"]h$]h&]uh1jhj6hhhjOhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX2**Parameters** ``struct urb *urb`` pointer to urb describing a previously submitted request, may be NULL **Description** This routine cancels an in-progress request. URBs complete only once per submission, and may be canceled only once per submission. Successful cancellation means termination of **urb** will be expedited and the completion handler will be called with a status code indicating that the request has been canceled (rather than any other code). Drivers should not call this routine or related routines, such as usb_kill_urb() or usb_unlink_anchored_urbs(), after their disconnect method has returned. The disconnect function should synchronize with a driver's I/O routines to insure that all URB-related activity has completed before it returns. This request is asynchronous, however the HCD might call the ->complete() callback during unlink. Therefore when drivers call usb_unlink_urb(), they must not hold any locks that may be taken by the completion function. Success is indicated by returning -EINPROGRESS, at which time the URB will probably not yet have been given back to the device driver. When it is eventually called, the completion function will see **urb->status** == -ECONNRESET. Failure is indicated by usb_unlink_urb() returning any other value. Unlinking will fail when **urb** is not currently "linked" (i.e., it was never submitted, or it was unlinked before, or the hardware is already finished with it), even if the completion handler has not yet run. The URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB. Unlinking and Endpoint Queues: [The behaviors and guarantees described below do not apply to virtual root hubs but only to endpoint queues for physical USB devices.] Host Controller Drivers (HCDs) place all the URBs for a particular endpoint in a queue. Normally the queue advances as the controller hardware processes each request. But when an URB terminates with an error its queue generally stops (see below), at least until that URB's completion routine returns. It is guaranteed that a stopped queue will not restart until all its unlinked URBs have been fully retired, with their completion routines run, even if that's not until some time after the original completion handler returns. The same behavior and guarantee apply when an URB terminates because it was unlinked. Bulk and interrupt endpoint queues are guaranteed to stop whenever an URB terminates with any sort of error, including -ECONNRESET, -ENOENT, and -EREMOTEIO. Control endpoint queues behave the same way except that they are not guaranteed to stop for -EREMOTEIO errors. Queues for isochronous endpoints are treated differently, because they must advance at fixed rates. Such queues do not stop when an URB encounters an error or is unlinked. An unlinked isochronous URB may leave a gap in the stream of packets; it is undefined whether such gaps can be filled in. Note that early termination of an URB because a short packet was received will generate a -EREMOTEIO error if and only if the URB_SHORT_NOT_OK flag is set. By setting this flag, USB device drivers can build deep queues for large or complex bulk transfers and clean them up reliably after any sort of aborted transfer by unlinking all pending URBs at the first fault. When a control URB terminates with an error other than -EREMOTEIO, it is quite likely that the status stage of the transfer will not take place. **Return** -EINPROGRESS on success. See description for other values on failure.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMPhjubj0)}(hhh]j5)}(hZ``struct urb *urb`` pointer to urb describing a previously submitted request, may be NULL h](j;)}(h``struct urb *urb``h]j)}(hjBh]hstruct urb *urb}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMNhj<ubjU)}(hhh]h)}(hEpointer to urb describing a previously submitted request, may be NULLh]hEpointer to urb describing a previously submitted request, may be NULL}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMMhjXubah}(h]h ]h"]h$]h&]uh1jThj<ubeh}(h]h ]h"]h$]h&]uh1j4hjWhMNhj9ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMPhjubh)}(hXSThis routine cancels an in-progress request. URBs complete only once per submission, and may be canceled only once per submission. Successful cancellation means termination of **urb** will be expedited and the completion handler will be called with a status code indicating that the request has been canceled (rather than any other code).h](hThis routine cancels an in-progress request. URBs complete only once per submission, and may be canceled only once per submission. Successful cancellation means termination of }(hjhhhNhNubj)}(h**urb**h]hurb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh will be expedited and the completion handler will be called with a status code indicating that the request has been canceled (rather than any other code).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMPhjubh)}(hX-Drivers should not call this routine or related routines, such as usb_kill_urb() or usb_unlink_anchored_urbs(), after their disconnect method has returned. The disconnect function should synchronize with a driver's I/O routines to insure that all URB-related activity has completed before it returns.h]hX/Drivers should not call this routine or related routines, such as usb_kill_urb() or usb_unlink_anchored_urbs(), after their disconnect method has returned. The disconnect function should synchronize with a driver’s I/O routines to insure that all URB-related activity has completed before it returns.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMWhjubh)}(hXThis request is asynchronous, however the HCD might call the ->complete() callback during unlink. Therefore when drivers call usb_unlink_urb(), they must not hold any locks that may be taken by the completion function. Success is indicated by returning -EINPROGRESS, at which time the URB will probably not yet have been given back to the device driver. When it is eventually called, the completion function will see **urb->status** == -ECONNRESET. Failure is indicated by usb_unlink_urb() returning any other value. Unlinking will fail when **urb** is not currently "linked" (i.e., it was never submitted, or it was unlinked before, or the hardware is already finished with it), even if the completion handler has not yet run.h](hXThis request is asynchronous, however the HCD might call the ->complete() callback during unlink. Therefore when drivers call usb_unlink_urb(), they must not hold any locks that may be taken by the completion function. Success is indicated by returning -EINPROGRESS, at which time the URB will probably not yet have been given back to the device driver. When it is eventually called, the completion function will see }(hjĆhhhNhNubj)}(h**urb->status**h]h urb->status}(hj̆hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjĆubhn == -ECONNRESET. Failure is indicated by usb_unlink_urb() returning any other value. Unlinking will fail when }(hjĆhhhNhNubj)}(h**urb**h]hurb}(hjކhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjĆubh is not currently “linked” (i.e., it was never submitted, or it was unlinked before, or the hardware is already finished with it), even if the completion handler has not yet run.}(hjĆhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM]hjubh)}(hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.h]hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMihjubh)}(hUnlinking and Endpoint Queues:h]hUnlinking and Endpoint Queues:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMmhjubh)}(h[The behaviors and guarantees described below do not apply to virtual root hubs but only to endpoint queues for physical USB devices.]h]h[The behaviors and guarantees described below do not apply to virtual root hubs but only to endpoint queues for physical USB devices.]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMohjubh)}(hXhHost Controller Drivers (HCDs) place all the URBs for a particular endpoint in a queue. Normally the queue advances as the controller hardware processes each request. But when an URB terminates with an error its queue generally stops (see below), at least until that URB's completion routine returns. It is guaranteed that a stopped queue will not restart until all its unlinked URBs have been fully retired, with their completion routines run, even if that's not until some time after the original completion handler returns. The same behavior and guarantee apply when an URB terminates because it was unlinked.h]hXlHost Controller Drivers (HCDs) place all the URBs for a particular endpoint in a queue. Normally the queue advances as the controller hardware processes each request. But when an URB terminates with an error its queue generally stops (see below), at least until that URB’s completion routine returns. It is guaranteed that a stopped queue will not restart until all its unlinked URBs have been fully retired, with their completion routines run, even if that’s not until some time after the original completion handler returns. The same behavior and guarantee apply when an URB terminates because it was unlinked.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMrhjubh)}(hX5Bulk and interrupt endpoint queues are guaranteed to stop whenever an URB terminates with any sort of error, including -ECONNRESET, -ENOENT, and -EREMOTEIO. Control endpoint queues behave the same way except that they are not guaranteed to stop for -EREMOTEIO errors. Queues for isochronous endpoints are treated differently, because they must advance at fixed rates. Such queues do not stop when an URB encounters an error or is unlinked. An unlinked isochronous URB may leave a gap in the stream of packets; it is undefined whether such gaps can be filled in.h]hX5Bulk and interrupt endpoint queues are guaranteed to stop whenever an URB terminates with any sort of error, including -ECONNRESET, -ENOENT, and -EREMOTEIO. Control endpoint queues behave the same way except that they are not guaranteed to stop for -EREMOTEIO errors. Queues for isochronous endpoints are treated differently, because they must advance at fixed rates. Such queues do not stop when an URB encounters an error or is unlinked. An unlinked isochronous URB may leave a gap in the stream of packets; it is undefined whether such gaps can be filled in.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM|hjubh)}(hXoNote that early termination of an URB because a short packet was received will generate a -EREMOTEIO error if and only if the URB_SHORT_NOT_OK flag is set. By setting this flag, USB device drivers can build deep queues for large or complex bulk transfers and clean them up reliably after any sort of aborted transfer by unlinking all pending URBs at the first fault.h]hXoNote that early termination of an URB because a short packet was received will generate a -EREMOTEIO error if and only if the URB_SHORT_NOT_OK flag is set. By setting this flag, USB device drivers can build deep queues for large or complex bulk transfers and clean them up reliably after any sort of aborted transfer by unlinking all pending URBs at the first fault.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hWhen a control URB terminates with an error other than -EREMOTEIO, it is quite likely that the status stage of the transfer will not take place.h]hWhen a control URB terminates with an error other than -EREMOTEIO, it is quite likely that the status stage of the transfer will not take place.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(h **Return**h]j)}(hjbh]hReturn}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hE-EINPROGRESS on success. See description for other values on failure.h]hE-EINPROGRESS on success. See description for other values on failure.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMmhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_kill_urb (C function)c.usb_kill_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h#void usb_kill_urb (struct urb *urb)h]j)}(h"void usb_kill_urb(struct urb *urb)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(h usb_kill_urbh]jv)}(h usb_kill_urbh]h usb_kill_urb}(hjȇhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjćubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jʇsbc.usb_kill_urbasbuh1hhjubj/)}(h h]h }(hj"hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj0hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hurbh]hurb}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj܇ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h3cancel a transfer request and wait for it to finishh]h3cancel a transfer request and wait for it to finish}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjdhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to URB describing a previously submitted request, may be NULL **Description** This routine cancels an in-progress request. It is guaranteed that upon return all completion handlers will have finished and the URB will be totally idle and available for reuse. These features make this an ideal way to stop I/O in a disconnect() callback or close() function. If the request has not already finished or been unlinked the completion handler will see urb->status == -ENOENT. While the routine is running, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB's completion handler always tries to resubmit, it will not succeed and the URB will become idle. The URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB. This routine may not be used in an interrupt context (such as a bottom half or a completion handler), or when holding a spinlock, or in other situations where the caller can't schedule(). This routine should not be called by a driver after its disconnect method has returned.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubj0)}(hhh]j5)}(hZ``struct urb *urb`` pointer to URB describing a previously submitted request, may be NULL h](j;)}(h``struct urb *urb``h]j)}(hjh]hstruct urb *urb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubjU)}(hhh]h)}(hEpointer to URB describing a previously submitted request, may be NULLh]hEpointer to URB describing a previously submitted request, may be NULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hXThis routine cancels an in-progress request. It is guaranteed that upon return all completion handlers will have finished and the URB will be totally idle and available for reuse. These features make this an ideal way to stop I/O in a disconnect() callback or close() function. If the request has not already finished or been unlinked the completion handler will see urb->status == -ENOENT.h]hXThis routine cancels an in-progress request. It is guaranteed that upon return all completion handlers will have finished and the URB will be totally idle and available for reuse. These features make this an ideal way to stop I/O in a disconnect() callback or close() function. If the request has not already finished or been unlinked the completion handler will see urb->status == -ENOENT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hWhile the routine is running, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB's completion handler always tries to resubmit, it will not succeed and the URB will become idle.h]hWhile the routine is running, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB’s completion handler always tries to resubmit, it will not succeed and the URB will become idle.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.h]hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hThis routine may not be used in an interrupt context (such as a bottom half or a completion handler), or when holding a spinlock, or in other situations where the caller can't schedule().h]hThis routine may not be used in an interrupt context (such as a bottom half or a completion handler), or when holding a spinlock, or in other situations where the caller can’t schedule().}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hWThis routine should not be called by a driver after its disconnect method has returned.h]hWThis routine should not be called by a driver after its disconnect method has returned.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_poison_urb (C function)c.usb_poison_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h%void usb_poison_urb (struct urb *urb)h]j)}(h$void usb_poison_urb(struct urb *urb)h](j@)}(hvoidh]hvoid}(hjehhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjahhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjthhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjahhhjshMubjp)}(husb_poison_urbh]jv)}(husb_poison_urbh]husb_poison_urb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjahhhjshMubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj‰modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_poison_urbasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjahhhjshMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhjshMubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjshMhjZhhubj)}(hhh]h)}(h:reliably kill a transfer and prevent further use of an URBh]h:reliably kill a transfer and prevent further use of an URB}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj"hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j=j j=j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to URB describing a previously submitted request, may be NULL **Description** This routine cancels an in-progress request. It is guaranteed that upon return all completion handlers will have finished and the URB will be totally idle and cannot be reused. These features make this an ideal way to stop I/O in a disconnect() callback. If the request has not already finished or been unlinked the completion handler will see urb->status == -ENOENT. After and while the routine runs, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB's completion handler always tries to resubmit, it will not succeed and the URB will become idle. The URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB. This routine may not be used in an interrupt context (such as a bottom half or a completion handler), or when holding a spinlock, or in other situations where the caller can't schedule(). This routine should not be called by a driver after its disconnect method has returned.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubj0)}(hhh]j5)}(hZ``struct urb *urb`` pointer to URB describing a previously submitted request, may be NULL h](j;)}(h``struct urb *urb``h]j)}(hjfh]hstruct urb *urb}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj`ubjU)}(hhh]h)}(hEpointer to URB describing a previously submitted request, may be NULLh]hEpointer to URB describing a previously submitted request, may be NULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj|ubah}(h]h ]h"]h$]h&]uh1jThj`ubeh}(h]h ]h"]h$]h&]uh1j4hj{hMhj]ubah}(h]h ]h"]h$]h&]uh1j/hjAubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubh)}(hXqThis routine cancels an in-progress request. It is guaranteed that upon return all completion handlers will have finished and the URB will be totally idle and cannot be reused. These features make this an ideal way to stop I/O in a disconnect() callback. If the request has not already finished or been unlinked the completion handler will see urb->status == -ENOENT.h]hXqThis routine cancels an in-progress request. It is guaranteed that upon return all completion handlers will have finished and the URB will be totally idle and cannot be reused. These features make this an ideal way to stop I/O in a disconnect() callback. If the request has not already finished or been unlinked the completion handler will see urb->status == -ENOENT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubh)}(hAfter and while the routine runs, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB's completion handler always tries to resubmit, it will not succeed and the URB will become idle.h]hAfter and while the routine runs, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB’s completion handler always tries to resubmit, it will not succeed and the URB will become idle.}(hjNJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubh)}(hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.h]hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.}(hj֊hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubh)}(hThis routine may not be used in an interrupt context (such as a bottom half or a completion handler), or when holding a spinlock, or in other situations where the caller can't schedule().h]hThis routine may not be used in an interrupt context (such as a bottom half or a completion handler), or when holding a spinlock, or in other situations where the caller can’t schedule().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubh)}(hWThis routine should not be called by a driver after its disconnect method has returned.h]hWThis routine should not be called by a driver after its disconnect method has returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_block_urb (C function)c.usb_block_urbhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h$void usb_block_urb (struct urb *urb)h]j)}(h#void usb_block_urb(struct urb *urb)h](j@)}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hj2hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj1hMubjp)}(h usb_block_urbh]jv)}(h usb_block_urbh]h usb_block_urb}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj1hMubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj`hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj\ubj/)}(h h]h }(hjmhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj\ubh)}(hhh]jv)}(hurbh]hurb}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jFsbc.usb_block_urbasbuh1hhj\ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj\ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj\ubjv)}(hurbh]hurb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjXubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj1hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj1hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj1hMhjhhubj)}(hhh]h)}(h&reliably prevent further use of an URBh]h&reliably prevent further use of an URB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj1hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct urb *urb`` pointer to URB to be blocked, may be NULL **Description** After the routine has run, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB's completion handler always tries to resubmit, it will not succeed and the URB will become idle. The URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM hjubj0)}(hhh]j5)}(h>``struct urb *urb`` pointer to URB to be blocked, may be NULL h](j;)}(h``struct urb *urb``h]j)}(hj$h]hstruct urb *urb}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM hjubjU)}(hhh]h)}(h)pointer to URB to be blocked, may be NULLh]h)pointer to URB to be blocked, may be NULL}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM hj:ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj9hM hjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj_h]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM hjubh)}(hAfter the routine has run, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB's completion handler always tries to resubmit, it will not succeed and the URB will become idle.h]hAfter the routine has run, attempts to resubmit the URB will fail with error -EPERM. Thus even if the URB’s completion handler always tries to resubmit, it will not succeed and the URB will become idle.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM hjubh)}(hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.h]hThe URB must not be deallocated while this routine is running. In particular, when a driver calls this routine, it must insure that the completion handler cannot deallocate the URB.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#usb_kill_anchored_urbs (C function)c.usb_kill_anchored_urbshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h7void usb_kill_anchored_urbs (struct usb_anchor *anchor)h]j)}(h6void usb_kill_anchored_urbs(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM(ubj/)}(h h]h }(hjŒhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM(ubjp)}(husb_kill_anchored_urbsh]jv)}(husb_kill_anchored_urbsh]husb_kill_anchored_urbs}(hjԌhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjЌubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhM(ubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4j֌sbc.usb_kill_anchored_urbsasbuh1hhjubj/)}(h h]h }(hj.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj<hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hanchorh]hanchor}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM(ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM(hjhhubj)}(hhh]h)}(h'kill all URBs associated with an anchorh]h'kill all URBs associated with an anchor}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjphhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM(ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hXh**Parameters** ``struct usb_anchor *anchor`` anchor the requests are bound to **Description** This kills all outstanding URBs starting from the back of the queue, with guarantee that no completer callbacks will take place from the anchor after this function returns. This routine should not be called by a driver after its disconnect method has returned.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM"hjubj0)}(hhh]j5)}(h?``struct usb_anchor *anchor`` anchor the requests are bound to h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjh]hstruct usb_anchor *anchor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubjU)}(hhh]h)}(h anchor the requests are bound toh]h anchor the requests are bound to}(hj͍hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjɍhMhjʍubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjɍhMhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM!hjubh)}(hThis kills all outstanding URBs starting from the back of the queue, with guarantee that no completer callbacks will take place from the anchor after this function returns.h]hThis kills all outstanding URBs starting from the back of the queue, with guarantee that no completer callbacks will take place from the anchor after this function returns.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM!hjubh)}(hWThis routine should not be called by a driver after its disconnect method has returned.h]hWThis routine should not be called by a driver after its disconnect method has returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM%hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_poison_anchored_urbs (C function)c.usb_poison_anchored_urbshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h9void usb_poison_anchored_urbs (struct usb_anchor *anchor)h]j)}(h8void usb_poison_anchored_urbs(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjChhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj?hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMNubj/)}(h h]h }(hjRhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?hhhjQhMNubjp)}(husb_poison_anchored_urbsh]jv)}(husb_poison_anchored_urbsh]husb_poison_anchored_urbs}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubah}(h]h ](jjeh"]h$]h&]jjuh1johj?hhhjQhMNubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj|ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj|ubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jfsbc.usb_poison_anchored_urbsasbuh1hhj|ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj|ubj_)}(hjbh]h*}(hj̎hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj|ubjv)}(hanchorh]hanchor}(hjَhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjxubah}(h]h ]h"]h$]h&]jjuh1jhj?hhhjQhMNubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;hhhjQhMNubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1jhjQhMNhj8hhubj)}(hhh]h)}(h cease all traffic from an anchorh]h cease all traffic from an anchor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMDhjhhubah}(h]h ]h"]h$]h&]uh1jhj8hhhjQhMNubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX7**Parameters** ``struct usb_anchor *anchor`` anchor the requests are bound to **Description** this allows all outstanding URBs to be poisoned starting from the back of the queue. Newly added URBs will also be poisoned This routine should not be called by a driver after its disconnect method has returned.h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMHhjubj0)}(hhh]j5)}(h?``struct usb_anchor *anchor`` anchor the requests are bound to h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjDh]hstruct usb_anchor *anchor}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMEhj>ubjU)}(hhh]h)}(h anchor the requests are bound toh]h anchor the requests are bound to}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMEhjZubah}(h]h ]h"]h$]h&]uh1jThj>ubeh}(h]h ]h"]h$]h&]uh1j4hjYhMEhj;ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMGhjubh)}(h{this allows all outstanding URBs to be poisoned starting from the back of the queue. Newly added URBs will also be poisonedh]h{this allows all outstanding URBs to be poisoned starting from the back of the queue. Newly added URBs will also be poisoned}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMGhjubh)}(hWThis routine should not be called by a driver after its disconnect method has returned.h]hWThis routine should not be called by a driver after its disconnect method has returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'usb_unpoison_anchored_urbs (C function)c.usb_unpoison_anchored_urbshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h;void usb_unpoison_anchored_urbs (struct usb_anchor *anchor)h]j)}(h:void usb_unpoison_anchored_urbs(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjӏhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjϏhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMpubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjϏhhhjhMpubjp)}(husb_unpoison_anchored_urbsh]jv)}(husb_unpoison_anchored_urbsh]husb_unpoison_anchored_urbs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjϏhhhjhMpubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj0modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_unpoison_anchored_urbsasbuh1hhj ubj/)}(h h]h }(hjNhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj\hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hanchorh]hanchor}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjϏhhhjhMpubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjˏhhhjhMpubah}(h]jƏah ](jjeh"]h$]h&]jj)jhuh1jhjhMphjȏhhubj)}(hhh]h)}(h(let an anchor be used successfully againh]h(let an anchor be used successfully again}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMjhjhhubah}(h]h ]h"]h$]h&]uh1jhjȏhhhjhMpubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_anchor *anchor`` anchor the requests are bound to **Description** Reverses the effect of usb_poison_anchored_urbs the anchor can be used normally after it returnsh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMnhjubj0)}(hhh]j5)}(h?``struct usb_anchor *anchor`` anchor the requests are bound to h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjԐh]hstruct usb_anchor *anchor}(hj֐hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjҐubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMkhjΐubjU)}(hhh]h)}(h anchor the requests are bound toh]h anchor the requests are bound to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMkhjubah}(h]h ]h"]h$]h&]uh1jThjΐubeh}(h]h ]h"]h$]h&]uh1j4hjhMkhjːubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMmhjubh)}(h`Reverses the effect of usb_poison_anchored_urbs the anchor can be used normally after it returnsh]h`Reverses the effect of usb_poison_anchored_urbs the anchor can be used normally after it returns}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMmhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_unlink_anchored_urbs (C function)c.usb_unlink_anchored_urbshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h9void usb_unlink_anchored_urbs (struct usb_anchor *anchor)h]j)}(h8void usb_unlink_anchored_urbs(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjThhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjPhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjPhhhjbhMubjp)}(husb_unlink_anchored_urbsh]jv)}(husb_unlink_anchored_urbsh]husb_unlink_anchored_urbs}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjqubah}(h]h ](jjeh"]h$]h&]jjuh1johjPhhhjbhMubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jwsbc.usb_unlink_anchored_urbsasbuh1hhjubj/)}(h h]h }(hjϑhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjݑhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hanchorh]hanchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjPhhhjbhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLhhhjbhMubah}(h]jGah ](jjeh"]h$]h&]jj)jhuh1jhjbhMhjIhhubj)}(hhh]h)}(h0asynchronously cancel transfer requests en masseh]h0asynchronously cancel transfer requests en masse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM~hjhhubah}(h]h ]h"]h$]h&]uh1jhjIhhhjbhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j,j j,j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_anchor *anchor`` anchor the requests are bound to **Description** this allows all outstanding URBs to be unlinked starting from the back of the queue. This function is asynchronous. The unlinking is just triggered. It may happen after this function has returned. This routine should not be called by a driver after its disconnect method has returned.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj0ubj0)}(hhh]j5)}(h?``struct usb_anchor *anchor`` anchor the requests are bound to h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjUh]hstruct usb_anchor *anchor}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjOubjU)}(hhh]h)}(h anchor the requests are bound toh]h anchor the requests are bound to}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjkubah}(h]h ]h"]h$]h&]uh1jThjOubeh}(h]h ]h"]h$]h&]uh1j4hjjhMhjLubah}(h]h ]h"]h$]h&]uh1j/hj0ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj0ubh)}(hthis allows all outstanding URBs to be unlinked starting from the back of the queue. This function is asynchronous. The unlinking is just triggered. It may happen after this function has returned.h]hthis allows all outstanding URBs to be unlinked starting from the back of the queue. This function is asynchronous. The unlinking is just triggered. It may happen after this function has returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj0ubh)}(hWThis routine should not be called by a driver after its disconnect method has returned.h]hWThis routine should not be called by a driver after its disconnect method has returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'usb_anchor_suspend_wakeups (C function)c.usb_anchor_suspend_wakeupshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h;void usb_anchor_suspend_wakeups (struct usb_anchor *anchor)h]j)}(h:void usb_anchor_suspend_wakeups(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_anchor_suspend_wakeupsh]jv)}(husb_anchor_suspend_wakeupsh]husb_anchor_suspend_wakeups}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hj!hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjAmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_anchor_suspend_wakeupsasbuh1hhjubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjmhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hanchorh]hanchor}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjܒhhhjhMubah}(h]jגah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjْhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjْhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX@**Parameters** ``struct usb_anchor *anchor`` the anchor you want to suspend wakeups on **Description** Call this to stop the last urb being unanchored from waking up any usb_wait_anchor_empty_timeout waiters. This is used in the hcd urb give- back path to delay waking up until after the completion handler has run.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubj0)}(hhh]j5)}(hH``struct usb_anchor *anchor`` the anchor you want to suspend wakeups on h](j;)}(h``struct usb_anchor *anchor``h]j)}(hj֓h]hstruct usb_anchor *anchor}(hjؓhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԓubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjГubjU)}(hhh]h)}(h)the anchor you want to suspend wakeups onh]h)the anchor you want to suspend wakeups on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjГubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj͓ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hCall this to stop the last urb being unanchored from waking up any usb_wait_anchor_empty_timeout waiters. This is used in the hcd urb give- back path to delay waking up until after the completion handler has run.h]hCall this to stop the last urb being unanchored from waking up any usb_wait_anchor_empty_timeout waiters. This is used in the hcd urb give- back path to delay waking up until after the completion handler has run.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&usb_anchor_resume_wakeups (C function)c.usb_anchor_resume_wakeupshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h:void usb_anchor_resume_wakeups (struct usb_anchor *anchor)h]j)}(h9void usb_anchor_resume_wakeups(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjRhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjehhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjRhhhjdhMubjp)}(husb_anchor_resume_wakeupsh]jv)}(husb_anchor_resume_wakeupsh]husb_anchor_resume_wakeups}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubah}(h]h ](jjeh"]h$]h&]jjuh1johjRhhhjdhMubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jysbc.usb_anchor_resume_wakeupsasbuh1hhjubj/)}(h h]h }(hjєhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjߔhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hanchorh]hanchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjRhhhjdhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjdhMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjdhMhjKhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjKhhhjdhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_anchor *anchor`` the anchor you want to resume wakeups on **Description** Allow usb_wait_anchor_empty_timeout waiters to be woken up again, and wake up any current waiters if the anchor is empty.h](h)}(h**Parameters**h]j)}(hj)h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj#ubj0)}(hhh]j5)}(hG``struct usb_anchor *anchor`` the anchor you want to resume wakeups on h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjHh]hstruct usb_anchor *anchor}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjBubjU)}(hhh]h)}(h(the anchor you want to resume wakeups onh]h(the anchor you want to resume wakeups on}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jThjBubeh}(h]h ]h"]h$]h&]uh1j4hj]hMhj?ubah}(h]h ]h"]h$]h&]uh1j/hj#ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj#ubh)}(hyAllow usb_wait_anchor_empty_timeout waiters to be woken up again, and wake up any current waiters if the anchor is empty.h]hyAllow usb_wait_anchor_empty_timeout waiters to be woken up again, and wake up any current waiters if the anchor is empty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*usb_wait_anchor_empty_timeout (C function)c.usb_wait_anchor_empty_timeouthNtauh1jhjqhhhNhNubj )}(hhh](j)}(hSint usb_wait_anchor_empty_timeout (struct usb_anchor *anchor, unsigned int timeout)h]j)}(hRint usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, unsigned int timeout)h](j@)}(hinth]hint}(hjȕhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjĕhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hjוhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjĕhhhj֕hMubjp)}(husb_wait_anchor_empty_timeouth]jv)}(husb_wait_anchor_empty_timeouth]husb_wait_anchor_empty_timeout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjĕhhhj֕hMubj)}(h1(struct usb_anchor *anchor, unsigned int timeout)h](j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj%modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_wait_anchor_empty_timeoutasbuh1hhjubj/)}(h h]h }(hjChhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjQhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hanchorh]hanchor}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int timeouth](j@)}(hunsignedh]hunsigned}(hjwhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjsubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjsubj@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjsubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjsubjv)}(htimeouth]htimeout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjĕhhhj֕hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj֕hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj֕hMhjhhubj)}(hhh]h)}(hwait for an anchor to be unusedh]hwait for an anchor to be unused}(hjٖhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj֖hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj֕hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX;**Parameters** ``struct usb_anchor *anchor`` the anchor you want to become unused ``unsigned int timeout`` how long you are willing to wait in milliseconds **Description** Call this is you want to be sure all an anchor's URBs have finished **Return** Non-zero if the anchor became unused. Zero on timeout.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubj0)}(hhh](j5)}(hC``struct usb_anchor *anchor`` the anchor you want to become unused h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjh]hstruct usb_anchor *anchor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubjU)}(hhh]h)}(h$the anchor you want to become unusedh]h$the anchor you want to become unused}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj/hMhjubj5)}(hJ``unsigned int timeout`` how long you are willing to wait in milliseconds h](j;)}(h``unsigned int timeout``h]j)}(hjSh]hunsigned int timeout}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjMubjU)}(hhh]h)}(h0how long you are willing to wait in millisecondsh]h0how long you are willing to wait in milliseconds}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1jThjMubeh}(h]h ]h"]h$]h&]uh1j4hjhhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hCCall this is you want to be sure all an anchor's URBs have finishedh]hECall this is you want to be sure all an anchor’s URBs have finished}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(h6Non-zero if the anchor became unused. Zero on timeout.h]h6Non-zero if the anchor became unused. Zero on timeout.}(hj˗hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j usb_get_from_anchor (C function)c.usb_get_from_anchorhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h]jA)}j4usb_get_from_anchorsbc.usb_get_from_anchorasbuh1hhjhhhjhMubj/)}(h h]h }(hj:hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubj_)}(hjbh]h*}(hjHhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhjhMubjp)}(husb_get_from_anchorh]jv)}(hj7h]husb_get_from_anchor}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjthhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjpubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjpubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j5c.usb_get_from_anchorasbuh1hhjpubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjpubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjpubjv)}(hanchorh]hanchor}(hj˘hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hget an anchor's oldest urbh]hget an anchor’s oldest urb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j j j j j juh1j hhhjqhNhNubj)}(hX **Parameters** ``struct usb_anchor *anchor`` the anchor whose urb you want **Description** This will take the oldest urb from an anchor, unanchor and return it **Return** The oldest urb from **anchor**, or ``NULL`` if **anchor** has no urbs associated with it.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubj0)}(hhh]j5)}(h<``struct usb_anchor *anchor`` the anchor whose urb you want h](j;)}(h``struct usb_anchor *anchor``h]j)}(hj6h]hstruct usb_anchor *anchor}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhj0ubjU)}(hhh]h)}(hthe anchor whose urb you wanth]hthe anchor whose urb you want}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjLubah}(h]h ]h"]h$]h&]uh1jThj0ubeh}(h]h ]h"]h$]h&]uh1j4hjKhMhj-ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjqh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hDThis will take the oldest urb from an anchor, unanchor and return ith]hDThis will take the oldest urb from an anchor, unanchor and return it}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(hYThe oldest urb from **anchor**, or ``NULL`` if **anchor** has no urbs associated with it.h](hThe oldest urb from }(hjhhhNhNubj)}(h **anchor**h]hanchor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjșhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(hjhhhNhNubj)}(h **anchor**h]hanchor}(hjڙhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh has no urbs associated with it.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&usb_scuttle_anchored_urbs (C function)c.usb_scuttle_anchored_urbshNtauh1jhjqhhhNhNubj )}(hhh](j)}(h:void usb_scuttle_anchored_urbs (struct usb_anchor *anchor)h]j)}(h9void usb_scuttle_anchored_urbs(struct usb_anchor *anchor)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMubj/)}(h h]h }(hj"hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj!hMubjp)}(husb_scuttle_anchored_urbsh]jv)}(husb_scuttle_anchored_urbsh]husb_scuttle_anchored_urbs}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj!hMubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjLubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjLubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjkubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjpmodnameN classnameNj8j;)}j>]jA)}j4j6sbc.usb_scuttle_anchored_urbsasbuh1hhjLubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjLubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjLubjv)}(hanchorh]hanchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj!hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj!hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj!hMhjhhubj)}(hhh]h)}(hunanchor all an anchor's urbsh]hunanchor all an anchor’s urbs}(hjӚhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjКhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_anchor *anchor`` the anchor whose urbs you want to unanchor **Description** use this to get rid of all an anchor's urbsh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubj0)}(hhh]j5)}(hI``struct usb_anchor *anchor`` the anchor whose urbs you want to unanchor h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjh]hstruct usb_anchor *anchor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubjU)}(hhh]h)}(h*the anchor whose urbs you want to unanchorh]h*the anchor whose urbs you want to unanchor}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj*ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj)hMhj ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubh)}(h+use this to get rid of all an anchor's urbsh]h-use this to get rid of all an anchor’s urbs}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_anchor_empty (C function)c.usb_anchor_emptyhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h0int usb_anchor_empty (struct usb_anchor *anchor)h]j)}(h/int usb_anchor_empty(struct usb_anchor *anchor)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chM ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM ubjp)}(husb_anchor_emptyh]jv)}(husb_anchor_emptyh]husb_anchor_empty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhM ubj)}(h(struct usb_anchor *anchor)h]j)}(hstruct usb_anchor *anchorh](j)}(hjh]hstruct}(hjћhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj͛ubj/)}(h h]h }(hjޛhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj͛ubh)}(hhh]jv)}(h usb_anchorh]h usb_anchor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_anchor_emptyasbuh1hhj͛ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj͛ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj͛ubjv)}(hanchorh]hanchor}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj͛ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjɛubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(his an anchor emptyh]his an anchor empty}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjQhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jlj jlj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_anchor *anchor`` the anchor you want to query **Return** 1 if the anchor has no urbs associated with it.h](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjpubj0)}(hhh]j5)}(h;``struct usb_anchor *anchor`` the anchor you want to query h](j;)}(h``struct usb_anchor *anchor``h]j)}(hjh]hstruct usb_anchor *anchor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjubjU)}(hhh]h)}(hthe anchor you want to queryh]hthe anchor you want to query}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubah}(h]h ]h"]h$]h&]uh1j/hjpubh)}(h **Return**h]j)}(hjМh]hReturn}(hjҜhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjΜubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjpubh)}(h/1 if the anchor has no urbs associated with it.h]h/1 if the anchor has no urbs associated with it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:161: ./drivers/usb/core/urb.chMhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_control_msg (C function)c.usb_control_msghNtauh1jhjqhhhNhNubj )}(hhh](j)}(hint usb_control_msg (struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout)h]j)}(hint usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKubj/)}(h h]h }(hj$hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj#hKubjp)}(husb_control_msgh]jv)}(husb_control_msgh]husb_control_msg}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj#hKubj)}(h(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjRhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjNubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjNubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjmubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjrmodnameN classnameNj8j;)}j>]jA)}j4j8sbc.usb_control_msgasbuh1hhjNubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjNubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjNubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hjĝhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjҝhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hpipeh]hpipe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h __u8 requesth](h)}(hhh]jv)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_control_msgasbuh1hhjubj/)}(h h]h }(hj6hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hrequesth]hrequest}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h__u8 requesttypeh](h)}(hhh]jv)}(h__u8h]h__u8}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjbmodnameN classnameNj8j;)}j>]jc.usb_control_msgasbuh1hhjYubj/)}(h h]h }(hj~hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubjv)}(h requesttypeh]h requesttype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h __u16 valueh](h)}(hhh]jv)}(h__u16h]h__u16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_control_msgasbuh1hhjubj/)}(h h]h }(hjƞhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hvalueh]hvalue}(hjԞhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h __u16 indexh](h)}(hhh]jv)}(h__u16h]h__u16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_control_msgasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h void *datah](j@)}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj1ubj/)}(h h]h }(hjChhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj1ubj_)}(hjbh]h*}(hjQhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj1ubjv)}(hdatah]hdata}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h __u16 sizeh](h)}(hhh]jv)}(h__u16h]h__u16}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjwubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj|modnameN classnameNj8j;)}j>]jc.usb_control_msgasbuh1hhjsubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjsubjv)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h int timeouth](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hj͟hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(htimeouth]htimeout}(hj۟hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj#hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj#hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj#hKhj hhubj)}(hhh]h)}(h;Builds a control urb, sends it off and waits for completionh]h;Builds a control urb, sends it off and waits for completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKohjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj#hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` pointer to the usb device to send the message to ``unsigned int pipe`` endpoint "pipe" to send the message to ``__u8 request`` USB message request value ``__u8 requesttype`` USB message request type value ``__u16 value`` USB message value ``__u16 index`` USB message index value ``void *data`` pointer to the data to send ``__u16 size`` length in bytes of the data to send ``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) **Context** task context, might sleep. **Description** This function sends a simple control message to a specified endpoint and waits for the message to complete, or timeout. Don't use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request. **Return** If successful, the number of bytes transferred. Otherwise, a negative error number.h](h)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKshj!ubj0)}(hhh](j5)}(hL``struct usb_device *dev`` pointer to the usb device to send the message to h](j;)}(h``struct usb_device *dev``h]j)}(hjFh]hstruct usb_device *dev}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKphj@ubjU)}(hhh]h)}(h0pointer to the usb device to send the message toh]h0pointer to the usb device to send the message to}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hKphj\ubah}(h]h ]h"]h$]h&]uh1jThj@ubeh}(h]h ]h"]h$]h&]uh1j4hj[hKphj=ubj5)}(h=``unsigned int pipe`` endpoint "pipe" to send the message to h](j;)}(h``unsigned int pipe``h]j)}(hjh]hunsigned int pipe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKqhjyubjU)}(hhh]h)}(h&endpoint "pipe" to send the message toh]h*endpoint “pipe” to send the message to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKqhjubah}(h]h ]h"]h$]h&]uh1jThjyubeh}(h]h ]h"]h$]h&]uh1j4hjhKqhj=ubj5)}(h+``__u8 request`` USB message request value h](j;)}(h``__u8 request``h]j)}(hjh]h __u8 request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKrhjubjU)}(hhh]h)}(hUSB message request valueh]hUSB message request value}(hjѠhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj͠hKrhjΠubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj͠hKrhj=ubj5)}(h4``__u8 requesttype`` USB message request type value h](j;)}(h``__u8 requesttype``h]j)}(hjh]h__u8 requesttype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKshjubjU)}(hhh]h)}(hUSB message request type valueh]hUSB message request type value}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKshjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKshj=ubj5)}(h"``__u16 value`` USB message value h](j;)}(h``__u16 value``h]j)}(hj*h]h __u16 value}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKthj$ubjU)}(hhh]h)}(hUSB message valueh]hUSB message value}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hKthj@ubah}(h]h ]h"]h$]h&]uh1jThj$ubeh}(h]h ]h"]h$]h&]uh1j4hj?hKthj=ubj5)}(h(``__u16 index`` USB message index value h](j;)}(h``__u16 index``h]j)}(hjch]h __u16 index}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKuhj]ubjU)}(hhh]h)}(hUSB message index valueh]hUSB message index value}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhKuhjyubah}(h]h ]h"]h$]h&]uh1jThj]ubeh}(h]h ]h"]h$]h&]uh1j4hjxhKuhj=ubj5)}(h+``void *data`` pointer to the data to send h](j;)}(h``void *data``h]j)}(hjh]h void *data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKvhjubjU)}(hhh]h)}(hpointer to the data to sendh]hpointer to the data to send}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKvhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKvhj=ubj5)}(h3``__u16 size`` length in bytes of the data to send h](j;)}(h``__u16 size``h]j)}(hjաh]h __u16 size}(hjסhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӡubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKwhjϡubjU)}(hhh]h)}(h#length in bytes of the data to sendh]h#length in bytes of the data to send}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKwhjubah}(h]h ]h"]h$]h&]uh1jThjϡubeh}(h]h ]h"]h$]h&]uh1j4hjhKwhj=ubj5)}(ho``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) h](j;)}(h``int timeout``h]j)}(hjh]h int timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKyhjubjU)}(hhh]h)}(h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)h]h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKxhj$ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj#hKyhj=ubeh}(h]h ]h"]h$]h&]uh1j/hj!ubh)}(h **Context**h]j)}(hjJh]hContext}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chK{hj!ubh)}(htask context, might sleep.h]htask context, might sleep.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chK{hj!ubh)}(h**Description**h]j)}(hjqh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chK}hj!ubh)}(hwThis function sends a simple control message to a specified endpoint and waits for the message to complete, or timeout.h]hwThis function sends a simple control message to a specified endpoint and waits for the message to complete, or timeout.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chK|hj!ubh)}(hXeDon't use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request.h]hXkDon’t use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don’t have a handle on the URB used, you can’t cancel the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj!ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj!ubh)}(hSIf successful, the number of bytes transferred. Otherwise, a negative error number.h]hSIf successful, the number of bytes transferred. Otherwise, a negative error number.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_control_msg_send (C function)c.usb_control_msg_sendhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hint usb_control_msg_send (struct usb_device *dev, __u8 endpoint, __u8 request, __u8 requesttype, __u16 value, __u16 index, const void *driver_data, __u16 size, int timeout, gfp_t memflags)h]j)}(hint usb_control_msg_send(struct usb_device *dev, __u8 endpoint, __u8 request, __u8 requesttype, __u16 value, __u16 index, const void *driver_data, __u16 size, int timeout, gfp_t memflags)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKubjp)}(husb_control_msg_sendh]jv)}(husb_control_msg_sendh]husb_control_msg_send}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKubj)}(h(struct usb_device *dev, __u8 endpoint, __u8 request, __u8 requesttype, __u16 value, __u16 index, const void *driver_data, __u16 size, int timeout, gfp_t memflags)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj)hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj%ubj/)}(h h]h }(hj6hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj%ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjDubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjImodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_control_msg_sendasbuh1hhj%ubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj%ubj_)}(hjbh]h*}(hjuhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj%ubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h __u8 endpointh](h)}(hhh]jv)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hendpointh]hendpoint}(hjʣhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h __u8 requesth](h)}(hhh]jv)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhjߣubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjߣubjv)}(hrequesth]hrequest}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjߣubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h__u8 requesttypeh](h)}(hhh]jv)}(h__u8h]h__u8}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj0modnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhj'ubj/)}(h h]h }(hjLhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj'ubjv)}(h requesttypeh]h requesttype}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h __u16 valueh](h)}(hhh]jv)}(h__u16h]h__u16}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjxmodnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhjoubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjoubjv)}(hvalueh]hvalue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h __u16 indexh](h)}(hhh]jv)}(h__u16h]h__u16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhjubj/)}(h h]h }(hjܤhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(hconst void *driver_datah](j)}(hj h]hconst}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hj,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj:hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(h driver_datah]h driver_data}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h __u16 sizeh](h)}(hhh]jv)}(h__u16h]h__u16}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjemodnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhj\ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj\ubjv)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h int timeouth](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(htimeouth]htimeout}(hjĥhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(hgfp_t memflagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjݥubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jcc.usb_control_msg_sendasbuh1hhj٥ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj٥ubjv)}(hmemflagsh]hmemflags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj٥ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jߢah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hFBuilds a control "send" message, sends it off and waits for completionh]hJBuilds a control “send” message, sends it off and waits for completion}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj3hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jNj jNj j juh1j hhhjqhNhNubj)}(hX2**Parameters** ``struct usb_device *dev`` pointer to the usb device to send the message to ``__u8 endpoint`` endpoint to send the message to ``__u8 request`` USB message request value ``__u8 requesttype`` USB message request type value ``__u16 value`` USB message value ``__u16 index`` USB message index value ``const void *driver_data`` pointer to the data to send ``__u16 size`` length in bytes of the data to send ``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) ``gfp_t memflags`` the flags for memory allocation for buffers **Context** !in_interrupt () **Description** This function sends a control message to a specified endpoint that is not expected to fill in a response (i.e. a "send message") and waits for the message to complete, or timeout. Do not use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request. The data pointer can be made to a reference on the stack, or anywhere else, as it will not be modified at all. This does not have the restriction that usb_control_msg() has where the data pointer must be to dynamically allocated memory (i.e. memory that can be successfully DMAed to a device). **Return** If successful, 0 is returned, Otherwise, a negative error number.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubj0)}(hhh](j5)}(hL``struct usb_device *dev`` pointer to the usb device to send the message to h](j;)}(h``struct usb_device *dev``h]j)}(hjwh]hstruct usb_device *dev}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjqubjU)}(hhh]h)}(h0pointer to the usb device to send the message toh]h0pointer to the usb device to send the message to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjqubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubj5)}(h2``__u8 endpoint`` endpoint to send the message to h](j;)}(h``__u8 endpoint``h]j)}(hjh]h __u8 endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hendpoint to send the message toh]hendpoint to send the message to}(hjɦhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjŦhKhjƦubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjŦhKhjnubj5)}(h+``__u8 request`` USB message request value h](j;)}(h``__u8 request``h]j)}(hjh]h __u8 request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hUSB message request valueh]hUSB message request value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubj5)}(h4``__u8 requesttype`` USB message request type value h](j;)}(h``__u8 requesttype``h]j)}(hj"h]h__u8 requesttype}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hUSB message request type valueh]hUSB message request type value}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hKhj8ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj7hKhjnubj5)}(h"``__u16 value`` USB message value h](j;)}(h``__u16 value``h]j)}(hj[h]h __u16 value}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjUubjU)}(hhh]h)}(hUSB message valueh]hUSB message value}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphKhjqubah}(h]h ]h"]h$]h&]uh1jThjUubeh}(h]h ]h"]h$]h&]uh1j4hjphKhjnubj5)}(h(``__u16 index`` USB message index value h](j;)}(h``__u16 index``h]j)}(hjh]h __u16 index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hUSB message index valueh]hUSB message index value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubj5)}(h8``const void *driver_data`` pointer to the data to send h](j;)}(h``const void *driver_data``h]j)}(hjͧh]hconst void *driver_data}(hjϧhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˧ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjǧubjU)}(hhh]h)}(hpointer to the data to sendh]hpointer to the data to send}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjǧubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubj5)}(h3``__u16 size`` length in bytes of the data to send h](j;)}(h``__u16 size``h]j)}(hjh]h __u16 size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(h#length in bytes of the data to sendh]h#length in bytes of the data to send}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubj5)}(ho``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) h](j;)}(h``int timeout``h]j)}(hj?h]h int timeout}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj9ubjU)}(hhh]h)}(h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)h]h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjUubah}(h]h ]h"]h$]h&]uh1jThj9ubeh}(h]h ]h"]h$]h&]uh1j4hjThKhjnubj5)}(h?``gfp_t memflags`` the flags for memory allocation for buffers h](j;)}(h``gfp_t memflags``h]j)}(hjyh]hgfp_t memflags}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjsubjU)}(hhh]h)}(h+the flags for memory allocation for buffersh]h+the flags for memory allocation for buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjsubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubeh}(h]h ]h"]h$]h&]uh1j/hjRubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(h!in_interrupt ()h]h!in_interrupt ()}(hjʨhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(h**Description**h]j)}(hjۨh]h Description}(hjݨhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj٨ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(hThis function sends a control message to a specified endpoint that is not expected to fill in a response (i.e. a "send message") and waits for the message to complete, or timeout.h]hThis function sends a control message to a specified endpoint that is not expected to fill in a response (i.e. a “send message”) and waits for the message to complete, or timeout.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(hXfDo not use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request.h]hXjDo not use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don’t have a handle on the URB used, you can’t cancel the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(hX&The data pointer can be made to a reference on the stack, or anywhere else, as it will not be modified at all. This does not have the restriction that usb_control_msg() has where the data pointer must be to dynamically allocated memory (i.e. memory that can be successfully DMAed to a device).h]hX&The data pointer can be made to a reference on the stack, or anywhere else, as it will not be modified at all. This does not have the restriction that usb_control_msg() has where the data pointer must be to dynamically allocated memory (i.e. memory that can be successfully DMAed to a device).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(h **Return**h]j)}(hj h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubh)}(hAIf successful, 0 is returned, Otherwise, a negative error number.h]hAIf successful, 0 is returned, Otherwise, a negative error number.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_control_msg_recv (C function)c.usb_control_msg_recvhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hint usb_control_msg_recv (struct usb_device *dev, __u8 endpoint, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *driver_data, __u16 size, int timeout, gfp_t memflags)h]j)}(hint usb_control_msg_recv(struct usb_device *dev, __u8 endpoint, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *driver_data, __u16 size, int timeout, gfp_t memflags)h](j@)}(hinth]hint}(hjehhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjahhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjthhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjahhhjshMubjp)}(husb_control_msg_recvh]jv)}(husb_control_msg_recvh]husb_control_msg_recv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjahhhjshMubj)}(h(struct usb_device *dev, __u8 endpoint, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *driver_data, __u16 size, int timeout, gfp_t memflags)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj©modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_control_msg_recvasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h __u8 endpointh](h)}(hhh]jv)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhjubj/)}(h h]h }(hj5hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hendpointh]hendpoint}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h __u8 requesth](h)}(hhh]jv)}(h__u8h]h__u8}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjamodnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhjXubj/)}(h h]h }(hj}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjXubjv)}(hrequesth]hrequest}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h__u8 requesttypeh](h)}(hhh]jv)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhjubj/)}(h h]h }(hjŪhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(h requesttypeh]h requesttype}(hjӪhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h __u16 valueh](h)}(hhh]jv)}(h__u16h]h__u16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hvalueh]hvalue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h __u16 indexh](h)}(hhh]jv)}(h__u16h]h__u16}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj9modnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhj0ubj/)}(h h]h }(hjUhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj0ubjv)}(hindexh]hindex}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvoid *driver_datah](j@)}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjxubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjxubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjxubjv)}(h driver_datah]h driver_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h __u16 sizeh](h)}(hhh]jv)}(h__u16h]h__u16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjëmodnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhjubj/)}(h h]h }(hj߫hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int timeouth](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(htimeouth]htimeout}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t memflagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj@modnameN classnameNj8j;)}j>]jܩc.usb_control_msg_recvasbuh1hhj7ubj/)}(h h]h }(hj\hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj7ubjv)}(hmemflagsh]hmemflags}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjahhhjshMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhjshMubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjshMhjZhhubj)}(hhh]h)}(hIBuilds a control "receive" message, sends it off and waits for completionh]hMBuilds a control “receive” message, sends it off and waits for completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hXi**Parameters** ``struct usb_device *dev`` pointer to the usb device to send the message to ``__u8 endpoint`` endpoint to send the message to ``__u8 request`` USB message request value ``__u8 requesttype`` USB message request type value ``__u16 value`` USB message value ``__u16 index`` USB message index value ``void *driver_data`` pointer to the data to be filled in by the message ``__u16 size`` length in bytes of the data to be received ``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) ``gfp_t memflags`` the flags for memory allocation for buffers **Context** !in_interrupt () **Description** This function sends a control message to a specified endpoint that is expected to fill in a response (i.e. a "receive message") and waits for the message to complete, or timeout. Do not use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request. The data pointer can be made to a reference on the stack, or anywhere else that can be successfully written to. This function does not have the restriction that usb_control_msg() has where the data pointer must be to dynamically allocated memory (i.e. memory that can be successfully DMAed to a device). The "whole" message must be properly received from the device in order for this function to be successful. If a device returns less than the expected amount of data, then the function will fail. Do not use this for messages where a variable amount of data might be returned. **Return** If successful, 0 is returned, Otherwise, a negative error number.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubj0)}(hhh](j5)}(hL``struct usb_device *dev`` pointer to the usb device to send the message to h](j;)}(h``struct usb_device *dev``h]j)}(hjլh]hstruct usb_device *dev}(hj׬hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӬubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjϬubjU)}(hhh]h)}(h0pointer to the usb device to send the message toh]h0pointer to the usb device to send the message to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjϬubeh}(h]h ]h"]h$]h&]uh1j4hjhKhj̬ubj5)}(h2``__u8 endpoint`` endpoint to send the message to h](j;)}(h``__u8 endpoint``h]j)}(hjh]h __u8 endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hendpoint to send the message toh]hendpoint to send the message to}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hKhj$ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj#hKhj̬ubj5)}(h+``__u8 request`` USB message request value h](j;)}(h``__u8 request``h]j)}(hjGh]h __u8 request}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjAubjU)}(hhh]h)}(hUSB message request valueh]hUSB message request value}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hKhj]ubah}(h]h ]h"]h$]h&]uh1jThjAubeh}(h]h ]h"]h$]h&]uh1j4hj\hKhj̬ubj5)}(h4``__u8 requesttype`` USB message request type value h](j;)}(h``__u8 requesttype``h]j)}(hjh]h__u8 requesttype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjzubjU)}(hhh]h)}(hUSB message request type valueh]hUSB message request type value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjzubeh}(h]h ]h"]h$]h&]uh1j4hjhKhj̬ubj5)}(h"``__u16 value`` USB message value h](j;)}(h``__u16 value``h]j)}(hjh]h __u16 value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hUSB message valueh]hUSB message value}(hjҭhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjέhKhjϭubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjέhKhj̬ubj5)}(h(``__u16 index`` USB message index value h](j;)}(h``__u16 index``h]j)}(hjh]h __u16 index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(hUSB message index valueh]hUSB message index value}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhj̬ubj5)}(hI``void *driver_data`` pointer to the data to be filled in by the message h](j;)}(h``void *driver_data``h]j)}(hj+h]hvoid *driver_data}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj%ubjU)}(hhh]h)}(h2pointer to the data to be filled in by the messageh]h2pointer to the data to be filled in by the message}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKhjAubah}(h]h ]h"]h$]h&]uh1jThj%ubeh}(h]h ]h"]h$]h&]uh1j4hj@hKhj̬ubj5)}(h:``__u16 size`` length in bytes of the data to be received h](j;)}(h``__u16 size``h]j)}(hjdh]h __u16 size}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhj^ubjU)}(hhh]h)}(h*length in bytes of the data to be receivedh]h*length in bytes of the data to be received}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhKhjzubah}(h]h ]h"]h$]h&]uh1jThj^ubeh}(h]h ]h"]h$]h&]uh1j4hjyhKhj̬ubj5)}(ho``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) h](j;)}(h``int timeout``h]j)}(hjh]h int timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubjU)}(hhh]h)}(h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)h]h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhj̬ubj5)}(h?``gfp_t memflags`` the flags for memory allocation for buffers h](j;)}(h``gfp_t memflags``h]j)}(hj׮h]hgfp_t memflags}(hjٮhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjծubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjѮubjU)}(hhh]h)}(h+the flags for memory allocation for buffersh]h+the flags for memory allocation for buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjѮubeh}(h]h ]h"]h$]h&]uh1j4hjhKhj̬ubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubh)}(h!in_interrupt ()h]h!in_interrupt ()}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubh)}(h**Description**h]j)}(hj9h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubh)}(hThis function sends a control message to a specified endpoint that is expected to fill in a response (i.e. a "receive message") and waits for the message to complete, or timeout.h]hThis function sends a control message to a specified endpoint that is expected to fill in a response (i.e. a “receive message”) and waits for the message to complete, or timeout.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubh)}(hXfDo not use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request.h]hXjDo not use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb(). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don’t have a handle on the URB used, you can’t cancel the request.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubh)}(hX0The data pointer can be made to a reference on the stack, or anywhere else that can be successfully written to. This function does not have the restriction that usb_control_msg() has where the data pointer must be to dynamically allocated memory (i.e. memory that can be successfully DMAed to a device).h]hX0The data pointer can be made to a reference on the stack, or anywhere else that can be successfully written to. This function does not have the restriction that usb_control_msg() has where the data pointer must be to dynamically allocated memory (i.e. memory that can be successfully DMAed to a device).}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chKhjubh)}(hXThe "whole" message must be properly received from the device in order for this function to be successful. If a device returns less than the expected amount of data, then the function will fail. Do not use this for messages where a variable amount of data might be returned.h]hXThe “whole” message must be properly received from the device in order for this function to be successful. If a device returns less than the expected amount of data, then the function will fail. Do not use this for messages where a variable amount of data might be returned.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hAIf successful, 0 is returned, Otherwise, a negative error number.h]hAIf successful, 0 is returned, Otherwise, a negative error number.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_interrupt_msg (C function)c.usb_interrupt_msghNtauh1jhjqhhhNhNubj )}(hhh](j)}(h{int usb_interrupt_msg (struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)h]j)}(hzint usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)h](j@)}(hinth]hint}(hjүhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjίhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMEubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjίhhhjhMEubjp)}(husb_interrupt_msgh]jv)}(husb_interrupt_msgh]husb_interrupt_msg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjίhhhjhMEubj)}(he(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)h](j)}(hstruct usb_device *usb_devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj/modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_interrupt_msgasbuh1hhj ubj/)}(h h]h }(hjMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj[hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(husb_devh]husb_dev}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj}ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}ubj@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj}ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}ubjv)}(hpipeh]hpipe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h void *datah](j@)}(hvoidh]hvoid}(hjҰhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjΰubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjΰubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjΰubjv)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjΰubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint lenh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hj"hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hlenh]hlen}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint *actual_lengthh](j@)}(hinth]hint}(hjIhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjEubj/)}(h h]h }(hjWhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjEubj_)}(hjbh]h*}(hjehhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjEubjv)}(h actual_lengthh]h actual_length}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int timeouth](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(htimeouth]htimeout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjίhhhjhMEubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjʯhhhjhMEubah}(h]jůah ](jjeh"]h$]h&]jj)jhuh1jhjhMEhjǯhhubj)}(hhh]h)}(h>Builds an interrupt urb, sends it off and waits for completionh]h>Builds an interrupt urb, sends it off and waits for completion}(hjѱhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM,hjαhhubah}(h]h ]h"]h$]h&]uh1jhjǯhhhjhMEubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *usb_dev`` pointer to the usb device to send the message to ``unsigned int pipe`` endpoint "pipe" to send the message to ``void *data`` pointer to the data to send ``int len`` length in bytes of the data to send ``int *actual_length`` pointer to a location to put the actual length transferred in bytes ``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) **Context** task context, might sleep. **Description** This function sends a simple interrupt message to a specified endpoint and waits for the message to complete, or timeout. Don't use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb() If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request. **Return** If successful, 0. Otherwise a negative error number. The number of actual bytes transferred will be stored in the **actual_length** parameter.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM0hjubj0)}(hhh](j5)}(hP``struct usb_device *usb_dev`` pointer to the usb device to send the message to h](j;)}(h``struct usb_device *usb_dev``h]j)}(hjh]hstruct usb_device *usb_dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM-hj ubjU)}(hhh]h)}(h0pointer to the usb device to send the message toh]h0pointer to the usb device to send the message to}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hM-hj(ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj'hM-hj ubj5)}(h=``unsigned int pipe`` endpoint "pipe" to send the message to h](j;)}(h``unsigned int pipe``h]j)}(hjKh]hunsigned int pipe}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM.hjEubjU)}(hhh]h)}(h&endpoint "pipe" to send the message toh]h*endpoint “pipe” to send the message to}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hM.hjaubah}(h]h ]h"]h$]h&]uh1jThjEubeh}(h]h ]h"]h$]h&]uh1j4hj`hM.hj ubj5)}(h+``void *data`` pointer to the data to send h](j;)}(h``void *data``h]j)}(hjh]h void *data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM/hj~ubjU)}(hhh]h)}(hpointer to the data to sendh]hpointer to the data to send}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM/hjubah}(h]h ]h"]h$]h&]uh1jThj~ubeh}(h]h ]h"]h$]h&]uh1j4hjhM/hj ubj5)}(h0``int len`` length in bytes of the data to send h](j;)}(h ``int len``h]j)}(hjh]hint len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM0hjubjU)}(hhh]h)}(h#length in bytes of the data to sendh]h#length in bytes of the data to send}(hjֲhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjҲhM0hjӲubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjҲhM0hj ubj5)}(h[``int *actual_length`` pointer to a location to put the actual length transferred in bytes h](j;)}(h``int *actual_length``h]j)}(hjh]hint *actual_length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM2hjubjU)}(hhh]h)}(hCpointer to a location to put the actual length transferred in bytesh]hCpointer to a location to put the actual length transferred in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM1hj ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj hM2hj ubj5)}(ho``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) h](j;)}(h``int timeout``h]j)}(hj0h]h int timeout}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM4hj*ubjU)}(hhh]h)}(h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)h]h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM3hjFubah}(h]h ]h"]h$]h&]uh1jThj*ubeh}(h]h ]h"]h$]h&]uh1j4hjEhM4hj ubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjlh]hContext}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM6hjubh)}(htask context, might sleep.h]htask context, might sleep.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM6hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM8hjubh)}(hyThis function sends a simple interrupt message to a specified endpoint and waits for the message to complete, or timeout.h]hyThis function sends a simple interrupt message to a specified endpoint and waits for the message to complete, or timeout.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM7hjubh)}(hXdDon't use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb() If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request.h]hXjDon’t use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb() If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don’t have a handle on the URB used, you can’t cancel the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM:hjubh)}(h **Return**h]j)}(hjɳh]hReturn}(hj˳hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdzubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM@hjubh)}(hIf successful, 0. Otherwise a negative error number. The number of actual bytes transferred will be stored in the **actual_length** parameter.h](hrIf successful, 0. Otherwise a negative error number. The number of actual bytes transferred will be stored in the }(hj߳hhhNhNubj)}(h**actual_length**h]h actual_length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߳ubh parameter.}(hj߳hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMAhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_bulk_msg (C function)c.usb_bulk_msghNtauh1jhjqhhhNhNubj )}(hhh](j)}(hvint usb_bulk_msg (struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)h]j)}(huint usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)h](j@)}(hinth]hint}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMlubj/)}(h h]h }(hj/hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj.hMlubjp)}(h usb_bulk_msgh]jv)}(h usb_bulk_msgh]h usb_bulk_msg}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj.hMlubj)}(he(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)h](j)}(hstruct usb_device *usb_devh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjYubj/)}(h h]h }(hjjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjxubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj}modnameN classnameNj8j;)}j>]jA)}j4jCsbc.usb_bulk_msgasbuh1hhjYubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjYubjv)}(husb_devh]husb_dev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(hunsigned int pipeh](j@)}(hunsignedh]hunsigned}(hjϴhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj˴ubj/)}(h h]h }(hjݴhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj˴ubj@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj˴ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj˴ubjv)}(hpipeh]hpipe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj˴ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(h void *datah](j@)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hj.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj<hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdatah]hdata}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(hint lenh](j@)}(hinth]hint}(hjbhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj^ubj/)}(h h]h }(hjphhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj^ubjv)}(hlenh]hlen}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(hint *actual_lengthh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(h actual_lengthh]h actual_length}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(h int timeouth](j@)}(hinth]hint}(hjٵhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjյubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjյubjv)}(htimeouth]htimeout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjյubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj.hMlubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj.hMlubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj.hMlhjhhubj)}(hhh]h)}(h8Builds a bulk urb, sends it off and waits for completionh]h8Builds a bulk urb, sends it off and waits for completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj.hMlubeh}(h]h ](jfunctioneh"]h$]h&]j jj j7j j7j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *usb_dev`` pointer to the usb device to send the message to ``unsigned int pipe`` endpoint "pipe" to send the message to ``void *data`` pointer to the data to send ``int len`` length in bytes of the data to send ``int *actual_length`` pointer to a location to put the actual length transferred in bytes ``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) **Context** task context, might sleep. **Description** This function sends a simple bulk message to a specified endpoint and waits for the message to complete, or timeout. Don't use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb() If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request. Because there is no usb_interrupt_msg() and no USBDEVFS_INTERRUPT ioctl, users are forced to abuse this routine by using it to submit URBs for interrupt endpoints. We will take the liberty of creating an interrupt URB (with the default interval) if the target is an interrupt endpoint. **Return** If successful, 0. Otherwise a negative error number. The number of actual bytes transferred will be stored in the **actual_length** parameter.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMQhj;ubj0)}(hhh](j5)}(hP``struct usb_device *usb_dev`` pointer to the usb device to send the message to h](j;)}(h``struct usb_device *usb_dev``h]j)}(hj`h]hstruct usb_device *usb_dev}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMNhjZubjU)}(hhh]h)}(h0pointer to the usb device to send the message toh]h0pointer to the usb device to send the message to}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMNhjvubah}(h]h ]h"]h$]h&]uh1jThjZubeh}(h]h ]h"]h$]h&]uh1j4hjuhMNhjWubj5)}(h=``unsigned int pipe`` endpoint "pipe" to send the message to h](j;)}(h``unsigned int pipe``h]j)}(hjh]hunsigned int pipe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMOhjubjU)}(hhh]h)}(h&endpoint "pipe" to send the message toh]h*endpoint “pipe” to send the message to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMOhjWubj5)}(h+``void *data`` pointer to the data to send h](j;)}(h``void *data``h]j)}(hjҶh]h void *data}(hjԶhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjжubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMPhj̶ubjU)}(hhh]h)}(hpointer to the data to sendh]hpointer to the data to send}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMPhjubah}(h]h ]h"]h$]h&]uh1jThj̶ubeh}(h]h ]h"]h$]h&]uh1j4hjhMPhjWubj5)}(h0``int len`` length in bytes of the data to send h](j;)}(h ``int len``h]j)}(hj h]hint len}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMQhjubjU)}(hhh]h)}(h#length in bytes of the data to sendh]h#length in bytes of the data to send}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMQhj!ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj hMQhjWubj5)}(h[``int *actual_length`` pointer to a location to put the actual length transferred in bytes h](j;)}(h``int *actual_length``h]j)}(hjDh]hint *actual_length}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMShj>ubjU)}(hhh]h)}(hCpointer to a location to put the actual length transferred in bytesh]hCpointer to a location to put the actual length transferred in bytes}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMRhjZubah}(h]h ]h"]h$]h&]uh1jThj>ubeh}(h]h ]h"]h$]h&]uh1j4hjYhMShjWubj5)}(ho``int timeout`` time in msecs to wait for the message to complete before timing out (if 0 the wait is forever) h](j;)}(h``int timeout``h]j)}(hj~h]h int timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMUhjxubjU)}(hhh]h)}(h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)h]h^time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMThjubah}(h]h ]h"]h$]h&]uh1jThjxubeh}(h]h ]h"]h$]h&]uh1j4hjhMUhjWubeh}(h]h ]h"]h$]h&]uh1j/hj;ubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMWhj;ubh)}(htask context, might sleep.h]htask context, might sleep.}(hjзhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMWhj;ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߷ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMYhj;ubh)}(htThis function sends a simple bulk message to a specified endpoint and waits for the message to complete, or timeout.h]htThis function sends a simple bulk message to a specified endpoint and waits for the message to complete, or timeout.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMXhj;ubh)}(hXdDon't use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb() If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request.h]hXjDon’t use this function from within an interrupt context. If you need an asynchronous message, or need to send a message from within interrupt context, use usb_submit_urb() If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. Since you don’t have a handle on the URB used, you can’t cancel the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM[hj;ubh)}(hXBecause there is no usb_interrupt_msg() and no USBDEVFS_INTERRUPT ioctl, users are forced to abuse this routine by using it to submit URBs for interrupt endpoints. We will take the liberty of creating an interrupt URB (with the default interval) if the target is an interrupt endpoint.h]hXBecause there is no usb_interrupt_msg() and no USBDEVFS_INTERRUPT ioctl, users are forced to abuse this routine by using it to submit URBs for interrupt endpoints. We will take the liberty of creating an interrupt URB (with the default interval) if the target is an interrupt endpoint.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMahj;ubh)}(h **Return**h]j)}(hj&h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMfhj;ubh)}(hIf successful, 0. Otherwise a negative error number. The number of actual bytes transferred will be stored in the **actual_length** parameter.h](hrIf successful, 0. Otherwise a negative error number. The number of actual bytes transferred will be stored in the }(hj<hhhNhNubj)}(h**actual_length**h]h actual_length}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh parameter.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMghj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_sg_init (C function) c.usb_sg_inithNtauh1jhjqhhhNhNubj )}(hhh](j)}(hint usb_sg_init (struct usb_sg_request *io, struct usb_device *dev, unsigned pipe, unsigned period, struct scatterlist *sg, int nents, size_t length, gfp_t mem_flags)h]j)}(hint usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, unsigned pipe, unsigned period, struct scatterlist *sg, int nents, size_t length, gfp_t mem_flags)h](j@)}(hinth]hint}(hj}hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjyhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjyhhhjhMubjp)}(h usb_sg_inith]jv)}(h usb_sg_inith]h usb_sg_init}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjyhhhjhMubj)}(h(struct usb_sg_request *io, struct usb_device *dev, unsigned pipe, unsigned period, struct scatterlist *sg, int nents, size_t length, gfp_t mem_flags)h](j)}(hstruct usb_sg_request *ioh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjǸhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_sg_requesth]husb_sg_request}(hjظhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjոubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjڸmodnameN classnameNj8j;)}j>]jA)}j4jsb c.usb_sg_initasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hioh]hio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj,hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj(ubj/)}(h h]h }(hj9hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj(ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjGubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjLmodnameN classnameNj8j;)}j>]j c.usb_sg_initasbuh1hhj(ubj/)}(h h]h }(hjhhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj(ubj_)}(hjbh]h*}(hjvhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj(ubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h unsigned pipeh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hpipeh]hpipe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned periodh](j@)}(hunsignedh]hunsigned}(hjѹhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj͹ubj/)}(h h]h }(hj߹hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj͹ubjv)}(hperiodh]hperiod}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj͹ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct scatterlist *sgh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h scatterlisth]h scatterlist}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj&modnameN classnameNj8j;)}j>]j c.usb_sg_initasbuh1hhjubj/)}(h h]h }(hjBhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjPhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hsgh]hsg}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int nentsh](j@)}(hinth]hint}(hjvhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjrubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjrubjv)}(hnentsh]hnents}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lengthh](h)}(hhh]jv)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j c.usb_sg_initasbuh1hhjubj/)}(h h]h }(hj̺hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hlengthh]hlength}(hjںhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t mem_flagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j c.usb_sg_initasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(h mem_flagsh]h mem_flags}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjyhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhMubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjrhhubj)}(hhh]h)}(h8initializes scatterlist-based bulk/interrupt I/O requesth]h8initializes scatterlist-based bulk/interrupt I/O request}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjIhhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jdj jdj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_sg_request *io`` request block being initialized. until usb_sg_wait() returns, treat this as a pointer to an opaque block of memory, ``struct usb_device *dev`` the usb device that will send or receive the data ``unsigned pipe`` endpoint "pipe" used to transfer the data ``unsigned period`` polling rate for interrupt endpoints, in frames or (for high speed endpoints) microframes; ignored for bulk ``struct scatterlist *sg`` scatterlist entries ``int nents`` how many entries in the scatterlist ``size_t length`` how many bytes to send from the scatterlist, or zero to send every byte identified in the list. ``gfp_t mem_flags`` SLAB_* flags affecting memory allocations in this call **Description** This initializes a scatter/gather request, allocating resources such as I/O mappings and urb memory (except maybe memory used by USB controller drivers). The request must be issued using usb_sg_wait(), which waits for the I/O to complete (or to be canceled) and then cleans up all resources allocated by usb_sg_init(). The request may be canceled with usb_sg_cancel(), either before or after usb_sg_wait() is called. **Return** Zero for success, else a negative errno value.h](h)}(h**Parameters**h]j)}(hjnh]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubj0)}(hhh](j5)}(h``struct usb_sg_request *io`` request block being initialized. until usb_sg_wait() returns, treat this as a pointer to an opaque block of memory, h](j;)}(h``struct usb_sg_request *io``h]j)}(hjh]hstruct usb_sg_request *io}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(htrequest block being initialized. until usb_sg_wait() returns, treat this as a pointer to an opaque block of memory,h]htrequest block being initialized. until usb_sg_wait() returns, treat this as a pointer to an opaque block of memory,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(hM``struct usb_device *dev`` the usb device that will send or receive the data h](j;)}(h``struct usb_device *dev``h]j)}(hjǻh]hstruct usb_device *dev}(hjɻhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŻubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h1the usb device that will send or receive the datah]h1the usb device that will send or receive the data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjܻhMhjݻubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjܻhMhjubj5)}(h<``unsigned pipe`` endpoint "pipe" used to transfer the data h](j;)}(h``unsigned pipe``h]j)}(hjh]h unsigned pipe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h)endpoint "pipe" used to transfer the datah]h-endpoint “pipe” used to transfer the data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h``unsigned period`` polling rate for interrupt endpoints, in frames or (for high speed endpoints) microframes; ignored for bulk h](j;)}(h``unsigned period``h]j)}(hj9h]hunsigned period}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj3ubjU)}(hhh]h)}(hkpolling rate for interrupt endpoints, in frames or (for high speed endpoints) microframes; ignored for bulkh]hkpolling rate for interrupt endpoints, in frames or (for high speed endpoints) microframes; ignored for bulk}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjOubah}(h]h ]h"]h$]h&]uh1jThj3ubeh}(h]h ]h"]h$]h&]uh1j4hjNhMhjubj5)}(h/``struct scatterlist *sg`` scatterlist entries h](j;)}(h``struct scatterlist *sg``h]j)}(hjsh]hstruct scatterlist *sg}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjmubjU)}(hhh]h)}(hscatterlist entriesh]hscatterlist entries}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjmubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h2``int nents`` how many entries in the scatterlist h](j;)}(h ``int nents``h]j)}(hjh]h int nents}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h#how many entries in the scatterlisth]h#how many entries in the scatterlist}(hjżhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj¼ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(hr``size_t length`` how many bytes to send from the scatterlist, or zero to send every byte identified in the list. h](j;)}(h``size_t length``h]j)}(hjh]h size_t length}(hjhhhNhNubah}(h]h ]'h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj߼ubjU)}(hhh]h)}(h_how many bytes to send from the scatterlist, or zero to send every byte identified in the list.h]h_how many bytes to send from the scatterlist, or zero to send every byte identified in the list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubah}(h]h ]h"]h$]h&]uh1jThj߼ubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(hK``gfp_t mem_flags`` SLAB_* flags affecting memory allocations in this call h](j;)}(h``gfp_t mem_flags``h]j)}(hjh]hgfp_t mem_flags}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h6SLAB_* flags affecting memory allocations in this callh]h6SLAB_* flags affecting memory allocations in this call}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMhj5ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj4hMhjubeh}(h]h ]h"]h$]h&]uh1j/hjhubh)}(h**Description**h]j)}(hjZh]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubh)}(hThis initializes a scatter/gather request, allocating resources such as I/O mappings and urb memory (except maybe memory used by USB controller drivers).h]hThis initializes a scatter/gather request, allocating resources such as I/O mappings and urb memory (except maybe memory used by USB controller drivers).}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubh)}(hThe request must be issued using usb_sg_wait(), which waits for the I/O to complete (or to be canceled) and then cleans up all resources allocated by usb_sg_init().h]hThe request must be issued using usb_sg_wait(), which waits for the I/O to complete (or to be canceled) and then cleans up all resources allocated by usb_sg_init().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubh)}(haThe request may be canceled with usb_sg_cancel(), either before or after usb_sg_wait() is called.h]haThe request may be canceled with usb_sg_cancel(), either before or after usb_sg_wait() is called.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubh)}(h.Zero for success, else a negative errno value.h]h.Zero for success, else a negative errno value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_sg_wait (C function) c.usb_sg_waithNtauh1jhjqhhhNhNubj )}(hhh](j)}(h,void usb_sg_wait (struct usb_sg_request *io)h]j)}(h+void usb_sg_wait(struct usb_sg_request *io)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(h usb_sg_waith]jv)}(h usb_sg_waith]h usb_sg_wait}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct usb_sg_request *io)h]j)}(hstruct usb_sg_request *ioh](j)}(hjh]hstruct}(hj!hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_sg_requesth]husb_sg_request}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjAmodnameN classnameNj8j;)}j>]jA)}j4jsb c.usb_sg_waitasbuh1hhjubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjmhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hioh]hio}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjܽhhhjhMubah}(h]j׽ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjٽhhubj)}(hhh]h)}(h,synchronously execute scatter/gather requesth]h,synchronously execute scatter/gather request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM_hjhhubah}(h]h ]h"]h$]h&]uh1jhjٽhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_sg_request *io`` request block handle, as initialized with usb_sg_init(). some fields become accessible when this call returns. **Context** task context, might sleep. **Description** This function blocks until the specified I/O operation completes. It leverages the grouping of the related I/O requests to get good transfer rates, by queueing the requests. At higher speeds, such queuing can significantly improve USB throughput. There are three kinds of completion for this function. (1) success, where io->status is zero. The number of io->bytes transferred is as requested. (2) error, where io->status is a negative errno value. The number of io->bytes transferred before the error is usually less than requested, and can be nonzero. (3) cancellation, a type of error with status -ECONNRESET that is initiated by usb_sg_cancel(). When this function returns, all memory allocated through usb_sg_init() or this call will have been freed. The request block parameter may still be passed to usb_sg_cancel(), or it may be freed. It could also be reinitialized and then reused. Data Transfer Rates: Bulk transfers are valid for full or high speed endpoints. The best full speed data rate is 19 packets of 64 bytes each per frame, or 1216 bytes per millisecond. The best high speed data rate is 13 packets of 512 bytes each per microframe, or 52 KBytes per millisecond. The reason to use interrupt transfers through this API would most likely be to reserve high speed bandwidth, where up to 24 KBytes per millisecond could be transferred. That capability is less useful for low or full speed interrupt endpoints, which allow at most one packet per millisecond, of at most 8 or 64 bytes (respectively). It is not necessary to call this function to reserve bandwidth for devices under an xHCI host controller, as the bandwidth is reserved when the configuration or interface alt setting is selected.h](h)}(h**Parameters**h]j)}(hjƾh]h Parameters}(hjȾhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjľubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMchjubj0)}(hhh]j5)}(h``struct usb_sg_request *io`` request block handle, as initialized with usb_sg_init(). some fields become accessible when this call returns. h](j;)}(h``struct usb_sg_request *io``h]j)}(hjh]hstruct usb_sg_request *io}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMahj߾ubjU)}(hhh]h)}(hnrequest block handle, as initialized with usb_sg_init(). some fields become accessible when this call returns.h]hnrequest block handle, as initialized with usb_sg_init(). some fields become accessible when this call returns.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM`hjubah}(h]h ]h"]h$]h&]uh1jThj߾ubeh}(h]h ]h"]h$]h&]uh1j4hjhMahjܾubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hj!h]hContext}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMchjubh)}(htask context, might sleep.h]htask context, might sleep.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMchjubh)}(h**Description**h]j)}(hjHh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMehjubh)}(hThis function blocks until the specified I/O operation completes. It leverages the grouping of the related I/O requests to get good transfer rates, by queueing the requests. At higher speeds, such queuing can significantly improve USB throughput.h]hThis function blocks until the specified I/O operation completes. It leverages the grouping of the related I/O requests to get good transfer rates, by queueing the requests. At higher speeds, such queuing can significantly improve USB throughput.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMdhjubh)}(h6There are three kinds of completion for this function.h]h6There are three kinds of completion for this function.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMihjubj)}(hhh](j)}(hXsuccess, where io->status is zero. The number of io->bytes transferred is as requested.h]h)}(hXsuccess, where io->status is zero. The number of io->bytes transferred is as requested.h]hXsuccess, where io->status is zero. The number of io->bytes transferred is as requested.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMkhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(herror, where io->status is a negative errno value. The number of io->bytes transferred before the error is usually less than requested, and can be nonzero.h]h)}(herror, where io->status is a negative errno value. The number of io->bytes transferred before the error is usually less than requested, and can be nonzero.h]herror, where io->status is a negative errno value. The number of io->bytes transferred before the error is usually less than requested, and can be nonzero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMmhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(h\cancellation, a type of error with status -ECONNRESET that is initiated by usb_sg_cancel(). h]h)}(h[cancellation, a type of error with status -ECONNRESET that is initiated by usb_sg_cancel().h]h[cancellation, a type of error with status -ECONNRESET that is initiated by usb_sg_cancel().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMphjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]jjjjjjuh1jhjubh)}(hWhen this function returns, all memory allocated through usb_sg_init() or this call will have been freed. The request block parameter may still be passed to usb_sg_cancel(), or it may be freed. It could also be reinitialized and then reused.h]hWhen this function returns, all memory allocated through usb_sg_init() or this call will have been freed. The request block parameter may still be passed to usb_sg_cancel(), or it may be freed. It could also be reinitialized and then reused.}(hjпhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMshjubh)}(hData Transfer Rates:h]hData Transfer Rates:}(hj߿hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMxhjubh)}(hX Bulk transfers are valid for full or high speed endpoints. The best full speed data rate is 19 packets of 64 bytes each per frame, or 1216 bytes per millisecond. The best high speed data rate is 13 packets of 512 bytes each per microframe, or 52 KBytes per millisecond.h]hX Bulk transfers are valid for full or high speed endpoints. The best full speed data rate is 19 packets of 64 bytes each per frame, or 1216 bytes per millisecond. The best high speed data rate is 13 packets of 512 bytes each per microframe, or 52 KBytes per millisecond.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMzhjubh)}(hXLThe reason to use interrupt transfers through this API would most likely be to reserve high speed bandwidth, where up to 24 KBytes per millisecond could be transferred. That capability is less useful for low or full speed interrupt endpoints, which allow at most one packet per millisecond, of at most 8 or 64 bytes (respectively).h]hXLThe reason to use interrupt transfers through this API would most likely be to reserve high speed bandwidth, where up to 24 KBytes per millisecond could be transferred. That capability is less useful for low or full speed interrupt endpoints, which allow at most one packet per millisecond, of at most 8 or 64 bytes (respectively).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hIt is not necessary to call this function to reserve bandwidth for devices under an xHCI host controller, as the bandwidth is reserved when the configuration or interface alt setting is selected.h]hIt is not necessary to call this function to reserve bandwidth for devices under an xHCI host controller, as the bandwidth is reserved when the configuration or interface alt setting is selected.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_sg_cancel (C function)c.usb_sg_cancelhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h.void usb_sg_cancel (struct usb_sg_request *io)h]j)}(h-void usb_sg_cancel(struct usb_sg_request *io)h](j@)}(hvoidh]hvoid}(hj;hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj7hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjJhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj7hhhjIhMubjp)}(h usb_sg_cancelh]jv)}(h usb_sg_cancelh]h usb_sg_cancel}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjXubah}(h]h ](jjeh"]h$]h&]jjuh1johj7hhhjIhMubj)}(h(struct usb_sg_request *io)h]j)}(hstruct usb_sg_request *ioh](j)}(hjh]hstruct}(hjxhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjtubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjtubh)}(hhh]jv)}(husb_sg_requesth]husb_sg_request}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4j^sbc.usb_sg_cancelasbuh1hhjtubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjtubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjtubjv)}(hioh]hio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjpubah}(h]h ]h"]h$]h&]jjuh1jhj7hhhjIhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3hhhjIhMubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jhjIhMhj0hhubj)}(hhh]h)}(h/stop scatter/gather i/o issued by usb_sg_wait()h]h/stop scatter/gather i/o issued by usb_sg_wait()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj0hhhjIhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX1**Parameters** ``struct usb_sg_request *io`` request block, initialized with usb_sg_init() **Description** This stops a request after it has been started by usb_sg_wait(). It can also prevents one initialized by usb_sg_init() from starting, so that call just frees resources allocated to the request.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh]j5)}(hL``struct usb_sg_request *io`` request block, initialized with usb_sg_init() h](j;)}(h``struct usb_sg_request *io``h]j)}(hj<h]hstruct usb_sg_request *io}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj6ubjU)}(hhh]h)}(h-request block, initialized with usb_sg_init()h]h-request block, initialized with usb_sg_init()}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jThj6ubeh}(h]h ]h"]h$]h&]uh1j4hjQhMhj3ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hThis stops a request after it has been started by usb_sg_wait(). It can also prevents one initialized by usb_sg_init() from starting, so that call just frees resources allocated to the request.h]hThis stops a request after it has been started by usb_sg_wait(). It can also prevents one initialized by usb_sg_init() from starting, so that call just frees resources allocated to the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_get_descriptor (C function)c.usb_get_descriptorhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hmint usb_get_descriptor (struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)h]j)}(hlint usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM ubjp)}(husb_get_descriptorh]jv)}(husb_get_descriptorh]husb_get_descriptor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhM ubj)}(hV(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_get_descriptorasbuh1hhjubj/)}(h h]h }(hj7hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjEhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned char typeh](j@)}(hunsignedh]hunsigned}(hjkhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjgubj/)}(h h]h }(hjyhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubj@)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjgubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubjv)}(htypeh]htype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned char indexh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h void *bufh](j@)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj)hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hbufh]hbuf}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint sizeh](j@)}(hinth]hint}(hjOhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjKubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjKubjv)}(hsizeh]hsize}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h'issues a generic GET_DESCRIPTOR requesth]h'issues a generic GET_DESCRIPTOR request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` the device whose descriptor is being retrieved ``unsigned char type`` the descriptor type (USB_DT_*) ``unsigned char index`` the number of the descriptor ``void *buf`` where to put the descriptor ``int size`` how big is "buf"? **Context** task context, might sleep. **Description** Gets a USB descriptor. Convenience functions exist to simplify getting some types of descriptors. Use usb_get_string() or usb_string() for USB_DT_STRING. Device (USB_DT_DEVICE) and configuration descriptors (USB_DT_CONFIG) are part of the device structure. In addition to a number of USB-standard descriptors, some devices also use class-specific or vendor-specific descriptors. This call is synchronous, and may not be used in an interrupt context. **Return** The number of bytes received on success, or else the status code returned by the underlying usb_control_msg() call.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh](j5)}(hJ``struct usb_device *dev`` the device whose descriptor is being retrieved h](j;)}(h``struct usb_device *dev``h]j)}(hjh]hstruct usb_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h.the device whose descriptor is being retrievedh]h.the device whose descriptor is being retrieved}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h6``unsigned char type`` the descriptor type (USB_DT_*) h](j;)}(h``unsigned char type``h]j)}(hjh]hunsigned char type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj ubjU)}(hhh]h)}(hthe descriptor type (USB_DT_*)h]hthe descriptor type (USB_DT_*)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj%ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj$hMhjubj5)}(h5``unsigned char index`` the number of the descriptor h](j;)}(h``unsigned char index``h]j)}(hjHh]hunsigned char index}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjBubjU)}(hhh]h)}(hthe number of the descriptorh]hthe number of the descriptor}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jThjBubeh}(h]h ]h"]h$]h&]uh1j4hj]hMhjubj5)}(h*``void *buf`` where to put the descriptor h](j;)}(h ``void *buf``h]j)}(hjh]h void *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj{ubjU)}(hhh]h)}(hwhere to put the descriptorh]hwhere to put the descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThj{ubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h``int size`` how big is "buf"? h](j;)}(h ``int size``h]j)}(hjh]hint size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hhow big is "buf"?h]hhow big is “buf”?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(htask context, might sleep.h]htask context, might sleep.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hX|Gets a USB descriptor. Convenience functions exist to simplify getting some types of descriptors. Use usb_get_string() or usb_string() for USB_DT_STRING. Device (USB_DT_DEVICE) and configuration descriptors (USB_DT_CONFIG) are part of the device structure. In addition to a number of USB-standard descriptors, some devices also use class-specific or vendor-specific descriptors.h]hX|Gets a USB descriptor. Convenience functions exist to simplify getting some types of descriptors. Use usb_get_string() or usb_string() for USB_DT_STRING. Device (USB_DT_DEVICE) and configuration descriptors (USB_DT_CONFIG) are part of the device structure. In addition to a number of USB-standard descriptors, some devices also use class-specific or vendor-specific descriptors.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hFThis call is synchronous, and may not be used in an interrupt context.h]hFThis call is synchronous, and may not be used in an interrupt context.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h **Return**h]j)}(hjRh]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjubh)}(hsThe number of bytes received on success, or else the status code returned by the underlying usb_control_msg() call.h]hsThe number of bytes received on success, or else the status code returned by the underlying usb_control_msg() call.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_string (C function) c.usb_stringhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hJint usb_string (struct usb_device *dev, int index, char *buf, size_t size)h]j)}(hIint usb_string(struct usb_device *dev, int index, char *buf, size_t size)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(h usb_stringh]jv)}(h usb_stringh]h usb_string}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h;(struct usb_device *dev, int index, char *buf, size_t size)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsb c.usb_stringasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int indexh](j@)}(hinth]hint}(hjFhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjBubj/)}(h h]h }(hjThhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjBubjv)}(hindexh]hindex}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h char *bufh](j@)}(hcharh]hchar}(hj{hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjwubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjwubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjwubjv)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]jv)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j c.usb_stringasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,returns UTF-8 version of a string descriptorh]h,returns UTF-8 version of a string descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j.j j.j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` the device whose string descriptor is being retrieved ``int index`` the number of the descriptor ``char *buf`` where to put the string ``size_t size`` how big is "buf"? **Context** task context, might sleep. **Description** This converts the UTF-16LE encoded strings returned by devices, from usb_get_string_descriptor(), to null-terminated UTF-8 encoded ones that are more usable in most kernel contexts. Note that this function chooses strings in the first language supported by the device. This call is synchronous, and may not be used in an interrupt context. **Return** length of the string (>= 0) or usb_control_msg status (< 0).h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubj0)}(hhh](j5)}(hQ``struct usb_device *dev`` the device whose string descriptor is being retrieved h](j;)}(h``struct usb_device *dev``h]j)}(hjWh]hstruct usb_device *dev}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjQubjU)}(hhh]h)}(h5the device whose string descriptor is being retrievedh]h5the device whose string descriptor is being retrieved}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMhjmubah}(h]h ]h"]h$]h&]uh1jThjQubeh}(h]h ]h"]h$]h&]uh1j4hjlhMhjNubj5)}(h+``int index`` the number of the descriptor h](j;)}(h ``int index``h]j)}(hjh]h int index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hthe number of the descriptorh]hthe number of the descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjNubj5)}(h&``char *buf`` where to put the string h](j;)}(h ``char *buf``h]j)}(hjh]h char *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hwhere to put the stringh]hwhere to put the string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjNubj5)}(h"``size_t size`` how big is "buf"? h](j;)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hhow big is "buf"?h]hhow big is “buf”?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjNubeh}(h]h ]h"]h$]h&]uh1j/hj2ubh)}(h **Context**h]j)}(hj=h]hContext}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubh)}(htask context, might sleep.h]htask context, might sleep.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubh)}(h**Description**h]j)}(hjdh]h Description}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubh)}(hX This converts the UTF-16LE encoded strings returned by devices, from usb_get_string_descriptor(), to null-terminated UTF-8 encoded ones that are more usable in most kernel contexts. Note that this function chooses strings in the first language supported by the device.h]hX This converts the UTF-16LE encoded strings returned by devices, from usb_get_string_descriptor(), to null-terminated UTF-8 encoded ones that are more usable in most kernel contexts. Note that this function chooses strings in the first language supported by the device.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubh)}(hFThis call is synchronous, and may not be used in an interrupt context.h]hFThis call is synchronous, and may not be used in an interrupt context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubh)}(h= 0) or usb_control_msg status (< 0).h]h= 0) or usb_control_msg status (< 0).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_cache_string (C function)c.usb_cache_stringhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h]jA)}j4jsbc.usb_cache_stringasbuh1hhj%ubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj%ubj_)}(hjbh]h*}(hjuhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj%ubjv)}(hudevh]hudev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h int indexh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h3read a string descriptor and cache it for later useh]h3read a string descriptor and cache it for later use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *udev`` the device whose string descriptor is being read ``int index`` the descriptor index **Return** A pointer to a kmalloc'ed buffer containing the descriptor string, or ``NULL`` if the index is 0 or the string could not be read.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh](j5)}(hM``struct usb_device *udev`` the device whose string descriptor is being read h](j;)}(h``struct usb_device *udev``h]j)}(hj"h]hstruct usb_device *udev}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h0the device whose string descriptor is being readh]h0the device whose string descriptor is being read}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj8ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj7hMhjubj5)}(h#``int index`` the descriptor index h](j;)}(h ``int index``h]j)}(hj[h]h int index}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjUubjU)}(hhh]h)}(hthe descriptor indexh]hthe descriptor index}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMhjqubah}(h]h ]h"]h$]h&]uh1jThjUubeh}(h]h ]h"]h$]h&]uh1j4hjphMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hA pointer to a kmalloc'ed buffer containing the descriptor string, or ``NULL`` if the index is 0 or the string could not be read.h](hHA pointer to a kmalloc’ed buffer containing the descriptor string, or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 if the index is 0 or the string could not be read.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_get_status (C function)c.usb_get_statushNtauh1jhjqhhhNhNubj )}(hhh](j)}(hXint usb_get_status (struct usb_device *dev, int recip, int type, int target, void *data)h]j)}(hWint usb_get_status(struct usb_device *dev, int recip, int type, int target, void *data)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMdubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMdubjp)}(husb_get_statush]jv)}(husb_get_statush]husb_get_status}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMdubj)}(hE(struct usb_device *dev, int recip, int type, int target, void *data)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj*hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj&ubj/)}(h h]h }(hj7hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj&ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjJmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_get_statusasbuh1hhj&ubj/)}(h h]h }(hjhhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj&ubj_)}(hjbh]h*}(hjvhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj&ubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(h int reciph](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hreciph]hrecip}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(hint typeh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(htypeh]htype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(h int targeth](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(htargeth]htarget}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(h void *datah](j@)}(hvoidh]hvoid}(hj;hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj7ubj/)}(h h]h }(hjIhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj7ubj_)}(hjbh]h*}(hjWhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj7ubjv)}(hdatah]hdata}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMdubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMdubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMdhjhhubj)}(hhh]h)}(hissues a GET_STATUS callh]hissues a GET_STATUS call}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMdubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` the device whose status is being checked ``int recip`` USB_RECIP_*; for device, interface, or endpoint ``int type`` USB_STATUS_TYPE_*; for standard or PTM status types ``int target`` zero (for device), else interface or endpoint number ``void *data`` pointer to two bytes of bitmap data **Context** task context, might sleep. **Description** Returns device, interface, or endpoint status. Normally only of interest to see if the device is self powered, or has enabled the remote wakeup facility; or whether a bulk or interrupt endpoint is halted ("stalled"). Bits in these status bitmaps are set using the SET_FEATURE request, and cleared using the CLEAR_FEATURE request. The usb_clear_halt() function should be used to clear halt ("stall") status. This call is synchronous, and may not be used in an interrupt context. Returns 0 and the status value in ***data** (in host byte order) on success, or else the status code from the underlying usb_control_msg() call.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMQhjubj0)}(hhh](j5)}(hD``struct usb_device *dev`` the device whose status is being checked h](j;)}(h``struct usb_device *dev``h]j)}(hjh]hstruct usb_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMNhjubjU)}(hhh]h)}(h(the device whose status is being checkedh]h(the device whose status is being checked}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMNhjubj5)}(h>``int recip`` USB_RECIP_*; for device, interface, or endpoint h](j;)}(h ``int recip``h]j)}(hjh]h int recip}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMOhjubjU)}(hhh]h)}(h/USB_RECIP_*; for device, interface, or endpointh]h/USB_RECIP_*; for device, interface, or endpoint}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMOhjubj5)}(hA``int type`` USB_STATUS_TYPE_*; for standard or PTM status types h](j;)}(h ``int type``h]j)}(hjAh]hint type}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMPhj;ubjU)}(hhh]h)}(h3USB_STATUS_TYPE_*; for standard or PTM status typesh]h3USB_STATUS_TYPE_*; for standard or PTM status types}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMPhjWubah}(h]h ]h"]h$]h&]uh1jThj;ubeh}(h]h ]h"]h$]h&]uh1j4hjVhMPhjubj5)}(hD``int target`` zero (for device), else interface or endpoint number h](j;)}(h``int target``h]j)}(hjzh]h int target}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMQhjtubjU)}(hhh]h)}(h4zero (for device), else interface or endpoint numberh]h4zero (for device), else interface or endpoint number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMQhjubah}(h]h ]h"]h$]h&]uh1jThjtubeh}(h]h ]h"]h$]h&]uh1j4hjhMQhjubj5)}(h3``void *data`` pointer to two bytes of bitmap data h](j;)}(h``void *data``h]j)}(hjh]h void *data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMRhjubjU)}(hhh]h)}(h#pointer to two bytes of bitmap datah]h#pointer to two bytes of bitmap data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMRhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMRhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMThjubh)}(htask context, might sleep.h]htask context, might sleep.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMThjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMVhjubh)}(hReturns device, interface, or endpoint status. Normally only of interest to see if the device is self powered, or has enabled the remote wakeup facility; or whether a bulk or interrupt endpoint is halted ("stalled").h]hReturns device, interface, or endpoint status. Normally only of interest to see if the device is self powered, or has enabled the remote wakeup facility; or whether a bulk or interrupt endpoint is halted (“stalled”).}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMUhjubh)}(hBits in these status bitmaps are set using the SET_FEATURE request, and cleared using the CLEAR_FEATURE request. The usb_clear_halt() function should be used to clear halt ("stall") status.h]hBits in these status bitmaps are set using the SET_FEATURE request, and cleared using the CLEAR_FEATURE request. The usb_clear_halt() function should be used to clear halt (“stall”) status.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMZhjubh)}(hFThis call is synchronous, and may not be used in an interrupt context.h]hFThis call is synchronous, and may not be used in an interrupt context.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM^hjubh)}(hReturns 0 and the status value in ***data** (in host byte order) on success, or else the status code from the underlying usb_control_msg() call.h](h"Returns 0 and the status value in }(hjXhhhNhNubj)}(h ***data**h]h*data}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubhe (in host byte order) on success, or else the status code from the underlying usb_control_msg() call.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM`hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_clear_halt (C function)c.usb_clear_halthNtauh1jhjqhhhNhNubj )}(hhh](j)}(h5int usb_clear_halt (struct usb_device *dev, int pipe)h]j)}(h4int usb_clear_halt(struct usb_device *dev, int pipe)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_clear_halth]jv)}(husb_clear_halth]husb_clear_halt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h"(struct usb_device *dev, int pipe)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_clear_haltasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj"hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint pipeh](j@)}(hinth]hint}(hjHhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjDubj/)}(h h]h }(hjVhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjDubjv)}(hpipeh]hpipe}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h3tells device to clear endpoint halt/stall conditionh]h3tells device to clear endpoint halt/stall condition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hXR**Parameters** ``struct usb_device *dev`` device whose endpoint is halted ``int pipe`` endpoint "pipe" being cleared **Context** task context, might sleep. **Description** This is used to clear halt conditions for bulk and interrupt endpoints, as reported by URB completion status. Endpoints that are halted are sometimes referred to as being "stalled". Such endpoints are unable to transmit or receive data until the halt status is cleared. Any URBs queued for such an endpoint should normally be unlinked by the driver before clearing the halt condition, as described in sections 5.7.5 and 5.8.5 of the USB 2.0 spec. Note that control and isochronous endpoints don't halt, although control endpoints report "protocol stall" (for unsupported requests) using the same status code used to report a true stall. This call is synchronous, and may not be used in an interrupt context. If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. **Return** Zero on success, or else the status code returned by the underlying usb_control_msg() call.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh](j5)}(h;``struct usb_device *dev`` device whose endpoint is halted h](j;)}(h``struct usb_device *dev``h]j)}(hjh]hstruct usb_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hdevice whose endpoint is haltedh]hdevice whose endpoint is halted}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h+``int pipe`` endpoint "pipe" being cleared h](j;)}(h ``int pipe``h]j)}(hjh]hint pipe}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hendpoint "pipe" being clearedh]h!endpoint “pipe” being cleared}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjCh]hContext}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(htask context, might sleep.h]htask context, might sleep.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h**Description**h]j)}(hjjh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hXThis is used to clear halt conditions for bulk and interrupt endpoints, as reported by URB completion status. Endpoints that are halted are sometimes referred to as being "stalled". Such endpoints are unable to transmit or receive data until the halt status is cleared. Any URBs queued for such an endpoint should normally be unlinked by the driver before clearing the halt condition, as described in sections 5.7.5 and 5.8.5 of the USB 2.0 spec.h]hXThis is used to clear halt conditions for bulk and interrupt endpoints, as reported by URB completion status. Endpoints that are halted are sometimes referred to as being “stalled”. Such endpoints are unable to transmit or receive data until the halt status is cleared. Any URBs queued for such an endpoint should normally be unlinked by the driver before clearing the halt condition, as described in sections 5.7.5 and 5.8.5 of the USB 2.0 spec.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hNote that control and isochronous endpoints don't halt, although control endpoints report "protocol stall" (for unsupported requests) using the same status code used to report a true stall.h]hNote that control and isochronous endpoints don’t halt, although control endpoints report “protocol stall” (for unsupported requests) using the same status code used to report a true stall.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hThis call is synchronous, and may not be used in an interrupt context. If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete.h]hThis call is synchronous, and may not be used in an interrupt context. If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h[Zero on success, or else the status code returned by the underlying usb_control_msg() call.h]h[Zero on success, or else the status code returned by the underlying usb_control_msg() call.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_reset_endpoint (C function)c.usb_reset_endpointhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hEvoid usb_reset_endpoint (struct usb_device *dev, unsigned int epaddr)h]j)}(hDvoid usb_reset_endpoint(struct usb_device *dev, unsigned int epaddr)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM%ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM%ubjp)}(husb_reset_endpointh]jv)}(husb_reset_endpointh]husb_reset_endpoint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhM%ubj)}(h-(struct usb_device *dev, unsigned int epaddr)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj1hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj-ubj/)}(h h]h }(hj>hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj-ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjQmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_reset_endpointasbuh1hhj-ubj/)}(h h]h }(hjohhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj-ubj_)}(hjbh]h*}(hj}hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj-ubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubj)}(hunsigned int epaddrh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hepaddrh]hepaddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM%ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM%hjhhubj)}(hhh]h)}(hReset an endpoint's state.h]hReset an endpoint’s state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM%ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX?**Parameters** ``struct usb_device *dev`` the device whose endpoint is to be reset ``unsigned int epaddr`` the endpoint's address. Endpoint number for output, endpoint number + USB_DIR_IN for input **Description** Resets any host-side endpoint state such as the toggle bit, sequence number or current window.h](h)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM!hj!ubj0)}(hhh](j5)}(hD``struct usb_device *dev`` the device whose endpoint is to be reset h](j;)}(h``struct usb_device *dev``h]j)}(hjFh]hstruct usb_device *dev}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj@ubjU)}(hhh]h)}(h(the device whose endpoint is to be reseth]h(the device whose endpoint is to be reset}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj\ubah}(h]h ]h"]h$]h&]uh1jThj@ubeh}(h]h ]h"]h$]h&]uh1j4hj[hMhj=ubj5)}(ht``unsigned int epaddr`` the endpoint's address. Endpoint number for output, endpoint number + USB_DIR_IN for input h](j;)}(h``unsigned int epaddr``h]j)}(hjh]hunsigned int epaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjyubjU)}(hhh]h)}(h[the endpoint's address. Endpoint number for output, endpoint number + USB_DIR_IN for inputh]h]the endpoint’s address. Endpoint number for output, endpoint number + USB_DIR_IN for input}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubah}(h]h ]h"]h$]h&]uh1jThjyubeh}(h]h ]h"]h$]h&]uh1j4hjhM hj=ubeh}(h]h ]h"]h$]h&]uh1j/hj!ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM"hj!ubh)}(h^Resets any host-side endpoint state such as the toggle bit, sequence number or current window.h]h^Resets any host-side endpoint state such as the toggle bit, sequence number or current window.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM"hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_set_interface (C function)c.usb_set_interfacehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hLint usb_set_interface (struct usb_device *dev, int interface, int alternate)h]j)}(hKint usb_set_interface(struct usb_device *dev, int interface, int alternate)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_set_interfaceh]jv)}(husb_set_interfaceh]husb_set_interface}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h6(struct usb_device *dev, int interface, int alternate)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj9ubj/)}(h h]h }(hjJhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjXubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj]modnameN classnameNj8j;)}j>]jA)}j4j#sbc.usb_set_interfaceasbuh1hhj9ubj/)}(h h]h }(hj{hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj9ubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(h int interfaceh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(h interfaceh]h interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(h int alternateh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(h alternateh]h alternate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h/Makes a particular alternate setting be currenth]h/Makes a particular alternate setting be current}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj'hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jBj jBj j juh1j hhhjqhNhNubj)}(hXk**Parameters** ``struct usb_device *dev`` the device whose interface is being updated ``int interface`` the interface being updated ``int alternate`` the setting being chosen. **Context** task context, might sleep. **Description** This is used to enable data transfers on interfaces that may not be enabled by default. Not all devices support such configurability. Only the driver bound to an interface may change its setting. Within any given configuration, each interface may have several alternative settings. These are often used to control levels of bandwidth consumption. For example, the default setting for a high speed interrupt endpoint may not send more than 64 bytes per microframe, while interrupt transfers of up to 3KBytes per microframe are legal. Also, isochronous endpoints may never be part of an interface's default setting. To access such bandwidth, alternate interface settings must be made current. Note that in the Linux USB subsystem, bandwidth associated with an endpoint in a given alternate setting is not reserved until an URB is submitted that needs that bandwidth. Some other operating systems allocate bandwidth early, when a configuration is chosen. xHCI reserves bandwidth and configures the alternate setting in usb_hcd_alloc_bandwidth(). If it fails the original interface altsetting may be disabled. Drivers cannot rely on any particular alternate setting being in effect after a failure. This call is synchronous, and may not be used in an interrupt context. Also, drivers must not change altsettings while urbs are scheduled for endpoints in that interface; all such urbs must first be completed (perhaps forced by unlinking). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete. **Return** Zero on success, or else the status code returned by the underlying usb_control_msg() call.h](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubj0)}(hhh](j5)}(hG``struct usb_device *dev`` the device whose interface is being updated h](j;)}(h``struct usb_device *dev``h]j)}(hjkh]hstruct usb_device *dev}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjeubjU)}(hhh]h)}(h+the device whose interface is being updatedh]h+the device whose interface is being updated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjeubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjbubj5)}(h.``int interface`` the interface being updated h](j;)}(h``int interface``h]j)}(hjh]h int interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hthe interface being updatedh]hthe interface being updated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjbubj5)}(h,``int alternate`` the setting being chosen. h](j;)}(h``int alternate``h]j)}(hjh]h int alternate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hthe setting being chosen.h]hthe setting being chosen.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjbubeh}(h]h ]h"]h$]h&]uh1j/hjFubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(htask context, might sleep.h]htask context, might sleep.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(h**Description**h]j)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(hThis is used to enable data transfers on interfaces that may not be enabled by default. Not all devices support such configurability. Only the driver bound to an interface may change its setting.h]hThis is used to enable data transfers on interfaces that may not be enabled by default. Not all devices support such configurability. Only the driver bound to an interface may change its setting.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(hXWithin any given configuration, each interface may have several alternative settings. These are often used to control levels of bandwidth consumption. For example, the default setting for a high speed interrupt endpoint may not send more than 64 bytes per microframe, while interrupt transfers of up to 3KBytes per microframe are legal. Also, isochronous endpoints may never be part of an interface's default setting. To access such bandwidth, alternate interface settings must be made current.h]hXWithin any given configuration, each interface may have several alternative settings. These are often used to control levels of bandwidth consumption. For example, the default setting for a high speed interrupt endpoint may not send more than 64 bytes per microframe, while interrupt transfers of up to 3KBytes per microframe are legal. Also, isochronous endpoints may never be part of an interface’s default setting. To access such bandwidth, alternate interface settings must be made current.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(hXNote that in the Linux USB subsystem, bandwidth associated with an endpoint in a given alternate setting is not reserved until an URB is submitted that needs that bandwidth. Some other operating systems allocate bandwidth early, when a configuration is chosen.h]hXNote that in the Linux USB subsystem, bandwidth associated with an endpoint in a given alternate setting is not reserved until an URB is submitted that needs that bandwidth. Some other operating systems allocate bandwidth early, when a configuration is chosen.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(hxHCI reserves bandwidth and configures the alternate setting in usb_hcd_alloc_bandwidth(). If it fails the original interface altsetting may be disabled. Drivers cannot rely on any particular alternate setting being in effect after a failure.h]hxHCI reserves bandwidth and configures the alternate setting in usb_hcd_alloc_bandwidth(). If it fails the original interface altsetting may be disabled. Drivers cannot rely on any particular alternate setting being in effect after a failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(hXZThis call is synchronous, and may not be used in an interrupt context. Also, drivers must not change altsettings while urbs are scheduled for endpoints in that interface; all such urbs must first be completed (perhaps forced by unlinking). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete.h]hXZThis call is synchronous, and may not be used in an interrupt context. Also, drivers must not change altsettings while urbs are scheduled for endpoints in that interface; all such urbs must first be completed (perhaps forced by unlinking). If a thread in your driver uses this call, make sure your disconnect() method can wait for it to complete.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubh)}(h[Zero on success, or else the status code returned by the underlying usb_control_msg() call.h]h[Zero on success, or else the status code returned by the underlying usb_control_msg() call.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_reset_configuration (C function)c.usb_reset_configurationhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h4int usb_reset_configuration (struct usb_device *dev)h]j)}(h3int usb_reset_configuration(struct usb_device *dev)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_reset_configurationh]jv)}(husb_reset_configurationh]husb_reset_configuration}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct usb_device *dev)h]j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj$hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj1hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjDmodnameN classnameNj8j;)}j>]jA)}j4j sbc.usb_reset_configurationasbuh1hhj ubj/)}(h h]h }(hjbhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hjphhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hdevh]hdev}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hlightweight device reseth]hlightweight device reset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hXy**Parameters** ``struct usb_device *dev`` the device whose configuration is being reset **Description** This issues a standard SET_CONFIGURATION request to the device using the current configuration. The effect is to reset most USB-related state in the device, including interface altsettings (reset to zero), endpoint halts (cleared), and endpoint state (only for bulk and interrupt endpoints). Other usbcore state is unchanged, including bindings of usb device drivers to interfaces. Because this affects multiple interfaces, avoid using this with composite (multi-interface) devices. Instead, the driver for each interface may use usb_set_interface() on the interfaces it claims. Be careful though; some devices don't support the SET_INTERFACE request, and others won't reset all the interface state (notably endpoint state). Resetting the whole configuration would affect other drivers' interfaces. The caller must own the device lock. If this routine fails the device will probably be in an unusable state with endpoints disabled, and interfaces only partially enabled. **Return** Zero on success, else a negative error code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh]j5)}(hI``struct usb_device *dev`` the device whose configuration is being reset h](j;)}(h``struct usb_device *dev``h]j)}(hjh]hstruct usb_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(h-the device whose configuration is being reseth]h-the device whose configuration is being reset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hXThis issues a standard SET_CONFIGURATION request to the device using the current configuration. The effect is to reset most USB-related state in the device, including interface altsettings (reset to zero), endpoint halts (cleared), and endpoint state (only for bulk and interrupt endpoints). Other usbcore state is unchanged, including bindings of usb device drivers to interfaces.h]hXThis issues a standard SET_CONFIGURATION request to the device using the current configuration. The effect is to reset most USB-related state in the device, including interface altsettings (reset to zero), endpoint halts (cleared), and endpoint state (only for bulk and interrupt endpoints). Other usbcore state is unchanged, including bindings of usb device drivers to interfaces.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hXBecause this affects multiple interfaces, avoid using this with composite (multi-interface) devices. Instead, the driver for each interface may use usb_set_interface() on the interfaces it claims. Be careful though; some devices don't support the SET_INTERFACE request, and others won't reset all the interface state (notably endpoint state). Resetting the whole configuration would affect other drivers' interfaces.h]hXBecause this affects multiple interfaces, avoid using this with composite (multi-interface) devices. Instead, the driver for each interface may use usb_set_interface() on the interfaces it claims. Be careful though; some devices don’t support the SET_INTERFACE request, and others won’t reset all the interface state (notably endpoint state). Resetting the whole configuration would affect other drivers’ interfaces.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h$The caller must own the device lock.h]h$The caller must own the device lock.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hIf this routine fails the device will probably be in an unusable state with endpoints disabled, and interfaces only partially enabled.h]hIf this routine fails the device will probably be in an unusable state with endpoints disabled, and interfaces only partially enabled.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h **Return**h]j)}(hjwh]hReturn}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h,Zero on success, else a negative error code.h]h,Zero on success, else a negative error code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_set_wireless_status (C function)c.usb_set_wireless_statushNtauh1jhjqhhhNhNubj )}(hhh](j)}(hZint usb_set_wireless_status (struct usb_interface *iface, enum usb_wireless_status status)h]j)}(hYint usb_set_wireless_status(struct usb_interface *iface, enum usb_wireless_status status)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_set_wireless_statush]jv)}(husb_set_wireless_statush]husb_set_wireless_status}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h>(struct usb_interface *iface, enum usb_wireless_status status)h](j)}(hstruct usb_interface *ifaceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_set_wireless_statusasbuh1hhjubj/)}(h h]h }(hj7hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjEhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hifaceh]hiface}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(henum usb_wireless_status statush](j)}(hjh]henum}(hjkhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjgubj/)}(h h]h }(hjxhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubh)}(hhh]jv)}(husb_wireless_statush]husb_wireless_status}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j3c.usb_set_wireless_statusasbuh1hhjgubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubjv)}(hstatush]hstatus}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&sets the wireless_status struct memberh]h&sets the wireless_status struct member}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX,**Parameters** ``struct usb_interface *iface`` the interface to modify ``enum usb_wireless_status status`` the new wireless status **Description** Set the wireless_status struct member to the new value, and emit sysfs changes as necessary. **Return** 0 on success, -EALREADY if already set.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh](j5)}(h8``struct usb_interface *iface`` the interface to modify h](j;)}(h``struct usb_interface *iface``h]j)}(hj h]hstruct usb_interface *iface}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubjU)}(hhh]h)}(hthe interface to modifyh]hthe interface to modify}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj6ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj5hMhjubj5)}(h<``enum usb_wireless_status status`` the new wireless status h](j;)}(h#``enum usb_wireless_status status``h]j)}(hjYh]henum usb_wireless_status status}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjSubjU)}(hhh]h)}(hthe new wireless statush]hthe new wireless status}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMhjoubah}(h]h ]h"]h$]h&]uh1jThjSubeh}(h]h ]h"]h$]h&]uh1j4hjnhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h\Set the wireless_status struct member to the new value, and emit sysfs changes as necessary.h]h\Set the wireless_status struct member to the new value, and emit sysfs changes as necessary.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h'0 on success, -EALREADY if already set.h]h'0 on success, -EALREADY if already set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)usb_driver_set_configuration (C function)c.usb_driver_set_configurationhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hFint usb_driver_set_configuration (struct usb_device *udev, int config)h]j)}(hEint usb_driver_set_configuration(struct usb_device *udev, int config)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_driver_set_configurationh]jv)}(husb_driver_set_configurationh]husb_driver_set_configuration}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h%(struct usb_device *udev, int config)h](j)}(hstruct usb_device *udevh](j)}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj9ubj/)}(h h]h }(hjJhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjXubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj]modnameN classnameNj8j;)}j>]jA)}j4j#sbc.usb_driver_set_configurationasbuh1hhj9ubj/)}(h h]h }(hj{hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj9ubjv)}(hudevh]hudev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(h int configh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hconfigh]hconfig}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h9Provide a way for drivers to change device configurationsh]h9Provide a way for drivers to change device configurations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j j j j j juh1j hhhjqhNhNubj)}(hXO**Parameters** ``struct usb_device *udev`` the device whose configuration is being updated ``int config`` the configuration being chosen. **Context** In process context, must be able to sleep **Description** Device interface drivers are not allowed to change device configurations. This is because changing configurations will destroy the interface the driver is bound to and create new ones; it would be like a floppy-disk driver telling the computer to replace the floppy-disk drive with a tape drive! Still, in certain specialized circumstances the need may arise. This routine gets around the normal restrictions by using a work thread to submit the change-config request. **Return** 0 if the request was successfully queued, error code otherwise. The caller has no way to know whether the queued request will eventually succeed.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubj0)}(hhh](j5)}(hL``struct usb_device *udev`` the device whose configuration is being updated h](j;)}(h``struct usb_device *udev``h]j)}(hj6h]hstruct usb_device *udev}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhj0ubjU)}(hhh]h)}(h/the device whose configuration is being updatedh]h/the device whose configuration is being updated}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjLubah}(h]h ]h"]h$]h&]uh1jThj0ubeh}(h]h ]h"]h$]h&]uh1j4hjKhMhj-ubj5)}(h/``int config`` the configuration being chosen. h](j;)}(h``int config``h]j)}(hjoh]h int config}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjiubjU)}(hhh]h)}(hthe configuration being chosen.h]hthe configuration being chosen.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjiubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj-ubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h)In process context, must be able to sleeph]h)In process context, must be able to sleep}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hX'Device interface drivers are not allowed to change device configurations. This is because changing configurations will destroy the interface the driver is bound to and create new ones; it would be like a floppy-disk driver telling the computer to replace the floppy-disk drive with a tape drive!h]hX'Device interface drivers are not allowed to change device configurations. This is because changing configurations will destroy the interface the driver is bound to and create new ones; it would be like a floppy-disk driver telling the computer to replace the floppy-disk drive with a tape drive!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(hStill, in certain specialized circumstances the need may arise. This routine gets around the normal restrictions by using a work thread to submit the change-config request.h]hStill, in certain specialized circumstances the need may arise. This routine gets around the normal restrictions by using a work thread to submit the change-config request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubh)}(h0 if the request was successfully queued, error code otherwise. The caller has no way to know whether the queued request will eventually succeed.h]h0 if the request was successfully queued, error code otherwise. The caller has no way to know whether the queued request will eventually succeed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!cdc_parse_cdc_header (C function)c.cdc_parse_cdc_headerhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hpint cdc_parse_cdc_header (struct usb_cdc_parsed_header *hdr, struct usb_interface *intf, u8 *buffer, int buflen)h]j)}(hoint cdc_parse_cdc_header(struct usb_cdc_parsed_header *hdr, struct usb_interface *intf, u8 *buffer, int buflen)h](j@)}(hinth]hint}(hjLhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjHhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM ubj/)}(h h]h }(hj[hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjHhhhjZhM ubjp)}(hcdc_parse_cdc_headerh]jv)}(hcdc_parse_cdc_headerh]hcdc_parse_cdc_header}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubah}(h]h ](jjeh"]h$]h&]jjuh1johjHhhhjZhM ubj)}(hW(struct usb_cdc_parsed_header *hdr, struct usb_interface *intf, u8 *buffer, int buflen)h](j)}(h!struct usb_cdc_parsed_header *hdrh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_cdc_parsed_headerh]husb_cdc_parsed_header}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4josbc.cdc_parse_cdc_headerasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hhdrh]hhdr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.cdc_parse_cdc_headerasbuh1hhjubj/)}(h h]h }(hj7hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjEhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hintfh]hintf}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u8 *bufferh](h)}(hhh]jv)}(hu8h]hu8}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjkubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjpmodnameN classnameNj8j;)}j>]jc.cdc_parse_cdc_headerasbuh1hhjgubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjgubjv)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int buflenh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hbuflenh]hbuflen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjHhhhjZhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjDhhhjZhM ubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhjZhM hjAhhubj)}(hhh]h)}(h.parse the extra headers present in CDC devicesh]h.parse the extra headers present in CDC devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX2**Parameters** ``struct usb_cdc_parsed_header *hdr`` the place to put the results of the parsing ``struct usb_interface *intf`` the interface for which parsing is requested ``u8 *buffer`` pointer to the extra headers to be parsed ``int buflen`` length of the extra headers **Description** This evaluates the extra headers present in CDC devices which bind the interfaces for data and control and provide details about the capabilities of the device. **Return** number of descriptors parsed or -EINVAL if the header is contradictory beyond salvageh](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hj"ubj0)}(hhh](j5)}(hR``struct usb_cdc_parsed_header *hdr`` the place to put the results of the parsing h](j;)}(h%``struct usb_cdc_parsed_header *hdr``h]j)}(hjGh]h!struct usb_cdc_parsed_header *hdr}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjAubjU)}(hhh]h)}(h+the place to put the results of the parsingh]h+the place to put the results of the parsing}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj]ubah}(h]h ]h"]h$]h&]uh1jThjAubeh}(h]h ]h"]h$]h&]uh1j4hj\hM hj>ubj5)}(hL``struct usb_interface *intf`` the interface for which parsing is requested h](j;)}(h``struct usb_interface *intf``h]j)}(hjh]hstruct usb_interface *intf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjzubjU)}(hhh]h)}(h,the interface for which parsing is requestedh]h,the interface for which parsing is requested}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jThjzubeh}(h]h ]h"]h$]h&]uh1j4hjhM hj>ubj5)}(h9``u8 *buffer`` pointer to the extra headers to be parsed h](j;)}(h``u8 *buffer``h]j)}(hjh]h u8 *buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjubjU)}(hhh]h)}(h)pointer to the extra headers to be parsedh]h)pointer to the extra headers to be parsed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhM hj>ubj5)}(h+``int buflen`` length of the extra headers h](j;)}(h``int buflen``h]j)}(hjh]h int buflen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hjubjU)}(hhh]h)}(hlength of the extra headersh]hlength of the extra headers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhM hj>ubeh}(h]h ]h"]h$]h&]uh1j/hj"ubh)}(h**Description**h]j)}(hj-h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hj"ubh)}(hThis evaluates the extra headers present in CDC devices which bind the interfaces for data and control and provide details about the capabilities of the device.h]hThis evaluates the extra headers present in CDC devices which bind the interfaces for data and control and provide details about the capabilities of the device.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hj"ubh)}(h **Return**h]j)}(hjTh]hReturn}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hj"ubh)}(hUnumber of descriptors parsed or -EINVAL if the header is contradictory beyond salvageh]hUnumber of descriptors parsed or -EINVAL if the header is contradictory beyond salvage}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:164: ./drivers/usb/core/message.chM hj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_register_dev (C function)c.usb_register_devhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hXint usb_register_dev (struct usb_interface *intf, struct usb_class_driver *class_driver)h]j)}(hWint usb_register_dev(struct usb_interface *intf, struct usb_class_driver *class_driver)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKnubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKnubjp)}(husb_register_devh]jv)}(husb_register_devh]husb_register_dev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKnubj)}(hC(struct usb_interface *intf, struct usb_class_driver *class_driver)h](j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_register_devasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj"hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hintfh]hintf}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h%struct usb_class_driver *class_driverh](j)}(hjh]hstruct}(hjHhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjDubj/)}(h h]h }(hjUhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjDubh)}(hhh]jv)}(husb_class_driverh]husb_class_driver}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjcubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjhmodnameN classnameNj8j;)}j>]jc.usb_register_devasbuh1hhjDubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjDubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjDubjv)}(h class_driverh]h class_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKnubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKnubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKnhjhhubj)}(hhh]h)}(h1register a USB device, and ask for a minor numberh]h1register a USB device, and ask for a minor number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chK\hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKnubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX.**Parameters** ``struct usb_interface *intf`` pointer to the usb_interface that is being registered ``struct usb_class_driver *class_driver`` pointer to the usb_class_driver for this device **Description** This should be called by all USB drivers that use the USB major number. If CONFIG_USB_DYNAMIC_MINORS is enabled, the minor number will be dynamically allocated out of the list of available ones. If it is not enabled, the minor number will be based on the next available free minor, starting at the class_driver->minor_base. This function also creates a usb class device in the sysfs tree. usb_deregister_dev() must be called when the driver is done with the minor numbers given out by this function. **Return** -EINVAL if something bad happens with trying to register a device, and 0 on success.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chK`hjubj0)}(hhh](j5)}(hU``struct usb_interface *intf`` pointer to the usb_interface that is being registered h](j;)}(h``struct usb_interface *intf``h]j)}(hj h]hstruct usb_interface *intf}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chK]hjubjU)}(hhh]h)}(h5pointer to the usb_interface that is being registeredh]h5pointer to the usb_interface that is being registered}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK]hj ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhK]hjubj5)}(hZ``struct usb_class_driver *class_driver`` pointer to the usb_class_driver for this device h](j;)}(h)``struct usb_class_driver *class_driver``h]j)}(hjCh]h%struct usb_class_driver *class_driver}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1j:h[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chK^hj=ubjU)}(hhh]h)}(h/pointer to the usb_class_driver for this deviceh]h/pointer to the usb_class_driver for this device}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhK^hjYubah}(h]h ]h"]h$]h&]uh1jThj=ubeh}(h]h ]h"]h$]h&]uh1j4hjXhK^hjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chK`hjubh)}(hXDThis should be called by all USB drivers that use the USB major number. If CONFIG_USB_DYNAMIC_MINORS is enabled, the minor number will be dynamically allocated out of the list of available ones. If it is not enabled, the minor number will be based on the next available free minor, starting at the class_driver->minor_base.h]hXDThis should be called by all USB drivers that use the USB major number. If CONFIG_USB_DYNAMIC_MINORS is enabled, the minor number will be dynamically allocated out of the list of available ones. If it is not enabled, the minor number will be based on the next available free minor, starting at the class_driver->minor_base.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chK`hjubh)}(h@This function also creates a usb class device in the sysfs tree.h]h@This function also creates a usb class device in the sysfs tree.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKfhjubh)}(hnusb_deregister_dev() must be called when the driver is done with the minor numbers given out by this function.h]hnusb_deregister_dev() must be called when the driver is done with the minor numbers given out by this function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKkhjubh)}(hT-EINVAL if something bad happens with trying to register a device, and 0 on success.h]hT-EINVAL if something bad happens with trying to register a device, and 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKkhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_deregister_dev (C function)c.usb_deregister_devhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h[void usb_deregister_dev (struct usb_interface *intf, struct usb_class_driver *class_driver)h]j)}(hZvoid usb_deregister_dev(struct usb_interface *intf, struct usb_class_driver *class_driver)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKubjp)}(husb_deregister_devh]jv)}(husb_deregister_devh]husb_deregister_dev}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKubj)}(hC(struct usb_interface *intf, struct usb_class_driver *class_driver)h](j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjAubj/)}(h h]h }(hjRhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjAubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjemodnameN classnameNj8j;)}j>]jA)}j4j+sbc.usb_deregister_devasbuh1hhjAubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjAubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjAubjv)}(hintfh]hintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h%struct usb_class_driver *class_driverh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_class_driverh]husb_class_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_deregister_devasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(h class_driverh]h class_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h(deregister a USB device's dynamic minor.h]h*deregister a USB device’s dynamic minor.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhj5hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jPj jPj j juh1j hhhjqhNhNubj)}(hXC**Parameters** ``struct usb_interface *intf`` pointer to the usb_interface that is being deregistered ``struct usb_class_driver *class_driver`` pointer to the usb_class_driver for this device **Description** Used in conjunction with usb_register_dev(). This function is called when the USB driver is finished with the minor numbers gotten from a call to usb_register_dev() (usually when the device is disconnected from the system.) This function also removes the usb class device from the sysfs tree. This should be called by all drivers that use the USB major number.h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjTubj0)}(hhh](j5)}(hW``struct usb_interface *intf`` pointer to the usb_interface that is being deregistered h](j;)}(h``struct usb_interface *intf``h]j)}(hjyh]hstruct usb_interface *intf}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j:h[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjsubjU)}(hhh]h)}(h7pointer to the usb_interface that is being deregisteredh]h7pointer to the usb_interface that is being deregistered}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjsubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjpubj5)}(hZ``struct usb_class_driver *class_driver`` pointer to the usb_class_driver for this device h](j;)}(h)``struct usb_class_driver *class_driver``h]j)}(hjh]h%struct usb_class_driver *class_driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjubjU)}(hhh]h)}(h/pointer to the usb_class_driver for this deviceh]h/pointer to the usb_class_driver for this device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjpubeh}(h]h ]h"]h$]h&]uh1j/hjTubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjTubh)}(hUsed in conjunction with usb_register_dev(). This function is called when the USB driver is finished with the minor numbers gotten from a call to usb_register_dev() (usually when the device is disconnected from the system.)h]hUsed in conjunction with usb_register_dev(). This function is called when the USB driver is finished with the minor numbers gotten from a call to usb_register_dev() (usually when the device is disconnected from the system.)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjTubh)}(hDThis function also removes the usb class device from the sysfs tree.h]hDThis function also removes the usb class device from the sysfs tree.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjTubh)}(hCThis should be called by all drivers that use the USB major number.h]hCThis should be called by all drivers that use the USB major number.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:167: ./drivers/usb/core/file.chKhjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'usb_driver_claim_interface (C function)c.usb_driver_claim_interfacehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hcint usb_driver_claim_interface (struct usb_driver *driver, struct usb_interface *iface, void *data)h]j)}(hbint usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void *data)h](j@)}(hinth]hint}(hjPhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjLhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM$ubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjLhhhj^hM$ubjp)}(husb_driver_claim_interfaceh]jv)}(husb_driver_claim_interfaceh]husb_driver_claim_interface}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjmubah}(h]h ](jjeh"]h$]h&]jjuh1johjLhhhj^hM$ubj)}(hD(struct usb_driver *driver, struct usb_interface *iface, void *data)h](j)}(hstruct usb_driver *driverh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_driverh]h usb_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jssbc.usb_driver_claim_interfaceasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdriverh]hdriver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct usb_interface *ifaceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_driver_claim_interfaceasbuh1hhjubj/)}(h h]h }(hj;hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjIhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hifaceh]hiface}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h void *datah](j@)}(hvoidh]hvoid}(hjohhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjkubj/)}(h h]h }(hj}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjkubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjkubjv)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjLhhhj^hM$ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhj^hM$ubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhj^hM$hjEhhubj)}(hhh]h)}(hbind a driver to an interfaceh]hbind a driver to an interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjEhhhj^hM$ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_driver *driver`` the driver to be bound ``struct usb_interface *iface`` the interface to which it will be bound; must be in the usb device's active configuration ``void *data`` driver data associated with that interface **Description** This is used by usb device drivers that need to claim more than one interface on a device when probing (audio and acm are current examples). No device driver should directly modify internal usb_interface or usb_device structure members. Callers must own the device lock, so driver probe() entries don't need extra locking, but other call contexts may need to explicitly claim that lock. **Return** 0 on success.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubj0)}(hhh](j5)}(h5``struct usb_driver *driver`` the driver to be bound h](j;)}(h``struct usb_driver *driver``h]j)}(hjh]hstruct usb_driver *driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(hthe driver to be boundh]hthe driver to be bound}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(hz``struct usb_interface *iface`` the interface to which it will be bound; must be in the usb device's active configuration h](j;)}(h``struct usb_interface *iface``h]j)}(hj<h]hstruct usb_interface *iface}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj6ubjU)}(hhh]h)}(hYthe interface to which it will be bound; must be in the usb device's active configurationh]h[the interface to which it will be bound; must be in the usb device’s active configuration}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjRubah}(h]h ]h"]h$]h&]uh1jThj6ubeh}(h]h ]h"]h$]h&]uh1j4hjQhMhjubj5)}(h:``void *data`` driver data associated with that interface h](j;)}(h``void *data``h]j)}(hjvh]h void *data}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjpubjU)}(hhh]h)}(h*driver data associated with that interfaceh]h*driver data associated with that interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjpubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hThis is used by usb device drivers that need to claim more than one interface on a device when probing (audio and acm are current examples). No device driver should directly modify internal usb_interface or usb_device structure members.h]hThis is used by usb device drivers that need to claim more than one interface on a device when probing (audio and acm are current examples). No device driver should directly modify internal usb_interface or usb_device structure members.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hCallers must own the device lock, so driver probe() entries don't need extra locking, but other call contexts may need to explicitly claim that lock.h]hCallers must own the device lock, so driver probe() entries don’t need extra locking, but other call contexts may need to explicitly claim that lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM"hjubh)}(h 0 on success.h]h 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM"hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)usb_driver_release_interface (C function)c.usb_driver_release_interfacehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hZvoid usb_driver_release_interface (struct usb_driver *driver, struct usb_interface *iface)h]j)}(hYvoid usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface)h](j@)}(hvoidh]hvoid}(hj,hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj(hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMnubj/)}(h h]h }(hj;hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj(hhhj:hMnubjp)}(husb_driver_release_interfaceh]jv)}(husb_driver_release_interfaceh]husb_driver_release_interface}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjIubah}(h]h ](jjeh"]h$]h&]jjuh1johj(hhhj:hMnubj)}(h8(struct usb_driver *driver, struct usb_interface *iface)h](j)}(hstruct usb_driver *driverh](j)}(hjh]hstruct}(hjihhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjeubj/)}(h h]h }(hjvhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjeubh)}(hhh]jv)}(h usb_driverh]h usb_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jOsbc.usb_driver_release_interfaceasbuh1hhjeubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjeubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjeubjv)}(hdriverh]hdriver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjaubj)}(hstruct usb_interface *ifaceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_driver_release_interfaceasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj%hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hifaceh]hiface}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjaubeh}(h]h ]h"]h$]h&]jjuh1jhj(hhhj:hMnubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj$hhhj:hMnubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj:hMnhj!hhubj)}(hhh]h)}(h!unbind a driver from an interfaceh]h!unbind a driver from an interface}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMahjYhhubah}(h]h ]h"]h$]h&]uh1jhj!hhhj:hMnubeh}(h]h ](jfunctioneh"]h$]h&]j jj jtj jtj j juh1j hhhjqhNhNubj)}(hXM**Parameters** ``struct usb_driver *driver`` the driver to be unbound ``struct usb_interface *iface`` the interface from which it will be unbound **Description** This can be used by drivers to release an interface without waiting for their disconnect() methods to be called. In typical cases this also causes the driver disconnect() method to be called. This call is synchronous, and may not be used in an interrupt context. Callers must own the device lock, so driver disconnect() entries don't need extra locking, but other call contexts may need to explicitly claim that lock.h](h)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMehjxubj0)}(hhh](j5)}(h7``struct usb_driver *driver`` the driver to be unbound h](j;)}(h``struct usb_driver *driver``h]j)}(hjh]hstruct usb_driver *driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMbhjubjU)}(hhh]h)}(hthe driver to be unboundh]hthe driver to be unbound}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMbhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMbhjubj5)}(hL``struct usb_interface *iface`` the interface from which it will be unbound h](j;)}(h``struct usb_interface *iface``h]j)}(hjh]hstruct usb_interface *iface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMchjubjU)}(hhh]h)}(h+the interface from which it will be unboundh]h+the interface from which it will be unbound}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMchjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMchjubeh}(h]h ]h"]h$]h&]uh1j/hjxubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMehjxubh)}(hThis can be used by drivers to release an interface without waiting for their disconnect() methods to be called. In typical cases this also causes the driver disconnect() method to be called.h]hThis can be used by drivers to release an interface without waiting for their disconnect() methods to be called. In typical cases this also causes the driver disconnect() method to be called.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMehjxubh)}(hThis call is synchronous, and may not be used in an interrupt context. Callers must own the device lock, so driver disconnect() entries don't need extra locking, but other call contexts may need to explicitly claim that lock.h]hThis call is synchronous, and may not be used in an interrupt context. Callers must own the device lock, so driver disconnect() entries don’t need extra locking, but other call contexts may need to explicitly claim that lock.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMihjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_match_id (C function)c.usb_match_idhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hkconst struct usb_device_id * usb_match_id (struct usb_interface *interface, const struct usb_device_id *id)h]j)}(hiconst struct usb_device_id *usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)h](j)}(hj h]hconst}(hjehhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjahhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM/ubj/)}(h h]h }(hjshhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjahhhjrhM/ubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjahhhjrhM/ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjahhhjrhM/ubh)}(hhh]jv)}(h usb_device_idh]h usb_device_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4 usb_match_idsbc.usb_match_idasbuh1hhjahhhjrhM/ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjahhhjrhM/ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjahhhjrhM/ubjp)}(h usb_match_idh]jv)}(hjh]h usb_match_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjahhhjrhM/ubj)}(hA(struct usb_interface *interface, const struct usb_device_id *id)h](j)}(hstruct usb_interface *interfaceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_match_idasbuh1hhjubj/)}(h h]h }(hj6hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjDhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(h interfaceh]h interface}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct usb_device_id *idh](j)}(hj h]hconst}(hjjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjfubj/)}(h h]h }(hjwhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjfubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjfubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjfubh)}(hhh]jv)}(h usb_device_idh]h usb_device_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jc.usb_match_idasbuh1hhjfubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjfubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjfubjv)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjahhhjrhM/ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhjrhM/ubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjrhM/hjZhhubj)}(hhh]h)}(h5find first usb_device_id matching device or interfaceh]h5find first usb_device_id matching device or interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjrhM/ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX **Parameters** ``struct usb_interface *interface`` the interface of interest ``const struct usb_device_id *id`` array of usb_device_id structures, terminated by zero entry **Description** usb_match_id searches an array of usb_device_id's and returns the first one matching the device or interface, or null. This is used when binding (or rebinding) a driver to an interface. Most USB device drivers will use this indirectly, through the usb core, but some layered driver frameworks use it directly. These device tables are exported with MODULE_DEVICE_TABLE, through modutils, to support the driver loading functionality of USB hotplugging. What Matches: The "match_flags" element in a usb_device_id controls which members are used. If the corresponding bit is set, the value in the device_id must match its corresponding member in the device or interface descriptor, or else the device_id does not match. "driver_info" is normally used only by device drivers, but you can create a wildcard "matches anything" usb_device_id as a driver's "modules.usbmap" entry if you provide an id with only a nonzero "driver_info" field. If you do this, the USB device driver's probe() routine should use additional intelligence to decide whether to bind to the specified interface. What Makes Good usb_device_id Tables: The match algorithm is very simple, so that intelligence in driver selection must come from smart driver id records. Unless you have good reasons to use another selection policy, provide match elements only in related groups, and order match specifiers from specific to general. Use the macros provided for that purpose if you can. The most specific match specifiers use device descriptor data. These are commonly used with product-specific matches; the USB_DEVICE macro lets you provide vendor and product IDs, and you can also match against ranges of product revisions. These are widely used for devices with application or vendor specific bDeviceClass values. Matches based on device class/subclass/protocol specifications are slightly more general; use the USB_DEVICE_INFO macro, or its siblings. These are used with single-function devices where bDeviceClass doesn't specify that each interface has its own class. Matches based on interface class/subclass/protocol are the most general; they let drivers bind to any interface on a multiple-function device. Use the USB_INTERFACE_INFO macro, or its siblings, to match class-per-interface style devices (as recorded in bInterfaceClass). Note that an entry created by USB_INTERFACE_INFO won't match any interface if the device class is set to Vendor-Specific. This is deliberate; according to the USB spec the meanings of the interface class/subclass/protocol for these devices are also vendor-specific, and hence matching against a standard product class wouldn't work anyway. If you really want to use an interface-based match for such a device, create a match record that also specifies the vendor ID. (Unforunately there isn't a standard macro for creating records like this.) Within those groups, remember that not all combinations are meaningful. For example, don't give a product version range without vendor and product IDs; or specify a protocol without its associated class and subclass. **Return** The first matching usb_device_id, or ``NULL``.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubj0)}(hhh](j5)}(h>``struct usb_interface *interface`` the interface of interest h](j;)}(h#``struct usb_interface *interface``h]j)}(hjGh]hstruct usb_interface *interface}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjAubjU)}(hhh]h)}(hthe interface of interesth]hthe interface of interest}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj]ubah}(h]h ]h"]h$]h&]uh1jThjAubeh}(h]h ]h"]h$]h&]uh1j4hj\hMhj>ubj5)}(h_``const struct usb_device_id *id`` array of usb_device_id structures, terminated by zero entry h](j;)}(h"``const struct usb_device_id *id``h]j)}(hjh]hconst struct usb_device_id *id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjzubjU)}(hhh]h)}(h;array of usb_device_id structures, terminated by zero entryh]h;array of usb_device_id structures, terminated by zero entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjzubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj>ubeh}(h]h ]h"]h$]h&]uh1j/hj"ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hXusb_match_id searches an array of usb_device_id's and returns the first one matching the device or interface, or null. This is used when binding (or rebinding) a driver to an interface. Most USB device drivers will use this indirectly, through the usb core, but some layered driver frameworks use it directly. These device tables are exported with MODULE_DEVICE_TABLE, through modutils, to support the driver loading functionality of USB hotplugging.h]hXusb_match_id searches an array of usb_device_id’s and returns the first one matching the device or interface, or null. This is used when binding (or rebinding) a driver to an interface. Most USB device drivers will use this indirectly, through the usb core, but some layered driver frameworks use it directly. These device tables are exported with MODULE_DEVICE_TABLE, through modutils, to support the driver loading functionality of USB hotplugging.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(h What Matches:h]h What Matches:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hThe "match_flags" element in a usb_device_id controls which members are used. If the corresponding bit is set, the value in the device_id must match its corresponding member in the device or interface descriptor, or else the device_id does not match.h]hThe “match_flags” element in a usb_device_id controls which members are used. If the corresponding bit is set, the value in the device_id must match its corresponding member in the device or interface descriptor, or else the device_id does not match.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hXj"driver_info" is normally used only by device drivers, but you can create a wildcard "matches anything" usb_device_id as a driver's "modules.usbmap" entry if you provide an id with only a nonzero "driver_info" field. If you do this, the USB device driver's probe() routine should use additional intelligence to decide whether to bind to the specified interface.h]hX~“driver_info” is normally used only by device drivers, but you can create a wildcard “matches anything” usb_device_id as a driver’s “modules.usbmap” entry if you provide an id with only a nonzero “driver_info” field. If you do this, the USB device driver’s probe() routine should use additional intelligence to decide whether to bind to the specified interface.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(h%What Makes Good usb_device_id Tables:h]h%What Makes Good usb_device_id Tables:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hXLThe match algorithm is very simple, so that intelligence in driver selection must come from smart driver id records. Unless you have good reasons to use another selection policy, provide match elements only in related groups, and order match specifiers from specific to general. Use the macros provided for that purpose if you can.h]hXLThe match algorithm is very simple, so that intelligence in driver selection must come from smart driver id records. Unless you have good reasons to use another selection policy, provide match elements only in related groups, and order match specifiers from specific to general. Use the macros provided for that purpose if you can.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hXKThe most specific match specifiers use device descriptor data. These are commonly used with product-specific matches; the USB_DEVICE macro lets you provide vendor and product IDs, and you can also match against ranges of product revisions. These are widely used for devices with application or vendor specific bDeviceClass values.h]hXKThe most specific match specifiers use device descriptor data. These are commonly used with product-specific matches; the USB_DEVICE macro lets you provide vendor and product IDs, and you can also match against ranges of product revisions. These are widely used for devices with application or vendor specific bDeviceClass values.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM hj"ubh)}(hXMatches based on device class/subclass/protocol specifications are slightly more general; use the USB_DEVICE_INFO macro, or its siblings. These are used with single-function devices where bDeviceClass doesn't specify that each interface has its own class.h]hXMatches based on device class/subclass/protocol specifications are slightly more general; use the USB_DEVICE_INFO macro, or its siblings. These are used with single-function devices where bDeviceClass doesn’t specify that each interface has its own class.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hXMatches based on interface class/subclass/protocol are the most general; they let drivers bind to any interface on a multiple-function device. Use the USB_INTERFACE_INFO macro, or its siblings, to match class-per-interface style devices (as recorded in bInterfaceClass).h]hXMatches based on interface class/subclass/protocol are the most general; they let drivers bind to any interface on a multiple-function device. Use the USB_INTERFACE_INFO macro, or its siblings, to match class-per-interface style devices (as recorded in bInterfaceClass).}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hX Note that an entry created by USB_INTERFACE_INFO won't match any interface if the device class is set to Vendor-Specific. This is deliberate; according to the USB spec the meanings of the interface class/subclass/protocol for these devices are also vendor-specific, and hence matching against a standard product class wouldn't work anyway. If you really want to use an interface-based match for such a device, create a match record that also specifies the vendor ID. (Unforunately there isn't a standard macro for creating records like this.)h]hX&Note that an entry created by USB_INTERFACE_INFO won’t match any interface if the device class is set to Vendor-Specific. This is deliberate; according to the USB spec the meanings of the interface class/subclass/protocol for these devices are also vendor-specific, and hence matching against a standard product class wouldn’t work anyway. If you really want to use an interface-based match for such a device, create a match record that also specifies the vendor ID. (Unforunately there isn’t a standard macro for creating records like this.)}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubh)}(hWithin those groups, remember that not all combinations are meaningful. For example, don't give a product version range without vendor and product IDs; or specify a protocol without its associated class and subclass.h]hWithin those groups, remember that not all combinations are meaningful. For example, don’t give a product version range without vendor and product IDs; or specify a protocol without its associated class and subclass.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM(hj"ubh)}(h **Return**h]j)}(hjxh]hReturn}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM-hj"ubh)}(h.The first matching usb_device_id, or ``NULL``.h](h%The first matching usb_device_id, or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'usb_register_device_driver (C function)c.usb_register_device_driverhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h\int usb_register_device_driver (struct usb_device_driver *new_udriver, struct module *owner)h]j)}(h[int usb_register_device_driver(struct usb_device_driver *new_udriver, struct module *owner)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_register_device_driverh]jv)}(husb_register_device_driverh]husb_register_device_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h=(struct usb_device_driver *new_udriver, struct module *owner)h](j)}(h%struct usb_device_driver *new_udriverh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_device_driverh]husb_device_driver}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj,modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_register_device_driverasbuh1hhjubj/)}(h h]h }(hjJhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjXhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(h new_udriverh]h new_udriver}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct module *ownerh](j)}(hjh]hstruct}(hj~hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubh)}(hhh]jv)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jFc.usb_register_device_driverasbuh1hhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjzubjv)}(hownerh]howner}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,register a USB device (not interface) driverh]h,register a USB device (not interface) driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device_driver *new_udriver`` USB operations for the device driver ``struct module *owner`` module owner of this driver. **Description** Registers a USB device driver with the USB core. The list of unattached devices will be rescanned whenever a new driver is added, allowing the new driver to attach to any recognized devices. **Return** A negative error code on failure and 0 on success.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubj0)}(hhh](j5)}(hO``struct usb_device_driver *new_udriver`` USB operations for the device driver h](j;)}(h)``struct usb_device_driver *new_udriver``h]j)}(hj@h]h%struct usb_device_driver *new_udriver}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj:ubjU)}(hhh]h)}(h$USB operations for the device driverh]h$USB operations for the device driver}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjVubah}(h]h ]h"]h$]h&]uh1jThj:ubeh}(h]h ]h"]h$]h&]uh1j4hjUhMhj7ubj5)}(h6``struct module *owner`` module owner of this driver. h](j;)}(h``struct module *owner``h]j)}(hjyh]hstruct module *owner}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjsubjU)}(hhh]h)}(hmodule owner of this driver.h]hmodule owner of this driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjsubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj7ubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hRegisters a USB device driver with the USB core. The list of unattached devices will be rescanned whenever a new driver is added, allowing the new driver to attach to any recognized devices.h]hRegisters a USB device driver with the USB core. The list of unattached devices will be rescanned whenever a new driver is added, allowing the new driver to attach to any recognized devices.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h2A negative error code on failure and 0 on success.h]h2A negative error code on failure and 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)usb_deregister_device_driver (C function)c.usb_deregister_device_driverhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hEvoid usb_deregister_device_driver (struct usb_device_driver *udriver)h]j)}(hDvoid usb_deregister_device_driver(struct usb_device_driver *udriver)h](j@)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM ubj/)}(h h]h }(hj/hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhj.hM ubjp)}(husb_deregister_device_driverh]jv)}(husb_deregister_device_driverh]husb_deregister_device_driver}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhj.hM ubj)}(h#(struct usb_device_driver *udriver)h]j)}(h!struct usb_device_driver *udriverh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjYubj/)}(h h]h }(hjjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubh)}(hhh]jv)}(husb_device_driverh]husb_device_driver}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjxubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj}modnameN classnameNj8j;)}j>]jA)}j4jCsbc.usb_deregister_device_driverasbuh1hhjYubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjYubjv)}(hudriverh]hudriver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj.hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj.hM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj.hM hjhhubj)}(hhh]h)}(h.unregister a USB device (not interface) driverh]h.unregister a USB device (not interface) driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj.hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_device_driver *udriver`` USB operations of the device driver to unregister **Context** must be able to sleep **Description** Unlinks the specified driver from the internal USB driver list.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM hjubj0)}(hhh]j5)}(hX``struct usb_device_driver *udriver`` USB operations of the device driver to unregister h](j;)}(h%``struct usb_device_driver *udriver``h]j)}(hj!h]h!struct usb_device_driver *udriver}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(h1USB operations of the device driver to unregisterh]h1USB operations of the device driver to unregister}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj6hMhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hj\h]hContext}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hmust be able to sleeph]hmust be able to sleep}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM hjubh)}(h?Unlinks the specified driver from the internal USB driver list.h]h?Unlinks the specified driver from the internal USB driver list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j usb_register_driver (C function)c.usb_register_driverhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hcint usb_register_driver (struct usb_driver *new_driver, struct module *owner, const char *mod_name)h]j)}(hbint usb_register_driver(struct usb_driver *new_driver, struct module *owner, const char *mod_name)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM$ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM$ubjp)}(husb_register_driverh]jv)}(husb_register_driverh]husb_register_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhM$ubj)}(hK(struct usb_driver *new_driver, struct module *owner, const char *mod_name)h](j)}(hstruct usb_driver *new_driverh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_driverh]h usb_driver}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj%modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_register_driverasbuh1hhjubj/)}(h h]h }(hjChhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjQhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(h new_driverh]h new_driver}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct module *ownerh](j)}(hjh]hstruct}(hjwhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjsubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjsubh)}(hhh]jv)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j?c.usb_register_driverasbuh1hhjsubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjsubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjsubjv)}(hownerh]howner}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *mod_nameh](j)}(hj h]hconst}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hmod_nameh]hmod_name}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM$ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM$ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM$hjhhubj)}(hhh]h)}(hregister a USB interface driverh]hregister a USB interface driver}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjRhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM$ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jmj jmj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_driver *new_driver`` USB operations for the interface driver ``struct module *owner`` module owner of this driver. ``const char *mod_name`` module name string **Description** Registers a USB interface driver with the USB core. The list of unattached interfaces will be rescanned whenever a new driver is added, allowing the new driver to attach to any recognized interfaces. **Return** A negative error code on failure and 0 on success. **NOTE** if you want your driver to use the USB major number, you must call usb_register_dev() to enable that functionality. This function no longer takes care of that.h](h)}(h**Parameters**h]j)}(hjwh]h Parameters}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjqubj0)}(hhh](j5)}(hJ``struct usb_driver *new_driver`` USB operations for the interface driver h](j;)}(h!``struct usb_driver *new_driver``h]j)}(hjh]hstruct usb_driver *new_driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(h'USB operations for the interface driverh]h'USB operations for the interface driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h6``struct module *owner`` module owner of this driver. h](j;)}(h``struct module *owner``h]j)}(hjh]hstruct module *owner}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(hmodule owner of this driver.h]hmodule owner of this driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h,``const char *mod_name`` module name string h](j;)}(h``const char *mod_name``h]j)}(hjh]hconst char *mod_name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(hmodule name stringh]hmodule name string}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjqubh)}(h**Description**h]j)}(hjCh]h Description}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjqubh)}(hRegisters a USB interface driver with the USB core. The list of unattached interfaces will be rescanned whenever a new driver is added, allowing the new driver to attach to any recognized interfaces.h]hRegisters a USB interface driver with the USB core. The list of unattached interfaces will be rescanned whenever a new driver is added, allowing the new driver to attach to any recognized interfaces.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjqubh)}(h **Return**h]j)}(hjjh]hReturn}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjqubh)}(h2A negative error code on failure and 0 on success.h]h2A negative error code on failure and 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjqubh)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM hjqubh)}(hif you want your driver to use the USB major number, you must call usb_register_dev() to enable that functionality. This function no longer takes care of that.h]hif you want your driver to use the USB major number, you must call usb_register_dev() to enable that functionality. This function no longer takes care of that.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM hjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_deregister (C function)c.usb_deregisterhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h/void usb_deregister (struct usb_driver *driver)h]j)}(h.void usb_deregister(struct usb_driver *driver)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMWubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMWubjp)}(husb_deregisterh]jv)}(husb_deregisterh]husb_deregister}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMWubj)}(h(struct usb_driver *driver)h]j)}(hstruct usb_driver *driverh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_driverh]h usb_driver}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj3modnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_deregisterasbuh1hhjubj/)}(h h]h }(hjQhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj_hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdriverh]hdriver}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMWubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMWhjhhubj)}(hhh]h)}(h!unregister a USB interface driverh]h!unregister a USB interface driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMWubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_driver *driver`` USB operations of the interface driver to unregister **Context** must be able to sleep **Description** Unlinks the specified driver from the internal USB driver list. **NOTE** If you called usb_register_dev(), you still need to call usb_deregister_dev() to clean up your driver's allocated minor numbers, this * call will no longer do it for you.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMQhjubj0)}(hhh]j5)}(hS``struct usb_driver *driver`` USB operations of the interface driver to unregister h](j;)}(h``struct usb_driver *driver``h]j)}(hjh]hstruct usb_driver *driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMNhjubjU)}(hhh]h)}(h4USB operations of the interface driver to unregisterh]h4USB operations of the interface driver to unregister}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMNhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMPhjubh)}(hmust be able to sleeph]hmust be able to sleep}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMOhjubh)}(h**Description**h]j)}(hj9h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMQhjubh)}(h?Unlinks the specified driver from the internal USB driver list.h]h?Unlinks the specified driver from the internal USB driver list.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMPhjubh)}(h**NOTE**h]j)}(hj`h]hNOTE}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMRhjubh)}(hIf you called usb_register_dev(), you still need to call usb_deregister_dev() to clean up your driver's allocated minor numbers, this * call will no longer do it for you.h]hIf you called usb_register_dev(), you still need to call usb_deregister_dev() to clean up your driver’s allocated minor numbers, this * call will no longer do it for you.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMShjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#usb_enable_autosuspend (C function)c.usb_enable_autosuspendhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h5void usb_enable_autosuspend (struct usb_device *udev)h]j)}(h4void usb_enable_autosuspend(struct usb_device *udev)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMrubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMrubjp)}(husb_enable_autosuspendh]jv)}(husb_enable_autosuspendh]husb_enable_autosuspend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMrubj)}(h(struct usb_device *udev)h]j)}(hstruct usb_device *udevh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_enable_autosuspendasbuh1hhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj.hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hudevh]hudev}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMrubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMrubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMrhjhhubj)}(hhh]h)}(h&allow a USB device to be autosuspendedh]h&allow a USB device to be autosuspended}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMihjbhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMrubeh}(h]h ](jfunctioneh"]h$]h&]j jj j}j j}j j juh1j hhhjqhNhNubj)}(hXH**Parameters** ``struct usb_device *udev`` the USB device which may be autosuspended **Description** This routine allows **udev** to be autosuspended. An autosuspend won't take place until the autosuspend_delay has elapsed and all the other necessary conditions are satisfied. The caller must hold **udev**'s device lock.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMmhjubj0)}(hhh]j5)}(hF``struct usb_device *udev`` the USB device which may be autosuspended h](j;)}(h``struct usb_device *udev``h]j)}(hjh]hstruct usb_device *udev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMjhjubjU)}(hhh]h)}(h)the USB device which may be autosuspendedh]h)the USB device which may be autosuspended}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMjhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMjhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMlhjubh)}(hThis routine allows **udev** to be autosuspended. An autosuspend won't take place until the autosuspend_delay has elapsed and all the other necessary conditions are satisfied.h](hThis routine allows }(hjhhhNhNubj)}(h**udev**h]hudev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to be autosuspended. An autosuspend won’t take place until the autosuspend_delay has elapsed and all the other necessary conditions are satisfied.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMlhjubh)}(h,The caller must hold **udev**'s device lock.h](hThe caller must hold }(hjhhhNhNubj)}(h**udev**h]hudev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s device lock.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMphjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_disable_autosuspend (C function)c.usb_disable_autosuspendhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h6void usb_disable_autosuspend (struct usb_device *udev)h]j)}(h5void usb_disable_autosuspend(struct usb_device *udev)h](j@)}(hvoidh]hvoid}(hjYhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjUhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMubj/)}(h h]h }(hjhhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUhhhjghMubjp)}(husb_disable_autosuspendh]jv)}(husb_disable_autosuspendh]husb_disable_autosuspend}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvubah}(h]h ](jjeh"]h$]h&]jjuh1johjUhhhjghMubj)}(h(struct usb_device *udev)h]j)}(hstruct usb_device *udevh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4j|sbc.usb_disable_autosuspendasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hudevh]hudev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQhhhjghMubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjghMhjNhhubj)}(hhh]h)}(h-prevent a USB device from being autosuspendedh]h-prevent a USB device from being autosuspended}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMyhjhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j1j j1j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *udev`` the USB device which may not be autosuspended **Description** This routine prevents **udev** from being autosuspended and wakes it up if it is already autosuspended. The caller must hold **udev**'s device lock.h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM}hj5ubj0)}(hhh]j5)}(hJ``struct usb_device *udev`` the USB device which may not be autosuspended h](j;)}(h``struct usb_device *udev``h]j)}(hjZh]hstruct usb_device *udev}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMzhjTubjU)}(hhh]h)}(h-the USB device which may not be autosuspendedh]h-the USB device which may not be autosuspended}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMzhjpubah}(h]h ]h"]h$]h&]uh1jThjTubeh}(h]h ]h"]h$]h&]uh1j4hjohMzhjQubah}(h]h ]h"]h$]h&]uh1j/hj5ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM|hj5ubh)}(hgThis routine prevents **udev** from being autosuspended and wakes it up if it is already autosuspended.h](hThis routine prevents }(hjhhhNhNubj)}(h**udev**h]hudev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhI from being autosuspended and wakes it up if it is already autosuspended.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM|hj5ubh)}(h,The caller must hold **udev**'s device lock.h](hThe caller must hold }(hjhhhNhNubj)}(h**udev**h]hudev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s device lock.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_autopm_put_interface (C function)c.usb_autopm_put_interfacehNtauh1jhjqhhhNhNubj )}(hhh](j)}(h:void usb_autopm_put_interface (struct usb_interface *intf)h]j)}(h9void usb_autopm_put_interface(struct usb_interface *intf)h](j@)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj hhhjhMubjp)}(husb_autopm_put_interfaceh]jv)}(husb_autopm_put_interfaceh]husb_autopm_put_interface}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1johj hhhjhMubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjJhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjFubj/)}(h h]h }(hjWhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjFubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjeubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjjmodnameN classnameNj8j;)}j>]jA)}j4j0sbc.usb_autopm_put_interfaceasbuh1hhjFubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjFubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjFubjv)}(hintfh]hintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,decrement a USB interface's PM-usage counterh]h.decrement a USB interface’s PM-usage counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX=**Parameters** ``struct usb_interface *intf`` the usb_interface whose counter should be decremented **Description** This routine should be called by an interface driver when it is finished using **intf** and wants to allow it to autosuspend. A typical example would be a character-device driver when its device file is closed. The routine decrements **intf**'s usage counter. When the counter reaches 0, a delayed autosuspend request for **intf**'s device is attempted. The attempt may fail (see autosuspend_check()). This routine can run only in process context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubj0)}(hhh]j5)}(hU``struct usb_interface *intf`` the usb_interface whose counter should be decremented h](j;)}(h``struct usb_interface *intf``h]j)}(hjh]hstruct usb_interface *intf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(h5the usb_interface whose counter should be decrementedh]h5the usb_interface whose counter should be decremented}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMhj$ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj#hMhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjIh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hThis routine should be called by an interface driver when it is finished using **intf** and wants to allow it to autosuspend. A typical example would be a character-device driver when its device file is closed.h](hOThis routine should be called by an interface driver when it is finished using }(hj_hhhNhNubj)}(h**intf**h]hintf}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh| and wants to allow it to autosuspend. A typical example would be a character-device driver when its device file is closed.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hThe routine decrements **intf**'s usage counter. When the counter reaches 0, a delayed autosuspend request for **intf**'s device is attempted. The attempt may fail (see autosuspend_check()).h](hThe routine decrements }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhS’s usage counter. When the counter reaches 0, a delayed autosuspend request for }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhJ’s device is attempted. The attempt may fail (see autosuspend_check()).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h-This routine can run only in process context.h]h-This routine can run only in process context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+usb_autopm_put_interface_async (C function) c.usb_autopm_put_interface_asynchNtauh1jhjqhhhNhNubj )}(hhh](j)}(h@void usb_autopm_put_interface_async (struct usb_interface *intf)h]j)}(h?void usb_autopm_put_interface_async(struct usb_interface *intf)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_autopm_put_interface_asynch]jv)}(husb_autopm_put_interface_asynch]husb_autopm_put_interface_async}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj?modnameN classnameNj8j;)}j>]jA)}j4jsb c.usb_autopm_put_interface_asyncasbuh1hhjubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjkhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hintfh]hintf}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,decrement a USB interface's PM-usage counterh]h.decrement a USB interface’s PM-usage counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hXU**Parameters** ``struct usb_interface *intf`` the usb_interface whose counter should be decremented **Description** This routine does much the same thing as usb_autopm_put_interface(): It decrements **intf**'s usage counter and schedules a delayed autosuspend request if the counter is <= 0. The difference is that it does not perform any synchronization; callers should hold a private lock and handle all synchronization issues themselves. Typically a driver would call this routine during an URB's completion handler, if no more URBs were pending. This routine can run in atomic context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubj0)}(hhh]j5)}(hU``struct usb_interface *intf`` the usb_interface whose counter should be decremented h](j;)}(h``struct usb_interface *intf``h]j)}(hjh]hstruct usb_interface *intf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(h5the usb_interface whose counter should be decrementedh]h5the usb_interface whose counter should be decremented}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hXEThis routine does much the same thing as usb_autopm_put_interface(): It decrements **intf**'s usage counter and schedules a delayed autosuspend request if the counter is <= 0. The difference is that it does not perform any synchronization; callers should hold a private lock and handle all synchronization issues themselves.h](hSThis routine does much the same thing as usb_autopm_put_interface(): It decrements }(hj4hhhNhNubj)}(h**intf**h]hintf}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh’s usage counter and schedules a delayed autosuspend request if the counter is <= 0. The difference is that it does not perform any synchronization; callers should hold a private lock and handle all synchronization issues themselves.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hlTypically a driver would call this routine during an URB's completion handler, if no more URBs were pending.h]hnTypically a driver would call this routine during an URB’s completion handler, if no more URBs were pending.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h'This routine can run in atomic context.h]h'This routine can run in atomic context.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j0usb_autopm_put_interface_no_suspend (C function)%c.usb_autopm_put_interface_no_suspendhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hEvoid usb_autopm_put_interface_no_suspend (struct usb_interface *intf)h]j)}(hDvoid usb_autopm_put_interface_no_suspend(struct usb_interface *intf)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(h#usb_autopm_put_interface_no_suspendh]jv)}(h#usb_autopm_put_interface_no_suspendh]h#usb_autopm_put_interface_no_suspend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsb%c.usb_autopm_put_interface_no_suspendasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hintfh]hintf}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,decrement a USB interface's PM-usage counterh]h.decrement a USB interface’s PM-usage counter}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjPhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jkj jkj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_interface *intf`` the usb_interface whose counter should be decremented **Description** This routine decrements **intf**'s usage counter but does not carry out an autosuspend. This routine can run in atomic context.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjoubj0)}(hhh]j5)}(hU``struct usb_interface *intf`` the usb_interface whose counter should be decremented h](j;)}(h``struct usb_interface *intf``h]j)}(hjh]hstruct usb_interface *intf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubjU)}(hhh]h)}(h5the usb_interface whose counter should be decrementedh]h5the usb_interface whose counter should be decremented}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubah}(h]h ]h"]h$]h&]uh1j/hjoubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjoubh)}(hWThis routine decrements **intf**'s usage counter but does not carry out an autosuspend.h](hThis routine decrements }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh9’s usage counter but does not carry out an autosuspend.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjoubh)}(h'This routine can run in atomic context.h]h'This routine can run in atomic context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_autopm_get_interface (C function)c.usb_autopm_get_interfacehNtauh1jhjqhhhNhNubj )}(hhh](j)}(h9int usb_autopm_get_interface (struct usb_interface *intf)h]j)}(h8int usb_autopm_get_interface(struct usb_interface *intf)h](j@)}(hinth]hint}(hj5hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj1hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM ubj/)}(h h]h }(hjDhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj1hhhjChM ubjp)}(husb_autopm_get_interfaceh]jv)}(husb_autopm_get_interfaceh]husb_autopm_get_interface}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjRubah}(h]h ](jjeh"]h$]h&]jjuh1johj1hhhjChM ubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjrhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjnubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjnubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jXsbc.usb_autopm_get_interfaceasbuh1hhjnubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjnubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjnubjv)}(hintfh]hintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjjubah}(h]h ]h"]h$]h&]jjuh1jhj1hhhjChM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj-hhhjChM ubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1jhjChM hj*hhubj)}(hhh]h)}(h,increment a USB interface's PM-usage counterh]h.increment a USB interface’s PM-usage counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj*hhhjChM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j j j j j juh1j hhhjqhNhNubj)}(hX.**Parameters** ``struct usb_interface *intf`` the usb_interface whose counter should be incremented **Description** This routine should be called by an interface driver when it wants to use **intf** and needs to guarantee that it is not suspended. In addition, the routine prevents **intf** from being autosuspended subsequently. (Note that this will not prevent suspend events originating in the PM core.) This prevention will persist until usb_autopm_put_interface() is called or **intf** is unbound. A typical example would be a character-device driver when its device file is opened. **intf**'s usage counter is incremented to prevent subsequent autosuspends. However if the autoresume fails then the counter is re-decremented. This routine can run only in process context. **Return** 0 on success.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubj0)}(hhh]j5)}(hU``struct usb_interface *intf`` the usb_interface whose counter should be incremented h](j;)}(h``struct usb_interface *intf``h]j)}(hj6h]hstruct usb_interface *intf}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhj0ubjU)}(hhh]h)}(h5the usb_interface whose counter should be incrementedh]h5the usb_interface whose counter should be incremented}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjLubah}(h]h ]h"]h$]h&]uh1jThj0ubeh}(h]h ]h"]h$]h&]uh1j4hjKhMhj-ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjqh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(hXThis routine should be called by an interface driver when it wants to use **intf** and needs to guarantee that it is not suspended. In addition, the routine prevents **intf** from being autosuspended subsequently. (Note that this will not prevent suspend events originating in the PM core.) This prevention will persist until usb_autopm_put_interface() is called or **intf** is unbound. A typical example would be a character-device driver when its device file is opened.h](hJThis routine should be called by an interface driver when it wants to use }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU and needs to guarantee that it is not suspended. In addition, the routine prevents }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh from being autosuspended subsequently. (Note that this will not prevent suspend events originating in the PM core.) This prevention will persist until usb_autopm_put_interface() is called or }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhb is unbound. A typical example would be a character-device driver when its device file is opened.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h**intf**'s usage counter is incremented to prevent subsequent autosuspends. However if the autoresume fails then the counter is re-decremented.h](j)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s usage counter is incremented to prevent subsequent autosuspends. However if the autoresume fails then the counter is re-decremented.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h-This routine can run only in process context.h]h-This routine can run only in process context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubh)}(h 0 on success.h]h 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+usb_autopm_get_interface_async (C function) c.usb_autopm_get_interface_asynchNtauh1jhjqhhhNhNubj )}(hhh](j)}(h?int usb_autopm_get_interface_async (struct usb_interface *intf)h]j)}(h>int usb_autopm_get_interface_async(struct usb_interface *intf)h](j@)}(hinth]hint}(hj?hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj;hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM?ubj/)}(h h]h }(hjNhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj;hhhjMhM?ubjp)}(husb_autopm_get_interface_asynch]jv)}(husb_autopm_get_interface_asynch]husb_autopm_get_interface_async}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1johj;hhhjMhM?ubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hj|hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjxubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjxubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jbsb c.usb_autopm_get_interface_asyncasbuh1hhjxubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjxubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjxubjv)}(hintfh]hintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubah}(h]h ]h"]h$]h&]jjuh1jhj;hhhjMhM?ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj7hhhjMhM?ubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jhjMhM?hj4hhubj)}(hhh]h)}(h,increment a USB interface's PM-usage counterh]h.increment a USB interface’s PM-usage counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM/hjhhubah}(h]h ]h"]h$]h&]uh1jhj4hhhjMhM?ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_interface *intf`` the usb_interface whose counter should be incremented **Description** This routine does much the same thing as usb_autopm_get_interface(): It increments **intf**'s usage counter and queues an autoresume request if the device is suspended. The differences are that it does not perform any synchronization (callers should hold a private lock and handle all synchronization issues themselves), and it does not autoresume the device directly (it only queues a request). After a successful call, the device may not yet be resumed. This routine can run in atomic context. **Return** 0 on success. A negative error code otherwise.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM3hjubj0)}(hhh]j5)}(hU``struct usb_interface *intf`` the usb_interface whose counter should be incremented h](j;)}(h``struct usb_interface *intf``h]j)}(hj@h]hstruct usb_interface *intf}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM0hj:ubjU)}(hhh]h)}(h5the usb_interface whose counter should be incrementedh]h5the usb_interface whose counter should be incremented}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM0hjVubah}(h]h ]h"]h$]h&]uh1jThj:ubeh}(h]h ]h"]h$]h&]uh1j4hjUhM0hj7ubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj{h]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM2hjubh)}(hXThis routine does much the same thing as usb_autopm_get_interface(): It increments **intf**'s usage counter and queues an autoresume request if the device is suspended. The differences are that it does not perform any synchronization (callers should hold a private lock and handle all synchronization issues themselves), and it does not autoresume the device directly (it only queues a request). After a successful call, the device may not yet be resumed.h](hSThis routine does much the same thing as usb_autopm_get_interface(): It increments }(hjhhhNhNubj)}(h**intf**h]hintf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhXp’s usage counter and queues an autoresume request if the device is suspended. The differences are that it does not perform any synchronization (callers should hold a private lock and handle all synchronization issues themselves), and it does not autoresume the device directly (it only queues a request). After a successful call, the device may not yet be resumed.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM2hjubh)}(h'This routine can run in atomic context.h]h'This routine can run in atomic context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM;hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM=hjubh)}(h.0 on success. A negative error code otherwise.h]h.0 on success. A negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chM=hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j/usb_autopm_get_interface_no_resume (C function)$c.usb_autopm_get_interface_no_resumehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hDvoid usb_autopm_get_interface_no_resume (struct usb_interface *intf)h]j)}(hCvoid usb_autopm_get_interface_no_resume(struct usb_interface *intf)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMXubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMXubjp)}(h"usb_autopm_get_interface_no_resumeh]jv)}(h"usb_autopm_get_interface_no_resumeh]h"usb_autopm_get_interface_no_resume}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMXubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjAubj/)}(h h]h }(hjRhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjAubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjemodnameN classnameNj8j;)}j>]jA)}j4j+sb$c.usb_autopm_get_interface_no_resumeasbuh1hhjAubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjAubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjAubjv)}(hintfh]hintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMXubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMXubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMXhjhhubj)}(hhh]h)}(h,increment a USB interface's PM-usage counterh]h.increment a USB interface’s PM-usage counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMPhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMXubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_interface *intf`` the usb_interface whose counter should be incremented **Description** This routine increments **intf**'s usage counter but does not carry out an autoresume. This routine can run in atomic context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMThjubj0)}(hhh]j5)}(hU``struct usb_interface *intf`` the usb_interface whose counter should be incremented h](j;)}(h``struct usb_interface *intf``h]j)}(hj h]hstruct usb_interface *intf}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMQhjubjU)}(hhh]h)}(h5the usb_interface whose counter should be incrementedh]h5the usb_interface whose counter should be incremented}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMQhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMQhjubah}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjDh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMShjubh)}(hVThis routine increments **intf**'s usage counter but does not carry out an autoresume.h](hThis routine increments }(hjZhhhNhNubj)}(h**intf**h]hintf}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubh8’s usage counter but does not carry out an autoresume.}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMShjubh)}(h'This routine can run in atomic context.h]h'This routine can run in atomic context.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:170: ./drivers/usb/core/driver.chMVhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&usb_find_common_endpoints (C function)c.usb_find_common_endpointshNtauh1jhjqhhhNhNubj )}(hhh](j)}(hint usb_find_common_endpoints (struct usb_host_interface *alt, struct usb_endpoint_descriptor **bulk_in, struct usb_endpoint_descriptor **bulk_out, struct usb_endpoint_descriptor **int_in, struct usb_endpoint_descriptor **int_out)h]j)}(hint usb_find_common_endpoints(struct usb_host_interface *alt, struct usb_endpoint_descriptor **bulk_in, struct usb_endpoint_descriptor **bulk_out, struct usb_endpoint_descriptor **int_in, struct usb_endpoint_descriptor **int_out)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhKubjp)}(husb_find_common_endpointsh]jv)}(husb_find_common_endpointsh]husb_find_common_endpoints}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhKubj)}(h(struct usb_host_interface *alt, struct usb_endpoint_descriptor **bulk_in, struct usb_endpoint_descriptor **bulk_out, struct usb_endpoint_descriptor **int_in, struct usb_endpoint_descriptor **int_out)h](j)}(hstruct usb_host_interface *alth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_host_interfaceh]husb_host_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_find_common_endpointsasbuh1hhjubj/)}(h h]h }(hj%hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj3hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(halth]halt}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h(struct usb_endpoint_descriptor **bulk_inh](j)}(hjh]hstruct}(hjYhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjUubj/)}(h h]h }(hjfhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjtubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjymodnameN classnameNj8j;)}j>]j!c.usb_find_common_endpointsasbuh1hhjUubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjUubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjUubjv)}(hbulk_inh]hbulk_in}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h)struct usb_endpoint_descriptor **bulk_outh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j!c.usb_find_common_endpointsasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubj_)}(hjbh]h*}(hj-hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hbulk_outh]hbulk_out}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h'struct usb_endpoint_descriptor **int_inh](j)}(hjh]hstruct}(hjShhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjOubj/)}(h h]h }(hj`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjOubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjnubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjsmodnameN classnameNj8j;)}j>]j!c.usb_find_common_endpointsasbuh1hhjOubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjOubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjOubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjOubjv)}(hint_inh]hint_in}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h(struct usb_endpoint_descriptor **int_outh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j!c.usb_find_common_endpointsasbuh1hhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubj_)}(hjbh]h*}(hj'hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hint_outh]hint_out}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]j)}(hhh]j)}(h#look up common endpoint descriptorsh]h)}(hjch]h#look up common endpoint descriptors}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKwhjaubah}(h]h ]h"]h$]h&]uh1jhj^hhhjrhNubah}(h]h ]h"]h$]h&]jrjsuh1jhjrhKwhj[hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_host_interface *alt`` alternate setting to search ``struct usb_endpoint_descriptor **bulk_in`` pointer to descriptor pointer, or NULL ``struct usb_endpoint_descriptor **bulk_out`` pointer to descriptor pointer, or NULL ``struct usb_endpoint_descriptor **int_in`` pointer to descriptor pointer, or NULL ``struct usb_endpoint_descriptor **int_out`` pointer to descriptor pointer, or NULL **Description** Search the alternate setting's endpoint descriptors for the first bulk-in, bulk-out, interrupt-in and interrupt-out endpoints and return them in the provided pointers (unless they are NULL). If a requested endpoint is not found, the corresponding pointer is set to NULL. **Return** Zero if all requested descriptors were found, or -ENXIO otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chK{hjubj0)}(hhh](j5)}(h?``struct usb_host_interface *alt`` alternate setting to search h](j;)}(h"``struct usb_host_interface *alt``h]j)}(hjh]hstruct usb_host_interface *alt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKxhjubjU)}(hhh]h)}(halternate setting to searchh]halternate setting to search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKxhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKxhjubj5)}(hT``struct usb_endpoint_descriptor **bulk_in`` pointer to descriptor pointer, or NULL h](j;)}(h,``struct usb_endpoint_descriptor **bulk_in``h]j)}(hjh]h(struct usb_endpoint_descriptor **bulk_in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKyhjubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKyhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKyhjubj5)}(hU``struct usb_endpoint_descriptor **bulk_out`` pointer to descriptor pointer, or NULL h](j;)}(h-``struct usb_endpoint_descriptor **bulk_out``h]j)}(hj#h]h)struct usb_endpoint_descriptor **bulk_out}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKzhjubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hKzhj9ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj8hKzhjubj5)}(hS``struct usb_endpoint_descriptor **int_in`` pointer to descriptor pointer, or NULL h](j;)}(h+``struct usb_endpoint_descriptor **int_in``h]j)}(hj\h]h'struct usb_endpoint_descriptor **int_in}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chK{hjVubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhK{hjrubah}(h]h ]h"]h$]h&]uh1jThjVubeh}(h]h ]h"]h$]h&]uh1j4hjqhK{hjubj5)}(hT``struct usb_endpoint_descriptor **int_out`` pointer to descriptor pointer, or NULL h](j;)}(h,``struct usb_endpoint_descriptor **int_out``h]j)}(hjh]h(struct usb_endpoint_descriptor **int_out}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chK|hjubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK|hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhK|hjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chK~hjubh)}(hSearch the alternate setting's endpoint descriptors for the first bulk-in, bulk-out, interrupt-in and interrupt-out endpoints and return them in the provided pointers (unless they are NULL).h]hSearch the alternate setting’s endpoint descriptors for the first bulk-in, bulk-out, interrupt-in and interrupt-out endpoints and return them in the provided pointers (unless they are NULL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chK~hjubh)}(hOIf a requested endpoint is not found, the corresponding pointer is set to NULL.h]hOIf a requested endpoint is not found, the corresponding pointer is set to NULL.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjubh)}(hBZero if all requested descriptors were found, or -ENXIO otherwise.h]hBZero if all requested descriptors were found, or -ENXIO otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j.usb_find_common_endpoints_reverse (C function)#c.usb_find_common_endpoints_reversehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hint usb_find_common_endpoints_reverse (struct usb_host_interface *alt, struct usb_endpoint_descriptor **bulk_in, struct usb_endpoint_descriptor **bulk_out, struct usb_endpoint_descriptor **int_in, struct usb_endpoint_descriptor **int_out)h]j)}(hint usb_find_common_endpoints_reverse(struct usb_host_interface *alt, struct usb_endpoint_descriptor **bulk_in, struct usb_endpoint_descriptor **bulk_out, struct usb_endpoint_descriptor **int_in, struct usb_endpoint_descriptor **int_out)h](j@)}(hinth]hint}(hjKhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjGhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKubj/)}(h h]h }(hjZhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjGhhhjYhKubjp)}(h!usb_find_common_endpoints_reverseh]jv)}(h!usb_find_common_endpoints_reverseh]h!usb_find_common_endpoints_reverse}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubah}(h]h ](jjeh"]h$]h&]jjuh1johjGhhhjYhKubj)}(h(struct usb_host_interface *alt, struct usb_endpoint_descriptor **bulk_in, struct usb_endpoint_descriptor **bulk_out, struct usb_endpoint_descriptor **int_in, struct usb_endpoint_descriptor **int_out)h](j)}(hstruct usb_host_interface *alth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_host_interfaceh]husb_host_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jnsb#c.usb_find_common_endpoints_reverseasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(halth]halt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h(struct usb_endpoint_descriptor **bulk_inh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]j#c.usb_find_common_endpoints_reverseasbuh1hhjubj/)}(h h]h }(hj6 hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjD hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubj_)}(hjbh]h*}(hjQ hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hbulk_inh]hbulk_in}(hj^ hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h)struct usb_endpoint_descriptor **bulk_outh](j)}(hjh]hstruct}(hjw hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjs ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjs ubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]j#c.usb_find_common_endpoints_reverseasbuh1hhjs ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjs ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjs ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjs ubjv)}(hbulk_outh]hbulk_out}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjs ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h'struct usb_endpoint_descriptor **int_inh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]j#c.usb_find_common_endpoints_reverseasbuh1hhj ubj/)}(h h]h }(hj0 hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj> hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubj_)}(hjbh]h*}(hjK hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hint_inh]hint_in}(hjX hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h(struct usb_endpoint_descriptor **int_outh](j)}(hjh]hstruct}(hjq hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjm ubj/)}(h h]h }(hj~ hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjm ubh)}(hhh]jv)}(husb_endpoint_descriptorh]husb_endpoint_descriptor}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]j#c.usb_find_common_endpoints_reverseasbuh1hhjm ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjm ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjm ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjm ubjv)}(hint_outh]hint_out}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjm ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjGhhhjYhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjYhKubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhjYhKhj@hhubj)}(hhh]j)}(hhh]j)}(h#look up common endpoint descriptorsh]h)}(hj h]h#look up common endpoint descriptors}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhj hNubah}(h]h ]h"]h$]h&]jrjsuh1jhj hKhj hhubah}(h]h ]h"]h$]h&]uh1jhj@hhhjYhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj j) j j) j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_host_interface *alt`` alternate setting to search ``struct usb_endpoint_descriptor **bulk_in`` pointer to descriptor pointer, or NULL ``struct usb_endpoint_descriptor **bulk_out`` pointer to descriptor pointer, or NULL ``struct usb_endpoint_descriptor **int_in`` pointer to descriptor pointer, or NULL ``struct usb_endpoint_descriptor **int_out`` pointer to descriptor pointer, or NULL **Description** Search the alternate setting's endpoint descriptors for the last bulk-in, bulk-out, interrupt-in and interrupt-out endpoints and return them in the provided pointers (unless they are NULL). If a requested endpoint is not found, the corresponding pointer is set to NULL. **Return** Zero if all requested descriptors were found, or -ENXIO otherwise.h](h)}(h**Parameters**h]j)}(hj3 h]h Parameters}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1 ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj- ubj0)}(hhh](j5)}(h?``struct usb_host_interface *alt`` alternate setting to search h](j;)}(h"``struct usb_host_interface *alt``h]j)}(hjR h]hstruct usb_host_interface *alt}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjL ubjU)}(hhh]h)}(halternate setting to searchh]halternate setting to search}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg hKhjh ubah}(h]h ]h"]h$]h&]uh1jThjL ubeh}(h]h ]h"]h$]h&]uh1j4hjg hKhjI ubj5)}(hT``struct usb_endpoint_descriptor **bulk_in`` pointer to descriptor pointer, or NULL h](j;)}(h,``struct usb_endpoint_descriptor **bulk_in``h]j)}(hj h]h(struct usb_endpoint_descriptor **bulk_in}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj ubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhjI ubj5)}(hU``struct usb_endpoint_descriptor **bulk_out`` pointer to descriptor pointer, or NULL h](j;)}(h-``struct usb_endpoint_descriptor **bulk_out``h]j)}(hj h]h)struct usb_endpoint_descriptor **bulk_out}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj ubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhjI ubj5)}(hS``struct usb_endpoint_descriptor **int_in`` pointer to descriptor pointer, or NULL h](j;)}(h+``struct usb_endpoint_descriptor **int_in``h]j)}(hj h]h'struct usb_endpoint_descriptor **int_in}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj ubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j4hj hKhjI ubj5)}(hT``struct usb_endpoint_descriptor **int_out`` pointer to descriptor pointer, or NULL h](j;)}(h,``struct usb_endpoint_descriptor **int_out``h]j)}(hj6 h]h(struct usb_endpoint_descriptor **int_out}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4 ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj0 ubjU)}(hhh]h)}(h&pointer to descriptor pointer, or NULLh]h&pointer to descriptor pointer, or NULL}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK hKhjL ubah}(h]h ]h"]h$]h&]uh1jThj0 ubeh}(h]h ]h"]h$]h&]uh1j4hjK hKhjI ubeh}(h]h ]h"]h$]h&]uh1j/hj- ubh)}(h**Description**h]j)}(hjq h]h Description}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj- ubh)}(hSearch the alternate setting's endpoint descriptors for the last bulk-in, bulk-out, interrupt-in and interrupt-out endpoints and return them in the provided pointers (unless they are NULL).h]hSearch the alternate setting’s endpoint descriptors for the last bulk-in, bulk-out, interrupt-in and interrupt-out endpoints and return them in the provided pointers (unless they are NULL).}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj- ubh)}(hOIf a requested endpoint is not found, the corresponding pointer is set to NULL.h]hOIf a requested endpoint is not found, the corresponding pointer is set to NULL.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj- ubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj- ubh)}(hBZero if all requested descriptors were found, or -ENXIO otherwise.h]hBZero if all requested descriptors were found, or -ENXIO otherwise.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj- ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_check_bulk_endpoints (C function)c.usb_check_bulk_endpointshNtauh1jhjqhhhNhNubj )}(hhh](j)}(hTbool usb_check_bulk_endpoints (const struct usb_interface *intf, const u8 *ep_addrs)h]j)}(hSbool usb_check_bulk_endpoints(const struct usb_interface *intf, const u8 *ep_addrs)h](j@)}(hjh]hbool}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj hhhj hKubjp)}(husb_check_bulk_endpointsh]jv)}(husb_check_bulk_endpointsh]husb_check_bulk_endpoints}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ](jjeh"]h$]h&]jjuh1johj hhhj hKubj)}(h6(const struct usb_interface *intf, const u8 *ep_addrs)h](j)}(h const struct usb_interface *intfh](j)}(hj h]hconst}(hj( hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj$ ubj/)}(h h]h }(hj5 hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj$ ubj)}(hjh]hstruct}(hjC hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj$ ubj/)}(h h]h }(hjP hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj$ ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hja hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjc modnameN classnameNj8j;)}j>]jA)}j4j sbc.usb_check_bulk_endpointsasbuh1hhj$ ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj$ ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj$ ubjv)}(hintfh]hintf}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj$ ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst u8 *ep_addrsh](j)}(hj h]hconst}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(hu8h]hu8}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]j} c.usb_check_bulk_endpointsasbuh1hhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hep_addrsh]hep_addrs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hKhj hhubj)}(hhh]h)}(hjCheck whether an interface's current altsetting contains a set of bulk endpoints with the given addresses.h]hlCheck whether an interface’s current altsetting contains a set of bulk endpoints with the given addresses.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhj3hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jNj jNj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``const struct usb_interface *intf`` the interface whose current altsetting should be searched ``const u8 *ep_addrs`` 0-terminated array of the endpoint addresses (number and direction) to look for **Description** Search for endpoints with the specified addresses and check their types. **Return** ``true`` if all the endpoints are found and are bulk, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjRubj0)}(hhh](j5)}(h_``const struct usb_interface *intf`` the interface whose current altsetting should be searched h](j;)}(h$``const struct usb_interface *intf``h]j)}(hjwh]h const struct usb_interface *intf}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjqubjU)}(hhh]h)}(h9the interface whose current altsetting should be searchedh]h9the interface whose current altsetting should be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jThjqubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubj5)}(hg``const u8 *ep_addrs`` 0-terminated array of the endpoint addresses (number and direction) to look for h](j;)}(h``const u8 *ep_addrs``h]j)}(hjh]hconst u8 *ep_addrs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjubjU)}(hhh]h)}(hO0-terminated array of the endpoint addresses (number and direction) to look forh]hO0-terminated array of the endpoint addresses (number and direction) to look for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhKhjnubeh}(h]h ]h"]h$]h&]uh1j/hjRubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjRubh)}(hHSearch for endpoints with the specified addresses and check their types.h]hHSearch for endpoints with the specified addresses and check their types.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjRubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjRubh)}(hJ``true`` if all the endpoints are found and are bulk, ``false`` otherwise.h](j)}(h``true``h]htrue}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh. if all the endpoints are found and are bulk, }(hj)hhhNhNubj)}(h ``false``h]hfalse}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh otherwise.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chKhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_check_int_endpoints (C function)c.usb_check_int_endpointshNtauh1jhjqhhhNhNubj )}(hhh](j)}(hSbool usb_check_int_endpoints (const struct usb_interface *intf, const u8 *ep_addrs)h]j)}(hRbool usb_check_int_endpoints(const struct usb_interface *intf, const u8 *ep_addrs)h](j@)}(hjh]hbool}(hjxhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjthhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjthhhjhMubjp)}(husb_check_int_endpointsh]jv)}(husb_check_int_endpointsh]husb_check_int_endpoints}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjthhhjhMubj)}(h6(const struct usb_interface *intf, const u8 *ep_addrs)h](j)}(h const struct usb_interface *intfh](j)}(hj h]hconst}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_check_int_endpointsasbuh1hhjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hintfh]hintf}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst u8 *ep_addrsh](j)}(hj h]hconst}(hjAhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj=ubj/)}(h h]h }(hjNhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj=ubh)}(hhh]jv)}(hu8h]hu8}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjamodnameN classnameNj8j;)}j>]j c.usb_check_int_endpointsasbuh1hhj=ubj/)}(h h]h }(hj}hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj=ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj=ubjv)}(hep_addrsh]hep_addrs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjthhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhjhMubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjmhhubj)}(hhh]h)}(hoCheck whether an interface's current altsetting contains a set of interrupt endpoints with the given addresses.h]hqCheck whether an interface’s current altsetting contains a set of interrupt endpoints with the given addresses.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjmhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``const struct usb_interface *intf`` the interface whose current altsetting should be searched ``const u8 *ep_addrs`` 0-terminated array of the endpoint addresses (number and direction) to look for **Description** Search for endpoints with the specified addresses and check their types. **Return** ``true`` if all the endpoints are found and are interrupt, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM hjubj0)}(hhh](j5)}(h_``const struct usb_interface *intf`` the interface whose current altsetting should be searched h](j;)}(h$``const struct usb_interface *intf``h]j)}(hjh]h const struct usb_interface *intf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubjU)}(hhh]h)}(h9the interface whose current altsetting should be searchedh]h9the interface whose current altsetting should be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(hg``const u8 *ep_addrs`` 0-terminated array of the endpoint addresses (number and direction) to look for h](j;)}(h``const u8 *ep_addrs``h]j)}(hj<h]hconst u8 *ep_addrs}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM hj6ubjU)}(hhh]h)}(hO0-terminated array of the endpoint addresses (number and direction) to look forh]hO0-terminated array of the endpoint addresses (number and direction) to look for}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjRubah}(h]h ]h"]h$]h&]uh1jThj6ubeh}(h]h ]h"]h$]h&]uh1j4hjQhM hjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjxh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM hjubh)}(hHSearch for endpoints with the specified addresses and check their types.h]hHSearch for endpoints with the specified addresses and check their types.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM hjubh)}(hO``true`` if all the endpoints are found and are interrupt, ``false`` otherwise.h](j)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 if all the endpoints are found and are interrupt, }(hjhhhNhNubj)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_find_alt_setting (C function)c.usb_find_alt_settinghNtauh1jhjqhhhNhNubj )}(hhh](j)}(hstruct usb_host_interface * usb_find_alt_setting (struct usb_host_config *config, unsigned int iface_num, unsigned int alt_num)h]j)}(h}struct usb_host_interface *usb_find_alt_setting(struct usb_host_config *config, unsigned int iface_num, unsigned int alt_num)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM)ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM)ubh)}(hhh]jv)}(husb_host_interfaceh]husb_host_interface}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj%modnameN classnameNj8j;)}j>]jA)}j4usb_find_alt_settingsbc.usb_find_alt_settingasbuh1hhjhhhjhM)ubj/)}(h h]h }(hjDhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhM)ubj_)}(hjbh]h*}(hjRhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhjhM)ubjp)}(husb_find_alt_settingh]jv)}(hjAh]husb_find_alt_setting}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhM)ubj)}(hN(struct usb_host_config *config, unsigned int iface_num, unsigned int alt_num)h](j)}(hstruct usb_host_config *configh](j)}(hjh]hstruct}(hj~hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubh)}(hhh]jv)}(husb_host_configh]husb_host_config}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]j?c.usb_find_alt_settingasbuh1hhjzubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjzubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjzubjv)}(hconfigh]hconfig}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hunsigned int iface_numh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hinth]hint}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(h iface_numh]h iface_num}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hunsigned int alt_numh](j@)}(hunsignedh]hunsigned}(hj?hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj;ubj/)}(h h]h }(hjMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj;ubj@)}(hinth]hint}(hj[hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj;ubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj;ubjv)}(halt_numh]halt_num}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM)ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM)hjhhubj)}(hhh]h)}(hJGiven a configuration, find the alternate setting for the given interface.h]hJGiven a configuration, find the alternate setting for the given interface.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM)ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_host_config *config`` the configuration to search (not necessarily the current config). ``unsigned int iface_num`` interface number to search in ``unsigned int alt_num`` alternate interface setting number to search for. **Description** Search the configuration's interface cache for the given alt setting. **Return** The alternate setting, if found. ``NULL`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM#hjubj0)}(hhh](j5)}(he``struct usb_host_config *config`` the configuration to search (not necessarily the current config). h](j;)}(h"``struct usb_host_config *config``h]j)}(hjh]hstruct usb_host_config *config}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM!hjubjU)}(hhh]h)}(hAthe configuration to search (not necessarily the current config).h]hAthe configuration to search (not necessarily the current config).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhM!hjubj5)}(h9``unsigned int iface_num`` interface number to search in h](j;)}(h``unsigned int iface_num``h]j)}(hjh]hunsigned int iface_num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM"hjubjU)}(hhh]h)}(hinterface number to search inh]hinterface number to search in}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM"hj1ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hj0hM"hjubj5)}(hK``unsigned int alt_num`` alternate interface setting number to search for. h](j;)}(h``unsigned int alt_num``h]j)}(hjTh]hunsigned int alt_num}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM#hjNubjU)}(hhh]h)}(h1alternate interface setting number to search for.h]h1alternate interface setting number to search for.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihM#hjjubah}(h]h ]h"]h$]h&]uh1jThjNubeh}(h]h ]h"]h$]h&]uh1j4hjihM#hjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM%hjubh)}(hESearch the configuration's interface cache for the given alt setting.h]hGSearch the configuration’s interface cache for the given alt setting.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM%hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM'hjubh)}(h4The alternate setting, if found. ``NULL`` otherwise.h](h!The alternate setting, if found. }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM'hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_ifnum_to_if (C function)c.usb_ifnum_to_ifhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hUstruct usb_interface * usb_ifnum_to_if (const struct usb_device *dev, unsigned ifnum)h]j)}(hSstruct usb_interface *usb_ifnum_to_if(const struct usb_device *dev, unsigned ifnum)h](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM\ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj hhhjhM\ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj.modnameN classnameNj8j;)}j>]jA)}j4usb_ifnum_to_ifsbc.usb_ifnum_to_ifasbuh1hhj hhhjhM\ubj/)}(h h]h }(hjMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj hhhjhM\ubj_)}(hjbh]h*}(hj[hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj hhhjhM\ubjp)}(husb_ifnum_to_ifh]jv)}(hjJh]husb_ifnum_to_if}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhubah}(h]h ](jjeh"]h$]h&]jjuh1johj hhhjhM\ubj)}(h.(const struct usb_device *dev, unsigned ifnum)h](j)}(hconst struct usb_device *devh](j)}(hj h]hconst}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jHc.usb_ifnum_to_ifasbuh1hhjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubjv)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned ifnumh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(hifnumh]hifnum}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhM\ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM\ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM\hjhhubj)}(hhh]h)}(h6get the interface object with a given interface numberh]h6get the interface object with a given interface number}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMHhjUhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jpj jpj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``const struct usb_device *dev`` the device whose current configuration is considered ``unsigned ifnum`` the desired interface **Description** This walks the device descriptor for the currently active configuration to find the interface object with the particular interface number. Note that configuration descriptors are not required to assign interface numbers sequentially, so that it would be incorrect to assume that the first interface in that descriptor corresponds to interface zero. This routine helps device drivers avoid such mistakes. However, you should make sure that you do the right thing with any alternate settings available for this interfaces. Don't call this function unless you are bound to one of the interfaces on this device or you have locked the device! **Return** A pointer to the interface that has **ifnum** as interface number, if found. ``NULL`` otherwise.h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMLhjtubj0)}(hhh](j5)}(hV``const struct usb_device *dev`` the device whose current configuration is considered h](j;)}(h ``const struct usb_device *dev``h]j)}(hjh]hconst struct usb_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMIhjubjU)}(hhh]h)}(h4the device whose current configuration is consideredh]h4the device whose current configuration is considered}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMIhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMIhjubj5)}(h)``unsigned ifnum`` the desired interface h](j;)}(h``unsigned ifnum``h]j)}(hjh]hunsigned ifnum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMJhjubjU)}(hhh]h)}(hthe desired interfaceh]hthe desired interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMJhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMJhjubeh}(h]h ]h"]h$]h&]uh1j/hjtubh)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMLhjtubh)}(hThis walks the device descriptor for the currently active configuration to find the interface object with the particular interface number.h]hThis walks the device descriptor for the currently active configuration to find the interface object with the particular interface number.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMLhjtubh)}(hX}Note that configuration descriptors are not required to assign interface numbers sequentially, so that it would be incorrect to assume that the first interface in that descriptor corresponds to interface zero. This routine helps device drivers avoid such mistakes. However, you should make sure that you do the right thing with any alternate settings available for this interfaces.h]hX}Note that configuration descriptors are not required to assign interface numbers sequentially, so that it would be incorrect to assume that the first interface in that descriptor corresponds to interface zero. This routine helps device drivers avoid such mistakes. However, you should make sure that you do the right thing with any alternate settings available for this interfaces.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMOhjtubh)}(htDon't call this function unless you are bound to one of the interfaces on this device or you have locked the device!h]hvDon’t call this function unless you are bound to one of the interfaces on this device or you have locked the device!}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMVhjtubh)}(h **Return**h]j)}(hjRh]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMYhjtubh)}(h`A pointer to the interface that has **ifnum** as interface number, if found. ``NULL`` otherwise.h](h$A pointer to the interface that has }(hjhhhhNhNubj)}(h **ifnum**h]hifnum}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh as interface number, if found. }(hjhhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh otherwise.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMYhjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_altnum_to_altsetting (C function)c.usb_altnum_to_altsettinghNtauh1jhjqhhhNhNubj )}(hhh](j)}(hlstruct usb_host_interface * usb_altnum_to_altsetting (const struct usb_interface *intf, unsigned int altnum)h]j)}(hjstruct usb_host_interface *usb_altnum_to_altsetting(const struct usb_interface *intf, unsigned int altnum)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubh)}(hhh]jv)}(husb_host_interfaceh]husb_host_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4usb_altnum_to_altsettingsbc.usb_altnum_to_altsettingasbuh1hhjhhhjhMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhjhMubjp)}(husb_altnum_to_altsettingh]jv)}(hjh]husb_altnum_to_altsetting}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h7(const struct usb_interface *intf, unsigned int altnum)h](j)}(h const struct usb_interface *intfh](j)}(hj h]hconst}(hj5hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj1ubj/)}(h h]h }(hjBhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj1ubj)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj1ubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj1ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjkubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjpmodnameN classnameNj8j;)}j>]jc.usb_altnum_to_altsettingasbuh1hhj1ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj1ubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj1ubjv)}(hintfh]hintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubj)}(hunsigned int altnumh](j@)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubj@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjubjv)}(haltnumh]haltnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hCget the altsetting structure with a given alternate setting number.h]hCget the altsetting structure with a given alternate setting number.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMnhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j:j j:j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``const struct usb_interface *intf`` the interface containing the altsetting in question ``unsigned int altnum`` the desired alternate setting number **Description** This searches the altsetting array of the specified interface for an entry with the correct bAlternateSetting value. Note that altsettings need not be stored sequentially by number, so it would be incorrect to assume that the first altsetting entry in the array corresponds to altsetting zero. This routine helps device drivers avoid such mistakes. Don't call this function unless you are bound to the intf interface or you have locked the device! **Return** A pointer to the entry of the altsetting array of **intf** that has **altnum** as the alternate setting number. ``NULL`` if not found.h](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMrhj>ubj0)}(hhh](j5)}(hY``const struct usb_interface *intf`` the interface containing the altsetting in question h](j;)}(h$``const struct usb_interface *intf``h]j)}(hjch]h const struct usb_interface *intf}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMohj]ubjU)}(hhh]h)}(h3the interface containing the altsetting in questionh]h3the interface containing the altsetting in question}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhMohjyubah}(h]h ]h"]h$]h&]uh1jThj]ubeh}(h]h ]h"]h$]h&]uh1j4hjxhMohjZubj5)}(h=``unsigned int altnum`` the desired alternate setting number h](j;)}(h``unsigned int altnum``h]j)}(hjh]hunsigned int altnum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMphjubjU)}(hhh]h)}(h$the desired alternate setting numberh]h$the desired alternate setting number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMphjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMphjZubeh}(h]h ]h"]h$]h&]uh1j/hj>ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMrhj>ubh)}(htThis searches the altsetting array of the specified interface for an entry with the correct bAlternateSetting value.h]htThis searches the altsetting array of the specified interface for an entry with the correct bAlternateSetting value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMrhj>ubh)}(hNote that altsettings need not be stored sequentially by number, so it would be incorrect to assume that the first altsetting entry in the array corresponds to altsetting zero. This routine helps device drivers avoid such mistakes.h]hNote that altsettings need not be stored sequentially by number, so it would be incorrect to assume that the first altsetting entry in the array corresponds to altsetting zero. This routine helps device drivers avoid such mistakes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMuhj>ubh)}(hbDon't call this function unless you are bound to the intf interface or you have locked the device!h]hdDon’t call this function unless you are bound to the intf interface or you have locked the device!}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMzhj>ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM}hj>ubh)}(hA pointer to the entry of the altsetting array of **intf** that has **altnum** as the alternate setting number. ``NULL`` if not found.h](h2A pointer to the entry of the altsetting array of }(hj2hhhNhNubj)}(h**intf**h]hintf}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh that has }(hj2hhhNhNubj)}(h **altnum**h]haltnum}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh" as the alternate setting number. }(hj2hhhNhNubj)}(h``NULL``h]hNULL}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh if not found.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM}hj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_find_interface (C function)c.usb_find_interfacehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hMstruct usb_interface * usb_find_interface (struct usb_driver *drv, int minor)h]j)}(hKstruct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4usb_find_interfacesbc.usb_find_interfaceasbuh1hhjhhhjhMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhjhMubjp)}(husb_find_interfaceh]jv)}(hjh]husb_find_interface}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h#(struct usb_driver *drv, int minor)h](j)}(hstruct usb_driver *drvh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(h usb_driverh]h usb_driver}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj1modnameN classnameNj8j;)}j>]jc.usb_find_interfaceasbuh1hhj ubj/)}(h h]h }(hjMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj[hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hdrvh]hdrv}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h int minorh](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj}ubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}ubjv)}(hminorh]hminor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h0find usb_interface pointer for driver and deviceh]h0find usb_interface pointer for driver and device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_driver *drv`` the driver whose current configuration is considered ``int minor`` the minor number of the desired device **Description** This walks the bus device list and returns a pointer to the interface with the matching minor and driver. Note, this only works for devices that share the USB major number. **Return** A pointer to the interface with the matching major and **minor**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubj0)}(hhh](j5)}(hP``struct usb_driver *drv`` the driver whose current configuration is considered h](j;)}(h``struct usb_driver *drv``h]j)}(hjh]hstruct usb_driver *drv}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubjU)}(hhh]h)}(h4the driver whose current configuration is consideredh]h4the driver whose current configuration is considered}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h5``int minor`` the minor number of the desired device h](j;)}(h ``int minor``h]j)}(hjAh]h int minor}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj;ubjU)}(hhh]h)}(h&the minor number of the desired deviceh]h&the minor number of the desired device}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjWubah}(h]h ]h"]h$]h&]uh1jThj;ubeh}(h]h ]h"]h$]h&]uh1j4hjVhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj|h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubh)}(hThis walks the bus device list and returns a pointer to the interface with the matching minor and driver. Note, this only works for devices that share the USB major number.h]hThis walks the bus device list and returns a pointer to the interface with the matching minor and driver. Note, this only works for devices that share the USB major number.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubh)}(hAA pointer to the interface with the matching major and **minor**.h](h7A pointer to the interface with the matching major and }(hjhhhNhNubj)}(h **minor**h]hminor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_for_each_dev (C function)c.usb_for_each_devhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hIint usb_for_each_dev (void *data, int (*fn)(struct usb_device *, void *))h]j)}(hFint usb_for_each_dev(void *data, int (*fn)(struct usb_device*, void*))h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubjp)}(husb_for_each_devh]jv)}(husb_for_each_devh]husb_for_each_dev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h2(void *data, int (*fn)(struct usb_device*, void*))h](j)}(h void *datah](j@)}(hvoidh]hvoid}(hj7hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj3ubj/)}(h h]h }(hjEhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj3ubj_)}(hjbh]h*}(hjShhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj3ubjv)}(hdatah]hdata}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubj)}(h$int (*fn)(struct usb_device*, void*)h](j@)}(hinth]hint}(hjyhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjuubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjuubj_)}(hjh]h(}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubjv)}(hfnh]hfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjuubj_)}(hjh]h)}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubj_)}(hjh]h(}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjuubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjuubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4jsbc.usb_for_each_devasbuh1hhjuubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubj_)}(h,h]h,}(hj"hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubj/)}(h h]h }(hj0hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjuubj@)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjuubj_)}(hjbh]h*}(hjLhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubj_)}(hjh]h)}(hjYhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h*iterate over all USB devices in the systemh]h*iterate over all USB devices in the system}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1j hhhjqhNhNubj)}(hXx**Parameters** ``void *data`` data pointer that will be handed to the callback function ``int (*fn)(struct usb_device *, void *)`` callback function to be called for each USB device **Description** Iterate over all USB devices and call **fn** for each, passing it **data**. If it returns anything other than 0, we break the iteration prematurely and return that value.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubj0)}(hhh](j5)}(hI``void *data`` data pointer that will be handed to the callback function h](j;)}(h``void *data``h]j)}(hjh]h void *data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubjU)}(hhh]h)}(h9data pointer that will be handed to the callback functionh]h9data pointer that will be handed to the callback function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubj5)}(h^``int (*fn)(struct usb_device *, void *)`` callback function to be called for each USB device h](j;)}(h*``int (*fn)(struct usb_device *, void *)``h]j)}(hjh]h&int (*fn)(struct usb_device *, void *)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubjU)}(hhh]h)}(h2callback function to be called for each USB deviceh]h2callback function to be called for each USB device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubh)}(h**Description**h]j)}(hj7h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubh)}(hIterate over all USB devices and call **fn** for each, passing it **data**. If it returns anything other than 0, we break the iteration prematurely and return that value.h](h&Iterate over all USB devices and call }(hjMhhhNhNubj)}(h**fn**h]hfn}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh for each, passing it }(hjMhhhNhNubj)}(h**data**h]hdata}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh`. If it returns anything other than 0, we break the iteration prematurely and return that value.}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_alloc_dev (C function)c.usb_alloc_devhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hbstruct usb_device * usb_alloc_dev (struct usb_device *parent, struct usb_bus *bus, unsigned port1)h]j)}(h`struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmodnameN classnameNj8j;)}j>]jA)}j4 usb_alloc_devsbc.usb_alloc_devasbuh1hhjhhhjhMubj/)}(h h]h }(hjhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjhhhjhMubj_)}(hjbh]h*}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhjhMubjp)}(h usb_alloc_devh]jv)}(hjh]h usb_alloc_dev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubah}(h]h ](jjeh"]h$]h&]jjuh1johjhhhjhMubj)}(h@(struct usb_device *parent, struct usb_bus *bus, unsigned port1)h](j)}(hstruct usb_device *parenth](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj' hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj8 hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj5 ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj: modnameN classnameNj8j;)}j>]jc.usb_alloc_devasbuh1hhj ubj/)}(h h]h }(hjV hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hjd hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hparenth]hparent}(hjq hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hstruct usb_bus *bush](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubh)}(hhh]jv)}(husb_bush]husb_bus}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj modnameN classnameNj8j;)}j>]jc.usb_alloc_devasbuh1hhj ubj/)}(h h]h }(hj hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubj_)}(hjbh]h*}(hj hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj ubjv)}(hbush]hbus}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned port1h](j@)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj ubj/)}(h h]h }(hj!hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj ubjv)}(hport1h]hport1}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h)usb device constructor (usbcore-internal)h]h)usb device constructor (usbcore-internal)}(hj@!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMthj=!hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jX!j jX!j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *parent`` hub to which device is connected; null to allocate a root hub ``struct usb_bus *bus`` bus used to access the device ``unsigned port1`` one-based index of port; ignored for root hubs **Context** task context, might sleep. **Description** Only hub drivers (including virtual root hub drivers for host controllers) should ever call this. This call may not be used in a non-sleeping context. **Return** On success, a pointer to the allocated usb device. ``NULL`` on failure.h](h)}(h**Parameters**h]j)}(hjb!h]h Parameters}(hjd!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`!ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMxhj\!ubj0)}(hhh](j5)}(h\``struct usb_device *parent`` hub to which device is connected; null to allocate a root hub h](j;)}(h``struct usb_device *parent``h]j)}(hj!h]hstruct usb_device *parent}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMuhj{!ubjU)}(hhh]h)}(h=hub to which device is connected; null to allocate a root hubh]h=hub to which device is connected; null to allocate a root hub}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMuhj!ubah}(h]h ]h"]h$]h&]uh1jThj{!ubeh}(h]h ]h"]h$]h&]uh1j4hj!hMuhjx!ubj5)}(h6``struct usb_bus *bus`` bus used to access the device h](j;)}(h``struct usb_bus *bus``h]j)}(hj!h]hstruct usb_bus *bus}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMvhj!ubjU)}(hhh]h)}(hbus used to access the deviceh]hbus used to access the device}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMvhj!ubah}(h]h ]h"]h$]h&]uh1jThj!ubeh}(h]h ]h"]h$]h&]uh1j4hj!hMvhjx!ubj5)}(hB``unsigned port1`` one-based index of port; ignored for root hubs h](j;)}(h``unsigned port1``h]j)}(hj!h]hunsigned port1}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMwhj!ubjU)}(hhh]h)}(h.one-based index of port; ignored for root hubsh]h.one-based index of port; ignored for root hubs}(hj "hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMwhj "ubah}(h]h ]h"]h$]h&]uh1jThj!ubeh}(h]h ]h"]h$]h&]uh1j4hj"hMwhjx!ubeh}(h]h ]h"]h$]h&]uh1j/hj\!ubh)}(h **Context**h]j)}(hj."h]hContext}(hj0"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,"ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMyhj\!ubh)}(htask context, might sleep.h]htask context, might sleep.}(hjD"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMyhj\!ubh)}(h**Description**h]j)}(hjU"h]h Description}(hjW"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS"ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM{hj\!ubh)}(haOnly hub drivers (including virtual root hub drivers for host controllers) should ever call this.h]haOnly hub drivers (including virtual root hub drivers for host controllers) should ever call this.}(hjk"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMzhj\!ubh)}(h4This call may not be used in a non-sleeping context.h]h4This call may not be used in a non-sleeping context.}(hjz"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM}hj\!ubh)}(h **Return**h]j)}(hj"h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj\!ubh)}(hGOn success, a pointer to the allocated usb device. ``NULL`` on failure.h](h3On success, a pointer to the allocated usb device. }(hj"hhhNhNubj)}(h``NULL``h]hNULL}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh on failure.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj\!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_get_dev (C function) c.usb_get_devhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h8struct usb_device * usb_get_dev (struct usb_device *dev)h]j)}(h6struct usb_device *usb_get_dev(struct usb_device *dev)h](j)}(hjh]hstruct}(hj"hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj"hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hj"hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj"hhhj"hMubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj#modnameN classnameNj8j;)}j>]jA)}j4 usb_get_devsb c.usb_get_devasbuh1hhj"hhhj"hMubj/)}(h h]h }(hj"#hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj"hhhj"hMubj_)}(hjbh]h*}(hj0#hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj"hhhj"hMubjp)}(h usb_get_devh]jv)}(hj#h]h usb_get_dev}(hjA#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=#ubah}(h]h ](jjeh"]h$]h&]jjuh1johj"hhhj"hMubj)}(h(struct usb_device *dev)h]j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj\#hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjX#ubj/)}(h h]h }(hji#hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjX#ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjz#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjw#ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj|#modnameN classnameNj8j;)}j>]j# c.usb_get_devasbuh1hhjX#ubj/)}(h h]h }(hj#hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjX#ubj_)}(hjbh]h*}(hj#hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjX#ubjv)}(hdevh]hdev}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjX#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjT#ubah}(h]h ]h"]h$]h&]jjuh1jhj"hhhj"hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhj"hMubah}(h]j"ah ](jjeh"]h$]h&]jj)jhuh1jhj"hMhj"hhubj)}(hhh]h)}(h:increments the reference count of the usb device structureh]h:increments the reference count of the usb device structure}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#hhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj"hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j#j j#j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` the device being referenced **Description** Each live reference to a device should be refcounted. Drivers for USB interfaces should normally record such references in their probe() methods, when they bind to an interface, and release them by calling usb_put_dev(), in their disconnect() methods. However, if a driver does not access the usb_device structure after its disconnect() method returns then refcounting is not necessary, because the USB core guarantees that a usb_device will not be deallocated until after all of its interface drivers have been unbound. **Return** A pointer to the device with the incremented reference counter.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#ubj0)}(hhh]j5)}(h7``struct usb_device *dev`` the device being referenced h](j;)}(h``struct usb_device *dev``h]j)}(hj$h]hstruct usb_device *dev}(hj $hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj$ubjU)}(hhh]h)}(hthe device being referencedh]hthe device being referenced}(hj7$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3$hMhj4$ubah}(h]h ]h"]h$]h&]uh1jThj$ubeh}(h]h ]h"]h$]h&]uh1j4hj3$hMhj$ubah}(h]h ]h"]h$]h&]uh1j/hj#ubh)}(h**Description**h]j)}(hjY$h]h Description}(hj[$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW$ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#ubh)}(h5Each live reference to a device should be refcounted.h]h5Each live reference to a device should be refcounted.}(hjo$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#ubh)}(hXDrivers for USB interfaces should normally record such references in their probe() methods, when they bind to an interface, and release them by calling usb_put_dev(), in their disconnect() methods. However, if a driver does not access the usb_device structure after its disconnect() method returns then refcounting is not necessary, because the USB core guarantees that a usb_device will not be deallocated until after all of its interface drivers have been unbound.h]hXDrivers for USB interfaces should normally record such references in their probe() methods, when they bind to an interface, and release them by calling usb_put_dev(), in their disconnect() methods. However, if a driver does not access the usb_device structure after its disconnect() method returns then refcounting is not necessary, because the USB core guarantees that a usb_device will not be deallocated until after all of its interface drivers have been unbound.}(hj~$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#ubh)}(h **Return**h]j)}(hj$h]hReturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#ubh)}(h?A pointer to the device with the incremented reference counter.h]h?A pointer to the device with the incremented reference counter.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_put_dev (C function) c.usb_put_devhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h)void usb_put_dev (struct usb_device *dev)h]j)}(h(void usb_put_dev(struct usb_device *dev)h](j@)}(hvoidh]hvoid}(hj$hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj$hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM ubj/)}(h h]h }(hj$hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj$hhhj$hM ubjp)}(h usb_put_devh]jv)}(h usb_put_devh]h usb_put_dev}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1johj$hhhj$hM ubj)}(h(struct usb_device *dev)h]j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj%hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj %ubj/)}(h h]h }(hj%hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj %ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj/%hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,%ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj1%modnameN classnameNj8j;)}j>]jA)}j4j$sb c.usb_put_devasbuh1hhj %ubj/)}(h h]h }(hjO%hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj %ubj_)}(hjbh]h*}(hj]%hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj %ubjv)}(hdevh]hdev}(hjj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj %ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj %ubah}(h]h ]h"]h$]h&]jjuh1jhj$hhhj$hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj$hhhj$hM ubah}(h]j$ah ](jjeh"]h$]h&]jj)jhuh1jhj$hM hj$hhubj)}(hhh]h)}(h)release a use of the usb device structureh]h)release a use of the usb device structure}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj%hhubah}(h]h ]h"]h$]h&]uh1jhj$hhhj$hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j%j j%j j juh1j hhhjqhNhNubj)}(h**Parameters** ``struct usb_device *dev`` device that's been disconnected **Description** Must be called when a user of a device is finished with it. When the last user of the device calls this function, the memory of the device is freed.h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj%ubj0)}(hhh]j5)}(h;``struct usb_device *dev`` device that's been disconnected h](j;)}(h``struct usb_device *dev``h]j)}(hj%h]hstruct usb_device *dev}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj%ubjU)}(hhh]h)}(hdevice that's been disconnectedh]h!device that’s been disconnected}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jThj%ubeh}(h]h ]h"]h$]h&]uh1j4hj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j/hj%ubh)}(h**Description**h]j)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj%ubh)}(hMust be called when a user of a device is finished with it. When the last user of the device calls this function, the memory of the device is freed.h]hMust be called when a user of a device is finished with it. When the last user of the device calls this function, the memory of the device is freed.}(hj&&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_get_intf (C function)c.usb_get_intfhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h@struct usb_interface * usb_get_intf (struct usb_interface *intf)h]j)}(h>struct usb_interface *usb_get_intf(struct usb_interface *intf)h](j)}(hjh]hstruct}(hjU&hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjQ&hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM ubj/)}(h h]h }(hjc&hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQ&hhhjb&hM ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjt&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjq&ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjv&modnameN classnameNj8j;)}j>]jA)}j4 usb_get_intfsbc.usb_get_intfasbuh1hhjQ&hhhjb&hM ubj/)}(h h]h }(hj&hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQ&hhhjb&hM ubj_)}(hjbh]h*}(hj&hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjQ&hhhjb&hM ubjp)}(h usb_get_intfh]jv)}(hj&h]h usb_get_intf}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1johjQ&hhhjb&hM ubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hj&hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj&ubj/)}(h h]h }(hj&hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj&ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj&modnameN classnameNj8j;)}j>]j&c.usb_get_intfasbuh1hhj&ubj/)}(h h]h }(hj 'hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj&ubj_)}(hjbh]h*}(hj'hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj&ubjv)}(hintfh]hintf}(hj&'hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&ubah}(h]h ]h"]h$]h&]jjuh1jhjQ&hhhjb&hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjM&hhhjb&hM ubah}(h]jH&ah ](jjeh"]h$]h&]jj)jhuh1jhjb&hM hjJ&hhubj)}(hhh]h)}(h=increments the reference count of the usb interface structureh]h=increments the reference count of the usb interface structure}(hjP'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjM'hhubah}(h]h ]h"]h$]h&]uh1jhjJ&hhhjb&hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jh'j jh'j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_interface *intf`` the interface being referenced **Description** Each live reference to a interface must be refcounted. Drivers for USB interfaces should normally record such references in their probe() methods, when they bind to an interface, and release them by calling usb_put_intf(), in their disconnect() methods. However, if a driver does not access the usb_interface structure after its disconnect() method returns then refcounting is not necessary, because the USB core guarantees that a usb_interface will not be deallocated until after its driver has been unbound. **Return** A pointer to the interface with the incremented reference counter.h](h)}(h**Parameters**h]j)}(hjr'h]h Parameters}(hjt'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp'ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjl'ubj0)}(hhh]j5)}(h>``struct usb_interface *intf`` the interface being referenced h](j;)}(h``struct usb_interface *intf``h]j)}(hj'h]hstruct usb_interface *intf}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj'ubjU)}(hhh]h)}(hthe interface being referencedh]hthe interface being referenced}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMhj'ubah}(h]h ]h"]h$]h&]uh1jThj'ubeh}(h]h ]h"]h$]h&]uh1j4hj'hMhj'ubah}(h]h ]h"]h$]h&]uh1j/hjl'ubh)}(h**Description**h]j)}(hj'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjl'ubh)}(h6Each live reference to a interface must be refcounted.h]h6Each live reference to a interface must be refcounted.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjl'ubh)}(hXDrivers for USB interfaces should normally record such references in their probe() methods, when they bind to an interface, and release them by calling usb_put_intf(), in their disconnect() methods. However, if a driver does not access the usb_interface structure after its disconnect() method returns then refcounting is not necessary, because the USB core guarantees that a usb_interface will not be deallocated until after its driver has been unbound.h]hXDrivers for USB interfaces should normally record such references in their probe() methods, when they bind to an interface, and release them by calling usb_put_intf(), in their disconnect() methods. However, if a driver does not access the usb_interface structure after its disconnect() method returns then refcounting is not necessary, because the USB core guarantees that a usb_interface will not be deallocated until after its driver has been unbound.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjl'ubh)}(h **Return**h]j)}(hj(h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjl'ubh)}(hBA pointer to the interface with the incremented reference counter.h]hBA pointer to the interface with the incremented reference counter.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjl'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_put_intf (C function)c.usb_put_intfhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h.void usb_put_intf (struct usb_interface *intf)h]j)}(h-void usb_put_intf(struct usb_interface *intf)h](j@)}(hvoidh]hvoid}(hjG(hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjC(hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM0ubj/)}(h h]h }(hjV(hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjC(hhhjU(hM0ubjp)}(h usb_put_intfh]jv)}(h usb_put_intfh]h usb_put_intf}(hjh(hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjd(ubah}(h]h ](jjeh"]h$]h&]jjuh1johjC(hhhjU(hM0ubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hj(hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj(ubj/)}(h h]h }(hj(hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj(ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj(modnameN classnameNj8j;)}j>]jA)}j4jj(sbc.usb_put_intfasbuh1hhj(ubj/)}(h h]h }(hj(hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj(ubj_)}(hjbh]h*}(hj(hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj(ubjv)}(hintfh]hintf}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|(ubah}(h]h ]h"]h$]h&]jjuh1jhjC(hhhjU(hM0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj?(hhhjU(hM0ubah}(h]j:(ah ](jjeh"]h$]h&]jj)jhuh1jhjU(hM0hj<(hhubj)}(hhh]h)}(h,release a use of the usb interface structureh]h,release a use of the usb interface structure}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM)hj)hhubah}(h]h ]h"]h$]h&]uh1jhj<(hhhjU(hM0ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j)j j)j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_interface *intf`` interface that's been decremented **Description** Must be called when a user of an interface is finished with it. When the last user of the interface calls this function, the memory of the interface is freed.h](h)}(h**Parameters**h]j)}(hj))h]h Parameters}(hj+)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj')ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM-hj#)ubj0)}(hhh]j5)}(hA``struct usb_interface *intf`` interface that's been decremented h](j;)}(h``struct usb_interface *intf``h]j)}(hjH)h]hstruct usb_interface *intf}(hjJ)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF)ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM*hjB)ubjU)}(hhh]h)}(h!interface that's been decrementedh]h#interface that’s been decremented}(hja)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj])hM*hj^)ubah}(h]h ]h"]h$]h&]uh1jThjB)ubeh}(h]h ]h"]h$]h&]uh1j4hj])hM*hj?)ubah}(h]h ]h"]h$]h&]uh1j/hj#)ubh)}(h**Description**h]j)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM,hj#)ubh)}(hMust be called when a user of an interface is finished with it. When the last user of the interface calls this function, the memory of the interface is freed.h]hMust be called when a user of an interface is finished with it. When the last user of the interface calls this function, the memory of the interface is freed.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM,hj#)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_intf_get_dma_device (C function)c.usb_intf_get_dma_devicehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hDstruct device * usb_intf_get_dma_device (struct usb_interface *intf)h]j)}(hBstruct device *usb_intf_get_dma_device(struct usb_interface *intf)h](j)}(hjh]hstruct}(hj)hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj)hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMEubj/)}(h h]h }(hj)hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj)hhhj)hMEubh)}(hhh]jv)}(hdeviceh]hdevice}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj)modnameN classnameNj8j;)}j>]jA)}j4usb_intf_get_dma_devicesbc.usb_intf_get_dma_deviceasbuh1hhj)hhhj)hMEubj/)}(h h]h }(hj*hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj)hhhj)hMEubj_)}(hjbh]h*}(hj*hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj)hhhj)hMEubjp)}(husb_intf_get_dma_deviceh]jv)}(hj*h]husb_intf_get_dma_device}(hj'*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj#*ubah}(h]h ](jjeh"]h$]h&]jjuh1johj)hhhj)hMEubj)}(h(struct usb_interface *intf)h]j)}(hstruct usb_interface *intfh](j)}(hjh]hstruct}(hjB*hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj>*ubj/)}(h h]h }(hjO*hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj>*ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj`*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]*ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjb*modnameN classnameNj8j;)}j>]j*c.usb_intf_get_dma_deviceasbuh1hhj>*ubj/)}(h h]h }(hj~*hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj>*ubj_)}(hjbh]h*}(hj*hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj>*ubjv)}(hintfh]hintf}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj>*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:*ubah}(h]h ]h"]h$]h&]jjuh1jhj)hhhj)hMEubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj)hhhj)hMEubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhj)hMEhj)hhubj)}(hhh]h)}(h7acquire a reference on the usb interface's DMA endpointh]h9acquire a reference on the usb interface’s DMA endpoint}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM8hj*hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj)hMEubeh}(h]h ](jfunctioneh"]h$]h&]j jj j*j j*j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_interface *intf`` the usb interface **Description** While a USB device cannot perform DMA operations by itself, many USB controllers can. A call to usb_intf_get_dma_device() returns the DMA endpoint for the given USB interface, if any. The returned device structure must be released with put_device(). See also usb_get_dma_device(). **Return** A reference to the usb interface's DMA endpoint; or NULL if none exists.h](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM<hj*ubj0)}(hhh]j5)}(h1``struct usb_interface *intf`` the usb interface h](j;)}(h``struct usb_interface *intf``h]j)}(hj+h]hstruct usb_interface *intf}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM9hj*ubjU)}(hhh]h)}(hthe usb interfaceh]hthe usb interface}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hM9hj+ubah}(h]h ]h"]h$]h&]uh1jThj*ubeh}(h]h ]h"]h$]h&]uh1j4hj+hM9hj*ubah}(h]h ]h"]h$]h&]uh1j/hj*ubh)}(h**Description**h]j)}(hj?+h]h Description}(hjA+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=+ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM;hj*ubh)}(hWhile a USB device cannot perform DMA operations by itself, many USB controllers can. A call to usb_intf_get_dma_device() returns the DMA endpoint for the given USB interface, if any. The returned device structure must be released with put_device().h]hWhile a USB device cannot perform DMA operations by itself, many USB controllers can. A call to usb_intf_get_dma_device() returns the DMA endpoint for the given USB interface, if any. The returned device structure must be released with put_device().}(hjU+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM;hj*ubh)}(hSee also usb_get_dma_device().h]hSee also usb_get_dma_device().}(hjd+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chM@hj*ubh)}(h **Return**h]j)}(hju+h]hReturn}(hjw+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs+ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMBhj*ubj0)}(hhh]j5)}(hHA reference to the usb interface's DMA endpoint; or NULL if none exists.h](j;)}(h@A reference to the usb interface's DMA endpoint; or NULL if noneh]hBA reference to the usb interface’s DMA endpoint; or NULL if none}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMBhj+ubjU)}(hhh]h)}(hexists.h]hexists.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMChj+ubah}(h]h ]h"]h$]h&]uh1jThj+ubeh}(h]h ]h"]h$]h&]uh1j4hj+hMBhj+ubah}(h]h ]h"]h$]h&]uh1j/hj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&usb_lock_device_for_reset (C function)c.usb_lock_device_for_resethNtauh1jhjqhhhNhNubj )}(hhh](j)}(hZint usb_lock_device_for_reset (struct usb_device *udev, const struct usb_interface *iface)h]j)}(hYint usb_lock_device_for_reset(struct usb_device *udev, const struct usb_interface *iface)h](j@)}(hinth]hint}(hj+hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj+hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMuubj/)}(h h]h }(hj+hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj+hhhj+hMuubjp)}(husb_lock_device_for_reseth]jv)}(husb_lock_device_for_reseth]husb_lock_device_for_reset}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1johj+hhhj+hMuubj)}(h<(struct usb_device *udev, const struct usb_interface *iface)h](j)}(hstruct usb_device *udevh](j)}(hjh]hstruct}(hj",hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj,ubj/)}(h h]h }(hj/,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj@,hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=,ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjB,modnameN classnameNj8j;)}j>]jA)}j4j,sbc.usb_lock_device_for_resetasbuh1hhj,ubj/)}(h h]h }(hj`,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,ubj_)}(hjbh]h*}(hjn,hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj,ubjv)}(hudevh]hudev}(hj{,hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj,ubj)}(h!const struct usb_interface *ifaceh](j)}(hj h]hconst}(hj,hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj,ubj/)}(h h]h }(hj,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,ubj)}(hjh]hstruct}(hj,hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj,ubj/)}(h h]h }(hj,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj,modnameN classnameNj8j;)}j>]j\,c.usb_lock_device_for_resetasbuh1hhj,ubj/)}(h h]h }(hj,hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj,ubj_)}(hjbh]h*}(hj,hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj,ubjv)}(hifaceh]hiface}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj,ubeh}(h]h ]h"]h$]h&]jjuh1jhj+hhhj+hMuubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+hhhj+hMuubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1jhj+hMuhj+hhubj)}(hhh]h)}(h6cautiously acquire the lock for a usb device structureh]h6cautiously acquire the lock for a usb device structure}(hj0-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhhj--hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj+hMuubeh}(h]h ](jfunctioneh"]h$]h&]j jj jH-j jH-j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *udev`` device that's being locked ``const struct usb_interface *iface`` interface bound to the driver making the request (optional) **Description** Attempts to acquire the device lock, but fails if the device is NOTATTACHED or SUSPENDED, or if iface is specified and the interface is neither BINDING nor BOUND. Rather than sleeping to wait for the lock, the routine polls repeatedly. This is to prevent deadlock with disconnect; in some drivers (such as usb-storage) the disconnect() or suspend() method will block waiting for a device reset to complete. **Return** A negative error code for failure, otherwise 0.h](h)}(h**Parameters**h]j)}(hjR-h]h Parameters}(hjT-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMlhjL-ubj0)}(hhh](j5)}(h7``struct usb_device *udev`` device that's being locked h](j;)}(h``struct usb_device *udev``h]j)}(hjq-h]hstruct usb_device *udev}(hjs-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo-ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMihjk-ubjU)}(hhh]h)}(hdevice that's being lockedh]hdevice that’s being locked}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMihj-ubah}(h]h ]h"]h$]h&]uh1jThjk-ubeh}(h]h ]h"]h$]h&]uh1j4hj-hMihjh-ubj5)}(hb``const struct usb_interface *iface`` interface bound to the driver making the request (optional) h](j;)}(h%``const struct usb_interface *iface``h]j)}(hj-h]h!const struct usb_interface *iface}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMjhj-ubjU)}(hhh]h)}(h;interface bound to the driver making the request (optional)h]h;interface bound to the driver making the request (optional)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMjhj-ubah}(h]h ]h"]h$]h&]uh1jThj-ubeh}(h]h ]h"]h$]h&]uh1j4hj-hMjhjh-ubeh}(h]h ]h"]h$]h&]uh1j/hjL-ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMlhjL-ubh)}(hXAttempts to acquire the device lock, but fails if the device is NOTATTACHED or SUSPENDED, or if iface is specified and the interface is neither BINDING nor BOUND. Rather than sleeping to wait for the lock, the routine polls repeatedly. This is to prevent deadlock with disconnect; in some drivers (such as usb-storage) the disconnect() or suspend() method will block waiting for a device reset to complete.h]hXAttempts to acquire the device lock, but fails if the device is NOTATTACHED or SUSPENDED, or if iface is specified and the interface is neither BINDING nor BOUND. Rather than sleeping to wait for the lock, the routine polls repeatedly. This is to prevent deadlock with disconnect; in some drivers (such as usb-storage) the disconnect() or suspend() method will block waiting for a device reset to complete.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMlhjL-ubh)}(h **Return**h]j)}(hj .h]hReturn}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj .ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMshjL-ubh)}(h/A negative error code for failure, otherwise 0.h]h/A negative error code for failure, otherwise 0.}(hj".hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMshjL-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)usb_get_current_frame_number (C function)c.usb_get_current_frame_numberhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h9int usb_get_current_frame_number (struct usb_device *dev)h]j)}(h8int usb_get_current_frame_number(struct usb_device *dev)h](j@)}(hinth]hint}(hjQ.hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjM.hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hj`.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjM.hhhj_.hMubjp)}(husb_get_current_frame_numberh]jv)}(husb_get_current_frame_numberh]husb_get_current_frame_number}(hjr.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjn.ubah}(h]h ](jjeh"]h$]h&]jjuh1johjM.hhhj_.hMubj)}(h(struct usb_device *dev)h]j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj.hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj.ubj/)}(h h]h }(hj.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj.ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj.modnameN classnameNj8j;)}j>]jA)}j4jt.sbc.usb_get_current_frame_numberasbuh1hhj.ubj/)}(h h]h }(hj.hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj.ubj_)}(hjbh]h*}(hj.hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj.ubjv)}(hdevh]hdev}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.ubah}(h]h ]h"]h$]h&]jjuh1jhjM.hhhj_.hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjI.hhhj_.hMubah}(h]jD.ah ](jjeh"]h$]h&]jj)jhuh1jhj_.hMhjF.hhubj)}(hhh]h)}(hreturn current bus frame numberh]hreturn current bus frame number}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj/hhubah}(h]h ]h"]h$]h&]uh1jhjF.hhhj_.hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j)/j j)/j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` the device whose bus is being queried **Return** The current frame number for the USB host controller used with the given USB device. This can be used when scheduling isochronous requests. **Note** Different kinds of host controller have different "scheduling horizons". While one type might support scheduling only 32 frames into the future, others could support scheduling up to 1024 frames into the future.h](h)}(h**Parameters**h]j)}(hj3/h]h Parameters}(hj5/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1/ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj-/ubj0)}(hhh]j5)}(hA``struct usb_device *dev`` the device whose bus is being queried h](j;)}(h``struct usb_device *dev``h]j)}(hjR/h]hstruct usb_device *dev}(hjT/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP/ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjL/ubjU)}(hhh]h)}(h%the device whose bus is being queriedh]h%the device whose bus is being queried}(hjk/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg/hMhjh/ubah}(h]h ]h"]h$]h&]uh1jThjL/ubeh}(h]h ]h"]h$]h&]uh1j4hjg/hMhjI/ubah}(h]h ]h"]h$]h&]uh1j/hj-/ubh)}(h **Return**h]j)}(hj/h]hReturn}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj-/ubh)}(hThe current frame number for the USB host controller used with the given USB device. This can be used when scheduling isochronous requests.h]hThe current frame number for the USB host controller used with the given USB device. This can be used when scheduling isochronous requests.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj-/ubh)}(h**Note**h]j)}(hj/h]hNote}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj-/ubh)}(hDifferent kinds of host controller have different "scheduling horizons". While one type might support scheduling only 32 frames into the future, others could support scheduling up to 1024 frames into the future.h]hDifferent kinds of host controller have different “scheduling horizons”. While one type might support scheduling only 32 frames into the future, others could support scheduling up to 1024 frames into the future.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj-/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_alloc_coherent (C function)c.usb_alloc_coherenthNtauh1jhjqhhhNhNubj )}(hhh](j)}(havoid * usb_alloc_coherent (struct usb_device *dev, size_t size, gfp_t mem_flags, dma_addr_t *dma)h]j)}(h_void *usb_alloc_coherent(struct usb_device *dev, size_t size, gfp_t mem_flags, dma_addr_t *dma)h](j@)}(hvoidh]hvoid}(hj/hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj/hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hj0hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj/hhhj0hMubj_)}(hjbh]h*}(hj0hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj/hhhj0hMubjp)}(husb_alloc_coherenth]jv)}(husb_alloc_coherenth]husb_alloc_coherent}(hj'0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj#0ubah}(h]h ](jjeh"]h$]h&]jjuh1johj/hhhj0hMubj)}(hG(struct usb_device *dev, size_t size, gfp_t mem_flags, dma_addr_t *dma)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hjC0hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj?0ubj/)}(h h]h }(hjP0hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?0ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hja0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^0ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjc0modnameN classnameNj8j;)}j>]jA)}j4j)0sbc.usb_alloc_coherentasbuh1hhj?0ubj/)}(h h]h }(hj0hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?0ubj_)}(hjbh]h*}(hj0hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj?0ubjv)}(hdevh]hdev}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj?0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;0ubj)}(h size_t sizeh](h)}(hhh]jv)}(hsize_th]hsize_t}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj0modnameN classnameNj8j;)}j>]j}0c.usb_alloc_coherentasbuh1hhj0ubj/)}(h h]h }(hj0hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj0ubjv)}(hsizeh]hsize}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;0ubj)}(hgfp_t mem_flagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj1modnameN classnameNj8j;)}j>]j}0c.usb_alloc_coherentasbuh1hhj0ubj/)}(h h]h }(hj1hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj0ubjv)}(h mem_flagsh]h mem_flags}(hj,1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;0ubj)}(hdma_addr_t *dmah](h)}(hhh]jv)}(h dma_addr_th]h dma_addr_t}(hjH1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjE1ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjJ1modnameN classnameNj8j;)}j>]j}0c.usb_alloc_coherentasbuh1hhjA1ubj/)}(h h]h }(hjf1hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjA1ubj_)}(hjbh]h*}(hjt1hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjA1ubjv)}(hdmah]hdma}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjA1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;0ubeh}(h]h ]h"]h$]h&]jjuh1jhj/hhhj0hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj/hhhj0hMubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jhj0hMhj/hhubj)}(hhh]h)}(h5allocate dma-consistent buffer for URB_NO_xxx_DMA_MAPh]h5allocate dma-consistent buffer for URB_NO_xxx_DMA_MAP}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj0hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j1j j1j j juh1j hhhjqhNhNubj)}(hX2**Parameters** ``struct usb_device *dev`` device the buffer will be used with ``size_t size`` requested buffer size ``gfp_t mem_flags`` affect whether allocation may block ``dma_addr_t *dma`` used to return DMA address of buffer **Return** Either null (indicating no buffer could be allocated), or the cpu-space pointer to a buffer that may be used to perform DMA to the specified device. Such cpu-space buffers are returned along with the DMA address (through the pointer provided). **Note** These buffers are used with URB_NO_xxx_DMA_MAP set in urb->transfer_flags to avoid behaviors like using "DMA bounce buffers", or thrashing IOMMU hardware during URB completion/resubmit. The implementation varies between platforms, depending on details of how DMA will work to this device. Using these buffers also eliminates cacheline sharing problems on architectures where CPU caches are not DMA-coherent. On systems without bus-snooping caches, these buffers are uncached. **Description** When the buffer is no longer used, free it with usb_free_coherent().h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubj0)}(hhh](j5)}(h?``struct usb_device *dev`` device the buffer will be used with h](j;)}(h``struct usb_device *dev``h]j)}(hj1h]hstruct usb_device *dev}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubjU)}(hhh]h)}(h#device the buffer will be used withh]h#device the buffer will be used with}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jThj1ubeh}(h]h ]h"]h$]h&]uh1j4hj2hMhj1ubj5)}(h&``size_t size`` requested buffer size h](j;)}(h``size_t size``h]j)}(hj%2h]h size_t size}(hj'2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#2ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj2ubjU)}(hhh]h)}(hrequested buffer sizeh]hrequested buffer size}(hj>2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:2hMhj;2ubah}(h]h ]h"]h$]h&]uh1jThj2ubeh}(h]h ]h"]h$]h&]uh1j4hj:2hMhj1ubj5)}(h8``gfp_t mem_flags`` affect whether allocation may block h](j;)}(h``gfp_t mem_flags``h]j)}(hj^2h]hgfp_t mem_flags}(hj`2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\2ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjX2ubjU)}(hhh]h)}(h#affect whether allocation may blockh]h#affect whether allocation may block}(hjw2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs2hMhjt2ubah}(h]h ]h"]h$]h&]uh1jThjX2ubeh}(h]h ]h"]h$]h&]uh1j4hjs2hMhj1ubj5)}(h9``dma_addr_t *dma`` used to return DMA address of buffer h](j;)}(h``dma_addr_t *dma``h]j)}(hj2h]hdma_addr_t *dma}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj2ubjU)}(hhh]h)}(h$used to return DMA address of bufferh]h$used to return DMA address of buffer}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jThj2ubeh}(h]h ]h"]h$]h&]uh1j4hj2hMhj1ubeh}(h]h ]h"]h$]h&]uh1j/hj1ubh)}(h **Return**h]j)}(hj2h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubh)}(hEither null (indicating no buffer could be allocated), or the cpu-space pointer to a buffer that may be used to perform DMA to the specified device. Such cpu-space buffers are returned along with the DMA address (through the pointer provided).h]hEither null (indicating no buffer could be allocated), or the cpu-space pointer to a buffer that may be used to perform DMA to the specified device. Such cpu-space buffers are returned along with the DMA address (through the pointer provided).}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubh)}(h**Note**h]j)}(hj2h]hNote}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubh)}(hXThese buffers are used with URB_NO_xxx_DMA_MAP set in urb->transfer_flags to avoid behaviors like using "DMA bounce buffers", or thrashing IOMMU hardware during URB completion/resubmit. The implementation varies between platforms, depending on details of how DMA will work to this device. Using these buffers also eliminates cacheline sharing problems on architectures where CPU caches are not DMA-coherent. On systems without bus-snooping caches, these buffers are uncached.h]hXThese buffers are used with URB_NO_xxx_DMA_MAP set in urb->transfer_flags to avoid behaviors like using “DMA bounce buffers”, or thrashing IOMMU hardware during URB completion/resubmit. The implementation varies between platforms, depending on details of how DMA will work to this device. Using these buffers also eliminates cacheline sharing problems on architectures where CPU caches are not DMA-coherent. On systems without bus-snooping caches, these buffers are uncached.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubh)}(h**Description**h]j)}(hj 3h]h Description}(hj"3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubh)}(hDWhen the buffer is no longer used, free it with usb_free_coherent().h]hDWhen the buffer is no longer used, free it with usb_free_coherent().}(hj63hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_free_coherent (C function)c.usb_free_coherenthNtauh1jhjqhhhNhNubj )}(hhh](j)}(hXvoid usb_free_coherent (struct usb_device *dev, size_t size, void *addr, dma_addr_t dma)h]j)}(hWvoid usb_free_coherent(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma)h](j@)}(hvoidh]hvoid}(hje3hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hja3hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMubj/)}(h h]h }(hjt3hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hja3hhhjs3hMubjp)}(husb_free_coherenth]jv)}(husb_free_coherenth]husb_free_coherent}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3ubah}(h]h ](jjeh"]h$]h&]jjuh1johja3hhhjs3hMubj)}(hA(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma)h](j)}(hstruct usb_device *devh](j)}(hjh]hstruct}(hj3hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj3ubj/)}(h h]h }(hj3hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj3ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj3modnameN classnameNj8j;)}j>]jA)}j4j3sbc.usb_free_coherentasbuh1hhj3ubj/)}(h h]h }(hj3hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj3ubj_)}(hjbh]h*}(hj3hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj3ubjv)}(hdevh]hdev}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(h size_t sizeh](h)}(hhh]jv)}(hsize_th]hsize_t}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj4modnameN classnameNj8j;)}j>]j3c.usb_free_coherentasbuh1hhj4ubj/)}(h h]h }(hj54hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj4ubjv)}(hsizeh]hsize}(hjC4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(h void *addrh](j@)}(hvoidh]hvoid}(hj\4hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjX4ubj/)}(h h]h }(hjj4hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjX4ubj_)}(hjbh]h*}(hjx4hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjX4ubjv)}(haddrh]haddr}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjX4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(hdma_addr_t dmah](h)}(hhh]jv)}(h dma_addr_th]h dma_addr_t}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj4modnameN classnameNj8j;)}j>]j3c.usb_free_coherentasbuh1hhj4ubj/)}(h h]h }(hj4hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj4ubjv)}(hdmah]hdma}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubeh}(h]h ]h"]h$]h&]jjuh1jhja3hhhjs3hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]3hhhjs3hMubah}(h]jX3ah ](jjeh"]h$]h&]jj)jhuh1jhjs3hMhjZ3hhubj)}(hhh]h)}(h/free memory allocated with usb_alloc_coherent()h]h/free memory allocated with usb_alloc_coherent()}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj4hhubah}(h]h ]h"]h$]h&]uh1jhjZ3hhhjs3hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j5j j5j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *dev`` device the buffer was used with ``size_t size`` requested buffer size ``void *addr`` CPU address of buffer ``dma_addr_t dma`` DMA address of buffer **Description** This reclaims an I/O buffer, letting it be reused. The memory must have been allocated using usb_alloc_coherent(), and the parameters must match those provided in that allocation request.h](h)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj5ubj0)}(hhh](j5)}(h;``struct usb_device *dev`` device the buffer was used with h](j;)}(h``struct usb_device *dev``h]j)}(hj85h]hstruct usb_device *dev}(hj:5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj65ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj25ubjU)}(hhh]h)}(hdevice the buffer was used withh]hdevice the buffer was used with}(hjQ5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM5hMhjN5ubah}(h]h ]h"]h$]h&]uh1jThj25ubeh}(h]h ]h"]h$]h&]uh1j4hjM5hMhj/5ubj5)}(h&``size_t size`` requested buffer size h](j;)}(h``size_t size``h]j)}(hjq5h]h size_t size}(hjs5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo5ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhjk5ubjU)}(hhh]h)}(hrequested buffer sizeh]hrequested buffer size}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jThjk5ubeh}(h]h ]h"]h$]h&]uh1j4hj5hMhj/5ubj5)}(h%``void *addr`` CPU address of buffer h](j;)}(h``void *addr``h]j)}(hj5h]h void *addr}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj5ubjU)}(hhh]h)}(hCPU address of bufferh]hCPU address of buffer}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jThj5ubeh}(h]h ]h"]h$]h&]uh1j4hj5hMhj/5ubj5)}(h)``dma_addr_t dma`` DMA address of buffer h](j;)}(h``dma_addr_t dma``h]j)}(hj5h]hdma_addr_t dma}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj5ubjU)}(hhh]h)}(hDMA address of bufferh]hDMA address of buffer}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jThj5ubeh}(h]h ]h"]h$]h&]uh1j4hj5hMhj/5ubeh}(h]h ]h"]h$]h&]uh1j/hj5ubh)}(h**Description**h]j)}(hj6h]h Description}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj5ubh)}(hThis reclaims an I/O buffer, letting it be reused. The memory must have been allocated using usb_alloc_coherent(), and the parameters must match those provided in that allocation request.h]hThis reclaims an I/O buffer, letting it be reused. The memory must have been allocated using usb_alloc_coherent(), and the parameters must match those provided in that allocation request.}(hj46hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:173: ./drivers/usb/core/usb.chMhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_hub_clear_tt_buffer (C function)c.usb_hub_clear_tt_bufferhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h-int usb_hub_clear_tt_buffer (struct urb *urb)h]j)}(h,int usb_hub_clear_tt_buffer(struct urb *urb)h](j@)}(hinth]hint}(hjc6hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj_6hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMubj/)}(h h]h }(hjr6hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_6hhhjq6hMubjp)}(husb_hub_clear_tt_bufferh]jv)}(husb_hub_clear_tt_bufferh]husb_hub_clear_tt_buffer}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1johj_6hhhjq6hMubj)}(h(struct urb *urb)h]j)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj6hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj6ubj/)}(h h]h }(hj6hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj6ubh)}(hhh]jv)}(hurbh]hurb}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj6modnameN classnameNj8j;)}j>]jA)}j4j6sbc.usb_hub_clear_tt_bufferasbuh1hhj6ubj/)}(h h]h }(hj6hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj6ubj_)}(hjbh]h*}(hj6hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj6ubjv)}(hurbh]hurb}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubah}(h]h ]h"]h$]h&]jjuh1jhj_6hhhjq6hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj[6hhhjq6hMubah}(h]jV6ah ](jjeh"]h$]h&]jj)jhuh1jhjq6hMhjX6hhubj)}(hhh]h)}(h-clear control/bulk TT state in high speed hubh]h-clear control/bulk TT state in high speed hub}(hj#7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj 7hhubah}(h]h ]h"]h$]h&]uh1jhjX6hhhjq6hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j;7j j;7j j juh1j hhhjqhNhNubj)}(hX+**Parameters** ``struct urb *urb`` an URB associated with the failed or incomplete split transaction **Description** High speed HCDs use this to tell the hub driver that some split control or bulk transaction failed in a way that requires clearing internal state of a transaction translator. This is normally detected (and reported) from interrupt context. It may not be possible for that hub to handle additional full (or low) speed transactions until that state is fully cleared out. **Return** 0 if successful. A negative error code otherwise.h](h)}(h**Parameters**h]j)}(hjE7h]h Parameters}(hjG7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC7ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj?7ubj0)}(hhh]j5)}(hV``struct urb *urb`` an URB associated with the failed or incomplete split transaction h](j;)}(h``struct urb *urb``h]j)}(hjd7h]hstruct urb *urb}(hjf7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb7ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj^7ubjU)}(hhh]h)}(hAan URB associated with the failed or incomplete split transactionh]hAan URB associated with the failed or incomplete split transaction}(hj}7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy7hMhjz7ubah}(h]h ]h"]h$]h&]uh1jThj^7ubeh}(h]h ]h"]h$]h&]uh1j4hjy7hMhj[7ubah}(h]h ]h"]h$]h&]uh1j/hj?7ubh)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj?7ubh)}(hHigh speed HCDs use this to tell the hub driver that some split control or bulk transaction failed in a way that requires clearing internal state of a transaction translator. This is normally detected (and reported) from interrupt context.h]hHigh speed HCDs use this to tell the hub driver that some split control or bulk transaction failed in a way that requires clearing internal state of a transaction translator. This is normally detected (and reported) from interrupt context.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj?7ubh)}(hIt may not be possible for that hub to handle additional full (or low) speed transactions until that state is fully cleared out.h]hIt may not be possible for that hub to handle additional full (or low) speed transactions until that state is fully cleared out.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj?7ubh)}(h **Return**h]j)}(hj7h]hReturn}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj?7ubh)}(h10 if successful. A negative error code otherwise.h]h10 if successful. A negative error code otherwise.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj?7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_set_device_state (C function)c.usb_set_device_statehNtauh1jhjqhhhNhNubj )}(hhh](j)}(hTvoid usb_set_device_state (struct usb_device *udev, enum usb_device_state new_state)h]j)}(hSvoid usb_set_device_state(struct usb_device *udev, enum usb_device_state new_state)h](j@)}(hvoidh]hvoid}(hj8hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj8hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMnubj/)}(h h]h }(hj)8hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj8hhhj(8hMnubjp)}(husb_set_device_stateh]jv)}(husb_set_device_stateh]husb_set_device_state}(hj;8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj78ubah}(h]h ](jjeh"]h$]h&]jjuh1johj8hhhj(8hMnubj)}(h:(struct usb_device *udev, enum usb_device_state new_state)h](j)}(hstruct usb_device *udevh](j)}(hjh]hstruct}(hjW8hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjS8ubj/)}(h h]h }(hjd8hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjS8ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hju8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjr8ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjw8modnameN classnameNj8j;)}j>]jA)}j4j=8sbc.usb_set_device_stateasbuh1hhjS8ubj/)}(h h]h }(hj8hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjS8ubj_)}(hjbh]h*}(hj8hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjS8ubjv)}(hudevh]hudev}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjS8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjO8ubj)}(henum usb_device_state new_stateh](j)}(hjh]henum}(hj8hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj8ubj/)}(h h]h }(hj8hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj8ubh)}(hhh]jv)}(husb_device_stateh]husb_device_state}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj8ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj8modnameN classnameNj8j;)}j>]j8c.usb_set_device_stateasbuh1hhj8ubj/)}(h h]h }(hj9hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj8ubjv)}(h new_stateh]h new_state}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjO8ubeh}(h]h ]h"]h$]h&]jjuh1jhj8hhhj(8hMnubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj8hhhj(8hMnubah}(h]j 8ah ](jjeh"]h$]h&]jj)jhuh1jhj(8hMnhj8hhubj)}(hhh]h)}(h/change a device's current state (usbcore, hcds)h]h1change a device’s current state (usbcore, hcds)}(hj=9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMZhj:9hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj(8hMnubeh}(h]h ](jfunctioneh"]h$]h&]j jj jU9j jU9j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *udev`` pointer to device whose state should be changed ``enum usb_device_state new_state`` new state value to be stored **Description** udev->state is _not_ fully protected by the device lock. Although most transitions are made only while holding the lock, the state can can change to USB_STATE_NOTATTACHED at almost any time. This is so that devices can be marked as disconnected as soon as possible, without having to wait for any semaphores to be released. As a result, all changes to any device's state must be protected by the device_state_lock spinlock. Once a device has been added to the device tree, all changes to its state should be made using this routine. The state should _not_ be set directly. If udev->state is already USB_STATE_NOTATTACHED then no change is made. Otherwise udev->state is set to new_state, and if new_state is USB_STATE_NOTATTACHED then all of udev's descendants' states are also set to USB_STATE_NOTATTACHED.h](h)}(h**Parameters**h]j)}(hj_9h]h Parameters}(hja9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]9ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM^hjY9ubj0)}(hhh](j5)}(hL``struct usb_device *udev`` pointer to device whose state should be changed h](j;)}(h``struct usb_device *udev``h]j)}(hj~9h]hstruct usb_device *udev}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|9ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM[hjx9ubjU)}(hhh]h)}(h/pointer to device whose state should be changedh]h/pointer to device whose state should be changed}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM[hj9ubah}(h]h ]h"]h$]h&]uh1jThjx9ubeh}(h]h ]h"]h$]h&]uh1j4hj9hM[hju9ubj5)}(hA``enum usb_device_state new_state`` new state value to be stored h](j;)}(h#``enum usb_device_state new_state``h]j)}(hj9h]henum usb_device_state new_state}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM\hj9ubjU)}(hhh]h)}(hnew state value to be storedh]hnew state value to be stored}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM\hj9ubah}(h]h ]h"]h$]h&]uh1jThj9ubeh}(h]h ]h"]h$]h&]uh1j4hj9hM\hju9ubeh}(h]h ]h"]h$]h&]uh1j/hjY9ubh)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM^hjY9ubh)}(hXudev->state is _not_ fully protected by the device lock. Although most transitions are made only while holding the lock, the state can can change to USB_STATE_NOTATTACHED at almost any time. This is so that devices can be marked as disconnected as soon as possible, without having to wait for any semaphores to be released. As a result, all changes to any device's state must be protected by the device_state_lock spinlock.h]hXudev->state is _not_ fully protected by the device lock. Although most transitions are made only while holding the lock, the state can can change to USB_STATE_NOTATTACHED at almost any time. This is so that devices can be marked as disconnected as soon as possible, without having to wait for any semaphores to be released. As a result, all changes to any device’s state must be protected by the device_state_lock spinlock.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM^hjY9ubh)}(hOnce a device has been added to the device tree, all changes to its state should be made using this routine. The state should _not_ be set directly.h]hOnce a device has been added to the device tree, all changes to its state should be made using this routine. The state should _not_ be set directly.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMfhjY9ubh)}(hIf udev->state is already USB_STATE_NOTATTACHED then no change is made. Otherwise udev->state is set to new_state, and if new_state is USB_STATE_NOTATTACHED then all of udev's descendants' states are also set to USB_STATE_NOTATTACHED.h]hIf udev->state is already USB_STATE_NOTATTACHED then no change is made. Otherwise udev->state is set to new_state, and if new_state is USB_STATE_NOTATTACHED then all of udev’s descendants’ states are also set to USB_STATE_NOTATTACHED.}(hj&:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMihjY9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_root_hub_lost_power (C function)c.usb_root_hub_lost_powerhNtauh1jhjqhhhNhNubj )}(hhh](j)}(h7void usb_root_hub_lost_power (struct usb_device *rhdev)h]j)}(h6void usb_root_hub_lost_power(struct usb_device *rhdev)h](j@)}(hvoidh]hvoid}(hjU:hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjQ:hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMubj/)}(h h]h }(hjd:hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQ:hhhjc:hMubjp)}(husb_root_hub_lost_powerh]jv)}(husb_root_hub_lost_powerh]husb_root_hub_lost_power}(hjv:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjr:ubah}(h]h ](jjeh"]h$]h&]jjuh1johjQ:hhhjc:hMubj)}(h(struct usb_device *rhdev)h]j)}(hstruct usb_device *rhdevh](j)}(hjh]hstruct}(hj:hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj:ubj/)}(h h]h }(hj:hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj:ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj:modnameN classnameNj8j;)}j>]jA)}j4jx:sbc.usb_root_hub_lost_powerasbuh1hhj:ubj/)}(h h]h }(hj:hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj:ubj_)}(hjbh]h*}(hj:hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj:ubjv)}(hrhdevh]hrhdev}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubah}(h]h ]h"]h$]h&]jjuh1jhjQ:hhhjc:hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjM:hhhjc:hMubah}(h]jH:ah ](jjeh"]h$]h&]jj)jhuh1jhjc:hMhjJ:hhubj)}(hhh]h)}(h-called by HCD if the root hub lost Vbus powerh]h-called by HCD if the root hub lost Vbus power}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj;hhubah}(h]h ]h"]h$]h&]uh1jhjJ:hhhjc:hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j-;j j-;j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *rhdev`` struct usb_device for the root hub **Description** The USB host controller driver calls this function when its root hub is resumed and Vbus power has been interrupted or the controller has been reset. The routine marks **rhdev** as having lost power. When the hub driver is resumed it will take notice and carry out power-session recovery for all the "USB-PERSIST"-enabled child devices; the others will be disconnected.h](h)}(h**Parameters**h]j)}(hj7;h]h Parameters}(hj9;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5;ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj1;ubj0)}(hhh]j5)}(h@``struct usb_device *rhdev`` struct usb_device for the root hub h](j;)}(h``struct usb_device *rhdev``h]j)}(hjV;h]hstruct usb_device *rhdev}(hjX;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT;ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhjP;ubjU)}(hhh]h)}(h"struct usb_device for the root hubh]h"struct usb_device for the root hub}(hjo;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk;hMhjl;ubah}(h]h ]h"]h$]h&]uh1jThjP;ubeh}(h]h ]h"]h$]h&]uh1j4hjk;hMhjM;ubah}(h]h ]h"]h$]h&]uh1j/hj1;ubh)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj1;ubh)}(hXrThe USB host controller driver calls this function when its root hub is resumed and Vbus power has been interrupted or the controller has been reset. The routine marks **rhdev** as having lost power. When the hub driver is resumed it will take notice and carry out power-session recovery for all the "USB-PERSIST"-enabled child devices; the others will be disconnected.h](hThe USB host controller driver calls this function when its root hub is resumed and Vbus power has been interrupted or the controller has been reset. The routine marks }(hj;hhhNhNubj)}(h **rhdev**h]hrhdev}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh as having lost power. When the hub driver is resumed it will take notice and carry out power-session recovery for all the “USB-PERSIST”-enabled child devices; the others will be disconnected.}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj1;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_reset_device (C function)c.usb_reset_devicehNtauh1jhjqhhhNhNubj )}(hhh](j)}(h.int usb_reset_device (struct usb_device *udev)h]j)}(h-int usb_reset_device(struct usb_device *udev)h](j@)}(hinth]hint}(hj;hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj;hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMubj/)}(h h]h }(hj;hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj;hhhj;hMubjp)}(husb_reset_deviceh]jv)}(husb_reset_deviceh]husb_reset_device}(hj <hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1johj;hhhj;hMubj)}(h(struct usb_device *udev)h]j)}(hstruct usb_device *udevh](j)}(hjh]hstruct}(hj%<hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj!<ubj/)}(h h]h }(hj2<hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj!<ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjC<hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@<ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjE<modnameN classnameNj8j;)}j>]jA)}j4j <sbc.usb_reset_deviceasbuh1hhj!<ubj/)}(h h]h }(hjc<hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj!<ubj_)}(hjbh]h*}(hjq<hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj!<ubjv)}(hudevh]hudev}(hj~<hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj!<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubah}(h]h ]h"]h$]h&]jjuh1jhj;hhhj;hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;hhhj;hMubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj;hMhj;hhubj)}(hhh]h)}(h3warn interface drivers and perform a USB port reseth]h3warn interface drivers and perform a USB port reset}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj;hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j<j j<j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_device *udev`` device to reset (not in NOTATTACHED state) **Description** Warns all drivers bound to registered interfaces (using their pre_reset method), performs the port reset, and then lets the drivers know that the reset is over (using their post_reset method). If an interface is currently being probed or disconnected, we assume its driver knows how to handle resets. For all other interfaces, if the driver doesn't have pre_reset and post_reset methods then we attempt to unbind it and rebind afterward. **Return** The same as for usb_reset_and_verify_device(). However, if a reset is already in progress (for instance, if a driver doesn't have pre_reset() or post_reset() callbacks, and while being unbound or re-bound during the ongoing reset its disconnect() or probe() routine tries to perform a second, nested reset), the routine returns -EINPROGRESS. **Note** The caller must own the device lock. For example, it's safe to use this from a driver probe() routine after downloading new firmware. For calls that might not occur during probe(), drivers should lock the device using usb_lock_device_for_reset().h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubj0)}(hhh]j5)}(hG``struct usb_device *udev`` device to reset (not in NOTATTACHED state) h](j;)}(h``struct usb_device *udev``h]j)}(hj<h]hstruct usb_device *udev}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubjU)}(hhh]h)}(h*device to reset (not in NOTATTACHED state)h]h*device to reset (not in NOTATTACHED state)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jThj<ubeh}(h]h ]h"]h$]h&]uh1j4hj<hMhj<ubah}(h]h ]h"]h$]h&]uh1j/hj<ubh)}(h**Description**h]j)}(hj$=h]h Description}(hj&=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"=ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubh)}(hWarns all drivers bound to registered interfaces (using their pre_reset method), performs the port reset, and then lets the drivers know that the reset is over (using their post_reset method).h]hWarns all drivers bound to registered interfaces (using their pre_reset method), performs the port reset, and then lets the drivers know that the reset is over (using their post_reset method).}(hj:=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubh)}(hIf an interface is currently being probed or disconnected, we assume its driver knows how to handle resets. For all other interfaces, if the driver doesn't have pre_reset and post_reset methods then we attempt to unbind it and rebind afterward.h]hIf an interface is currently being probed or disconnected, we assume its driver knows how to handle resets. For all other interfaces, if the driver doesn’t have pre_reset and post_reset methods then we attempt to unbind it and rebind afterward.}(hjI=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubh)}(h **Return**h]j)}(hjZ=h]hReturn}(hj\=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX=ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubh)}(hXUThe same as for usb_reset_and_verify_device(). However, if a reset is already in progress (for instance, if a driver doesn't have pre_reset() or post_reset() callbacks, and while being unbound or re-bound during the ongoing reset its disconnect() or probe() routine tries to perform a second, nested reset), the routine returns -EINPROGRESS.h]hXWThe same as for usb_reset_and_verify_device(). However, if a reset is already in progress (for instance, if a driver doesn’t have pre_reset() or post_reset() callbacks, and while being unbound or re-bound during the ongoing reset its disconnect() or probe() routine tries to perform a second, nested reset), the routine returns -EINPROGRESS.}(hjp=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubh)}(h**Note**h]j)}(hj=h]hNote}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubh)}(hThe caller must own the device lock. For example, it's safe to use this from a driver probe() routine after downloading new firmware. For calls that might not occur during probe(), drivers should lock the device using usb_lock_device_for_reset().h]hThe caller must own the device lock. For example, it’s safe to use this from a driver probe() routine after downloading new firmware. For calls that might not occur during probe(), drivers should lock the device using usb_lock_device_for_reset().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#usb_queue_reset_device (C function)c.usb_queue_reset_devicehNtauh1jhjqhhhNhNubj )}(hhh](j)}(h9void usb_queue_reset_device (struct usb_interface *iface)h]j)}(h8void usb_queue_reset_device(struct usb_interface *iface)h](j@)}(hvoidh]hvoid}(hj=hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj=hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMubj/)}(h h]h }(hj=hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj=hhhj=hMubjp)}(husb_queue_reset_deviceh]jv)}(husb_queue_reset_deviceh]husb_queue_reset_device}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1johj=hhhj=hMubj)}(h(struct usb_interface *iface)h]j)}(hstruct usb_interface *ifaceh](j)}(hjh]hstruct}(hj>hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj=ubj/)}(h h]h }(hj>hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj=ubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hj!>hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj#>modnameN classnameNj8j;)}j>]jA)}j4j=sbc.usb_queue_reset_deviceasbuh1hhj=ubj/)}(h h]h }(hjA>hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj=ubj_)}(hjbh]h*}(hjO>hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj=ubjv)}(hifaceh]hiface}(hj\>hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubah}(h]h ]h"]h$]h&]jjuh1jhj=hhhj=hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj=hhhj=hMubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1jhj=hMhj=hhubj)}(hhh]h)}(h)Reset a USB device from an atomic contexth]h)Reset a USB device from an atomic context}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj=hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j>j j>j j juh1j hhhjqhNhNubj)}(hX**Parameters** ``struct usb_interface *iface`` USB interface belonging to the device to reset **Description** This function can be used to reset a USB device from an atomic context, where usb_reset_device() won't work (as it blocks). Doing a reset via this method is functionally equivalent to calling usb_reset_device(), except for the fact that it is delayed to a workqueue. This means that any drivers bound to other interfaces might be unbound, as well as users from usbfs in user space. Corner cases: - Scheduling two resets at the same time from two different drivers attached to two different interfaces of the same device is possible; depending on how the driver attached to each interface handles ->pre_reset(), the second reset might happen or not. - If the reset is delayed so long that the interface is unbound from its driver, the reset will be skipped. - This function can be called during .probe(). It can also be called during .disconnect(), but doing so is pointless because the reset will not occur. If you really want to reset the device during .disconnect(), call usb_reset_device() directly -- but watch out for nested unbinding issues!h](h)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>ubj0)}(hhh]j5)}(hO``struct usb_interface *iface`` USB interface belonging to the device to reset h](j;)}(h``struct usb_interface *iface``h]j)}(hj>h]hstruct usb_interface *iface}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>ubjU)}(hhh]h)}(h.USB interface belonging to the device to reseth]h.USB interface belonging to the device to reset}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jThj>ubeh}(h]h ]h"]h$]h&]uh1j4hj>hMhj>ubah}(h]h ]h"]h$]h&]uh1j/hj>ubh)}(h**Description**h]j)}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>ubh)}(h{This function can be used to reset a USB device from an atomic context, where usb_reset_device() won't work (as it blocks).h]h}This function can be used to reset a USB device from an atomic context, where usb_reset_device() won’t work (as it blocks).}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>ubh)}(hXDoing a reset via this method is functionally equivalent to calling usb_reset_device(), except for the fact that it is delayed to a workqueue. This means that any drivers bound to other interfaces might be unbound, as well as users from usbfs in user space.h]hXDoing a reset via this method is functionally equivalent to calling usb_reset_device(), except for the fact that it is delayed to a workqueue. This means that any drivers bound to other interfaces might be unbound, as well as users from usbfs in user space.}(hj'?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>ubh)}(h Corner cases:h]h Corner cases:}(hj6?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj>ubj)}(hhh](j)}(hScheduling two resets at the same time from two different drivers attached to two different interfaces of the same device is possible; depending on how the driver attached to each interface handles ->pre_reset(), the second reset might happen or not. h]h)}(hScheduling two resets at the same time from two different drivers attached to two different interfaces of the same device is possible; depending on how the driver attached to each interface handles ->pre_reset(), the second reset might happen or not.h]hScheduling two resets at the same time from two different drivers attached to two different interfaces of the same device is possible; depending on how the driver attached to each interface handles ->pre_reset(), the second reset might happen or not.}(hjL?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhjH?ubah}(h]h ]h"]h$]h&]uh1jhjE?ubj)}(hjIf the reset is delayed so long that the interface is unbound from its driver, the reset will be skipped. h]h)}(hiIf the reset is delayed so long that the interface is unbound from its driver, the reset will be skipped.h]hiIf the reset is delayed so long that the interface is unbound from its driver, the reset will be skipped.}(hje?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM hja?ubah}(h]h ]h"]h$]h&]uh1jhjE?ubj)}(hX"This function can be called during .probe(). It can also be called during .disconnect(), but doing so is pointless because the reset will not occur. If you really want to reset the device during .disconnect(), call usb_reset_device() directly -- but watch out for nested unbinding issues!h]h)}(hX"This function can be called during .probe(). It can also be called during .disconnect(), but doing so is pointless because the reset will not occur. If you really want to reset the device during .disconnect(), call usb_reset_device() directly -- but watch out for nested unbinding issues!h]hX"This function can be called during .probe(). It can also be called during .disconnect(), but doing so is pointless because the reset will not occur. If you really want to reset the device during .disconnect(), call usb_reset_device() directly -- but watch out for nested unbinding issues!}(hj~?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhjz?ubah}(h]h ]h"]h$]h&]uh1jhjE?ubeh}(h]h ]h"]h$]h&]jrjsuh1jhjZ?hMhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_hub_find_child (C function)c.usb_hub_find_childhNtauh1jhjqhhhNhNubj )}(hhh](j)}(hKstruct usb_device * usb_hub_find_child (struct usb_device *hdev, int port1)h]j)}(hIstruct usb_device *usb_hub_find_child(struct usb_device *hdev, int port1)h](j)}(hjh]hstruct}(hj?hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj?hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM(ubj/)}(h h]h }(hj?hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?hhhj?hM(ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj?modnameN classnameNj8j;)}j>]jA)}j4usb_hub_find_childsbc.usb_hub_find_childasbuh1hhj?hhhj?hM(ubj/)}(h h]h }(hj?hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj?hhhj?hM(ubj_)}(hjbh]h*}(hj@hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj?hhhj?hM(ubjp)}(husb_hub_find_childh]jv)}(hj?h]husb_hub_find_child}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1johj?hhhj?hM(ubj)}(h$(struct usb_device *hdev, int port1)h](j)}(hstruct usb_device *hdevh](j)}(hjh]hstruct}(hj3@hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj/@ubj/)}(h h]h }(hj@@hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj/@ubh)}(hhh]jv)}(h usb_deviceh]h usb_device}(hjQ@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjN@ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjS@modnameN classnameNj8j;)}j>]j?c.usb_hub_find_childasbuh1hhj/@ubj/)}(h h]h }(hjo@hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj/@ubj_)}(hjbh]h*}(hj}@hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj/@ubjv)}(hhdevh]hhdev}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj/@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+@ubj)}(h int port1h](j@)}(hinth]hint}(hj@hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj@ubj/)}(h h]h }(hj@hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj@ubjv)}(hport1h]hport1}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+@ubeh}(h]h ]h"]h$]h&]jjuh1jhj?hhhj?hM(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj?hhhj?hM(ubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhj?hM(hj?hhubj)}(hhh]h)}(hUGet the pointer of child device attached to the port which is specified by **port1**.h](hKGet the pointer of child device attached to the port which is specified by }(hj@hhhNhNubj)}(h **port1**h]hport1}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj@hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj?hM(ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jAj jAj j juh1j hhhjqhNhNubj)}(hXU**Parameters** ``struct usb_device *hdev`` USB device belonging to the usb hub ``int port1`` port num to indicate which port the child device is attached to. **Description** USB drivers call this function to get hub's child device pointer. **Return** ``NULL`` if input param is invalid and child's usb_device pointer if non-NULL.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM hjAubj0)}(hhh](j5)}(h@``struct usb_device *hdev`` USB device belonging to the usb hub h](j;)}(h``struct usb_device *hdev``h]j)}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:Aubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhj6AubjU)}(hhh]h)}(h#USB device belonging to the usb hubh]h#USB device belonging to the usb hub}(hjUAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQAhMhjRAubah}(h]h ]h"]h$]h&]uh1jThj6Aubeh}(h]h ]h"]h$]h&]uh1j4hjQAhMhj3Aubj5)}(hO``int port1`` port num to indicate which port the child device is attached to. h](j;)}(h ``int port1``h]j)}(hjuAh]h int port1}(hjwAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsAubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM hjoAubjU)}(hhh]h)}(h@port num to indicate which port the child device is attached to.h]h@port num to indicate which port the child device is attached to.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chMhjAubah}(h]h ]h"]h$]h&]uh1jThjoAubeh}(h]h ]h"]h$]h&]uh1j4hjAhM hj3Aubeh}(h]h ]h"]h$]h&]uh1j/hjAubh)}(h**Description**h]j)}(hjAh]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM"hjAubh)}(hAUSB drivers call this function to get hub's child device pointer.h]hCUSB drivers call this function to get hub’s child device pointer.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM"hjAubh)}(h **Return**h]j)}(hjAh]hReturn}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM%hjAubh)}(hN``NULL`` if input param is invalid and child's usb_device pointer if non-NULL.h](j)}(h``NULL``h]hNULL}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubhH if input param is invalid and child’s usb_device pointer if non-NULL.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:176: ./drivers/usb/core/hub.chM%hjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjqhhhNhNubeh}(h] usb-core-apisah ]h"] usb core apisah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hHost Controller APIsh]hHost Controller APIs}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhhhhhKubh)}(hXzThese APIs are only for use by host controller drivers, most of which implement standard register interfaces such as XHCI, EHCI, OHCI, or UHCI. UHCI was one of the first interfaces, designed by Intel and also used by VIA; it doesn't do much in hardware. OHCI was designed later, to have the hardware do more work (bigger transfers, tracking protocol state, and so on). EHCI was designed with USB 2.0; its design has features that resemble OHCI (hardware does much more work) as well as UHCI (some parts of ISO support, TD list processing). XHCI was designed with USB 3.0. It continues to shift support for functionality into hardware.h]hX|These APIs are only for use by host controller drivers, most of which implement standard register interfaces such as XHCI, EHCI, OHCI, or UHCI. UHCI was one of the first interfaces, designed by Intel and also used by VIA; it doesn’t do much in hardware. OHCI was designed later, to have the hardware do more work (bigger transfers, tracking protocol state, and so on). EHCI was designed with USB 2.0; its design has features that resemble OHCI (hardware does much more work) as well as UHCI (some parts of ISO support, TD list processing). XHCI was designed with USB 3.0. It continues to shift support for functionality into hardware.}(hj+BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjBhhubh)}(hX There are host controllers other than the "big three", although most PCI based controllers (and a few non-PCI based ones) use one of those interfaces. Not all host controllers use DMA; some use PIO, and there is also a simulator and a virtual host controller to pipe USB over the network.h]hX$There are host controllers other than the “big three”, although most PCI based controllers (and a few non-PCI based ones) use one of those interfaces. Not all host controllers use DMA; some use PIO, and there is also a simulator and a virtual host controller to pipe USB over the network.}(hj9BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjBhhubh)}(hXThe same basic APIs are available to drivers for all those controllers. For historical reasons they are in two layers: :c:type:`struct usb_bus ` is a rather thin layer that became available in the 2.2 kernels, while :c:type:`struct usb_hcd ` is a more featureful layer that lets HCDs share common code, to shrink driver size and significantly reduce hcd-specific behaviors.h](hwThe same basic APIs are available to drivers for all those controllers. For historical reasons they are in two layers: }(hjGBhhhNhNubh)}(h":c:type:`struct usb_bus `h]j)}(hjQBh]hstruct usb_bus}(hjSBhhhNhNubah}(h]h ](jbjc-typeeh"]h$]h&]uh1jhjOBubah}(h]h ]h"]h$]h&]refdocjb refdomainjreftypetype refexplicitrefwarnj8jbjcusb_busuh1hhhhKhjGBubhH is a rather thin layer that became available in the 2.2 kernels, while }(hjGBhhhNhNubh)}(h":c:type:`struct usb_hcd `h]j)}(hjtBh]hstruct usb_hcd}(hjvBhhhNhNubah}(h]h ](jbjc-typeeh"]h$]h&]uh1jhjrBubah}(h]h ]h"]h$]h&]refdocjb refdomainjreftypetype refexplicitrefwarnj8jbjcusb_hcduh1hhhhKhjGBubh is a more featureful layer that lets HCDs share common code, to shrink driver size and significantly reduce hcd-specific behaviors.}(hjGBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjBhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_calc_bus_time (C function)c.usb_calc_bus_timehNtauh1jhjBhhhNhNubj )}(hhh](j)}(hIlong usb_calc_bus_time (int speed, int is_input, int isoc, int bytecount)h]j)}(hHlong usb_calc_bus_time(int speed, int is_input, int isoc, int bytecount)h](j@)}(hlongh]hlong}(hjBhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjBhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM/ubj/)}(h h]h }(hjBhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjBhhhjBhM/ubjp)}(husb_calc_bus_timeh]jv)}(husb_calc_bus_timeh]husb_calc_bus_time}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjBubah}(h]h ](jjeh"]h$]h&]jjuh1johjBhhhjBhM/ubj)}(h2(int speed, int is_input, int isoc, int bytecount)h](j)}(h int speedh](j@)}(hinth]hint}(hjBhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjBubj/)}(h h]h }(hjBhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjBubjv)}(hspeedh]hspeed}(hj ChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(h int is_inputh](j@)}(hinth]hint}(hj&ChhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj"Cubj/)}(h h]h }(hj4ChhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj"Cubjv)}(his_inputh]his_input}(hjBChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj"Cubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hint isoch](j@)}(hinth]hint}(hj[ChhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjWCubj/)}(h h]h }(hjiChhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjWCubjv)}(hisoch]hisoc}(hjwChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjWCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(h int bytecounth](j@)}(hinth]hint}(hjChhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjCubj/)}(h h]h }(hjChhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjCubjv)}(h bytecounth]h bytecount}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubeh}(h]h ]h"]h$]h&]jjuh1jhjBhhhjBhM/ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjBhhhjBhM/ubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjBhM/hjBhhubj)}(hhh]h)}(h4approximate periodic transaction time in nanosecondsh]h4approximate periodic transaction time in nanoseconds}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM#hjChhubah}(h]h ]h"]h$]h&]uh1jhjBhhhjBhM/ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jCj jCj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``int speed`` from dev->speed; USB_SPEED_{LOW,FULL,HIGH} ``int is_input`` true iff the transaction sends data to the host ``int isoc`` true for isochronous transactions, false for interrupt ones ``int bytecount`` how many bytes in the transaction. **Return** Approximate bus time in nanoseconds for a periodic transaction. **Note** See USB 2.0 spec section 5.11.3; only periodic transfers need to be scheduled in software, this function is only used for such scheduling.h](h)}(h**Parameters**h]j)}(hjCh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM'hjCubj0)}(hhh](j5)}(h9``int speed`` from dev->speed; USB_SPEED_{LOW,FULL,HIGH} h](j;)}(h ``int speed``h]j)}(hjDh]h int speed}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM$hjDubjU)}(hhh]h)}(h*from dev->speed; USB_SPEED_{LOW,FULL,HIGH}h]h*from dev->speed; USB_SPEED_{LOW,FULL,HIGH}}(hj0DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,DhM$hj-Dubah}(h]h ]h"]h$]h&]uh1jThjDubeh}(h]h ]h"]h$]h&]uh1j4hj,DhM$hjDubj5)}(hA``int is_input`` true iff the transaction sends data to the host h](j;)}(h``int is_input``h]j)}(hjPDh]h int is_input}(hjRDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNDubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM%hjJDubjU)}(hhh]h)}(h/true iff the transaction sends data to the hosth]h/true iff the transaction sends data to the host}(hjiDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjeDhM%hjfDubah}(h]h ]h"]h$]h&]uh1jThjJDubeh}(h]h ]h"]h$]h&]uh1j4hjeDhM%hjDubj5)}(hI``int isoc`` true for isochronous transactions, false for interrupt ones h](j;)}(h ``int isoc``h]j)}(hjDh]hint isoc}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM&hjDubjU)}(hhh]h)}(h;true for isochronous transactions, false for interrupt onesh]h;true for isochronous transactions, false for interrupt ones}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhM&hjDubah}(h]h ]h"]h$]h&]uh1jThjDubeh}(h]h ]h"]h$]h&]uh1j4hjDhM&hjDubj5)}(h5``int bytecount`` how many bytes in the transaction. h](j;)}(h``int bytecount``h]j)}(hjDh]h int bytecount}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM'hjDubjU)}(hhh]h)}(h"how many bytes in the transaction.h]h"how many bytes in the transaction.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhM'hjDubah}(h]h ]h"]h$]h&]uh1jThjDubeh}(h]h ]h"]h$]h&]uh1j4hjDhM'hjDubeh}(h]h ]h"]h$]h&]uh1j/hjCubh)}(h **Return**h]j)}(hjDh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM)hjCubh)}(h?Approximate bus time in nanoseconds for a periodic transaction.h]h?Approximate bus time in nanoseconds for a periodic transaction.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM)hjCubh)}(h**Note**h]j)}(hj$Eh]hNote}(hj&EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Eubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM+hjCubh)}(hSee USB 2.0 spec section 5.11.3; only periodic transfers need to be scheduled in software, this function is only used for such scheduling.h]hSee USB 2.0 spec section 5.11.3; only periodic transfers need to be scheduled in software, this function is only used for such scheduling.}(hj:EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM+hjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#usb_hcd_link_urb_to_ep (C function)c.usb_hcd_link_urb_to_ephNtauh1jhjBhhhNhNubj )}(hhh](j)}(hAint usb_hcd_link_urb_to_ep (struct usb_hcd *hcd, struct urb *urb)h]j)}(h@int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)h](j@)}(hinth]hint}(hjiEhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjeEhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMjubj/)}(h h]h }(hjxEhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjeEhhhjwEhMjubjp)}(husb_hcd_link_urb_to_eph]jv)}(husb_hcd_link_urb_to_eph]husb_hcd_link_urb_to_ep}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubah}(h]h ](jjeh"]h$]h&]jjuh1johjeEhhhjwEhMjubj)}(h&(struct usb_hcd *hcd, struct urb *urb)h](j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjEubj/)}(h h]h }(hjEhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjEubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjEmodnameN classnameNj8j;)}j>]jA)}j4jEsbc.usb_hcd_link_urb_to_epasbuh1hhjEubj/)}(h h]h }(hjEhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjEubj_)}(hjbh]h*}(hjEhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjEubjv)}(hhcdh]hhcd}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubj)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjFhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjFubj/)}(h h]h }(hj%FhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjFubh)}(hhh]jv)}(hurbh]hurb}(hj6FhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3Fubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj8FmodnameN classnameNj8j;)}j>]jEc.usb_hcd_link_urb_to_epasbuh1hhjFubj/)}(h h]h }(hjTFhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjFubj_)}(hjbh]h*}(hjbFhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjFubjv)}(hurbh]hurb}(hjoFhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubeh}(h]h ]h"]h$]h&]jjuh1jhjeEhhhjwEhMjubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjaEhhhjwEhMjubah}(h]j\Eah ](jjeh"]h$]h&]jj)jhuh1jhjwEhMjhj^Ehhubj)}(hhh]h)}(h add an URB to its endpoint queueh]h add an URB to its endpoint queue}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM\hjFhhubah}(h]h ]h"]h$]h&]uh1jhj^EhhhjwEhMjubeh}(h]h ](jfunctioneh"]h$]h&]j jj jFj jFj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_hcd *hcd`` host controller to which **urb** was submitted ``struct urb *urb`` URB being submitted **Description** Host controller drivers should call this routine in their enqueue() method. The HCD's private spinlock must be held and interrupts must be disabled. The actions carried out here are required for URB submission, as well as for endpoint shutdown and for usb_kill_urb. **Return** 0 for no error, otherwise a negative error code (in which case the enqueue() method must fail). If no error occurs but enqueue() fails anyway, it must call usb_hcd_unlink_urb_from_ep() before releasing the private spinlock and returning.h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM`hjFubj0)}(hhh](j5)}(hG``struct usb_hcd *hcd`` host controller to which **urb** was submitted h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjFh]hstruct usb_hcd *hcd}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM]hjFubjU)}(hhh]h)}(h.host controller to which **urb** was submittedh](hhost controller to which }(hjFhhhNhNubj)}(h**urb**h]hurb}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubh was submitted}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjFhM]hjFubah}(h]h ]h"]h$]h&]uh1jThjFubeh}(h]h ]h"]h$]h&]uh1j4hjFhM]hjFubj5)}(h(``struct urb *urb`` URB being submitted h](j;)}(h``struct urb *urb``h]j)}(hj%Gh]hstruct urb *urb}(hj'GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Gubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM^hjGubjU)}(hhh]h)}(hURB being submittedh]hURB being submitted}(hj>GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:GhM^hj;Gubah}(h]h ]h"]h$]h&]uh1jThjGubeh}(h]h ]h"]h$]h&]uh1j4hj:GhM^hjFubeh}(h]h ]h"]h$]h&]uh1j/hjFubh)}(h**Description**h]j)}(hj`Gh]h Description}(hjbGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Gubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM`hjFubh)}(hX Host controller drivers should call this routine in their enqueue() method. The HCD's private spinlock must be held and interrupts must be disabled. The actions carried out here are required for URB submission, as well as for endpoint shutdown and for usb_kill_urb.h]hX Host controller drivers should call this routine in their enqueue() method. The HCD’s private spinlock must be held and interrupts must be disabled. The actions carried out here are required for URB submission, as well as for endpoint shutdown and for usb_kill_urb.}(hjvGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM`hjFubh)}(h **Return**h]j)}(hjGh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMehjFubh)}(h0 for no error, otherwise a negative error code (in which case the enqueue() method must fail). If no error occurs but enqueue() fails anyway, it must call usb_hcd_unlink_urb_from_ep() before releasing the private spinlock and returning.h]h0 for no error, otherwise a negative error code (in which case the enqueue() method must fail). If no error occurs but enqueue() fails anyway, it must call usb_hcd_unlink_urb_from_ep() before releasing the private spinlock and returning.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMehjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%usb_hcd_check_unlink_urb (C function)c.usb_hcd_check_unlink_urbhNtauh1jhjBhhhNhNubj )}(hhh](j)}(hOint usb_hcd_check_unlink_urb (struct usb_hcd *hcd, struct urb *urb, int status)h]j)}(hNint usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, int status)h](j@)}(hinth]hint}(hjGhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjGhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMubj/)}(h h]h }(hjGhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjGhhhjGhMubjp)}(husb_hcd_check_unlink_urbh]jv)}(husb_hcd_check_unlink_urbh]husb_hcd_check_unlink_urb}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjGubah}(h]h ](jjeh"]h$]h&]jjuh1johjGhhhjGhMubj)}(h2(struct usb_hcd *hcd, struct urb *urb, int status)h](j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hj HhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjHubj/)}(h h]h }(hjHhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjHubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj'HhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj$Hubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj)HmodnameN classnameNj8j;)}j>]jA)}j4jGsbc.usb_hcd_check_unlink_urbasbuh1hhjHubj/)}(h h]h }(hjGHhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjHubj_)}(hjbh]h*}(hjUHhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjHubjv)}(hhcdh]hhcd}(hjbHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hstruct urb *urbh](j)}(hjh]hstruct}(hj{HhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjwHubj/)}(h h]h }(hjHhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjwHubh)}(hhh]jv)}(hurbh]hurb}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjHubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjHmodnameN classnameNj8j;)}j>]jCHc.usb_hcd_check_unlink_urbasbuh1hhjwHubj/)}(h h]h }(hjHhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjwHubj_)}(hjbh]h*}(hjHhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjwHubjv)}(hurbh]hurb}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjwHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(h int statush](j@)}(hinth]hint}(hjHhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjHubj/)}(h h]h }(hjHhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjHubjv)}(hstatush]hstatus}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubeh}(h]h ]h"]h$]h&]jjuh1jhjGhhhjGhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjGhhhjGhMubah}(h]jGah ](jjeh"]h$]h&]jj)jhuh1jhjGhMhjGhhubj)}(hhh]h)}(h$check whether an URB may be unlinkedh]h$check whether an URB may be unlinked}(hj1IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj.Ihhubah}(h]h ]h"]h$]h&]uh1jhjGhhhjGhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jIIj jIIj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_hcd *hcd`` host controller to which **urb** was submitted ``struct urb *urb`` URB being checked for unlinkability ``int status`` error code to store in **urb** if the unlink succeeds **Description** Host controller drivers should call this routine in their dequeue() method. The HCD's private spinlock must be held and interrupts must be disabled. The actions carried out here are required for making sure than an unlink is valid. **Return** 0 for no error, otherwise a negative error code (in which case the dequeue() method must fail). The possible error codes are: -EIDRM: **urb** was not submitted or has already completed. The completion function may not have been called yet. -EBUSY: **urb** has already been unlinked.h](h)}(h**Parameters**h]j)}(hjSIh]h Parameters}(hjUIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQIubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjMIubj0)}(hhh](j5)}(hG``struct usb_hcd *hcd`` host controller to which **urb** was submitted h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjrIh]hstruct usb_hcd *hcd}(hjtIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpIubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjlIubjU)}(hhh]h)}(h.host controller to which **urb** was submittedh](hhost controller to which }(hjIhhhNhNubj)}(h**urb**h]hurb}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh was submitted}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjIhMhjIubah}(h]h ]h"]h$]h&]uh1jThjlIubeh}(h]h ]h"]h$]h&]uh1j4hjIhMhjiIubj5)}(h8``struct urb *urb`` URB being checked for unlinkability h](j;)}(h``struct urb *urb``h]j)}(hjIh]hstruct urb *urb}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjIubjU)}(hhh]h)}(h#URB being checked for unlinkabilityh]h#URB being checked for unlinkability}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjIubah}(h]h ]h"]h$]h&]uh1jThjIubeh}(h]h ]h"]h$]h&]uh1j4hjIhMhjiIubj5)}(hE``int status`` error code to store in **urb** if the unlink succeeds h](j;)}(h``int status``h]j)}(hjIh]h int status}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjIubjU)}(hhh]h)}(h5error code to store in **urb** if the unlink succeedsh](herror code to store in }(hjJhhhNhNubj)}(h**urb**h]hurb}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh if the unlink succeeds}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj JhMhj Jubah}(h]h ]h"]h$]h&]uh1jThjIubeh}(h]h ]h"]h$]h&]uh1j4hj JhMhjiIubeh}(h]h ]h"]h$]h&]uh1j/hjMIubh)}(h**Description**h]j)}(hjCJh]h Description}(hjEJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAJubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjMIubh)}(hHost controller drivers should call this routine in their dequeue() method. The HCD's private spinlock must be held and interrupts must be disabled. The actions carried out here are required for making sure than an unlink is valid.h]hHost controller drivers should call this routine in their dequeue() method. The HCD’s private spinlock must be held and interrupts must be disabled. The actions carried out here are required for making sure than an unlink is valid.}(hjYJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjMIubh)}(h **Return**h]j)}(hjjJh]hReturn}(hjlJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhJubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjMIubh)}(h~0 for no error, otherwise a negative error code (in which case the dequeue() method must fail). The possible error codes are:h]h~0 for no error, otherwise a negative error code (in which case the dequeue() method must fail). The possible error codes are:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjMIubj6)}(h-EIDRM: **urb** was not submitted or has already completed. The completion function may not have been called yet. -EBUSY: **urb** has already been unlinked.h](j0)}(hhh]j5)}(hr-EIDRM: **urb** was not submitted or has already completed. The completion function may not have been called yet. h](j;)}(h;-EIDRM: **urb** was not submitted or has already completed.h](h-EIDRM: }(hjJhhhNhNubj)}(h**urb**h]hurb}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh, was not submitted or has already completed.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjJubjU)}(hhh]h)}(h5The completion function may not have been called yet.h]h5The completion function may not have been called yet.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jThjJubeh}(h]h ]h"]h$]h&]uh1j4hjJhMhjJubah}(h]h ]h"]h$]h&]uh1j/hjJubh)}(h*-EBUSY: **urb** has already been unlinked.h](h-EBUSY: }(hjJhhhNhNubj)}(h**urb**h]hurb}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh has already been unlinked.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjJubeh}(h]h ]h"]h$]h&]uh1j6hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjMIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'usb_hcd_unlink_urb_from_ep (C function)c.usb_hcd_unlink_urb_from_ephNtauh1jhjBhhhNhNubj )}(hhh](j)}(hFvoid usb_hcd_unlink_urb_from_ep (struct usb_hcd *hcd, struct urb *urb)h]j)}(hEvoid usb_hcd_unlink_urb_from_ep(struct usb_hcd *hcd, struct urb *urb)h](j@)}(hvoidh]hvoid}(hj&KhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj"KhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMubj/)}(h h]h }(hj5KhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj"Khhhj4KhMubjp)}(husb_hcd_unlink_urb_from_eph]jv)}(husb_hcd_unlink_urb_from_eph]husb_hcd_unlink_urb_from_ep}(hjGKhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjCKubah}(h]h ](jjeh"]h$]h&]jjuh1johj"Khhhj4KhMubj)}(h&(struct usb_hcd *hcd, struct urb *urb)h](j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjcKhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj_Kubj/)}(h h]h }(hjpKhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_Kubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj~Kubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjKmodnameN classnameNj8j;)}j>]jA)}j4jIKsbc.usb_hcd_unlink_urb_from_epasbuh1hhj_Kubj/)}(h h]h }(hjKhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_Kubj_)}(hjbh]h*}(hjKhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj_Kubjv)}(hhcdh]hhcd}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_Kubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[Kubj)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjKhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjKubj/)}(h h]h }(hjKhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjKubh)}(hhh]jv)}(hurbh]hurb}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjKubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjKmodnameN classnameNj8j;)}j>]jKc.usb_hcd_unlink_urb_from_epasbuh1hhjKubj/)}(h h]h }(hjLhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjKubj_)}(hjbh]h*}(hjLhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjKubjv)}(hurbh]hurb}(hj,LhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[Kubeh}(h]h ]h"]h$]h&]jjuh1jhj"Khhhj4KhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhj4KhMubah}(h]jKah ](jjeh"]h$]h&]jj)jhuh1jhj4KhMhjKhhubj)}(hhh]h)}(h%remove an URB from its endpoint queueh]h%remove an URB from its endpoint queue}(hjVLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjSLhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhj4KhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jnLj jnLj j juh1j hhhjBhNhNubj)}(hXu**Parameters** ``struct usb_hcd *hcd`` host controller to which **urb** was submitted ``struct urb *urb`` URB being unlinked **Description** Host controller drivers should call this routine before calling usb_hcd_giveback_urb(). The HCD's private spinlock must be held and interrupts must be disabled. The actions carried out here are required for URB completion.h](h)}(h**Parameters**h]j)}(hjxLh]h Parameters}(hjzLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvLubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjrLubj0)}(hhh](j5)}(hG``struct usb_hcd *hcd`` host controller to which **urb** was submitted h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjLh]hstruct usb_hcd *hcd}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjLubjU)}(hhh]h)}(h.host controller to which **urb** was submittedh](hhost controller to which }(hjLhhhNhNubj)}(h**urb**h]hurb}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh was submitted}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1jThjLubeh}(h]h ]h"]h$]h&]uh1j4hjLhMhjLubj5)}(h'``struct urb *urb`` URB being unlinked h](j;)}(h``struct urb *urb``h]j)}(hjLh]hstruct urb *urb}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjLubjU)}(hhh]h)}(hURB being unlinkedh]hURB being unlinked}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1jThjLubeh}(h]h ]h"]h$]h&]uh1j4hjLhMhjLubeh}(h]h ]h"]h$]h&]uh1j/hjrLubh)}(h**Description**h]j)}(hjMh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjrLubh)}(hHost controller drivers should call this routine before calling usb_hcd_giveback_urb(). The HCD's private spinlock must be held and interrupts must be disabled. The actions carried out here are required for URB completion.h]hHost controller drivers should call this routine before calling usb_hcd_giveback_urb(). The HCD’s private spinlock must be held and interrupts must be disabled. The actions carried out here are required for URB completion.}(hj3MhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjrLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_hcd_giveback_urb (C function)c.usb_hcd_giveback_urbhNtauh1jhjBhhhNhNubj )}(hhh](j)}(hLvoid usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, int status)h]j)}(hKvoid usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)h](j@)}(hvoidh]hvoid}(hjbMhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj^MhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMubj/)}(h h]h }(hjqMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj^MhhhjpMhMubjp)}(husb_hcd_giveback_urbh]jv)}(husb_hcd_giveback_urbh]husb_hcd_giveback_urb}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjMubah}(h]h ](jjeh"]h$]h&]jjuh1johj^MhhhjpMhMubj)}(h2(struct usb_hcd *hcd, struct urb *urb, int status)h](j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjMhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjMubj/)}(h h]h }(hjMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjMubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjMubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjMmodnameN classnameNj8j;)}j>]jA)}j4jMsbc.usb_hcd_giveback_urbasbuh1hhjMubj/)}(h h]h }(hjMhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjMubj_)}(hjbh]h*}(hjMhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjMubjv)}(hhcdh]hhcd}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hstruct urb *urbh](j)}(hjh]hstruct}(hjNhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj Nubj/)}(h h]h }(hjNhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj Nubh)}(hhh]jv)}(hurbh]hurb}(hj/NhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,Nubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj1NmodnameN classnameNj8j;)}j>]jMc.usb_hcd_giveback_urbasbuh1hhj Nubj/)}(h h]h }(hjMNhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj Nubj_)}(hjbh]h*}(hj[NhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj Nubjv)}(hurbh]hurb}(hjhNhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj Nubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(h int statush](j@)}(hinth]hint}(hjNhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj}Nubj/)}(h h]h }(hjNhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj}Nubjv)}(hstatush]hstatus}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj}Nubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubeh}(h]h ]h"]h$]h&]jjuh1jhj^MhhhjpMhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjZMhhhjpMhMubah}(h]jUMah ](jjeh"]h$]h&]jj)jhuh1jhjpMhMhjWMhhubj)}(hhh]h)}(h$return URB from HCD to device driverh]h$return URB from HCD to device driver}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjWMhhhjpMhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jNj jNj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_hcd *hcd`` host controller returning the URB ``struct urb *urb`` urb being returned to the USB device driver. ``int status`` completion status code for the URB. **Context** atomic. The completion callback is invoked in caller's context. For HCDs with HCD_BH flag set, the completion callback is invoked in BH context (except for URBs submitted to the root hub which always complete in caller's context). **Description** This hands the URB from HCD to its USB device driver, using its completion function. The HCD has freed all per-urb resources (and is done using urb->hcpriv). It also released all HCD locks; the device driver won't cause problems if it frees, modifies, or resubmits this URB. If **urb** was unlinked, the value of **status** will be overridden by **urb->unlinked**. Erroneous short transfers are detected in case the HCD hasn't checked for them.h](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNubj0)}(hhh](j5)}(h:``struct usb_hcd *hcd`` host controller returning the URB h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjOh]hstruct usb_hcd *hcd}(hj OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjOubjU)}(hhh]h)}(h!host controller returning the URBh]h!host controller returning the URB}(hj!OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jThjOubeh}(h]h ]h"]h$]h&]uh1j4hjOhMhjNubj5)}(hA``struct urb *urb`` urb being returned to the USB device driver. h](j;)}(h``struct urb *urb``h]j)}(hjAOh]hstruct urb *urb}(hjCOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Oubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj;OubjU)}(hhh]h)}(h,urb being returned to the USB device driver.h]h,urb being returned to the USB device driver.}(hjZOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVOhMhjWOubah}(h]h ]h"]h$]h&]uh1jThj;Oubeh}(h]h ]h"]h$]h&]uh1j4hjVOhMhjNubj5)}(h3``int status`` completion status code for the URB. h](j;)}(h``int status``h]j)}(hjzOh]h int status}(hj|OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxOubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjtOubjU)}(hhh]h)}(h#completion status code for the URB.h]h#completion status code for the URB.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jThjtOubeh}(h]h ]h"]h$]h&]uh1j4hjOhMhjNubeh}(h]h ]h"]h$]h&]uh1j/hjNubh)}(h **Context**h]j)}(hjOh]hContext}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNubh)}(hatomic. The completion callback is invoked in caller's context. For HCDs with HCD_BH flag set, the completion callback is invoked in BH context (except for URBs submitted to the root hub which always complete in caller's context).h]hatomic. The completion callback is invoked in caller’s context. For HCDs with HCD_BH flag set, the completion callback is invoked in BH context (except for URBs submitted to the root hub which always complete in caller’s context).}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNubh)}(h**Description**h]j)}(hjOh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNubh)}(hXThis hands the URB from HCD to its USB device driver, using its completion function. The HCD has freed all per-urb resources (and is done using urb->hcpriv). It also released all HCD locks; the device driver won't cause problems if it frees, modifies, or resubmits this URB.h]hXThis hands the URB from HCD to its USB device driver, using its completion function. The HCD has freed all per-urb resources (and is done using urb->hcpriv). It also released all HCD locks; the device driver won’t cause problems if it frees, modifies, or resubmits this URB.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNubh)}(hIf **urb** was unlinked, the value of **status** will be overridden by **urb->unlinked**. Erroneous short transfers are detected in case the HCD hasn't checked for them.h](hIf }(hjPhhhNhNubj)}(h**urb**h]hurb}(hj PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh was unlinked, the value of }(hjPhhhNhNubj)}(h **status**h]hstatus}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh will be overridden by }(hjPhhhNhNubj)}(h**urb->unlinked**h]h urb->unlinked}(hj-PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubhT. Erroneous short transfers are detected in case the HCD hasn’t checked for them.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_alloc_streams (C function)c.usb_alloc_streamshNtauh1jhjBhhhNhNubj )}(hhh](j)}(hint usb_alloc_streams (struct usb_interface *interface, struct usb_host_endpoint **eps, unsigned int num_eps, unsigned int num_streams, gfp_t mem_flags)h]j)}(hint usb_alloc_streams(struct usb_interface *interface, struct usb_host_endpoint **eps, unsigned int num_eps, unsigned int num_streams, gfp_t mem_flags)h](j@)}(hinth]hint}(hjfPhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjbPhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMubj/)}(h h]h }(hjuPhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjbPhhhjtPhMubjp)}(husb_alloc_streamsh]jv)}(husb_alloc_streamsh]husb_alloc_streams}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjPubah}(h]h ](jjeh"]h$]h&]jjuh1johjbPhhhjtPhMubj)}(h(struct usb_interface *interface, struct usb_host_endpoint **eps, unsigned int num_eps, unsigned int num_streams, gfp_t mem_flags)h](j)}(hstruct usb_interface *interfaceh](j)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjPubj/)}(h h]h }(hjPhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjPubh)}(hhh]jv)}(h usb_interfaceh]h usb_interface}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjPubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjPmodnameN classnameNj8j;)}j>]jA)}j4jPsbc.usb_alloc_streamsasbuh1hhjPubj/)}(h h]h }(hjPhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjPubj_)}(hjbh]h*}(hjPhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjPubjv)}(h interfaceh]h interface}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hstruct usb_host_endpoint **epsh](j)}(hjh]hstruct}(hjQhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjQubj/)}(h h]h }(hj"QhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQubh)}(hhh]jv)}(husb_host_endpointh]husb_host_endpoint}(hj3QhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0Qubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj5QmodnameN classnameNj8j;)}j>]jPc.usb_alloc_streamsasbuh1hhjQubj/)}(h h]h }(hjQQhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQubj_)}(hjbh]h*}(hj_QhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjQubj_)}(hjbh]h*}(hjlQhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjQubjv)}(hepsh]heps}(hjyQhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hunsigned int num_epsh](j@)}(hunsignedh]hunsigned}(hjQhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjQubj/)}(h h]h }(hjQhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQubj@)}(hinth]hint}(hjQhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjQubj/)}(h h]h }(hjQhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQubjv)}(hnum_epsh]hnum_eps}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hunsigned int num_streamsh](j@)}(hunsignedh]hunsigned}(hjQhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjQubj/)}(h h]h }(hjQhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQubj@)}(hinth]hint}(hjQhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjQubj/)}(h h]h }(hj RhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQubjv)}(h num_streamsh]h num_streams}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hgfp_t mem_flagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hj7RhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj4Rubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj9RmodnameN classnameNj8j;)}j>]jPc.usb_alloc_streamsasbuh1hhj0Rubj/)}(h h]h }(hjURhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj0Rubjv)}(h mem_flagsh]h mem_flags}(hjcRhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0Rubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubeh}(h]h ]h"]h$]h&]jjuh1jhjbPhhhjtPhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^PhhhjtPhMubah}(h]jYPah ](jjeh"]h$]h&]jj)jhuh1jhjtPhMhj[Phhubj)}(hhh]h)}(h"allocate bulk endpoint stream IDs.h]h"allocate bulk endpoint stream IDs.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjRhhubah}(h]h ]h"]h$]h&]uh1jhj[PhhhjtPhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jRj jRj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_interface *interface`` alternate setting that includes all endpoints. ``struct usb_host_endpoint **eps`` array of endpoints that need streams. ``unsigned int num_eps`` number of endpoints in the array. ``unsigned int num_streams`` number of streams to allocate. ``gfp_t mem_flags`` flags hcd should use to allocate memory. **Description** Sets up a group of bulk endpoints to have **num_streams** stream IDs available. Drivers may queue multiple transfers to different stream IDs, which may complete in a different order than they were queued. **Return** On success, the number of allocated streams. On failure, a negative error code.h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjRubj0)}(hhh](j5)}(hS``struct usb_interface *interface`` alternate setting that includes all endpoints. h](j;)}(h#``struct usb_interface *interface``h]j)}(hjRh]hstruct usb_interface *interface}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjRubjU)}(hhh]h)}(h.alternate setting that includes all endpoints.h]h.alternate setting that includes all endpoints.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjRubah}(h]h ]h"]h$]h&]uh1jThjRubeh}(h]h ]h"]h$]h&]uh1j4hjRhMhjRubj5)}(hI``struct usb_host_endpoint **eps`` array of endpoints that need streams. h](j;)}(h"``struct usb_host_endpoint **eps``h]j)}(hjSh]hstruct usb_host_endpoint **eps}(hj ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjSubjU)}(hhh]h)}(h%array of endpoints that need streams.h]h%array of endpoints that need streams.}(hj ShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jThjSubeh}(h]h ]h"]h$]h&]uh1j4hjShMhjRubj5)}(h;``unsigned int num_eps`` number of endpoints in the array. h](j;)}(h``unsigned int num_eps``h]j)}(hj@Sh]hunsigned int num_eps}(hjBShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Subah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj:SubjU)}(hhh]h)}(h!number of endpoints in the array.h]h!number of endpoints in the array.}(hjYShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUShMhjVSubah}(h]h ]h"]h$]h&]uh1jThj:Subeh}(h]h ]h"]h$]h&]uh1j4hjUShMhjRubj5)}(h<``unsigned int num_streams`` number of streams to allocate. h](j;)}(h``unsigned int num_streams``h]j)}(hjySh]hunsigned int num_streams}(hj{ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwSubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjsSubjU)}(hhh]h)}(hnumber of streams to allocate.h]hnumber of streams to allocate.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jThjsSubeh}(h]h ]h"]h$]h&]uh1j4hjShMhjRubj5)}(h=``gfp_t mem_flags`` flags hcd should use to allocate memory. h](j;)}(h``gfp_t mem_flags``h]j)}(hjSh]hgfp_t mem_flags}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjSubjU)}(hhh]h)}(h(flags hcd should use to allocate memory.h]h(flags hcd should use to allocate memory.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jThjSubeh}(h]h ]h"]h$]h&]uh1j4hjShMhjRubeh}(h]h ]h"]h$]h&]uh1j/hjRubh)}(h**Description**h]j)}(hjSh]h Description}(hjShhhNhNubah}(h]h ]h"]zh$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjRubh)}(hSets up a group of bulk endpoints to have **num_streams** stream IDs available. Drivers may queue multiple transfers to different stream IDs, which may complete in a different order than they were queued.h](h*Sets up a group of bulk endpoints to have }(hjThhhNhNubj)}(h**num_streams**h]h num_streams}(hj ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubh stream IDs available. Drivers may queue multiple transfers to different stream IDs, which may complete in a different order than they were queued.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjRubh)}(h **Return**h]j)}(hj&Th]hReturn}(hj(ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Tubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhjRubh)}(hOOn success, the number of allocated streams. On failure, a negative error code.h]hOOn success, the number of allocated streams. On failure, a negative error code.}(hj]jA)}j4jTsbc.usb_free_streamsasbuh1hhjTubj/)}(h h]h }(hjThhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjTubj_)}(hjbh]h*}(hjThhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjTubjv)}(h interfaceh]h interface}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hstruct usb_host_endpoint **epsh](j)}(hjh]hstruct}(hjUhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjUubj/)}(h h]h }(hj'UhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubh)}(hhh]jv)}(husb_host_endpointh]husb_host_endpoint}(hj8UhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj5Uubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj:UmodnameN classnameNj8j;)}j>]jTc.usb_free_streamsasbuh1hhjUubj/)}(h h]h }(hjVUhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubj_)}(hjbh]h*}(hjdUhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjUubj_)}(hjbh]h*}(hjqUhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjUubjv)}(hepsh]heps}(hj~UhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hunsigned int num_epsh](j@)}(hunsignedh]hunsigned}(hjUhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjUubj/)}(h h]h }(hjUhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubj@)}(hinth]hint}(hjUhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjUubj/)}(h h]h }(hjUhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubjv)}(hnum_epsh]hnum_eps}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hgfp_t mem_flagsh](h)}(hhh]jv)}(hgfp_th]hgfp_t}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjUmodnameN classnameNj8j;)}j>]jTc.usb_free_streamsasbuh1hhjUubj/)}(h h]h }(hj VhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjUubjv)}(h mem_flagsh]h mem_flags}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubeh}(h]h ]h"]h$]h&]jjuh1jhjgThhhjyThMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjcThhhjyThMubah}(h]j^Tah ](jjeh"]h$]h&]jj)jhuh1jhjyThMhj`Thhubj)}(hhh]h)}(hfree bulk endpoint stream IDs.h]hfree bulk endpoint stream IDs.}(hjAVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj>Vhhubah}(h]h ]h"]h$]h&]uh1jhj`ThhhjyThMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jYVj jYVj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_interface *interface`` alternate setting that includes all endpoints. ``struct usb_host_endpoint **eps`` array of endpoints to remove streams from. ``unsigned int num_eps`` number of endpoints in the array. ``gfp_t mem_flags`` flags hcd should use to allocate memory. **Description** Reverts a group of bulk endpoints back to not using stream IDs. Can fail if we are given bad arguments, or HCD is broken. **Return** 0 on success. On failure, a negative error code.h](h)}(h**Parameters**h]j)}(hjcVh]h Parameters}(hjeVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaVubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj]Vubj0)}(hhh](j5)}(hS``struct usb_interface *interface`` alternate setting that includes all endpoints. h](j;)}(h#``struct usb_interface *interface``h]j)}(hjVh]hstruct usb_interface *interface}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj|VubjU)}(hhh]h)}(h.alternate setting that includes all endpoints.h]h.alternate setting that includes all endpoints.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jThj|Vubeh}(h]h ]h"]h$]h&]uh1j4hjVhMhjyVubj5)}(hN``struct usb_host_endpoint **eps`` array of endpoints to remove streams from. h](j;)}(h"``struct usb_host_endpoint **eps``h]j)}(hjVh]hstruct usb_host_endpoint **eps}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjVubjU)}(hhh]h)}(h*array of endpoints to remove streams from.h]h*array of endpoints to remove streams from.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhM hjVubah}(h]h ]h"]h$]h&]uh1jThjVubeh}(h]h ]h"]h$]h&]uh1j4hjVhM hjyVubj5)}(h;``unsigned int num_eps`` number of endpoints in the array. h](j;)}(h``unsigned int num_eps``h]j)}(hjVh]hunsigned int num_eps}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjVubjU)}(hhh]h)}(h!number of endpoints in the array.h]h!number of endpoints in the array.}(hj WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj WhM hj Wubah}(h]h ]h"]h$]h&]uh1jThjVubeh}(h]h ]h"]h$]h&]uh1j4hj WhM hjyVubj5)}(h=``gfp_t mem_flags`` flags hcd should use to allocate memory. h](j;)}(h``gfp_t mem_flags``h]j)}(hj-Wh]hgfp_t mem_flags}(hj/WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Wubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj'WubjU)}(hhh]h)}(h(flags hcd should use to allocate memory.h]h(flags hcd should use to allocate memory.}(hjFWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBWhM hjCWubah}(h]h ]h"]h$]h&]uh1jThj'Wubeh}(h]h ]h"]h$]h&]uh1j4hjBWhM hjyVubeh}(h]h ]h"]h$]h&]uh1j/hj]Vubh)}(h**Description**h]j)}(hjhWh]h Description}(hjjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfWubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj]Vubh)}(hyReverts a group of bulk endpoints back to not using stream IDs. Can fail if we are given bad arguments, or HCD is broken.h]hyReverts a group of bulk endpoints back to not using stream IDs. Can fail if we are given bad arguments, or HCD is broken.}(hj~WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj]Vubh)}(h **Return**h]j)}(hjWh]hReturn}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj]Vubh)}(h00 on success. On failure, a negative error code.h]h00 on success. On failure, a negative error code.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMhj]Vubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$usb_hcd_resume_root_hub (C function)c.usb_hcd_resume_root_hubhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h2void usb_hcd_resume_root_hub (struct usb_hcd *hcd)h]j)}(h1void usb_hcd_resume_root_hub(struct usb_hcd *hcd)h](j@)}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjWhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMQ ubj/)}(h h]h }(hjWhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjWhhhjWhMQ ubjp)}(husb_hcd_resume_root_hubh]jv)}(husb_hcd_resume_root_hubh]husb_hcd_resume_root_hub}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjWubah}(h]h ](jjeh"]h$]h&]jjuh1johjWhhhjWhMQ ubj)}(h(struct usb_hcd *hcd)h]j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjXhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj Xubj/)}(h h]h }(hjXhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj Xubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj/XhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj,Xubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj1XmodnameN classnameNj8j;)}j>]jA)}j4jWsbc.usb_hcd_resume_root_hubasbuh1hhj Xubj/)}(h h]h }(hjOXhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj Xubj_)}(hjbh]h*}(hj]XhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj Xubjv)}(hhcdh]hhcd}(hjjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj Xubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj Xubah}(h]h ]h"]h$]h&]jjuh1jhjWhhhjWhMQ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjWhhhjWhMQ ubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhjWhMQ hjWhhubj)}(hhh]h)}(h$called by HCD to resume its root hubh]h$called by HCD to resume its root hub}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMI hjXhhubah}(h]h ]h"]h$]h&]uh1jhjWhhhjWhMQ ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jXj jXj j juh1j hhhjBhNhNubj)}(hXh**Parameters** ``struct usb_hcd *hcd`` host controller for this root hub **Description** The USB host controller calls this function when its root hub is suspended (with the remote wakeup feature enabled) and a remote wakeup request is received. The routine submits a workqueue request to resume the root hub (that is, manage its downstream ports again).h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMM hjXubj0)}(hhh]j5)}(h:``struct usb_hcd *hcd`` host controller for this root hub h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjXh]hstruct usb_hcd *hcd}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMJ hjXubjU)}(hhh]h)}(h!host controller for this root hubh]h!host controller for this root hub}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMJ hjXubah}(h]h ]h"]h$]h&]uh1jThjXubeh}(h]h ]h"]h$]h&]uh1j4hjXhMJ hjXubah}(h]h ]h"]h$]h&]uh1j/hjXubh)}(h**Description**h]j)}(hjYh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chML hjXubh)}(hX The USB host controller calls this function when its root hub is suspended (with the remote wakeup feature enabled) and a remote wakeup request is received. The routine submits a workqueue request to resume the root hub (that is, manage its downstream ports again).h]hX The USB host controller calls this function when its root hub is suspended (with the remote wakeup feature enabled) and a remote wakeup request is received. The routine submits a workqueue request to resume the root hub (that is, manage its downstream ports again).}(hj&YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chML hjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_bus_start_enum (C function)c.usb_bus_start_enumhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h?int usb_bus_start_enum (struct usb_bus *bus, unsigned port_num)h]j)}(h>int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num)h](j@)}(hinth]hint}(hjUYhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjQYhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMr ubj/)}(h h]h }(hjdYhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjQYhhhjcYhMr ubjp)}(husb_bus_start_enumh]jv)}(husb_bus_start_enumh]husb_bus_start_enum}(hjvYhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjrYubah}(h]h ](jjeh"]h$]h&]jjuh1johjQYhhhjcYhMr ubj)}(h((struct usb_bus *bus, unsigned port_num)h](j)}(hstruct usb_bus *bush](j)}(hjh]hstruct}(hjYhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjYubj/)}(h h]h }(hjYhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubh)}(hhh]jv)}(husb_bush]husb_bus}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjYubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjYmodnameN classnameNj8j;)}j>]jA)}j4jxYsbc.usb_bus_start_enumasbuh1hhjYubj/)}(h h]h }(hjYhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYubj_)}(hjbh]h*}(hjYhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjYubjv)}(hbush]hbus}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubj)}(hunsigned port_numh](j@)}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjZubj/)}(h h]h }(hjZhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjZubjv)}(hport_numh]hport_num}(hj ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubeh}(h]h ]h"]h$]h&]jjuh1jhjQYhhhjcYhMr ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjMYhhhjcYhMr ubah}(h]jHYah ](jjeh"]h$]h&]jj)jhuh1jhjcYhMr hjJYhhubj)}(hhh]h)}(h%start immediate enumeration (for OTG)h]h%start immediate enumeration (for OTG)}(hjJZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMf hjGZhhubah}(h]h ]h"]h$]h&]uh1jhjJYhhhjcYhMr ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jbZj jbZj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_bus *bus`` the bus (must use hcd framework) ``unsigned port_num`` 1-based number of port; usually bus->otg_port **Context** atomic **Description** Starts enumeration, with an immediate reset followed later by hub_wq identifying and possibly configuring the device. This is needed by OTG controller drivers, where it helps meet HNP protocol timing requirements for starting a port reset. **Return** 0 if successful.h](h)}(h**Parameters**h]j)}(hjlZh]h Parameters}(hjnZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjZubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMj hjfZubj0)}(hhh](j5)}(h9``struct usb_bus *bus`` the bus (must use hcd framework) h](j;)}(h``struct usb_bus *bus``h]j)}(hjZh]hstruct usb_bus *bus}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMg hjZubjU)}(hhh]h)}(h the bus (must use hcd framework)h]h the bus (must use hcd framework)}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMg hjZubah}(h]h ]h"]h$]h&]uh1jThjZubeh}(h]h ]h"]h$]h&]uh1j4hjZhMg hjZubj5)}(hD``unsigned port_num`` 1-based number of port; usually bus->otg_port h](j;)}(h``unsigned port_num``h]j)}(hjZh]hunsigned port_num}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMh hjZubjU)}(hhh]h)}(h-1-based number of port; usually bus->otg_porth]h-1-based number of port; usually bus->otg_port}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMh hjZubah}(h]h ]h"]h$]h&]uh1jThjZubeh}(h]h ]h"]h$]h&]uh1j4hjZhMh hjZubeh}(h]h ]h"]h$]h&]uh1j/hjfZubh)}(h **Context**h]j)}(hjZh]hContext}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMj hjfZubh)}(hatomich]hatomic}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMi hjfZubh)}(h**Description**h]j)}(hj&[h]h Description}(hj([hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$[ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMk hjfZubh)}(hStarts enumeration, with an immediate reset followed later by hub_wq identifying and possibly configuring the device. This is needed by OTG controller drivers, where it helps meet HNP protocol timing requirements for starting a port reset.h]hStarts enumeration, with an immediate reset followed later by hub_wq identifying and possibly configuring the device. This is needed by OTG controller drivers, where it helps meet HNP protocol timing requirements for starting a port reset.}(hj<[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMj hjfZubh)}(h **Return**h]j)}(hjM[h]hReturn}(hjO[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK[ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMo hjfZubh)}(h0 if successful.h]h0 if successful.}(hjc[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMp hjfZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_hcd_irq (C function) c.usb_hcd_irqhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h.irqreturn_t usb_hcd_irq (int irq, void *__hcd)h]j)}(h-irqreturn_t usb_hcd_irq(int irq, void *__hcd)h](h)}(hhh]jv)}(h irqreturn_th]h irqreturn_t}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj[modnameN classnameNj8j;)}j>]jA)}j4 usb_hcd_irqsb c.usb_hcd_irqasbuh1hhj[hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM ubj/)}(h h]h }(hj[hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj[hhhj[hM ubjp)}(h usb_hcd_irqh]jv)}(hj[h]h usb_hcd_irq}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1johj[hhhj[hM ubj)}(h(int irq, void *__hcd)h](j)}(hint irqh](j@)}(hinth]hint}(hj[hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj[ubj/)}(h h]h }(hj[hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj[ubjv)}(hirqh]hirq}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubj)}(h void *__hcdh](j@)}(hvoidh]hvoid}(hj\hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj\ubj/)}(h h]h }(hj'\hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj\ubj_)}(hjbh]h*}(hj5\hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj\ubjv)}(h__hcdh]h__hcd}(hjB\hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubeh}(h]h ]h"]h$]h&]jjuh1jhj[hhhj[hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj[hhhj[hM ubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jhj[hM hj[hhubj)}(hhh]h)}(h%hook IRQs to HCD framework (bus glue)h]h%hook IRQs to HCD framework (bus glue)}(hjl\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hji\hhubah}(h]h ]h"]h$]h&]uh1jhj[hhhj[hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j\j j\j j juh1j hhhjBhNhNubj)}(hX>**Parameters** ``int irq`` the IRQ being raised ``void *__hcd`` pointer to the HCD whose IRQ is being signaled **Description** If the controller isn't HALTed, calls the driver's irq handler. Checks whether the controller is now dead. **Return** ``IRQ_HANDLED`` if the IRQ was handled. ``IRQ_NONE`` otherwise.h](h)}(h**Parameters**h]j)}(hj\h]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubj0)}(hhh](j5)}(h!``int irq`` the IRQ being raised h](j;)}(h ``int irq``h]j)}(hj\h]hint irq}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubjU)}(hhh]h)}(hthe IRQ being raisedh]hthe IRQ being raised}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1jThj\ubeh}(h]h ]h"]h$]h&]uh1j4hj\hM hj\ubj5)}(h?``void *__hcd`` pointer to the HCD whose IRQ is being signaled h](j;)}(h``void *__hcd``h]j)}(hj\h]h void *__hcd}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubjU)}(hhh]h)}(h.pointer to the HCD whose IRQ is being signaledh]h.pointer to the HCD whose IRQ is being signaled}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1jThj\ubeh}(h]h ]h"]h$]h&]uh1j4hj\hM hj\ubeh}(h]h ]h"]h$]h&]uh1j/hj\ubh)}(h**Description**h]j)}(hj!]h]h Description}(hj#]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubh)}(hjIf the controller isn't HALTed, calls the driver's irq handler. Checks whether the controller is now dead.h]hnIf the controller isn’t HALTed, calls the driver’s irq handler. Checks whether the controller is now dead.}(hj7]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubh)}(h **Return**h]j)}(hjH]h]hReturn}(hjJ]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF]ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubh)}(h?``IRQ_HANDLED`` if the IRQ was handled. ``IRQ_NONE`` otherwise.h](j)}(h``IRQ_HANDLED``h]h IRQ_HANDLED}(hjb]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^]ubh if the IRQ was handled. }(hj^]hhhNhNubj)}(h ``IRQ_NONE``h]hIRQ_NONE}(hjt]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^]ubh otherwise.}(hj^]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_hc_died (C function) c.usb_hc_diedhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h&void usb_hc_died (struct usb_hcd *hcd)h]j)}(h%void usb_hc_died(struct usb_hcd *hcd)h](j@)}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj]hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM ubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj]hhhj]hM ubjp)}(h usb_hc_diedh]jv)}(h usb_hc_diedh]h usb_hc_died}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1johj]hhhj]hM ubj)}(h(struct usb_hcd *hcd)h]j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj]ubj/)}(h h]h }(hj]hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj]ubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj ^modnameN classnameNj8j;)}j>]jA)}j4j]sb c.usb_hc_diedasbuh1hhj]ubj/)}(h h]h }(hj(^hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj]ubj_)}(hjbh]h*}(hj6^hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj]ubjv)}(hhcdh]hhcd}(hjC^hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubah}(h]h ]h"]h$]h&]jjuh1jhj]hhhj]hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhj]hM ubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhj]hM hj]hhubj)}(hhh]h)}(h8report abnormal shutdown of a host controller (bus glue)h]h8report abnormal shutdown of a host controller (bus glue)}(hjm^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjj^hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j^j j^j j juh1j hhhjBhNhNubj)}(hXp**Parameters** ``struct usb_hcd *hcd`` pointer to the HCD representing the controller **Description** This is called by bus glue to report a USB host controller that died while operations may still have been pending. It's called automatically by the PCI glue, so only glue for non-PCI busses should need to call it. Only call this function with the primary HCD.h](h)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj^ubj0)}(hhh]j5)}(hG``struct usb_hcd *hcd`` pointer to the HCD representing the controller h](j;)}(h``struct usb_hcd *hcd``h]j)}(hj^h]hstruct usb_hcd *hcd}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj^ubjU)}(hhh]h)}(h.pointer to the HCD representing the controllerh]h.pointer to the HCD representing the controller}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM hj^ubah}(h]h ]h"]h$]h&]uh1jThj^ubeh}(h]h ]h"]h$]h&]uh1j4hj^hM hj^ubah}(h]h ]h"]h$]h&]uh1j/hj^ubh)}(h**Description**h]j)}(hj^h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj^ubh)}(hThis is called by bus glue to report a USB host controller that died while operations may still have been pending. It's called automatically by the PCI glue, so only glue for non-PCI busses should need to call it.h]hThis is called by bus glue to report a USB host controller that died while operations may still have been pending. It’s called automatically by the PCI glue, so only glue for non-PCI busses should need to call it.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj^ubh)}(h-Only call this function with the primary HCD.h]h-Only call this function with the primary HCD.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"usb_create_shared_hcd (C function)c.usb_create_shared_hcdhNtauh1jhjBhhhNhNubj )}(hhh](j)}(hstruct usb_hcd * usb_create_shared_hcd (const struct hc_driver *driver, struct device *dev, const char *bus_name, struct usb_hcd *primary_hcd)h]j)}(hstruct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, struct device *dev, const char *bus_name, struct usb_hcd *primary_hcd)h](j)}(hjh]hstruct}(hj=_hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj9_hhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMA ubj/)}(h h]h }(hjK_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9_hhhjJ_hMA ubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj\_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjY_ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj^_modnameN classnameNj8j;)}j>]jA)}j4usb_create_shared_hcdsbc.usb_create_shared_hcdasbuh1hhj9_hhhjJ_hMA ubj/)}(h h]h }(hj}_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj9_hhhjJ_hMA ubj_)}(hjbh]h*}(hj_hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj9_hhhjJ_hMA ubjp)}(husb_create_shared_hcdh]jv)}(hjz_h]husb_create_shared_hcd}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1johj9_hhhjJ_hMA ubj)}(hg(const struct hc_driver *driver, struct device *dev, const char *bus_name, struct usb_hcd *primary_hcd)h](j)}(hconst struct hc_driver *driverh](j)}(hj h]hconst}(hj_hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj_ubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_ubj)}(hjh]hstruct}(hj_hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj_ubj/)}(h h]h }(hj_hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_ubh)}(hhh]jv)}(h hc_driverh]h hc_driver}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj_modnameN classnameNj8j;)}j>]jx_c.usb_create_shared_hcdasbuh1hhj_ubj/)}(h h]h }(hj`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj_ubj_)}(hjbh]h*}(hj`hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj_ubjv)}(hdriverh]hdriver}(hj)`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hstruct device *devh](j)}(hjh]hstruct}(hjB`hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj>`ubj/)}(h h]h }(hjO`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj>`ubh)}(hhh]jv)}(hdeviceh]hdevice}(hj``hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj]`ubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjb`modnameN classnameNj8j;)}j>]jx_c.usb_create_shared_hcdasbuh1hhj>`ubj/)}(h h]h }(hj~`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj>`ubj_)}(hjbh]h*}(hj`hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj>`ubjv)}(hdevh]hdev}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj>`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hconst char *bus_nameh](j)}(hj h]hconst}(hj`hhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj`ubj/)}(h h]h }(hj`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj`ubj@)}(hcharh]hchar}(hj`hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj`ubj/)}(h h]h }(hj`hhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj`ubj_)}(hjbh]h*}(hj`hhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj`ubjv)}(hbus_nameh]hbus_name}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hstruct usb_hcd *primary_hcdh](j)}(hjh]hstruct}(hjahhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj aubj/)}(h h]h }(hjahhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj aubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj-ahhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*aubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj/amodnameN classnameNj8j;)}j>]jx_c.usb_create_shared_hcdasbuh1hhj aubj/)}(h h]h }(hjKahhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj aubj_)}(hjbh]h*}(hjYahhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj aubjv)}(h primary_hcdh]h primary_hcd}(hjfahhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj aubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubeh}(h]h ]h"]h$]h&]jjuh1jhj9_hhhjJ_hMA ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5_hhhjJ_hMA ubah}(h]j0_ah ](jjeh"]h$]h&]jj)jhuh1jhjJ_hMA hj2_hhubj)}(hhh]h)}(h&create and initialize an HCD structureh]h&create and initialize an HCD structure}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM1 hjahhubah}(h]h ]h"]h$]h&]uh1jhj2_hhhjJ_hMA ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jaj jaj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``const struct hc_driver *driver`` HC driver that will use this hcd ``struct device *dev`` device for this HC, stored in hcd->self.controller ``const char *bus_name`` value to store in hcd->self.bus_name ``struct usb_hcd *primary_hcd`` a pointer to the usb_hcd structure that is sharing the PCI device. Only allocate certain resources for the primary HCD **Context** task context, might sleep. **Description** Allocate a struct usb_hcd, with extra space at the end for the HC driver's private data. Initialize the generic members of the hcd structure. **Return** On success, a pointer to the created and initialized HCD structure. On failure (e.g. if memory is unavailable), ``NULL``.h](h)}(h**Parameters**h]j)}(hjah]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM5 hjaubj0)}(hhh](j5)}(hD``const struct hc_driver *driver`` HC driver that will use this hcd h](j;)}(h"``const struct hc_driver *driver``h]j)}(hjah]hconst struct hc_driver *driver}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM2 hjaubjU)}(hhh]h)}(h HC driver that will use this hcdh]h HC driver that will use this hcd}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahM2 hjaubah}(h]h ]h"]h$]h&]uh1jThjaubeh}(h]h ]h"]h$]h&]uh1j4hjahM2 hjaubj5)}(hJ``struct device *dev`` device for this HC, stored in hcd->self.controller h](j;)}(h``struct device *dev``h]j)}(hj bh]hstruct device *dev}(hj bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM3 hjbubjU)}(hhh]h)}(h2device for this HC, stored in hcd->self.controllerh]h2device for this HC, stored in hcd->self.controller}(hj#bhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhM3 hj bubah}(h]h ]h"]h$]h&]uh1jThjbubeh}(h]h ]h"]h$]h&]uh1j4hjbhM3 hjaubj5)}(h>``const char *bus_name`` value to store in hcd->self.bus_name h](j;)}(h``const char *bus_name``h]j)}(hjCbh]hconst char *bus_name}(hjEbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAbubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM4 hj=bubjU)}(hhh]h)}(h$value to store in hcd->self.bus_nameh]h$value to store in hcd->self.bus_name}(hj\bhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXbhM4 hjYbubah}(h]h ]h"]h$]h&]uh1jThj=bubeh}(h]h ]h"]h$]h&]uh1j4hjXbhM4 hjaubj5)}(h``struct usb_hcd *primary_hcd`` a pointer to the usb_hcd structure that is sharing the PCI device. Only allocate certain resources for the primary HCD h](j;)}(h``struct usb_hcd *primary_hcd``h]j)}(hj|bh]hstruct usb_hcd *primary_hcd}(hj~bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzbubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM6 hjvbubjU)}(hhh]h)}(hwa pointer to the usb_hcd structure that is sharing the PCI device. Only allocate certain resources for the primary HCDh]hwa pointer to the usb_hcd structure that is sharing the PCI device. Only allocate certain resources for the primary HCD}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM5 hjbubah}(h]h ]h"]h$]h&]uh1jThjvbubeh}(h]h ]h"]h$]h&]uh1j4hjbhM6 hjaubeh}(h]h ]h"]h$]h&]uh1j/hjaubh)}(h **Context**h]j)}(hjbh]hContext}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM8 hjaubh)}(htask context, might sleep.h]htask context, might sleep.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM8 hjaubh)}(h**Description**h]j)}(hjbh]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM: hjaubh)}(hAllocate a struct usb_hcd, with extra space at the end for the HC driver's private data. Initialize the generic members of the hcd structure.h]hAllocate a struct usb_hcd, with extra space at the end for the HC driver’s private data. Initialize the generic members of the hcd structure.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM9 hjaubh)}(h **Return**h]j)}(hjch]hReturn}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM= hjaubh)}(hyOn success, a pointer to the created and initialized HCD structure. On failure (e.g. if memory is unavailable), ``NULL``.h](hpOn success, a pointer to the created and initialized HCD structure. On failure (e.g. if memory is unavailable), }(hjchhhNhNubj)}(h``NULL``h]hNULL}(hj$chhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM> hjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_create_hcd (C function)c.usb_create_hcdhNtauh1jhjBhhhNhNubj )}(hhh](j)}(hjstruct usb_hcd * usb_create_hcd (const struct hc_driver *driver, struct device *dev, const char *bus_name)h]j)}(hhstruct usb_hcd *usb_create_hcd(const struct hc_driver *driver, struct device *dev, const char *bus_name)h](j)}(hjh]hstruct}(hj]chhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjYchhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMX ubj/)}(h h]h }(hjkchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYchhhjjchMX ubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj|chhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjycubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj~cmodnameN classnameNj8j;)}j>]jA)}j4usb_create_hcdsbc.usb_create_hcdasbuh1hhjYchhhjjchMX ubj/)}(h h]h }(hjchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjYchhhjjchMX ubj_)}(hjbh]h*}(hjchhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjYchhhjjchMX ubjp)}(husb_create_hcdh]jv)}(hjch]husb_create_hcd}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjcubah}(h]h ](jjeh"]h$]h&]jjuh1johjYchhhjjchMX ubj)}(hJ(const struct hc_driver *driver, struct device *dev, const char *bus_name)h](j)}(hconst struct hc_driver *driverh](j)}(hj h]hconst}(hjchhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjcubj/)}(h h]h }(hjchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjcubj)}(hjh]hstruct}(hjchhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjcubj/)}(h h]h }(hjchhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjcubh)}(hhh]jv)}(h hc_driverh]h hc_driver}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj dubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjdmodnameN classnameNj8j;)}j>]jcc.usb_create_hcdasbuh1hhjcubj/)}(h h]h }(hj.dhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjcubj_)}(hjbh]h*}(hj]jcc.usb_create_hcdasbuh1hhj^dubj/)}(h h]h }(hjdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj^dubj_)}(hjbh]h*}(hjdhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj^dubjv)}(hdevh]hdev}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj^dubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hconst char *bus_nameh](j)}(hj h]hconst}(hjdhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjdubj/)}(h h]h }(hjdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjdubj@)}(hcharh]hchar}(hjdhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjdubj/)}(h h]h }(hjdhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjdubj_)}(hjbh]h*}(hj ehhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjdubjv)}(hbus_nameh]hbus_name}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubeh}(h]h ]h"]h$]h&]jjuh1jhjYchhhjjchMX ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjUchhhjjchMX ubah}(h]jPcah ](jjeh"]h$]h&]jj)jhuh1jhjjchMX hjRchhubj)}(hhh]h)}(h&create and initialize an HCD structureh]h&create and initialize an HCD structure}(hj@ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMJ hj=ehhubah}(h]h ]h"]h$]h&]uh1jhjRchhhjjchMX ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jXej jXej j juh1j hhhjBhNhNubj)}(hX4**Parameters** ``const struct hc_driver *driver`` HC driver that will use this hcd ``struct device *dev`` device for this HC, stored in hcd->self.controller ``const char *bus_name`` value to store in hcd->self.bus_name **Context** task context, might sleep. **Description** Allocate a struct usb_hcd, with extra space at the end for the HC driver's private data. Initialize the generic members of the hcd structure. **Return** On success, a pointer to the created and initialized HCD structure. On failure (e.g. if memory is unavailable), ``NULL``.h](h)}(h**Parameters**h]j)}(hjbeh]h Parameters}(hjdehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`eubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMN hj\eubj0)}(hhh](j5)}(hD``const struct hc_driver *driver`` HC driver that will use this hcd h](j;)}(h"``const struct hc_driver *driver``h]j)}(hjeh]hconst struct hc_driver *driver}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMK hj{eubjU)}(hhh]h)}(h HC driver that will use this hcdh]h HC driver that will use this hcd}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMK hjeubah}(h]h ]h"]h$]h&]uh1jThj{eubeh}(h]h ]h"]h$]h&]uh1j4hjehMK hjxeubj5)}(hJ``struct device *dev`` device for this HC, stored in hcd->self.controller h](j;)}(h``struct device *dev``h]j)}(hjeh]hstruct device *dev}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chML hjeubjU)}(hhh]h)}(h2device for this HC, stored in hcd->self.controllerh]h2device for this HC, stored in hcd->self.controller}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehML hjeubah}(h]h ]h"]h$]h&]uh1jThjeubeh}(h]h ]h"]h$]h&]uh1j4hjehML hjxeubj5)}(h>``const char *bus_name`` value to store in hcd->self.bus_name h](j;)}(h``const char *bus_name``h]j)}(hjeh]hconst char *bus_name}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMM hjeubjU)}(hhh]h)}(h$value to store in hcd->self.bus_nameh]h$value to store in hcd->self.bus_name}(hj fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMM hj fubah}(h]h ]h"]h$]h&]uh1jThjeubeh}(h]h ]h"]h$]h&]uh1j4hjfhMM hjxeubeh}(h]h ]h"]h$]h&]uh1j/hj\eubh)}(h **Context**h]j)}(hj.fh]hContext}(hj0fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,fubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMO hj\eubh)}(htask context, might sleep.h]htask context, might sleep.}(hjDfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMO hj\eubh)}(h**Description**h]j)}(hjUfh]h Description}(hjWfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSfubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMQ hj\eubh)}(hAllocate a struct usb_hcd, with extra space at the end for the HC driver's private data. Initialize the generic members of the hcd structure.h]hAllocate a struct usb_hcd, with extra space at the end for the HC driver’s private data. Initialize the generic members of the hcd structure.}(hjkfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMP hj\eubh)}(h **Return**h]j)}(hj|fh]hReturn}(hj~fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzfubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMT hj\eubh)}(hyOn success, a pointer to the created and initialized HCD structure. On failure (e.g. if memory is unavailable), ``NULL``.h](hpOn success, a pointer to the created and initialized HCD structure. On failure (e.g. if memory is unavailable), }(hjfhhhNhNubj)}(h``NULL``h]hNULL}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chMU hj\eubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_add_hcd (C function) c.usb_add_hcdhNtauh1jhjBhhhNhNubj )}(hhh](j)}(hRint usb_add_hcd (struct usb_hcd *hcd, unsigned int irqnum, unsigned long irqflags)h]j)}(hQint usb_add_hcd(struct usb_hcd *hcd, unsigned int irqnum, unsigned long irqflags)h](j@)}(hinth]hint}(hjfhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjfhhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM ubj/)}(h h]h }(hjfhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjfhhhjfhM ubjp)}(h usb_add_hcdh]jv)}(h usb_add_hcdh]h usb_add_hcd}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjfubah}(h]h ](jjeh"]h$]h&]jjuh1johjfhhhjfhM ubj)}(hB(struct usb_hcd *hcd, unsigned int irqnum, unsigned long irqflags)h](j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjghhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhj gubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj gubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hj.ghhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj+gubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj0gmodnameN classnameNj8j;)}j>]jA)}j4jfsb c.usb_add_hcdasbuh1hhj gubj/)}(h h]h }(hjNghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj gubj_)}(hjbh]h*}(hj\ghhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hj gubjv)}(hhcdh]hhcd}(hjighhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj gubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(hunsigned int irqnumh](j@)}(hunsignedh]hunsigned}(hjghhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj~gubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj~gubj@)}(hinth]hint}(hjghhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj~gubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj~gubjv)}(hirqnumh]hirqnum}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj~gubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(hunsigned long irqflagsh](j@)}(hunsignedh]hunsigned}(hjghhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjgubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubj@)}(hlongh]hlong}(hjghhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjgubj/)}(h h]h }(hjghhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjgubjv)}(hirqflagsh]hirqflags}(hj hhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubeh}(h]h ]h"]h$]h&]jjuh1jhjfhhhjfhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhjfhM ubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjfhM hjfhhubj)}(hhh]h)}(h8finish generic HCD structure initialization and registerh]h8finish generic HCD structure initialization and register}(hj5hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj2hhhubah}(h]h ]h"]h$]h&]uh1jhjfhhhjfhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jMhj jMhj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_hcd *hcd`` the usb_hcd structure to initialize ``unsigned int irqnum`` Interrupt line to allocate ``unsigned long irqflags`` Interrupt type flags **Description** Finish the remaining parts of generic HCD initialization: allocate the buffers of consistent memory, register the bus, request the IRQ line, and call the driver's reset() and start() routines.h](h)}(h**Parameters**h]j)}(hjWhh]h Parameters}(hjYhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUhubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjQhubj0)}(hhh](j5)}(h<``struct usb_hcd *hcd`` the usb_hcd structure to initialize h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjvhh]hstruct usb_hcd *hcd}(hjxhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjphubjU)}(hhh]h)}(h#the usb_hcd structure to initializeh]h#the usb_hcd structure to initialize}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhM hjhubah}(h]h ]h"]h$]h&]uh1jThjphubeh}(h]h ]h"]h$]h&]uh1j4hjhhM hjmhubj5)}(h3``unsigned int irqnum`` Interrupt line to allocate h](j;)}(h``unsigned int irqnum``h]j)}(hjhh]hunsigned int irqnum}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjhubjU)}(hhh]h)}(hInterrupt line to allocateh]hInterrupt line to allocate}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhM hjhubah}(h]h ]h"]h$]h&]uh1jThjhubeh}(h]h ]h"]h$]h&]uh1j4hjhhM hjmhubj5)}(h0``unsigned long irqflags`` Interrupt type flags h](j;)}(h``unsigned long irqflags``h]j)}(hjhh]hunsigned long irqflags}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjhubjU)}(hhh]h)}(hInterrupt type flagsh]hInterrupt type flags}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhM hjhubah}(h]h ]h"]h$]h&]uh1jThjhubeh}(h]h ]h"]h$]h&]uh1j4hjhhM hjmhubeh}(h]h ]h"]h$]h&]uh1j/hjQhubh)}(h**Description**h]j)}(hj#ih]h Description}(hj%ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!iubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjQhubh)}(hFinish the remaining parts of generic HCD initialization: allocate the buffers of consistent memory, register the bus, request the IRQ line, and call the driver's reset() and start() routines.h]hFinish the remaining parts of generic HCD initialization: allocate the buffers of consistent memory, register the bus, request the IRQ line, and call the driver’s reset() and start() routines.}(hj9ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjQhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_remove_hcd (C function)c.usb_remove_hcdhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h)void usb_remove_hcd (struct usb_hcd *hcd)h]j)}(h(void usb_remove_hcd(struct usb_hcd *hcd)h](j@)}(hvoidh]hvoid}(hjhihhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjdihhhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM ubj/)}(h h]h }(hjwihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjdihhhjvihM ubjp)}(husb_remove_hcdh]jv)}(husb_remove_hcdh]husb_remove_hcd}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubah}(h]h ](jjeh"]h$]h&]jjuh1johjdihhhjvihM ubj)}(h(struct usb_hcd *hcd)h]j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjihhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjiubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjiubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjimodnameN classnameNj8j;)}j>]jA)}j4jisbc.usb_remove_hcdasbuh1hhjiubj/)}(h h]h }(hjihhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjiubj_)}(hjbh]h*}(hjihhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjiubjv)}(hhcdh]hhcd}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubah}(h]h ]h"]h$]h&]jjuh1jhjdihhhjvihM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`ihhhjvihM ubah}(h]j[iah ](jjeh"]h$]h&]jj)jhuh1jhjvihM hj]ihhubj)}(hhh]h)}(h$shutdown processing for generic HCDsh]h$shutdown processing for generic HCDs}(hj(jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hj%jhhubah}(h]h ]h"]h$]h&]uh1jhj]ihhhjvihM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j@jj j@jj j juh1j hhhjBhNhNubj)}(h**Parameters** ``struct usb_hcd *hcd`` the usb_hcd structure to remove **Context** task context, might sleep. **Description** Disconnects the root hub, then reverses the effects of usb_add_hcd(), invoking the HCD's stop() method.h](h)}(h**Parameters**h]j)}(hjJjh]h Parameters}(hjLjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjDjubj0)}(hhh]j5)}(h8``struct usb_hcd *hcd`` the usb_hcd structure to remove h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjijh]hstruct usb_hcd *hcd}(hjkjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgjubah}(h]h ]h"]h$]h&]uh1j:hZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjcjubjU)}(hhh]h)}(hthe usb_hcd structure to removeh]hthe usb_hcd structure to remove}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~jhM hjjubah}(h]h ]h"]h$]h&]uh1jThjcjubeh}(h]h ]h"]h$]h&]uh1j4hj~jhM hj`jubah}(h]h ]h"]h$]h&]uh1j/hjDjubh)}(h **Context**h]j)}(hjjh]hContext}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjDjubh)}(htask context, might sleep.h]htask context, might sleep.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjDjubh)}(h**Description**h]j)}(hjjh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjDjubh)}(hgDisconnects the root hub, then reverses the effects of usb_add_hcd(), invoking the HCD's stop() method.h]hiDisconnects the root hub, then reverses the effects of usb_add_hcd(), invoking the HCD’s stop() method.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:205: ./drivers/usb/core/hcd.chM hjDjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_hcd_pci_probe (C function)c.usb_hcd_pci_probehNtauh1jhjBhhhNhNubj )}(hhh](j)}(hKint usb_hcd_pci_probe (struct pci_dev *dev, const struct hc_driver *driver)h]j)}(hJint usb_hcd_pci_probe(struct pci_dev *dev, const struct hc_driver *driver)h](j@)}(hinth]hint}(hjkhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj khhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKubj/)}(h h]h }(hjkhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hj khhhjkhKubjp)}(husb_hcd_pci_probeh]jv)}(husb_hcd_pci_probeh]husb_hcd_pci_probe}(hj1khhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj-kubah}(h]h ](jjeh"]h$]h&]jjuh1johj khhhjkhKubj)}(h5(struct pci_dev *dev, const struct hc_driver *driver)h](j)}(hstruct pci_dev *devh](j)}(hjh]hstruct}(hjMkhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjIkubj/)}(h h]h }(hjZkhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjIkubh)}(hhh]jv)}(hpci_devh]hpci_dev}(hjkkhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhkubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjmkmodnameN classnameNj8j;)}j>]jA)}j4j3ksbc.usb_hcd_pci_probeasbuh1hhjIkubj/)}(h h]h }(hjkhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjIkubj_)}(hjbh]h*}(hjkhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjIkubjv)}(hdevh]hdev}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjIkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEkubj)}(hconst struct hc_driver *driverh](j)}(hj h]hconst}(hjkhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjkubj/)}(h h]h }(hjkhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjkubj)}(hjh]hstruct}(hjkhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjkubj/)}(h h]h }(hjkhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjkubh)}(hhh]jv)}(h hc_driverh]h hc_driver}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjkubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjkmodnameN classnameNj8j;)}j>]jkc.usb_hcd_pci_probeasbuh1hhjkubj/)}(h h]h }(hjlhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjkubj_)}(hjbh]h*}(hj$lhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjkubjv)}(hdriverh]hdriver}(hj1lhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEkubeh}(h]h ]h"]h$]h&]jjuh1jhj khhhjkhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjkhKubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjkhKhjkhhubj)}(hhh]h)}(hinitialize PCI-based HCDsh]hinitialize PCI-based HCDs}(hj[lhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjXlhhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjkhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jslj jslj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct pci_dev *dev`` USB Host Controller being probed ``const struct hc_driver *driver`` USB HC driver handle **Context** task context, might sleep **Description** Allocates basic PCI resources for this USB host controller, and then invokes the start() method for the HCD associated with it through the hotplug entry's driver_data. Store this function in the HCD's struct pci_driver as probe(). **Return** 0 if successful.h](h)}(h**Parameters**h]j)}(hj}lh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{lubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubj0)}(hhh](j5)}(h9``struct pci_dev *dev`` USB Host Controller being probed h](j;)}(h``struct pci_dev *dev``h]j)}(hjlh]hstruct pci_dev *dev}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjlubjU)}(hhh]h)}(h USB Host Controller being probedh]h USB Host Controller being probed}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhKhjlubah}(h]h ]h"]h$]h&]uh1jThjlubeh}(h]h ]h"]h$]h&]uh1j4hjlhKhjlubj5)}(h8``const struct hc_driver *driver`` USB HC driver handle h](j;)}(h"``const struct hc_driver *driver``h]j)}(hjlh]hconst struct hc_driver *driver}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjlubjU)}(hhh]h)}(hUSB HC driver handleh]hUSB HC driver handle}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhKhjlubah}(h]h ]h"]h$]h&]uh1jThjlubeh}(h]h ]h"]h$]h&]uh1j4hjlhKhjlubeh}(h]h ]h"]h$]h&]uh1j/hjwlubh)}(h **Context**h]j)}(hjmh]hContext}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubh)}(htask context, might sleeph]htask context, might sleep}(hj&mhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubh)}(h**Description**h]j)}(hj7mh]h Description}(hj9mhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5mubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubh)}(hAllocates basic PCI resources for this USB host controller, and then invokes the start() method for the HCD associated with it through the hotplug entry's driver_data.h]hAllocates basic PCI resources for this USB host controller, and then invokes the start() method for the HCD associated with it through the hotplug entry’s driver_data.}(hjMmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubh)}(h>Store this function in the HCD's struct pci_driver as probe().h]h@Store this function in the HCD’s struct pci_driver as probe().}(hj\mhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubh)}(h **Return**h]j)}(hjmmh]hReturn}(hjomhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkmubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubh)}(h0 if successful.h]h0 if successful.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chKhjwlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jusb_hcd_pci_remove (C function)c.usb_hcd_pci_removehNtauh1jhjBhhhNhNubj )}(hhh](j)}(h-void usb_hcd_pci_remove (struct pci_dev *dev)h]j)}(h,void usb_hcd_pci_remove(struct pci_dev *dev)h](j@)}(hvoidh]hvoid}(hjmhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjmhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM7ubj/)}(h h]h }(hjmhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjmhhhjmhM7ubjp)}(husb_hcd_pci_removeh]jv)}(husb_hcd_pci_removeh]husb_hcd_pci_remove}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjmubah}(h]h ](jjeh"]h$]h&]jjuh1johjmhhhjmhM7ubj)}(h(struct pci_dev *dev)h]j)}(hstruct pci_dev *devh](j)}(hjh]hstruct}(hjmhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjmubj/)}(h h]h }(hjmhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjmubh)}(hhh]jv)}(hpci_devh]hpci_dev}(hj nhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj nubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjnmodnameN classnameNj8j;)}j>]jA)}j4jmsbc.usb_hcd_pci_removeasbuh1hhjmubj/)}(h h]h }(hj-nhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjmubj_)}(hjbh]h*}(hj;nhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjmubjv)}(hdevh]hdev}(hjHnhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjmubah}(h]h ]h"]h$]h&]jjuh1jhjmhhhjmhM7ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjmhhhjmhM7ubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1jhjmhM7hjmhhubj)}(hhh]h)}(h&shutdown processing for PCI-based HCDsh]h&shutdown processing for PCI-based HCDs}(hjrnhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM,hjonhhubah}(h]h ]h"]h$]h&]uh1jhjmhhhjmhM7ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jnj jnj j juh1j hhhjBhNhNubj)}(hXv**Parameters** ``struct pci_dev *dev`` USB Host Controller being removed **Context** task context, might sleep **Description** Reverses the effect of usb_hcd_pci_probe(), first invoking the HCD's stop() method. It is always called from a thread context, normally "rmmod", "apmd", or something similar. Store this function in the HCD's struct pci_driver as remove().h](h)}(h**Parameters**h]j)}(hjnh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM0hjnubj0)}(hhh]j5)}(h:``struct pci_dev *dev`` USB Host Controller being removed h](j;)}(h``struct pci_dev *dev``h]j)}(hjnh]hstruct pci_dev *dev}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM-hjnubjU)}(hhh]h)}(h!USB Host Controller being removedh]h!USB Host Controller being removed}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhM-hjnubah}(h]h ]h"]h$]h&]uh1jThjnubeh}(h]h ]h"]h$]h&]uh1j4hjnhM-hjnubah}(h]h ]h"]h$]h&]uh1j/hjnubh)}(h **Context**h]j)}(hjnh]hContext}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM/hjnubh)}(htask context, might sleeph]htask context, might sleep}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM/hjnubh)}(h**Description**h]j)}(hjoh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM1hjnubh)}(hReverses the effect of usb_hcd_pci_probe(), first invoking the HCD's stop() method. It is always called from a thread context, normally "rmmod", "apmd", or something similar.h]hReverses the effect of usb_hcd_pci_probe(), first invoking the HCD’s stop() method. It is always called from a thread context, normally “rmmod”, “apmd”, or something similar.}(hj+ohhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM0hjnubh)}(h?Store this function in the HCD's struct pci_driver as remove().h]hAStore this function in the HCD’s struct pci_driver as remove().}(hj:ohhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chM4hjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!usb_hcd_pci_shutdown (C function)c.usb_hcd_pci_shutdownhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h/void usb_hcd_pci_shutdown (struct pci_dev *dev)h]j)}(h.void usb_hcd_pci_shutdown(struct pci_dev *dev)h](j@)}(hvoidh]hvoid}(hjiohhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjeohhh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chMgubj/)}(h h]h }(hjxohhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjeohhhjwohMgubjp)}(husb_hcd_pci_shutdownh]jv)}(husb_hcd_pci_shutdownh]husb_hcd_pci_shutdown}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjoubah}(h]h ](jjeh"]h$]h&]jjuh1johjeohhhjwohMgubj)}(h(struct pci_dev *dev)h]j)}(hstruct pci_dev *devh](j)}(hjh]hstruct}(hjohhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjoubj/)}(h h]h }(hjohhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjoubh)}(hhh]jv)}(hpci_devh]hpci_dev}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjoubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjomodnameN classnameNj8j;)}j>]jA)}j4josbc.usb_hcd_pci_shutdownasbuh1hhjoubj/)}(h h]h }(hjohhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjoubj_)}(hjbh]h*}(hjohhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjoubjv)}(hdevh]hdev}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoubah}(h]h ]h"]h$]h&]jjuh1jhjeohhhjwohMgubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjaohhhjwohMgubah}(h]j\oah ](jjeh"]h$]h&]jj)jhuh1jhjwohMghj^ohhubj)}(hhh]h)}(hshutdown host controllerh]hshutdown host controller}(hj)phhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chMdhj&phhubah}(h]h ]h"]h$]h&]uh1jhj^ohhhjwohMgubeh}(h]h ](jfunctioneh"]h$]h&]j jj jApj jApj j juh1j hhhjBhNhNubj)}(hL**Parameters** ``struct pci_dev *dev`` USB Host Controller being shutdownh](h)}(h**Parameters**h]j)}(hjKph]h Parameters}(hjMphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIpubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chMhhjEpubj0)}(hhh]j5)}(h:``struct pci_dev *dev`` USB Host Controller being shutdownh](j;)}(h``struct pci_dev *dev``h]j)}(hjjph]hstruct pci_dev *dev}(hjlphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhpubah}(h]h ]h"]h$]h&]uh1j:h^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chMjhjdpubjU)}(hhh]h)}(h"USB Host Controller being shutdownh]h"USB Host Controller being shutdown}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:208: ./drivers/usb/core/hcd-pci.chMehjpubah}(h]h ]h"]h$]h&]uh1jThjdpubeh}(h]h ]h"]h$]h&]uh1j4hjphMjhjapubah}(h]h ]h"]h$]h&]uh1j/hjEpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jhcd_buffer_create (C function)c.hcd_buffer_createhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h+int hcd_buffer_create (struct usb_hcd *hcd)h]j)}(h*int hcd_buffer_create(struct usb_hcd *hcd)h](j@)}(hinth]hint}(hjphhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjphhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chKAubj/)}(h h]h }(hjphhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjphhhjphKAubjp)}(hhcd_buffer_createh]jv)}(hhcd_buffer_createh]hhcd_buffer_create}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjpubah}(h]h ](jjeh"]h$]h&]jjuh1johjphhhjphKAubj)}(h(struct usb_hcd *hcd)h]j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjqhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjpubj/)}(h h]h }(hjqhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjpubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjqubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetj!qmodnameN classnameNj8j;)}j>]jA)}j4jpsbc.hcd_buffer_createasbuh1hhjpubj/)}(h h]h }(hj?qhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjpubj_)}(hjbh]h*}(hjMqhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjpubjv)}(hhcdh]hhcd}(hjZqhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjpubah}(h]h ]h"]h$]h&]jjuh1jhjphhhjphKAubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhjphKAubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjphKAhjphhubj)}(hhh]h)}(hinitialize buffer poolsh]hinitialize buffer pools}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK4hjqhhubah}(h]h ]h"]h$]h&]uh1jhjphhhjphKAubeh}(h]h ](jfunctioneh"]h$]h&]j jj jqj jqj j juh1j hhhjBhNhNubj)}(hX**Parameters** ``struct usb_hcd *hcd`` the bus whose buffer pools are to be initialized **Context** task context, might sleep **Description** Call this as part of initializing a host controller that uses the dma memory allocators. It initializes some pools of dma-coherent memory that will be shared by all drivers using that controller. Call hcd_buffer_destroy() to clean up after using those pools. **Return** 0 if successful. A negative errno value otherwise.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK8hjqubj0)}(hhh]j5)}(hI``struct usb_hcd *hcd`` the bus whose buffer pools are to be initialized h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjqh]hstruct usb_hcd *hcd}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK5hjqubjU)}(hhh]h)}(h0the bus whose buffer pools are to be initializedh]h0the bus whose buffer pools are to be initialized}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhK5hjqubah}(h]h ]h"]h$]h&]uh1jThjqubeh}(h]h ]h"]h$]h&]uh1j4hjqhK5hjqubah}(h]h ]h"]h$]h&]uh1j/hjqubh)}(h **Context**h]j)}(hjrh]hContext}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK7hjqubh)}(htask context, might sleeph]htask context, might sleep}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK7hjqubh)}(h**Description**h]j)}(hj'rh]h Description}(hj)rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%rubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK9hjqubh)}(hCall this as part of initializing a host controller that uses the dma memory allocators. It initializes some pools of dma-coherent memory that will be shared by all drivers using that controller.h]hCall this as part of initializing a host controller that uses the dma memory allocators. It initializes some pools of dma-coherent memory that will be shared by all drivers using that controller.}(hj=rhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK8hjqubh)}(h>Call hcd_buffer_destroy() to clean up after using those pools.h]h>Call hcd_buffer_destroy() to clean up after using those pools.}(hjLrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chKhjqubh)}(h20 if successful. A negative errno value otherwise.h]h20 if successful. A negative errno value otherwise.}(hjsrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK?hjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jhcd_buffer_destroy (C function)c.hcd_buffer_destroyhNtauh1jhjBhhhNhNubj )}(hhh](j)}(h-void hcd_buffer_destroy (struct usb_hcd *hcd)h]j)}(h,void hcd_buffer_destroy(struct usb_hcd *hcd)h](j@)}(hvoidh]hvoid}(hjrhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjrhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chKaubj/)}(h h]h }(hjrhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjrhhhjrhKaubjp)}(hhcd_buffer_destroyh]jv)}(hhcd_buffer_destroyh]hhcd_buffer_destroy}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjrubah}(h]h ](jjeh"]h$]h&]jjuh1johjrhhhjrhKaubj)}(h(struct usb_hcd *hcd)h]j)}(hstruct usb_hcd *hcdh](j)}(hjh]hstruct}(hjrhhhNhNubah}(h]h ]j)ah"]h$]h&]uh1jhjrubj/)}(h h]h }(hjrhhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjrubh)}(hhh]jv)}(husb_hcdh]husb_hcd}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjrubah}(h]h ]h"]h$]h&] refdomainjreftypej4 reftargetjrmodnameN classnameNj8j;)}j>]jA)}j4jrsbc.hcd_buffer_destroyasbuh1hhjrubj/)}(h h]h }(hjshhhNhNubah}(h]h ]j;ah"]h$]h&]uh1j.hjrubj_)}(hjbh]h*}(hj+shhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjrubjv)}(hhcdh]hhcd}(hj8shhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubah}(h]h ]h"]h$]h&]jjuh1jhjrhhhjrhKaubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhjrhKaubah}(h]jrah ](jjeh"]h$]h&]jj)jhuh1jhjrhKahjrhhubj)}(hhh]h)}(hdeallocate buffer poolsh]hdeallocate buffer pools}(hjbshhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chKZhj_shhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjrhKaubeh}(h]h ](jfunctioneh"]h$]h&]j jj jzsj jzsj j juh1j hhhjBhNhNubj)}(h**Parameters** ``struct usb_hcd *hcd`` the bus whose buffer pools are to be destroyed **Context** task context, might sleep **Description** This frees the buffer pools created by hcd_buffer_create().h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK^hj~subj0)}(hhh]j5)}(hG``struct usb_hcd *hcd`` the bus whose buffer pools are to be destroyed h](j;)}(h``struct usb_hcd *hcd``h]j)}(hjsh]hstruct usb_hcd *hcd}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1j:h]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK[hjsubjU)}(hhh]h)}(h.the bus whose buffer pools are to be destroyedh]h.the bus whose buffer pools are to be destroyed}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshK[hjsubah}(h]h ]h"]h$]h&]uh1jThjsubeh}(h]h ]h"]h$]h&]uh1j4hjshK[hjsubah}(h]h ]h"]h$]h&]uh1j/hj~subh)}(h **Context**h]j)}(hjsh]hContext}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK]hj~subh)}(htask context, might sleeph]htask context, might sleep}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK]hj~subh)}(h**Description**h]j)}(hjth]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK_hj~subh)}(h;This frees the buffer pools created by hcd_buffer_create().h]h;This frees the buffer pools created by hcd_buffer_create().}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/usb/usb:211: ./drivers/usb/core/buffer.chK^hj~subeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubeh}(h]host-controller-apisah ]h"]host controller apisah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hThe USB character device nodesh]hThe USB character device nodes}(hj`__ for C/C++, and - `jUSB `__ for Java. h]j)}(hhh](j)}(h9`libusb `__ for C/C++, andh]h)}(hjath](h reference)}(h*`libusb `__h]hlibusb}(hjhthhhNhNubah}(h]h ]h"]h$]h&]namelibusbrefurihttp://libusb.sourceforge.netuh1jfthjctubh for C/C++, and}(hjcthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj_tubah}(h]h ]h"]h$]h&]uh1jhj\tubj)}(h1`jUSB `__ for Java. h]h)}(h0`jUSB `__ for Java.h](jgt)}(h&`jUSB `__h]hjUSB}(hjthhhNhNubah}(h]h ]h"]h$]h&]namejUSBjxthttp://jUSB.sourceforge.netuh1jfthjtubh for Java.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjtubah}(h]h ]h"]h$]h&]uh1jhj\tubeh}(h]h ]h"]h$]h&]jrjsuh1jhhhKhjXtubah}(h]h ]h"]h$]h&]uh1j6hhhKhj9thhubh)}(hSome old information about it can be seen at the "USB Device Filesystem" section of the USB Guide. The latest copy of the USB Guide can be found at http://www.linux-usb.org/h](hSome old information about it can be seen at the “USB Device Filesystem” section of the USB Guide. The latest copy of the USB Guide can be found at }(hjthhhNhNubjgt)}(hhttp://www.linux-usb.org/h]hhttp://www.linux-usb.org/}(hjthhhNhNubah}(h]h ]h"]h$]h&]refurijtuh1jfthjtubeh}(h]h ]h"]h$]h&]uh1hhhhKhj9thhubhnote)}(hX"- They were used to be implemented via *usbfs*, but this is not part of the sysfs debug interface. - This particular documentation is incomplete, especially with respect to the asynchronous mode. As of kernel 2.5.66 the code and this (new) documentation need to be cross-reviewed.h](j)}(hhh]j)}(haThey were used to be implemented via *usbfs*, but this is not part of the sysfs debug interface. h]h)}(h`They were used to be implemented via *usbfs*, but this is not part of the sysfs debug interface.h](h%They were used to be implemented via }(hjthhhNhNubj )}(h*usbfs*h]husbfs}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j hjtubh4, but this is not part of the sysfs debug interface.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjtubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]jrjsuh1jhhhKhjtubj6)}(h- This particular documentation is incomplete, especially with respect to the asynchronous mode. As of kernel 2.5.66 the code and this (new) documentation need to be cross-reviewed.h]j)}(hhh]j)}(hThis particular documentation is incomplete, especially with respect to the asynchronous mode. As of kernel 2.5.66 the code and this (new) documentation need to be cross-reviewed.h]h)}(hThis particular documentation is incomplete, especially with respect to the asynchronous mode. As of kernel 2.5.66 the code and this (new) documentation need to be cross-reviewed.h]hThis particular documentation is incomplete, especially with respect to the asynchronous mode. As of kernel 2.5.66 the code and this (new) documentation need to be cross-reviewed.}(hj uhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjuubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]jrjsuh1jhhhKhjuubah}(h]h ]h"]h$]h&]uh1j6hhhKhjtubeh}(h]h ]h"]h$]h&]uh1jthj9thhhhhNubh)}(hhh](h)}(hWhat files are in "devtmpfs"?h]h!What files are in “devtmpfs”?}(hjIuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFuhhhhhKubh)}(hDConventionally mounted at ``/dev/bus/usb/``, usbfs features include:h](hConventionally mounted at }(hjWuhhhNhNubj)}(h``/dev/bus/usb/``h]h /dev/bus/usb/}(hj_uhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWuubh, usbfs features include:}(hjWuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjFuhhubj)}(hhh]j)}(h``/dev/bus/usb/BBB/DDD`` ... magic files exposing the each device's configuration descriptors, and supporting a series of ioctls for making device requests, including I/O to devices. (Purely for access by programs.) h]h)}(h``/dev/bus/usb/BBB/DDD`` ... magic files exposing the each device's configuration descriptors, and supporting a series of ioctls for making device requests, including I/O to devices. (Purely for access by programs.)h](j)}(h``/dev/bus/usb/BBB/DDD``h]h/dev/bus/usb/BBB/DDD}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~uubh ... magic files exposing the each device’s configuration descriptors, and supporting a series of ioctls for making device requests, including I/O to devices. (Purely for access by programs.)}(hj~uhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjzuubah}(h]h ]h"]h$]h&]uh1jhjwuhhhhhNubah}(h]h ]h"]h$]h&]jrjsuh1jhhhKhjFuhhubh)}(hX}Each bus is given a number (``BBB``) based on when it was enumerated; within each bus, each device is given a similar number (``DDD``). Those ``BBB/DDD`` paths are not "stable" identifiers; expect them to change even if you always leave the devices plugged in to the same hub port. *Don't even think of saving these in application configuration files.* Stable identifiers are available, for user mode applications that want to use them. HID and networking devices expose these stable IDs, so that for example you can be sure that you told the right UPS to power down its second server. Pleast note that it doesn't (yet) expose those IDs.h](hEach bus is given a number (}(hjuhhhNhNubj)}(h``BBB``h]hBBB}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubh[) based on when it was enumerated; within each bus, each device is given a similar number (}(hjuhhhNhNubj)}(h``DDD``h]hDDD}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubh ). Those }(hjuhhhNhNubj)}(h ``BBB/DDD``h]hBBB/DDD}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubh paths are not “stable” identifiers; expect them to change even if you always leave the devices plugged in to the same hub port. }(hjuhhhNhNubj )}(hF*Don't even think of saving these in application configuration files.*h]hFDon’t even think of saving these in application configuration files.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubhX Stable identifiers are available, for user mode applications that want to use them. HID and networking devices expose these stable IDs, so that for example you can be sure that you told the right UPS to power down its second server. Pleast note that it doesn’t (yet) expose those IDs.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjFuhhubeh}(h]what-files-are-in-devtmpfsah ]h"]what files are in "devtmpfs"?ah$]h&]uh1hhj9thhhhhKubh)}(hhh](h)}(h/dev/bus/usb/BBB/DDDh]h/dev/bus/usb/BBB/DDD}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhhhhhMubh)}(h+Use these files in one of these basic ways:h]h+Use these files in one of these basic ways:}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjvhhubj)}(hhh](j)}(hXB*They can be read,* producing first the device descriptor (18 bytes) and then the descriptors for the current configuration. See the USB 2.0 spec for details about those binary data formats. You'll need to convert most multibyte values from little endian format to your native host byte order, although a few of the fields in the device descriptor (both of the BCD-encoded fields, and the vendor and product IDs) will be byteswapped for you. Note that configuration descriptors include descriptors for interfaces, altsettings, endpoints, and maybe additional class descriptors. h]h)}(hXA*They can be read,* producing first the device descriptor (18 bytes) and then the descriptors for the current configuration. See the USB 2.0 spec for details about those binary data formats. You'll need to convert most multibyte values from little endian format to your native host byte order, although a few of the fields in the device descriptor (both of the BCD-encoded fields, and the vendor and product IDs) will be byteswapped for you. Note that configuration descriptors include descriptors for interfaces, altsettings, endpoints, and maybe additional class descriptors.h](j )}(h*They can be read,*h]hThey can be read,}(hj.vhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj*vubhX0 producing first the device descriptor (18 bytes) and then the descriptors for the current configuration. See the USB 2.0 spec for details about those binary data formats. You’ll need to convert most multibyte values from little endian format to your native host byte order, although a few of the fields in the device descriptor (both of the BCD-encoded fields, and the vendor and product IDs) will be byteswapped for you. Note that configuration descriptors include descriptors for interfaces, altsettings, endpoints, and maybe additional class descriptors.}(hj*vhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj&vubah}(h]h ]h"]h$]h&]uh1jhj#vhhhhhNubj)}(hX=*Perform USB operations* using *ioctl()* requests to make endpoint I/O requests (synchronously or asynchronously) or manage the device. These requests need the ``CAP_SYS_RAWIO`` capability, as well as filesystem access permissions. Only one ioctl request can be made on one of these device files at a time. This means that if you are synchronously reading an endpoint from one thread, you won't be able to write to a different endpoint from another thread until the read completes. This works for *half duplex* protocols, but otherwise you'd use asynchronous i/o requests. h]h)}(hX<*Perform USB operations* using *ioctl()* requests to make endpoint I/O requests (synchronously or asynchronously) or manage the device. These requests need the ``CAP_SYS_RAWIO`` capability, as well as filesystem access permissions. Only one ioctl request can be made on one of these device files at a time. This means that if you are synchronously reading an endpoint from one thread, you won't be able to write to a different endpoint from another thread until the read completes. This works for *half duplex* protocols, but otherwise you'd use asynchronous i/o requests.h](j )}(h*Perform USB operations*h]hPerform USB operations}(hjTvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjPvubh using }(hjPvhhhNhNubj )}(h *ioctl()*h]hioctl()}(hjfvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjPvubhx requests to make endpoint I/O requests (synchronously or asynchronously) or manage the device. These requests need the }(hjPvhhhNhNubj)}(h``CAP_SYS_RAWIO``h]h CAP_SYS_RAWIO}(hjxvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPvubhXB capability, as well as filesystem access permissions. Only one ioctl request can be made on one of these device files at a time. This means that if you are synchronously reading an endpoint from one thread, you won’t be able to write to a different endpoint from another thread until the read completes. This works for }(hjPvhhhNhNubj )}(h *half duplex*h]h half duplex}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjPvubh@ protocols, but otherwise you’d use asynchronous i/o requests.}(hjPvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjLvubah}(h]h ]h"]h$]h&]uh1jhj#vhhhhhNubeh}(h]h ]h"]h$]h&]jrjsuh1jhhhMhjvhhubh)}(hXEach connected USB device has one file. The ``BBB`` indicates the bus number. The ``DDD`` indicates the device address on that bus. Both of these numbers are assigned sequentially, and can be reused, so you can't rely on them for stable access to devices. For example, it's relatively common for devices to re-enumerate while they are still connected (perhaps someone jostled their power supply, hub, or USB cable), so a device might be ``002/027`` when you first connect it and ``002/048`` sometime later.h](h-Each connected USB device has one file. The }(hjvhhhNhNubj)}(h``BBB``h]hBBB}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh indicates the bus number. The }(hjvhhhNhNubj)}(h``DDD``h]hDDD}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubhXb indicates the device address on that bus. Both of these numbers are assigned sequentially, and can be reused, so you can’t rely on them for stable access to devices. For example, it’s relatively common for devices to re-enumerate while they are still connected (perhaps someone jostled their power supply, hub, or USB cable), so a device might be }(hjvhhhNhNubj)}(h ``002/027``h]h002/027}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh when you first connect it and }(hjvhhhNhNubj)}(h ``002/048``h]h002/048}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh sometime later.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjvhhubh)}(hXgThese files can be read as binary data. The binary data consists of first the device descriptor, then the descriptors for each configuration of the device. Multi-byte fields in the device descriptor are converted to host endianness by the kernel. The configuration descriptors are in bus endian format! The configuration descriptor are wTotalLength bytes apart. If a device returns less configuration descriptor data than indicated by wTotalLength there will be a hole in the file for the missing bytes. This information is also shown in text form by the ``/sys/kernel/debug/usb/devices`` file, described later.h](hX/These files can be read as binary data. The binary data consists of first the device descriptor, then the descriptors for each configuration of the device. Multi-byte fields in the device descriptor are converted to host endianness by the kernel. The configuration descriptors are in bus endian format! The configuration descriptor are wTotalLength bytes apart. If a device returns less configuration descriptor data than indicated by wTotalLength there will be a hole in the file for the missing bytes. This information is also shown in text form by the }(hjwhhhNhNubj)}(h!``/sys/kernel/debug/usb/devices``h]h/sys/kernel/debug/usb/devices}(hj whhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh file, described later.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM%hjvhhubh)}(hXWThese files may also be used to write user-level drivers for the USB devices. You would open the ``/dev/bus/usb/BBB/DDD`` file read/write, read its descriptors to make sure it's the device you expect, and then bind to an interface (or perhaps several) using an ioctl call. You would issue more ioctls to the device to communicate to it using control, bulk, or other kinds of USB transfers. The IOCTLs are listed in the ```` file, and at this writing the source code (``linux/drivers/usb/core/devio.c``) is the primary reference for how to access devices through those files.h](hbThese files may also be used to write user-level drivers for the USB devices. You would open the }(hj$whhhNhNubj)}(h``/dev/bus/usb/BBB/DDD``h]h/dev/bus/usb/BBB/DDD}(hj,whhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$wubhX. file read/write, read its descriptors to make sure it’s the device you expect, and then bind to an interface (or perhaps several) using an ioctl call. You would issue more ioctls to the device to communicate to it using control, bulk, or other kinds of USB transfers. The IOCTLs are listed in the }(hj$whhhNhNubj)}(h````h]h}(hj>whhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$wubh, file, and at this writing the source code (}(hj$whhhNhNubj)}(h"``linux/drivers/usb/core/devio.c``h]hlinux/drivers/usb/core/devio.c}(hjPwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$wubhI) is the primary reference for how to access devices through those files.}(hj$whhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM/hjvhhubh)}(hXNote that since by default these ``BBB/DDD`` files are writable only by root, only root can write such user mode drivers. You can selectively grant read/write permissions to other users by using ``chmod``. Also, usbfs mount options such as ``devmode=0666`` may be helpful.h](h!Note that since by default these }(hjhwhhhNhNubj)}(h ``BBB/DDD``h]hBBB/DDD}(hjpwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhwubh files are writable only by root, only root can write such user mode drivers. You can selectively grant read/write permissions to other users by using }(hjhwhhhNhNubj)}(h ``chmod``h]hchmod}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhwubh%. Also, usbfs mount options such as }(hjhwhhhNhNubj)}(h``devmode=0666``h]h devmode=0666}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhwubh may be helpful.}(hjhwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM9hjvhhubeh}(h]dev-bus-usb-bbb-dddah ]h"]/dev/bus/usb/bbb/dddah$]h&]uh1hhj9thhhhhMubh)}(hhh](h)}(hLife Cycle of User Mode Driversh]hLife Cycle of User Mode Drivers}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhhhhhM@ubh)}(hX(Such a driver first needs to find a device file for a device it knows how to handle. Maybe it was told about it because a ``/sbin/hotplug`` event handling agent chose that driver to handle the new device. Or maybe it's an application that scans all the ``/dev/bus/usb`` device files, and ignores most devices. In either case, it should :c:func:`read()` all the descriptors from the device file, and check them against what it knows how to handle. It might just reject everything except a particular vendor and product ID, or need a more complex policy.h](hzSuch a driver first needs to find a device file for a device it knows how to handle. Maybe it was told about it because a }(hjwhhhNhNubj)}(h``/sbin/hotplug``h]h /sbin/hotplug}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubht event handling agent chose that driver to handle the new device. Or maybe it’s an application that scans all the }(hjwhhhNhNubj)}(h``/dev/bus/usb``h]h /dev/bus/usb}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubhC device files, and ignores most devices. In either case, it should }(hjwhhhNhNubh)}(h:c:func:`read()`h]j)}(hjwh]hread()}(hjwhhhNhNubah}(h]h ](jbjc-funceh"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]refdocjb refdomainjreftypefunc refexplicitrefwarnj8jbjcreaduh1hhhhMBhjwubh all the descriptors from the device file, and check them against what it knows how to handle. It might just reject everything except a particular vendor and product ID, or need a more complex policy.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMBhjwhhubh)}(hNever assume there will only be one such device on the system at a time! If your code can't handle more than one device at a time, at least detect when there's more than one, and have your users choose which device to use.h]hNever assume there will only be one such device on the system at a time! If your code can’t handle more than one device at a time, at least detect when there’s more than one, and have your users choose which device to use.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMKhjwhhubh)}(hXlOnce your user mode driver knows what device to use, it interacts with it in either of two styles. The simple style is to make only control requests; some devices don't need more complex interactions than those. (An example might be software using vendor-specific control requests for some initialization or configuration tasks, with a kernel driver for the rest.)h]hXnOnce your user mode driver knows what device to use, it interacts with it in either of two styles. The simple style is to make only control requests; some devices don’t need more complex interactions than those. (An example might be software using vendor-specific control requests for some initialization or configuration tasks, with a kernel driver for the rest.)}(hj(xhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhjwhhubh)}(hX(More likely, you need a more complex style driver: one using non-control endpoints, reading or writing data and claiming exclusive use of an interface. *Bulk* transfers are easiest to use, but only their sibling *interrupt* transfers work with low speed devices. Both interrupt and *isochronous* transfers offer service guarantees because their bandwidth is reserved. Such "periodic" transfers are awkward to use through usbfs, unless you're using the asynchronous calls. However, interrupt transfers can also be used in a synchronous "one shot" style.h](hMore likely, you need a more complex style driver: one using non-control endpoints, reading or writing data and claiming exclusive use of an interface. }(hj6xhhhNhNubj )}(h*Bulk*h]hBulk}(hj>xhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6xubh6 transfers are easiest to use, but only their sibling }(hj6xhhhNhNubj )}(h *interrupt*h]h interrupt}(hjPxhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6xubh; transfers work with low speed devices. Both interrupt and }(hj6xhhhNhNubj )}(h *isochronous*h]h isochronous}(hjbxhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6xubhX  transfers offer service guarantees because their bandwidth is reserved. Such “periodic” transfers are awkward to use through usbfs, unless you’re using the asynchronous calls. However, interrupt transfers can also be used in a synchronous “one shot” style.}(hj6xhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMWhjwhhubh)}(hYour user-mode driver should never need to worry about cleaning up request state when the device is disconnected, although it should close its open file descriptors as soon as it starts seeing the ENODEV errors.h]hYour user-mode driver should never need to worry about cleaning up request state when the device is disconnected, although it should close its open file descriptors as soon as it starts seeing the ENODEV errors.}(hjzxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM`hjwhhubeh}(h]life-cycle-of-user-mode-driversah ]h"]life cycle of user mode driversah$]h&]uh1hhj9thhhhhM@ubh)}(hhh](h)}(hThe ioctl() Requestsh]hThe ioctl() Requests}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhhhhhMeubh)}(hZTo use these ioctls, you need to include the following headers in your userspace program::h]hYTo use these ioctls, you need to include the following headers in your userspace program:}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghjxhhubj )}(hQ#include #include #include h]hQ#include #include #include }hjxsbah}(h]h ]h"]h$]h&]jjuh1j hhhMjhjxhhubh)}(hThe standard USB device model requests, from "Chapter 9" of the USB 2.0 specification, are automatically included from the ```` header.h](hThe standard USB device model requests, from “Chapter 9” of the USB 2.0 specification, are automatically included from the }(hjxhhhNhNubj)}(h````h]h}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh header.}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMnhjxhhubh)}(hX"Unless noted otherwise, the ioctl requests described here will update the modification time on the usbfs file to which they are applied (unless they fail). A return of zero indicates success; otherwise, a standard USB error code is returned (These are documented in :ref:`usb-error-codes`).h](hX Unless noted otherwise, the ioctl requests described here will update the modification time on the usbfs file to which they are applied (unless they fail). A return of zero indicates success; otherwise, a standard USB error code is returned (These are documented in }(hjxhhhNhNubh)}(h:ref:`usb-error-codes`h]hinline)}(hjxh]husb-error-codes}(hjxhhhNhNubah}(h]h ](jbstdstd-refeh"]h$]h&]uh1jxhjxubah}(h]h ]h"]h$]h&]refdocjb refdomainjxreftyperef refexplicitrefwarnjcusb-error-codesuh1hhhhMrhjxubh).}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMrhjxhhubh)}(hXJEach of these files multiplexes access to several I/O streams, one per endpoint. Each device has one control endpoint (endpoint zero) which supports a limited RPC style RPC access. Devices are configured by hub_wq (in the kernel) setting a device-wide *configuration* that affects things like power consumption and basic functionality. The endpoints are part of USB *interfaces*, which may have *altsettings* affecting things like which endpoints are available. Many devices only have a single configuration and interface, so drivers for them will ignore configurations and altsettings.h](hEach of these files multiplexes access to several I/O streams, one per endpoint. Each device has one control endpoint (endpoint zero) which supports a limited RPC style RPC access. Devices are configured by hub_wq (in the kernel) setting a device-wide }(hjyhhhNhNubj )}(h*configuration*h]h configuration}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjyubhc that affects things like power consumption and basic functionality. The endpoints are part of USB }(hjyhhhNhNubj )}(h *interfaces*h]h interfaces}(hj+yhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjyubh, which may have }(hjyhhhNhNubj )}(h *altsettings*h]h altsettings}(hj=yhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjyubh affecting things like which endpoints are available. Many devices only have a single configuration and interface, so drivers for them will ignore configurations and altsettings.}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMxhjxhhubh)}(hhh](h)}(hManagement/Status Requestsh]hManagement/Status Requests}(hjXyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUyhhhhhMubh)}(hA number of usbfs requests don't deal very directly with device I/O. They mostly relate to device management and status. These are all synchronous requests.h]hA number of usbfs requests don’t deal very directly with device I/O. They mostly relate to device management and status. These are all synchronous requests.}(hjfyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjUyhhubj0)}(hhh](j5)}(hXWUSBDEVFS_CLAIMINTERFACE This is used to force usbfs to claim a specific interface, which has not previously been claimed by usbfs or any other kernel driver. The ioctl parameter is an integer holding the number of the interface (bInterfaceNumber from descriptor). Note that if your driver doesn't claim an interface before trying to use one of its endpoints, and no other driver has bound to it, then the interface is automatically claimed by usbfs. This claim will be released by a RELEASEINTERFACE ioctl, or by closing the file descriptor. File modification time is not updated by this request. h](j;)}(hUSBDEVFS_CLAIMINTERFACEh]hUSBDEVFS_CLAIMINTERFACE}(hj{yhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjwyubjU)}(hhh](h)}(hThis is used to force usbfs to claim a specific interface, which has not previously been claimed by usbfs or any other kernel driver. The ioctl parameter is an integer holding the number of the interface (bInterfaceNumber from descriptor).h]hThis is used to force usbfs to claim a specific interface, which has not previously been claimed by usbfs or any other kernel driver. The ioctl parameter is an integer holding the number of the interface (bInterfaceNumber from descriptor).}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjyubh)}(hNote that if your driver doesn't claim an interface before trying to use one of its endpoints, and no other driver has bound to it, then the interface is automatically claimed by usbfs.h]hNote that if your driver doesn’t claim an interface before trying to use one of its endpoints, and no other driver has bound to it, then the interface is automatically claimed by usbfs.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjyubh)}(hThis claim will be released by a RELEASEINTERFACE ioctl, or by closing the file descriptor. File modification time is not updated by this request.h]hThis claim will be released by a RELEASEINTERFACE ioctl, or by closing the file descriptor. File modification time is not updated by this request.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjyubeh}(h]h ]h"]h$]h&]uh1jThjwyubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyubj5)}(hXUSBDEVFS_CONNECTINFO Says whether the device is lowspeed. The ioctl parameter points to a structure like this:: struct usbdevfs_connectinfo { unsigned int devnum; unsigned char slow; }; File modification time is not updated by this request. *You can't tell whether a "not slow" device is connected at high speed (480 MBit/sec) or just full speed (12 MBit/sec).* You should know the devnum value already, it's the DDD value of the device file name. h](j;)}(hUSBDEVFS_CONNECTINFOh]hUSBDEVFS_CONNECTINFO}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjyubjU)}(hhh](h)}(hZSays whether the device is lowspeed. The ioctl parameter points to a structure like this::h]hYSays whether the device is lowspeed. The ioctl parameter points to a structure like this:}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjyubj )}(h\struct usbdevfs_connectinfo { unsigned int devnum; unsigned char slow; };h]h\struct usbdevfs_connectinfo { unsigned int devnum; unsigned char slow; };}hjysbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjyubh)}(h6File modification time is not updated by this request.h]h6File modification time is not updated by this request.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjyubh)}(h*You can't tell whether a "not slow" device is connected at high speed (480 MBit/sec) or just full speed (12 MBit/sec).* You should know the devnum value already, it's the DDD value of the device file name.h](j )}(hx*You can't tell whether a "not slow" device is connected at high speed (480 MBit/sec) or just full speed (12 MBit/sec).*h]h|You can’t tell whether a “not slow” device is connected at high speed (480 MBit/sec) or just full speed (12 MBit/sec).}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjzubhX You should know the devnum value already, it’s the DDD value of the device file name.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjyubeh}(h]h ]h"]h$]h&]uh1jThjyubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubj5)}(hUSBDEVFS_GET_SPEED Returns the speed of the device. The speed is returned as a numerical value in accordance with enum usb_device_speed File modification time is not updated by this request. h](j;)}(hUSBDEVFS_GET_SPEEDh]hUSBDEVFS_GET_SPEED}(hj-zhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhj)zubjU)}(hhh](h)}(htReturns the speed of the device. The speed is returned as a numerical value in accordance with enum usb_device_speedh]htReturns the speed of the device. The speed is returned as a numerical value in accordance with enum usb_device_speed}(hj>zhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj;zubh)}(h6File modification time is not updated by this request.h]h6File modification time is not updated by this request.}(hjLzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj;zubeh}(h]h ]h"]h$]h&]uh1jThj)zubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubj5)}(hXaUSBDEVFS_GETDRIVER Returns the name of the kernel driver bound to a given interface (a string). Parameter is a pointer to this structure, which is modified:: struct usbdevfs_getdriver { unsigned int interface; char driver[USBDEVFS_MAXDRIVERNAME + 1]; }; File modification time is not updated by this request. h](j;)}(hUSBDEVFS_GETDRIVERh]hUSBDEVFS_GETDRIVER}(hjjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjfzubjU)}(hhh](h)}(hReturns the name of the kernel driver bound to a given interface (a string). Parameter is a pointer to this structure, which is modified::h]hReturns the name of the kernel driver bound to a given interface (a string). Parameter is a pointer to this structure, which is modified:}(hj{zhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjxzubj )}(hystruct usbdevfs_getdriver { unsigned int interface; char driver[USBDEVFS_MAXDRIVERNAME + 1]; };h]hystruct usbdevfs_getdriver { unsigned int interface; char driver[USBDEVFS_MAXDRIVERNAME + 1]; };}hjzsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjxzubh)}(h6File modification time is not updated by this request.h]h6File modification time is not updated by this request.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjxzubeh}(h]h ]h"]h$]h&]uh1jThjfzubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubj5)}(hXUSBDEVFS_IOCTL Passes a request from userspace through to a kernel driver that has an ioctl entry in the *struct usb_driver* it registered:: struct usbdevfs_ioctl { int ifno; int ioctl_code; void *data; }; /* user mode call looks like this. * 'request' becomes the driver->ioctl() 'code' parameter. * the size of 'param' is encoded in 'request', and that data * is copied to or from the driver->ioctl() 'buf' parameter. */ static int usbdev_ioctl (int fd, int ifno, unsigned request, void *param) { struct usbdevfs_ioctl wrapper; wrapper.ifno = ifno; wrapper.ioctl_code = request; wrapper.data = param; return ioctl (fd, USBDEVFS_IOCTL, &wrapper); } File modification time is not updated by this request. This request lets kernel drivers talk to user mode code through filesystem operations even when they don't create a character or block special device. It's also been used to do things like ask devices what device special file should be used. Two pre-defined ioctls are used to disconnect and reconnect kernel drivers, so that user mode code can completely manage binding and configuration of devices. h](j;)}(hUSBDEVFS_IOCTLh]hUSBDEVFS_IOCTL}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjzubjU)}(hhh](h)}(h}Passes a request from userspace through to a kernel driver that has an ioctl entry in the *struct usb_driver* it registered::h](hZPasses a request from userspace through to a kernel driver that has an ioctl entry in the }(hjzhhhNhNubj )}(h*struct usb_driver*h]hstruct usb_driver}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjzubh it registered:}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjzubj )}(hXPstruct usbdevfs_ioctl { int ifno; int ioctl_code; void *data; }; /* user mode call looks like this. * 'request' becomes the driver->ioctl() 'code' parameter. * the size of 'param' is encoded in 'request', and that data * is copied to or from the driver->ioctl() 'buf' parameter. */ static int usbdev_ioctl (int fd, int ifno, unsigned request, void *param) { struct usbdevfs_ioctl wrapper; wrapper.ifno = ifno; wrapper.ioctl_code = request; wrapper.data = param; return ioctl (fd, USBDEVFS_IOCTL, &wrapper); }h]hXPstruct usbdevfs_ioctl { int ifno; int ioctl_code; void *data; }; /* user mode call looks like this. * 'request' becomes the driver->ioctl() 'code' parameter. * the size of 'param' is encoded in 'request', and that data * is copied to or from the driver->ioctl() 'buf' parameter. */ static int usbdev_ioctl (int fd, int ifno, unsigned request, void *param) { struct usbdevfs_ioctl wrapper; wrapper.ifno = ifno; wrapper.ioctl_code = request; wrapper.data = param; return ioctl (fd, USBDEVFS_IOCTL, &wrapper); }}hjzsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjzubh)}(h6File modification time is not updated by this request.h]h6File modification time is not updated by this request.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjzubh)}(hXThis request lets kernel drivers talk to user mode code through filesystem operations even when they don't create a character or block special device. It's also been used to do things like ask devices what device special file should be used. Two pre-defined ioctls are used to disconnect and reconnect kernel drivers, so that user mode code can completely manage binding and configuration of devices.h]hXThis request lets kernel drivers talk to user mode code through filesystem operations even when they don’t create a character or block special device. It’s also been used to do things like ask devices what device special file should be used. Two pre-defined ioctls are used to disconnect and reconnect kernel drivers, so that user mode code can completely manage binding and configuration of devices.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjzubeh}(h]h ]h"]h$]h&]uh1jThjzubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubj5)}(hXUSBDEVFS_RELEASEINTERFACE This is used to release the claim usbfs made on interface, either implicitly or because of a USBDEVFS_CLAIMINTERFACE call, before the file descriptor is closed. The ioctl parameter is an integer holding the number of the interface (bInterfaceNumber from descriptor); File modification time is not updated by this request. .. warning:: *No security check is made to ensure that the task which made the claim is the one which is releasing it. This means that user mode driver may interfere other ones.* h](j;)}(hUSBDEVFS_RELEASEINTERFACEh]hUSBDEVFS_RELEASEINTERFACE}(hj {hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhj{ubjU)}(hhh](h)}(hXAThis is used to release the claim usbfs made on interface, either implicitly or because of a USBDEVFS_CLAIMINTERFACE call, before the file descriptor is closed. The ioctl parameter is an integer holding the number of the interface (bInterfaceNumber from descriptor); File modification time is not updated by this request.h]hXAThis is used to release the claim usbfs made on interface, either implicitly or because of a USBDEVFS_CLAIMINTERFACE call, before the file descriptor is closed. The ioctl parameter is an integer holding the number of the interface (bInterfaceNumber from descriptor); File modification time is not updated by this request.}(hj1{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.{ubhwarning)}(h*No security check is made to ensure that the task which made the claim is the one which is releasing it. This means that user mode driver may interfere other ones.*h]h)}(h*No security check is made to ensure that the task which made the claim is the one which is releasing it. This means that user mode driver may interfere other ones.*h]j )}(hjG{h]hNo security check is made to ensure that the task which made the claim is the one which is releasing it. This means that user mode driver may interfere other ones.}(hjI{hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjE{ubah}(h]h ]h"]h$]h&]uh1hhhhMhjA{ubah}(h]h ]h"]h$]h&]uh1j?{hj.{ubeh}(h]h ]h"]h$]h&]uh1jThj{ubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubj5)}(hXHUSBDEVFS_RESETEP Resets the data toggle value for an endpoint (bulk or interrupt) to DATA0. The ioctl parameter is an integer endpoint number (1 to 15, as identified in the endpoint descriptor), with USB_DIR_IN added if the device's endpoint sends data to the host. .. Warning:: *Avoid using this request. It should probably be removed.* Using it typically means the device and driver will lose toggle synchronization. If you really lost synchronization, you likely need to completely handshake with the device, using a request like CLEAR_HALT or SET_INTERFACE. h](j;)}(hUSBDEVFS_RESETEPh]hUSBDEVFS_RESETEP}(hjr{hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjn{ubjU)}(hhh](h)}(hResets the data toggle value for an endpoint (bulk or interrupt) to DATA0. The ioctl parameter is an integer endpoint number (1 to 15, as identified in the endpoint descriptor), with USB_DIR_IN added if the device's endpoint sends data to the host.h]hResets the data toggle value for an endpoint (bulk or interrupt) to DATA0. The ioctl parameter is an integer endpoint number (1 to 15, as identified in the endpoint descriptor), with USB_DIR_IN added if the device’s endpoint sends data to the host.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj{ubj@{)}(hX*Avoid using this request. It should probably be removed.* Using it typically means the device and driver will lose toggle synchronization. If you really lost synchronization, you likely need to completely handshake with the device, using a request like CLEAR_HALT or SET_INTERFACE.h]h)}(hX*Avoid using this request. It should probably be removed.* Using it typically means the device and driver will lose toggle synchronization. If you really lost synchronization, you likely need to completely handshake with the device, using a request like CLEAR_HALT or SET_INTERFACE.h](j )}(h:*Avoid using this request. It should probably be removed.*h]h8Avoid using this request. It should probably be removed.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj{ubh Using it typically means the device and driver will lose toggle synchronization. If you really lost synchronization, you likely need to completely handshake with the device, using a request like CLEAR_HALT or SET_INTERFACE.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj{ubah}(h]h ]h"]h$]h&]uh1j?{hj{ubeh}(h]h ]h"]h$]h&]uh1jThjn{ubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubj5)}(hXUSBDEVFS_DROP_PRIVILEGES This is used to relinquish the ability to do certain operations which are considered to be privileged on a usbfs file descriptor. This includes claiming arbitrary interfaces, resetting a device on which there are currently claimed interfaces from other users, and issuing USBDEVFS_IOCTL calls. The ioctl parameter is a 32 bit mask of interfaces the user is allowed to claim on this file descriptor. You may issue this ioctl more than one time to narrow said mask. h](j;)}(hUSBDEVFS_DROP_PRIVILEGESh]hUSBDEVFS_DROP_PRIVILEGES}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhj{ubjU)}(hhh]h)}(hXThis is used to relinquish the ability to do certain operations which are considered to be privileged on a usbfs file descriptor. This includes claiming arbitrary interfaces, resetting a device on which there are currently claimed interfaces from other users, and issuing USBDEVFS_IOCTL calls. The ioctl parameter is a 32 bit mask of interfaces the user is allowed to claim on this file descriptor. You may issue this ioctl more than one time to narrow said mask.h]hXThis is used to relinquish the ability to do certain operations which are considered to be privileged on a usbfs file descriptor. This includes claiming arbitrary interfaces, resetting a device on which there are currently claimed interfaces from other users, and issuing USBDEVFS_IOCTL calls. The ioctl parameter is a 32 bit mask of interfaces the user is allowed to claim on this file descriptor. You may issue this ioctl more than one time to narrow said mask.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj{ubah}(h]h ]h"]h$]h&]uh1jThj{ubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjtyhhubeh}(h]h ]h"]h$]h&]uh1j/hjUyhhhhhNubeh}(h]management-status-requestsah ]h"]management/status requestsah$]h&]uh1hhjxhhhhhMubh)}(hhh](h)}(hSynchronous I/O Supporth]hSynchronous I/O Support}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hhhhhMubh)}(hX#Synchronous requests involve the kernel blocking until the user mode request completes, either by finishing successfully or by reporting an error. In most cases this is the simplest way to use usbfs, although as noted above it does prevent performing I/O to more than one endpoint at a time.h]hX#Synchronous requests involve the kernel blocking until the user mode request completes, either by finishing successfully or by reporting an error. In most cases this is the simplest way to use usbfs, although as noted above it does prevent performing I/O to more than one endpoint at a time.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj|hhubj0)}(hhh](j5)}(hXUSBDEVFS_BULK Issues a bulk read or write request to the device. The ioctl parameter is a pointer to this structure:: struct usbdevfs_bulktransfer { unsigned int ep; unsigned int len; unsigned int timeout; /* in milliseconds */ void *data; }; The ``ep`` value identifies a bulk endpoint number (1 to 15, as identified in an endpoint descriptor), masked with USB_DIR_IN when referring to an endpoint which sends data to the host from the device. The length of the data buffer is identified by ``len``; Recent kernels support requests up to about 128KBytes. *FIXME say how read length is returned, and how short reads are handled.*. h](j;)}(h USBDEVFS_BULKh]h USBDEVFS_BULK}(hj&|hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhj"|ubjU)}(hhh](h)}(hgIssues a bulk read or write request to the device. The ioctl parameter is a pointer to this structure::h]hfIssues a bulk read or write request to the device. The ioctl parameter is a pointer to this structure:}(hj7|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj4|ubj )}(hstruct usbdevfs_bulktransfer { unsigned int ep; unsigned int len; unsigned int timeout; /* in milliseconds */ void *data; };h]hstruct usbdevfs_bulktransfer { unsigned int ep; unsigned int len; unsigned int timeout; /* in milliseconds */ void *data; };}hjE|sbah}(h]h ]h"]h$]h&]jjuh1j hhhMhj4|ubh)}(hXThe ``ep`` value identifies a bulk endpoint number (1 to 15, as identified in an endpoint descriptor), masked with USB_DIR_IN when referring to an endpoint which sends data to the host from the device. The length of the data buffer is identified by ``len``; Recent kernels support requests up to about 128KBytes. *FIXME say how read length is returned, and how short reads are handled.*.h](hThe }(hjS|hhhNhNubj)}(h``ep``h]hep}(hj[|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS|ubh value identifies a bulk endpoint number (1 to 15, as identified in an endpoint descriptor), masked with USB_DIR_IN when referring to an endpoint which sends data to the host from the device. The length of the data buffer is identified by }(hjS|hhhNhNubj)}(h``len``h]hlen}(hjm|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS|ubh9; Recent kernels support requests up to about 128KBytes. }(hjS|hhhNhNubj )}(hI*FIXME say how read length is returned, and how short reads are handled.*h]hGFIXME say how read length is returned, and how short reads are handled.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjS|ubh.}(hjS|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj4|ubeh}(h]h ]h"]h$]h&]uh1jThj"|ubeh}(h]h ]h"]h$]h&]uh1j4hhhMhj|ubj5)}(hX5USBDEVFS_CLEAR_HALT Clears endpoint halt (stall) and resets the endpoint toggle. This is only meaningful for bulk or interrupt endpoints. The ioctl parameter is an integer endpoint number (1 to 15, as identified in an endpoint descriptor), masked with USB_DIR_IN when referring to an endpoint which sends data to the host from the device. Use this on bulk or interrupt endpoints which have stalled, returning ``-EPIPE`` status to a data transfer request. Do not issue the control request directly, since that could invalidate the host's record of the data toggle. h](j;)}(hUSBDEVFS_CLEAR_HALTh]hUSBDEVFS_CLEAR_HALT}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhM'hj|ubjU)}(hhh](h)}(hX>Clears endpoint halt (stall) and resets the endpoint toggle. This is only meaningful for bulk or interrupt endpoints. The ioctl parameter is an integer endpoint number (1 to 15, as identified in an endpoint descriptor), masked with USB_DIR_IN when referring to an endpoint which sends data to the host from the device.h]hX>Clears endpoint halt (stall) and resets the endpoint toggle. This is only meaningful for bulk or interrupt endpoints. The ioctl parameter is an integer endpoint number (1 to 15, as identified in an endpoint descriptor), masked with USB_DIR_IN when referring to an endpoint which sends data to the host from the device.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj|ubh)}(hUse this on bulk or interrupt endpoints which have stalled, returning ``-EPIPE`` status to a data transfer request. Do not issue the control request directly, since that could invalidate the host's record of the data toggle.h](hFUse this on bulk or interrupt endpoints which have stalled, returning }(hj|hhhNhNubj)}(h ``-EPIPE``h]h-EPIPE}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh status to a data transfer request. Do not issue the control request directly, since that could invalidate the host’s record of the data toggle.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM$hj|ubeh}(h]h ]h"]h$]h&]uh1jThj|ubeh}(h]h ]h"]h$]h&]uh1j4hhhM'hj|hhubj5)}(hXDUSBDEVFS_CONTROL Issues a control request to the device. The ioctl parameter points to a structure like this:: struct usbdevfs_ctrltransfer { __u8 bRequestType; __u8 bRequest; __u16 wValue; __u16 wIndex; __u16 wLength; __u32 timeout; /* in milliseconds */ void *data; }; The first eight bytes of this structure are the contents of the SETUP packet to be sent to the device; see the USB 2.0 specification for details. The bRequestType value is composed by combining a ``USB_TYPE_*`` value, a ``USB_DIR_*`` value, and a ``USB_RECIP_*`` value (from ``linux/usb.h``). If wLength is nonzero, it describes the length of the data buffer, which is either written to the device (USB_DIR_OUT) or read from the device (USB_DIR_IN). At this writing, you can't transfer more than 4 KBytes of data to or from a device; usbfs has a limit, and some host controller drivers have a limit. (That's not usually a problem.) *Also* there's no way to say it's not OK to get a short read back from the device. h](j;)}(hUSBDEVFS_CONTROLh]hUSBDEVFS_CONTROL}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMBhj|ubjU)}(hhh](h)}(h]Issues a control request to the device. The ioctl parameter points to a structure like this::h]h\Issues a control request to the device. The ioctl parameter points to a structure like this:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM*hj}ubj )}(hstruct usbdevfs_ctrltransfer { __u8 bRequestType; __u8 bRequest; __u16 wValue; __u16 wIndex; __u16 wLength; __u32 timeout; /* in milliseconds */ void *data; };h]hstruct usbdevfs_ctrltransfer { __u8 bRequestType; __u8 bRequest; __u16 wValue; __u16 wIndex; __u16 wLength; __u32 timeout; /* in milliseconds */ void *data; };}hj}sbah}(h]h ]h"]h$]h&]jjuh1j hhhM-hj}ubh)}(hXThe first eight bytes of this structure are the contents of the SETUP packet to be sent to the device; see the USB 2.0 specification for details. The bRequestType value is composed by combining a ``USB_TYPE_*`` value, a ``USB_DIR_*`` value, and a ``USB_RECIP_*`` value (from ``linux/usb.h``). If wLength is nonzero, it describes the length of the data buffer, which is either written to the device (USB_DIR_OUT) or read from the device (USB_DIR_IN).h](hThe first eight bytes of this structure are the contents of the SETUP packet to be sent to the device; see the USB 2.0 specification for details. The bRequestType value is composed by combining a }(hj#}hhhNhNubj)}(h``USB_TYPE_*``h]h USB_TYPE_*}(hj+}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#}ubh value, a }(hj#}hhhNhNubj)}(h ``USB_DIR_*``h]h USB_DIR_*}(hj=}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#}ubh value, and a }(hj#}hhhNhNubj)}(h``USB_RECIP_*``h]h USB_RECIP_*}(hjO}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#}ubh value (from }(hj#}hhhNhNubj)}(h``linux/usb.h``h]h linux/usb.h}(hja}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#}ubh). If wLength is nonzero, it describes the length of the data buffer, which is either written to the device (USB_DIR_OUT) or read from the device (USB_DIR_IN).}(hj#}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM7hj}ubh)}(hXAt this writing, you can't transfer more than 4 KBytes of data to or from a device; usbfs has a limit, and some host controller drivers have a limit. (That's not usually a problem.) *Also* there's no way to say it's not OK to get a short read back from the device.h](hAt this writing, you can’t transfer more than 4 KBytes of data to or from a device; usbfs has a limit, and some host controller drivers have a limit. (That’s not usually a problem.) }(hjy}hhhNhNubj )}(h*Also*h]hAlso}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjy}ubhP there’s no way to say it’s not OK to get a short read back from the device.}(hjy}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM?hj}ubeh}(h]h ]h"]h$]h&]uh1jThj|ubeh}(h]h ]h"]h$]h&]uh1j4hhhMBhj|hhubj5)}(hUSBDEVFS_RESET Does a USB level device reset. The ioctl parameter is ignored. After the reset, this rebinds all device interfaces. File modification time is not updated by this request. h](j;)}(hUSBDEVFS_RESETh]hUSBDEVFS_RESET}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMGhj}ubjU)}(hhh]h)}(hDoes a USB level device reset. The ioctl parameter is ignored. After the reset, this rebinds all device interfaces. File modification time is not updated by this request.h]hDoes a USB level device reset. The ioctl parameter is ignored. After the reset, this rebinds all device interfaces. File modification time is not updated by this request.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMEhj}ubah}(h]h ]h"]h$]h&]uh1jThj}ubeh}(h]h ]h"]h$]h&]uh1j4hhhMGhj|hhubeh}(h]h ]h"]h$]h&]uh1j/hj|hhhhhNubj@{)}(h*Avoid using this call* until some usbcore bugs get fixed, since it does not fully synchronize device, interface, and driver (not just usbfs) state.h]h)}(h*Avoid using this call* until some usbcore bugs get fixed, since it does not fully synchronize device, interface, and driver (not just usbfs) state.h](j )}(h*Avoid using this call*h]hAvoid using this call}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj}ubh} until some usbcore bugs get fixed, since it does not fully synchronize device, interface, and driver (not just usbfs) state.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMKhj}ubah}(h]h ]h"]h$]h&]uh1j?{hj|hhhhhNubj0)}(hhh](j5)}(hX)USBDEVFS_SETINTERFACE Sets the alternate setting for an interface. The ioctl parameter is a pointer to a structure like this:: struct usbdevfs_setinterface { unsigned int interface; unsigned int altsetting; }; File modification time is not updated by this request. Those struct members are from some interface descriptor applying to the current configuration. The interface number is the bInterfaceNumber value, and the altsetting number is the bAlternateSetting value. (This resets each endpoint in the interface.) h](j;)}(hUSBDEVFS_SETINTERFACEh]hUSBDEVFS_SETINTERFACE}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhM^hj~ubjU)}(hhh](h)}(hhSets the alternate setting for an interface. The ioctl parameter is a pointer to a structure like this::h]hgSets the alternate setting for an interface. The ioctl parameter is a pointer to a structure like this:}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhj~ubj )}(hdstruct usbdevfs_setinterface { unsigned int interface; unsigned int altsetting; };h]hdstruct usbdevfs_setinterface { unsigned int interface; unsigned int altsetting; };}hj&~sbah}(h]h ]h"]h$]h&]jjuh1j hhhMShj~ubh)}(h6File modification time is not updated by this request.h]h6File modification time is not updated by this request.}(hj4~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj~ubh)}(hThose struct members are from some interface descriptor applying to the current configuration. The interface number is the bInterfaceNumber value, and the altsetting number is the bAlternateSetting value. (This resets each endpoint in the interface.)h]hThose struct members are from some interface descriptor applying to the current configuration. The interface number is the bInterfaceNumber value, and the altsetting number is the bAlternateSetting value. (This resets each endpoint in the interface.)}(hjB~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhj~ubeh}(h]h ]h"]h$]h&]uh1jThj~ubeh}(h]h ]h"]h$]h&]uh1j4hhhM^hj~ubj5)}(hUSBDEVFS_SETCONFIGURATION Issues the :c:func:`usb_set_configuration()` call for the device. The parameter is an integer holding the number of a configuration (bConfigurationValue from descriptor). File modification time is not updated by this request. h](j;)}(hUSBDEVFS_SETCONFIGURATIONh]hUSBDEVFS_SETCONFIGURATION}(hj`~hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMdhj\~ubjU)}(hhh]h)}(hIssues the :c:func:`usb_set_configuration()` call for the device. The parameter is an integer holding the number of a configuration (bConfigurationValue from descriptor). File modification time is not updated by this request.h](h Issues the }(hjq~hhhNhNubh)}(h!:c:func:`usb_set_configuration()`h]j)}(hj{~h]husb_set_configuration()}(hj}~hhhNhNubah}(h]h ](jbjc-funceh"]h$]h&]uh1jhjy~ubah}(h]h ]h"]h$]h&]refdocjb refdomainjreftypefunc refexplicitrefwarnj8jbjcusb_set_configurationuh1hhhhMahjq~ubh call for the device. The parameter is an integer holding the number of a configuration (bConfigurationValue from descriptor). File modification time is not updated by this request.}(hjq~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMahjn~ubah}(h]h ]h"]h$]h&]uh1jThj\~ubeh}(h]h ]h"]h$]h&]uh1j4hhhMdhj~hhubeh}(h]h ]h"]h$]h&]uh1j/hj|hhhhhNubj@{)}(h*Avoid using this call* until some usbcore bugs get fixed, since it does not fully synchronize device, interface, and driver (not just usbfs) state.h]h)}(h*Avoid using this call* until some usbcore bugs get fixed, since it does not fully synchronize device, interface, and driver (not just usbfs) state.h](j )}(h*Avoid using this call*h]hAvoid using this call}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj~ubh} until some usbcore bugs get fixed, since it does not fully synchronize device, interface, and driver (not just usbfs) state.}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhhj~ubah}(h]h ]h"]h$]h&]uh1j?{hj|hhhhhNubeh}(h]synchronous-i-o-supportah ]h"]synchronous i/o supportah$]h&]uh1hhjxhhhhhMubh)}(hhh](h)}(hAsynchronous I/O Supporth]hAsynchronous I/O Support}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hhhhhMmubh)}(hXAs mentioned above, there are situations where it may be important to initiate concurrent operations from user mode code. This is particularly important for periodic transfers (interrupt and isochronous), but it can be used for other kinds of USB requests too. In such cases, the asynchronous requests described here are essential. Rather than submitting one request and having the kernel block until it completes, the blocking is separate.h]hXAs mentioned above, there are situations where it may be important to initiate concurrent operations from user mode code. This is particularly important for periodic transfers (interrupt and isochronous), but it can be used for other kinds of USB requests too. In such cases, the asynchronous requests described here are essential. Rather than submitting one request and having the kernel block until it completes, the blocking is separate.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMohj~hhubh)}(hXThese requests are packaged into a structure that resembles the URB used by kernel device drivers. (No POSIX Async I/O support here, sorry.) It identifies the endpoint type (``USBDEVFS_URB_TYPE_*``), endpoint (number, masked with USB_DIR_IN as appropriate), buffer and length, and a user "context" value serving to uniquely identify each request. (It's usually a pointer to per-request data.) Flags can modify requests (not as many as supported for kernel drivers).h](hThese requests are packaged into a structure that resembles the URB used by kernel device drivers. (No POSIX Async I/O support here, sorry.) It identifies the endpoint type (}(hjhhhNhNubj)}(h``USBDEVFS_URB_TYPE_*``h]hUSBDEVFS_URB_TYPE_*}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX), endpoint (number, masked with USB_DIR_IN as appropriate), buffer and length, and a user “context” value serving to uniquely identify each request. (It’s usually a pointer to per-request data.) Flags can modify requests (not as many as supported for kernel drivers).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMwhj~hhubh)}(hEach request can specify a realtime signal number (between SIGRTMIN and SIGRTMAX, inclusive) to request a signal be sent when the request completes.h]hEach request can specify a realtime signal number (between SIGRTMIN and SIGRTMAX, inclusive) to request a signal be sent when the request completes.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj~hhubh)}(hX_When usbfs returns these urbs, the status value is updated, and the buffer may have been modified. Except for isochronous transfers, the actual_length is updated to say how many bytes were transferred; if the USBDEVFS_URB_DISABLE_SPD flag is set ("short packets are not OK"), if fewer bytes were read than were requested then you get an error report::h]hXbWhen usbfs returns these urbs, the status value is updated, and the buffer may have been modified. Except for isochronous transfers, the actual_length is updated to say how many bytes were transferred; if the USBDEVFS_URB_DISABLE_SPD flag is set (“short packets are not OK”), if fewer bytes were read than were requested then you get an error report:}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj~hhubj )}(hXstruct usbdevfs_iso_packet_desc { unsigned int length; unsigned int actual_length; unsigned int status; }; struct usbdevfs_urb { unsigned char type; unsigned char endpoint; int status; unsigned int flags; void *buffer; int buffer_length; int actual_length; int start_frame; int number_of_packets; int error_count; unsigned int signr; void *usercontext; struct usbdevfs_iso_packet_desc iso_frame_desc[]; };h]hXstruct usbdevfs_iso_packet_desc { unsigned int length; unsigned int actual_length; unsigned int status; }; struct usbdevfs_urb { unsigned char type; unsigned char endpoint; int status; unsigned int flags; void *buffer; int buffer_length; int actual_length; int start_frame; int number_of_packets; int error_count; unsigned int signr; void *usercontext; struct usbdevfs_iso_packet_desc iso_frame_desc[]; };}hj=sbah}(h]h ]h"]h$]h&]jjuh1j hhhMhj~hhubh)}(hFor these asynchronous requests, the file modification time reflects when the request was initiated. This contrasts with their use with the synchronous requests, where it reflects when requests complete.h]hFor these asynchronous requests, the file modification time reflects when the request was initiated. This contrasts with their use with the synchronous requests, where it reflects when requests complete.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj~hhubj0)}(hhh](j5)}(hQUSBDEVFS_DISCARDURB *TBS* File modification time is not updated by this request. h](j;)}(hUSBDEVFS_DISCARDURBh]hUSBDEVFS_DISCARDURB}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhj\ubjU)}(hhh]h)}(h<*TBS* File modification time is not updated by this request.h](j )}(h*TBS*h]hTBS}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjqubh7 File modification time is not updated by this request.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjnubah}(h]h ]h"]h$]h&]uh1jThj\ubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjYubj5)}(hQUSBDEVFS_DISCSIGNAL *TBS* File modification time is not updated by this request. h](j;)}(hUSBDEVFS_DISCSIGNALh]hUSBDEVFS_DISCSIGNAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjubjU)}(hhh]h)}(h<*TBS* File modification time is not updated by this request.h](j )}(h*TBS*h]hTBS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh7 File modification time is not updated by this request.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjYhhubj5)}(hNUSBDEVFS_REAPURB *TBS* File modification time is not updated by this request. h](j;)}(hUSBDEVFS_REAPURBh]hUSBDEVFS_REAPURB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjubjU)}(hhh]h)}(h<*TBS* File modification time is not updated by this request.h](j )}(h*TBS*h]hTBS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh7 File modification time is not updated by this request.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjYhhubj5)}(hTUSBDEVFS_REAPURBNDELAY *TBS* File modification time is not updated by this request. h](j;)}(hUSBDEVFS_REAPURBNDELAYh]hUSBDEVFS_REAPURBNDELAY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjubjU)}(hhh]h)}(h<*TBS* File modification time is not updated by this request.h](j )}(h*TBS*h]hTBS}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj(ubh7 File modification time is not updated by this request.}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjYhhubj5)}(hUSBDEVFS_SUBMITURB *TBS* h](j;)}(hUSBDEVFS_SUBMITURBh]hUSBDEVFS_SUBMITURB}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjPubjU)}(hhh]h)}(h*TBS*h]j )}(hjgh]hTBS}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j hjeubah}(h]h ]h"]h$]h&]uh1hhhhMhjbubah}(h]h ]h"]h$]h&]uh1jThjPubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjYhhubeh}(h]h ]h"]h$]h&]uh1j/hj~hhhhhNubeh}(h]asynchronous-i-o-supportah ]h"]asynchronous i/o supportah$]h&]uh1hhjxhhhhhMmubeh}(h]the-ioctl-requestsah ]h"]the ioctl() requestsah$]h&]uh1hhj9thhhhhMeubeh}(h]the-usb-character-device-nodesah ]h"]the usb character device nodesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hThe USB devicesh]hThe USB devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h-The USB devices are now exported via debugfs:h]h-The USB devices are now exported via debugfs:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hhh]j)}(h``/sys/kernel/debug/usb/devices`` ... a text file showing each of the USB devices on known to the kernel, and their configuration descriptors. You can also poll() this to learn about new devices. h]h)}(h``/sys/kernel/debug/usb/devices`` ... a text file showing each of the USB devices on known to the kernel, and their configuration descriptors. You can also poll() this to learn about new devices.h](j)}(h!``/sys/kernel/debug/usb/devices``h]h/sys/kernel/debug/usb/devices}(hjЀhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̀ubh ... a text file showing each of the USB devices on known to the kernel, and their configuration descriptors. You can also poll() this to learn about new devices.}(hj̀hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjȀubah}(h]h ]h"]h$]h&]uh1jhjŀhhhhhNubah}(h]h ]h"]h$]h&]jrjsuh1jhhhMhjhhubh)}(hhh](h)}(h/sys/kernel/debug/usb/devicesh]h/sys/kernel/debug/usb/devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hXThis file is handy for status viewing tools in user mode, which can scan the text format and ignore most of it. More detailed device status (including class and vendor status) is available from device-specific files. For information about the current format of this file, see below.h]hXThis file is handy for status viewing tools in user mode, which can scan the text format and ignore most of it. More detailed device status (including class and vendor status) is available from device-specific files. For information about the current format of this file, see below.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(huThis file, in combination with the poll() system call, can also be used to detect when devices are added or removed::h]htThis file, in combination with the poll() system call, can also be used to detect when devices are added or removed:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj )}(hXbint fd; struct pollfd pfd; fd = open("/sys/kernel/debug/usb/devices", O_RDONLY); pfd = { fd, POLLIN, 0 }; for (;;) { /* The first time through, this call will return immediately. */ poll(&pfd, 1, -1); /* To see what's changed, compare the file's previous and current contents or scan the filesystem. (Scanning is more precise.) */ }h]hXbint fd; struct pollfd pfd; fd = open("/sys/kernel/debug/usb/devices", O_RDONLY); pfd = { fd, POLLIN, 0 }; for (;;) { /* The first time through, this call will return immediately. */ poll(&pfd, 1, -1); /* To see what's changed, compare the file's previous and current contents or scan the filesystem. (Scanning is more precise.) */ }}hj!sbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubh)}(hNote that this behavior is intended to be used for informational and debug purposes. It would be more appropriate to use programs such as udev or HAL to initialize a device or start a user-mode helper program, for instance.h]hNote that this behavior is intended to be used for informational and debug purposes. It would be more appropriate to use programs such as udev or HAL to initialize a device or start a user-mode helper program, for instance.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hFIn this file, each device's output has multiple lines of ASCII output.h]hHIn this file, each device’s output has multiple lines of ASCII output.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hX9I made it ASCII instead of binary on purpose, so that someone can obtain some useful data from it without the use of an auxiliary program. However, with an auxiliary program, the numbers in the first 4 columns of each ``T:`` line (topology info: Lev, Prnt, Port, Cnt) can be used to build a USB topology diagram.h](hI made it ASCII instead of binary on purpose, so that someone can obtain some useful data from it without the use of an auxiliary program. However, with an auxiliary program, the numbers in the first 4 columns of each }(hjKhhhNhNubj)}(h``T:``h]hT:}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubhX line (topology info: Lev, Prnt, Port, Cnt) can be used to build a USB topology diagram.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h;Each line is tagged with a one-character ID for that line::h]h:Each line is tagged with a one-character ID for that line:}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj )}(hXrT = Topology (etc.) B = Bandwidth (applies only to USB host controllers, which are virtualized as root hubs) D = Device descriptor info. P = Product ID info. (from Device descriptor, but they won't fit together on one line) S = String descriptors. C = Configuration descriptor info. (* = active configuration) I = Interface descriptor info. E = Endpoint descriptor info.h]hXrT = Topology (etc.) B = Bandwidth (applies only to USB host controllers, which are virtualized as root hubs) D = Device descriptor info. P = Product ID info. (from Device descriptor, but they won't fit together on one line) S = String descriptors. C = Configuration descriptor info. (* = active configuration) I = Interface descriptor info. E = Endpoint descriptor info.}hjysbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubh)}(hhh](h)}(h+/sys/kernel/debug/usb/devices output formath]h+/sys/kernel/debug/usb/devices output format}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj0)}(hhh]j5)}(hLegend:: d = decimal number (may have leading spaces or 0's) x = hexadecimal number (may have leading spaces or 0's) s = string h](j;)}(hLegend::h]hLegend::}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hhhMhjubjU)}(hhh]h)}(hvd = decimal number (may have leading spaces or 0's) x = hexadecimal number (may have leading spaces or 0's) s = stringh]hzd = decimal number (may have leading spaces or 0’s) x = hexadecimal number (may have leading spaces or 0’s) s = string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]uh1j4hhhMhjubah}(h]h ]h"]h$]h&]uh1j/hjhhhhhNubh)}(hhh](h)}(h Topology infoh]h Topology info}(hjӁhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjЁhhhhhMubj )}(hXT: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd | | | | | | | | |__MaxChildren | | | | | | | |__Device Speed in Mbps | | | | | | |__DeviceNumber | | | | | |__Count of devices at this level | | | | |__Connector/Port on Parent for this device | | | |__Parent DeviceNumber | | |__Level in topology for this bus | |__Bus number |__Topology info tagh]hXT: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd | | | | | | | | |__MaxChildren | | | | | | | |__Device Speed in Mbps | | | | | | |__DeviceNumber | | | | | |__Count of devices at this level | | | | |__Connector/Port on Parent for this device | | | |__Parent DeviceNumber | | |__Level in topology for this bus | |__Bus number |__Topology info tag}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjЁhhubh)}(h Speed may be:h]h Speed may be:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjЁhhubj6)}(hX-======= ====================================================== 1.5 Mbit/s for low speed USB 12 Mbit/s for full speed USB 480 Mbit/s for high speed USB (added for USB 2.0) 5000 Mbit/s for SuperSpeed USB (added for USB 3.0) ======= ====================================================== h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthK6uh1j hjubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(h1.5h]h1.5}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj-ubah}(h]h ]h"]h$]h&]uh1j+hj(ubj,)}(hhh]h)}(hMbit/s for low speed USBh]hMbit/s for low speed USB}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjDubah}(h]h ]h"]h$]h&]uh1j+hj(ubeh}(h]h ]h"]h$]h&]uh1j&hj#ubj')}(hhh](j,)}(hhh]h)}(h12h]h12}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjdubah}(h]h ]h"]h$]h&]uh1j+hjaubj,)}(hhh]h)}(hMbit/s for full speed USBh]hMbit/s for full speed USB}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj{ubah}(h]h ]h"]h$]h&]uh1j+hjaubeh}(h]h ]h"]h$]h&]uh1j&hj#ubj')}(hhh](j,)}(hhh]h)}(h480h]h480}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1j+hjubj,)}(hhh]h)}(h-Mbit/s for high speed USB (added for USB 2.0)h]h-Mbit/s for high speed USB (added for USB 2.0)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1j+hjubeh}(h]h ]h"]h$]h&]uh1j&hj#ubj')}(hhh](j,)}(hhh]h)}(h5000h]h5000}(hjՂhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj҂ubah}(h]h ]h"]h$]h&]uh1j+hjςubj,)}(hhh]h)}(h-Mbit/s for SuperSpeed USB (added for USB 3.0)h]h-Mbit/s for SuperSpeed USB (added for USB 3.0)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1j+hjςubeh}(h]h ]h"]h$]h&]uh1j&hj#ubeh}(h]h ]h"]h$]h&]uh1j!hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j6hhhM hjЁhhubh)}(hFor reasons lost in the mists of time, the Port number is always too low by 1. For example, a device plugged into port 4 will show up with ``Port=03``.h](hFor reasons lost in the mists of time, the Port number is always too low by 1. For example, a device plugged into port 4 will show up with }(hjhhhNhNubj)}(h ``Port=03``h]hPort=03}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjЁhhubeh}(h] topology-infoah ]h"] topology infoah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hBandwidth infoh]hBandwidth info}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhhhhhMubj )}(hB: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd | | | |__Number of isochronous requests | | |__Number of interrupt requests | |__Total Bandwidth allocated to this bus |__Bandwidth info tagh]hB: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd | | | |__Number of isochronous requests | | |__Number of interrupt requests | |__Total Bandwidth allocated to this bus |__Bandwidth info tag}hjXsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjGhhubh)}(hXCBandwidth allocation is an approximation of how much of one frame (millisecond) is in use. It reflects only periodic transfers, which are the only transfers that reserve bandwidth. Control and bulk transfers use all other bandwidth, including reserved bandwidth that is not used for transfers (such as for short packets).h]hXCBandwidth allocation is an approximation of how much of one frame (millisecond) is in use. It reflects only periodic transfers, which are the only transfers that reserve bandwidth. Control and bulk transfers use all other bandwidth, including reserved bandwidth that is not used for transfers (such as for short packets).}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjGhhubh)}(hThe percentage is how much of the "reserved" bandwidth is scheduled by those transfers. For a low or full speed bus (loosely, "USB 1.1"), 90% of the bus bandwidth is reserved. For a high speed bus (loosely, "USB 2.0") 80% is reserved.h]hThe percentage is how much of the “reserved” bandwidth is scheduled by those transfers. For a low or full speed bus (loosely, “USB 1.1”), 90% of the bus bandwidth is reserved. For a high speed bus (loosely, “USB 2.0”) 80% is reserved.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hjGhhubeh}(h]bandwidth-infoah ]h"]bandwidth infoah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h(Device descriptor info & Product ID infoh]h(Device descriptor info & Product ID info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM,ubj )}(h\D: Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd P: Vendor=xxxx ProdID=xxxx Rev=xx.xxh]h\D: Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd P: Vendor=xxxx ProdID=xxxx Rev=xx.xx}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhM0hjhhubh)}(hwhere::h]hwhere:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjhhubj )}(hXD: Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd | | | | | | |__NumberConfigurations | | | | | |__MaxPacketSize of Default Endpoint | | | | |__DeviceProtocol | | | |__DeviceSubClass | | |__DeviceClass | |__Device USB version |__Device info tag #1h]hXD: Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd | | | | | | |__NumberConfigurations | | | | | |__MaxPacketSize of Default Endpoint | | | | |__DeviceProtocol | | | |__DeviceSubClass | | |__DeviceClass | |__Device USB version |__Device info tag #1}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhM5hjhhubh)}(hwhere::h]hwhere:}(hjŃhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hjhhubj )}(hP: Vendor=xxxx ProdID=xxxx Rev=xx.xx | | | |__Product revision number | | |__Product ID code | |__Vendor ID code |__Device info tag #2h]hP: Vendor=xxxx ProdID=xxxx Rev=xx.xx | | | |__Product revision number | | |__Product ID code | |__Vendor ID code |__Device info tag #2}hjӃsbah}(h]h ]h"]h$]h&]jjuh1j hhhM@hjhhubeh}(h]&device-descriptor-info-product-id-infoah ]h"](device descriptor info & product id infoah$]h&]uh1hhjhhhhhM,ubh)}(hhh](h)}(hString descriptor infoh]hString descriptor info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMHubj )}(hXS: Manufacturer=ssss | |__Manufacturer of this device as read from the device. | For USB host controller drivers (virtual root hubs) this may | be omitted, or (for newer drivers) will identify the kernel | version and the driver which provides this hub emulation. |__String info tag S: Product=ssss | |__Product description of this device as read from the device. | For older USB host controller drivers (virtual root hubs) this | indicates the driver; for newer ones, it's a product (and vendor) | description that often comes from the kernel's PCI ID database. |__String info tag S: SerialNumber=ssss | |__Serial Number of this device as read from the device. | For USB host controller drivers (virtual root hubs) this is | some unique ID, normally a bus ID (address or slot name) that | can't be shared with any other device. |__String info tagh]hXS: Manufacturer=ssss | |__Manufacturer of this device as read from the device. | For USB host controller drivers (virtual root hubs) this may | be omitted, or (for newer drivers) will identify the kernel | version and the driver which provides this hub emulation. |__String info tag S: Product=ssss | |__Product description of this device as read from the device. | For older USB host controller drivers (virtual root hubs) this | indicates the driver; for newer ones, it's a product (and vendor) | description that often comes from the kernel's PCI ID database. |__String info tag S: SerialNumber=ssss | |__Serial Number of this device as read from the device. | For USB host controller drivers (virtual root hubs) this is | some unique ID, normally a bus ID (address or slot name) that | can't be shared with any other device. |__String info tag}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhMKhjhhubeh}(h]string-descriptor-infoah ]h"]string descriptor infoah$]h&]uh1hhjhhhhhMHubh)}(hhh](h)}(hConfiguration descriptor infoh]hConfiguration descriptor info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMcubj )}(hXC:* #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA | | | | | |__MaxPower in mA | | | | |__Attributes | | | |__ConfiguratioNumber | | |__NumberOfInterfaces | |__ "*" indicates the active configuration (others are " ") |__Config info tagh]hXC:* #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA | | | | | |__MaxPower in mA | | | | |__Attributes | | | |__ConfiguratioNumber | | |__NumberOfInterfaces | |__ "*" indicates the active configuration (others are " ") |__Config info tag}hj!sbah}(h]h ]h"]h$]h&]jjuh1j hhhMfhjhhubh)}(hXUSB devices may have multiple configurations, each of which act rather differently. For example, a bus-powered configuration might be much less capable than one that is self-powered. Only one device configuration can be active at a time; most devices have only one configuration.h]hXUSB devices may have multiple configurations, each of which act rather differently. For example, a bus-powered configuration might be much less capable than one that is self-powered. Only one device configuration can be active at a time; most devices have only one configuration.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMnhjhhubh)}(hX$Each configuration consists of one or more interfaces. Each interface serves a distinct "function", which is typically bound to a different USB device driver. One common example is a USB speaker with an audio interface for playback, and a HID interface for use with software volume control.h]hX(Each configuration consists of one or more interfaces. Each interface serves a distinct “function”, which is typically bound to a different USB device driver. One common example is a USB speaker with an audio interface for playback, and a HID interface for use with software volume control.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthjhhubeh}(h]configuration-descriptor-infoah ]h"]configuration descriptor infoah$]h&]uh1hhjhhhhhMcubh)}(hhh](h)}(h6Interface descriptor info (can be multiple per Config)h]h6Interface descriptor info (can be multiple per Config)}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShhhhhM{ubj )}(hX/I:* If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss | | | | | | | | |__Driver name | | | | | | | | or "(none)" | | | | | | | |__InterfaceProtocol | | | | | | |__InterfaceSubClass | | | | | |__InterfaceClass | | | | |__NumberOfEndpoints | | | |__AlternateSettingNumber | | |__InterfaceNumber | |__ "*" indicates the active altsetting (others are " ") |__Interface info tagh]hX/I:* If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss | | | | | | | | |__Driver name | | | | | | | | or "(none)" | | | | | | | |__InterfaceProtocol | | | | | | |__InterfaceSubClass | | | | | |__InterfaceClass | | | | |__NumberOfEndpoints | | | |__AlternateSettingNumber | | |__InterfaceNumber | |__ "*" indicates the active altsetting (others are " ") |__Interface info tagT}hjdsbah}(h]h ]h"]h$]h&]jjuh1j hhhM~hjShhubh)}(hA given interface may have one or more "alternate" settings. For example, default settings may not use more than a small amount of periodic bandwidth. To use significant fractions of bus bandwidth, drivers must select a non-default altsetting.h]hA given interface may have one or more “alternate” settings. For example, default settings may not use more than a small amount of periodic bandwidth. To use significant fractions of bus bandwidth, drivers must select a non-default altsetting.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjShhubh)}(hOnly one setting for an interface may be active at a time, and only one driver may bind to an interface at a time. Most devices have only one alternate setting per interface.h]hOnly one setting for an interface may be active at a time, and only one driver may bind to an interface at a time. Most devices have only one alternate setting per interface.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjShhubeh}(h]4interface-descriptor-info-can-be-multiple-per-configah ]h"]6interface descriptor info (can be multiple per config)ah$]h&]uh1hhjhhhhhM{ubh)}(hhh](h)}(h8Endpoint descriptor info (can be multiple per Interface)h]h8Endpoint descriptor info (can be multiple per Interface)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj )}(hX E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddss | | | | |__Interval (max) between transfers | | | |__EndpointMaxPacketSize | | |__Attributes(EndpointType) | |__EndpointAddress(I=In,O=Out) |__Endpoint info tagh]hX E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddss | | | | |__Interval (max) between transfers | | | |__EndpointMaxPacketSize | | |__Attributes(EndpointType) | |__EndpointAddress(I=In,O=Out) |__Endpoint info tag}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubh)}(hThe interval is nonzero for all periodic (interrupt or isochronous) endpoints. For high speed endpoints the transfer interval may be measured in microseconds rather than milliseconds.h]hThe interval is nonzero for all periodic (interrupt or isochronous) endpoints. For high speed endpoints the transfer interval may be measured in microseconds rather than milliseconds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hFor high speed periodic endpoints, the ``EndpointMaxPacketSize`` reflects the per-microframe data transfer size. For "high bandwidth" endpoints, that can reflect two or three packets (for up to 3KBytes every 125 usec) per endpoint.h](h'For high speed periodic endpoints, the }(hjÄhhhNhNubj)}(h``EndpointMaxPacketSize``h]hEndpointMaxPacketSize}(hj˄hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÄubh reflects the per-microframe data transfer size. For “high bandwidth” endpoints, that can reflect two or three packets (for up to 3KBytes every 125 usec) per endpoint.}(hjÄhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hWith the Linux-USB stack, periodic bandwidth reservations use the transfer intervals and sizes provided by URBs, which can be less than those found in endpoint descriptor.h]hWith the Linux-USB stack, periodic bandwidth reservations use the transfer intervals and sizes provided by URBs, which can be less than those found in endpoint descriptor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]6endpoint-descriptor-info-can-be-multiple-per-interfaceah ]h"]8endpoint descriptor info (can be multiple per interface)ah$]h&]uh1hhjhhhhhMubeh}(h]*sys-kernel-debug-usb-devices-output-formatah ]h"]+/sys/kernel/debug/usb/devices output formatah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hUsage examplesh]hUsage examples}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hXIf a user or script is interested only in Topology info, for example, use something like ``grep ^T: /sys/kernel/debug/usb/devices`` for only the Topology lines. A command like ``grep -i ^[tdp]: /sys/kernel/debug/usb/devices`` can be used to list only the lines that begin with the characters in square brackets, where the valid characters are TDPCIE. With a slightly more able script, it can display any selected lines (for example, only T, D, and P lines) and change their output format. (The ``procusb`` Perl script is the beginning of this idea. It will list only selected lines [selected from TBDPSCIE] or "All" lines from ``/sys/kernel/debug/usb/devices``.)h](hYIf a user or script is interested only in Topology info, for example, use something like }(hjhhhNhNubj)}(h*``grep ^T: /sys/kernel/debug/usb/devices``h]h&grep ^T: /sys/kernel/debug/usb/devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. for only the Topology lines. A command like }(hjhhhNhNubj)}(h1``grep -i ^[tdp]: /sys/kernel/debug/usb/devices``h]h-grep -i ^[tdp]: /sys/kernel/debug/usb/devices}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX can be used to list only the lines that begin with the characters in square brackets, where the valid characters are TDPCIE. With a slightly more able script, it can display any selected lines (for example, only T, D, and P lines) and change their output format. (The }(hjhhhNhNubj)}(h ``procusb``h]hprocusb}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh Perl script is the beginning of this idea. It will list only selected lines [selected from TBDPSCIE] or “All” lines from }(hjhhhNhNubj)}(h!``/sys/kernel/debug/usb/devices``h]h/sys/kernel/debug/usb/devices}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hThe Topology lines can be used to generate a graphic/pictorial of the USB devices on a system's root hub. (See more below on how to do this.)h]hThe Topology lines can be used to generate a graphic/pictorial of the USB devices on a system’s root hub. (See more below on how to do this.)}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hzThe Interface lines can be used to determine what driver is being used for each device, and which altsetting it activated.h]hzThe Interface lines can be used to determine what driver is being used for each device, and which altsetting it activated.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hThe Configuration lines could be used to list maximum power (in milliamps) that a system's USB devices are using. For example, ``grep ^C: /sys/kernel/debug/usb/devices``.h](hThe Configuration lines could be used to list maximum power (in milliamps) that a system’s USB devices are using. For example, }(hjhhhNhNubj)}(h*``grep ^C: /sys/kernel/debug/usb/devices``h]h&grep ^C: /sys/kernel/debug/usb/devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hHere's an example, from a system which has a UHCI root hub, an external hub connected to the root hub, and a mouse and a serial converter connected to the external hub.h]hHere’s an example, from a system which has a UHCI root hub, an external hub connected to the root hub, and a mouse and a serial converter connected to the external hub.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj )}(hXT: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 28/900 us ( 3%), #Int= 2, #Iso= 0 D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0000 ProdID=0000 Rev= 0.00 S: Product=USB UHCI Root Hub S: SerialNumber=dce0 C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4 D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0451 ProdID=1446 Rev= 1.00 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=04b4 ProdID=0001 Rev= 0.00 C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse E: Ad=81(I) Atr=03(Int.) MxPS= 3 Ivl= 10ms T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0565 ProdID=0001 Rev= 1.08 S: Manufacturer=Peracom Networks, Inc. S: Product=Peracom USB to Serial Converter C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serial E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl= 16ms E: Ad=01(O) Atr=02(Bulk) MxPS= 16 Ivl= 16ms E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl= 8msh]hXT: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 28/900 us ( 3%), #Int= 2, #Iso= 0 D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0000 ProdID=0000 Rev= 0.00 S: Product=USB UHCI Root Hub S: SerialNumber=dce0 C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4 D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0451 ProdID=1446 Rev= 1.00 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=04b4 ProdID=0001 Rev= 0.00 C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse E: Ad=81(I) Atr=03(Int.) MxPS= 3 Ivl= 10ms T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0565 ProdID=0001 Rev= 1.08 S: Manufacturer=Peracom Networks, Inc. S: Product=Peracom USB to Serial Converter C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serial E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl= 16ms E: Ad=01(O) Atr=02(Bulk) MxPS= 16 Ivl= 16ms E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl= 8ms}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubh)}(hdSelecting only the ``T:`` and ``I:`` lines from this (for example, by using ``procusb ti``), we haveh](hSelecting only the }(hjhhhNhNubj)}(h``T:``h]hT:}(hjȅhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h``I:``h]hI:}(hjڅhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( lines from this (for example, by using }(hjhhhNhNubj)}(h``procusb ti``h]h procusb ti}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ), we have}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj )}(hXT: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4 I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serialh]hXT: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4 I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serial}hjsbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubh)}(h7Physically this looks like (or could be converted to)::h]h6Physically this looks like (or could be converted to):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj )}(hX; +------------------+ | PC/root_hub (12)| Dev# = 1 +------------------+ (nn) is Mbps. Level 0 | CN.0 | CN.1 | [CN = connector/port #] +------------------+ / / +-----------------------+ Level 1 | Dev#2: 4-port hub (12)| +-----------------------+ |CN.0 |CN.1 |CN.2 |CN.3 | +-----------------------+ \ \____________________ \_____ \ \ \ +--------------------+ +--------------------+ Level 2 | Dev# 3: mouse (1.5)| | Dev# 4: serial (12)| +--------------------+ +--------------------+h]hX; +------------------+ | PC/root_hub (12)| Dev# = 1 +------------------+ (nn) is Mbps. Level 0 | CN.0 | CN.1 | [CN = connector/port #] +------------------+ / / +-----------------------+ Level 1 | Dev#2: 4-port hub (12)| +-----------------------+ |CN.0 |CN.1 |CN.2 |CN.3 | +-----------------------+ \ \____________________ \_____ \ \ \ +--------------------+ +--------------------+ Level 2 | Dev# 3: mouse (1.5)| | Dev# 4: serial (12)| +--------------------+ +--------------------+}hj sbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubh)}(h]Or, in a more tree-like structure (ports [Connectors] without connections could be omitted)::h]h\Or, in a more tree-like structure (ports [Connectors] without connections could be omitted):}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj )}(hPC: Dev# 1, root hub, 2 ports, 12 Mbps |_ CN.0: Dev# 2, hub, 4 ports, 12 Mbps |_ CN.0: Dev #3, mouse, 1.5 Mbps |_ CN.1: |_ CN.2: Dev #4, serial, 12 Mbps |_ CN.3: |_ CN.1:h]hPC: Dev# 1, root hub, 2 ports, 12 Mbps |_ CN.0: Dev# 2, hub, 4 ports, 12 Mbps |_ CN.0: Dev #3, mouse, 1.5 Mbps |_ CN.1: |_ CN.2: Dev #4, serial, 12 Mbps |_ CN.3: |_ CN.1:}hj<sbah}(h]h ]h"]h$]h&]jjuh1j hhhMhjhhubeh}(h]usage-examplesah ]h"]usage examplesah$]h&]uh1hhjhhhhhMubeh}(h]sys-kernel-debug-usb-devicesah ]h"]/sys/kernel/debug/usb/devicesah$]h&]uh1hhjhhhhhMubeh}(h]the-usb-devicesah ]h"]the usb devicesah$]h&]uh1hhhhhhhhMubeh}(h](the-linux-usb-host-side-apiheh ]h"](the linux-usb host side apiusb-hostside-apieh$]h&]uh1hhhhhhhhKjO}jhhsjQ}hhsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksj+footnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}(h]haj]jajE]j;aunameids}(jhhjgjdj)j&jjjLjjKjHjqjEjqjqjBjBj6tj3tjjjvjujwjwjxjxjjj{j{j~j~jjj_j\jWjTjjjDjAjjjjj j jPjMjjjjjOjLu nametypes}(jhjgj)jjLjKjqjqjBj6tjjvjwjxjj{j~jj_jWjjDjjj jPjjjOuh}(hhjdhj&hjj,jjjHjj jjjj jjjj2 j7 j j jW j\ jj jZj_jxj}jjj#j(jEjSjqjSj~jjjjV!j[!ja#jf#j%j%j'j'j:6j?6j7j7jZ9j_9j%<j*<jh=jm=j?j"?j@j@jBjBjCjCj EjEjFjFjHjHjJJjOJjnOjsOj*Sj/SjUj UjVjVj]j]j cj%cjgjgjljljnjnjpjpjBjqjqjqjtsjysjujujvwj{wjYyj^yj{j{j}j }jjjjj4j9jjjXj]jjjjj6j;jƏjˏjGjLjגjܒjIjNjjjjjj jjjj jߢjjXj]jůjʯjjjpjuj׽jܽj.j3jjjjjjjjjjjjjjjjjjjjj?jDjjjjjCjHjj$jXj]jjjjjjjjjjjLjQjjjjjjj(j-j2j7jjjjj>jCj j jkjpjjjjjjjjjjjjj"j"j$j$jH&jM&j:(j?(j)j)j+j+jD.jI.j/j/jX3j]3jV6j[6j 8j8jH:jM:j;j;j=j=j?j?j3tjBjBjBj\EjaEjGjGjKjKjUMjZMjYPj^Pj^TjcTjWjWjHYjMYj[j[j]j]j0_j5_jPcjUcjfjfj[ij`ijkjkjmjmj\ojaojpjpjrjrjj9tjujFujwjvjxjwjjxj{jUyj~j|jj~j\jjTjjjjAjЁjjGjjj jjMjjjSjjjLju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]hsystem_message)}(hhh]h)}(h`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.h]hdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOlineMsourcehuh1jhjubatransform_messages](j)}(hhh]h)}(hhh]h6Hyperlink target "usb-hostside-api" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKuh1jubj)}(hhh]h)}(hhh]h2Hyperlink target "usb-chapter9" is not referenced.}hj1sbah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKkuh1jubj)}(hhh]h)}(hhh]h0Hyperlink target "usb-header" is not referenced.}hjKsbah}(h]h ]h"]h$]h&]uh1hhjHubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineK~uh1jube transformerN include_log] decorationNhhub.