Kernel crash on tegra-xudc, when multiple phys are added

Hello,
I encounter a crash in the xudc driver when attempting to add more than one PHYs to the xudc@355000 node. Could you guide me on the proper method to configure this node?
We’re working with a custom board derived from Jetson Orin Nano, which includes two USB-C ports. Our aim is to set the data-role for both ports as dual.

tegra_xudc: xudc@3550000 {
phys = <&{/xusb_padctl@3520000/pads/usb2/lanes/usb2-0}>,
<&{/xusb_padctl@3520000/pads/usb3/lanes/usb3-1}>,
<&{/xusb_padctl@3520000/pads/usb2/lanes/usb2-1}>,
<&{/xusb_padctl@3520000/pads/usb3/lanes/usb3-0}>;
phy-names = “usb2-0”, “usb3-1”, “usb2-1”, “usb3-0”;
}

[ 5.255327] hub 1-0:1.0: 4 ports detected
[ 5.259740] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.10
[ 5.267729] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 5.274984] usb usb2: Product: xHCI Host Controller
[ 5.279973] usb usb2: Manufacturer: Linux 5.10.192-l4t-35.5.0+g86e0ef868c78 xhci-hcd
[ 5.287770] usb usb2: SerialNumber: 3610000.xhci
[ 5.293054] hub 2-0:1.0: USB hub found
[ 5.296354] hub 2-0:1.0: 4 ports detected
[ 5.304805] ------------[ cut here ]------------
[ 5.305084] double register detected
[ 5.305154] WARNING: CPU: 5 PID: 134 at kernel/notifier.c:27 notifier_chain_register+0x5c/0x90
[ 5.317334] Modules linked in:
[ 5.320404] CPU: 5 PID: 134 Comm: kworker/5:3 Not tainted 5.10.192-l4t-35.5.0+g86e0ef868c78 #1
[ 5.328707] Hardware name: NVIDIA COGNEX PEREGRINE NONE NONE/Jetson, BIOS v35.5.0 02/26/2024
[ 5.337303] Workqueue: events deferred_probe_work_func
[ 5.342451] pstate: 60c00089 (nZCv daIf +PAN +UAO -TCO BTYPE=–)
[ 5.348393] pc : notifier_chain_register+0x5c/0x90
[ 5.353383] lr : notifier_chain_register+0x5c/0x90
[ 5.358194] sp : ffff80001182bad0
[ 5.361607] x29: ffff80001182bad0 x28: 000000000000001f
[ 5.366770] x27: ffff011145a93914 x26: ffffa26292b52580
[ 5.372194] x25: ffffa26294999aa0 x24: 0000000fffffffe0
[ 5.377617] x23: ffff011145a93a80 x22: 0000000000000001
[ 5.383130] x21: 0000000000000001 x20: ffff01114598d1c8
[ 5.388555] x19: ffff011145a93a80 x18: ffffffffffffffff
[ 5.394068] x17: 0000000000000000 x16: 0000000058e591f9
[ 5.399581] x15: ffff80009182b6a7 x14: 0000000000000006
[ 5.404917] x13: ffff80001182b6af x12: 0000000000000038
[ 5.410344] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f
[ 5.415855] x9 : ffffa262947a7b60 x8 : 00000000ffffefff
[ 5.421193] x7 : ffffa262947ffb60 x6 : 000000000000b5d8
[ 5.426531] x5 : fffffffffffe8538 x4 : 0000000000000fff
[ 5.431957] x3 : 00000000ffffffff x2 : 0000000000000000
[ 5.437294] x1 : 0000000000000000 x0 : ffff01129859bb00
[ 5.442634] Call trace:
[ 5.445086] notifier_chain_register+0x5c/0x90
[ 5.449368] atomic_notifier_chain_register+0x38/0x60
[ 5.454462] tegra_xudc_probe+0xa84/0xd04
[ 5.458650] platform_drv_probe+0x5c/0xb0
[ 5.462669] really_probe+0xf8/0x4ec
[ 5.466170] driver_probe_device+0x60/0xf0
[ 5.470194] __device_attach_driver+0xb8/0x120
[ 5.474659] bus_for_each_drv+0x8c/0xe0
[ 5.478419] __device_attach+0xb4/0x1c4
[ 5.482181] device_initial_probe+0x28/0x34
[ 5.486208] bus_probe_device+0xa4/0xb0
[ 5.490145] deferred_probe_work_func+0x90/0xc4
[ 5.494700] process_one_work+0x1d8/0x4d0
[ 5.498720] worker_thread+0x2c0/0x490
[ 5.502482] kthread+0x160/0x164
[ 5.505902] ret_from_fork+0x10/0x18
[ 5.509393] —[ end trace b2c1294528f437f2 ]—
[ 5.517994] at24 0-0050: supply vcc not found, using dummy regulator
[ 5.520727] at24 0-0050: 256 byte 24c02 EEPROM, writable, 1 bytes/write
[ 5.532278] irq: IRQ283: trimming hierarchy from :pmc@c360000
[ 6.331862] at24 7-0053: supply vcc not found, using dummy regulator
[ 6.332372] at24 7-0053: 256 byte se97b EEPROM, writable, 1 bytes/write
[ 6.335749] i2c i2c-2: Added multiplexed i2c bus 9
[ 6.336577] i2c i2c-2: Added multiplexed i2c bus 10
[ 6.336726] i2c-mux-gpio cam_i2cmux: 2 port mux on 3180000.i2c adapter
[ 6.337206] tegra23x-oc-event soctherm-oc-event: Finished tegra23x overcurrent event probing
[ 6.350300] cpufreq: cpufreq_online: CPU0: Running at unlisted initial frequency: 1616000 KHz, changing to: 1510400 KHz
[ 6.352195] cpufreq: cpufreq_online: CPU4: Running at unlisted initial frequency: 1582000 KHz, changing to: 1510400 KHz
[ 6.353271] tegra194-cpufreq e000000.ccplex: probed with ICC, cl:3

You better sharing the full dmesg and full dts converted from dtb.

dmesg_log.log (61.9 KB)
extracted_proc.txt (430.9 KB)

Please see the attached files containing the full dmesg and the dts converted from the dtb.
Thank you!

Hi,

Just double checked with our internal team, our USB driver does not support multi device port.

Thus, please do not add multiple phys there.

Hi,
Thanks for the info. Could there be an alternative method to set up two USB-C ports in dual mode? In our custom carrier board, the TPS65988 PD controller handles the USB role switch. I would appreciate a sample configuration.

No, there is no alternative solution here.

Alright, we’ve set USB2-0 as the host and USB2-1 as Dual role. However,
Flashing with initrd is not working because USB2-0 is the recovery port.

Is it possible to set USB2-0 as Dual-role (within the initrd flashing kernel) and then reconfigure it as a HOST on the installed kernel?

Thank you!

Best regards,
Aman

You have to prepare two Linux_for_Tegra folders

  1. for one Linux_for_Tegra folder run initrd flash with –no-flash option to generate the flash images with the kernel change. The image will be in tools/kernel_flash/images

  2. for the other Linux_for_Tegra folder without the kernel change, you can copy the tools/kernel_flash/images from (1) to this Linux_for_Tegra/tools/kernel_flash

  3. Run this flash command with --use-backup-image. Then it will use the images folder that get copied over
    tools/kernel_flash/l4t_initrd_flash.sh --use-backup-image jetson-orin-nano-devkit mmcblk0p1

(1) is the image you want to “flash into” the system. Thus, your kernel dtb could disable usb device mode here.

(2) is the image you are using for initrd flash tool. Thus, this kernel dtb has to enable usb device mode.