Re: [PATCH v2] drvier: usb: dwc3: Fix runtime PM trying to activate child device xxx.dwc3 but parent is not active

ryan zhou
2025-09-11T13:26:03Z

Greg KH <gregkh@linuxfoundation.org> 于2025年9月10日周三 21:07写道：
>
> On Wed, Sep 10, 2025 at 08:56:36PM +0800, ryan zhou wrote:
> > Hi Greg KH,
> > Sorry, I didn't understand your question. Are you asking for my patch
> > commit ID? I've resubmitted patch v3, and the commit details are as
> > follows:
> >
> > commit 92bc5086f53404f6d14d8550209d1c8cd3fa9036 (HEAD -> usb-next-develop)
> >
> > Or do you need the commit that introduced this issue?
>
> Sorry, I mean "what commit does this fix", so that you can add a
> "Fixes:" tag to it.

I initially targeted these two issues:
commit1： 0227cc84c44417a29c8102e41db8ec2c11ebc6b2
usb: dwc3: core: don't do suspend for device mode if already suspended
commit2： 68c26fe58182f5af56bfa577d1cc0c949740baab
usb: dwc3: set pm runtime active before resume common

When the DWC3 controller is in a runtime suspend state, an interruption occurs
during the system sleep transition, resulting in USB failure to resume
properly after wakeup.
The detailed sequence is as follows:（refer to commit e3a9bd247cddf
merged by Ray Chi）
EX.
RPM suspend: ... -> dwc3_runtime_suspend()
-> rpm_suspend() of parent device
...
PM suspend: ... -> dwc3_suspend() -> pm_suspend of parent device
^ interrupt, so resume suspended device
... <- dwc3_resume() <-/
^ pm_runtime_set_active() returns erro

Post-analysis reveals:
‌Commit 2‌ generates unexpected error logs ( runtime PM trying to
activate child device xxx.dwc3 but parent is not active).
‌Commit 1‌ disrupts USB recovery in this context, attributable to
the following factors:

EX.
RPM suspend: ... -> dwc3_runtime_suspend()
-> rpm_suspend() of parent device
...

PM suspend: ... -> dwc3_suspend()
|___dwc3_suspend_common()
^ if
(pm_runtime_suspended(dwc->dev)) then skip suspend process
|___dwc3_core_exit()
|___dwc3_phy_exit()
PM resume ... <- dwc3_resume()
|___dwc3_resume_common()
^ pm_runtime_set_active()
report error(error logs : runtime PM trying to activate child device
xxx.dwc3 but parent is not active).
|___dwc3_core_init_for_resume()
|___dwc3_core_init()
|___dwc3_phy_init()
^ phy->init_count++ and
phy->power_count++
... Next,usb connect (Note: dwc3 is always in runtime suspend)
RPM resume ... <- dwc3_runtime_resume()
|___dwc3_resume_common()
|___dwc3_core_init_for_resume()
|___dwc3_core_init()
|___dwc3_phy_init()
^PHY reinitialization is
prevented due to non-zero values in phy->init_count and phy->power_on.

However, during my submission process, I found that Ray Chi
encountered the same issue and has already merged commit e3a9bd247cddf
(usb: dwc3:
Skip resume if pm_runtime_set_active() fails), which fixed the problem
introduced by commit 2. But the error logs (runtime PM trying to
activate child
device xxx.dwc3 but parent is not active) introduced by commit 1 still remains.
I will now evaluate whether to proceed with further fixes for the
issue introduced by commit 1, based on Ray Chi's submission. And also
I will incorporate
the relevant background details in the subsequent commit.In my view,
commit e3a9bd247cddf (usb: dwc3:Skip resume if pm_runtime_set_active()
fails)
appears to be more of a workaround solution.

thanks,

Ryan