From: Padmarao Begari <[email protected]> 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 <[email protected]> Signed-off-by: Michal Simek <[email protected]> --- 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

