Skip to content

Commit ad1ff45

Browse files
XenuIsWatchingDevansh0210
authored andcommitted
drivers: i3c: cdns: report sdr error code
Report the i3c error code in the payload. Signed-off-by: Ryan McClelland <[email protected]>
1 parent 5855ecb commit ad1ff45

File tree

1 file changed

+40
-5
lines changed

1 file changed

+40
-5
lines changed

drivers/i3c/i3c_cdns.c

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ struct cdns_i3c_cmd {
537537
uint32_t *num_xfer;
538538
void *buf;
539539
uint32_t error;
540+
enum i3c_sdr_controller_error_types *sdr_err;
540541
enum i3c_data_rate hdr;
541542
};
542543

@@ -1451,10 +1452,11 @@ static int cdns_i3c_do_ccc(const struct device *dev, struct i3c_ccc_payload *pay
14511452
}
14521453
cmd->hdr = I3C_DATA_RATE_SDR;
14531454
/*
1454-
* write the address of num_xfer which is to be updated upon message
1455-
* completion
1455+
* write the address of num_xfer and err which is to be updated upon
1456+
* message completion
14561457
*/
14571458
cmd->num_xfer = &(payload->targets.payloads[i].num_xfer);
1459+
cmd->sdr_err = &(payload->targets.payloads[i].err);
14581460
}
14591461
} else {
14601462
cmd = &data->xfer.cmds[0];
@@ -1477,6 +1479,7 @@ static int cdns_i3c_do_ccc(const struct device *dev, struct i3c_ccc_payload *pay
14771479
cmd->len = 0;
14781480
cmd->num_xfer = NULL;
14791481
}
1482+
cmd->sdr_err = &(payload->ccc.err);
14801483
}
14811484

14821485
data->xfer.ret = -ETIMEDOUT;
@@ -1753,6 +1756,9 @@ static void cdns_i3c_complete_transfer(const struct device *dev)
17531756
for (int i = 0; i < data->xfer.num_cmds; i++) {
17541757
switch (data->xfer.cmds[i].error) {
17551758
case CMDR_NO_ERROR:
1759+
if (data->xfer.cmds[i].sdr_err) {
1760+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE_NONE;
1761+
}
17561762
break;
17571763

17581764
case CMDR_MST_ABORT:
@@ -1775,6 +1781,9 @@ static void cdns_i3c_complete_transfer(const struct device *dev)
17751781
"no EoD from target",
17761782
dev->name);
17771783
}
1784+
if (data->xfer.cmds[i].sdr_err) {
1785+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE_NONE;
1786+
}
17781787
break;
17791788

17801789
case CMDR_M0_ERROR: {
@@ -1806,27 +1815,50 @@ static void cdns_i3c_complete_transfer(const struct device *dev)
18061815
ret = -EIO;
18071816
}
18081817
} else {
1818+
if (data->xfer.cmds[i].sdr_err) {
1819+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE0;
1820+
}
18091821
ret = -EIO;
18101822
}
18111823
break;
18121824
}
18131825

1814-
case CMDR_DDR_PREAMBLE_ERROR:
1815-
case CMDR_DDR_PARITY_ERROR:
18161826
case CMDR_M1_ERROR:
1827+
if (data->xfer.cmds[i].sdr_err) {
1828+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE1;
1829+
}
1830+
ret = -EIO;
1831+
break;
18171832
case CMDR_M2_ERROR:
1833+
if (data->xfer.cmds[i].sdr_err) {
1834+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE2;
1835+
}
1836+
ret = -EIO;
1837+
break;
1838+
1839+
case CMDR_DDR_PREAMBLE_ERROR:
1840+
case CMDR_DDR_PARITY_ERROR:
18181841
case CMDR_NACK_RESP:
18191842
case CMDR_DDR_DROPPED:
1843+
if (data->xfer.cmds[i].sdr_err) {
1844+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE_UNKNOWN;
1845+
}
18201846
ret = -EIO;
18211847
break;
18221848

18231849
case CMDR_DDR_RX_FIFO_OVF:
18241850
case CMDR_DDR_TX_FIFO_UNF:
1851+
if (data->xfer.cmds[i].sdr_err) {
1852+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE_UNKNOWN;
1853+
}
18251854
ret = -ENOSPC;
18261855
break;
18271856

18281857
case CMDR_INVALID_DA:
18291858
default:
1859+
if (data->xfer.cmds[i].sdr_err) {
1860+
*data->xfer.cmds[i].sdr_err = I3C_ERROR_CE_UNKNOWN;
1861+
}
18301862
ret = -EINVAL;
18311863
break;
18321864
}
@@ -1923,8 +1955,9 @@ static int cdns_i3c_i2c_transfer(const struct device *dev, struct i3c_i2c_device
19231955
cmd->cmd0 |= CMD0_FIFO_RNW;
19241956
}
19251957

1926-
/* i2c transfers are a don't care for num_xfer */
1958+
/* i2c transfers are a don't care for num_xfer and sdr error */
19271959
cmd->num_xfer = NULL;
1960+
cmd->sdr_err = NULL;
19281961
}
19291962

19301963
data->xfer.ret = -ETIMEDOUT;
@@ -2250,6 +2283,7 @@ static int cdns_i3c_transfer(const struct device *dev, struct i3c_device_desc *t
22502283
* completion
22512284
*/
22522285
cmd->num_xfer = &(msgs[i].num_xfer);
2286+
cmd->sdr_err = &(msgs[i].err);
22532287
cmd->hdr = I3C_DATA_RATE_SDR;
22542288
} else if ((data->common.ctrl_config.supported_hdr & I3C_MSG_HDR_DDR) &&
22552289
(msgs[i].hdr_mode == I3C_MSG_HDR_DDR) && (msgs[i].flags & I3C_MSG_HDR)) {
@@ -2303,6 +2337,7 @@ static int cdns_i3c_transfer(const struct device *dev, struct i3c_device_desc *t
23032337
* completion
23042338
*/
23052339
cmd->num_xfer = &(msgs[i].num_xfer);
2340+
cmd->sdr_err = &(msgs[i].err);
23062341
cmd->hdr = I3C_DATA_RATE_HDR_DDR;
23072342
} else {
23082343
LOG_ERR("%s: Unsupported HDR Mode %d", dev->name, msgs[i].hdr_mode);

0 commit comments

Comments
 (0)