diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2016-07-07 13:47:00 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2016-07-07 13:47:00 +0100 |
commit | 5229f45bd98558af84d806a98032df3cb741c357 (patch) | |
tree | fbdcea867a0930926831f3cc2ecdc0755fcd15f8 /hw/misc/aux.c | |
parent | bb14a1eda0d060413d17466c58b39e4c0dbcde4e (diff) | |
download | qemu-5229f45bd98558af84d806a98032df3cb741c357.zip qemu-5229f45bd98558af84d806a98032df3cb741c357.tar.gz qemu-5229f45bd98558af84d806a98032df3cb741c357.tar.bz2 |
aux: fix break that wanted to break two levels out
The last "ret = AUX_I2C_NACK;" is dead, because it is always overridden
by AUX_I2C_ACK. What really the code wants is to jump out of the switch
statement, and a "return" will not cut it because it would omit a debug
printf.
Change the logic so that we can break out of the while loop. For clarity,
hoist the bus->last_* assignments up, right after i2c_start_transfer.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/misc/aux.c')
-rw-r--r-- | hw/misc/aux.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/hw/misc/aux.c b/hw/misc/aux.c index 25d7712..06e24ca 100644 --- a/hw/misc/aux.c +++ b/hw/misc/aux.c @@ -153,12 +153,12 @@ AUXReply aux_request(AUXBus *bus, AUXCommand cmd, uint32_t address, case WRITE_I2C_MOT: case READ_I2C_MOT: is_write = cmd == READ_I2C_MOT ? false : true; + ret = AUX_I2C_NACK; if (!i2c_bus_busy(i2c_bus)) { /* * No transactions started.. */ if (i2c_start_transfer(i2c_bus, address, is_write)) { - ret = AUX_I2C_NACK; break; } } else if ((address != bus->last_i2c_address) || @@ -168,22 +168,22 @@ AUXReply aux_request(AUXBus *bus, AUXCommand cmd, uint32_t address, */ i2c_end_transfer(i2c_bus); if (i2c_start_transfer(i2c_bus, address, is_write)) { - ret = AUX_I2C_NACK; break; } } + bus->last_transaction = cmd; + bus->last_i2c_address = address; while (len > 0) { if (i2c_send_recv(i2c_bus, data++, is_write) < 0) { - ret = AUX_I2C_NACK; i2c_end_transfer(i2c_bus); break; } len--; } - bus->last_transaction = cmd; - bus->last_i2c_address = address; - ret = AUX_I2C_ACK; + if (len == 0) { + ret = AUX_I2C_ACK; + } break; default: DPRINTF("Not implemented!\n"); |