[PATCH] [RFC] usb: Do not attempt to reset the device while it isdisabled

From: Maarten Lankhorst
Date: Tue May 31 2011 - 09:47:26 EST


Hey Andiry,

Op 31-05-11 02:34, Xu, Andiry schreef:
-----Original Message-----
From:linux-usb-owner@xxxxxxxxxxxxxxx [mailto:linux-usb-
owner@xxxxxxxxxxxxxxx] On Behalf Of Maarten Lankhorst
Sent: Monday, May 30, 2011 5:57 PM
To:linux-usb@xxxxxxxxxxxxxxx
Cc: Sarah Sharp;linux-kernel@xxxxxxxxxxxxxxx; 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@xxxxxxxxx>

---
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




--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/