aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2013-12-05 20:07:27 -0500
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2013-12-10 16:54:37 -0500
commit48fc7dbd52c0559647291f33a10ccdc6cdbe4c72 (patch)
tree4a2403420a69b2d40e38a53302771ec3d3eb6b66 /drivers/usb
parent40fcd88b8d49fd911518190c985112097d3a8a17 (diff)
usb: xhci: change enumeration scheme to 'new scheme' by default
Change the default enumeration scheme for xhci attached non-SuperSpeed devices from: Reset SetAddress [xhci address-device BSR = 0] GetDescriptor(8) GetDescriptor(18) ...to: Reset [xhci address-device BSR = 1] GetDescriptor(64) Reset SetAddress [xhci address-device BSR = 0] GetDescriptor(18) ...as some devices misbehave when encountering a SetAddress command prior to GetDescriptor. There are known legacy devices that require this scheme, but testing has found at least one USB3 device that fails enumeration when presented with this ordering. For now, follow the ehci case and enable 'new scheme' by default for non-SuperSpeed devices. To support this enumeration scheme on xhci the AddressDevice operation needs to be performed twice. The first instance of the command enables the HC's device and slot context info for the device, but omits sending the device a SetAddress command (BSR == block set address request). Then, after GetDescriptor completes, follow up with the full AddressDevice+SetAddress operation. As mentioned before, this ordering of events with USB3 devices causes an extra state transition to be exposed to xhci. Previously USB3 devices would transition directly from 'enabled' to 'addressed' and never need to underrun responses to 'get descriptor'. We do see the 64-byte descriptor fetch the correct data, but the following 18-byte descriptor read after the reset gets: bLength = 0 bDescriptorType = 0 bcdUSB = 0 bDeviceClass = 0 bDeviceSubClass = 0 bDeviceProtocol = 0 bMaxPacketSize0 = 9 instead of: bLength = 12 bDescriptorType = 1 bcdUSB = 300 bDeviceClass = 0 bDeviceSubClass = 0 bDeviceProtocol = 0 bMaxPacketSize0 = 9 which results in the discovery process looping until falling back to 'old scheme' enumeration. Acked-by: Alan Stern <stern@rowland.harvard.edu> Reported-by: David Moore <david.moore@gmail.com> Suggested-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/hub.c46
-rw-r--r--drivers/usb/host/xhci-pci.c1
-rw-r--r--drivers/usb/host/xhci-plat.c1
-rw-r--r--drivers/usb/host/xhci-ring.c6
-rw-r--r--drivers/usb/host/xhci.c19
-rw-r--r--drivers/usb/host/xhci.h11
6 files changed, 73 insertions, 11 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 32e1035d4f59..6a11eff74d3c 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2498,6 +2498,21 @@ static unsigned hub_is_wusb(struct usb_hub *hub)
2498#define HUB_LONG_RESET_TIME 200 2498#define HUB_LONG_RESET_TIME 200
2499#define HUB_RESET_TIMEOUT 800 2499#define HUB_RESET_TIMEOUT 800
2500 2500
2501/*
2502 * "New scheme" enumeration causes an extra state transition to be
2503 * exposed to an xhci host and causes USB3 devices to receive control
2504 * commands in the default state. This has been seen to cause
2505 * enumeration failures, so disable this enumeration scheme for USB3
2506 * devices.
2507 */
2508static bool use_new_scheme(struct usb_device *udev, int retry)
2509{
2510 if (udev->speed == USB_SPEED_SUPER)
2511 return false;
2512
2513 return USE_NEW_SCHEME(retry);
2514}
2515
2501static int hub_port_reset(struct usb_hub *hub, int port1, 2516static int hub_port_reset(struct usb_hub *hub, int port1,
2502 struct usb_device *udev, unsigned int delay, bool warm); 2517 struct usb_device *udev, unsigned int delay, bool warm);
2503 2518
@@ -3956,6 +3971,20 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev)
3956 } 3971 }
3957} 3972}
3958 3973
3974static int hub_enable_device(struct usb_device *udev)
3975{
3976 struct usb_hcd *hcd = bus_to_hcd(udev->bus);
3977
3978 if (!hcd->driver->enable_device)
3979 return 0;
3980 if (udev->state == USB_STATE_ADDRESS)
3981 return 0;
3982 if (udev->state != USB_STATE_DEFAULT)
3983 return -EINVAL;
3984
3985 return hcd->driver->enable_device(hcd, udev);
3986}
3987
3959/* Reset device, (re)assign address, get device descriptor. 3988/* Reset device, (re)assign address, get device descriptor.
3960 * Device connection must be stable, no more debouncing needed. 3989 * Device connection must be stable, no more debouncing needed.
3961 * Returns device in USB_STATE_ADDRESS, except on error. 3990 * Returns device in USB_STATE_ADDRESS, except on error.
@@ -4068,7 +4097,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
4068 * this area, and this is how Linux has done it for ages. 4097 * this area, and this is how Linux has done it for ages.
4069 * Change it cautiously. 4098 * Change it cautiously.
4070 * 4099 *
4071 * NOTE: If USE_NEW_SCHEME() is true we will start by issuing 4100 * NOTE: If use_new_scheme() is true we will start by issuing
4072 * a 64-byte GET_DESCRIPTOR request. This is what Windows does, 4101 * a 64-byte GET_DESCRIPTOR request. This is what Windows does,
4073 * so it may help with some non-standards-compliant devices. 4102 * so it may help with some non-standards-compliant devices.
4074 * Otherwise we start with SET_ADDRESS and then try to read the 4103 * Otherwise we start with SET_ADDRESS and then try to read the
@@ -4076,10 +4105,17 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
4076 * value. 4105 * value.
4077 */ 4106 */
4078 for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { 4107 for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) {
4079 if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) { 4108 bool did_new_scheme = false;
4109
4110 if (use_new_scheme(udev, retry_counter)) {
4080 struct usb_device_descriptor *buf; 4111 struct usb_device_descriptor *buf;
4081 int r = 0; 4112 int r = 0;
4082 4113
4114 did_new_scheme = true;
4115 retval = hub_enable_device(udev);
4116 if (retval < 0)
4117 goto fail;
4118
4083#define GET_DESCRIPTOR_BUFSIZE 64 4119#define GET_DESCRIPTOR_BUFSIZE 64
4084 buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO); 4120 buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO);
4085 if (!buf) { 4121 if (!buf) {
@@ -4168,7 +4204,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
4168 * - read ep0 maxpacket even for high and low speed, 4204 * - read ep0 maxpacket even for high and low speed,
4169 */ 4205 */
4170 msleep(10); 4206 msleep(10);
4171 if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) 4207 /* use_new_scheme() checks the speed which may have
4208 * changed since the initial look so we cache the result
4209 * in did_new_scheme
4210 */
4211 if (did_new_scheme)
4172 break; 4212 break;
4173 } 4213 }
4174 4214
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index b8dffd59eb25..4221dee924b5 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -331,6 +331,7 @@ static const struct hc_driver xhci_pci_hc_driver = {
331 .check_bandwidth = xhci_check_bandwidth, 331 .check_bandwidth = xhci_check_bandwidth,
332 .reset_bandwidth = xhci_reset_bandwidth, 332 .reset_bandwidth = xhci_reset_bandwidth,
333 .address_device = xhci_address_device, 333 .address_device = xhci_address_device,
334 .enable_device = xhci_enable_device,
334 .update_hub_device = xhci_update_hub_device, 335 .update_hub_device = xhci_update_hub_device,
335 .reset_device = xhci_discover_or_reset_device, 336 .reset_device = xhci_discover_or_reset_device,
336 337
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 9d29aa1b1bc8..8abda5c73ca1 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -69,6 +69,7 @@ static const struct hc_driver xhci_plat_xhci_driver = {
69 .check_bandwidth = xhci_check_bandwidth, 69 .check_bandwidth = xhci_check_bandwidth,
70 .reset_bandwidth = xhci_reset_bandwidth, 70 .reset_bandwidth = xhci_reset_bandwidth,
71 .address_device = xhci_address_device, 71 .address_device = xhci_address_device,
72 .enable_device = xhci_enable_device,
72 .update_hub_device = xhci_update_hub_device, 73 .update_hub_device = xhci_update_hub_device,
73 .reset_device = xhci_discover_or_reset_device, 74 .reset_device = xhci_discover_or_reset_device,
74 75
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index fe9208a5d103..d26cd9474aa6 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -4004,12 +4004,12 @@ int xhci_queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id)
4004 4004
4005/* Queue an address device command TRB */ 4005/* Queue an address device command TRB */
4006int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, 4006int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr,
4007 u32 slot_id) 4007 u32 slot_id, enum xhci_setup_dev setup)
4008{ 4008{
4009 return queue_command(xhci, lower_32_bits(in_ctx_ptr), 4009 return queue_command(xhci, lower_32_bits(in_ctx_ptr),
4010 upper_32_bits(in_ctx_ptr), 0, 4010 upper_32_bits(in_ctx_ptr), 0,
4011 TRB_TYPE(TRB_ADDR_DEV) | SLOT_ID_FOR_TRB(slot_id), 4011 TRB_TYPE(TRB_ADDR_DEV) | SLOT_ID_FOR_TRB(slot_id)
4012 false); 4012 | (setup == SETUP_CONTEXT_ONLY ? TRB_BSR : 0), false);
4013} 4013}
4014 4014
4015int xhci_queue_vendor_command(struct xhci_hcd *xhci, 4015int xhci_queue_vendor_command(struct xhci_hcd *xhci,
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 7fe6f664054f..6598f7ee7938 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -3709,12 +3709,13 @@ disable_slot:
3709} 3709}
3710 3710
3711/* 3711/*
3712 * Issue an Address Device command (which will issue a SetAddress request to 3712 * Issue an Address Device command and optionally send a corresponding
3713 * the device). 3713 * SetAddress request to the device.
3714 * We should be protected by the usb_address0_mutex in khubd's hub_port_init, so 3714 * We should be protected by the usb_address0_mutex in khubd's hub_port_init, so
3715 * we should only issue and wait on one address command at the same time. 3715 * we should only issue and wait on one address command at the same time.
3716 */ 3716 */
3717int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) 3717static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
3718 enum xhci_setup_dev setup)
3718{ 3719{
3719 unsigned long flags; 3720 unsigned long flags;
3720 int timeleft; 3721 int timeleft;
@@ -3773,7 +3774,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
3773 spin_lock_irqsave(&xhci->lock, flags); 3774 spin_lock_irqsave(&xhci->lock, flags);
3774 cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); 3775 cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring);
3775 ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, 3776 ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma,
3776 udev->slot_id); 3777 udev->slot_id, setup);
3777 if (ret) { 3778 if (ret) {
3778 spin_unlock_irqrestore(&xhci->lock, flags); 3779 spin_unlock_irqrestore(&xhci->lock, flags);
3779 xhci_dbg_trace(xhci, trace_xhci_dbg_address, 3780 xhci_dbg_trace(xhci, trace_xhci_dbg_address,
@@ -3868,6 +3869,16 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
3868 return 0; 3869 return 0;
3869} 3870}
3870 3871
3872int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
3873{
3874 return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ADDRESS);
3875}
3876
3877int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev)
3878{
3879 return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ONLY);
3880}
3881
3871/* 3882/*
3872 * Transfer the port index into real index in the HW port status 3883 * Transfer the port index into real index in the HW port status
3873 * registers. Caculate offset between the port's PORTSC register 3884 * registers. Caculate offset between the port's PORTSC register
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 7807f621a713..24344aab2107 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1108,6 +1108,14 @@ struct xhci_event_cmd {
1108}; 1108};
1109 1109
1110/* flags bitmasks */ 1110/* flags bitmasks */
1111
1112/* Address device - disable SetAddress */
1113#define TRB_BSR (1<<9)
1114enum xhci_setup_dev {
1115 SETUP_CONTEXT_ONLY,
1116 SETUP_CONTEXT_ADDRESS,
1117};
1118
1111/* bits 16:23 are the virtual function ID */ 1119/* bits 16:23 are the virtual function ID */
1112/* bits 24:31 are the slot ID */ 1120/* bits 24:31 are the slot ID */
1113#define TRB_TO_SLOT_ID(p) (((p) & (0xff<<24)) >> 24) 1121#define TRB_TO_SLOT_ID(p) (((p) & (0xff<<24)) >> 24)
@@ -1760,6 +1768,7 @@ int xhci_free_streams(struct usb_hcd *hcd, struct usb_device *udev,
1760 struct usb_host_endpoint **eps, unsigned int num_eps, 1768 struct usb_host_endpoint **eps, unsigned int num_eps,
1761 gfp_t mem_flags); 1769 gfp_t mem_flags);
1762int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev); 1770int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev);
1771int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev);
1763int xhci_update_device(struct usb_hcd *hcd, struct usb_device *udev); 1772int xhci_update_device(struct usb_hcd *hcd, struct usb_device *udev);
1764int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, 1773int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
1765 struct usb_device *udev, int enable); 1774 struct usb_device *udev, int enable);
@@ -1783,7 +1792,7 @@ int xhci_is_vendor_info_code(struct xhci_hcd *xhci, unsigned int trb_comp_code);
1783void xhci_ring_cmd_db(struct xhci_hcd *xhci); 1792void xhci_ring_cmd_db(struct xhci_hcd *xhci);
1784int xhci_queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id); 1793int xhci_queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id);
1785int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, 1794int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr,
1786 u32 slot_id); 1795 u32 slot_id, enum xhci_setup_dev);
1787int xhci_queue_vendor_command(struct xhci_hcd *xhci, 1796int xhci_queue_vendor_command(struct xhci_hcd *xhci,
1788 u32 field1, u32 field2, u32 field3, u32 field4); 1797 u32 field1, u32 field2, u32 field3, u32 field4);
1789int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id, 1798int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id,