From: David Miller <davem@davemloft.net>
To: david-b@pacbell.net
Cc: linux-usb-users@lists.sourceforge.net,
linux-kernel@vger.kernel.org, greg@kroah.com
Subject: Re: OHCI root_port_reset() deadly loop...
Date: Mon, 08 Oct 2007 16:54:20 -0700 (PDT) [thread overview]
Message-ID: <20071008.165420.42793456.davem@davemloft.net> (raw)
In-Reply-To: <20071007.005156.85395415.davem@davemloft.net>
From: David Miller <davem@davemloft.net>
Date: Sun, 07 Oct 2007 00:51:56 -0700 (PDT)
> From: David Brownell <david-b@pacbell.net>
> Date: Sun, 07 Oct 2007 00:31:41 -0700
>
> > Are the other ports still behaving? Is EHCI maybe trying to switch
> > ownership of that port? Is maybe the (newish) autosuspend stuff
> > kicking in?
>
> I wouldn't know, the machine hangs and doesn't get any further.
To add some more information here, I think the EHCI idea might
hold some water.
What I have here are two NEC OHCI USB interfaces and one NEC EHCI
USB interface on PCI. Aparently they all go through a shared
USB hub, mapped like this:
HUB Port 1: OHCI #1, EHCI
HUB Port 2: OHCI #2, EHCI
HUB Port 3: OHCI #1, EHCI
HUB Port 4: OHCI #2, EHCI
HUB Port 5: OHCI #1, EHCI
The OHCI ports go out to external USB connectors on the back panel of
the machine, whereas the EHCI is connected up to an internal USB
storage CDROM device and what appears to be another USB hub.
The problem seems to be very strongly tied to timing. For example
simply adding "ignore_loglevel" to the kernel boot command line can
make the problem go away.
This got me thinking about your EHCI comment.
If these controllers are going through the same HUB, things might go
south if OHCI initialized first, then khubd et al. are asynchronously
accessing the segments behind OHCI at the same time that the EHCI
driver is initializing. Perhaps, this is the kind of sequence of
events which makes one of the root ports reset in such a way that the
the reset bit never clears.
Given that this machine has 64 cpus, the likelyhood for such parallel
accesses is very likely :-)
Does this make any sense?
Regardless, here is a patch that hardens the OHCI reset handling
loops so that they break out instead of hanging the entire system
should this condition occur. It's at least better than what the
code does to a user right now which is hang the box completely:
[USB] ohci: Do not hang the system if port reset does not complete.
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
index bb9cc59..77ae5b4 100644
--- a/drivers/usb/host/ohci-hub.c
+++ b/drivers/usb/host/ohci-hub.c
@@ -563,14 +563,19 @@ static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
u32 temp;
u16 now = ohci_readl(ohci, &ohci->regs->fmnumber);
u16 reset_done = now + PORT_RESET_MSEC;
+ int limit_1;
/* build a "continuous enough" reset signal, with up to
* 3msec gap between pulses. scheduler HZ==100 must work;
* this might need to be deadline-scheduled.
*/
- do {
+ limit_1 = 100;
+ while (--limit_1 >= 0) {
+ int limit_2;
+
/* spin until any current reset finishes */
- for (;;) {
+ limit_2 = PORT_RESET_MSEC * 2;
+ while (--limit_2 >= 0) {
temp = ohci_readl (ohci, portstat);
/* handle e.g. CardBus eject */
if (temp == ~(u32)0)
@@ -579,6 +584,10 @@ static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
break;
udelay (500);
}
+ if (limit_2 < 0) {
+ ohci_warn(ohci, "Root port inner-loop reset timeout, "
+ "portstat[%08x]\n", temp);
+ }
if (!(temp & RH_PS_CCS))
break;
@@ -589,7 +598,14 @@ static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
ohci_writel (ohci, RH_PS_PRS, portstat);
msleep(PORT_RESET_HW_MSEC);
now = ohci_readl(ohci, &ohci->regs->fmnumber);
- } while (tick_before(now, reset_done));
+ if (!tick_before(now, reset_done))
+ break;
+ }
+ if (limit_1 < 0) {
+ ohci_warn(ohci, "Root port outer-loop reset timeout, "
+ "now[%04x] reset_done[%04x]\n",
+ now, reset_done);
+ }
/* caller synchronizes using PRSC */
return 0;
next prev parent reply other threads:[~2007-10-08 23:54 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-07 6:53 OHCI root_port_reset() deadly loop David Miller
2007-10-07 7:31 ` David Brownell
2007-10-07 7:51 ` David Miller
2007-10-08 23:54 ` David Miller [this message]
2007-10-09 3:10 ` Greg KH
2007-10-09 3:16 ` David Miller
2007-10-09 3:34 ` David Brownell
2007-10-09 3:42 ` David Miller
2007-10-09 4:39 ` Greg KH
2007-10-09 4:47 ` David Miller
2007-10-09 5:11 ` Benjamin Herrenschmidt
2007-10-09 6:06 ` Greg KH
2007-10-09 19:22 ` [linux-usb-devel] " David Brownell
2007-10-10 15:32 ` Alan Stern
2007-10-09 5:00 ` David Brownell
2007-10-09 5:23 ` David Miller
2007-10-09 6:43 ` Benjamin Herrenschmidt
2007-10-09 18:48 ` David Brownell
2007-10-09 16:01 ` [Linux-usb-users] " Alan Stern
2007-10-09 17:39 ` Greg KH
2007-10-09 18:42 ` Alan Stern
2007-10-09 18:59 ` David Brownell
2007-10-09 21:27 ` David Miller
2007-10-09 21:43 ` David Brownell
2007-10-09 22:00 ` David Miller
2007-10-10 4:35 ` David Miller
2007-10-15 22:01 ` David Miller
2007-10-15 23:39 ` David Brownell
2007-10-15 23:58 ` David Miller
2007-10-16 15:23 ` Alan Stern
2007-10-16 22:06 ` David Miller
2007-10-16 22:20 ` Greg KH
2007-10-17 15:56 ` Alan Stern
2007-10-16 22:08 ` David Miller
2007-10-17 15:51 ` Alan Stern
2007-10-17 23:03 ` David Miller
2007-10-18 14:28 ` Alan Stern
2007-10-16 18:26 ` David Brownell
2007-10-09 4:09 ` David Brownell
2007-10-09 5:13 ` Benjamin Herrenschmidt
2007-10-09 5:26 ` David Miller
2007-10-09 6:37 ` Benjamin Herrenschmidt
2007-10-09 4:36 ` David Brownell
2007-10-09 4:44 ` David Miller
2007-10-09 16:38 ` David Brownell
2007-10-09 20:41 ` David Miller
2007-10-09 20:46 ` Greg KH
2007-10-09 21:05 ` David Brownell
2007-10-09 21:09 ` David Brownell
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=20071008.165420.42793456.davem@davemloft.net \
--to=davem@davemloft.net \
--cc=david-b@pacbell.net \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb-users@lists.sourceforge.net \
/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