Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/logging.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Emitters: L = library, RX/TX/... = demo. Optional fields in [brackets];
| ev | emitter | fields |
|---|---|---|
| `init.timing` | L (`src/InitTimer.h`) + demos | stage ("scope.stage", e.g. "demo.first_rx_frame", "txdemo.first_tx_submit"), ms |
| `adapter.caps` | RX, TX, doctor, txpower (`examples/common/caps_event.h`) | supported, chip, names, chip_id "0x..", gen, variant, transport, tx_chains, rx_chains, n_ss, stbc, ldpc, sgi, bw_max, bw[] (MHz), txpwr_max, txpwr_step_qdb, txpwr_step_measured, txpwr_min_qdb, txpwr_max_qdb, txpwr_rate_diffs, txpwr_rate_diffs_hw, txpwr_rate_diffs_measured, tune_2g4[]\|null, tune_5g[]\|null, char_2g4[]\|null, char_5g[]\|null, ldpc_rx_ht, ldpc_rx_vht, ldpc_rx_flag, per_pkt_txpwr, narrowband, fastretune, he_er_su, per_chain_rssi |
| `adapter.caps` | RX, TX, doctor, txpower (`examples/common/caps_event.h`) | supported, chip, names, chip_id "0x..", gen, variant, transport, tx_chains, rx_chains, n_ss, stbc, ldpc, sgi, bw_max, bw[] (MHz), txpwr_max, txpwr_step_qdb, txpwr_step_measured, txpwr_min_qdb, txpwr_max_qdb, txpwr_rate_diffs, txpwr_rate_diffs_hw, txpwr_rate_diffs_measured, tune_2g4[]\|null, tune_5g[]\|null, char_2g4[]\|null, char_5g[]\|null, ldpc_rx_ht, ldpc_rx_vht, ldpc_rx_flag, per_pkt_txpwr, narrowband, fastretune, ack_responder, tx_retry_limit, he_er_su, per_chain_rssi |
| `debug.wreg` | L (`DEVOURER_LOG_WRITES`) | addr "0x0nnn", width, val "0x…" |
| `hop.prof` | L (`DEVOURER_HOP_PROF`) | gen, ch, `<stage>_us`…, total_us |
| `tx.fail` | L (send failure; regress.py keys on it) | {status, actual_len, timeout} or {rc, timeout} |
Expand Down
19 changes: 19 additions & 0 deletions docs/scheduled-mac.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,25 @@ its SIFS ACKs only land intermittently); **8821AU never closed the loop**
(TX retries stayed pinned with it armed); the 8812BU responder was
separately proven (`tests/ack_responder_check.sh`).

The full responder matrix (six cells, ch36, MCS3 unicast; run with
`DEVOURER_TX_RETRY_LIMIT` at its 0 default, so delivered% is the
**single-shot** ACK rate and capability is the on-vs-off delta — pin a
nonzero limit for absolute numbers):

| responder | on | off | verdict |
|---|---|---|---|
| 8814AU | 79% | 0% | works |
| 8812BU | 98% | 0% | works |
| 8821AU | 0% | 0% | broken (third independent confirmation) |
| 8812EU | 98% | 0% | works |
| 8812CU | 69% | 0% | works |
| 8852CU (Kestrel) | 0% | 0% | not implemented (SetAckResponder is J1/2/3-only) |

Unmeasured for lack of plugged hardware: 8821CU / PCIe 8821CE (recipe-shared
with the 8822B; their `AdapterCaps.ack_responder_ok` stays false-as-unmeasured
until a cell runs). The `ack_responder_ok` / `tx_retry_limit_ok` caps flags
carry this table per die.

### The contract

1. **Per-frame delivery detection is GO on all three generations**: the OFF
Expand Down
2 changes: 2 additions & 0 deletions examples/common/caps_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ inline void emit_adapter_caps(EventSink &sink, IRtlDevice *dev) {
.f("per_pkt_txpwr_measured", c.per_pkt_txpwr_measured ? 1 : 0)
.f("narrowband", c.narrowband_ok ? 1 : 0)
.f("fastretune", c.fastretune_ok ? 1 : 0)
.f("ack_responder", c.ack_responder_ok ? 1 : 0)
.f("tx_retry_limit", c.tx_retry_limit_ok ? 1 : 0)
.f("he_er_su", c.he_er_su_ok ? 1 : 0)
.f("per_chain_rssi", c.per_chain_rssi ? 1 : 0)
.f("hw_rx_tsf", c.hw_rx_timestamp ? 1 : 0)
Expand Down
19 changes: 19 additions & 0 deletions src/AdapterCaps.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,25 @@ struct AdapterCaps {
* strong-link, close-range mode, the opposite of a range mode. */
bool vht_2g4_ok = false;

/* --- hardware-ARQ capability (bench-derived truth table, on-air responder
* matrix + retry-knob A/B; the measured contract is docs/scheduled-mac.md).
* ack_responder_ok: SetAckResponder measurably closes a hardware-ARQ loop
Comment thread
josephnef marked this conversation as resolved.
* as the RESPONDER (SIFS ACKs that a soliciting TX's CCX reports confirm).
* Measured true: 8812A (works, degraded — intermittent SIFS ACKs), 8814A,
* 8822B, 8812C/8822C, 8812E/8822E (the 8811A rides the 8812 die path and
* inherits its row). Measured FALSE: the 8821A die — an armed 8821AU never
* closed the loop across three independent runs. False-as-unmeasured (the
* vht_2g4_ok reading: unmeasured, not incapable): the 8821C — it shares
* the recipe but no 8821CU/CE cell has run. FALSE on Kestrel:
* SetAckResponder is not implemented on the AX generation.
* tx_retry_limit_ok: DEVOURER_TX_RETRY_LIMIT drives hardware autonomous
* retransmission (measured 12/0/12 A/B: 8821AU, 8812BU, 8822CU). FALSE on
* the 8814A die (the vendor DATA_RETRY_LIMIT=0 carve-out is kept — knob
* inert), false-as-unmeasured on the 8821C, and FALSE on Kestrel (retry is
* firmware-level there). */
bool ack_responder_ok = false;
bool tx_retry_limit_ok = false;

/* --- feature flags --- */
/* Per-packet TX power: a per-frame power trim driven by radiotap
* DBM_TX_POWER (dB delta vs the calibrated table / session base) or a
Expand Down
5 changes: 5 additions & 0 deletions src/jaguar1/RtlJaguarDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1725,6 +1725,11 @@ devourer::AdapterCaps RtlJaguarDevice::GetAdapterCaps() {
c.narrowband_ok = true;
}
c.fastretune_ok = true; /* phy_SwChnl8812_fast (8812/8821) + full-path fallback */
/* Hardware ARQ (truth table at the AdapterCaps declarations): the 8821A
* die never closes the responder loop; the 8814A die keeps the vendor
* retry carve-out (knob inert). */
c.ack_responder_ok = _eepromManager->version_id.ICType != CHIP_8821;
c.tx_retry_limit_ok = _eepromManager->version_id.ICType != CHIP_8814A;
/* Per-packet TX power: 8814A only — its dword5 [30:28] descriptor LUT (the
* 8822B TXPWR_OFSET position; vendor-defined, vendor-unused). measured
* stays false until tests/txpkt_pwr_ofset_onair.sh proves it moves on-air
Expand Down
5 changes: 5 additions & 0 deletions src/jaguar2/RtlJaguar2Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1124,6 +1124,11 @@ devourer::AdapterCaps RtlJaguar2Device::GetAdapterCaps() {
* RF18 re-latch edge after the re-clock (see the set_channel_bw narrowband
* branch). */
c.narrowband_ok = true;
/* Hardware ARQ (truth table at the AdapterCaps declarations): the 8822B
* die is measured on both counts; the 8821C shares the recipe but has no
* bench cell yet, so its flags stay false-as-unmeasured. */
c.ack_responder_ok = _variant == jaguar2::ChipVariant::C8822B;
c.tx_retry_limit_ok = _variant == jaguar2::ChipVariant::C8822B;
c.hw_rx_timestamp = true; /* FrameParserJaguar2 fills RxAtrib.tsfl */
c.hw_beacon_txtsf = true; /* StartBeacon: MAC inserts the egress TSF into beacons */
c.xtal_cap_max = 0x3f; /* 6-bit AFE crystal-cap trim (0x24/0x28) */
Expand Down
4 changes: 4 additions & 0 deletions src/jaguar3/RtlJaguar3Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1527,6 +1527,10 @@ devourer::AdapterCaps RtlJaguar3Device::GetAdapterCaps() {
c.tx_chains = 2; /* 8822C/8822E are 2T2R */
c.rx_chains = 2;
c.per_chain_rssi = true;
/* Hardware ARQ (truth table at the AdapterCaps declarations): both dies
* measured — responder matrix + retry-knob A/B + the arq_e2e ledgers. */
c.ack_responder_ok = true;
c.tx_retry_limit_ok = true;
/* Per-packet TX power: the TXPWR_OFSET_TYPE bank selector + programmable
* 0x1e70 offset banks (SetTxPacketPowerOffsetQdb / radiotap DBM_TX_POWER;
* TxPktPwrBanks.h). Continuous in step_qdb units, ±63/-64 index travel, 2
Expand Down
3 changes: 3 additions & 0 deletions src/kestrel/RtlKestrelDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,9 @@ devourer::AdapterCaps RtlKestrelDevice::GetAdapterCaps() {
c.tx_chains = 2; /* 8852B/8852C are 2T2R */
c.rx_chains = 2;
c.per_chain_rssi = true; /* per-path RSSI from the PPDU-status physts header */
/* Hardware ARQ: SetAckResponder is not implemented on the AX generation
* (matrix-measured 0% closure) and retry is firmware-level here, so the
* DEVOURER_TX_RETRY_LIMIT knob is inert — both flags stay false. */
Comment thread
josephnef marked this conversation as resolved.
c.bw_mask = devourer::bw_mask_for_generation(c.generation);
if (_variant == kestrel::ChipVariant::C8852C)
c.bw_mask |= devourer::kBw160; /* 8852C-only (vendor bw_sup BW_CAP_160M) */
Expand Down
Loading