]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[pci] Cache ECAM mapping errors
authorMichael Brown <mcb30@ipxe.org>
Thu, 2 Nov 2023 15:16:19 +0000 (15:16 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 2 Nov 2023 15:20:27 +0000 (15:20 +0000)
When an error occurs during ECAM configuration space mapping, preserve
the error within the existing cached mapping (instead of invalidating
the cached mapping) in order to avoid flooding the debug log with
repeated identical mapping errors.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bus/ecam.c
src/include/ipxe/ecam.h

index dd3e1e514cc044b4e4855989e3f9da7340cf4b3d..62baebeedc2b615cccb93f95e54991067276b1f0 100644 (file)
@@ -127,7 +127,7 @@ static int ecam_access ( struct pci_device *pci ) {
 
        /* Reuse mapping if possible */
        if ( ( pci->busdevfn - ecam.range.start ) < ecam.range.count )
-               return 0;
+               return ecam.rc;
 
        /* Clear any existing mapping */
        if ( ecam.regs ) {
@@ -145,6 +145,7 @@ static int ecam_access ( struct pci_device *pci ) {
        if ( ecam.range.start > pci->busdevfn ) {
                DBGC ( &ecam, "ECAM found no allocation for " PCI_FMT "\n",
                       PCI_ARGS ( pci ) );
+               rc = -ENOENT;
                goto err_find;
        }
 
@@ -165,12 +166,13 @@ static int ecam_access ( struct pci_device *pci ) {
        DBGC ( &ecam, "ECAM %04x:[%02x-%02x] mapped [%08llx,%08llx) -> %p\n",
               le16_to_cpu ( ecam.alloc.segment ), ecam.alloc.start,
               ecam.alloc.end, base, ( base + len ), ecam.regs );
+       ecam.rc = 0;
        return 0;
 
        iounmap ( ecam.regs );
  err_ioremap:
  err_find:
-       ecam.range.count = 0;
+       ecam.rc = rc;
        return rc;
 }
 
index 683d613a01594abfb4ecc24bb0541511daa8c8be..ff08aee5a5c9357204832b7093f5655522af6ad2 100644 (file)
@@ -50,6 +50,8 @@ struct ecam_mapping {
        struct pci_range range;
        /** MMIO base address */
        void *regs;
+       /** Mapping result */
+       int rc;
 };
 
 extern struct pci_api ecam_api;