mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
Revert "xhci: Prevent early endpoint restart when handling STALL errors."
This reverts commit 860f5d0d35.
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>
This commit is contained in:
parent
af1352f827
commit
b513cc1905
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user