From: Niklas Schnelle <schne...@linux.ibm.com>

commit 2f0230b2f2d5fd287a85583eefb5aed35b6fe510 upstream.

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 <pmo...@linux.ibm.com>
Signed-off-by: Niklas Schnelle <schne...@linux.ibm.com>
Signed-off-by: Heiko Carstens <h...@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 arch/s390/pci/pci.c                |   19 ++++++++++++-------
 arch/s390/pci/pci_event.c          |    4 ++--
 drivers/pci/hotplug/s390_pci_hpc.c |   12 +++++-------
 3 files changed, 19 insertions(+), 16 deletions(-)

--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -672,6 +672,16 @@ int zpci_disable_device(struct zpci_dev
 }
 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 *kr
 {
        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:
--- a/arch/s390/pci/pci_event.c
+++ b/arch/s390/pci/pci_event.c
@@ -118,7 +118,7 @@ static void __zpci_event_availability(st
                if (!zdev)
                        break;
                if (pdev)
-                       pci_stop_and_remove_bus_device_locked(pdev);
+                       zpci_remove_device(zdev);
 
                ret = zpci_disable_device(zdev);
                if (ret)
@@ -137,7 +137,7 @@ static void __zpci_event_availability(st
                        /* 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;
--- a/drivers/pci/hotplug/s390_pci_hpc.c
+++ b/drivers/pci/hotplug/s390_pci_hpc.c
@@ -83,21 +83,19 @@ static int disable_slot(struct hotplug_s
        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;


Reply via email to