From 6e325a62a0a228cd0222783802b53cce04551776 Mon Sep 17 00:00:00 2001
From: "Michael S. Tsirkin" <mst@mellanox.co.il>
Date: Tue, 14 Feb 2006 18:52:22 +0200
Subject: [PATCH] PCI: make MSI quirk inheritable from the pci bus

It turns out AMD 8131 quirk only affects MSI for devices behind the 8131 bridge.
Handle this by adding a flags field in pci_bus, inherited from parent to child.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/pci/msi.c    | 3 +++
 drivers/pci/probe.c  | 1 +
 drivers/pci/quirks.c | 7 +++++--
 3 files changed, 9 insertions(+), 2 deletions(-)

(limited to 'drivers/pci')

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index d5a67c1bcb9..4de1c17ee57 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -703,6 +703,9 @@ int pci_enable_msi(struct pci_dev* dev)
 	if (dev->no_msi)
 		return status;
 
+	if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
+		return -EINVAL;
+
 	temp = dev->irq;
 
 	status = msi_init();
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 3bc0fcd71d0..542e7dfb371 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -347,6 +347,7 @@ pci_alloc_child_bus(struct pci_bus *parent, struct pci_dev *bridge, int busnr)
 	child->parent = parent;
 	child->ops = parent->ops;
 	child->sysdata = parent->sysdata;
+	child->bus_flags = parent->bus_flags;
 	child->bridge = get_device(&bridge->dev);
 
 	child->class_dev.class = &pcibus_class;
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index d71c31df7fd..4970f47be72 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -575,8 +575,11 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev)
 { 
         unsigned char revid, tmp;
         
-	pci_msi_quirk = 1;
-	printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n");
+	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;
-- 
cgit