aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2023-11-02 15:16:19 +0000
committerMichael Brown <mcb30@ipxe.org>2023-11-02 15:20:27 +0000
commit1f3a37e342ff110a451afcdf15c75a90e643208d (patch)
tree6816c463a8afc898bf018d2599c82505657541b0
parent74ec00a9f336152fccf8df9cc9c5a46ab1a649b4 (diff)
downloadipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.zip
ipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.tar.gz
ipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.tar.bz2
[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.c6
-rw-r--r--src/include/ipxe/ecam.h2
2 files changed, 6 insertions, 2 deletions
diff --git a/src/drivers/bus/ecam.c b/src/drivers/bus/ecam.c
index dd3e1e5..62baebe 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 683d613..ff08aee 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;