diff options
Diffstat (limited to 'drivers/pci/hotplug/pciehp_pci.c')
| -rw-r--r-- | drivers/pci/hotplug/pciehp_pci.c | 23 | 
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c index 21733108add..0a16444c14c 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c @@ -53,17 +53,15 @@ static int __ref pciehp_add_bridge(struct pci_dev *dev)  		busnr = pci_scan_bridge(parent, dev, busnr, pass);  	if (!dev->subordinate)  		return -1; -	pci_bus_size_bridges(dev->subordinate); -	pci_bus_assign_resources(parent); -	pci_enable_bridges(parent); -	pci_bus_add_devices(parent); +  	return 0;  }  int pciehp_configure_device(struct slot *p_slot)  {  	struct pci_dev *dev; -	struct pci_bus *parent = p_slot->ctrl->pcie->port->subordinate; +	struct pci_dev *bridge = p_slot->ctrl->pcie->port; +	struct pci_bus *parent = bridge->subordinate;  	int num, fn;  	struct controller *ctrl = p_slot->ctrl; @@ -96,12 +94,25 @@ int pciehp_configure_device(struct slot *p_slot)  				(dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) {  			pciehp_add_bridge(dev);  		} +		pci_dev_put(dev); +	} + +	pci_assign_unassigned_bridge_resources(bridge); + +	for (fn = 0; fn < 8; fn++) { +		dev = pci_get_slot(parent, PCI_DEVFN(0, fn)); +		if (!dev) +			continue; +		if ((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) { +			pci_dev_put(dev); +			continue; +		}  		pci_configure_slot(dev);  		pci_dev_put(dev);  	} -	pci_bus_assign_resources(parent);  	pci_bus_add_devices(parent); +  	return 0;  }  |