lkml.org 
[lkml]   [2023]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 2/3] PCI/AER: Disable AER interrupt on suspend
    Date
    PCIe services that share an IRQ with PME, such as AER or DPC, may cause a
    spurious wakeup on system suspend. To prevent this, disable the AER interrupt
    notification during the system suspend process.

    As Per PCIe Base Spec 5.0, section 5.2, titled "Link State Power Management",
    TLP and DLLP transmission are disabled for a Link in L2/L3 Ready (D3hot), L2
    (D3cold with aux power) and L3 (D3cold) states. So disabling the AER
    notification during suspend and re-enabling them during the resume process
    should not affect the basic functionality.

    Link: https://bugzilla.kernel.org/show_bug.cgi?id=216295
    Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    ---
    v6:
    v5:
    - Wording.

    v4:
    v3:
    - No change.

    v2:
    - Only disable AER IRQ.
    - No more check on PME IRQ#.
    - Use helper.

    drivers/pci/pcie/aer.c | 22 ++++++++++++++++++++++
    1 file changed, 22 insertions(+)

    diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
    index 1420e1f27105..9c07fdbeb52d 100644
    --- a/drivers/pci/pcie/aer.c
    +++ b/drivers/pci/pcie/aer.c
    @@ -1356,6 +1356,26 @@ static int aer_probe(struct pcie_device *dev)
    return 0;
    }

    +static int aer_suspend(struct pcie_device *dev)
    +{
    + struct aer_rpc *rpc = get_service_data(dev);
    + struct pci_dev *pdev = rpc->rpd;
    +
    + aer_disable_irq(pdev);
    +
    + return 0;
    +}
    +
    +static int aer_resume(struct pcie_device *dev)
    +{
    + struct aer_rpc *rpc = get_service_data(dev);
    + struct pci_dev *pdev = rpc->rpd;
    +
    + aer_enable_irq(pdev);
    +
    + return 0;
    +}
    +
    /**
    * aer_root_reset - reset Root Port hierarchy, RCEC, or RCiEP
    * @dev: pointer to Root Port, RCEC, or RCiEP
    @@ -1420,6 +1440,8 @@ static struct pcie_port_service_driver aerdriver = {
    .service = PCIE_PORT_SERVICE_AER,

    .probe = aer_probe,
    + .suspend = aer_suspend,
    + .resume = aer_resume,
    .remove = aer_remove,
    };

    --
    2.34.1
    \
     
     \ /
      Last update: 2023-05-12 02:10    [W:2.438 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site