From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org, jejb@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Alan Stern <stern@rowland.harvard.edu>
Subject: [patch 09/17] OHCI: Allow broken controllers to auto-stop
Date: Sat, 18 Oct 2008 11:34:16 -0700 [thread overview]
Message-ID: <20081018183416.GJ14035@suse.de> (raw)
In-Reply-To: <20081018183334.GA14035@suse.de>
[-- Attachment #1: ohci-allow-broken-controllers-to-auto-stop.patch --]
[-- Type: text/plain, Size: 4950 bytes --]
2.6.27-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Alan Stern <stern@rowland.harvard.edu>
commit 4a511bc3f5829bc18428bcf11c25417a79d09396 upstream
This patch (as1134) attempts to improve the way we handle OHCI
controllers with broken Root Hub Status Change interrupt support. In
these controllers the RHSC interrupt bit essentially never turns off,
making RHSC interrupts useless -- they have to remain permanently
disabled.
Such controllers should still be allowed to turn off their root hubs
when no devices are attached. Polling for new connections can
continue while the root hub is suspended. The patch implements this
feature. (It won't have much effect unless CONFIG_PM is enabled and
CONFIG_USB_SUSPEND is disabled, but since the overhead is very small
we may as well do it.)
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/usb/host/ohci-hub.c | 60 +++++++++++++++++++++++---------------------
1 file changed, 32 insertions(+), 28 deletions(-)
--- a/drivers/usb/host/ohci-hub.c
+++ b/drivers/usb/host/ohci-hub.c
@@ -362,18 +362,23 @@ static int ohci_root_hub_state_changes(s
int any_connected)
{
int poll_rh = 1;
- int rhsc;
+ int rhsc_status, rhsc_enable;
- rhsc = ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC;
- switch (ohci->hc_control & OHCI_CTRL_HCFS) {
+ /* Some broken controllers never turn off RHCS in the interrupt
+ * status register. For their sake we won't re-enable RHSC
+ * interrupts if the interrupt bit is already active.
+ */
+ rhsc_status = ohci_readl(ohci, &ohci->regs->intrstatus) &
+ OHCI_INTR_RHSC;
+ rhsc_enable = ohci_readl(ohci, &ohci->regs->intrenable) &
+ OHCI_INTR_RHSC;
+ switch (ohci->hc_control & OHCI_CTRL_HCFS) {
case OHCI_USB_OPER:
- /* If no status changes are pending, enable status-change
- * interrupts.
- */
- if (!rhsc && !changed) {
- rhsc = OHCI_INTR_RHSC;
- ohci_writel(ohci, rhsc, &ohci->regs->intrenable);
+ /* If no status changes are pending, enable RHSC interrupts. */
+ if (!rhsc_enable && !rhsc_status && !changed) {
+ rhsc_enable = OHCI_INTR_RHSC;
+ ohci_writel(ohci, rhsc_enable, &ohci->regs->intrenable);
}
/* Keep on polling until we know a device is connected
@@ -383,7 +388,7 @@ static int ohci_root_hub_state_changes(s
if (any_connected ||
!device_may_wakeup(&ohci_to_hcd(ohci)
->self.root_hub->dev)) {
- if (rhsc)
+ if (rhsc_enable)
poll_rh = 0;
} else {
ohci->autostop = 1;
@@ -396,34 +401,36 @@ static int ohci_root_hub_state_changes(s
ohci->autostop = 0;
ohci->next_statechange = jiffies +
STATECHANGE_DELAY;
- } else if (rhsc && time_after_eq(jiffies,
+ } else if (time_after_eq(jiffies,
ohci->next_statechange)
&& !ohci->ed_rm_list
&& !(ohci->hc_control &
OHCI_SCHED_ENABLES)) {
ohci_rh_suspend(ohci, 1);
- poll_rh = 0;
+ if (rhsc_enable)
+ poll_rh = 0;
}
}
break;
- /* if there is a port change, autostart or ask to be resumed */
case OHCI_USB_SUSPEND:
case OHCI_USB_RESUME:
+ /* if there is a port change, autostart or ask to be resumed */
if (changed) {
if (ohci->autostop)
ohci_rh_resume(ohci);
else
usb_hcd_resume_root_hub(ohci_to_hcd(ohci));
} else {
- if (!rhsc && (ohci->autostop ||
+ if (!rhsc_enable && !rhsc_status && (ohci->autostop ||
ohci_to_hcd(ohci)->self.root_hub->
- do_remote_wakeup))
- ohci_writel(ohci, OHCI_INTR_RHSC,
+ do_remote_wakeup)) {
+ rhsc_enable = OHCI_INTR_RHSC;
+ ohci_writel(ohci, rhsc_enable,
&ohci->regs->intrenable);
-
- /* everything is idle, no need for polling */
- poll_rh = 0;
+ }
+ if (rhsc_enable)
+ poll_rh = 0;
}
break;
}
@@ -443,12 +450,16 @@ static inline int ohci_rh_resume(struct
static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
int any_connected)
{
+ int rhsc_status;
+
/* If RHSC is enabled, don't poll */
if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC)
return 0;
- /* If no status changes are pending, enable status-change interrupts */
- if (!changed) {
+ /* If no status changes are pending, enable RHSC interrupts */
+ rhsc_status = ohci_readl(ohci, &ohci->regs->intrstatus) &
+ OHCI_INTR_RHSC;
+ if (!changed && !rhsc_status) {
ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable);
return 0;
}
@@ -492,13 +503,6 @@ ohci_hub_status_data (struct usb_hcd *hc
length++;
}
- /* Some broken controllers never turn off RHCS in the interrupt
- * status register. For their sake we won't re-enable RHSC
- * interrupts if the flag is already set.
- */
- if (ohci_readl(ohci, &ohci->regs->intrstatus) & OHCI_INTR_RHSC)
- changed = 1;
-
/* look at each port */
for (i = 0; i < ohci->num_ports; i++) {
u32 status = roothub_portstatus (ohci, i);
--
next prev parent reply other threads:[~2008-10-18 19:06 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081018182721.521723254@mini.kroah.org>
2008-10-18 18:33 ` [patch 00/17] 2.6.27-stable review Greg KH
2008-10-18 18:33 ` [patch 01/17] fbcon_set_all_vcs: fix kernel crash when switching the rotated consoles Greg KH
2008-10-18 18:33 ` [patch 02/17] modules: fix module "notes" kobject leak Greg KH
2008-10-18 18:34 ` [patch 03/17] Driver core: Fix cleanup in device_create_vargs() Greg KH
2008-10-18 18:34 ` [patch 04/17] Driver core: Clarify device cleanup Greg KH
2008-10-18 18:34 ` [patch 05/17] ath9k/mac80211: disallow fragmentation in ath9k, report to userspace Greg KH
2008-10-18 18:34 ` [patch 06/17] md: Fix rdev_size_store with size == 0 Greg KH
2008-10-18 18:34 ` [patch 07/17] xfs: fix remount rw with unrecognized options Greg KH
2008-10-18 18:34 ` [patch 08/17] ath9k: fix oops on trying to hold the wrong spinlock Greg KH
2008-10-18 18:34 ` Greg KH [this message]
2008-10-18 18:34 ` [patch 10/17] USB: OHCI: fix endless polling behavior Greg KH
2008-10-18 18:34 ` [patch 11/17] USB: Fix s3c2410_udc usb speed handling Greg KH
2008-10-18 18:34 ` [patch 12/17] USB: EHCI: log a warning if ehci-hcd is not loaded first Greg KH
2008-10-18 18:34 ` [patch 13/17] usb gadget: cdc ethernet notification bugfix Greg KH
2008-10-18 18:34 ` [patch 14/17] usb: musb_hdrc build fixes Greg KH
2008-10-18 18:34 ` [patch 15/17] drm/i915: fix ioremap of a user address for non-root (CVE-2008-3831) Greg KH
2008-10-18 18:34 ` [patch 16/17] DVB: au0828: add support for another USB id for Hauppauge HVR950Q Greg KH
2008-10-18 18:34 ` [patch 17/17] DVB: sms1xxx: support two new revisions of the Hauppauge WinTV MiniStick Greg KH
2008-10-18 18:36 ` [patch 00/17] 2.6.27-stable review Greg KH
2008-10-23 1:01 ` Josh Boyer
2008-10-23 4:53 ` [stable] " Greg KH
2008-10-23 10:33 ` Josh Boyer
2008-10-23 15:33 ` Greg KH
2008-10-23 15:47 ` Josh Boyer
2008-10-23 15:51 ` Greg KH
2008-10-23 5:06 ` Willy Tarreau
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=20081018183416.GJ14035@suse.de \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jejb@kernel.org \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=stern@rowland.harvard.edu \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/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