[Letux-kernel] Minor annoyances with USB(3) port on Pyra
H. Nikolaus Schaller
hns at goldelico.com
Sun Sep 9 10:39:23 CEST 2018
Hi Roger,
> Am 31.08.2018 um 09:32 schrieb Roger Quadros <rogerq at ti.com>:
>
> Nikolaus,
>
> On 30/08/18 20:17, H. Nikolaus Schaller wrote:
>> Hi Roger,
>>
>>> Am 30.08.2018 um 16:15 schrieb Roger Quadros <rogerq at ti.com>:
>>>
>>> Hi Nikolaus,
>>>
>>> Sorry for the delay. My reply below.
>>
>> no problem - we have enough other issues to work on (e.g. TILER, AESS) :)
>>
>>>
>>> On 05/07/18 11:22, Tony Lindgren wrote:
>>>> Hi,
>>>>
>>>> * H. Nikolaus Schaller <hns at goldelico.com> [180704 18:06]:
>>>>> Hi Tony,
>>>>> I have seen two small issues:
>>>>>
>>>>> a) USB client mode works fine, except that on first plug in
>>>>> of the cable I see NOHZ warnings (which seem to be harmless):
>>>>>
>>>>>> dhcpcd[2317]: version 6.0.5 starting
>>>>>> dhcpcd[2317]: wlan0: waiting for carrier
>>>>>> dhcpcd[2317]: usb0: waiting for carrier
>>>>>> dhcpcd[2317]: wlan0: carrier acquired
>>>>>> dhcpcd[2317]: wlan0: carrier lost
>>>>>> dhcpcd[2317]: wlan0: waiting for carrier
>>>>>> [ 23.626353] wlcore: down
>>>>>> [ 46.919138] g_ether gadget: high-speed config #1: CDC Ethernet (ECM)
>>>>>> [ 47.285640] bq24296: VBUS became available
>>>>>> [ 47.290052] bq24296_update_input_current_limit(6)
>>>>>> [ 48.531529] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready
>>>>>> [ 48.593338] NOHZ: local_softirq_pending 08
>>>>>> [ 48.826821] NOHZ: local_softirq_pending 08
>>>>>> [ 48.987261] NOHZ: local_softirq_pending 08
>>>>>> [ 49.288690] NOHZ: local_softirq_pending 08
>>>>>> [ 49.381113] NOHZ: local_softirq_pending 08
>>>>>> [ 49.610246] NOHZ: local_softirq_pending 08
>>>>>> [ 49.774833] NOHZ: local_softirq_pending 08
>>>>>> [ 49.888948] NOHZ: local_softirq_pending 08
>>>>>> [ 50.143018] NOHZ: local_softirq_pending 08
>>>>>> [ 50.168652] NOHZ: local_softirq_pending 08
>>>>>> dhcpcd[2317]: timed out
>>>>>> dhcpcd[2317]: allowing 8 seconds for IPv4LL timeout
>>>>>> dhcpcd[2317]: usb0: carrier acquired
>>>>>> dhcpcd[2317]: usb0: soliciting an IPv6 router
>>>>>> dhcpcd[2317]: usb0: using IPv4LL address 169.254.83.144
>>>>>> dhcpcd[2317]: usb0: adding host route to 169.254.83.144 via 127.0.0.1
>>>>>> dhcpcd[2317]: usb0: adding route to 169.254.0.0/16
>>>>>> dhcpcd[2317]: forked to background, child pid 2812
>>>>>> [FAIL] startpar: service(s) returned failure: isc-dhcp-server ... failed!
>>>>>>
>>>>>> Debian GNU/Linux 8 letux console
>>>>>>
>>>>>> letux login: root
>>>>>> Password:
>>>>>
>>>>> It is the same on omap5uevm:
>>>>>
>>>>>> root at letux:~# [ 2858.377258] g_ether gadget: high-speed config #1: CDC Ethernet (ECM)
>>>>>> [ 2859.205770] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready
>>>>>> [ 2859.279922] NOHZ: local_softirq_pending 08
>>>>>> [ 2859.481076] NOHZ: local_softirq_pending 08
>>>>>> [ 2859.800392] NOHZ: local_softirq_pending 08
>>>>>> [ 2859.913331] NOHZ: local_softirq_pending 08
>>>>>> [ 2860.052946] NOHZ: local_softirq_pending 08
>>>>>> [ 2860.232251] NOHZ: local_softirq_pending 08
>>>>>> [ 2860.280545] NOHZ: local_softirq_pending 08
>>>>>> [ 2860.445238] NOHZ: local_softirq_pending 08
>>>>>> [ 2860.541821] NOHZ: local_softirq_pending 08
>>>>>> [ 2860.808122] NOHZ: local_softirq_pending 08
>>>>>>
>>>>>> root at letux:~# [ 2872.169307] g_ether gadget: high-speed config #1: CDC Ethernet (ECM)
>>>>>>
>>>>>
>>>>>
>>>>> b) OTG mode detects cable plugin (extcon) and turns on power
>>>>> but dwc3 does not try to find the connected device
>>>>>
>>>>>> root at letux:~# [ 692.970418] bq24296: VBUS became unavailable
>>>>>> [ 850.289966] bq24296_otg_is_enabled(1)
>>>>>> [ 850.294997] bq24296_otg_enable(1)
>>>>>> [ 858.377691] bq24296_otg_disable(1)
>>>>>> [ 864.544944] bq24296_otg_is_enabled(1)
>>>>>> [ 864.549017] bq24296_otg_enable(1)
>>>>>> [ 866.834895] bq24296_otg_disable(1)
>>>>>>
>>>>>
>>>>>
>>>>> Same on omap5uevm (just power can be measured, not the bq24296 printk of course).
>>>>>
>>>
>>> otg mode was never tested on omap5uevm.
>>>
>>> omap5.dtsi sets dwc3 controller's dr_mode to "peripheral". And it remains like that.
>>> So we need to set it to "otg" in the boards that need dual-role support.
>>
>> Ah, ok. That explains a lot!
>>
>> I had only verified that we have enabled OTG support in the CONFIG.
>>
>>>
>>> The other missing piece for omap5uevm is how to enable the VBUS regulator that is on the PMIC (palmas).
>>> Unlike later SoCs (AM43/DRA7) omap5 doesn't have a DRVVBUS pin that can turn on an external VBUS regulator. So this must be done by SW.
>>
>> Powering the external device seems to work, when I plug in an USB-Host cable, I get 5V output. If I remember correctly (I have no access to the EVM in the next days), there is an extcon dedicated to detecting the ID pin and turning on SMPS10.
>
> Which driver is it using? Is it upstream?
> But if it is taking care of turning on/off vbus independently then it should be fine. We don't have to plug it to the dwc3 driver.
>
>>
>>>
>>> The USB2 PHY that we use model in omap5.dtsi is a generic-phy and does not implement otg_set_vbus(). VBUS regulator is managed by PMIC.
>>> So we need to model the PMIC VBUS regulator as a 2nd USB2 PHY and implement otg->set_host() and otg->set_peripheral() for it.
>>>
>>>>> Any ideas how to fix / debug?
>>>>
>>>
>>> Can I see your board's device tree file?
>>
>> For tests on the EVM, I use the upstream omap5-uevm.dts which is based on omap5-board-common.dtsi.
>>
>>>
>>> Can you see dwc3 otg interrupts in /proc/interrupts when you plug/unplug a host adapter?
>>
>> Yes, I'll test that asap.
>
> You could also apply the below patch so we know what role the controller is in.
>
> diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c
> index 218371f..56c94cd 100644
> --- a/drivers/usb/dwc3/drd.c
> +++ b/drivers/usb/dwc3/drd.c
> @@ -327,6 +327,20 @@ static void dwc3_otg_device_exit(struct dwc3 *dwc)
> dwc3_writel(dwc->regs, DWC3_OCTL, reg);
> }
>
> +static char * otg_role_string(int role)
> +{
> + switch (role) {
> + case DWC3_OTG_ROLE_IDLE:
> + return "idle";
> + case DWC3_OTG_ROLE_DEVICE:
> + return "device";
> + case DWC3_OTG_ROLE_HOST:
> + return "host";
> + default:
> + return "invalid";
> + }
> +}
> +
> void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus)
> {
> int ret;
> @@ -372,6 +386,8 @@ void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus)
>
> spin_lock_irqsave(&dwc->lock, flags);
>
> + dev_info(dwc->dev, "otg: %s->%s\n", otg_role_string(dwc->current_otg_role),
> + otg_role_string(dwc->desired_otg_role));
> dwc->current_otg_role = dwc->desired_otg_role;
>
> spin_unlock_irqrestore(&dwc->lock, flags);
>
>
> --
> cheers,
> -roger
I have added your patch and added
+&dwc3 {
+ dr_mode = "otg";
+};
+
to omap5-board-common.dtsi (because it already handles extcon/smps10 enable).
And it looks as if OTG just works!
a) after boot
root at letux:~# dmesg|fgrep dwc3
[ 5.733612] dwc3 4a030000.dwc3: Failed to get clk 'ref': -2
[ 5.774769] dwc3 4a030000.dwc3: otg: idle->device
[ 5.785048] dwc3 4a030000.dwc3: changing max_speed on rev 5533202a
root at letux:~#
b) when plugging in client cable (works the same as before)
[ 273.025757] g_ether gadget: high-speed config #1: CDC Ethernet (ECM)
[ 274.367805] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready
[ 274.430674] NOHZ: local_softirq_pending 08
[ 274.733861] NOHZ: local_softirq_pending 08
[ 274.825679] NOHZ: local_softirq_pending 08
[ 275.011571] NOHZ: local_softirq_pending 08
[ 275.087843] NOHZ: local_softirq_pending 08
[ 275.217868] NOHZ: local_softirq_pending 08
[ 275.404545] NOHZ: local_softirq_pending 08
[ 275.432020] NOHZ: local_softirq_pending 08
[ 275.612179] NOHZ: local_softirq_pending 08
[ 275.721921] NOHZ: local_softirq_pending 08
c) when plugging in the OTG cable
[ 312.903775] dwc3 4a030000.dwc3: otg: device->host
[ 312.916996] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[ 312.924253] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 2
[ 312.934021] xhci-hcd xhci-hcd.1.auto: hcc params 0x0220f04c hci version 0x100 quirks 0x0000000002010010
[ 312.944522] xhci-hcd xhci-hcd.1.auto: irq 183, io mem 0x4a030000
[ 312.951418] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.18
[ 312.960256] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 312.968059] usb usb2: Product: xHCI Host Controller
[ 312.973287] usb usb2: Manufacturer: Linux 4.18.0-letux+ xhci-hcd
[ 312.979577] usb usb2: SerialNumber: xhci-hcd.1.auto
[ 312.985199] hub 2-0:1.0: USB hub found
[ 312.989255] hub 2-0:1.0: 1 port detected
[ 313.003056] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[ 313.011929] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 3
[ 313.019970] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed
[ 313.027037] usb usb3: We don't know the algorithms for LPM for this host, disabling LPM.
[ 313.035684] usb usb3: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 4.18
[ 313.044413] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 313.052015] usb usb3: Product: xHCI Host Controller
[ 313.057186] usb usb3: Manufacturer: Linux 4.18.0-letux+ xhci-hcd
[ 313.063501] usb usb3: SerialNumber: xhci-hcd.1.auto
[ 313.069163] hub 3-0:1.0: USB hub found
[ 313.073157] hub 3-0:1.0: 1 port detected
d) plugging in an USB2 memory stick to the OTG port
[ 335.872164] usb 2-1: new high-speed USB device number 2 using xhci-hcd
[ 336.052854] usb 2-1: New USB device found, idVendor=0204, idProduct=6025, bcdDevice= 1.00
[ 336.061427] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 336.068957] usb 2-1: Product: Flash Disk
[ 336.073122] usb 2-1: Manufacturer: CBM
[ 336.077060] usb 2-1: SerialNumber: 221835001DC5F204
[ 336.085548] usb-storage 2-1:1.0: USB Mass Storage device detected
[ 336.092844] scsi host2: usb-storage 2-1:1.0
[ 337.138193] scsi 2:0:0:0: Direct-Access CBM Flash Disk 5.00 PQ: 0 ANSI: 2
[ 337.148804] sd 2:0:0:0: Attached scsi generic sg2 type 0
[ 337.166049] sd 2:0:0:0: [sdc] 2072064 512-byte logical blocks: (1.06 GB/1012 MiB)
[ 337.174299] sd 2:0:0:0: [sdc] Write Protect is off
[ 337.179326] sd 2:0:0:0: [sdc] Mode Sense: 0b 00 00 08
[ 337.184845] sd 2:0:0:0: [sdc] No Caching mode page found
[ 337.190409] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 337.198545] sdc: sdc1
[ 337.205988] sd 2:0:0:0: [sdc] Attached SCSI removable disk
/usr/share/usbmount/usbmount: label DOS
Mountpoints /media/hns/DOS /media/usb0 /media/usb1 /media/usb2 /media/usb3
/media/usb4 /media/usb5 /media/usb6 /media/usb7
Mounting DOS
rmdir /media/hns/boot
rmdir: failed to remove '/media/hns/boot': Directory not empty
rmdir /media/hns/rootfs
rmdir: failed to remove '/media/hns/rootfs': Directory not empty
[ 337.590093] FAT-fs (sdc1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
[ 338.181832] omap_i2c 48072000.i2c: timeout waiting for bus ready
[ 338.188145] bq2429x_charger 1-006b: bq24296_charger_probe(): Failed in reading register 0x0a
e) unplugging memory stick
[ 359.540212] usb 2-1: USB disconnect, device number 2
f) unplugging cable
[ 582.297499] xhci-hcd xhci-hcd.1.auto: remove, state 4
[ 582.302937] usb usb3: USB disconnect, device number 1
[ 582.309817] xhci-hcd xhci-hcd.1.auto: USB bus 3 deregistered
[ 582.318382] xhci-hcd xhci-hcd.1.auto: remove, state 4
[ 582.323684] usb usb2: USB disconnect, device number 1
[ 582.331065] xhci-hcd xhci-hcd.1.auto: USB bus 2 deregistered
[ 582.338002] dwc3 4a030000.dwc3: otg: host->device
[ 582.343218] dwc3 4a030000.dwc3: changing max_speed on rev 5533202a
[ 582.350704] using random self ethernet address
[ 582.355404] using random host ethernet address
[ 582.360121] using host ethernet address: 32:70:05:18:ff:78
[ 582.360125] using self ethernet address: 46:10:3a:b3:af:d9
[ 582.366515] usb0: HOST MAC 32:70:05:18:ff:78
[ 582.377671] usb0: MAC 46:10:3a:b3:af:d9
[ 582.382025] using random self ethernet address
[ 582.388579] using random host ethernet address
[ 582.393353] g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
[ 582.400333] g_ether gadget: g_ether ready
g) plugging client cable
[ 612.975725] g_ether gadget: high-speed config #1: CDC Ethernet (ECM)
It properly switches from device -> host -> device mode and is already useable.
What I have not observed is a transition to -> idle and I have not yet tested
with an USB3 device.
BTW: is there a /sys node to read the OTG state?
So I'll test a little more an send a patch for review to LKML in the next days.
BR and thanks,
Nikolaus
More information about the Letux-kernel
mailing list