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 <shawnn@chromium.org>
Change-Id: I852b87621861109e596ec24b78a8f036d796ff14
Reviewed-on: https://chromium-review.googlesource.com/192866
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Shawn Nematbakhsh 2014-04-02 09:14:32 -07:00 committed by chrome-internal-fetch
commit e67e4f0545

View file

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