aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pcie/aer.c
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2018-09-20 12:27:12 -0400
committerBjorn Helgaas <bhelgaas@google.com>2018-09-26 15:23:14 -0400
commitbdb5ac85777de67c909c9ad4327f03f7648b543f (patch)
tree06ffd1c0d73efa4807579a2a5b9bc04da8fcca1b /drivers/pci/pcie/aer.c
parentc4eed62a214330908eec11b0dc170d34fa50b412 (diff)
PCI/ERR: Handle fatal error recovery
We don't need to be paranoid about the topology changing while handling an error. If the device has changed in a hotplug capable slot, we can rely on the presence detection handling to react to a changing topology. Restore the fatal error handling behavior that existed before merging DPC with AER with 7e9084b36740 ("PCI/AER: Handle ERR_FATAL with removal and re-enumeration of devices"). Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Sinan Kaya <okaya@kernel.org>
Diffstat (limited to 'drivers/pci/pcie/aer.c')
-rw-r--r--drivers/pci/pcie/aer.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 1563e22600ec..0619ec5d7bb5 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1010,9 +1010,11 @@ static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info)
1010 info->status); 1010 info->status);
1011 pci_aer_clear_device_status(dev); 1011 pci_aer_clear_device_status(dev);
1012 } else if (info->severity == AER_NONFATAL) 1012 } else if (info->severity == AER_NONFATAL)
1013 pcie_do_nonfatal_recovery(dev); 1013 pcie_do_recovery(dev, pci_channel_io_normal,
1014 PCIE_PORT_SERVICE_AER);
1014 else if (info->severity == AER_FATAL) 1015 else if (info->severity == AER_FATAL)
1015 pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER); 1016 pcie_do_recovery(dev, pci_channel_io_frozen,
1017 PCIE_PORT_SERVICE_AER);
1016 pci_dev_put(dev); 1018 pci_dev_put(dev);
1017} 1019}
1018 1020
@@ -1048,9 +1050,11 @@ static void aer_recover_work_func(struct work_struct *work)
1048 } 1050 }
1049 cper_print_aer(pdev, entry.severity, entry.regs); 1051 cper_print_aer(pdev, entry.severity, entry.regs);
1050 if (entry.severity == AER_NONFATAL) 1052 if (entry.severity == AER_NONFATAL)
1051 pcie_do_nonfatal_recovery(pdev); 1053 pcie_do_recovery(pdev, pci_channel_io_normal,
1054 PCIE_PORT_SERVICE_AER);
1052 else if (entry.severity == AER_FATAL) 1055 else if (entry.severity == AER_FATAL)
1053 pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_AER); 1056 pcie_do_recovery(pdev, pci_channel_io_frozen,
1057 PCIE_PORT_SERVICE_AER);
1054 pci_dev_put(pdev); 1058 pci_dev_put(pdev);
1055 } 1059 }
1056} 1060}