Patchwork PCI/LINK: Disable bandwidth notification interrupt during suspend

login
register
mail settings
Submitter Mika Westerberg
Date April 15, 2019, 8:41 a.m.
Message ID <20190415084142.30897-1-mika.westerberg@linux.intel.com>
Download mbox | patch
Permalink /patch/772899/
State New
Headers show

Comments

Mika Westerberg - April 15, 2019, 8:41 a.m.
If the bandwidth notification interrupt is left unmasked when entering
suspend to idle it triggers immediately bringing the system back to
working state.

To keep that from happening, disable the interrupt when entering system
sleep and enable it again during resume.

Reported-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
 drivers/pci/pcie/bw_notification.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
Bjorn Helgaas - April 18, 2019, 11:24 p.m.
On Mon, Apr 15, 2019 at 11:41:42AM +0300, Mika Westerberg wrote:
> If the bandwidth notification interrupt is left unmasked when entering
> suspend to idle it triggers immediately bringing the system back to
> working state.
> 
> To keep that from happening, disable the interrupt when entering system
> sleep and enable it again during resume.
> 
> Reported-by: Imre Deak <imre.deak@intel.com>
> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>

Applied to pci/portdrv for v5.2, thanks, Mika.

> ---
>  drivers/pci/pcie/bw_notification.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/pci/pcie/bw_notification.c b/drivers/pci/pcie/bw_notification.c
> index 4fa9e3523ee1..77e685771487 100644
> --- a/drivers/pci/pcie/bw_notification.c
> +++ b/drivers/pci/pcie/bw_notification.c
> @@ -107,11 +107,25 @@ static void pcie_bandwidth_notification_remove(struct pcie_device *srv)
>  	free_irq(srv->irq, srv);
>  }
>  
> +static int pcie_bandwidth_notification_suspend(struct pcie_device *srv)
> +{
> +	pcie_disable_link_bandwidth_notification(srv->port);
> +	return 0;
> +}
> +
> +static int pcie_bandwidth_notification_resume(struct pcie_device *srv)
> +{
> +	pcie_enable_link_bandwidth_notification(srv->port);
> +	return 0;
> +}
> +
>  static struct pcie_port_service_driver pcie_bandwidth_notification_driver = {
>  	.name		= "pcie_bw_notification",
>  	.port_type	= PCIE_ANY_PORT,
>  	.service	= PCIE_PORT_SERVICE_BWNOTIF,
>  	.probe		= pcie_bandwidth_notification_probe,
> +	.suspend	= pcie_bandwidth_notification_suspend,
> +	.resume		= pcie_bandwidth_notification_resume,
>  	.remove		= pcie_bandwidth_notification_remove,
>  };
>  
> -- 
> 2.20.1
>

Patch

diff --git a/drivers/pci/pcie/bw_notification.c b/drivers/pci/pcie/bw_notification.c
index 4fa9e3523ee1..77e685771487 100644
--- a/drivers/pci/pcie/bw_notification.c
+++ b/drivers/pci/pcie/bw_notification.c
@@ -107,11 +107,25 @@  static void pcie_bandwidth_notification_remove(struct pcie_device *srv)
 	free_irq(srv->irq, srv);
 }
 
+static int pcie_bandwidth_notification_suspend(struct pcie_device *srv)
+{
+	pcie_disable_link_bandwidth_notification(srv->port);
+	return 0;
+}
+
+static int pcie_bandwidth_notification_resume(struct pcie_device *srv)
+{
+	pcie_enable_link_bandwidth_notification(srv->port);
+	return 0;
+}
+
 static struct pcie_port_service_driver pcie_bandwidth_notification_driver = {
 	.name		= "pcie_bw_notification",
 	.port_type	= PCIE_ANY_PORT,
 	.service	= PCIE_PORT_SERVICE_BWNOTIF,
 	.probe		= pcie_bandwidth_notification_probe,
+	.suspend	= pcie_bandwidth_notification_suspend,
+	.resume		= pcie_bandwidth_notification_resume,
 	.remove		= pcie_bandwidth_notification_remove,
 };