linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).