Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions | Variables
message.c File Reference
#include <linux/pci.h>
#include <linux/usb.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/timer.h>
#include <linux/ctype.h>
#include <linux/nls.h>
#include <linux/device.h>
#include <linux/scatterlist.h>
#include <linux/usb/quirks.h>
#include <linux/usb/hcd.h>
#include <asm/byteorder.h>
#include "usb.h"

Go to the source code of this file.

Data Structures

struct  api_context
 
struct  set_config_request
 

Macros

#define MAX_USB_STRING_SIZE   (127 * 3 + 1)
 

Functions

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)
 
 EXPORT_SYMBOL_GPL (usb_control_msg)
 
int usb_interrupt_msg (struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)
 
 EXPORT_SYMBOL_GPL (usb_interrupt_msg)
 
int usb_bulk_msg (struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)
 
 EXPORT_SYMBOL_GPL (usb_bulk_msg)
 
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)
 
 EXPORT_SYMBOL_GPL (usb_sg_init)
 
void usb_sg_wait (struct usb_sg_request *io)
 
 EXPORT_SYMBOL_GPL (usb_sg_wait)
 
void usb_sg_cancel (struct usb_sg_request *io)
 
 EXPORT_SYMBOL_GPL (usb_sg_cancel)
 
int usb_get_descriptor (struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)
 
 EXPORT_SYMBOL_GPL (usb_get_descriptor)
 
int usb_string (struct usb_device *dev, int index, char *buf, size_t size)
 
 EXPORT_SYMBOL_GPL (usb_string)
 
charusb_cache_string (struct usb_device *udev, int index)
 
int usb_get_device_descriptor (struct usb_device *dev, unsigned int size)
 
int usb_get_status (struct usb_device *dev, int type, int target, void *data)
 
 EXPORT_SYMBOL_GPL (usb_get_status)
 
int usb_clear_halt (struct usb_device *dev, int pipe)
 
 EXPORT_SYMBOL_GPL (usb_clear_halt)
 
void usb_disable_endpoint (struct usb_device *dev, unsigned int epaddr, bool reset_hardware)
 
void usb_reset_endpoint (struct usb_device *dev, unsigned int epaddr)
 
 EXPORT_SYMBOL_GPL (usb_reset_endpoint)
 
void usb_disable_interface (struct usb_device *dev, struct usb_interface *intf, bool reset_hardware)
 
void usb_disable_device (struct usb_device *dev, int skip_ep0)
 
void usb_enable_endpoint (struct usb_device *dev, struct usb_host_endpoint *ep, bool reset_ep)
 
void usb_enable_interface (struct usb_device *dev, struct usb_interface *intf, bool reset_eps)
 
int usb_set_interface (struct usb_device *dev, int interface, int alternate)
 
 EXPORT_SYMBOL_GPL (usb_set_interface)
 
int usb_reset_configuration (struct usb_device *dev)
 
 EXPORT_SYMBOL_GPL (usb_reset_configuration)
 
int usb_set_configuration (struct usb_device *dev, int configuration)
 
int usb_driver_set_configuration (struct usb_device *udev, int config)
 
 EXPORT_SYMBOL_GPL (usb_driver_set_configuration)
 

Variables

struct device_type usb_if_device_type
 

Macro Definition Documentation

#define MAX_USB_STRING_SIZE   (127 * 3 + 1)

Definition at line 849 of file message.c.

Function Documentation

EXPORT_SYMBOL_GPL ( usb_control_msg  )
EXPORT_SYMBOL_GPL ( usb_interrupt_msg  )
EXPORT_SYMBOL_GPL ( usb_bulk_msg  )
EXPORT_SYMBOL_GPL ( usb_sg_init  )
EXPORT_SYMBOL_GPL ( usb_sg_wait  )
EXPORT_SYMBOL_GPL ( usb_sg_cancel  )
EXPORT_SYMBOL_GPL ( usb_get_descriptor  )
EXPORT_SYMBOL_GPL ( usb_string  )
EXPORT_SYMBOL_GPL ( usb_get_status  )
EXPORT_SYMBOL_GPL ( usb_clear_halt  )
EXPORT_SYMBOL_GPL ( usb_reset_endpoint  )
EXPORT_SYMBOL_GPL ( usb_set_interface  )
EXPORT_SYMBOL_GPL ( usb_reset_configuration  )
EXPORT_SYMBOL_GPL ( usb_driver_set_configuration  )
int usb_bulk_msg ( struct usb_device *  usb_dev,
unsigned int  pipe,
void data,
int  len,
int actual_length,
int  timeout 
)

usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion : pointer to the usb device to send the message to : endpoint "pipe" to send the message to : pointer to the data to send : length in bytes of the data to send : pointer to a location to put the actual length transferred in bytes : time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)

Context: !in_interrupt ()

This function sends a simple bulk message to a specified endpoint and waits for the message to complete, or timeout.

If successful, it returns 0, otherwise a negative error number. The number of actual bytes transferred will be stored in the actual_length paramater.

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.

Definition at line 221 of file message.c.

char* usb_cache_string ( struct usb_device *  udev,
int  index 
)

usb_cache_string - read a string descriptor and cache it for later use : the device whose string descriptor is being read : the descriptor index

Returns a pointer to a kmalloc'ed buffer containing the descriptor string, or NULL if the index is 0 or the string could not be read.

Definition at line 859 of file message.c.

int usb_clear_halt ( struct usb_device *  dev,
int  pipe 
)

usb_clear_halt - tells device to clear endpoint halt/stall condition : device whose endpoint is halted : endpoint "pipe" being cleared Context: !in_interrupt ()

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.

Returns zero on success, or else the status code returned by the underlying usb_control_msg() call.

Definition at line 981 of file message.c.

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 
)

usb_control_msg - Builds a control urb, sends it off and waits for completion : pointer to the usb device to send the message to : endpoint "pipe" to send the message to : USB message request value : USB message request type value : USB message value : USB message index value : pointer to the data to send : length in bytes of the data to send : time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)

Context: !in_interrupt ()

This function sends a simple control message to a specified endpoint and waits for the message to complete, or timeout.

If successful, it returns the number of bytes transferred, otherwise a negative error number.

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.

Definition at line 132 of file message.c.

void usb_disable_device ( struct usb_device *  dev,
int  skip_ep0 
)

usb_disable_device - Disable all the endpoints for a USB device : the device whose endpoints are being disabled : 0 to disable endpoint 0, 1 to skip it.

Disables all the device's endpoints, potentially including endpoint 0. Deallocates hcd/hardware state for the endpoints (nuking all or most pending urbs) and usbcore state for the interfaces, so that usbcore must usb_set_configuration() before any interfaces could be used.

Definition at line 1138 of file message.c.

void usb_disable_endpoint ( struct usb_device *  dev,
unsigned int  epaddr,
bool  reset_hardware 
)

usb_disable_endpoint – Disable an endpoint by address : the device whose endpoint is being disabled : the endpoint's address. Endpoint number for output, endpoint number + USB_DIR_IN for input : flag to erase any endpoint state stored in the controller hardware

Disables the endpoint for URB submission and nukes all pending URBs. If is set then also deallocates hcd/hardware state for the endpoint.

Definition at line 1056 of file message.c.

void usb_disable_interface ( struct usb_device *  dev,
struct usb_interface intf,
bool  reset_hardware 
)

usb_disable_interface – Disable all endpoints for an interface : the device whose interface is being disabled : pointer to the interface descriptor : flag to erase any endpoint state stored in the controller hardware

Disables all the endpoints for the interface's current altsetting.

Definition at line 1115 of file message.c.

int usb_driver_set_configuration ( struct usb_device *  udev,
int  config 
)

usb_driver_set_configuration - Provide a way for drivers to change device configurations : the device whose configuration is being updated : the configuration being chosen. Context: In process context, must be able to sleep

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.

Returns 0 if the request was successfully queued, error code otherwise. The caller has no way to know whether the queued request will eventually succeed.

Definition at line 1975 of file message.c.

void usb_enable_endpoint ( struct usb_device *  dev,
struct usb_host_endpoint *  ep,
bool  reset_ep 
)

usb_enable_endpoint - Enable an endpoint for USB communications : the device whose interface is being enabled : the endpoint : flag to reset the endpoint state

Resets the endpoint state if asked, and sets dev->ep_{in,out} pointers. For control endpoints, both the input and output sides are handled.

Definition at line 1211 of file message.c.

void usb_enable_interface ( struct usb_device *  dev,
struct usb_interface intf,
bool  reset_eps 
)

usb_enable_interface - Enable all the endpoints for an interface : the device whose interface is being enabled : pointer to the interface descriptor : flag to reset the endpoints' state

Enables all the endpoints for the interface's current altsetting.

Definition at line 1235 of file message.c.

int usb_get_descriptor ( struct usb_device *  dev,
unsigned char  type,
unsigned char  index,
void buf,
int  size 
)

usb_get_descriptor - issues a generic GET_DESCRIPTOR request : the device whose descriptor is being retrieved : the descriptor type (USB_DT_*) : the number of the descriptor : where to put the descriptor : how big is "buf"? Context: !in_interrupt ()

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.

Returns the number of bytes received on success, or else the status code returned by the underlying usb_control_msg() call.

Definition at line 629 of file message.c.

int usb_get_device_descriptor ( struct usb_device *  dev,
unsigned int  size 
)

Definition at line 900 of file message.c.

int usb_get_status ( struct usb_device *  dev,
int  type,
int  target,
void data 
)

usb_get_status - issues a GET_STATUS call : the device whose status is being checked : USB_RECIP_*; for device, interface, or endpoint : zero (for device), else interface or endpoint number : pointer to two bytes of bitmap data Context: !in_interrupt ()

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 the number of bytes received on success, or else the status code returned by the underlying usb_control_msg() call.

Definition at line 940 of file message.c.

int usb_interrupt_msg ( struct usb_device *  usb_dev,
unsigned int  pipe,
void data,
int  len,
int actual_length,
int  timeout 
)

usb_interrupt_msg - Builds an interrupt urb, sends it off and waits for completion : pointer to the usb device to send the message to : endpoint "pipe" to send the message to : pointer to the data to send : length in bytes of the data to send : pointer to a location to put the actual length transferred in bytes : time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)

Context: !in_interrupt ()

This function sends a simple interrupt message to a specified endpoint and waits for the message to complete, or timeout.

If successful, it returns 0, otherwise a negative error number. The number of actual bytes transferred will be stored in the actual_length paramater.

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.

Definition at line 183 of file message.c.

int usb_reset_configuration ( struct usb_device *  dev)

usb_reset_configuration - lightweight device reset : the device whose configuration is being reset

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.

Returns zero on success, else a negative error code.

Definition at line 1431 of file message.c.

void usb_reset_endpoint ( struct usb_device *  dev,
unsigned int  epaddr 
)

usb_reset_endpoint - Reset an endpoint's state. : the device whose endpoint is to be reset : the endpoint's address. Endpoint number for output, endpoint number + USB_DIR_IN for input

Resets any host-side endpoint state such as the toggle bit, sequence number or current window.

Definition at line 1091 of file message.c.

int usb_set_configuration ( struct usb_device *  dev,
int  configuration 
)

Definition at line 1706 of file message.c.

int usb_set_interface ( struct usb_device *  dev,
int  interface,
int  alternate 
)

Definition at line 1278 of file message.c.

void usb_sg_cancel ( struct usb_sg_request *  io)

usb_sg_cancel - stop scatter/gather i/o issued by usb_sg_wait() : request block, initialized with usb_sg_init()

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.

Definition at line 574 of file message.c.

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 
)

usb_sg_init - initializes scatterlist-based bulk/interrupt I/O request : request block being initialized. until usb_sg_wait() returns, treat this as a pointer to an opaque block of memory, : the usb device that will send or receive the data : endpoint "pipe" used to transfer the data : polling rate for interrupt endpoints, in frames or (for high speed endpoints) microframes; ignored for bulk : scatterlist entries : how many entries in the scatterlist : how many bytes to send from the scatterlist, or zero to send every byte identified in the list. : SLAB_* flags affecting memory allocations in this call

Returns zero for success, else a negative errno value. 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.

Definition at line 355 of file message.c.

void usb_sg_wait ( struct usb_sg_request *  io)

usb_sg_wait - synchronously execute scatter/gather request : request block handle, as initialized with usb_sg_init(). some fields become accessible when this call returns. Context: !in_interrupt ()

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.

Definition at line 502 of file message.c.

int usb_string ( struct usb_device *  dev,
int  index,
char buf,
size_t  size 
)

usb_string - returns UTF-8 version of a string descriptor : the device whose string descriptor is being retrieved : the number of the descriptor : where to put the string : how big is "buf"? Context: !in_interrupt ()

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.

Returns length of the string (>= 0) or usb_control_msg status (< 0).

Definition at line 810 of file message.c.

Variable Documentation

struct device_type usb_if_device_type
Initial value:
= {
.name = "usb_interface",
.release = usb_release_interface,
.uevent = usb_if_uevent,
}

Definition at line 1586 of file message.c.