[PATCH v3] misc: i2c_eeprom: consider pagesize when writing to eeprom

Michel Alex Alex.Michel at wiedemann-group.com
Wed Oct 25 15:43:28 CEST 2023


Calculate the maximum length of the buffer when writing
across the page boundary. If the buffer length (len)
exceeds the page boundary (pagesize), split it. Use this
length instead of comparing the length with the pagesize,
because if the write start address (offset) is not at the
beginning of a page and the page_offset + len is greater
than the page boundary (pagesize), the write operation
would overflow the current page and the behaviour can be
undefined (e.g. at24).

Signed-off-by: Alex Michel <alex.michel at wiedemann-group.com>
---
Changes for v2:
- fixed deviations from checkpatch.pl
- improved commit message
Changes for v3:
- cleaned up brackets
---
 drivers/misc/i2c_eeprom.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/i2c_eeprom.c b/drivers/misc/i2c_eeprom.c
index bdd7e018cc..947eeb5648 100644
--- a/drivers/misc/i2c_eeprom.c
+++ b/drivers/misc/i2c_eeprom.c
@@ -60,6 +60,17 @@ static int i2c_eeprom_std_read(struct udevice *dev, int offset, uint8_t *buf,
        return dm_i2c_read(dev, offset, buf, size);
 }

+static int i2c_eeprom_len(unsigned int offset, unsigned int len, unsigned int pagesize)
+{
+       int page_offset = offset & (pagesize - 1);
+       unsigned int maxlen = pagesize - page_offset;
+
+       if (len > maxlen)
+               len = maxlen;
+
+       return len;
+}
+
 static int i2c_eeprom_std_write(struct udevice *dev, int offset,
                                const uint8_t *buf, int size)
 {
@@ -67,7 +78,7 @@ static int i2c_eeprom_std_write(struct udevice *dev, int offset,
        int ret;

        while (size > 0) {
-               int write_size = min_t(int, size, priv->pagesize);
+               int write_size = i2c_eeprom_len(offset, size, priv->pagesize);

                ret = dm_i2c_write(dev, offset, buf, write_size);
                if (ret)
--
2.34.1



More information about the U-Boot mailing list