summaryrefslogtreecommitdiffstats
path: root/drivers/pci/hotplug/rpadlpar_core.c
diff options
context:
space:
mode:
authorJohn Rose2005-07-25 18:13:38 +0200
committerGreg Kroah-Hartman2005-09-08 23:57:22 +0200
commit9c209c919df95f83aa042b3352c43841ad15a02b (patch)
tree9be41a91d2da30893cc4e5b88fa02ea36f756598 /drivers/pci/hotplug/rpadlpar_core.c
parent[PATCH] PCI Hotplug: rpaphp: Move VIO registration (diff)
downloadkernel-qcow2-linux-9c209c919df95f83aa042b3352c43841ad15a02b.tar.gz
kernel-qcow2-linux-9c209c919df95f83aa042b3352c43841ad15a02b.tar.xz
kernel-qcow2-linux-9c209c919df95f83aa042b3352c43841ad15a02b.zip
[PATCH] PCI Hotplug: rpaphp: Change slot pci reference
The slot structure in the rpaphp module currently references the PCI contents of the slot using the PCI device of the parent bridge. This is unnecessary, since the module is actually interested in the subordinate bus of the bridge. The dependency on a PCI bridge device also prohibits the module from registering hotplug slots that have a root bridge as a parent, since root bridges on PPC64 don't have PCI devices. This patch changes struct slot to reference the PCI subsystem using a pci_bus rather than a pci_dev. Signed-off-by: John Rose <johnrose@austin.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci/hotplug/rpadlpar_core.c')
-rw-r--r--drivers/pci/hotplug/rpadlpar_core.c44
1 files changed, 8 insertions, 36 deletions
diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c
index d7f1319f167a..7f868edaa72d 100644
--- a/drivers/pci/hotplug/rpadlpar_core.c
+++ b/drivers/pci/hotplug/rpadlpar_core.c
@@ -198,28 +198,6 @@ static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn)
return dev;
}
-static int dlpar_pci_remove_bus(struct pci_dev *bridge_dev)
-{
- struct pci_bus *secondary_bus;
-
- if (!bridge_dev) {
- printk(KERN_ERR "%s: unexpected null device\n",
- __FUNCTION__);
- return -EINVAL;
- }
-
- secondary_bus = bridge_dev->subordinate;
-
- if (unmap_bus_range(secondary_bus)) {
- printk(KERN_ERR "%s: failed to unmap bus range\n",
- __FUNCTION__);
- return -ERANGE;
- }
-
- pci_remove_bus_device(bridge_dev);
- return 0;
-}
-
static inline int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
{
struct pci_dev *dev;
@@ -415,14 +393,7 @@ static int dlpar_remove_vio_slot(struct device_node *dn, char *drc_name)
*/
int dlpar_remove_pci_slot(struct slot *slot, char *drc_name)
{
- struct pci_dev *bridge_dev;
-
- bridge_dev = slot->bridge;
- if (!bridge_dev) {
- printk(KERN_ERR "%s: unexpected null bridge device\n",
- __FUNCTION__);
- return -EIO;
- }
+ struct pci_bus *bus = slot->bus;
/* Remove hotplug slot */
if (rpaphp_remove_slot(slot)) {
@@ -431,13 +402,14 @@ int dlpar_remove_pci_slot(struct slot *slot, char *drc_name)
return -EIO;
}
- /* Remove pci bus */
-
- if (dlpar_pci_remove_bus(bridge_dev)) {
- printk(KERN_ERR "%s: unable to remove pci bus %s\n",
- __FUNCTION__, drc_name);
- return -EIO;
+ if (unmap_bus_range(bus)) {
+ printk(KERN_ERR "%s: failed to unmap bus range\n",
+ __FUNCTION__);
+ return -ERANGE;
}
+
+ BUG_ON(!bus->self);
+ pci_remove_bus_device(bus->self);
return 0;
}