|
@@ -1822,22 +1822,13 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
|
|
ep->stopped_td = td;
|
|
ep->stopped_td = td;
|
|
|
return 0;
|
|
return 0;
|
|
|
} else {
|
|
} else {
|
|
|
- if (trb_comp_code == COMP_STALL) {
|
|
|
|
|
- /* The transfer is completed from the driver's
|
|
|
|
|
- * perspective, but we need to issue a set dequeue
|
|
|
|
|
- * command for this stalled endpoint to move the dequeue
|
|
|
|
|
- * pointer past the TD. We can't do that here because
|
|
|
|
|
- * the halt condition must be cleared first. Let the
|
|
|
|
|
- * USB class driver clear the stall later.
|
|
|
|
|
- */
|
|
|
|
|
- ep->stopped_td = td;
|
|
|
|
|
- ep->stopped_stream = ep_ring->stream_id;
|
|
|
|
|
- } else if (xhci_requires_manual_halt_cleanup(xhci,
|
|
|
|
|
- ep_ctx, trb_comp_code)) {
|
|
|
|
|
- /* Other types of errors halt the endpoint, but the
|
|
|
|
|
- * class driver doesn't call usb_reset_endpoint() unless
|
|
|
|
|
- * the error is -EPIPE. Clear the halted status in the
|
|
|
|
|
- * xHCI hardware manually.
|
|
|
|
|
|
|
+ if (trb_comp_code == COMP_STALL ||
|
|
|
|
|
+ xhci_requires_manual_halt_cleanup(xhci, ep_ctx,
|
|
|
|
|
+ trb_comp_code)) {
|
|
|
|
|
+ /* Issue a reset endpoint command to clear the host side
|
|
|
|
|
+ * halt, followed by a set dequeue command to move the
|
|
|
|
|
+ * dequeue pointer past the TD.
|
|
|
|
|
+ * The class driver clears the device side halt later.
|
|
|
*/
|
|
*/
|
|
|
xhci_cleanup_halted_endpoint(xhci,
|
|
xhci_cleanup_halted_endpoint(xhci,
|
|
|
slot_id, ep_index, ep_ring->stream_id,
|
|
slot_id, ep_index, ep_ring->stream_id,
|
|
@@ -1957,9 +1948,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
|
|
else
|
|
else
|
|
|
td->urb->actual_length = 0;
|
|
td->urb->actual_length = 0;
|
|
|
|
|
|
|
|
- xhci_cleanup_halted_endpoint(xhci,
|
|
|
|
|
- slot_id, ep_index, 0, td, event_trb);
|
|
|
|
|
- return finish_td(xhci, td, event_trb, event, ep, status, true);
|
|
|
|
|
|
|
+ return finish_td(xhci, td, event_trb, event, ep, status, false);
|
|
|
}
|
|
}
|
|
|
/*
|
|
/*
|
|
|
* Did we transfer any data, despite the errors that might have
|
|
* Did we transfer any data, despite the errors that might have
|
|
@@ -2518,17 +2507,8 @@ cleanup:
|
|
|
if (ret) {
|
|
if (ret) {
|
|
|
urb = td->urb;
|
|
urb = td->urb;
|
|
|
urb_priv = urb->hcpriv;
|
|
urb_priv = urb->hcpriv;
|
|
|
- /* Leave the TD around for the reset endpoint function
|
|
|
|
|
- * to use(but only if it's not a control endpoint,
|
|
|
|
|
- * since we already queued the Set TR dequeue pointer
|
|
|
|
|
- * command for stalled control endpoints).
|
|
|
|
|
- */
|
|
|
|
|
- if (usb_endpoint_xfer_control(&urb->ep->desc) ||
|
|
|
|
|
- (trb_comp_code != COMP_STALL &&
|
|
|
|
|
- trb_comp_code != COMP_BABBLE))
|
|
|
|
|
- xhci_urb_free_priv(xhci, urb_priv);
|
|
|
|
|
- else
|
|
|
|
|
- kfree(urb_priv);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ xhci_urb_free_priv(xhci, urb_priv);
|
|
|
|
|
|
|
|
usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb);
|
|
usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb);
|
|
|
if ((urb->actual_length != urb->transfer_buffer_length &&
|
|
if ((urb->actual_length != urb->transfer_buffer_length &&
|