s390/pci: do not modify function handles
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 16 Apr 2013 12:12:17 +0000 (14:12 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 17 Apr 2013 12:07:36 +0000 (14:07 +0200)
Don't modify function handles to get a disabled handle - call
clp_disable_fh. With this change we also do no longer deconfigure
enabled functions.

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 05333b7..6c18012 100644 (file)
@@ -140,6 +140,7 @@ static inline bool zdev_enabled(struct zpci_dev *zdev)
 struct zpci_dev *zpci_alloc_device(void);
 int zpci_create_device(struct zpci_dev *);
 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 *);
index 20823f0..24dcf05 100644 (file)
@@ -955,6 +955,13 @@ out:
 }
 EXPORT_SYMBOL_GPL(zpci_enable_device);
 
+int zpci_disable_device(struct zpci_dev *zdev)
+{
+       zpci_dma_exit_device(zdev);
+       return clp_disable_fh(zdev);
+}
+EXPORT_SYMBOL_GPL(zpci_disable_device);
+
 int zpci_create_device(struct zpci_dev *zdev)
 {
        int rc;
index 6053e72..46a7b73 100644 (file)
@@ -68,17 +68,16 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
        if (!zpci_fn_configured(slot->zdev->state))
                return -EIO;
 
+       rc = zpci_disable_device(slot->zdev);
+       if (rc)
+               return rc;
        /* 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) {
-               /* Fixme: better call List-PCI to find the disabled FH
-                  for the FID since the FH should be opaque... */
-               slot->zdev->fh &= 0x7fffffff;
+       if (!rc)
                slot->zdev->state = ZPCI_FN_STATE_STANDBY;
-       }
        return rc;
 }