[PATCH ath-next v3 06/13] wifi: ath12k: ng: parse 1K REO queue statistics

Pradeep Kumar Chitrapu pradeep.chitrapu at oss.qualcomm.com
Tue Nov 3 17:10:49 PST 2026


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 at oss.qualcomm.com>
---
 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




More information about the ath12k mailing list