It's a 2.4.19 change, I call it a bug, but maybe they had some reason?
2.4.19 code:
/*
* Cyrix: nibble offset 0x5C
*/
static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int
pirq)
{
return read_config_nybble(router, 0x5C, (pirq-1)^1);
}
static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int
pirq, int irq)
{
write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
return 1;
}
2.4.17 code:
/*
* Cyrix: nibble offset 0x5C
*/
static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int
pirq)
{
return read_config_nybble(router, 0x5C, pirq-1);
}
static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int
pirq, int irq)
{
write_config_nybble(router, 0x5C, pirq-1, irq);
return 1;
}
Note the ^1, which flips the low-order bit. I commented this ^1 out on
2.4.19 and everything works as it should. The error was consistent with an
incorrect flipping of the low-order bit. I have no idea why this change
would have been put into place, or if it was even tested.
I do know some geode BIOSes have screwed-up IRQ tables in flash, so maybe
they were fixing a problem but doing it the wrong way. Not sure.
I know we have some Linux kernel guys on the list, forward to whoever
needs to see this if you wish.
ron