[PATCH ath-next v3 12/13] wifi: ath12k: ng: wire RX TID REO operations

From: Pradeep Kumar Chitrapu

Date: Tue Nov 03 2026 - 20:15:58 EST


RX TID setup fails on Wi-Fi 8 while the architecture hooks are empty,
so common peer setup falls back to paths that cannot program QCN9625 REO
queue descriptors.

Install the Wi-Fi 8 RX TID hooks, initialize the REO command/list locks
used by those paths, and enable REO queue LUT support for QCN9625. Expose
the single Wi-Fi 8 REO LUT through the expected ML pointer so common qref
programming can use the same address table.

Tested-on: Compilation only, M=drivers/net/wireless/ath/ath12k
Signed-off-by: Pradeep Kumar Chitrapu <pradeep.chitrapu@xxxxxxxxxxxxxxxx>
---
drivers/net/wireless/ath/ath12k/wifi8/dp.c | 18 ++++++++++++++++++
drivers/net/wireless/ath/ath12k/wifi8/hw.c | 1 +
2 files changed, 19 insertions(+)

diff --git a/drivers/net/wireless/ath/ath12k/wifi8/dp.c b/drivers/net/wireless/ath/ath12k/wifi8/dp.c
index e89826f33206..1e636e79fc32 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/dp.c
+++ b/drivers/net/wireless/ath/ath12k/wifi8/dp.c
@@ -197,6 +197,9 @@ static int ath12k_wifi8_dp_reoq_lut_setup(struct ath12k_base *ab)
ath12k_hal_write_reoq_lut_addr(ab, dp->reoq_lut.paddr >> 8);
ath12k_hal_write_ml_reoq_lut_addr(ab, dp->reoq_lut.paddr >> 8);

+ dp->ml_reoq_lut.vaddr = dp->reoq_lut.vaddr;
+ dp->ml_reoq_lut.paddr = dp->reoq_lut.paddr;
+
ath12k_hal_reoq_lut_addr_read_enable(ab);
ath12k_hal_reoq_lut_set_max_peerid(ab);

@@ -215,6 +218,10 @@ static void ath12k_wifi8_dp_reoq_lut_cleanup(struct ath12k_base *ab)
dp->reoq_lut.vaddr_unaligned,
dp->reoq_lut.paddr_unaligned);
dp->reoq_lut.vaddr_unaligned = NULL;
+ dp->reoq_lut.vaddr = NULL;
+ dp->reoq_lut.paddr = 0;
+ dp->ml_reoq_lut.vaddr = NULL;
+ dp->ml_reoq_lut.paddr = 0;
}
}

@@ -519,6 +526,17 @@ static struct ath12k_dp_arch_ops ath12k_wifi8_dp_arch_ops = {
.dp_op_mlo_init = ath12k_wifi8_dp_op_mlo_init,
.dp_op_mlo_deinit = ath12k_wifi8_dp_op_mlo_deinit,
.service_srng = ath12k_wifi8_dp_service_srng,
+ .reo_cmd_send = ath12k_wifi8_dp_reo_cmd_send,
+ .setup_pn_check_reo_cmd = ath12k_wifi8_dp_setup_pn_check_reo_cmd,
+ .rx_peer_tid_delete = ath12k_wifi8_dp_rx_peer_tid_delete,
+ .reo_cache_flush = ath12k_wifi8_dp_reo_cache_flush,
+ .rx_link_desc_return = ath12k_wifi8_dp_rx_link_desc_return,
+ .rx_frags_cleanup = ath12k_wifi8_dp_rx_frags_cleanup,
+ .peer_rx_tid_reo_update = ath12k_wifi8_peer_rx_tid_reo_update,
+ .rx_assign_reoq = ath12k_wifi8_dp_rx_assign_reoq,
+ .peer_rx_tid_qref_setup = ath12k_wifi8_peer_rx_tid_qref_setup,
+ .peer_rx_tid_qref_reset = ath12k_wifi8_peer_rx_tid_qref_reset,
+ .rx_tid_delete_handler = ath12k_wifi8_dp_rx_tid_delete_handler,
.dp_peer_create = ath12k_wifi8_dp_peer_create,
.dp_peer_delete = ath12k_wifi8_dp_peer_delete,
.dp_link_peer_create = ath12k_wifi8_dp_link_peer_create,
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hw.c b/drivers/net/wireless/ath/ath12k/wifi8/hw.c
index ed3ac770e754..a7da8b3a44cd 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/hw.c
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hw.c
@@ -211,6 +211,7 @@ static const struct ath12k_hw_params ath12k_wifi8_hw_params[] = {

.current_cc_support = false,
.ring_mask = &ath12k_wifi8_hw_ring_mask_qcn9625,
+ .reoq_lut_support = true,
.num_tcl_banks = 128,
},
};

--
2.43.0