You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Runtime TX-chain selection — the TX-side sibling of SetRxPathMask. On a multi-chain adapter with per-chain directional antennas (east/west panels on a 2T2R, quadrant panels on the 8814AU), RX-side direction discrimination already works today: MRC receives both directions at once, SetRxPathMask selects chains per slot, and per-chain RSSI/SNR/EVM (rx.path, GetActiveRxPaths()) gives a free bearing estimate. TX has no equivalent: which chain(s) a 1SS frame radiates from is fixed by bring-up defaults, so a node cannot say "this slot, radiate east only."
Motivation
Sectorized cells / directional relays (EPIC EPIC: 5G-NR-style scheduled RAN on devourer (multi-user + multi-cell) #254): a slot grant becomes {channel, rate, power, antenna} — TX path is the missing member. Single-radio TDM relays with per-hop directional panels currently either radiate both directions (wasted energy toward the quiet sector, unnecessary interference footprint) or need an external GPIO-driven RF switch.
Spatial reuse in relay chains: panel front-to-back isolation (15–25 dB) plus TX-side masking relaxes the channel plan between consecutive hops.
Bench symmetry: docs/measuring-spatial-diversity.md / tests/mrc_mobility.py can characterize RX per chain; TX per chain is currently unmeasurable without physically disconnecting antennas.
Shape
IRtlDevice::SetTxPathMask(mask) mirroring SetRxPathMask semantics: applies live, sticky across SetMonitorChannel / FastRetune, same mask-bit convention as the RX side. Demo env plumbing via DeviceConfig + examples/common/env_config like every other knob. Single clean API — same meaning on every chip, per-chip mechanics folded inside.
Constraint to enforce, not silently break: masking below the SS count of the active rate is invalid (1-chain mask + 2SS rate). Either reject at the call or clamp per-frame with a diagnostic — decide during implementation, but no silent no-op on any generation.
Per-generation notes
Jaguar1: BB TX-path selector known territory (8812AU 2T2R; 8814AU 4T4R is the interesting one — quadrant TX). RX-side mask already shipped here, so the plumbing pattern exists.
Jaguar3: TX-path bits are already driven once in the TX-enable bring-up sequence — this issue makes them runtime-settable.
Jaguar2 / Kestrel: locate the per-chip mechanism from the vendor source's chip-dispatched branch (halbb path config on Kestrel), not by register-diffing.
Validation
Per generation: on-air A/B with per-chain antennas — mask A-only vs B-only vs both, SDR duty x PHY-rate on each antenna's direction plus peer delivery, confirming energy actually moves between chains and the masked chain goes quiet. Register/shadow parity across FastRetune (tests/hop_parity_check.sh pattern). The RX half of the directional-sector experiment (2 panels on an 8812AU, per-slot rx.path attribution) is the natural companion harness.
Not blocking anything in #254 Phase A; feeds the directional-relay / sector-cell option discussed for warehouse deployments.
Runtime TX-chain selection — the TX-side sibling of
SetRxPathMask. On a multi-chain adapter with per-chain directional antennas (east/west panels on a 2T2R, quadrant panels on the 8814AU), RX-side direction discrimination already works today: MRC receives both directions at once,SetRxPathMaskselects chains per slot, and per-chain RSSI/SNR/EVM (rx.path,GetActiveRxPaths()) gives a free bearing estimate. TX has no equivalent: which chain(s) a 1SS frame radiates from is fixed by bring-up defaults, so a node cannot say "this slot, radiate east only."Motivation
{channel, rate, power, antenna}— TX path is the missing member. Single-radio TDM relays with per-hop directional panels currently either radiate both directions (wasted energy toward the quiet sector, unnecessary interference footprint) or need an external GPIO-driven RF switch.docs/measuring-spatial-diversity.md/tests/mrc_mobility.pycan characterize RX per chain; TX per chain is currently unmeasurable without physically disconnecting antennas.Shape
IRtlDevice::SetTxPathMask(mask)mirroringSetRxPathMasksemantics: applies live, sticky acrossSetMonitorChannel/FastRetune, same mask-bit convention as the RX side. Demo env plumbing viaDeviceConfig+examples/common/env_configlike every other knob. Single clean API — same meaning on every chip, per-chip mechanics folded inside.Constraint to enforce, not silently break: masking below the SS count of the active rate is invalid (1-chain mask + 2SS rate). Either reject at the call or clamp per-frame with a diagnostic — decide during implementation, but no silent no-op on any generation.
Per-generation notes
Validation
Per generation: on-air A/B with per-chain antennas — mask A-only vs B-only vs both, SDR duty x PHY-rate on each antenna's direction plus peer delivery, confirming energy actually moves between chains and the masked chain goes quiet. Register/shadow parity across
FastRetune(tests/hop_parity_check.shpattern). The RX half of the directional-sector experiment (2 panels on an 8812AU, per-slotrx.pathattribution) is the natural companion harness.Not blocking anything in #254 Phase A; feeds the directional-relay / sector-cell option discussed for warehouse deployments.