Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Shawn Guo" <shengchao.guo@oss.qualcomm.com>
Cc: robh@kernel.org, devicetree@vger.kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v3 2/2] usb: typec: Add onsemi FUSB15201 driver
Date: Wed, 16 Sep 2026 14:10:07 +0000	[thread overview]
Message-ID: <20260916141008.49BDB1F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260916135918.1017527-3-shengchao.guo@oss.qualcomm.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] usb: typec: fusb15201: unhandled interrupt bits cause interrupt storm
- [Medium] usb: typec: fusb15201: data race in probe allows spurious -ENOTCONN
--

commit d7feaab14acc6ee944a785f261bfb7dd837de605
Author: Shawn Guo <shengchao.guo@oss.qualcomm.com>

usb: typec: Add onsemi FUSB15201 driver

The FUSB15201 is a dual-port USB Type-C and Power Delivery controller. This
driver handles Type-C detection, registers a Type-C port for each connector,
and forwards role swaps to the controller.

> diff --git a/drivers/usb/typec/fusb15201.c b/drivers/usb/typec/fusb15201.c
> new file mode 100644
> index 0000000000000..ab3b07368bdf1
> --- /dev/null
> +++ b/drivers/usb/typec/fusb15201.c
[ ... ]
> +static irqreturn_t fusb15201_irq(int irq, void *data)
> +{
[ ... ]
> +	for (i = 0; i < FUSB15201_NUM_PORTS; i++) {
> +		struct fusb15201_port *port = &chip->ports[i];
> +		unsigned int pending;
> +
> +		if (!port->port)
> +			continue;
> +
> +		if (regmap_read(chip->regmap, FUSB15201_REG_INTERRUPT(i), &pending))
> +			continue;
> +
> +		pending &= FUSB15201_INT_ALL;
> +		if (!pending)
> +			continue;
> +
> +		/* Write one to clear */
> +		regmap_write(chip->regmap, FUSB15201_REG_INTERRUPT(i), pending);

[Severity: High]
Could masking the pending interrupts before writing back cause an interrupt
storm?

If the hardware asserts any bit outside of FUSB15201_INT_ALL (such as a
reserved bit or a new status bit in newer firmware), the driver masks it out
and writes 0 for that bit, failing to clear it. 

If only unknown bits are asserted, pending becomes 0, and the handler returns
IRQ_NONE without clearing anything. The unhandled interrupt will then fire
continuously and lock up the CPU.

[ ... ]
> +static int fusb15201_hw_init(struct fusb15201 *chip)
> +{
[ ... ]
> +	for (i = 0; i < FUSB15201_NUM_PORTS; i++) {
> +		struct fusb15201_port *port = &chip->ports[i];
[ ... ]
> +		/* Discard anything that happened before we got here */
> +		ret = regmap_write(chip->regmap, FUSB15201_REG_INTERRUPT(i),
> +				   FUSB15201_INT_ALL);

[Severity: High]
Similar to the interrupt handler, this only clears known bits. Will any
pre-existing unhandled bits remain asserted and immediately trigger an
interrupt storm once the IRQ is requested?

Should this write a full mask to clear any unexpected bits during
initialization?

[ ... ]
> +	/* Seed the Type-C class with the current state before arming the IRQ */
> +	for (i = 0; i < FUSB15201_NUM_PORTS; i++) {
> +		if (chip->ports[i].port)
> +			fusb15201_hw_update(&chip->ports[i]);
> +	}
> +
> +	return 0;
> +}

[Severity: Medium]
Can this lockless initialization race with sysfs commands?

Because typec_register_port() is called before fusb15201_hw_init() in probe,
sysfs attributes and uevents are already active. When fusb15201_hw_update()
is called locklessly here, it invokes typec_register_partner(), which can
trigger additional uevents before port->status is updated.

If userspace reacts to these uevents and requests a data or power role swap,
fusb15201_command() will acquire chip->lock and read port->status. Since
this hardware update does not hold the lock, fusb15201_command() could observe
a stale port->status == 0 and spuriously reject the valid swap request with
-ENOTCONN.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260916135918.1017527-1-shengchao.guo@oss.qualcomm.com?part=2

  reply	other threads:[~2026-09-16 14:10 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-16 13:59 [PATCH v3 0/2] usb: typec: Add onsemi FUSB15201 support Shawn Guo
2026-09-16 13:59 ` [PATCH v3 1/2] dt-bindings: usb: Add onsemi FUSB15201 Type-C and PD controller Shawn Guo
2026-09-16 13:59 ` [PATCH v3 2/2] usb: typec: Add onsemi FUSB15201 driver Shawn Guo
2026-09-16 14:10   ` sashiko-bot [this message]
2026-09-18  9:43   ` Heikki Krogerus
2026-10-03  4:22 ` [PATCH v3 0/2] usb: typec: Add onsemi FUSB15201 support Shawn Guo

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=20260916141008.49BDB1F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=shengchao.guo@oss.qualcomm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox