Skip to content

Commit 6d1a19d

Browse files
nxpfranklialexandrebelloni
authored andcommitted
i3c: master: svc: return actual transfer data len
I3C allow devices early terminate data transfer. So set "actual_len" to indicate how much data get by i3c_priv_xfer. Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Frank Li <Frank.Li@nxp.com> Link: https://lore.kernel.org/r/20231201222532.2431484-6-Frank.Li@nxp.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
1 parent 6fb6173 commit 6d1a19d

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

drivers/i3c/master/svc-i3c-master.c

+8
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ struct svc_i3c_cmd {
138138
const void *out;
139139
unsigned int len;
140140
unsigned int actual_len;
141+
struct i3c_priv_xfer *xfer;
141142
bool continued;
142143
};
143144

@@ -1062,6 +1063,7 @@ static int svc_i3c_master_xfer(struct svc_i3c_master *master,
10621063

10631064
if (readl(master->regs + SVC_I3C_MERRWARN) & SVC_I3C_MERRWARN_NACK) {
10641065
ret = -ENXIO;
1066+
*actual_len = 0;
10651067
goto emit_stop;
10661068
}
10671069

@@ -1079,6 +1081,7 @@ static int svc_i3c_master_xfer(struct svc_i3c_master *master,
10791081
*/
10801082
if (SVC_I3C_MSTATUS_IBIWON(reg)) {
10811083
ret = -ENXIO;
1084+
*actual_len = 0;
10821085
goto emit_stop;
10831086
}
10841087

@@ -1174,6 +1177,10 @@ static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *master)
11741177
cmd->addr, cmd->in, cmd->out,
11751178
cmd->len, &cmd->actual_len,
11761179
cmd->continued);
1180+
/* cmd->xfer is NULL if I2C or CCC transfer */
1181+
if (cmd->xfer)
1182+
cmd->xfer->actual_len = cmd->actual_len;
1183+
11771184
if (ret)
11781185
break;
11791186
}
@@ -1361,6 +1368,7 @@ static int svc_i3c_master_priv_xfers(struct i3c_dev_desc *dev,
13611368
for (i = 0; i < nxfers; i++) {
13621369
struct svc_i3c_cmd *cmd = &xfer->cmds[i];
13631370

1371+
cmd->xfer = &xfers[i];
13641372
cmd->addr = master->addrs[data->index];
13651373
cmd->rnw = xfers[i].rnw;
13661374
cmd->in = xfers[i].rnw ? xfers[i].data.in : NULL;

0 commit comments

Comments
 (0)