Re: [RFT PATCH 0/4] usb: dwc2: Fix core reset and force mode delay problems

From: Michael Niewoehner
Date: Thu Apr 07 2016 - 16:36:28 EST



Am 07.04.2016 um 20:41 schrieb John Youn <John.Youn@xxxxxxxxxxxx>:

> On 3/31/2016 2:44 PM, Michael Niewoehner wrote:
>> Hi John,
>>
>> Am 29.03.2016 um 04:36 schrieb John Youn <johnyoun@xxxxxxxxxxxx>:
>>
>>> Hi,
>>>
>>> The following patch series addresses the core reset and force mode
>>> delay problems we have been seeing on dwc2 for some platforms.
>>>
>>> I think I have identified the source of the inconsistencies between
>>> platforms and this series attempts to address them.
>>>
>>> Basically everything stems from the IDDIG debounce filter delay, which
>>> is a function of the PHY clock speed and can range from 5-50 ms if
>>> enabled. This delay must be taken into account on core reset and force
>>> modes. A full explanation is provided in the patch commit log and code
>>> comments.
>>>
>>> The first two patches are prerequisites to the force mode fixes,
>>> including one patch that was sent separately by Przemek Rudy. I have
>>> resubmitted it with this series for convenience.
>>>
>>> Please help by reviewing and testing on your platforms.
>>>
>>> Patches were tested on:
>>> * Synopsys HAPS platform IP 3.20a OTG, dr_mode=OTG,HOST,PERIPHERAL
>>>
>>> Regards,
>>> John
>>>
>>> John Youn (3):
>>> usb: dwc2: gadget: Only initialize device if in device mode
>>> usb: dwc2: Add delay to core soft reset
>>> usb: dwc2: Properly account for the force mode delays
>>>
>>> Przemek Rudy (1):
>>> usb: dwc2: do not override forced dr_mode in gadget setup
>>>
>>> drivers/usb/dwc2/core.c | 195 ++++++++++++++++++++++++++++----------------
>>> drivers/usb/dwc2/core.h | 2 +-
>>> drivers/usb/dwc2/gadget.c | 30 +++++--
>>> drivers/usb/dwc2/hcd.c | 6 +-
>>> drivers/usb/dwc2/hw.h | 1 +
>>> drivers/usb/dwc2/platform.c | 9 +-
>>> 6 files changed, 161 insertions(+), 82 deletions(-)
>>>
>>> --
>>> 2.7.4
>>>
>>
>> after applying your patch series on v4.6-rc1 usb keeps being broken on rk3188.
>> Besides that I get "dwc2 10180000.usb: dwc2_wait_for_mode: Couldn't set host mode“ repeatedly.
>>
>> Currently this works for me:
>> - Revert "usb: dwc2: Fix probe problem on bcm2835“
>> - Apply "usb: dwc2: Add a 10 ms delay to dwc2_core_reset()"
>>
>>
>> Best regards
>> Michael
>>
>
> Thanks Michael.
>
> I won't be able to look at this again until next week. In the meantime
> could you provide a driver log? In particular I want to see the values
> of your GHWCFG registers, and where you are seeing the
> dwc2_wait_for_mode() failure.
>
> Regards,
> John

Looks like the problem is gone on -rc2… on -rc1 the errors came up shortly after "dwc2 10180000.usb“ messages.
USB keeps being broken, though. The USB hub is detected but nothing that is attached to it.

Here are the logs and register values for each test with Doug’s and your patches.

Michael


good usb, Doug's patches

[ 0.420125] usbcore: registered new interface driver usbfs
[ 0.426246] usbcore: registered new interface driver hub
[ 0.432296] usbcore: registered new device driver usb
[...]
[ 0.853769] 10180000.usb supply vusb_d not found, using dummy regulator
[ 0.860560] 10180000.usb supply vusb_a not found, using dummy regulator
[ 0.867365] dwc2 10180000.usb: Configuration mismatch. dr_mode forced to host
[ 0.977737] dwc2 10180000.usb: 128 invalid for host_nperio_tx_fifo_size. Check H.
[ 0.986562] dwc2 10180000.usb: 256 invalid for host_perio_tx_fifo_size. Check HW.
[ 1.047959] dwc2 10180000.usb: DWC OTG Controller
[ 1.052732] dwc2 10180000.usb: new USB bus registered, assigned bus number 1
[ 1.059868] dwc2 10180000.usb: irq 24, io mem 0x00000000
[ 1.065586] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.072430] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.079706] usb usb1: Product: DWC OTG Controller
[ 1.084432] usb usb1: Manufacturer: Linux 4.6.0-rc2+ dwc2_hsotg
[ 1.090390] usb usb1: SerialNumber: 10180000.usb
[ 1.096000] hub 1-0:1.0: USB hub found
[ 1.099884] hub 1-0:1.0: 1 port detected
[ 1.104668] 101c0000.usb supply vusb_d not found, using dummy regulator
[ 1.111428] 101c0000.usb supply vusb_a not found, using dummy regulator
[ 1.247968] dwc2 101c0000.usb: DWC OTG Controller
[ 1.252743] dwc2 101c0000.usb: new USB bus registered, assigned bus number 2
[ 1.259879] dwc2 101c0000.usb: irq 25, io mem 0x00000000
[ 1.265604] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.272447] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.279721] usb usb2: Product: DWC OTG Controller
[ 1.284448] usb usb2: Manufacturer: Linux 4.6.0-rc2+ dwc2_hsotg
[ 1.290404] usb usb2: SerialNumber: 101c0000.usb
[ 1.295951] hub 2-0:1.0: USB hub found
[ 1.299830] hub 2-0:1.0: 1 port detected
[ 1.305694] usbcore: registered new interface driver usb-storage


root@c0rock:~# cat debug/10180000.usb/regdump | grep GHWCFG
[ 1770.718938] dwc2 10180000.usb: Mode Mismatch Interrupt: currently in Host mode
[ 1770.729974] dwc2 10180000.usb: Mode Mismatch Interrupt: currently in Host mode
GHWCFG1 = 0x00006664
GHWCFG2 = 0x22aa2450
GHWCFG3 = 0x03cc00e8
GHWCFG4 = 0xdbf04060
root@c0rock:~# cat debug/101c0000.usb/regdump | grep GHWCFG
GHWCFG1 = 0x00000000
GHWCFG2 = 0x22a7c856
GHWCFG3 = 0x03380068
GHWCFG4 = 0x09f04060


==========================


bad usb, your patches

[ 0.420098] usbcore: registered new interface driver usbfs
[ 0.426218] usbcore: registered new interface driver hub
[ 0.432221] usbcore: registered new device driver usb
[...]
[ 0.854505] 10180000.usb supply vusb_d not found, using dummy regulator
[ 0.861295] 10180000.usb supply vusb_a not found, using dummy regulator
[ 0.868126] dwc2 10180000.usb: Configuration mismatch. dr_mode forced to host
[ 0.917648] dwc2 10180000.usb: dwc2_wait_for_mode: Couldn't set host mode
[ 0.924472] dwc2 10180000.usb: 128 invalid for host_nperio_tx_fifo_size. Check H.
[ 0.933314] dwc2 10180000.usb: 256 invalid for host_perio_tx_fifo_size. Check HW.
[ 0.977914] dwc2 10180000.usb: DWC OTG Controller
[ 0.982687] dwc2 10180000.usb: new USB bus registered, assigned bus number 1
[ 0.989827] dwc2 10180000.usb: irq 24, io mem 0x00000000
[ 0.995543] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.002390] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.009666] usb usb1: Product: DWC OTG Controller
[ 1.014391] usb usb1: Manufacturer: Linux 4.6.0-rc2+ dwc2_hsotg
[ 1.020347] usb usb1: SerialNumber: 10180000.usb
[ 1.025937] hub 1-0:1.0: USB hub found
[ 1.029819] hub 1-0:1.0: 1 port detected
[ 1.034605] 101c0000.usb supply vusb_d not found, using dummy regulator
[ 1.041367] 101c0000.usb supply vusb_a not found, using dummy regulator
[ 1.048480] dwc2 101c0000.usb: DWC OTG Controller
[ 1.053251] dwc2 101c0000.usb: new USB bus registered, assigned bus number 2
[ 1.060389] dwc2 101c0000.usb: irq 25, io mem 0x00000000
[ 1.066121] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.072972] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.080251] usb usb2: Product: DWC OTG Controller
[ 1.084978] usb usb2: Manufacturer: Linux 4.6.0-rc2+ dwc2_hsotg
[ 1.090935] usb usb2: SerialNumber: 101c0000.usb
[ 1.096504] hub 2-0:1.0: USB hub found
[ 1.100387] hub 2-0:1.0: 1 port detected
[ 1.106271] usbcore: registered new interface driver usb-storage


root@c0rock:~# cat debug/10180000.usb/regdump | grep GHWCFG
[ 224.592330] dwc2 10180000.usb: Mode Mismatch Interrupt: currently in Host mode
[ 224.603277] dwc2 10180000.usb: Mode Mismatch Interrupt: currently in Host mode
GHWCFG1 = 0x00006664
GHWCFG2 = 0x22aa2450
GHWCFG3 = 0x03cc00e8
GHWCFG4 = 0xdbf04060
root@c0rock:~# cat debug/101c0000.usb/regdump | grep GHWCFG
GHWCFG1 = 0x00000000
GHWCFG2 = 0x22a7c856
GHWCFG3 = 0x03380068
GHWCFG4 = 0x09f04060