lkml.org 
[lkml]   [2011]   [May]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] [RFC] usb: Do not attempt to reset the device while it is disabled
Hey Andiry,

Op 31-05-11 02:34, Xu, Andiry schreef:
>> -----Original Message-----
>> From:linux-usb-owner@vger.kernel.org [mailto:linux-usb-
>> owner@vger.kernel.org] On Behalf Of Maarten Lankhorst
>> Sent: Monday, May 30, 2011 5:57 PM
>> To:linux-usb@vger.kernel.org
>> Cc: Sarah Sharp;linux-kernel@vger.kernel.org; Maarten Lankhorst
>> Subject: [PATCH] [RFC] usb: Broaden range of vendor codes for xhci
>>
>> My asrock P67 chipset sends code 192 on device reset. Allowing>= 192
>> to be treated as success fixes it, and allows me to use my USB3 port.
>>
> TRB completion code 192-223 is defined as Vendor defined error. Your
> host
> controller returns a error - don't know what causes the error since it's
> vendor defined.
Ahh, making it the same as COMP_EBADSLT/COMP_CTX_STATE I get this:
[72677.470421] xhci_hcd 0000:04:00.0: Can't reset device (slot ID 1) in
enabled/disabled state

Should reset_device even be called when in that state? The comments
above claim:
/* The Reset Device command can't fail, according to the 0.95/0.96 spec,
* unless we tried to reset a slot ID that wasn't enabled,
* or the device wasn't in the addressed or configured state.
*/

Ignoring the error seems to make it work fine. It seems to me that
device reset shouldn't even be attempted since it hasn't been brought up
yet. The reset that fails is the one that happens on the original
hub_port_init when it calls hub_port_reset which calls
xhci_discover_or_reset_device. The failure I'm getting seems to be a
vendor specific variant of "you're trying to reset the device while it
wasn't enabled".

Signed-off-by: Maarten Lankhorst<m.b.lankhorst@gmail.com>

---
index 81b976e..9a869b2 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -2307,6 +2307,10 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
return -EINVAL;
}

+ if (GET_SLOT_STATE(xhci_get_slot_ctx(xhci, virt_dev->out_ctx)->dev_state) == 0&&
+ (xhci_get_ep_ctx(xhci, virt_dev->out_ctx, 0)->ep_info& EP_STATE_MASK) == EP_STATE_DISABLED)
+ return 0;
+
xhci_dbg(xhci, "Resetting device with slot ID %u\n", slot_id);
/* Allocate the command structure that holds the struct completion.
* Assume we're in process context, since the normal device reset





\
 
 \ /
  Last update: 2011-05-31 15:49    [W:0.326 / U:0.736 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site