提交 0b91439d 编写于 作者: O Oza Pawandeep 提交者: Bjorn Helgaas

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: NOza Pawandeep <poza@codeaurora.org>
[bhelgaas: split to separate patch]
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 6927868e
...@@ -354,7 +354,7 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev, ...@@ -354,7 +354,7 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,
void pci_enable_acs(struct pci_dev *dev); void pci_enable_acs(struct pci_dev *dev);
/* PCI error reporting and recovery */ /* 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); void pcie_do_nonfatal_recovery(struct pci_dev *dev);
bool pcie_wait_for_link(struct pci_dev *pdev, bool active); bool pcie_wait_for_link(struct pci_dev *pdev, bool active);
......
...@@ -254,7 +254,7 @@ static void handle_error_source(struct pcie_device *aerdev, ...@@ -254,7 +254,7 @@ static void handle_error_source(struct pcie_device *aerdev,
} else if (info->severity == AER_NONFATAL) } else if (info->severity == AER_NONFATAL)
pcie_do_nonfatal_recovery(dev); pcie_do_nonfatal_recovery(dev);
else if (info->severity == AER_FATAL) 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 #ifdef CONFIG_ACPI_APEI_PCIEAER
...@@ -321,7 +321,7 @@ static void aer_recover_work_func(struct work_struct *work) ...@@ -321,7 +321,7 @@ static void aer_recover_work_func(struct work_struct *work)
if (entry.severity == AER_NONFATAL) if (entry.severity == AER_NONFATAL)
pcie_do_nonfatal_recovery(pdev); pcie_do_nonfatal_recovery(pdev);
else if (entry.severity == AER_FATAL) else if (entry.severity == AER_FATAL)
pcie_do_fatal_recovery(pdev); pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_AER);
pci_dev_put(pdev); pci_dev_put(pdev);
} }
} }
......
...@@ -180,7 +180,7 @@ static pci_ers_result_t default_reset_link(struct pci_dev *dev) ...@@ -180,7 +180,7 @@ static pci_ers_result_t default_reset_link(struct pci_dev *dev)
return PCI_ERS_RESULT_RECOVERED; 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; struct pci_dev *udev;
pci_ers_result_t status; pci_ers_result_t status;
...@@ -195,7 +195,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev) ...@@ -195,7 +195,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev)
} }
/* Use the aer driver of the component firstly */ /* 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) { if (driver && driver->reset_link) {
status = driver->reset_link(udev); status = driver->reset_link(udev);
...@@ -281,7 +281,7 @@ static pci_ers_result_t broadcast_error_message(struct pci_dev *dev, ...@@ -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 * beneath this AER agent, followed by reset link e.g. secondary bus reset
* followed by re-enumeration of devices. * 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_dev *udev;
struct pci_bus *parent; struct pci_bus *parent;
...@@ -306,9 +306,10 @@ void pcie_do_fatal_recovery(struct pci_dev *dev) ...@@ -306,9 +306,10 @@ void pcie_do_fatal_recovery(struct pci_dev *dev)
pci_dev_put(pdev); 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 * If the error is reported by a bridge, we think this error
* is related to the downstream link of the bridge, so we * is related to the downstream link of the bridge, so we
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册