drivers: can_mcp251xfd: Forward error and remove done label

Currently if initializing one of the registers fails, the return
error gets overwritten by can_set_timing(). Fix by forwarding the
error directly. Also remove unnecessary done label.

Fixes #73586.

Original patch by melvinvdb from #73714.

Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
This commit is contained in:
Andriy Gelman 2024-06-04 14:05:39 +02:00 committed by Anas Nashif
parent 59bdb49901
commit 08996a63b0

View file

@ -1573,14 +1573,14 @@ static int mcp251xfd_init(const struct device *dev)
ret = mcp251xfd_reset(dev); ret = mcp251xfd_reset(dev);
if (ret < 0) { if (ret < 0) {
LOG_ERR("Failed to reset the device [%d]", ret); LOG_ERR("Failed to reset the device [%d]", ret);
goto done; return ret;
} }
ret = can_calc_timing(dev, &timing, dev_cfg->common.bitrate, ret = can_calc_timing(dev, &timing, dev_cfg->common.bitrate,
dev_cfg->common.sample_point); dev_cfg->common.sample_point);
if (ret < 0) { if (ret < 0) {
LOG_ERR("Can't find timing for given param"); LOG_ERR("Can't find timing for given param");
goto done; return ret;
} }
LOG_DBG("Presc: %d, BS1: %d, BS2: %d", timing.prescaler, timing.phase_seg1, LOG_DBG("Presc: %d, BS1: %d, BS2: %d", timing.prescaler, timing.phase_seg1,
@ -1592,7 +1592,7 @@ static int mcp251xfd_init(const struct device *dev)
dev_cfg->common.sample_point_data); dev_cfg->common.sample_point_data);
if (ret < 0) { if (ret < 0) {
LOG_ERR("Can't find data timing for given param"); LOG_ERR("Can't find data timing for given param");
goto done; return ret;
} }
LOG_DBG("Data phase Presc: %d, BS1: %d, BS2: %d", timing_data.prescaler, LOG_DBG("Data phase Presc: %d, BS1: %d, BS2: %d", timing_data.prescaler,
@ -1602,8 +1602,7 @@ static int mcp251xfd_init(const struct device *dev)
reg = mcp251xfd_read_crc(dev, MCP251XFD_REG_CON, MCP251XFD_REG_SIZE); reg = mcp251xfd_read_crc(dev, MCP251XFD_REG_CON, MCP251XFD_REG_SIZE);
if (!reg) { if (!reg) {
ret = -EINVAL; return -EIO;
goto done;
} }
*reg = sys_le32_to_cpu(*reg); *reg = sys_le32_to_cpu(*reg);
@ -1612,57 +1611,57 @@ static int mcp251xfd_init(const struct device *dev)
if (opmod != MCP251XFD_REG_CON_MODE_CONFIG) { if (opmod != MCP251XFD_REG_CON_MODE_CONFIG) {
LOG_ERR("Device did not reset into configuration mode [%d]", opmod); LOG_ERR("Device did not reset into configuration mode [%d]", opmod);
ret = -EIO; return -EIO;
goto done;
} }
dev_data->current_mcp251xfd_mode = MCP251XFD_REG_CON_MODE_CONFIG; dev_data->current_mcp251xfd_mode = MCP251XFD_REG_CON_MODE_CONFIG;
ret = mcp251xfd_init_con_reg(dev); ret = mcp251xfd_init_con_reg(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
ret = mcp251xfd_init_osc_reg(dev); ret = mcp251xfd_init_osc_reg(dev);
if (ret < 0) { if (ret < 0) {
goto done; LOG_ERR("Error initializing OSC register [%d]", ret);
return ret;
} }
ret = mcp251xfd_init_iocon_reg(dev); ret = mcp251xfd_init_iocon_reg(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
ret = mcp251xfd_init_int_reg(dev); ret = mcp251xfd_init_int_reg(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
ret = mcp251xfd_set_tdc(dev, false); ret = mcp251xfd_set_tdc(dev, false);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
#if defined(CONFIG_CAN_RX_TIMESTAMP) #if defined(CONFIG_CAN_RX_TIMESTAMP)
ret = mcp251xfd_init_tscon(dev); ret = mcp251xfd_init_tscon(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
#endif #endif
ret = mcp251xfd_init_tef_fifo(dev); ret = mcp251xfd_init_tef_fifo(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
ret = mcp251xfd_init_tx_queue(dev); ret = mcp251xfd_init_tx_queue(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
ret = mcp251xfd_init_rx_fifo(dev); ret = mcp251xfd_init_rx_fifo(dev);
if (ret < 0) { if (ret < 0) {
goto done; return ret;
} }
LOG_DBG("%d TX FIFOS: 1 element", MCP251XFD_TX_QUEUE_ITEMS); LOG_DBG("%d TX FIFOS: 1 element", MCP251XFD_TX_QUEUE_ITEMS);
@ -1671,7 +1670,6 @@ static int mcp251xfd_init(const struct device *dev)
MCP251XFD_TEF_FIFO_SIZE + MCP251XFD_TX_QUEUE_SIZE + MCP251XFD_RX_FIFO_SIZE, MCP251XFD_TEF_FIFO_SIZE + MCP251XFD_TX_QUEUE_SIZE + MCP251XFD_RX_FIFO_SIZE,
MCP251XFD_RAM_SIZE); MCP251XFD_RAM_SIZE);
done:
ret = can_set_timing(dev, &timing); ret = can_set_timing(dev, &timing);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
@ -1679,9 +1677,6 @@ done:
#if defined(CONFIG_CAN_FD_MODE) #if defined(CONFIG_CAN_FD_MODE)
ret = can_set_timing_data(dev, &timing_data); ret = can_set_timing_data(dev, &timing_data);
if (ret < 0) {
return ret;
}
#endif #endif
return ret; return ret;