Per PCIe r7.0 sec 6.2.5, the prefix and header of an offending TLP is only
recorded for unmasked Uncorrectable Errors.  Yet when the AER driver
determines whether a prefix and header has been logged, it does not take
the Uncorrectable Error Mask Register into account.  Fix it.

Fixes: 6c2b374d7485 ("PCI-Express AER implemetation: AER core and aerdriver")
Signed-off-by: Lukas Wunner <[email protected]>
Cc: [email protected] # v2.6.19+
---
 drivers/pci/pcie/aer.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index c21139b9079b..4d1d99662086 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -954,7 +954,8 @@ void pci_print_aer(struct pci_dev *dev, int aer_severity,
                status = aer->uncor_status;
                mask = aer->uncor_mask;
                info.level = KERN_ERR;
-               tlp_header_valid = tlp_header_logged(status, aer->cap_control);
+               tlp_header_valid = tlp_header_logged(status & ~mask,
+                                                    aer->cap_control);
        }
 
        info.status = status;
@@ -1343,7 +1344,7 @@ int aer_get_device_error_info(struct aer_err_info *info, 
int i)
                pci_read_config_dword(dev, aer + PCI_ERR_CAP, &aercc);
                info->first_error = PCI_ERR_CAP_FEP(aercc);
 
-               if (tlp_header_logged(info->status, aercc)) {
+               if (tlp_header_logged(info->status & ~info->mask, aercc)) {
                        info->tlp_header_valid = 1;
                        pcie_read_tlp_log(dev, aer + PCI_ERR_HEADER_LOG,
                                          aer + PCI_ERR_PREFIX_LOG,
-- 
2.53.0


Reply via email to