A comment in Linux-2.5.24, file arch/i386/pci/irq.c says:
/*
* Cyrix: nibble offset 0x5C
* 0x5C bits 7:4 is INTB bits 3:0 is INTA
* 0x5D bits 7:4 is INTD bits 3:0 is INTC
*/
Too bad that the functions pirq_cyrix_get() and pirq_cyrix_set() do it
wrong. Indeed, for INTA, pirq is 1, (pirq-1)^1 is 1, read_config_nybble()
takes most significant bits in 0x5C, and so does write_config_nybble().
For INTB pirq is 2, (pirq-1)^1 is 0, so we get bits 3:0 from 0x5c.
This results in the following warnings that disappear when the code is
fixed to match the comment:
Intel ISA/PCI/CardBus PCIC probe:
PCI: Found IRQ 11 for device 00:11.0
IRQ routing conflict for 00:11.0, have irq 15, want irq 11
PCI: Found IRQ 15 for device 00:11.1
IRQ routing conflict for 00:11.1, have irq 11, want irq 15
Patch for 2.5.24:
================================
--- linux.orig/arch/i386/pci/irq.c
+++ linux/arch/i386/pci/irq.c
@@ -248,12 +248,12 @@ static int pirq_opti_set(struct pci_dev
*/
static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
{
- return read_config_nybble(router, 0x5C, (pirq-1)^1);
+ 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)^1, irq);
+ write_config_nybble(router, 0x5C, pirq-1, irq);
return 1;
}
================================
Patch for 2.4.19-rc1:
================================
--- linux.orig/arch/i386/kernel/pci-irq.c
+++ linux/arch/i386/kernel/pci-irq.c
@@ -243,12 +243,12 @@ static int pirq_opti_set(struct pci_dev
*/
static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
{
- return read_config_nybble(router, 0x5C, (pirq-1)^1);
+ 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)^1, irq);
+ write_config_nybble(router, 0x5C, pirq-1, irq);
return 1;
}
================================
The code was right in 2.4.17, but it was broken in 2.4.18. This change is
not mentioned in
http://www.kernel.org/pub/linux/kernel/v2.4/ChangeLog-2.4.18
I'm assuming it was an accidental breakage, and it should be reverted.
-- Regards, Pavel Roskin- 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/