From e4c93c3a60079d29966ade5aa380e6bb51e00524 Mon Sep 17 00:00:00 2001 From: Henrik Brix Andersen Date: Wed, 13 Apr 2022 17:11:47 +0200 Subject: [PATCH] drivers: can: mcp2515: do not soft-reset device when changing timing Do not soft-reset device when changing timing parameters as the soft-reset will discard the configured CAN controller mode. Fixes: #44837 Signed-off-by: Henrik Brix Andersen --- drivers/can/can_mcp2515.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/can/can_mcp2515.c b/drivers/can/can_mcp2515.c index 1e367982379..05be24fb47a 100644 --- a/drivers/can/can_mcp2515.c +++ b/drivers/can/can_mcp2515.c @@ -343,7 +343,7 @@ static int mcp2515_set_timing(const struct device *dev, /* CNF3, CNF2, CNF1, CANINTE */ uint8_t config_buf[4]; - uint8_t reset_mode; + uint8_t mode; /* CNF1; SJW<7:6> | BRP<5:0> */ __ASSERT(timing->prescaler > 0, "Prescaler should be bigger than zero"); @@ -397,28 +397,15 @@ static int mcp2515_set_timing(const struct device *dev, k_mutex_lock(&dev_data->mutex, K_FOREVER); - k_usleep(MCP2515_OSC_STARTUP_US); - - /* will enter configuration mode automatically */ - ret = mcp2515_cmd_soft_reset(dev); + ret = mcp2515_get_mode(dev, &mode); if (ret < 0) { - LOG_ERR("Failed to reset the device [%d]", ret); + LOG_ERR("Failed to read device mode [%d]", ret); goto done; } - k_usleep(MCP2515_OSC_STARTUP_US); - - ret = mcp2515_get_mode(dev, &reset_mode); + ret = mcp2515_set_mode_int(dev, MCP2515_MODE_CONFIGURATION); if (ret < 0) { - LOG_ERR("Failed to read device mode [%d]", - ret); - goto done; - } - - if (reset_mode != MCP2515_MODE_CONFIGURATION) { - LOG_ERR("Device did not reset into configuration mode [%d]", - reset_mode); - ret = -EIO; + LOG_ERR("Failed to enter configuration mode [%d]", ret); goto done; } @@ -426,18 +413,28 @@ static int mcp2515_set_timing(const struct device *dev, sizeof(config_buf)); if (ret < 0) { LOG_ERR("Failed to write the configuration [%d]", ret); + goto done; } ret = mcp2515_cmd_bit_modify(dev, MCP2515_ADDR_RXB0CTRL, rx0_ctrl, rx0_ctrl); if (ret < 0) { LOG_ERR("Failed to write RXB0CTRL [%d]", ret); + goto done; } ret = mcp2515_cmd_bit_modify(dev, MCP2515_ADDR_RXB1CTRL, rx1_ctrl, rx1_ctrl); if (ret < 0) { LOG_ERR("Failed to write RXB1CTRL [%d]", ret); + goto done; + } + + /* Restore previous mode */ + ret = mcp2515_set_mode_int(dev, mode); + if (ret < 0) { + LOG_ERR("Failed to restore mode [%d]", ret); + goto done; } done: