Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1edab4a1 authored by Brice Goglin's avatar Brice Goglin Committed by Greg Kroah-Hartman
Browse files

[PATCH] PCI: AMD 8131 MSI quirk called too late, bus_flags not inherited ?



The PCI_BUS_FLAGS_NO_MSI bus flags does not appear do be inherited
correctly from the amd8131 MSI quirk to its parent busses. It makes
devices behind a bridge behind amd8131 try to enable MSI while the
amd8131 does not support it.
We fix this by looking at flags of all parent busses in
pci_enable_msi() and pci_enable_msix().

By the way, also add the missing dev->no_msi check in pci_enable_msix()

Signed-off-by: default avatarBrice Goglin <brice@myri.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 74d0a988
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -916,6 +916,7 @@ static int msix_capability_init(struct pci_dev *dev,
 **/
int pci_enable_msi(struct pci_dev* dev)
{
	struct pci_bus *bus;
	int pos, temp, status = -EINVAL;
	u16 control;

@@ -925,7 +926,8 @@ int pci_enable_msi(struct pci_dev* dev)
	if (dev->no_msi)
		return status;

	if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
	for (bus = dev->bus; bus; bus = bus->parent)
		if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
			return -EINVAL;

	temp = dev->irq;
@@ -1162,6 +1164,7 @@ static int reroute_msix_table(int head, struct msix_entry *entries, int *nvec)
 **/
int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
{
	struct pci_bus *bus;
	int status, pos, nr_entries, free_vectors;
	int i, j, temp;
	u16 control;
@@ -1170,6 +1173,13 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
	if (!pci_msi_enable || !dev || !entries)
 		return -EINVAL;

	if (dev->no_msi)
		return -EINVAL;

	for (bus = dev->bus; bus; bus = bus->parent)
		if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
			return -EINVAL;

	status = msi_init();
	if (status < 0)
		return status;