summaryrefslogtreecommitdiffstats
path: root/drivers/pci/pcie/edr.c
diff options
context:
space:
mode:
authorKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>2023-03-15 16:54:49 -0700
committerBjorn Helgaas <bhelgaas@google.com>2023-04-07 16:43:18 -0500
commitc441b1e03da6c680a3e12da59c554f454f2ccf5e (patch)
treea206e3495d4a72bda8a87a5e5477fcc7d4fc6116 /drivers/pci/pcie/edr.c
parent72a31ff9d71c69ed787b8276bfd033065aae4f89 (diff)
downloadlinux-stable-c441b1e03da6c680a3e12da59c554f454f2ccf5e.tar.gz
linux-stable-c441b1e03da6c680a3e12da59c554f454f2ccf5e.tar.bz2
linux-stable-c441b1e03da6c680a3e12da59c554f454f2ccf5e.zip
PCI/EDR: Clear Device Status after EDR error recovery
During EDR recovery, the OS must clear error status of the port that triggered DPC even if firmware retains control of DPC and AER (see the implementation note in the PCI Firmware spec r3.3, sec 4.6.12). Prior to 068c29a248b6 ("PCI/ERR: Clear PCIe Device Status errors only if OS owns AER"), the port Device Status was cleared in this path: edr_handle_event dpc_process_error(dev) # "dev" triggered DPC pcie_do_recovery(dev, dpc_reset_link) dpc_reset_link # exit DPC pcie_clear_device_status(dev) # clear Device Status After 068c29a248b6, pcie_do_recovery() no longer clears Device Status when firmware controls AER, so the error bit remains set even after recovery. Per the "Downstream Port Containment configuration control" bit in the returned _OSC Control Field (sec 4.5.1), the OS is allowed to clear error status until it evaluates _OST, so clear Device Status in edr_handle_event() if the error recovery was successful. [bhelgaas: commit log] Fixes: 068c29a248b6 ("PCI/ERR: Clear PCIe Device Status errors only if OS owns AER") Link: https://lore.kernel.org/r/20230315235449.1279209-1-sathyanarayanan.kuppuswamy@linux.intel.com Reported-by: Tsaur Erwin <erwin.tsaur@intel.com> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/pcie/edr.c')
-rw-r--r--drivers/pci/pcie/edr.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/pci/pcie/edr.c b/drivers/pci/pcie/edr.c
index a6b9b479b97a..87734e4c3c20 100644
--- a/drivers/pci/pcie/edr.c
+++ b/drivers/pci/pcie/edr.c
@@ -193,6 +193,7 @@ send_ost:
*/
if (estate == PCI_ERS_RESULT_RECOVERED) {
pci_dbg(edev, "DPC port successfully recovered\n");
+ pcie_clear_device_status(edev);
acpi_send_edr_status(pdev, edev, EDR_OST_SUCCESS);
} else {
pci_dbg(edev, "DPC port recovery failed\n");