[PATCH ath-next v3 06/13] wifi: ath12k: ng: parse 1K REO queue statistics
From: Pradeep Kumar Chitrapu
Date: Tue Nov 03 2026 - 20:13:17 EST
A normal REO queue-statistics status contains the first 288 bits of the
reorder bitmap. For a receive queue with a larger BlockAck window, the
hardware sets a follow-up flag and returns bits 288 through 1023 in a
second status TLV.
Define the 1K queue-statistics status descriptor and decode its 23
additional bitmap words. Extend the common queue status with the PN
encoding, follow-up indication, and wider counters, and store the TLV tag
so a follow-on datapath patch can distinguish both responses for one
command number.
This commit only extends Wi-Fi 8 status representation and parsing. It
does not submit commands or change the Wi-Fi 7 descriptor path.
Tested-on: Compilation only, M=drivers/net/wireless/ath/ath12k
Signed-off-by: Pradeep Kumar Chitrapu <pradeep.chitrapu@xxxxxxxxxxxxxxxx>
---
drivers/net/wireless/ath/ath12k/hal.h | 15 +++++++++---
drivers/net/wireless/ath/ath12k/wifi8/hal_desc.h | 10 ++++++++
drivers/net/wireless/ath/ath12k/wifi8/hal_rx.c | 30 ++++++++++++++++++++++++
drivers/net/wireless/ath/ath12k/wifi8/hal_rx.h | 3 +++
4 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/hal.h b/drivers/net/wireless/ath/ath12k/hal.h
index 9c0d1dfac8d3..6534e11a3378 100644
--- a/drivers/net/wireless/ath/ath12k/hal.h
+++ b/drivers/net/wireless/ath/ath12k/hal.h
@@ -1173,6 +1173,9 @@ struct hal_reo_status_queue_stats {
u16 ssn;
u16 curr_idx;
u32 pn[4];
+ u8 pn_len;
+ u8 pn_127_48_info;
+ bool to_follow_1k;
u32 last_rx_queue_ts;
u32 last_rx_dequeue_ts;
u32 rx_bitmap[9];
@@ -1186,9 +1189,13 @@ struct hal_reo_status_queue_stats {
u32 total_num_processed_byte_cnt;
u32 late_rx_mpdu_cnt;
u32 reorder_hole_cnt;
- u8 timeout_cnt;
- u8 bar_rx_cnt;
- u8 num_window_2k_jump_cnt;
+ u32 timeout_cnt;
+ u32 bar_rx_cnt;
+ u32 num_window_2k_jump_cnt;
+};
+
+struct hal_reo_status_queue_1k_stats {
+ u32 rx_bitmap[23];
};
struct hal_reo_status_flush_queue {
@@ -1246,8 +1253,10 @@ struct hal_reo_status_desc_thresh_reached {
struct hal_reo_status {
struct hal_reo_status_header uniform_hdr;
u8 loop_cnt;
+ u16 tag;
union {
struct hal_reo_status_queue_stats queue_stats;
+ struct hal_reo_status_queue_1k_stats queue_1k_stats;
struct hal_reo_status_flush_queue flush_queue;
struct hal_reo_status_flush_cache flush_cache;
struct hal_reo_status_unblock_cache unblock_cache;
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal_desc.h b/drivers/net/wireless/ath/ath12k/wifi8/hal_desc.h
index 691c9866522f..e2947dd112ce 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/hal_desc.h
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal_desc.h
@@ -536,6 +536,15 @@ struct hal_reo_get_queue_stats_status {
__le16 info6;
} __packed;
+#define HAL_REO_GET_Q_1K_STATS_STATUS_INFO0_LOOPING_COUNT GENMASK(15, 12)
+
+struct hal_reo_get_queue_1k_stats_status {
+ struct hal_reo_status_hdr hdr;
+ __le32 rx_bitmap1023_288[23];
+ __le16 rsvd0;
+ __le16 info0;
+} __packed;
+
/* REO command TLV tags */
#define HAL_REO_GET_QUEUE_STATS 313
#define HAL_REO_FLUSH_QUEUE 314
@@ -549,6 +558,7 @@ struct hal_reo_get_queue_stats_status {
#define HAL_REO_FLUSH_TIMEOUT_LIST_STATUS 338
#define HAL_REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS 339
#define HAL_REO_UPDATE_RX_REO_QUEUE 371
+#define HAL_REO_GET_QUEUE_1K_STATS_STATUS 451
#define HAL_REO_UPDATE_RX_REO_QUEUE_STATUS 204
#define HAL_REO_FLUSH_QUEUE_INFO0_DESC_ADDR_HI GENMASK(7, 0)
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.c b/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.c
index 80c2f1202233..d78c178cc70d 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.c
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.c
@@ -470,6 +470,29 @@ ath12k_wifi8_hal_reo_cmd_update_rx_queue(struct hal_tlv_64_hdr *tlv,
return le16_to_cpu(desc->cmd.reo_cmd_number);
}
+void ath12k_wifi8_hal_reo_status_queue_1k_stats(struct ath12k_base *ab,
+ struct hal_tlv_64_hdr *tlv,
+ struct hal_reo_status *status)
+{
+ struct hal_reo_get_queue_1k_stats_status *desc =
+ (struct hal_reo_get_queue_1k_stats_status *)tlv->value;
+ u32 *dst = status->u.queue_1k_stats.rx_bitmap;
+ int i;
+
+ status->uniform_hdr.cmd_num = le16_to_cpu(desc->hdr.reo_status_number);
+ status->uniform_hdr.cmd_status =
+ le16_get_bits(desc->hdr.info0,
+ HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
+ status->uniform_hdr.timestamp = le32_to_cpu(desc->hdr.timestamp);
+
+ for (i = 0; i < ARRAY_SIZE(desc->rx_bitmap1023_288); i++)
+ dst[i] = le32_to_cpu(desc->rx_bitmap1023_288[i]);
+
+ status->loop_cnt =
+ le16_get_bits(desc->info0,
+ HAL_REO_GET_Q_1K_STATS_STATUS_INFO0_LOOPING_COUNT);
+}
+
static int ath12k_hal_reo_cmd_flush_queue(struct hal_tlv_64_hdr *tlv,
struct ath12k_hal_reo_cmd *cmd)
{
@@ -596,6 +619,13 @@ void ath12k_wifi8_hal_reo_status_queue_stats(struct ath12k_base *ab,
le32_get_bits(desc->info0, HAL_REO_GET_Q_STATS_STATUS_INFO0_CURRENT_INDEX);
status->u.queue_stats.pn[0] = le32_to_cpu(desc->pn_31_0);
status->u.queue_stats.pn[1] = le16_to_cpu(desc->pn_47_32);
+ status->u.queue_stats.pn_127_48_info =
+ le16_get_bits(desc->info1, HAL_REO_GET_Q_STATS_STATUS_INFO1_PN_127_48_INFO);
+ status->u.queue_stats.to_follow_1k =
+ le32_get_bits(desc->info5,
+ HAL_REO_GET_Q_STATS_STATUS_INFO5_GET_Q_1K_SSTAT_FOLLOW);
+ status->u.queue_stats.pn_len =
+ (status->u.queue_stats.pn_127_48_info == 0) ? 6 : 16;
status->u.queue_stats.last_rx_queue_ts =
le32_to_cpu(desc->last_rx_enqueue_timestamp);
status->u.queue_stats.last_rx_dequeue_ts =
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.h b/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.h
index d61ca0823b5f..357839c7d9e3 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.h
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal_rx.h
@@ -112,6 +112,9 @@ void ath12k_wifi8_hal_reo_hw_setup(struct ath12k_base *ab);
void ath12k_wifi8_hal_reo_status_queue_stats(struct ath12k_base *ab,
struct hal_tlv_64_hdr *tlv,
struct hal_reo_status *status);
+void ath12k_wifi8_hal_reo_status_queue_1k_stats(struct ath12k_base *ab,
+ struct hal_tlv_64_hdr *tlv,
+ struct hal_reo_status *status);
void ath12k_wifi8_hal_reo_flush_queue_status(struct ath12k_base *ab,
struct hal_tlv_64_hdr *tlv,
struct hal_reo_status *status);
--
2.43.0