| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __LINUX_USB_H | 
 | 2 | #define __LINUX_USB_H | 
 | 3 |  | 
 | 4 | #include <linux/mod_devicetable.h> | 
| David Brownell | 5f84813 | 2006-12-16 15:34:53 -0800 | [diff] [blame] | 5 | #include <linux/usb/ch9.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 |  | 
 | 7 | #define USB_MAJOR			180 | 
| Kay Sievers | fbf82fd | 2005-07-31 01:05:53 +0200 | [diff] [blame] | 8 | #define USB_DEVICE_MAJOR		189 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 9 |  | 
 | 10 |  | 
 | 11 | #ifdef __KERNEL__ | 
 | 12 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | #include <linux/errno.h>        /* for -ENODEV */ | 
 | 14 | #include <linux/delay.h>	/* for mdelay() */ | 
 | 15 | #include <linux/interrupt.h>	/* for in_interrupt() */ | 
 | 16 | #include <linux/list.h>		/* for struct list_head */ | 
 | 17 | #include <linux/kref.h>		/* for struct kref */ | 
 | 18 | #include <linux/device.h>	/* for struct device */ | 
 | 19 | #include <linux/fs.h>		/* for struct file_operations */ | 
 | 20 | #include <linux/completion.h>	/* for struct completion */ | 
 | 21 | #include <linux/sched.h>	/* for current && schedule_timeout */ | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 22 | #include <linux/mutex.h>	/* for struct mutex */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 |  | 
 | 24 | struct usb_device; | 
 | 25 | struct usb_driver; | 
| Inaky Perez-Gonzalez | b1d8dfb | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 26 | struct wusb_dev; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 |  | 
 | 28 | /*-------------------------------------------------------------------------*/ | 
 | 29 |  | 
 | 30 | /* | 
 | 31 |  * Host-side wrappers for standard USB descriptors ... these are parsed | 
 | 32 |  * from the data provided by devices.  Parsing turns them from a flat | 
 | 33 |  * sequence of descriptors into a hierarchy: | 
 | 34 |  * | 
 | 35 |  *  - devices have one (usually) or more configs; | 
 | 36 |  *  - configs have one (often) or more interfaces; | 
 | 37 |  *  - interfaces have one (usually) or more settings; | 
 | 38 |  *  - each interface setting has zero or (usually) more endpoints. | 
| Sarah Sharp | 663c30d | 2009-04-27 19:58:14 -0700 | [diff] [blame] | 39 |  *  - a SuperSpeed endpoint has a companion descriptor | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 |  * | 
 | 41 |  * And there might be other descriptors mixed in with those. | 
 | 42 |  * | 
 | 43 |  * Devices may also have class-specific or vendor-specific descriptors. | 
 | 44 |  */ | 
 | 45 |  | 
| Greg Kroah-Hartman | 9bde749 | 2006-06-14 12:14:34 -0700 | [diff] [blame] | 46 | struct ep_device; | 
 | 47 |  | 
| Sarah Sharp | 663c30d | 2009-04-27 19:58:14 -0700 | [diff] [blame] | 48 | /* For SS devices */ | 
 | 49 | /** | 
| Sarah Sharp | f0058c6 | 2009-04-29 19:06:20 -0700 | [diff] [blame] | 50 |  * struct usb_host_ss_ep_comp - Valid for SuperSpeed devices only | 
| Sarah Sharp | 663c30d | 2009-04-27 19:58:14 -0700 | [diff] [blame] | 51 |  * @desc: endpoint companion descriptor, wMaxPacketSize in native byteorder | 
 | 52 |  * @extra: descriptors following this endpoint companion descriptor | 
 | 53 |  * @extralen: how many bytes of "extra" are valid | 
 | 54 |  */ | 
| Sarah Sharp | f0058c6 | 2009-04-29 19:06:20 -0700 | [diff] [blame] | 55 | struct usb_host_ss_ep_comp { | 
 | 56 | 	struct usb_ss_ep_comp_descriptor	desc; | 
 | 57 | 	unsigned char				*extra;   /* Extra descriptors */ | 
 | 58 | 	int					extralen; | 
| Sarah Sharp | 663c30d | 2009-04-27 19:58:14 -0700 | [diff] [blame] | 59 | }; | 
 | 60 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | /** | 
 | 62 |  * struct usb_host_endpoint - host-side endpoint descriptor and queue | 
 | 63 |  * @desc: descriptor for this endpoint, wMaxPacketSize in native byteorder | 
 | 64 |  * @urb_list: urbs queued to this endpoint; maintained by usbcore | 
 | 65 |  * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH) | 
 | 66 |  *	with one or more transfer descriptors (TDs) per urb | 
| Randy Dunlap | 7fac9a3 | 2006-06-22 15:12:41 -0700 | [diff] [blame] | 67 |  * @ep_dev: ep_device for sysfs info | 
| Sarah Sharp | f0058c6 | 2009-04-29 19:06:20 -0700 | [diff] [blame] | 68 |  * @ss_ep_comp: companion descriptor information for this endpoint | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 |  * @extra: descriptors following this endpoint in the configuration | 
 | 70 |  * @extralen: how many bytes of "extra" are valid | 
| Alan Stern | bdd016b | 2007-07-30 17:05:22 -0400 | [diff] [blame] | 71 |  * @enabled: URBs may be submitted to this endpoint | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 72 |  * | 
 | 73 |  * USB requests are always queued to a given endpoint, identified by a | 
 | 74 |  * descriptor within an active interface in a given USB configuration. | 
 | 75 |  */ | 
 | 76 | struct usb_host_endpoint { | 
 | 77 | 	struct usb_endpoint_descriptor	desc; | 
 | 78 | 	struct list_head		urb_list; | 
 | 79 | 	void				*hcpriv; | 
| Greg Kroah-Hartman | 9bde749 | 2006-06-14 12:14:34 -0700 | [diff] [blame] | 80 | 	struct ep_device 		*ep_dev;	/* For sysfs info */ | 
| Sarah Sharp | f0058c6 | 2009-04-29 19:06:20 -0700 | [diff] [blame] | 81 | 	struct usb_host_ss_ep_comp	*ss_ep_comp;	/* For SS devices */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 82 |  | 
 | 83 | 	unsigned char *extra;   /* Extra descriptors */ | 
 | 84 | 	int extralen; | 
| Alan Stern | bdd016b | 2007-07-30 17:05:22 -0400 | [diff] [blame] | 85 | 	int enabled; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 86 | }; | 
 | 87 |  | 
 | 88 | /* host-side wrapper for one interface setting's parsed descriptors */ | 
 | 89 | struct usb_host_interface { | 
 | 90 | 	struct usb_interface_descriptor	desc; | 
 | 91 |  | 
 | 92 | 	/* array of desc.bNumEndpoint endpoints associated with this | 
 | 93 | 	 * interface setting.  these will be in no particular order. | 
 | 94 | 	 */ | 
 | 95 | 	struct usb_host_endpoint *endpoint; | 
 | 96 |  | 
 | 97 | 	char *string;		/* iInterface string, if present */ | 
 | 98 | 	unsigned char *extra;   /* Extra descriptors */ | 
 | 99 | 	int extralen; | 
 | 100 | }; | 
 | 101 |  | 
 | 102 | enum usb_interface_condition { | 
 | 103 | 	USB_INTERFACE_UNBOUND = 0, | 
 | 104 | 	USB_INTERFACE_BINDING, | 
 | 105 | 	USB_INTERFACE_BOUND, | 
 | 106 | 	USB_INTERFACE_UNBINDING, | 
 | 107 | }; | 
 | 108 |  | 
 | 109 | /** | 
 | 110 |  * struct usb_interface - what usb device drivers talk to | 
 | 111 |  * @altsetting: array of interface structures, one for each alternate | 
 | 112 |  * 	setting that may be selected.  Each one includes a set of | 
 | 113 |  * 	endpoint configurations.  They will be in no particular order. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 114 |  * @cur_altsetting: the current altsetting. | 
| Lei Ming | d6d914f | 2008-02-25 18:07:28 +0800 | [diff] [blame] | 115 |  * @num_altsetting: number of altsettings defined. | 
| Randy Dunlap | 3f42378 | 2007-07-19 10:21:37 -0700 | [diff] [blame] | 116 |  * @intf_assoc: interface association descriptor | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 117 |  * @minor: the minor number assigned to this interface, if this | 
 | 118 |  *	interface is bound to a driver that uses the USB major number. | 
 | 119 |  *	If this interface does not use the USB major, this field should | 
 | 120 |  *	be unused.  The driver should set this value in the probe() | 
 | 121 |  *	function of the driver, after it has been assigned a minor | 
 | 122 |  *	number from the USB core by calling usb_register_dev(). | 
 | 123 |  * @condition: binding state of the interface: not bound, binding | 
 | 124 |  *	(in probe()), bound to a driver, or unbinding (in disconnect()) | 
| Alan Stern | 4d064c0 | 2006-07-01 22:11:44 -0400 | [diff] [blame] | 125 |  * @is_active: flag set when the interface is bound and not suspended. | 
| Randy Dunlap | f88ed90 | 2007-12-03 14:14:16 -0800 | [diff] [blame] | 126 |  * @sysfs_files_created: sysfs attributes exist | 
| Alan Stern | 3b23dd6 | 2008-12-05 14:10:34 -0500 | [diff] [blame] | 127 |  * @ep_devs_created: endpoint child pseudo-devices exist | 
| Alan Stern | 352d026 | 2008-10-29 15:16:58 -0400 | [diff] [blame] | 128 |  * @unregistering: flag set when the interface is being unregistered | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 129 |  * @needs_remote_wakeup: flag set when the driver requires remote-wakeup | 
 | 130 |  *	capability during autosuspend. | 
| Alan Stern | 55151d7 | 2008-08-12 14:33:59 -0400 | [diff] [blame] | 131 |  * @needs_altsetting0: flag set when a set-interface request for altsetting 0 | 
 | 132 |  *	has been deferred. | 
| Alan Stern | f4f4d58 | 2008-07-28 10:39:28 -0400 | [diff] [blame] | 133 |  * @needs_binding: flag set when the driver should be re-probed or unbound | 
 | 134 |  *	following a reset or suspend operation it doesn't support. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 |  * @dev: driver model's view of this device | 
| Greg Kroah-Hartman | 0873c76 | 2006-06-20 13:09:50 -0700 | [diff] [blame] | 136 |  * @usb_dev: if an interface is bound to the USB major, this will point | 
 | 137 |  *	to the sysfs representation for that device. | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 138 |  * @pm_usage_cnt: PM usage counter for this interface; autosuspend is not | 
 | 139 |  *	allowed unless the counter is 0. | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 140 |  * @reset_ws: Used for scheduling resets from atomic context. | 
 | 141 |  * @reset_running: set to 1 if the interface is currently running a | 
 | 142 |  *      queued reset so that usb_cancel_queued_reset() doesn't try to | 
 | 143 |  *      remove from the workqueue when running inside the worker | 
 | 144 |  *      thread. See __usb_queue_reset_device(). | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 |  * | 
 | 146 |  * USB device drivers attach to interfaces on a physical device.  Each | 
 | 147 |  * interface encapsulates a single high level function, such as feeding | 
 | 148 |  * an audio stream to a speaker or reporting a change in a volume control. | 
 | 149 |  * Many USB devices only have one interface.  The protocol used to talk to | 
 | 150 |  * an interface's endpoints can be defined in a usb "class" specification, | 
 | 151 |  * or by a product's vendor.  The (default) control endpoint is part of | 
 | 152 |  * every interface, but is never listed among the interface's descriptors. | 
 | 153 |  * | 
 | 154 |  * The driver that is bound to the interface can use standard driver model | 
 | 155 |  * calls such as dev_get_drvdata() on the dev member of this structure. | 
 | 156 |  * | 
 | 157 |  * Each interface may have alternate settings.  The initial configuration | 
 | 158 |  * of a device sets altsetting 0, but the device driver can change | 
 | 159 |  * that setting using usb_set_interface().  Alternate settings are often | 
| Michael Opdenacker | 59c5159 | 2007-05-09 08:57:56 +0200 | [diff] [blame] | 160 |  * used to control the use of periodic endpoints, such as by having | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 161 |  * different endpoints use different amounts of reserved USB bandwidth. | 
 | 162 |  * All standards-conformant USB devices that use isochronous endpoints | 
 | 163 |  * will use them in non-default settings. | 
 | 164 |  * | 
 | 165 |  * The USB specification says that alternate setting numbers must run from | 
 | 166 |  * 0 to one less than the total number of alternate settings.  But some | 
 | 167 |  * devices manage to mess this up, and the structures aren't necessarily | 
 | 168 |  * stored in numerical order anyhow.  Use usb_altnum_to_altsetting() to | 
 | 169 |  * look up an alternate setting in the altsetting array based on its number. | 
 | 170 |  */ | 
 | 171 | struct usb_interface { | 
 | 172 | 	/* array of alternate settings for this interface, | 
 | 173 | 	 * stored in no particular order */ | 
 | 174 | 	struct usb_host_interface *altsetting; | 
 | 175 |  | 
 | 176 | 	struct usb_host_interface *cur_altsetting;	/* the currently | 
 | 177 | 					 * active alternate setting */ | 
 | 178 | 	unsigned num_altsetting;	/* number of alternate settings */ | 
 | 179 |  | 
| Craig W. Nadler | 165fe97 | 2007-06-15 23:14:35 -0400 | [diff] [blame] | 180 | 	/* If there is an interface association descriptor then it will list | 
 | 181 | 	 * the associated interfaces */ | 
 | 182 | 	struct usb_interface_assoc_descriptor *intf_assoc; | 
 | 183 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 184 | 	int minor;			/* minor number this interface is | 
 | 185 | 					 * bound to */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 186 | 	enum usb_interface_condition condition;		/* state of binding */ | 
| Alan Stern | 4d064c0 | 2006-07-01 22:11:44 -0400 | [diff] [blame] | 187 | 	unsigned is_active:1;		/* the interface is not suspended */ | 
| Alan Stern | 7e61559 | 2007-11-06 11:43:42 -0500 | [diff] [blame] | 188 | 	unsigned sysfs_files_created:1;	/* the sysfs attributes exist */ | 
| Alan Stern | 3b23dd6 | 2008-12-05 14:10:34 -0500 | [diff] [blame] | 189 | 	unsigned ep_devs_created:1;	/* endpoint "devices" exist */ | 
| Alan Stern | 352d026 | 2008-10-29 15:16:58 -0400 | [diff] [blame] | 190 | 	unsigned unregistering:1;	/* unregistration is in progress */ | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 191 | 	unsigned needs_remote_wakeup:1;	/* driver requires remote wakeup */ | 
| Alan Stern | 55151d7 | 2008-08-12 14:33:59 -0400 | [diff] [blame] | 192 | 	unsigned needs_altsetting0:1;	/* switch to altsetting 0 is pending */ | 
| Alan Stern | 78d9a48 | 2008-06-23 16:00:40 -0400 | [diff] [blame] | 193 | 	unsigned needs_binding:1;	/* needs delayed unbind/rebind */ | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 194 | 	unsigned reset_running:1; | 
| Alan Stern | 4d064c0 | 2006-07-01 22:11:44 -0400 | [diff] [blame] | 195 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 196 | 	struct device dev;		/* interface specific device info */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 197 | 	struct device *usb_dev; | 
| Alan Stern | ccf5b80 | 2009-06-29 11:00:01 -0400 | [diff] [blame] | 198 | 	atomic_t pm_usage_cnt;		/* usage counter for autosuspend */ | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 199 | 	struct work_struct reset_ws;	/* for resets in atomic context */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 200 | }; | 
 | 201 | #define	to_usb_interface(d) container_of(d, struct usb_interface, dev) | 
 | 202 | #define	interface_to_usbdev(intf) \ | 
 | 203 | 	container_of(intf->dev.parent, struct usb_device, dev) | 
 | 204 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 205 | static inline void *usb_get_intfdata(struct usb_interface *intf) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 206 | { | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 207 | 	return dev_get_drvdata(&intf->dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 208 | } | 
 | 209 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 210 | static inline void usb_set_intfdata(struct usb_interface *intf, void *data) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 211 | { | 
 | 212 | 	dev_set_drvdata(&intf->dev, data); | 
 | 213 | } | 
 | 214 |  | 
 | 215 | struct usb_interface *usb_get_intf(struct usb_interface *intf); | 
 | 216 | void usb_put_intf(struct usb_interface *intf); | 
 | 217 |  | 
 | 218 | /* this maximum is arbitrary */ | 
 | 219 | #define USB_MAXINTERFACES	32 | 
| Craig W. Nadler | 165fe97 | 2007-06-15 23:14:35 -0400 | [diff] [blame] | 220 | #define USB_MAXIADS		USB_MAXINTERFACES/2 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 221 |  | 
 | 222 | /** | 
 | 223 |  * struct usb_interface_cache - long-term representation of a device interface | 
 | 224 |  * @num_altsetting: number of altsettings defined. | 
 | 225 |  * @ref: reference counter. | 
 | 226 |  * @altsetting: variable-length array of interface structures, one for | 
 | 227 |  *	each alternate setting that may be selected.  Each one includes a | 
 | 228 |  *	set of endpoint configurations.  They will be in no particular order. | 
 | 229 |  * | 
 | 230 |  * These structures persist for the lifetime of a usb_device, unlike | 
 | 231 |  * struct usb_interface (which persists only as long as its configuration | 
 | 232 |  * is installed).  The altsetting arrays can be accessed through these | 
 | 233 |  * structures at any time, permitting comparison of configurations and | 
 | 234 |  * providing support for the /proc/bus/usb/devices pseudo-file. | 
 | 235 |  */ | 
 | 236 | struct usb_interface_cache { | 
 | 237 | 	unsigned num_altsetting;	/* number of alternate settings */ | 
 | 238 | 	struct kref ref;		/* reference counter */ | 
 | 239 |  | 
 | 240 | 	/* variable-length array of alternate settings for this interface, | 
 | 241 | 	 * stored in no particular order */ | 
 | 242 | 	struct usb_host_interface altsetting[0]; | 
 | 243 | }; | 
 | 244 | #define	ref_to_usb_interface_cache(r) \ | 
 | 245 | 		container_of(r, struct usb_interface_cache, ref) | 
 | 246 | #define	altsetting_to_usb_interface_cache(a) \ | 
 | 247 | 		container_of(a, struct usb_interface_cache, altsetting[0]) | 
 | 248 |  | 
 | 249 | /** | 
 | 250 |  * struct usb_host_config - representation of a device's configuration | 
 | 251 |  * @desc: the device's configuration descriptor. | 
 | 252 |  * @string: pointer to the cached version of the iConfiguration string, if | 
 | 253 |  *	present for this configuration. | 
| Randy Dunlap | 3f42378 | 2007-07-19 10:21:37 -0700 | [diff] [blame] | 254 |  * @intf_assoc: list of any interface association descriptors in this config | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 255 |  * @interface: array of pointers to usb_interface structures, one for each | 
 | 256 |  *	interface in the configuration.  The number of interfaces is stored | 
 | 257 |  *	in desc.bNumInterfaces.  These pointers are valid only while the | 
 | 258 |  *	the configuration is active. | 
 | 259 |  * @intf_cache: array of pointers to usb_interface_cache structures, one | 
 | 260 |  *	for each interface in the configuration.  These structures exist | 
 | 261 |  *	for the entire life of the device. | 
 | 262 |  * @extra: pointer to buffer containing all extra descriptors associated | 
 | 263 |  *	with this configuration (those preceding the first interface | 
 | 264 |  *	descriptor). | 
 | 265 |  * @extralen: length of the extra descriptors buffer. | 
 | 266 |  * | 
 | 267 |  * USB devices may have multiple configurations, but only one can be active | 
 | 268 |  * at any time.  Each encapsulates a different operational environment; | 
 | 269 |  * for example, a dual-speed device would have separate configurations for | 
 | 270 |  * full-speed and high-speed operation.  The number of configurations | 
 | 271 |  * available is stored in the device descriptor as bNumConfigurations. | 
 | 272 |  * | 
 | 273 |  * A configuration can contain multiple interfaces.  Each corresponds to | 
 | 274 |  * a different function of the USB device, and all are available whenever | 
 | 275 |  * the configuration is active.  The USB standard says that interfaces | 
 | 276 |  * are supposed to be numbered from 0 to desc.bNumInterfaces-1, but a lot | 
 | 277 |  * of devices get this wrong.  In addition, the interface array is not | 
 | 278 |  * guaranteed to be sorted in numerical order.  Use usb_ifnum_to_if() to | 
 | 279 |  * look up an interface entry based on its number. | 
 | 280 |  * | 
 | 281 |  * Device drivers should not attempt to activate configurations.  The choice | 
 | 282 |  * of which configuration to install is a policy decision based on such | 
 | 283 |  * considerations as available power, functionality provided, and the user's | 
| Kay Sievers | 312c004 | 2005-11-16 09:00:00 +0100 | [diff] [blame] | 284 |  * desires (expressed through userspace tools).  However, drivers can call | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 285 |  * usb_reset_configuration() to reinitialize the current configuration and | 
 | 286 |  * all its interfaces. | 
 | 287 |  */ | 
 | 288 | struct usb_host_config { | 
 | 289 | 	struct usb_config_descriptor	desc; | 
 | 290 |  | 
| Alan Stern | 4f62efe | 2005-10-24 16:24:14 -0400 | [diff] [blame] | 291 | 	char *string;		/* iConfiguration string, if present */ | 
| Craig W. Nadler | 165fe97 | 2007-06-15 23:14:35 -0400 | [diff] [blame] | 292 |  | 
 | 293 | 	/* List of any Interface Association Descriptors in this | 
 | 294 | 	 * configuration. */ | 
 | 295 | 	struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS]; | 
 | 296 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 297 | 	/* the interfaces associated with this configuration, | 
 | 298 | 	 * stored in no particular order */ | 
 | 299 | 	struct usb_interface *interface[USB_MAXINTERFACES]; | 
 | 300 |  | 
 | 301 | 	/* Interface information available even when this is not the | 
 | 302 | 	 * active configuration */ | 
 | 303 | 	struct usb_interface_cache *intf_cache[USB_MAXINTERFACES]; | 
 | 304 |  | 
 | 305 | 	unsigned char *extra;   /* Extra descriptors */ | 
 | 306 | 	int extralen; | 
 | 307 | }; | 
 | 308 |  | 
 | 309 | int __usb_get_extra_descriptor(char *buffer, unsigned size, | 
 | 310 | 	unsigned char type, void **ptr); | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 311 | #define usb_get_extra_descriptor(ifpoint, type, ptr) \ | 
 | 312 | 				__usb_get_extra_descriptor((ifpoint)->extra, \ | 
 | 313 | 				(ifpoint)->extralen, \ | 
 | 314 | 				type, (void **)ptr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 315 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 316 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 317 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 318 | /* USB device number allocation bitmap */ | 
 | 319 | struct usb_devmap { | 
 | 320 | 	unsigned long devicemap[128 / (8*sizeof(unsigned long))]; | 
 | 321 | }; | 
 | 322 |  | 
 | 323 | /* | 
 | 324 |  * Allocated per bus (tree of devices) we have: | 
 | 325 |  */ | 
 | 326 | struct usb_bus { | 
 | 327 | 	struct device *controller;	/* host/master side hardware */ | 
 | 328 | 	int busnum;			/* Bus number (in order of reg) */ | 
| Greg Kroah-Hartman | 1b26da1 | 2008-07-02 12:46:22 -0700 | [diff] [blame] | 329 | 	const char *bus_name;		/* stable id (PCI slot_name etc) */ | 
| Alan Stern | dd990f1 | 2006-08-30 11:29:56 -0400 | [diff] [blame] | 330 | 	u8 uses_dma;			/* Does the host controller use DMA? */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 331 | 	u8 otg_port;			/* 0, or number of OTG/HNP port */ | 
 | 332 | 	unsigned is_b_host:1;		/* true during some HNP roleswitches */ | 
 | 333 | 	unsigned b_hnp_enable:1;	/* OTG: did A-Host enable HNP? */ | 
 | 334 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 335 | 	int devnum_next;		/* Next open device number in | 
 | 336 | 					 * round-robin allocation */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 337 |  | 
 | 338 | 	struct usb_devmap devmap;	/* device address allocation map */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 339 | 	struct usb_device *root_hub;	/* Root hub */ | 
 | 340 | 	struct list_head bus_list;	/* list of busses */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 341 |  | 
 | 342 | 	int bandwidth_allocated;	/* on this bus: how much of the time | 
 | 343 | 					 * reserved for periodic (intr/iso) | 
 | 344 | 					 * requests is used, on average? | 
 | 345 | 					 * Units: microseconds/frame. | 
 | 346 | 					 * Limits: Full/low speed reserve 90%, | 
 | 347 | 					 * while high speed reserves 80%. | 
 | 348 | 					 */ | 
 | 349 | 	int bandwidth_int_reqs;		/* number of Interrupt requests */ | 
 | 350 | 	int bandwidth_isoc_reqs;	/* number of Isoc. requests */ | 
 | 351 |  | 
| Kay Sievers | 9f8b17e | 2007-03-13 15:59:31 +0100 | [diff] [blame] | 352 | #ifdef CONFIG_USB_DEVICEFS | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 353 | 	struct dentry *usbfs_dentry;	/* usbfs dentry entry for the bus */ | 
| Kay Sievers | 9f8b17e | 2007-03-13 15:59:31 +0100 | [diff] [blame] | 354 | #endif | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 355 |  | 
| Pete Zaitcev | f150fa1 | 2008-11-13 21:31:21 -0700 | [diff] [blame] | 356 | #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 357 | 	struct mon_bus *mon_bus;	/* non-null when associated */ | 
 | 358 | 	int monitored;			/* non-zero when monitored */ | 
 | 359 | #endif | 
 | 360 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 361 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 362 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 363 |  | 
 | 364 | /* This is arbitrary. | 
 | 365 |  * From USB 2.0 spec Table 11-13, offset 7, a hub can | 
 | 366 |  * have up to 255 ports. The most yet reported is 10. | 
| inaky@linux.intel.com | 4370525 | 2006-10-11 20:05:58 -0700 | [diff] [blame] | 367 |  * | 
 | 368 |  * Current Wireless USB host hardware (Intel i1480 for example) allows | 
 | 369 |  * up to 22 devices to connect. Upcoming hardware might raise that | 
 | 370 |  * limit. Because the arrays need to add a bit for hub status data, we | 
 | 371 |  * do 31, so plus one evens out to four bytes. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 372 |  */ | 
| inaky@linux.intel.com | 4370525 | 2006-10-11 20:05:58 -0700 | [diff] [blame] | 373 | #define USB_MAXCHILDREN		(31) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 374 |  | 
 | 375 | struct usb_tt; | 
 | 376 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 377 | /** | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 378 |  * struct usb_device - kernel's representation of a USB device | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 379 |  * @devnum: device number; address on a USB bus | 
 | 380 |  * @devpath: device ID string for use in messages (e.g., /port/...) | 
| Sarah Sharp | 7206b00 | 2009-04-27 19:54:49 -0700 | [diff] [blame] | 381 |  * @route: tree topology hex string for use with xHCI | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 382 |  * @state: device state: configured, not attached, etc. | 
 | 383 |  * @speed: device speed: high/full/low (or error) | 
 | 384 |  * @tt: Transaction Translator info; used with low/full speed dev, highspeed hub | 
 | 385 |  * @ttport: device port on that tt hub | 
 | 386 |  * @toggle: one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints | 
 | 387 |  * @parent: our hub, unless we're the root | 
 | 388 |  * @bus: bus we're part of | 
 | 389 |  * @ep0: endpoint 0 data (default control pipe) | 
 | 390 |  * @dev: generic device interface | 
 | 391 |  * @descriptor: USB device descriptor | 
 | 392 |  * @config: all of the device's configs | 
 | 393 |  * @actconfig: the active configuration | 
 | 394 |  * @ep_in: array of IN endpoints | 
 | 395 |  * @ep_out: array of OUT endpoints | 
 | 396 |  * @rawdescriptors: raw descriptors for each config | 
 | 397 |  * @bus_mA: Current available from the bus | 
 | 398 |  * @portnum: parent port number (origin 1) | 
 | 399 |  * @level: number of USB hub ancestors | 
 | 400 |  * @can_submit: URBs may be submitted | 
 | 401 |  * @discon_suspended: disconnected while suspended | 
 | 402 |  * @persist_enabled:  USB_PERSIST enabled for this device | 
 | 403 |  * @have_langid: whether string_langid is valid | 
 | 404 |  * @authorized: policy has said we can use it; | 
 | 405 |  *	(user space) policy determines if we authorize this device to be | 
 | 406 |  *	used or not. By default, wired USB devices are authorized. | 
 | 407 |  *	WUSB devices are not, until we authorize them from user space. | 
 | 408 |  *	FIXME -- complete doc | 
| Inaky Perez-Gonzalez | 3b52f12 | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 409 |  * @authenticated: Crypto authentication passed | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 410 |  * @wusb: device is Wireless USB | 
 | 411 |  * @string_langid: language ID for strings | 
 | 412 |  * @product: iProduct string, if present (static) | 
 | 413 |  * @manufacturer: iManufacturer string, if present (static) | 
 | 414 |  * @serial: iSerialNumber string, if present (static) | 
 | 415 |  * @filelist: usbfs files that are open to this device | 
 | 416 |  * @usb_classdev: USB class device that was created for usbfs device | 
 | 417 |  *	access from userspace | 
 | 418 |  * @usbfs_dentry: usbfs dentry entry for the device | 
 | 419 |  * @maxchild: number of ports if hub | 
 | 420 |  * @children: child devices - USB devices that are attached to this hub | 
 | 421 |  * @pm_usage_cnt: usage counter for autosuspend | 
 | 422 |  * @quirks: quirks of the whole device | 
 | 423 |  * @urbnum: number of URBs submitted for the whole device | 
 | 424 |  * @active_duration: total time device is not suspended | 
 | 425 |  * @autosuspend: for delayed autosuspends | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 426 |  * @autoresume: for autoresumes requested while in_interrupt | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 427 |  * @pm_mutex: protects PM operations | 
 | 428 |  * @last_busy: time of last use | 
 | 429 |  * @autosuspend_delay: in jiffies | 
 | 430 |  * @connect_time: time device was first connected | 
 | 431 |  * @auto_pm: autosuspend/resume in progress | 
 | 432 |  * @do_remote_wakeup:  remote wakeup should be enabled | 
 | 433 |  * @reset_resume: needs reset instead of resume | 
 | 434 |  * @autosuspend_disabled: autosuspend disabled by the user | 
 | 435 |  * @autoresume_disabled: autoresume disabled by the user | 
 | 436 |  * @skip_sys_resume: skip the next system resume | 
| Inaky Perez-Gonzalez | 11e76ae | 2009-01-08 12:52:19 -0800 | [diff] [blame] | 437 |  * @wusb_dev: if this is a Wireless USB device, link to the WUSB | 
 | 438 |  *	specific data for the device. | 
| Sarah Sharp | c651527 | 2009-04-27 19:57:26 -0700 | [diff] [blame] | 439 |  * @slot_id: Slot ID assigned by xHCI | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 440 |  * | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 441 |  * Notes: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 442 |  * Usbcore drivers should not set usbdev->state directly.  Instead use | 
 | 443 |  * usb_set_device_state(). | 
 | 444 |  */ | 
 | 445 | struct usb_device { | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 446 | 	int		devnum; | 
 | 447 | 	char		devpath [16]; | 
| Sarah Sharp | 7206b00 | 2009-04-27 19:54:49 -0700 | [diff] [blame] | 448 | 	u32		route; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 449 | 	enum usb_device_state	state; | 
 | 450 | 	enum usb_device_speed	speed; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 451 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 452 | 	struct usb_tt	*tt; | 
 | 453 | 	int		ttport; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 454 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 455 | 	unsigned int toggle[2]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 456 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 457 | 	struct usb_device *parent; | 
 | 458 | 	struct usb_bus *bus; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 459 | 	struct usb_host_endpoint ep0; | 
 | 460 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 461 | 	struct device dev; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 462 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 463 | 	struct usb_device_descriptor descriptor; | 
 | 464 | 	struct usb_host_config *config; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 465 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 466 | 	struct usb_host_config *actconfig; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 467 | 	struct usb_host_endpoint *ep_in[16]; | 
 | 468 | 	struct usb_host_endpoint *ep_out[16]; | 
 | 469 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 470 | 	char **rawdescriptors; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 471 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 472 | 	unsigned short bus_mA; | 
 | 473 | 	u8 portnum; | 
 | 474 | 	u8 level; | 
| Alan Stern | 55c5271 | 2005-11-23 12:03:12 -0500 | [diff] [blame] | 475 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 476 | 	unsigned can_submit:1; | 
 | 477 | 	unsigned discon_suspended:1; | 
 | 478 | 	unsigned persist_enabled:1; | 
 | 479 | 	unsigned have_langid:1; | 
 | 480 | 	unsigned authorized:1; | 
| Inaky Perez-Gonzalez | 3b52f12 | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 481 |  	unsigned authenticated:1; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 482 | 	unsigned wusb:1; | 
 | 483 | 	int string_langid; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 484 |  | 
| Alan Stern | 4f62efe | 2005-10-24 16:24:14 -0400 | [diff] [blame] | 485 | 	/* static strings from the device */ | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 486 | 	char *product; | 
 | 487 | 	char *manufacturer; | 
 | 488 | 	char *serial; | 
| Alan Stern | 4f62efe | 2005-10-24 16:24:14 -0400 | [diff] [blame] | 489 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 490 | 	struct list_head filelist; | 
| Kay Sievers | 9f8b17e | 2007-03-13 15:59:31 +0100 | [diff] [blame] | 491 | #ifdef CONFIG_USB_DEVICE_CLASS | 
 | 492 | 	struct device *usb_classdev; | 
 | 493 | #endif | 
 | 494 | #ifdef CONFIG_USB_DEVICEFS | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 495 | 	struct dentry *usbfs_dentry; | 
| Kay Sievers | 9f8b17e | 2007-03-13 15:59:31 +0100 | [diff] [blame] | 496 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 497 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 498 | 	int maxchild; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 499 | 	struct usb_device *children[USB_MAXCHILDREN]; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 500 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 501 | 	int pm_usage_cnt; | 
 | 502 | 	u32 quirks; | 
 | 503 | 	atomic_t urbnum; | 
| Alan Stern | b5e795f | 2007-02-20 15:00:53 -0500 | [diff] [blame] | 504 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 505 | 	unsigned long active_duration; | 
| Sarah Sharp | 1512300 | 2007-12-21 16:54:15 -0800 | [diff] [blame] | 506 |  | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 507 | #ifdef CONFIG_PM | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 508 | 	struct delayed_work autosuspend; | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 509 | 	struct work_struct autoresume; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 510 | 	struct mutex pm_mutex; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 511 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 512 | 	unsigned long last_busy; | 
 | 513 | 	int autosuspend_delay; | 
 | 514 | 	unsigned long connect_time; | 
| Alan Stern | b5e795f | 2007-02-20 15:00:53 -0500 | [diff] [blame] | 515 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 516 | 	unsigned auto_pm:1; | 
 | 517 | 	unsigned do_remote_wakeup:1; | 
 | 518 | 	unsigned reset_resume:1; | 
 | 519 | 	unsigned autosuspend_disabled:1; | 
 | 520 | 	unsigned autoresume_disabled:1; | 
 | 521 | 	unsigned skip_sys_resume:1; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 522 | #endif | 
| Inaky Perez-Gonzalez | b1d8dfb | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 523 | 	struct wusb_dev *wusb_dev; | 
| Sarah Sharp | c651527 | 2009-04-27 19:57:26 -0700 | [diff] [blame] | 524 | 	int slot_id; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 525 | }; | 
 | 526 | #define	to_usb_device(d) container_of(d, struct usb_device, dev) | 
 | 527 |  | 
 | 528 | extern struct usb_device *usb_get_dev(struct usb_device *dev); | 
 | 529 | extern void usb_put_dev(struct usb_device *dev); | 
 | 530 |  | 
| Alan Stern | 9ad3d6c | 2005-11-17 17:10:32 -0500 | [diff] [blame] | 531 | /* USB device locking */ | 
 | 532 | #define usb_lock_device(udev)		down(&(udev)->dev.sem) | 
 | 533 | #define usb_unlock_device(udev)		up(&(udev)->dev.sem) | 
 | 534 | #define usb_trylock_device(udev)	down_trylock(&(udev)->dev.sem) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 535 | extern int usb_lock_device_for_reset(struct usb_device *udev, | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 536 | 				     const struct usb_interface *iface); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 537 |  | 
 | 538 | /* USB port reset for device reinitialization */ | 
 | 539 | extern int usb_reset_device(struct usb_device *dev); | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 540 | extern void usb_queue_reset_device(struct usb_interface *dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 541 |  | 
 | 542 | extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); | 
 | 543 |  | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 544 | /* USB autosuspend and autoresume */ | 
 | 545 | #ifdef CONFIG_USB_SUSPEND | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 546 | extern int usb_autopm_set_interface(struct usb_interface *intf); | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 547 | extern int usb_autopm_get_interface(struct usb_interface *intf); | 
 | 548 | extern void usb_autopm_put_interface(struct usb_interface *intf); | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 549 | extern int usb_autopm_get_interface_async(struct usb_interface *intf); | 
 | 550 | extern void usb_autopm_put_interface_async(struct usb_interface *intf); | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 551 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 552 | static inline void usb_autopm_enable(struct usb_interface *intf) | 
 | 553 | { | 
| Alan Stern | ccf5b80 | 2009-06-29 11:00:01 -0400 | [diff] [blame] | 554 | 	atomic_set(&intf->pm_usage_cnt, 0); | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 555 | 	usb_autopm_set_interface(intf); | 
 | 556 | } | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 557 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 558 | static inline void usb_autopm_disable(struct usb_interface *intf) | 
 | 559 | { | 
| Alan Stern | ccf5b80 | 2009-06-29 11:00:01 -0400 | [diff] [blame] | 560 | 	atomic_set(&intf->pm_usage_cnt, 1); | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 561 | 	usb_autopm_set_interface(intf); | 
 | 562 | } | 
 | 563 |  | 
| Alan Stern | 1941044 | 2007-03-27 13:33:59 -0400 | [diff] [blame] | 564 | static inline void usb_mark_last_busy(struct usb_device *udev) | 
 | 565 | { | 
 | 566 | 	udev->last_busy = jiffies; | 
 | 567 | } | 
 | 568 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 569 | #else | 
 | 570 |  | 
 | 571 | static inline int usb_autopm_set_interface(struct usb_interface *intf) | 
 | 572 | { return 0; } | 
 | 573 |  | 
 | 574 | static inline int usb_autopm_get_interface(struct usb_interface *intf) | 
 | 575 | { return 0; } | 
 | 576 |  | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 577 | static inline int usb_autopm_get_interface_async(struct usb_interface *intf) | 
 | 578 | { return 0; } | 
 | 579 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 580 | static inline void usb_autopm_put_interface(struct usb_interface *intf) | 
 | 581 | { } | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 582 | static inline void usb_autopm_put_interface_async(struct usb_interface *intf) | 
 | 583 | { } | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 584 | static inline void usb_autopm_enable(struct usb_interface *intf) | 
 | 585 | { } | 
 | 586 | static inline void usb_autopm_disable(struct usb_interface *intf) | 
 | 587 | { } | 
| Alan Stern | 1941044 | 2007-03-27 13:33:59 -0400 | [diff] [blame] | 588 | static inline void usb_mark_last_busy(struct usb_device *udev) | 
 | 589 | { } | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 590 | #endif | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 591 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 592 | /*-------------------------------------------------------------------------*/ | 
 | 593 |  | 
 | 594 | /* for drivers using iso endpoints */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 595 | extern int usb_get_current_frame_number(struct usb_device *usb_dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 596 |  | 
 | 597 | /* used these for multi-interface device registration */ | 
 | 598 | extern int usb_driver_claim_interface(struct usb_driver *driver, | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 599 | 			struct usb_interface *iface, void *priv); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 600 |  | 
 | 601 | /** | 
 | 602 |  * usb_interface_claimed - returns true iff an interface is claimed | 
 | 603 |  * @iface: the interface being checked | 
 | 604 |  * | 
 | 605 |  * Returns true (nonzero) iff the interface is claimed, else false (zero). | 
 | 606 |  * Callers must own the driver model's usb bus readlock.  So driver | 
 | 607 |  * probe() entries don't need extra locking, but other call contexts | 
 | 608 |  * may need to explicitly claim that lock. | 
 | 609 |  * | 
 | 610 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 611 | static inline int usb_interface_claimed(struct usb_interface *iface) | 
 | 612 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 613 | 	return (iface->dev.driver != NULL); | 
 | 614 | } | 
 | 615 |  | 
 | 616 | extern void usb_driver_release_interface(struct usb_driver *driver, | 
 | 617 | 			struct usb_interface *iface); | 
 | 618 | const struct usb_device_id *usb_match_id(struct usb_interface *interface, | 
 | 619 | 					 const struct usb_device_id *id); | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 620 | extern int usb_match_one_id(struct usb_interface *interface, | 
 | 621 | 			    const struct usb_device_id *id); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 622 |  | 
 | 623 | extern struct usb_interface *usb_find_interface(struct usb_driver *drv, | 
 | 624 | 		int minor); | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 625 | extern struct usb_interface *usb_ifnum_to_if(const struct usb_device *dev, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 626 | 		unsigned ifnum); | 
 | 627 | extern struct usb_host_interface *usb_altnum_to_altsetting( | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 628 | 		const struct usb_interface *intf, unsigned int altnum); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 629 |  | 
 | 630 |  | 
 | 631 | /** | 
 | 632 |  * usb_make_path - returns stable device path in the usb tree | 
 | 633 |  * @dev: the device whose path is being constructed | 
 | 634 |  * @buf: where to put the string | 
 | 635 |  * @size: how big is "buf"? | 
 | 636 |  * | 
 | 637 |  * Returns length of the string (> 0) or negative if size was too small. | 
 | 638 |  * | 
 | 639 |  * This identifier is intended to be "stable", reflecting physical paths in | 
 | 640 |  * hardware such as physical bus addresses for host controllers or ports on | 
 | 641 |  * USB hubs.  That makes it stay the same until systems are physically | 
 | 642 |  * reconfigured, by re-cabling a tree of USB devices or by moving USB host | 
 | 643 |  * controllers.  Adding and removing devices, including virtual root hubs | 
 | 644 |  * in host controller driver modules, does not change these path identifers; | 
 | 645 |  * neither does rebooting or re-enumerating.  These are more useful identifiers | 
 | 646 |  * than changeable ("unstable") ones like bus numbers or device addresses. | 
 | 647 |  * | 
 | 648 |  * With a partial exception for devices connected to USB 2.0 root hubs, these | 
 | 649 |  * identifiers are also predictable.  So long as the device tree isn't changed, | 
 | 650 |  * plugging any USB device into a given hub port always gives it the same path. | 
 | 651 |  * Because of the use of "companion" controllers, devices connected to ports on | 
 | 652 |  * USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are | 
 | 653 |  * high speed, and a different one if they are full or low speed. | 
 | 654 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 655 | static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 656 | { | 
 | 657 | 	int actual; | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 658 | 	actual = snprintf(buf, size, "usb-%s-%s", dev->bus->bus_name, | 
 | 659 | 			  dev->devpath); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 660 | 	return (actual >= (int)size) ? -1 : actual; | 
 | 661 | } | 
 | 662 |  | 
 | 663 | /*-------------------------------------------------------------------------*/ | 
 | 664 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 665 | #define USB_DEVICE_ID_MATCH_DEVICE \ | 
 | 666 | 		(USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT) | 
 | 667 | #define USB_DEVICE_ID_MATCH_DEV_RANGE \ | 
 | 668 | 		(USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI) | 
 | 669 | #define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ | 
 | 670 | 		(USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 671 | #define USB_DEVICE_ID_MATCH_DEV_INFO \ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 672 | 		(USB_DEVICE_ID_MATCH_DEV_CLASS | \ | 
 | 673 | 		USB_DEVICE_ID_MATCH_DEV_SUBCLASS | \ | 
 | 674 | 		USB_DEVICE_ID_MATCH_DEV_PROTOCOL) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 675 | #define USB_DEVICE_ID_MATCH_INT_INFO \ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 676 | 		(USB_DEVICE_ID_MATCH_INT_CLASS | \ | 
 | 677 | 		USB_DEVICE_ID_MATCH_INT_SUBCLASS | \ | 
 | 678 | 		USB_DEVICE_ID_MATCH_INT_PROTOCOL) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 679 |  | 
 | 680 | /** | 
 | 681 |  * USB_DEVICE - macro used to describe a specific usb device | 
 | 682 |  * @vend: the 16 bit USB Vendor ID | 
 | 683 |  * @prod: the 16 bit USB Product ID | 
 | 684 |  * | 
 | 685 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 686 |  * specific device. | 
 | 687 |  */ | 
 | 688 | #define USB_DEVICE(vend,prod) \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 689 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE, \ | 
 | 690 | 	.idVendor = (vend), \ | 
 | 691 | 	.idProduct = (prod) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 692 | /** | 
| Randy Dunlap | d0bcabc | 2008-02-29 22:03:07 -0800 | [diff] [blame] | 693 |  * USB_DEVICE_VER - describe a specific usb device with a version range | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 694 |  * @vend: the 16 bit USB Vendor ID | 
 | 695 |  * @prod: the 16 bit USB Product ID | 
 | 696 |  * @lo: the bcdDevice_lo value | 
 | 697 |  * @hi: the bcdDevice_hi value | 
 | 698 |  * | 
 | 699 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 700 |  * specific device, with a version range. | 
 | 701 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 702 | #define USB_DEVICE_VER(vend, prod, lo, hi) \ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 703 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 704 | 	.idVendor = (vend), \ | 
 | 705 | 	.idProduct = (prod), \ | 
 | 706 | 	.bcdDevice_lo = (lo), \ | 
 | 707 | 	.bcdDevice_hi = (hi) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 708 |  | 
 | 709 | /** | 
| Randy Dunlap | d0bcabc | 2008-02-29 22:03:07 -0800 | [diff] [blame] | 710 |  * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol | 
| Jan Kratochvil | f836ac8 | 2007-05-09 00:26:15 -0400 | [diff] [blame] | 711 |  * @vend: the 16 bit USB Vendor ID | 
 | 712 |  * @prod: the 16 bit USB Product ID | 
 | 713 |  * @pr: bInterfaceProtocol value | 
 | 714 |  * | 
 | 715 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 716 |  * specific interface protocol of devices. | 
 | 717 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 718 | #define USB_DEVICE_INTERFACE_PROTOCOL(vend, prod, pr) \ | 
 | 719 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | 
 | 720 | 		       USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ | 
| Jan Kratochvil | f836ac8 | 2007-05-09 00:26:15 -0400 | [diff] [blame] | 721 | 	.idVendor = (vend), \ | 
 | 722 | 	.idProduct = (prod), \ | 
 | 723 | 	.bInterfaceProtocol = (pr) | 
 | 724 |  | 
 | 725 | /** | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 726 |  * USB_DEVICE_INFO - macro used to describe a class of usb devices | 
 | 727 |  * @cl: bDeviceClass value | 
 | 728 |  * @sc: bDeviceSubClass value | 
 | 729 |  * @pr: bDeviceProtocol value | 
 | 730 |  * | 
 | 731 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 732 |  * specific class of devices. | 
 | 733 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 734 | #define USB_DEVICE_INFO(cl, sc, pr) \ | 
 | 735 | 	.match_flags = USB_DEVICE_ID_MATCH_DEV_INFO, \ | 
 | 736 | 	.bDeviceClass = (cl), \ | 
 | 737 | 	.bDeviceSubClass = (sc), \ | 
 | 738 | 	.bDeviceProtocol = (pr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 739 |  | 
 | 740 | /** | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 741 |  * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 742 |  * @cl: bInterfaceClass value | 
 | 743 |  * @sc: bInterfaceSubClass value | 
 | 744 |  * @pr: bInterfaceProtocol value | 
 | 745 |  * | 
 | 746 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 747 |  * specific class of interfaces. | 
 | 748 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 749 | #define USB_INTERFACE_INFO(cl, sc, pr) \ | 
 | 750 | 	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, \ | 
 | 751 | 	.bInterfaceClass = (cl), \ | 
 | 752 | 	.bInterfaceSubClass = (sc), \ | 
 | 753 | 	.bInterfaceProtocol = (pr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 754 |  | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 755 | /** | 
| Randy Dunlap | d0bcabc | 2008-02-29 22:03:07 -0800 | [diff] [blame] | 756 |  * USB_DEVICE_AND_INTERFACE_INFO - describe a specific usb device with a class of usb interfaces | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 757 |  * @vend: the 16 bit USB Vendor ID | 
 | 758 |  * @prod: the 16 bit USB Product ID | 
 | 759 |  * @cl: bInterfaceClass value | 
 | 760 |  * @sc: bInterfaceSubClass value | 
 | 761 |  * @pr: bInterfaceProtocol value | 
 | 762 |  * | 
 | 763 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 764 |  * specific device with a specific class of interfaces. | 
 | 765 |  * | 
 | 766 |  * This is especially useful when explicitly matching devices that have | 
 | 767 |  * vendor specific bDeviceClass values, but standards-compliant interfaces. | 
 | 768 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 769 | #define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, cl, sc, pr) \ | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 770 | 	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ | 
 | 771 | 		| USB_DEVICE_ID_MATCH_DEVICE, \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 772 | 	.idVendor = (vend), \ | 
 | 773 | 	.idProduct = (prod), \ | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 774 | 	.bInterfaceClass = (cl), \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 775 | 	.bInterfaceSubClass = (sc), \ | 
 | 776 | 	.bInterfaceProtocol = (pr) | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 777 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 778 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 779 |  | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 780 | /* Stuff for dynamic usb ids */ | 
| Greg Kroah-Hartman | 733260f | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 781 | struct usb_dynids { | 
 | 782 | 	spinlock_t lock; | 
 | 783 | 	struct list_head list; | 
 | 784 | }; | 
 | 785 |  | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 786 | struct usb_dynid { | 
 | 787 | 	struct list_head node; | 
 | 788 | 	struct usb_device_id id; | 
 | 789 | }; | 
 | 790 |  | 
 | 791 | extern ssize_t usb_store_new_id(struct usb_dynids *dynids, | 
 | 792 | 				struct device_driver *driver, | 
 | 793 | 				const char *buf, size_t count); | 
 | 794 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 795 | /** | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 796 |  * struct usbdrv_wrap - wrapper for driver-model structure | 
 | 797 |  * @driver: The driver-model core driver structure. | 
 | 798 |  * @for_devices: Non-zero for device drivers, 0 for interface drivers. | 
 | 799 |  */ | 
 | 800 | struct usbdrv_wrap { | 
 | 801 | 	struct device_driver driver; | 
 | 802 | 	int for_devices; | 
 | 803 | }; | 
 | 804 |  | 
 | 805 | /** | 
 | 806 |  * struct usb_driver - identifies USB interface driver to usbcore | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 807 |  * @name: The driver name should be unique among USB drivers, | 
 | 808 |  *	and should normally be the same as the module name. | 
 | 809 |  * @probe: Called to see if the driver is willing to manage a particular | 
 | 810 |  *	interface on a device.  If it is, probe returns zero and uses | 
| Oliver Neukum | 7ef4f06 | 2008-04-10 15:15:37 +0200 | [diff] [blame] | 811 |  *	usb_set_intfdata() to associate driver-specific data with the | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 812 |  *	interface.  It may also use usb_set_interface() to specify the | 
 | 813 |  *	appropriate altsetting.  If unwilling to manage the interface, | 
| Oliver Neukum | 7ef4f06 | 2008-04-10 15:15:37 +0200 | [diff] [blame] | 814 |  *	return -ENODEV, if genuine IO errors occured, an appropriate | 
 | 815 |  *	negative errno value. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 816 |  * @disconnect: Called when the interface is no longer accessible, usually | 
 | 817 |  *	because its device has been (or is being) disconnected or the | 
 | 818 |  *	driver module is being unloaded. | 
 | 819 |  * @ioctl: Used for drivers that want to talk to userspace through | 
 | 820 |  *	the "usbfs" filesystem.  This lets devices provide ways to | 
 | 821 |  *	expose information to user space regardless of where they | 
 | 822 |  *	do (or don't) show up otherwise in the filesystem. | 
 | 823 |  * @suspend: Called when the device is going to be suspended by the system. | 
 | 824 |  * @resume: Called when the device is being resumed by the system. | 
| Alan Stern | f07600c | 2007-05-30 15:38:16 -0400 | [diff] [blame] | 825 |  * @reset_resume: Called when the suspended device has been reset instead | 
 | 826 |  *	of being resumed. | 
| Ming Lei | 742120c | 2008-06-18 22:00:29 +0800 | [diff] [blame] | 827 |  * @pre_reset: Called by usb_reset_device() when the device | 
| Alan Stern | 79efa09 | 2006-06-01 13:33:42 -0400 | [diff] [blame] | 828 |  *	is about to be reset. | 
| Ming Lei | 742120c | 2008-06-18 22:00:29 +0800 | [diff] [blame] | 829 |  * @post_reset: Called by usb_reset_device() after the device | 
| Oliver Neukum | 7ef4f06 | 2008-04-10 15:15:37 +0200 | [diff] [blame] | 830 |  *	has been reset | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 831 |  * @id_table: USB drivers use ID table to support hotplugging. | 
 | 832 |  *	Export this with MODULE_DEVICE_TABLE(usb,...).  This must be set | 
 | 833 |  *	or your driver's probe function will never get called. | 
| Greg Kroah-Hartman | 733260f | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 834 |  * @dynids: used internally to hold the list of dynamically added device | 
 | 835 |  *	ids for this driver. | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 836 |  * @drvwrap: Driver-model core structure wrapper. | 
| Greg Kroah-Hartman | ba9dc65 | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 837 |  * @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be | 
 | 838 |  *	added to this driver by preventing the sysfs file from being created. | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 839 |  * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend | 
 | 840 |  *	for interfaces bound to this driver. | 
| Alan Stern | 9da82bd | 2008-05-08 11:54:37 -0400 | [diff] [blame] | 841 |  * @soft_unbind: if set to 1, the USB core will not kill URBs and disable | 
 | 842 |  *	endpoints before calling the driver's disconnect method. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 843 |  * | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 844 |  * USB interface drivers must provide a name, probe() and disconnect() | 
 | 845 |  * methods, and an id_table.  Other driver fields are optional. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 846 |  * | 
 | 847 |  * The id_table is used in hotplugging.  It holds a set of descriptors, | 
 | 848 |  * and specialized data may be associated with each entry.  That table | 
 | 849 |  * is used by both user and kernel mode hotplugging support. | 
 | 850 |  * | 
 | 851 |  * The probe() and disconnect() methods are called in a context where | 
 | 852 |  * they can sleep, but they should avoid abusing the privilege.  Most | 
 | 853 |  * work to connect to a device should be done when the device is opened, | 
 | 854 |  * and undone at the last close.  The disconnect code needs to address | 
 | 855 |  * concurrency issues with respect to open() and close() methods, as | 
 | 856 |  * well as forcing all pending I/O requests to complete (by unlinking | 
 | 857 |  * them as necessary, and blocking until the unlinks complete). | 
 | 858 |  */ | 
 | 859 | struct usb_driver { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 860 | 	const char *name; | 
 | 861 |  | 
 | 862 | 	int (*probe) (struct usb_interface *intf, | 
 | 863 | 		      const struct usb_device_id *id); | 
 | 864 |  | 
 | 865 | 	void (*disconnect) (struct usb_interface *intf); | 
 | 866 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 867 | 	int (*ioctl) (struct usb_interface *intf, unsigned int code, | 
 | 868 | 			void *buf); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 869 |  | 
| David Brownell | 27d72e8 | 2005-04-18 17:39:22 -0700 | [diff] [blame] | 870 | 	int (*suspend) (struct usb_interface *intf, pm_message_t message); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 871 | 	int (*resume) (struct usb_interface *intf); | 
| Alan Stern | f07600c | 2007-05-30 15:38:16 -0400 | [diff] [blame] | 872 | 	int (*reset_resume)(struct usb_interface *intf); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 873 |  | 
| Alan Stern | f07600c | 2007-05-30 15:38:16 -0400 | [diff] [blame] | 874 | 	int (*pre_reset)(struct usb_interface *intf); | 
 | 875 | 	int (*post_reset)(struct usb_interface *intf); | 
| Alan Stern | 79efa09 | 2006-06-01 13:33:42 -0400 | [diff] [blame] | 876 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 877 | 	const struct usb_device_id *id_table; | 
 | 878 |  | 
| Greg Kroah-Hartman | 733260f | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 879 | 	struct usb_dynids dynids; | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 880 | 	struct usbdrv_wrap drvwrap; | 
| Greg Kroah-Hartman | ba9dc65 | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 881 | 	unsigned int no_dynamic_id:1; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 882 | 	unsigned int supports_autosuspend:1; | 
| Alan Stern | 9da82bd | 2008-05-08 11:54:37 -0400 | [diff] [blame] | 883 | 	unsigned int soft_unbind:1; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 884 | }; | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 885 | #define	to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver) | 
 | 886 |  | 
 | 887 | /** | 
 | 888 |  * struct usb_device_driver - identifies USB device driver to usbcore | 
 | 889 |  * @name: The driver name should be unique among USB drivers, | 
 | 890 |  *	and should normally be the same as the module name. | 
 | 891 |  * @probe: Called to see if the driver is willing to manage a particular | 
 | 892 |  *	device.  If it is, probe returns zero and uses dev_set_drvdata() | 
 | 893 |  *	to associate driver-specific data with the device.  If unwilling | 
 | 894 |  *	to manage the device, return a negative errno value. | 
 | 895 |  * @disconnect: Called when the device is no longer accessible, usually | 
 | 896 |  *	because it has been (or is being) disconnected or the driver's | 
 | 897 |  *	module is being unloaded. | 
 | 898 |  * @suspend: Called when the device is going to be suspended by the system. | 
 | 899 |  * @resume: Called when the device is being resumed by the system. | 
 | 900 |  * @drvwrap: Driver-model core structure wrapper. | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 901 |  * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend | 
 | 902 |  *	for devices bound to this driver. | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 903 |  * | 
 | 904 |  * USB drivers must provide all the fields listed above except drvwrap. | 
 | 905 |  */ | 
 | 906 | struct usb_device_driver { | 
 | 907 | 	const char *name; | 
 | 908 |  | 
 | 909 | 	int (*probe) (struct usb_device *udev); | 
 | 910 | 	void (*disconnect) (struct usb_device *udev); | 
 | 911 |  | 
 | 912 | 	int (*suspend) (struct usb_device *udev, pm_message_t message); | 
| Alan Stern | 65bfd29 | 2008-11-25 16:39:18 -0500 | [diff] [blame] | 913 | 	int (*resume) (struct usb_device *udev, pm_message_t message); | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 914 | 	struct usbdrv_wrap drvwrap; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 915 | 	unsigned int supports_autosuspend:1; | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 916 | }; | 
 | 917 | #define	to_usb_device_driver(d) container_of(d, struct usb_device_driver, \ | 
 | 918 | 		drvwrap.driver) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 919 |  | 
 | 920 | extern struct bus_type usb_bus_type; | 
 | 921 |  | 
 | 922 | /** | 
 | 923 |  * struct usb_class_driver - identifies a USB driver that wants to use the USB major number | 
| Greg Kroah-Hartman | d6e5bcf | 2005-06-20 21:15:16 -0700 | [diff] [blame] | 924 |  * @name: the usb class device name for this driver.  Will show up in sysfs. | 
| Kay Sievers | e454cea | 2009-09-18 23:01:12 +0200 | [diff] [blame] | 925 |  * @devnode: Callback to provide a naming hint for a possible | 
| Randy Dunlap | e376bbb | 2009-06-18 10:39:11 -0700 | [diff] [blame] | 926 |  *	device node to create. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 927 |  * @fops: pointer to the struct file_operations of this driver. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 928 |  * @minor_base: the start of the minor range for this driver. | 
 | 929 |  * | 
 | 930 |  * This structure is used for the usb_register_dev() and | 
 | 931 |  * usb_unregister_dev() functions, to consolidate a number of the | 
 | 932 |  * parameters used for them. | 
 | 933 |  */ | 
 | 934 | struct usb_class_driver { | 
 | 935 | 	char *name; | 
| Kay Sievers | e454cea | 2009-09-18 23:01:12 +0200 | [diff] [blame] | 936 | 	char *(*devnode)(struct device *dev, mode_t *mode); | 
| Arjan van de Ven | 99ac48f | 2006-03-28 01:56:41 -0800 | [diff] [blame] | 937 | 	const struct file_operations *fops; | 
| Greg Kroah-Hartman | d6e5bcf | 2005-06-20 21:15:16 -0700 | [diff] [blame] | 938 | 	int minor_base; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 939 | }; | 
 | 940 |  | 
 | 941 | /* | 
 | 942 |  * use these in module_init()/module_exit() | 
 | 943 |  * and don't forget MODULE_DEVICE_TABLE(usb, ...) | 
 | 944 |  */ | 
| Greg Kroah-Hartman | 80f745f | 2007-01-15 11:50:02 -0800 | [diff] [blame] | 945 | extern int usb_register_driver(struct usb_driver *, struct module *, | 
 | 946 | 			       const char *); | 
| Greg Kroah-Hartman | 2143acc | 2005-11-21 14:53:03 -0800 | [diff] [blame] | 947 | static inline int usb_register(struct usb_driver *driver) | 
 | 948 | { | 
| Greg Kroah-Hartman | 80f745f | 2007-01-15 11:50:02 -0800 | [diff] [blame] | 949 | 	return usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME); | 
| Greg Kroah-Hartman | 2143acc | 2005-11-21 14:53:03 -0800 | [diff] [blame] | 950 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 951 | extern void usb_deregister(struct usb_driver *); | 
 | 952 |  | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 953 | extern int usb_register_device_driver(struct usb_device_driver *, | 
 | 954 | 			struct module *); | 
 | 955 | extern void usb_deregister_device_driver(struct usb_device_driver *); | 
 | 956 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 957 | extern int usb_register_dev(struct usb_interface *intf, | 
 | 958 | 			    struct usb_class_driver *class_driver); | 
 | 959 | extern void usb_deregister_dev(struct usb_interface *intf, | 
 | 960 | 			       struct usb_class_driver *class_driver); | 
 | 961 |  | 
 | 962 | extern int usb_disabled(void); | 
 | 963 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 964 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 965 |  | 
 | 966 | /* | 
 | 967 |  * URB support, for asynchronous request completions | 
 | 968 |  */ | 
 | 969 |  | 
 | 970 | /* | 
 | 971 |  * urb->transfer_flags: | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 972 |  * | 
 | 973 |  * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb(). | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 974 |  */ | 
 | 975 | #define URB_SHORT_NOT_OK	0x0001	/* report short reads as errors */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 976 | #define URB_ISO_ASAP		0x0002	/* iso-only, urb->start_frame | 
 | 977 | 					 * ignored */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 978 | #define URB_NO_TRANSFER_DMA_MAP	0x0004	/* urb->transfer_dma valid on submit */ | 
 | 979 | #define URB_NO_SETUP_DMA_MAP	0x0008	/* urb->setup_dma valid on submit */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 980 | #define URB_NO_FSBR		0x0020	/* UHCI-specific */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 981 | #define URB_ZERO_PACKET		0x0040	/* Finish bulk OUT with short packet */ | 
 | 982 | #define URB_NO_INTERRUPT	0x0080	/* HINT: no non-error interrupt | 
 | 983 | 					 * needed */ | 
| Marcel Holtmann | 8b3b01c | 2007-06-13 08:02:11 +0200 | [diff] [blame] | 984 | #define URB_FREE_BUFFER		0x0100	/* Free transfer buffer with the URB */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 985 |  | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 986 | #define URB_DIR_IN		0x0200	/* Transfer from device to host */ | 
 | 987 | #define URB_DIR_OUT		0 | 
 | 988 | #define URB_DIR_MASK		URB_DIR_IN | 
 | 989 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 990 | struct usb_iso_packet_descriptor { | 
 | 991 | 	unsigned int offset; | 
 | 992 | 	unsigned int length;		/* expected length */ | 
 | 993 | 	unsigned int actual_length; | 
| Pete Zaitcev | d1bbb60 | 2007-02-11 13:56:13 -0800 | [diff] [blame] | 994 | 	int status; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 995 | }; | 
 | 996 |  | 
 | 997 | struct urb; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 998 |  | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 999 | struct usb_anchor { | 
 | 1000 | 	struct list_head urb_list; | 
 | 1001 | 	wait_queue_head_t wait; | 
 | 1002 | 	spinlock_t lock; | 
| Oliver Neukum | 6a2839b | 2008-07-29 16:18:47 +0200 | [diff] [blame] | 1003 | 	unsigned int poisoned:1; | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1004 | }; | 
 | 1005 |  | 
 | 1006 | static inline void init_usb_anchor(struct usb_anchor *anchor) | 
 | 1007 | { | 
 | 1008 | 	INIT_LIST_HEAD(&anchor->urb_list); | 
 | 1009 | 	init_waitqueue_head(&anchor->wait); | 
 | 1010 | 	spin_lock_init(&anchor->lock); | 
 | 1011 | } | 
 | 1012 |  | 
| David Howells | 7d12e78 | 2006-10-05 14:55:46 +0100 | [diff] [blame] | 1013 | typedef void (*usb_complete_t)(struct urb *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1014 |  | 
 | 1015 | /** | 
 | 1016 |  * struct urb - USB Request Block | 
 | 1017 |  * @urb_list: For use by current owner of the URB. | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1018 |  * @anchor_list: membership in the list of an anchor | 
 | 1019 |  * @anchor: to anchor URBs to a common mooring | 
| Alan Stern | 5b653c7 | 2007-07-30 17:04:37 -0400 | [diff] [blame] | 1020 |  * @ep: Points to the endpoint's data structure.  Will eventually | 
 | 1021 |  *	replace @pipe. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1022 |  * @pipe: Holds endpoint number, direction, type, and more. | 
 | 1023 |  *	Create these values with the eight macros available; | 
 | 1024 |  *	usb_{snd,rcv}TYPEpipe(dev,endpoint), where the TYPE is "ctrl" | 
 | 1025 |  *	(control), "bulk", "int" (interrupt), or "iso" (isochronous). | 
 | 1026 |  *	For example usb_sndbulkpipe() or usb_rcvintpipe().  Endpoint | 
 | 1027 |  *	numbers range from zero to fifteen.  Note that "in" endpoint two | 
 | 1028 |  *	is a different endpoint (and pipe) from "out" endpoint two. | 
 | 1029 |  *	The current configuration controls the existence, type, and | 
 | 1030 |  *	maximum packet size of any given endpoint. | 
 | 1031 |  * @dev: Identifies the USB device to perform the request. | 
 | 1032 |  * @status: This is read in non-iso completion functions to get the | 
 | 1033 |  *	status of the particular request.  ISO requests only use it | 
 | 1034 |  *	to tell whether the URB was unlinked; detailed status for | 
 | 1035 |  *	each frame is in the fields of the iso_frame-desc. | 
 | 1036 |  * @transfer_flags: A variety of flags may be used to affect how URB | 
 | 1037 |  *	submission, unlinking, or operation are handled.  Different | 
 | 1038 |  *	kinds of URB can use different flags. | 
| Pete Zaitcev | 4e9e920 | 2009-06-11 08:53:20 -0600 | [diff] [blame] | 1039 |  * @transfer_buffer:  This identifies the buffer to (or from) which the I/O | 
 | 1040 |  *	request will be performed unless URB_NO_TRANSFER_DMA_MAP is set | 
 | 1041 |  *	(however, do not leave garbage in transfer_buffer even then). | 
 | 1042 |  *	This buffer must be suitable for DMA; allocate it with | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1043 |  *	kmalloc() or equivalent.  For transfers to "in" endpoints, contents | 
 | 1044 |  *	of this buffer will be modified.  This buffer is used for the data | 
 | 1045 |  *	stage of control transfers. | 
 | 1046 |  * @transfer_dma: When transfer_flags includes URB_NO_TRANSFER_DMA_MAP, | 
 | 1047 |  *	the device driver is saying that it provided this DMA address, | 
 | 1048 |  *	which the host controller driver should use in preference to the | 
 | 1049 |  *	transfer_buffer. | 
| Randy Dunlap | e376bbb | 2009-06-18 10:39:11 -0700 | [diff] [blame] | 1050 |  * @sg: scatter gather buffer list | 
 | 1051 |  * @num_sgs: number of entries in the sg list | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1052 |  * @transfer_buffer_length: How big is transfer_buffer.  The transfer may | 
 | 1053 |  *	be broken up into chunks according to the current maximum packet | 
 | 1054 |  *	size for the endpoint, which is a function of the configuration | 
 | 1055 |  *	and is encoded in the pipe.  When the length is zero, neither | 
 | 1056 |  *	transfer_buffer nor transfer_dma is used. | 
 | 1057 |  * @actual_length: This is read in non-iso completion functions, and | 
 | 1058 |  *	it tells how many bytes (out of transfer_buffer_length) were | 
 | 1059 |  *	transferred.  It will normally be the same as requested, unless | 
 | 1060 |  *	either an error was reported or a short read was performed. | 
 | 1061 |  *	The URB_SHORT_NOT_OK transfer flag may be used to make such | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1062 |  *	short reads be reported as errors. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1063 |  * @setup_packet: Only used for control transfers, this points to eight bytes | 
 | 1064 |  *	of setup data.  Control transfers always start by sending this data | 
 | 1065 |  *	to the device.  Then transfer_buffer is read or written, if needed. | 
 | 1066 |  * @setup_dma: For control transfers with URB_NO_SETUP_DMA_MAP set, the | 
 | 1067 |  *	device driver has provided this DMA address for the setup packet. | 
 | 1068 |  *	The host controller driver should use this in preference to | 
| Sarah Sharp | 6d65b78 | 2009-04-27 19:57:50 -0700 | [diff] [blame] | 1069 |  *	setup_packet, but the HCD may chose to ignore the address if it must | 
 | 1070 |  *	copy the setup packet into internal structures.  Therefore, setup_packet | 
 | 1071 |  *	must always point to a valid buffer. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1072 |  * @start_frame: Returns the initial frame for isochronous transfers. | 
 | 1073 |  * @number_of_packets: Lists the number of ISO transfer buffers. | 
 | 1074 |  * @interval: Specifies the polling interval for interrupt or isochronous | 
| Anand Gadiyar | 411c940 | 2009-07-07 15:24:23 +0530 | [diff] [blame] | 1075 |  *	transfers.  The units are frames (milliseconds) for full and low | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1076 |  *	speed devices, and microframes (1/8 millisecond) for highspeed ones. | 
 | 1077 |  * @error_count: Returns the number of ISO transfers that reported errors. | 
 | 1078 |  * @context: For use in completion functions.  This normally points to | 
 | 1079 |  *	request-specific driver context. | 
 | 1080 |  * @complete: Completion handler. This URB is passed as the parameter to the | 
 | 1081 |  *	completion function.  The completion function may then do what | 
 | 1082 |  *	it likes with the URB, including resubmitting or freeing it. | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1083 |  * @iso_frame_desc: Used to provide arrays of ISO transfer buffers and to | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1084 |  *	collect the transfer status for each buffer. | 
 | 1085 |  * | 
 | 1086 |  * This structure identifies USB transfer requests.  URBs must be allocated by | 
 | 1087 |  * calling usb_alloc_urb() and freed with a call to usb_free_urb(). | 
 | 1088 |  * Initialization may be done using various usb_fill_*_urb() functions.  URBs | 
 | 1089 |  * are submitted using usb_submit_urb(), and pending requests may be canceled | 
 | 1090 |  * using usb_unlink_urb() or usb_kill_urb(). | 
 | 1091 |  * | 
 | 1092 |  * Data Transfer Buffers: | 
 | 1093 |  * | 
 | 1094 |  * Normally drivers provide I/O buffers allocated with kmalloc() or otherwise | 
 | 1095 |  * taken from the general page pool.  That is provided by transfer_buffer | 
 | 1096 |  * (control requests also use setup_packet), and host controller drivers | 
 | 1097 |  * perform a dma mapping (and unmapping) for each buffer transferred.  Those | 
 | 1098 |  * mapping operations can be expensive on some platforms (perhaps using a dma | 
 | 1099 |  * bounce buffer or talking to an IOMMU), | 
 | 1100 |  * although they're cheap on commodity x86 and ppc hardware. | 
 | 1101 |  * | 
 | 1102 |  * Alternatively, drivers may pass the URB_NO_xxx_DMA_MAP transfer flags, | 
 | 1103 |  * which tell the host controller driver that no such mapping is needed since | 
 | 1104 |  * the device driver is DMA-aware.  For example, a device driver might | 
 | 1105 |  * allocate a DMA buffer with usb_buffer_alloc() or call usb_buffer_map(). | 
 | 1106 |  * When these transfer flags are provided, host controller drivers will | 
 | 1107 |  * attempt to use the dma addresses found in the transfer_dma and/or | 
| Pete Zaitcev | 4e9e920 | 2009-06-11 08:53:20 -0600 | [diff] [blame] | 1108 |  * setup_dma fields rather than determining a dma address themselves. | 
 | 1109 |  * | 
 | 1110 |  * Note that transfer_buffer must still be set if the controller | 
 | 1111 |  * does not support DMA (as indicated by bus.uses_dma) and when talking | 
 | 1112 |  * to root hub. If you have to trasfer between highmem zone and the device | 
 | 1113 |  * on such controller, create a bounce buffer or bail out with an error. | 
 | 1114 |  * If transfer_buffer cannot be set (is in highmem) and the controller is DMA | 
 | 1115 |  * capable, assign NULL to it, so that usbmon knows not to use the value. | 
 | 1116 |  * The setup_packet must always be set, so it cannot be located in highmem. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1117 |  * | 
 | 1118 |  * Initialization: | 
 | 1119 |  * | 
 | 1120 |  * All URBs submitted must initialize the dev, pipe, transfer_flags (may be | 
| Alan Stern | b375a04 | 2005-07-29 16:11:07 -0400 | [diff] [blame] | 1121 |  * zero), and complete fields.  All URBs must also initialize | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1122 |  * transfer_buffer and transfer_buffer_length.  They may provide the | 
 | 1123 |  * URB_SHORT_NOT_OK transfer flag, indicating that short reads are | 
 | 1124 |  * to be treated as errors; that flag is invalid for write requests. | 
 | 1125 |  * | 
 | 1126 |  * Bulk URBs may | 
 | 1127 |  * use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers | 
 | 1128 |  * should always terminate with a short packet, even if it means adding an | 
 | 1129 |  * extra zero length packet. | 
 | 1130 |  * | 
 | 1131 |  * Control URBs must provide a setup_packet.  The setup_packet and | 
 | 1132 |  * transfer_buffer may each be mapped for DMA or not, independently of | 
 | 1133 |  * the other.  The transfer_flags bits URB_NO_TRANSFER_DMA_MAP and | 
 | 1134 |  * URB_NO_SETUP_DMA_MAP indicate which buffers have already been mapped. | 
 | 1135 |  * URB_NO_SETUP_DMA_MAP is ignored for non-control URBs. | 
 | 1136 |  * | 
 | 1137 |  * Interrupt URBs must provide an interval, saying how often (in milliseconds | 
 | 1138 |  * or, for highspeed devices, 125 microsecond units) | 
 | 1139 |  * to poll for transfers.  After the URB has been submitted, the interval | 
 | 1140 |  * field reflects how the transfer was actually scheduled. | 
 | 1141 |  * The polling interval may be more frequent than requested. | 
 | 1142 |  * For example, some controllers have a maximum interval of 32 milliseconds, | 
 | 1143 |  * while others support intervals of up to 1024 milliseconds. | 
 | 1144 |  * Isochronous URBs also have transfer intervals.  (Note that for isochronous | 
 | 1145 |  * endpoints, as well as high speed interrupt endpoints, the encoding of | 
 | 1146 |  * the transfer interval in the endpoint descriptor is logarithmic. | 
 | 1147 |  * Device drivers must convert that value to linear units themselves.) | 
 | 1148 |  * | 
 | 1149 |  * Isochronous URBs normally use the URB_ISO_ASAP transfer flag, telling | 
 | 1150 |  * the host controller to schedule the transfer as soon as bandwidth | 
 | 1151 |  * utilization allows, and then set start_frame to reflect the actual frame | 
 | 1152 |  * selected during submission.  Otherwise drivers must specify the start_frame | 
 | 1153 |  * and handle the case where the transfer can't begin then.  However, drivers | 
 | 1154 |  * won't know how bandwidth is currently allocated, and while they can | 
 | 1155 |  * find the current frame using usb_get_current_frame_number () they can't | 
 | 1156 |  * know the range for that frame number.  (Ranges for frame counter values | 
 | 1157 |  * are HC-specific, and can go from 256 to 65536 frames from "now".) | 
 | 1158 |  * | 
 | 1159 |  * Isochronous URBs have a different data transfer model, in part because | 
 | 1160 |  * the quality of service is only "best effort".  Callers provide specially | 
 | 1161 |  * allocated URBs, with number_of_packets worth of iso_frame_desc structures | 
 | 1162 |  * at the end.  Each such packet is an individual ISO transfer.  Isochronous | 
 | 1163 |  * URBs are normally queued, submitted by drivers to arrange that | 
 | 1164 |  * transfers are at least double buffered, and then explicitly resubmitted | 
 | 1165 |  * in completion handlers, so | 
 | 1166 |  * that data (such as audio or video) streams at as constant a rate as the | 
 | 1167 |  * host controller scheduler can support. | 
 | 1168 |  * | 
 | 1169 |  * Completion Callbacks: | 
 | 1170 |  * | 
 | 1171 |  * The completion callback is made in_interrupt(), and one of the first | 
 | 1172 |  * things that a completion handler should do is check the status field. | 
 | 1173 |  * The status field is provided for all URBs.  It is used to report | 
 | 1174 |  * unlinked URBs, and status for all non-ISO transfers.  It should not | 
 | 1175 |  * be examined before the URB is returned to the completion handler. | 
 | 1176 |  * | 
 | 1177 |  * The context field is normally used to link URBs back to the relevant | 
 | 1178 |  * driver or request state. | 
 | 1179 |  * | 
 | 1180 |  * When the completion callback is invoked for non-isochronous URBs, the | 
 | 1181 |  * actual_length field tells how many bytes were transferred.  This field | 
 | 1182 |  * is updated even when the URB terminated with an error or was unlinked. | 
 | 1183 |  * | 
 | 1184 |  * ISO transfer status is reported in the status and actual_length fields | 
 | 1185 |  * of the iso_frame_desc array, and the number of errors is reported in | 
 | 1186 |  * error_count.  Completion callbacks for ISO transfers will normally | 
 | 1187 |  * (re)submit URBs to ensure a constant transfer rate. | 
| Roman Kagan | 719df46 | 2005-05-06 00:55:56 +0400 | [diff] [blame] | 1188 |  * | 
 | 1189 |  * Note that even fields marked "public" should not be touched by the driver | 
 | 1190 |  * when the urb is owned by the hcd, that is, since the call to | 
 | 1191 |  * usb_submit_urb() till the entry into the completion routine. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1192 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1193 | struct urb { | 
| Martin Waitz | aeec46b | 2005-11-13 16:08:13 -0800 | [diff] [blame] | 1194 | 	/* private: usb core and host controller only fields in the urb */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1195 | 	struct kref kref;		/* reference count of the URB */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1196 | 	void *hcpriv;			/* private data for host controller */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1197 | 	atomic_t use_count;		/* concurrent submissions counter */ | 
| Ming Lei | 49367d8 | 2008-12-12 21:38:45 +0800 | [diff] [blame] | 1198 | 	atomic_t reject;		/* submissions will fail */ | 
| Alan Stern | eb23105 | 2007-08-21 15:40:36 -0400 | [diff] [blame] | 1199 | 	int unlinked;			/* unlink error code */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1200 |  | 
| Martin Waitz | aeec46b | 2005-11-13 16:08:13 -0800 | [diff] [blame] | 1201 | 	/* public: documented fields in the urb that can be used by drivers */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1202 | 	struct list_head urb_list;	/* list head for use by the urb's | 
 | 1203 | 					 * current owner */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1204 | 	struct list_head anchor_list;	/* the URB may be anchored */ | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1205 | 	struct usb_anchor *anchor; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1206 | 	struct usb_device *dev; 	/* (in) pointer to associated device */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1207 | 	struct usb_host_endpoint *ep;	/* (internal) pointer to endpoint */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1208 | 	unsigned int pipe;		/* (in) pipe information */ | 
 | 1209 | 	int status;			/* (return) non-ISO status */ | 
 | 1210 | 	unsigned int transfer_flags;	/* (in) URB_SHORT_NOT_OK | ...*/ | 
 | 1211 | 	void *transfer_buffer;		/* (in) associated data buffer */ | 
 | 1212 | 	dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */ | 
| Sarah Sharp | e04748e | 2009-04-27 19:59:01 -0700 | [diff] [blame] | 1213 | 	struct usb_sg_request *sg;	/* (in) scatter gather buffer list */ | 
 | 1214 | 	int num_sgs;			/* (in) number of entries in the sg list */ | 
| Greg Kroah-Hartman | 16e2e5f | 2009-03-03 16:44:13 -0800 | [diff] [blame] | 1215 | 	u32 transfer_buffer_length;	/* (in) data buffer length */ | 
| Greg Kroah-Hartman | 8c209e6 | 2009-03-06 21:31:03 -0800 | [diff] [blame] | 1216 | 	u32 actual_length;		/* (return) actual transfer length */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1217 | 	unsigned char *setup_packet;	/* (in) setup packet (control only) */ | 
 | 1218 | 	dma_addr_t setup_dma;		/* (in) dma addr for setup_packet */ | 
 | 1219 | 	int start_frame;		/* (modify) start frame (ISO) */ | 
 | 1220 | 	int number_of_packets;		/* (in) number of ISO packets */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1221 | 	int interval;			/* (modify) transfer interval | 
 | 1222 | 					 * (INT/ISO) */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1223 | 	int error_count;		/* (return) number of ISO errors */ | 
 | 1224 | 	void *context;			/* (in) context for completion */ | 
 | 1225 | 	usb_complete_t complete;	/* (in) completion routine */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1226 | 	struct usb_iso_packet_descriptor iso_frame_desc[0]; | 
 | 1227 | 					/* (in) ISO ONLY */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1228 | }; | 
 | 1229 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1230 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1231 |  | 
 | 1232 | /** | 
 | 1233 |  * usb_fill_control_urb - initializes a control urb | 
 | 1234 |  * @urb: pointer to the urb to initialize. | 
 | 1235 |  * @dev: pointer to the struct usb_device for this urb. | 
 | 1236 |  * @pipe: the endpoint pipe | 
 | 1237 |  * @setup_packet: pointer to the setup_packet buffer | 
 | 1238 |  * @transfer_buffer: pointer to the transfer buffer | 
 | 1239 |  * @buffer_length: length of the transfer buffer | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1240 |  * @complete_fn: pointer to the usb_complete_t function | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1241 |  * @context: what to set the urb context to. | 
 | 1242 |  * | 
 | 1243 |  * Initializes a control urb with the proper information needed to submit | 
 | 1244 |  * it to a device. | 
 | 1245 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1246 | static inline void usb_fill_control_urb(struct urb *urb, | 
 | 1247 | 					struct usb_device *dev, | 
 | 1248 | 					unsigned int pipe, | 
 | 1249 | 					unsigned char *setup_packet, | 
 | 1250 | 					void *transfer_buffer, | 
 | 1251 | 					int buffer_length, | 
 | 1252 | 					usb_complete_t complete_fn, | 
 | 1253 | 					void *context) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1254 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1255 | 	urb->dev = dev; | 
 | 1256 | 	urb->pipe = pipe; | 
 | 1257 | 	urb->setup_packet = setup_packet; | 
 | 1258 | 	urb->transfer_buffer = transfer_buffer; | 
 | 1259 | 	urb->transfer_buffer_length = buffer_length; | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1260 | 	urb->complete = complete_fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1261 | 	urb->context = context; | 
 | 1262 | } | 
 | 1263 |  | 
 | 1264 | /** | 
 | 1265 |  * usb_fill_bulk_urb - macro to help initialize a bulk urb | 
 | 1266 |  * @urb: pointer to the urb to initialize. | 
 | 1267 |  * @dev: pointer to the struct usb_device for this urb. | 
 | 1268 |  * @pipe: the endpoint pipe | 
 | 1269 |  * @transfer_buffer: pointer to the transfer buffer | 
 | 1270 |  * @buffer_length: length of the transfer buffer | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1271 |  * @complete_fn: pointer to the usb_complete_t function | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1272 |  * @context: what to set the urb context to. | 
 | 1273 |  * | 
 | 1274 |  * Initializes a bulk urb with the proper information needed to submit it | 
 | 1275 |  * to a device. | 
 | 1276 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1277 | static inline void usb_fill_bulk_urb(struct urb *urb, | 
 | 1278 | 				     struct usb_device *dev, | 
 | 1279 | 				     unsigned int pipe, | 
 | 1280 | 				     void *transfer_buffer, | 
 | 1281 | 				     int buffer_length, | 
 | 1282 | 				     usb_complete_t complete_fn, | 
 | 1283 | 				     void *context) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1284 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1285 | 	urb->dev = dev; | 
 | 1286 | 	urb->pipe = pipe; | 
 | 1287 | 	urb->transfer_buffer = transfer_buffer; | 
 | 1288 | 	urb->transfer_buffer_length = buffer_length; | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1289 | 	urb->complete = complete_fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1290 | 	urb->context = context; | 
 | 1291 | } | 
 | 1292 |  | 
 | 1293 | /** | 
 | 1294 |  * usb_fill_int_urb - macro to help initialize a interrupt urb | 
 | 1295 |  * @urb: pointer to the urb to initialize. | 
 | 1296 |  * @dev: pointer to the struct usb_device for this urb. | 
 | 1297 |  * @pipe: the endpoint pipe | 
 | 1298 |  * @transfer_buffer: pointer to the transfer buffer | 
 | 1299 |  * @buffer_length: length of the transfer buffer | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1300 |  * @complete_fn: pointer to the usb_complete_t function | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1301 |  * @context: what to set the urb context to. | 
 | 1302 |  * @interval: what to set the urb interval to, encoded like | 
 | 1303 |  *	the endpoint descriptor's bInterval value. | 
 | 1304 |  * | 
 | 1305 |  * Initializes a interrupt urb with the proper information needed to submit | 
 | 1306 |  * it to a device. | 
 | 1307 |  * Note that high speed interrupt endpoints use a logarithmic encoding of | 
 | 1308 |  * the endpoint interval, and express polling intervals in microframes | 
 | 1309 |  * (eight per millisecond) rather than in frames (one per millisecond). | 
 | 1310 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1311 | static inline void usb_fill_int_urb(struct urb *urb, | 
 | 1312 | 				    struct usb_device *dev, | 
 | 1313 | 				    unsigned int pipe, | 
 | 1314 | 				    void *transfer_buffer, | 
 | 1315 | 				    int buffer_length, | 
 | 1316 | 				    usb_complete_t complete_fn, | 
 | 1317 | 				    void *context, | 
 | 1318 | 				    int interval) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1319 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1320 | 	urb->dev = dev; | 
 | 1321 | 	urb->pipe = pipe; | 
 | 1322 | 	urb->transfer_buffer = transfer_buffer; | 
 | 1323 | 	urb->transfer_buffer_length = buffer_length; | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1324 | 	urb->complete = complete_fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1325 | 	urb->context = context; | 
 | 1326 | 	if (dev->speed == USB_SPEED_HIGH) | 
 | 1327 | 		urb->interval = 1 << (interval - 1); | 
 | 1328 | 	else | 
 | 1329 | 		urb->interval = interval; | 
 | 1330 | 	urb->start_frame = -1; | 
 | 1331 | } | 
 | 1332 |  | 
 | 1333 | extern void usb_init_urb(struct urb *urb); | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1334 | extern struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1335 | extern void usb_free_urb(struct urb *urb); | 
 | 1336 | #define usb_put_urb usb_free_urb | 
 | 1337 | extern struct urb *usb_get_urb(struct urb *urb); | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1338 | extern int usb_submit_urb(struct urb *urb, gfp_t mem_flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1339 | extern int usb_unlink_urb(struct urb *urb); | 
 | 1340 | extern void usb_kill_urb(struct urb *urb); | 
| Oliver Neukum | 55b447b | 2008-07-29 15:26:15 +0200 | [diff] [blame] | 1341 | extern void usb_poison_urb(struct urb *urb); | 
 | 1342 | extern void usb_unpoison_urb(struct urb *urb); | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1343 | extern void usb_kill_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | 6a2839b | 2008-07-29 16:18:47 +0200 | [diff] [blame] | 1344 | extern void usb_poison_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | 856395d | 2008-12-18 09:17:49 +0100 | [diff] [blame] | 1345 | extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | eda7695 | 2008-04-10 14:07:37 +0200 | [diff] [blame] | 1346 | extern void usb_unlink_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1347 | extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor); | 
 | 1348 | extern void usb_unanchor_urb(struct urb *urb); | 
 | 1349 | extern int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, | 
 | 1350 | 					 unsigned int timeout); | 
| Oliver Neukum | 1987625 | 2008-08-25 22:40:25 +0200 | [diff] [blame] | 1351 | extern struct urb *usb_get_from_anchor(struct usb_anchor *anchor); | 
 | 1352 | extern void usb_scuttle_anchored_urbs(struct usb_anchor *anchor); | 
 | 1353 | extern int usb_anchor_empty(struct usb_anchor *anchor); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1354 |  | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1355 | /** | 
 | 1356 |  * usb_urb_dir_in - check if an URB describes an IN transfer | 
 | 1357 |  * @urb: URB to be checked | 
 | 1358 |  * | 
 | 1359 |  * Returns 1 if @urb describes an IN transfer (device-to-host), | 
 | 1360 |  * otherwise 0. | 
 | 1361 |  */ | 
 | 1362 | static inline int usb_urb_dir_in(struct urb *urb) | 
 | 1363 | { | 
| Alan Stern | d617bc8 | 2007-08-02 15:04:52 -0400 | [diff] [blame] | 1364 | 	return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_IN; | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1365 | } | 
 | 1366 |  | 
 | 1367 | /** | 
 | 1368 |  * usb_urb_dir_out - check if an URB describes an OUT transfer | 
 | 1369 |  * @urb: URB to be checked | 
 | 1370 |  * | 
 | 1371 |  * Returns 1 if @urb describes an OUT transfer (host-to-device), | 
 | 1372 |  * otherwise 0. | 
 | 1373 |  */ | 
 | 1374 | static inline int usb_urb_dir_out(struct urb *urb) | 
 | 1375 | { | 
 | 1376 | 	return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_OUT; | 
 | 1377 | } | 
 | 1378 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1379 | void *usb_buffer_alloc(struct usb_device *dev, size_t size, | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1380 | 	gfp_t mem_flags, dma_addr_t *dma); | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1381 | void usb_buffer_free(struct usb_device *dev, size_t size, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1382 | 	void *addr, dma_addr_t dma); | 
 | 1383 |  | 
 | 1384 | #if 0 | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1385 | struct urb *usb_buffer_map(struct urb *urb); | 
 | 1386 | void usb_buffer_dmasync(struct urb *urb); | 
 | 1387 | void usb_buffer_unmap(struct urb *urb); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1388 | #endif | 
 | 1389 |  | 
 | 1390 | struct scatterlist; | 
| Alan Stern | 5e60a16 | 2007-07-30 17:07:21 -0400 | [diff] [blame] | 1391 | int usb_buffer_map_sg(const struct usb_device *dev, int is_in, | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 1392 | 		      struct scatterlist *sg, int nents); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1393 | #if 0 | 
| Alan Stern | 5e60a16 | 2007-07-30 17:07:21 -0400 | [diff] [blame] | 1394 | void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in, | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 1395 | 			   struct scatterlist *sg, int n_hw_ents); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1396 | #endif | 
| Alan Stern | 5e60a16 | 2007-07-30 17:07:21 -0400 | [diff] [blame] | 1397 | void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in, | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 1398 | 			 struct scatterlist *sg, int n_hw_ents); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1399 |  | 
 | 1400 | /*-------------------------------------------------------------------* | 
 | 1401 |  *                         SYNCHRONOUS CALL SUPPORT                  * | 
 | 1402 |  *-------------------------------------------------------------------*/ | 
 | 1403 |  | 
 | 1404 | extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, | 
 | 1405 | 	__u8 request, __u8 requesttype, __u16 value, __u16 index, | 
 | 1406 | 	void *data, __u16 size, int timeout); | 
| Greg Kroah-Hartman | 782a7a6 | 2006-05-19 13:20:20 -0700 | [diff] [blame] | 1407 | extern int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, | 
 | 1408 | 	void *data, int len, int *actual_length, int timeout); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1409 | extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, | 
 | 1410 | 	void *data, int len, int *actual_length, | 
 | 1411 | 	int timeout); | 
 | 1412 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1413 | /* wrappers around usb_control_msg() for the most common standard requests */ | 
 | 1414 | extern int usb_get_descriptor(struct usb_device *dev, unsigned char desctype, | 
 | 1415 | 	unsigned char descindex, void *buf, int size); | 
 | 1416 | extern int usb_get_status(struct usb_device *dev, | 
 | 1417 | 	int type, int target, void *data); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1418 | extern int usb_string(struct usb_device *dev, int index, | 
 | 1419 | 	char *buf, size_t size); | 
 | 1420 |  | 
 | 1421 | /* wrappers that also update important state inside usbcore */ | 
 | 1422 | extern int usb_clear_halt(struct usb_device *dev, int pipe); | 
 | 1423 | extern int usb_reset_configuration(struct usb_device *dev); | 
 | 1424 | extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate); | 
| David Vrabel | 3444b26 | 2009-04-08 17:36:28 +0000 | [diff] [blame] | 1425 | extern void usb_reset_endpoint(struct usb_device *dev, unsigned int epaddr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1426 |  | 
| Alan Stern | 088dc27 | 2006-08-21 12:08:19 -0400 | [diff] [blame] | 1427 | /* this request isn't really synchronous, but it belongs with the others */ | 
 | 1428 | extern int usb_driver_set_configuration(struct usb_device *udev, int config); | 
 | 1429 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1430 | /* | 
 | 1431 |  * timeouts, in milliseconds, used for sending/receiving control messages | 
 | 1432 |  * they typically complete within a few frames (msec) after they're issued | 
 | 1433 |  * USB identifies 5 second timeouts, maybe more in a few cases, and a few | 
 | 1434 |  * slow devices (like some MGE Ellipse UPSes) actually push that limit. | 
 | 1435 |  */ | 
 | 1436 | #define USB_CTRL_GET_TIMEOUT	5000 | 
 | 1437 | #define USB_CTRL_SET_TIMEOUT	5000 | 
 | 1438 |  | 
 | 1439 |  | 
 | 1440 | /** | 
 | 1441 |  * struct usb_sg_request - support for scatter/gather I/O | 
 | 1442 |  * @status: zero indicates success, else negative errno | 
 | 1443 |  * @bytes: counts bytes transferred. | 
 | 1444 |  * | 
 | 1445 |  * These requests are initialized using usb_sg_init(), and then are used | 
 | 1446 |  * as request handles passed to usb_sg_wait() or usb_sg_cancel().  Most | 
 | 1447 |  * members of the request object aren't for driver access. | 
 | 1448 |  * | 
 | 1449 |  * The status and bytecount values are valid only after usb_sg_wait() | 
 | 1450 |  * returns.  If the status is zero, then the bytecount matches the total | 
 | 1451 |  * from the request. | 
 | 1452 |  * | 
 | 1453 |  * After an error completion, drivers may need to clear a halt condition | 
 | 1454 |  * on the endpoint. | 
 | 1455 |  */ | 
 | 1456 | struct usb_sg_request { | 
 | 1457 | 	int			status; | 
 | 1458 | 	size_t			bytes; | 
 | 1459 |  | 
| Randy Dunlap | bf92c19 | 2009-04-29 21:02:49 -0700 | [diff] [blame] | 1460 | 	/* private: | 
 | 1461 | 	 * members below are private to usbcore, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1462 | 	 * and are not provided for driver access! | 
 | 1463 | 	 */ | 
 | 1464 | 	spinlock_t		lock; | 
 | 1465 |  | 
 | 1466 | 	struct usb_device	*dev; | 
 | 1467 | 	int			pipe; | 
 | 1468 | 	struct scatterlist	*sg; | 
 | 1469 | 	int			nents; | 
 | 1470 |  | 
 | 1471 | 	int			entries; | 
 | 1472 | 	struct urb		**urbs; | 
 | 1473 |  | 
 | 1474 | 	int			count; | 
 | 1475 | 	struct completion	complete; | 
 | 1476 | }; | 
 | 1477 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1478 | int usb_sg_init( | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1479 | 	struct usb_sg_request	*io, | 
 | 1480 | 	struct usb_device	*dev, | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1481 | 	unsigned		pipe, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1482 | 	unsigned		period, | 
 | 1483 | 	struct scatterlist	*sg, | 
 | 1484 | 	int			nents, | 
 | 1485 | 	size_t			length, | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1486 | 	gfp_t			mem_flags | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1487 | ); | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1488 | void usb_sg_cancel(struct usb_sg_request *io); | 
 | 1489 | void usb_sg_wait(struct usb_sg_request *io); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1490 |  | 
 | 1491 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1492 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1493 |  | 
 | 1494 | /* | 
 | 1495 |  * For various legacy reasons, Linux has a small cookie that's paired with | 
 | 1496 |  * a struct usb_device to identify an endpoint queue.  Queue characteristics | 
 | 1497 |  * are defined by the endpoint's descriptor.  This cookie is called a "pipe", | 
 | 1498 |  * an unsigned int encoded as: | 
 | 1499 |  * | 
 | 1500 |  *  - direction:	bit 7		(0 = Host-to-Device [Out], | 
 | 1501 |  *					 1 = Device-to-Host [In] ... | 
 | 1502 |  *					like endpoint bEndpointAddress) | 
 | 1503 |  *  - device address:	bits 8-14       ... bit positions known to uhci-hcd | 
 | 1504 |  *  - endpoint:		bits 15-18      ... bit positions known to uhci-hcd | 
 | 1505 |  *  - pipe type:	bits 30-31	(00 = isochronous, 01 = interrupt, | 
 | 1506 |  *					 10 = control, 11 = bulk) | 
 | 1507 |  * | 
 | 1508 |  * Given the device address and endpoint descriptor, pipes are redundant. | 
 | 1509 |  */ | 
 | 1510 |  | 
 | 1511 | /* NOTE:  these are not the standard USB_ENDPOINT_XFER_* values!! */ | 
 | 1512 | /* (yet ... they're the values used by usbfs) */ | 
 | 1513 | #define PIPE_ISOCHRONOUS		0 | 
 | 1514 | #define PIPE_INTERRUPT			1 | 
 | 1515 | #define PIPE_CONTROL			2 | 
 | 1516 | #define PIPE_BULK			3 | 
 | 1517 |  | 
 | 1518 | #define usb_pipein(pipe)	((pipe) & USB_DIR_IN) | 
 | 1519 | #define usb_pipeout(pipe)	(!usb_pipein(pipe)) | 
 | 1520 |  | 
 | 1521 | #define usb_pipedevice(pipe)	(((pipe) >> 8) & 0x7f) | 
 | 1522 | #define usb_pipeendpoint(pipe)	(((pipe) >> 15) & 0xf) | 
 | 1523 |  | 
 | 1524 | #define usb_pipetype(pipe)	(((pipe) >> 30) & 3) | 
 | 1525 | #define usb_pipeisoc(pipe)	(usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) | 
 | 1526 | #define usb_pipeint(pipe)	(usb_pipetype((pipe)) == PIPE_INTERRUPT) | 
 | 1527 | #define usb_pipecontrol(pipe)	(usb_pipetype((pipe)) == PIPE_CONTROL) | 
 | 1528 | #define usb_pipebulk(pipe)	(usb_pipetype((pipe)) == PIPE_BULK) | 
 | 1529 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1530 | static inline unsigned int __create_pipe(struct usb_device *dev, | 
 | 1531 | 		unsigned int endpoint) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1532 | { | 
 | 1533 | 	return (dev->devnum << 8) | (endpoint << 15); | 
 | 1534 | } | 
 | 1535 |  | 
 | 1536 | /* Create various pipes... */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1537 | #define usb_sndctrlpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1538 | 	((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint)) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1539 | #define usb_rcvctrlpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1540 | 	((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1541 | #define usb_sndisocpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1542 | 	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint)) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1543 | #define usb_rcvisocpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1544 | 	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1545 | #define usb_sndbulkpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1546 | 	((PIPE_BULK << 30) | __create_pipe(dev, endpoint)) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1547 | #define usb_rcvbulkpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1548 | 	((PIPE_BULK << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1549 | #define usb_sndintpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1550 | 	((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint)) | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1551 | #define usb_rcvintpipe(dev,endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1552 | 	((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1553 |  | 
 | 1554 | /*-------------------------------------------------------------------------*/ | 
 | 1555 |  | 
 | 1556 | static inline __u16 | 
 | 1557 | usb_maxpacket(struct usb_device *udev, int pipe, int is_out) | 
 | 1558 | { | 
 | 1559 | 	struct usb_host_endpoint	*ep; | 
 | 1560 | 	unsigned			epnum = usb_pipeendpoint(pipe); | 
 | 1561 |  | 
 | 1562 | 	if (is_out) { | 
 | 1563 | 		WARN_ON(usb_pipein(pipe)); | 
 | 1564 | 		ep = udev->ep_out[epnum]; | 
 | 1565 | 	} else { | 
 | 1566 | 		WARN_ON(usb_pipeout(pipe)); | 
 | 1567 | 		ep = udev->ep_in[epnum]; | 
 | 1568 | 	} | 
 | 1569 | 	if (!ep) | 
 | 1570 | 		return 0; | 
 | 1571 |  | 
 | 1572 | 	/* NOTE:  only 0x07ff bits are for packet size... */ | 
 | 1573 | 	return le16_to_cpu(ep->desc.wMaxPacketSize); | 
 | 1574 | } | 
 | 1575 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1576 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1577 |  | 
| Greg Kroah-Hartman | 3099e75 | 2005-06-20 21:15:16 -0700 | [diff] [blame] | 1578 | /* Events from the usb core */ | 
 | 1579 | #define USB_DEVICE_ADD		0x0001 | 
 | 1580 | #define USB_DEVICE_REMOVE	0x0002 | 
 | 1581 | #define USB_BUS_ADD		0x0003 | 
 | 1582 | #define USB_BUS_REMOVE		0x0004 | 
 | 1583 | extern void usb_register_notify(struct notifier_block *nb); | 
 | 1584 | extern void usb_unregister_notify(struct notifier_block *nb); | 
 | 1585 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1586 | #ifdef DEBUG | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1587 | #define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , \ | 
 | 1588 | 	__FILE__ , ## arg) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1589 | #else | 
 | 1590 | #define dbg(format, arg...) do {} while (0) | 
 | 1591 | #endif | 
 | 1592 |  | 
| Tilman Schmidt | f66396b | 2008-03-13 19:51:42 +0100 | [diff] [blame] | 1593 | #define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \ | 
 | 1594 | 	format "\n" , ## arg) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1595 |  | 
| Greg Kroah-Hartman | 00048b8 | 2009-04-24 14:56:26 -0700 | [diff] [blame] | 1596 | /* debugfs stuff */ | 
 | 1597 | extern struct dentry *usb_debug_root; | 
 | 1598 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1599 | #endif  /* __KERNEL__ */ | 
 | 1600 |  | 
 | 1601 | #endif |