]> err.no Git - linux-2.6/blobdiff - drivers/pci/hotplug/rpadlpar_core.c
Merge branch 'ioat-md-accel-for-linus' of git://lost.foo-projects.org/~dwillia2/git/iop
[linux-2.6] / drivers / pci / hotplug / rpadlpar_core.c
index 3eefe2cec72d1aef2ad849820fd3b683d7704645..bb3c101c2c5ae6b8cf47be0603bd5f93b0d335b1 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/string.h>
 
 #include <asm/pci-bridge.h>
-#include <asm/semaphore.h>
+#include <linux/mutex.h>
 #include <asm/rtas.h>
 #include <asm/vio.h>
 
@@ -27,7 +27,7 @@
 #include "rpaphp.h"
 #include "rpadlpar.h"
 
-static DECLARE_MUTEX(rpadlpar_sem);
+static DEFINE_MUTEX(rpadlpar_mutex);
 
 #define DLPAR_MODULE_NAME "rpadlpar_io"
 
@@ -63,7 +63,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name,
        char *type;
        int rc;
 
-       while ((np = of_find_node_by_type(np, "pci"))) {
+       while ((np = of_find_node_by_name(np, "pci"))) {
                rc = rpaphp_get_drc_props(np, NULL, &name, &type, NULL);
                if (rc == 0)
                        if (!strcmp(drc_name, name) && !strcmp(drc_type, type))
@@ -98,7 +98,15 @@ static struct device_node *find_dlpar_node(char *drc_name, int *node_type)
        return NULL;
 }
 
-static struct slot *find_slot(struct device_node *dn)
+/**
+ * find_php_slot - return hotplug slot structure for device node
+ *
+ * This routine will return the hotplug slot structure
+ * for a given device node. Note that built-in PCI slots
+ * may be dlpar-able, but not hot-pluggable, so this routine
+ * will return NULL for built-in PCI slots.
+ */
+static struct slot *find_php_slot(struct device_node *dn)
 {
        struct list_head *tmp, *n;
        struct slot *slot;
@@ -224,9 +232,9 @@ static int dlpar_remove_phb(char *drc_name, struct device_node *dn)
        if (!pcibios_find_pci_bus(dn))
                return -EINVAL;
 
-       slot = find_slot(dn);
+       /* If pci slot is hotplugable, use hotplug to remove it */
+       slot = find_php_slot(dn);
        if (slot) {
-               /* Remove hotplug slot */
                if (rpaphp_deregister_slot(slot)) {
                        printk(KERN_ERR
                                "%s: unable to remove hotplug slot %s\n",
@@ -300,7 +308,7 @@ int dlpar_add_slot(char *drc_name)
        int node_type;
        int rc = -EIO;
 
-       if (down_interruptible(&rpadlpar_sem))
+       if (mutex_lock_interruptible(&rpadlpar_mutex))
                return -ERESTARTSYS;
 
        /* Find newly added node */
@@ -324,7 +332,7 @@ int dlpar_add_slot(char *drc_name)
 
        printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name);
 exit:
-       up(&rpadlpar_sem);
+       mutex_unlock(&rpadlpar_mutex);
        return rc;
 }
 
@@ -370,22 +378,17 @@ int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
        if (!bus)
                return -EINVAL;
 
-       slot = find_slot(dn);
+       /* If pci slot is hotplugable, use hotplug to remove it */
+       slot = find_php_slot(dn);
        if (slot) {
-               /* Remove hotplug slot */
                if (rpaphp_deregister_slot(slot)) {
                        printk(KERN_ERR
                                "%s: unable to remove hotplug slot %s\n",
                                __FUNCTION__, drc_name);
                        return -EIO;
                }
-       } else {
-               struct pci_dev *dev, *tmp;
-               list_for_each_entry_safe(dev, tmp, &bus->devices, bus_list) {
-                       eeh_remove_bus_device(dev);
-                       pci_remove_bus_device(dev);
-               }
-       }
+       } else
+               pcibios_remove_pci_devices(bus);
 
        if (unmap_bus_range(bus)) {
                printk(KERN_ERR "%s: failed to unmap bus range\n",
@@ -417,7 +420,7 @@ int dlpar_remove_slot(char *drc_name)
        int node_type;
        int rc = 0;
 
-       if (down_interruptible(&rpadlpar_sem))
+       if (mutex_lock_interruptible(&rpadlpar_mutex))
                return -ERESTARTSYS;
 
        dn = find_dlpar_node(drc_name, &node_type);
@@ -439,7 +442,7 @@ int dlpar_remove_slot(char *drc_name)
        }
        printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name);
 exit:
-       up(&rpadlpar_sem);
+       mutex_unlock(&rpadlpar_mutex);
        return rc;
 }