Skip to content

Kestrel FastRetune: drop the per-hop synth relock + DDV writes (25 → 9 ms)#327

Merged
josephnef merged 1 commit into
masterfrom
kestrel-fastretune-levers
Jul 20, 2026
Merged

Kestrel FastRetune: drop the per-hop synth relock + DDV writes (25 → 9 ms)#327
josephnef merged 1 commit into
masterfrom
kestrel-fastretune-levers

Conversation

@josephnef

Copy link
Copy Markdown
Collaborator

Follow-up to #326's compose-cache — the two remaining levers, both measured and soak-validated (and both contradicting my earlier "that would deafen the radio" guess; I tested rather than assumed this time).

Per-stage profiling of the ~25 ms compose-cache hop showed the split: synth relock 10–18 ms (~60%), path-B write ~3 ms, DDV ~3 ms.

Lever 1 — relock only on a sub-band crossing (the big one)

The path-A channel write runs a full synth PLL relock (halrf_set_s0_arfc18: 0xd3 hold + RF18 write + a ~13 ms 0xb7 LCK poll) + fast_lck_check (MMD-reset recovery). For a same-sub-band hop the VCO moves only a little and settles on its own during the caller's admission window, so the LCK poll is pure blocking — a plain RF18 write holds channel accuracy. The full relock (the only path with lock-failure recovery) is kept for a sub-band crossing (a bigger VCO jump), gated on the same gain_bucket change that already drives the gain re-apply.

Lever 2 — drop the DDV writes

The d-die 0x10018 window is not populated on the single-die 8852B, so its two SI writes + two 0xcf toggles cost no channel accuracy.

Results (8852B DUT, host oracles)

hop switch wrong-channel
same-sub-band (36/40/44) ~9 ms 0 (delivery 98.5%)
cross-sub-band (36/44/149) ~13 ms 0
aggressive-config soak, 2000 hops 0 (delivery ~97%)

Net from the ~44 ms unoptimized hop: ~5× (44 → 9 ms), putting Kestrel FHSS within reach of the 11ac chips (~50 ms dwell-1 slot → ~30 ms). A SetMonitorChannel still always relocks, so the fast hop's dropped lock-verify guarantee is bounded to the intra-sub-band case where it's empirically safe.

Docs: updated Kestrel row + explanation in docs/frequency-hopping.md and the FastRetune section in src/kestrel/CLAUDE.md. ctest 36/36.

🤖 Generated with Claude Code

… 9 ms)

Two more levers on top of the compose-cache, both on-air + soak validated
(and both contradicting my earlier "that would deafen the radio" guess —
tested, not assumed):

- The synth PLL relock (halrf_set_s0_arfc18's ~13 ms LCK poll) was ~60% of
  the hop. For a SAME-sub-band hop the VCO moves little and settles during the
  caller's admission window, so a plain RF18 write holds channel accuracy; the
  full relock + LCK verify (the only path with MMD-reset lock recovery) is kept
  for a sub-band crossing (a bigger jump). Gated on the gain-bucket change that
  already drives the gain re-apply.
- The DDV (d-die 0x10018) writes are unpopulated on the single-die 8852B —
  dropping them costs no channel accuracy.

Same-sub-band hops land at ~9 ms, cross-sub-band ~13 ms, both zero
wrong-channel (adjacent 36/40/44 delivery 98.5%; cross 36/44/149 wrong=0;
aggressive-config soak 2000 hops zero wrong-channel, ~97% delivery). Net from
the ~44 ms unoptimized hop: ~5x. A SetMonitorChannel still always relocks, so
the fast hop's dropped guarantee is bounded to the intra-sub-band case.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@josephnef
josephnef merged commit 392a26c into master Jul 20, 2026
18 checks passed
@josephnef
josephnef deleted the kestrel-fastretune-levers branch July 20, 2026 18:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant