diff options
author | David P <megver83@parabola.nu> | 2019-12-10 11:23:34 -0300 |
---|---|---|
committer | David P <megver83@parabola.nu> | 2019-12-10 11:23:34 -0300 |
commit | f462077e5e6ab4dceb338b4a62eccea43b1be0e0 (patch) | |
tree | ebdab1df138f38cb917e4d24a9d3158f349321ae /libre-testing/linux-libre-cros/0004-PCI-pciehp-Do-not-disable-interrupt-twice-on-suspend.patch | |
parent | 4ff0774105cea3776771f30e8cabf83939b38e71 (diff) | |
download | abslibre-f462077e5e6ab4dceb338b4a62eccea43b1be0e0.tar.gz abslibre-f462077e5e6ab4dceb338b4a62eccea43b1be0e0.tar.bz2 abslibre-f462077e5e6ab4dceb338b4a62eccea43b1be0e0.zip |
addpkg: libre-testing/linux-libre-cros 5.4.2-1
Signed-off-by: David P <megver83@parabola.nu>
Diffstat (limited to 'libre-testing/linux-libre-cros/0004-PCI-pciehp-Do-not-disable-interrupt-twice-on-suspend.patch')
-rw-r--r-- | libre-testing/linux-libre-cros/0004-PCI-pciehp-Do-not-disable-interrupt-twice-on-suspend.patch | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/libre-testing/linux-libre-cros/0004-PCI-pciehp-Do-not-disable-interrupt-twice-on-suspend.patch b/libre-testing/linux-libre-cros/0004-PCI-pciehp-Do-not-disable-interrupt-twice-on-suspend.patch new file mode 100644 index 000000000..f3cba134a --- /dev/null +++ b/libre-testing/linux-libre-cros/0004-PCI-pciehp-Do-not-disable-interrupt-twice-on-suspend.patch @@ -0,0 +1,99 @@ +From bdbb6d41bab0f525b679cf5018f77d5299773568 Mon Sep 17 00:00:00 2001 +From: Mika Westerberg <mika.westerberg@linux.intel.com> +Date: Tue, 29 Oct 2019 20:00:21 +0300 +Subject: [PATCH 4/5] PCI: pciehp: Do not disable interrupt twice on suspend + +We try to keep PCIe hotplug ports runtime suspended when entering system +suspend. Because the PCIe portdrv sets the DPM_FLAG_NEVER_SKIP flag, the PM +core always calls system suspend/resume hooks even if the device is left +runtime suspended. Since PCIe hotplug driver re-used the same function for +both runtime suspend and system suspend, it ended up disabling hotplug +interrupt twice and the second time following was printed: + + pciehp 0000:03:01.0:pcie204: pcie_do_write_cmd: no response from device + +Prevent this from happening by checking whether the device is already +runtime suspended when the system suspend hook is called. + +Fixes: 9c62f0bfb832 ("PCI: pciehp: Implement runtime PM callbacks") +Link: https://lore.kernel.org/r/20191029170022.57528-1-mika.westerberg@linux.intel.com +Reported-by: Kai-Heng Feng <kai.heng.feng@canonical.com> +Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com> +Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> +Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> +Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> +--- + drivers/pci/hotplug/pciehp_core.c | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c +index b3122c151b80..56daad828c9e 100644 +--- a/drivers/pci/hotplug/pciehp_core.c ++++ b/drivers/pci/hotplug/pciehp_core.c +@@ -253,7 +253,7 @@ static bool pme_is_native(struct pcie_device *dev) + return pcie_ports_native || host->native_pme; + } + +-static int pciehp_suspend(struct pcie_device *dev) ++static void pciehp_disable_interrupt(struct pcie_device *dev) + { + /* + * Disable hotplug interrupt so that it does not trigger +@@ -261,7 +261,19 @@ static int pciehp_suspend(struct pcie_device *dev) + */ + if (pme_is_native(dev)) + pcie_disable_interrupt(get_service_data(dev)); ++} + ++#ifdef CONFIG_PM_SLEEP ++static int pciehp_suspend(struct pcie_device *dev) ++{ ++ /* ++ * If the port is already runtime suspended we can keep it that ++ * way. ++ */ ++ if (dev_pm_smart_suspend_and_suspended(&dev->port->dev)) ++ return 0; ++ ++ pciehp_disable_interrupt(dev); + return 0; + } + +@@ -279,6 +291,7 @@ static int pciehp_resume_noirq(struct pcie_device *dev) + + return 0; + } ++#endif + + static int pciehp_resume(struct pcie_device *dev) + { +@@ -292,6 +305,12 @@ static int pciehp_resume(struct pcie_device *dev) + return 0; + } + ++static int pciehp_runtime_suspend(struct pcie_device *dev) ++{ ++ pciehp_disable_interrupt(dev); ++ return 0; ++} ++ + static int pciehp_runtime_resume(struct pcie_device *dev) + { + struct controller *ctrl = get_service_data(dev); +@@ -318,10 +337,12 @@ static struct pcie_port_service_driver hpdriver_portdrv = { + .remove = pciehp_remove, + + #ifdef CONFIG_PM ++#ifdef CONFIG_PM_SLEEP + .suspend = pciehp_suspend, + .resume_noirq = pciehp_resume_noirq, + .resume = pciehp_resume, +- .runtime_suspend = pciehp_suspend, ++#endif ++ .runtime_suspend = pciehp_runtime_suspend, + .runtime_resume = pciehp_runtime_resume, + #endif /* PM */ + }; +-- +2.24.0 + |