drivers/i3c/master/svc-i3c-master.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
From: Stanley Chu <yschu@nuvoton.com>
Some drivers, such as mctp-i3c.c, reuse the i3c_priv_xfer.len as
the actual read len. Therefore, the controller driver should also
update the i3c_priv_xfer.len after the read transfer is completed.
Signed-off-by: Stanley Chu <yschu@nuvoton.com>
---
drivers/i3c/master/svc-i3c-master.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c
index 85e16de208d3..dd520f5d4c9f 100644
--- a/drivers/i3c/master/svc-i3c-master.c
+++ b/drivers/i3c/master/svc-i3c-master.c
@@ -1470,9 +1470,16 @@ static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *master)
cmd->len, &cmd->actual_len,
cmd->continued);
/* cmd->xfer is NULL if I2C or CCC transfer */
- if (cmd->xfer)
+ if (cmd->xfer) {
cmd->xfer->actual_len = cmd->actual_len;
+ /*
+ * Some i3c drivers reuse i3c_priv_xfer.len as
+ * the actual read length.
+ */
+ cmd->xfer->len = cmd->actual_len;
+ }
+
if (ret)
break;
}
--
2.34.1
On Tue, Apr 01, 2025 at 02:34:06PM +0800, Stanley Chu wrote:
> From: Stanley Chu <yschu@nuvoton.com>
>
> Some drivers, such as mctp-i3c.c, reuse the i3c_priv_xfer.len as
In include/linux/i3c/device.h define API as
/**
* struct i3c_priv_xfer - I3C SDR private transfer
...
* @len: transfer length in bytes of the transfer
* @actual_len: actual length in bytes are transferred by the controller
...
*/
struct i3c_priv_xfer {
...
u16 len;
u16 actual_len;
...
};
You should fix mctp-i3c.c or need change API defination firstly.
Frank
> the actual read len. Therefore, the controller driver should also
> update the i3c_priv_xfer.len after the read transfer is completed.
>
> Signed-off-by: Stanley Chu <yschu@nuvoton.com>
> ---
> drivers/i3c/master/svc-i3c-master.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c
> index 85e16de208d3..dd520f5d4c9f 100644
> --- a/drivers/i3c/master/svc-i3c-master.c
> +++ b/drivers/i3c/master/svc-i3c-master.c
> @@ -1470,9 +1470,16 @@ static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *master)
> cmd->len, &cmd->actual_len,
> cmd->continued);
> /* cmd->xfer is NULL if I2C or CCC transfer */
> - if (cmd->xfer)
> + if (cmd->xfer) {
> cmd->xfer->actual_len = cmd->actual_len;
>
> + /*
> + * Some i3c drivers reuse i3c_priv_xfer.len as
> + * the actual read length.
> + */
> + cmd->xfer->len = cmd->actual_len;
> + }
> +
> if (ret)
> break;
> }
> --
> 2.34.1
>
© 2016 - 2025 Red Hat, Inc.