PCI/AER: Disable AER service on suspend
[ Upstream commit 5afc2f763edc5daae4722ee46fea4e627d01fa90 ] If the link is powered off during suspend, electrical noise may cause errors that are logged via AER. If the AER interrupt is enabled and shares an IRQ with PME, that causes a spurious wakeup during suspend. Disable the AER interrupt during suspend to prevent this. Clear error status before re-enabling IRQ interrupts during resume so we don't get an interrupt for errors that occurred during the suspend/resume process. Link: https://bugzilla.kernel.org/show_bug.cgi?id=209149 Link: https://bugzilla.kernel.org/show_bug.cgi?id=216295 Link: https://bugzilla.kernel.org/show_bug.cgi?id=218090 Link: https://lore.kernel.org/r/20240416043225.1462548-2-kai.heng.feng@canonical.com Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> [bhelgaas: drop pci_ancestor_pr3_present() etc, commit log] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
f413230a1f
commit
d41fcaa12a
1 changed files with 18 additions and 0 deletions
|
|
@ -1407,6 +1407,22 @@ static int aer_probe(struct pcie_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int aer_suspend(struct pcie_device *dev)
|
||||||
|
{
|
||||||
|
struct aer_rpc *rpc = get_service_data(dev);
|
||||||
|
|
||||||
|
aer_disable_rootport(rpc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int aer_resume(struct pcie_device *dev)
|
||||||
|
{
|
||||||
|
struct aer_rpc *rpc = get_service_data(dev);
|
||||||
|
|
||||||
|
aer_enable_rootport(rpc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* aer_root_reset - reset link on Root Port
|
* aer_root_reset - reset link on Root Port
|
||||||
* @dev: pointer to Root Port's pci_dev data structure
|
* @dev: pointer to Root Port's pci_dev data structure
|
||||||
|
|
@ -1447,6 +1463,8 @@ static struct pcie_port_service_driver aerdriver = {
|
||||||
.service = PCIE_PORT_SERVICE_AER,
|
.service = PCIE_PORT_SERVICE_AER,
|
||||||
|
|
||||||
.probe = aer_probe,
|
.probe = aer_probe,
|
||||||
|
.suspend = aer_suspend,
|
||||||
|
.resume = aer_resume,
|
||||||
.remove = aer_remove,
|
.remove = aer_remove,
|
||||||
.reset_link = aer_root_reset,
|
.reset_link = aer_root_reset,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue