From: sashiko-bot@kernel.org
To: "Claudiu Beznea" <claudiu.beznea@tuxon.dev>
Cc: "Alexandre Belloni" <alexandre.belloni@bootlin.com>,
wsa+renesas@sang-engineering.com, linux-i3c@lists.infradead.org,
Frank.Li@kernel.org
Subject: Re: [PATCH v5 10/17] i3c: renesas: Return immediately if there is no transfer
Date: Mon, 13 Jul 2026 14:04:13 +0000 [thread overview]
Message-ID: <20260713140414.79E9F1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260713130545.568657-11-claudiu.beznea+renesas@tuxon.dev>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
Pre-existing issues:
- [High] The driver ignores the return value of wait_for_completion_timeout() during I2C transfers, leading to data races and hardware state corruption.
- [High] The driver unconditionally returns success in I3C transfers regardless of hardware errors or timeouts.
- [High] A timeout during Dynamic Address Assignment (DAA) causes the driver to incorrectly register phantom devices.
- [High] Concurrent I3C and I2C transfers can clobber hardware registers due to missing driver-level serialization.
--
--- Patch [10]: [PATCH v5 10/17] i3c: renesas: Return immediately if there is no transfer ---
commit 10f5d1cd5ccdca9a32d38cbec0d2a0b8846661ac
Author: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
i3c: renesas: Return immediately if there is no transfer
This commit moves the check for zero transfers before allocating the transfer
structure. This avoids an unnecessary memory allocation and cleanup when there
are no transfers to process.
> diff --git a/drivers/i3c/master/renesas-i3c.c b/drivers/i3c/master/renesas-i3c.c
> index 915090d0ad37e..9a36132200342 100644
> --- a/drivers/i3c/master/renesas-i3c.c
> +++ b/drivers/i3c/master/renesas-i3c.c
> @@ -957,13 +957,13 @@ static int renesas_i3c_i2c_xfers(struct i2c_dev_desc *dev,
> u8 start_bit = CNDCTL_STCND;
> int i;
>
> + if (!i2c_nxfers)
> + return 0;
> +
> struct renesas_i3c_xfer *xfer __free(kfree) = renesas_i3c_alloc_xfer(i3c, 1);
> if (!xfer)
> return -ENOMEM;
>
> - if (!i2c_nxfers)
> - return 0;
> -
> renesas_i3c_bus_enable(m, false);
>
> init_completion(&xfer->comp);
[Severity: High]
This is a pre-existing issue, but since you are modifying renesas_i3c_i2c_xfers(),
does this function fail to handle timeouts correctly?
If wait_for_completion_timeout() times out, its return value is discarded, and
cmd->err is likely 0:
drivers/i3c/master/renesas-i3c.c:renesas_i3c_i2c_xfers() {
...
wait_for_completion_timeout(&xfer->comp, m->i2c.timeout);
if (cmd->err)
break;
...
}
Will this allow the loop to proceed to the next I2C message and immediately
clobber hardware registers for a new command while the hardware might still be
processing the timed-out command?
[Severity: High]
This is a pre-existing issue, but does renesas_i3c_i2c_xfers() also lack proper
driver-level serialization?
The function enqueues the transfer but immediately starts modifying hardware
registers (like CNDCTL) without waiting for its turn in the queue:
drivers/i3c/master/renesas-i3c.c:renesas_i3c_i2c_xfers() {
...
renesas_i3c_enqueue_xfer(i3c, xfer);
for (i = 0; i < i2c_nxfers; i++) {
...
/* Issue Start condition */
renesas_set_bit(i3c->regs, CNDCTL, start_bit);
...
}
Because the I3C core relies on i3c_bus_normaluse_lock() (a read lock), multiple
transfers can be requested concurrently. Can concurrent I2C and I3C transfers
clobber hardware registers?
[Severity: High]
This is a pre-existing issue, but the same lack of serialization appears to
exist in renesas_i3c_i3c_xfers():
drivers/i3c/master/renesas-i3c.c:renesas_i3c_i3c_xfers() {
...
if (!i3c_xfers[i].rnw && i3c_xfers[i].len > 4) {
i3c_writel_fifo(i3c->regs + NTDTBP0, cmd->tx_buf, cmd->len);
if (cmd->len > NTDTBP0_DEPTH * sizeof(u32))
renesas_set_bit(i3c->regs, NTIE, NTIE_TDBEIE0);
}
renesas_i3c_wait_xfer(i3c, xfer);
...
}
Since the function unconditionally writes to the hardware FIFO before calling
enqueue/wait, won't this destroy the active transfer if another thread is
currently transmitting?
[Severity: High]
This is a pre-existing issue, but does renesas_i3c_i3c_xfers() unconditionally
return success?
drivers/i3c/master/renesas-i3c.c:renesas_i3c_i3c_xfers() {
...
renesas_i3c_wait_xfer(i3c, xfer);
}
return 0;
}
The xfer->ret value populated by renesas_i3c_wait_xfer() is never checked. Will
this lead to silent failures where hardware errors (like NACK or timeouts) are
ignored?
[Severity: High]
This is a pre-existing issue, but does renesas_i3c_daa() incorrectly register
phantom devices if a timeout occurs during Dynamic Address Assignment?
If the ENTDAA command times out, cmd->rx_count remains 0 and the timeout error
in xfer->ret is ignored:
drivers/i3c/master/renesas-i3c.c:renesas_i3c_daa() {
...
newdevs = GENMASK(i3c->maxdevs - cmd->rx_count - 1, 0);
newdevs &= ~olddevs;
for (pos = 0; pos < i3c->maxdevs; pos++) {
if (newdevs & BIT(pos))
i3c_master_add_i3c_dev_locked(m, i3c->addrs[pos]);
...
}
Because cmd->rx_count is 0, GENMASK evaluates to all bits. Will this cause the
driver to loop over this mask and register phantom I3C devices on the bus for
every unused address slot?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260713130545.568657-1-claudiu.beznea+renesas@tuxon.dev?part=10
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
next prev parent reply other threads:[~2026-07-13 14:04 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 13:05 [PATCH v5 00/17] i3c: renesas: Suspend to RAM with power loss and runtime PM Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:05 ` [PATCH v5 01/17] i3c: renesas: Check that the transfer is valid before accessing it Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:24 ` sashiko-bot
2026-07-13 16:51 ` Frank Li
2026-07-13 16:51 ` Frank Li
2026-07-13 13:05 ` [PATCH v5 02/17] i3c: renesas: Restore STDBR and EXTBR registers on resume Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:19 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 03/17] i3c: renesas: Follow the reset deassert order used in probe Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:14 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 04/17] i3c: renesas: Reconfigure the DATBAS register on re-attach Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:05 ` [PATCH v5 05/17] i3c: renesas: Reset the controller on resume Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:35 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 06/17] i3c: renesas: Perform Dynamic Address Assignment " Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:50 ` sashiko-bot
2026-07-13 16:59 ` Frank Li
2026-07-14 9:30 ` Claudiu Beznea
2026-07-13 13:05 ` [PATCH v5 07/17] i3c: renesas: Clean DATBAS register on detach Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:45 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 08/17] i3c: renesas: Fix out-of-bounds access for newdevs mask Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:49 ` sashiko-bot
2026-07-13 17:01 ` Frank Li
2026-07-13 17:01 ` Frank Li
2026-07-13 13:05 ` [PATCH v5 09/17] i3c: renesas: Use reset_control_bulk_{assert, deassert}() Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 17:02 ` Frank Li
2026-07-13 17:02 ` Frank Li
2026-07-13 13:05 ` [PATCH v5 10/17] i3c: renesas: Return immediately if there is no transfer Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 14:04 ` sashiko-bot [this message]
2026-07-13 13:05 ` [PATCH v5 11/17] i3c: renesas: Follow a unified pattern for transfer and command initialization Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 14:09 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 12/17] i3c: renesas: Drop the explicit memset() call Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:05 ` [PATCH v5 13/17] i3c: renesas: Update HW registers after SW computations are done Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 14:10 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 14/17] i3c: renesas: Organize structures to avoid unnecessary padding Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 14:15 ` sashiko-bot
2026-07-13 13:05 ` [PATCH v5 15/17] i3c: renesas: Use the "dev_name:irq_name" format for the interrupt name Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:05 ` [PATCH v5 16/17] i3c: renesas: Drop unnecessary tab Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 13:05 ` [PATCH v5 17/17] i3c: renesas: Add runtime PM support Claudiu Beznea
2026-07-13 13:05 ` Claudiu Beznea
2026-07-13 14:33 ` sashiko-bot
2026-07-13 17:26 ` [PATCH v5 00/17] i3c: renesas: Suspend to RAM with power loss and runtime PM Tommaso Merciai
2026-07-13 17:26 ` Tommaso Merciai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260713140414.79E9F1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=Frank.Li@kernel.org \
--cc=alexandre.belloni@bootlin.com \
--cc=claudiu.beznea@tuxon.dev \
--cc=linux-i3c@lists.infradead.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=wsa+renesas@sang-engineering.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.