From ee99749ee57aaa37f16cf033c4a91e108d3b0b60 Mon Sep 17 00:00:00 2001 From: Nick Ward Date: Thu, 24 Oct 2019 22:15:17 +1100 Subject: [PATCH] drivers: CAN: MCP2515: Optimise TX SPI data length When loading the TX buffer via SPI only transfer the data bytes of the CAN message that will be used as defined by the DLC. Signed-off-by: Nick Ward --- drivers/can/can_mcp2515.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/can/can_mcp2515.c b/drivers/can/can_mcp2515.c index 57d16acc7a7..155be404ea0 100644 --- a/drivers/can/can_mcp2515.c +++ b/drivers/can/can_mcp2515.c @@ -216,7 +216,7 @@ static void mcp2515_convert_zcanframe_to_mcp2515frame(const struct zcan_frame target[MCP2515_FRAME_OFFSET_DLC] = rtr | dlc; - for (; data_idx < 8; data_idx++) { + for (; data_idx < CAN_MAX_DLC; data_idx++) { target[MCP2515_FRAME_OFFSET_D0 + data_idx] = source->data[data_idx]; } @@ -245,7 +245,7 @@ static void mcp2515_convert_mcp2515frame_to_zcanframe(const u8_t *source, target->rtr = source[MCP2515_FRAME_OFFSET_DLC] & BIT(6) ? CAN_REMOTEREQUEST : CAN_DATAFRAME; - for (; data_idx < 8; data_idx++) { + for (; data_idx < CAN_MAX_DLC; data_idx++) { target->data[data_idx] = source[MCP2515_FRAME_OFFSET_D0 + data_idx]; } @@ -386,6 +386,7 @@ static int mcp2515_send(struct device *dev, const struct zcan_frame *msg, u8_t tx_idx = 0U; u8_t abc; u8_t nnn; + u8_t len; u8_t tx_frame[MCP2515_FRAME_LEN]; if (msg->dlc > CAN_MAX_DLC) { @@ -422,7 +423,10 @@ static int mcp2515_send(struct device *dev, const struct zcan_frame *msg, /* Address Pointer selection */ abc = 2 * tx_idx; - mcp2515_cmd_load_tx_buffer(dev, abc, tx_frame, sizeof(tx_frame)); + /* Calculate minimum length to transfer */ + len = sizeof(tx_frame) - CAN_MAX_DLC + msg->dlc; + + mcp2515_cmd_load_tx_buffer(dev, abc, tx_frame, len); /* request tx slot transmission */ nnn = BIT(tx_idx);