diff options
author | Michael Brown <mcb30@ipxe.org> | 2023-11-02 15:16:19 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2023-11-02 15:20:27 +0000 |
commit | 1f3a37e342ff110a451afcdf15c75a90e643208d (patch) | |
tree | 6816c463a8afc898bf018d2599c82505657541b0 | |
parent | 74ec00a9f336152fccf8df9cc9c5a46ab1a649b4 (diff) | |
download | ipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.tar.gz |
[pci] Cache ECAM mapping errors
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>
-rw-r--r-- | src/drivers/bus/ecam.c | 6 | ||||
-rw-r--r-- | src/include/ipxe/ecam.h | 2 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/drivers/bus/ecam.c b/src/drivers/bus/ecam.c index dd3e1e514..62baebeed 100644 --- a/src/drivers/bus/ecam.c +++ b/src/drivers/bus/ecam.c @@ -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; } diff --git a/src/include/ipxe/ecam.h b/src/include/ipxe/ecam.h index 683d613a0..ff08aee5a 100644 --- a/src/include/ipxe/ecam.h +++ b/src/include/ipxe/ecam.h @@ -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; |