s390/pci: re-introduce zpci_remove_device()
authorNiklas Schnelle <schnelle@linux.ibm.com>
Mon, 3 Aug 2020 15:46:32 +0000 (17:46 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 17 Aug 2020 11:17:25 +0000 (13:17 +0200)
For fixing the PF to VF link removal we need to perform some action on
every removal of a zdev from the common PCI subsystem.
So in preparation re-introduce zpci_remove_device() and use that instead
of directly calling the common code functions. This  was actually still
declared from earlier code but no longer implemented.

Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/pci/pci.c
arch/s390/pci/pci_event.c
drivers/pci/hotplug/s390_pci_hpc.c

index 3902c9f..6e57ff8 100644 (file)
@@ -672,6 +672,16 @@ int zpci_disable_device(struct zpci_dev *zdev)
 }
 EXPORT_SYMBOL_GPL(zpci_disable_device);
 
+void zpci_remove_device(struct zpci_dev *zdev)
+{
+       struct zpci_bus *zbus = zdev->zbus;
+       struct pci_dev *pdev;
+
+       pdev = pci_get_slot(zbus->bus, zdev->devfn);
+       if (pdev)
+               pci_stop_and_remove_bus_device_locked(pdev);
+}
+
 int zpci_create_device(struct zpci_dev *zdev)
 {
        int rc;
@@ -716,13 +726,8 @@ void zpci_release_device(struct kref *kref)
 {
        struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref);
 
-       if (zdev->zbus->bus) {
-               struct pci_dev *pdev;
-
-               pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn);
-               if (pdev)
-                       pci_stop_and_remove_bus_device_locked(pdev);
-       }
+       if (zdev->zbus->bus)
+               zpci_remove_device(zdev);
 
        switch (zdev->state) {
        case ZPCI_FN_STATE_ONLINE:
index 4602068..9a3a291 100644 (file)
@@ -121,7 +121,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
                if (!zdev)
                        break;
                if (pdev)
-                       pci_stop_and_remove_bus_device_locked(pdev);
+                       zpci_remove_device(zdev);
 
                ret = zpci_disable_device(zdev);
                if (ret)
@@ -140,7 +140,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
                        /* Give the driver a hint that the function is
                         * already unusable. */
                        pdev->error_state = pci_channel_io_perm_failure;
-                       pci_stop_and_remove_bus_device_locked(pdev);
+                       zpci_remove_device(zdev);
                }
 
                zdev->state = ZPCI_FN_STATE_STANDBY;
index b59f849..c9e790c 100644 (file)
@@ -83,21 +83,19 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
        struct zpci_dev *zdev = container_of(hotplug_slot, struct zpci_dev,
                                             hotplug_slot);
        struct pci_dev *pdev;
-       struct zpci_bus *zbus = zdev->zbus;
        int rc;
 
        if (!zpci_fn_configured(zdev->state))
                return -EIO;
 
-       pdev = pci_get_slot(zbus->bus, zdev->devfn);
-       if (pdev) {
-               if (pci_num_vf(pdev))
-                       return -EBUSY;
-
-               pci_stop_and_remove_bus_device_locked(pdev);
+       pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn);
+       if (pdev && pci_num_vf(pdev)) {
                pci_dev_put(pdev);
+               return -EBUSY;
        }
 
+       zpci_remove_device(zdev);
+
        rc = zpci_disable_device(zdev);
        if (rc)
                return rc;