PCI/AER: Pass service type to pcie_do_fatal_recovery()
Pass the service type to pcie_do_fatal_recovery() instead of assuming AER. We will make DPC also use pcie_do_fatal_recovery(), and it needs to do things a little differently for AER and DPC. Signed-off-by: Oza Pawandeep <poza@codeaurora.org> [bhelgaas: split to separate patch] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
6927868e7a
commit
0b91439d35
|
@ -354,7 +354,7 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,
|
|||
void pci_enable_acs(struct pci_dev *dev);
|
||||
|
||||
/* PCI error reporting and recovery */
|
||||
void pcie_do_fatal_recovery(struct pci_dev *dev);
|
||||
void pcie_do_fatal_recovery(struct pci_dev *dev, u32 service);
|
||||
void pcie_do_nonfatal_recovery(struct pci_dev *dev);
|
||||
|
||||
bool pcie_wait_for_link(struct pci_dev *pdev, bool active);
|
||||
|
|
|
@ -254,7 +254,7 @@ static void handle_error_source(struct pcie_device *aerdev,
|
|||
} else if (info->severity == AER_NONFATAL)
|
||||
pcie_do_nonfatal_recovery(dev);
|
||||
else if (info->severity == AER_FATAL)
|
||||
pcie_do_fatal_recovery(dev);
|
||||
pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_APEI_PCIEAER
|
||||
|
@ -321,7 +321,7 @@ static void aer_recover_work_func(struct work_struct *work)
|
|||
if (entry.severity == AER_NONFATAL)
|
||||
pcie_do_nonfatal_recovery(pdev);
|
||||
else if (entry.severity == AER_FATAL)
|
||||
pcie_do_fatal_recovery(pdev);
|
||||
pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_AER);
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -180,7 +180,7 @@ static pci_ers_result_t default_reset_link(struct pci_dev *dev)
|
|||
return PCI_ERS_RESULT_RECOVERED;
|
||||
}
|
||||
|
||||
static pci_ers_result_t reset_link(struct pci_dev *dev)
|
||||
static pci_ers_result_t reset_link(struct pci_dev *dev, u32 service)
|
||||
{
|
||||
struct pci_dev *udev;
|
||||
pci_ers_result_t status;
|
||||
|
@ -195,7 +195,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev)
|
|||
}
|
||||
|
||||
/* Use the aer driver of the component firstly */
|
||||
driver = pcie_port_find_service(udev, PCIE_PORT_SERVICE_AER);
|
||||
driver = pcie_port_find_service(udev, service);
|
||||
|
||||
if (driver && driver->reset_link) {
|
||||
status = driver->reset_link(udev);
|
||||
|
@ -281,7 +281,7 @@ static pci_ers_result_t broadcast_error_message(struct pci_dev *dev,
|
|||
* beneath this AER agent, followed by reset link e.g. secondary bus reset
|
||||
* followed by re-enumeration of devices.
|
||||
*/
|
||||
void pcie_do_fatal_recovery(struct pci_dev *dev)
|
||||
void pcie_do_fatal_recovery(struct pci_dev *dev, u32 service)
|
||||
{
|
||||
struct pci_dev *udev;
|
||||
struct pci_bus *parent;
|
||||
|
@ -306,9 +306,10 @@ void pcie_do_fatal_recovery(struct pci_dev *dev)
|
|||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
result = reset_link(udev);
|
||||
result = reset_link(udev, service);
|
||||
|
||||
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
|
||||
if ((service == PCIE_PORT_SERVICE_AER) &&
|
||||
(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)) {
|
||||
/*
|
||||
* If the error is reported by a bridge, we think this error
|
||||
* is related to the downstream link of the bridge, so we
|
||||
|
|
Loading…
Reference in New Issue