Commit 1eab6647 authored by Lucas Russo's avatar Lucas Russo

sm_io/protocols/*: fix transmission size for generic read/write

We must account for cases when the user
did not "correctly" specified data pointer
and/or data size.
parent ed260e5e
...@@ -638,14 +638,17 @@ static ssize_t _i2c_write_generic (smpr_t *self, size_t size_offs, uint64_t offs ...@@ -638,14 +638,17 @@ static ssize_t _i2c_write_generic (smpr_t *self, size_t size_offs, uint64_t offs
size_t raw_size = size_offs + size; size_t raw_size = size_offs + size;
uint8_t raw_data [raw_size]; uint8_t raw_data [raw_size];
size_t trans_size = 0;
/* Copy address + data */ /* Copy address + data */
memcpy (&raw_data, &offs, size_offs); memcpy (&raw_data, &offs, size_offs);
trans_size += size_offs;
if (data != NULL) { if (data != NULL) {
memcpy (&raw_data + size_offs, data, size); memcpy (&raw_data + size_offs, data, size);
trans_size += size;
} }
ssize_t err = _i2c_write_raw (self, raw_size, raw_data); ssize_t err = _i2c_write_raw (self, trans_size, raw_data);
ASSERT_TEST(err > 0 && (size_t) err == raw_size /* in bytes*/, ASSERT_TEST(err > 0 && (size_t) err == trans_size /* in bytes*/,
"Could not write data to I2C", err_exit, -1); "Could not write data to I2C", err_exit, -1);
/* We return only the number of data bytes actually written, not addr+data */ /* We return only the number of data bytes actually written, not addr+data */
......
...@@ -472,27 +472,32 @@ static ssize_t _spi_read_write_generic (smpr_t *self, size_t size_offs, uint64_t ...@@ -472,27 +472,32 @@ static ssize_t _spi_read_write_generic (smpr_t *self, size_t size_offs, uint64_t
smpr_spi_t *smpr_spi = (smpr_spi_t *) smpr_get_ops (self); smpr_spi_t *smpr_spi = (smpr_spi_t *) smpr_get_ops (self);
uint32_t addr_msb = smpr_spi_get_addr_msb (smpr_spi); uint32_t addr_msb = smpr_spi_get_addr_msb (smpr_spi);
size_t trans_size = 0;
if (addr_msb) { if (addr_msb) {
/* Copy address (MSB) + data */ /* Copy address (MSB) + data */
if (data != NULL) { if (data != NULL) {
memcpy (&raw_data, data, size); memcpy (&raw_data, data, size);
memcpy (&raw_data + size, &offs, size_offs); memcpy (&raw_data + size, &offs, size_offs);
trans_size += size + size_offs;
} }
/* Only copy address to buffer */ /* Only copy address to buffer */
else { else {
memcpy (&raw_data, &offs, size_offs); memcpy (&raw_data, &offs, size_offs);
trans_size += size_offs;
} }
} }
else { else {
/* Copy data (MSB) + address */ /* Copy data (MSB) + address */
memcpy (&raw_data, &offs, size_offs); memcpy (&raw_data, &offs, size_offs);
trans_size += size_offs;
if (data != NULL) { if (data != NULL) {
memcpy (&raw_data + size_offs, data, size); memcpy (&raw_data + size_offs, data, size);
trans_size += size;
} }
} }
ssize_t err = _spi_read_write_raw (self, raw_size, raw_data, mode); ssize_t err = _spi_read_write_raw (self, trans_size, raw_data, mode);
ASSERT_TEST(err > 0 && (size_t) err == raw_size /* in bytes*/, ASSERT_TEST(err > 0 && (size_t) err == trans_size /* in bytes*/,
"Could not write data to SPI", err_exit, -1); "Could not write data to SPI", err_exit, -1);
/* We return only the number of data bytes actually written, not addr+data */ /* We return only the number of data bytes actually written, not addr+data */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment