PATCH 2.4.5.ac6: more Via irq fixes
Attached is a patch against 2.4.5-ac6 which should fix issues with on-board Via devices and interrupts, particularly on Via SMP machines, or Via machines that requires 'noapic' or "PNP-OS:No" to be functional.
This has been tested by a user with a Via SMP board under both MPS 1.1 and MPS 1.4, and has been shown to solve the problems he was having with interrupt delivery. It has also been tested on my dinky, ancient K6-2 laptop to make sure there were no generic Via regressions.
Special thanks again to Adrian Cox, who pointed out the somewhat-documented fact that PCI_INTERRUPT_LINE is not merely a scratchpad register for the on-board Via devices. Since we blindly write the values from IO-APIC into PCI_INTERRUPT_LINE, whose irq values can exceed the register limit of 14, this caused some chaos for Via users.
This patch also moves the Via ACPI to drivers/pci/quirks.c, because Via ACPI is not x86 only, and it updates some comments and adds a helpful printk.
2.5/LATE 2.4 NOTE: As Linus has pointed out, we really need infrastructure to have different interrupt routers on a per-device basis. If you look through the PCI quirks in the arch and generic code, you see code working around this lack of infrastructure, sometimes in really ugly ways.
Signature · 4 lines
Jeff Garzik | Echelon words of the day, from The Register:
Building 1024 | FRU Lebed HALO Spetznaz Al Amn al-Askari Glock 26
MandrakeSoft | Steak Knife Kill the President anarchy echelon
| nuclear assassinate Roswell Waco World Trade Centerarch/i386/kernel/pci-pc.c +0 -14
@@ -940,18 +940,6 @@ pcibios_max_latency =32 ; } -static void __init pci_fixup_via_acpi (struct pci_dev *d) -{ -/* -* VIA ACPI device: IRQ line in PCI config byte 0x42 -*/ -u8 irq; -pci_read_config_byte (d,0x42 , &irq); - irq &=0x0f ; -if (irq && (irq !=2 )) - d->irq = irq; -} -static void __init pci_fixup_piix4_acpi (struct pci_dev *d) {/*
@@ -1002,8 +990,6 @@ { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency }, - { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, pci_fixup_via_acpi }, - { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, pci_fixup_via_acpi }, #if 0 /* This seems completely bogus so I am removing it -- Alan */ { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C691, pci_fixup_via691 },
drivers/pci/quirks.c +62 -0
92 lines not on this page · raw message
drivers/sound/via82cxxx_audio.c +0 -14
@@ -3012,7 +3012,6 @@ {int rc;struct via_info *card; -u8 tmp;static int printed_version =0 ;DPRINTK ("ENTER\n" );
@@ -3107,19 +3106,6 @@if (rc) { printk (KERN_ERR PFX "interrupt init failed, aborting\n"); goto err_out_have_proc; - } - -pci_read_config_byte (pdev,0x3C , &tmp); -if ((tmp &0x0F ) != pdev->irq) { - printk (KERN_WARNING PFX "IRQ fixup, 0x3C==0x%02X\n", tmp); -udelay (15 ); - tmp &=0xF0 ; - tmp |= pdev->irq; -pci_write_config_byte (pdev,0x3C , tmp); -DPRINTK ("new 0x3c==0x%02x\n" , tmp); - }else { -DPRINTK ("IRQ reg 0x3c==0x%02x, irq==%d\n" , - tmp, tmp &0x0F ); } printk (KERN_INFO PFX "board #%d at 0x%04lX, IRQ %d\n",