Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6: (149 commits) USB: ohci-pnx4008: Remove unnecessary cast of return value of kzalloc USB: additions to the quirk list usb-storage: implement autosuspend USB: cdc-acm: add new device id to option driver USB: goku_udc trivial cleanups USB: usb gadget stack can now -DDEBUG with Kconfig usb gadget stack: remove usb_ep_*_buffer(), part 2 usb gadget stack: remove usb_ep_*_buffer(), part 1 USB: pxa2xx_udc -- cleanups, mostly removing dma hooks USB: pxa2xx_udc: use generic gpio layer USB: quirk for samsung printer USB: usb/dma doc updates USB: drivers/usb/storage/unusual_devs.h whitespace cleanup USB: remove Makefile reference to obsolete OHCI_AT91 USB: io_*: remove bogus termios no change checks USB: mos7720: remove bogus no termios change check USB: visor and whiteheat: remove bogus termios change checks USB: pl2303: remove bogus checks and fix speed support to use tty_get_baud_rate() USB: mos7840.c: turn this into a serial driver USB: make the usb_device numa_node get assigned from controller ...
This commit is contained in:
commit
9374430a52
147 changed files with 14876 additions and 4569 deletions
|
@ -146,6 +146,10 @@ struct usb_interface {
|
|||
* active alternate setting */
|
||||
unsigned num_altsetting; /* number of alternate settings */
|
||||
|
||||
/* If there is an interface association descriptor then it will list
|
||||
* the associated interfaces */
|
||||
struct usb_interface_assoc_descriptor *intf_assoc;
|
||||
|
||||
int minor; /* minor number this interface is
|
||||
* bound to */
|
||||
enum usb_interface_condition condition; /* state of binding */
|
||||
|
@ -175,6 +179,7 @@ void usb_put_intf(struct usb_interface *intf);
|
|||
|
||||
/* this maximum is arbitrary */
|
||||
#define USB_MAXINTERFACES 32
|
||||
#define USB_MAXIADS USB_MAXINTERFACES/2
|
||||
|
||||
/**
|
||||
* struct usb_interface_cache - long-term representation of a device interface
|
||||
|
@ -245,6 +250,11 @@ struct usb_host_config {
|
|||
struct usb_config_descriptor desc;
|
||||
|
||||
char *string; /* iConfiguration string, if present */
|
||||
|
||||
/* List of any Interface Association Descriptors in this
|
||||
* configuration. */
|
||||
struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS];
|
||||
|
||||
/* the interfaces associated with this configuration,
|
||||
* stored in no particular order */
|
||||
struct usb_interface *interface[USB_MAXINTERFACES];
|
||||
|
@ -403,6 +413,8 @@ struct usb_device {
|
|||
|
||||
unsigned auto_pm:1; /* autosuspend/resume in progress */
|
||||
unsigned do_remote_wakeup:1; /* remote wakeup should be enabled */
|
||||
unsigned reset_resume:1; /* needs reset instead of resume */
|
||||
unsigned persist_enabled:1; /* USB_PERSIST enabled for this dev */
|
||||
unsigned autosuspend_disabled:1; /* autosuspend and autoresume */
|
||||
unsigned autoresume_disabled:1; /* disabled by the user */
|
||||
#endif
|
||||
|
@ -770,6 +782,28 @@ static inline int usb_endpoint_is_isoc_out(const struct usb_endpoint_descriptor
|
|||
.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, .bInterfaceClass = (cl), \
|
||||
.bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr)
|
||||
|
||||
/**
|
||||
* USB_DEVICE_AND_INTERFACE_INFO - macro used to describe a specific usb device
|
||||
* with a class of usb interfaces
|
||||
* @vend: the 16 bit USB Vendor ID
|
||||
* @prod: the 16 bit USB Product ID
|
||||
* @cl: bInterfaceClass value
|
||||
* @sc: bInterfaceSubClass value
|
||||
* @pr: bInterfaceProtocol value
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#define USB_DEVICE_AND_INTERFACE_INFO(vend,prod,cl,sc,pr) \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
|
||||
| USB_DEVICE_ID_MATCH_DEVICE, \
|
||||
.idVendor = (vend), .idProduct = (prod), \
|
||||
.bInterfaceClass = (cl), \
|
||||
.bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr)
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
/* Stuff for dynamic usb ids */
|
||||
|
@ -816,10 +850,15 @@ struct usbdrv_wrap {
|
|||
* do (or don't) show up otherwise in the filesystem.
|
||||
* @suspend: Called when the device is going to be suspended by the system.
|
||||
* @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_composite_device() when the device
|
||||
* is about to be reset.
|
||||
* @post_reset: Called by usb_reset_composite_device() after the device
|
||||
* has been reset.
|
||||
* has been reset, or in lieu of @resume following a reset-resume
|
||||
* (i.e., the device is reset instead of being resumed, as might
|
||||
* happen if power was lost). The second argument tells which is
|
||||
* the reason.
|
||||
* @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.
|
||||
|
@ -859,9 +898,10 @@ struct usb_driver {
|
|||
|
||||
int (*suspend) (struct usb_interface *intf, pm_message_t message);
|
||||
int (*resume) (struct usb_interface *intf);
|
||||
int (*reset_resume)(struct usb_interface *intf);
|
||||
|
||||
void (*pre_reset) (struct usb_interface *intf);
|
||||
void (*post_reset) (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;
|
||||
|
||||
|
@ -964,6 +1004,7 @@ extern int usb_disabled(void);
|
|||
#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */
|
||||
#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt
|
||||
* needed */
|
||||
#define URB_FREE_BUFFER 0x0100 /* Free transfer buffer with the URB */
|
||||
|
||||
struct usb_iso_packet_descriptor {
|
||||
unsigned int offset;
|
||||
|
@ -974,11 +1015,26 @@ struct usb_iso_packet_descriptor {
|
|||
|
||||
struct urb;
|
||||
|
||||
struct usb_anchor {
|
||||
struct list_head urb_list;
|
||||
wait_queue_head_t wait;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
static inline void init_usb_anchor(struct usb_anchor *anchor)
|
||||
{
|
||||
INIT_LIST_HEAD(&anchor->urb_list);
|
||||
init_waitqueue_head(&anchor->wait);
|
||||
spin_lock_init(&anchor->lock);
|
||||
}
|
||||
|
||||
typedef void (*usb_complete_t)(struct urb *);
|
||||
|
||||
/**
|
||||
* struct urb - USB Request Block
|
||||
* @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
|
||||
* @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"
|
||||
|
@ -1151,6 +1207,8 @@ struct urb
|
|||
/* public: documented fields in the urb that can be used by drivers */
|
||||
struct list_head urb_list; /* list head for use by the urb's
|
||||
* current owner */
|
||||
struct list_head anchor_list; /* the URB may be anchored by the driver */
|
||||
struct usb_anchor *anchor;
|
||||
struct usb_device *dev; /* (in) pointer to associated device */
|
||||
unsigned int pipe; /* (in) pipe information */
|
||||
int status; /* (return) non-ISO status */
|
||||
|
@ -1286,6 +1344,11 @@ extern struct urb *usb_get_urb(struct urb *urb);
|
|||
extern int usb_submit_urb(struct urb *urb, gfp_t mem_flags);
|
||||
extern int usb_unlink_urb(struct urb *urb);
|
||||
extern void usb_kill_urb(struct urb *urb);
|
||||
extern void usb_kill_anchored_urbs(struct usb_anchor *anchor);
|
||||
extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor);
|
||||
extern void usb_unanchor_urb(struct urb *urb);
|
||||
extern int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor,
|
||||
unsigned int timeout);
|
||||
|
||||
void *usb_buffer_alloc (struct usb_device *dev, size_t size,
|
||||
gfp_t mem_flags, dma_addr_t *dma);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
unifdef-y += audio.h
|
||||
unifdef-y += cdc.h
|
||||
unifdef-y += ch9.h
|
||||
unifdef-y += gadgetfs.h
|
||||
unifdef-y += midi.h
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#ifndef __LINUX_USB_GADGETFS_H
|
||||
#define __LINUX_USB_GADGETFS_H
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/ioctl.h>
|
||||
|
@ -7,11 +9,12 @@
|
|||
/*
|
||||
* Filesystem based user-mode API to USB Gadget controller hardware
|
||||
*
|
||||
* Almost everything can be done with only read and write operations,
|
||||
* Other than ep0 operations, most things are done by read() and write()
|
||||
* on endpoint files found in one directory. They are configured by
|
||||
* writing descriptors, and then may be used for normal stream style
|
||||
* i/o requests. When ep0 is configured, the device can enumerate;
|
||||
* when it's closed, the device disconnects from usb.
|
||||
* when it's closed, the device disconnects from usb. Operations on
|
||||
* ep0 require ioctl() operations.
|
||||
*
|
||||
* Configuration and device descriptors get written to /dev/gadget/$CHIP,
|
||||
* which may then be used to read usb_gadgetfs_event structs. The driver
|
||||
|
@ -21,9 +24,9 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* Events are delivered on the ep0 file descriptor, if the user mode driver
|
||||
* Events are delivered on the ep0 file descriptor, when the user mode driver
|
||||
* reads from this file descriptor after writing the descriptors. Don't
|
||||
* stop polling this descriptor, if you write that kind of driver.
|
||||
* stop polling this descriptor.
|
||||
*/
|
||||
|
||||
enum usb_gadgetfs_event_type {
|
||||
|
@ -36,8 +39,10 @@ enum usb_gadgetfs_event_type {
|
|||
// and likely more !
|
||||
};
|
||||
|
||||
/* NOTE: this structure must stay the same size and layout on
|
||||
* both 32-bit and 64-bit kernels.
|
||||
*/
|
||||
struct usb_gadgetfs_event {
|
||||
enum usb_gadgetfs_event_type type;
|
||||
union {
|
||||
// NOP, DISCONNECT, SUSPEND: nothing
|
||||
// ... some hardware can't report disconnection
|
||||
|
@ -46,19 +51,20 @@ struct usb_gadgetfs_event {
|
|||
enum usb_device_speed speed;
|
||||
|
||||
// SETUP: packet; DATA phase i/o precedes next event
|
||||
// (setup.bmRequestType & USB_DIR_IN) flags direction
|
||||
// (setup.bmRequestType & USB_DIR_IN) flags direction
|
||||
// ... includes SET_CONFIGURATION, SET_INTERFACE
|
||||
struct usb_ctrlrequest setup;
|
||||
} u;
|
||||
enum usb_gadgetfs_event_type type;
|
||||
};
|
||||
|
||||
|
||||
/* endpoint ioctls */
|
||||
|
||||
/* IN transfers may be reported to the gadget driver as complete
|
||||
* when the fifo is loaded, before the host reads the data;
|
||||
* when the fifo is loaded, before the host reads the data;
|
||||
* OUT transfers may be reported to the host's "client" driver as
|
||||
* complete when they're sitting in the FIFO unread.
|
||||
* complete when they're sitting in the FIFO unread.
|
||||
* THIS returns how many bytes are "unclaimed" in the endpoint fifo
|
||||
* (needed for precise fault handling, when the hardware allows it)
|
||||
*/
|
||||
|
@ -72,4 +78,4 @@ struct usb_gadgetfs_event {
|
|||
*/
|
||||
#define GADGETFS_CLEAR_HALT _IO('g',3)
|
||||
|
||||
|
||||
#endif /* __LINUX_USB_GADGETFS_H */
|
|
@ -9,3 +9,6 @@
|
|||
|
||||
/* string descriptors must not be fetched using a 255-byte read */
|
||||
#define USB_QUIRK_STRING_FETCH_255 0x00000002
|
||||
|
||||
/* device can't resume correctly so reset it instead */
|
||||
#define USB_QUIRK_RESET_RESUME 0x00000004
|
||||
|
|
|
@ -221,6 +221,9 @@ struct usb_serial_driver {
|
|||
int (*port_probe) (struct usb_serial_port *port);
|
||||
int (*port_remove) (struct usb_serial_port *port);
|
||||
|
||||
int (*suspend) (struct usb_serial *serial, pm_message_t message);
|
||||
int (*resume) (struct usb_serial *serial);
|
||||
|
||||
/* serial function calls */
|
||||
int (*open) (struct usb_serial_port *port, struct file * filp);
|
||||
void (*close) (struct usb_serial_port *port, struct file * filp);
|
||||
|
@ -249,6 +252,9 @@ extern void usb_serial_port_softint(struct usb_serial_port *port);
|
|||
extern int usb_serial_probe(struct usb_interface *iface, const struct usb_device_id *id);
|
||||
extern void usb_serial_disconnect(struct usb_interface *iface);
|
||||
|
||||
extern int usb_serial_suspend(struct usb_interface *intf, pm_message_t message);
|
||||
extern int usb_serial_resume(struct usb_interface *intf);
|
||||
|
||||
extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest);
|
||||
extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit);
|
||||
|
||||
|
@ -269,6 +275,7 @@ extern void usb_serial_put(struct usb_serial *serial);
|
|||
extern int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp);
|
||||
extern int usb_serial_generic_write (struct usb_serial_port *port, const unsigned char *buf, int count);
|
||||
extern void usb_serial_generic_close (struct usb_serial_port *port, struct file *filp);
|
||||
extern int usb_serial_generic_resume (struct usb_serial *serial);
|
||||
extern int usb_serial_generic_write_room (struct usb_serial_port *port);
|
||||
extern int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port);
|
||||
extern void usb_serial_generic_read_bulk_callback (struct urb *urb);
|
||||
|
|
|
@ -110,13 +110,6 @@ struct usb_ep_ops {
|
|||
gfp_t gfp_flags);
|
||||
void (*free_request) (struct usb_ep *ep, struct usb_request *req);
|
||||
|
||||
void *(*alloc_buffer) (struct usb_ep *ep, unsigned bytes,
|
||||
dma_addr_t *dma, gfp_t gfp_flags);
|
||||
void (*free_buffer) (struct usb_ep *ep, void *buf, dma_addr_t dma,
|
||||
unsigned bytes);
|
||||
// NOTE: on 2.6, drivers may also use dma_map() and
|
||||
// dma_sync_single_*() to directly manage dma overhead.
|
||||
|
||||
int (*queue) (struct usb_ep *ep, struct usb_request *req,
|
||||
gfp_t gfp_flags);
|
||||
int (*dequeue) (struct usb_ep *ep, struct usb_request *req);
|
||||
|
@ -234,47 +227,6 @@ usb_ep_free_request (struct usb_ep *ep, struct usb_request *req)
|
|||
ep->ops->free_request (ep, req);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_ep_alloc_buffer - allocate an I/O buffer
|
||||
* @ep:the endpoint associated with the buffer
|
||||
* @len:length of the desired buffer
|
||||
* @dma:pointer to the buffer's DMA address; must be valid
|
||||
* @gfp_flags:GFP_* flags to use
|
||||
*
|
||||
* Returns a new buffer, or null if one could not be allocated.
|
||||
* The buffer is suitably aligned for dma, if that endpoint uses DMA,
|
||||
* and the caller won't have to care about dma-inconsistency
|
||||
* or any hidden "bounce buffer" mechanism. No additional per-request
|
||||
* DMA mapping will be required for such buffers.
|
||||
* Free it later with usb_ep_free_buffer().
|
||||
*
|
||||
* You don't need to use this call to allocate I/O buffers unless you
|
||||
* want to make sure drivers don't incur costs for such "bounce buffer"
|
||||
* copies or per-request DMA mappings.
|
||||
*/
|
||||
static inline void *
|
||||
usb_ep_alloc_buffer (struct usb_ep *ep, unsigned len, dma_addr_t *dma,
|
||||
gfp_t gfp_flags)
|
||||
{
|
||||
return ep->ops->alloc_buffer (ep, len, dma, gfp_flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_ep_free_buffer - frees an i/o buffer
|
||||
* @ep:the endpoint associated with the buffer
|
||||
* @buf:CPU view address of the buffer
|
||||
* @dma:the buffer's DMA address
|
||||
* @len:length of the buffer
|
||||
*
|
||||
* reverses the effect of usb_ep_alloc_buffer().
|
||||
* caller guarantees the buffer will no longer be accessed
|
||||
*/
|
||||
static inline void
|
||||
usb_ep_free_buffer (struct usb_ep *ep, void *buf, dma_addr_t dma, unsigned len)
|
||||
{
|
||||
ep->ops->free_buffer (ep, buf, dma, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_ep_queue - queues (submits) an I/O request to an endpoint.
|
||||
* @ep:the endpoint associated with the request
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue