Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ff70ec8 authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky
Browse files

s390/pci: add recover sysfs knob



Add an arch specific attribute to recover a pci function from an
error state or config space blockage.

Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent cb809182
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -791,6 +791,8 @@ int zpci_enable_device(struct zpci_dev *zdev)
	rc = zpci_dma_init_device(zdev);
	if (rc)
		goto out_dma;

	zdev->state = ZPCI_FN_STATE_ONLINE;
	return 0;

out_dma:
@@ -819,8 +821,6 @@ int zpci_create_device(struct zpci_dev *zdev)
		rc = zpci_enable_device(zdev);
		if (rc)
			goto out_free;

		zdev->state = ZPCI_FN_STATE_ONLINE;
	}
	rc = zpci_scan_bus(zdev);
	if (rc)
+27 −0
Original line number Diff line number Diff line
@@ -48,11 +48,38 @@ static ssize_t show_pfgid(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR(pfgid, S_IRUGO, show_pfgid, NULL);

static void recover_callback(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct zpci_dev *zdev = get_zdev(pdev);
	int ret;

	pci_stop_and_remove_bus_device(pdev);
	ret = zpci_disable_device(zdev);
	if (ret)
		return;

	ret = zpci_enable_device(zdev);
	if (ret)
		return;

	pci_rescan_bus(zdev->bus);
}

static ssize_t store_recover(struct device *dev, struct device_attribute *attr,
			     const char *buf, size_t count)
{
	int rc = device_schedule_callback(dev, recover_callback);
	return rc ? rc : count;
}
static DEVICE_ATTR(recover, S_IWUSR, NULL, store_recover);

static struct device_attribute *zpci_dev_attrs[] = {
	&dev_attr_function_id,
	&dev_attr_function_handle,
	&dev_attr_pchid,
	&dev_attr_pfgid,
	&dev_attr_recover,
	NULL,
};

+0 −2
Original line number Diff line number Diff line
@@ -79,8 +79,6 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
	if (rc)
		goto out_deconfigure;

	slot->zdev->state = ZPCI_FN_STATE_ONLINE;

	pci_scan_slot(slot->zdev->bus, ZPCI_DEVFN);
	pci_bus_add_devices(slot->zdev->bus);