* Re: USB problem. 'irq 9: nobody cared!'
@ 2003-09-24 22:57 Milton Miller
2003-09-25 4:23 ` Yaroslav Halchenko
2003-09-26 3:14 ` USB problem. 'irq 9: nobody cared!' Yaroslav Halchenko
0 siblings, 2 replies; 13+ messages in thread
From: Milton Miller @ 2003-09-24 22:57 UTC (permalink / raw)
To: Yaroslav Halchenko; +Cc: linux-kernel, Greg KH
Yaroslav Halchenko wrote:
> Greg KH wrote:
> > Did you try David Brownell's patch for this issue?
> Can you please point which one exactly? I've tried to locate patch you
> meant but it is too much of USB staff is happening now seems to me.
I'm guessing this one: Re: irq 11: nobody cared! is back
http://marc.theaimsgroup.com/?l=linux-kernel&m=106399942523614&w=2
milton
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-24 22:57 USB problem. 'irq 9: nobody cared!' Milton Miller
@ 2003-09-25 4:23 ` Yaroslav Halchenko
2003-09-25 18:00 ` Greg KH
2003-09-26 3:14 ` USB problem. 'irq 9: nobody cared!' Yaroslav Halchenko
1 sibling, 1 reply; 13+ messages in thread
From: Yaroslav Halchenko @ 2003-09-25 4:23 UTC (permalink / raw)
To: Milton Miller; +Cc: linux-kernel, Greg KH
Nop - it didn't help :-(
http://onerussian.com/Linux/bug.USB2/dmesg
which else usefull information I can provide?
--Yarik
On Wed, Sep 24, 2003 at 05:57:27PM -0500, Milton Miller wrote:
>
> Yaroslav Halchenko wrote:
> > Greg KH wrote:
> > > Did you try David Brownell's patch for this issue?
> > Can you please point which one exactly? I've tried to locate patch you
> > meant but it is too much of USB staff is happening now seems to me.
>
>
> I'm guessing this one: Re: irq 11: nobody cared! is back
>
> http://marc.theaimsgroup.com/?l=linux-kernel&m=106399942523614&w=2
>
>
> milton
.-.
=------------------------------ /v\ ----------------------------=
Keep in touch // \\ (yoh@|www.)onerussian.com
Yaroslav Halchenko /( )\ ICQ#: 60653192
Linux User ^^-^^ [175555]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-25 4:23 ` Yaroslav Halchenko
@ 2003-09-25 18:00 ` Greg KH
2003-09-25 19:11 ` David Brownell
0 siblings, 1 reply; 13+ messages in thread
From: Greg KH @ 2003-09-25 18:00 UTC (permalink / raw)
To: Milton Miller, linux-kernel, David Brownell
On Thu, Sep 25, 2003 at 12:23:26AM -0400, Yaroslav Halchenko wrote:
> Nop - it didn't help :-(
>
> http://onerussian.com/Linux/bug.USB2/dmesg
>
> which else usefull information I can provide?
David, can you try to fix this up. It all started with your uhci
patch...
thanks,
greg k-h
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-25 18:00 ` Greg KH
@ 2003-09-25 19:11 ` David Brownell
2003-09-30 9:41 ` USB problem. 'irq 9: nobody cared!' (FIXED!) Arkadiusz Miskiewicz
0 siblings, 1 reply; 13+ messages in thread
From: David Brownell @ 2003-09-25 19:11 UTC (permalink / raw)
To: Greg KH; +Cc: Milton Miller, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 888 bytes --]
Greg KH wrote:
> On Thu, Sep 25, 2003 at 12:23:26AM -0400, Yaroslav Halchenko wrote:
>
>>Nop - it didn't help :-(
>>
>>http://onerussian.com/Linux/bug.USB2/dmesg
>>
>>which else usefull information I can provide?
>
>
> David, can you try to fix this up. It all started with your uhci
> patch...
I have tried, two or three times now ...
The problem is that nobody has ever reported back with results from
testing any updated patch (see attachment, the guts of this being
from Alan Stern). Sort of makes trying be a moot point ... :)
It's OK with me if you just revert the patch that adds a uhci_reset()
entry, but based on what I saw with EHCI and OHCI that'll just turn
up a different set of problems with certain BIOS configurations (none
of which I have) ... which will need to be fixed by having a UHCI
reset sequence that works correctly from _all_ initial states.
- Dave
[-- Attachment #2: Diff --]
[-- Type: text/plain, Size: 729 bytes --]
--- 1.44/drivers/usb/host/uhci-hcd.c Fri Jul 18 06:22:32 2003
+++ edited/drivers/usb/host/uhci-hcd.c Fri Sep 19 12:23:54 2003
@@ -1960,8 +1960,9 @@
{
unsigned int io_addr = uhci->io_addr;
- /* Global reset for 50ms */
+ /* Global reset for 50ms, and don't interrupt me */
uhci->state = UHCI_RESET;
+ outw(0, io_addr + USBINTR);
outw(USBCMD_GRESET, io_addr + USBCMD);
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout((HZ*50+999) / 1000);
@@ -2187,6 +2188,7 @@
/* Maybe kick BIOS off this hardware. Then reset, so we won't get
* interrupts from any previous setup.
*/
+ outw(0, uhci->io_addr + USBINTR);
pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT);
reset_hc(uhci);
return 0;
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-24 22:57 USB problem. 'irq 9: nobody cared!' Milton Miller
2003-09-25 4:23 ` Yaroslav Halchenko
@ 2003-09-26 3:14 ` Yaroslav Halchenko
1 sibling, 0 replies; 13+ messages in thread
From: Yaroslav Halchenko @ 2003-09-26 3:14 UTC (permalink / raw)
To: Milton Miller, Greg KH; +Cc: linux kernel mailing list
I've tried again with recent bk12 kernel and this patch worked...
May be I was too tired and actually didn't patch the first time I
tried, and then reported to you that it didn't help - I'm sorry. Will
check later if it is the case.
Thanx for your help
Sincerely
Yarik
On Wed, Sep 24, 2003 at 05:57:27PM -0500, Milton Miller wrote:
>
> Yaroslav Halchenko wrote:
> > Greg KH wrote:
> > > Did you try David Brownell's patch for this issue?
> > Can you please point which one exactly? I've tried to locate patch you
> > meant but it is too much of USB staff is happening now seems to me.
>
>
> I'm guessing this one: Re: irq 11: nobody cared! is back
>
> http://marc.theaimsgroup.com/?l=linux-kernel&m=106399942523614&w=2
>
>
> milton
.-.
=------------------------------ /v\ ----------------------------=
Keep in touch // \\ (yoh@|www.)onerussian.com
Yaroslav Halchenko /( )\ ICQ#: 60653192
Linux User ^^-^^ [175555]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!' (FIXED!)
2003-09-25 19:11 ` David Brownell
@ 2003-09-30 9:41 ` Arkadiusz Miskiewicz
2003-09-30 19:30 ` David Brownell
0 siblings, 1 reply; 13+ messages in thread
From: Arkadiusz Miskiewicz @ 2003-09-30 9:41 UTC (permalink / raw)
To: David Brownell, Greg KH; +Cc: Milton Miller, linux-kernel
On Thursday 25 of September 2003 21:11, David Brownell wrote:
> The problem is that nobody has ever reported back with results from
> testing any updated patch (see attachment, the guts of this being
> from Alan Stern). Sort of makes trying be a moot point ... :)
So I'm the first one? ;)
Your patch (http://www.ussg.iu.edu/hypermail/linux/kernel/0309.3/0341.html)
FIXES things for me :-)
This time I've tried 2.6.0test6 + all acpi patches from 2.6.0-mm1 (ls *acpi*
in akpm broken-out directory) + your patch and things work fine :)
Note that 2.6.0+all acpi patches from 2.6.0-mm1 without your patch doesn't
work.
[arekm@mobarm arekm]$ cat /proc/interrupts
CPU0
0: 698946 XT-PIC timer
1: 1712 XT-PIC i8042
2: 0 XT-PIC cascade
3: 1561 XT-PIC irda0
5: 4 XT-PIC yenta
8: 0 XT-PIC rtc
9: 2657 XT-PIC acpi, eth0
10: 77708 XT-PIC VIA686A, uhci-hcd, uhci-hcd
12: 18 XT-PIC i8042
14: 12408 XT-PIC ide0
15: 20 XT-PIC ide1
NMI: 0
ERR: 0
More details about my case in lkml archives and
http://bugme.osdl.org/show_bug.cgi?id=905
> It's OK with me if you just revert the patch that adds a uhci_reset()
> entry, but based on what I saw with EHCI and OHCI that'll just turn
> up a different set of problems with certain BIOS configurations (none
> of which I have) ... which will need to be fixed by having a UHCI
> reset sequence that works correctly from _all_ initial states.
>
> - Dave
--
Arkadiusz Miśkiewicz CS at FoE, Wroclaw University of Technology
arekm.pld-linux.org AM2-6BONE, 1024/3DB19BBD, arekm(at)ircnet, PLD/Linux
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!' (FIXED!)
2003-09-30 9:41 ` USB problem. 'irq 9: nobody cared!' (FIXED!) Arkadiusz Miskiewicz
@ 2003-09-30 19:30 ` David Brownell
0 siblings, 0 replies; 13+ messages in thread
From: David Brownell @ 2003-09-30 19:30 UTC (permalink / raw)
To: Arkadiusz Miskiewicz
Cc: Johannes Erdfelt, Greg KH, Milton Miller, linux-kernel
Arkadiusz Miskiewicz wrote:
> On Thursday 25 of September 2003 21:11, David Brownell wrote:
>
>
>>The problem is that nobody has ever reported back with results from
>>testing any updated patch (see attachment, the guts of this being
>>from Alan Stern). Sort of makes trying be a moot point ... :)
>
> So I'm the first one? ;)
Since then I got mixed reports -- not sure I trust them.
> Your patch (http://www.ussg.iu.edu/hypermail/linux/kernel/0309.3/0341.html)
> FIXES things for me :-)
OK, that's good to hear. There are two patches that seem
to work to various degrees. This isn't the least conservative
fix (that'd be http://lkml.org/lkml/2003/9/29/74, returning
to that odd "reset before kicking bios off" sequence) but it's
good to know this also behaves.
- Dave
> This time I've tried 2.6.0test6 + all acpi patches from 2.6.0-mm1 (ls *acpi*
> in akpm broken-out directory) + your patch and things work fine :)
> Note that 2.6.0+all acpi patches from 2.6.0-mm1 without your patch doesn't
> work.
>
> [arekm@mobarm arekm]$ cat /proc/interrupts
> CPU0
> 0: 698946 XT-PIC timer
> 1: 1712 XT-PIC i8042
> 2: 0 XT-PIC cascade
> 3: 1561 XT-PIC irda0
> 5: 4 XT-PIC yenta
> 8: 0 XT-PIC rtc
> 9: 2657 XT-PIC acpi, eth0
> 10: 77708 XT-PIC VIA686A, uhci-hcd, uhci-hcd
> 12: 18 XT-PIC i8042
> 14: 12408 XT-PIC ide0
> 15: 20 XT-PIC ide1
> NMI: 0
> ERR: 0
>
> More details about my case in lkml archives and
> http://bugme.osdl.org/show_bug.cgi?id=905
>
>
>>It's OK with me if you just revert the patch that adds a uhci_reset()
>>entry, but based on what I saw with EHCI and OHCI that'll just turn
>>up a different set of problems with certain BIOS configurations (none
>>of which I have) ... which will need to be fixed by having a UHCI
>>reset sequence that works correctly from _all_ initial states.
>>
>>- Dave
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-24 20:48 ` Greg KH
2003-09-24 22:20 ` Yaroslav Halchenko
@ 2003-09-25 7:41 ` Jan Dittmer
1 sibling, 0 replies; 13+ messages in thread
From: Jan Dittmer @ 2003-09-25 7:41 UTC (permalink / raw)
To: Greg KH; +Cc: Yaroslav Halchenko, linux-kernel
Greg KH wrote:
> On Tue, Sep 23, 2003 at 11:47:46AM +0200, Jan Dittmer wrote:
>>
>>Greg, what is going on here? In a nutshell: Irq 9 gets disabled on boot
>>and all other devices on this irq consequently doesn't work any more.
>>Here is the oops from dmesg again:
>
>
> There's no "oops" here, just a warning message. Things worked just fine
> after this, right?
>
No, read my message, irq 9 doesn't get reenabled again. And as my nic is
also on this interrupt, it cannot receive any packets anymore, usb
doesn't work, acpi doesn't work:
9: 100000 XT-PIC acpi, uhci-hcd, uhci-hcd, ohci1394, Intel
82801BA-ICH2, eth0, 0000:01:02.0,
0000:01:05.0, orinoco_cs
Thanks,
Jan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-24 20:48 ` Greg KH
@ 2003-09-24 22:20 ` Yaroslav Halchenko
2003-09-25 7:41 ` Jan Dittmer
1 sibling, 0 replies; 13+ messages in thread
From: Yaroslav Halchenko @ 2003-09-24 22:20 UTC (permalink / raw)
To: linux-kernel; +Cc: Greg KH
On Wed, Sep 24, 2003 at 01:48:46PM -0700, Greg KH wrote:
> On Tue, Sep 23, 2003 at 11:47:46AM +0200, Jan Dittmer wrote:
> > Yaroslav Halchenko <yoh@onerussian.com> wrote on 2003-09-23 01:08:48
> > > > >
> > > > > http://www.onerussian.com/Linux/bug.USB/
> > Greg, what is going on here? In a nutshell: Irq 9 gets disabled on boot
> > and all other devices on this irq consequently doesn't work any more.
> > Here is the oops from dmesg again:
>
> There's no "oops" here, just a warning message. Things worked just fine
> after this, right?
If you mean after issuing that 'warning'? no - USB doesn't work at all.
Reverse patch kinda helped, but then I started getting some weird
behaviour which might be not due to reverse patch but some other
problems...
> Did you try David Brownell's patch for this issue?
Can you please point which one exactly? I've tried to locate patch you
meant but it is too much of USB staff is happening now seems to me.
Thank you in advance
.-.
=------------------------------ /v\ ----------------------------=
Keep in touch // \\ (yoh@|www.)onerussian.com
Yaroslav Halchenko /( )\ ICQ#: 60653192
Linux User ^^-^^ [175555]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-23 9:47 ` Jan Dittmer
@ 2003-09-24 20:48 ` Greg KH
2003-09-24 22:20 ` Yaroslav Halchenko
2003-09-25 7:41 ` Jan Dittmer
0 siblings, 2 replies; 13+ messages in thread
From: Greg KH @ 2003-09-24 20:48 UTC (permalink / raw)
To: Yaroslav Halchenko, linux-kernel
On Tue, Sep 23, 2003 at 11:47:46AM +0200, Jan Dittmer wrote:
> Yaroslav Halchenko <yoh@onerussian.com> wrote on 2003-09-23 01:08:48
> > Thanx - reversing all "improvements" done in -bk5 seems to help
> > - usb works :-))
> >
> > --Yarik
> >
> > On Mon, Sep 22, 2003 at 08:33:24AM +0200, Jan Dittmer wrote:
> > > Yaroslav Halchenko <kernel@onerussian.com> wrote on 2003-09-21 14:41:49
> > > > Dear Gurus,
> > > >
> > > > Since one of the bk versions in -test4- USB problem persist. On boot I'm
> > > > getting next dump. More information about my system and configuration is at
> > > >
> > > > http://www.onerussian.com/Linux/bug.USB/
> > > >
> > > > Please help to get rid of the problem cause USB doesn't work now for me :-(
> > >
> > > Try reverting the following patch, taken from the bk4-bk5 incremental
> > > diff (Apply with patch -p1 -R). This fixed it for me.
> > >
> > > Jan
> > >
>
> Greg, what is going on here? In a nutshell: Irq 9 gets disabled on boot
> and all other devices on this irq consequently doesn't work any more.
> Here is the oops from dmesg again:
There's no "oops" here, just a warning message. Things worked just fine
after this, right?
Did you try David Brownell's patch for this issue?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
[not found] ` <20030923050848.GA5917@washoe.rutgers.edu>
@ 2003-09-23 9:47 ` Jan Dittmer
2003-09-24 20:48 ` Greg KH
0 siblings, 1 reply; 13+ messages in thread
From: Jan Dittmer @ 2003-09-23 9:47 UTC (permalink / raw)
To: Greg KH; +Cc: Yaroslav Halchenko, linux-kernel
Yaroslav Halchenko <yoh@onerussian.com> wrote on 2003-09-23 01:08:48
> Thanx - reversing all "improvements" done in -bk5 seems to help
> - usb works :-))
>
> --Yarik
>
> On Mon, Sep 22, 2003 at 08:33:24AM +0200, Jan Dittmer wrote:
> > Yaroslav Halchenko <kernel@onerussian.com> wrote on 2003-09-21 14:41:49
> > > Dear Gurus,
> > >
> > > Since one of the bk versions in -test4- USB problem persist. On boot I'm
> > > getting next dump. More information about my system and configuration is at
> > >
> > > http://www.onerussian.com/Linux/bug.USB/
> > >
> > > Please help to get rid of the problem cause USB doesn't work now for me :-(
> >
> > Try reverting the following patch, taken from the bk4-bk5 incremental
> > diff (Apply with patch -p1 -R). This fixed it for me.
> >
> > Jan
> >
Greg, what is going on here? In a nutshell: Irq 9 gets disabled on boot
and all other devices on this irq consequently doesn't work any more.
Here is the oops from dmesg again:
uhci-hcd 0000:00:1f.2: UHCI Host Controller
irq 9: nobody cared!
Call Trace:
[<c010b65a>] __report_bad_irq+0x2a/0x90
[<c010b750>] note_interrupt+0x70/0xb0
[<c010ba21>] do_IRQ+0x121/0x130
[<c0109d38>] common_interrupt+0x18/0x20
[<c01e007b>] crypto_init_compress_ops+0x3b/0x40
[<c01226de>] do_softirq+0x3e/0xa0
[<c010b9fd>] do_IRQ+0xfd/0x130
[<c0109d38>] common_interrupt+0x18/0x20
[<c01e44bf>] pci_bus_write_config_word+0x5f/0x90
[<c029f450>] uhci_reset+0x0/0x60
[<c029f48f>] uhci_reset+0x3f/0x60
[<c0295ad6>] usb_hcd_pci_probe+0x196/0x4a0
[<c01e8092>] pci_device_probe_static+0x52/0x70
[<c01e821c>] __pci_device_probe+0x3c/0x50
[<c01e825c>] pci_device_probe+0x2c/0x50
[<c023c6ff>] bus_match+0x3f/0x70
[<c023c84f>] driver_attach+0x6f/0xb0
[<c023cb13>] bus_add_driver+0x93/0xb0
[<c023cf4f>] driver_register+0x2f/0x40
[<c01e84ec>] pci_register_driver+0x5c/0x90
[<c044bbb4>] uhci_hcd_init+0xc4/0x160
[<c04347cb>] do_initcalls+0x2b/0xa0
[<c012e10f>] init_workqueues+0xf/0x30
[<c01050a4>] init+0x34/0x1d0
[<c0105070>] init+0x0/0x1d0
[<c0107255>] kernel_thread_helper+0x5/0x10
handlers:
[<c01eb9af>] (acpi_irq+0x0/0x16)
Disabling IRQ #9
PCI: Setting latency timer of device 0000:00:1f.2 to 64
uhci-hcd 0000:00:1f.2: irq 9, io base 00001820
uhci-hcd 0000:00:1f.2: new USB bus registered, assigned bus number 1
PM: Adding info for usb:usb1
hub 1-0:0: USB hub found
hub 1-0:0: 2 ports detected
PM: Adding info for usb:1-0:0
uhci-hcd 0000:00:1f.4: UHCI Host Controller
PCI: Setting latency timer of device 0000:00:1f.4 to 64
uhci-hcd 0000:00:1f.4: irq 9, io base 00002400
uhci-hcd 0000:00:1f.4: new USB bus registered, assigned bus number 2
PM: Adding info for usb:usb2
hub 2-0:0: USB hub found
hub 2-0:0: 2 ports detected
PM: Adding info for usb:2-0:0
Thanks,
Jan
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/hcd-pci.c linux-2.6.0-test4-bk5/drivers/usb/core/hcd-pci.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/hcd-pci.c 2003-08-22 16:55:40.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/hcd-pci.c 2003-09-03 04:46:52.000000000 -0700
@@ -139,6 +139,7 @@
return retval;
}
}
+ // hcd zeroed everything
hcd->regs = base;
hcd->region = region;
@@ -165,6 +166,7 @@
dev_err (hcd->controller, "can't reset\n");
goto clean_3;
}
+ hcd->state = USB_STATE_HALT;
pci_set_master (dev);
#ifndef __sparc__
@@ -230,7 +232,8 @@
BUG ();
hub = hcd->self.root_hub;
- hcd->state = USB_STATE_QUIESCING;
+ if (HCD_IS_RUNNING (hcd->state))
+ hcd->state = USB_STATE_QUIESCING;
dev_dbg (hcd->controller, "roothub graceful disconnect\n");
usb_disconnect (&hub);
@@ -287,8 +290,8 @@
pci_save_state (dev, hcd->pci_state);
/* driver may want to disable DMA etc */
+ hcd->state = USB_STATE_QUIESCING;
retval = hcd->driver->suspend (hcd, state);
- hcd->state = USB_STATE_SUSPENDED;
}
pci_set_power_state (dev, state);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/hcd.c linux-2.6.0-test4-bk5/drivers/usb/core/hcd.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/hcd.c 2003-08-22 16:57:00.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/hcd.c 2003-09-03 04:46:52.000000000 -0700
@@ -483,7 +483,7 @@
{
struct urb *urb;
struct usb_hcd *hcd;
- int length;
+ int length = 0;
unsigned long flags;
urb = (struct urb *) ptr;
@@ -499,7 +499,9 @@
return;
}
- length = hcd->driver->hub_status_data (hcd, urb->transfer_buffer);
+ if (!HCD_IS_SUSPENDED (hcd->state))
+ length = hcd->driver->hub_status_data (
+ hcd, urb->transfer_buffer);
/* complete the status urb, or retrigger the timer */
spin_lock (&hcd_data_lock);
@@ -1097,6 +1099,8 @@
static int hcd_get_frame_number (struct usb_device *udev)
{
struct usb_hcd *hcd = (struct usb_hcd *)udev->bus->hcpriv;
+ if (!HCD_IS_RUNNING (hcd->state))
+ return -ESHUTDOWN;
return hcd->driver->get_frame_number (hcd);
}
@@ -1193,6 +1197,12 @@
goto done;
}
+ /* running ~= hc unlink handshake works (irq, timer, etc)
+ * halted ~= no unlink handshake is needed
+ * suspended, resuming == should never happen
+ */
+ WARN_ON (!HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_HALT);
+
if (!urb->hcpriv) {
retval = -EINVAL;
goto done;
@@ -1208,6 +1218,17 @@
goto done;
}
+ /* PCI IRQ setup can easily be broken so that USB controllers
+ * never get completion IRQs ... maybe even the ones we need to
+ * finish unlinking the initial failed usb_set_address().
+ */
+ if (!hcd->saw_irq) {
+ dev_warn (hcd->controller, "Unlink after no-IRQ? "
+ "Different ACPI or APIC settings may help."
+ "\n");
+ hcd->saw_irq = 1;
+ }
+
/* maybe set up to block until the urb's completion fires. the
* lower level hcd code is always async, locking on urb->status
* updates; an intercepted completion unblocks us.
@@ -1287,6 +1308,8 @@
dev = udev->hcpriv;
hcd = udev->bus->hcpriv;
+ WARN_ON (!HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_HALT);
+
local_irq_disable ();
rescan:
@@ -1483,6 +1506,7 @@
if (unlikely (hcd->state == USB_STATE_HALT)) /* irq sharing? */
return IRQ_NONE;
+ hcd->saw_irq = 1;
hcd->driver->irq (hcd, r);
if (hcd->state != start && hcd->state == USB_STATE_HALT)
usb_hc_died (hcd);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/hcd.h linux-2.6.0-test4-bk5/drivers/usb/core/hcd.h
--- linux-2.6.0-test4-bk4/drivers/usb/core/hcd.h 2003-08-22 16:53:55.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/hcd.h 2003-09-03 04:46:52.000000000 -0700
@@ -73,6 +73,7 @@
* hardware info/state
*/
struct hc_driver *driver; /* hw-specific hooks */
+ unsigned saw_irq : 1;
int irq; /* irq allocated */
void *regs; /* device memory/io */
struct device *controller; /* handle to hardware */
@@ -89,13 +90,11 @@
int state;
# define __ACTIVE 0x01
-# define __SLEEPY 0x02
# define __SUSPEND 0x04
# define __TRANSIENT 0x80
# define USB_STATE_HALT 0
# define USB_STATE_RUNNING (__ACTIVE)
-# define USB_STATE_READY (__ACTIVE|__SLEEPY)
# define USB_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE)
# define USB_STATE_RESUMING (__SUSPEND|__TRANSIENT)
# define USB_STATE_SUSPENDED (__SUSPEND)
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/message.c linux-2.6.0-test4-bk5/drivers/usb/core/message.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/message.c 2003-08-22 16:53:13.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/message.c 2003-09-03 04:46:52.000000000 -0700
@@ -246,21 +246,22 @@
io->status = urb->status;
/* the previous urbs, and this one, completed already.
- * unlink the later ones so they won't rx/tx bad data,
- *
- * FIXME don't bother unlinking urbs that haven't yet been
- * submitted; those non-error cases shouldn't be syslogged
+ * unlink pending urbs so they won't rx/tx bad data.
*/
for (i = 0, found = 0; i < io->entries; i++) {
+ if (!io->urbs [i])
+ continue;
if (found) {
status = usb_unlink_urb (io->urbs [i]);
- if (status && status != -EINPROGRESS)
- err ("sg_complete, unlink --> %d",
- status);
+ if (status != -EINPROGRESS && status != -EBUSY)
+ dev_err (&io->dev->dev,
+ "%s, unlink --> %d\n",
+ __FUNCTION__, status);
} else if (urb == io->urbs [i])
found = 1;
}
}
+ urb->dev = 0;
/* on the last completion, signal usb_sg_wait() */
io->bytes += urb->actual_length;
@@ -356,7 +357,7 @@
goto nomem;
}
- io->urbs [i]->dev = dev;
+ io->urbs [i]->dev = 0;
io->urbs [i]->pipe = pipe;
io->urbs [i]->interval = period;
io->urbs [i]->transfer_flags = urb_flags;
@@ -448,6 +449,7 @@
for (i = 0; i < io->entries && !io->status; i++) {
int retval;
+ io->urbs [i]->dev = io->dev;
retval = usb_submit_urb (io->urbs [i], SLAB_ATOMIC);
/* after we submit, let completions or cancelations fire;
@@ -459,9 +461,9 @@
case -ENXIO: // hc didn't queue this one
case -EAGAIN:
case -ENOMEM:
+ io->urbs [i]->dev = 0;
retval = 0;
i--;
- // FIXME: should it usb_sg_cancel() on INTERRUPT?
yield ();
break;
@@ -477,8 +479,10 @@
/* fail any uncompleted urbs */
default:
+ io->urbs [i]->dev = 0;
io->urbs [i]->status = retval;
- dbg ("usb_sg_msg, submit --> %d", retval);
+ dev_dbg (&io->dev->dev, "%s, submit --> %d\n",
+ __FUNCTION__, retval);
usb_sg_cancel (io);
}
spin_lock_irqsave (&io->lock, flags);
@@ -521,9 +525,9 @@
if (!io->urbs [i]->dev)
continue;
retval = usb_unlink_urb (io->urbs [i]);
- if (retval && retval != -EINPROGRESS)
- warn ("usb_sg_cancel, unlink --> %d", retval);
- // FIXME don't warn on "not yet submitted" error
+ if (retval != -EINPROGRESS && retval != -EBUSY)
+ dev_warn (&io->dev->dev, "%s, unlink --> %d\n",
+ __FUNCTION__, retval);
}
}
spin_unlock_irqrestore (&io->lock, flags);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/usb.c linux-2.6.0-test4-bk5/drivers/usb/core/usb.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/usb.c 2003-08-22 16:56:17.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/usb.c 2003-09-03 04:46:52.000000000 -0700
@@ -991,8 +991,8 @@
*
* This call is synchronous, and may not be used in an interrupt context.
*
- * Only hub drivers (including virtual root hub drivers for host
- * controllers) should ever call this.
+ * Only the hub driver should ever call this; root hub registration
+ * uses it only indirectly.
*/
#define NEW_DEVICE_RETRYS 2
#define SET_ADDRESS_RETRYS 2
@@ -1417,11 +1417,46 @@
usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
}
+static int usb_device_suspend(struct device *dev, u32 state)
+{
+ struct usb_interface *intf;
+ struct usb_driver *driver;
+
+ if ((dev->driver == &usb_generic_driver) ||
+ (dev->driver_data == &usb_generic_driver_data))
+ return 0;
+
+ intf = to_usb_interface(dev);
+ driver = to_usb_driver(dev->driver);
+
+ if (driver && driver->suspend)
+ return driver->suspend(intf, state);
+ return 0;
+}
+
+static int usb_device_resume(struct device *dev)
+{
+ struct usb_interface *intf;
+ struct usb_driver *driver;
+
+ if ((dev->driver == &usb_generic_driver) ||
+ (dev->driver_data == &usb_generic_driver_data))
+ return 0;
+
+ intf = to_usb_interface(dev);
+ driver = to_usb_driver(dev->driver);
+
+ if (driver && driver->resume)
+ return driver->resume(intf);
+ return 0;
+}
struct bus_type usb_bus_type = {
.name = "usb",
.match = usb_device_match,
.hotplug = usb_hotplug,
+ .suspend = usb_device_suspend,
+ .resume = usb_device_resume,
};
#ifndef MODULE
@@ -1509,7 +1544,6 @@
EXPORT_SYMBOL(usb_find_interface);
EXPORT_SYMBOL(usb_ifnum_to_if);
-EXPORT_SYMBOL(usb_new_device);
EXPORT_SYMBOL(usb_reset_device);
EXPORT_SYMBOL(usb_disconnect);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/host/uhci-hcd.c linux-2.6.0-test4-bk5/drivers/usb/host/uhci-hcd.c
--- linux-2.6.0-test4-bk4/drivers/usb/host/uhci-hcd.c 2003-08-22 16:59:32.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/host/uhci-hcd.c 2003-09-03 04:46:52.000000000 -0700
@@ -2099,7 +2099,7 @@
uhci->state_end = jiffies + HZ;
outw(USBCMD_RS | USBCMD_CF | USBCMD_MAXP, io_addr + USBCMD);
- uhci->hcd.state = USB_STATE_READY;
+ uhci->hcd.state = USB_STATE_RUNNING;
}
/*
@@ -2143,6 +2143,20 @@
#endif
}
+static int uhci_reset(struct usb_hcd *hcd)
+{
+ struct uhci_hcd *uhci = hcd_to_uhci(hcd);
+
+ uhci->io_addr = (unsigned long) hcd->regs;
+
+ /* Maybe kick BIOS off this hardware. Then reset, so we won't get
+ * interrupts from any previous setup.
+ */
+ pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT);
+ reset_hc(uhci);
+ return 0;
+}
+
/*
* Allocate a frame list, and then setup the skeleton
*
@@ -2159,7 +2173,7 @@
* - The fourth queue is the bandwidth reclamation queue, which loops back
* to the high speed control queue.
*/
-static int __devinit uhci_start(struct usb_hcd *hcd)
+static int uhci_start(struct usb_hcd *hcd)
{
struct uhci_hcd *uhci = hcd_to_uhci(hcd);
int retval = -EBUSY;
@@ -2171,7 +2185,6 @@
struct proc_dir_entry *ent;
#endif
- uhci->io_addr = (unsigned long) hcd->regs;
io_size = pci_resource_len(hcd->pdev, hcd->region);
#ifdef CONFIG_PROC_FS
@@ -2188,10 +2201,6 @@
uhci->proc_entry = ent;
#endif
- /* Reset here so we don't get any interrupts from an old setup */
- /* or broken setup */
- reset_hc(uhci);
-
uhci->fsbr = 0;
uhci->fsbrtimeout = 0;
@@ -2343,9 +2352,6 @@
init_stall_timer(hcd);
- /* disable legacy emulation */
- pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT);
-
udev->speed = USB_SPEED_FULL;
if (usb_register_root_hub(udev, &hcd->pdev->dev) != 0) {
@@ -2446,7 +2452,7 @@
reset_hc(uhci);
start_hc(uhci);
}
- uhci->hcd.state = USB_STATE_READY;
+ uhci->hcd.state = USB_STATE_RUNNING;
return 0;
}
#endif
@@ -2484,6 +2490,7 @@
.flags = HCD_USB11,
/* Basic lifecycle operations */
+ .reset = uhci_reset,
.start = uhci_start,
#ifdef CONFIG_PM
.suspend = uhci_suspend,
@@ -2504,18 +2511,9 @@
};
static const struct pci_device_id uhci_pci_ids[] = { {
-
/* handle any USB UHCI controller */
- .class = ((PCI_CLASS_SERIAL_USB << 8) | 0x00),
- .class_mask = ~0,
+ PCI_DEVICE_CLASS(((PCI_CLASS_SERIAL_USB << 8) | 0x00), ~0),
.driver_data = (unsigned long) &uhci_driver,
-
- /* no matter who makes it */
- .vendor = PCI_ANY_ID,
- .device = PCI_ANY_ID,
- .subvendor = PCI_ANY_ID,
- .subdevice = PCI_ANY_ID,
-
}, { /* end: all zeroes */ }
};
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: USB problem. 'irq 9: nobody cared!'
2003-09-21 18:41 Yaroslav Halchenko
@ 2003-09-22 6:33 ` Jan Dittmer
[not found] ` <20030923050848.GA5917@washoe.rutgers.edu>
0 siblings, 1 reply; 13+ messages in thread
From: Jan Dittmer @ 2003-09-22 6:33 UTC (permalink / raw)
To: kernel; +Cc: linux-kernel
Yaroslav Halchenko <kernel@onerussian.com> wrote on 2003-09-21 14:41:49
> Dear Gurus,
>
> Since one of the bk versions in -test4- USB problem persist. On boot I'm
> getting next dump. More information about my system and configuration is at
>
> http://www.onerussian.com/Linux/bug.USB/
>
> Please help to get rid of the problem cause USB doesn't work now for me :-(
Try reverting the following patch, taken from the bk4-bk5 incremental
diff (Apply with patch -p1 -R). This fixed it for me.
Jan
--
Jan Dittmer - jdittmer@ppp0.net
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/hcd-pci.c linux-2.6.0-test4-bk5/drivers/usb/core/hcd-pci.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/hcd-pci.c 2003-08-22 16:55:40.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/hcd-pci.c 2003-09-03 04:46:52.000000000 -0700
@@ -139,6 +139,7 @@
return retval;
}
}
+ // hcd zeroed everything
hcd->regs = base;
hcd->region = region;
@@ -165,6 +166,7 @@
dev_err (hcd->controller, "can't reset\n");
goto clean_3;
}
+ hcd->state = USB_STATE_HALT;
pci_set_master (dev);
#ifndef __sparc__
@@ -230,7 +232,8 @@
BUG ();
hub = hcd->self.root_hub;
- hcd->state = USB_STATE_QUIESCING;
+ if (HCD_IS_RUNNING (hcd->state))
+ hcd->state = USB_STATE_QUIESCING;
dev_dbg (hcd->controller, "roothub graceful disconnect\n");
usb_disconnect (&hub);
@@ -287,8 +290,8 @@
pci_save_state (dev, hcd->pci_state);
/* driver may want to disable DMA etc */
+ hcd->state = USB_STATE_QUIESCING;
retval = hcd->driver->suspend (hcd, state);
- hcd->state = USB_STATE_SUSPENDED;
}
pci_set_power_state (dev, state);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/hcd.c linux-2.6.0-test4-bk5/drivers/usb/core/hcd.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/hcd.c 2003-08-22 16:57:00.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/hcd.c 2003-09-03 04:46:52.000000000 -0700
@@ -483,7 +483,7 @@
{
struct urb *urb;
struct usb_hcd *hcd;
- int length;
+ int length = 0;
unsigned long flags;
urb = (struct urb *) ptr;
@@ -499,7 +499,9 @@
return;
}
- length = hcd->driver->hub_status_data (hcd, urb->transfer_buffer);
+ if (!HCD_IS_SUSPENDED (hcd->state))
+ length = hcd->driver->hub_status_data (
+ hcd, urb->transfer_buffer);
/* complete the status urb, or retrigger the timer */
spin_lock (&hcd_data_lock);
@@ -1097,6 +1099,8 @@
static int hcd_get_frame_number (struct usb_device *udev)
{
struct usb_hcd *hcd = (struct usb_hcd *)udev->bus->hcpriv;
+ if (!HCD_IS_RUNNING (hcd->state))
+ return -ESHUTDOWN;
return hcd->driver->get_frame_number (hcd);
}
@@ -1193,6 +1197,12 @@
goto done;
}
+ /* running ~= hc unlink handshake works (irq, timer, etc)
+ * halted ~= no unlink handshake is needed
+ * suspended, resuming == should never happen
+ */
+ WARN_ON (!HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_HALT);
+
if (!urb->hcpriv) {
retval = -EINVAL;
goto done;
@@ -1208,6 +1218,17 @@
goto done;
}
+ /* PCI IRQ setup can easily be broken so that USB controllers
+ * never get completion IRQs ... maybe even the ones we need to
+ * finish unlinking the initial failed usb_set_address().
+ */
+ if (!hcd->saw_irq) {
+ dev_warn (hcd->controller, "Unlink after no-IRQ? "
+ "Different ACPI or APIC settings may help."
+ "\n");
+ hcd->saw_irq = 1;
+ }
+
/* maybe set up to block until the urb's completion fires. the
* lower level hcd code is always async, locking on urb->status
* updates; an intercepted completion unblocks us.
@@ -1287,6 +1308,8 @@
dev = udev->hcpriv;
hcd = udev->bus->hcpriv;
+ WARN_ON (!HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_HALT);
+
local_irq_disable ();
rescan:
@@ -1483,6 +1506,7 @@
if (unlikely (hcd->state == USB_STATE_HALT)) /* irq sharing? */
return IRQ_NONE;
+ hcd->saw_irq = 1;
hcd->driver->irq (hcd, r);
if (hcd->state != start && hcd->state == USB_STATE_HALT)
usb_hc_died (hcd);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/hcd.h linux-2.6.0-test4-bk5/drivers/usb/core/hcd.h
--- linux-2.6.0-test4-bk4/drivers/usb/core/hcd.h 2003-08-22 16:53:55.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/hcd.h 2003-09-03 04:46:52.000000000 -0700
@@ -73,6 +73,7 @@
* hardware info/state
*/
struct hc_driver *driver; /* hw-specific hooks */
+ unsigned saw_irq : 1;
int irq; /* irq allocated */
void *regs; /* device memory/io */
struct device *controller; /* handle to hardware */
@@ -89,13 +90,11 @@
int state;
# define __ACTIVE 0x01
-# define __SLEEPY 0x02
# define __SUSPEND 0x04
# define __TRANSIENT 0x80
# define USB_STATE_HALT 0
# define USB_STATE_RUNNING (__ACTIVE)
-# define USB_STATE_READY (__ACTIVE|__SLEEPY)
# define USB_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE)
# define USB_STATE_RESUMING (__SUSPEND|__TRANSIENT)
# define USB_STATE_SUSPENDED (__SUSPEND)
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/message.c linux-2.6.0-test4-bk5/drivers/usb/core/message.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/message.c 2003-08-22 16:53:13.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/message.c 2003-09-03 04:46:52.000000000 -0700
@@ -246,21 +246,22 @@
io->status = urb->status;
/* the previous urbs, and this one, completed already.
- * unlink the later ones so they won't rx/tx bad data,
- *
- * FIXME don't bother unlinking urbs that haven't yet been
- * submitted; those non-error cases shouldn't be syslogged
+ * unlink pending urbs so they won't rx/tx bad data.
*/
for (i = 0, found = 0; i < io->entries; i++) {
+ if (!io->urbs [i])
+ continue;
if (found) {
status = usb_unlink_urb (io->urbs [i]);
- if (status && status != -EINPROGRESS)
- err ("sg_complete, unlink --> %d",
- status);
+ if (status != -EINPROGRESS && status != -EBUSY)
+ dev_err (&io->dev->dev,
+ "%s, unlink --> %d\n",
+ __FUNCTION__, status);
} else if (urb == io->urbs [i])
found = 1;
}
}
+ urb->dev = 0;
/* on the last completion, signal usb_sg_wait() */
io->bytes += urb->actual_length;
@@ -356,7 +357,7 @@
goto nomem;
}
- io->urbs [i]->dev = dev;
+ io->urbs [i]->dev = 0;
io->urbs [i]->pipe = pipe;
io->urbs [i]->interval = period;
io->urbs [i]->transfer_flags = urb_flags;
@@ -448,6 +449,7 @@
for (i = 0; i < io->entries && !io->status; i++) {
int retval;
+ io->urbs [i]->dev = io->dev;
retval = usb_submit_urb (io->urbs [i], SLAB_ATOMIC);
/* after we submit, let completions or cancelations fire;
@@ -459,9 +461,9 @@
case -ENXIO: // hc didn't queue this one
case -EAGAIN:
case -ENOMEM:
+ io->urbs [i]->dev = 0;
retval = 0;
i--;
- // FIXME: should it usb_sg_cancel() on INTERRUPT?
yield ();
break;
@@ -477,8 +479,10 @@
/* fail any uncompleted urbs */
default:
+ io->urbs [i]->dev = 0;
io->urbs [i]->status = retval;
- dbg ("usb_sg_msg, submit --> %d", retval);
+ dev_dbg (&io->dev->dev, "%s, submit --> %d\n",
+ __FUNCTION__, retval);
usb_sg_cancel (io);
}
spin_lock_irqsave (&io->lock, flags);
@@ -521,9 +525,9 @@
if (!io->urbs [i]->dev)
continue;
retval = usb_unlink_urb (io->urbs [i]);
- if (retval && retval != -EINPROGRESS)
- warn ("usb_sg_cancel, unlink --> %d", retval);
- // FIXME don't warn on "not yet submitted" error
+ if (retval != -EINPROGRESS && retval != -EBUSY)
+ dev_warn (&io->dev->dev, "%s, unlink --> %d\n",
+ __FUNCTION__, retval);
}
}
spin_unlock_irqrestore (&io->lock, flags);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/core/usb.c linux-2.6.0-test4-bk5/drivers/usb/core/usb.c
--- linux-2.6.0-test4-bk4/drivers/usb/core/usb.c 2003-08-22 16:56:17.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/core/usb.c 2003-09-03 04:46:52.000000000 -0700
@@ -991,8 +991,8 @@
*
* This call is synchronous, and may not be used in an interrupt context.
*
- * Only hub drivers (including virtual root hub drivers for host
- * controllers) should ever call this.
+ * Only the hub driver should ever call this; root hub registration
+ * uses it only indirectly.
*/
#define NEW_DEVICE_RETRYS 2
#define SET_ADDRESS_RETRYS 2
@@ -1417,11 +1417,46 @@
usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
}
+static int usb_device_suspend(struct device *dev, u32 state)
+{
+ struct usb_interface *intf;
+ struct usb_driver *driver;
+
+ if ((dev->driver == &usb_generic_driver) ||
+ (dev->driver_data == &usb_generic_driver_data))
+ return 0;
+
+ intf = to_usb_interface(dev);
+ driver = to_usb_driver(dev->driver);
+
+ if (driver && driver->suspend)
+ return driver->suspend(intf, state);
+ return 0;
+}
+
+static int usb_device_resume(struct device *dev)
+{
+ struct usb_interface *intf;
+ struct usb_driver *driver;
+
+ if ((dev->driver == &usb_generic_driver) ||
+ (dev->driver_data == &usb_generic_driver_data))
+ return 0;
+
+ intf = to_usb_interface(dev);
+ driver = to_usb_driver(dev->driver);
+
+ if (driver && driver->resume)
+ return driver->resume(intf);
+ return 0;
+}
struct bus_type usb_bus_type = {
.name = "usb",
.match = usb_device_match,
.hotplug = usb_hotplug,
+ .suspend = usb_device_suspend,
+ .resume = usb_device_resume,
};
#ifndef MODULE
@@ -1509,7 +1544,6 @@
EXPORT_SYMBOL(usb_find_interface);
EXPORT_SYMBOL(usb_ifnum_to_if);
-EXPORT_SYMBOL(usb_new_device);
EXPORT_SYMBOL(usb_reset_device);
EXPORT_SYMBOL(usb_disconnect);
diff -urN linux-2.6.0-test4-bk4/drivers/usb/host/uhci-hcd.c linux-2.6.0-test4-bk5/drivers/usb/host/uhci-hcd.c
--- linux-2.6.0-test4-bk4/drivers/usb/host/uhci-hcd.c 2003-08-22 16:59:32.000000000 -0700
+++ linux-2.6.0-test4-bk5/drivers/usb/host/uhci-hcd.c 2003-09-03 04:46:52.000000000 -0700
@@ -2099,7 +2099,7 @@
uhci->state_end = jiffies + HZ;
outw(USBCMD_RS | USBCMD_CF | USBCMD_MAXP, io_addr + USBCMD);
- uhci->hcd.state = USB_STATE_READY;
+ uhci->hcd.state = USB_STATE_RUNNING;
}
/*
@@ -2143,6 +2143,20 @@
#endif
}
+static int uhci_reset(struct usb_hcd *hcd)
+{
+ struct uhci_hcd *uhci = hcd_to_uhci(hcd);
+
+ uhci->io_addr = (unsigned long) hcd->regs;
+
+ /* Maybe kick BIOS off this hardware. Then reset, so we won't get
+ * interrupts from any previous setup.
+ */
+ pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT);
+ reset_hc(uhci);
+ return 0;
+}
+
/*
* Allocate a frame list, and then setup the skeleton
*
@@ -2159,7 +2173,7 @@
* - The fourth queue is the bandwidth reclamation queue, which loops back
* to the high speed control queue.
*/
-static int __devinit uhci_start(struct usb_hcd *hcd)
+static int uhci_start(struct usb_hcd *hcd)
{
struct uhci_hcd *uhci = hcd_to_uhci(hcd);
int retval = -EBUSY;
@@ -2171,7 +2185,6 @@
struct proc_dir_entry *ent;
#endif
- uhci->io_addr = (unsigned long) hcd->regs;
io_size = pci_resource_len(hcd->pdev, hcd->region);
#ifdef CONFIG_PROC_FS
@@ -2188,10 +2201,6 @@
uhci->proc_entry = ent;
#endif
- /* Reset here so we don't get any interrupts from an old setup */
- /* or broken setup */
- reset_hc(uhci);
-
uhci->fsbr = 0;
uhci->fsbrtimeout = 0;
@@ -2343,9 +2352,6 @@
init_stall_timer(hcd);
- /* disable legacy emulation */
- pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT);
-
udev->speed = USB_SPEED_FULL;
if (usb_register_root_hub(udev, &hcd->pdev->dev) != 0) {
@@ -2446,7 +2452,7 @@
reset_hc(uhci);
start_hc(uhci);
}
- uhci->hcd.state = USB_STATE_READY;
+ uhci->hcd.state = USB_STATE_RUNNING;
return 0;
}
#endif
@@ -2484,6 +2490,7 @@
.flags = HCD_USB11,
/* Basic lifecycle operations */
+ .reset = uhci_reset,
.start = uhci_start,
#ifdef CONFIG_PM
.suspend = uhci_suspend,
@@ -2504,18 +2511,9 @@
};
static const struct pci_device_id uhci_pci_ids[] = { {
-
/* handle any USB UHCI controller */
- .class = ((PCI_CLASS_SERIAL_USB << 8) | 0x00),
- .class_mask = ~0,
+ PCI_DEVICE_CLASS(((PCI_CLASS_SERIAL_USB << 8) | 0x00), ~0),
.driver_data = (unsigned long) &uhci_driver,
-
- /* no matter who makes it */
- .vendor = PCI_ANY_ID,
- .device = PCI_ANY_ID,
- .subvendor = PCI_ANY_ID,
- .subdevice = PCI_ANY_ID,
-
}, { /* end: all zeroes */ }
};
^ permalink raw reply [flat|nested] 13+ messages in thread
* USB problem. 'irq 9: nobody cared!'
@ 2003-09-21 18:41 Yaroslav Halchenko
2003-09-22 6:33 ` Jan Dittmer
0 siblings, 1 reply; 13+ messages in thread
From: Yaroslav Halchenko @ 2003-09-21 18:41 UTC (permalink / raw)
To: linux-kernel; +Cc: kernel
Dear Gurus,
Since one of the bk versions in -test4- USB problem persist. On boot I'm
getting next dump. More information about my system and configuration is at
http://www.onerussian.com/Linux/bug.USB/
Please help to get rid of the problem cause USB doesn't work now for me :-(
drivers/usb/host/uhci-hcd.c: USB Universal Host Controller Interface
driver v2.1
uhci-hcd 0000:00:1f.2: UHCI Host Controller
irq 9: nobody cared!
Call Trace:
[<c010b70a>] __report_bad_irq+0x2a/0x90
[<c010b800>] note_interrupt+0x70/0xb0
[<c010bad0>] do_IRQ+0x120/0x130
[<c0109d88>] common_interrupt+0x18/0x20
[<c0124b6e>] do_softirq+0x3e/0xa0
[<c010baab>] do_IRQ+0xfb/0x130
[<c0109d88>] common_interrupt+0x18/0x20
[<c01f3c60>] pci_bus_write_config_word+0x60/0x90
[<c02f6331>] uhci_reset+0x41/0x60
[<c02e5b44>] usb_hcd_pci_probe+0x194/0x4a0
[<c016b3a1>] dput+0x31/0x220
[<c01f7bc2>] pci_device_probe_static+0x52/0x70
[<c01f7c1c>] __pci_device_probe+0x3c/0x50
[<c01f7c5c>] pci_device_probe+0x2c/0x50
[<c025accf>] bus_match+0x3f/0x70
[<c025ae1f>] driver_attach+0x6f/0xb0
[<c025b0e3>] bus_add_driver+0x93/0xb0
[<c025b51f>] driver_register+0x2f/0x40
[<c01f7e50>] pci_register_driver+0x60/0x90
[<c053207d>] uhci_hcd_init+0xbd/0x150
[<c05167ab>] do_initcalls+0x2b/0xa0
[<c01305bf>] init_workqueues+0xf/0x30
[<c01050a4>] init+0x34/0x1d0
[<c0105070>] init+0x0/0x1d0
[<c01072a5>] kernel_thread_helper+0x5/0x10
handlers:
[<c02015cf>] (acpi_irq+0x0/0x16)
[<c02bb040>] (ohci_irq_handler+0x0/0x7e0)
[<c02d9240>] (yenta_interrupt+0x0/0x40)
Disabling IRQ #9
Sincerely
.-.
=------------------------------ /v\ ----------------------------=
Keep in touch // \\ (yoh@|www.)onerussian.com
Yaroslav Halchenko /( )\ ICQ#: 60653192
Linux User ^^-^^ [175555]
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2003-09-30 19:24 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-09-24 22:57 USB problem. 'irq 9: nobody cared!' Milton Miller
2003-09-25 4:23 ` Yaroslav Halchenko
2003-09-25 18:00 ` Greg KH
2003-09-25 19:11 ` David Brownell
2003-09-30 9:41 ` USB problem. 'irq 9: nobody cared!' (FIXED!) Arkadiusz Miskiewicz
2003-09-30 19:30 ` David Brownell
2003-09-26 3:14 ` USB problem. 'irq 9: nobody cared!' Yaroslav Halchenko
-- strict thread matches above, loose matches on Subject: below --
2003-09-21 18:41 Yaroslav Halchenko
2003-09-22 6:33 ` Jan Dittmer
[not found] ` <20030923050848.GA5917@washoe.rutgers.edu>
2003-09-23 9:47 ` Jan Dittmer
2003-09-24 20:48 ` Greg KH
2003-09-24 22:20 ` Yaroslav Halchenko
2003-09-25 7:41 ` Jan Dittmer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.