@@ -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