Signed-off-by: Andrew Morton --- drivers/pci/msi.c | 13 +++++++++---- drivers/pci/probe.c | 2 +- include/linux/pci.h | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff -puN drivers/pci/msi.c~gregkh-pci-msi-stop-inheriting-bus-flags-and-check-root-chipset-bus-flags-instead drivers/pci/msi.c --- a/drivers/pci/msi.c~gregkh-pci-msi-stop-inheriting-bus-flags-and-check-root-chipset-bus-flags-instead +++ a/drivers/pci/msi.c @@ -910,14 +910,19 @@ static int msix_capability_init(struct p static int pci_msi_supported(struct pci_dev * dev) { - struct pci_bus *bus; + struct pci_dev *pdev; if (!pci_msi_enable || !dev || dev->no_msi) return -1; - for (bus = dev->bus; bus; bus = bus->parent) - if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) - return -1; + /* find root complex for our device */ + pdev = dev; + while (pdev->bus && pdev->bus->self) + pdev = pdev->bus->self; + + /* check its bus flags */ + if (pdev->subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI) + return -1; return 0; } diff -puN drivers/pci/probe.c~gregkh-pci-msi-stop-inheriting-bus-flags-and-check-root-chipset-bus-flags-instead drivers/pci/probe.c --- a/drivers/pci/probe.c~gregkh-pci-msi-stop-inheriting-bus-flags-and-check-root-chipset-bus-flags-instead +++ a/drivers/pci/probe.c @@ -351,7 +351,7 @@ pci_alloc_child_bus(struct pci_bus *pare child->parent = parent; child->ops = parent->ops; child->sysdata = parent->sysdata; - child->bus_flags = parent->bus_flags; + child->bus_flags = 0; child->bridge = get_device(&bridge->dev); child->class_dev.class = &pcibus_class; diff -puN include/linux/pci.h~gregkh-pci-msi-stop-inheriting-bus-flags-and-check-root-chipset-bus-flags-instead include/linux/pci.h --- a/include/linux/pci.h~gregkh-pci-msi-stop-inheriting-bus-flags-and-check-root-chipset-bus-flags-instead +++ a/include/linux/pci.h @@ -241,7 +241,7 @@ struct pci_bus { char name[48]; unsigned short bridge_ctl; /* manage NO_ISA/FBB/et al behaviors */ - pci_bus_flags_t bus_flags; /* Inherited by child busses */ + pci_bus_flags_t bus_flags; struct device *bridge; struct class_device class_dev; struct bin_attribute *legacy_io; /* legacy I/O for this bus */ _