diff options
| author | Yinghai Lu <yinghai@kernel.org> | 2012-05-17 18:58:41 -0700 | 
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2012-06-13 15:42:26 -0600 | 
| commit | 7d01f70ac6f48733d595f1a54aa7c4d2ae3fef0d (patch) | |
| tree | edc62b66e73206f3cac66ba07cc2c005144b5c28 | |
| parent | 073ae10c0f8284b6c6dd9708656802507349ef91 (diff) | |
| download | olio-linux-3.10-7d01f70ac6f48733d595f1a54aa7c4d2ae3fef0d.tar.xz olio-linux-3.10-7d01f70ac6f48733d595f1a54aa7c4d2ae3fef0d.zip  | |
PCI: shpchp: use generic pci_hp_add_bridge()
Use the new generic pci_hp_add_bridge() interface.
[bhelgaas: changelog]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
| -rw-r--r-- | drivers/pci/hotplug/shpchp_pci.c | 47 | 
1 files changed, 15 insertions, 32 deletions
diff --git a/drivers/pci/hotplug/shpchp_pci.c b/drivers/pci/hotplug/shpchp_pci.c index 13069802b8c..c627ed9957d 100644 --- a/drivers/pci/hotplug/shpchp_pci.c +++ b/drivers/pci/hotplug/shpchp_pci.c @@ -37,9 +37,10 @@  int __ref shpchp_configure_device(struct slot *p_slot)  {  	struct pci_dev *dev; -	struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; -	int num, fn;  	struct controller *ctrl = p_slot->ctrl; +	struct pci_dev *bridge = ctrl->pci_dev; +	struct pci_bus *parent = bridge->subordinate; +	int num, fn;  	dev = pci_get_slot(parent, PCI_DEVFN(p_slot->device, 0));  	if (dev) { @@ -61,41 +62,23 @@ int __ref shpchp_configure_device(struct slot *p_slot)  		if (!dev)  			continue;  		if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) || -				(dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) { -			/* Find an unused bus number for the new bridge */ -			struct pci_bus *child; -			unsigned char busnr, start = parent->busn_res.start; -			unsigned char end = parent->busn_res.end; -			int max; -			for (busnr = start; busnr <= end; busnr++) { -				if (!pci_find_bus(pci_domain_nr(parent), -							busnr)) -					break; -			} -			if (busnr > end) { -				ctrl_err(ctrl, -					 "No free bus for hot-added bridge\n"); -				pci_dev_put(dev); -				continue; -			} -			child = pci_add_new_bus(parent, dev, busnr); -			if (!child) { -				ctrl_err(ctrl, "Cannot add new bus for %s\n", -					 pci_name(dev)); -				pci_dev_put(dev); -				continue; -			} -			max = pci_do_scan_bus(child); -			pci_bus_update_busn_res_end(child, max); -			pci_bus_size_bridges(child); -		} +		    (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) +			pci_hp_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(p_slot->device, fn)); +		if (!dev) +			continue;  		pci_configure_slot(dev);  		pci_dev_put(dev);  	} -	pci_bus_assign_resources(parent);  	pci_bus_add_devices(parent); -	pci_enable_bridges(parent); +  	return 0;  }  |