Bug#677472: [3.1->3.2 regression] Immediate wake on suspend, associated with OHCI on MCP51
- To: Lan Tianyu <tianyu.lan@intel.com>
- Cc: Octavio Alvarez <alvarezp@alvarezp.com>, Frank Schäfer <fschaefer.oss@googlemail.com>, Lan Tianyu <lantianyu1986@gmail.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, <677472@bugs.debian.org>, Ben Hutchings <ben@decadent.org.uk>, <linux-usb@vger.kernel.org>, Frank Schäfer <schaefer.frank@gmx.net>
- Subject: Bug#677472: [3.1->3.2 regression] Immediate wake on suspend, associated with OHCI on MCP51
- From: Alan Stern <stern@rowland.harvard.edu>
- Date: Wed, 19 Dec 2012 10:29:23 -0500 (EST)
- Message-id: <[🔎] Pine.LNX.4.44L0.1212191021130.1580-100000@iolanthe.rowland.org>
- Reply-to: Alan Stern <stern@rowland.harvard.edu>, 677472@bugs.debian.org
- In-reply-to: <[🔎] 50D160F3.9080203@intel.com>
On Wed, 19 Dec 2012, Lan Tianyu wrote:
> Hi Alan:
>
> How about this patch?
>
> Index: linux-pm/drivers/usb/host/ohci-pci.c
> ===================================================================
> --- linux-pm.orig/drivers/usb/host/ohci-pci.c 2012-11-01
> 18:21:33.604460469 +0800
> +++ linux-pm/drivers/usb/host/ohci-pci.c 2012-12-19
> 14:39:07.081601806 +0800
> @@ -188,6 +188,15 @@
> pci_write_config_word(pdev, 0x50, misc | 0x0300);
> }
>
> +static int ohci_quirk_bad_wakeup(struct usb_hcd *hcd)
> +{
> + struct ohci_hcd *ohci = hcd_to_ohci (hcd);
> +
> + ohci_dbg(ohci, "marked as bad wakeup.\n");
I'd prefer the message to be something more like "enabled nVidia/SiS
wakeup quirk".
> + hcd->bad_wakeup = true;
> + return 0;
> +}
> +
> /* List of quirks for OHCI */
> static const struct pci_device_id ohci_pci_quirks[] = {
> {
> @@ -238,6 +247,31 @@
> PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399),
> .driver_data = (unsigned long)ohci_quirk_amd700,
> },
> + {
> + /* MCP51 OHCI */
> + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x026d),
> + .driver_data = (unsigned long)ohci_quirk_bad_wakeup,
> + },
> + {
> + /* MCP61 OHCI */
> + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x03f1),
> + .driver_data = (unsigned long)ohci_quirk_bad_wakeup,
> + },
> + {
> + /* MCP79 OHCI */
> + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0aa5),
> + .driver_data = (unsigned long)ohci_quirk_bad_wakeup,
> + },
> + {
> + /* MCP79 OHCI */
> + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0aa7),
> + .driver_data = (unsigned long)ohci_quirk_bad_wakeup,
> + },
Since we don't know of any nVidia controllers that function correctly,
you might as well match any product ID.
> + {
> + /* SiS OHCI */
> + PCI_DEVICE(PCI_VENDOR_ID_SI, 7001),
> + .driver_data = (unsigned long)ohci_quirk_bad_wakeup,
> + },
>
> /* FIXME for some of the early AMD 760 southbridges, OHCI
> * won't work at all. blacklist them.
> Index: linux-pm/include/linux/usb/hcd.h
> ===================================================================
> --- linux-pm.orig/include/linux/usb/hcd.h 2012-11-01
> 18:21:34.732460451 +0800
> +++ linux-pm/include/linux/usb/hcd.h 2012-12-19 10:48:43.305822774 +0800
> @@ -138,6 +138,7 @@
> resource_size_t rsrc_start; /* memory/io resource
> start */
> resource_size_t rsrc_len; /* memory/io resource
> length */
> unsigned power_budget; /* in mA, 0 = no limit */
> + bool bad_wakeup;
This should be a bitflag (i.e., bad_wakeup:1) and it should come
immediately after has_tt:1.
Alan Stern
Reply to: