[PATCH] board: xilinx: Retry FRU EEPROM read on timeout
Michal Simek
michal.simek at amd.com
Wed Nov 19 09:50:23 CET 2025
From: Padmarao Begari <padmarao.begari at amd.com>
Wrap the dm_i2c_read() call is used for FRU EEPROM reads in a
retry loop, attempting up to EEPROM_FRU_READ_RETRY times if a
-ETIMEDOUT error is returned. The loop exits immediately on
success or any error other than -ETIMEDOUT. This improves
robustness against transient I2C timeouts during FRU detection
and decoding.
Signed-off-by: Padmarao Begari <padmarao.begari at amd.com>
Signed-off-by: Michal Simek <michal.simek at amd.com>
---
board/xilinx/common/board.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c
index 26facb6daeab..4735b6ab58d6 100644
--- a/board/xilinx/common/board.c
+++ b/board/xilinx/common/board.c
@@ -70,6 +70,8 @@ struct efi_capsule_update_info update_info = {
#define EEPROM_HDR_ETH_ALEN ETH_ALEN
#define EEPROM_HDR_UUID_LEN 16
+#define EEPROM_FRU_READ_RETRY 5
+
struct xilinx_board_description {
u32 header;
char manufacturer[EEPROM_HDR_MANUFACTURER_LEN + 1];
@@ -207,8 +209,14 @@ static int xilinx_read_eeprom_fru(struct udevice *dev, char *name,
debug("%s: I2C EEPROM read pass data at %p\n", __func__,
fru_content);
- ret = dm_i2c_read(dev, 0, (uchar *)fru_content,
- eeprom_size);
+ i = 0;
+ do {
+ ret = dm_i2c_read(dev, 0, (uchar *)fru_content,
+ eeprom_size);
+ if (!ret)
+ break;
+ } while (++i < EEPROM_FRU_READ_RETRY && ret == -ETIMEDOUT);
+
if (ret) {
debug("%s: I2C EEPROM read failed\n", __func__);
goto end;
--
2.43.0
base-commit: 2e86581d055bff8335d7e43d58617db16f11384f
branch: debian-sent3
More information about the U-Boot
mailing list