From: Patrick Venture Date: Mon, 20 Dec 2021 21:21:37 +0000 (-0800) Subject: hw/nvram: at24 return 0xff if 1 byte address X-Git-Tag: qemu-xen-4.17.0-rc4~53^2 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=1cbab82e9d1bdb2c7b9ef46a396fdc03ea3fa04c;p=qemu-xen.git hw/nvram: at24 return 0xff if 1 byte address The at24 eeproms are 2 byte devices that return 0xff when they are read from with a partial (1-byte) address written. This distinction was found comparing model behavior to real hardware testing. Tested: `i2ctransfer -f -y 45 w1@85 0 r1` returns 0xff instead of next byte Signed-off-by: Patrick Venture Reviewed-by: Philippe Mathieu-Daudé Message-Id: <20211220212137.1244511-1-venture@google.com> Signed-off-by: Philippe Mathieu-Daudé --- diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c index da435500ba..01a3093600 100644 --- a/hw/nvram/eeprom_at24c.c +++ b/hw/nvram/eeprom_at24c.c @@ -58,9 +58,10 @@ int at24c_eeprom_event(I2CSlave *s, enum i2c_event event) switch (event) { case I2C_START_SEND: - case I2C_START_RECV: case I2C_FINISH: ee->haveaddr = 0; + /* fallthrough */ + case I2C_START_RECV: DPRINTK("clear\n"); if (ee->blk && ee->changed) { int len = blk_pwrite(ee->blk, 0, ee->mem, ee->rsize, 0); @@ -84,6 +85,10 @@ uint8_t at24c_eeprom_recv(I2CSlave *s) EEPROMState *ee = AT24C_EE(s); uint8_t ret; + if (ee->haveaddr == 1) { + return 0xff; + } + ret = ee->mem[ee->cur]; ee->cur = (ee->cur + 1u) % ee->rsize;