diff options
author | Michael S. Tsirkin <mst@mellanox.co.il> | 2006-02-14 11:52:22 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-03-23 17:35:14 -0500 |
commit | 6e325a62a0a228cd0222783802b53cce04551776 (patch) | |
tree | 5609f9e841024ca57ba8ee7a919955c7589444c7 /drivers/pci | |
parent | e5548e960f38557825e50806b52cb24c9e730aa2 (diff) |
[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>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/msi.c | 3 | ||||
-rw-r--r-- | drivers/pci/probe.c | 1 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 7 |
3 files changed, 9 insertions, 2 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index d5a67c1bcb98..4de1c17ee573 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -703,6 +703,9 @@ int pci_enable_msi(struct pci_dev* dev) | |||
703 | if (dev->no_msi) | 703 | if (dev->no_msi) |
704 | return status; | 704 | return status; |
705 | 705 | ||
706 | if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) | ||
707 | return -EINVAL; | ||
708 | |||
706 | temp = dev->irq; | 709 | temp = dev->irq; |
707 | 710 | ||
708 | status = msi_init(); | 711 | status = msi_init(); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 3bc0fcd71d03..542e7dfb371b 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) | |||
347 | child->parent = parent; | 347 | child->parent = parent; |
348 | child->ops = parent->ops; | 348 | child->ops = parent->ops; |
349 | child->sysdata = parent->sysdata; | 349 | child->sysdata = parent->sysdata; |
350 | child->bus_flags = parent->bus_flags; | ||
350 | child->bridge = get_device(&bridge->dev); | 351 | child->bridge = get_device(&bridge->dev); |
351 | 352 | ||
352 | child->class_dev.class = &pcibus_class; | 353 | child->class_dev.class = &pcibus_class; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index d71c31df7fdf..4970f47be72c 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) | |||
575 | { | 575 | { |
576 | unsigned char revid, tmp; | 576 | unsigned char revid, tmp; |
577 | 577 | ||
578 | pci_msi_quirk = 1; | 578 | if (dev->subordinate) { |
579 | printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n"); | 579 | printk(KERN_WARNING "PCI: MSI quirk detected. " |
580 | "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n"); | ||
581 | dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; | ||
582 | } | ||
580 | 583 | ||
581 | if (nr_ioapics == 0) | 584 | if (nr_ioapics == 0) |
582 | return; | 585 | return; |