aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can/m_can
diff options
context:
space:
mode:
authorMarc Kleine-Budde <mkl@pengutronix.de>2019-08-16 10:44:49 +0200
committerMarc Kleine-Budde <mkl@pengutronix.de>2019-08-20 13:41:26 +0200
commit6093f744fec77e06f98b0267ced88b9caa64eae8 (patch)
tree12effee445f1c1e7acd6189d85a576eb43deac26 /drivers/net/can/m_can
parentcan: tcan4x5x: tcan4x5x_can_probe(): add missing error handling if mcan_class is NULL (diff)
downloadlinux-dev-6093f744fec77e06f98b0267ced88b9caa64eae8.tar.xz
linux-dev-6093f744fec77e06f98b0267ced88b9caa64eae8.zip
can: tcan4x5x: fix data length in regmap write path
In regmap_spi_gather_write() the "addr" is prepared. The chip expects the number of 32 bit words to write in the lower 8 bits of addr. However the number of byte to write in shifted left by 3 (== divided by 8). The function tcan4x5x_regmap_write() is called with a data buffer, which holds the register information in the first 32 bits, followed by the actual data. tcan4x5x_regmap_write() calls regmap_spi_gather_write() with the val pointer pointing to the actual data (i.e. the original pointer is incremented by 4 bytes), but without decrementing the count. If the regmap framework only calls tcan4x5x_regmap_write() to read single 32 bit registers these two bugs cancel each other. This patch fixes the code. Fixes: 5443c226ba91 ("can: tcan4x5x: Add tcan4x5x driver to the kernel") Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can/m_can')
-rw-r--r--drivers/net/can/m_can/tcan4x5x.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index 7a73a4cfc1bb..a697996d81b4 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -178,7 +178,7 @@ static int regmap_spi_gather_write(void *context, const void *reg,
{ .tx_buf = val, .len = val_len, },
};
- addr = TCAN4X5X_WRITE_CMD | (*((u16 *)reg) << 8) | val_len >> 3;
+ addr = TCAN4X5X_WRITE_CMD | (*((u16 *)reg) << 8) | val_len >> 2;
spi_message_init(&m);
spi_message_add_tail(&t[0], &m);
@@ -192,7 +192,7 @@ static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
u16 *reg = (u16 *)(data);
const u32 *val = data + 4;
- return regmap_spi_gather_write(context, reg, 4, val, count);
+ return regmap_spi_gather_write(context, reg, 4, val, count - 4);
}
static int regmap_spi_async_write(void *context,