* [PATCH 0/3] xhci fixes for usb-linus
@ 2020-08-21 9:15 Mathias Nyman
2020-08-21 9:15 ` [PATCH 1/3] usb: host: xhci: fix ep context print mismatch in debugfs Mathias Nyman
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Mathias Nyman @ 2020-08-21 9:15 UTC (permalink / raw)
To: gregkh; +Cc: linux-usb, Mathias Nyman
Hi Greg
A few xhci fixes for usb-linus.
This series makes sure we don't ignore devices attached during suspend that
are stuck in a resume "cold attach status" state, and makes sure xhci driver
doesn't prevent queuing urbs to a endpoint only because driver previously
refused to manually clear the data toggle of a non-empty endpoint.
-Mathias
Ding Hui (1):
xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed
Kai-Heng Feng (1):
xhci: Do warm-reset when both CAS and XDEV_RESUME are set
Li Jun (1):
usb: host: xhci: fix ep context print mismatch in debugfs
drivers/usb/host/xhci-debugfs.c | 8 ++++----
drivers/usb/host/xhci-hub.c | 19 ++++++++++---------
drivers/usb/host/xhci.c | 3 ++-
3 files changed, 16 insertions(+), 14 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] usb: host: xhci: fix ep context print mismatch in debugfs
2020-08-21 9:15 [PATCH 0/3] xhci fixes for usb-linus Mathias Nyman
@ 2020-08-21 9:15 ` Mathias Nyman
2020-08-21 9:15 ` [PATCH 2/3] xhci: Do warm-reset when both CAS and XDEV_RESUME are set Mathias Nyman
2020-08-21 9:15 ` [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed Mathias Nyman
2 siblings, 0 replies; 6+ messages in thread
From: Mathias Nyman @ 2020-08-21 9:15 UTC (permalink / raw)
To: gregkh; +Cc: linux-usb, Li Jun, stable, Mathias Nyman
From: Li Jun <jun.li@nxp.com>
dci is 0 based and xhci_get_ep_ctx() will do ep index increment to get
the ep context.
[rename dci to ep_index -Mathias]
Cc: stable <stable@vger.kernel.org> # v4.15+
Fixes: 02b6fdc2a153 ("usb: xhci: Add debugfs interface for xHCI driver")
Signed-off-by: Li Jun <jun.li@nxp.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
drivers/usb/host/xhci-debugfs.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/host/xhci-debugfs.c b/drivers/usb/host/xhci-debugfs.c
index 92e25a62fdb5..c88bffd68742 100644
--- a/drivers/usb/host/xhci-debugfs.c
+++ b/drivers/usb/host/xhci-debugfs.c
@@ -274,7 +274,7 @@ static int xhci_slot_context_show(struct seq_file *s, void *unused)
static int xhci_endpoint_context_show(struct seq_file *s, void *unused)
{
- int dci;
+ int ep_index;
dma_addr_t dma;
struct xhci_hcd *xhci;
struct xhci_ep_ctx *ep_ctx;
@@ -283,9 +283,9 @@ static int xhci_endpoint_context_show(struct seq_file *s, void *unused)
xhci = hcd_to_xhci(bus_to_hcd(dev->udev->bus));
- for (dci = 1; dci < 32; dci++) {
- ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, dci);
- dma = dev->out_ctx->dma + dci * CTX_SIZE(xhci->hcc_params);
+ for (ep_index = 0; ep_index < 31; ep_index++) {
+ ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index);
+ dma = dev->out_ctx->dma + (ep_index + 1) * CTX_SIZE(xhci->hcc_params);
seq_printf(s, "%pad: %s\n", &dma,
xhci_decode_ep_context(le32_to_cpu(ep_ctx->ep_info),
le32_to_cpu(ep_ctx->ep_info2),
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] xhci: Do warm-reset when both CAS and XDEV_RESUME are set
2020-08-21 9:15 [PATCH 0/3] xhci fixes for usb-linus Mathias Nyman
2020-08-21 9:15 ` [PATCH 1/3] usb: host: xhci: fix ep context print mismatch in debugfs Mathias Nyman
@ 2020-08-21 9:15 ` Mathias Nyman
2020-08-21 9:15 ` [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed Mathias Nyman
2 siblings, 0 replies; 6+ messages in thread
From: Mathias Nyman @ 2020-08-21 9:15 UTC (permalink / raw)
To: gregkh; +Cc: linux-usb, Kai-Heng Feng, stable, Mathias Nyman
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
Sometimes re-plugging a USB device during system sleep renders the device
useless:
[ 173.418345] xhci_hcd 0000:00:14.0: Get port status 2-4 read: 0x14203e2, return 0x10262
...
[ 176.496485] usb 2-4: Waited 2000ms for CONNECT
[ 176.496781] usb usb2-port4: status 0000.0262 after resume, -19
[ 176.497103] usb 2-4: can't resume, status -19
[ 176.497438] usb usb2-port4: logical disconnect
Because PLS equals to XDEV_RESUME, xHCI driver reports U3 to usbcore,
despite of CAS bit is flagged.
So proritize CAS over XDEV_RESUME to let usbcore handle warm-reset for
the port.
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
drivers/usb/host/xhci-hub.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index c3554e37e09f..4e14e164cb68 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -740,15 +740,6 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,
{
u32 pls = status_reg & PORT_PLS_MASK;
- /* resume state is a xHCI internal state.
- * Do not report it to usb core, instead, pretend to be U3,
- * thus usb core knows it's not ready for transfer
- */
- if (pls == XDEV_RESUME) {
- *status |= USB_SS_PORT_LS_U3;
- return;
- }
-
/* When the CAS bit is set then warm reset
* should be performed on port
*/
@@ -770,6 +761,16 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,
*/
pls |= USB_PORT_STAT_CONNECTION;
} else {
+ /*
+ * Resume state is an xHCI internal state. Do not report it to
+ * usb core, instead, pretend to be U3, thus usb core knows
+ * it's not ready for transfer.
+ */
+ if (pls == XDEV_RESUME) {
+ *status |= USB_SS_PORT_LS_U3;
+ return;
+ }
+
/*
* If CAS bit isn't set but the Port is already at
* Compliance Mode, fake a connection so the USB core
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed
2020-08-21 9:15 [PATCH 0/3] xhci fixes for usb-linus Mathias Nyman
2020-08-21 9:15 ` [PATCH 1/3] usb: host: xhci: fix ep context print mismatch in debugfs Mathias Nyman
2020-08-21 9:15 ` [PATCH 2/3] xhci: Do warm-reset when both CAS and XDEV_RESUME are set Mathias Nyman
@ 2020-08-21 9:15 ` Mathias Nyman
2020-08-23 15:12 ` Greg KH
2 siblings, 1 reply; 6+ messages in thread
From: Mathias Nyman @ 2020-08-21 9:15 UTC (permalink / raw)
To: gregkh; +Cc: linux-usb, Ding Hui, stable, Mathias Nyman
From: Ding Hui <dinghui@sangfor.com.cn>
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.
Fixes: f5249461b504 ("xhci: Clear the host side toggle manually when endpoint is soft reset"
Cc: stable <stable@vger.kernel.org> # v4.17+
Signed-off-by: Ding Hui <dinghui@sangfor.com.cn>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
drivers/usb/host/xhci.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 3c41b14ecce7..e9884ae9c77d 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -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,
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed
2020-08-21 9:15 ` [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed Mathias Nyman
@ 2020-08-23 15:12 ` Greg KH
2020-08-24 10:26 ` Mathias Nyman
0 siblings, 1 reply; 6+ messages in thread
From: Greg KH @ 2020-08-23 15:12 UTC (permalink / raw)
To: Mathias Nyman; +Cc: linux-usb, Ding Hui, stable
On Fri, Aug 21, 2020 at 12:15:49PM +0300, Mathias Nyman wrote:
> From: Ding Hui <dinghui@sangfor.com.cn>
>
> 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.
>
> Fixes: f5249461b504 ("xhci: Clear the host side toggle manually when endpoint is soft reset"
Nit, you forgot the trailing ')' here...
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed
2020-08-23 15:12 ` Greg KH
@ 2020-08-24 10:26 ` Mathias Nyman
0 siblings, 0 replies; 6+ messages in thread
From: Mathias Nyman @ 2020-08-24 10:26 UTC (permalink / raw)
To: Greg KH; +Cc: linux-usb, Ding Hui, stable
On 23.8.2020 18.12, Greg KH wrote:
> On Fri, Aug 21, 2020 at 12:15:49PM +0300, Mathias Nyman wrote:
>> From: Ding Hui <dinghui@sangfor.com.cn>
>>
>> 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.
>>
>> Fixes: f5249461b504 ("xhci: Clear the host side toggle manually when endpoint is soft reset"
>
> Nit, you forgot the trailing ')' here...
>
Argh, I had one job..
Odd that checkpatch didn't catch that.
Thanks for fixing and applying
-Mathias
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-08-24 10:23 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-08-21 9:15 [PATCH 0/3] xhci fixes for usb-linus Mathias Nyman
2020-08-21 9:15 ` [PATCH 1/3] usb: host: xhci: fix ep context print mismatch in debugfs Mathias Nyman
2020-08-21 9:15 ` [PATCH 2/3] xhci: Do warm-reset when both CAS and XDEV_RESUME are set Mathias Nyman
2020-08-21 9:15 ` [PATCH 3/3] xhci: Always restore EP_SOFT_CLEAR_TOGGLE even if ep reset failed Mathias Nyman
2020-08-23 15:12 ` Greg KH
2020-08-24 10:26 ` Mathias Nyman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).