Skip to contentSkip to conversation

Rework "xhci: clear root port wake on bits if controller isn't wake-up capable"

PATCH In review Lu Baolu 2 participants 6 messages Nov 6, 2014 – Nov 14, 2014

Subsystems (2)
lore
Share & tools
lore

Lu Baolu

author
#0 lore raw

v4 cover Rework "xhci: clear root port wake on bits if controller isn't wake-up capable"

This serie of patch reworks commit ff8cbf250b448aac35589f6075082c3fcad8a8fe. This has been discussed at http://www.spinics.net/lists/linux-usb/msg114986.html
It also includes a patch to fix a comment in drivers/usb/host/xhci.h.

Changes in v4:
- Refine xhci_disable_port_wake_on_bits().
- Add "Acked-by: Alan Stern"

Changes in v3:
- Need to consider run-time suspend as well.
- Change "wake-up capable" to "allowed to do wakeup" in both comments and patch description.
- Add "Suggested-by: Alan Stern"

Changes in v2:
- Should not be a quirk.
- Should be applied to all xhci controllers.

Lu Baolu (3):
usb: xhci: Revert "xhci: clear root port wake on bits if controller
isn't wake-up capable"
usb: xhci: This reworks ff8cbf250b448aac35589f6075082c3fcad8a8fe
usb: xhci: fix comment for PORT_DEV_REMOVE

 drivers/usb/host/xhci-hub.c  |  5 +----
 drivers/usb/host/xhci-pci.c  |  2 +-
 drivers/usb/host/xhci-plat.c | 10 +++++++++-
 drivers/usb/host/xhci.c      | 42 +++++++++++++++++++++++++++++++++++++++++-
 drivers/usb/host/xhci.h      |  4 ++--
 5 files changed, 54 insertions(+), 9 deletions(-)
Signature · 1 line
1.9.1
author
#1 lore raw

PATCH v4 1/3 usb: xhci: Revert "xhci: clear root port wake on bits if controller isn't wake-up capable"

This reverts commit ff8cbf250b448aac35589f6075082c3fcad8a8fe.

Commit ff8cbf250b448aac35589f6075082c3fcad8a8fe triggers the bug logged at

https://bugzilla.kernel.org/show_bug.cgi?id=85701

---
 drivers/usb/host/xhci-hub.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/usb/host/xhci-hub.c +1 -4
index 696160d..388cfd8 100644
@@ -22,7 +22,6 @@
 
 
 #include <linux/slab.h>
-#include <linux/device.h>
 #include <asm/unaligned.h>
 
 #include "xhci.h"
@@ -1149,9 +1148,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
 		 * including the USB 3.0 roothub, but only if CONFIG_PM_RUNTIME
 		 * is enabled, so also enable remote wake here.
 		 */
-		if (hcd->self.root_hub->do_remote_wakeup
-				&& device_may_wakeup(hcd->self.controller)) {
-
+		if (hcd->self.root_hub->do_remote_wakeup) {
 			if (t1 & PORT_CONNECT) {
 				t2 |= PORT_WKOC_E | PORT_WKDISC_E;
 				t2 &= ~PORT_WKCONN_E;
Signature · 1 line
1.9.1
author
#2 lore raw

PATCH v4 2/3 usb: xhci: This reworks ff8cbf250b448aac35589f6075082c3fcad8a8fe

In reply to Lu Baolu

xhci: clear root port wake on bits if controller isn't allowed to do wakeup

When system is being suspended, if host device is not allowed to do wakeup, xhci_suspend() needs to clear all root port wake on bits. Otherwise, some platforms may generate spurious wakeup, even if PCI PME# is disabled.

---
 drivers/usb/host/xhci-pci.c  |  2 +-
 drivers/usb/host/xhci-plat.c | 10 +++++++++-
 drivers/usb/host/xhci.c      | 42 +++++++++++++++++++++++++++++++++++++++++-
 drivers/usb/host/xhci.h      |  2 +-
 4 files changed, 52 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-pci.c +1 -1
index 280dde9..d3fa3c2 100644
@@ -291,7 +291,7 @@ static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
 	if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
 		pdev->no_d3cold = true;
 
-	return xhci_suspend(xhci);
+	return xhci_suspend(xhci, do_wakeup);
 }
 
 static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated)
drivers/usb/host/xhci-plat.c +9 -1
index 3d78b0c..646300c 100644
@@ -204,7 +204,15 @@ static int xhci_plat_suspend(struct device *dev)
 	struct usb_hcd	*hcd = dev_get_drvdata(dev);
 	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
 
-	return xhci_suspend(xhci);
+	/*
+	 * xhci_suspend() needs `do_wakeup` to know whether host is allowed
+	 * to do wakeup during suspend. Since xhci_plat_suspend is currently
+	 * only designed for system suspend, device_may_wakeup() is enough
+	 * to dertermine whether host is allowed to do wakeup. Need to
+	 * reconsider this when xhci_plat_suspend enlarges its scope, e.g.,
+	 * also applies to runtime suspend.
+	 */
+	return xhci_suspend(xhci, device_may_wakeup(dev));
 }
 
 static int xhci_plat_resume(struct device *dev)
drivers/usb/host/xhci.c +41 -1

66 lines not on this page · raw message

drivers/usb/host/xhci.h +1 -1
index df76d64..d745715 100644
@@ -1746,7 +1746,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks);
 void xhci_init_driver(struct hc_driver *drv, int (*setup_fn)(struct usb_hcd *));
 
 #ifdef	CONFIG_PM
-int xhci_suspend(struct xhci_hcd *xhci);
+int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup);
 int xhci_resume(struct xhci_hcd *xhci, bool hibernated);
 #else
 #define	xhci_suspend	NULL
Signature · 1 line
1.9.1
author
#3 lore raw

PATCH v4 3/3 usb: xhci: fix comment for PORT_DEV_REMOVE

In reply to Lu Baolu

According to xHCI specification, PORT_DEV_REMOVE(bit 30) in PORTSC true means "Device is non-removable".

---
 drivers/usb/host/xhci.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci.h +1 -1
index d745715..ab36bbb 100644
@@ -358,7 +358,7 @@ struct xhci_op_regs {
 /* wake on over-current (enable) */
 #define PORT_WKOC_E	(1 << 27)
 /* bits 28:29 reserved */
-/* true: device is removable - for USB 3.0 roothub emulation */
+/* true: device is non-removable - for USB 3.0 roothub emulation */
 #define PORT_DEV_REMOVE	(1 << 30)
 /* Initiate a warm port reset - complete when PORT_WRC is '1' */
 #define PORT_WR		(1 << 31)
Signature · 1 line
1.9.1
author
#4 lore raw
In reply to Lu Baolu

Hi Mathias,

This patch series has been acked by Alan Stern. There seems no further comments from others. Can you please pull in it?

Thanks,
-baolu

Quoted 31 lines · Lu Baolu

This serie of patch reworks commit ff8cbf250b448aac35589f6075082c3fcad8a8fe. This has been discussed at http://www.spinics.net/lists/linux-usb/msg114986.html
It also includes a patch to fix a comment in drivers/usb/host/xhci.h.

Changes in v4:
- Refine xhci_disable_port_wake_on_bits().
- Add "Acked-by: Alan Stern"

Changes in v3:
- Need to consider run-time suspend as well.
- Change "wake-up capable" to "allowed to do wakeup" in both comments and patch description.
- Add "Suggested-by: Alan Stern"

Changes in v2:
- Should not be a quirk.
- Should be applied to all xhci controllers.

Lu Baolu (3):
usb: xhci: Revert "xhci: clear root port wake on bits if controller
isn't wake-up capable"
usb: xhci: This reworks ff8cbf250b448aac35589f6075082c3fcad8a8fe
usb: xhci: fix comment for PORT_DEV_REMOVE

  drivers/usb/host/xhci-hub.c  |  5 +----
  drivers/usb/host/xhci-pci.c  |  2 +-
  drivers/usb/host/xhci-plat.c | 10 +++++++++-
  drivers/usb/host/xhci.c      | 42 +++++++++++++++++++++++++++++++++++++++++-
  drivers/usb/host/xhci.h      |  4 ++--
  5 files changed, 54 insertions(+), 9 deletions(-)
#5 lore raw
Quoted 7 lines · Baolu

Hi Mathias,

This patch series has been acked by Alan Stern. There seems no further comments from others. Can you please pull in it?

Thanks,
-baolu

Ah, yes, thanks for reminding, I'll pull them in and send them forward.

-Mathias