* Thunderbolt: reboot hangs in nhi_pci_remove() with CalDigit TS5 Plus on AMD Strix Halo
@ 2026-09-26 2:06 brandon.proulx
2026-09-26 10:13 ` Mika Westerberg
0 siblings, 1 reply; 4+ messages in thread
From: brandon.proulx @ 2026-09-26 2:06 UTC (permalink / raw)
To: westeri@kernel.org, andreas.noever@gmail.com,
YehezkelShB@gmail.com
Cc: linux-usb@vger.kernel.org
[-- Attachment #1.1: Type: text/plain, Size: 1858 bytes --]
Hi,
On a Framework Desktop (AMD Ryzen AI Max 300 / Strix Halo) with a CalDigit
TS5 Plus attached, reboot never completes. After systemd finishes, PID 1
sits in D state in nhi_pci_remove() during device_shutdown() and the
machine never resets. The hardware watchdog does not fire either. Only the
power button recovers it.
Hardware:
System: Framework Desktop (AMD Ryzen AI Max 300 Series), BIOS 03.06 (2026-07-13)
Host routers:
c5:00.5 AMD Strix Halo USB4 Host Router [1022:158d], subsys [f111:000a]
c5:00.6 AMD Strix Halo USB4 Host Router [1022:158e], subsys [f111:000a]
Device: CalDigit TS5 Plus (thunderbolt 1-2, domain1 on c5:00.6), gen 4, NVM 64.c1
Kernel: 7.2.5 (distribution build 7.2.5-3-omarchy, Arch-based)
thunderbolt.host_reset=Y (default)
Stack of PID 1, sampled every few seconds from reboot until power-off.
Unchanged from 21:02:02 to 21:07:27:
[<0>] nhi_pci_remove+0x53/0x60 [thunderbolt]
[<0>] pci_device_shutdown+0x3e/0x80
[<0>] device_shutdown+0x169/0x1d0
[<0>] kernel_restart+0x3a/0x70
[<0>] __do_sys_reboot+0x22b/0x270
[<0>] do_syscall_64+0xaa/0x690
[<0>] entry_SYSCALL_64_after_hwframe+0x76/0x7e
The offset lands on the wait_for_completion(&nhi->domain_released) after
tb_domain_remove(), so it looks like the last reference to the domain is
never dropped while the TS5 Plus is connected. Unbinding the NHI via sysfs
(echo 0000:c5:00.6 > /sys/bus/pci/drivers/thunderbolt/unbind) before reboot
blocks in the same place (unbind_store -> nhi_pci_remove).
Reproduction:
1. Boot with the TS5 Plus connected to a rear USB4 port.
2. systemctl reboot
3. Machine hangs after the last systemd message and never resets.
Current workaround: sync, then SysRq-b (emergency_restart), which skips the
device_shutdown() walk.
Thanks,
Brandon Proulx
[-- Attachment #1.2: publickey - brandon.proulx@42fifty.dev - 0x5945A321.asc --]
[-- Type: application/pgp-keys, Size: 856 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 343 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Thunderbolt: reboot hangs in nhi_pci_remove() with CalDigit TS5 Plus on AMD Strix Halo
2026-09-26 2:06 Thunderbolt: reboot hangs in nhi_pci_remove() with CalDigit TS5 Plus on AMD Strix Halo brandon.proulx
@ 2026-09-26 10:13 ` Mika Westerberg
2026-09-28 20:29 ` brandon.proulx
0 siblings, 1 reply; 4+ messages in thread
From: Mika Westerberg @ 2026-09-26 10:13 UTC (permalink / raw)
To: brandon.proulx
Cc: westeri@kernel.org, andreas.noever@gmail.com,
YehezkelShB@gmail.com, linux-usb@vger.kernel.org
Hi,
On Sat, Sep 26, 2026 at 02:06:42AM +0000, brandon.proulx@42fifty.dev wrote:
> Hi,
> On a Framework Desktop (AMD Ryzen AI Max 300 / Strix Halo) with a CalDigit
> TS5 Plus attached, reboot never completes. After systemd finishes, PID 1
> sits in D state in nhi_pci_remove() during device_shutdown() and the
> machine never resets. The hardware watchdog does not fire either. Only the
> power button recovers it.
>
> Hardware:
> System: Framework Desktop (AMD Ryzen AI Max 300 Series), BIOS 03.06 (2026-07-13)
> Host routers:
> c5:00.5 AMD Strix Halo USB4 Host Router [1022:158d], subsys [f111:000a]
> c5:00.6 AMD Strix Halo USB4 Host Router [1022:158e], subsys [f111:000a]
> Device: CalDigit TS5 Plus (thunderbolt 1-2, domain1 on c5:00.6), gen 4, NVM 64.c1
>
> Kernel: 7.2.5 (distribution build 7.2.5-3-omarchy, Arch-based)
> thunderbolt.host_reset=Y (default)
>
> Stack of PID 1, sampled every few seconds from reboot until power-off.
> Unchanged from 21:02:02 to 21:07:27:
>
> [<0>] nhi_pci_remove+0x53/0x60 [thunderbolt]
> [<0>] pci_device_shutdown+0x3e/0x80
> [<0>] device_shutdown+0x169/0x1d0
> [<0>] kernel_restart+0x3a/0x70
> [<0>] __do_sys_reboot+0x22b/0x270
> [<0>] do_syscall_64+0xaa/0x690
> [<0>] entry_SYSCALL_64_after_hwframe+0x76/0x7e
>
> The offset lands on the wait_for_completion(&nhi->domain_released) after
> tb_domain_remove(), so it looks like the last reference to the domain is
> never dropped while the TS5 Plus is connected. Unbinding the NHI via sysfs
> (echo 0000:c5:00.6 > /sys/bus/pci/drivers/thunderbolt/unbind) before reboot
> blocks in the same place (unbind_store -> nhi_pci_remove).
>
> Reproduction:
> 1. Boot with the TS5 Plus connected to a rear USB4 port.
> 2. systemctl reboot
> 3. Machine hangs after the last systemd message and never resets.
>
> Current workaround: sync, then SysRq-b (emergency_restart), which skips the
> device_shutdown() walk.
There are bunch of fixes for this area in my "fixes" branch here:
https://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git/
I wonder if you could try those and see if the problem goes away?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Thunderbolt: reboot hangs in nhi_pci_remove() with CalDigit TS5 Plus on AMD Strix Halo
2026-09-26 10:13 ` Mika Westerberg
@ 2026-09-28 20:29 ` brandon.proulx
2026-09-29 6:40 ` Mika Westerberg
0 siblings, 1 reply; 4+ messages in thread
From: brandon.proulx @ 2026-09-28 20:29 UTC (permalink / raw)
To: Mika Westerberg
Cc: westeri@kernel.org, andreas.noever@gmail.com,
YehezkelShB@gmail.com, linux-usb@vger.kernel.org
[-- Attachment #1.1: Type: text/plain, Size: 3448 bytes --]
Hi Mika,
Yes. Those fixes clear the hang on my system.
I could not boot the fixes branch as-is. It is based on 7.3-rc1, and this system runs 7.2.5-3-omarchy. I applied these four commits onto the 7.2.5 thunderbolt driver and loaded that module:
• thunderbolt: Fix domain reference leak when DPRX read is canceled
• thunderbolt: Don't access a DP tunnel after its DPRX read was canceled
• thunderbolt: Mark discovered tunnels as active
• thunderbolt: Tear down inactive DP tunnels when the domain is stopped
Before that, unbinding 0000:c5:00.6 with the TS5 Plus attached blocked in nhi_pci_remove() at wait_for_completion(&nhi->domain_released), and reboot(2) stuck in the same place until I held the power button. dprx_timeout is 12000, but the wait lasted many minutes.
With the patched module, that unbind returned in about a second and the dock came back on rebind. A normal systemctl reboot then finished: systemd unmounted the filesystems and the machine reset, instead of sitting on the splash.
Thanks!
On Saturday, September 26th, 2026 at 06:13, Mika Westerberg <mika.westerberg@linux.intel.com> wrote:
> Hi,
>
> On Sat, Sep 26, 2026 at 02:06:42AM +0000, brandon.proulx@42fifty.dev wrote:
> > Hi,
> > On a Framework Desktop (AMD Ryzen AI Max 300 / Strix Halo) with a CalDigit
> > TS5 Plus attached, reboot never completes. After systemd finishes, PID 1
> > sits in D state in nhi_pci_remove() during device_shutdown() and the
> > machine never resets. The hardware watchdog does not fire either. Only the
> > power button recovers it.
> >
> > Hardware:
> > System: Framework Desktop (AMD Ryzen AI Max 300 Series), BIOS 03.06 (2026-07-13)
> > Host routers:
> > c5:00.5 AMD Strix Halo USB4 Host Router [1022:158d], subsys [f111:000a]
> > c5:00.6 AMD Strix Halo USB4 Host Router [1022:158e], subsys [f111:000a]
> > Device: CalDigit TS5 Plus (thunderbolt 1-2, domain1 on c5:00.6), gen 4, NVM 64.c1
> >
> > Kernel: 7.2.5 (distribution build 7.2.5-3-omarchy, Arch-based)
> > thunderbolt.host_reset=Y (default)
> >
> > Stack of PID 1, sampled every few seconds from reboot until power-off.
> > Unchanged from 21:02:02 to 21:07:27:
> >
> > [<0>] nhi_pci_remove+0x53/0x60 [thunderbolt]
> > [<0>] pci_device_shutdown+0x3e/0x80
> > [<0>] device_shutdown+0x169/0x1d0
> > [<0>] kernel_restart+0x3a/0x70
> > [<0>] __do_sys_reboot+0x22b/0x270
> > [<0>] do_syscall_64+0xaa/0x690
> > [<0>] entry_SYSCALL_64_after_hwframe+0x76/0x7e
> >
> > The offset lands on the wait_for_completion(&nhi->domain_released) after
> > tb_domain_remove(), so it looks like the last reference to the domain is
> > never dropped while the TS5 Plus is connected. Unbinding the NHI via sysfs
> > (echo 0000:c5:00.6 > /sys/bus/pci/drivers/thunderbolt/unbind) before reboot
> > blocks in the same place (unbind_store -> nhi_pci_remove).
> >
> > Reproduction:
> > 1. Boot with the TS5 Plus connected to a rear USB4 port.
> > 2. systemctl reboot
> > 3. Machine hangs after the last systemd message and never resets.
> >
> > Current workaround: sync, then SysRq-b (emergency_restart), which skips the
> > device_shutdown() walk.
>
> There are bunch of fixes for this area in my "fixes" branch here:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git/
>
> I wonder if you could try those and see if the problem goes away?
>
[-- Attachment #1.2: publickey - brandon.proulx@42fifty.dev - 0x5945A321.asc --]
[-- Type: application/pgp-keys, Size: 856 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 343 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Thunderbolt: reboot hangs in nhi_pci_remove() with CalDigit TS5 Plus on AMD Strix Halo
2026-09-28 20:29 ` brandon.proulx
@ 2026-09-29 6:40 ` Mika Westerberg
0 siblings, 0 replies; 4+ messages in thread
From: Mika Westerberg @ 2026-09-29 6:40 UTC (permalink / raw)
To: brandon.proulx
Cc: westeri@kernel.org, andreas.noever@gmail.com,
YehezkelShB@gmail.com, linux-usb@vger.kernel.org
On Mon, Sep 28, 2026 at 08:29:55PM +0000, brandon.proulx@42fifty.dev wrote:
>
> Hi Mika,
>
> Yes. Those fixes clear the hang on my system.
>
> I could not boot the fixes branch as-is. It is based on 7.3-rc1, and this system runs 7.2.5-3-omarchy. I applied these four commits onto the 7.2.5 thunderbolt driver and loaded that module:
>
> • thunderbolt: Fix domain reference leak when DPRX read is canceled
> • thunderbolt: Don't access a DP tunnel after its DPRX read was canceled
> • thunderbolt: Mark discovered tunnels as active
> • thunderbolt: Tear down inactive DP tunnels when the domain is stopped
>
> Before that, unbinding 0000:c5:00.6 with the TS5 Plus attached blocked in nhi_pci_remove() at wait_for_completion(&nhi->domain_released), and reboot(2) stuck in the same place until I held the power button. dprx_timeout is 12000, but the wait lasted many minutes.
>
> With the patched module, that unbind returned in about a second and the dock came back on rebind. A normal systemctl reboot then finished: systemd unmounted the filesystems and the machine reset, instead of sitting on the splash.
>
Great to hear that it helped :)
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-09-29 6:40 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-26 2:06 Thunderbolt: reboot hangs in nhi_pci_remove() with CalDigit TS5 Plus on AMD Strix Halo brandon.proulx
2026-09-26 10:13 ` Mika Westerberg
2026-09-28 20:29 ` brandon.proulx
2026-09-29 6:40 ` Mika Westerberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox