From 8022739e048a1c9f34eddf7f89dd656d1fc7fa66 Mon Sep 17 00:00:00 2001 From: Jerzy Kasenberg Date: Mon, 18 Nov 2024 11:30:23 +0100 Subject: [PATCH] i2c: target: eeprom_target: Fix buffer write When larger buffer index was introduced only function: eeprom_target_write_received() was updated to handle address-width = 16 This adds the same functionality when buffered API is used, enabled by CONFIG_I2C_TARGET_BUFFER_MODE. Signed-off-by: Jerzy Kasenberg (cherry picked from commit e6c9e9a2dde2e038b6b81140ee27556d4b36dc78) --- drivers/i2c/target/eeprom_target.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/target/eeprom_target.c b/drivers/i2c/target/eeprom_target.c index e2820749b206..69ae35cfcd8d 100644 --- a/drivers/i2c/target/eeprom_target.c +++ b/drivers/i2c/target/eeprom_target.c @@ -179,9 +179,19 @@ static void eeprom_target_buf_write_received(struct i2c_target_config *config, struct i2c_eeprom_target_data *data = CONTAINER_OF(config, struct i2c_eeprom_target_data, config); - /* The first byte is offset */ - data->buffer_idx = *ptr; - memcpy(&data->buffer[data->buffer_idx], ptr + 1, len - 1); + /* The first byte(s) is offset */ + uint32_t idx_write_cnt = 0; + + data->buffer_idx = 0; + while (idx_write_cnt < (data->address_width >> 3)) { + data->buffer_idx = (data->buffer_idx << 8) | *ptr++; + len--; + idx_write_cnt++; + } + + if (len > 0) { + memcpy(&data->buffer[data->buffer_idx], ptr, len); + } } static int eeprom_target_buf_read_requested(struct i2c_target_config *config,