Re: IRQ Routing Problem on ALi Chipset Laptop (HP Pavilion N5425)

Cory Bell (cory.bell@usa.net)
08 Dec 2001 21:37:31 -0800


On Fri, 2001-12-07 at 12:33, Pavel Machek wrote:

> Hey, this gross hack fixed USB on HP OmniBook xe3. Good! (Perhaps you
> know what interrupt is right for maestro3, also on omnibook? ;-).

On my Pavilion (and the other 5400's as far as I can tell), maestro's on
irq 5. Wanna send me a "dump_pirq" and a "lspci -vvvxxx"? Could you try
the patch below (inspired by/stolen from Kai Germaschewski)? Also, the
newest acpi patch will print out the acpi irq routing table - might have
your info. You can tell if the patch below had any effect because it
will say it ASSIGNED IRQ XX instead of FOUND.

I believe the Omnibook XEs and the Pavilion N5400's are very similar
hardware. Several of the drivers I've seen on HP's website appear to
apply to both. If you want to help get the BIOS updated (the root cause,
IMHO), please call HP support and reference case number 1429683616 (that
9 may be a 4 - my handwriting is horrible). That's the case I logged
with thim about the broken PIR table (USB irq showing 9; being 11) and
failure to enable sse on athlon 4/duron/xp chips.

Thanks for the info!

-Cory

The "honor the irq mask" approach (works on my machine):
--- /home/cbell/linux-2.4/arch/i386/kernel/pci-irq.c Fri Dec 7 01:51:41 2001
+++ /home/cbell/linux-2.4-test/arch/i386/kernel/pci-irq.c Sat Dec 8 21:04:37 2001
@@ -581,6 +581,7 @@
* reported by the device if possible.
*/
newirq = dev->irq;
+ if (!((1 << newirq) & mask)) newirq = 0;
if (!newirq && assign) {
for (i = 0; i < 16; i++) {
if (!(mask & (1 << i)))
@@ -599,7 +600,7 @@
irq = pirq & 0xf;
DBG(" -> hardcoded IRQ %d\n", irq);
msg = "Hardcoded";
- } else if (r->get && (irq = r->get(pirq_router_dev, dev, pirq))) {
+ } else if (r->get && (irq = r->get(pirq_router_dev, dev, pirq) && ((1 << irq) & mask))) {
DBG(" -> got IRQ %d\n", irq);
msg = "Found";
} else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
@@ -633,7 +634,7 @@
continue;
if (info->irq[pin].link == pirq) {
/* We refuse to override the dev->irq information. Give a warning! */
- if (dev2->irq && dev2->irq != irq) {
+ if (dev2->irq && dev2->irq != irq && ((1 << dev2->irq) & mask)) {
printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
dev2->slot_name, dev2->irq, irq);
continue;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/