Re: [PATCH v2 0/2] usb: dwc2: fix USB peripheral role in dual-role mode on PX30

From: Quentin Schulz
Date: Mon Jan 02 2023 - 06:55:25 EST


Hi Minas,

On 12/20/22 07:02, Minas Harutyunyan wrote:
Hi Quentin,

On 12/16/2022 8:29 PM, Quentin Schulz <foss+kernel@xxxxxxxxx> wrote:
From: Quentin Schulz <foss+kernel@xxxxxxxxx>
Sent: Friday, December 16, 2022 8:29 PM
To: Minas Harutyunyan <hminas@xxxxxxxxxxxx>; Greg Kroah-Hartman
<gregkh@xxxxxxxxxxxxxxxxxxx>
Cc: Quentin Schulz <foss+kernel@xxxxxxxxx>; linux-usb@xxxxxxxxxxxxxxx;
linux-kernel@xxxxxxxxxxxxxxx; Bin Yang <yangbin@xxxxxxxxxxxxxx>; Quentin
Schulz <quentin.schulz@xxxxxxxxxxxxxxxxxxxxx>
Subject: [PATCH v2 0/2] usb: dwc2: fix USB peripheral role in dual-role mode
on PX30

On Theobroma Ringneck SoM, USB peripheral role when in dual-role mode does
not work and displays the following error message:
dwc2 ff300000.usb: dwc2_core_reset: HANG! Soft Reset timeout GRSTCTL_CSFTRST


This mostly happen if PHY not initialized correctly.


Any way to know which part of the PHY wouldn't be correctly initialized? or is this just a whack-a-mole game with register bits?

The USB sniffer shows nothing and dumping the host registers is stuck on
HCDMA(0) register.

Note that for some reason it works "fine" on PX30-EVB (there's another issue
but not related to/fixed in this patch series).

Since there's no documentation available for this IP, this patch series is
basically just slightly adapted downstream BSP vendor kernel patches and I
cannot unfortunately give more information than what I have.

This patch series was tested on Theobroma Ringneck SoM on Haikou devkit and
PX30 EVB. It fixes Ringneck support and does not break PX30-EVB's.

For reference, the content of those commits can be found in tag linux-5.10-
gen-rkr1, and the following commits have been used:
964d50060bf53a8defd1fc561b9261424f25ddad
ad81c375602819a538ad68d979906c05663046e2
6e6adab8f735bc4fe27a67bdc3144d8fa89250d4
7c3a4e60247fd7f7b04d95d15cb12c63a5c20408

Note that Rockchip kernel called a slightly different implementation of
__dwc2_lowlevel_hw_enable instead of dwc2_lowlevel_hw_enable but it seemed
more right to me to call dwc2_lowlevel_hw_enable as done for the forced
peripheral mode.

Note that it is still not flawlessly working but the support is improved
(somewhat working vs not working at all).

If "still not flawlessly working" maybe required deeper investigate issue
and submit "flawlessly working" patch.


I would love to honestly. But no documentation and the vendor kernel works differently but not better. I get the point, not sure I'll be able to provide any meaningful improvement to this patch though. Let's see if I'll have time to dig into this sometime soon (I expect not :/).

I'm all ears if someone wants to share how they would start debugging this though.

Cheers,
Quentin