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

Commit 0f953bf6 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Jesse Barnes
Browse files

PCI/PM: Report wakeup events before resuming devices



Make wakeup events be reported by the PCI subsystem before attempting to
resume devices or queuing up runtime resume requests for them, because
wakeup events should be reported as soon as they have been detected.

Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent b6e335ae
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -46,9 +46,9 @@ static void pci_acpi_wake_dev(acpi_handle handle, u32 event, void *context)
	struct pci_dev *pci_dev = context;

	if (event == ACPI_NOTIFY_DEVICE_WAKE && pci_dev) {
		pci_wakeup_event(pci_dev);
		pci_check_pme_status(pci_dev);
		pm_runtime_resume(&pci_dev->dev);
		pci_wakeup_event(pci_dev);
		if (pci_dev->subordinate)
			pci_pme_wakeup_bus(pci_dev->subordinate);
	}
+1 −1
Original line number Diff line number Diff line
@@ -1308,8 +1308,8 @@ bool pci_check_pme_status(struct pci_dev *dev)
static int pci_pme_wakeup(struct pci_dev *dev, void *ign)
{
	if (pci_check_pme_status(dev)) {
		pm_request_resume(&dev->dev);
		pci_wakeup_event(dev);
		pm_request_resume(&dev->dev);
	}
	return 0;
}
+2 −2
Original line number Diff line number Diff line
@@ -84,8 +84,8 @@ static bool pcie_pme_walk_bus(struct pci_bus *bus)
	list_for_each_entry(dev, &bus->devices, bus_list) {
		/* Skip PCIe devices in case we started from a root port. */
		if (!pci_is_pcie(dev) && pci_check_pme_status(dev)) {
			pm_request_resume(&dev->dev);
			pci_wakeup_event(dev);
			pm_request_resume(&dev->dev);
			ret = true;
		}

@@ -187,8 +187,8 @@ static void pcie_pme_handle_request(struct pci_dev *port, u16 req_id)
		/* The device is there, but we have to check its PME status. */
		found = pci_check_pme_status(dev);
		if (found) {
			pm_request_resume(&dev->dev);
			pci_wakeup_event(dev);
			pm_request_resume(&dev->dev);
		}
		pci_dev_put(dev);
	} else if (devfn) {