jaguar3: 8822C 40/80 MHz bring-up calibrates IQK at 20 MHz, then retunes#275
Merged
Conversation
…nes (#267) The 8822CU brought up by devourer directly at 80 MHz received nothing — not even corrupt frames — while the same code path worked on the 8822E and the same chip received 80 MHz fine under both kernel drivers. Root cause: devourer ran IQK with the RF tuned at 80 MHz. The vendor kernel never does that — it calibrates at its bring-up bandwidth and carries the coefficients across `iw set freq ... 80` (usbmon of the 20->80 transition contains no IQK-engine traffic at all). The 8822C IQK executed at 80 MHz loads RxIQC coefficients that leave the receiver unable to sync any frame; DEVOURER_SKIP_IQK alone revived the RX (hardware bisect), and replaying the kernel's captured 20->80 transition onto a 20 MHz bring-up worked for the same reason. Fix: for the 8822C at 40/80 MHz, tune 20 MHz on the target channel, run IQK there (command set follows the calibration width), then retune to the requested bandwidth. 8822E keeps its existing flow. Bench (ch36/central 42, VHT1SS_MCS7/80): CU RX 0 -> 4481 clean EVM -48 from the 8812EU (1545/-42 from the 8812AU); 40 MHz unchanged (4427/-52); EU ladder unchanged; CU hop parity PASS; ctest 19/19. Diagnostic harness: tests/cu_bb_endstate_diff_80.sh (vendor-kernel end-state diff at 80 MHz). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #267.
The 8822CU brought up by devourer directly at 80 MHz received nothing — not even corrupt frames — while the identical code path worked on the 8822E as receiver, and the same chip received 80 MHz fine under both the vendor
88x2cu_ohdand the in-tree rtw88 drivers.Root cause
Devourer ran the 8822C IQK with the RF tuned at 80 MHz. The vendor kernel never does that: it calibrates at its bring-up bandwidth and carries the coefficients across
iw set freq … 80— a usbmon capture of the kernel's 20→80 transition contains zero IQK-engine (0x1b00) traffic. IQK executed at 80 MHz loads RxIQC coefficients that leave the receiver unable to sync any frame.Isolation was hardware-driven: full MAC+BB end-state value parity (327-register diff replayed, with BB-reset/IGI/RXBB re-applies) fixed nothing — the poison is write-only paged IQK state; replaying the kernel's captured 20→80 transition onto a 20 MHz bring-up worked (1741 frames), and
DEVOURER_SKIP_IQKalone on a plain 80 MHz bring-up worked (1419 frames). The gap predates the #238 campaign (pre-campaign baseline equally dead — 80 MHz RX was simply never in the ground matrix).Fix
For the 8822C at 40/80 MHz: tune 20 MHz on the target channel, run IQK there (the IQK command set follows the calibration width), then retune to the requested bandwidth. The 8822E keeps its existing flow (its 40/80 work with IQK-at-BW; left untouched deliberately).
Validation (two-adapter bench, ch36 primary / central 42, VHT1SS_MCS7/80)
tests/cu_bb_endstate_diff_80.shships as the reproducer/diagnostic (vendor-kernel end-state diff at 80 MHz,/procread_regvsDEVOURER_BB_DUMP).🤖 Generated with Claude Code