Skip to content

RTL8814AU: 5 GHz TX power drastically under-driven (~1.5 Mbps vs kernel ~58 Mbps) #110

Description

@josephnef

Summary

devourer drives the RTL8814AU's 5 GHz TX at far too low power. On-air throughput is ~1.5 Mbps where the in-tree rtw88_8814au kernel driver gets ~58 Mbps from the same dongle on the same channel. The chip's PA is healthy — devourer computes the 8814's per-rate 5 GHz TXAGC power index far too low.

This is distinct from the USB Vbus-sag / power-delivery effect seen on the 8812/8821 under load — this one reproduces on a fresh rail and is a TX-power calculation bug.

Evidence

Measured with a USRP B210 (tests/sdr_duty.py, channel-occupancy → on-air Mbps), ch36 / 5180 MHz, HT MCS7 / 20 MHz, 1500 B payload, identical conditions:

Driver / mode duty on-air
devourer (normal power calc) 1.9–2.2 % 1.2–1.5 Mbps
kernel rtw88_8814au (inject) 89.8 % 58.4 Mbps
devourer + DEVOURER_TX_PWR_START=63 (force max TXAGC index) 70.9 % 46.1 Mbps

Forcing the TXAGC index to max rescues devourer to ~46 Mbps (≈ the kernel's 58). So:

  • The PA / RF hardware is fine (kernel drives it to 58 Mbps; forced-max devourer hits 46).
  • devourer's normal per-rate 5 GHz TX-power index for the 8814 is drastically too low.

A monitor sniffer decodes devourer's frames fine (sensitive receiver), which is why a frame-count metric hides this — the energy/throughput metric is what exposes it.

Likely location

PHY_SetTxPowerIndex_8814A / PHY_SetTxPowerLevel8814 in src/RadioManagementModule.cpp (~L1836–2011) — the 8814 5 GHz EFUSE power-by-rate / per-Ntx diff computation. Relevant prior commits: f3b8c8c (5G EFUSE PG diff-block layout), b3929ef (per-Ntx TX-power diffs cumulative over rate ranges), c9394a4 (drop 8812 TX-power-training for 8814).

Also check

  • 2.4 GHz: the 8814 is also weak there (~20 Mbps vs 8812's ~52). May be the same under-drive on both bands.
  • Compare the actual TXAGC index devourer programs per rate against the kernel's PHY_GetTxPowerIndex_8814A for a 5 GHz channel — the diff should pinpoint the bad term (base power vs per-Ntx diff vs PG-block layout).

Reproduce

# devourer (weak):
sudo env DEVOURER_PID=0x8813 DEVOURER_CHANNEL=36 DEVOURER_TX_HT_MCS=1 \
  DEVOURER_TX_MCS=7 DEVOURER_TX_GAP_US=0 ./build/WiFiDriverTxDemo
sudo python3 tests/sdr_duty.py --freq 5180e6 --secs 3 --mcs 7 --bw 20 --noise-db -62
#   -> ~2% duty, ~1.5 Mbps

# force max TXAGC index (rescues it):
sudo env DEVOURER_PID=0x8813 DEVOURER_CHANNEL=36 DEVOURER_TX_HT_MCS=1 \
  DEVOURER_TX_MCS=7 DEVOURER_TX_GAP_US=0 DEVOURER_TX_PWR_START=63 ./build/WiFiDriverTxDemo
#   -> ~71% duty, ~46 Mbps

# kernel control (reg US so 5 GHz TX isn't regulatory-blocked):
sudo iw reg set US
# rtw88_8814au monitor on ch36, inject_beacon --max-rate --mcs 7 --size 1500
#   -> ~90% duty, ~58 Mbps

Hardware: RTL8814AU 0bda:8813 (COMFAST CF-938AC), USRP B210 2500:0020, host kernel 6.18.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions