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

Commit 79272138 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

PCI: Enable upstream bridges even for VFs on virtual buses



Previously we enabled the upstream PCI-to-PCI bridge only when
"dev->bus->self != NULL".  In the case of a VF on a virtual bus, where
"bus->self == NULL", we didn't enable the upstream bridge.

This fixes that by enabling the upstream bridge of the PF corresponding to
the VF.

Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
parent c6bde215
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -1148,12 +1148,12 @@ int pci_reenable_device(struct pci_dev *dev)

static void pci_enable_bridge(struct pci_dev *dev)
{
	struct pci_dev *bridge;
	int retval;

	if (!dev)
		return;

	pci_enable_bridge(dev->bus->self);
	bridge = pci_upstream_bridge(dev);
	if (bridge)
		pci_enable_bridge(bridge);

	if (pci_is_enabled(dev)) {
		if (!dev->is_busmaster)
@@ -1170,6 +1170,7 @@ static void pci_enable_bridge(struct pci_dev *dev)

static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
{
	struct pci_dev *bridge;
	int err;
	int i, bars = 0;

@@ -1188,7 +1189,9 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
	if (atomic_inc_return(&dev->enable_cnt) > 1)
		return 0;		/* already enabled */

	pci_enable_bridge(dev->bus->self);
	bridge = pci_upstream_bridge(dev);
	if (bridge)
		pci_enable_bridge(bridge);

	/* only skip sriov related */
	for (i = 0; i <= PCI_ROM_RESOURCE; i++)