On Tue, 29 Apr 2014, Peter Münster wrote:
> On Tue, Apr 29 2014, Alan Stern wrote:
>
> > It's noticeable that your logs include resets of the affected devices,
> > whereas the older kernels did not need any resets. This suggests that
> > these OHCI controllers will always have problems with global suspend,
> > and therefore a controller-specific fix is needed.
>
> Perhaps this is related:
> https://mailman.archlinux.org/pipermail/arch-general/2014-January/034831.html
I can't tell.
> > Can you post the output from "lspci -v -s 12.1"
>
> 00:12.1 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB
> OHCI1 Controller (prog-if 10 [OHCI])
> Subsystem: ASUSTeK Computer Inc. Device 8389
> Flags: bus master, 66MHz, medium devsel, latency 64, IRQ 16
> Memory at f8ffd000 (32-bit, non-prefetchable) [size=4K]
> Kernel driver in use: ohci_hcd
Okay, good. Below is a patch which I hope will fix your problem. You
can leave diag1 in place if you want, but remove all the other patches.
Alan Stern
Index: usb-3.15/drivers/usb/host/ohci-hub.c
===================================================================
--- usb-3.15.orig/drivers/usb/host/ohci-hub.c
+++ usb-3.15/drivers/usb/host/ohci-hub.c
@@ -90,6 +90,24 @@ __acquires(ohci->lock)
dl_done_list (ohci);
finish_unlinks (ohci, ohci_frame_no(ohci));
+ /*
+ * Some controllers don't handle "global" suspend properly if
+ * there are unsuspended ports. For these controllers, put all
+ * the enabled ports into suspend before suspending the root hub.
+ */
+ if (ohci->flags & OHCI_QUIRK_GLOBAL_SUSPEND) {
+ __hc32 __iomem *portstat = ohci->regs->roothub.portstatus;
+ int i;
+ unsigned temp;
+
+ for (i = 0; i < ohci->num_ports; (++i, ++portstat)) {
+ temp = ohci_readl(ohci, portstat);
+ if ((temp & (RH_PS_PES | RH_PS_PSS)) ==
+ RH_PS_PES)
+ ohci_writel(ohci, RH_PS_PSS, portstat);
+ }
+ }
+
/* maybe resume can wake root hub */
if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) {
ohci->hc_control |= OHCI_CTRL_RWE;
Index: usb-3.15/drivers/usb/host/ohci-pci.c
===================================================================
--- usb-3.15.orig/drivers/usb/host/ohci-pci.c
+++ usb-3.15/drivers/usb/host/ohci-pci.c
@@ -160,6 +160,7 @@ static int ohci_quirk_amd700(struct usb_
ohci_dbg(ohci, "enabled AMD prefetch quirk\n");
}
+ ohci->flags |= OHCI_QUIRK_GLOBAL_SUSPEND;
return 0;
}
Index: usb-3.15/drivers/usb/host/ohci.h
===================================================================
--- usb-3.15.orig/drivers/usb/host/ohci.h
+++ usb-3.15/drivers/usb/host/ohci.h
@@ -405,6 +405,8 @@ struct ohci_hcd {
#define OHCI_QUIRK_HUB_POWER 0x100 /* distrust
firmware power/oc setup */
#define OHCI_QUIRK_AMD_PLL 0x200 /* AMD PLL
quirk*/
#define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch
for ISO transfer */
+#define OHCI_QUIRK_GLOBAL_SUSPEND 0x800 /* must suspend
ports */
+
// there are also chip quirks/bugs in init logic
struct work_struct nec_work; /* Worker for NEC quirk */
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html