All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Elson Serrao" <elson.serrao@oss.qualcomm.com>
Cc: robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH v7 7/8] usb: misc: qcom_eud: fix virtual attach/detach event handling
Date: Mon, 31 Aug 2026 03:17:21 +0000	[thread overview]
Message-ID: <20260831031722.446311F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260831030147.1500616-8-elson.serrao@oss.qualcomm.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

Pre-existing issues:
- [High] This problem wasn't introduced by this patch, but registration of the USB role switch occurs before hardware resources are mapped, exposing uninitialized state during probe and creating a use-after-unmap vulnerability during driver removal.
- [High] This problem wasn't introduced by this patch, but the primary interrupt handler sleeps in atomic context and fails to handle simultaneous interrupts, leading to IRQ storms and kernel panics.
--

commit 67f0b0cd525e7084b985eee06acbfa51320d857a
Author: Elson Serrao <elson.serrao@oss.qualcomm.com>

usb: misc: qcom_eud: fix virtual attach/detach event handling

EUD provides virtual USB attach/detach events to simulate cable
plug/unplug while maintaining the physical debug connection. However,
the current implementation incorrectly sets the USB role to HOST on
virtual detach, which doesn't represent the disconnected state.

> diff --git a/drivers/usb/misc/qcom_eud.c b/drivers/usb/misc/qcom_eud.c
> index 549c0d852bbba..605f675ec7dd0 100644
> --- a/drivers/usb/misc/qcom_eud.c
> +++ b/drivers/usb/misc/qcom_eud.c
> @@ -306,10 +306,26 @@ static irqreturn_t handle_eud_irq_thread(int irq, void *data)
>  
>  	path = chip->paths[chip->port_idx];
>  
> +	/*
> +	 * EUD virtual attach/detach event handling for low power debugging:
> +	 *
> +	 * When EUD is enabled in debug mode, the device remains physically
> +	 * connected to the PC throughout the debug session, keeping the USB
> +	 * controller active. This prevents testing of low power scenarios that
> +	 * require USB disconnection.
> +	 *
> +	 * EUD solves this by providing virtual USB attach/detach events while
> +	 * maintaining the physical connection. These events are triggered from
> +	 * the Host PC via the enumerated EUD control interface and delivered
> +	 * to the EUD driver as interrupts.
> +	 *
> +	 * These notifications are forwarded to the USB controller through role
> +	 * switch framework.
> +	 */
>  	if (chip->usb_attached)
>  		ret = usb_role_switch_set_role(path->controller_sw, USB_ROLE_DEVICE);
>  	else
> -		ret = usb_role_switch_set_role(path->controller_sw, USB_ROLE_HOST);
> +		ret = usb_role_switch_set_role(path->controller_sw, USB_ROLE_NONE);
>  	if (ret)
>  		dev_err(chip->dev, "failed to set role switch\n");
>  

[Severity: High]
This isn't a bug introduced by this patch, but looking at eud_probe()
further down in the same file, the USB role switch is registered before
hardware resources are mapped:

drivers/usb/misc/qcom_eud.c:eud_probe() {
    ...
	for_each_child_of_node_scoped(np, child) {
		ret = eud_init_path(chip, child);
		if (ret)
			return ret;
	}

	/* Primary path is mandatory. Secondary is optional */
	if (!chip->paths[0])
		return dev_err_probe(chip->dev, -ENODEV, "primary path not found\n");

	chip->base = devm_platform_ioremap_resource(pdev, 0);
    ...
}

Does this expose uninitialized state during probe and create a use-after-unmap
vulnerability during driver removal?

If devm_platform_ioremap_resource() fails during probe, or during driver
removal, chip->base is unmapped before the USB role switch is unregistered
because devm actions execute in reverse order.

If the role switch receives an event (e.g., from userspace via sysfs) in this
window, eud_role_switch_set() calls enable_eud() or disable_eud(), which
access the unmapped chip->base memory.


[Severity: High]
This is a pre-existing issue, but the primary interrupt handler
handle_eud_irq() sleeps in atomic context and fails to handle
simultaneous interrupts:

drivers/usb/misc/qcom_eud.c:handle_eud_irq() {
    ...
	switch (reg & EUD_INT_ALL) {
	case EUD_INT_VBUS:
		usb_attach_detach(chip);
		return IRQ_WAKE_THREAD;
	case EUD_INT_SAFE_MODE:
		pet_eud(chip);
		return IRQ_HANDLED;
	default:
		return IRQ_NONE;
	}
    ...
}

If both EUD_INT_VBUS and EUD_INT_SAFE_MODE bits are asserted, does the bitwise
AND operation evaluate to 0x14, bypassing the handlers and dropping both
interrupts?

Additionally, when EUD_INT_SAFE_MODE fires, handle_eud_irq() calls pet_eud():

drivers/usb/misc/qcom_eud.c:pet_eud() {
    ...
		/* Delay to make sure detach pet is done before attach pet */
		ret = readl_poll_timeout(chip->base + EUD_REG_SW_ATTACH_DET,
					reg, (reg == 0), 1, 100);
    ...
}

Does this readl_poll_timeout() macro call usleep_range() inside the hard IRQ
context? Should it use readl_poll_timeout_atomic() instead?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260831030147.1500616-1-elson.serrao@oss.qualcomm.com?part=7

  reply	other threads:[~2026-08-31  3:17 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-31  3:01 [PATCH v7 0/8] Improve Qualcomm EUD driver and platform support Elson Serrao
2026-08-31  3:01 ` [PATCH v7 1/8] dt-bindings: soc: qcom: eud: Add per-path child nodes for UTMI routing Elson Serrao
2026-08-31  3:09   ` sashiko-bot
2026-08-31 22:39   ` Bjorn Andersson
2026-08-31  3:01 ` [PATCH v7 2/8] usb: misc: qcom_eud: add sysfs attribute for port selection Elson Serrao
2026-08-31  3:12   ` sashiko-bot
2026-08-31  3:01 ` [PATCH v7 3/8] usb: misc: qcom_eud: add per-path High-Speed PHY control Elson Serrao
2026-08-31  3:15   ` sashiko-bot
2026-08-31  3:01 ` [PATCH v7 4/8] usb: misc: qcom_eud: add per-path role switch support Elson Serrao
2026-08-31  3:17   ` sashiko-bot
2026-08-31  3:01 ` [PATCH v7 5/8] usb: misc: qcom_eud: improve enable_store API Elson Serrao
2026-08-31  3:13   ` sashiko-bot
2026-08-31  3:01 ` [PATCH v7 6/8] usb: misc: qcom_eud: add role-based EUD control Elson Serrao
2026-08-31  3:13   ` sashiko-bot
2026-09-01 11:36   ` Konrad Dybcio
2026-09-10  1:37     ` Elson Serrao
2026-08-31  3:01 ` [PATCH v7 7/8] usb: misc: qcom_eud: fix virtual attach/detach event handling Elson Serrao
2026-08-31  3:17   ` sashiko-bot [this message]
2026-08-31  3:01 ` [PATCH v7 8/8] arm64: dts: qcom: kodiak: Desribe EUD UTMI routing and connector mapping Elson Serrao

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=20260831031722.446311F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=elson.serrao@oss.qualcomm.com \
    --cc=robh@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.