diff options
Diffstat (limited to 'drivers/usb/core/hcd.c')
| -rw-r--r-- | drivers/usb/core/hcd.c | 949 | 
1 files changed, 706 insertions, 243 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 61800f77dac..bec31e2efb8 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -6,7 +6,7 @@   * (C) Copyright Deti Fliegl 1999   * (C) Copyright Randy Dunlap 2000   * (C) Copyright David Brownell 2000-2002 - *  + *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the   * Free Software Foundation; either version 2 of the License, or (at your @@ -22,6 +22,7 @@   * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   */ +#include <linux/bcd.h>  #include <linux/module.h>  #include <linux/version.h>  #include <linux/kernel.h> @@ -39,9 +40,11 @@  #include <linux/platform_device.h>  #include <linux/workqueue.h>  #include <linux/pm_runtime.h> +#include <linux/types.h>  #include <linux/usb.h>  #include <linux/usb/hcd.h> +#include <linux/usb/phy.h>  #include "usb.h" @@ -91,10 +94,7 @@ EXPORT_SYMBOL_GPL (usb_bus_list);  /* used when allocating bus numbers */  #define USB_MAXBUS		64 -struct usb_busmap { -	unsigned long busmap [USB_MAXBUS / (8*sizeof (unsigned long))]; -}; -static struct usb_busmap busmap; +static DECLARE_BITMAP(busmap, USB_MAXBUS);  /* used when updating list of hcds */  DEFINE_MUTEX(usb_bus_list_lock);	/* exported only for usbfs */ @@ -124,9 +124,8 @@ static inline int is_root_hub(struct usb_device *udev)   */  /*-------------------------------------------------------------------------*/ - -#define KERNEL_REL	((LINUX_VERSION_CODE >> 16) & 0x0ff) -#define KERNEL_VER	((LINUX_VERSION_CODE >> 8) & 0x0ff) +#define KERNEL_REL	bin2bcd(((LINUX_VERSION_CODE >> 16) & 0x0ff)) +#define KERNEL_VER	bin2bcd(((LINUX_VERSION_CODE >> 8) & 0x0ff))  /* usb 3.0 root hub device descriptor */  static const u8 usb3_rh_dev_descriptor[18] = { @@ -139,7 +138,7 @@ static const u8 usb3_rh_dev_descriptor[18] = {  	0x03,       /*  __u8  bDeviceProtocol; USB 3.0 hub */  	0x09,       /*  __u8  bMaxPacketSize0; 2^9 = 512 Bytes */ -	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation */ +	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation 0x1d6b */  	0x03, 0x00, /*  __le16 idProduct; device 0x0003 */  	KERNEL_VER, KERNEL_REL, /*  __le16 bcdDevice */ @@ -149,8 +148,29 @@ static const u8 usb3_rh_dev_descriptor[18] = {  	0x01        /*  __u8  bNumConfigurations; */  }; +/* usb 2.5 (wireless USB 1.0) root hub device descriptor */ +static const u8 usb25_rh_dev_descriptor[18] = { +	0x12,       /*  __u8  bLength; */ +	0x01,       /*  __u8  bDescriptorType; Device */ +	0x50, 0x02, /*  __le16 bcdUSB; v2.5 */ + +	0x09,	    /*  __u8  bDeviceClass; HUB_CLASSCODE */ +	0x00,	    /*  __u8  bDeviceSubClass; */ +	0x00,       /*  __u8  bDeviceProtocol; [ usb 2.0 no TT ] */ +	0xFF,       /*  __u8  bMaxPacketSize0; always 0xFF (WUSB Spec 7.4.1). */ + +	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation 0x1d6b */ +	0x02, 0x00, /*  __le16 idProduct; device 0x0002 */ +	KERNEL_VER, KERNEL_REL, /*  __le16 bcdDevice */ + +	0x03,       /*  __u8  iManufacturer; */ +	0x02,       /*  __u8  iProduct; */ +	0x01,       /*  __u8  iSerialNumber; */ +	0x01        /*  __u8  bNumConfigurations; */ +}; +  /* usb 2.0 root hub device descriptor */ -static const u8 usb2_rh_dev_descriptor [18] = { +static const u8 usb2_rh_dev_descriptor[18] = {  	0x12,       /*  __u8  bLength; */  	0x01,       /*  __u8  bDescriptorType; Device */  	0x00, 0x02, /*  __le16 bcdUSB; v2.0 */ @@ -160,7 +180,7 @@ static const u8 usb2_rh_dev_descriptor [18] = {  	0x00,       /*  __u8  bDeviceProtocol; [ usb 2.0 no TT ] */  	0x40,       /*  __u8  bMaxPacketSize0; 64 Bytes */ -	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation */ +	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation 0x1d6b */  	0x02, 0x00, /*  __le16 idProduct; device 0x0002 */  	KERNEL_VER, KERNEL_REL, /*  __le16 bcdDevice */ @@ -173,7 +193,7 @@ static const u8 usb2_rh_dev_descriptor [18] = {  /* no usb 2.0 root hub "device qualifier" descriptor: one speed only */  /* usb 1.1 root hub device descriptor */ -static const u8 usb11_rh_dev_descriptor [18] = { +static const u8 usb11_rh_dev_descriptor[18] = {  	0x12,       /*  __u8  bLength; */  	0x01,       /*  __u8  bDescriptorType; Device */  	0x10, 0x01, /*  __le16 bcdUSB; v1.1 */ @@ -183,7 +203,7 @@ static const u8 usb11_rh_dev_descriptor [18] = {  	0x00,       /*  __u8  bDeviceProtocol; [ low/full speeds only ] */  	0x40,       /*  __u8  bMaxPacketSize0; 64 Bytes */ -	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation */ +	0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation 0x1d6b */  	0x01, 0x00, /*  __le16 idProduct; device 0x0001 */  	KERNEL_VER, KERNEL_REL, /*  __le16 bcdDevice */ @@ -198,7 +218,7 @@ static const u8 usb11_rh_dev_descriptor [18] = {  /* Configuration descriptors for our root hubs */ -static const u8 fs_rh_config_descriptor [] = { +static const u8 fs_rh_config_descriptor[] = {  	/* one configuration */  	0x09,       /*  __u8  bLength; */ @@ -207,13 +227,13 @@ static const u8 fs_rh_config_descriptor [] = {  	0x01,       /*  __u8  bNumInterfaces; (1) */  	0x01,       /*  __u8  bConfigurationValue; */  	0x00,       /*  __u8  iConfiguration; */ -	0xc0,       /*  __u8  bmAttributes;  +	0xc0,       /*  __u8  bmAttributes;  				 Bit 7: must be set,  				     6: Self-powered,  				     5: Remote wakeup,  				     4..0: resvd */  	0x00,       /*  __u8  MaxPower; */ -       +  	/* USB 1.1:  	 * USB 2.0, single TT organization (mandatory):  	 *	one interface, protocol 0 @@ -235,17 +255,17 @@ static const u8 fs_rh_config_descriptor [] = {  	0x00,       /*  __u8  if_bInterfaceSubClass; */  	0x00,       /*  __u8  if_bInterfaceProtocol; [usb1.1 or single tt] */  	0x00,       /*  __u8  if_iInterface; */ -      +  	/* one endpoint (status change endpoint) */  	0x07,       /*  __u8  ep_bLength; */  	0x05,       /*  __u8  ep_bDescriptorType; Endpoint */  	0x81,       /*  __u8  ep_bEndpointAddress; IN Endpoint 1 */ - 	0x03,       /*  __u8  ep_bmAttributes; Interrupt */ - 	0x02, 0x00, /*  __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ +	0x03,       /*  __u8  ep_bmAttributes; Interrupt */ +	0x02, 0x00, /*  __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */  	0xff        /*  __u8  ep_bInterval; (255ms -- usb 2.0 spec) */  }; -static const u8 hs_rh_config_descriptor [] = { +static const u8 hs_rh_config_descriptor[] = {  	/* one configuration */  	0x09,       /*  __u8  bLength; */ @@ -254,13 +274,13 @@ static const u8 hs_rh_config_descriptor [] = {  	0x01,       /*  __u8  bNumInterfaces; (1) */  	0x01,       /*  __u8  bConfigurationValue; */  	0x00,       /*  __u8  iConfiguration; */ -	0xc0,       /*  __u8  bmAttributes;  +	0xc0,       /*  __u8  bmAttributes;  				 Bit 7: must be set,  				     6: Self-powered,  				     5: Remote wakeup,  				     4..0: resvd */  	0x00,       /*  __u8  MaxPower; */ -       +  	/* USB 1.1:  	 * USB 2.0, single TT organization (mandatory):  	 *	one interface, protocol 0 @@ -282,12 +302,12 @@ static const u8 hs_rh_config_descriptor [] = {  	0x00,       /*  __u8  if_bInterfaceSubClass; */  	0x00,       /*  __u8  if_bInterfaceProtocol; [usb1.1 or single tt] */  	0x00,       /*  __u8  if_iInterface; */ -      +  	/* one endpoint (status change endpoint) */  	0x07,       /*  __u8  ep_bLength; */  	0x05,       /*  __u8  ep_bDescriptorType; Endpoint */  	0x81,       /*  __u8  ep_bEndpointAddress; IN Endpoint 1 */ - 	0x03,       /*  __u8  ep_bmAttributes; Interrupt */ +	0x03,       /*  __u8  ep_bmAttributes; Interrupt */  		    /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8)  		     * see hub.c:hub_configure() for details. */  	(USB_MAXCHILDREN + 1 + 7) / 8, 0x00, @@ -298,7 +318,7 @@ static const u8 ss_rh_config_descriptor[] = {  	/* one configuration */  	0x09,       /*  __u8  bLength; */  	0x02,       /*  __u8  bDescriptorType; Configuration */ -	0x19, 0x00, /*  __le16 wTotalLength; FIXME */ +	0x1f, 0x00, /*  __le16 wTotalLength; */  	0x01,       /*  __u8  bNumInterfaces; (1) */  	0x01,       /*  __u8  bConfigurationValue; */  	0x00,       /*  __u8  iConfiguration; */ @@ -328,13 +348,27 @@ static const u8 ss_rh_config_descriptor[] = {  		    /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8)  		     * see hub.c:hub_configure() for details. */  	(USB_MAXCHILDREN + 1 + 7) / 8, 0x00, -	0x0c        /*  __u8  ep_bInterval; (256ms -- usb 2.0 spec) */ -	/* -	 * All 3.0 hubs should have an endpoint companion descriptor, -	 * but we're ignoring that for now.  FIXME? -	 */ +	0x0c,       /*  __u8  ep_bInterval; (256ms -- usb 2.0 spec) */ + +	/* one SuperSpeed endpoint companion descriptor */ +	0x06,        /* __u8 ss_bLength */ +	0x30,        /* __u8 ss_bDescriptorType; SuperSpeed EP Companion */ +	0x00,        /* __u8 ss_bMaxBurst; allows 1 TX between ACKs */ +	0x00,        /* __u8 ss_bmAttributes; 1 packet per service interval */ +	0x02, 0x00   /* __le16 ss_wBytesPerInterval; 15 bits for max 15 ports */  }; +/* authorized_default behaviour: + * -1 is authorized for all devices except wireless (old behaviour) + * 0 is unauthorized for all devices + * 1 is authorized for all devices + */ +static int authorized_default = -1; +module_param(authorized_default, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(authorized_default, +		"Default USB device authorization: 0 is not authorized, 1 is " +		"authorized, -1 is authorized except for wireless USB (default, " +		"old behaviour");  /*-------------------------------------------------------------------------*/  /** @@ -343,9 +377,10 @@ static const u8 ss_rh_config_descriptor[] = {   * @buf: Buffer for USB string descriptor (header + UTF-16LE)   * @len: Length (in bytes; may be odd) of descriptor buffer.   * - * The return value is the number of bytes filled in: 2 + 2*strlen(s) or - * buflen, whichever is less. + * Return: The number of bytes filled in: 2 + 2*strlen(s) or @len, + * whichever is less.   * + * Note:   * USB String descriptors can contain at most 126 characters; input   * strings longer than that are truncated.   */ @@ -381,7 +416,8 @@ ascii2desc(char const *s, u8 *buf, unsigned len)   *   * Produces either a manufacturer, product or serial number string for the   * virtual root hub device. - * Returns the number of bytes filled in: the length of the descriptor or + * + * Return: The number of bytes filled in: the length of the descriptor or   * of the provided buffer, whichever is less.   */  static unsigned @@ -391,7 +427,7 @@ rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)  	char const *s;  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04}; -	// language ids +	/* language ids */  	switch (id) {  	case 0:  		/* Array of LANGID codes (0x0409 is MSFT-speak for "en-us") */ @@ -427,15 +463,15 @@ rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)  static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  {  	struct usb_ctrlrequest *cmd; - 	u16		typeReq, wValue, wIndex, wLength; +	u16		typeReq, wValue, wIndex, wLength;  	u8		*ubuf = urb->transfer_buffer; -	u8		tbuf [sizeof (struct usb_hub_descriptor)] -		__attribute__((aligned(4))); -	const u8	*bufp = tbuf;  	unsigned	len = 0;  	int		status;  	u8		patch_wakeup = 0;  	u8		patch_protocol = 0; +	u16		tbuf_size; +	u8		*tbuf = NULL; +	const u8	*bufp;  	might_sleep(); @@ -455,6 +491,18 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  	if (wLength > urb->transfer_buffer_length)  		goto error; +	/* +	 * tbuf should be at least as big as the +	 * USB hub descriptor. +	 */ +	tbuf_size =  max_t(u16, sizeof(struct usb_hub_descriptor), wLength); +	tbuf = kzalloc(tbuf_size, GFP_KERNEL); +	if (!tbuf) +		return -ENOMEM; + +	bufp = tbuf; + +  	urb->actual_length = 0;  	switch (typeReq) { @@ -477,10 +525,10 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  	 */  	case DeviceRequest | USB_REQ_GET_STATUS: -		tbuf [0] = (device_may_wakeup(&hcd->self.root_hub->dev) +		tbuf[0] = (device_may_wakeup(&hcd->self.root_hub->dev)  					<< USB_DEVICE_REMOTE_WAKEUP)  				| (1 << USB_DEVICE_SELF_POWERED); -		tbuf [1] = 0; +		tbuf[1] = 0;  		len = 2;  		break;  	case DeviceOutRequest | USB_REQ_CLEAR_FEATURE: @@ -497,7 +545,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  			goto error;  		break;  	case DeviceRequest | USB_REQ_GET_CONFIGURATION: -		tbuf [0] = 1; +		tbuf[0] = 1;  		len = 1;  			/* FALLTHROUGH */  	case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: @@ -505,10 +553,13 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  	case DeviceRequest | USB_REQ_GET_DESCRIPTOR:  		switch (wValue & 0xff00) {  		case USB_DT_DEVICE << 8: -			switch (hcd->driver->flags & HCD_MASK) { +			switch (hcd->speed) {  			case HCD_USB3:  				bufp = usb3_rh_dev_descriptor;  				break; +			case HCD_USB25: +				bufp = usb25_rh_dev_descriptor; +				break;  			case HCD_USB2:  				bufp = usb2_rh_dev_descriptor;  				break; @@ -523,11 +574,12 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  				patch_protocol = 1;  			break;  		case USB_DT_CONFIG << 8: -			switch (hcd->driver->flags & HCD_MASK) { +			switch (hcd->speed) {  			case HCD_USB3:  				bufp = ss_rh_config_descriptor;  				len = sizeof ss_rh_config_descriptor;  				break; +			case HCD_USB25:  			case HCD_USB2:  				bufp = hs_rh_config_descriptor;  				len = sizeof hs_rh_config_descriptor; @@ -549,18 +601,20 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  			else /* unsupported IDs --> "protocol stall" */  				goto error;  			break; +		case USB_DT_BOS << 8: +			goto nongeneric;  		default:  			goto error;  		}  		break;  	case DeviceRequest | USB_REQ_GET_INTERFACE: -		tbuf [0] = 0; +		tbuf[0] = 0;  		len = 1;  			/* FALLTHROUGH */  	case DeviceOutRequest | USB_REQ_SET_INTERFACE:  		break;  	case DeviceOutRequest | USB_REQ_SET_ADDRESS: -		// wValue == urb->dev->devaddr +		/* wValue == urb->dev->devaddr */  		dev_dbg (hcd->self.controller, "root hub device address %d\n",  			wValue);  		break; @@ -570,9 +624,9 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  	/* ENDPOINT REQUESTS */  	case EndpointRequest | USB_REQ_GET_STATUS: -		// ENDPOINT_HALT flag -		tbuf [0] = 0; -		tbuf [1] = 0; +		/* ENDPOINT_HALT flag */ +		tbuf[0] = 0; +		tbuf[1] = 0;  		len = 2;  			/* FALLTHROUGH */  	case EndpointOutRequest | USB_REQ_CLEAR_FEATURE: @@ -583,6 +637,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  	/* CLASS REQUESTS (and errors) */  	default: +nongeneric:  		/* non-generic request */  		switch (typeReq) {  		case GetHubStatus: @@ -592,17 +647,24 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)  		case GetHubDescriptor:  			len = sizeof (struct usb_hub_descriptor);  			break; +		case DeviceRequest | USB_REQ_GET_DESCRIPTOR: +			/* len is returned by hub_control */ +			break;  		}  		status = hcd->driver->hub_control (hcd,  			typeReq, wValue, wIndex,  			tbuf, wLength); + +		if (typeReq == GetHubDescriptor) +			usb_hub_adjust_deviceremovable(hcd->self.root_hub, +				(struct usb_hub_descriptor *)tbuf);  		break;  error:  		/* "protocol stall" on error */  		status = -EPIPE;  	} -	if (status) { +	if (status < 0) {  		len = 0;  		if (status != -EPIPE) {  			dev_dbg (hcd->self.controller, @@ -611,12 +673,16 @@ error:  				typeReq, wValue, wIndex,  				wLength, status);  		} +	} else if (status > 0) { +		/* hub_control may return the length of data copied. */ +		len = status; +		status = 0;  	}  	if (len) {  		if (urb->transfer_buffer_length < len)  			len = urb->transfer_buffer_length;  		urb->actual_length = len; -		// always USB_DIR_IN, toward host +		/* always USB_DIR_IN, toward host */  		memcpy (ubuf, bufp, len);  		/* report whether RH hardware supports remote wakeup */ @@ -631,21 +697,15 @@ error:  				len > offsetof(struct usb_device_descriptor,  						bDeviceProtocol))  			((struct usb_device_descriptor *) ubuf)-> -					bDeviceProtocol = 1; +				bDeviceProtocol = USB_HUB_PR_HS_SINGLE_TT;  	} +	kfree(tbuf); +  	/* any errors get returned through the urb completion */  	spin_lock_irq(&hcd_root_hub_lock);  	usb_hcd_unlink_urb_from_ep(hcd, urb); - -	/* This peculiar use of spinlocks echoes what real HC drivers do. -	 * Avoiding calls to local_irq_disable/enable makes the code -	 * RT-friendly. -	 */ -	spin_unlock(&hcd_root_hub_lock);  	usb_hcd_giveback_urb(hcd, urb, status); -	spin_lock(&hcd_root_hub_lock); -  	spin_unlock_irq(&hcd_root_hub_lock);  	return 0;  } @@ -685,9 +745,7 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd)  			memcpy(urb->transfer_buffer, buffer, length);  			usb_hcd_unlink_urb_from_ep(hcd, urb); -			spin_unlock(&hcd_root_hub_lock);  			usb_hcd_giveback_urb(hcd, urb, 0); -			spin_lock(&hcd_root_hub_lock);  		} else {  			length = 0;  			set_bit(HCD_FLAG_POLL_PENDING, &hcd->flags); @@ -698,7 +756,7 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd)  	/* The USB 2.0 spec says 256 ms.  This is close enough and won't  	 * exceed that limit if HZ is 100. The math is more clunky than  	 * maybe expected, this is to make sure that all timers for USB devices -	 * fire at the same time to give the CPU a break inbetween */ +	 * fire at the same time to give the CPU a break in between */  	if (hcd->uses_new_polling ? HCD_POLL_RH(hcd) :  			(length == 0 && hcd->status_urb != NULL))  		mod_timer (&hcd->rh_timer, (jiffies/(HZ/4) + 1) * (HZ/4)); @@ -777,10 +835,7 @@ static int usb_rh_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)  		if (urb == hcd->status_urb) {  			hcd->status_urb = NULL;  			usb_hcd_unlink_urb_from_ep(hcd, urb); - -			spin_unlock(&hcd_root_hub_lock);  			usb_hcd_giveback_urb(hcd, urb, status); -			spin_lock(&hcd_root_hub_lock);  		}  	}   done: @@ -793,9 +848,8 @@ static int usb_rh_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)  /*   * Show & store the current value of authorized_default   */ -static ssize_t usb_host_authorized_default_show(struct device *dev, -						struct device_attribute *attr, -						char *buf) +static ssize_t authorized_default_show(struct device *dev, +				       struct device_attribute *attr, char *buf)  {  	struct usb_device *rh_usb_dev = to_usb_device(dev);  	struct usb_bus *usb_bus = rh_usb_dev->bus; @@ -807,9 +861,9 @@ static ssize_t usb_host_authorized_default_show(struct device *dev,  	return snprintf(buf, PAGE_SIZE, "%u\n", usb_hcd->authorized_default);  } -static ssize_t usb_host_authorized_default_store(struct device *dev, -						 struct device_attribute *attr, -						 const char *buf, size_t size) +static ssize_t authorized_default_store(struct device *dev, +					struct device_attribute *attr, +					const char *buf, size_t size)  {  	ssize_t result;  	unsigned val; @@ -822,18 +876,14 @@ static ssize_t usb_host_authorized_default_store(struct device *dev,  	usb_hcd = bus_to_hcd(usb_bus);  	result = sscanf(buf, "%u\n", &val);  	if (result == 1) { -		usb_hcd->authorized_default = val? 1 : 0; +		usb_hcd->authorized_default = val ? 1 : 0;  		result = size; -	} -	else +	} else {  		result = -EINVAL; +	}  	return result;  } - -static DEVICE_ATTR(authorized_default, 0644, -	    usb_host_authorized_default_show, -	    usb_host_authorized_default_store); - +static DEVICE_ATTR_RW(authorized_default);  /* Group all the USB bus attributes */  static struct attribute *usb_bus_attrs[] = { @@ -868,6 +918,7 @@ static void usb_bus_init (struct usb_bus *bus)  	bus->bandwidth_allocated = 0;  	bus->bandwidth_int_reqs  = 0;  	bus->bandwidth_isoc_reqs = 0; +	mutex_init(&bus->usb_address0_mutex);  	INIT_LIST_HEAD (&bus->bus_list);  } @@ -881,6 +932,8 @@ static void usb_bus_init (struct usb_bus *bus)   *   * Assigns a bus number, and links the controller into usbcore data   * structures so that it can be seen by scanning the bus list. + * + * Return: 0 if successful. A negative error code otherwise.   */  static int usb_register_bus(struct usb_bus *bus)  { @@ -888,12 +941,12 @@ static int usb_register_bus(struct usb_bus *bus)  	int busnum;  	mutex_lock(&usb_bus_list_lock); -	busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1); +	busnum = find_next_zero_bit(busmap, USB_MAXBUS, 1);  	if (busnum >= USB_MAXBUS) {  		printk (KERN_ERR "%s: too many buses\n", usbcore_name);  		goto error_find_busnum;  	} -	set_bit (busnum, busmap.busmap); +	set_bit(busnum, busmap);  	bus->busnum = busnum;  	/* Add it to the local list of buses */ @@ -934,7 +987,7 @@ static void usb_deregister_bus (struct usb_bus *bus)  	usb_notify_remove_bus(bus); -	clear_bit (bus->busnum, busmap.busmap); +	clear_bit(bus->busnum, busmap);  }  /** @@ -945,6 +998,8 @@ static void usb_deregister_bus (struct usb_bus *bus)   * the device properly in the device tree and then calls usb_new_device()   * to register the usb device.  It also assigns the root hub's USB address   * (always 1). + * + * Return: 0 if successful. A negative error code otherwise.   */  static int register_root_hub(struct usb_hcd *hcd)  { @@ -970,27 +1025,77 @@ static int register_root_hub(struct usb_hcd *hcd)  				dev_name(&usb_dev->dev), retval);  		return (retval < 0) ? retval : -EMSGSIZE;  	} +	if (usb_dev->speed == USB_SPEED_SUPER) { +		retval = usb_get_bos_descriptor(usb_dev); +		if (retval < 0) { +			mutex_unlock(&usb_bus_list_lock); +			dev_dbg(parent_dev, "can't read %s bos descriptor %d\n", +					dev_name(&usb_dev->dev), retval); +			return retval; +		} +	}  	retval = usb_new_device (usb_dev);  	if (retval) {  		dev_err (parent_dev, "can't register root hub for %s, %d\n",  				dev_name(&usb_dev->dev), retval); -	} -	mutex_unlock(&usb_bus_list_lock); - -	if (retval == 0) { +	} else {  		spin_lock_irq (&hcd_root_hub_lock);  		hcd->rh_registered = 1;  		spin_unlock_irq (&hcd_root_hub_lock);  		/* Did the HC die before the root hub was registered? */ -		if (hcd->state == HC_STATE_HALT) +		if (HCD_DEAD(hcd))  			usb_hc_died (hcd);	/* This time clean up */  	} +	mutex_unlock(&usb_bus_list_lock);  	return retval;  } +/* + * usb_hcd_start_port_resume - a root-hub port is sending a resume signal + * @bus: the bus which the root hub belongs to + * @portnum: the port which is being resumed + * + * HCDs should call this function when they know that a resume signal is + * being sent to a root-hub port.  The root hub will be prevented from + * going into autosuspend until usb_hcd_end_port_resume() is called. + * + * The bus's private lock must be held by the caller. + */ +void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum) +{ +	unsigned bit = 1 << portnum; + +	if (!(bus->resuming_ports & bit)) { +		bus->resuming_ports |= bit; +		pm_runtime_get_noresume(&bus->root_hub->dev); +	} +} +EXPORT_SYMBOL_GPL(usb_hcd_start_port_resume); + +/* + * usb_hcd_end_port_resume - a root-hub port has stopped sending a resume signal + * @bus: the bus which the root hub belongs to + * @portnum: the port which is being resumed + * + * HCDs should call this function when they know that a resume signal has + * stopped being sent to a root-hub port.  The root hub will be allowed to + * autosuspend again. + * + * The bus's private lock must be held by the caller. + */ +void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum) +{ +	unsigned bit = 1 << portnum; + +	if (bus->resuming_ports & bit) { +		bus->resuming_ports &= ~bit; +		pm_runtime_put_noidle(&bus->root_hub->dev); +	} +} +EXPORT_SYMBOL_GPL(usb_hcd_end_port_resume);  /*-------------------------------------------------------------------------*/ @@ -1001,7 +1106,9 @@ static int register_root_hub(struct usb_hcd *hcd)   * @isoc: true for isochronous transactions, false for interrupt ones   * @bytecount: how many bytes in the transaction.   * - * Returns approximate bus time in nanoseconds for a periodic transaction. + * Return: Approximate bus time in nanoseconds for a periodic transaction. + * + * Note:   * See USB 2.0 spec section 5.11.3; only periodic transfers need to be   * scheduled in software, this function is only used for such scheduling.   */ @@ -1013,21 +1120,21 @@ long usb_calc_bus_time (int speed, int is_input, int isoc, int bytecount)  	case USB_SPEED_LOW: 	/* INTR only */  		if (is_input) {  			tmp = (67667L * (31L + 10L * BitTime (bytecount))) / 1000L; -			return (64060L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp); +			return 64060L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp;  		} else {  			tmp = (66700L * (31L + 10L * BitTime (bytecount))) / 1000L; -			return (64107L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp); +			return 64107L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp;  		}  	case USB_SPEED_FULL:	/* ISOC or INTR */  		if (isoc) {  			tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L; -			return (((is_input) ? 7268L : 6265L) + BW_HOST_DELAY + tmp); +			return ((is_input) ? 7268L : 6265L) + BW_HOST_DELAY + tmp;  		} else {  			tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L; -			return (9107L + BW_HOST_DELAY + tmp); +			return 9107L + BW_HOST_DELAY + tmp;  		}  	case USB_SPEED_HIGH:	/* ISOC or INTR */ -		// FIXME adjust for input vs output +		/* FIXME adjust for input vs output */  		if (isoc)  			tmp = HS_NSECS_ISO (bytecount);  		else @@ -1059,7 +1166,7 @@ EXPORT_SYMBOL_GPL(usb_calc_bus_time);   * be disabled.  The actions carried out here are required for URB   * submission, as well as for endpoint shutdown and for usb_kill_urb.   * - * Returns 0 for no error, otherwise a negative error code (in which case + * Return: 0 for no error, otherwise a negative error code (in which case   * the enqueue() method must fail).  If no error occurs but enqueue() fails   * anyway, it must call usb_hcd_unlink_urb_from_ep() before releasing   * the private spinlock and returning. @@ -1090,13 +1197,10 @@ int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)  	 * Check the host controller's state and add the URB to the  	 * endpoint's queue.  	 */ -	switch (hcd->state) { -	case HC_STATE_RUNNING: -	case HC_STATE_RESUMING: +	if (HCD_RH_RUNNING(hcd)) {  		urb->unlinked = 0;  		list_add_tail(&urb->urb_list, &urb->ep->urb_list); -		break; -	default: +	} else {  		rc = -ESHUTDOWN;  		goto done;  	} @@ -1117,7 +1221,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_link_urb_to_ep);   * be disabled.  The actions carried out here are required for making   * sure than an unlink is valid.   * - * Returns 0 for no error, otherwise a negative error code (in which case + * Return: 0 for no error, otherwise a negative error code (in which case   * the dequeue() method must fail).  The possible error codes are:   *   *	-EIDRM: @urb was not submitted or has already completed. @@ -1144,18 +1248,6 @@ int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb,  	if (urb->unlinked)  		return -EBUSY;  	urb->unlinked = status; - -	/* IRQ setup can easily be broken so that USB controllers -	 * never get completion IRQs ... maybe even the ones we need to -	 * finish unlinking the initial failed usb_set_address() -	 * or device descriptor fetch. -	 */ -	if (!HCD_SAW_IRQ(hcd) && !is_root_hub(urb->dev)) { -		dev_warn(hcd->self.controller, "Unlink after no-IRQ?  " -			"Controller is probably using the wrong IRQ.\n"); -		set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); -	} -  	return 0;  }  EXPORT_SYMBOL_GPL(usb_hcd_check_unlink_urb); @@ -1206,7 +1298,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_unlink_urb_from_ep);   *   DMA framework is dma_declare_coherent_memory()   *   * - So we use that, even though the primary requirement - *   is that the memory be "local" (hence addressible + *   is that the memory be "local" (hence addressable   *   by that device), not "coherent".   *   */ @@ -1263,7 +1355,7 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle,  	*dma_handle = 0;  } -void unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb) +void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)  {  	if (urb->transfer_flags & URB_SETUP_MAP_SINGLE)  		dma_unmap_single(hcd->self.controller, @@ -1280,13 +1372,21 @@ void unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)  	/* Make it safe to call this routine more than once */  	urb->transfer_flags &= ~(URB_SETUP_MAP_SINGLE | URB_SETUP_MAP_LOCAL);  } -EXPORT_SYMBOL_GPL(unmap_urb_setup_for_dma); +EXPORT_SYMBOL_GPL(usb_hcd_unmap_urb_setup_for_dma); -void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) +static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) +{ +	if (hcd->driver->unmap_urb_for_dma) +		hcd->driver->unmap_urb_for_dma(hcd, urb); +	else +		usb_hcd_unmap_urb_for_dma(hcd, urb); +} + +void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)  {  	enum dma_data_direction dir; -	unmap_urb_setup_for_dma(hcd, urb); +	usb_hcd_unmap_urb_setup_for_dma(hcd, urb);  	dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;  	if (urb->transfer_flags & URB_DMA_MAP_SG) @@ -1315,11 +1415,20 @@ void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)  	urb->transfer_flags &= ~(URB_DMA_MAP_SG | URB_DMA_MAP_PAGE |  			URB_DMA_MAP_SINGLE | URB_MAP_LOCAL);  } -EXPORT_SYMBOL_GPL(unmap_urb_for_dma); +EXPORT_SYMBOL_GPL(usb_hcd_unmap_urb_for_dma);  static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  			   gfp_t mem_flags)  { +	if (hcd->driver->map_urb_for_dma) +		return hcd->driver->map_urb_for_dma(hcd, urb, mem_flags); +	else +		return usb_hcd_map_urb_for_dma(hcd, urb, mem_flags); +} + +int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, +			    gfp_t mem_flags) +{  	enum dma_data_direction dir;  	int ret = 0; @@ -1330,6 +1439,8 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  	 */  	if (usb_endpoint_xfer_control(&urb->ep->desc)) { +		if (hcd->self.uses_pio_for_control) +			return ret;  		if (hcd->self.uses_dma) {  			urb->setup_dma = dma_map_single(  					hcd->self.controller, @@ -1358,7 +1469,15 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  	    && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) {  		if (hcd->self.uses_dma) {  			if (urb->num_sgs) { -				int n = dma_map_sg( +				int n; + +				/* We don't support sg for isoc transfers ! */ +				if (usb_endpoint_xfer_isoc(&urb->ep->desc)) { +					WARN_ON(1); +					return -EINVAL; +				} + +				n = dma_map_sg(  						hcd->self.controller,  						urb->sg,  						urb->num_sgs, @@ -1367,11 +1486,10 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  					ret = -EAGAIN;  				else  					urb->transfer_flags |= URB_DMA_MAP_SG; -				if (n != urb->num_sgs) { -					urb->num_sgs = n; +				urb->num_mapped_sgs = n; +				if (n != urb->num_sgs)  					urb->transfer_flags |=  							URB_DMA_SG_COMBINED; -				}  			} else if (urb->sg) {  				struct scatterlist *sg = urb->sg;  				urb->transfer_dma = dma_map_page( @@ -1385,6 +1503,9 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  					ret = -EAGAIN;  				else  					urb->transfer_flags |= URB_DMA_MAP_PAGE; +			} else if (is_vmalloc_addr(urb->transfer_buffer)) { +				WARN_ONCE(1, "transfer buffer not dma capable\n"); +				ret = -EAGAIN;  			} else {  				urb->transfer_dma = dma_map_single(  						hcd->self.controller, @@ -1409,10 +1530,11 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  		}  		if (ret && (urb->transfer_flags & (URB_SETUP_MAP_SINGLE |  				URB_SETUP_MAP_LOCAL))) -			unmap_urb_for_dma(hcd, urb); +			usb_hcd_unmap_urb_for_dma(hcd, urb);  	}  	return ret;  } +EXPORT_SYMBOL_GPL(usb_hcd_map_urb_for_dma);  /*-------------------------------------------------------------------------*/ @@ -1529,6 +1651,77 @@ int usb_hcd_unlink_urb (struct urb *urb, int status)  /*-------------------------------------------------------------------------*/ +static void __usb_hcd_giveback_urb(struct urb *urb) +{ +	struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus); +	struct usb_anchor *anchor = urb->anchor; +	int status = urb->unlinked; +	unsigned long flags; + +	urb->hcpriv = NULL; +	if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && +	    urb->actual_length < urb->transfer_buffer_length && +	    !status)) +		status = -EREMOTEIO; + +	unmap_urb_for_dma(hcd, urb); +	usbmon_urb_complete(&hcd->self, urb, status); +	usb_anchor_suspend_wakeups(anchor); +	usb_unanchor_urb(urb); + +	/* pass ownership to the completion handler */ +	urb->status = status; + +	/* +	 * We disable local IRQs here avoid possible deadlock because +	 * drivers may call spin_lock() to hold lock which might be +	 * acquired in one hard interrupt handler. +	 * +	 * The local_irq_save()/local_irq_restore() around complete() +	 * will be removed if current USB drivers have been cleaned up +	 * and no one may trigger the above deadlock situation when +	 * running complete() in tasklet. +	 */ +	local_irq_save(flags); +	urb->complete(urb); +	local_irq_restore(flags); + +	usb_anchor_resume_wakeups(anchor); +	atomic_dec(&urb->use_count); +	if (unlikely(atomic_read(&urb->reject))) +		wake_up(&usb_kill_urb_queue); +	usb_put_urb(urb); +} + +static void usb_giveback_urb_bh(unsigned long param) +{ +	struct giveback_urb_bh *bh = (struct giveback_urb_bh *)param; +	struct list_head local_list; + +	spin_lock_irq(&bh->lock); +	bh->running = true; + restart: +	list_replace_init(&bh->head, &local_list); +	spin_unlock_irq(&bh->lock); + +	while (!list_empty(&local_list)) { +		struct urb *urb; + +		urb = list_entry(local_list.next, struct urb, urb_list); +		list_del_init(&urb->urb_list); +		bh->completing_ep = urb->ep; +		__usb_hcd_giveback_urb(urb); +		bh->completing_ep = NULL; +	} + +	/* check if there are new URBs to giveback */ +	spin_lock_irq(&bh->lock); +	if (!list_empty(&bh->head)) +		goto restart; +	bh->running = false; +	spin_unlock_irq(&bh->lock); +} +  /**   * usb_hcd_giveback_urb - return URB from HCD to device driver   * @hcd: host controller returning the URB @@ -1548,25 +1741,37 @@ int usb_hcd_unlink_urb (struct urb *urb, int status)   */  void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)  { -	urb->hcpriv = NULL; -	if (unlikely(urb->unlinked)) -		status = urb->unlinked; -	else if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && -			urb->actual_length < urb->transfer_buffer_length && -			!status)) -		status = -EREMOTEIO; +	struct giveback_urb_bh *bh; +	bool running, high_prio_bh; -	unmap_urb_for_dma(hcd, urb); -	usbmon_urb_complete(&hcd->self, urb, status); -	usb_unanchor_urb(urb); +	/* pass status to tasklet via unlinked */ +	if (likely(!urb->unlinked)) +		urb->unlinked = status; -	/* pass ownership to the completion handler */ -	urb->status = status; -	urb->complete (urb); -	atomic_dec (&urb->use_count); -	if (unlikely(atomic_read(&urb->reject))) -		wake_up (&usb_kill_urb_queue); -	usb_put_urb (urb); +	if (!hcd_giveback_urb_in_bh(hcd) && !is_root_hub(urb->dev)) { +		__usb_hcd_giveback_urb(urb); +		return; +	} + +	if (usb_pipeisoc(urb->pipe) || usb_pipeint(urb->pipe)) { +		bh = &hcd->high_prio_bh; +		high_prio_bh = true; +	} else { +		bh = &hcd->low_prio_bh; +		high_prio_bh = false; +	} + +	spin_lock(&bh->lock); +	list_add_tail(&urb->urb_list, &bh->head); +	running = bh->running; +	spin_unlock(&bh->lock); + +	if (running) +		; +	else if (high_prio_bh) +		tasklet_hi_schedule(&bh->bh); +	else +		tasklet_schedule(&bh->bh);  }  EXPORT_SYMBOL_GPL(usb_hcd_giveback_urb); @@ -1615,7 +1820,7 @@ rescan:  				 case USB_ENDPOINT_XFER_INT:  					s = "-intr"; break;  				 default: -			 		s = "-iso"; break; +					s = "-iso"; break;  				};  				s;  			})); @@ -1665,7 +1870,7 @@ rescan:   * pass in the current alternate interface setting in cur_alt,   * and pass in the new alternate interface setting in new_alt.   * - * Returns an error if the requested bandwidth change exceeds the + * Return: An error if the requested bandwidth change exceeds the   * bus bandwidth or host controller internal resources.   */  int usb_hcd_alloc_bandwidth(struct usb_device *udev, @@ -1743,6 +1948,8 @@ int usb_hcd_alloc_bandwidth(struct usb_device *udev,  		struct usb_interface *iface = usb_ifnum_to_if(udev,  				cur_alt->desc.bInterfaceNumber); +		if (!iface) +			return -EINVAL;  		if (iface->resetting_device) {  			/*  			 * The USB core just reset the device, so the xHCI host @@ -1833,9 +2040,12 @@ void usb_hcd_reset_endpoint(struct usb_device *udev,   * @num_streams:	number of streams to allocate.   * @mem_flags:		flags hcd should use to allocate memory.   * - * Sets up a group of bulk endpoints to have num_streams stream IDs available. + * Sets up a group of bulk endpoints to have @num_streams stream IDs available.   * Drivers may queue multiple transfers to different stream IDs, which may   * complete in a different order than they were queued. + * + * Return: On success, the number of allocated streams. On failure, a negative + * error code.   */  int usb_alloc_streams(struct usb_interface *interface,  		struct usb_host_endpoint **eps, unsigned int num_eps, @@ -1843,7 +2053,7 @@ int usb_alloc_streams(struct usb_interface *interface,  {  	struct usb_hcd *hcd;  	struct usb_device *dev; -	int i; +	int i, ret;  	dev = interface_to_usbdev(interface);  	hcd = bus_to_hcd(dev->bus); @@ -1852,13 +2062,24 @@ int usb_alloc_streams(struct usb_interface *interface,  	if (dev->speed != USB_SPEED_SUPER)  		return -EINVAL; -	/* Streams only apply to bulk endpoints. */ -	for (i = 0; i < num_eps; i++) +	for (i = 0; i < num_eps; i++) { +		/* Streams only apply to bulk endpoints. */  		if (!usb_endpoint_xfer_bulk(&eps[i]->desc))  			return -EINVAL; +		/* Re-alloc is not allowed */ +		if (eps[i]->streams) +			return -EINVAL; +	} -	return hcd->driver->alloc_streams(hcd, dev, eps, num_eps, +	ret = hcd->driver->alloc_streams(hcd, dev, eps, num_eps,  			num_streams, mem_flags); +	if (ret < 0) +		return ret; + +	for (i = 0; i < num_eps; i++) +		eps[i]->streams = ret; + +	return ret;  }  EXPORT_SYMBOL_GPL(usb_alloc_streams); @@ -1871,26 +2092,35 @@ EXPORT_SYMBOL_GPL(usb_alloc_streams);   *   * Reverts a group of bulk endpoints back to not using stream IDs.   * Can fail if we are given bad arguments, or HCD is broken. + * + * Return: 0 on success. On failure, a negative error code.   */ -void usb_free_streams(struct usb_interface *interface, +int usb_free_streams(struct usb_interface *interface,  		struct usb_host_endpoint **eps, unsigned int num_eps,  		gfp_t mem_flags)  {  	struct usb_hcd *hcd;  	struct usb_device *dev; -	int i; +	int i, ret;  	dev = interface_to_usbdev(interface);  	hcd = bus_to_hcd(dev->bus);  	if (dev->speed != USB_SPEED_SUPER) -		return; +		return -EINVAL; -	/* Streams only apply to bulk endpoints. */ +	/* Double-free is not allowed */  	for (i = 0; i < num_eps; i++) -		if (!usb_endpoint_xfer_bulk(&eps[i]->desc)) -			return; +		if (!eps[i] || !eps[i]->streams) +			return -EINVAL; + +	ret = hcd->driver->free_streams(hcd, dev, eps, num_eps, mem_flags); +	if (ret < 0) +		return ret; -	hcd->driver->free_streams(hcd, dev, eps, num_eps, mem_flags); +	for (i = 0; i < num_eps; i++) +		eps[i]->streams = 0; + +	return ret;  }  EXPORT_SYMBOL_GPL(usb_free_streams); @@ -1912,7 +2142,7 @@ int usb_hcd_get_frame_number (struct usb_device *udev)  {  	struct usb_hcd	*hcd = bus_to_hcd(udev->bus); -	if (!HC_IS_RUNNING (hcd->state)) +	if (!HCD_RH_RUNNING(hcd))  		return -ESHUTDOWN;  	return hcd->driver->get_frame_number (hcd);  } @@ -1927,19 +2157,43 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg)  	int		status;  	int		old_state = hcd->state; -	dev_dbg(&rhdev->dev, "bus %s%s\n", -			(msg.event & PM_EVENT_AUTO ? "auto-" : ""), "suspend"); +	dev_dbg(&rhdev->dev, "bus %ssuspend, wakeup %d\n", +			(PMSG_IS_AUTO(msg) ? "auto-" : ""), +			rhdev->do_remote_wakeup); +	if (HCD_DEAD(hcd)) { +		dev_dbg(&rhdev->dev, "skipped %s of dead bus\n", "suspend"); +		return 0; +	} +  	if (!hcd->driver->bus_suspend) {  		status = -ENOENT;  	} else { +		clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);  		hcd->state = HC_STATE_QUIESCING;  		status = hcd->driver->bus_suspend(hcd);  	}  	if (status == 0) {  		usb_set_device_state(rhdev, USB_STATE_SUSPENDED);  		hcd->state = HC_STATE_SUSPENDED; + +		/* Did we race with a root-hub wakeup event? */ +		if (rhdev->do_remote_wakeup) { +			char	buffer[6]; + +			status = hcd->driver->hub_status_data(hcd, buffer); +			if (status != 0) { +				dev_dbg(&rhdev->dev, "suspend raced with wakeup event\n"); +				hcd_bus_resume(rhdev, PMSG_AUTO_RESUME); +				status = -EBUSY; +			} +		}  	} else { -		hcd->state = old_state; +		spin_lock_irq(&hcd_root_hub_lock); +		if (!HCD_DEAD(hcd)) { +			set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); +			hcd->state = old_state; +		} +		spin_unlock_irq(&hcd_root_hub_lock);  		dev_dbg(&rhdev->dev, "bus %s fail, err %d\n",  				"suspend", status);  	} @@ -1952,23 +2206,47 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)  	int		status;  	int		old_state = hcd->state; -	dev_dbg(&rhdev->dev, "usb %s%s\n", -			(msg.event & PM_EVENT_AUTO ? "auto-" : ""), "resume"); -	clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags); +	dev_dbg(&rhdev->dev, "usb %sresume\n", +			(PMSG_IS_AUTO(msg) ? "auto-" : "")); +	if (HCD_DEAD(hcd)) { +		dev_dbg(&rhdev->dev, "skipped %s of dead bus\n", "resume"); +		return 0; +	}  	if (!hcd->driver->bus_resume)  		return -ENOENT; -	if (hcd->state == HC_STATE_RUNNING) +	if (HCD_RH_RUNNING(hcd))  		return 0;  	hcd->state = HC_STATE_RESUMING;  	status = hcd->driver->bus_resume(hcd); +	clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags);  	if (status == 0) { -		/* TRSMRCY = 10 msec */ -		msleep(10); -		usb_set_device_state(rhdev, rhdev->actconfig -				? USB_STATE_CONFIGURED -				: USB_STATE_ADDRESS); -		hcd->state = HC_STATE_RUNNING; +		struct usb_device *udev; +		int port1; + +		spin_lock_irq(&hcd_root_hub_lock); +		if (!HCD_DEAD(hcd)) { +			usb_set_device_state(rhdev, rhdev->actconfig +					? USB_STATE_CONFIGURED +					: USB_STATE_ADDRESS); +			set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); +			hcd->state = HC_STATE_RUNNING; +		} +		spin_unlock_irq(&hcd_root_hub_lock); + +		/* +		 * Check whether any of the enabled ports on the root hub are +		 * unsuspended.  If they are then a TRSMRCY delay is needed +		 * (this is what the USB-2 spec calls a "global resume"). +		 * Otherwise we can skip the delay. +		 */ +		usb_hub_for_each_child(rhdev, port1, udev) { +			if (udev->state != USB_STATE_NOTATTACHED && +					!udev->port_is_suspended) { +				usleep_range(10000, 11000);	/* TRSMRCY */ +				break; +			} +		}  	} else {  		hcd->state = old_state;  		dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", @@ -1981,7 +2259,7 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)  #endif	/* CONFIG_PM */ -#ifdef	CONFIG_USB_SUSPEND +#ifdef	CONFIG_PM_RUNTIME  /* Workqueue routine for root-hub remote wakeup */  static void hcd_resume_work(struct work_struct *work) @@ -1989,13 +2267,11 @@ static void hcd_resume_work(struct work_struct *work)  	struct usb_hcd *hcd = container_of(work, struct usb_hcd, wakeup_work);  	struct usb_device *udev = hcd->self.root_hub; -	usb_lock_device(udev);  	usb_remote_wakeup(udev); -	usb_unlock_device(udev);  }  /** - * usb_hcd_resume_root_hub - called by HCD to resume its root hub  + * usb_hcd_resume_root_hub - called by HCD to resume its root hub   * @hcd: host controller for this root hub   *   * The USB host controller calls this function when its root hub is @@ -2016,7 +2292,7 @@ void usb_hcd_resume_root_hub (struct usb_hcd *hcd)  }  EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub); -#endif	/* CONFIG_USB_SUSPEND */ +#endif	/* CONFIG_PM_RUNTIME */  /*-------------------------------------------------------------------------*/ @@ -2032,6 +2308,8 @@ EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);   * khubd identifying and possibly configuring the device.   * This is needed by OTG controller drivers, where it helps meet   * HNP protocol timing requirements for starting a port reset. + * + * Return: 0 if successful.   */  int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num)  { @@ -2066,32 +2344,21 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum);   *   * If the controller isn't HALTed, calls the driver's irq handler.   * Checks whether the controller is now dead. + * + * Return: %IRQ_HANDLED if the IRQ was handled. %IRQ_NONE otherwise.   */  irqreturn_t usb_hcd_irq (int irq, void *__hcd)  {  	struct usb_hcd		*hcd = __hcd; -	unsigned long		flags;  	irqreturn_t		rc; -	/* IRQF_DISABLED doesn't work correctly with shared IRQs -	 * when the first handler doesn't use it.  So let's just -	 * assume it's never used. -	 */ -	local_irq_save(flags); - -	if (unlikely(hcd->state == HC_STATE_HALT || !HCD_HW_ACCESSIBLE(hcd))) { +	if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd)))  		rc = IRQ_NONE; -	} else if (hcd->driver->irq(hcd) == IRQ_NONE) { +	else if (hcd->driver->irq(hcd) == IRQ_NONE)  		rc = IRQ_NONE; -	} else { -		set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); - -		if (unlikely(hcd->state == HC_STATE_HALT)) -			usb_hc_died(hcd); +	else  		rc = IRQ_HANDLED; -	} -	local_irq_restore(flags);  	return rc;  }  EXPORT_SYMBOL_GPL(usb_hcd_irq); @@ -2104,7 +2371,9 @@ EXPORT_SYMBOL_GPL(usb_hcd_irq);   *   * This is called by bus glue to report a USB host controller that died   * while operations may still have been pending.  It's called automatically - * by the PCI glue, so only glue for non-PCI busses should need to call it.  + * by the PCI glue, so only glue for non-PCI busses should need to call it. + * + * Only call this function with the primary HCD.   */  void usb_hc_died (struct usb_hcd *hcd)  { @@ -2113,6 +2382,8 @@ void usb_hc_died (struct usb_hcd *hcd)  	dev_err (hcd->self.controller, "HC died; cleaning up\n");  	spin_lock_irqsave (&hcd_root_hub_lock, flags); +	clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); +	set_bit(HCD_FLAG_DEAD, &hcd->flags);  	if (hcd->rh_registered) {  		clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); @@ -2121,27 +2392,51 @@ void usb_hc_died (struct usb_hcd *hcd)  				USB_STATE_NOTATTACHED);  		usb_kick_khubd (hcd->self.root_hub);  	} +	if (usb_hcd_is_primary_hcd(hcd) && hcd->shared_hcd) { +		hcd = hcd->shared_hcd; +		if (hcd->rh_registered) { +			clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); + +			/* make khubd clean up old urbs and devices */ +			usb_set_device_state(hcd->self.root_hub, +					USB_STATE_NOTATTACHED); +			usb_kick_khubd(hcd->self.root_hub); +		} +	}  	spin_unlock_irqrestore (&hcd_root_hub_lock, flags); +	/* Make sure that the other roothub is also deallocated. */  }  EXPORT_SYMBOL_GPL (usb_hc_died);  /*-------------------------------------------------------------------------*/ +static void init_giveback_urb_bh(struct giveback_urb_bh *bh) +{ + +	spin_lock_init(&bh->lock); +	INIT_LIST_HEAD(&bh->head); +	tasklet_init(&bh->bh, usb_giveback_urb_bh, (unsigned long)bh); +} +  /** - * usb_create_hcd - create and initialize an HCD structure + * usb_create_shared_hcd - create and initialize an HCD structure   * @driver: HC driver that will use this hcd   * @dev: device for this HC, stored in hcd->self.controller   * @bus_name: value to store in hcd->self.bus_name + * @primary_hcd: a pointer to the usb_hcd structure that is sharing the + *              PCI device.  Only allocate certain resources for the primary HCD   * Context: !in_interrupt()   *   * Allocate a struct usb_hcd, with extra space at the end for the   * HC driver's private data.  Initialize the generic members of the   * hcd structure.   * - * If memory is unavailable, returns NULL. + * Return: On success, a pointer to the created and initialized HCD structure. + * On failure (e.g. if memory is unavailable), %NULL.   */ -struct usb_hcd *usb_create_hcd (const struct hc_driver *driver, -		struct device *dev, const char *bus_name) +struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, +		struct device *dev, const char *bus_name, +		struct usb_hcd *primary_hcd)  {  	struct usb_hcd *hcd; @@ -2150,7 +2445,26 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,  		dev_dbg (dev, "hcd alloc failed\n");  		return NULL;  	} -	dev_set_drvdata(dev, hcd); +	if (primary_hcd == NULL) { +		hcd->bandwidth_mutex = kmalloc(sizeof(*hcd->bandwidth_mutex), +				GFP_KERNEL); +		if (!hcd->bandwidth_mutex) { +			kfree(hcd); +			dev_dbg(dev, "hcd bandwidth mutex alloc failed\n"); +			return NULL; +		} +		mutex_init(hcd->bandwidth_mutex); +		dev_set_drvdata(dev, hcd); +	} else { +		mutex_lock(&usb_port_peer_mutex); +		hcd->bandwidth_mutex = primary_hcd->bandwidth_mutex; +		hcd->primary_hcd = primary_hcd; +		primary_hcd->primary_hcd = primary_hcd; +		hcd->shared_hcd = primary_hcd; +		primary_hcd->shared_hcd = hcd; +		mutex_unlock(&usb_port_peer_mutex); +	} +  	kref_init(&hcd->kref);  	usb_bus_init(&hcd->self); @@ -2161,22 +2475,64 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,  	init_timer(&hcd->rh_timer);  	hcd->rh_timer.function = rh_timer_func;  	hcd->rh_timer.data = (unsigned long) hcd; -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  	INIT_WORK(&hcd->wakeup_work, hcd_resume_work);  #endif -	mutex_init(&hcd->bandwidth_mutex);  	hcd->driver = driver; +	hcd->speed = driver->flags & HCD_MASK;  	hcd->product_desc = (driver->product_desc) ? driver->product_desc :  			"USB Host Controller";  	return hcd;  } +EXPORT_SYMBOL_GPL(usb_create_shared_hcd); + +/** + * usb_create_hcd - create and initialize an HCD structure + * @driver: HC driver that will use this hcd + * @dev: device for this HC, stored in hcd->self.controller + * @bus_name: value to store in hcd->self.bus_name + * Context: !in_interrupt() + * + * Allocate a struct usb_hcd, with extra space at the end for the + * HC driver's private data.  Initialize the generic members of the + * hcd structure. + * + * Return: On success, a pointer to the created and initialized HCD + * structure. On failure (e.g. if memory is unavailable), %NULL. + */ +struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, +		struct device *dev, const char *bus_name) +{ +	return usb_create_shared_hcd(driver, dev, bus_name, NULL); +}  EXPORT_SYMBOL_GPL(usb_create_hcd); -static void hcd_release (struct kref *kref) +/* + * Roothubs that share one PCI device must also share the bandwidth mutex. + * Don't deallocate the bandwidth_mutex until the last shared usb_hcd is + * deallocated. + * + * Make sure to only deallocate the bandwidth_mutex when the primary HCD is + * freed.  When hcd_release() is called for either hcd in a peer set + * invalidate the peer's ->shared_hcd and ->primary_hcd pointers to + * block new peering attempts + */ +static void hcd_release(struct kref *kref)  {  	struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref); +	mutex_lock(&usb_port_peer_mutex); +	if (usb_hcd_is_primary_hcd(hcd)) +		kfree(hcd->bandwidth_mutex); +	if (hcd->shared_hcd) { +		struct usb_hcd *peer = hcd->shared_hcd; + +		peer->shared_hcd = NULL; +		if (peer->primary_hcd == hcd) +			peer->primary_hcd = NULL; +	} +	mutex_unlock(&usb_port_peer_mutex);  	kfree(hcd);  } @@ -2195,6 +2551,70 @@ void usb_put_hcd (struct usb_hcd *hcd)  }  EXPORT_SYMBOL_GPL(usb_put_hcd); +int usb_hcd_is_primary_hcd(struct usb_hcd *hcd) +{ +	if (!hcd->primary_hcd) +		return 1; +	return hcd == hcd->primary_hcd; +} +EXPORT_SYMBOL_GPL(usb_hcd_is_primary_hcd); + +int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1) +{ +	if (!hcd->driver->find_raw_port_number) +		return port1; + +	return hcd->driver->find_raw_port_number(hcd, port1); +} + +static int usb_hcd_request_irqs(struct usb_hcd *hcd, +		unsigned int irqnum, unsigned long irqflags) +{ +	int retval; + +	if (hcd->driver->irq) { + +		snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", +				hcd->driver->description, hcd->self.busnum); +		retval = request_irq(irqnum, &usb_hcd_irq, irqflags, +				hcd->irq_descr, hcd); +		if (retval != 0) { +			dev_err(hcd->self.controller, +					"request interrupt %d failed\n", +					irqnum); +			return retval; +		} +		hcd->irq = irqnum; +		dev_info(hcd->self.controller, "irq %d, %s 0x%08llx\n", irqnum, +				(hcd->driver->flags & HCD_MEMORY) ? +					"io mem" : "io base", +					(unsigned long long)hcd->rsrc_start); +	} else { +		hcd->irq = 0; +		if (hcd->rsrc_start) +			dev_info(hcd->self.controller, "%s 0x%08llx\n", +					(hcd->driver->flags & HCD_MEMORY) ? +					"io mem" : "io base", +					(unsigned long long)hcd->rsrc_start); +	} +	return 0; +} + +/* + * Before we free this root hub, flush in-flight peering attempts + * and disable peer lookups + */ +static void usb_put_invalidate_rhdev(struct usb_hcd *hcd) +{ +	struct usb_device *rhdev; + +	mutex_lock(&usb_port_peer_mutex); +	rhdev = hcd->self.root_hub; +	hcd->self.root_hub = NULL; +	mutex_unlock(&usb_port_peer_mutex); +	usb_put_dev(rhdev); +} +  /**   * usb_add_hcd - finish generic HCD structure initialization and register   * @hcd: the usb_hcd structure to initialize @@ -2211,9 +2631,31 @@ int usb_add_hcd(struct usb_hcd *hcd,  	int retval;  	struct usb_device *rhdev; +	if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy) { +		struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0); + +		if (IS_ERR(phy)) { +			retval = PTR_ERR(phy); +			if (retval == -EPROBE_DEFER) +				return retval; +		} else { +			retval = usb_phy_init(phy); +			if (retval) { +				usb_put_phy(phy); +				return retval; +			} +			hcd->phy = phy; +			hcd->remove_phy = 1; +		} +	} +  	dev_info(hcd->self.controller, "%s\n", hcd->product_desc); -	hcd->authorized_default = hcd->wireless? 0 : 1; +	/* Keep old behaviour if authorized_default is not in [0, 1]. */ +	if (authorized_default < 0 || authorized_default > 1) +		hcd->authorized_default = hcd->wireless ? 0 : 1; +	else +		hcd->authorized_default = authorized_default;  	set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);  	/* HC is in reset state, but accessible.  Now do the one-time init, @@ -2222,7 +2664,7 @@ int usb_add_hcd(struct usb_hcd *hcd,  	 */  	if ((retval = hcd_buffer_create(hcd)) != 0) {  		dev_dbg(hcd->self.controller, "pool alloc failed\n"); -		return retval; +		goto err_remove_phy;  	}  	if ((retval = usb_register_bus(&hcd->self)) < 0) @@ -2233,19 +2675,25 @@ int usb_add_hcd(struct usb_hcd *hcd,  		retval = -ENOMEM;  		goto err_allocate_root_hub;  	} +	mutex_lock(&usb_port_peer_mutex);  	hcd->self.root_hub = rhdev; +	mutex_unlock(&usb_port_peer_mutex); -	switch (hcd->driver->flags & HCD_MASK) { +	switch (hcd->speed) {  	case HCD_USB11:  		rhdev->speed = USB_SPEED_FULL;  		break;  	case HCD_USB2:  		rhdev->speed = USB_SPEED_HIGH;  		break; +	case HCD_USB25: +		rhdev->speed = USB_SPEED_WIRELESS; +		break;  	case HCD_USB3:  		rhdev->speed = USB_SPEED_SUPER;  		break;  	default: +		retval = -EINVAL;  		goto err_set_rh_speed;  	} @@ -2253,13 +2701,19 @@ int usb_add_hcd(struct usb_hcd *hcd,  	 * but drivers can override it in reset() if needed, along with  	 * recording the overall controller's system wakeup capability.  	 */ -	device_init_wakeup(&rhdev->dev, 1); +	device_set_wakeup_capable(&rhdev->dev, 1); + +	/* HCD_FLAG_RH_RUNNING doesn't matter until the root hub is +	 * registered.  But since the controller can die at any time, +	 * let's initialize the flag before touching the hardware. +	 */ +	set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);  	/* "reset" is misnamed; its role is now one-time init. the controller  	 * should already have been reset (and boot firmware kicked off etc).  	 */  	if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) { -		dev_err(hcd->self.controller, "can't setup\n"); +		dev_err(hcd->self.controller, "can't setup: %d\n", retval);  		goto err_hcd_driver_setup;  	}  	hcd->rh_pollable = 1; @@ -2269,45 +2723,27 @@ int usb_add_hcd(struct usb_hcd *hcd,  			&& device_can_wakeup(&hcd->self.root_hub->dev))  		dev_dbg(hcd->self.controller, "supports USB remote wakeup\n"); -	/* enable irqs just before we start the controller */ -	if (hcd->driver->irq) { - -		/* IRQF_DISABLED doesn't work as advertised when used together -		 * with IRQF_SHARED. As usb_hcd_irq() will always disable -		 * interrupts we can remove it here. -		 */ -		if (irqflags & IRQF_SHARED) -			irqflags &= ~IRQF_DISABLED; +	/* initialize tasklets */ +	init_giveback_urb_bh(&hcd->high_prio_bh); +	init_giveback_urb_bh(&hcd->low_prio_bh); -		snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", -				hcd->driver->description, hcd->self.busnum); -		if ((retval = request_irq(irqnum, &usb_hcd_irq, irqflags, -				hcd->irq_descr, hcd)) != 0) { -			dev_err(hcd->self.controller, -					"request interrupt %d failed\n", irqnum); +	/* enable irqs just before we start the controller, +	 * if the BIOS provides legacy PCI irqs. +	 */ +	if (usb_hcd_is_primary_hcd(hcd) && irqnum) { +		retval = usb_hcd_request_irqs(hcd, irqnum, irqflags); +		if (retval)  			goto err_request_irq; -		} -		hcd->irq = irqnum; -		dev_info(hcd->self.controller, "irq %d, %s 0x%08llx\n", irqnum, -				(hcd->driver->flags & HCD_MEMORY) ? -					"io mem" : "io base", -					(unsigned long long)hcd->rsrc_start); -	} else { -		hcd->irq = -1; -		if (hcd->rsrc_start) -			dev_info(hcd->self.controller, "%s 0x%08llx\n", -					(hcd->driver->flags & HCD_MEMORY) ? -					"io mem" : "io base", -					(unsigned long long)hcd->rsrc_start);  	} -	if ((retval = hcd->driver->start(hcd)) < 0) { +	hcd->state = HC_STATE_RUNNING; +	retval = hcd->driver->start(hcd); +	if (retval < 0) {  		dev_err(hcd->self.controller, "startup error %d\n", retval);  		goto err_hcd_driver_start;  	}  	/* starting here, usbcore will pay attention to this root hub */ -	rhdev->bus_mA = min(500u, hcd->power_budget);  	if ((retval = register_root_hub(hcd)) != 0)  		goto err_register_root_hub; @@ -2319,16 +2755,18 @@ int usb_add_hcd(struct usb_hcd *hcd,  	}  	if (hcd->uses_new_polling && HCD_POLL_RH(hcd))  		usb_hcd_poll_rh_status(hcd); +  	return retval;  error_create_attr_group: +	clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);  	if (HC_IS_RUNNING(hcd->state))  		hcd->state = HC_STATE_QUIESCING;  	spin_lock_irq(&hcd_root_hub_lock);  	hcd->rh_registered = 0;  	spin_unlock_irq(&hcd_root_hub_lock); -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  	cancel_work_sync(&hcd->wakeup_work);  #endif  	mutex_lock(&usb_bus_list_lock); @@ -2343,18 +2781,24 @@ err_register_root_hub:  	clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);  	del_timer_sync(&hcd->rh_timer);  err_hcd_driver_start: -	if (hcd->irq >= 0) +	if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0)  		free_irq(irqnum, hcd);  err_request_irq:  err_hcd_driver_setup:  err_set_rh_speed: -	usb_put_dev(hcd->self.root_hub); +	usb_put_invalidate_rhdev(hcd);  err_allocate_root_hub:  	usb_deregister_bus(&hcd->self);  err_register_bus:  	hcd_buffer_destroy(hcd); +err_remove_phy: +	if (hcd->remove_phy && hcd->phy) { +		usb_phy_shutdown(hcd->phy); +		usb_put_phy(hcd->phy); +		hcd->phy = NULL; +	}  	return retval; -}  +}  EXPORT_SYMBOL_GPL(usb_add_hcd);  /** @@ -2374,6 +2818,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)  	usb_get_dev(rhdev);  	sysfs_remove_group(&rhdev->dev.kobj, &usb_bus_attr_group); +	clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);  	if (HC_IS_RUNNING (hcd->state))  		hcd->state = HC_STATE_QUIESCING; @@ -2382,7 +2827,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)  	hcd->rh_registered = 0;  	spin_unlock_irq (&hcd_root_hub_lock); -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  	cancel_work_sync(&hcd->wakeup_work);  #endif @@ -2390,6 +2835,16 @@ void usb_remove_hcd(struct usb_hcd *hcd)  	usb_disconnect(&rhdev);		/* Sets rhdev to NULL */  	mutex_unlock(&usb_bus_list_lock); +	/* +	 * tasklet_kill() isn't needed here because: +	 * - driver's disconnect() called from usb_disconnect() should +	 *   make sure its URBs are completed during the disconnect() +	 *   callback +	 * +	 * - it is too late to run complete() here since driver may have +	 *   been removed already now +	 */ +  	/* Prevent any more root-hub status calls from the timer.  	 * The HCD might still restart the timer (if a port status change  	 * interrupt occurs), but usb_hcd_poll_rh_status() won't invoke @@ -2406,17 +2861,25 @@ void usb_remove_hcd(struct usb_hcd *hcd)  	clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);  	del_timer_sync(&hcd->rh_timer); -	if (hcd->irq >= 0) -		free_irq(hcd->irq, hcd); +	if (usb_hcd_is_primary_hcd(hcd)) { +		if (hcd->irq > 0) +			free_irq(hcd->irq, hcd); +	} -	usb_put_dev(hcd->self.root_hub);  	usb_deregister_bus(&hcd->self);  	hcd_buffer_destroy(hcd); +	if (hcd->remove_phy && hcd->phy) { +		usb_phy_shutdown(hcd->phy); +		usb_put_phy(hcd->phy); +		hcd->phy = NULL; +	} + +	usb_put_invalidate_rhdev(hcd);  }  EXPORT_SYMBOL_GPL(usb_remove_hcd);  void -usb_hcd_platform_shutdown(struct platform_device* dev) +usb_hcd_platform_shutdown(struct platform_device *dev)  {  	struct usb_hcd *hcd = platform_get_drvdata(dev); @@ -2438,7 +2901,7 @@ struct usb_mon_operations *mon_ops;   * Notice that the code is minimally error-proof. Because usbmon needs   * symbols from usbcore, usbcore gets referenced and cannot be unloaded first.   */ -  +  int usb_mon_register (struct usb_mon_operations *ops)  {  | 
