Re: irq 15: nobody cared! with KT600 chipset and 2.6.0-test9

From: Linus Torvalds
Date: Sun Nov 23 2003 - 11:43:26 EST



On Sun, 23 Nov 2003, Marco d'Itri wrote:
>
> ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
> hdc: IRQ probe failed (0x3cfa: 0). Guessing at 15
> hdc: CD-ROM 50X, ATAPI CD/DVD-ROM drive
> hdd: 32X10, ATAPI CD/DVD-ROM drive
> Badness in request_irq at arch/i386/kernel/irq.c:572
> Call Trace:
> [<c021a770>] ide_intr+0x0/0x130

There was nothing before this?

The probe failed _before_ the first warning?

If so, that means that the probing didn't try IRQ 15 for some other reason
than it already being requested for a device. That other reason is most
likely that IRQ 15 was "screaming" when the IRQ probe already started,
which would have made the irq probing turn it off.

So something in the ACPI code made IRQ15 active, or caused there to be a
pending interrupt. I'd guess that ACPI incorrectly turns the legacy IDE
interrupts to be PCI interrupts (level-triggered, active low) instead of
legacy interrupts (edge-triggered, active high).

But I also have to admit that the IDE irq probing code looks a bit
fragile. We could be more careful about making sure that the IDE
controller has its interrupt turned off before we start probing. So a
patch like this might be in order - it should just make autoprobing a bit
more robust.

Does this one make a difference?

Len - does ACPI ever change the polarity of an interrupt? Just turning the
irq level-triggered shouldn't matter that much, but if some part of ACPI
switches polarities around (and gets the wrong one) that would be deadly
and would cause screaming interrupts when no event is pending.

Linus

-----
===== drivers/ide/ide-probe.c 1.65 vs edited =====
--- 1.65/drivers/ide/ide-probe.c Wed Sep 3 09:52:16 2003
+++ edited/drivers/ide/ide-probe.c Sun Nov 23 08:35:37 2003
@@ -393,13 +393,19 @@
*/
if (IDE_CONTROL_REG) {
u8 ctl = drive->ctl | 2;
+ hwif->OUTB(ctl, IDE_CONTROL_REG);
+
+ /* Clear drive IRQ */
+ (void) hwif->INB(IDE_STATUS_REG);
+ udelay(5);
+
if (!hwif->irq) {
autoprobe = 1;
cookie = probe_irq_on();
/* enable device irq */
ctl &= ~2;
+ hwif->OUTB(ctl, IDE_CONTROL_REG);
}
- hwif->OUTB(ctl, IDE_CONTROL_REG);
}

retval = actual_try_to_identify(drive, cmd);


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