DEVOURER_TX_RETRY_FALLBACK=off: pin retries at the descriptor rate; floor form measured and rejected (#362) - #371
Conversation
…loor form measured and rejected Every generation's inject path leaves the firmware retry rate-fallback ladder enabled (measured on the 8812CU: retried frames step MCS3 -> 54M -> 24M -> 18M -> 9M -> 6M, ~10% of retried frames finishing below the original rate). That is the right default for weak-signal links and the wrong one for constant-rate FPV, where a 6M re-air of an MCS3 frame costs ~4x airtime — the new knob's "off" sets DISDATAFB / DISABLE_FB and pins every retry at the descriptor DATARATE (measured: 1,200/1,200 retried frames re-aired at the original rate; default arm replicates the ladder; both at retry_limit 8, ~60k reports/arm). A DATA_RTY_LOWEST_RATE floor form was implemented, measured, and REJECTED: the fw reinterprets the bound inside the RA-group rate space (inject runs RA-group 9) — an MCS0 floor sent retried HT frames wandering into VHT rates (final_rate 45 = VHT1SS_MCS1) with a 20x retry inflation and a point of delivery loss. The enum carries the finding, the FrameParser headers keep the field position documented as deliberately unwritten, and the env parse warns on any non-"off" value instead of surprising the link. Knob on all three generations (same descriptor-bit semantics; J1's NDPA branch keeps its own unconditional disable). docs/scheduled-mac.md carries the measured distributions next to the retry-limit guidance; arq_e2e_delivery.sh grows the DRONE_FALLBACK passthrough. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ff knob Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
PR Summary by QodoAdd DEVOURER_TX_RETRY_FALLBACK=off to pin TX retries to descriptor rate
AI Description
Diagram
High-Level Assessment
Files changed (9)
|
Code Review by Qodo
1.
|
…ment remnants Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Closes #362 — with this, all four of the issue's acceptance items are met: the retry-limit curve and FEC dimensioning landed in #367 (steps 1+4), and steps 2–3 now have measured go/no-go with vendor citations plus the step-2 knob implemented.
What the measurements found (recorded sweep data + three fresh arms)
The fw fallback ladder is already on — every generation's inject path leaves DISDATAFB/DISABLE_FB at 0, and retried frames measurably step down: MCS3 → 54M → 24M → 18M → 9M → 6M, ~10% of retried frames finishing below the original rate. (My first issue comment quoted the vendor's injection path, which hard-disables fallback — devourer diverged; and a claimed J1 asymmetry was an NDPA-branch misread. Both corrected on the issue.)
What ships
DEVOURER_TX_RETRY_FALLBACK=off(DeviceConfig::Tx::retry_fallback) on all three generations — sets DISDATAFB/DISABLE_FB so retries re-air at the descriptor DATARATE, for constant-rate links where a 6M re-air of an MCS3 frame costs ~4× airtime. Unset = byte-identical current behaviour.docs/scheduled-mac.md— measured distributions beside the retry-limit guidance;DRONE_FALLBACKpassthrough in the arq harness.Step 3's disposition (also on the issue, vendor-cited): per-packet deadline NO-GO (no descriptor lifetime field on Jaguar3); per-AC PARTIAL via REG_PKT_LIFE_TIME 0x4C0 (1024 µs units) — effectively per-link since injection rides one queue; the fw's CCX state-2/3 lifetime signature must be bench-verified before anything trusts it.
Validation
Three fresh on-air arms (table above) + an off-arm hygiene smoke after the floor removal (888/888 pinned);
ctest49/49; default path byte-identical by construction.🤖 Generated with Claude Code