| From c3492dbfa1050debf23a5b5cd2bc7514c5b37896 Mon Sep 17 00:00:00 2001 |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Date: Tue, 18 Nov 2014 11:27:11 +0200 |
| Subject: USB: xhci: don't start a halted endpoint before its new dequeue is set |
| |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| |
| commit c3492dbfa1050debf23a5b5cd2bc7514c5b37896 upstream. |
| |
| A halted endpoint ring must first be reset, then move the ring |
| dequeue pointer past the problematic TRB. If we start the ring too |
| early after reset, but before moving the dequeue pointer we |
| will end up executing the same problematic TRB again. |
| |
| As we always issue a set transfer dequeue command after a reset |
| endpoint command we can skip starting endpoint rings at reset endpoint |
| command completion. |
| |
| Without this fix we end up trying to handle the same faulty TD for |
| contol endpoints. causing timeout, and failing testusb ctrl_out write |
| tests. |
| |
| Fixes: e9df17e (USB: xhci: Correct assumptions about number of rings per endpoint.) |
| 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> |
| |
| --- |
| drivers/usb/host/xhci-ring.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/usb/host/xhci-ring.c |
| +++ b/drivers/usb/host/xhci-ring.c |
| @@ -1180,9 +1180,8 @@ static void xhci_handle_cmd_reset_ep(str |
| false); |
| xhci_ring_cmd_db(xhci); |
| } else { |
| - /* Clear our internal halted state and restart the ring(s) */ |
| + /* Clear our internal halted state */ |
| xhci->devs[slot_id]->eps[ep_index].ep_state &= ~EP_HALTED; |
| - ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
| } |
| } |
| |