From e67e4f0545cbdc074328c83c7edccf9e712cd7be Mon Sep 17 00:00:00 2001 From: Shawn Nematbakhsh Date: Wed, 2 Apr 2014 09:14:32 -0700 Subject: [PATCH] libpayload: usb: xhci: Fix STALL endpoint handling - Remove the call to clear_stall in xhci_reset_endpoint because we will call clear_stall from the mass-storage driver. - Remove the xhci_reset_endpoint call from xhci_bulk on STALL since we will reset on the next transfer anyway. - Remove the clear_halt parameter from xhci_bulk since it's now unused. BUG=chrome-os-partner:26687 TEST=Manual on Rambi w/ USB_DEBUG enabled in libpayload. Boot with SanDisk Extreme USB 3.0 drive in USB 3.0 port, verify that after STALL is encountered reset succeeds and device is initialized without extra delay. BRANCH=Rambi Signed-off-by: Shawn Nematbakhsh Change-Id: I852b87621861109e596ec24b78a8f036d796ff14 Reviewed-on: https://chromium-review.googlesource.com/192866 Reviewed-by: Aaron Durbin Reviewed-by: Julius Werner --- payloads/libpayload/drivers/usb/xhci.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/payloads/libpayload/drivers/usb/xhci.c b/payloads/libpayload/drivers/usb/xhci.c index 6a9939ca89..62b98a0cca 100644 --- a/payloads/libpayload/drivers/usb/xhci.c +++ b/payloads/libpayload/drivers/usb/xhci.c @@ -439,8 +439,7 @@ xhci_stop (hci_t *controller) } static int -xhci_reset_endpoint(usbdev_t *const dev, endpoint_t *const ep, - const int clear_halt) +xhci_reset_endpoint(usbdev_t *const dev, endpoint_t *const ep) { xhci_t *const xhci = XHCI_INST(dev->controller); const int slot_id = dev->address; @@ -465,10 +464,6 @@ xhci_reset_endpoint(usbdev_t *const dev, endpoint_t *const ep, dev->controller->devices[hub]->speed == HIGH_SPEED) /* TODO */; - /* Try clearing the device' halt condition on non-control endpoints */ - if (clear_halt && ep) - clear_stall(ep); - /* Reset transfer ring if the endpoint is in the right state */ const unsigned ep_state = EC_GET(STATE, epctx); if (ep_state == 3 || ep_state == 4) { @@ -580,7 +575,7 @@ xhci_control(usbdev_t *const dev, const direction_t dir, /* Reset endpoint if it's not running */ const unsigned ep_state = EC_GET(STATE, epctx); if (ep_state > 1) { - if (xhci_reset_endpoint(dev, NULL, 0)) + if (xhci_reset_endpoint(dev, NULL)) return -1; } @@ -691,7 +686,7 @@ xhci_bulk(endpoint_t *const ep, const int size, u8 *const src, /* Reset endpoint if it's not running */ const unsigned ep_state = EC_GET(STATE, epctx); if (ep_state > 1) { - if (xhci_reset_endpoint(ep->dev, ep, 0)) + if (xhci_reset_endpoint(ep->dev, ep)) return -1; } @@ -708,8 +703,6 @@ xhci_bulk(endpoint_t *const ep, const int size, u8 *const src, xhci_debug("Stopping ID %d EP %d\n", ep->dev->address, ep_id); xhci_cmd_stop_endpoint(xhci, ep->dev->address, ep_id); - } else if (ret == -CC_STALL_ERROR) { - xhci_reset_endpoint(ep->dev, ep, 1); } xhci_debug("Bulk transfer failed: %d\n" " ep state: %d -> %d\n"