diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 6a198fc65999061949c094220aa8a0a470c69779..e9482867555ba6b5d587def8ef057e1362b826b9 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1386,6 +1386,29 @@ void pci_configure_slot(struct pci_dev *dev) } EXPORT_SYMBOL_GPL(pci_configure_slot); +static void pci_configure_device(struct pci_dev *dev) +{ + struct hotplug_params hpp; + int ret; + + if (system_state == SYSTEM_BOOTING) + return; + + if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL || + (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && + (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI))) + return; + + memset(&hpp, 0, sizeof(hpp)); + ret = pci_get_hp_params(dev, &hpp); + if (ret) + return; + + program_hpp_type2(dev, hpp.t2); + program_hpp_type1(dev, hpp.t1); + program_hpp_type0(dev, hpp.t0); +} + static void pci_release_capabilities(struct pci_dev *dev) { pci_vpd_release(dev); @@ -1523,6 +1546,8 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) { int ret; + pci_configure_device(dev); + device_initialize(&dev->dev); dev->dev.release = pci_release_dev;