Skip to content

Commit 08996a6

Browse files
talih0nashif
authored andcommitted
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 <[email protected]>
1 parent 59bdb49 commit 08996a6

File tree

1 file changed

+15
-20
lines changed

1 file changed

+15
-20
lines changed

drivers/can/can_mcp251xfd.c

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,14 +1573,14 @@ static int mcp251xfd_init(const struct device *dev)
15731573
ret = mcp251xfd_reset(dev);
15741574
if (ret < 0) {
15751575
LOG_ERR("Failed to reset the device [%d]", ret);
1576-
goto done;
1576+
return ret;
15771577
}
15781578

15791579
ret = can_calc_timing(dev, &timing, dev_cfg->common.bitrate,
15801580
dev_cfg->common.sample_point);
15811581
if (ret < 0) {
15821582
LOG_ERR("Can't find timing for given param");
1583-
goto done;
1583+
return ret;
15841584
}
15851585

15861586
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)
15921592
dev_cfg->common.sample_point_data);
15931593
if (ret < 0) {
15941594
LOG_ERR("Can't find data timing for given param");
1595-
goto done;
1595+
return ret;
15961596
}
15971597

15981598
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)
16021602

16031603
reg = mcp251xfd_read_crc(dev, MCP251XFD_REG_CON, MCP251XFD_REG_SIZE);
16041604
if (!reg) {
1605-
ret = -EINVAL;
1606-
goto done;
1605+
return -EIO;
16071606
}
16081607

16091608
*reg = sys_le32_to_cpu(*reg);
@@ -1612,57 +1611,57 @@ static int mcp251xfd_init(const struct device *dev)
16121611

16131612
if (opmod != MCP251XFD_REG_CON_MODE_CONFIG) {
16141613
LOG_ERR("Device did not reset into configuration mode [%d]", opmod);
1615-
ret = -EIO;
1616-
goto done;
1614+
return -EIO;
16171615
}
16181616

16191617
dev_data->current_mcp251xfd_mode = MCP251XFD_REG_CON_MODE_CONFIG;
16201618

16211619
ret = mcp251xfd_init_con_reg(dev);
16221620
if (ret < 0) {
1623-
goto done;
1621+
return ret;
16241622
}
16251623

16261624
ret = mcp251xfd_init_osc_reg(dev);
16271625
if (ret < 0) {
1628-
goto done;
1626+
LOG_ERR("Error initializing OSC register [%d]", ret);
1627+
return ret;
16291628
}
16301629

16311630
ret = mcp251xfd_init_iocon_reg(dev);
16321631
if (ret < 0) {
1633-
goto done;
1632+
return ret;
16341633
}
16351634

16361635
ret = mcp251xfd_init_int_reg(dev);
16371636
if (ret < 0) {
1638-
goto done;
1637+
return ret;
16391638
}
16401639

16411640
ret = mcp251xfd_set_tdc(dev, false);
16421641
if (ret < 0) {
1643-
goto done;
1642+
return ret;
16441643
}
16451644

16461645
#if defined(CONFIG_CAN_RX_TIMESTAMP)
16471646
ret = mcp251xfd_init_tscon(dev);
16481647
if (ret < 0) {
1649-
goto done;
1648+
return ret;
16501649
}
16511650
#endif
16521651

16531652
ret = mcp251xfd_init_tef_fifo(dev);
16541653
if (ret < 0) {
1655-
goto done;
1654+
return ret;
16561655
}
16571656

16581657
ret = mcp251xfd_init_tx_queue(dev);
16591658
if (ret < 0) {
1660-
goto done;
1659+
return ret;
16611660
}
16621661

16631662
ret = mcp251xfd_init_rx_fifo(dev);
16641663
if (ret < 0) {
1665-
goto done;
1664+
return ret;
16661665
}
16671666

16681667
LOG_DBG("%d TX FIFOS: 1 element", MCP251XFD_TX_QUEUE_ITEMS);
@@ -1671,17 +1670,13 @@ static int mcp251xfd_init(const struct device *dev)
16711670
MCP251XFD_TEF_FIFO_SIZE + MCP251XFD_TX_QUEUE_SIZE + MCP251XFD_RX_FIFO_SIZE,
16721671
MCP251XFD_RAM_SIZE);
16731672

1674-
done:
16751673
ret = can_set_timing(dev, &timing);
16761674
if (ret < 0) {
16771675
return ret;
16781676
}
16791677

16801678
#if defined(CONFIG_CAN_FD_MODE)
16811679
ret = can_set_timing_data(dev, &timing_data);
1682-
if (ret < 0) {
1683-
return ret;
1684-
}
16851680
#endif
16861681

16871682
return ret;

0 commit comments

Comments
 (0)