Commit fbb5de70 authored by Kenji Kaneshige's avatar Kenji Kaneshige Committed by Jesse Barnes
Browse files

PCI: portdrv: add missing irq cleanup



Add missing service irqs cleanup in the error code path of
pcie_port_device_register().

Signed-off-by: default avatarKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 1ce5e830
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -205,6 +205,14 @@ static int init_service_irqs(struct pci_dev *dev, int *irqs, int mask)
	return 0;
}

static void cleanup_service_irqs(struct pci_dev *dev)
{
	if (dev->msix_enabled)
		pci_disable_msix(dev);
	else if (dev->msi_enabled)
		pci_disable_msi(dev);
}

/**
 * get_port_device_capability - discover capabilities of a PCI Express port
 * @dev: PCI Express port to examine
@@ -332,10 +340,12 @@ int pcie_port_device_register(struct pci_dev *dev)
	}
	if (!nr_serv) {
		status = -ENODEV;
		goto error_disable;
		goto error_cleanup_irqs;
	}
	return 0;

error_cleanup_irqs:
	cleanup_service_irqs(dev);
error_disable:
	pci_disable_device(dev);
error_kfree:
@@ -410,12 +420,7 @@ void pcie_port_device_remove(struct pci_dev *dev)
	struct pcie_port_data *port_data = pci_get_drvdata(dev);

	device_for_each_child(&dev->dev, NULL, remove_iter);

	if (dev->msix_enabled)
		pci_disable_msix(dev);
	else if (dev->msi_enabled)
		pci_disable_msi(dev);

	cleanup_service_irqs(dev);
	pci_disable_device(dev);
	kfree(port_data);
}