[PATCH] bug in VIA PCI IRQ routing

From: Karsten Keil
Date: Mon May 23 2005 - 08:01:21 EST


Hi,

during certification of some systems with VIA 82C586_0 chipset
we found that the PCI IRQ routing of PIRQD line goes wrong and the system
will get stuck because of unacknowledged IRQs.
It seems that the special case for PIRQD (pirq 4) is not needed for all
VIA versions. With this patch, the IRQ routing on these systems works
again (It did work with older 2.4 kernel versions prior the PIRQD change)

diff -urN linux-2.6.12-rc4-git7.org/arch/i386/pci/irq.c linux-2.6.12-rc4-git7/arch/i386/pci/irq.c
--- linux-2.6.12-rc4-git7.org/arch/i386/pci/irq.c 2005-05-23 13:35:48.562759583 +0200
+++ linux-2.6.12-rc4-git7/arch/i386/pci/irq.c 2005-05-23 13:41:47.349473060 +0200
@@ -26,6 +26,7 @@

static int broken_hp_bios_irq9;
static int acer_tm360_irqrouting;
+static int via_pirq_patch_value = 5;

static struct irq_routing_table *pirq_table;

@@ -217,12 +218,12 @@
*/
static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
{
- return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
+ return read_config_nybble(router, 0x55, pirq == 4 ? via_pirq_patch_value : pirq);
}

static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
{
- write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
+ write_config_nybble(router, 0x55, pirq == 4 ? via_pirq_patch_value : pirq, irq);
return 1;
}

@@ -512,6 +513,7 @@
switch(device)
{
case PCI_DEVICE_ID_VIA_82C586_0:
+ via_pirq_patch_value = 4;
case PCI_DEVICE_ID_VIA_82C596:
case PCI_DEVICE_ID_VIA_82C686:
case PCI_DEVICE_ID_VIA_8231:

--
Karsten Keil
SuSE Labs
ISDN development
-
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/