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 --- 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