From: Andrew Morton Signed-off-by: Andrew Morton --- drivers/pci/msi.c | 7 +++++++ drivers/pci/pci.h | 6 ++++++ drivers/pci/quirks.c | 2 ++ 3 files changed, 15 insertions(+) diff -puN drivers/pci/msi.c~revert-gregkh-pci-msi-drop-pci_msi_quirk drivers/pci/msi.c --- a/drivers/pci/msi.c~revert-gregkh-pci-msi-drop-pci_msi_quirk +++ a/drivers/pci/msi.c @@ -351,6 +351,13 @@ static int msi_init(void) if (!status) return status; + if (pci_msi_quirk) { + pci_msi_enable = 0; + printk(KERN_WARNING "PCI: MSI quirk detected. MSI disabled.\n"); + status = -EINVAL; + return status; + } + status = msi_arch_init(); if (status < 0) { pci_msi_enable = 0; diff -puN drivers/pci/pci.h~revert-gregkh-pci-msi-drop-pci_msi_quirk drivers/pci/pci.h --- a/drivers/pci/pci.h~revert-gregkh-pci-msi-drop-pci_msi_quirk +++ a/drivers/pci/pci.h @@ -42,6 +42,12 @@ extern void pci_remove_legacy_files(stru /* Lock for read/write access to pci device and bus lists */ extern struct rw_semaphore pci_bus_sem; +#ifdef CONFIG_X86_IO_APIC +extern int pci_msi_quirk; +#else +#define pci_msi_quirk 0 +#endif + #ifdef CONFIG_PCI_MSI void disable_msi_mode(struct pci_dev *dev, int pos, int type); void pci_no_msi(void); diff -puN drivers/pci/quirks.c~revert-gregkh-pci-msi-drop-pci_msi_quirk drivers/pci/quirks.c --- a/drivers/pci/quirks.c~revert-gregkh-pci-msi-drop-pci_msi_quirk +++ a/drivers/pci/quirks.c @@ -575,6 +575,8 @@ static void __init quirk_ioapic_rmw(stru } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw ); +int pci_msi_quirk; + #define AMD8131_revA0 0x01 #define AMD8131_revB0 0x11 #define AMD8131_MISC 0x40 _