s390/pci: cleanup hotplug code
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Wed, 5 Jun 2013 14:06:42 +0000 (16:06 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 26 Jun 2013 19:10:07 +0000 (21:10 +0200)
Provide wrappers for the [de]configure operations, add some error
handling, and use pci_scan_slot instead of pci_scan_single_device.

Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/pci.h
arch/s390/pci/pci.c
drivers/pci/hotplug/s390_pci_hpc.c

index 6c1801235db961363a14512dda7c306ab2d9a724..be41f4f885ce21bc434c2bf767248341b26d9c77 100644 (file)
@@ -143,7 +143,6 @@ int zpci_enable_device(struct zpci_dev *);
 int zpci_disable_device(struct zpci_dev *);
 void zpci_stop_device(struct zpci_dev *);
 void zpci_free_device(struct zpci_dev *);
-int zpci_scan_device(struct zpci_dev *);
 int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
 int zpci_unregister_ioat(struct zpci_dev *, u8);
 
index a56fce445c391beafeba7ab13049899a1973a999..628769b91b97acd434e0cba1cec115497cc2a4f6 100644 (file)
@@ -974,25 +974,6 @@ void zpci_stop_device(struct zpci_dev *zdev)
 }
 EXPORT_SYMBOL_GPL(zpci_stop_device);
 
-int zpci_scan_device(struct zpci_dev *zdev)
-{
-       zdev->pdev = pci_scan_single_device(zdev->bus, ZPCI_DEVFN);
-       if (!zdev->pdev) {
-               pr_err("pci_scan_single_device failed for fid: 0x%x\n",
-                       zdev->fid);
-               goto out;
-       }
-
-       pci_bus_add_devices(zdev->bus);
-
-       return 0;
-out:
-       zpci_dma_exit_device(zdev);
-       clp_disable_fh(zdev);
-       return -EIO;
-}
-EXPORT_SYMBOL_GPL(zpci_scan_device);
-
 static inline int barsize(u8 size)
 {
        return (size) ? (1 << size) >> 10 : 0;
index 46a7b738f61f14200d726b02d6ed25784b6b0b08..b12acaad9dc6d64bab07bd308dd41698e584fe18 100644 (file)
@@ -41,6 +41,28 @@ struct slot {
        struct zpci_dev *zdev;
 };
 
+static inline int slot_configure(struct slot *slot)
+{
+       int ret = sclp_pci_configure(slot->zdev->fid);
+
+       zpci_dbg(3, "conf fid:%x, rc:%d\n", slot->zdev->fid, ret);
+       if (!ret)
+               slot->zdev->state = ZPCI_FN_STATE_CONFIGURED;
+
+       return ret;
+}
+
+static inline int slot_deconfigure(struct slot *slot)
+{
+       int ret = sclp_pci_deconfigure(slot->zdev->fid);
+
+       zpci_dbg(3, "deconf fid:%x, rc:%d\n", slot->zdev->fid, ret);
+       if (!ret)
+               slot->zdev->state = ZPCI_FN_STATE_STANDBY;
+
+       return ret;
+}
+
 static int enable_slot(struct hotplug_slot *hotplug_slot)
 {
        struct slot *slot = hotplug_slot->private;
@@ -49,14 +71,23 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
        if (slot->zdev->state != ZPCI_FN_STATE_STANDBY)
                return -EIO;
 
-       rc = sclp_pci_configure(slot->zdev->fid);
-       zpci_dbg(3, "conf fid:%x, rc:%d\n", slot->zdev->fid, rc);
-       if (!rc) {
-               slot->zdev->state = ZPCI_FN_STATE_CONFIGURED;
-               /* automatically scan the device after is was configured */
-               zpci_enable_device(slot->zdev);
-               zpci_scan_device(slot->zdev);
-       }
+       rc = slot_configure(slot);
+       if (rc)
+               return rc;
+
+       rc = zpci_enable_device(slot->zdev);
+       if (rc)
+               goto out_deconfigure;
+
+       slot->zdev->state = ZPCI_FN_STATE_ONLINE;
+
+       pci_scan_slot(slot->zdev->bus, ZPCI_DEVFN);
+       pci_bus_add_devices(slot->zdev->bus);
+
+       return rc;
+
+out_deconfigure:
+       slot_deconfigure(slot);
        return rc;
 }
 
@@ -74,11 +105,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
        /* TODO: we rely on the user to unbind/remove the device, is that plausible
         *       or do we need to trigger that here?
         */
-       rc = sclp_pci_deconfigure(slot->zdev->fid);
-       zpci_dbg(3, "deconf fid:%x, rc:%d\n", slot->zdev->fid, rc);
-       if (!rc)
-               slot->zdev->state = ZPCI_FN_STATE_STANDBY;
-       return rc;
+       return slot_deconfigure(slot);
 }
 
 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)