Commit 032c3d86 authored by Jon Derrick's avatar Jon Derrick Committed by Bjorn Helgaas

PCI/AER: Add bus flag to skip source ID matching

Allow root port buses to choose to skip source id matching when finding the
faulting device.  Certain root port devices may return an incorrect source
ID and recommend to scan child device registers for AER notifications.
Signed-off-by: default avatarJon Derrick <jonathan.derrick@intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 29b4817d
...@@ -132,7 +132,9 @@ static bool is_error_source(struct pci_dev *dev, struct aer_err_info *e_info) ...@@ -132,7 +132,9 @@ static bool is_error_source(struct pci_dev *dev, struct aer_err_info *e_info)
* When bus id is equal to 0, it might be a bad id * When bus id is equal to 0, it might be a bad id
* reported by root port. * reported by root port.
*/ */
if (!nosourceid && (PCI_BUS_NUM(e_info->id) != 0)) { if (!nosourceid &&
(PCI_BUS_NUM(e_info->id) != 0) &&
!(dev->bus->bus_flags & PCI_BUS_FLAGS_NO_AERSID)) {
/* Device ID match? */ /* Device ID match? */
if (e_info->id == ((dev->bus->number << 8) | dev->devfn)) if (e_info->id == ((dev->bus->number << 8) | dev->devfn))
return true; return true;
...@@ -147,7 +149,8 @@ static bool is_error_source(struct pci_dev *dev, struct aer_err_info *e_info) ...@@ -147,7 +149,8 @@ static bool is_error_source(struct pci_dev *dev, struct aer_err_info *e_info)
* 1) nosourceid==y; * 1) nosourceid==y;
* 2) bus id is equal to 0. Some ports might lose the bus * 2) bus id is equal to 0. Some ports might lose the bus
* id of error source id; * id of error source id;
* 3) There are multiple errors and prior id comparing fails; * 3) bus flag PCI_BUS_FLAGS_NO_AERSID is set
* 4) There are multiple errors and prior ID comparing fails;
* We check AER status registers to find possible reporter. * We check AER status registers to find possible reporter.
*/ */
if (atomic_read(&dev->enable_cnt) == 0) if (atomic_read(&dev->enable_cnt) == 0)
......
...@@ -187,8 +187,9 @@ enum pci_irq_reroute_variant { ...@@ -187,8 +187,9 @@ enum pci_irq_reroute_variant {
typedef unsigned short __bitwise pci_bus_flags_t; typedef unsigned short __bitwise pci_bus_flags_t;
enum pci_bus_flags { enum pci_bus_flags {
PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1, PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1,
PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2, PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
PCI_BUS_FLAGS_NO_AERSID = (__force pci_bus_flags_t) 4,
}; };
/* These values come from the PCI Express Spec */ /* These values come from the PCI Express Spec */
......
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