Skip to content

Commit

Permalink
s390/pci: re-introduce zpci_remove_device()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Niklas Schnelle <[email protected]>
Signed-off-by: Heiko Carstens <[email protected]>
  • Loading branch information
niklas88 authored and hcahca committed Aug 17, 2020
1 parent 3cddb79 commit 2f0230b
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 16 deletions.
19 changes: 12 additions & 7 deletions arch/s390/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions arch/s390/pci/pci_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
Expand Down
12 changes: 5 additions & 7 deletions drivers/pci/hotplug/s390_pci_hpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 2f0230b

Please sign in to comment.