[PATCH v2 2/3] phy: renesas: rcar-gen2: Return -EINVAL for out-of-range channel reg

sashiko-bot at kernel.org sashiko-bot at kernel.org
Tue Aug 4 08:49:30 PDT 2026


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

Pre-existing issues:
- [High] Pointer to device node 'np' is stored in 'channel->of_node' without holding a reference, leading to a dangling pointer.
- [High] Race condition in probe: PHY provider is registered before driver data is set.
- [High] The return value of clk_prepare_enable() is ignored, leading to a potential system lockup if the clock fails to enable.
- [Medium] Holding a spinlock with interrupts disabled for 340 microseconds violates kernel latency constraints.
--

--- Patch [2]: [PATCH v2 2/3] phy: renesas: rcar-gen2: Return -EINVAL for out-of-range channel reg ---
commit b403c6500188baed7349ae963beab9f0eda61eb2
Author: Felix Gu <ustc.gu at gmail.com>

    phy: renesas: rcar-gen2: Return -EINVAL for out-of-range channel reg
    
    When of_property_read_u32() succeeds but channel_num exceeds
    data->num_channels, rcar_gen2_phy_probe() returns error which is 0,
    so probe reports success even though no PHY provider is registered.
    
    Return -EINVAL in that case.
    
    Fixes: 1233f59f745b ("phy: Renesas R-Car Gen2 PHY driver")
    Signed-off-by: Felix Gu <ustc.gu at gmail.com>

> diff --git a/drivers/phy/renesas/phy-rcar-gen2.c b/drivers/phy/renesas/phy-rcar-gen2.c
> index 5a272e25e051c..b18727ed41a10 100644
> --- a/drivers/phy/renesas/phy-rcar-gen2.c
> +++ b/drivers/phy/renesas/phy-rcar-gen2.c
> @@ -390,7 +390,7 @@ static int rcar_gen2_phy_probe(struct platform_device *pdev)
>  		error = of_property_read_u32(np, "reg", &channel_num);
>  		if (error || channel_num >= data->num_channels) {
>  			dev_err(dev, "Invalid \"reg\" property\n");
> -			return error;
> +			return error ?: -EINVAL;
>  		}
>  		channel->select_mask = select_mask[channel_num];
>  

While reviewing this patch, I noticed a few pre-existing issues in this file
that might be worth addressing:

In rcar_gen2_phy_probe():

> 	for_each_child_of_node_scoped(dev->of_node, np) {
> 		struct rcar_gen2_channel *channel = drv->channels + i;
> 		u32 channel_num;
> 		int error, n;
> 
> 		channel->of_node = np;

[Severity: High]
This isn't a bug introduced by this patch, but the device node pointer 'np' is
assigned to the persistent channel structure without taking a reference.
Since 'for_each_child_of_node_scoped' automatically drops the reference on loop
exit, does this leave a dangling pointer in 'channel->of_node'? Later,
rcar_gen2_phy_xlate() compares 'np == drv->channels[i].of_node', which might
lead to an ABA problem if the node is freed and reallocated. Should we call
of_node_get() here?

Later in rcar_gen2_phy_probe():

> 	provider = devm_of_phy_provider_register(dev, rcar_gen2_phy_xlate);
> 	if (IS_ERR(provider)) {
> 		dev_err(dev, "Failed to register PHY provider\n");
> 		return PTR_ERR(provider);
> 	}
> 
> 	dev_set_drvdata(dev, drv);

[Severity: High]
This is also a pre-existing issue, but is there a race condition here during
probe? We register the PHY provider and expose it to consumers before we
initialize the driver data with dev_set_drvdata(). If a consumer driver tries
to acquire the PHY right after devm_of_phy_provider_register(),
rcar_gen2_phy_xlate() could execute, call dev_get_drvdata(), and receive NULL.

In rcar_gen2_phy_init():

> 	clk_prepare_enable(drv->clk);
> 
> 	spin_lock_irqsave(&drv->lock, flags);
> 	ugctrl2 = readl(drv->base + USBHS_UGCTRL2);

[Severity: High]
This is a pre-existing issue, but does this code need to check the return value
of clk_prepare_enable()? If the clock fails to enable, we proceed to
immediately access the hardware registers which could lock up the system or
cause a synchronous external abort.

In rz_g1c_phy_power_on():

> 	spin_lock_irqsave(&drv->lock, flags);
> 
> 	/* Power on USBHS PHY */
> 	value = readl(base + USBHS_UGCTRL);
> 	value &= ~USBHS_UGCTRL_PLLRESET;
> 	writel(value, base + USBHS_UGCTRL);
> 
> 	/* As per the data sheet wait 340 micro sec for power stable */
> 	udelay(340);

[Severity: Medium]
This is a pre-existing issue, but is it safe to hold a spinlock with
interrupts disabled for 340 microseconds here? This seems like it would
severely impact system latency, potentially causing missed interrupts.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260804-rcar-gen2-v2-0-829cb84112ca@gmail.com?part=2



More information about the linux-phy mailing list