Commit 8aefa9b0 authored by Keith Busch's avatar Keith Busch Committed by Bjorn Helgaas

PCI/DPC: Print AER status in DPC event handling

A DPC enabled device suppresses ERR_(NON)FATAL messages, preventing the AER
handler from reporting error details.  If the DPC trigger reason says the
downstream port detected the error, collect the AER uncorrectable status
for logging, then clear the status.
Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarSinan Kaya <okaya@kernel.org>
Reviewed-by: default avatarOza Pawandeep <poza@codeaurora.org>
parent f1d16b17
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* Copyright (C) 2016 Intel Corp. * Copyright (C) 2016 Intel Corp.
*/ */
#include <linux/aer.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -161,6 +162,7 @@ static void dpc_process_rp_pio_error(struct dpc_dev *dpc) ...@@ -161,6 +162,7 @@ static void dpc_process_rp_pio_error(struct dpc_dev *dpc)
static void dpc_work(struct work_struct *work) static void dpc_work(struct work_struct *work)
{ {
struct aer_err_info info;
struct dpc_dev *dpc = container_of(work, struct dpc_dev, work); struct dpc_dev *dpc = container_of(work, struct dpc_dev, work);
struct pci_dev *pdev = dpc->dev->port; struct pci_dev *pdev = dpc->dev->port;
struct device *dev = &dpc->dev->device; struct device *dev = &dpc->dev->device;
...@@ -185,6 +187,10 @@ static void dpc_work(struct work_struct *work) ...@@ -185,6 +187,10 @@ static void dpc_work(struct work_struct *work)
/* show RP PIO error detail information */ /* show RP PIO error detail information */
if (dpc->rp_extensions && reason == 3 && ext_reason == 0) if (dpc->rp_extensions && reason == 3 && ext_reason == 0)
dpc_process_rp_pio_error(dpc); dpc_process_rp_pio_error(dpc);
else if (reason == 0 && aer_get_device_error_info(pdev, &info)) {
aer_print_error(pdev, &info);
pci_cleanup_aer_uncorrect_error_status(pdev);
}
/* We configure DPC so it only triggers on ERR_FATAL */ /* We configure DPC so it only triggers on ERR_FATAL */
pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_DPC); pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_DPC);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment