patch "xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From f1ec7ae6c9f8c016db320e204cb519a1da1581b8 Mon Sep 17 00:00:00 2001
From: Ding Hui <[email protected]>
Date: Fri, 21 Aug 2020 12:15:49 +0300
Subject: xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed
Some device drivers call libusb_clear_halt when target ep queue is not empty. (eg. spice client connected to qemu for usb redir)
Before commit f5249461b504 ("xhci: Clear the host side toggle manually when endpoint is soft reset"), that works well. But now, we got the error log:
EP not empty, refuse reset
xhci_endpoint_reset failed and left ep_state's EP_SOFT_CLEAR_TOGGLE bit still set
So all the subsequent urb sumbits to the ep will fail with the warn log:
Can't enqueue URB while manually clearing toggle
We need to clear ep_state EP_SOFT_CLEAR_TOGGLE bit after xhci_endpoint_reset, even if it failed.
--- drivers/usb/host/xhci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/host/xhci.c +2 -1
@@ -3236,10 +3236,11 @@ static void xhci_endpoint_reset(struct usb_hcd *hcd,wait_for_completion (cfg_cmd->completion); - ep->ep_state &= ~EP_SOFT_CLEAR_TOGGLE ;xhci_free_command (xhci, cfg_cmd); cleanup:xhci_free_command (xhci, stop_cmd); +if (ep->ep_state &EP_SOFT_CLEAR_TOGGLE ) + ep->ep_state &= ~EP_SOFT_CLEAR_TOGGLE ; } static int xhci_check_streams_endpoint(struct xhci_hcd *xhci,
Signature · 1 line
2.28.0