[PATCH rtw-next v5 0/4] wifi: rtw88: sdio: Fix unhandled RX request interrupt storm
From: Alastair D'Silva
Date: Sun Oct 11 2026 - 18:08:19 EST
On 3081-based SDIO chips (e.g. RTL8821CS, RTL8822CS), hardware does not
automatically clear the REG_SDIO_HISR_RX_REQUEST status bit when the RX
FIFO is empty. Masking this bit out in software before writing back to
HISR prevented it from ever being acknowledged in hardware, trapping the
CPU core in an infinite interrupt storm that locked up the system upon
receiving network traffic.
This series fixes the interrupt storm on 3081 chips and addresses
related SDIO lifecycle, locking, and error handling issues:
- Patch 1 returns error codes from rtw_sdio_rxfifo_recv() on allocation
or read failures so the caller stops immediately instead of burning
through the loop budget.
- Patch 2 tracks operational state via rtwsdio->running protected by an
irq_lock mutex (using a mutex as SDIO bus operations sleep), serializes
start/stop state transitions under sdio_claim_host() and irq_lock, and
cancels the TX worker synchronously on stop.
- Patch 3 fixes the interrupt storm by splitting
rtw_sdio_handle_interrupt() into 8051 and 3081 paths. On 3081,
interrupts are masked via HIMR, acknowledged via W1C writeback,
serviced, and re-enabled under irq_lock if still running.
- Patch 4 refactors rtw_sdio_rx_isr() into separate 8051 and 3081 variants
to clarify the differences in register width and HISR handling without
any logic changes.
Hardware Validation:
Validated on an Allwinner H618 board (Mellow Fly-C5) with RTL8821CS SDIO
running Linux 7.2.10, with the Ethernet interface administratively brought
down to ensure all traffic traversed the WiFi link exclusively:
- TX test (iperf3 client upload): 45.7 MB in 10s at 38.3 Mbits/sec
(0 errors).
- RX test (iperf3 reverse mode flood): 65.1 MB in 15s at 36.4 Mbits/sec
with zero stalls, zero lockups, and no interrupt storm.
- Bidirectional test (iperf3 --bidir simultaneous TX and RX):
20.9 MB TX (11.7 Mbits/sec) + 43.6 MB RX (24.4 Mbits/sec),
aggregate ~36.1 Mbits/sec.
- dmesg verified clean with zero warnings, traces, or hangs.
Differences in v5:
- Patch 1: Added Acked-by from Ping-Ke Shih.
- Patch 2: Updated Fixes: tag to commit 28eaf7971a20 ("wifi: rtw88: sdio:
add TX back-pressure and retry on page starvation") per discussion
between Ping-Ke Shih and Luka Gejak.
- Patch 2: Replaced lockless running checks with an irq_lock mutex in
struct rtw_sdio. Since SDIO I/O sleeps, a mutex is used instead of a
spinlock. Enforced lock ordering (sdio_claim_host() -> irq_lock) in
start and stop paths to avoid lock inversion with the MMC IRQ handler.
- Patch 2: Retained running checks in rtw_sdio_tx_handler() and
rtw_sdio_handle_interrupt() to avoid races during stop.
- Patch 3: Protected the 3081 interrupt re-enable check under irq_lock
(scoped_guard) per feedback from Ping-Ke Shih.
- Patch 4: Fixed comment formatting style in rtw_sdio_rx_isr_8051() per
coding style rules.
- Patch 4: Added Acked-by from Ping-Ke Shih.
Differences in v4:
- Split pre-existing lifecycle and error handling issues into separate
patches (Patches 1 and 2) prior to the storm fix (per Luka Gejak).
- Guard HIMR re-enabling with rtwsdio->running in the 3081 handler.
- Significantly reduced and streamlined commit messages across the series
(per Ping-Ke Shih).
- Clarified in Patch 4 that it is a refactoring without logic changes,
highlighting register width and HISR behavior (per Ping-Ke Shih).
- Tagged with rtw-next in subject prefix for NIPA testing.
Alastair D'Silva (4):
wifi: rtw88: sdio: Handle allocation and read errors in
rtw_sdio_rxfifo_recv
wifi: rtw88: sdio: Track running state and cancel TX worker on stop
wifi: rtw88: sdio: Fix unhandled RX request interrupt storm
wifi: rtw88: sdio: Split rtw_sdio_rx_isr into 8051 and 3081 variants
drivers/net/wireless/realtek/rtw88/sdio.c | 165 ++++++++++++++++------
drivers/net/wireless/realtek/rtw88/sdio.h | 3 +
2 files changed, 126 insertions(+), 42 deletions(-)
--
2.53.0