lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <bcf94732-34c2-4889-b550-76d27bd969bc@nvidia.com>
Date: Thu, 7 Mar 2024 13:43:28 +0000
From: Jon Hunter <jonathanh@...dia.com>
To: Wayne Chang <waynec@...dia.com>, thierry.reding@...il.com,
 jckuo@...dia.com, vkoul@...nel.org, kishon@...nel.org,
 gregkh@...uxfoundation.org
Cc: linux-phy@...ts.infradead.org, linux-tegra@...r.kernel.org,
 linux-kernel@...r.kernel.org, linux-usb@...r.kernel.org,
 stable@...r.kernel.org
Subject: Re: [PATCH v2 2/2] usb: gadget: tegra-xudc: Fix USB3 PHY retrieval
 logic


On 07/03/2024 03:03, Wayne Chang wrote:
> This commit resolves an issue in the tegra-xudc USB gadget driver that
> incorrectly fetched USB3 PHY instances. The problem stemmed from the
> assumption of a one-to-one correspondence between USB2 and USB3 PHY
> names and their association with physical USB ports in the device tree.
> 
> Previously, the driver associated USB3 PHY names directly with the USB3
> instance number, leading to mismatches when mapping the physical USB
> ports. For instance, if using USB3-1 PHY, the driver expect the
> corresponding PHY name as 'usb3-1'. However, the physical USB ports in
> the device tree were designated as USB2-0 and USB3-0 as we only have
> one device controller, causing a misalignment.
> 
> This commit rectifies the issue by adjusting the PHY naming logic.
> Now, the driver correctly correlates the USB2 and USB3 PHY instances,
> allowing the USB2-0 and USB3-1 PHYs to form a physical USB port pair
> while accurately reflecting their configuration in the device tree by
> naming them USB2-0 and USB3-0, respectively.
> 
> The change ensures that the PHY and PHY names align appropriately,
> resolving the mismatch between physical USB ports and their associated
> names in the device tree.
> 
> Fixes: b4e19931c98a ("usb: gadget: tegra-xudc: Support multiple device modes")
> Cc: stable@...r.kernel.org
> Signed-off-by: Wayne Chang <waynec@...dia.com>
> ---
> V1 -> V2:no change
>   drivers/usb/gadget/udc/tegra-xudc.c | 39 ++++++++++++++++++-----------
>   1 file changed, 25 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/usb/gadget/udc/tegra-xudc.c b/drivers/usb/gadget/udc/tegra-xudc.c
> index cb85168fd00c..7aa46d426f31 100644
> --- a/drivers/usb/gadget/udc/tegra-xudc.c
> +++ b/drivers/usb/gadget/udc/tegra-xudc.c
> @@ -3491,8 +3491,8 @@ static void tegra_xudc_device_params_init(struct tegra_xudc *xudc)
>   
>   static int tegra_xudc_phy_get(struct tegra_xudc *xudc)
>   {
> -	int err = 0, usb3;
> -	unsigned int i;
> +	int err = 0, usb3_companion_port;
> +	unsigned int i, j;
>   
>   	xudc->utmi_phy = devm_kcalloc(xudc->dev, xudc->soc->num_phys,
>   					   sizeof(*xudc->utmi_phy), GFP_KERNEL);
> @@ -3520,7 +3520,7 @@ static int tegra_xudc_phy_get(struct tegra_xudc *xudc)
>   		if (IS_ERR(xudc->utmi_phy[i])) {
>   			err = PTR_ERR(xudc->utmi_phy[i]);
>   			dev_err_probe(xudc->dev, err,
> -				      "failed to get usb2-%d PHY\n", i);
> +				"failed to get PHY for phy-name usb2-%d\n", i);
>   			goto clean_up;
>   		} else if (xudc->utmi_phy[i]) {
>   			/* Get usb-phy, if utmi phy is available */
> @@ -3539,19 +3539,30 @@ static int tegra_xudc_phy_get(struct tegra_xudc *xudc)
>   		}
>   
>   		/* Get USB3 phy */
> -		usb3 = tegra_xusb_padctl_get_usb3_companion(xudc->padctl, i);
> -		if (usb3 < 0)
> +		usb3_companion_port = tegra_xusb_padctl_get_usb3_companion(xudc->padctl, i);
> +		if (usb3_companion_port < 0)
>   			continue;
>   
> -		snprintf(phy_name, sizeof(phy_name), "usb3-%d", usb3);
> -		xudc->usb3_phy[i] = devm_phy_optional_get(xudc->dev, phy_name);
> -		if (IS_ERR(xudc->usb3_phy[i])) {
> -			err = PTR_ERR(xudc->usb3_phy[i]);
> -			dev_err_probe(xudc->dev, err,
> -				      "failed to get usb3-%d PHY\n", usb3);
> -			goto clean_up;
> -		} else if (xudc->usb3_phy[i])
> -			dev_dbg(xudc->dev, "usb3-%d PHY registered", usb3);
> +		for (j = 0; j < xudc->soc->num_phys; j++) {
> +			snprintf(phy_name, sizeof(phy_name), "usb3-%d", j);
> +			xudc->usb3_phy[i] = devm_phy_optional_get(xudc->dev, phy_name);
> +			if (IS_ERR(xudc->usb3_phy[i])) {
> +				err = PTR_ERR(xudc->usb3_phy[i]);
> +				dev_err_probe(xudc->dev, err,
> +					"failed to get PHY for phy-name usb3-%d\n", j);
> +				goto clean_up;
> +			} else if (xudc->usb3_phy[i]) {
> +				int usb2_port =
> +					tegra_xusb_padctl_get_port_number(xudc->utmi_phy[i]);
> +				int usb3_port =
> +					tegra_xusb_padctl_get_port_number(xudc->usb3_phy[i]);
> +				if (usb3_port == usb3_companion_port) {
> +					dev_dbg(xudc->dev, "USB2 port %d is paired with USB3 port %d for device mode port %d\n",
> +					 usb2_port, usb3_port, i);
> +					break;
> +				}
> +			}
> +		}
>   	}
>   
>   	return err;


Reviewed-by: Jon Hunter <jonathanh@...dia.com>
Tested-by: Jon Hunter <jonathanh@...dia.com>

Thanks!

Jon

-- 
nvpublic

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ