s390/pci: deconfigure device on release
authorNiklas Schnelle <schnelle@linux.ibm.com>
Fri, 5 Mar 2021 13:32:02 +0000 (14:32 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 22 Mar 2021 10:36:04 +0000 (11:36 +0100)
When zpci_release_device() is called on a zPCI function that is still
configured it would not be deconfigured. Until now this hasn't caused
any problems because zpci_zdev_put() is only ever called for devices
in Standby or Reserved. Fix it by adding sclp_pci_deconfigure() to the
switch when in Configured state.

Reviewed-by: Matthew Rosato <mjrosato@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

index 053113b..5d6b838 100644 (file)
@@ -782,6 +782,7 @@ error:
 void zpci_release_device(struct kref *kref)
 {
        struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref);
+       int ret;
 
        if (zdev->zbus->bus)
                zpci_remove_device(zdev, false);
@@ -790,6 +791,10 @@ void zpci_release_device(struct kref *kref)
                zpci_disable_device(zdev);
 
        switch (zdev->state) {
+       case ZPCI_FN_STATE_CONFIGURED:
+               ret = sclp_pci_deconfigure(zdev->fid);
+               zpci_dbg(3, "deconf fid:%x, rc:%d\n", zdev->fid, ret);
+               fallthrough;
        case ZPCI_FN_STATE_STANDBY:
                if (zdev->has_hp_slot)
                        zpci_exit_slot(zdev);