|
@@ -2912,68 +2912,33 @@ void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Deal with stalled endpoints. The core should have sent the control message
|
|
|
- * to clear the halt condition. However, we need to make the xHCI hardware
|
|
|
- * reset its sequence number, since a device will expect a sequence number of
|
|
|
- * zero after the halt condition is cleared.
|
|
|
+/* Called when clearing halted device. The core should have sent the control
|
|
|
+ * message to clear the device halt condition. The host side of the halt should
|
|
|
+ * already be cleared with a reset endpoint command issued when the STALL tx
|
|
|
+ * event was received.
|
|
|
+ *
|
|
|
* Context: in_interrupt
|
|
|
*/
|
|
|
+
|
|
|
void xhci_endpoint_reset(struct usb_hcd *hcd,
|
|
|
struct usb_host_endpoint *ep)
|
|
|
{
|
|
|
struct xhci_hcd *xhci;
|
|
|
- struct usb_device *udev;
|
|
|
- unsigned int ep_index;
|
|
|
- unsigned long flags;
|
|
|
- int ret;
|
|
|
- struct xhci_virt_ep *virt_ep;
|
|
|
- struct xhci_command *command;
|
|
|
|
|
|
xhci = hcd_to_xhci(hcd);
|
|
|
- udev = (struct usb_device *) ep->hcpriv;
|
|
|
- /* Called with a root hub endpoint (or an endpoint that wasn't added
|
|
|
- * with xhci_add_endpoint()
|
|
|
- */
|
|
|
- if (!ep->hcpriv)
|
|
|
- return;
|
|
|
- ep_index = xhci_get_endpoint_index(&ep->desc);
|
|
|
- virt_ep = &xhci->devs[udev->slot_id]->eps[ep_index];
|
|
|
- if (!virt_ep->stopped_td) {
|
|
|
- xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
|
|
|
- "Endpoint 0x%x not halted, refusing to reset.",
|
|
|
- ep->desc.bEndpointAddress);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (usb_endpoint_xfer_control(&ep->desc)) {
|
|
|
- xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
|
|
|
- "Control endpoint stall already handled.");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- command = xhci_alloc_command(xhci, false, false, GFP_ATOMIC);
|
|
|
- if (!command)
|
|
|
- return;
|
|
|
|
|
|
- xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
|
|
|
- "Queueing reset endpoint command");
|
|
|
- spin_lock_irqsave(&xhci->lock, flags);
|
|
|
- ret = xhci_queue_reset_ep(xhci, command, udev->slot_id, ep_index);
|
|
|
/*
|
|
|
- * Can't change the ring dequeue pointer until it's transitioned to the
|
|
|
- * stopped state, which is only upon a successful reset endpoint
|
|
|
- * command. Better hope that last command worked!
|
|
|
+ * We might need to implement the config ep cmd in xhci 4.8.1 note:
|
|
|
+ * The Reset Endpoint Command may only be issued to endpoints in the
|
|
|
+ * Halted state. If software wishes reset the Data Toggle or Sequence
|
|
|
+ * Number of an endpoint that isn't in the Halted state, then software
|
|
|
+ * may issue a Configure Endpoint Command with the Drop and Add bits set
|
|
|
+ * for the target endpoint. that is in the Stopped state.
|
|
|
*/
|
|
|
- if (!ret) {
|
|
|
- xhci_cleanup_stalled_ring(xhci, udev, ep_index);
|
|
|
- kfree(virt_ep->stopped_td);
|
|
|
- xhci_ring_cmd_db(xhci);
|
|
|
- }
|
|
|
- virt_ep->stopped_td = NULL;
|
|
|
- virt_ep->stopped_stream = 0;
|
|
|
- spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
|
|
|
- if (ret)
|
|
|
- xhci_warn(xhci, "FIXME allocate a new ring segment\n");
|
|
|
+ /* For now just print debug to follow the situation */
|
|
|
+ xhci_dbg(xhci, "Endpoint 0x%x ep reset callback called\n",
|
|
|
+ ep->desc.bEndpointAddress);
|
|
|
}
|
|
|
|
|
|
static int xhci_check_streams_endpoint(struct xhci_hcd *xhci,
|