]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Revert "xhci: Prevent early endpoint restart when handling STALL errors."
authorMathias Nyman <mathias.nyman@linux.intel.com>
Thu, 10 Apr 2025 15:18:24 +0000 (18:18 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Apr 2025 12:36:55 +0000 (14:36 +0200)
This reverts commit 860f5d0d3594005d4588240028f42e8d2bfc725b.

Paul Menzel reported that the two EP_STALLED patches in 6.15-rc1 cause
regression. Turns out that the new flag may never get cleared after
reset-resume, preventing xhci from restarting the endpoint.

Revert this to take a proper look at it.

Link: https://lore.kernel.org/linux-usb/84b400f8-2943-44e0-8803-f3aac3b670af@molgen.mpg.de
cc: Paul Menzel <pmenzel@molgen.mpg.de>
cc: Michal Pecio <michal.pecio@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20250410151828.2868740-3-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h

index 5d64c297721cd94088725e883f3fba520522c725..94a2ae2c52e2a21c27a931d8db59278d0ddfba67 100644 (file)
@@ -561,8 +561,8 @@ void xhci_ring_ep_doorbell(struct xhci_hcd *xhci,
         * pointer command pending because the device can choose to start any
         * stream once the endpoint is on the HW schedule.
         */
-       if (ep_state & (EP_STOP_CMD_PENDING | SET_DEQ_PENDING | EP_HALTED |
-                       EP_CLEARING_TT | EP_STALLED))
+       if ((ep_state & EP_STOP_CMD_PENDING) || (ep_state & SET_DEQ_PENDING) ||
+           (ep_state & EP_HALTED) || (ep_state & EP_CLEARING_TT))
                return;
 
        trace_xhci_ring_ep_doorbell(slot_id, DB_VALUE(ep_index, stream_id));
@@ -2573,9 +2573,6 @@ static void process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep,
 
                xhci_handle_halted_endpoint(xhci, ep, td, EP_SOFT_RESET);
                return;
-       case COMP_STALL_ERROR:
-               ep->ep_state |= EP_STALLED;
-               break;
        default:
                /* do nothing */
                break;
index 6370874bf2656a078df4a646b7620454cd516c8a..ca390beda85b561586d6348297925945cec9750f 100644 (file)
@@ -1605,11 +1605,6 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
                goto free_priv;
        }
 
-       /* Class driver might not be aware ep halted due to async URB giveback */
-       if (*ep_state & EP_STALLED)
-               dev_dbg(&urb->dev->dev, "URB %p queued before clearing halt\n",
-                       urb);
-
        switch (usb_endpoint_type(&urb->ep->desc)) {
 
        case USB_ENDPOINT_XFER_CONTROL:
@@ -3208,7 +3203,6 @@ static void xhci_endpoint_reset(struct usb_hcd *hcd,
                return;
 
        ep = &vdev->eps[ep_index];
-       ep->ep_state &= ~EP_STALLED;
 
        /* Bail out if toggle is already being cleared by a endpoint reset */
        spin_lock_irqsave(&xhci->lock, flags);
index 37860f1e3abac4749f9868578b547d5396a9111a..28b6264f8b875a3ae39a6917127226750de1b2c2 100644 (file)
@@ -664,7 +664,7 @@ struct xhci_virt_ep {
        unsigned int                    err_count;
        unsigned int                    ep_state;
 #define SET_DEQ_PENDING                (1 << 0)
-#define EP_HALTED              (1 << 1)        /* Halted host ep handling */
+#define EP_HALTED              (1 << 1)        /* For stall handling */
 #define EP_STOP_CMD_PENDING    (1 << 2)        /* For URB cancellation */
 /* Transitioning the endpoint to using streams, don't enqueue URBs */
 #define EP_GETTING_STREAMS     (1 << 3)
@@ -675,7 +675,6 @@ struct xhci_virt_ep {
 #define EP_SOFT_CLEAR_TOGGLE   (1 << 7)
 /* usb_hub_clear_tt_buffer is in progress */
 #define EP_CLEARING_TT         (1 << 8)
-#define EP_STALLED             (1 << 9)        /* For stall handling */
        /* ----  Related to URB cancellation ---- */
        struct list_head        cancelled_td_list;
        struct xhci_hcd         *xhci;