summaryrefslogtreecommitdiff
path: root/arch/s390/pci
diff options
context:
space:
mode:
authorNiklas Schnelle <schnelle@linux.ibm.com>2021-01-26 13:58:28 +0100
committerHeiko Carstens <hca@linux.ibm.com>2021-03-22 11:36:04 +0100
commit95b3a8b4014d82e79dc3ad03a1f8d6ee5f56b29d (patch)
tree4b0b85a38aee49ad62152bcff997ae55513d6f90 /arch/s390/pci
parent2631f6b6f22ca613238a416a09e3d2771def6f88 (diff)
s390/pci: move zpci_remove_device() to bus code
The zpci_remove_device() function removes the device from the PCI common code core which is an operation dealing primarily with the zbus and PCI bus code. With that and to match an upcoming refactoring of the symmetric scanning part move it to the bus code. 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>
Diffstat (limited to 'arch/s390/pci')
-rw-r--r--arch/s390/pci/pci.c37
-rw-r--r--arch/s390/pci/pci_bus.c33
-rw-r--r--arch/s390/pci/pci_bus.h2
-rw-r--r--arch/s390/pci/pci_event.c2
4 files changed, 38 insertions, 36 deletions
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 6d84ec8f1dd6..dd14641b2d20 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -679,39 +679,6 @@ int zpci_disable_device(struct zpci_dev *zdev)
return clp_disable_fh(zdev);
}
-/* zpci_remove_device - Removes the given zdev from the PCI core
- * @zdev: the zdev to be removed from the PCI core
- * @set_error: if true the device's error state is set to permanent failure
- *
- * Sets a zPCI device to a configured but offline state; the zPCI
- * device is still accessible through its hotplug slot and the zPCI
- * API but is removed from the common code PCI bus, making it
- * no longer available to drivers.
- */
-void zpci_remove_device(struct zpci_dev *zdev, bool set_error)
-{
- struct zpci_bus *zbus = zdev->zbus;
- struct pci_dev *pdev;
-
- if (!zdev->zbus->bus)
- return;
-
- pdev = pci_get_slot(zbus->bus, zdev->devfn);
- if (pdev) {
- if (set_error)
- pdev->error_state = pci_channel_io_perm_failure;
- if (pdev->is_virtfn) {
- zpci_iov_remove_virtfn(pdev, zdev->vfn);
- /* balance pci_get_slot */
- pci_dev_put(pdev);
- return;
- }
- pci_stop_and_remove_bus_device_locked(pdev);
- /* balance pci_get_slot */
- pci_dev_put(pdev);
- }
-}
-
/**
* zpci_create_device() - Create a new zpci_dev and add it to the zbus
* @fid: Function ID of the device to be created
@@ -847,7 +814,7 @@ int zpci_deconfigure_device(struct zpci_dev *zdev)
int rc;
if (zdev->zbus->bus)
- zpci_remove_device(zdev, false);
+ zpci_bus_remove_device(zdev, false);
if (zdev_enabled(zdev)) {
rc = zpci_disable_device(zdev);
@@ -870,7 +837,7 @@ void zpci_release_device(struct kref *kref)
int ret;
if (zdev->zbus->bus)
- zpci_remove_device(zdev, false);
+ zpci_bus_remove_device(zdev, false);
if (zdev_enabled(zdev))
zpci_disable_device(zdev);
diff --git a/arch/s390/pci/pci_bus.c b/arch/s390/pci/pci_bus.c
index 755b46f4c595..ace9dbbe3bc1 100644
--- a/arch/s390/pci/pci_bus.c
+++ b/arch/s390/pci/pci_bus.c
@@ -30,6 +30,39 @@ static LIST_HEAD(zbus_list);
static DEFINE_SPINLOCK(zbus_list_lock);
static int zpci_nb_devices;
+/* zpci_bus_remove_device - Removes the given zdev from the PCI core
+ * @zdev: the zdev to be removed from the PCI core
+ * @set_error: if true the device's error state is set to permanent failure
+ *
+ * Sets a zPCI device to a configured but offline state; the zPCI
+ * device is still accessible through its hotplug slot and the zPCI
+ * API but is removed from the common code PCI bus, making it
+ * no longer available to drivers.
+ */
+void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error)
+{
+ struct zpci_bus *zbus = zdev->zbus;
+ struct pci_dev *pdev;
+
+ if (!zdev->zbus->bus)
+ return;
+
+ pdev = pci_get_slot(zbus->bus, zdev->devfn);
+ if (pdev) {
+ if (set_error)
+ pdev->error_state = pci_channel_io_perm_failure;
+ if (pdev->is_virtfn) {
+ zpci_iov_remove_virtfn(pdev, zdev->vfn);
+ /* balance pci_get_slot */
+ pci_dev_put(pdev);
+ return;
+ }
+ pci_stop_and_remove_bus_device_locked(pdev);
+ /* balance pci_get_slot */
+ pci_dev_put(pdev);
+ }
+}
+
/* zpci_bus_scan
* @zbus: the zbus holding the zdevices
* @ops: the pci operations
diff --git a/arch/s390/pci/pci_bus.h b/arch/s390/pci/pci_bus.h
index f8dfac0b5b71..e04ca06a71b6 100644
--- a/arch/s390/pci/pci_bus.h
+++ b/arch/s390/pci/pci_bus.h
@@ -10,6 +10,8 @@
int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops);
void zpci_bus_device_unregister(struct zpci_dev *zdev);
+void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error);
+
void zpci_release_device(struct kref *kref);
static inline void zpci_zdev_put(struct zpci_dev *zdev)
{
diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c
index 2676df9816f0..9455c5be8820 100644
--- a/arch/s390/pci/pci_event.c
+++ b/arch/s390/pci/pci_event.c
@@ -82,7 +82,7 @@ static void zpci_event_hard_deconfigured(struct zpci_dev *zdev, u32 fh)
/* Give the driver a hint that the function is
* already unusable.
*/
- zpci_remove_device(zdev, true);
+ zpci_bus_remove_device(zdev, true);
if (zdev_enabled(zdev)) {
rc = zpci_disable_device(zdev);
if (rc)