i3c: dw: Return the length from a read priv_xfer
authorMatt Johnston <matt@codeconstruct.com.au>
Thu, 30 Mar 2023 06:15:32 +0000 (14:15 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Thu, 27 Apr 2023 21:49:43 +0000 (23:49 +0200)
We currently assume that the rx_len of a read command will be as
submitted, but we may have a shorter read than expected.

This change populates the output i3c xfer length from the actually-read
length.

Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Link: https://lore.kernel.org/r/f4fff7ab18dee1f662dc7a5a4111fcd921e6792b.1680156630.git.jk@codeconstruct.com.au
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/dw-i3c-master.c

index 61ad03c4c2c9889095fb0478c116e02c59898323..e95d73e715740fb3c314bfb98f84f2fab7324caa 100644 (file)
@@ -887,6 +887,13 @@ static int dw_i3c_master_priv_xfers(struct i3c_dev_desc *dev,
        if (!wait_for_completion_timeout(&xfer->comp, XFER_TIMEOUT))
                dw_i3c_master_dequeue_xfer(master, xfer);
 
+       for (i = 0; i < i3c_nxfers; i++) {
+               struct dw_i3c_cmd *cmd = &xfer->cmds[i];
+
+               if (i3c_xfers[i].rnw)
+                       i3c_xfers[i].len = cmd->rx_len;
+       }
+
        ret = xfer->ret;
        dw_i3c_master_free_xfer(xfer);