2004-09-23 17:27:02

by Andre Eisenbach

[permalink] [raw]
Subject: USB (OHCI) not working without pci=routeirq

Bjorn, Linux kernel devs,

when booting with a recent kernel (2.6.9-rc2-mm2), usb_ohci fails to
initialize the USB bus and no USB device will work at that point.
Adding pci=routeirq fixed the problem.

I believe this has been working with earlier kernels, but I don't use
USB often enough to remember.

The PC is an Compaq (HP) Presario 2100Z notebook.

Here's a diff of the dmesg output of two boots with and without pci=routeirq:

--- acpiirq/dmesg 2004-09-23 10:09:57.615512000 -0700
+++ pcirouteirq/dmesg 2004-09-23 10:07:34.000000000 -0700
@@ -22,10 +22,10 @@
ACPI: DSDT (v001 ATI U1_M1535 0x06040000 MSFT 0x0100000d) @ 0x00000000
Built 1 zonelists
Initializing CPU#0
-Kernel command line: BOOT_IMAGE=Gentoo ro root=305 elevator=cfq
+Kernel command line: BOOT_IMAGE=Gentoo ro root=305 elevator=cfq pci=routeirq
CPU 0 irqstacks, hard=c04df000 soft=c04de000
PID hash table entries: 2048 (order: 11, 32768 bytes)
-Detected 1788.828 MHz processor.
+Detected 1789.260 MHz processor.
Using tsc for high-res timesource
Console: colour VGA+ 80x25
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
@@ -72,18 +72,28 @@
usbcore: registered new driver usbfs
usbcore: registered new driver hub
PCI: Using ACPI for IRQ routing
-** PCI interrupts are no longer routed automatically. If this
-** causes a device to stop working, it is probably because the
-** driver failed to call pci_enable_device(). As a temporary
-** workaround, the "pci=routeirq" argument restores the old
-** behavior. If this argument makes the device work again,
+** Routing PCI interrupts for all devices because "pci=routeirq"
+** was specified. If this was required to make a driver work,
** please email the output of "lspci" to [email protected]
** so I can fix the driver.
+ACPI: PCI Interrupt Link [LNKU] enabled at IRQ 10
+ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 10 (level, low) -> IRQ 10
+ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 5
+ACPI: PCI interrupt 0000:00:06.0[A] -> GSI 5 (level, low) -> IRQ 5
+ACPI: PCI Interrupt Link [LNKG] enabled at IRQ 3
+ACPI: PCI interrupt 0000:00:08.0[A] -> GSI 3 (level, low) -> IRQ 3
+ACPI: PCI Interrupt Link [LNKF] enabled at IRQ 11
+ACPI: PCI interrupt 0000:00:0a.0[A] -> GSI 11 (level, low) -> IRQ 11
+ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
+ACPI: PCI interrupt 0000:00:0c.0[A] -> GSI 10 (level, low) -> IRQ 10
+ACPI: PCI interrupt 0000:00:10.0[A]: no GSI
+ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11
+ACPI: PCI interrupt 0000:00:12.0[A] -> GSI 11 (level, low) -> IRQ 11
+ACPI: PCI interrupt 0000:01:05.0[A] -> GSI 10 (level, low) -> IRQ 10
Simple Boot Flag at 0x36 set to 0x1
Machine check exception polling timer started.
ATI Northbridge, reserving I/O ports 0x3b0 to 0x3bb.
Activating ISA DMA hang workarounds.
-ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
ACPI: PCI interrupt 0000:01:05.0[A] -> GSI 10 (level, low) -> IRQ 10
radeonfb: Retreived PLL infos from BIOS
radeonfb: Reference=191.86 MHz (RefDiv=426) Memory=160.00 Mhz,
System=133.00 MHz
@@ -114,7 +124,6 @@
serio: i8042 KBD port at 0x60,0x64 irq 1
Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing disabled
ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
-ACPI: PCI Interrupt Link [LNKG] enabled at IRQ 3
ACPI: PCI interrupt 0000:00:08.0[A] -> GSI 3 (level, low) -> IRQ 3
ttyS1 at I/O 0x8828 (irq = 3) is a 8250
ttyS2 at I/O 0x8840 (irq = 3) is a 8250
@@ -128,7 +137,6 @@
originally by Donald Becker <[email protected]>
http://www.scyld.com/network/natsemi.html
2.4.x kernel port by Jeff Garzik, Tjeerd Mulder
-ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11
ACPI: PCI interrupt 0000:00:12.0[A] -> GSI 11 (level, low) -> IRQ 11
natsemi eth0: NatSemi DP8381[56] at 0xdc838000 (0000:00:12.0),
00:0d:9d:5a:41:46, IRQ 11, port TP.
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
@@ -162,17 +170,12 @@
hdc: ATAPI 24X DVD-ROM CD-R/RW drive, 2048kB Cache, DMA
Uniform CD-ROM driver Revision: 3.20
ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)
-ACPI: PCI Interrupt Link [LNKU] enabled at IRQ 10
ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 10 (level, low) -> IRQ 10
ohci_hcd 0000:00:02.0: ALi Corporation USB 1.1 Controller
ohci_hcd 0000:00:02.0: irq 10, pci mem 0xd0004000
ohci_hcd 0000:00:02.0: new USB bus registered, assigned bus number 1
-ohci_hcd 0000:00:02.0: init err (00002edf 2a2f)
-ohci_hcd 0000:00:02.0: can't start
-ohci_hcd 0000:00:02.0: init error -75
-ohci_hcd 0000:00:02.0: remove, state 0
-ohci_hcd 0000:00:02.0: USB bus 1 deregistered
-ohci_hcd: probe of 0000:00:02.0 failed with error -75
+hub 1-0:1.0: USB hub found
+hub 1-0:1.0: 4 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
@@ -180,6 +183,8 @@
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
mice: PS/2 mouse device common for all mice
input: AT Translated Set 2 keyboard on isa0060/serio0
+usb 1-2: new low speed USB device using address 2
+input: USB HID v1.10 Mouse [Logitech USB Receiver] on usb-0000:00:02.0-2
Synaptics Touchpad, model: 1
Firmware: 5.9
Sensor: 35
@@ -189,7 +194,6 @@
-> palm detection
input: SynPS/2 Synaptics TouchPad on isa0060/serio1
Advanced Linux Sound Architecture Driver Version 1.0.6 (Sun Aug 15
07:17:53 2004 UTC).
-ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 5
ACPI: PCI interrupt 0000:00:06.0[A] -> GSI 5 (level, low) -> IRQ 5
ALSA device list:
#0: ALI 5451 at 0x8400, irq 5
@@ -216,10 +220,9 @@
Adding 1004052k swap on /dev/hda3. Priority:-1 extents:1
Linux Kernel Card Services
options: [pci] [cardbus] [pm]
-ACPI: PCI Interrupt Link [LNKF] enabled at IRQ 11
ACPI: PCI interrupt 0000:00:0a.0[A] -> GSI 11 (level, low) -> IRQ 11
Yenta: CardBus bridge found at 0000:00:0a.0 [0000:0000]
-Yenta: ISA IRQ mask 0x0498, PCI irq 11
+Yenta: ISA IRQ mask 0x0098, PCI irq 11
Socket status: 30000007
eth0: DSPCFG accepted after 0 usec.
eth0: link up.


lspci:
0000:00:00.0 Host bridge: ATI Technologies Inc AGP Bridge [IGP 320M] (rev 13)
0000:00:01.0 PCI bridge: ATI Technologies Inc PCI Bridge [IGP 320M] (rev 01)
0000:00:02.0 USB Controller: ALi Corporation USB 1.1 Controller (rev 03)
0000:00:06.0 Multimedia audio controller: ALi Corporation M5451 PCI
AC-Link Controller Audio Device (rev 02)
0000:00:07.0 ISA bridge: ALi Corporation M1533 PCI to ISA Bridge [Aladdin IV]
0000:00:08.0 Modem: ALi Corporation M5457 AC'97 Modem Controller
0000:00:0a.0 CardBus bridge: O2 Micro, Inc. OZ6912 Cardbus Controller
0000:00:0c.0 FireWire (IEEE 1394): Texas Instruments TSB43AB21
IEEE-1394a-2000 Controller (PHY/Link)
0000:00:10.0 IDE interface: ALi Corporation M5229 IDE (rev c4)
0000:00:11.0 Bridge: ALi Corporation M7101 Power Management Controller [PMU]
0000:00:12.0 Ethernet controller: National Semiconductor Corporation
DP83815 (MacPhyter) Ethernet Controller
0000:01:05.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility U1


Let me know if you require any additional information.

Cheers,
Andre


2004-09-23 21:20:54

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: USB (OHCI) not working without pci=routeirq

On Thursday 23 September 2004 11:23 am, Andre Eisenbach wrote:
> when booting with a recent kernel (2.6.9-rc2-mm2), usb_ohci fails to
> initialize the USB bus and no USB device will work at that point.
> Adding pci=routeirq fixed the problem.
>
> I believe this has been working with earlier kernels, but I don't use
> USB often enough to remember.
>
> The PC is an Compaq (HP) Presario 2100Z notebook.

As far as I can see, usb_hcd_pci_probe() is using pci_enable_device()
correctly, so "pci=routeirq" shouldn't make a difference. However,
I do see a similar ohci_hcd initialization failure on my DL360
(my failure occurs both with and without "pci=routeirq").

My device worked correctly on 2.6.9-rc1-mm4 and is broken in 2.6.9-rc2-mm1.

My errors look like this:
ACPI: PCI interrupt 0000:00:0f.2[A] -> GSI 10 (level, low) -> IRQ 10
ohci_hcd 0000:00:0f.2: ServerWorks OSB4/CSB5 OHCI USB Controller
ohci_hcd 0000:00:0f.2: irq 10, pci mem 0xf5e70000
ohci_hcd 0000:00:0f.2: new USB bus registered, assigned bus number 1
ohci_hcd 0000:00:0f.2: init err (00002edf 0000)
ohci_hcd 0000:00:0f.2: can't start
ohci_hcd 0000:00:0f.2: init error -75
ohci_hcd 0000:00:0f.2: remove, state 0
ohci_hcd 0000:00:0f.2: USB bus 1 deregistered
ohci_hcd: probe of 0000:00:0f.2 failed with error -75


> Here's a diff of the dmesg output of two boots with and without pci=routeirq:
>
> --- acpiirq/dmesg 2004-09-23 10:09:57.615512000 -0700
> +++ pcirouteirq/dmesg 2004-09-23 10:07:34.000000000 -0700
> @@ -22,10 +22,10 @@
> ACPI: DSDT (v001 ATI U1_M1535 0x06040000 MSFT 0x0100000d) @ 0x00000000
> Built 1 zonelists
> Initializing CPU#0
> -Kernel command line: BOOT_IMAGE=Gentoo ro root=305 elevator=cfq
> +Kernel command line: BOOT_IMAGE=Gentoo ro root=305 elevator=cfq pci=routeirq
> CPU 0 irqstacks, hard=c04df000 soft=c04de000
> PID hash table entries: 2048 (order: 11, 32768 bytes)
> -Detected 1788.828 MHz processor.
> +Detected 1789.260 MHz processor.
> Using tsc for high-res timesource
> Console: colour VGA+ 80x25
> Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
> @@ -72,18 +72,28 @@
> usbcore: registered new driver usbfs
> usbcore: registered new driver hub
> PCI: Using ACPI for IRQ routing
> -** PCI interrupts are no longer routed automatically. If this
> -** causes a device to stop working, it is probably because the
> -** driver failed to call pci_enable_device(). As a temporary
> -** workaround, the "pci=routeirq" argument restores the old
> -** behavior. If this argument makes the device work again,
> +** Routing PCI interrupts for all devices because "pci=routeirq"
> +** was specified. If this was required to make a driver work,
> ** please email the output of "lspci" to [email protected]
> ** so I can fix the driver.
> +ACPI: PCI Interrupt Link [LNKU] enabled at IRQ 10
> +ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 10 (level, low) -> IRQ 10
> +ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 5
> +ACPI: PCI interrupt 0000:00:06.0[A] -> GSI 5 (level, low) -> IRQ 5
> +ACPI: PCI Interrupt Link [LNKG] enabled at IRQ 3
> +ACPI: PCI interrupt 0000:00:08.0[A] -> GSI 3 (level, low) -> IRQ 3
> +ACPI: PCI Interrupt Link [LNKF] enabled at IRQ 11
> +ACPI: PCI interrupt 0000:00:0a.0[A] -> GSI 11 (level, low) -> IRQ 11
> +ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
> +ACPI: PCI interrupt 0000:00:0c.0[A] -> GSI 10 (level, low) -> IRQ 10
> +ACPI: PCI interrupt 0000:00:10.0[A]: no GSI
> +ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11
> +ACPI: PCI interrupt 0000:00:12.0[A] -> GSI 11 (level, low) -> IRQ 11
> +ACPI: PCI interrupt 0000:01:05.0[A] -> GSI 10 (level, low) -> IRQ 10
> Simple Boot Flag at 0x36 set to 0x1
> Machine check exception polling timer started.
> ATI Northbridge, reserving I/O ports 0x3b0 to 0x3bb.
> Activating ISA DMA hang workarounds.
> -ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
> ACPI: PCI interrupt 0000:01:05.0[A] -> GSI 10 (level, low) -> IRQ 10
> radeonfb: Retreived PLL infos from BIOS
> radeonfb: Reference=191.86 MHz (RefDiv=426) Memory=160.00 Mhz,
> System=133.00 MHz
> @@ -114,7 +124,6 @@
> serio: i8042 KBD port at 0x60,0x64 irq 1
> Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing disabled
> ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
> -ACPI: PCI Interrupt Link [LNKG] enabled at IRQ 3
> ACPI: PCI interrupt 0000:00:08.0[A] -> GSI 3 (level, low) -> IRQ 3
> ttyS1 at I/O 0x8828 (irq = 3) is a 8250
> ttyS2 at I/O 0x8840 (irq = 3) is a 8250
> @@ -128,7 +137,6 @@
> originally by Donald Becker <[email protected]>
> http://www.scyld.com/network/natsemi.html
> 2.4.x kernel port by Jeff Garzik, Tjeerd Mulder
> -ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11
> ACPI: PCI interrupt 0000:00:12.0[A] -> GSI 11 (level, low) -> IRQ 11
> natsemi eth0: NatSemi DP8381[56] at 0xdc838000 (0000:00:12.0),
> 00:0d:9d:5a:41:46, IRQ 11, port TP.
> Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
> @@ -162,17 +170,12 @@
> hdc: ATAPI 24X DVD-ROM CD-R/RW drive, 2048kB Cache, DMA
> Uniform CD-ROM driver Revision: 3.20
> ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)
> -ACPI: PCI Interrupt Link [LNKU] enabled at IRQ 10
> ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 10 (level, low) -> IRQ 10
> ohci_hcd 0000:00:02.0: ALi Corporation USB 1.1 Controller
> ohci_hcd 0000:00:02.0: irq 10, pci mem 0xd0004000
> ohci_hcd 0000:00:02.0: new USB bus registered, assigned bus number 1
> -ohci_hcd 0000:00:02.0: init err (00002edf 2a2f)
> -ohci_hcd 0000:00:02.0: can't start
> -ohci_hcd 0000:00:02.0: init error -75
> -ohci_hcd 0000:00:02.0: remove, state 0
> -ohci_hcd 0000:00:02.0: USB bus 1 deregistered
> -ohci_hcd: probe of 0000:00:02.0 failed with error -75
> +hub 1-0:1.0: USB hub found
> +hub 1-0:1.0: 4 ports detected
> Initializing USB Mass Storage driver...
> usbcore: registered new driver usb-storage
> USB Mass Storage support registered.
> @@ -180,6 +183,8 @@
> drivers/usb/input/hid-core.c: v2.0:USB HID core driver
> mice: PS/2 mouse device common for all mice
> input: AT Translated Set 2 keyboard on isa0060/serio0
> +usb 1-2: new low speed USB device using address 2
> +input: USB HID v1.10 Mouse [Logitech USB Receiver] on usb-0000:00:02.0-2
> Synaptics Touchpad, model: 1
> Firmware: 5.9
> Sensor: 35
> @@ -189,7 +194,6 @@
> -> palm detection
> input: SynPS/2 Synaptics TouchPad on isa0060/serio1
> Advanced Linux Sound Architecture Driver Version 1.0.6 (Sun Aug 15
> 07:17:53 2004 UTC).
> -ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 5
> ACPI: PCI interrupt 0000:00:06.0[A] -> GSI 5 (level, low) -> IRQ 5
> ALSA device list:
> #0: ALI 5451 at 0x8400, irq 5
> @@ -216,10 +220,9 @@
> Adding 1004052k swap on /dev/hda3. Priority:-1 extents:1
> Linux Kernel Card Services
> options: [pci] [cardbus] [pm]
> -ACPI: PCI Interrupt Link [LNKF] enabled at IRQ 11
> ACPI: PCI interrupt 0000:00:0a.0[A] -> GSI 11 (level, low) -> IRQ 11
> Yenta: CardBus bridge found at 0000:00:0a.0 [0000:0000]
> -Yenta: ISA IRQ mask 0x0498, PCI irq 11
> +Yenta: ISA IRQ mask 0x0098, PCI irq 11
> Socket status: 30000007
> eth0: DSPCFG accepted after 0 usec.
> eth0: link up.
>
>
> lspci:
> 0000:00:00.0 Host bridge: ATI Technologies Inc AGP Bridge [IGP 320M] (rev 13)
> 0000:00:01.0 PCI bridge: ATI Technologies Inc PCI Bridge [IGP 320M] (rev 01)
> 0000:00:02.0 USB Controller: ALi Corporation USB 1.1 Controller (rev 03)
> 0000:00:06.0 Multimedia audio controller: ALi Corporation M5451 PCI
> AC-Link Controller Audio Device (rev 02)
> 0000:00:07.0 ISA bridge: ALi Corporation M1533 PCI to ISA Bridge [Aladdin IV]
> 0000:00:08.0 Modem: ALi Corporation M5457 AC'97 Modem Controller
> 0000:00:0a.0 CardBus bridge: O2 Micro, Inc. OZ6912 Cardbus Controller
> 0000:00:0c.0 FireWire (IEEE 1394): Texas Instruments TSB43AB21
> IEEE-1394a-2000 Controller (PHY/Link)
> 0000:00:10.0 IDE interface: ALi Corporation M5229 IDE (rev c4)
> 0000:00:11.0 Bridge: ALi Corporation M7101 Power Management Controller [PMU]
> 0000:00:12.0 Ethernet controller: National Semiconductor Corporation
> DP83815 (MacPhyter) Ethernet Controller
> 0000:01:05.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility U1
>
>
> Let me know if you require any additional information.
>
> Cheers,
> Andre
>

2004-09-24 16:45:00

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: USB (OHCI) not working without pci=routeirq

On Thursday 23 September 2004 11:23 am, Andre Eisenbach wrote:
> when booting with a recent kernel (2.6.9-rc2-mm2), usb_ohci fails to
> initialize the USB bus and no USB device will work at that point.
> Adding pci=routeirq fixed the problem.

Can you try this whitespace-damaged patch to see whether you're
seeing the same issue I was? If this patch fixes it, please post
the "lspci -n" output for your USB controller, so we can add a
quirk for it.

--- 2.6.9-rc2-mm2/drivers/usb/host/ohci-hcd.c.orig 2004-09-24 10:28:16.383160107 -0600
+++ 2.6.9-rc2-mm2/drivers/usb/host/ohci-hcd.c 2004-09-24 10:28:23.089214712 -0600
@@ -564,7 +564,7 @@
* (SiS, OPTi ...), so reset again instead. SiS doesn't need
* this if we write fmInterval after we're OPERATIONAL.
*/
- if (ohci->flags & OHCI_QUIRK_INITRESET) {
+ if (1 || ohci->flags & OHCI_QUIRK_INITRESET) {
writel (ohci->hc_control, &ohci->regs->control);
// flush those writes
(void) ohci_readl (&ohci->regs->control);

2004-10-01 00:43:11

by Andre Eisenbach

[permalink] [raw]
Subject: Re: USB (OHCI) not working without pci=routeirq

Sorry for the late reply ...

On Fri, 24 Sep 2004 10:33:09 -0600, Bjorn Helgaas <[email protected]> wrote:
> Can you try this whitespace-damaged patch to see whether you're
> seeing the same issue I was? If this patch fixes it, please post
> the "lspci -n" output for your USB controller, so we can add a
> quirk for it.

Yes, this patch fixes the problem.
I've submitted a different patch based on the testing results (Email
subject: [PATCH] ohci_hcd: ALi USB M5237 host controller init quirk),
which enables the quirk for my USB controller. That hopefully will
save you some work.

The lspci -n output (for reference) is:
0000:00:02.0 Class 0c03: 10b9:5237 (rev 03)

Which equals:
PCI_VENDOR_ID_AL / PCI_DEVICE_ID_AL_M5237

Thanks,
Andre Eisenbach