Index: brice-2.6.17-rc4/drivers/pci/quirks.c =================================================================== --- brice-2.6.17-rc4.orig/drivers/pci/quirks.c 2006-05-17 04:16:26.000000000 -0400 +++ brice-2.6.17-rc4/drivers/pci/quirks.c 2006-05-20 08:29:55.000000000 -0400 @@ -575,12 +575,6 @@ { unsigned char revid, tmp; - if (dev->subordinate) { - printk(KERN_WARNING "PCI: MSI quirk detected. " - "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n"); - dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; - } - if (nr_ioapics == 0) return; @@ -594,6 +588,16 @@ } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); +static void __init quirk_amd_8131_nomsi(struct pci_dev *dev) +{ + if (dev->subordinate) { + printk(KERN_WARNING "PCI: MSI quirk detected. " + "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n"); + dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; + } +} +DECLARE_PCI_FIXUP_BRIDGE_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_nomsi); + static void __init quirk_svw_msi(struct pci_dev *dev) { pci_msi_quirk = 1; @@ -1407,6 +1411,8 @@ extern struct pci_fixup __end_pci_fixups_early[]; extern struct pci_fixup __start_pci_fixups_header[]; extern struct pci_fixup __end_pci_fixups_header[]; +extern struct pci_fixup __start_pci_fixups_bridge_header[]; +extern struct pci_fixup __end_pci_fixups_bridge_header[]; extern struct pci_fixup __start_pci_fixups_final[]; extern struct pci_fixup __end_pci_fixups_final[]; extern struct pci_fixup __start_pci_fixups_enable[]; @@ -1428,6 +1434,11 @@ end = __end_pci_fixups_header; break; + case pci_fixup_bridge_header: + start = __start_pci_fixups_bridge_header; + end = __end_pci_fixups_bridge_header; + break; + case pci_fixup_final: start = __start_pci_fixups_final; end = __end_pci_fixups_final; Index: brice-2.6.17-rc4/drivers/pci/probe.c =================================================================== --- brice-2.6.17-rc4.orig/drivers/pci/probe.c 2006-05-17 04:16:29.000000000 -0400 +++ brice-2.6.17-rc4/drivers/pci/probe.c 2006-05-20 08:20:30.000000000 -0400 @@ -367,6 +367,7 @@ child->resource[i]->name = child->name; } bridge->subordinate = child; + pci_fixup_device(pci_fixup_bridge_header, bridge); return child; } Index: brice-2.6.17-rc4/include/asm-generic/vmlinux.lds.h =================================================================== --- brice-2.6.17-rc4.orig/include/asm-generic/vmlinux.lds.h 2006-05-12 16:49:03.000000000 -0400 +++ brice-2.6.17-rc4/include/asm-generic/vmlinux.lds.h 2006-05-20 08:39:42.000000000 -0400 @@ -29,6 +29,9 @@ VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ *(.pci_fixup_header) \ VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ + VMLINUX_SYMBOL(__start_pci_fixups_bridge_header) = .; \ + *(.pci_fixup_bridge_header) \ + VMLINUX_SYMBOL(__end_pci_fixups_bridge_header) = .; \ VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ *(.pci_fixup_final) \ VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ Index: brice-2.6.17-rc4/include/linux/pci.h =================================================================== --- brice-2.6.17-rc4.orig/include/linux/pci.h 2006-05-17 04:19:53.000000000 -0400 +++ brice-2.6.17-rc4/include/linux/pci.h 2006-05-20 08:01:24.000000000 -0400 @@ -750,6 +750,7 @@ enum pci_fixup_pass { pci_fixup_early, /* Before probing BARs */ pci_fixup_header, /* After reading configuration header */ + pci_fixup_bridge_header, /* After setting up the bridge subordinate */ pci_fixup_final, /* Final phase of device fixups */ pci_fixup_enable, /* pci_enable_device() time */ }; @@ -764,6 +765,9 @@ #define DECLARE_PCI_FIXUP_HEADER(vendor, device, hook) \ DECLARE_PCI_FIXUP_SECTION(.pci_fixup_header, \ vendor##device##hook, vendor, device, hook) +#define DECLARE_PCI_FIXUP_BRIDGE_HEADER(vendor, device, hook) \ + DECLARE_PCI_FIXUP_SECTION(.pci_fixup_bridge_header, \ + vendor##device##hook, vendor, device, hook) #define DECLARE_PCI_FIXUP_FINAL(vendor, device, hook) \ DECLARE_PCI_FIXUP_SECTION(.pci_fixup_final, \ vendor##device##hook, vendor, device, hook)