On Sat, Jul 05, 2025 at 08:30:46PM +0530, Bandhan Pramanik wrote:
> Hello,
> 
> The dmesg log (the older one) is present here:

[1]:
> https://gist.githubusercontent.com/BandhanPramanik/ddb0cb23eca03ca2ea43a1d832a16180/raw/78460e6931a055b6776afe756a95d467913d5ebd/dmesg.log
> 
> The newer dmesg log includes the first line and is not overwritten by
> the ring buffer (used pci=noaer in this case):
> https://gist.githubusercontent.com/BandhanPramanik/ddb0cb23eca03ca2ea43a1d832a16180/raw/78460e6931a055b6776afe756a95d467913d5ebd/updated-dmesg
>  (The newer one doesn't have the error recorded).
> 
> You should check out the older dmesg, the quoted line was taken from
> there verbatim, including any additional details.
> 
> Bandhan
> 
> On Sat, Jul 5, 2025 at 7:20 PM Bjorn Helgaas <[email protected]> wrote:
> >
> > On Sat, Jul 05, 2025 at 01:00:23AM +0530, Bandhan Pramanik wrote:
> > > Hi everyone,
> > >
> > > Here after a week. I did my research.
> > >
> > > I talked to some folks on IRC and the glaring issue was basically this:
> > >
> > > > [ 1146.810055] pcieport 0000:00:1c.0: AER: Uncorrectable (Fatal) error 
> > > > message received from 0000:01:00.0

>From [1]:

  [ 1146.810055] pcieport 0000:00:1c.0: AER: Uncorrectable (Fatal) error 
message received from 0000:01:00.0
  [ 1146.810069] ath10k_pci 0000:01:00.0: AER: PCIe Bus Error: 
severity=Uncorrectable (Fatal), type=Inaccessible, (Unregistered Agent ID)
  [ 1146.813130] ath10k_pci 0000:01:00.0: AER: can't recover (no error_detected 
callback)
  [ 1146.948066] pcieport 0000:00:1c.0: AER: Root Port link has been reset (0)
  [ 1146.948112] pcieport 0000:00:1c.0: AER: device recovery failed
  [ 1146.949480] ath10k_pci 0000:01:00.0: failed to wake target for read32 at 
0x0003a028: -110

I think Linux is not doing a very good job of extracting error
information.  I think is_error_source() read PCI_ERR_UNCOR_STATUS from
01:00.0 and saw an error logged, but aer_get_device_error_info()
declined to read PCI_ERR_UNCOR_STATUS again because we thought the
link was unusable, so aer_print_error() didn't have any info to print,
hence the "Inaccessible" message.

Are you able to rebuild a kernel with the patch below?  This is based
on v6.16-rc1 and likely wouldn't apply cleanly to your v6.14 kernel.
But if you are able to build v6.16-rc1 with this patch, or adapt it to
v6.14, I'd be interested in the output.

diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 70ac66188367..99acb1e1946e 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -990,6 +990,8 @@ static bool is_error_source(struct pci_dev *dev, struct 
aer_err_info *e_info)
        if ((PCI_BUS_NUM(e_info->id) != 0) &&
            !(dev->bus->bus_flags & PCI_BUS_FLAGS_NO_AERSID)) {
                /* Device ID match? */
+               pci_info(dev, "%s: bus_flags %#x e_info->id %#04x\n",
+                        __func__, dev->bus->bus_flags, e_info->id);
                if (e_info->id == pci_dev_id(dev))
                        return true;
 
@@ -1025,6 +1027,10 @@ static bool is_error_source(struct pci_dev *dev, struct 
aer_err_info *e_info)
                pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_STATUS, &status);
                pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_MASK, &mask);
        }
+       pci_info(dev, "%s: %s STATUS %#010x MASK %#010x\n",
+                __func__,
+                e_info->severity == AER_CORRECTABLE ? "COR" : "UNCOR",
+                status, mask);
        if (status & ~mask)
                return true;
 
@@ -1368,6 +1374,8 @@ int aer_get_device_error_info(struct aer_err_info *info, 
int i)
        aer = dev->aer_cap;
        type = pci_pcie_type(dev);
 
+       pci_info(dev, "%s: type %#x cap %#04x\n", __func__, type, aer);
+
        /* Must reset in this function */
        info->status = 0;
        info->tlp_header_valid = 0;
@@ -1383,16 +1391,14 @@ int aer_get_device_error_info(struct aer_err_info 
*info, int i)
                        &info->mask);
                if (!(info->status & ~info->mask))
                        return 0;
-       } else if (type == PCI_EXP_TYPE_ROOT_PORT ||
-                  type == PCI_EXP_TYPE_RC_EC ||
-                  type == PCI_EXP_TYPE_DOWNSTREAM ||
-                  info->severity == AER_NONFATAL) {
-
+       } else {
                /* Link is still healthy for IO reads */
                pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_STATUS,
                        &info->status);
                pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_MASK,
                        &info->mask);
+               pci_info(dev, "%s: UNCOR STATUS %#010x MASK %#010x\n",
+                        __func__, info->status, info->mask);
                if (!(info->status & ~info->mask))
                        return 0;
 
@@ -1471,6 +1477,8 @@ static void aer_isr_one_error(struct pci_dev *root,
 {
        u32 status = e_src->status;
 
+       pci_info(root, "%s: ROOT_STATUS %#010x ROOT_ERR_SRC %#010x\n",
+                __func__, e_src->status, e_src->id);
        pci_rootport_aer_stats_incr(root, e_src);
 
        /*

Reply via email to