[Bug] usb: dwc2: Add functions to set and clear force mode

John Youn John.Youn at synopsys.com
Mon Feb 1 15:31:21 PST 2016


On 2/1/2016 3:13 AM, Caesar Wang wrote:
> 
> 
> 在 2016年02月01日 19:12, Caesar Wang 写道:
>> Doug
>>
>> 在 2016年01月30日 03:11, Doug Anderson 写道:
>>> Caesar,
>>>
>>> On Tue, Jan 26, 2016 at 6:12 PM, Caesar Wang 
>>> <caesar.upstream at gmail.com> wrote:
>>>> Thanks Doug's reply.
>>>>
>>>> Cc: Wulf
>>>> 在 2016年01月27日 00:05, Doug Anderson 写道:
>>>>> Hi,
>>>>>
>>>>> On Tue, Jan 26, 2016 at 4:02 AM, Caesar Wang <wxt at rock-chips.com> 
>>>>> wrote:
>>>>>> Hi  John, Felipe
>>>>>>
>>>>>>
>>>>>> I'm no familiar with usb stuff.
>>>>>> then I found this patch will break usb working for rk3036 SoCs, maybe
>>>>>> more
>>>>>> SoCs.
>>>>>> Says, U disk can't work on usb host.
>>>>>>
>>>>>> The failure log:
>>>>>>
>>>>>>      32.645481] usb usb2-port1: connect-debounce failed
>>>>>>
>>>>>>
>>>>>> Tested by following branch:
>>>>>> https://github.com/Caesar-github/rockchip/tree/kylin/next (kernel:
>>>>>> 4.5-rc1)
>>>>>>
>>>>>> Revert "usb: dwc2: Add functions to set and clear force mode" will 
>>>>>> work
>>>>>> for
>>>>>> it.
>>>>>>
>>>>>>
>>>>>> Maybe, someone have some suggestions or ideas?
>>>>> Can you check if this series helps you?
>>>>>
>>>>> http://marc.info/?l=linux-usb&m=145255851516121&w=2
>>>>
>>>> Unluckily, this series patches can't fix it on rk3036 SoCs.
>>>> I revert this CL ("usb: dwc2: Add functions to set and clear force 
>>>> mode") to
>>>> work firstly.
>>> You're 100% positive?  In particular you made sure you had this patch
>>> (one of the two in John's series I pointed at), which explicitly
>>> mentions fixing a problem with the patch you mention?
>>
>> I'm 100% positive the John's patches can fix this issue
> 
> Sorry, John's patches can't fix this issue.
> 
> 
>> As the following verified on
>> https://github.com/Caesar-github/rockchip/commits/for-usb-tests
>>
>> Anyway, Meanwhile if we add the folllowing patch can work for me. I 
>> will track it on tomorrow if you have other suggestions.
>>
>> diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
>> index e991d55..90f4abf 100644
>> --- a/drivers/usb/dwc2/core.c
>> +++ b/drivers/usb/dwc2/core.c
>> @@ -637,6 +637,13 @@ int dwc2_core_reset_and_force_dr_mode(struct 
>> dwc2_hsotg *hsotg)
>>                 return retval;
>>
>>         dwc2_force_dr_mode(hsotg);
>> +
>> +       /*
>> +        * NOTE: This long sleep is _very_ important, otherwise the 
>> core will
>> +        * not stay in host mode after a connector ID change!
>> +        */
>> +        usleep_range(150000, 160000);
>> +
>>         return 0;
>>  }

Hi Cesar,

On your platform, is the dwc2 controller OTG? If so, what mode is the
driver running in (dr_mode=HOST, PERIPHERAL, or OTG)?

The force mode only requires 25ms delay but maybe the sleep needs to
be longer on your system for some other reason. Which is unfortunate
because 150ms is very long.

Under what condition do you see the problem. Is it on connector ID
change? If so we might put the long delay in a more appropriate
location so as not to affect delay in probe.

Also, could you try *only* reverting the following:

commit 97e463886b873f62bea2293e7edf81fdb884b84f ("usb: dwc2: Reduce
delay when forcing mode in reset")

The original patch you referred to preserves the long delay at the
point it is used for OTG but then this later patch (97e46388)
decreased the value. So maybe we can just revert this later patch.

Regards,
John


More information about the Linux-rockchip mailing list