Re: [PATCH] phy: sunplus: fix crash when the disc_vol nvmem cell is missing

Vinod Koul <[email protected]>
Newsgroups org.infradead.lists.linux-phy,org.kernel.vger.linux-kernel,org.kernel.vger.linux-usb
Message-ID <anRgefttPEDmKzjm@vaman>
On 04-08-26, 21:58, Felix Gu wrote:

Where is the crash report?
Patch title should document the change not the reason, please read the
documentation on how to create patches

> nvmem_cell_get() can fail with errors other than -EPROBE_DEFER, but
> update_disc_vol() only handled -EPROBE_DEFER and then called
> nvmem_cell_read() with the error pointer, crashing the kernel.
> 
> Fall back to the default disconnect voltage on a failed cell lookup,
> and free the buffer returned by nvmem_cell_read().
> 
> Fixes: 99d9ccd97385 ("phy: usb: Add USB2.0 phy driver for Sunplus SP7021")
> Signed-off-by: Felix Gu <[email protected]>
> ---
>  drivers/phy/sunplus/phy-sunplus-usb2.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/phy/sunplus/phy-sunplus-usb2.c b/drivers/phy/sunplus/phy-sunplus-usb2.c
> index 637a5fbae6d9..94146118e9c2 100644
> --- a/drivers/phy/sunplus/phy-sunplus-usb2.c
> +++ b/drivers/phy/sunplus/phy-sunplus-usb2.c
> @@ -81,12 +81,13 @@ static int update_disc_vol(struct sp_usbphy *usbphy)
>  	char *disc_name = "disc_vol";
>  	ssize_t otp_l = 0;
>  	char *otp_v;
> -	u32 val, set;
> +	u32 val, set = OTP_DISC_LEVEL_DEFAULT;
>  
>  	cell = nvmem_cell_get(usbphy->dev, disc_name);
> -	if (IS_ERR_OR_NULL(cell)) {
> +	if (IS_ERR(cell)) {
>  		if (PTR_ERR(cell) == -EPROBE_DEFER)
>  			return -EPROBE_DEFER;
> +		goto out;
>  	}
>  
>  	otp_v = nvmem_cell_read(cell, &otp_l);
> @@ -96,11 +97,12 @@ static int update_disc_vol(struct sp_usbphy *usbphy)
>  		set = *(otp_v + 1);
>  		set = (set << (sizeof(char) * 8)) | *otp_v;
>  		set = (set >> usbphy->disc_vol_addr_off) & J_DISC;
> +		if (set == 0)
> +			set = OTP_DISC_LEVEL_DEFAULT;
> +		kfree(otp_v);
>  	}
>  
> -	if (IS_ERR(otp_v) || set == 0)
> -		set = OTP_DISC_LEVEL_DEFAULT;
> -
> +out:
>  	val = readl(usbphy->phy_regs + CONFIG7);
>  	val = (val & ~J_DISC) | set;
>  	writel(val, usbphy->phy_regs + CONFIG7);
> 
> ---
> base-commit: 9a4cdc958dd79fc6c3b20b51a10debec6ca09fec
> change-id: 20260804-sunplus-53a7bb1bcd72
> 
> Best regards,
> --  
> Felix Gu <[email protected]>

-- 
~Vinod

-- 
linux-phy mailing list
[email protected]
https://lists.infradead.org/mailman/listinfo/linux-phy
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.