diff mbox series

phy: tegra: xusb: Fix crash during pad power on/down

Message ID 20221010135132.30809-1-jonathanh@nvidia.com
State Accepted
Headers show
Series phy: tegra: xusb: Fix crash during pad power on/down | expand

Commit Message

Jon Hunter Oct. 10, 2022, 1:51 p.m. UTC
Commit a88520bfc0ec ("usb: gadget: tegra: Reduce pad power") added calls
to tegra_phy_xusb_utmi_pad_power_on/down in the Tegra XUDC driver to
control the pad power. This change is causing a kernel panic when
powering down the pads on entering suspend with the Jetson TX2 platform.
The panic occurs because the 'xudc->curr_utmi_phy' is not configured on
this platform and we do not check to see if the pointer is valid before
attempting to deference the pointer. Fix this by checking to see if the
'phy' pointer passed to tegra_phy_xusb_utmi_pad_power_on/down is valid.

Fixes: a88520bfc0ec ("usb: gadget: tegra: Reduce pad power")
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
---
 drivers/phy/tegra/xusb.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

Comments

Vinod Koul Oct. 17, 2022, 5:37 a.m. UTC | #1
On 10-10-22, 14:51, Jon Hunter wrote:
> Commit a88520bfc0ec ("usb: gadget: tegra: Reduce pad power") added calls
> to tegra_phy_xusb_utmi_pad_power_on/down in the Tegra XUDC driver to
> control the pad power. This change is causing a kernel panic when
> powering down the pads on entering suspend with the Jetson TX2 platform.
> The panic occurs because the 'xudc->curr_utmi_phy' is not configured on
> this platform and we do not check to see if the pointer is valid before
> attempting to deference the pointer. Fix this by checking to see if the
> 'phy' pointer passed to tegra_phy_xusb_utmi_pad_power_on/down is valid.

Applied, thanks
Jon Hunter Nov. 7, 2022, 9:27 p.m. UTC | #2
Hi Vinod,

On 17/10/2022 06:37, Vinod Koul wrote:
> On 10-10-22, 14:51, Jon Hunter wrote:
>> Commit a88520bfc0ec ("usb: gadget: tegra: Reduce pad power") added calls
>> to tegra_phy_xusb_utmi_pad_power_on/down in the Tegra XUDC driver to
>> control the pad power. This change is causing a kernel panic when
>> powering down the pads on entering suspend with the Jetson TX2 platform.
>> The panic occurs because the 'xudc->curr_utmi_phy' is not configured on
>> this platform and we do not check to see if the pointer is valid before
>> attempting to deference the pointer. Fix this by checking to see if the
>> 'phy' pointer passed to tegra_phy_xusb_utmi_pad_power_on/down is valid.
> 
> Applied, thanks
> 

We need this fix for Linux v6.1. The crash is still seen as of v6.1-rc3.

Thanks
Jon
Vinod Koul Nov. 10, 2022, 7:09 a.m. UTC | #3
On 07-11-22, 21:27, Jon Hunter wrote:
> Hi Vinod,
> 
> On 17/10/2022 06:37, Vinod Koul wrote:
> > On 10-10-22, 14:51, Jon Hunter wrote:
> > > Commit a88520bfc0ec ("usb: gadget: tegra: Reduce pad power") added calls
> > > to tegra_phy_xusb_utmi_pad_power_on/down in the Tegra XUDC driver to
> > > control the pad power. This change is causing a kernel panic when
> > > powering down the pads on entering suspend with the Jetson TX2 platform.
> > > The panic occurs because the 'xudc->curr_utmi_phy' is not configured on
> > > this platform and we do not check to see if the pointer is valid before
> > > attempting to deference the pointer. Fix this by checking to see if the
> > > 'phy' pointer passed to tegra_phy_xusb_utmi_pad_power_on/down is valid.
> > 
> > Applied, thanks
> > 
> 
> We need this fix for Linux v6.1. The crash is still seen as of v6.1-rc3.

This is in phy/fixes so should be in v6.1 or in linus's tree shortly
diff mbox series

Patch

diff --git a/drivers/phy/tegra/xusb.c b/drivers/phy/tegra/xusb.c
index 95091876c422..dce45fbbd699 100644
--- a/drivers/phy/tegra/xusb.c
+++ b/drivers/phy/tegra/xusb.c
@@ -1461,8 +1461,14 @@  EXPORT_SYMBOL_GPL(tegra_phy_xusb_utmi_port_reset);
 
 void tegra_phy_xusb_utmi_pad_power_on(struct phy *phy)
 {
-	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
-	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
+	struct tegra_xusb_lane *lane;
+	struct tegra_xusb_padctl *padctl;
+
+	if (!phy)
+		return;
+
+	lane = phy_get_drvdata(phy);
+	padctl = lane->pad->padctl;
 
 	if (padctl->soc->ops->utmi_pad_power_on)
 		padctl->soc->ops->utmi_pad_power_on(phy);
@@ -1471,8 +1477,14 @@  EXPORT_SYMBOL_GPL(tegra_phy_xusb_utmi_pad_power_on);
 
 void tegra_phy_xusb_utmi_pad_power_down(struct phy *phy)
 {
-	struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
-	struct tegra_xusb_padctl *padctl = lane->pad->padctl;
+	struct tegra_xusb_lane *lane;
+	struct tegra_xusb_padctl *padctl;
+
+	if (!phy)
+		return;
+
+	lane = phy_get_drvdata(phy);
+	padctl = lane->pad->padctl;
 
 	if (padctl->soc->ops->utmi_pad_power_down)
 		padctl->soc->ops->utmi_pad_power_down(phy);