The Linux-USB Host Side API
This documentation is free software; you can redistribute
it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA
For more details see the file COPYING in the source
distribution of Linux.
Introduction to USB on Linux
A 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
one USB 2.0 tree (480 Mbit/sec each) with
a few USB 1.1 trees (12 Mbit/sec each) that are used when you
connect a USB 1.1 device directly to the machine's "root hub".
That master/slave asymmetry was designed-in for a number of
reasons, one being ease of use. It is not physically possible to
assemble (legal) USB cables incorrectly: all upstream "to the host"
connectors are the rectangular type (matching the sockets on
root hubs), and all downstream connectors are the squarish type
(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.
And finally, at the electrical level, bus protocol overhead is reduced by
eliminating arbitration and moving scheduling into the host software.
USB 1.0 was announced in January 1996 and was revised
as USB 1.1 (with improvements in hub specification and
support for interrupt-out transfers) in September 1998.
USB 2.0 was released in April 2000, adding high-speed
transfers and transaction-translating hubs (used for USB 1.1
and 1.0 backward compatibility).
Kernel developers added USB support to Linux early in the 2.2 kernel
series, shortly before 2.3 development forked. Updates from 2.3 were
regularly folded back into 2.2 releases, which improved reliability and
brought /sbin/hotplug support as well more drivers.
Such improvements were continued in the 2.5 kernel series, where they added
USB 2.0 support, improved performance, and made the host controller drivers
(HCDs) more consistent. They also simplified the API (to make bugs less
likely) and added internal "kerneldoc" documentation.
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.
USB Host-Side API Model
Host-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.
The device model seen by USB drivers is relatively complex.
USB 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.
The device description model includes one or more
"configurations" per device, only one of which is active at a time.
Devices that are capable of high-speed operation must also support
full-speed configurations, along with a way to ask about the
"other speed" configurations which might be used.
Configurations have one or more "interfaces", each
of which may have "alternate settings". Interfaces may be
standardized by USB "Class" specifications, or may be specific to
a vendor or device.
USB device drivers actually bind to interfaces, not devices.
Think of them as "interface drivers", though you
may not see many devices where the distinction is important.
Most USB devices are simple, with only one configuration,
one interface, and one alternate setting.
Interfaces have one or more "endpoints", each of
which supports one type and direction of data transfer such as
"bulk out" or "interrupt in". The entire configuration may have
up to sixteen endpoints in each direction, allocated as needed
among all the interfaces.
Data transfer on USB is packetized; each endpoint
has a maximum packet size.
Drivers must often be aware of conventions such as flagging the end
of bulk transfers using "short" (including zero length) packets.
The Linux USB API supports synchronous calls for
control and bulk messages.
It also supports asynchronous calls for all kinds of data transfer,
using request structures called "URBs" (USB Request Blocks).
Accordingly, the USB Core API exposed to device drivers
covers quite a lot of territory. You'll probably need to consult
the USB 2.0 specification, available online from www.usb.org at
no cost, as well as class or device specifications.
The only host-side drivers that actually touch hardware
(reading/writing registers, handling IRQs, and so on) are the HCDs.
In theory, all HCDs provide the same functionality through the same
API. In practice, that's becoming more true on the 2.5 kernels,
but there are still differences that crop up especially with
fault handling. Different controllers don't necessarily report
the same aspects of failures, and recovery from faults (including
software-induced ones like unlinking an URB) isn't yet fully
consistent.
Device driver authors should make a point of doing disconnect
testing (while the device is active) with each different host
controller driver, to make sure drivers don't have bugs of
their own as well as to make sure they aren't relying on some
HCD-specific behavior.
(You will need external USB 1.1 and/or
USB 2.0 hubs to perform all those tests.)
USB-Standard Types
In <linux/usb/ch9.h> you will find
the USB data types defined in chapter 9 of the USB specification.
These data types are used throughout USB, and in APIs including
this host side API, gadget APIs, and usbfs.
LINUX
Kernel Hackers Manual
July 2017
usb_speed_string
9
4.1.27
usb_speed_string
Returns human readable-name of the speed.
Synopsis
const char * usb_speed_string
enum usb_device_speed speed
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_state_string
9
4.1.27
usb_state_string
Returns human readable name for the state.
Synopsis
const char * usb_state_string
enum usb_device_state state
Arguments
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.
Host-Side Data Types and Macros
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.
LINUX
Kernel Hackers Manual
July 2017
struct usb_host_endpoint
9
4.1.27
struct usb_host_endpoint
host-side endpoint descriptor and queue
Synopsis
struct usb_host_endpoint {
struct usb_endpoint_descriptor desc;
struct usb_ss_ep_comp_descriptor ss_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
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 endpoint
Description
USB requests are always queued to a given endpoint, identified by a
descriptor within an active interface in a given USB configuration.
LINUX
Kernel Hackers Manual
July 2017
struct usb_interface
9
4.1.27
struct usb_interface
what usb device drivers talk to
Synopsis
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;
struct device dev;
struct device * usb_dev;
atomic_t pm_usage_cnt;
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.
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.
pm_usage_cnt
PM usage counter for this interface
reset_ws
Used for scheduling resets from atomic context.
Description
USB 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.
The 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.
Each 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.
The 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.
LINUX
Kernel Hackers Manual
July 2017
struct usb_interface_cache
9
4.1.27
struct usb_interface_cache
long-term representation of a device interface
Synopsis
struct usb_interface_cache {
unsigned num_altsetting;
struct kref ref;
struct usb_host_interface altsetting[0];
};
Members
num_altsetting
number of altsettings defined.
ref
reference counter.
altsetting[0]
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.
Description
These 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 /proc/bus/usb/devices pseudo-file.
LINUX
Kernel Hackers Manual
July 2017
struct usb_host_config
9
4.1.27
struct usb_host_config
representation of a device's configuration
Synopsis
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[USB_MAXIADS]
list of any interface association descriptors in this config
interface[USB_MAXINTERFACES]
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
the configuration is active.
intf_cache[USB_MAXINTERFACES]
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.
Description
USB devices may have multiple configurations, but only one can be active
at any time. Each encapsulates a different operational environment;
for example, a dual-speed device would have separate configurations for
full-speed and high-speed operation. The number of configurations
available is stored in the device descriptor as bNumConfigurations.
A configuration can contain multiple interfaces. Each corresponds to
a different function of the USB device, and all are available whenever
the configuration is active. The USB standard says that interfaces
are supposed to be numbered from 0 to desc.bNumInterfaces-1, but a lot
of devices get this wrong. In addition, the interface array is not
guaranteed to be sorted in numerical order. Use usb_ifnum_to_if to
look up an interface entry based on its number.
Device drivers should not attempt to activate configurations. The choice
of which configuration to install is a policy decision based on such
considerations as available power, functionality provided, and the user's
desires (expressed through userspace tools). However, drivers can call
usb_reset_configuration to reinitialize the current configuration and
all its interfaces.
LINUX
Kernel Hackers Manual
July 2017
struct usb_device
9
4.1.27
struct usb_device
kernel's representation of a USB device
Synopsis
struct usb_device {
int devnum;
char devpath[16];
u32 route;
enum usb_device_state state;
enum usb_device_speed speed;
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;
unsigned can_submit:1;
unsigned persist_enabled:1;
unsigned have_langid:1;
unsigned authorized:1;
unsigned authenticated:1;
unsigned wusb:1;
unsigned lpm_capable: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_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;
#ifdef CONFIG_PM
unsigned long connect_time;
unsigned do_remote_wakeup:1;
unsigned reset_resume:1;
unsigned port_is_suspended:1;
#endif
struct wusb_dev * wusb_dev;
int slot_id;
enum usb_device_removable removable;
struct usb2_lpm_parameters l1_params;
struct usb3_lpm_parameters u1_params;
struct usb3_lpm_parameters u2_params;
unsigned lpm_disable_count;
};
Members
devnum
device number; address on a USB bus
devpath[16]
device ID string for use in messages (e.g., /port/...)
route
tree topology hex string for use with xHCI
state
device state: configured, not attached, etc.
speed
device speed: high/full/low (or error)
tt
Transaction Translator info; used with low/full speed dev, highspeed hub
ttport
device port on that tt hub
toggle[2]
one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints
parent
our hub, unless we're the root
bus
bus we're part of
ep0
endpoint 0 data (default control pipe)
dev
generic device interface
descriptor
USB device descriptor
bos
USB device BOS descriptor set
config
all of the device's configs
actconfig
the active configuration
ep_in[16]
array of IN endpoints
ep_out[16]
array of OUT endpoints
rawdescriptors
raw descriptors for each config
bus_mA
Current available from the bus
portnum
parent port number (origin 1)
level
number of USB hub ancestors
can_submit
URBs may be submitted
persist_enabled
USB_PERSIST enabled for this device
have_langid
whether string_langid is valid
authorized
policy has said we can use it;
(user space) policy determines if we authorize this device to be
used or not. By default, wired USB devices are authorized.
WUSB devices are not, until we authorize them from user space.
FIXME -- complete doc
authenticated
Crypto authentication passed
wusb
device is Wireless USB
lpm_capable
device supports LPM
usb2_hw_lpm_capable
device can perform USB2 hardware LPM
usb2_hw_lpm_besl_capable
device can perform USB2 hardware BESL LPM
usb2_hw_lpm_enabled
USB2 hardware LPM is enabled
usb2_hw_lpm_allowed
Userspace allows USB 2.0 LPM to be enabled
usb3_lpm_enabled
USB3 hardware LPM enabled
string_langid
language ID for strings
product
iProduct string, if present (static)
manufacturer
iManufacturer string, if present (static)
serial
iSerialNumber string, if present (static)
filelist
usbfs files that are open to this device
maxchild
number of ports if hub
quirks
quirks of the whole device
urbnum
number of URBs submitted for the whole device
active_duration
total time device is not suspended
connect_time
time device was first connected
do_remote_wakeup
remote wakeup should be enabled
reset_resume
needs reset instead of resume
port_is_suspended
the upstream port is suspended (L2 or U3)
wusb_dev
if this is a Wireless USB device, link to the WUSB
specific data for the device.
slot_id
Slot ID assigned by xHCI
removable
Device can be physically removed from this port
l1_params
best effor service latency for USB2 L1 LPM state, and L1 timeout.
u1_params
exit latencies for USB3 U1 LPM state, and hub-initiated timeout.
u2_params
exit latencies for USB3 U2 LPM state, and hub-initiated timeout.
lpm_disable_count
Ref count used by usb_disable_lpm and usb_enable_lpm
to keep track of the number of functions that require USB 3.0 Link Power
Management to be disabled for this usb_device. This count should only
be manipulated by those functions, with the bandwidth_mutex is held.
Notes
Usbcore drivers should not set usbdev->state directly. Instead use
usb_set_device_state.
LINUX
Kernel Hackers Manual
July 2017
usb_hub_for_each_child
9
4.1.27
usb_hub_for_each_child
iterate over all child devices on the hub
Synopsis
usb_hub_for_each_child
hdev
port1
child
Arguments
hdev
USB device belonging to the usb hub
port1
portnum associated with child device
child
child device pointer
LINUX
Kernel Hackers Manual
July 2017
usb_interface_claimed
9
4.1.27
usb_interface_claimed
returns true iff an interface is claimed
Synopsis
int usb_interface_claimed
struct usb_interface * iface
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_make_path
9
4.1.27
usb_make_path
returns stable device path in the usb tree
Synopsis
int usb_make_path
struct usb_device * dev
char * buf
size_t size
Arguments
dev
the device whose path is being constructed
buf
where to put the string
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.
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE
9
4.1.27
USB_DEVICE
macro used to describe a specific usb device
Synopsis
USB_DEVICE
vend
prod
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE_VER
9
4.1.27
USB_DEVICE_VER
describe a specific usb device with a version range
Synopsis
USB_DEVICE_VER
vend
prod
lo
hi
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE_INTERFACE_CLASS
9
4.1.27
USB_DEVICE_INTERFACE_CLASS
describe a usb device with a specific interface class
Synopsis
USB_DEVICE_INTERFACE_CLASS
vend
prod
cl
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE_INTERFACE_PROTOCOL
9
4.1.27
USB_DEVICE_INTERFACE_PROTOCOL
describe a usb device with a specific interface protocol
Synopsis
USB_DEVICE_INTERFACE_PROTOCOL
vend
prod
pr
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE_INTERFACE_NUMBER
9
4.1.27
USB_DEVICE_INTERFACE_NUMBER
describe a usb device with a specific interface number
Synopsis
USB_DEVICE_INTERFACE_NUMBER
vend
prod
num
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE_INFO
9
4.1.27
USB_DEVICE_INFO
macro used to describe a class of usb devices
Synopsis
USB_DEVICE_INFO
cl
sc
pr
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_INTERFACE_INFO
9
4.1.27
USB_INTERFACE_INFO
macro used to describe a class of usb interfaces
Synopsis
USB_INTERFACE_INFO
cl
sc
pr
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_DEVICE_AND_INTERFACE_INFO
9
4.1.27
USB_DEVICE_AND_INTERFACE_INFO
describe a specific usb device with a class of usb interfaces
Synopsis
USB_DEVICE_AND_INTERFACE_INFO
vend
prod
cl
sc
pr
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
USB_VENDOR_AND_INTERFACE_INFO
9
4.1.27
USB_VENDOR_AND_INTERFACE_INFO
describe a specific usb vendor with a class of usb interfaces
Synopsis
USB_VENDOR_AND_INTERFACE_INFO
vend
cl
sc
pr
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
struct usbdrv_wrap
9
4.1.27
struct usbdrv_wrap
wrapper for driver-model structure
Synopsis
struct usbdrv_wrap {
struct device_driver driver;
int for_devices;
};
Members
driver
The driver-model core driver structure.
for_devices
Non-zero for device drivers, 0 for interface drivers.
LINUX
Kernel Hackers Manual
July 2017
struct usb_driver
9
4.1.27
struct usb_driver
identifies USB interface driver to usbcore
Synopsis
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);
const struct usb_device_id * id_table;
struct usb_dynids dynids;
struct usbdrv_wrap drvwrap;
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
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.
dynids
used internally to hold the list of dynamically added device
ids for this driver.
drvwrap
Driver-model core structure wrapper.
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.
Description
USB interface drivers must provide a name, probe and disconnect
methods, and an id_table. Other driver fields are optional.
The id_table is used in hotplugging. It holds a set of descriptors,
and specialized data may be associated with each entry. That table
is used by both user and kernel mode hotplugging support.
The probe and disconnect methods are called in a context where
they can sleep, but they should avoid abusing the privilege. Most
work to connect to a device should be done when the device is opened,
and undone at the last close. The disconnect code needs to address
concurrency issues with respect to open and close methods, as
well as forcing all pending I/O requests to complete (by unlinking
them as necessary, and blocking until the unlinks complete).
LINUX
Kernel Hackers Manual
July 2017
struct usb_device_driver
9
4.1.27
struct usb_device_driver
identifies USB device driver to usbcore
Synopsis
struct usb_device_driver {
const char * name;
int (* probe) (struct usb_device *udev);
void (* disconnect) (struct usb_device *udev);
int (* suspend) (struct usb_device *udev, pm_message_t message);
int (* resume) (struct usb_device *udev, pm_message_t message);
struct usbdrv_wrap drvwrap;
unsigned int supports_autosuspend: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
device. If it is, probe returns zero and uses dev_set_drvdata
to associate driver-specific data with the device. If unwilling
to manage the device, return a negative errno value.
disconnect
Called when the device is no longer accessible, usually
because it has been (or is being) disconnected or the driver's
module is being unloaded.
suspend
Called when the device is going to be suspended by the system.
resume
Called when the device is being resumed by the system.
drvwrap
Driver-model core structure wrapper.
supports_autosuspend
if set to 0, the USB core will not allow autosuspend
for devices bound to this driver.
Description
USB drivers must provide all the fields listed above except drvwrap.
LINUX
Kernel Hackers Manual
July 2017
struct usb_class_driver
9
4.1.27
struct usb_class_driver
identifies a USB driver that wants to use the USB major number
Synopsis
struct usb_class_driver {
char * name;
char *(* devnode) (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.
Description
This structure is used for the usb_register_dev and
usb_unregister_dev functions, to consolidate a number of the
parameters used for them.
LINUX
Kernel Hackers Manual
July 2017
module_usb_driver
9
4.1.27
module_usb_driver
Helper macro for registering a USB driver
Synopsis
module_usb_driver
__usb_driver
Arguments
__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
LINUX
Kernel Hackers Manual
July 2017
struct urb
9
4.1.27
struct urb
USB Request Block
Synopsis
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[0];
};
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[0]
Used to provide arrays of ISO transfer buffers and to
collect the transfer status for each buffer.
Description
This 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.
Data Transfer Buffers
Normally 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.
Alternatively, 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.
Note that transfer_buffer must still be set if the controller
does not support DMA (as indicated by bus.uses_dma) and when talking
to root hub. If you have to trasfer 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.
Initialization
All 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.
Bulk 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.
Control 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.
Interrupt 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.)
If 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.
Isochronous 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.
Completion Callbacks
The 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.
The context field is normally used to link URBs back to the relevant
driver or request state.
When 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.
ISO 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.
Note 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.
LINUX
Kernel Hackers Manual
July 2017
usb_fill_control_urb
9
4.1.27
usb_fill_control_urb
initializes a control urb
Synopsis
void 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
Arguments
urb
pointer to the urb to initialize.
dev
pointer to the struct usb_device for this urb.
pipe
the endpoint pipe
setup_packet
pointer to the setup_packet buffer
transfer_buffer
pointer to the transfer buffer
buffer_length
length of the transfer buffer
complete_fn
pointer to the usb_complete_t function
context
what to set the urb context to.
Description
Initializes a control urb with the proper information needed to submit
it to a device.
LINUX
Kernel Hackers Manual
July 2017
usb_fill_bulk_urb
9
4.1.27
usb_fill_bulk_urb
macro to help initialize a bulk urb
Synopsis
void 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
Arguments
urb
pointer to the urb to initialize.
dev
pointer to the struct usb_device for this urb.
pipe
the endpoint pipe
transfer_buffer
pointer to the transfer buffer
buffer_length
length of the transfer buffer
complete_fn
pointer to the usb_complete_t function
context
what to set the urb context to.
Description
Initializes a bulk urb with the proper information needed to submit it
to a device.
LINUX
Kernel Hackers Manual
July 2017
usb_fill_int_urb
9
4.1.27
usb_fill_int_urb
macro to help initialize a interrupt urb
Synopsis
void 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
Arguments
urb
pointer to the urb to initialize.
dev
pointer to the struct usb_device for this urb.
pipe
the endpoint pipe
transfer_buffer
pointer to the transfer buffer
buffer_length
length of the transfer buffer
complete_fn
pointer to the usb_complete_t function
context
what to set the urb context to.
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.
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).
Wireless USB also uses the logarithmic encoding, but specifies it in units of
128us instead of 125us. For Wireless USB devices, the interval is passed
through to the host controller, rather than being translated into microframe
units.
LINUX
Kernel Hackers Manual
July 2017
usb_urb_dir_in
9
4.1.27
usb_urb_dir_in
check if an URB describes an IN transfer
Synopsis
int usb_urb_dir_in
struct urb * urb
Arguments
urb
URB to be checked
Return
1 if urb describes an IN transfer (device-to-host),
otherwise 0.
LINUX
Kernel Hackers Manual
July 2017
usb_urb_dir_out
9
4.1.27
usb_urb_dir_out
check if an URB describes an OUT transfer
Synopsis
int usb_urb_dir_out
struct urb * urb
Arguments
urb
URB to be checked
Return
1 if urb describes an OUT transfer (host-to-device),
otherwise 0.
LINUX
Kernel Hackers Manual
July 2017
struct usb_sg_request
9
4.1.27
struct usb_sg_request
support for scatter/gather I/O
Synopsis
struct usb_sg_request {
int status;
size_t bytes;
};
Members
status
zero indicates success, else negative errno
bytes
counts bytes transferred.
Description
These requests are initialized using usb_sg_init, and then are used
as request handles passed to usb_sg_wait or usb_sg_cancel. Most
members of the request object aren't for driver access.
The status and bytecount values are valid only after usb_sg_wait
returns. If the status is zero, then the bytecount matches the total
from the request.
After an error completion, drivers may need to clear a halt condition
on the endpoint.
USB Core APIs
There are two basic I/O models in the USB API.
The most elemental one is asynchronous: drivers submit requests
in the form of an URB, and the URB's completion callback
handle the next step.
All USB transfer types support that model, although there
are special cases for control URBs (which always have setup
and status stages, but may not have a data stage) and
isochronous URBs (which allow large packets and include
per-packet fault reports).
Built on top of that is synchronous API support, where a
driver calls a routine that allocates one or more URBs,
submits them, and waits until they complete.
There are synchronous wrappers for single-buffer control
and bulk transfers (which are awkward to use in some
driver disconnect scenarios), and for scatterlist based
streaming i/o (bulk or interrupt).
USB drivers need to provide buffers that can be
used for DMA, although they don't necessarily need to
provide the DMA mapping themselves.
There are APIs to use used when allocating DMA buffers,
which can prevent use of bounce buffers on some systems.
In some cases, drivers may be able to rely on 64bit DMA
to eliminate another kind of bounce buffer.
LINUX
Kernel Hackers Manual
July 2017
usb_init_urb
9
4.1.27
usb_init_urb
initializes a urb so that it can be used by a USB driver
Synopsis
void usb_init_urb
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_alloc_urb
9
4.1.27
usb_alloc_urb
creates a new urb for a USB driver to use
Synopsis
struct urb * usb_alloc_urb
int iso_packets
gfp_t mem_flags
Arguments
iso_packets
number of iso packets for this urb
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.
LINUX
Kernel Hackers Manual
July 2017
usb_free_urb
9
4.1.27
usb_free_urb
frees the memory used by a urb when all users of it are finished
Synopsis
void usb_free_urb
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_get_urb
9
4.1.27
usb_get_urb
increments the reference count of the urb
Synopsis
struct urb * usb_get_urb
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_anchor_urb
9
4.1.27
usb_anchor_urb
anchors an URB while it is processed
Synopsis
void usb_anchor_urb
struct urb * urb
struct usb_anchor * anchor
Arguments
urb
pointer to the urb to 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 them
LINUX
Kernel Hackers Manual
July 2017
usb_unanchor_urb
9
4.1.27
usb_unanchor_urb
unanchors an URB
Synopsis
void usb_unanchor_urb
struct urb * urb
Arguments
urb
pointer to the urb to anchor
Description
Call this to stop the system keeping track of this URB
LINUX
Kernel Hackers Manual
July 2017
usb_submit_urb
9
4.1.27
usb_submit_urb
issue an asynchronous transfer request for an endpoint
Synopsis
int usb_submit_urb
struct urb * urb
gfp_t mem_flags
Arguments
urb
pointer to the urb describing the request
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.
Return
0 on successful submissions. A negative error number otherwise.
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
LINUX
Kernel Hackers Manual
July 2017
usb_unlink_urb
9
4.1.27
usb_unlink_urb
abort/cancel a transfer request for an endpoint
Synopsis
int usb_unlink_urb
struct urb * urb
Arguments
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.
Return
-EINPROGRESS on success. See description for other values on
failure.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_kill_urb
9
4.1.27
usb_kill_urb
cancel a transfer request and wait for it to finish
Synopsis
void usb_kill_urb
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_poison_urb
9
4.1.27
usb_poison_urb
reliably kill a transfer and prevent further use of an URB
Synopsis
void usb_poison_urb
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_block_urb
9
4.1.27
usb_block_urb
reliably prevent further use of an URB
Synopsis
void usb_block_urb
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_kill_anchored_urbs
9
4.1.27
usb_kill_anchored_urbs
cancel transfer requests en masse
Synopsis
void usb_kill_anchored_urbs
struct usb_anchor * anchor
Arguments
anchor
anchor the requests are bound to
Description
this allows all outstanding URBs to be killed starting
from the back of the queue
This routine should not be called by a driver after its disconnect
method has returned.
LINUX
Kernel Hackers Manual
July 2017
usb_poison_anchored_urbs
9
4.1.27
usb_poison_anchored_urbs
cease all traffic from an anchor
Synopsis
void usb_poison_anchored_urbs
struct usb_anchor * anchor
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_unpoison_anchored_urbs
9
4.1.27
usb_unpoison_anchored_urbs
let an anchor be used successfully again
Synopsis
void usb_unpoison_anchored_urbs
struct usb_anchor * anchor
Arguments
anchor
anchor the requests are bound to
Description
Reverses the effect of usb_poison_anchored_urbs
the anchor can be used normally after it returns
LINUX
Kernel Hackers Manual
July 2017
usb_unlink_anchored_urbs
9
4.1.27
usb_unlink_anchored_urbs
asynchronously cancel transfer requests en masse
Synopsis
void usb_unlink_anchored_urbs
struct usb_anchor * anchor
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_anchor_suspend_wakeups
9
4.1.27
usb_anchor_suspend_wakeups
Synopsis
void usb_anchor_suspend_wakeups
struct usb_anchor * anchor
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_anchor_resume_wakeups
9
4.1.27
usb_anchor_resume_wakeups
Synopsis
void usb_anchor_resume_wakeups
struct usb_anchor * anchor
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_wait_anchor_empty_timeout
9
4.1.27
usb_wait_anchor_empty_timeout
wait for an anchor to be unused
Synopsis
int usb_wait_anchor_empty_timeout
struct usb_anchor * anchor
unsigned int timeout
Arguments
anchor
the anchor you want to become unused
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.
LINUX
Kernel Hackers Manual
July 2017
usb_get_from_anchor
9
4.1.27
usb_get_from_anchor
get an anchor's oldest urb
Synopsis
struct urb * usb_get_from_anchor
struct usb_anchor * anchor
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_scuttle_anchored_urbs
9
4.1.27
usb_scuttle_anchored_urbs
unanchor all an anchor's urbs
Synopsis
void usb_scuttle_anchored_urbs
struct usb_anchor * anchor
Arguments
anchor
the anchor whose urbs you want to unanchor
Description
use this to get rid of all an anchor's urbs
LINUX
Kernel Hackers Manual
July 2017
usb_anchor_empty
9
4.1.27
usb_anchor_empty
is an anchor empty
Synopsis
int usb_anchor_empty
struct usb_anchor * anchor
Arguments
anchor
the anchor you want to query
Return
1 if the anchor has no urbs associated with it.
LINUX
Kernel Hackers Manual
July 2017
usb_control_msg
9
4.1.27
usb_control_msg
Builds a control urb, sends it off and waits for completion
Synopsis
int usb_control_msg
struct usb_device * dev
unsigned int pipe
__u8 request
__u8 requesttype
__u16 value
__u16 index
void * data
__u16 size
int timeout
Arguments
dev
pointer to the usb device to send the message to
pipe
endpoint pipe
to send the message to
request
USB message request value
requesttype
USB message request type value
value
USB message value
index
USB message index value
data
pointer to the data to send
size
length in bytes of the data to send
timeout
time in msecs to wait for the message to complete before timing
out (if 0 the wait is forever)
Context
!in_interrupt ()
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, like a bottom half
handler. 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.
LINUX
Kernel Hackers Manual
July 2017
usb_interrupt_msg
9
4.1.27
usb_interrupt_msg
Builds an interrupt urb, sends it off and waits for completion
Synopsis
int usb_interrupt_msg
struct usb_device * usb_dev
unsigned int pipe
void * data
int len
int * actual_length
int timeout
Arguments
usb_dev
pointer to the usb device to send the message to
pipe
endpoint pipe
to send the message to
data
pointer to the data to send
len
length in bytes of the data to send
actual_length
pointer to a location to put the actual length transferred
in bytes
timeout
time in msecs to wait for the message to complete before
timing out (if 0 the wait is forever)
Context
!in_interrupt ()
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, like a bottom half
handler. 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.
LINUX
Kernel Hackers Manual
July 2017
usb_bulk_msg
9
4.1.27
usb_bulk_msg
Builds a bulk urb, sends it off and waits for completion
Synopsis
int usb_bulk_msg
struct usb_device * usb_dev
unsigned int pipe
void * data
int len
int * actual_length
int timeout
Arguments
usb_dev
pointer to the usb device to send the message to
pipe
endpoint pipe
to send the message to
data
pointer to the data to send
len
length in bytes of the data to send
actual_length
pointer to a location to put the actual length transferred
in bytes
timeout
time in msecs to wait for the message to complete before
timing out (if 0 the wait is forever)
Context
!in_interrupt ()
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, like a bottom half
handler. 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.
LINUX
Kernel Hackers Manual
July 2017
usb_sg_init
9
4.1.27
usb_sg_init
initializes scatterlist-based bulk/interrupt I/O request
Synopsis
int 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
Arguments
io
request block being initialized. until usb_sg_wait returns,
treat this as a pointer to an opaque block of memory,
dev
the usb device that will send or receive the data
pipe
endpoint pipe
used to transfer the data
period
polling rate for interrupt endpoints, in frames or
(for high speed endpoints) microframes; ignored for bulk
sg
scatterlist entries
nents
how many entries in the scatterlist
length
how many bytes to send from the scatterlist, or zero to
send every byte identified in the list.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_sg_wait
9
4.1.27
usb_sg_wait
synchronously execute scatter/gather request
Synopsis
void usb_sg_wait
struct usb_sg_request * io
Arguments
io
request block handle, as initialized with usb_sg_init.
some fields become accessible when this call returns.
Context
!in_interrupt ()
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.
LINUX
Kernel Hackers Manual
July 2017
usb_sg_cancel
9
4.1.27
usb_sg_cancel
stop scatter/gather i/o issued by usb_sg_wait
Synopsis
void usb_sg_cancel
struct usb_sg_request * io
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_get_descriptor
9
4.1.27
usb_get_descriptor
issues a generic GET_DESCRIPTOR request
Synopsis
int usb_get_descriptor
struct usb_device * dev
unsigned char type
unsigned char index
void * buf
int size
Arguments
dev
the device whose descriptor is being retrieved
type
the descriptor type (USB_DT_*)
index
the number of the descriptor
buf
where to put the descriptor
size
how big is buf
?
Context
!in_interrupt ()
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.
LINUX
Kernel Hackers Manual
July 2017
usb_string
9
4.1.27
usb_string
returns UTF-8 version of a string descriptor
Synopsis
int usb_string
struct usb_device * dev
int index
char * buf
size_t size
Arguments
dev
the device whose string descriptor is being retrieved
index
the number of the descriptor
buf
where to put the string
size
how big is buf
?
Context
!in_interrupt ()
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).
LINUX
Kernel Hackers Manual
July 2017
usb_get_status
9
4.1.27
usb_get_status
issues a GET_STATUS call
Synopsis
int usb_get_status
struct usb_device * dev
int type
int target
void * data
Arguments
dev
the device whose status is being checked
type
USB_RECIP_*; for device, interface, or endpoint
target
zero (for device), else interface or endpoint number
data
pointer to two bytes of bitmap data
Context
!in_interrupt ()
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.
LINUX
Kernel Hackers Manual
July 2017
usb_clear_halt
9
4.1.27
usb_clear_halt
tells device to clear endpoint halt/stall condition
Synopsis
int usb_clear_halt
struct usb_device * dev
int pipe
Arguments
dev
device whose endpoint is halted
pipe
endpoint pipe
being cleared
Context
!in_interrupt ()
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.
Return
Zero on success, or else the status code returned by the
underlying usb_control_msg call.
LINUX
Kernel Hackers Manual
July 2017
usb_reset_endpoint
9
4.1.27
usb_reset_endpoint
Reset an endpoint's state.
Synopsis
void usb_reset_endpoint
struct usb_device * dev
unsigned int epaddr
Arguments
dev
the device whose endpoint is to be reset
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.
LINUX
Kernel Hackers Manual
July 2017
usb_set_interface
9
4.1.27
usb_set_interface
Makes a particular alternate setting be current
Synopsis
int usb_set_interface
struct usb_device * dev
int interface
int alternate
Arguments
dev
the device whose interface is being updated
interface
the interface being updated
alternate
the setting being chosen.
Context
!in_interrupt ()
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.
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).
Return
Zero on success, or else the status code returned by the
underlying usb_control_msg call.
LINUX
Kernel Hackers Manual
July 2017
usb_reset_configuration
9
4.1.27
usb_reset_configuration
lightweight device reset
Synopsis
int usb_reset_configuration
struct usb_device * dev
Arguments
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.
Return
Zero on success, else a negative error code.
LINUX
Kernel Hackers Manual
July 2017
usb_driver_set_configuration
9
4.1.27
usb_driver_set_configuration
Provide a way for drivers to change device configurations
Synopsis
int usb_driver_set_configuration
struct usb_device * udev
int config
Arguments
udev
the device whose configuration is being updated
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.
LINUX
Kernel Hackers Manual
July 2017
usb_register_dev
9
4.1.27
usb_register_dev
register a USB device, and ask for a minor number
Synopsis
int usb_register_dev
struct usb_interface * intf
struct usb_class_driver * class_driver
Arguments
intf
pointer to the usb_interface that is being registered
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.
LINUX
Kernel Hackers Manual
July 2017
usb_deregister_dev
9
4.1.27
usb_deregister_dev
deregister a USB device's dynamic minor.
Synopsis
void usb_deregister_dev
struct usb_interface * intf
struct usb_class_driver * class_driver
Arguments
intf
pointer to the usb_interface that is being deregistered
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.
LINUX
Kernel Hackers Manual
July 2017
usb_driver_claim_interface
9
4.1.27
usb_driver_claim_interface
bind a driver to an interface
Synopsis
int usb_driver_claim_interface
struct usb_driver * driver
struct usb_interface * iface
void * priv
Arguments
driver
the driver to be bound
iface
the interface to which it will be bound; must be in the
usb device's active configuration
priv
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.
Few drivers should need to use this routine, since the most natural
way to bind to an interface is to return the private data from
the driver's probe method.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_driver_release_interface
9
4.1.27
usb_driver_release_interface
unbind a driver from an interface
Synopsis
void usb_driver_release_interface
struct usb_driver * driver
struct usb_interface * iface
Arguments
driver
the driver to be unbound
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.
LINUX
Kernel Hackers Manual
July 2017
usb_match_id
9
4.1.27
usb_match_id
find first usb_device_id matching device or interface
Synopsis
const struct usb_device_id * usb_match_id
struct usb_interface * interface
const struct usb_device_id * id
Arguments
interface
the interface of interest
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.
Return
The first matching usb_device_id, or NULL.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_register_device_driver
9
4.1.27
usb_register_device_driver
register a USB device (not interface) driver
Synopsis
int usb_register_device_driver
struct usb_device_driver * new_udriver
struct module * owner
Arguments
new_udriver
USB operations for the device driver
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.
LINUX
Kernel Hackers Manual
July 2017
usb_deregister_device_driver
9
4.1.27
usb_deregister_device_driver
unregister a USB device (not interface) driver
Synopsis
void usb_deregister_device_driver
struct usb_device_driver * udriver
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_register_driver
9
4.1.27
usb_register_driver
register a USB interface driver
Synopsis
int usb_register_driver
struct usb_driver * new_driver
struct module * owner
const char * mod_name
Arguments
new_driver
USB operations for the interface driver
owner
module owner of this driver.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_deregister
9
4.1.27
usb_deregister
unregister a USB interface driver
Synopsis
void usb_deregister
struct usb_driver * driver
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_enable_autosuspend
9
4.1.27
usb_enable_autosuspend
allow a USB device to be autosuspended
Synopsis
void usb_enable_autosuspend
struct usb_device * udev
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_disable_autosuspend
9
4.1.27
usb_disable_autosuspend
prevent a USB device from being autosuspended
Synopsis
void usb_disable_autosuspend
struct usb_device * udev
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_autopm_put_interface
9
4.1.27
usb_autopm_put_interface
decrement a USB interface's PM-usage counter
Synopsis
void usb_autopm_put_interface
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_autopm_put_interface_async
9
4.1.27
usb_autopm_put_interface_async
decrement a USB interface's PM-usage counter
Synopsis
void usb_autopm_put_interface_async
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_autopm_put_interface_no_suspend
9
4.1.27
usb_autopm_put_interface_no_suspend
decrement a USB interface's PM-usage counter
Synopsis
void usb_autopm_put_interface_no_suspend
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_autopm_get_interface
9
4.1.27
usb_autopm_get_interface
increment a USB interface's PM-usage counter
Synopsis
int usb_autopm_get_interface
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_autopm_get_interface_async
9
4.1.27
usb_autopm_get_interface_async
increment a USB interface's PM-usage counter
Synopsis
int usb_autopm_get_interface_async
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_autopm_get_interface_no_resume
9
4.1.27
usb_autopm_get_interface_no_resume
increment a USB interface's PM-usage counter
Synopsis
void usb_autopm_get_interface_no_resume
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_find_alt_setting
9
4.1.27
usb_find_alt_setting
Given a configuration, find the alternate setting for the given interface.
Synopsis
struct usb_host_interface * usb_find_alt_setting
struct usb_host_config * config
unsigned int iface_num
unsigned int alt_num
Arguments
config
the configuration to search (not necessarily the current config).
iface_num
interface number to search in
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.
LINUX
Kernel Hackers Manual
July 2017
usb_ifnum_to_if
9
4.1.27
usb_ifnum_to_if
get the interface object with a given interface number
Synopsis
struct usb_interface * usb_ifnum_to_if
const struct usb_device * dev
unsigned ifnum
Arguments
dev
the device whose current configuration is considered
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.
LINUX
Kernel Hackers Manual
July 2017
usb_altnum_to_altsetting
9
4.1.27
usb_altnum_to_altsetting
get the altsetting structure with a given alternate setting number.
Synopsis
struct usb_host_interface * usb_altnum_to_altsetting
const struct usb_interface * intf
unsigned int altnum
Arguments
intf
the interface containing the altsetting in question
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.
LINUX
Kernel Hackers Manual
July 2017
usb_find_interface
9
4.1.27
usb_find_interface
find usb_interface pointer for driver and device
Synopsis
struct usb_interface * usb_find_interface
struct usb_driver * drv
int minor
Arguments
drv
the driver whose current configuration is considered
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.
LINUX
Kernel Hackers Manual
July 2017
usb_for_each_dev
9
4.1.27
usb_for_each_dev
iterate over all USB devices in the system
Synopsis
int usb_for_each_dev
void * data
int (*fn)
struct usb_device *, void *
Arguments
data
data pointer that will be handed to the callback function
fn
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.
LINUX
Kernel Hackers Manual
July 2017
usb_alloc_dev
9
4.1.27
usb_alloc_dev
usb device constructor (usbcore-internal)
Synopsis
struct usb_device * usb_alloc_dev
struct usb_device * parent
struct usb_bus * bus
unsigned port1
Arguments
parent
hub to which device is connected; null to allocate a root hub
bus
bus used to access the device
port1
one-based index of port; ignored for root hubs
Context
!in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_get_dev
9
4.1.27
usb_get_dev
increments the reference count of the usb device structure
Synopsis
struct usb_device * usb_get_dev
struct usb_device * dev
Arguments
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.
Return
A pointer to the device with the incremented reference counter.
LINUX
Kernel Hackers Manual
July 2017
usb_put_dev
9
4.1.27
usb_put_dev
release a use of the usb device structure
Synopsis
void usb_put_dev
struct usb_device * dev
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_get_intf
9
4.1.27
usb_get_intf
increments the reference count of the usb interface structure
Synopsis
struct usb_interface * usb_get_intf
struct usb_interface * intf
Arguments
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.
Return
A pointer to the interface with the incremented reference counter.
LINUX
Kernel Hackers Manual
July 2017
usb_put_intf
9
4.1.27
usb_put_intf
release a use of the usb interface structure
Synopsis
void usb_put_intf
struct usb_interface * intf
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_lock_device_for_reset
9
4.1.27
usb_lock_device_for_reset
cautiously acquire the lock for a usb device structure
Synopsis
int usb_lock_device_for_reset
struct usb_device * udev
const struct usb_interface * iface
Arguments
udev
device that's being locked
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.
LINUX
Kernel Hackers Manual
July 2017
usb_get_current_frame_number
9
4.1.27
usb_get_current_frame_number
return current bus frame number
Synopsis
int usb_get_current_frame_number
struct usb_device * dev
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_alloc_coherent
9
4.1.27
usb_alloc_coherent
allocate dma-consistent buffer for URB_NO_xxx_DMA_MAP
Synopsis
void * usb_alloc_coherent
struct usb_device * dev
size_t size
gfp_t mem_flags
dma_addr_t * dma
Arguments
dev
device the buffer will be used with
size
requested buffer size
mem_flags
affect whether allocation may block
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.
When the buffer is no longer used, free it with usb_free_coherent.
LINUX
Kernel Hackers Manual
July 2017
usb_free_coherent
9
4.1.27
usb_free_coherent
free memory allocated with usb_alloc_coherent
Synopsis
void usb_free_coherent
struct usb_device * dev
size_t size
void * addr
dma_addr_t dma
Arguments
dev
device the buffer was used with
size
requested buffer size
addr
CPU address of buffer
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.
LINUX
Kernel Hackers Manual
July 2017
usb_buffer_map
9
4.1.27
usb_buffer_map
create DMA mapping(s) for an urb
Synopsis
struct urb * usb_buffer_map
struct urb * urb
Arguments
urb
urb whose transfer_buffer/setup_packet will be mapped
Description
URB_NO_TRANSFER_DMA_MAP is added to urb->transfer_flags if the operation
succeeds. If the device is connected to this system through a non-DMA
controller, this operation always succeeds.
This call would normally be used for an urb which is reused, perhaps
as the target of a large periodic transfer, with usb_buffer_dmasync
calls to synchronize memory and dma state.
Reverse the effect of this call with usb_buffer_unmap.
Return
Either NULL (indicating no buffer could be mapped), or urb.
LINUX
Kernel Hackers Manual
July 2017
usb_buffer_dmasync
9
4.1.27
usb_buffer_dmasync
synchronize DMA and CPU view of buffer(s)
Synopsis
void usb_buffer_dmasync
struct urb * urb
Arguments
urb
urb whose transfer_buffer/setup_packet will be synchronized
LINUX
Kernel Hackers Manual
July 2017
usb_buffer_unmap
9
4.1.27
usb_buffer_unmap
free DMA mapping(s) for an urb
Synopsis
void usb_buffer_unmap
struct urb * urb
Arguments
urb
urb whose transfer_buffer will be unmapped
Description
Reverses the effect of usb_buffer_map.
LINUX
Kernel Hackers Manual
July 2017
usb_buffer_map_sg
9
4.1.27
usb_buffer_map_sg
create scatterlist DMA mapping(s) for an endpoint
Synopsis
int usb_buffer_map_sg
const struct usb_device * dev
int is_in
struct scatterlist * sg
int nents
Arguments
dev
device to which the scatterlist will be mapped
is_in
mapping transfer direction
sg
the scatterlist to map
nents
the number of entries in the scatterlist
Return
Either < 0 (indicating no buffers could be mapped), or the
number of DMA mapping array entries in the scatterlist.
Note
The caller is responsible for placing the resulting DMA addresses from
the scatterlist into URB transfer buffer pointers, and for setting the
URB_NO_TRANSFER_DMA_MAP transfer flag in each of those URBs.
Top I/O rates come from queuing URBs, instead of waiting for each one
to complete before starting the next I/O. This is particularly easy
to do with scatterlists. Just allocate and submit one URB for each DMA
mapping entry returned, stopping on the first error or when all succeed.
Better yet, use the usb_sg_*() calls, which do that (and more) for you.
This call would normally be used when translating scatterlist requests,
rather than usb_buffer_map, since on some hardware (with IOMMUs) it
may be able to coalesce mappings for improved I/O efficiency.
Reverse the effect of this call with usb_buffer_unmap_sg.
LINUX
Kernel Hackers Manual
July 2017
usb_buffer_dmasync_sg
9
4.1.27
usb_buffer_dmasync_sg
synchronize DMA and CPU view of scatterlist buffer(s)
Synopsis
void usb_buffer_dmasync_sg
const struct usb_device * dev
int is_in
struct scatterlist * sg
int n_hw_ents
Arguments
dev
device to which the scatterlist will be mapped
is_in
mapping transfer direction
sg
the scatterlist to synchronize
n_hw_ents
the positive return value from usb_buffer_map_sg
Description
Use this when you are re-using a scatterlist's data buffers for
another USB request.
LINUX
Kernel Hackers Manual
July 2017
usb_buffer_unmap_sg
9
4.1.27
usb_buffer_unmap_sg
free DMA mapping(s) for a scatterlist
Synopsis
void usb_buffer_unmap_sg
const struct usb_device * dev
int is_in
struct scatterlist * sg
int n_hw_ents
Arguments
dev
device to which the scatterlist will be mapped
is_in
mapping transfer direction
sg
the scatterlist to unmap
n_hw_ents
the positive return value from usb_buffer_map_sg
Description
Reverses the effect of usb_buffer_map_sg.
LINUX
Kernel Hackers Manual
July 2017
usb_hub_clear_tt_buffer
9
4.1.27
usb_hub_clear_tt_buffer
clear control/bulk TT state in high speed hub
Synopsis
int usb_hub_clear_tt_buffer
struct urb * urb
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_set_device_state
9
4.1.27
usb_set_device_state
change a device's current state (usbcore, hcds)
Synopsis
void usb_set_device_state
struct usb_device * udev
enum usb_device_state new_state
Arguments
udev
pointer to device whose state should be changed
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.
LINUX
Kernel Hackers Manual
July 2017
usb_root_hub_lost_power
9
4.1.27
usb_root_hub_lost_power
called by HCD if the root hub lost Vbus power
Synopsis
void usb_root_hub_lost_power
struct usb_device * rhdev
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_reset_device
9
4.1.27
usb_reset_device
warn interface drivers and perform a USB port reset
Synopsis
int usb_reset_device
struct usb_device * udev
Arguments
udev
device to reset (not in SUSPENDED or 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).
Return
The same as for usb_reset_and_verify_device.
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.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_queue_reset_device
9
4.1.27
usb_queue_reset_device
Reset a USB device from an atomic context
Synopsis
void usb_queue_reset_device
struct usb_interface * iface
Arguments
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!
LINUX
Kernel Hackers Manual
July 2017
usb_hub_find_child
9
4.1.27
usb_hub_find_child
Get the pointer of child device attached to the port which is specified by port1.
Synopsis
struct usb_device * usb_hub_find_child
struct usb_device * hdev
int port1
Arguments
hdev
USB device belonging to the usb hub
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.
Host Controller APIs
These APIs are only for use by host controller drivers,
most of which implement standard register interfaces such as
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).
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.
The same basic APIs are available to drivers for all
those controllers.
For historical reasons they are in two layers:
struct usb_bus is a rather thin
layer that became available in the 2.2 kernels, while
struct usb_hcd is a more featureful
layer (available in later 2.4 kernels and in 2.5) that
lets HCDs share common code, to shrink driver size
and significantly reduce hcd-specific behaviors.
LINUX
Kernel Hackers Manual
July 2017
usb_calc_bus_time
9
4.1.27
usb_calc_bus_time
approximate periodic transaction time in nanoseconds
Synopsis
long usb_calc_bus_time
int speed
int is_input
int isoc
int bytecount
Arguments
speed
from dev->speed; USB_SPEED_{LOW,FULL,HIGH}
is_input
true iff the transaction sends data to the host
isoc
true for isochronous transactions, false for interrupt ones
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_link_urb_to_ep
9
4.1.27
usb_hcd_link_urb_to_ep
add an URB to its endpoint queue
Synopsis
int usb_hcd_link_urb_to_ep
struct usb_hcd * hcd
struct urb * urb
Arguments
hcd
host controller to which urb was submitted
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_check_unlink_urb
9
4.1.27
usb_hcd_check_unlink_urb
check whether an URB may be unlinked
Synopsis
int usb_hcd_check_unlink_urb
struct usb_hcd * hcd
struct urb * urb
int status
Arguments
hcd
host controller to which urb was submitted
urb
URB being checked for unlinkability
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_unlink_urb_from_ep
9
4.1.27
usb_hcd_unlink_urb_from_ep
remove an URB from its endpoint queue
Synopsis
void usb_hcd_unlink_urb_from_ep
struct usb_hcd * hcd
struct urb * urb
Arguments
hcd
host controller to which urb was submitted
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_giveback_urb
9
4.1.27
usb_hcd_giveback_urb
return URB from HCD to device driver
Synopsis
void usb_hcd_giveback_urb
struct usb_hcd * hcd
struct urb * urb
int status
Arguments
hcd
host controller returning the URB
urb
urb being returned to the USB device driver.
status
completion status code for the URB.
Context
in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_alloc_streams
9
4.1.27
usb_alloc_streams
allocate bulk endpoint stream IDs.
Synopsis
int usb_alloc_streams
struct usb_interface * interface
struct usb_host_endpoint ** eps
unsigned int num_eps
unsigned int num_streams
gfp_t mem_flags
Arguments
interface
alternate setting that includes all endpoints.
eps
array of endpoints that need streams.
num_eps
number of endpoints in the array.
num_streams
number of streams to allocate.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_free_streams
9
4.1.27
usb_free_streams
free bulk endpoint stream IDs.
Synopsis
int usb_free_streams
struct usb_interface * interface
struct usb_host_endpoint ** eps
unsigned int num_eps
gfp_t mem_flags
Arguments
interface
alternate setting that includes all endpoints.
eps
array of endpoints to remove streams from.
num_eps
number of endpoints in the array.
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_resume_root_hub
9
4.1.27
usb_hcd_resume_root_hub
called by HCD to resume its root hub
Synopsis
void usb_hcd_resume_root_hub
struct usb_hcd * hcd
Arguments
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).
LINUX
Kernel Hackers Manual
July 2017
usb_bus_start_enum
9
4.1.27
usb_bus_start_enum
start immediate enumeration (for OTG)
Synopsis
int usb_bus_start_enum
struct usb_bus * bus
unsigned port_num
Arguments
bus
the bus (must use hcd framework)
port_num
1-based number of port; usually bus->otg_port
Context
in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_irq
9
4.1.27
usb_hcd_irq
hook IRQs to HCD framework (bus glue)
Synopsis
irqreturn_t usb_hcd_irq
int irq
void * __hcd
Arguments
irq
the IRQ being raised
__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.
LINUX
Kernel Hackers Manual
July 2017
usb_hc_died
9
4.1.27
usb_hc_died
report abnormal shutdown of a host controller (bus glue)
Synopsis
void usb_hc_died
struct usb_hcd * hcd
Arguments
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.
LINUX
Kernel Hackers Manual
July 2017
usb_create_shared_hcd
9
4.1.27
usb_create_shared_hcd
create and initialize an HCD structure
Synopsis
struct usb_hcd * usb_create_shared_hcd
const struct hc_driver * driver
struct device * dev
const char * bus_name
struct usb_hcd * primary_hcd
Arguments
driver
HC driver that will use this hcd
dev
device for this HC, stored in hcd->self.controller
bus_name
value to store in hcd->self.bus_name
primary_hcd
a pointer to the usb_hcd structure that is sharing the
PCI device. Only allocate certain resources for the primary HCD
Context
!in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_create_hcd
9
4.1.27
usb_create_hcd
create and initialize an HCD structure
Synopsis
struct usb_hcd * usb_create_hcd
const struct hc_driver * driver
struct device * dev
const char * bus_name
Arguments
driver
HC driver that will use this hcd
dev
device for this HC, stored in hcd->self.controller
bus_name
value to store in hcd->self.bus_name
Context
!in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_add_hcd
9
4.1.27
usb_add_hcd
finish generic HCD structure initialization and register
Synopsis
int usb_add_hcd
struct usb_hcd * hcd
unsigned int irqnum
unsigned long irqflags
Arguments
hcd
the usb_hcd structure to initialize
irqnum
Interrupt line to allocate
irqflags
Interrupt type flags
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.
LINUX
Kernel Hackers Manual
July 2017
usb_remove_hcd
9
4.1.27
usb_remove_hcd
shutdown processing for generic HCDs
Synopsis
void usb_remove_hcd
struct usb_hcd * hcd
Arguments
hcd
the usb_hcd structure to remove
Context
!in_interrupt
Description
Disconnects the root hub, then reverses the effects of usb_add_hcd,
invoking the HCD's stop method.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_pci_probe
9
4.1.27
usb_hcd_pci_probe
initialize PCI-based HCDs
Synopsis
int usb_hcd_pci_probe
struct pci_dev * dev
const struct pci_device_id * id
Arguments
dev
USB Host Controller being probed
id
pci hotplug id connecting controller to HCD framework
Context
!in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_pci_remove
9
4.1.27
usb_hcd_pci_remove
shutdown processing for PCI-based HCDs
Synopsis
void usb_hcd_pci_remove
struct pci_dev * dev
Arguments
dev
USB Host Controller being removed
Context
!in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
usb_hcd_pci_shutdown
9
4.1.27
usb_hcd_pci_shutdown
shutdown host controller
Synopsis
void usb_hcd_pci_shutdown
struct pci_dev * dev
Arguments
dev
USB Host Controller being shutdown
LINUX
Kernel Hackers Manual
July 2017
hcd_buffer_create
9
4.1.27
hcd_buffer_create
initialize buffer pools
Synopsis
int hcd_buffer_create
struct usb_hcd * hcd
Arguments
hcd
the bus whose buffer pools are to be initialized
Context
!in_interrupt
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.
LINUX
Kernel Hackers Manual
July 2017
hcd_buffer_destroy
9
4.1.27
hcd_buffer_destroy
deallocate buffer pools
Synopsis
void hcd_buffer_destroy
struct usb_hcd * hcd
Arguments
hcd
the bus whose buffer pools are to be destroyed
Context
!in_interrupt
Description
This frees the buffer pools created by hcd_buffer_create.
The USB Filesystem (usbfs)
This chapter presents the Linux usbfs.
You may prefer to avoid writing new kernel code for your
USB driver; that's the problem that usbfs set out to solve.
User mode device drivers are usually packaged as applications
or libraries, and may use usbfs through some programming library
that wraps it. Such libraries include
libusb
for C/C++, and
jUSB for Java.
Unfinished
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.
Configure usbfs into Linux kernels by enabling the
USB filesystem option (CONFIG_USB_DEVICEFS),
and you get basic support for user mode USB device drivers.
Until relatively recently it was often (confusingly) called
usbdevfs although it wasn't solving what
devfs was.
Every USB device will appear in usbfs, regardless of whether or
not it has a kernel driver.
What files are in "usbfs"?
Conventionally mounted at
/proc/bus/usb, usbfs
features include:
/proc/bus/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.
/proc/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.)
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.
"usbfs" doesn't (yet) expose those IDs.
Mounting and Access Control
There are a number of mount options for usbfs, which will
be of most interest to you if you need to override the default
access control policy.
That policy is that only root may read or write device files
(/proc/bus/BBB/DDD) although anyone may read
the devices
or drivers files.
I/O requests to the device also need the CAP_SYS_RAWIO capability,
The significance of that is that by default, all user mode
device drivers need super-user privileges.
You can change modes or ownership in a driver setup
when the device hotplugs, or maye just start the
driver right then, as a privileged server (or some activity
within one).
That's the most secure approach for multi-user systems,
but for single user systems ("trusted" by that user)
it's more convenient just to grant everyone all access
(using the devmode=0666 option)
so the driver can start whenever it's needed.
The mount options for usbfs, usable in /etc/fstab or
in command line invocations of mount, are:
busgid=NNNNN
Controls the GID used for the
/proc/bus/usb/BBB
directories. (Default: 0)
busmode=MMM
Controls the file mode used for the
/proc/bus/usb/BBB
directories. (Default: 0555)
busuid=NNNNN
Controls the UID used for the
/proc/bus/usb/BBB
directories. (Default: 0)
devgid=NNNNN
Controls the GID used for the
/proc/bus/usb/BBB/DDD
files. (Default: 0)
devmode=MMM
Controls the file mode used for the
/proc/bus/usb/BBB/DDD
files. (Default: 0644)
devuid=NNNNN
Controls the UID used for the
/proc/bus/usb/BBB/DDD
files. (Default: 0)
listgid=NNNNN
Controls the GID used for the
/proc/bus/usb/devices and drivers files.
(Default: 0)
listmode=MMM
Controls the file mode used for the
/proc/bus/usb/devices and drivers files.
(Default: 0444)
listuid=NNNNN
Controls the UID used for the
/proc/bus/usb/devices and drivers files.
(Default: 0)
Note that many Linux distributions hard-wire the mount options
for usbfs in their init scripts, such as
/etc/rc.d/rc.sysinit,
rather than making it easy to set this per-system
policy in /etc/fstab.
/proc/bus/usb/devices
This 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 the
Documentation/usb/proc_usb_info.txt
file in your Linux kernel sources.
This file, in combination with the poll() system call, can
also be used to detect when devices are added or removed:
int fd;
struct pollfd pfd;
fd = open("/proc/bus/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.) */
}
Note 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.
/proc/bus/usb/BBB/DDD
Use these files in one of these basic ways:
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.
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.
Life Cycle of User Mode Drivers
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
/proc/bus/usb device files, and ignores most devices.
In either case, it should 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.
Never 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.
Once 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.)
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.
Your 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.
The ioctl() Requests
To use these ioctls, you need to include the following
headers in your userspace program:
#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <asm/byteorder.h>
The standard USB device model requests, from "Chapter 9" of
the USB 2.0 specification, are automatically included from
the <linux/usb/ch9.h> header.
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
Documentation/usb/error-codes.txt
in your kernel sources.)
Each 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.
Management/Status Requests
A 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.
USBDEVFS_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.
USBDEVFS_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.
USBDEVFS_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.
USBDEVFS_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.
USBDEVFS_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.
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.
USBDEVFS_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.
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.
Synchronous I/O Support
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.
USBDEVFS_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..
USBDEVFS_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.
USBDEVFS_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.
USBDEVFS_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.
Avoid using this call
until some usbcore bugs get fixed,
since it does not fully synchronize device, interface,
and driver (not just usbfs) state.
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.)
USBDEVFS_SETCONFIGURATION
Issues the
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.
Avoid using this call
until some usbcore bugs get fixed,
since it does not fully synchronize device, interface,
and driver (not just usbfs) state.
Asynchronous I/O Support
As 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.
These 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).
Each request can specify a realtime signal number
(between SIGRTMIN and SIGRTMAX, inclusive) to request a
signal be sent when the request completes.
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.
struct 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[];
};
For 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.
USBDEVFS_DISCARDURB
TBS
File modification time is not updated by this request.
USBDEVFS_DISCSIGNAL
TBS
File modification time is not updated by this request.
USBDEVFS_REAPURB
TBS
File modification time is not updated by this request.
USBDEVFS_REAPURBNDELAY
TBS
File modification time is not updated by this request.
USBDEVFS_SUBMITURB
TBS