Merge branch 'pci/portdrv'

- Allow probing even without child services so it can do power management
  (Brian Norris)

* pci/portdrv:
  PCI/portdrv: Allow probing even without child services
This commit is contained in:
Bjorn Helgaas 2026-08-21 16:40:36 -05:00
commit 56948ac2a2

View File

@ -330,8 +330,8 @@ static int pcie_device_init(struct pci_dev *pdev, int service, int irq)
*/
static int pcie_port_device_register(struct pci_dev *dev)
{
int status, capabilities, i, nr_service;
int irqs[PCIE_PORT_DEVICE_MAXSERVICES];
int status, capabilities, i;
/* Enable PCI Express port device */
status = pci_enable_device(dev);
@ -355,29 +355,29 @@ static int pcie_port_device_register(struct pci_dev *dev)
if (status) {
capabilities &= PCIE_PORT_SERVICE_HP;
if (!capabilities)
goto error_disable;
goto out;
}
/* Allocate child services if any */
status = -ENODEV;
nr_service = 0;
for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
int service = 1 << i;
if (!(capabilities & service))
continue;
if (!pcie_device_init(dev, service, irqs[i]))
nr_service++;
if (pcie_device_init(dev, service, irqs[i]))
capabilities &= ~service;
}
out:
/*
* With no child services, we shouldn't need bus mastering or any IRQ
* vectors we allocated.
*/
if (!capabilities) {
pci_free_irq_vectors(dev);
pci_clear_master(dev);
}
if (!nr_service)
goto error_cleanup_irqs;
return 0;
error_cleanup_irqs:
pci_free_irq_vectors(dev);
error_disable:
pci_disable_device(dev);
return status;
}
typedef int (*pcie_callback_t)(struct pcie_device *);