| 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 */ | 
| Ming Lei | 6ddf27c | 2010-11-15 15:57:30 -0500 | [diff] [blame] | 23 | #include <linux/pm_runtime.h>	/* for runtime PM */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 24 |  | 
 | 25 | struct usb_device; | 
 | 26 | struct usb_driver; | 
| Inaky Perez-Gonzalez | b1d8dfb | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 27 | struct wusb_dev; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 |  | 
 | 29 | /*-------------------------------------------------------------------------*/ | 
 | 30 |  | 
 | 31 | /* | 
 | 32 |  * Host-side wrappers for standard USB descriptors ... these are parsed | 
 | 33 |  * from the data provided by devices.  Parsing turns them from a flat | 
 | 34 |  * sequence of descriptors into a hierarchy: | 
 | 35 |  * | 
 | 36 |  *  - devices have one (usually) or more configs; | 
 | 37 |  *  - configs have one (often) or more interfaces; | 
 | 38 |  *  - interfaces have one (usually) or more settings; | 
 | 39 |  *  - each interface setting has zero or (usually) more endpoints. | 
| Sarah Sharp | 663c30d | 2009-04-27 19:58:14 -0700 | [diff] [blame] | 40 |  *  - a SuperSpeed endpoint has a companion descriptor | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 |  * | 
 | 42 |  * And there might be other descriptors mixed in with those. | 
 | 43 |  * | 
 | 44 |  * Devices may also have class-specific or vendor-specific descriptors. | 
 | 45 |  */ | 
 | 46 |  | 
| Greg Kroah-Hartman | 9bde749 | 2006-06-14 12:14:34 -0700 | [diff] [blame] | 47 | struct ep_device; | 
 | 48 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 49 | /** | 
 | 50 |  * struct usb_host_endpoint - host-side endpoint descriptor and queue | 
 | 51 |  * @desc: descriptor for this endpoint, wMaxPacketSize in native byteorder | 
| Alan Stern | 842f169 | 2010-04-30 12:44:46 -0400 | [diff] [blame] | 52 |  * @ss_ep_comp: SuperSpeed companion descriptor for this endpoint | 
| Mathias Nyman | b37d83a | 2016-02-12 16:40:13 +0200 | [diff] [blame] | 53 |  * @ssp_isoc_ep_comp: SuperSpeedPlus isoc companion descriptor for this endpoint | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 54 |  * @urb_list: urbs queued to this endpoint; maintained by usbcore | 
 | 55 |  * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH) | 
 | 56 |  *	with one or more transfer descriptors (TDs) per urb | 
| Randy Dunlap | 7fac9a3 | 2006-06-22 15:12:41 -0700 | [diff] [blame] | 57 |  * @ep_dev: ep_device for sysfs info | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 58 |  * @extra: descriptors following this endpoint in the configuration | 
 | 59 |  * @extralen: how many bytes of "extra" are valid | 
| Alan Stern | bdd016b | 2007-07-30 17:05:22 -0400 | [diff] [blame] | 60 |  * @enabled: URBs may be submitted to this endpoint | 
| Hans de Goede | 8d4f70b | 2013-10-09 17:19:25 +0200 | [diff] [blame] | 61 |  * @streams: number of USB-3 streams allocated on the endpoint | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 62 |  * | 
 | 63 |  * USB requests are always queued to a given endpoint, identified by a | 
 | 64 |  * descriptor within an active interface in a given USB configuration. | 
 | 65 |  */ | 
 | 66 | struct usb_host_endpoint { | 
| Alan Stern | 842f169 | 2010-04-30 12:44:46 -0400 | [diff] [blame] | 67 | 	struct usb_endpoint_descriptor		desc; | 
 | 68 | 	struct usb_ss_ep_comp_descriptor	ss_ep_comp; | 
| Mathias Nyman | b37d83a | 2016-02-12 16:40:13 +0200 | [diff] [blame] | 69 | 	struct usb_ssp_isoc_ep_comp_descriptor	ssp_isoc_ep_comp; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 | 	struct list_head		urb_list; | 
 | 71 | 	void				*hcpriv; | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 72 | 	struct ep_device		*ep_dev;	/* For sysfs info */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 |  | 
 | 74 | 	unsigned char *extra;   /* Extra descriptors */ | 
 | 75 | 	int extralen; | 
| Alan Stern | bdd016b | 2007-07-30 17:05:22 -0400 | [diff] [blame] | 76 | 	int enabled; | 
| Hans de Goede | 8d4f70b | 2013-10-09 17:19:25 +0200 | [diff] [blame] | 77 | 	int streams; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 | }; | 
 | 79 |  | 
 | 80 | /* host-side wrapper for one interface setting's parsed descriptors */ | 
 | 81 | struct usb_host_interface { | 
 | 82 | 	struct usb_interface_descriptor	desc; | 
 | 83 |  | 
| Richard Kennedy | 0d5ff30 | 2012-07-10 17:19:25 +0100 | [diff] [blame] | 84 | 	int extralen; | 
 | 85 | 	unsigned char *extra;   /* Extra descriptors */ | 
 | 86 |  | 
| Chris Rorvick | 9636c37 | 2015-01-14 21:52:28 -0600 | [diff] [blame] | 87 | 	/* array of desc.bNumEndpoints endpoints associated with this | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 88 | 	 * interface setting.  these will be in no particular order. | 
 | 89 | 	 */ | 
 | 90 | 	struct usb_host_endpoint *endpoint; | 
 | 91 |  | 
 | 92 | 	char *string;		/* iInterface string, if present */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 93 | }; | 
 | 94 |  | 
 | 95 | enum usb_interface_condition { | 
 | 96 | 	USB_INTERFACE_UNBOUND = 0, | 
 | 97 | 	USB_INTERFACE_BINDING, | 
 | 98 | 	USB_INTERFACE_BOUND, | 
 | 99 | 	USB_INTERFACE_UNBINDING, | 
 | 100 | }; | 
 | 101 |  | 
 | 102 | /** | 
 | 103 |  * struct usb_interface - what usb device drivers talk to | 
 | 104 |  * @altsetting: array of interface structures, one for each alternate | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 105 |  *	setting that may be selected.  Each one includes a set of | 
 | 106 |  *	endpoint configurations.  They will be in no particular order. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 107 |  * @cur_altsetting: the current altsetting. | 
| Lei Ming | d6d914f | 2008-02-25 18:07:28 +0800 | [diff] [blame] | 108 |  * @num_altsetting: number of altsettings defined. | 
| Randy Dunlap | 3f42378 | 2007-07-19 10:21:37 -0700 | [diff] [blame] | 109 |  * @intf_assoc: interface association descriptor | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 110 |  * @minor: the minor number assigned to this interface, if this | 
 | 111 |  *	interface is bound to a driver that uses the USB major number. | 
 | 112 |  *	If this interface does not use the USB major, this field should | 
 | 113 |  *	be unused.  The driver should set this value in the probe() | 
 | 114 |  *	function of the driver, after it has been assigned a minor | 
 | 115 |  *	number from the USB core by calling usb_register_dev(). | 
 | 116 |  * @condition: binding state of the interface: not bound, binding | 
 | 117 |  *	(in probe()), bound to a driver, or unbinding (in disconnect()) | 
| Randy Dunlap | f88ed90 | 2007-12-03 14:14:16 -0800 | [diff] [blame] | 118 |  * @sysfs_files_created: sysfs attributes exist | 
| Alan Stern | 3b23dd6 | 2008-12-05 14:10:34 -0500 | [diff] [blame] | 119 |  * @ep_devs_created: endpoint child pseudo-devices exist | 
| Alan Stern | 352d026 | 2008-10-29 15:16:58 -0400 | [diff] [blame] | 120 |  * @unregistering: flag set when the interface is being unregistered | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 121 |  * @needs_remote_wakeup: flag set when the driver requires remote-wakeup | 
 | 122 |  *	capability during autosuspend. | 
| Alan Stern | 55151d7 | 2008-08-12 14:33:59 -0400 | [diff] [blame] | 123 |  * @needs_altsetting0: flag set when a set-interface request for altsetting 0 | 
 | 124 |  *	has been deferred. | 
| Alan Stern | f4f4d58 | 2008-07-28 10:39:28 -0400 | [diff] [blame] | 125 |  * @needs_binding: flag set when the driver should be re-probed or unbound | 
 | 126 |  *	following a reset or suspend operation it doesn't support. | 
| Stefan Koch | 07294cc | 2015-09-28 23:59:52 +0200 | [diff] [blame] | 127 |  * @authorized: This allows to (de)authorize individual interfaces instead | 
 | 128 |  *	a whole device in contrast to the device authorization. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 129 |  * @dev: driver model's view of this device | 
| Greg Kroah-Hartman | 0873c76 | 2006-06-20 13:09:50 -0700 | [diff] [blame] | 130 |  * @usb_dev: if an interface is bound to the USB major, this will point | 
 | 131 |  *	to the sysfs representation for that device. | 
| Alan Stern | 9bbdf1e | 2010-01-08 12:57:28 -0500 | [diff] [blame] | 132 |  * @pm_usage_cnt: PM usage counter for this interface | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 133 |  * @reset_ws: Used for scheduling resets from atomic context. | 
| Randy Dunlap | c6ba1c2 | 2010-07-29 15:54:38 -0700 | [diff] [blame] | 134 |  * @resetting_device: USB core reset the device, so use alt setting 0 as | 
 | 135 |  *	current; needs bandwidth alloc after reset. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 136 |  * | 
 | 137 |  * USB device drivers attach to interfaces on a physical device.  Each | 
 | 138 |  * interface encapsulates a single high level function, such as feeding | 
 | 139 |  * an audio stream to a speaker or reporting a change in a volume control. | 
 | 140 |  * Many USB devices only have one interface.  The protocol used to talk to | 
 | 141 |  * an interface's endpoints can be defined in a usb "class" specification, | 
 | 142 |  * or by a product's vendor.  The (default) control endpoint is part of | 
 | 143 |  * every interface, but is never listed among the interface's descriptors. | 
 | 144 |  * | 
 | 145 |  * The driver that is bound to the interface can use standard driver model | 
 | 146 |  * calls such as dev_get_drvdata() on the dev member of this structure. | 
 | 147 |  * | 
 | 148 |  * Each interface may have alternate settings.  The initial configuration | 
 | 149 |  * of a device sets altsetting 0, but the device driver can change | 
 | 150 |  * that setting using usb_set_interface().  Alternate settings are often | 
| Michael Opdenacker | 59c5159 | 2007-05-09 08:57:56 +0200 | [diff] [blame] | 151 |  * used to control the use of periodic endpoints, such as by having | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 152 |  * different endpoints use different amounts of reserved USB bandwidth. | 
 | 153 |  * All standards-conformant USB devices that use isochronous endpoints | 
 | 154 |  * will use them in non-default settings. | 
 | 155 |  * | 
 | 156 |  * The USB specification says that alternate setting numbers must run from | 
 | 157 |  * 0 to one less than the total number of alternate settings.  But some | 
 | 158 |  * devices manage to mess this up, and the structures aren't necessarily | 
 | 159 |  * stored in numerical order anyhow.  Use usb_altnum_to_altsetting() to | 
 | 160 |  * look up an alternate setting in the altsetting array based on its number. | 
 | 161 |  */ | 
 | 162 | struct usb_interface { | 
 | 163 | 	/* array of alternate settings for this interface, | 
 | 164 | 	 * stored in no particular order */ | 
 | 165 | 	struct usb_host_interface *altsetting; | 
 | 166 |  | 
 | 167 | 	struct usb_host_interface *cur_altsetting;	/* the currently | 
 | 168 | 					 * active alternate setting */ | 
 | 169 | 	unsigned num_altsetting;	/* number of alternate settings */ | 
 | 170 |  | 
| Craig W. Nadler | 165fe97 | 2007-06-15 23:14:35 -0400 | [diff] [blame] | 171 | 	/* If there is an interface association descriptor then it will list | 
 | 172 | 	 * the associated interfaces */ | 
 | 173 | 	struct usb_interface_assoc_descriptor *intf_assoc; | 
 | 174 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 175 | 	int minor;			/* minor number this interface is | 
 | 176 | 					 * bound to */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 177 | 	enum usb_interface_condition condition;		/* state of binding */ | 
| Alan Stern | 7e61559 | 2007-11-06 11:43:42 -0500 | [diff] [blame] | 178 | 	unsigned sysfs_files_created:1;	/* the sysfs attributes exist */ | 
| Alan Stern | 3b23dd6 | 2008-12-05 14:10:34 -0500 | [diff] [blame] | 179 | 	unsigned ep_devs_created:1;	/* endpoint "devices" exist */ | 
| Alan Stern | 352d026 | 2008-10-29 15:16:58 -0400 | [diff] [blame] | 180 | 	unsigned unregistering:1;	/* unregistration is in progress */ | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 181 | 	unsigned needs_remote_wakeup:1;	/* driver requires remote wakeup */ | 
| Alan Stern | 55151d7 | 2008-08-12 14:33:59 -0400 | [diff] [blame] | 182 | 	unsigned needs_altsetting0:1;	/* switch to altsetting 0 is pending */ | 
| Alan Stern | 78d9a48 | 2008-06-23 16:00:40 -0400 | [diff] [blame] | 183 | 	unsigned needs_binding:1;	/* needs delayed unbind/rebind */ | 
| Sarah Sharp | 04a723e | 2010-01-06 10:16:51 -0800 | [diff] [blame] | 184 | 	unsigned resetting_device:1;	/* true: bandwidth alloc after reset */ | 
| Stefan Koch | 4ad2ddc | 2015-08-25 21:10:05 +0200 | [diff] [blame] | 185 | 	unsigned authorized:1;		/* used for interface authorization */ | 
| Alan Stern | 4d064c0 | 2006-07-01 22:11:44 -0400 | [diff] [blame] | 186 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 187 | 	struct device dev;		/* interface specific device info */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 188 | 	struct device *usb_dev; | 
| Alan Stern | ccf5b80 | 2009-06-29 11:00:01 -0400 | [diff] [blame] | 189 | 	atomic_t pm_usage_cnt;		/* usage counter for autosuspend */ | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 190 | 	struct work_struct reset_ws;	/* for resets in atomic context */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 191 | }; | 
 | 192 | #define	to_usb_interface(d) container_of(d, struct usb_interface, dev) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 193 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 194 | static inline void *usb_get_intfdata(struct usb_interface *intf) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 195 | { | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 196 | 	return dev_get_drvdata(&intf->dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 197 | } | 
 | 198 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 199 | static inline void usb_set_intfdata(struct usb_interface *intf, void *data) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 200 | { | 
 | 201 | 	dev_set_drvdata(&intf->dev, data); | 
 | 202 | } | 
 | 203 |  | 
 | 204 | struct usb_interface *usb_get_intf(struct usb_interface *intf); | 
 | 205 | void usb_put_intf(struct usb_interface *intf); | 
 | 206 |  | 
| Hans de Goede | 8f5d354 | 2013-10-09 17:19:24 +0200 | [diff] [blame] | 207 | /* Hard limit */ | 
 | 208 | #define USB_MAXENDPOINTS	30 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 209 | /* this maximum is arbitrary */ | 
 | 210 | #define USB_MAXINTERFACES	32 | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 211 | #define USB_MAXIADS		(USB_MAXINTERFACES/2) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 212 |  | 
| Felipe Balbi | 62f0342 | 2015-02-13 14:34:25 -0600 | [diff] [blame] | 213 | /* | 
 | 214 |  * USB Resume Timer: Every Host controller driver should drive the resume | 
 | 215 |  * signalling on the bus for the amount of time defined by this macro. | 
 | 216 |  * | 
 | 217 |  * That way we will have a 'stable' behavior among all HCDs supported by Linux. | 
 | 218 |  * | 
 | 219 |  * Note that the USB Specification states we should drive resume for *at least* | 
 | 220 |  * 20 ms, but it doesn't give an upper bound. This creates two possible | 
 | 221 |  * situations which we want to avoid: | 
 | 222 |  * | 
 | 223 |  * (a) sometimes an msleep(20) might expire slightly before 20 ms, which causes | 
 | 224 |  * us to fail USB Electrical Tests, thus failing Certification | 
 | 225 |  * | 
 | 226 |  * (b) Some (many) devices actually need more than 20 ms of resume signalling, | 
 | 227 |  * and while we can argue that's against the USB Specification, we don't have | 
 | 228 |  * control over which devices a certification laboratory will be using for | 
 | 229 |  * certification. If CertLab uses a device which was tested against Windows and | 
 | 230 |  * that happens to have relaxed resume signalling rules, we might fall into | 
 | 231 |  * situations where we fail interoperability and electrical tests. | 
 | 232 |  * | 
 | 233 |  * In order to avoid both conditions, we're using a 40 ms resume timeout, which | 
 | 234 |  * should cope with both LPJ calibration errors and devices not following every | 
 | 235 |  * detail of the USB Specification. | 
 | 236 |  */ | 
 | 237 | #define USB_RESUME_TIMEOUT	40 /* ms */ | 
 | 238 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 239 | /** | 
 | 240 |  * struct usb_interface_cache - long-term representation of a device interface | 
 | 241 |  * @num_altsetting: number of altsettings defined. | 
 | 242 |  * @ref: reference counter. | 
 | 243 |  * @altsetting: variable-length array of interface structures, one for | 
 | 244 |  *	each alternate setting that may be selected.  Each one includes a | 
 | 245 |  *	set of endpoint configurations.  They will be in no particular order. | 
 | 246 |  * | 
 | 247 |  * These structures persist for the lifetime of a usb_device, unlike | 
 | 248 |  * struct usb_interface (which persists only as long as its configuration | 
 | 249 |  * is installed).  The altsetting arrays can be accessed through these | 
 | 250 |  * structures at any time, permitting comparison of configurations and | 
 | 251 |  * providing support for the /proc/bus/usb/devices pseudo-file. | 
 | 252 |  */ | 
 | 253 | struct usb_interface_cache { | 
 | 254 | 	unsigned num_altsetting;	/* number of alternate settings */ | 
 | 255 | 	struct kref ref;		/* reference counter */ | 
 | 256 |  | 
 | 257 | 	/* variable-length array of alternate settings for this interface, | 
 | 258 | 	 * stored in no particular order */ | 
 | 259 | 	struct usb_host_interface altsetting[0]; | 
 | 260 | }; | 
 | 261 | #define	ref_to_usb_interface_cache(r) \ | 
 | 262 | 		container_of(r, struct usb_interface_cache, ref) | 
 | 263 | #define	altsetting_to_usb_interface_cache(a) \ | 
 | 264 | 		container_of(a, struct usb_interface_cache, altsetting[0]) | 
 | 265 |  | 
 | 266 | /** | 
 | 267 |  * struct usb_host_config - representation of a device's configuration | 
 | 268 |  * @desc: the device's configuration descriptor. | 
 | 269 |  * @string: pointer to the cached version of the iConfiguration string, if | 
 | 270 |  *	present for this configuration. | 
| Randy Dunlap | 3f42378 | 2007-07-19 10:21:37 -0700 | [diff] [blame] | 271 |  * @intf_assoc: list of any interface association descriptors in this config | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 272 |  * @interface: array of pointers to usb_interface structures, one for each | 
 | 273 |  *	interface in the configuration.  The number of interfaces is stored | 
 | 274 |  *	in desc.bNumInterfaces.  These pointers are valid only while the | 
 | 275 |  *	the configuration is active. | 
 | 276 |  * @intf_cache: array of pointers to usb_interface_cache structures, one | 
 | 277 |  *	for each interface in the configuration.  These structures exist | 
 | 278 |  *	for the entire life of the device. | 
 | 279 |  * @extra: pointer to buffer containing all extra descriptors associated | 
 | 280 |  *	with this configuration (those preceding the first interface | 
 | 281 |  *	descriptor). | 
 | 282 |  * @extralen: length of the extra descriptors buffer. | 
 | 283 |  * | 
 | 284 |  * USB devices may have multiple configurations, but only one can be active | 
 | 285 |  * at any time.  Each encapsulates a different operational environment; | 
 | 286 |  * for example, a dual-speed device would have separate configurations for | 
 | 287 |  * full-speed and high-speed operation.  The number of configurations | 
 | 288 |  * available is stored in the device descriptor as bNumConfigurations. | 
 | 289 |  * | 
 | 290 |  * A configuration can contain multiple interfaces.  Each corresponds to | 
 | 291 |  * a different function of the USB device, and all are available whenever | 
 | 292 |  * the configuration is active.  The USB standard says that interfaces | 
 | 293 |  * are supposed to be numbered from 0 to desc.bNumInterfaces-1, but a lot | 
 | 294 |  * of devices get this wrong.  In addition, the interface array is not | 
 | 295 |  * guaranteed to be sorted in numerical order.  Use usb_ifnum_to_if() to | 
 | 296 |  * look up an interface entry based on its number. | 
 | 297 |  * | 
 | 298 |  * Device drivers should not attempt to activate configurations.  The choice | 
 | 299 |  * of which configuration to install is a policy decision based on such | 
 | 300 |  * considerations as available power, functionality provided, and the user's | 
| Kay Sievers | 312c004 | 2005-11-16 09:00:00 +0100 | [diff] [blame] | 301 |  * desires (expressed through userspace tools).  However, drivers can call | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 302 |  * usb_reset_configuration() to reinitialize the current configuration and | 
 | 303 |  * all its interfaces. | 
 | 304 |  */ | 
 | 305 | struct usb_host_config { | 
 | 306 | 	struct usb_config_descriptor	desc; | 
 | 307 |  | 
| Alan Stern | 4f62efe | 2005-10-24 16:24:14 -0400 | [diff] [blame] | 308 | 	char *string;		/* iConfiguration string, if present */ | 
| Craig W. Nadler | 165fe97 | 2007-06-15 23:14:35 -0400 | [diff] [blame] | 309 |  | 
 | 310 | 	/* List of any Interface Association Descriptors in this | 
 | 311 | 	 * configuration. */ | 
 | 312 | 	struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS]; | 
 | 313 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 314 | 	/* the interfaces associated with this configuration, | 
 | 315 | 	 * stored in no particular order */ | 
 | 316 | 	struct usb_interface *interface[USB_MAXINTERFACES]; | 
 | 317 |  | 
 | 318 | 	/* Interface information available even when this is not the | 
 | 319 | 	 * active configuration */ | 
 | 320 | 	struct usb_interface_cache *intf_cache[USB_MAXINTERFACES]; | 
 | 321 |  | 
 | 322 | 	unsigned char *extra;   /* Extra descriptors */ | 
 | 323 | 	int extralen; | 
 | 324 | }; | 
 | 325 |  | 
| Andiry Xu | 3148bf0 | 2011-09-23 14:19:47 -0700 | [diff] [blame] | 326 | /* USB2.0 and USB3.0 device BOS descriptor set */ | 
 | 327 | struct usb_host_bos { | 
 | 328 | 	struct usb_bos_descriptor	*desc; | 
 | 329 |  | 
 | 330 | 	/* wireless cap descriptor is handled by wusb */ | 
 | 331 | 	struct usb_ext_cap_descriptor	*ext_cap; | 
 | 332 | 	struct usb_ss_cap_descriptor	*ss_cap; | 
| Mathias Nyman | 3220bef | 2015-10-01 18:40:33 +0300 | [diff] [blame] | 333 | 	struct usb_ssp_cap_descriptor	*ssp_cap; | 
| Andiry Xu | 3148bf0 | 2011-09-23 14:19:47 -0700 | [diff] [blame] | 334 | 	struct usb_ss_container_id_descriptor	*ss_id; | 
| Mathias Nyman | faee822 | 2016-02-12 16:40:14 +0200 | [diff] [blame] | 335 | 	struct usb_ptm_cap_descriptor	*ptm_cap; | 
| Andiry Xu | 3148bf0 | 2011-09-23 14:19:47 -0700 | [diff] [blame] | 336 | }; | 
 | 337 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 338 | int __usb_get_extra_descriptor(char *buffer, unsigned size, | 
 | 339 | 	unsigned char type, void **ptr); | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 340 | #define usb_get_extra_descriptor(ifpoint, type, ptr) \ | 
 | 341 | 				__usb_get_extra_descriptor((ifpoint)->extra, \ | 
 | 342 | 				(ifpoint)->extralen, \ | 
 | 343 | 				type, (void **)ptr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 344 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 345 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 346 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 347 | /* USB device number allocation bitmap */ | 
 | 348 | struct usb_devmap { | 
 | 349 | 	unsigned long devicemap[128 / (8*sizeof(unsigned long))]; | 
 | 350 | }; | 
 | 351 |  | 
 | 352 | /* | 
 | 353 |  * Allocated per bus (tree of devices) we have: | 
 | 354 |  */ | 
 | 355 | struct usb_bus { | 
 | 356 | 	struct device *controller;	/* host/master side hardware */ | 
 | 357 | 	int busnum;			/* Bus number (in order of reg) */ | 
| Greg Kroah-Hartman | 1b26da1 | 2008-07-02 12:46:22 -0700 | [diff] [blame] | 358 | 	const char *bus_name;		/* stable id (PCI slot_name etc) */ | 
| Alan Stern | dd990f1 | 2006-08-30 11:29:56 -0400 | [diff] [blame] | 359 | 	u8 uses_dma;			/* Does the host controller use DMA? */ | 
| Anand Gadiyar | 07a8cdd | 2010-11-18 18:54:17 +0530 | [diff] [blame] | 360 | 	u8 uses_pio_for_control;	/* | 
 | 361 | 					 * Does the host controller use PIO | 
 | 362 | 					 * for control transfers? | 
 | 363 | 					 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 364 | 	u8 otg_port;			/* 0, or number of OTG/HNP port */ | 
 | 365 | 	unsigned is_b_host:1;		/* true during some HNP roleswitches */ | 
 | 366 | 	unsigned b_hnp_enable:1;	/* OTG: did A-Host enable HNP? */ | 
| Hans de Goede | 19181bc | 2012-07-04 09:18:02 +0200 | [diff] [blame] | 367 | 	unsigned no_stop_on_short:1;    /* | 
 | 368 | 					 * Quirk: some controllers don't stop | 
 | 369 | 					 * the ep queue on a short transfer | 
 | 370 | 					 * with the URB_SHORT_NOT_OK flag set. | 
 | 371 | 					 */ | 
| Ming Lei | bcc48f1 | 2013-08-08 21:48:22 +0800 | [diff] [blame] | 372 | 	unsigned no_sg_constraint:1;	/* no sg constraint */ | 
| David Vrabel | 4c1bd3d | 2009-08-24 14:44:30 +0100 | [diff] [blame] | 373 | 	unsigned sg_tablesize;		/* 0 or largest number of sg list entries */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 374 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 375 | 	int devnum_next;		/* Next open device number in | 
 | 376 | 					 * round-robin allocation */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 377 |  | 
 | 378 | 	struct usb_devmap devmap;	/* device address allocation map */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 379 | 	struct usb_device *root_hub;	/* Root hub */ | 
| Alan Stern | 6d19c00 | 2010-02-12 12:21:11 +0100 | [diff] [blame] | 380 | 	struct usb_bus *hs_companion;	/* Companion EHCI bus, if any */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 381 |  | 
| Todd E Brandt | 6fecd4f | 2014-05-19 10:55:32 -0700 | [diff] [blame] | 382 | 	struct mutex usb_address0_mutex; /* unaddressed device mutex */ | 
 | 383 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 384 | 	int bandwidth_allocated;	/* on this bus: how much of the time | 
 | 385 | 					 * reserved for periodic (intr/iso) | 
 | 386 | 					 * requests is used, on average? | 
 | 387 | 					 * Units: microseconds/frame. | 
 | 388 | 					 * Limits: Full/low speed reserve 90%, | 
 | 389 | 					 * while high speed reserves 80%. | 
 | 390 | 					 */ | 
 | 391 | 	int bandwidth_int_reqs;		/* number of Interrupt requests */ | 
 | 392 | 	int bandwidth_isoc_reqs;	/* number of Isoc. requests */ | 
 | 393 |  | 
| Alan Stern | da0aa71 | 2013-01-25 17:09:42 -0500 | [diff] [blame] | 394 | 	unsigned resuming_ports;	/* bit array: resuming root-hub ports */ | 
 | 395 |  | 
| Pete Zaitcev | f150fa1 | 2008-11-13 21:31:21 -0700 | [diff] [blame] | 396 | #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 397 | 	struct mon_bus *mon_bus;	/* non-null when associated */ | 
 | 398 | 	int monitored;			/* non-zero when monitored */ | 
 | 399 | #endif | 
 | 400 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 401 |  | 
| Valentina Manea | 9b6f0c4 | 2014-03-10 10:36:40 +0200 | [diff] [blame] | 402 | struct usb_dev_state; | 
| Valentina Manea | 6080cd0 | 2014-03-08 14:53:34 +0200 | [diff] [blame] | 403 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 404 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 405 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 406 | struct usb_tt; | 
 | 407 |  | 
| Matthew Garrett | 0846e7e | 2012-02-03 17:11:54 -0500 | [diff] [blame] | 408 | enum usb_device_removable { | 
 | 409 | 	USB_DEVICE_REMOVABLE_UNKNOWN = 0, | 
 | 410 | 	USB_DEVICE_REMOVABLE, | 
 | 411 | 	USB_DEVICE_FIXED, | 
 | 412 | }; | 
 | 413 |  | 
| Lan Tianyu | 05f9168 | 2012-09-05 13:44:34 +0800 | [diff] [blame] | 414 | enum usb_port_connect_type { | 
 | 415 | 	USB_PORT_CONNECT_TYPE_UNKNOWN = 0, | 
 | 416 | 	USB_PORT_CONNECT_TYPE_HOT_PLUG, | 
 | 417 | 	USB_PORT_CONNECT_TYPE_HARD_WIRED, | 
 | 418 | 	USB_PORT_NOT_USED, | 
 | 419 | }; | 
 | 420 |  | 
| Sarah Sharp | 51e0a01 | 2012-02-20 12:02:19 -0800 | [diff] [blame] | 421 | /* | 
| Mathias Nyman | 17f3486 | 2013-05-23 17:14:31 +0300 | [diff] [blame] | 422 |  * USB 2.0 Link Power Management (LPM) parameters. | 
 | 423 |  */ | 
 | 424 | struct usb2_lpm_parameters { | 
 | 425 | 	/* Best effort service latency indicate how long the host will drive | 
 | 426 | 	 * resume on an exit from L1. | 
 | 427 | 	 */ | 
 | 428 | 	unsigned int besl; | 
 | 429 |  | 
 | 430 | 	/* Timeout value in microseconds for the L1 inactivity (LPM) timer. | 
 | 431 | 	 * When the timer counts to zero, the parent hub will initiate a LPM | 
 | 432 | 	 * transition to L1. | 
 | 433 | 	 */ | 
 | 434 | 	int timeout; | 
 | 435 | }; | 
 | 436 |  | 
 | 437 | /* | 
| Sarah Sharp | 51e0a01 | 2012-02-20 12:02:19 -0800 | [diff] [blame] | 438 |  * USB 3.0 Link Power Management (LPM) parameters. | 
 | 439 |  * | 
 | 440 |  * PEL and SEL are USB 3.0 Link PM latencies for device-initiated LPM exit. | 
 | 441 |  * MEL is the USB 3.0 Link PM latency for host-initiated LPM exit. | 
 | 442 |  * All three are stored in nanoseconds. | 
 | 443 |  */ | 
 | 444 | struct usb3_lpm_parameters { | 
 | 445 | 	/* | 
 | 446 | 	 * Maximum exit latency (MEL) for the host to send a packet to the | 
 | 447 | 	 * device (either a Ping for isoc endpoints, or a data packet for | 
 | 448 | 	 * interrupt endpoints), the hubs to decode the packet, and for all hubs | 
 | 449 | 	 * in the path to transition the links to U0. | 
 | 450 | 	 */ | 
 | 451 | 	unsigned int mel; | 
 | 452 | 	/* | 
 | 453 | 	 * Maximum exit latency for a device-initiated LPM transition to bring | 
 | 454 | 	 * all links into U0.  Abbreviated as "PEL" in section 9.4.12 of the USB | 
 | 455 | 	 * 3.0 spec, with no explanation of what "P" stands for.  "Path"? | 
 | 456 | 	 */ | 
 | 457 | 	unsigned int pel; | 
 | 458 |  | 
 | 459 | 	/* | 
 | 460 | 	 * The System Exit Latency (SEL) includes PEL, and three other | 
 | 461 | 	 * latencies.  After a device initiates a U0 transition, it will take | 
 | 462 | 	 * some time from when the device sends the ERDY to when it will finally | 
 | 463 | 	 * receive the data packet.  Basically, SEL should be the worse-case | 
 | 464 | 	 * latency from when a device starts initiating a U0 transition to when | 
 | 465 | 	 * it will get data. | 
 | 466 | 	 */ | 
 | 467 | 	unsigned int sel; | 
| Sarah Sharp | 1ea7e0e | 2012-04-24 17:21:50 -0700 | [diff] [blame] | 468 | 	/* | 
 | 469 | 	 * The idle timeout value that is currently programmed into the parent | 
 | 470 | 	 * hub for this device.  When the timer counts to zero, the parent hub | 
 | 471 | 	 * will initiate an LPM transition to either U1 or U2. | 
 | 472 | 	 */ | 
 | 473 | 	int timeout; | 
| Sarah Sharp | 51e0a01 | 2012-02-20 12:02:19 -0800 | [diff] [blame] | 474 | }; | 
 | 475 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 476 | /** | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 477 |  * struct usb_device - kernel's representation of a USB device | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 478 |  * @devnum: device number; address on a USB bus | 
 | 479 |  * @devpath: device ID string for use in messages (e.g., /port/...) | 
| Sarah Sharp | 7206b00 | 2009-04-27 19:54:49 -0700 | [diff] [blame] | 480 |  * @route: tree topology hex string for use with xHCI | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 481 |  * @state: device state: configured, not attached, etc. | 
 | 482 |  * @speed: device speed: high/full/low (or error) | 
 | 483 |  * @tt: Transaction Translator info; used with low/full speed dev, highspeed hub | 
 | 484 |  * @ttport: device port on that tt hub | 
 | 485 |  * @toggle: one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints | 
 | 486 |  * @parent: our hub, unless we're the root | 
 | 487 |  * @bus: bus we're part of | 
 | 488 |  * @ep0: endpoint 0 data (default control pipe) | 
 | 489 |  * @dev: generic device interface | 
 | 490 |  * @descriptor: USB device descriptor | 
| Andiry Xu | 3148bf0 | 2011-09-23 14:19:47 -0700 | [diff] [blame] | 491 |  * @bos: USB device BOS descriptor set | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 492 |  * @config: all of the device's configs | 
 | 493 |  * @actconfig: the active configuration | 
 | 494 |  * @ep_in: array of IN endpoints | 
 | 495 |  * @ep_out: array of OUT endpoints | 
 | 496 |  * @rawdescriptors: raw descriptors for each config | 
 | 497 |  * @bus_mA: Current available from the bus | 
 | 498 |  * @portnum: parent port number (origin 1) | 
 | 499 |  * @level: number of USB hub ancestors | 
 | 500 |  * @can_submit: URBs may be submitted | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 501 |  * @persist_enabled:  USB_PERSIST enabled for this device | 
 | 502 |  * @have_langid: whether string_langid is valid | 
 | 503 |  * @authorized: policy has said we can use it; | 
 | 504 |  *	(user space) policy determines if we authorize this device to be | 
 | 505 |  *	used or not. By default, wired USB devices are authorized. | 
 | 506 |  *	WUSB devices are not, until we authorize them from user space. | 
 | 507 |  *	FIXME -- complete doc | 
| Inaky Perez-Gonzalez | 3b52f12 | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 508 |  * @authenticated: Crypto authentication passed | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 509 |  * @wusb: device is Wireless USB | 
| Andiry Xu | 1ff4df5 | 2011-09-23 14:19:48 -0700 | [diff] [blame] | 510 |  * @lpm_capable: device supports LPM | 
| Andiry Xu | 65580b43 | 2011-09-23 14:19:52 -0700 | [diff] [blame] | 511 |  * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM | 
| Mathias Nyman | a558ccd | 2013-05-23 17:14:30 +0300 | [diff] [blame] | 512 |  * @usb2_hw_lpm_besl_capable: device can perform USB2 hardware BESL LPM | 
| Sarah Sharp | de68bab | 2013-09-30 17:26:28 +0300 | [diff] [blame] | 513 |  * @usb2_hw_lpm_enabled: USB2 hardware LPM is enabled | 
 | 514 |  * @usb2_hw_lpm_allowed: Userspace allows USB 2.0 LPM to be enabled | 
| Lu Baolu | bf5ce5b | 2015-11-14 16:26:32 +0800 | [diff] [blame] | 515 |  * @usb3_lpm_u1_enabled: USB3 hardware U1 LPM enabled | 
 | 516 |  * @usb3_lpm_u2_enabled: USB3 hardware U2 LPM enabled | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 517 |  * @string_langid: language ID for strings | 
 | 518 |  * @product: iProduct string, if present (static) | 
 | 519 |  * @manufacturer: iManufacturer string, if present (static) | 
 | 520 |  * @serial: iSerialNumber string, if present (static) | 
 | 521 |  * @filelist: usbfs files that are open to this device | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 522 |  * @maxchild: number of ports if hub | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 523 |  * @quirks: quirks of the whole device | 
 | 524 |  * @urbnum: number of URBs submitted for the whole device | 
 | 525 |  * @active_duration: total time device is not suspended | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 526 |  * @connect_time: time device was first connected | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 527 |  * @do_remote_wakeup:  remote wakeup should be enabled | 
 | 528 |  * @reset_resume: needs reset instead of resume | 
| Alan Stern | bfd1e91 | 2012-10-19 11:03:39 -0400 | [diff] [blame] | 529 |  * @port_is_suspended: the upstream port is suspended (L2 or U3) | 
| Inaky Perez-Gonzalez | 11e76ae | 2009-01-08 12:52:19 -0800 | [diff] [blame] | 530 |  * @wusb_dev: if this is a Wireless USB device, link to the WUSB | 
 | 531 |  *	specific data for the device. | 
| Sarah Sharp | c651527 | 2009-04-27 19:57:26 -0700 | [diff] [blame] | 532 |  * @slot_id: Slot ID assigned by xHCI | 
| Matthew Garrett | 0846e7e | 2012-02-03 17:11:54 -0500 | [diff] [blame] | 533 |  * @removable: Device can be physically removed from this port | 
| Mathias Nyman | 17f3486 | 2013-05-23 17:14:31 +0300 | [diff] [blame] | 534 |  * @l1_params: best effor service latency for USB2 L1 LPM state, and L1 timeout. | 
| Sarah Sharp | 1ea7e0e | 2012-04-24 17:21:50 -0700 | [diff] [blame] | 535 |  * @u1_params: exit latencies for USB3 U1 LPM state, and hub-initiated timeout. | 
 | 536 |  * @u2_params: exit latencies for USB3 U2 LPM state, and hub-initiated timeout. | 
 | 537 |  * @lpm_disable_count: Ref count used by usb_disable_lpm() and usb_enable_lpm() | 
 | 538 |  *	to keep track of the number of functions that require USB 3.0 Link Power | 
 | 539 |  *	Management to be disabled for this usb_device.  This count should only | 
 | 540 |  *	be manipulated by those functions, with the bandwidth_mutex is held. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 541 |  * | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 542 |  * Notes: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 543 |  * Usbcore drivers should not set usbdev->state directly.  Instead use | 
 | 544 |  * usb_set_device_state(). | 
 | 545 |  */ | 
 | 546 | struct usb_device { | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 547 | 	int		devnum; | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 548 | 	char		devpath[16]; | 
| Sarah Sharp | 7206b00 | 2009-04-27 19:54:49 -0700 | [diff] [blame] | 549 | 	u32		route; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 550 | 	enum usb_device_state	state; | 
 | 551 | 	enum usb_device_speed	speed; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 552 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 553 | 	struct usb_tt	*tt; | 
 | 554 | 	int		ttport; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 555 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 556 | 	unsigned int toggle[2]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 557 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 558 | 	struct usb_device *parent; | 
 | 559 | 	struct usb_bus *bus; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 560 | 	struct usb_host_endpoint ep0; | 
 | 561 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 562 | 	struct device dev; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 563 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 564 | 	struct usb_device_descriptor descriptor; | 
| Andiry Xu | 3148bf0 | 2011-09-23 14:19:47 -0700 | [diff] [blame] | 565 | 	struct usb_host_bos *bos; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 566 | 	struct usb_host_config *config; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 567 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 568 | 	struct usb_host_config *actconfig; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 569 | 	struct usb_host_endpoint *ep_in[16]; | 
 | 570 | 	struct usb_host_endpoint *ep_out[16]; | 
 | 571 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 572 | 	char **rawdescriptors; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 573 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 574 | 	unsigned short bus_mA; | 
 | 575 | 	u8 portnum; | 
 | 576 | 	u8 level; | 
| Alan Stern | 55c5271 | 2005-11-23 12:03:12 -0500 | [diff] [blame] | 577 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 578 | 	unsigned can_submit:1; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 579 | 	unsigned persist_enabled:1; | 
 | 580 | 	unsigned have_langid:1; | 
 | 581 | 	unsigned authorized:1; | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 582 | 	unsigned authenticated:1; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 583 | 	unsigned wusb:1; | 
| Andiry Xu | 1ff4df5 | 2011-09-23 14:19:48 -0700 | [diff] [blame] | 584 | 	unsigned lpm_capable:1; | 
| Andiry Xu | 65580b43 | 2011-09-23 14:19:52 -0700 | [diff] [blame] | 585 | 	unsigned usb2_hw_lpm_capable:1; | 
| Mathias Nyman | a558ccd | 2013-05-23 17:14:30 +0300 | [diff] [blame] | 586 | 	unsigned usb2_hw_lpm_besl_capable:1; | 
| Andiry Xu | 65580b43 | 2011-09-23 14:19:52 -0700 | [diff] [blame] | 587 | 	unsigned usb2_hw_lpm_enabled:1; | 
| Sarah Sharp | de68bab | 2013-09-30 17:26:28 +0300 | [diff] [blame] | 588 | 	unsigned usb2_hw_lpm_allowed:1; | 
| Lu Baolu | bf5ce5b | 2015-11-14 16:26:32 +0800 | [diff] [blame] | 589 | 	unsigned usb3_lpm_u1_enabled:1; | 
 | 590 | 	unsigned usb3_lpm_u2_enabled:1; | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 591 | 	int string_langid; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 592 |  | 
| Alan Stern | 4f62efe | 2005-10-24 16:24:14 -0400 | [diff] [blame] | 593 | 	/* static strings from the device */ | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 594 | 	char *product; | 
 | 595 | 	char *manufacturer; | 
 | 596 | 	char *serial; | 
| Alan Stern | 4f62efe | 2005-10-24 16:24:14 -0400 | [diff] [blame] | 597 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 598 | 	struct list_head filelist; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 599 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 600 | 	int maxchild; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 601 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 602 | 	u32 quirks; | 
 | 603 | 	atomic_t urbnum; | 
| Alan Stern | b5e795f | 2007-02-20 15:00:53 -0500 | [diff] [blame] | 604 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 605 | 	unsigned long active_duration; | 
| Sarah Sharp | 1512300 | 2007-12-21 16:54:15 -0800 | [diff] [blame] | 606 |  | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 607 | #ifdef CONFIG_PM | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 608 | 	unsigned long connect_time; | 
| Alan Stern | b5e795f | 2007-02-20 15:00:53 -0500 | [diff] [blame] | 609 |  | 
| Randy Dunlap | f476fba | 2008-02-13 18:33:15 -0800 | [diff] [blame] | 610 | 	unsigned do_remote_wakeup:1; | 
 | 611 | 	unsigned reset_resume:1; | 
| Alan Stern | bfd1e91 | 2012-10-19 11:03:39 -0400 | [diff] [blame] | 612 | 	unsigned port_is_suspended:1; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 613 | #endif | 
| Inaky Perez-Gonzalez | b1d8dfb | 2008-04-08 13:24:46 -0700 | [diff] [blame] | 614 | 	struct wusb_dev *wusb_dev; | 
| Sarah Sharp | c651527 | 2009-04-27 19:57:26 -0700 | [diff] [blame] | 615 | 	int slot_id; | 
| Matthew Garrett | 0846e7e | 2012-02-03 17:11:54 -0500 | [diff] [blame] | 616 | 	enum usb_device_removable removable; | 
| Mathias Nyman | 17f3486 | 2013-05-23 17:14:31 +0300 | [diff] [blame] | 617 | 	struct usb2_lpm_parameters l1_params; | 
| Sarah Sharp | 51e0a01 | 2012-02-20 12:02:19 -0800 | [diff] [blame] | 618 | 	struct usb3_lpm_parameters u1_params; | 
 | 619 | 	struct usb3_lpm_parameters u2_params; | 
| Sarah Sharp | 1ea7e0e | 2012-04-24 17:21:50 -0700 | [diff] [blame] | 620 | 	unsigned lpm_disable_count; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 621 | }; | 
 | 622 | #define	to_usb_device(d) container_of(d, struct usb_device, dev) | 
 | 623 |  | 
| Matthew Wilcox | 1e42901 | 2010-04-30 13:11:30 -0600 | [diff] [blame] | 624 | static inline struct usb_device *interface_to_usbdev(struct usb_interface *intf) | 
 | 625 | { | 
 | 626 | 	return to_usb_device(intf->dev.parent); | 
 | 627 | } | 
 | 628 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 629 | extern struct usb_device *usb_get_dev(struct usb_device *dev); | 
 | 630 | extern void usb_put_dev(struct usb_device *dev); | 
| Lan Tianyu | ff823c79 | 2012-09-05 13:44:32 +0800 | [diff] [blame] | 631 | extern struct usb_device *usb_hub_find_child(struct usb_device *hdev, | 
 | 632 | 	int port1); | 
 | 633 |  | 
 | 634 | /** | 
 | 635 |  * usb_hub_for_each_child - iterate over all child devices on the hub | 
 | 636 |  * @hdev:  USB device belonging to the usb hub | 
 | 637 |  * @port1: portnum associated with child device | 
 | 638 |  * @child: child device pointer | 
 | 639 |  */ | 
 | 640 | #define usb_hub_for_each_child(hdev, port1, child) \ | 
 | 641 | 	for (port1 = 1,	child =	usb_hub_find_child(hdev, port1); \ | 
| Alan Stern | 969ddcf | 2012-10-19 11:03:02 -0400 | [diff] [blame] | 642 | 			port1 <= hdev->maxchild; \ | 
 | 643 | 			child = usb_hub_find_child(hdev, ++port1)) \ | 
 | 644 | 		if (!child) continue; else | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 645 |  | 
| Alan Stern | 9ad3d6c | 2005-11-17 17:10:32 -0500 | [diff] [blame] | 646 | /* USB device locking */ | 
| Oliver Neukum | 7dd9cba | 2016-01-21 15:18:47 +0100 | [diff] [blame] | 647 | #define usb_lock_device(udev)			device_lock(&(udev)->dev) | 
 | 648 | #define usb_unlock_device(udev)			device_unlock(&(udev)->dev) | 
 | 649 | #define usb_lock_device_interruptible(udev)	device_lock_interruptible(&(udev)->dev) | 
 | 650 | #define usb_trylock_device(udev)		device_trylock(&(udev)->dev) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 651 | 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] | 652 | 				     const struct usb_interface *iface); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 653 |  | 
 | 654 | /* USB port reset for device reinitialization */ | 
 | 655 | extern int usb_reset_device(struct usb_device *dev); | 
| Inaky Perez-Gonzalez | dc023dc | 2008-11-13 10:31:35 -0800 | [diff] [blame] | 656 | extern void usb_queue_reset_device(struct usb_interface *dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 657 |  | 
| Lan Tianyu | f7ac778 | 2012-09-05 13:44:36 +0800 | [diff] [blame] | 658 | #ifdef CONFIG_ACPI | 
 | 659 | extern int usb_acpi_set_power_state(struct usb_device *hdev, int index, | 
 | 660 | 	bool enable); | 
 | 661 | extern bool usb_acpi_power_manageable(struct usb_device *hdev, int index); | 
 | 662 | #else | 
 | 663 | static inline int usb_acpi_set_power_state(struct usb_device *hdev, int index, | 
 | 664 | 	bool enable) { return 0; } | 
 | 665 | static inline bool usb_acpi_power_manageable(struct usb_device *hdev, int index) | 
 | 666 | 	{ return true; } | 
 | 667 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 668 |  | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 669 | /* USB autosuspend and autoresume */ | 
| Rafael J. Wysocki | ceb6c9c | 2014-11-29 23:47:05 +0100 | [diff] [blame] | 670 | #ifdef CONFIG_PM | 
| Alan Stern | 9e18c82 | 2010-04-02 13:22:09 -0400 | [diff] [blame] | 671 | extern void usb_enable_autosuspend(struct usb_device *udev); | 
 | 672 | extern void usb_disable_autosuspend(struct usb_device *udev); | 
| Alan Stern | 088f7fe | 2010-01-08 12:56:54 -0500 | [diff] [blame] | 673 |  | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 674 | extern int usb_autopm_get_interface(struct usb_interface *intf); | 
 | 675 | extern void usb_autopm_put_interface(struct usb_interface *intf); | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 676 | extern int usb_autopm_get_interface_async(struct usb_interface *intf); | 
 | 677 | extern void usb_autopm_put_interface_async(struct usb_interface *intf); | 
| Alan Stern | 9bbdf1e | 2010-01-08 12:57:28 -0500 | [diff] [blame] | 678 | extern void usb_autopm_get_interface_no_resume(struct usb_interface *intf); | 
 | 679 | extern void usb_autopm_put_interface_no_suspend(struct usb_interface *intf); | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 680 |  | 
| Alan Stern | 1941044 | 2007-03-27 13:33:59 -0400 | [diff] [blame] | 681 | static inline void usb_mark_last_busy(struct usb_device *udev) | 
 | 682 | { | 
| Ming Lei | 6ddf27c | 2010-11-15 15:57:30 -0500 | [diff] [blame] | 683 | 	pm_runtime_mark_last_busy(&udev->dev); | 
| Alan Stern | 1941044 | 2007-03-27 13:33:59 -0400 | [diff] [blame] | 684 | } | 
 | 685 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 686 | #else | 
 | 687 |  | 
| Alan Stern | 088f7fe | 2010-01-08 12:56:54 -0500 | [diff] [blame] | 688 | static inline int usb_enable_autosuspend(struct usb_device *udev) | 
 | 689 | { return 0; } | 
 | 690 | static inline int usb_disable_autosuspend(struct usb_device *udev) | 
 | 691 | { return 0; } | 
 | 692 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 693 | static inline int usb_autopm_get_interface(struct usb_interface *intf) | 
 | 694 | { return 0; } | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 695 | static inline int usb_autopm_get_interface_async(struct usb_interface *intf) | 
 | 696 | { return 0; } | 
 | 697 |  | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 698 | static inline void usb_autopm_put_interface(struct usb_interface *intf) | 
 | 699 | { } | 
| Alan Stern | 9ac39f2 | 2008-11-12 16:19:49 -0500 | [diff] [blame] | 700 | static inline void usb_autopm_put_interface_async(struct usb_interface *intf) | 
 | 701 | { } | 
| Alan Stern | 8e4ceb3 | 2009-12-07 13:01:37 -0500 | [diff] [blame] | 702 | static inline void usb_autopm_get_interface_no_resume( | 
 | 703 | 		struct usb_interface *intf) | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 704 | { } | 
| Alan Stern | 8e4ceb3 | 2009-12-07 13:01:37 -0500 | [diff] [blame] | 705 | static inline void usb_autopm_put_interface_no_suspend( | 
 | 706 | 		struct usb_interface *intf) | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 707 | { } | 
| Alan Stern | 1941044 | 2007-03-27 13:33:59 -0400 | [diff] [blame] | 708 | static inline void usb_mark_last_busy(struct usb_device *udev) | 
 | 709 | { } | 
| Alan Stern | 692a186 | 2006-10-30 17:07:51 -0500 | [diff] [blame] | 710 | #endif | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 711 |  | 
| Sarah Sharp | e9261fb | 2012-05-21 08:29:01 -0700 | [diff] [blame] | 712 | extern int usb_disable_lpm(struct usb_device *udev); | 
 | 713 | extern void usb_enable_lpm(struct usb_device *udev); | 
 | 714 | /* Same as above, but these functions lock/unlock the bandwidth_mutex. */ | 
 | 715 | extern int usb_unlocked_disable_lpm(struct usb_device *udev); | 
 | 716 | extern void usb_unlocked_enable_lpm(struct usb_device *udev); | 
 | 717 |  | 
| Sarah Sharp | f74631e | 2012-06-25 12:08:08 -0700 | [diff] [blame] | 718 | extern int usb_disable_ltm(struct usb_device *udev); | 
 | 719 | extern void usb_enable_ltm(struct usb_device *udev); | 
 | 720 |  | 
| Sarah Sharp | 024f117 | 2012-07-05 17:17:24 -0700 | [diff] [blame] | 721 | static inline bool usb_device_supports_ltm(struct usb_device *udev) | 
 | 722 | { | 
| Oliver Neukum | dd80b54 | 2016-04-20 15:39:11 +0200 | [diff] [blame] | 723 | 	if (udev->speed < USB_SPEED_SUPER || !udev->bos || !udev->bos->ss_cap) | 
| Sarah Sharp | 024f117 | 2012-07-05 17:17:24 -0700 | [diff] [blame] | 724 | 		return false; | 
 | 725 | 	return udev->bos->ss_cap->bmAttributes & USB_LTM_SUPPORT; | 
 | 726 | } | 
 | 727 |  | 
| Ming Lei | bcc48f1 | 2013-08-08 21:48:22 +0800 | [diff] [blame] | 728 | static inline bool usb_device_no_sg_constraint(struct usb_device *udev) | 
 | 729 | { | 
 | 730 | 	return udev && udev->bus && udev->bus->no_sg_constraint; | 
 | 731 | } | 
 | 732 |  | 
| Sarah Sharp | 024f117 | 2012-07-05 17:17:24 -0700 | [diff] [blame] | 733 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 734 | /*-------------------------------------------------------------------------*/ | 
 | 735 |  | 
 | 736 | /* for drivers using iso endpoints */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 737 | extern int usb_get_current_frame_number(struct usb_device *usb_dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 738 |  | 
| Sarah Sharp | eab1caf | 2010-04-05 10:55:58 -0700 | [diff] [blame] | 739 | /* Sets up a group of bulk endpoints to support multiple stream IDs. */ | 
 | 740 | extern int usb_alloc_streams(struct usb_interface *interface, | 
 | 741 | 		struct usb_host_endpoint **eps, unsigned int num_eps, | 
 | 742 | 		unsigned int num_streams, gfp_t mem_flags); | 
 | 743 |  | 
 | 744 | /* Reverts a group of bulk endpoints back to not using stream IDs. */ | 
| Hans de Goede | 6c74dad | 2013-08-30 14:03:59 +0200 | [diff] [blame] | 745 | extern int usb_free_streams(struct usb_interface *interface, | 
| Sarah Sharp | eab1caf | 2010-04-05 10:55:58 -0700 | [diff] [blame] | 746 | 		struct usb_host_endpoint **eps, unsigned int num_eps, | 
 | 747 | 		gfp_t mem_flags); | 
 | 748 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 749 | /* used these for multi-interface device registration */ | 
 | 750 | extern int usb_driver_claim_interface(struct usb_driver *driver, | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 751 | 			struct usb_interface *iface, void *priv); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 752 |  | 
 | 753 | /** | 
 | 754 |  * usb_interface_claimed - returns true iff an interface is claimed | 
 | 755 |  * @iface: the interface being checked | 
 | 756 |  * | 
| Yacine Belkadi | 626f090 | 2013-08-02 20:10:04 +0200 | [diff] [blame] | 757 |  * Return: %true (nonzero) iff the interface is claimed, else %false | 
 | 758 |  * (zero). | 
 | 759 |  * | 
 | 760 |  * Note: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 761 |  * Callers must own the driver model's usb bus readlock.  So driver | 
 | 762 |  * probe() entries don't need extra locking, but other call contexts | 
 | 763 |  * may need to explicitly claim that lock. | 
 | 764 |  * | 
 | 765 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 766 | static inline int usb_interface_claimed(struct usb_interface *iface) | 
 | 767 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 768 | 	return (iface->dev.driver != NULL); | 
 | 769 | } | 
 | 770 |  | 
 | 771 | extern void usb_driver_release_interface(struct usb_driver *driver, | 
 | 772 | 			struct usb_interface *iface); | 
 | 773 | const struct usb_device_id *usb_match_id(struct usb_interface *interface, | 
 | 774 | 					 const struct usb_device_id *id); | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 775 | extern int usb_match_one_id(struct usb_interface *interface, | 
 | 776 | 			    const struct usb_device_id *id); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 777 |  | 
| Julius Werner | 9b79091 | 2013-05-17 12:08:51 -0700 | [diff] [blame] | 778 | extern int usb_for_each_dev(void *data, int (*fn)(struct usb_device *, void *)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 779 | extern struct usb_interface *usb_find_interface(struct usb_driver *drv, | 
 | 780 | 		int minor); | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 781 | 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] | 782 | 		unsigned ifnum); | 
 | 783 | extern struct usb_host_interface *usb_altnum_to_altsetting( | 
| Luiz Fernando N. Capitulino | 095bc33 | 2006-08-26 23:48:11 -0300 | [diff] [blame] | 784 | 		const struct usb_interface *intf, unsigned int altnum); | 
| Sarah Sharp | 91017f9 | 2009-12-03 09:44:34 -0800 | [diff] [blame] | 785 | extern struct usb_host_interface *usb_find_alt_setting( | 
 | 786 | 		struct usb_host_config *config, | 
 | 787 | 		unsigned int iface_num, | 
 | 788 | 		unsigned int alt_num); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 789 |  | 
| Valentina Manea | 6080cd0 | 2014-03-08 14:53:34 +0200 | [diff] [blame] | 790 | /* port claiming functions */ | 
 | 791 | int usb_hub_claim_port(struct usb_device *hdev, unsigned port1, | 
| Valentina Manea | 9b6f0c4 | 2014-03-10 10:36:40 +0200 | [diff] [blame] | 792 | 		struct usb_dev_state *owner); | 
| Valentina Manea | 6080cd0 | 2014-03-08 14:53:34 +0200 | [diff] [blame] | 793 | int usb_hub_release_port(struct usb_device *hdev, unsigned port1, | 
| Valentina Manea | 9b6f0c4 | 2014-03-10 10:36:40 +0200 | [diff] [blame] | 794 | 		struct usb_dev_state *owner); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 795 |  | 
 | 796 | /** | 
 | 797 |  * usb_make_path - returns stable device path in the usb tree | 
 | 798 |  * @dev: the device whose path is being constructed | 
 | 799 |  * @buf: where to put the string | 
 | 800 |  * @size: how big is "buf"? | 
 | 801 |  * | 
| Yacine Belkadi | 626f090 | 2013-08-02 20:10:04 +0200 | [diff] [blame] | 802 |  * Return: Length of the string (> 0) or negative if size was too small. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 803 |  * | 
| Yacine Belkadi | 626f090 | 2013-08-02 20:10:04 +0200 | [diff] [blame] | 804 |  * Note: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 805 |  * This identifier is intended to be "stable", reflecting physical paths in | 
 | 806 |  * hardware such as physical bus addresses for host controllers or ports on | 
 | 807 |  * USB hubs.  That makes it stay the same until systems are physically | 
 | 808 |  * reconfigured, by re-cabling a tree of USB devices or by moving USB host | 
 | 809 |  * controllers.  Adding and removing devices, including virtual root hubs | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 810 |  * in host controller driver modules, does not change these path identifiers; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 811 |  * neither does rebooting or re-enumerating.  These are more useful identifiers | 
 | 812 |  * than changeable ("unstable") ones like bus numbers or device addresses. | 
 | 813 |  * | 
 | 814 |  * With a partial exception for devices connected to USB 2.0 root hubs, these | 
 | 815 |  * identifiers are also predictable.  So long as the device tree isn't changed, | 
 | 816 |  * plugging any USB device into a given hub port always gives it the same path. | 
 | 817 |  * Because of the use of "companion" controllers, devices connected to ports on | 
 | 818 |  * USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are | 
 | 819 |  * high speed, and a different one if they are full or low speed. | 
 | 820 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 821 | 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] | 822 | { | 
 | 823 | 	int actual; | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 824 | 	actual = snprintf(buf, size, "usb-%s-%s", dev->bus->bus_name, | 
 | 825 | 			  dev->devpath); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 826 | 	return (actual >= (int)size) ? -1 : actual; | 
 | 827 | } | 
 | 828 |  | 
 | 829 | /*-------------------------------------------------------------------------*/ | 
 | 830 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 831 | #define USB_DEVICE_ID_MATCH_DEVICE \ | 
 | 832 | 		(USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT) | 
 | 833 | #define USB_DEVICE_ID_MATCH_DEV_RANGE \ | 
 | 834 | 		(USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI) | 
 | 835 | #define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ | 
 | 836 | 		(USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 837 | #define USB_DEVICE_ID_MATCH_DEV_INFO \ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 838 | 		(USB_DEVICE_ID_MATCH_DEV_CLASS | \ | 
 | 839 | 		USB_DEVICE_ID_MATCH_DEV_SUBCLASS | \ | 
 | 840 | 		USB_DEVICE_ID_MATCH_DEV_PROTOCOL) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 841 | #define USB_DEVICE_ID_MATCH_INT_INFO \ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 842 | 		(USB_DEVICE_ID_MATCH_INT_CLASS | \ | 
 | 843 | 		USB_DEVICE_ID_MATCH_INT_SUBCLASS | \ | 
 | 844 | 		USB_DEVICE_ID_MATCH_INT_PROTOCOL) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 845 |  | 
 | 846 | /** | 
 | 847 |  * USB_DEVICE - macro used to describe a specific usb device | 
 | 848 |  * @vend: the 16 bit USB Vendor ID | 
 | 849 |  * @prod: the 16 bit USB Product ID | 
 | 850 |  * | 
 | 851 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 852 |  * specific device. | 
 | 853 |  */ | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 854 | #define USB_DEVICE(vend, prod) \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 855 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE, \ | 
 | 856 | 	.idVendor = (vend), \ | 
 | 857 | 	.idProduct = (prod) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 858 | /** | 
| Randy Dunlap | d0bcabc | 2008-02-29 22:03:07 -0800 | [diff] [blame] | 859 |  * USB_DEVICE_VER - describe a specific usb device with a version range | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 860 |  * @vend: the 16 bit USB Vendor ID | 
 | 861 |  * @prod: the 16 bit USB Product ID | 
 | 862 |  * @lo: the bcdDevice_lo value | 
 | 863 |  * @hi: the bcdDevice_hi value | 
 | 864 |  * | 
 | 865 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 866 |  * specific device, with a version range. | 
 | 867 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 868 | #define USB_DEVICE_VER(vend, prod, lo, hi) \ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 869 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 870 | 	.idVendor = (vend), \ | 
 | 871 | 	.idProduct = (prod), \ | 
 | 872 | 	.bcdDevice_lo = (lo), \ | 
 | 873 | 	.bcdDevice_hi = (hi) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 874 |  | 
 | 875 | /** | 
| Bjørn Mork | 17b72fe | 2012-10-31 06:08:39 +0100 | [diff] [blame] | 876 |  * USB_DEVICE_INTERFACE_CLASS - describe a usb device with a specific interface class | 
 | 877 |  * @vend: the 16 bit USB Vendor ID | 
 | 878 |  * @prod: the 16 bit USB Product ID | 
 | 879 |  * @cl: bInterfaceClass value | 
 | 880 |  * | 
 | 881 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 882 |  * specific interface class of devices. | 
 | 883 |  */ | 
 | 884 | #define USB_DEVICE_INTERFACE_CLASS(vend, prod, cl) \ | 
 | 885 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | 
 | 886 | 		       USB_DEVICE_ID_MATCH_INT_CLASS, \ | 
 | 887 | 	.idVendor = (vend), \ | 
 | 888 | 	.idProduct = (prod), \ | 
 | 889 | 	.bInterfaceClass = (cl) | 
 | 890 |  | 
 | 891 | /** | 
| Randy Dunlap | d0bcabc | 2008-02-29 22:03:07 -0800 | [diff] [blame] | 892 |  * 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] | 893 |  * @vend: the 16 bit USB Vendor ID | 
 | 894 |  * @prod: the 16 bit USB Product ID | 
 | 895 |  * @pr: bInterfaceProtocol value | 
 | 896 |  * | 
 | 897 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 898 |  * specific interface protocol of devices. | 
 | 899 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 900 | #define USB_DEVICE_INTERFACE_PROTOCOL(vend, prod, pr) \ | 
 | 901 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | 
 | 902 | 		       USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ | 
| Jan Kratochvil | f836ac8 | 2007-05-09 00:26:15 -0400 | [diff] [blame] | 903 | 	.idVendor = (vend), \ | 
 | 904 | 	.idProduct = (prod), \ | 
 | 905 | 	.bInterfaceProtocol = (pr) | 
 | 906 |  | 
 | 907 | /** | 
| Bjørn Mork | 81df2d5 | 2012-05-18 21:27:43 +0200 | [diff] [blame] | 908 |  * USB_DEVICE_INTERFACE_NUMBER - describe a usb device with a specific interface number | 
 | 909 |  * @vend: the 16 bit USB Vendor ID | 
 | 910 |  * @prod: the 16 bit USB Product ID | 
 | 911 |  * @num: bInterfaceNumber value | 
 | 912 |  * | 
 | 913 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 914 |  * specific interface number of devices. | 
 | 915 |  */ | 
 | 916 | #define USB_DEVICE_INTERFACE_NUMBER(vend, prod, num) \ | 
 | 917 | 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | 
 | 918 | 		       USB_DEVICE_ID_MATCH_INT_NUMBER, \ | 
 | 919 | 	.idVendor = (vend), \ | 
 | 920 | 	.idProduct = (prod), \ | 
 | 921 | 	.bInterfaceNumber = (num) | 
 | 922 |  | 
 | 923 | /** | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 924 |  * USB_DEVICE_INFO - macro used to describe a class of usb devices | 
 | 925 |  * @cl: bDeviceClass value | 
 | 926 |  * @sc: bDeviceSubClass value | 
 | 927 |  * @pr: bDeviceProtocol value | 
 | 928 |  * | 
 | 929 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 930 |  * specific class of devices. | 
 | 931 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 932 | #define USB_DEVICE_INFO(cl, sc, pr) \ | 
 | 933 | 	.match_flags = USB_DEVICE_ID_MATCH_DEV_INFO, \ | 
 | 934 | 	.bDeviceClass = (cl), \ | 
 | 935 | 	.bDeviceSubClass = (sc), \ | 
 | 936 | 	.bDeviceProtocol = (pr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 937 |  | 
 | 938 | /** | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 939 |  * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 940 |  * @cl: bInterfaceClass value | 
 | 941 |  * @sc: bInterfaceSubClass value | 
 | 942 |  * @pr: bInterfaceProtocol value | 
 | 943 |  * | 
 | 944 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 945 |  * specific class of interfaces. | 
 | 946 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 947 | #define USB_INTERFACE_INFO(cl, sc, pr) \ | 
 | 948 | 	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, \ | 
 | 949 | 	.bInterfaceClass = (cl), \ | 
 | 950 | 	.bInterfaceSubClass = (sc), \ | 
 | 951 | 	.bInterfaceProtocol = (pr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 952 |  | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 953 | /** | 
| Randy Dunlap | d0bcabc | 2008-02-29 22:03:07 -0800 | [diff] [blame] | 954 |  * 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] | 955 |  * @vend: the 16 bit USB Vendor ID | 
 | 956 |  * @prod: the 16 bit USB Product ID | 
 | 957 |  * @cl: bInterfaceClass value | 
 | 958 |  * @sc: bInterfaceSubClass value | 
 | 959 |  * @pr: bInterfaceProtocol value | 
 | 960 |  * | 
 | 961 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 962 |  * specific device with a specific class of interfaces. | 
 | 963 |  * | 
 | 964 |  * This is especially useful when explicitly matching devices that have | 
 | 965 |  * vendor specific bDeviceClass values, but standards-compliant interfaces. | 
 | 966 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 967 | #define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, cl, sc, pr) \ | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 968 | 	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ | 
 | 969 | 		| USB_DEVICE_ID_MATCH_DEVICE, \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 970 | 	.idVendor = (vend), \ | 
 | 971 | 	.idProduct = (prod), \ | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 972 | 	.bInterfaceClass = (cl), \ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 973 | 	.bInterfaceSubClass = (sc), \ | 
 | 974 | 	.bInterfaceProtocol = (pr) | 
| Daniel Drake | 8538f96 | 2007-05-10 00:32:24 +0100 | [diff] [blame] | 975 |  | 
| Gustavo Padovan | d81a5d1 | 2012-07-10 19:10:06 -0300 | [diff] [blame] | 976 | /** | 
 | 977 |  * USB_VENDOR_AND_INTERFACE_INFO - describe a specific usb vendor with a class of usb interfaces | 
 | 978 |  * @vend: the 16 bit USB Vendor ID | 
 | 979 |  * @cl: bInterfaceClass value | 
 | 980 |  * @sc: bInterfaceSubClass value | 
 | 981 |  * @pr: bInterfaceProtocol value | 
 | 982 |  * | 
 | 983 |  * This macro is used to create a struct usb_device_id that matches a | 
 | 984 |  * specific vendor with a specific class of interfaces. | 
 | 985 |  * | 
 | 986 |  * This is especially useful when explicitly matching devices that have | 
 | 987 |  * vendor specific bDeviceClass values, but standards-compliant interfaces. | 
 | 988 |  */ | 
 | 989 | #define USB_VENDOR_AND_INTERFACE_INFO(vend, cl, sc, pr) \ | 
 | 990 | 	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ | 
 | 991 | 		| USB_DEVICE_ID_MATCH_VENDOR, \ | 
 | 992 | 	.idVendor = (vend), \ | 
 | 993 | 	.bInterfaceClass = (cl), \ | 
 | 994 | 	.bInterfaceSubClass = (sc), \ | 
 | 995 | 	.bInterfaceProtocol = (pr) | 
 | 996 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 997 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 998 |  | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 999 | /* Stuff for dynamic usb ids */ | 
| Greg Kroah-Hartman | 733260f | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 1000 | struct usb_dynids { | 
 | 1001 | 	spinlock_t lock; | 
 | 1002 | 	struct list_head list; | 
 | 1003 | }; | 
 | 1004 |  | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 1005 | struct usb_dynid { | 
 | 1006 | 	struct list_head node; | 
 | 1007 | 	struct usb_device_id id; | 
 | 1008 | }; | 
 | 1009 |  | 
 | 1010 | extern ssize_t usb_store_new_id(struct usb_dynids *dynids, | 
| Wolfram Sang | 2fc82c2 | 2014-01-10 19:36:42 +0100 | [diff] [blame] | 1011 | 				const struct usb_device_id *id_table, | 
| Greg Kroah-Hartman | 93bacef | 2006-12-17 21:50:23 +0100 | [diff] [blame] | 1012 | 				struct device_driver *driver, | 
 | 1013 | 				const char *buf, size_t count); | 
 | 1014 |  | 
| Bjørn Mork | ef206f3 | 2012-05-13 12:35:00 +0200 | [diff] [blame] | 1015 | extern ssize_t usb_show_dynids(struct usb_dynids *dynids, char *buf); | 
 | 1016 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1017 | /** | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1018 |  * struct usbdrv_wrap - wrapper for driver-model structure | 
 | 1019 |  * @driver: The driver-model core driver structure. | 
 | 1020 |  * @for_devices: Non-zero for device drivers, 0 for interface drivers. | 
 | 1021 |  */ | 
 | 1022 | struct usbdrv_wrap { | 
 | 1023 | 	struct device_driver driver; | 
 | 1024 | 	int for_devices; | 
 | 1025 | }; | 
 | 1026 |  | 
 | 1027 | /** | 
 | 1028 |  * struct usb_driver - identifies USB interface driver to usbcore | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1029 |  * @name: The driver name should be unique among USB drivers, | 
 | 1030 |  *	and should normally be the same as the module name. | 
 | 1031 |  * @probe: Called to see if the driver is willing to manage a particular | 
 | 1032 |  *	interface on a device.  If it is, probe returns zero and uses | 
| Oliver Neukum | 7ef4f06 | 2008-04-10 15:15:37 +0200 | [diff] [blame] | 1033 |  *	usb_set_intfdata() to associate driver-specific data with the | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1034 |  *	interface.  It may also use usb_set_interface() to specify the | 
 | 1035 |  *	appropriate altsetting.  If unwilling to manage the interface, | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 1036 |  *	return -ENODEV, if genuine IO errors occurred, an appropriate | 
| Oliver Neukum | 7ef4f06 | 2008-04-10 15:15:37 +0200 | [diff] [blame] | 1037 |  *	negative errno value. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1038 |  * @disconnect: Called when the interface is no longer accessible, usually | 
 | 1039 |  *	because its device has been (or is being) disconnected or the | 
 | 1040 |  *	driver module is being unloaded. | 
| Randy Dunlap | a91be2a | 2010-10-25 15:04:13 -0700 | [diff] [blame] | 1041 |  * @unlocked_ioctl: Used for drivers that want to talk to userspace through | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1042 |  *	the "usbfs" filesystem.  This lets devices provide ways to | 
 | 1043 |  *	expose information to user space regardless of where they | 
 | 1044 |  *	do (or don't) show up otherwise in the filesystem. | 
| Ming Lei | 303f084 | 2013-03-15 12:08:53 +0800 | [diff] [blame] | 1045 |  * @suspend: Called when the device is going to be suspended by the | 
 | 1046 |  *	system either from system sleep or runtime suspend context. The | 
 | 1047 |  *	return value will be ignored in system sleep context, so do NOT | 
 | 1048 |  *	try to continue using the device if suspend fails in this case. | 
 | 1049 |  *	Instead, let the resume or reset-resume routine recover from | 
 | 1050 |  *	the failure. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1051 |  * @resume: Called when the device is being resumed by the system. | 
| Alan Stern | f07600c | 2007-05-30 15:38:16 -0400 | [diff] [blame] | 1052 |  * @reset_resume: Called when the suspended device has been reset instead | 
 | 1053 |  *	of being resumed. | 
| Alan Stern | 6498d9d | 2011-04-28 10:45:24 -0400 | [diff] [blame] | 1054 |  * @pre_reset: Called by usb_reset_device() when the device is about to be | 
 | 1055 |  *	reset.  This routine must not return until the driver has no active | 
 | 1056 |  *	URBs for the device, and no more URBs may be submitted until the | 
 | 1057 |  *	post_reset method is called. | 
| Ming Lei | 742120c | 2008-06-18 22:00:29 +0800 | [diff] [blame] | 1058 |  * @post_reset: Called by usb_reset_device() after the device | 
| Oliver Neukum | 7ef4f06 | 2008-04-10 15:15:37 +0200 | [diff] [blame] | 1059 |  *	has been reset | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1060 |  * @id_table: USB drivers use ID table to support hotplugging. | 
 | 1061 |  *	Export this with MODULE_DEVICE_TABLE(usb,...).  This must be set | 
 | 1062 |  *	or your driver's probe function will never get called. | 
| Greg Kroah-Hartman | 733260f | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 1063 |  * @dynids: used internally to hold the list of dynamically added device | 
 | 1064 |  *	ids for this driver. | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1065 |  * @drvwrap: Driver-model core structure wrapper. | 
| Greg Kroah-Hartman | ba9dc65 | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 1066 |  * @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be | 
 | 1067 |  *	added to this driver by preventing the sysfs file from being created. | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 1068 |  * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend | 
 | 1069 |  *	for interfaces bound to this driver. | 
| Alan Stern | 9da82bd | 2008-05-08 11:54:37 -0400 | [diff] [blame] | 1070 |  * @soft_unbind: if set to 1, the USB core will not kill URBs and disable | 
 | 1071 |  *	endpoints before calling the driver's disconnect method. | 
| Sarah Sharp | 8afa408 | 2012-04-23 10:08:51 -0700 | [diff] [blame] | 1072 |  * @disable_hub_initiated_lpm: if set to 0, the USB core will not allow hubs | 
 | 1073 |  *	to initiate lower power link state transitions when an idle timeout | 
 | 1074 |  *	occurs.  Device-initiated USB 3.0 link PM will still be allowed. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1075 |  * | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1076 |  * USB interface drivers must provide a name, probe() and disconnect() | 
 | 1077 |  * methods, and an id_table.  Other driver fields are optional. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1078 |  * | 
 | 1079 |  * The id_table is used in hotplugging.  It holds a set of descriptors, | 
 | 1080 |  * and specialized data may be associated with each entry.  That table | 
 | 1081 |  * is used by both user and kernel mode hotplugging support. | 
 | 1082 |  * | 
 | 1083 |  * The probe() and disconnect() methods are called in a context where | 
 | 1084 |  * they can sleep, but they should avoid abusing the privilege.  Most | 
 | 1085 |  * work to connect to a device should be done when the device is opened, | 
 | 1086 |  * and undone at the last close.  The disconnect code needs to address | 
 | 1087 |  * concurrency issues with respect to open() and close() methods, as | 
 | 1088 |  * well as forcing all pending I/O requests to complete (by unlinking | 
 | 1089 |  * them as necessary, and blocking until the unlinks complete). | 
 | 1090 |  */ | 
 | 1091 | struct usb_driver { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1092 | 	const char *name; | 
 | 1093 |  | 
 | 1094 | 	int (*probe) (struct usb_interface *intf, | 
 | 1095 | 		      const struct usb_device_id *id); | 
 | 1096 |  | 
 | 1097 | 	void (*disconnect) (struct usb_interface *intf); | 
 | 1098 |  | 
| Andi Kleen | c532b29 | 2010-06-01 23:04:41 +0200 | [diff] [blame] | 1099 | 	int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code, | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1100 | 			void *buf); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1101 |  | 
| David Brownell | 27d72e8 | 2005-04-18 17:39:22 -0700 | [diff] [blame] | 1102 | 	int (*suspend) (struct usb_interface *intf, pm_message_t message); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1103 | 	int (*resume) (struct usb_interface *intf); | 
| Alan Stern | f07600c | 2007-05-30 15:38:16 -0400 | [diff] [blame] | 1104 | 	int (*reset_resume)(struct usb_interface *intf); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1105 |  | 
| Alan Stern | f07600c | 2007-05-30 15:38:16 -0400 | [diff] [blame] | 1106 | 	int (*pre_reset)(struct usb_interface *intf); | 
 | 1107 | 	int (*post_reset)(struct usb_interface *intf); | 
| Alan Stern | 79efa09 | 2006-06-01 13:33:42 -0400 | [diff] [blame] | 1108 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1109 | 	const struct usb_device_id *id_table; | 
 | 1110 |  | 
| Greg Kroah-Hartman | 733260f | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 1111 | 	struct usb_dynids dynids; | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1112 | 	struct usbdrv_wrap drvwrap; | 
| Greg Kroah-Hartman | ba9dc65 | 2005-11-16 13:41:28 -0800 | [diff] [blame] | 1113 | 	unsigned int no_dynamic_id:1; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 1114 | 	unsigned int supports_autosuspend:1; | 
| Sarah Sharp | 8afa408 | 2012-04-23 10:08:51 -0700 | [diff] [blame] | 1115 | 	unsigned int disable_hub_initiated_lpm:1; | 
| Alan Stern | 9da82bd | 2008-05-08 11:54:37 -0400 | [diff] [blame] | 1116 | 	unsigned int soft_unbind:1; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1117 | }; | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1118 | #define	to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver) | 
 | 1119 |  | 
 | 1120 | /** | 
 | 1121 |  * struct usb_device_driver - identifies USB device driver to usbcore | 
 | 1122 |  * @name: The driver name should be unique among USB drivers, | 
 | 1123 |  *	and should normally be the same as the module name. | 
 | 1124 |  * @probe: Called to see if the driver is willing to manage a particular | 
 | 1125 |  *	device.  If it is, probe returns zero and uses dev_set_drvdata() | 
 | 1126 |  *	to associate driver-specific data with the device.  If unwilling | 
 | 1127 |  *	to manage the device, return a negative errno value. | 
 | 1128 |  * @disconnect: Called when the device is no longer accessible, usually | 
 | 1129 |  *	because it has been (or is being) disconnected or the driver's | 
 | 1130 |  *	module is being unloaded. | 
 | 1131 |  * @suspend: Called when the device is going to be suspended by the system. | 
 | 1132 |  * @resume: Called when the device is being resumed by the system. | 
 | 1133 |  * @drvwrap: Driver-model core structure wrapper. | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 1134 |  * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend | 
 | 1135 |  *	for devices bound to this driver. | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1136 |  * | 
 | 1137 |  * USB drivers must provide all the fields listed above except drvwrap. | 
 | 1138 |  */ | 
 | 1139 | struct usb_device_driver { | 
 | 1140 | 	const char *name; | 
 | 1141 |  | 
 | 1142 | 	int (*probe) (struct usb_device *udev); | 
 | 1143 | 	void (*disconnect) (struct usb_device *udev); | 
 | 1144 |  | 
 | 1145 | 	int (*suspend) (struct usb_device *udev, pm_message_t message); | 
| Alan Stern | 65bfd29 | 2008-11-25 16:39:18 -0500 | [diff] [blame] | 1146 | 	int (*resume) (struct usb_device *udev, pm_message_t message); | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1147 | 	struct usbdrv_wrap drvwrap; | 
| Alan Stern | 645daaa | 2006-08-30 15:47:02 -0400 | [diff] [blame] | 1148 | 	unsigned int supports_autosuspend:1; | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1149 | }; | 
 | 1150 | #define	to_usb_device_driver(d) container_of(d, struct usb_device_driver, \ | 
 | 1151 | 		drvwrap.driver) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1152 |  | 
 | 1153 | extern struct bus_type usb_bus_type; | 
 | 1154 |  | 
 | 1155 | /** | 
 | 1156 |  * 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] | 1157 |  * @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] | 1158 |  * @devnode: Callback to provide a naming hint for a possible | 
| Randy Dunlap | e376bbb | 2009-06-18 10:39:11 -0700 | [diff] [blame] | 1159 |  *	device node to create. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1160 |  * @fops: pointer to the struct file_operations of this driver. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1161 |  * @minor_base: the start of the minor range for this driver. | 
 | 1162 |  * | 
 | 1163 |  * This structure is used for the usb_register_dev() and | 
 | 1164 |  * usb_unregister_dev() functions, to consolidate a number of the | 
 | 1165 |  * parameters used for them. | 
 | 1166 |  */ | 
 | 1167 | struct usb_class_driver { | 
 | 1168 | 	char *name; | 
| Al Viro | 2c9ede5 | 2011-07-23 20:24:48 -0400 | [diff] [blame] | 1169 | 	char *(*devnode)(struct device *dev, umode_t *mode); | 
| Arjan van de Ven | 99ac48f | 2006-03-28 01:56:41 -0800 | [diff] [blame] | 1170 | 	const struct file_operations *fops; | 
| Greg Kroah-Hartman | d6e5bcf | 2005-06-20 21:15:16 -0700 | [diff] [blame] | 1171 | 	int minor_base; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1172 | }; | 
 | 1173 |  | 
 | 1174 | /* | 
 | 1175 |  * use these in module_init()/module_exit() | 
 | 1176 |  * and don't forget MODULE_DEVICE_TABLE(usb, ...) | 
 | 1177 |  */ | 
| Greg Kroah-Hartman | 80f745f | 2007-01-15 11:50:02 -0800 | [diff] [blame] | 1178 | extern int usb_register_driver(struct usb_driver *, struct module *, | 
 | 1179 | 			       const char *); | 
| Paul Gortmaker | eb5589a | 2011-05-27 09:02:11 -0400 | [diff] [blame] | 1180 |  | 
 | 1181 | /* use a define to avoid include chaining to get THIS_MODULE & friends */ | 
 | 1182 | #define usb_register(driver) \ | 
 | 1183 | 	usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME) | 
 | 1184 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1185 | extern void usb_deregister(struct usb_driver *); | 
 | 1186 |  | 
| Greg Kroah-Hartman | f3a6a4b | 2011-11-17 14:38:33 -0800 | [diff] [blame] | 1187 | /** | 
 | 1188 |  * module_usb_driver() - Helper macro for registering a USB driver | 
 | 1189 |  * @__usb_driver: usb_driver struct | 
 | 1190 |  * | 
 | 1191 |  * Helper macro for USB drivers which do not do anything special in module | 
 | 1192 |  * init/exit. This eliminates a lot of boilerplate. Each module may only | 
 | 1193 |  * use this macro once, and calling it replaces module_init() and module_exit() | 
 | 1194 |  */ | 
 | 1195 | #define module_usb_driver(__usb_driver) \ | 
 | 1196 | 	module_driver(__usb_driver, usb_register, \ | 
 | 1197 | 		       usb_deregister) | 
 | 1198 |  | 
| Alan Stern | 8bb54ab | 2006-07-01 22:08:49 -0400 | [diff] [blame] | 1199 | extern int usb_register_device_driver(struct usb_device_driver *, | 
 | 1200 | 			struct module *); | 
 | 1201 | extern void usb_deregister_device_driver(struct usb_device_driver *); | 
 | 1202 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1203 | extern int usb_register_dev(struct usb_interface *intf, | 
 | 1204 | 			    struct usb_class_driver *class_driver); | 
 | 1205 | extern void usb_deregister_dev(struct usb_interface *intf, | 
 | 1206 | 			       struct usb_class_driver *class_driver); | 
 | 1207 |  | 
 | 1208 | extern int usb_disabled(void); | 
 | 1209 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1210 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1211 |  | 
 | 1212 | /* | 
 | 1213 |  * URB support, for asynchronous request completions | 
 | 1214 |  */ | 
 | 1215 |  | 
 | 1216 | /* | 
 | 1217 |  * urb->transfer_flags: | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1218 |  * | 
 | 1219 |  * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb(). | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1220 |  */ | 
 | 1221 | #define URB_SHORT_NOT_OK	0x0001	/* report short reads as errors */ | 
| Alan Stern | a03bede | 2012-10-01 10:31:53 -0400 | [diff] [blame] | 1222 | #define URB_ISO_ASAP		0x0002	/* iso-only; use the first unexpired | 
 | 1223 | 					 * slot in the schedule */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1224 | #define URB_NO_TRANSFER_DMA_MAP	0x0004	/* urb->transfer_dma valid on submit */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1225 | #define URB_NO_FSBR		0x0020	/* UHCI-specific */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1226 | #define URB_ZERO_PACKET		0x0040	/* Finish bulk OUT with short packet */ | 
 | 1227 | #define URB_NO_INTERRUPT	0x0080	/* HINT: no non-error interrupt | 
 | 1228 | 					 * needed */ | 
| Marcel Holtmann | 8b3b01c | 2007-06-13 08:02:11 +0200 | [diff] [blame] | 1229 | #define URB_FREE_BUFFER		0x0100	/* Free transfer buffer with the URB */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1230 |  | 
| Alan Stern | ff9c895 | 2010-04-02 13:27:28 -0400 | [diff] [blame] | 1231 | /* The following flags are used internally by usbcore and HCDs */ | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1232 | #define URB_DIR_IN		0x0200	/* Transfer from device to host */ | 
 | 1233 | #define URB_DIR_OUT		0 | 
 | 1234 | #define URB_DIR_MASK		URB_DIR_IN | 
 | 1235 |  | 
| Alan Stern | ff9c895 | 2010-04-02 13:27:28 -0400 | [diff] [blame] | 1236 | #define URB_DMA_MAP_SINGLE	0x00010000	/* Non-scatter-gather mapping */ | 
 | 1237 | #define URB_DMA_MAP_PAGE	0x00020000	/* HCD-unsupported S-G */ | 
 | 1238 | #define URB_DMA_MAP_SG		0x00040000	/* HCD-supported S-G */ | 
 | 1239 | #define URB_MAP_LOCAL		0x00080000	/* HCD-local-memory mapping */ | 
 | 1240 | #define URB_SETUP_MAP_SINGLE	0x00100000	/* Setup packet DMA mapped */ | 
 | 1241 | #define URB_SETUP_MAP_LOCAL	0x00200000	/* HCD-local setup packet */ | 
 | 1242 | #define URB_DMA_SG_COMBINED	0x00400000	/* S-G entries were combined */ | 
| Robert Morell | 2694a48 | 2011-01-26 19:06:48 -0800 | [diff] [blame] | 1243 | #define URB_ALIGNED_TEMP_BUFFER	0x00800000	/* Temp buffer was alloc'd */ | 
| Alan Stern | ff9c895 | 2010-04-02 13:27:28 -0400 | [diff] [blame] | 1244 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1245 | struct usb_iso_packet_descriptor { | 
 | 1246 | 	unsigned int offset; | 
 | 1247 | 	unsigned int length;		/* expected length */ | 
 | 1248 | 	unsigned int actual_length; | 
| Pete Zaitcev | d1bbb60 | 2007-02-11 13:56:13 -0800 | [diff] [blame] | 1249 | 	int status; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1250 | }; | 
 | 1251 |  | 
 | 1252 | struct urb; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1253 |  | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1254 | struct usb_anchor { | 
 | 1255 | 	struct list_head urb_list; | 
 | 1256 | 	wait_queue_head_t wait; | 
 | 1257 | 	spinlock_t lock; | 
| Hans de Goede | 6ec4147 | 2013-10-09 17:01:41 +0200 | [diff] [blame] | 1258 | 	atomic_t suspend_wakeups; | 
| Oliver Neukum | 6a2839b | 2008-07-29 16:18:47 +0200 | [diff] [blame] | 1259 | 	unsigned int poisoned:1; | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1260 | }; | 
 | 1261 |  | 
 | 1262 | static inline void init_usb_anchor(struct usb_anchor *anchor) | 
 | 1263 | { | 
| Hans de Goede | 9ef73db | 2013-10-09 17:01:40 +0200 | [diff] [blame] | 1264 | 	memset(anchor, 0, sizeof(*anchor)); | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1265 | 	INIT_LIST_HEAD(&anchor->urb_list); | 
 | 1266 | 	init_waitqueue_head(&anchor->wait); | 
 | 1267 | 	spin_lock_init(&anchor->lock); | 
 | 1268 | } | 
 | 1269 |  | 
| David Howells | 7d12e78 | 2006-10-05 14:55:46 +0100 | [diff] [blame] | 1270 | typedef void (*usb_complete_t)(struct urb *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1271 |  | 
 | 1272 | /** | 
 | 1273 |  * struct urb - USB Request Block | 
 | 1274 |  * @urb_list: For use by current owner of the URB. | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1275 |  * @anchor_list: membership in the list of an anchor | 
 | 1276 |  * @anchor: to anchor URBs to a common mooring | 
| Alan Stern | 5b653c7 | 2007-07-30 17:04:37 -0400 | [diff] [blame] | 1277 |  * @ep: Points to the endpoint's data structure.  Will eventually | 
 | 1278 |  *	replace @pipe. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1279 |  * @pipe: Holds endpoint number, direction, type, and more. | 
 | 1280 |  *	Create these values with the eight macros available; | 
 | 1281 |  *	usb_{snd,rcv}TYPEpipe(dev,endpoint), where the TYPE is "ctrl" | 
 | 1282 |  *	(control), "bulk", "int" (interrupt), or "iso" (isochronous). | 
 | 1283 |  *	For example usb_sndbulkpipe() or usb_rcvintpipe().  Endpoint | 
 | 1284 |  *	numbers range from zero to fifteen.  Note that "in" endpoint two | 
 | 1285 |  *	is a different endpoint (and pipe) from "out" endpoint two. | 
 | 1286 |  *	The current configuration controls the existence, type, and | 
 | 1287 |  *	maximum packet size of any given endpoint. | 
| Randy Dunlap | c6ba1c2 | 2010-07-29 15:54:38 -0700 | [diff] [blame] | 1288 |  * @stream_id: the endpoint's stream ID for bulk streams | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1289 |  * @dev: Identifies the USB device to perform the request. | 
 | 1290 |  * @status: This is read in non-iso completion functions to get the | 
 | 1291 |  *	status of the particular request.  ISO requests only use it | 
 | 1292 |  *	to tell whether the URB was unlinked; detailed status for | 
 | 1293 |  *	each frame is in the fields of the iso_frame-desc. | 
 | 1294 |  * @transfer_flags: A variety of flags may be used to affect how URB | 
 | 1295 |  *	submission, unlinking, or operation are handled.  Different | 
 | 1296 |  *	kinds of URB can use different flags. | 
| Pete Zaitcev | 4e9e920 | 2009-06-11 08:53:20 -0600 | [diff] [blame] | 1297 |  * @transfer_buffer:  This identifies the buffer to (or from) which the I/O | 
 | 1298 |  *	request will be performed unless URB_NO_TRANSFER_DMA_MAP is set | 
 | 1299 |  *	(however, do not leave garbage in transfer_buffer even then). | 
 | 1300 |  *	This buffer must be suitable for DMA; allocate it with | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1301 |  *	kmalloc() or equivalent.  For transfers to "in" endpoints, contents | 
 | 1302 |  *	of this buffer will be modified.  This buffer is used for the data | 
 | 1303 |  *	stage of control transfers. | 
 | 1304 |  * @transfer_dma: When transfer_flags includes URB_NO_TRANSFER_DMA_MAP, | 
 | 1305 |  *	the device driver is saying that it provided this DMA address, | 
 | 1306 |  *	which the host controller driver should use in preference to the | 
 | 1307 |  *	transfer_buffer. | 
| Ming Lei | 10e232c | 2013-06-28 09:38:12 +0800 | [diff] [blame] | 1308 |  * @sg: scatter gather buffer list, the buffer size of each element in | 
 | 1309 |  * 	the list (except the last) must be divisible by the endpoint's | 
| Ming Lei | bcc48f1 | 2013-08-08 21:48:22 +0800 | [diff] [blame] | 1310 |  * 	max packet size if no_sg_constraint isn't set in 'struct usb_bus' | 
| Randy Dunlap | 4d92261 | 2012-01-21 11:02:56 -0800 | [diff] [blame] | 1311 |  * @num_mapped_sgs: (internal) number of mapped sg entries | 
| Randy Dunlap | e376bbb | 2009-06-18 10:39:11 -0700 | [diff] [blame] | 1312 |  * @num_sgs: number of entries in the sg list | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1313 |  * @transfer_buffer_length: How big is transfer_buffer.  The transfer may | 
 | 1314 |  *	be broken up into chunks according to the current maximum packet | 
 | 1315 |  *	size for the endpoint, which is a function of the configuration | 
 | 1316 |  *	and is encoded in the pipe.  When the length is zero, neither | 
 | 1317 |  *	transfer_buffer nor transfer_dma is used. | 
 | 1318 |  * @actual_length: This is read in non-iso completion functions, and | 
 | 1319 |  *	it tells how many bytes (out of transfer_buffer_length) were | 
 | 1320 |  *	transferred.  It will normally be the same as requested, unless | 
 | 1321 |  *	either an error was reported or a short read was performed. | 
 | 1322 |  *	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] | 1323 |  *	short reads be reported as errors. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1324 |  * @setup_packet: Only used for control transfers, this points to eight bytes | 
 | 1325 |  *	of setup data.  Control transfers always start by sending this data | 
 | 1326 |  *	to the device.  Then transfer_buffer is read or written, if needed. | 
| Alan Stern | 85bcb5e | 2010-04-30 16:35:37 -0400 | [diff] [blame] | 1327 |  * @setup_dma: DMA pointer for the setup packet.  The caller must not use | 
 | 1328 |  *	this field; setup_packet must point to a valid buffer. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1329 |  * @start_frame: Returns the initial frame for isochronous transfers. | 
 | 1330 |  * @number_of_packets: Lists the number of ISO transfer buffers. | 
 | 1331 |  * @interval: Specifies the polling interval for interrupt or isochronous | 
| Anand Gadiyar | 411c940 | 2009-07-07 15:24:23 +0530 | [diff] [blame] | 1332 |  *	transfers.  The units are frames (milliseconds) for full and low | 
| Matthew Wilcox | f09a15e | 2010-03-16 12:55:44 -0700 | [diff] [blame] | 1333 |  *	speed devices, and microframes (1/8 millisecond) for highspeed | 
 | 1334 |  *	and SuperSpeed devices. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1335 |  * @error_count: Returns the number of ISO transfers that reported errors. | 
 | 1336 |  * @context: For use in completion functions.  This normally points to | 
 | 1337 |  *	request-specific driver context. | 
 | 1338 |  * @complete: Completion handler. This URB is passed as the parameter to the | 
 | 1339 |  *	completion function.  The completion function may then do what | 
 | 1340 |  *	it likes with the URB, including resubmitting or freeing it. | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1341 |  * @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] | 1342 |  *	collect the transfer status for each buffer. | 
 | 1343 |  * | 
 | 1344 |  * This structure identifies USB transfer requests.  URBs must be allocated by | 
 | 1345 |  * calling usb_alloc_urb() and freed with a call to usb_free_urb(). | 
 | 1346 |  * Initialization may be done using various usb_fill_*_urb() functions.  URBs | 
 | 1347 |  * are submitted using usb_submit_urb(), and pending requests may be canceled | 
 | 1348 |  * using usb_unlink_urb() or usb_kill_urb(). | 
 | 1349 |  * | 
 | 1350 |  * Data Transfer Buffers: | 
 | 1351 |  * | 
 | 1352 |  * Normally drivers provide I/O buffers allocated with kmalloc() or otherwise | 
 | 1353 |  * taken from the general page pool.  That is provided by transfer_buffer | 
 | 1354 |  * (control requests also use setup_packet), and host controller drivers | 
 | 1355 |  * perform a dma mapping (and unmapping) for each buffer transferred.  Those | 
 | 1356 |  * mapping operations can be expensive on some platforms (perhaps using a dma | 
 | 1357 |  * bounce buffer or talking to an IOMMU), | 
 | 1358 |  * although they're cheap on commodity x86 and ppc hardware. | 
 | 1359 |  * | 
| Alan Stern | 85bcb5e | 2010-04-30 16:35:37 -0400 | [diff] [blame] | 1360 |  * Alternatively, drivers may pass the URB_NO_TRANSFER_DMA_MAP transfer flag, | 
 | 1361 |  * which tells the host controller driver that no such mapping is needed for | 
 | 1362 |  * the transfer_buffer since | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1363 |  * the device driver is DMA-aware.  For example, a device driver might | 
| Daniel Mack | 073900a | 2010-04-12 13:17:25 +0200 | [diff] [blame] | 1364 |  * allocate a DMA buffer with usb_alloc_coherent() or call usb_buffer_map(). | 
| Alan Stern | 85bcb5e | 2010-04-30 16:35:37 -0400 | [diff] [blame] | 1365 |  * When this transfer flag is provided, host controller drivers will | 
 | 1366 |  * attempt to use the dma address found in the transfer_dma | 
 | 1367 |  * field rather than determining a dma address themselves. | 
| Pete Zaitcev | 4e9e920 | 2009-06-11 08:53:20 -0600 | [diff] [blame] | 1368 |  * | 
 | 1369 |  * Note that transfer_buffer must still be set if the controller | 
 | 1370 |  * does not support DMA (as indicated by bus.uses_dma) and when talking | 
 | 1371 |  * to root hub. If you have to trasfer between highmem zone and the device | 
 | 1372 |  * on such controller, create a bounce buffer or bail out with an error. | 
 | 1373 |  * If transfer_buffer cannot be set (is in highmem) and the controller is DMA | 
 | 1374 |  * capable, assign NULL to it, so that usbmon knows not to use the value. | 
 | 1375 |  * 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] | 1376 |  * | 
 | 1377 |  * Initialization: | 
 | 1378 |  * | 
 | 1379 |  * All URBs submitted must initialize the dev, pipe, transfer_flags (may be | 
| Alan Stern | b375a04 | 2005-07-29 16:11:07 -0400 | [diff] [blame] | 1380 |  * zero), and complete fields.  All URBs must also initialize | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1381 |  * transfer_buffer and transfer_buffer_length.  They may provide the | 
 | 1382 |  * URB_SHORT_NOT_OK transfer flag, indicating that short reads are | 
 | 1383 |  * to be treated as errors; that flag is invalid for write requests. | 
 | 1384 |  * | 
 | 1385 |  * Bulk URBs may | 
 | 1386 |  * use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers | 
 | 1387 |  * should always terminate with a short packet, even if it means adding an | 
 | 1388 |  * extra zero length packet. | 
 | 1389 |  * | 
| Alan Stern | 85bcb5e | 2010-04-30 16:35:37 -0400 | [diff] [blame] | 1390 |  * Control URBs must provide a valid pointer in the setup_packet field. | 
 | 1391 |  * Unlike the transfer_buffer, the setup_packet may not be mapped for DMA | 
 | 1392 |  * beforehand. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1393 |  * | 
 | 1394 |  * Interrupt URBs must provide an interval, saying how often (in milliseconds | 
 | 1395 |  * or, for highspeed devices, 125 microsecond units) | 
 | 1396 |  * to poll for transfers.  After the URB has been submitted, the interval | 
 | 1397 |  * field reflects how the transfer was actually scheduled. | 
 | 1398 |  * The polling interval may be more frequent than requested. | 
 | 1399 |  * For example, some controllers have a maximum interval of 32 milliseconds, | 
 | 1400 |  * while others support intervals of up to 1024 milliseconds. | 
 | 1401 |  * Isochronous URBs also have transfer intervals.  (Note that for isochronous | 
 | 1402 |  * endpoints, as well as high speed interrupt endpoints, the encoding of | 
 | 1403 |  * the transfer interval in the endpoint descriptor is logarithmic. | 
 | 1404 |  * Device drivers must convert that value to linear units themselves.) | 
 | 1405 |  * | 
| Alan Stern | a03bede | 2012-10-01 10:31:53 -0400 | [diff] [blame] | 1406 |  * If an isochronous endpoint queue isn't already running, the host | 
 | 1407 |  * controller will schedule a new URB to start as soon as bandwidth | 
 | 1408 |  * utilization allows.  If the queue is running then a new URB will be | 
 | 1409 |  * scheduled to start in the first transfer slot following the end of the | 
 | 1410 |  * preceding URB, if that slot has not already expired.  If the slot has | 
 | 1411 |  * expired (which can happen when IRQ delivery is delayed for a long time), | 
 | 1412 |  * the scheduling behavior depends on the URB_ISO_ASAP flag.  If the flag | 
 | 1413 |  * is clear then the URB will be scheduled to start in the expired slot, | 
 | 1414 |  * implying that some of its packets will not be transferred; if the flag | 
 | 1415 |  * is set then the URB will be scheduled in the first unexpired slot, | 
 | 1416 |  * breaking the queue's synchronization.  Upon URB completion, the | 
 | 1417 |  * start_frame field will be set to the (micro)frame number in which the | 
 | 1418 |  * transfer was scheduled.  Ranges for frame counter values are HC-specific | 
 | 1419 |  * and can go from as low as 256 to as high as 65536 frames. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1420 |  * | 
 | 1421 |  * Isochronous URBs have a different data transfer model, in part because | 
 | 1422 |  * the quality of service is only "best effort".  Callers provide specially | 
 | 1423 |  * allocated URBs, with number_of_packets worth of iso_frame_desc structures | 
 | 1424 |  * at the end.  Each such packet is an individual ISO transfer.  Isochronous | 
 | 1425 |  * URBs are normally queued, submitted by drivers to arrange that | 
 | 1426 |  * transfers are at least double buffered, and then explicitly resubmitted | 
 | 1427 |  * in completion handlers, so | 
 | 1428 |  * that data (such as audio or video) streams at as constant a rate as the | 
 | 1429 |  * host controller scheduler can support. | 
 | 1430 |  * | 
 | 1431 |  * Completion Callbacks: | 
 | 1432 |  * | 
 | 1433 |  * The completion callback is made in_interrupt(), and one of the first | 
 | 1434 |  * things that a completion handler should do is check the status field. | 
 | 1435 |  * The status field is provided for all URBs.  It is used to report | 
 | 1436 |  * unlinked URBs, and status for all non-ISO transfers.  It should not | 
 | 1437 |  * be examined before the URB is returned to the completion handler. | 
 | 1438 |  * | 
 | 1439 |  * The context field is normally used to link URBs back to the relevant | 
 | 1440 |  * driver or request state. | 
 | 1441 |  * | 
 | 1442 |  * When the completion callback is invoked for non-isochronous URBs, the | 
 | 1443 |  * actual_length field tells how many bytes were transferred.  This field | 
 | 1444 |  * is updated even when the URB terminated with an error or was unlinked. | 
 | 1445 |  * | 
 | 1446 |  * ISO transfer status is reported in the status and actual_length fields | 
 | 1447 |  * of the iso_frame_desc array, and the number of errors is reported in | 
 | 1448 |  * error_count.  Completion callbacks for ISO transfers will normally | 
 | 1449 |  * (re)submit URBs to ensure a constant transfer rate. | 
| Roman Kagan | 719df46 | 2005-05-06 00:55:56 +0400 | [diff] [blame] | 1450 |  * | 
 | 1451 |  * Note that even fields marked "public" should not be touched by the driver | 
 | 1452 |  * when the urb is owned by the hcd, that is, since the call to | 
 | 1453 |  * usb_submit_urb() till the entry into the completion routine. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1454 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1455 | struct urb { | 
| Martin Waitz | aeec46b | 2005-11-13 16:08:13 -0800 | [diff] [blame] | 1456 | 	/* private: usb core and host controller only fields in the urb */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1457 | 	struct kref kref;		/* reference count of the URB */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1458 | 	void *hcpriv;			/* private data for host controller */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1459 | 	atomic_t use_count;		/* concurrent submissions counter */ | 
| Ming Lei | 49367d8 | 2008-12-12 21:38:45 +0800 | [diff] [blame] | 1460 | 	atomic_t reject;		/* submissions will fail */ | 
| Alan Stern | eb23105 | 2007-08-21 15:40:36 -0400 | [diff] [blame] | 1461 | 	int unlinked;			/* unlink error code */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1462 |  | 
| Martin Waitz | aeec46b | 2005-11-13 16:08:13 -0800 | [diff] [blame] | 1463 | 	/* public: documented fields in the urb that can be used by drivers */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1464 | 	struct list_head urb_list;	/* list head for use by the urb's | 
 | 1465 | 					 * current owner */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1466 | 	struct list_head anchor_list;	/* the URB may be anchored */ | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1467 | 	struct usb_anchor *anchor; | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1468 | 	struct usb_device *dev;		/* (in) pointer to associated device */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1469 | 	struct usb_host_endpoint *ep;	/* (internal) pointer to endpoint */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1470 | 	unsigned int pipe;		/* (in) pipe information */ | 
| Sarah Sharp | 94af122 | 2010-04-02 15:34:10 -0700 | [diff] [blame] | 1471 | 	unsigned int stream_id;		/* (in) stream ID */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1472 | 	int status;			/* (return) non-ISO status */ | 
 | 1473 | 	unsigned int transfer_flags;	/* (in) URB_SHORT_NOT_OK | ...*/ | 
 | 1474 | 	void *transfer_buffer;		/* (in) associated data buffer */ | 
 | 1475 | 	dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */ | 
| Matthew Wilcox | 910f8d0 | 2010-05-01 12:20:01 -0600 | [diff] [blame] | 1476 | 	struct scatterlist *sg;		/* (in) scatter gather buffer list */ | 
| Clemens Ladisch | bc677d5 | 2011-12-03 23:41:31 +0100 | [diff] [blame] | 1477 | 	int num_mapped_sgs;		/* (internal) mapped sg entries */ | 
| Sarah Sharp | e04748e | 2009-04-27 19:59:01 -0700 | [diff] [blame] | 1478 | 	int num_sgs;			/* (in) number of entries in the sg list */ | 
| Greg Kroah-Hartman | 16e2e5f | 2009-03-03 16:44:13 -0800 | [diff] [blame] | 1479 | 	u32 transfer_buffer_length;	/* (in) data buffer length */ | 
| Greg Kroah-Hartman | 8c209e6 | 2009-03-06 21:31:03 -0800 | [diff] [blame] | 1480 | 	u32 actual_length;		/* (return) actual transfer length */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1481 | 	unsigned char *setup_packet;	/* (in) setup packet (control only) */ | 
 | 1482 | 	dma_addr_t setup_dma;		/* (in) dma addr for setup_packet */ | 
 | 1483 | 	int start_frame;		/* (modify) start frame (ISO) */ | 
 | 1484 | 	int number_of_packets;		/* (in) number of ISO packets */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1485 | 	int interval;			/* (modify) transfer interval | 
 | 1486 | 					 * (INT/ISO) */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1487 | 	int error_count;		/* (return) number of ISO errors */ | 
 | 1488 | 	void *context;			/* (in) context for completion */ | 
 | 1489 | 	usb_complete_t complete;	/* (in) completion routine */ | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1490 | 	struct usb_iso_packet_descriptor iso_frame_desc[0]; | 
 | 1491 | 					/* (in) ISO ONLY */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1492 | }; | 
 | 1493 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1494 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1495 |  | 
 | 1496 | /** | 
 | 1497 |  * usb_fill_control_urb - initializes a control urb | 
 | 1498 |  * @urb: pointer to the urb to initialize. | 
 | 1499 |  * @dev: pointer to the struct usb_device for this urb. | 
 | 1500 |  * @pipe: the endpoint pipe | 
 | 1501 |  * @setup_packet: pointer to the setup_packet buffer | 
 | 1502 |  * @transfer_buffer: pointer to the transfer buffer | 
 | 1503 |  * @buffer_length: length of the transfer buffer | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1504 |  * @complete_fn: pointer to the usb_complete_t function | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1505 |  * @context: what to set the urb context to. | 
 | 1506 |  * | 
 | 1507 |  * Initializes a control urb with the proper information needed to submit | 
 | 1508 |  * it to a device. | 
 | 1509 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1510 | static inline void usb_fill_control_urb(struct urb *urb, | 
 | 1511 | 					struct usb_device *dev, | 
 | 1512 | 					unsigned int pipe, | 
 | 1513 | 					unsigned char *setup_packet, | 
 | 1514 | 					void *transfer_buffer, | 
 | 1515 | 					int buffer_length, | 
 | 1516 | 					usb_complete_t complete_fn, | 
 | 1517 | 					void *context) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1518 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1519 | 	urb->dev = dev; | 
 | 1520 | 	urb->pipe = pipe; | 
 | 1521 | 	urb->setup_packet = setup_packet; | 
 | 1522 | 	urb->transfer_buffer = transfer_buffer; | 
 | 1523 | 	urb->transfer_buffer_length = buffer_length; | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1524 | 	urb->complete = complete_fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1525 | 	urb->context = context; | 
 | 1526 | } | 
 | 1527 |  | 
 | 1528 | /** | 
 | 1529 |  * usb_fill_bulk_urb - macro to help initialize a bulk urb | 
 | 1530 |  * @urb: pointer to the urb to initialize. | 
 | 1531 |  * @dev: pointer to the struct usb_device for this urb. | 
 | 1532 |  * @pipe: the endpoint pipe | 
 | 1533 |  * @transfer_buffer: pointer to the transfer buffer | 
 | 1534 |  * @buffer_length: length of the transfer buffer | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1535 |  * @complete_fn: pointer to the usb_complete_t function | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1536 |  * @context: what to set the urb context to. | 
 | 1537 |  * | 
 | 1538 |  * Initializes a bulk urb with the proper information needed to submit it | 
 | 1539 |  * to a device. | 
 | 1540 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1541 | static inline void usb_fill_bulk_urb(struct urb *urb, | 
 | 1542 | 				     struct usb_device *dev, | 
 | 1543 | 				     unsigned int pipe, | 
 | 1544 | 				     void *transfer_buffer, | 
 | 1545 | 				     int buffer_length, | 
 | 1546 | 				     usb_complete_t complete_fn, | 
 | 1547 | 				     void *context) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1548 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1549 | 	urb->dev = dev; | 
 | 1550 | 	urb->pipe = pipe; | 
 | 1551 | 	urb->transfer_buffer = transfer_buffer; | 
 | 1552 | 	urb->transfer_buffer_length = buffer_length; | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1553 | 	urb->complete = complete_fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1554 | 	urb->context = context; | 
 | 1555 | } | 
 | 1556 |  | 
 | 1557 | /** | 
 | 1558 |  * usb_fill_int_urb - macro to help initialize a interrupt urb | 
 | 1559 |  * @urb: pointer to the urb to initialize. | 
 | 1560 |  * @dev: pointer to the struct usb_device for this urb. | 
 | 1561 |  * @pipe: the endpoint pipe | 
 | 1562 |  * @transfer_buffer: pointer to the transfer buffer | 
 | 1563 |  * @buffer_length: length of the transfer buffer | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1564 |  * @complete_fn: pointer to the usb_complete_t function | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1565 |  * @context: what to set the urb context to. | 
 | 1566 |  * @interval: what to set the urb interval to, encoded like | 
 | 1567 |  *	the endpoint descriptor's bInterval value. | 
 | 1568 |  * | 
 | 1569 |  * Initializes a interrupt urb with the proper information needed to submit | 
 | 1570 |  * it to a device. | 
| Matthew Wilcox | f09a15e | 2010-03-16 12:55:44 -0700 | [diff] [blame] | 1571 |  * | 
| Oliver Neukum | fca504f | 2016-04-20 15:39:12 +0200 | [diff] [blame^] | 1572 |  * Note that High Speed and SuperSpeed(+) interrupt endpoints use a logarithmic | 
| Matthew Wilcox | f09a15e | 2010-03-16 12:55:44 -0700 | [diff] [blame] | 1573 |  * encoding of the endpoint interval, and express polling intervals in | 
 | 1574 |  * microframes (eight per millisecond) rather than in frames (one per | 
 | 1575 |  * millisecond). | 
 | 1576 |  * | 
 | 1577 |  * Wireless USB also uses the logarithmic encoding, but specifies it in units of | 
 | 1578 |  * 128us instead of 125us.  For Wireless USB devices, the interval is passed | 
 | 1579 |  * through to the host controller, rather than being translated into microframe | 
 | 1580 |  * units. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1581 |  */ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1582 | static inline void usb_fill_int_urb(struct urb *urb, | 
 | 1583 | 				    struct usb_device *dev, | 
 | 1584 | 				    unsigned int pipe, | 
 | 1585 | 				    void *transfer_buffer, | 
 | 1586 | 				    int buffer_length, | 
 | 1587 | 				    usb_complete_t complete_fn, | 
 | 1588 | 				    void *context, | 
 | 1589 | 				    int interval) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1590 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1591 | 	urb->dev = dev; | 
 | 1592 | 	urb->pipe = pipe; | 
 | 1593 | 	urb->transfer_buffer = transfer_buffer; | 
 | 1594 | 	urb->transfer_buffer_length = buffer_length; | 
| Jesper Juhl | 3d5b251 | 2006-07-30 18:43:43 +0200 | [diff] [blame] | 1595 | 	urb->complete = complete_fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1596 | 	urb->context = context; | 
| Felipe Balbi | 42189d8 | 2013-07-02 10:50:15 +0300 | [diff] [blame] | 1597 |  | 
| Oliver Neukum | fca504f | 2016-04-20 15:39:12 +0200 | [diff] [blame^] | 1598 | 	if (dev->speed == USB_SPEED_HIGH || dev->speed >= USB_SPEED_SUPER) { | 
| Felipe Balbi | 42189d8 | 2013-07-02 10:50:15 +0300 | [diff] [blame] | 1599 | 		/* make sure interval is within allowed range */ | 
 | 1600 | 		interval = clamp(interval, 1, 16); | 
 | 1601 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1602 | 		urb->interval = 1 << (interval - 1); | 
| Felipe Balbi | 42189d8 | 2013-07-02 10:50:15 +0300 | [diff] [blame] | 1603 | 	} else { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1604 | 		urb->interval = interval; | 
| Felipe Balbi | 42189d8 | 2013-07-02 10:50:15 +0300 | [diff] [blame] | 1605 | 	} | 
 | 1606 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1607 | 	urb->start_frame = -1; | 
 | 1608 | } | 
 | 1609 |  | 
 | 1610 | extern void usb_init_urb(struct urb *urb); | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1611 | 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] | 1612 | extern void usb_free_urb(struct urb *urb); | 
 | 1613 | #define usb_put_urb usb_free_urb | 
 | 1614 | extern struct urb *usb_get_urb(struct urb *urb); | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1615 | extern int usb_submit_urb(struct urb *urb, gfp_t mem_flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1616 | extern int usb_unlink_urb(struct urb *urb); | 
 | 1617 | extern void usb_kill_urb(struct urb *urb); | 
| Oliver Neukum | 55b447b | 2008-07-29 15:26:15 +0200 | [diff] [blame] | 1618 | extern void usb_poison_urb(struct urb *urb); | 
 | 1619 | extern void usb_unpoison_urb(struct urb *urb); | 
| Oliver Neukum | 8815bb0 | 2012-04-30 09:13:46 +0200 | [diff] [blame] | 1620 | extern void usb_block_urb(struct urb *urb); | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1621 | extern void usb_kill_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | 6a2839b | 2008-07-29 16:18:47 +0200 | [diff] [blame] | 1622 | extern void usb_poison_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | 856395d | 2008-12-18 09:17:49 +0100 | [diff] [blame] | 1623 | extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor); | 
| Oliver Neukum | eda7695 | 2008-04-10 14:07:37 +0200 | [diff] [blame] | 1624 | extern void usb_unlink_anchored_urbs(struct usb_anchor *anchor); | 
| Hans de Goede | 6ec4147 | 2013-10-09 17:01:41 +0200 | [diff] [blame] | 1625 | extern void usb_anchor_suspend_wakeups(struct usb_anchor *anchor); | 
 | 1626 | extern void usb_anchor_resume_wakeups(struct usb_anchor *anchor); | 
| Oliver Neukum | 51a2f07 | 2007-05-25 13:40:56 +0200 | [diff] [blame] | 1627 | extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor); | 
 | 1628 | extern void usb_unanchor_urb(struct urb *urb); | 
 | 1629 | extern int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, | 
 | 1630 | 					 unsigned int timeout); | 
| Oliver Neukum | 1987625 | 2008-08-25 22:40:25 +0200 | [diff] [blame] | 1631 | extern struct urb *usb_get_from_anchor(struct usb_anchor *anchor); | 
 | 1632 | extern void usb_scuttle_anchored_urbs(struct usb_anchor *anchor); | 
 | 1633 | extern int usb_anchor_empty(struct usb_anchor *anchor); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1634 |  | 
| Oliver Neukum | 8815bb0 | 2012-04-30 09:13:46 +0200 | [diff] [blame] | 1635 | #define usb_unblock_urb	usb_unpoison_urb | 
 | 1636 |  | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1637 | /** | 
 | 1638 |  * usb_urb_dir_in - check if an URB describes an IN transfer | 
 | 1639 |  * @urb: URB to be checked | 
 | 1640 |  * | 
| Yacine Belkadi | 626f090 | 2013-08-02 20:10:04 +0200 | [diff] [blame] | 1641 |  * Return: 1 if @urb describes an IN transfer (device-to-host), | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1642 |  * otherwise 0. | 
 | 1643 |  */ | 
 | 1644 | static inline int usb_urb_dir_in(struct urb *urb) | 
 | 1645 | { | 
| Alan Stern | d617bc8 | 2007-08-02 15:04:52 -0400 | [diff] [blame] | 1646 | 	return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_IN; | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1647 | } | 
 | 1648 |  | 
 | 1649 | /** | 
 | 1650 |  * usb_urb_dir_out - check if an URB describes an OUT transfer | 
 | 1651 |  * @urb: URB to be checked | 
 | 1652 |  * | 
| Yacine Belkadi | 626f090 | 2013-08-02 20:10:04 +0200 | [diff] [blame] | 1653 |  * Return: 1 if @urb describes an OUT transfer (host-to-device), | 
| Alan Stern | fea3409 | 2007-07-30 17:06:16 -0400 | [diff] [blame] | 1654 |  * otherwise 0. | 
 | 1655 |  */ | 
 | 1656 | static inline int usb_urb_dir_out(struct urb *urb) | 
 | 1657 | { | 
 | 1658 | 	return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_OUT; | 
 | 1659 | } | 
 | 1660 |  | 
| Daniel Mack | 073900a | 2010-04-12 13:17:25 +0200 | [diff] [blame] | 1661 | void *usb_alloc_coherent(struct usb_device *dev, size_t size, | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1662 | 	gfp_t mem_flags, dma_addr_t *dma); | 
| Daniel Mack | 073900a | 2010-04-12 13:17:25 +0200 | [diff] [blame] | 1663 | void usb_free_coherent(struct usb_device *dev, size_t size, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1664 | 	void *addr, dma_addr_t dma); | 
 | 1665 |  | 
 | 1666 | #if 0 | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1667 | struct urb *usb_buffer_map(struct urb *urb); | 
 | 1668 | void usb_buffer_dmasync(struct urb *urb); | 
 | 1669 | void usb_buffer_unmap(struct urb *urb); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1670 | #endif | 
 | 1671 |  | 
 | 1672 | struct scatterlist; | 
| Alan Stern | 5e60a16 | 2007-07-30 17:07:21 -0400 | [diff] [blame] | 1673 | 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] | 1674 | 		      struct scatterlist *sg, int nents); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1675 | #if 0 | 
| Alan Stern | 5e60a16 | 2007-07-30 17:07:21 -0400 | [diff] [blame] | 1676 | 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] | 1677 | 			   struct scatterlist *sg, int n_hw_ents); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1678 | #endif | 
| Alan Stern | 5e60a16 | 2007-07-30 17:07:21 -0400 | [diff] [blame] | 1679 | 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] | 1680 | 			 struct scatterlist *sg, int n_hw_ents); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1681 |  | 
 | 1682 | /*-------------------------------------------------------------------* | 
 | 1683 |  *                         SYNCHRONOUS CALL SUPPORT                  * | 
 | 1684 |  *-------------------------------------------------------------------*/ | 
 | 1685 |  | 
 | 1686 | extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, | 
 | 1687 | 	__u8 request, __u8 requesttype, __u16 value, __u16 index, | 
 | 1688 | 	void *data, __u16 size, int timeout); | 
| Greg Kroah-Hartman | 782a7a6 | 2006-05-19 13:20:20 -0700 | [diff] [blame] | 1689 | extern int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, | 
 | 1690 | 	void *data, int len, int *actual_length, int timeout); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1691 | extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, | 
 | 1692 | 	void *data, int len, int *actual_length, | 
 | 1693 | 	int timeout); | 
 | 1694 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1695 | /* wrappers around usb_control_msg() for the most common standard requests */ | 
 | 1696 | extern int usb_get_descriptor(struct usb_device *dev, unsigned char desctype, | 
 | 1697 | 	unsigned char descindex, void *buf, int size); | 
 | 1698 | extern int usb_get_status(struct usb_device *dev, | 
 | 1699 | 	int type, int target, void *data); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1700 | extern int usb_string(struct usb_device *dev, int index, | 
 | 1701 | 	char *buf, size_t size); | 
 | 1702 |  | 
 | 1703 | /* wrappers that also update important state inside usbcore */ | 
 | 1704 | extern int usb_clear_halt(struct usb_device *dev, int pipe); | 
 | 1705 | extern int usb_reset_configuration(struct usb_device *dev); | 
 | 1706 | 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] | 1707 | extern void usb_reset_endpoint(struct usb_device *dev, unsigned int epaddr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1708 |  | 
| Alan Stern | 088dc27 | 2006-08-21 12:08:19 -0400 | [diff] [blame] | 1709 | /* this request isn't really synchronous, but it belongs with the others */ | 
 | 1710 | extern int usb_driver_set_configuration(struct usb_device *udev, int config); | 
 | 1711 |  | 
| Valentina Manea | b7945b7 | 2014-01-23 23:12:29 +0200 | [diff] [blame] | 1712 | /* choose and set configuration for device */ | 
 | 1713 | extern int usb_choose_configuration(struct usb_device *udev); | 
 | 1714 | extern int usb_set_configuration(struct usb_device *dev, int configuration); | 
 | 1715 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1716 | /* | 
 | 1717 |  * timeouts, in milliseconds, used for sending/receiving control messages | 
 | 1718 |  * they typically complete within a few frames (msec) after they're issued | 
 | 1719 |  * USB identifies 5 second timeouts, maybe more in a few cases, and a few | 
 | 1720 |  * slow devices (like some MGE Ellipse UPSes) actually push that limit. | 
 | 1721 |  */ | 
 | 1722 | #define USB_CTRL_GET_TIMEOUT	5000 | 
 | 1723 | #define USB_CTRL_SET_TIMEOUT	5000 | 
 | 1724 |  | 
 | 1725 |  | 
 | 1726 | /** | 
 | 1727 |  * struct usb_sg_request - support for scatter/gather I/O | 
 | 1728 |  * @status: zero indicates success, else negative errno | 
 | 1729 |  * @bytes: counts bytes transferred. | 
 | 1730 |  * | 
 | 1731 |  * These requests are initialized using usb_sg_init(), and then are used | 
 | 1732 |  * as request handles passed to usb_sg_wait() or usb_sg_cancel().  Most | 
 | 1733 |  * members of the request object aren't for driver access. | 
 | 1734 |  * | 
 | 1735 |  * The status and bytecount values are valid only after usb_sg_wait() | 
 | 1736 |  * returns.  If the status is zero, then the bytecount matches the total | 
 | 1737 |  * from the request. | 
 | 1738 |  * | 
 | 1739 |  * After an error completion, drivers may need to clear a halt condition | 
 | 1740 |  * on the endpoint. | 
 | 1741 |  */ | 
 | 1742 | struct usb_sg_request { | 
 | 1743 | 	int			status; | 
 | 1744 | 	size_t			bytes; | 
 | 1745 |  | 
| Randy Dunlap | bf92c19 | 2009-04-29 21:02:49 -0700 | [diff] [blame] | 1746 | 	/* private: | 
 | 1747 | 	 * members below are private to usbcore, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1748 | 	 * and are not provided for driver access! | 
 | 1749 | 	 */ | 
 | 1750 | 	spinlock_t		lock; | 
 | 1751 |  | 
 | 1752 | 	struct usb_device	*dev; | 
 | 1753 | 	int			pipe; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1754 |  | 
 | 1755 | 	int			entries; | 
 | 1756 | 	struct urb		**urbs; | 
 | 1757 |  | 
 | 1758 | 	int			count; | 
 | 1759 | 	struct completion	complete; | 
 | 1760 | }; | 
 | 1761 |  | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1762 | int usb_sg_init( | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1763 | 	struct usb_sg_request	*io, | 
 | 1764 | 	struct usb_device	*dev, | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1765 | 	unsigned		pipe, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1766 | 	unsigned		period, | 
 | 1767 | 	struct scatterlist	*sg, | 
 | 1768 | 	int			nents, | 
 | 1769 | 	size_t			length, | 
| Al Viro | 55016f1 | 2005-10-21 03:21:58 -0400 | [diff] [blame] | 1770 | 	gfp_t			mem_flags | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1771 | ); | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1772 | void usb_sg_cancel(struct usb_sg_request *io); | 
 | 1773 | void usb_sg_wait(struct usb_sg_request *io); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1774 |  | 
 | 1775 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1776 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1777 |  | 
 | 1778 | /* | 
 | 1779 |  * For various legacy reasons, Linux has a small cookie that's paired with | 
 | 1780 |  * a struct usb_device to identify an endpoint queue.  Queue characteristics | 
 | 1781 |  * are defined by the endpoint's descriptor.  This cookie is called a "pipe", | 
 | 1782 |  * an unsigned int encoded as: | 
 | 1783 |  * | 
 | 1784 |  *  - direction:	bit 7		(0 = Host-to-Device [Out], | 
 | 1785 |  *					 1 = Device-to-Host [In] ... | 
 | 1786 |  *					like endpoint bEndpointAddress) | 
 | 1787 |  *  - device address:	bits 8-14       ... bit positions known to uhci-hcd | 
 | 1788 |  *  - endpoint:		bits 15-18      ... bit positions known to uhci-hcd | 
 | 1789 |  *  - pipe type:	bits 30-31	(00 = isochronous, 01 = interrupt, | 
 | 1790 |  *					 10 = control, 11 = bulk) | 
 | 1791 |  * | 
 | 1792 |  * Given the device address and endpoint descriptor, pipes are redundant. | 
 | 1793 |  */ | 
 | 1794 |  | 
 | 1795 | /* NOTE:  these are not the standard USB_ENDPOINT_XFER_* values!! */ | 
 | 1796 | /* (yet ... they're the values used by usbfs) */ | 
 | 1797 | #define PIPE_ISOCHRONOUS		0 | 
 | 1798 | #define PIPE_INTERRUPT			1 | 
 | 1799 | #define PIPE_CONTROL			2 | 
 | 1800 | #define PIPE_BULK			3 | 
 | 1801 |  | 
 | 1802 | #define usb_pipein(pipe)	((pipe) & USB_DIR_IN) | 
 | 1803 | #define usb_pipeout(pipe)	(!usb_pipein(pipe)) | 
 | 1804 |  | 
 | 1805 | #define usb_pipedevice(pipe)	(((pipe) >> 8) & 0x7f) | 
 | 1806 | #define usb_pipeendpoint(pipe)	(((pipe) >> 15) & 0xf) | 
 | 1807 |  | 
 | 1808 | #define usb_pipetype(pipe)	(((pipe) >> 30) & 3) | 
 | 1809 | #define usb_pipeisoc(pipe)	(usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) | 
 | 1810 | #define usb_pipeint(pipe)	(usb_pipetype((pipe)) == PIPE_INTERRUPT) | 
 | 1811 | #define usb_pipecontrol(pipe)	(usb_pipetype((pipe)) == PIPE_CONTROL) | 
 | 1812 | #define usb_pipebulk(pipe)	(usb_pipetype((pipe)) == PIPE_BULK) | 
 | 1813 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1814 | static inline unsigned int __create_pipe(struct usb_device *dev, | 
 | 1815 | 		unsigned int endpoint) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1816 | { | 
 | 1817 | 	return (dev->devnum << 8) | (endpoint << 15); | 
 | 1818 | } | 
 | 1819 |  | 
 | 1820 | /* Create various pipes... */ | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1821 | #define usb_sndctrlpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1822 | 	((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint)) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1823 | #define usb_rcvctrlpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1824 | 	((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1825 | #define usb_sndisocpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1826 | 	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint)) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1827 | #define usb_rcvisocpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1828 | 	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1829 | #define usb_sndbulkpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1830 | 	((PIPE_BULK << 30) | __create_pipe(dev, endpoint)) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1831 | #define usb_rcvbulkpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1832 | 	((PIPE_BULK << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1833 | #define usb_sndintpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1834 | 	((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint)) | 
| Greg Kroah-Hartman | 812219a | 2010-05-17 10:40:55 -0700 | [diff] [blame] | 1835 | #define usb_rcvintpipe(dev, endpoint)	\ | 
| Greg Kroah-Hartman | 969ab2e | 2008-01-30 15:20:32 -0800 | [diff] [blame] | 1836 | 	((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1837 |  | 
| Matthew Wilcox | fe54b05 | 2010-04-30 13:11:29 -0600 | [diff] [blame] | 1838 | static inline struct usb_host_endpoint * | 
 | 1839 | usb_pipe_endpoint(struct usb_device *dev, unsigned int pipe) | 
 | 1840 | { | 
 | 1841 | 	struct usb_host_endpoint **eps; | 
 | 1842 | 	eps = usb_pipein(pipe) ? dev->ep_in : dev->ep_out; | 
 | 1843 | 	return eps[usb_pipeendpoint(pipe)]; | 
 | 1844 | } | 
 | 1845 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1846 | /*-------------------------------------------------------------------------*/ | 
 | 1847 |  | 
 | 1848 | static inline __u16 | 
 | 1849 | usb_maxpacket(struct usb_device *udev, int pipe, int is_out) | 
 | 1850 | { | 
 | 1851 | 	struct usb_host_endpoint	*ep; | 
 | 1852 | 	unsigned			epnum = usb_pipeendpoint(pipe); | 
 | 1853 |  | 
 | 1854 | 	if (is_out) { | 
 | 1855 | 		WARN_ON(usb_pipein(pipe)); | 
 | 1856 | 		ep = udev->ep_out[epnum]; | 
 | 1857 | 	} else { | 
 | 1858 | 		WARN_ON(usb_pipeout(pipe)); | 
 | 1859 | 		ep = udev->ep_in[epnum]; | 
 | 1860 | 	} | 
 | 1861 | 	if (!ep) | 
 | 1862 | 		return 0; | 
 | 1863 |  | 
 | 1864 | 	/* NOTE:  only 0x07ff bits are for packet size... */ | 
| Kuninori Morimoto | 29cc889 | 2011-08-23 03:12:03 -0700 | [diff] [blame] | 1865 | 	return usb_endpoint_maxp(&ep->desc); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1866 | } | 
 | 1867 |  | 
| Alan Stern | b724ae7 | 2005-10-24 15:36:00 -0400 | [diff] [blame] | 1868 | /* ----------------------------------------------------------------------- */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1869 |  | 
| Johan Hovold | 2c4d6bf | 2011-11-10 14:58:26 +0100 | [diff] [blame] | 1870 | /* translate USB error codes to codes user space understands */ | 
 | 1871 | static inline int usb_translate_errors(int error_code) | 
 | 1872 | { | 
 | 1873 | 	switch (error_code) { | 
 | 1874 | 	case 0: | 
 | 1875 | 	case -ENOMEM: | 
 | 1876 | 	case -ENODEV: | 
| Johan Hovold | 67c8838 | 2012-03-26 21:01:50 +0200 | [diff] [blame] | 1877 | 	case -EOPNOTSUPP: | 
| Johan Hovold | 2c4d6bf | 2011-11-10 14:58:26 +0100 | [diff] [blame] | 1878 | 		return error_code; | 
 | 1879 | 	default: | 
 | 1880 | 		return -EIO; | 
 | 1881 | 	} | 
 | 1882 | } | 
 | 1883 |  | 
| Greg Kroah-Hartman | 3099e75 | 2005-06-20 21:15:16 -0700 | [diff] [blame] | 1884 | /* Events from the usb core */ | 
 | 1885 | #define USB_DEVICE_ADD		0x0001 | 
 | 1886 | #define USB_DEVICE_REMOVE	0x0002 | 
 | 1887 | #define USB_BUS_ADD		0x0003 | 
 | 1888 | #define USB_BUS_REMOVE		0x0004 | 
 | 1889 | extern void usb_register_notify(struct notifier_block *nb); | 
 | 1890 | extern void usb_unregister_notify(struct notifier_block *nb); | 
 | 1891 |  | 
| Greg Kroah-Hartman | 00048b8 | 2009-04-24 14:56:26 -0700 | [diff] [blame] | 1892 | /* debugfs stuff */ | 
 | 1893 | extern struct dentry *usb_debug_root; | 
 | 1894 |  | 
| Michal Sojka | 0cfbd32 | 2014-09-24 22:43:21 +0200 | [diff] [blame] | 1895 | /* LED triggers */ | 
 | 1896 | enum usb_led_event { | 
 | 1897 | 	USB_LED_EVENT_HOST = 0, | 
 | 1898 | 	USB_LED_EVENT_GADGET = 1, | 
 | 1899 | }; | 
 | 1900 |  | 
 | 1901 | #ifdef CONFIG_USB_LED_TRIG | 
 | 1902 | extern void usb_led_activity(enum usb_led_event ev); | 
 | 1903 | #else | 
 | 1904 | static inline void usb_led_activity(enum usb_led_event ev) {} | 
 | 1905 | #endif | 
 | 1906 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1907 | #endif  /* __KERNEL__ */ | 
 | 1908 |  | 
 | 1909 | #endif |