Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 316449
b: refs/heads/master
c: 7d01f70
h: refs/heads/master
i:
  316447: 807d397
v: v3
  • Loading branch information
Yinghai Lu authored and Bjorn Helgaas committed Jun 13, 2012
1 parent 6b66284 commit 99c35fd
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 073ae10c0f8284b6c6dd9708656802507349ef91
refs/heads/master: 7d01f70ac6f48733d595f1a54aa7c4d2ae3fef0d
47 changes: 15 additions & 32 deletions trunk/drivers/pci/hotplug/shpchp_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down

0 comments on commit 99c35fd

Please sign in to comment.