linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
@ 2021-01-08  1:51 John Stultz
  2021-01-08  1:51 ` [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide John Stultz
  2021-01-08 12:25 ` [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD Felipe Balbi
  0 siblings, 2 replies; 21+ messages in thread
From: John Stultz @ 2021-01-08  1:51 UTC (permalink / raw)
  To: lkml
  Cc: Yu Chen, Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Thinh Nguyen, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, linux-usb,
	John Stultz

From: Yu Chen <chenyu56@huawei.com>

Just resending this, as discussion died out a bit and I'm not
sure how to make further progress. See here for debug data that
was requested last time around:
  https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/

With the current dwc3 code on the HiKey960 we often see the
COREIDLE flag get stuck off in __dwc3_gadget_start(), which
seems to prevent the reset irq and causes the USB gadget to
fail to initialize.

We had seen occasional initialization failures with older
kernels but with recent 5.x era kernels it seemed to be becoming
much more common, so I dug back through some older trees and
realized I dropped this quirk from Yu Chen during upstreaming
as I couldn't provide a proper rational for it and it didn't
seem to be necessary. I now realize I was wrong.

After resubmitting the quirk, Thinh Nguyen pointed out that it
shouldn't be a quirk at all and it is actually mentioned in the
programming guide that it should be done when switching modes
in DRD.

So, to avoid these !COREIDLE lockups seen on HiKey960, this
patch issues GCTL soft reset when switching modes if the
controller is in DRD mode.

Cc: Felipe Balbi <balbi@kernel.org>
Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
Cc: Yang Fei <fei.yang@intel.com>
Cc: YongQin Liu <yongqin.liu@linaro.org>
Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Cc: Thinh Nguyen <thinhn@synopsys.com>
Cc: Jun Li <lijun.kernel@gmail.com>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org
Signed-off-by: Yu Chen <chenyu56@huawei.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
v2:
* Rework to always call the GCTL soft reset in DRD mode,
  rather then using a quirk as suggested by Thinh Nguyen

v3:
* Move GCTL soft reset under the spinlock as suggested by
  Thinh Nguyen
---
 drivers/usb/dwc3/core.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 841daec70b6e..b6a6b90eb2d5 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -114,10 +114,24 @@ void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode)
 	dwc->current_dr_role = mode;
 }
 
+static void dwc3_gctl_core_soft_reset(struct dwc3 *dwc)
+{
+	int reg;
+
+	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
+	reg |= (DWC3_GCTL_CORESOFTRESET);
+	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
+
+	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
+	reg &= ~(DWC3_GCTL_CORESOFTRESET);
+	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
+}
+
 static void __dwc3_set_mode(struct work_struct *work)
 {
 	struct dwc3 *dwc = work_to_dwc(work);
 	unsigned long flags;
+	int hw_mode;
 	int ret;
 	u32 reg;
 
@@ -156,6 +170,11 @@ static void __dwc3_set_mode(struct work_struct *work)
 
 	spin_lock_irqsave(&dwc->lock, flags);
 
+	/* Execute a GCTL Core Soft Reset when switch mode in DRD*/
+	hw_mode = DWC3_GHWPARAMS0_MODE(dwc->hwparams.hwparams0);
+	if (hw_mode == DWC3_GHWPARAMS0_MODE_DRD)
+		dwc3_gctl_core_soft_reset(dwc);
+
 	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
 
 	spin_unlock_irqrestore(&dwc->lock, flags);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2021-01-08  1:51 [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD John Stultz
@ 2021-01-08  1:51 ` John Stultz
  2021-03-06  9:00   ` Wesley Cheng
  2021-01-08 12:25 ` [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD Felipe Balbi
  1 sibling, 1 reply; 21+ messages in thread
From: John Stultz @ 2021-01-08  1:51 UTC (permalink / raw)
  To: lkml
  Cc: John Stultz, Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Thinh Nguyen, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, linux-usb

In reviewing the previous patch, Thinh Nguyen pointed out that
the DRD mode change sequence should be like the following when
switching from host -> device according to the programming guide
(for all DRD IPs):
1. Reset controller with GCTL.CoreSoftReset
2. Set GCTL.PrtCapDir(device)
3. Soft reset with DCTL.CSftRst
4. Then follow up with the initializing registers sequence

The current code does:
a. Soft reset with DCTL.CSftRst on driver probe
b. Reset controller with GCTL.CoreSoftReset (added in previous
   patch)
c. Set GCTL.PrtCapDir(device)
d. < missing DCTL.CSftRst >
e. Then follow up with initializing registers sequence

So this patch adds the DCTL.CSftRst soft reset that was currently
missing from the dwc3 mode switching.

Cc: Felipe Balbi <balbi@kernel.org>
Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
Cc: Yang Fei <fei.yang@intel.com>
Cc: YongQin Liu <yongqin.liu@linaro.org>
Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Cc: Thinh Nguyen <thinhn@synopsys.com>
Cc: Jun Li <lijun.kernel@gmail.com>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
Feedback would be appreciated. I'm a little worried I should be
conditionalizing the DCTL.CSftRst on DRD mode controllers, but
I'm really not sure what the right thing to do is for non-DRD
mode controllers.
---
 drivers/usb/dwc3/core.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index b6a6b90eb2d5..71f8b07ecb99 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -40,6 +40,8 @@
 
 #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
 
+static int dwc3_core_soft_reset(struct dwc3 *dwc);
+
 /**
  * dwc3_get_dr_mode - Validates and sets dr_mode
  * @dwc: pointer to our context structure
@@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
 
 	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
 
+	dwc3_core_soft_reset(dwc);
 	spin_unlock_irqrestore(&dwc->lock, flags);
 
 	switch (dwc->desired_dr_role) {
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-01-08  1:51 [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD John Stultz
  2021-01-08  1:51 ` [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide John Stultz
@ 2021-01-08 12:25 ` Felipe Balbi
  2021-01-08 19:18   ` John Stultz
  1 sibling, 1 reply; 21+ messages in thread
From: Felipe Balbi @ 2021-01-08 12:25 UTC (permalink / raw)
  To: John Stultz, lkml
  Cc: Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Thinh Nguyen, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, linux-usb,
	John Stultz, Heikki Krogerus, Roger Quadros


Hi,

John Stultz <john.stultz@linaro.org> writes:
> From: Yu Chen <chenyu56@huawei.com>
>
> Just resending this, as discussion died out a bit and I'm not
> sure how to make further progress. See here for debug data that
> was requested last time around:
>   https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/
>
> With the current dwc3 code on the HiKey960 we often see the
> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
> seems to prevent the reset irq and causes the USB gadget to
> fail to initialize.
>
> We had seen occasional initialization failures with older
> kernels but with recent 5.x era kernels it seemed to be becoming
> much more common, so I dug back through some older trees and
> realized I dropped this quirk from Yu Chen during upstreaming
> as I couldn't provide a proper rational for it and it didn't
> seem to be necessary. I now realize I was wrong.
>
> After resubmitting the quirk, Thinh Nguyen pointed out that it
> shouldn't be a quirk at all and it is actually mentioned in the
> programming guide that it should be done when switching modes
> in DRD.
>
> So, to avoid these !COREIDLE lockups seen on HiKey960, this
> patch issues GCTL soft reset when switching modes if the
> controller is in DRD mode.
>
> Cc: Felipe Balbi <balbi@kernel.org>
> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
> Cc: Yang Fei <fei.yang@intel.com>
> Cc: YongQin Liu <yongqin.liu@linaro.org>
> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> Cc: Thinh Nguyen <thinhn@synopsys.com>
> Cc: Jun Li <lijun.kernel@gmail.com>
> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: linux-usb@vger.kernel.org
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
> v2:
> * Rework to always call the GCTL soft reset in DRD mode,
>   rather then using a quirk as suggested by Thinh Nguyen
>
> v3:
> * Move GCTL soft reset under the spinlock as suggested by
>   Thinh Nguyen

Because this is such an invasive change, I would prefer that we get
Tested-By tags from a good fraction of the users before applying these
two changes.

-- 
balbi

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-01-08 12:25 ` [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD Felipe Balbi
@ 2021-01-08 19:18   ` John Stultz
  2021-01-09  0:44     ` Thinh Nguyen
  0 siblings, 1 reply; 21+ messages in thread
From: John Stultz @ 2021-01-08 19:18 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Thinh Nguyen, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, Linux USB List,
	Heikki Krogerus, Roger Quadros

On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>
>
> Hi,
>
> John Stultz <john.stultz@linaro.org> writes:
> > From: Yu Chen <chenyu56@huawei.com>
> >
> > Just resending this, as discussion died out a bit and I'm not
> > sure how to make further progress. See here for debug data that
> > was requested last time around:
> >   https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/
> >
> > With the current dwc3 code on the HiKey960 we often see the
> > COREIDLE flag get stuck off in __dwc3_gadget_start(), which
> > seems to prevent the reset irq and causes the USB gadget to
> > fail to initialize.
> >
> > We had seen occasional initialization failures with older
> > kernels but with recent 5.x era kernels it seemed to be becoming
> > much more common, so I dug back through some older trees and
> > realized I dropped this quirk from Yu Chen during upstreaming
> > as I couldn't provide a proper rational for it and it didn't
> > seem to be necessary. I now realize I was wrong.
> >
> > After resubmitting the quirk, Thinh Nguyen pointed out that it
> > shouldn't be a quirk at all and it is actually mentioned in the
> > programming guide that it should be done when switching modes
> > in DRD.
> >
> > So, to avoid these !COREIDLE lockups seen on HiKey960, this
> > patch issues GCTL soft reset when switching modes if the
> > controller is in DRD mode.
> >
> > Cc: Felipe Balbi <balbi@kernel.org>
> > Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
> > Cc: Yang Fei <fei.yang@intel.com>
> > Cc: YongQin Liu <yongqin.liu@linaro.org>
> > Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> > Cc: Thinh Nguyen <thinhn@synopsys.com>
> > Cc: Jun Li <lijun.kernel@gmail.com>
> > Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Cc: linux-usb@vger.kernel.org
> > Signed-off-by: Yu Chen <chenyu56@huawei.com>
> > Signed-off-by: John Stultz <john.stultz@linaro.org>
> > ---
> > v2:
> > * Rework to always call the GCTL soft reset in DRD mode,
> >   rather then using a quirk as suggested by Thinh Nguyen
> >
> > v3:
> > * Move GCTL soft reset under the spinlock as suggested by
> >   Thinh Nguyen
>
> Because this is such an invasive change, I would prefer that we get
> Tested-By tags from a good fraction of the users before applying these
> two changes.

I'm happy to reach out to folks to try to get that. Though I'm
wondering if it would be better to put it behind a dts quirk flag, as
originally proposed?
   https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/

That way folks can enable it for devices as they need?

Again, I'm not trying to force this in as-is, just mostly sending it
out again for discussion to understand what other approach might work.

thanks
-john

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-01-08 19:18   ` John Stultz
@ 2021-01-09  0:44     ` Thinh Nguyen
  2021-03-06  9:04       ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Thinh Nguyen @ 2021-01-09  0:44 UTC (permalink / raw)
  To: John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros

Hi,

John Stultz wrote:
> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>
>> Hi,
>>
>> John Stultz <john.stultz@linaro.org> writes:
>>> From: Yu Chen <chenyu56@huawei.com>
>>>
>>> Just resending this, as discussion died out a bit and I'm not
>>> sure how to make further progress. See here for debug data that
>>> was requested last time around:
>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>
>>> With the current dwc3 code on the HiKey960 we often see the
>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>> seems to prevent the reset irq and causes the USB gadget to
>>> fail to initialize.
>>>
>>> We had seen occasional initialization failures with older
>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>> much more common, so I dug back through some older trees and
>>> realized I dropped this quirk from Yu Chen during upstreaming
>>> as I couldn't provide a proper rational for it and it didn't
>>> seem to be necessary. I now realize I was wrong.
>>>
>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>> shouldn't be a quirk at all and it is actually mentioned in the
>>> programming guide that it should be done when switching modes
>>> in DRD.
>>>
>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>> patch issues GCTL soft reset when switching modes if the
>>> controller is in DRD mode.
>>>
>>> Cc: Felipe Balbi <balbi@kernel.org>
>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>> Cc: Yang Fei <fei.yang@intel.com>
>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>> Cc: linux-usb@vger.kernel.org
>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>> ---
>>> v2:
>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>
>>> v3:
>>> * Move GCTL soft reset under the spinlock as suggested by
>>>   Thinh Nguyen
>> Because this is such an invasive change, I would prefer that we get
>> Tested-By tags from a good fraction of the users before applying these
>> two changes.
> I'm happy to reach out to folks to try to get that. Though I'm
> wondering if it would be better to put it behind a dts quirk flag, as
> originally proposed?
>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>
> That way folks can enable it for devices as they need?
>
> Again, I'm not trying to force this in as-is, just mostly sending it
> out again for discussion to understand what other approach might work.
>
> thanks
> -john

A quirk would imply something is broken/diverged from the design right?
But it's not the case here, and at least this is needed for HiKey960.
Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
devicetree. :)

BR,
Thinh


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2021-01-08  1:51 ` [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide John Stultz
@ 2021-03-06  9:00   ` Wesley Cheng
  2021-03-06 23:39     ` Thinh Nguyen
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-06  9:00 UTC (permalink / raw)
  To: John Stultz, lkml
  Cc: Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Thinh Nguyen, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, linux-usb



On 1/7/2021 5:51 PM, John Stultz wrote:
> In reviewing the previous patch, Thinh Nguyen pointed out that
> the DRD mode change sequence should be like the following when
> switching from host -> device according to the programming guide
> (for all DRD IPs):
> 1. Reset controller with GCTL.CoreSoftReset
> 2. Set GCTL.PrtCapDir(device)
> 3. Soft reset with DCTL.CSftRst
> 4. Then follow up with the initializing registers sequence
> 
> The current code does:
> a. Soft reset with DCTL.CSftRst on driver probe
> b. Reset controller with GCTL.CoreSoftReset (added in previous
>    patch)
> c. Set GCTL.PrtCapDir(device)
> d. < missing DCTL.CSftRst >
> e. Then follow up with initializing registers sequence
> 
> So this patch adds the DCTL.CSftRst soft reset that was currently
> missing from the dwc3 mode switching.
> 
> Cc: Felipe Balbi <balbi@kernel.org>
> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
> Cc: Yang Fei <fei.yang@intel.com>
> Cc: YongQin Liu <yongqin.liu@linaro.org>
> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> Cc: Thinh Nguyen <thinhn@synopsys.com>
> Cc: Jun Li <lijun.kernel@gmail.com>
> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: linux-usb@vger.kernel.org
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
> Feedback would be appreciated. I'm a little worried I should be
> conditionalizing the DCTL.CSftRst on DRD mode controllers, but
> I'm really not sure what the right thing to do is for non-DRD
> mode controllers.
> ---
>  drivers/usb/dwc3/core.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index b6a6b90eb2d5..71f8b07ecb99 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -40,6 +40,8 @@
>  
>  #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
>  
> +static int dwc3_core_soft_reset(struct dwc3 *dwc);
> +
>  /**
>   * dwc3_get_dr_mode - Validates and sets dr_mode
>   * @dwc: pointer to our context structure
> @@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
>  
>  	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
>  
> +	dwc3_core_soft_reset(dwc);

Hi John/Thinh/Felipe,

I actually added this change into my local branch, because we were
seeing an issue when switching from host mode --> peripheral mode.  What
was happening was that the RXFIFO register did not update back to the
expected value for peripheral mode by the time
dwc3_gadget_init_out_endpoint() was executed.  With the logic to
calculate the EP max packet limit based on RXFIFO reg, this caused all
EPs to be set with an EP max limit of 0.

With this change, it seemed to help with the above issue.  However, can
we consider moving the core soft reset outside the spinlock?  At least
with our PHY init routines, we have some msleep() calls for waiting for
the PHYs to be ready, which will end up as a sleeping while atomic bug.
(not sure if PHY init is required to be called in atomic context)

Thanks
Wesley Cheng

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-01-09  0:44     ` Thinh Nguyen
@ 2021-03-06  9:04       ` Wesley Cheng
  2021-03-06 23:41         ` Thinh Nguyen
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-06  9:04 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros



On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
> Hi,
> 
> John Stultz wrote:
>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>
>>> Hi,
>>>
>>> John Stultz <john.stultz@linaro.org> writes:
>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>
>>>> Just resending this, as discussion died out a bit and I'm not
>>>> sure how to make further progress. See here for debug data that
>>>> was requested last time around:
>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>
>>>> With the current dwc3 code on the HiKey960 we often see the
>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>> seems to prevent the reset irq and causes the USB gadget to
>>>> fail to initialize.
>>>>
>>>> We had seen occasional initialization failures with older
>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>> much more common, so I dug back through some older trees and
>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>> as I couldn't provide a proper rational for it and it didn't
>>>> seem to be necessary. I now realize I was wrong.
>>>>
>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>> programming guide that it should be done when switching modes
>>>> in DRD.
>>>>
>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>> patch issues GCTL soft reset when switching modes if the
>>>> controller is in DRD mode.
>>>>
>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>> Cc: linux-usb@vger.kernel.org
>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>> ---
>>>> v2:
>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>
>>>> v3:
>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>   Thinh Nguyen
>>> Because this is such an invasive change, I would prefer that we get
>>> Tested-By tags from a good fraction of the users before applying these
>>> two changes.
>> I'm happy to reach out to folks to try to get that. Though I'm
>> wondering if it would be better to put it behind a dts quirk flag, as
>> originally proposed?
>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>
>> That way folks can enable it for devices as they need?
>>
>> Again, I'm not trying to force this in as-is, just mostly sending it
>> out again for discussion to understand what other approach might work.
>>
>> thanks
>> -john
> 
> A quirk would imply something is broken/diverged from the design right?
> But it's not the case here, and at least this is needed for HiKey960.
> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
> devicetree. :)
> 
> BR,
> Thinh
> 

Hi All,

Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
seemed to remove the requirement for the GCTL.softreset before writing
to PRTCAPDIR.  Should we consider adding a controller version/IP check?

Thanks
Wesley Cheng

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2021-03-06  9:00   ` Wesley Cheng
@ 2021-03-06 23:39     ` Thinh Nguyen
  2021-03-29 22:17       ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Thinh Nguyen @ 2021-03-06 23:39 UTC (permalink / raw)
  To: Wesley Cheng, John Stultz, lkml
  Cc: Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, linux-usb

Wesley Cheng wrote:
>
> On 1/7/2021 5:51 PM, John Stultz wrote:
>> In reviewing the previous patch, Thinh Nguyen pointed out that
>> the DRD mode change sequence should be like the following when
>> switching from host -> device according to the programming guide
>> (for all DRD IPs):
>> 1. Reset controller with GCTL.CoreSoftReset
>> 2. Set GCTL.PrtCapDir(device)
>> 3. Soft reset with DCTL.CSftRst
>> 4. Then follow up with the initializing registers sequence
>>
>> The current code does:
>> a. Soft reset with DCTL.CSftRst on driver probe
>> b. Reset controller with GCTL.CoreSoftReset (added in previous
>>    patch)
>> c. Set GCTL.PrtCapDir(device)
>> d. < missing DCTL.CSftRst >
>> e. Then follow up with initializing registers sequence
>>
>> So this patch adds the DCTL.CSftRst soft reset that was currently
>> missing from the dwc3 mode switching.
>>
>> Cc: Felipe Balbi <balbi@kernel.org>
>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>> Cc: Yang Fei <fei.yang@intel.com>
>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>> Cc: Jun Li <lijun.kernel@gmail.com>
>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>> Cc: linux-usb@vger.kernel.org
>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>> ---
>> Feedback would be appreciated. I'm a little worried I should be
>> conditionalizing the DCTL.CSftRst on DRD mode controllers, but
>> I'm really not sure what the right thing to do is for non-DRD
>> mode controllers.
>> ---
>>  drivers/usb/dwc3/core.c | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>> index b6a6b90eb2d5..71f8b07ecb99 100644
>> --- a/drivers/usb/dwc3/core.c
>> +++ b/drivers/usb/dwc3/core.c
>> @@ -40,6 +40,8 @@
>>  
>>  #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
>>  
>> +static int dwc3_core_soft_reset(struct dwc3 *dwc);
>> +
>>  /**
>>   * dwc3_get_dr_mode - Validates and sets dr_mode
>>   * @dwc: pointer to our context structure
>> @@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
>>  
>>  	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
>>  
>> +	dwc3_core_soft_reset(dwc);
> Hi John/Thinh/Felipe,
>
> I actually added this change into my local branch, because we were
> seeing an issue when switching from host mode --> peripheral mode.  What
> was happening was that the RXFIFO register did not update back to the
> expected value for peripheral mode by the time
> dwc3_gadget_init_out_endpoint() was executed.  With the logic to
> calculate the EP max packet limit based on RXFIFO reg, this caused all
> EPs to be set with an EP max limit of 0.
>
> With this change, it seemed to help with the above issue.  However, can
> we consider moving the core soft reset outside the spinlock?  At least
> with our PHY init routines, we have some msleep() calls for waiting for
> the PHYs to be ready, which will end up as a sleeping while atomic bug.
> (not sure if PHY init is required to be called in atomic context)
>
> Thanks
> Wesley Cheng

Hi Wesley,

Thanks for letting us know the issue you're having also.

Yes, you need to wait a certain amount of time to synchronize with the
PHY (at least 50ms for dwc_usb32 and dwc_usb31 v1.80a and above, and
less for older versions). When removing the spinlock to use msleep(),
just make sure that there's no race issue. BTW, how long does your setup
need to msleep()?

As we suggested and explained before, this change is required as part of
the programming guide. It should be added to the driver. It's not a quirk.

BR,
Thinh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-06  9:04       ` Wesley Cheng
@ 2021-03-06 23:41         ` Thinh Nguyen
  2021-03-07 20:04           ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Thinh Nguyen @ 2021-03-06 23:41 UTC (permalink / raw)
  To: Wesley Cheng, Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros

Wesley Cheng wrote:
>
> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>> Hi,
>>
>> John Stultz wrote:
>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>> Hi,
>>>>
>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>
>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>> sure how to make further progress. See here for debug data that
>>>>> was requested last time around:
>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>
>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>> fail to initialize.
>>>>>
>>>>> We had seen occasional initialization failures with older
>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>> much more common, so I dug back through some older trees and
>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>> seem to be necessary. I now realize I was wrong.
>>>>>
>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>> programming guide that it should be done when switching modes
>>>>> in DRD.
>>>>>
>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>> patch issues GCTL soft reset when switching modes if the
>>>>> controller is in DRD mode.
>>>>>
>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>> Cc: linux-usb@vger.kernel.org
>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>> ---
>>>>> v2:
>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>
>>>>> v3:
>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>   Thinh Nguyen
>>>> Because this is such an invasive change, I would prefer that we get
>>>> Tested-By tags from a good fraction of the users before applying these
>>>> two changes.
>>> I'm happy to reach out to folks to try to get that. Though I'm
>>> wondering if it would be better to put it behind a dts quirk flag, as
>>> originally proposed?
>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>
>>> That way folks can enable it for devices as they need?
>>>
>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>> out again for discussion to understand what other approach might work.
>>>
>>> thanks
>>> -john
>> A quirk would imply something is broken/diverged from the design right?
>> But it's not the case here, and at least this is needed for HiKey960.
>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>> devicetree. :)
>>
>> BR,
>> Thinh
>>
> Hi All,
>
> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
> seemed to remove the requirement for the GCTL.softreset before writing
> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>

Hi Wesley,

From what I see in the v1.90a databook and others, the flow remains the
same. I need to check internally, but I'm not aware of the change.

BR,
Thinh


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-06 23:41         ` Thinh Nguyen
@ 2021-03-07 20:04           ` Wesley Cheng
  2021-03-09  3:05             ` Thinh Nguyen
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-07 20:04 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros



On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
> Wesley Cheng wrote:
>>
>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>> Hi,
>>>
>>> John Stultz wrote:
>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>> Hi,
>>>>>
>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>
>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>> sure how to make further progress. See here for debug data that
>>>>>> was requested last time around:
>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>>
>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>> fail to initialize.
>>>>>>
>>>>>> We had seen occasional initialization failures with older
>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>> much more common, so I dug back through some older trees and
>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>
>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>> programming guide that it should be done when switching modes
>>>>>> in DRD.
>>>>>>
>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>> controller is in DRD mode.
>>>>>>
>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>> ---
>>>>>> v2:
>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>
>>>>>> v3:
>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>   Thinh Nguyen
>>>>> Because this is such an invasive change, I would prefer that we get
>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>> two changes.
>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>> originally proposed?
>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>>
>>>> That way folks can enable it for devices as they need?
>>>>
>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>> out again for discussion to understand what other approach might work.
>>>>
>>>> thanks
>>>> -john
>>> A quirk would imply something is broken/diverged from the design right?
>>> But it's not the case here, and at least this is needed for HiKey960.
>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>> devicetree. :)
>>>
>>> BR,
>>> Thinh
>>>
>> Hi All,
>>
>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>> seemed to remove the requirement for the GCTL.softreset before writing
>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>
> 
> Hi Wesley,
> 
> From what I see in the v1.90a databook and others, the flow remains the
> same. I need to check internally, but I'm not aware of the change.
> 
Hi Thinh,

Hmmm, can you help check the register description for the PRTCAPDIR on
your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
Pg73)  When we compared the sequence in the description there to the
previous versions it removed the GCTL.softreset.  If it still shows up
on yours, then maybe my v1.90a isn't the final version?

Thanks
Wesley Cheng

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-07 20:04           ` Wesley Cheng
@ 2021-03-09  3:05             ` Thinh Nguyen
  2021-03-09  6:33               ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Thinh Nguyen @ 2021-03-09  3:05 UTC (permalink / raw)
  To: Wesley Cheng, Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros

Wesley Cheng wrote:
>
> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
>> Wesley Cheng wrote:
>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>>> Hi,
>>>>
>>>> John Stultz wrote:
>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>>
>>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>>> sure how to make further progress. See here for debug data that
>>>>>>> was requested last time around:
>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>>>
>>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>>> fail to initialize.
>>>>>>>
>>>>>>> We had seen occasional initialization failures with older
>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>>> much more common, so I dug back through some older trees and
>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>>
>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>>> programming guide that it should be done when switching modes
>>>>>>> in DRD.
>>>>>>>
>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>>> controller is in DRD mode.
>>>>>>>
>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>>> ---
>>>>>>> v2:
>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>>
>>>>>>> v3:
>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>>   Thinh Nguyen
>>>>>> Because this is such an invasive change, I would prefer that we get
>>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>>> two changes.
>>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>>> originally proposed?
>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>>>
>>>>> That way folks can enable it for devices as they need?
>>>>>
>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>>> out again for discussion to understand what other approach might work.
>>>>>
>>>>> thanks
>>>>> -john
>>>> A quirk would imply something is broken/diverged from the design right?
>>>> But it's not the case here, and at least this is needed for HiKey960.
>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>>> devicetree. :)
>>>>
>>>> BR,
>>>> Thinh
>>>>
>>> Hi All,
>>>
>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>>> seemed to remove the requirement for the GCTL.softreset before writing
>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>>
>> Hi Wesley,
>>
>> From what I see in the v1.90a databook and others, the flow remains the
>> same. I need to check internally, but I'm not aware of the change.
>>
> Hi Thinh,
>
> Hmmm, can you help check the register description for the PRTCAPDIR on
> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
> Pg73)  When we compared the sequence in the description there to the
> previous versions it removed the GCTL.softreset.  If it still shows up
> on yours, then maybe my v1.90a isn't the final version?
>
> Thanks
> Wesley Cheng
>

Hi Wesley,

Actually your IP version type may use the newer flow. Can you print your
DWC3_VER_TYPE? I still need to verify internally to know which versions
need the update if any.

Thanks,
Thinh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-09  3:05             ` Thinh Nguyen
@ 2021-03-09  6:33               ` Wesley Cheng
  2021-03-19 22:40                 ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-09  6:33 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros



On 3/8/2021 7:05 PM, Thinh Nguyen wrote:
> Wesley Cheng wrote:
>>
>> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
>>> Wesley Cheng wrote:
>>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>>>> Hi,
>>>>>
>>>>> John Stultz wrote:
>>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>>>
>>>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>>>> sure how to make further progress. See here for debug data that
>>>>>>>> was requested last time around:
>>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>>>>
>>>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>>>> fail to initialize.
>>>>>>>>
>>>>>>>> We had seen occasional initialization failures with older
>>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>>>> much more common, so I dug back through some older trees and
>>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>>>
>>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>>>> programming guide that it should be done when switching modes
>>>>>>>> in DRD.
>>>>>>>>
>>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>>>> controller is in DRD mode.
>>>>>>>>
>>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>>>> ---
>>>>>>>> v2:
>>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>>>
>>>>>>>> v3:
>>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>>>   Thinh Nguyen
>>>>>>> Because this is such an invasive change, I would prefer that we get
>>>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>>>> two changes.
>>>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>>>> originally proposed?
>>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>>>>
>>>>>> That way folks can enable it for devices as they need?
>>>>>>
>>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>>>> out again for discussion to understand what other approach might work.
>>>>>>
>>>>>> thanks
>>>>>> -john
>>>>> A quirk would imply something is broken/diverged from the design right?
>>>>> But it's not the case here, and at least this is needed for HiKey960.
>>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>>>> devicetree. :)
>>>>>
>>>>> BR,
>>>>> Thinh
>>>>>
>>>> Hi All,
>>>>
>>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>>>> seemed to remove the requirement for the GCTL.softreset before writing
>>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>>>
>>> Hi Wesley,
>>>
>>> From what I see in the v1.90a databook and others, the flow remains the
>>> same. I need to check internally, but I'm not aware of the change.
>>>
>> Hi Thinh,
>>
>> Hmmm, can you help check the register description for the PRTCAPDIR on
>> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
>> Pg73)  When we compared the sequence in the description there to the
>> previous versions it removed the GCTL.softreset.  If it still shows up
>> on yours, then maybe my v1.90a isn't the final version?
>>
>> Thanks
>> Wesley Cheng
>>
> 
> Hi Wesley,
> 
> Actually your IP version type may use the newer flow. Can you print your
> DWC3_VER_TYPE? I still need to verify internally to know which versions
> need the update if any.
> 
> Thanks,
> Thinh
> 
Hi Thinh,

Sure, my DWC3_VER_TYPE output = 0x67612A2A

Thanks
Wesley Cheng

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-09  6:33               ` Wesley Cheng
@ 2021-03-19 22:40                 ` Wesley Cheng
  2021-03-19 23:09                   ` Thinh Nguyen
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-19 22:40 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros



On 3/8/2021 10:33 PM, Wesley Cheng wrote:
> 
> 
> On 3/8/2021 7:05 PM, Thinh Nguyen wrote:
>> Wesley Cheng wrote:
>>>
>>> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
>>>> Wesley Cheng wrote:
>>>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>>>>> Hi,
>>>>>>
>>>>>> John Stultz wrote:
>>>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>
>>>>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>>>>> sure how to make further progress. See here for debug data that
>>>>>>>>> was requested last time around:
>>>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>>>>>
>>>>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>>>>> fail to initialize.
>>>>>>>>>
>>>>>>>>> We had seen occasional initialization failures with older
>>>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>>>>> much more common, so I dug back through some older trees and
>>>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>>>>
>>>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>>>>> programming guide that it should be done when switching modes
>>>>>>>>> in DRD.
>>>>>>>>>
>>>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>>>>> controller is in DRD mode.
>>>>>>>>>
>>>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>>>>> ---
>>>>>>>>> v2:
>>>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>>>>
>>>>>>>>> v3:
>>>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>>>>   Thinh Nguyen
>>>>>>>> Because this is such an invasive change, I would prefer that we get
>>>>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>>>>> two changes.
>>>>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>>>>> originally proposed?
>>>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>>>>>
>>>>>>> That way folks can enable it for devices as they need?
>>>>>>>
>>>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>>>>> out again for discussion to understand what other approach might work.
>>>>>>>
>>>>>>> thanks
>>>>>>> -john
>>>>>> A quirk would imply something is broken/diverged from the design right?
>>>>>> But it's not the case here, and at least this is needed for HiKey960.
>>>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>>>>> devicetree. :)
>>>>>>
>>>>>> BR,
>>>>>> Thinh
>>>>>>
>>>>> Hi All,
>>>>>
>>>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>>>>> seemed to remove the requirement for the GCTL.softreset before writing
>>>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>>>>
>>>> Hi Wesley,
>>>>
>>>> From what I see in the v1.90a databook and others, the flow remains the
>>>> same. I need to check internally, but I'm not aware of the change.
>>>>
>>> Hi Thinh,
>>>
>>> Hmmm, can you help check the register description for the PRTCAPDIR on
>>> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
>>> Pg73)  When we compared the sequence in the description there to the
>>> previous versions it removed the GCTL.softreset.  If it still shows up
>>> on yours, then maybe my v1.90a isn't the final version?
>>>
>>> Thanks
>>> Wesley Cheng
>>>
>>
>> Hi Wesley,
>>
>> Actually your IP version type may use the newer flow. Can you print your
>> DWC3_VER_TYPE? I still need to verify internally to know which versions
>> need the update if any.
>>
>> Thanks,
>> Thinh
>>
> Hi Thinh,
> 
> Sure, my DWC3_VER_TYPE output = 0x67612A2A
> 
> Thanks
> Wesley Cheng
> 
Hi Thinh,

Would you happen to have an update on the required sequence on the
version shared?  Sorry for pushing, but we just wanted to finalize on
it, since it does cause some functional issues w/o the soft reset in
place, and causes a crash if we have the GCTL.softreset.

Thanks
Wesley Cheng
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-19 22:40                 ` Wesley Cheng
@ 2021-03-19 23:09                   ` Thinh Nguyen
  2021-03-29 22:14                     ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Thinh Nguyen @ 2021-03-19 23:09 UTC (permalink / raw)
  To: Wesley Cheng, Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros

Wesley Cheng wrote:
> 
> 
> On 3/8/2021 10:33 PM, Wesley Cheng wrote:
>>
>>
>> On 3/8/2021 7:05 PM, Thinh Nguyen wrote:
>>> Wesley Cheng wrote:
>>>>
>>>> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
>>>>> Wesley Cheng wrote:
>>>>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> John Stultz wrote:
>>>>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>>
>>>>>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>>>>>> sure how to make further progress. See here for debug data that
>>>>>>>>>> was requested last time around:
>>>>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>>>>>>
>>>>>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>>>>>> fail to initialize.
>>>>>>>>>>
>>>>>>>>>> We had seen occasional initialization failures with older
>>>>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>>>>>> much more common, so I dug back through some older trees and
>>>>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>>>>>
>>>>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>>>>>> programming guide that it should be done when switching modes
>>>>>>>>>> in DRD.
>>>>>>>>>>
>>>>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>>>>>> controller is in DRD mode.
>>>>>>>>>>
>>>>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>>>>>> ---
>>>>>>>>>> v2:
>>>>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>>>>>
>>>>>>>>>> v3:
>>>>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>>>>>   Thinh Nguyen
>>>>>>>>> Because this is such an invasive change, I would prefer that we get
>>>>>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>>>>>> two changes.
>>>>>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>>>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>>>>>> originally proposed?
>>>>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>>>>>>
>>>>>>>> That way folks can enable it for devices as they need?
>>>>>>>>
>>>>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>>>>>> out again for discussion to understand what other approach might work.
>>>>>>>>
>>>>>>>> thanks
>>>>>>>> -john
>>>>>>> A quirk would imply something is broken/diverged from the design right?
>>>>>>> But it's not the case here, and at least this is needed for HiKey960.
>>>>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>>>>>> devicetree. :)
>>>>>>>
>>>>>>> BR,
>>>>>>> Thinh
>>>>>>>
>>>>>> Hi All,
>>>>>>
>>>>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>>>>>> seemed to remove the requirement for the GCTL.softreset before writing
>>>>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>>>>>
>>>>> Hi Wesley,
>>>>>
>>>>> From what I see in the v1.90a databook and others, the flow remains the
>>>>> same. I need to check internally, but I'm not aware of the change.
>>>>>
>>>> Hi Thinh,
>>>>
>>>> Hmmm, can you help check the register description for the PRTCAPDIR on
>>>> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
>>>> Pg73)  When we compared the sequence in the description there to the
>>>> previous versions it removed the GCTL.softreset.  If it still shows up
>>>> on yours, then maybe my v1.90a isn't the final version?
>>>>
>>>> Thanks
>>>> Wesley Cheng
>>>>
>>>
>>> Hi Wesley,
>>>
>>> Actually your IP version type may use the newer flow. Can you print your
>>> DWC3_VER_TYPE? I still need to verify internally to know which versions
>>> need the update if any.
>>>
>>> Thanks,
>>> Thinh
>>>
>> Hi Thinh,
>>
>> Sure, my DWC3_VER_TYPE output = 0x67612A2A
>>
>> Thanks
>> Wesley Cheng
>>
> Hi Thinh,
> 
> Would you happen to have an update on the required sequence on the
> version shared?  Sorry for pushing, but we just wanted to finalize on
> it, since it does cause some functional issues w/o the soft reset in
> place, and causes a crash if we have the GCTL.softreset.
> 
> Thanks
> Wesley Cheng
> 

Hi Wesley,

I'm still trying to get that info for you. The versions without
GCTL.softreset should be very new. The flow with GCTL.softreset should
work for all versions and should not cause functional impact. We can
create a change to optimize and remove GCTL.softreset for the newer
controller versions at a later time.

Since you and John Stultz have the setup that can be verified in the
real world. It would be great if John or you provide a tested patch(es)
to resolve this issue.

Thanks,
Thinh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-19 23:09                   ` Thinh Nguyen
@ 2021-03-29 22:14                     ` Wesley Cheng
  2021-03-29 22:20                       ` John Stultz
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-29 22:14 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, Felipe Balbi
  Cc: lkml, Yu Chen, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, Linux USB List, Heikki Krogerus,
	Roger Quadros



On 3/19/2021 4:09 PM, Thinh Nguyen wrote:
> Wesley Cheng wrote:
>>
>>
>> On 3/8/2021 10:33 PM, Wesley Cheng wrote:
>>>
>>>
>>> On 3/8/2021 7:05 PM, Thinh Nguyen wrote:
>>>> Wesley Cheng wrote:
>>>>>
>>>>> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
>>>>>> Wesley Cheng wrote:
>>>>>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> John Stultz wrote:
>>>>>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>>>
>>>>>>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>>>>>>> sure how to make further progress. See here for debug data that
>>>>>>>>>>> was requested last time around:
>>>>>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$ 
>>>>>>>>>>>
>>>>>>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>>>>>>> fail to initialize.
>>>>>>>>>>>
>>>>>>>>>>> We had seen occasional initialization failures with older
>>>>>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>>>>>>> much more common, so I dug back through some older trees and
>>>>>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>>>>>>
>>>>>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>>>>>>> programming guide that it should be done when switching modes
>>>>>>>>>>> in DRD.
>>>>>>>>>>>
>>>>>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>>>>>>> controller is in DRD mode.
>>>>>>>>>>>
>>>>>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>>>>>>> ---
>>>>>>>>>>> v2:
>>>>>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>>>>>>
>>>>>>>>>>> v3:
>>>>>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>>>>>>   Thinh Nguyen
>>>>>>>>>> Because this is such an invasive change, I would prefer that we get
>>>>>>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>>>>>>> two changes.
>>>>>>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>>>>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>>>>>>> originally proposed?
>>>>>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$ 
>>>>>>>>>
>>>>>>>>> That way folks can enable it for devices as they need?
>>>>>>>>>
>>>>>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>>>>>>> out again for discussion to understand what other approach might work.
>>>>>>>>>
>>>>>>>>> thanks
>>>>>>>>> -john
>>>>>>>> A quirk would imply something is broken/diverged from the design right?
>>>>>>>> But it's not the case here, and at least this is needed for HiKey960.
>>>>>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>>>>>>> devicetree. :)
>>>>>>>>
>>>>>>>> BR,
>>>>>>>> Thinh
>>>>>>>>
>>>>>>> Hi All,
>>>>>>>
>>>>>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>>>>>>> seemed to remove the requirement for the GCTL.softreset before writing
>>>>>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>>>>>>
>>>>>> Hi Wesley,
>>>>>>
>>>>>> From what I see in the v1.90a databook and others, the flow remains the
>>>>>> same. I need to check internally, but I'm not aware of the change.
>>>>>>
>>>>> Hi Thinh,
>>>>>
>>>>> Hmmm, can you help check the register description for the PRTCAPDIR on
>>>>> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
>>>>> Pg73)  When we compared the sequence in the description there to the
>>>>> previous versions it removed the GCTL.softreset.  If it still shows up
>>>>> on yours, then maybe my v1.90a isn't the final version?
>>>>>
>>>>> Thanks
>>>>> Wesley Cheng
>>>>>
>>>>
>>>> Hi Wesley,
>>>>
>>>> Actually your IP version type may use the newer flow. Can you print your
>>>> DWC3_VER_TYPE? I still need to verify internally to know which versions
>>>> need the update if any.
>>>>
>>>> Thanks,
>>>> Thinh
>>>>
>>> Hi Thinh,
>>>
>>> Sure, my DWC3_VER_TYPE output = 0x67612A2A
>>>
>>> Thanks
>>> Wesley Cheng
>>>
>> Hi Thinh,
>>
>> Would you happen to have an update on the required sequence on the
>> version shared?  Sorry for pushing, but we just wanted to finalize on
>> it, since it does cause some functional issues w/o the soft reset in
>> place, and causes a crash if we have the GCTL.softreset.
>>
>> Thanks
>> Wesley Cheng
>>
> 
> Hi Wesley,
> 
> I'm still trying to get that info for you. The versions without
> GCTL.softreset should be very new. The flow with GCTL.softreset should
> work for all versions and should not cause functional impact. We can
> create a change to optimize and remove GCTL.softreset for the newer
> controller versions at a later time.
> 
> Since you and John Stultz have the setup that can be verified in the
> real world. It would be great if John or you provide a tested patch(es)
> to resolve this issue.
> 
> Thanks,
> Thinh
> 
Hi Thinh,

Thanks for the input as always.  I tested the GCTL.softreset change just
now, and it is working fine at least on my set up.

Not sure if we'd need input from other vendors as well to get this
change merged.

Thanks
Wesley Cheng
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2021-03-06 23:39     ` Thinh Nguyen
@ 2021-03-29 22:17       ` Wesley Cheng
  2021-03-30  1:19         ` Thinh Nguyen
  0 siblings, 1 reply; 21+ messages in thread
From: Wesley Cheng @ 2021-03-29 22:17 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, lkml
  Cc: Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, linux-usb



On 3/6/2021 3:39 PM, Thinh Nguyen wrote:
> Wesley Cheng wrote:
>>
>> On 1/7/2021 5:51 PM, John Stultz wrote:
>>> In reviewing the previous patch, Thinh Nguyen pointed out that
>>> the DRD mode change sequence should be like the following when
>>> switching from host -> device according to the programming guide
>>> (for all DRD IPs):
>>> 1. Reset controller with GCTL.CoreSoftReset
>>> 2. Set GCTL.PrtCapDir(device)
>>> 3. Soft reset with DCTL.CSftRst
>>> 4. Then follow up with the initializing registers sequence
>>>
>>> The current code does:
>>> a. Soft reset with DCTL.CSftRst on driver probe
>>> b. Reset controller with GCTL.CoreSoftReset (added in previous
>>>    patch)
>>> c. Set GCTL.PrtCapDir(device)
>>> d. < missing DCTL.CSftRst >
>>> e. Then follow up with initializing registers sequence
>>>
>>> So this patch adds the DCTL.CSftRst soft reset that was currently
>>> missing from the dwc3 mode switching.
>>>
>>> Cc: Felipe Balbi <balbi@kernel.org>
>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>> Cc: Yang Fei <fei.yang@intel.com>
>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>> Cc: linux-usb@vger.kernel.org
>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>> ---
>>> Feedback would be appreciated. I'm a little worried I should be
>>> conditionalizing the DCTL.CSftRst on DRD mode controllers, but
>>> I'm really not sure what the right thing to do is for non-DRD
>>> mode controllers.
>>> ---
>>>  drivers/usb/dwc3/core.c | 3 +++
>>>  1 file changed, 3 insertions(+)
>>>
>>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>>> index b6a6b90eb2d5..71f8b07ecb99 100644
>>> --- a/drivers/usb/dwc3/core.c
>>> +++ b/drivers/usb/dwc3/core.c
>>> @@ -40,6 +40,8 @@
>>>  
>>>  #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
>>>  
>>> +static int dwc3_core_soft_reset(struct dwc3 *dwc);
>>> +
>>>  /**
>>>   * dwc3_get_dr_mode - Validates and sets dr_mode
>>>   * @dwc: pointer to our context structure
>>> @@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
>>>  
>>>  	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
>>>  
>>> +	dwc3_core_soft_reset(dwc);
>> Hi John/Thinh/Felipe,
>>
>> I actually added this change into my local branch, because we were
>> seeing an issue when switching from host mode --> peripheral mode.  What
>> was happening was that the RXFIFO register did not update back to the
>> expected value for peripheral mode by the time
>> dwc3_gadget_init_out_endpoint() was executed.  With the logic to
>> calculate the EP max packet limit based on RXFIFO reg, this caused all
>> EPs to be set with an EP max limit of 0.
>>
>> With this change, it seemed to help with the above issue.  However, can
>> we consider moving the core soft reset outside the spinlock?  At least
>> with our PHY init routines, we have some msleep() calls for waiting for
>> the PHYs to be ready, which will end up as a sleeping while atomic bug.
>> (not sure if PHY init is required to be called in atomic context)
>>
>> Thanks
>> Wesley Cheng
> 
> Hi Wesley,
> 
> Thanks for letting us know the issue you're having also.
> 
> Yes, you need to wait a certain amount of time to synchronize with the
> PHY (at least 50ms for dwc_usb32 and dwc_usb31 v1.80a and above, and
> less for older versions). When removing the spinlock to use msleep(),
> just make sure that there's no race issue. BTW, how long does your setup
> need to msleep()?
> 
Hi Thinh,

Sorry for the late response.  My mistake, its actually just a usleep()
for a less than 100uS (polling for a status bit change, so it will exit
early if possible).  For this change, can we just move the
dwc3_core_soft_reset() outside of the spinlock?

Thanks
Wesley Cheng

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-29 22:14                     ` Wesley Cheng
@ 2021-03-29 22:20                       ` John Stultz
  2021-03-30  2:11                         ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: John Stultz @ 2021-03-29 22:20 UTC (permalink / raw)
  To: Wesley Cheng
  Cc: Thinh Nguyen, Felipe Balbi, lkml, Yu Chen, Tejas Joglekar,
	Yang Fei, YongQin Liu, Andrzej Pietrasiewicz, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, Linux USB List,
	Heikki Krogerus, Roger Quadros

On Mon, Mar 29, 2021 at 3:15 PM Wesley Cheng <wcheng@codeaurora.org> wrote:
>
>
>
> On 3/19/2021 4:09 PM, Thinh Nguyen wrote:
> > Wesley Cheng wrote:
> >>
> >>
> >> On 3/8/2021 10:33 PM, Wesley Cheng wrote:
> >>>
> >>>
> >>> On 3/8/2021 7:05 PM, Thinh Nguyen wrote:
> >>>> Wesley Cheng wrote:
> >>>>>
> >>>>> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
> >>>>>> Wesley Cheng wrote:
> >>>>>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
> >>>>>>>> Hi,
> >>>>>>>>
> >>>>>>>> John Stultz wrote:
> >>>>>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
> >>>>>>>>>> Hi,
> >>>>>>>>>>
> >>>>>>>>>> John Stultz <john.stultz@linaro.org> writes:
> >>>>>>>>>>> From: Yu Chen <chenyu56@huawei.com>
> >>>>>>>>>>>
> >>>>>>>>>>> Just resending this, as discussion died out a bit and I'm not
> >>>>>>>>>>> sure how to make further progress. See here for debug data that
> >>>>>>>>>>> was requested last time around:
> >>>>>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$
> >>>>>>>>>>>
> >>>>>>>>>>> With the current dwc3 code on the HiKey960 we often see the
> >>>>>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
> >>>>>>>>>>> seems to prevent the reset irq and causes the USB gadget to
> >>>>>>>>>>> fail to initialize.
> >>>>>>>>>>>
> >>>>>>>>>>> We had seen occasional initialization failures with older
> >>>>>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
> >>>>>>>>>>> much more common, so I dug back through some older trees and
> >>>>>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
> >>>>>>>>>>> as I couldn't provide a proper rational for it and it didn't
> >>>>>>>>>>> seem to be necessary. I now realize I was wrong.
> >>>>>>>>>>>
> >>>>>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
> >>>>>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
> >>>>>>>>>>> programming guide that it should be done when switching modes
> >>>>>>>>>>> in DRD.
> >>>>>>>>>>>
> >>>>>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
> >>>>>>>>>>> patch issues GCTL soft reset when switching modes if the
> >>>>>>>>>>> controller is in DRD mode.
> >>>>>>>>>>>
> >>>>>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
> >>>>>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
> >>>>>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
> >>>>>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
> >>>>>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> >>>>>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
> >>>>>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
> >>>>>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> >>>>>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> >>>>>>>>>>> Cc: linux-usb@vger.kernel.org
> >>>>>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> >>>>>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
> >>>>>>>>>>> ---
> >>>>>>>>>>> v2:
> >>>>>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
> >>>>>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
> >>>>>>>>>>>
> >>>>>>>>>>> v3:
> >>>>>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
> >>>>>>>>>>>   Thinh Nguyen
> >>>>>>>>>> Because this is such an invasive change, I would prefer that we get
> >>>>>>>>>> Tested-By tags from a good fraction of the users before applying these
> >>>>>>>>>> two changes.
> >>>>>>>>> I'm happy to reach out to folks to try to get that. Though I'm
> >>>>>>>>> wondering if it would be better to put it behind a dts quirk flag, as
> >>>>>>>>> originally proposed?
> >>>>>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$
> >>>>>>>>>
> >>>>>>>>> That way folks can enable it for devices as they need?
> >>>>>>>>>
> >>>>>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
> >>>>>>>>> out again for discussion to understand what other approach might work.
> >>>>>>>>>
> >>>>>>>>> thanks
> >>>>>>>>> -john
> >>>>>>>> A quirk would imply something is broken/diverged from the design right?
> >>>>>>>> But it's not the case here, and at least this is needed for HiKey960.
> >>>>>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
> >>>>>>>> devicetree. :)
> >>>>>>>>
> >>>>>>>> BR,
> >>>>>>>> Thinh
> >>>>>>>>
> >>>>>>> Hi All,
> >>>>>>>
> >>>>>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
> >>>>>>> seemed to remove the requirement for the GCTL.softreset before writing
> >>>>>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
> >>>>>>>
> >>>>>> Hi Wesley,
> >>>>>>
> >>>>>> From what I see in the v1.90a databook and others, the flow remains the
> >>>>>> same. I need to check internally, but I'm not aware of the change.
> >>>>>>
> >>>>> Hi Thinh,
> >>>>>
> >>>>> Hmmm, can you help check the register description for the PRTCAPDIR on
> >>>>> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
> >>>>> Pg73)  When we compared the sequence in the description there to the
> >>>>> previous versions it removed the GCTL.softreset.  If it still shows up
> >>>>> on yours, then maybe my v1.90a isn't the final version?
> >>>>>
> >>>>> Thanks
> >>>>> Wesley Cheng
> >>>>>
> >>>>
> >>>> Hi Wesley,
> >>>>
> >>>> Actually your IP version type may use the newer flow. Can you print your
> >>>> DWC3_VER_TYPE? I still need to verify internally to know which versions
> >>>> need the update if any.
> >>>>
> >>>> Thanks,
> >>>> Thinh
> >>>>
> >>> Hi Thinh,
> >>>
> >>> Sure, my DWC3_VER_TYPE output = 0x67612A2A
> >>>
> >>> Thanks
> >>> Wesley Cheng
> >>>
> >> Hi Thinh,
> >>
> >> Would you happen to have an update on the required sequence on the
> >> version shared?  Sorry for pushing, but we just wanted to finalize on
> >> it, since it does cause some functional issues w/o the soft reset in
> >> place, and causes a crash if we have the GCTL.softreset.
> >>
> >> Thanks
> >> Wesley Cheng
> >>
> >
> > Hi Wesley,
> >
> > I'm still trying to get that info for you. The versions without
> > GCTL.softreset should be very new. The flow with GCTL.softreset should
> > work for all versions and should not cause functional impact. We can
> > create a change to optimize and remove GCTL.softreset for the newer
> > controller versions at a later time.
> >
> > Since you and John Stultz have the setup that can be verified in the
> > real world. It would be great if John or you provide a tested patch(es)
> > to resolve this issue.
> >
> > Thanks,
> > Thinh
> >
> Hi Thinh,
>
> Thanks for the input as always.  I tested the GCTL.softreset change just
> now, and it is working fine at least on my set up.
>
> Not sure if we'd need input from other vendors as well to get this
> change merged.

Did you test the original patch from this thread unchanged, or did you
have any modifications? If the latter, feel free to send it out and
I'll validate it on my side.

thanks
-john

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2021-03-29 22:17       ` Wesley Cheng
@ 2021-03-30  1:19         ` Thinh Nguyen
  2021-03-30 20:17           ` Wesley Cheng
  0 siblings, 1 reply; 21+ messages in thread
From: Thinh Nguyen @ 2021-03-30  1:19 UTC (permalink / raw)
  To: Wesley Cheng, Thinh Nguyen, John Stultz, lkml
  Cc: Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, linux-usb

Wesley Cheng wrote:
> 
> 
> On 3/6/2021 3:39 PM, Thinh Nguyen wrote:
>> Wesley Cheng wrote:
>>>
>>> On 1/7/2021 5:51 PM, John Stultz wrote:
>>>> In reviewing the previous patch, Thinh Nguyen pointed out that
>>>> the DRD mode change sequence should be like the following when
>>>> switching from host -> device according to the programming guide
>>>> (for all DRD IPs):
>>>> 1. Reset controller with GCTL.CoreSoftReset
>>>> 2. Set GCTL.PrtCapDir(device)
>>>> 3. Soft reset with DCTL.CSftRst
>>>> 4. Then follow up with the initializing registers sequence
>>>>
>>>> The current code does:
>>>> a. Soft reset with DCTL.CSftRst on driver probe
>>>> b. Reset controller with GCTL.CoreSoftReset (added in previous
>>>>    patch)
>>>> c. Set GCTL.PrtCapDir(device)
>>>> d. < missing DCTL.CSftRst >
>>>> e. Then follow up with initializing registers sequence
>>>>
>>>> So this patch adds the DCTL.CSftRst soft reset that was currently
>>>> missing from the dwc3 mode switching.
>>>>
>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>> Cc: linux-usb@vger.kernel.org
>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>> ---
>>>> Feedback would be appreciated. I'm a little worried I should be
>>>> conditionalizing the DCTL.CSftRst on DRD mode controllers, but
>>>> I'm really not sure what the right thing to do is for non-DRD
>>>> mode controllers.
>>>> ---
>>>>  drivers/usb/dwc3/core.c | 3 +++
>>>>  1 file changed, 3 insertions(+)
>>>>
>>>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>>>> index b6a6b90eb2d5..71f8b07ecb99 100644
>>>> --- a/drivers/usb/dwc3/core.c
>>>> +++ b/drivers/usb/dwc3/core.c
>>>> @@ -40,6 +40,8 @@
>>>>  
>>>>  #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
>>>>  
>>>> +static int dwc3_core_soft_reset(struct dwc3 *dwc);
>>>> +
>>>>  /**
>>>>   * dwc3_get_dr_mode - Validates and sets dr_mode
>>>>   * @dwc: pointer to our context structure
>>>> @@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
>>>>  
>>>>  	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
>>>>  
>>>> +	dwc3_core_soft_reset(dwc);
>>> Hi John/Thinh/Felipe,
>>>
>>> I actually added this change into my local branch, because we were
>>> seeing an issue when switching from host mode --> peripheral mode.  What
>>> was happening was that the RXFIFO register did not update back to the
>>> expected value for peripheral mode by the time
>>> dwc3_gadget_init_out_endpoint() was executed.  With the logic to
>>> calculate the EP max packet limit based on RXFIFO reg, this caused all
>>> EPs to be set with an EP max limit of 0.
>>>
>>> With this change, it seemed to help with the above issue.  However, can
>>> we consider moving the core soft reset outside the spinlock?  At least
>>> with our PHY init routines, we have some msleep() calls for waiting for
>>> the PHYs to be ready, which will end up as a sleeping while atomic bug.
>>> (not sure if PHY init is required to be called in atomic context)
>>>
>>> Thanks
>>> Wesley Cheng
>>
>> Hi Wesley,
>>
>> Thanks for letting us know the issue you're having also.
>>
>> Yes, you need to wait a certain amount of time to synchronize with the
>> PHY (at least 50ms for dwc_usb32 and dwc_usb31 v1.80a and above, and
>> less for older versions). When removing the spinlock to use msleep(),
>> just make sure that there's no race issue. BTW, how long does your setup
>> need to msleep()?
>>
> Hi Thinh,
> 
> Sorry for the late response.  My mistake, its actually just a usleep()
> for a less than 100uS (polling for a status bit change, so it will exit
> early if possible).  For this change, can we just move the
> dwc3_core_soft_reset() outside of the spinlock?
> 
> Thanks
> Wesley Cheng
> 


Hi Wesley,

dwc3 can get notified at any time to queue a work to switch mode. So you
need protect it from a potential race. I think you can use a mutex for this.

Also, what status are you polling? Note that there's no status bit for
GCTL.coresoftreset. For DCTL.CSFTRST, different controller versions
behave differently. Use dwc3_core_soft_reset() for DCTL.CSFTRST to get
the logic from there.

1 more thing, make sure that this flow only applies for DRD mode
controller and not OTG from older DWC_usb3 IP.

Thanks,
Thinh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD
  2021-03-29 22:20                       ` John Stultz
@ 2021-03-30  2:11                         ` Wesley Cheng
  0 siblings, 0 replies; 21+ messages in thread
From: Wesley Cheng @ 2021-03-30  2:11 UTC (permalink / raw)
  To: John Stultz
  Cc: Thinh Nguyen, Felipe Balbi, lkml, Yu Chen, Tejas Joglekar,
	Yang Fei, YongQin Liu, Andrzej Pietrasiewicz, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, Linux USB List,
	Heikki Krogerus, Roger Quadros



On 3/29/2021 3:20 PM, John Stultz wrote:
> On Mon, Mar 29, 2021 at 3:15 PM Wesley Cheng <wcheng@codeaurora.org> wrote:
>>
>>
>>
>> On 3/19/2021 4:09 PM, Thinh Nguyen wrote:
>>> Wesley Cheng wrote:
>>>>
>>>>
>>>> On 3/8/2021 10:33 PM, Wesley Cheng wrote:
>>>>>
>>>>>
>>>>> On 3/8/2021 7:05 PM, Thinh Nguyen wrote:
>>>>>> Wesley Cheng wrote:
>>>>>>>
>>>>>>> On 3/6/2021 3:41 PM, Thinh Nguyen wrote:
>>>>>>>> Wesley Cheng wrote:
>>>>>>>>> On 1/8/2021 4:44 PM, Thinh Nguyen wrote:
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> John Stultz wrote:
>>>>>>>>>>> On Fri, Jan 8, 2021 at 4:26 AM Felipe Balbi <balbi@kernel.org> wrote:
>>>>>>>>>>>> Hi,
>>>>>>>>>>>>
>>>>>>>>>>>> John Stultz <john.stultz@linaro.org> writes:
>>>>>>>>>>>>> From: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Just resending this, as discussion died out a bit and I'm not
>>>>>>>>>>>>> sure how to make further progress. See here for debug data that
>>>>>>>>>>>>> was requested last time around:
>>>>>>>>>>>>>   https://urldefense.com/v3/__https://lore.kernel.org/lkml/CALAqxLXdnaUfJKx0aN9xWwtfWVjMWigPpy2aqsNj56yvnbU80g@mail.gmail.com/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnsnlqd3w$
>>>>>>>>>>>>>
>>>>>>>>>>>>> With the current dwc3 code on the HiKey960 we often see the
>>>>>>>>>>>>> COREIDLE flag get stuck off in __dwc3_gadget_start(), which
>>>>>>>>>>>>> seems to prevent the reset irq and causes the USB gadget to
>>>>>>>>>>>>> fail to initialize.
>>>>>>>>>>>>>
>>>>>>>>>>>>> We had seen occasional initialization failures with older
>>>>>>>>>>>>> kernels but with recent 5.x era kernels it seemed to be becoming
>>>>>>>>>>>>> much more common, so I dug back through some older trees and
>>>>>>>>>>>>> realized I dropped this quirk from Yu Chen during upstreaming
>>>>>>>>>>>>> as I couldn't provide a proper rational for it and it didn't
>>>>>>>>>>>>> seem to be necessary. I now realize I was wrong.
>>>>>>>>>>>>>
>>>>>>>>>>>>> After resubmitting the quirk, Thinh Nguyen pointed out that it
>>>>>>>>>>>>> shouldn't be a quirk at all and it is actually mentioned in the
>>>>>>>>>>>>> programming guide that it should be done when switching modes
>>>>>>>>>>>>> in DRD.
>>>>>>>>>>>>>
>>>>>>>>>>>>> So, to avoid these !COREIDLE lockups seen on HiKey960, this
>>>>>>>>>>>>> patch issues GCTL soft reset when switching modes if the
>>>>>>>>>>>>> controller is in DRD mode.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>>>>>>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>>>>>>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>>>>>>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>>>>>>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>>>>>>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>>>>>>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>>>>>>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>>>>>>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>>>>>>>>>> Cc: linux-usb@vger.kernel.org
>>>>>>>>>>>>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>>>>>>>>>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>>>>>>>>>> ---
>>>>>>>>>>>>> v2:
>>>>>>>>>>>>> * Rework to always call the GCTL soft reset in DRD mode,
>>>>>>>>>>>>>   rather then using a quirk as suggested by Thinh Nguyen
>>>>>>>>>>>>>
>>>>>>>>>>>>> v3:
>>>>>>>>>>>>> * Move GCTL soft reset under the spinlock as suggested by
>>>>>>>>>>>>>   Thinh Nguyen
>>>>>>>>>>>> Because this is such an invasive change, I would prefer that we get
>>>>>>>>>>>> Tested-By tags from a good fraction of the users before applying these
>>>>>>>>>>>> two changes.
>>>>>>>>>>> I'm happy to reach out to folks to try to get that. Though I'm
>>>>>>>>>>> wondering if it would be better to put it behind a dts quirk flag, as
>>>>>>>>>>> originally proposed?
>>>>>>>>>>>    https://urldefense.com/v3/__https://lore.kernel.org/lkml/20201021181803.79650-1-john.stultz@linaro.org/__;!!A4F2R9G_pg!LNzuprAeg-O80SgolYkIkW4-ne-M-yLWCDUY9MygAIrQC398Z6gRJ9wnRWITZfc$
>>>>>>>>>>>
>>>>>>>>>>> That way folks can enable it for devices as they need?
>>>>>>>>>>>
>>>>>>>>>>> Again, I'm not trying to force this in as-is, just mostly sending it
>>>>>>>>>>> out again for discussion to understand what other approach might work.
>>>>>>>>>>>
>>>>>>>>>>> thanks
>>>>>>>>>>> -john
>>>>>>>>>> A quirk would imply something is broken/diverged from the design right?
>>>>>>>>>> But it's not the case here, and at least this is needed for HiKey960.
>>>>>>>>>> Also, I think Rob will be ok with not adding 1 more quirk to the dwc3
>>>>>>>>>> devicetree. :)
>>>>>>>>>>
>>>>>>>>>> BR,
>>>>>>>>>> Thinh
>>>>>>>>>>
>>>>>>>>> Hi All,
>>>>>>>>>
>>>>>>>>> Sorry for jumping in, but I checked the SNPS v1.90a databook, and that
>>>>>>>>> seemed to remove the requirement for the GCTL.softreset before writing
>>>>>>>>> to PRTCAPDIR.  Should we consider adding a controller version/IP check?
>>>>>>>>>
>>>>>>>> Hi Wesley,
>>>>>>>>
>>>>>>>> From what I see in the v1.90a databook and others, the flow remains the
>>>>>>>> same. I need to check internally, but I'm not aware of the change.
>>>>>>>>
>>>>>>> Hi Thinh,
>>>>>>>
>>>>>>> Hmmm, can you help check the register description for the PRTCAPDIR on
>>>>>>> your v1.90a databook?  (Table 1-19 Fields for Register: GCTL (Continued)
>>>>>>> Pg73)  When we compared the sequence in the description there to the
>>>>>>> previous versions it removed the GCTL.softreset.  If it still shows up
>>>>>>> on yours, then maybe my v1.90a isn't the final version?
>>>>>>>
>>>>>>> Thanks
>>>>>>> Wesley Cheng
>>>>>>>
>>>>>>
>>>>>> Hi Wesley,
>>>>>>
>>>>>> Actually your IP version type may use the newer flow. Can you print your
>>>>>> DWC3_VER_TYPE? I still need to verify internally to know which versions
>>>>>> need the update if any.
>>>>>>
>>>>>> Thanks,
>>>>>> Thinh
>>>>>>
>>>>> Hi Thinh,
>>>>>
>>>>> Sure, my DWC3_VER_TYPE output = 0x67612A2A
>>>>>
>>>>> Thanks
>>>>> Wesley Cheng
>>>>>
>>>> Hi Thinh,
>>>>
>>>> Would you happen to have an update on the required sequence on the
>>>> version shared?  Sorry for pushing, but we just wanted to finalize on
>>>> it, since it does cause some functional issues w/o the soft reset in
>>>> place, and causes a crash if we have the GCTL.softreset.
>>>>
>>>> Thanks
>>>> Wesley Cheng
>>>>
>>>
>>> Hi Wesley,
>>>
>>> I'm still trying to get that info for you. The versions without
>>> GCTL.softreset should be very new. The flow with GCTL.softreset should
>>> work for all versions and should not cause functional impact. We can
>>> create a change to optimize and remove GCTL.softreset for the newer
>>> controller versions at a later time.
>>>
>>> Since you and John Stultz have the setup that can be verified in the
>>> real world. It would be great if John or you provide a tested patch(es)
>>> to resolve this issue.
>>>
>>> Thanks,
>>> Thinh
>>>
>> Hi Thinh,
>>
>> Thanks for the input as always.  I tested the GCTL.softreset change just
>> now, and it is working fine at least on my set up.
>>
>> Not sure if we'd need input from other vendors as well to get this
>> change merged.
> 
> Did you test the original patch from this thread unchanged, or did you
> have any modifications? If the latter, feel free to send it out and
> I'll validate it on my side.
> 
> thanks
> -john
> 

Hi John,

I'm using your change as is.  Didn't make any modifications to it.

Thanks
Wesley Cheng

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2021-03-30  1:19         ` Thinh Nguyen
@ 2021-03-30 20:17           ` Wesley Cheng
  0 siblings, 0 replies; 21+ messages in thread
From: Wesley Cheng @ 2021-03-30 20:17 UTC (permalink / raw)
  To: Thinh Nguyen, John Stultz, lkml
  Cc: Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Jun Li, Mauro Carvalho Chehab,
	Greg Kroah-Hartman, linux-usb



On 3/29/2021 6:19 PM, Thinh Nguyen wrote:
> Wesley Cheng wrote:
>>
>>
>> On 3/6/2021 3:39 PM, Thinh Nguyen wrote:
>>> Wesley Cheng wrote:
>>>>
>>>> On 1/7/2021 5:51 PM, John Stultz wrote:
>>>>> In reviewing the previous patch, Thinh Nguyen pointed out that
>>>>> the DRD mode change sequence should be like the following when
>>>>> switching from host -> device according to the programming guide
>>>>> (for all DRD IPs):
>>>>> 1. Reset controller with GCTL.CoreSoftReset
>>>>> 2. Set GCTL.PrtCapDir(device)
>>>>> 3. Soft reset with DCTL.CSftRst
>>>>> 4. Then follow up with the initializing registers sequence
>>>>>
>>>>> The current code does:
>>>>> a. Soft reset with DCTL.CSftRst on driver probe
>>>>> b. Reset controller with GCTL.CoreSoftReset (added in previous
>>>>>    patch)
>>>>> c. Set GCTL.PrtCapDir(device)
>>>>> d. < missing DCTL.CSftRst >
>>>>> e. Then follow up with initializing registers sequence
>>>>>
>>>>> So this patch adds the DCTL.CSftRst soft reset that was currently
>>>>> missing from the dwc3 mode switching.
>>>>>
>>>>> Cc: Felipe Balbi <balbi@kernel.org>
>>>>> Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
>>>>> Cc: Yang Fei <fei.yang@intel.com>
>>>>> Cc: YongQin Liu <yongqin.liu@linaro.org>
>>>>> Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
>>>>> Cc: Thinh Nguyen <thinhn@synopsys.com>
>>>>> Cc: Jun Li <lijun.kernel@gmail.com>
>>>>> Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>>> Cc: linux-usb@vger.kernel.org
>>>>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>>>>> ---
>>>>> Feedback would be appreciated. I'm a little worried I should be
>>>>> conditionalizing the DCTL.CSftRst on DRD mode controllers, but
>>>>> I'm really not sure what the right thing to do is for non-DRD
>>>>> mode controllers.
>>>>> ---
>>>>>  drivers/usb/dwc3/core.c | 3 +++
>>>>>  1 file changed, 3 insertions(+)
>>>>>
>>>>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>>>>> index b6a6b90eb2d5..71f8b07ecb99 100644
>>>>> --- a/drivers/usb/dwc3/core.c
>>>>> +++ b/drivers/usb/dwc3/core.c
>>>>> @@ -40,6 +40,8 @@
>>>>>  
>>>>>  #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
>>>>>  
>>>>> +static int dwc3_core_soft_reset(struct dwc3 *dwc);
>>>>> +
>>>>>  /**
>>>>>   * dwc3_get_dr_mode - Validates and sets dr_mode
>>>>>   * @dwc: pointer to our context structure
>>>>> @@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
>>>>>  
>>>>>  	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
>>>>>  
>>>>> +	dwc3_core_soft_reset(dwc);
>>>> Hi John/Thinh/Felipe,
>>>>
>>>> I actually added this change into my local branch, because we were
>>>> seeing an issue when switching from host mode --> peripheral mode.  What
>>>> was happening was that the RXFIFO register did not update back to the
>>>> expected value for peripheral mode by the time
>>>> dwc3_gadget_init_out_endpoint() was executed.  With the logic to
>>>> calculate the EP max packet limit based on RXFIFO reg, this caused all
>>>> EPs to be set with an EP max limit of 0.
>>>>
>>>> With this change, it seemed to help with the above issue.  However, can
>>>> we consider moving the core soft reset outside the spinlock?  At least
>>>> with our PHY init routines, we have some msleep() calls for waiting for
>>>> the PHYs to be ready, which will end up as a sleeping while atomic bug.
>>>> (not sure if PHY init is required to be called in atomic context)
>>>>
>>>> Thanks
>>>> Wesley Cheng
>>>
>>> Hi Wesley,
>>>
>>> Thanks for letting us know the issue you're having also.
>>>
>>> Yes, you need to wait a certain amount of time to synchronize with the
>>> PHY (at least 50ms for dwc_usb32 and dwc_usb31 v1.80a and above, and
>>> less for older versions). When removing the spinlock to use msleep(),
>>> just make sure that there's no race issue. BTW, how long does your setup
>>> need to msleep()?
>>>
>> Hi Thinh,
>>
>> Sorry for the late response.  My mistake, its actually just a usleep()
>> for a less than 100uS (polling for a status bit change, so it will exit
>> early if possible).  For this change, can we just move the
>> dwc3_core_soft_reset() outside of the spinlock?
>>
>> Thanks
>> Wesley Cheng
>>
> 
> 
> Hi Wesley,
> 
> dwc3 can get notified at any time to queue a work to switch mode. So you
> need protect it from a potential race. I think you can use a mutex for this.
> 
Hi Thinh,

OK let me take a look a bit more.

> Also, what status are you polling? Note that there's no status bit for
> GCTL.coresoftreset. For DCTL.CSFTRST, different controller versions
> behave differently. Use dwc3_core_soft_reset() for DCTL.CSFTRST to get
> the logic from there.
>
During dwc3_core_soft_reset() we're also calling the PHY init for both
HS and SS PHYs.  Within our PHY init sequence, we have a status bit
check to make sure our PHY has initialized correctly.  There was no
issue using the usleep() yet, as dwc3_core_soft_reset() is also used
during dwc3_core_init() w/o any locking.

Thanks
Wesley Cheng

> 1 more thing, make sure that this flow only applies for DRD mode
> controller and not OTG from older DWC_usb3 IP.
> 
> Thanks,
> Thinh
> 

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
  2020-10-22  3:25 John Stultz
@ 2020-10-22  3:25 ` John Stultz
  0 siblings, 0 replies; 21+ messages in thread
From: John Stultz @ 2020-10-22  3:25 UTC (permalink / raw)
  To: lkml
  Cc: John Stultz, Felipe Balbi, Tejas Joglekar, Yang Fei, YongQin Liu,
	Andrzej Pietrasiewicz, Thinh Nguyen, Jun Li,
	Mauro Carvalho Chehab, Greg Kroah-Hartman, linux-usb

In reviewing the previous patch, Thinh Nguyen pointed out that
the DRD mode change sequence should be like the following when
switching from host -> device according to the programming guide
(for all DRD IPs):
1. Reset controller with GCTL.CoreSoftReset
2. Set GCTL.PrtCapDir(device)
3. Soft reset with DCTL.CSftRst
4. Then follow up with the initializing registers sequence

The current code does:
a. Soft reset with DCTL.CSftRst on driver probe
b. Reset controller with GCTL.CoreSoftReset (added in previous
   patch)
c. Set GCTL.PrtCapDir(device)
d. < missing DCTL.CSftRst >
e. Then follow up with initializing registers sequence

So this patch adds the DCTL.CSftRst soft reset that was currently
missing from the dwc3 mode switching.

Cc: Felipe Balbi <balbi@kernel.org>
Cc: Tejas Joglekar <tejas.joglekar@synopsys.com>
Cc: Yang Fei <fei.yang@intel.com>
Cc: YongQin Liu <yongqin.liu@linaro.org>
Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Cc: Thinh Nguyen <thinhn@synopsys.com>
Cc: Jun Li <lijun.kernel@gmail.com>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
Feedback would be appreciated. I'm a little worried I should be
conditionalizing the DCTL.CSftRst on DRD mode controllers, but
I'm really not sure what the right thing to do is for non-DRD
mode controllers.
---
 drivers/usb/dwc3/core.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index a2a88284a95b..c87d8add19e4 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -40,6 +40,8 @@
 
 #define DWC3_DEFAULT_AUTOSUSPEND_DELAY	5000 /* ms */
 
+static int dwc3_core_soft_reset(struct dwc3 *dwc);
+
 /**
  * dwc3_get_dr_mode - Validates and sets dr_mode
  * @dwc: pointer to our context structure
@@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
 
 	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
 
+	dwc3_core_soft_reset(dwc);
 	spin_unlock_irqrestore(&dwc->lock, flags);
 
 	switch (dwc->desired_dr_role) {
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2021-03-30 20:18 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-08  1:51 [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD John Stultz
2021-01-08  1:51 ` [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide John Stultz
2021-03-06  9:00   ` Wesley Cheng
2021-03-06 23:39     ` Thinh Nguyen
2021-03-29 22:17       ` Wesley Cheng
2021-03-30  1:19         ` Thinh Nguyen
2021-03-30 20:17           ` Wesley Cheng
2021-01-08 12:25 ` [PATCH v3 1/2] usb: dwc3: Trigger a GCTL soft reset when switching modes in DRD Felipe Balbi
2021-01-08 19:18   ` John Stultz
2021-01-09  0:44     ` Thinh Nguyen
2021-03-06  9:04       ` Wesley Cheng
2021-03-06 23:41         ` Thinh Nguyen
2021-03-07 20:04           ` Wesley Cheng
2021-03-09  3:05             ` Thinh Nguyen
2021-03-09  6:33               ` Wesley Cheng
2021-03-19 22:40                 ` Wesley Cheng
2021-03-19 23:09                   ` Thinh Nguyen
2021-03-29 22:14                     ` Wesley Cheng
2021-03-29 22:20                       ` John Stultz
2021-03-30  2:11                         ` Wesley Cheng
  -- strict thread matches above, loose matches on Subject: below --
2020-10-22  3:25 John Stultz
2020-10-22  3:25 ` [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide John Stultz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).