From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Alan Stern <stern@rowland.harvard.edu>,
David Brownell <david-b@pacbell.net>
Subject: [39/45] OHCI: work around for nVidia shutdown problem
Date: Fri, 19 Nov 2010 13:43:19 -0800 [thread overview]
Message-ID: <20101119214412.633136072@clark.site> (raw)
In-Reply-To: <20101119214439.GA26350@kroah.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 5777 bytes --]
2.6.32-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <stern@rowland.harvard.edu>
commit 3df7169e73fc1d71a39cffeacc969f6840cdf52b upstream.
This patch (as1417) fixes a problem affecting some (or all) nVidia
chipsets. When the computer is shut down, the OHCI controllers
continue to power the USB buses and evidently they drive a Reset
signal out all their ports. This prevents attached devices from going
to low power. Mouse LEDs stay on, for example, which is disconcerting
for users and a drain on laptop batteries.
The fix involves leaving each OHCI controller in the OPERATIONAL state
during system shutdown rather than putting it in the RESET state.
Although this nominally means the controller is running, in fact it's
not doing very much since all the schedules are all disabled. However
there is ongoing DMA to the Host Controller Communications Area, so
the patch also disables the bus-master capability of all PCI USB
controllers after the shutdown routine runs.
The fix is applied only to nVidia-based PCI OHCI controllers, so it
shouldn't cause problems on systems using other hardware. As an added
safety measure, in case the kernel encounters one of these running
controllers during boot, the patch changes quirk_usb_handoff_ohci()
(which runs early on during PCI discovery) to reset the controller
before anything bad can happen.
Reported-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: David Brownell <david-b@pacbell.net>
Tested-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/usb/core/hcd-pci.c | 4 +++-
drivers/usb/host/ohci-hcd.c | 9 ++++++++-
drivers/usb/host/ohci-pci.c | 18 ++++++++++++++++++
drivers/usb/host/ohci.h | 1 +
drivers/usb/host/pci-quirks.c | 18 +++++++++++-------
5 files changed, 41 insertions(+), 9 deletions(-)
--- a/drivers/usb/core/hcd-pci.c
+++ b/drivers/usb/core/hcd-pci.c
@@ -197,8 +197,10 @@ void usb_hcd_pci_shutdown(struct pci_dev
if (!hcd)
return;
- if (hcd->driver->shutdown)
+ if (hcd->driver->shutdown) {
hcd->driver->shutdown(hcd);
+ pci_disable_device(dev);
+ }
}
EXPORT_SYMBOL_GPL(usb_hcd_pci_shutdown);
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -398,7 +398,14 @@ ohci_shutdown (struct usb_hcd *hcd)
ohci = hcd_to_ohci (hcd);
ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
- ohci_usb_reset (ohci);
+ ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
+
+ /* If the SHUTDOWN quirk is set, don't put the controller in RESET */
+ ohci->hc_control &= (ohci->flags & OHCI_QUIRK_SHUTDOWN ?
+ OHCI_CTRL_RWC | OHCI_CTRL_HCFS :
+ OHCI_CTRL_RWC);
+ ohci_writel(ohci, ohci->hc_control, &ohci->regs->control);
+
/* flush the writes */
(void) ohci_readl (ohci, &ohci->regs->control);
}
--- a/drivers/usb/host/ohci-pci.c
+++ b/drivers/usb/host/ohci-pci.c
@@ -201,6 +201,20 @@ static int ohci_quirk_amd700(struct usb_
return 0;
}
+/* nVidia controllers continue to drive Reset signalling on the bus
+ * even after system shutdown, wasting power. This flag tells the
+ * shutdown routine to leave the controller OPERATIONAL instead of RESET.
+ */
+static int ohci_quirk_nvidia_shutdown(struct usb_hcd *hcd)
+{
+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+
+ ohci->flags |= OHCI_QUIRK_SHUTDOWN;
+ ohci_dbg(ohci, "enabled nVidia shutdown quirk\n");
+
+ return 0;
+}
+
/*
* The hardware normally enables the A-link power management feature, which
* lets the system lower the power consumption in idle states.
@@ -332,6 +346,10 @@ static const struct pci_device_id ohci_p
PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399),
.driver_data = (unsigned long)ohci_quirk_amd700,
},
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
+ .driver_data = (unsigned long) ohci_quirk_nvidia_shutdown,
+ },
/* FIXME for some of the early AMD 760 southbridges, OHCI
* won't work at all. blacklist them.
--- a/drivers/usb/host/ohci.h
+++ b/drivers/usb/host/ohci.h
@@ -403,6 +403,7 @@ struct ohci_hcd {
#define OHCI_QUIRK_HUB_POWER 0x100 /* distrust firmware power/oc setup */
#define OHCI_QUIRK_AMD_ISO 0x200 /* ISO transfers*/
#define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */
+#define OHCI_QUIRK_SHUTDOWN 0x800 /* nVidia power bug */
// there are also chip quirks/bugs in init logic
struct work_struct nec_work; /* Worker for NEC quirk */
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -169,6 +169,7 @@ static int __devinit mmio_resource_enabl
static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev)
{
void __iomem *base;
+ u32 control;
if (!mmio_resource_enabled(pdev, 0))
return;
@@ -177,10 +178,14 @@ static void __devinit quirk_usb_handoff_
if (base == NULL)
return;
+ control = readl(base + OHCI_CONTROL);
+
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */
-#ifndef __hppa__
-{
- u32 control = readl(base + OHCI_CONTROL);
+#ifdef __hppa__
+#define OHCI_CTRL_MASK (OHCI_CTRL_RWC | OHCI_CTRL_IR)
+#else
+#define OHCI_CTRL_MASK OHCI_CTRL_RWC
+
if (control & OHCI_CTRL_IR) {
int wait_time = 500; /* arbitrary; 5 seconds */
writel(OHCI_INTR_OC, base + OHCI_INTRENABLE);
@@ -194,13 +199,12 @@ static void __devinit quirk_usb_handoff_
dev_warn(&pdev->dev, "OHCI: BIOS handoff failed"
" (BIOS bug?) %08x\n",
readl(base + OHCI_CONTROL));
-
- /* reset controller, preserving RWC */
- writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL);
}
-}
#endif
+ /* reset controller, preserving RWC (and possibly IR) */
+ writel(control & OHCI_CTRL_MASK, base + OHCI_CONTROL);
+
/*
* disable interrupts
*/
next prev parent reply other threads:[~2010-11-19 21:47 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-19 21:44 [00/45] 2.6.32.26-stable review Greg KH
2010-11-19 21:42 ` Greg KH
2010-11-19 21:42 ` [01/45] staging: usbip: Notify usb core of port status changes Greg KH
2010-11-19 21:42 ` [02/45] staging: usbip: Process event flags without delay Greg KH
2010-11-19 21:42 ` [03/45] powerpc/perf: Fix sampling enable for PPC970 Greg KH
2010-11-19 21:42 ` [04/45] pcmcia: synclink_cs: fix information leak to userland Greg KH
2010-11-19 21:42 ` [05/45] sched: Fix string comparison in /proc/sched_features Greg KH
2010-11-19 21:42 ` [06/45] bluetooth: Fix missing NULL check Greg KH
2010-11-19 21:42 ` [07/45] futex: Fix errors in nested key ref-counting Greg KH
2010-11-19 21:42 ` [08/45] mm, x86: Saving vmcore with non-lazy freeing of vmas Greg KH
2010-11-20 2:16 ` [Stable-review] " Ben Hutchings
2010-11-22 17:59 ` Greg KH
2010-11-19 21:42 ` [09/45] x86, cpu: Fix renamed, not-yet-shipping AMD CPUID feature bit Greg KH
2010-11-19 21:42 ` [10/45] x86, kexec: Make sure to stop all CPUs before exiting the kernel Greg KH
2010-11-19 21:42 ` [11/45] x86, olpc: Dont retry EC commands forever Greg KH
2010-11-19 21:42 ` [12/45] x86, mtrr: Assume SYS_CFG[Tom2ForceMemTypeWB] exists on all future AMD CPUs Greg KH
2010-11-19 21:42 ` [13/45] x86, intr-remap: Set redirection hint in the IRTE Greg KH
2010-11-19 21:42 ` [14/45] x86, kdump: Change copy_oldmem_page() to use cached addressing Greg KH
2010-11-19 21:42 ` [15/45] KVM: SVM: Fix wrong intercept masks on 32 bit Greg KH
2010-11-19 21:42 ` [16/45] KVM: MMU: fix direct sps access corrupted Greg KH
2010-11-19 21:42 ` [17/45] KVM: MMU: fix conflict access permissions in direct sp Greg KH
2010-11-19 21:42 ` [18/45] KVM: VMX: Fix host GDT.LIMIT corruption Greg KH
2010-11-19 21:42 ` [19/45] KVM: SVM: Adjust tsc_offset only if tsc_unstable Greg KH
2010-11-19 21:43 ` [20/45] KVM: x86: Fix SVM VMCB reset Greg KH
2010-11-19 21:43 ` [21/45] [PATCH 7/8] KVM: x86: Move TSC reset out of vmcb_init Greg KH
2010-11-19 21:43 ` [22/45] KVM: Fix fs/gs reload oops with invalid ldt Greg KH
2010-11-19 21:43 ` [23/45] pipe: fix failure to return error code on ->confirm() Greg KH
2010-11-19 21:43 ` [24/45] p54usb: fix off-by-one on !CONFIG_PM Greg KH
2010-11-19 21:43 ` [25/45] p54usb: add five more USBIDs Greg KH
2010-11-19 21:43 ` [26/45] drivers/net/wireless/p54/eeprom.c: Return -ENOMEM on memory allocation failure Greg KH
2010-11-19 21:43 ` [27/45] USB: ftdi_sio: Add PID for accesio products Greg KH
2010-11-19 21:43 ` [28/45] USB: add PID for FTDI based OpenDCC hardware Greg KH
2010-11-19 21:43 ` [29/45] USB: ftdi_sio: new VID/PIDs for various Papouch devices Greg KH
2010-11-19 21:43 ` [30/45] USB: ftdi_sio: add device ids for ScienceScope Greg KH
2010-11-19 21:43 ` [31/45] usb: musb: blackfin: call gpio_free() on error path in musb_platform_init() Greg KH
2010-11-19 21:43 ` [32/45] USB: option: Add more ZTE modem USB ids Greg KH
2010-11-19 21:43 ` [33/45] USB: cp210x: Add Renesas RX-Stick device ID Greg KH
2010-11-19 21:43 ` [34/45] USB: cp210x: Add WAGO 750-923 Service Cable " Greg KH
2010-11-19 21:43 ` [35/45] USB: atmel_usba_udc: force vbus_pin at -EINVAL when gpio_request failled Greg KH
2010-11-22 9:08 ` Nicolas Ferre
2010-11-22 21:31 ` Greg KH
2010-11-19 21:43 ` [36/45] USB: disable endpoints after unbinding interfaces, not before Greg KH
2010-11-19 21:43 ` [37/45] USB: opticon: Fix long-standing bugs in opticon driver Greg KH
2010-11-19 21:43 ` [38/45] USB: accept some invalid ep0-maxpacket values Greg KH
2010-11-19 21:43 ` Greg KH [this message]
2010-11-20 2:52 ` [Stable-review] [39/45] OHCI: work around for nVidia shutdown problem Ben Hutchings
2010-11-20 16:51 ` Alan Stern
2010-11-22 17:55 ` Greg KH
2010-11-22 18:09 ` Alan Stern
2011-01-19 16:51 ` Alan Stern
2011-02-16 21:40 ` [stable] " Greg KH
2011-03-28 16:13 ` Andre "Osku" Schmidt
2010-11-19 21:43 ` [40/45] [SCSI] sd name space exhaustion causes system hang Greg KH
2010-11-19 21:43 ` [41/45] [SCSI] libsas: fix NCQ mixing with non-NCQ Greg KH
2010-11-19 21:43 ` [42/45] [SCSI] gdth: integer overflow in ioctl Greg KH
2010-11-19 21:43 ` [43/45] [SCSI] Fix race when removing SCSI devices Greg KH
2010-11-19 21:43 ` [44/45] [SCSI] Fix regressions in scsi_internal_device_block Greg KH
2010-11-19 21:43 ` [45/45] sgi-xp: incoming XPC channel messages can come in after the channels partition structures have been torn down Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101119214412.633136072@clark.site \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=david-b@pacbell.net \
--cc=linux-kernel@vger.kernel.org \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=stern@rowland.harvard.edu \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome