USB: xhci: Reset a halted endpoint immediately when we encounter a stall.
authorMathias Nyman <mathias.nyman@linux.intel.com>
Tue, 18 Nov 2014 09:27:12 +0000 (11:27 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 14 Dec 2014 16:23:59 +0000 (16:23 +0000)
commit01bb4fded2b69d606ad1f04905102dade83193be
tree70f16246ecbbc0e3a7b62f7be603e764cdbae84d
parentfcd751b7ecdf627a0279f753f21ba7e39f1a7d46
USB: xhci: Reset a halted endpoint immediately when we encounter a stall.

commit 8e71a322fdb127814bcba423a512914ca5bc6cf5 upstream.

If a device is halted and reuturns a STALL, then the halted endpoint
needs to be cleared both on the host and device side. The host
side halt is cleared by issueing a xhci reset endpoint command. The device side
is cleared with a ClearFeature(ENDPOINT_HALT) request, which should
be issued by the device driver if a URB reruen -EPIPE.

Previously we cleared the host side halt after the device side was cleared.
To make sure the host side halt is cleared in time we want to issue the
reset endpoint command immedialtely when a STALL status is encountered.

Otherwise we end up not following the specs and not returning -EPIPE
several times in a row when trying to transfer data to a halted endpoint.

Fixes: bcef3fd (USB: xhci: Handle errors that cause endpoint halts.)
Tested-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[bwh: Backported to 3.2: xhci_endpoint_reset() looked a little different]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c