Commit 2f0230b2 authored by Niklas Schnelle's avatar Niklas Schnelle Committed by Heiko Carstens
Browse files

s390/pci: re-introduce zpci_remove_device()



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: default avatarPierre Morel <pmorel@linux.ibm.com>
Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 3cddb79a
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -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:
+2 −2
Original line number Diff line number Diff line
@@ -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;
+5 −7
Original line number Diff line number Diff line
@@ -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;