Re: hdc: lost interrupt ide-cd: cmd 0x3 timed out ...

From: Len Brown
Date: Sun May 09 2004 - 22:28:43 EST


On Sun, 2004-05-09 at 22:16, Brown, Len wrote:
> ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 7 10 11 12 14 15) *9
...
> Didn't see it in your .JPG dmesg, but I expect this was there:
>
> ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 15
>
> and probably that set IRQ15 to level/low which killed IDE.
>
> Please try the attached patch which disables the sanity
> check above.
>
> Also might be interesting to see what happens on this system
> if it is booted (without the patch) with "acpi_irq_balance"

Better yet, here's a proposd fix. Please give it a whirl.

The curve ball was that "illegal" IRQ9.
Its "illegalness" caused us to grab a new IRQ off the possible list,
but since it wasn't zero, we didn't scrub the new IRQ with our
usual heuristics for selecting ISA range IRQs.

I expect this will assign sound to IRQ10 or IRQ11.

thanks,
-Len

===== drivers/acpi/pci_link.c 1.28 vs edited =====
--- 1.28/drivers/acpi/pci_link.c Thu May 6 16:03:17 2004
+++ edited/drivers/acpi/pci_link.c Sun May 9 23:16:48 2004
@@ -478,7 +478,7 @@
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
- PIRQ_PENALTY_ISA_TYPICAL, /* IRQ12 mouse */
+ PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
@@ -545,17 +545,23 @@
if (link->irq.active == link->irq.possible[i])
break;
}
+ /*
+ * forget active IRQ that is not in possible list
+ */
+ if (i == link->irq.possible_count) {
+ if (acpi_strict)
+ printk(KERN_WARNING PREFIX "_CRS %d not found"
+ " in _PRS\n", link->irq.active);
+ link->irq.active = 0;
+ }

/*
* if active found, use it; else pick entry from end of possible list.
*/
- if (i != link->irq.possible_count) {
+ if (link->irq.active) {
irq = link->irq.active;
} else {
irq = link->irq.possible[link->irq.possible_count - 1];
- if (acpi_strict)
- printk(KERN_WARNING PREFIX "_CRS %d not found"
- " in _PRS\n", link->irq.active);
}

if (acpi_irq_balance || !link->irq.active) {