]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pci/hotplug/fakephp.c
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux...
[linux-2.6-omap-h63xx.git] / drivers / pci / hotplug / fakephp.c
index 40337a06c18ab7defa6160af363df122143545a9..3a2637a00934014fbf96b3988815b16ac3621f41 100644 (file)
@@ -66,10 +66,10 @@ struct dummy_slot {
        struct pci_dev *dev;
        struct work_struct remove_work;
        unsigned long removed;
-       char name[8];
 };
 
 static int debug;
+static int dup_slots;
 static LIST_HEAD(slot_list);
 static struct workqueue_struct *dummyphp_wq;
 
@@ -96,10 +96,13 @@ static void dummy_release(struct hotplug_slot *slot)
        kfree(dslot);
 }
 
+#define SLOT_NAME_SIZE 8
+
 static int add_slot(struct pci_dev *dev)
 {
        struct dummy_slot *dslot;
        struct hotplug_slot *slot;
+       char name[SLOT_NAME_SIZE];
        int retval = -ENOMEM;
        static int count = 1;
 
@@ -119,19 +122,22 @@ static int add_slot(struct pci_dev *dev)
        if (!dslot)
                goto error_info;
 
-       slot->name = dslot->name;
-       snprintf(slot->name, sizeof(dslot->name), "fake%d", count++);
-       dbg("slot->name = %s\n", slot->name);
+       if (dup_slots)
+               snprintf(name, SLOT_NAME_SIZE, "fake");
+       else
+               snprintf(name, SLOT_NAME_SIZE, "fake%d", count++);
+       dbg("slot->name = %s\n", name);
        slot->ops = &dummy_hotplug_slot_ops;
        slot->release = &dummy_release;
        slot->private = dslot;
 
-       retval = pci_hp_register(slot, dev->bus, PCI_SLOT(dev->devfn));
+       retval = pci_hp_register(slot, dev->bus, PCI_SLOT(dev->devfn), name);
        if (retval) {
                err("pci_hp_register failed with error %d\n", retval);
                goto error_dslot;
        }
 
+       dbg("slot->name = %s\n", hotplug_slot_name(slot));
        dslot->slot = slot;
        dslot->dev = pci_dev_get(dev);
        list_add (&dslot->node, &slot_list);
@@ -167,10 +173,11 @@ static void remove_slot(struct dummy_slot *dslot)
 {
        int retval;
 
-       dbg("removing slot %s\n", dslot->slot->name);
+       dbg("removing slot %s\n", hotplug_slot_name(dslot->slot));
        retval = pci_hp_deregister(dslot->slot);
        if (retval)
-               err("Problem unregistering a slot %s\n", dslot->slot->name);
+               err("Problem unregistering a slot %s\n",
+                       hotplug_slot_name(dslot->slot));
 }
 
 /* called from the single-threaded workqueue handler to remove a slot */
@@ -308,7 +315,7 @@ static int disable_slot(struct hotplug_slot *slot)
                return -ENODEV;
        dslot = slot->private;
 
-       dbg("%s - physical_slot = %s\n", __func__, slot->name);
+       dbg("%s - physical_slot = %s\n", __func__, hotplug_slot_name(slot));
 
        for (func = 7; func >= 0; func--) {
                dev = pci_get_slot(dslot->dev->bus, dslot->dev->devfn + func);
@@ -320,15 +327,15 @@ static int disable_slot(struct hotplug_slot *slot)
                        return -ENODEV;
                }
 
+               /* remove the device from the pci core */
+               pci_remove_bus_device(dev);
+
                /* queue work item to blow away this sysfs entry and other
                 * parts.
                 */
                INIT_WORK(&dslot->remove_work, remove_slot_worker);
                queue_work(dummyphp_wq, &dslot->remove_work);
 
-               /* blow away this sysfs entry and other parts. */
-               remove_slot(dslot);
-
                pci_dev_put(dev);
        }
        return 0;
@@ -373,4 +380,5 @@ MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
 module_param(debug, bool, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(debug, "Debugging mode enabled or not");
-
+module_param(dup_slots, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(dup_slots, "Force duplicate slot names for debugging");