Description
After dwc3_0 (40a280000.usb) on the MacBook Neo (J700) is unbound, put through a deep sleep and rebound, later sleeps still can't keep the USB host in place, so they take the deep path. This happens on kernel 7.3.0-36 (integration 9219565), which includes #1658's fix for exactly this sequence. It's test-only: users don't unbind dwc3, and the deep path works. So this isn't a blocker, but it means #1658's fix doesn't cover every case.
Measured on the Neo, 2026-11-12
| Kernel / DTB | After the rebind |
|---|---|
| 5a62cab (#1658 head on 69c201c), DTB without #1298 | 2/2 DRAM-kept, no PIPE lock errors (#1658's own test) |
| 7.3.0-36 RPM (9219565), its own DTB, aura b11 | 5/5 deep; xHCI re-created after each wake |
| 7.3.0-36 RPM (9219565), its own DTB, aura b12 | 1st DRAM-kept, with the PHY logging mode 0 lost in the sleep: setting it up again (#1658's path). 2nd deep: USB controller stops for the sleep: mode 2, PIPE 1, host 1 |
| 2573357 (before #1658), its own DTB | 00:30: deep after the rebind, with Pipehandler lock not acked / Host starts with its PIPE not parked. 07:20: 2/2 DRAM-kept despite 4× PIPE lock timeout: ack=0x0 mode=2 pipe=0 and 2× PIPE not parked |
In the 7.3.0-36 runs, mode 2 (USB3), PIPE 1 (USB3) and host 1 all pass atcphy_can_sleep_in_place(). So one of its other conditions fails. The debug line doesn't say which:
sleep_power, oratcphy_sleep_power_ready()(the DART listing orapple_sleep_domain_check()ofpd_usb/pd_common);sleep_no_keep,mode_dirtyorpipe_pending;usb_off_pending,dp_owned_pmas,aux_power_requestedortunnel_users.
The 2573357 row shows the outcome after a rebind also varies from run to run, so timing is involved.
DT difference
The ATC PHY (phy@40b000000) and usb@40a280000 nodes are the same in both DTBs, apart from phandle numbers. #1298 changed the ATC0 power-domain parents:
atc0_common:power-domains = <&ps_atc0_usb_aon>before,<&ps_afisocni2 &ps_atc0_usb_aon>in 9219565's DTB.
atcphy_sleep_power_ready() checks pd_common through apple_sleep_domain_check(), so the added parent is a candidate.
Suggested next step
Have the USB controller stops for the sleep debug line in apple_atcphy_sleep_prepare() print which condition of atcphy_can_sleep_in_place() failed. Then rerun unbind, deep sleep, rebind and two sleeps on 7.3.0-36, with and without the afisocni2 parent on atc0_common.
Evidence on the lab host: migration/neo-continuation-20261108/final-validation/fast1/rows/{rpmqual-wk,b12qual-dwr,b12qual-kitdwr,dwr2..dwr5}, and the notes in migration/neo-continuation-20261108/resume-trim/README.md.
🤖 Generated with Claude Code
Activity
Merge pull request #1701 from aurora-silicon/fix/atc-sleep-in-place-why