Path: blob/main/sys/contrib/dev/athk/ath12k/debugfs_htt_stats.c
178699 views
// SPDX-License-Identifier: BSD-3-Clause-Clear1/*2* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.3* Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.4*/56#include <linux/vmalloc.h>7#include "core.h"8#include "debug.h"9#include "debugfs_htt_stats.h"10#include "dp_tx.h"11#include "dp_rx.h"1213static u3214print_array_to_buf_index(u8 *buf, u32 offset, const char *header, u32 stats_index,15const __le32 *array, u32 array_len, const char *footer)16{17int index = 0;18u8 i;1920if (header) {21index += scnprintf(buf + offset,22ATH12K_HTT_STATS_BUF_SIZE - offset,23"%s = ", header);24}25for (i = 0; i < array_len; i++) {26index += scnprintf(buf + offset + index,27(ATH12K_HTT_STATS_BUF_SIZE - offset) - index,28" %u:%u,", stats_index++, le32_to_cpu(array[i]));29}30/* To overwrite the last trailing comma */31index--;32*(buf + offset + index) = '\0';3334if (footer) {35index += scnprintf(buf + offset + index,36(ATH12K_HTT_STATS_BUF_SIZE - offset) - index,37"%s", footer);38}39return index;40}4142static u3243print_array_to_buf(u8 *buf, u32 offset, const char *header,44const __le32 *array, u32 array_len, const char *footer)45{46return print_array_to_buf_index(buf, offset, header, 0, array, array_len,47footer);48}4950static u3251print_array_to_buf_s8(u8 *buf, u32 offset, const char *header, u32 stats_index,52const s8 *array, u32 array_len, const char *footer)53{54u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;55int index = 0;56u8 i;5758if (header)59index += scnprintf(buf + offset, buf_len - offset, "%s = ", header);6061for (i = 0; i < array_len; i++) {62index += scnprintf(buf + offset + index, (buf_len - offset) - index,63" %u:%d,", stats_index++, array[i]);64}6566index--;67if ((offset + index) < buf_len)68buf[offset + index] = '\0';6970if (footer) {71index += scnprintf(buf + offset + index, (buf_len - offset) - index,72"%s", footer);73}7475return index;76}7778static const char *ath12k_htt_ax_tx_rx_ru_size_to_str(u8 ru_size)79{80switch (ru_size) {81case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_26:82return "26";83case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_52:84return "52";85case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_106:86return "106";87case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_242:88return "242";89case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_484:90return "484";91case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_996:92return "996";93case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_996x2:94return "996x2";95default:96return "unknown";97}98}99100static const char *ath12k_htt_be_tx_rx_ru_size_to_str(u8 ru_size)101{102switch (ru_size) {103case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_26:104return "26";105case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_52:106return "52";107case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_52_26:108return "52+26";109case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_106:110return "106";111case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_106_26:112return "106+26";113case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_242:114return "242";115case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_484:116return "484";117case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_484_242:118return "484+242";119case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996:120return "996";121case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996_484:122return "996+484";123case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996_484_242:124return "996+484+242";125case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x2:126return "996x2";127case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x2_484:128return "996x2+484";129case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x3:130return "996x3";131case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x3_484:132return "996x3+484";133case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x4:134return "996x4";135default:136return "unknown";137}138}139140static const char*141ath12k_tx_ru_size_to_str(enum ath12k_htt_stats_ru_type ru_type, u8 ru_size)142{143if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY)144return ath12k_htt_ax_tx_rx_ru_size_to_str(ru_size);145else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU)146return ath12k_htt_be_tx_rx_ru_size_to_str(ru_size);147else148return "unknown";149}150151static void152htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf, u16 tag_len,153struct debug_htt_stats_req *stats_req)154{155const struct ath12k_htt_tx_pdev_stats_cmn_tlv *htt_stats_buf = tag_buf;156u8 *buf = stats_req->buf;157u32 len = stats_req->buf_len;158u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;159u32 mac_id_word;160161if (tag_len < sizeof(*htt_stats_buf))162return;163164mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);165166len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_CMN_TLV:\n");167len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",168u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));169len += scnprintf(buf + len, buf_len - len, "comp_delivered = %u\n",170le32_to_cpu(htt_stats_buf->comp_delivered));171len += scnprintf(buf + len, buf_len - len, "self_triggers = %u\n",172le32_to_cpu(htt_stats_buf->self_triggers));173len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",174le32_to_cpu(htt_stats_buf->hw_queued));175len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",176le32_to_cpu(htt_stats_buf->hw_reaped));177len += scnprintf(buf + len, buf_len - len, "underrun = %u\n",178le32_to_cpu(htt_stats_buf->underrun));179len += scnprintf(buf + len, buf_len - len, "hw_paused = %u\n",180le32_to_cpu(htt_stats_buf->hw_paused));181len += scnprintf(buf + len, buf_len - len, "hw_flush = %u\n",182le32_to_cpu(htt_stats_buf->hw_flush));183len += scnprintf(buf + len, buf_len - len, "hw_filt = %u\n",184le32_to_cpu(htt_stats_buf->hw_filt));185len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",186le32_to_cpu(htt_stats_buf->tx_abort));187len += scnprintf(buf + len, buf_len - len, "ppdu_ok = %u\n",188le32_to_cpu(htt_stats_buf->ppdu_ok));189len += scnprintf(buf + len, buf_len - len, "mpdu_requeued = %u\n",190le32_to_cpu(htt_stats_buf->mpdu_requed));191len += scnprintf(buf + len, buf_len - len, "tx_xretry = %u\n",192le32_to_cpu(htt_stats_buf->tx_xretry));193len += scnprintf(buf + len, buf_len - len, "data_rc = %u\n",194le32_to_cpu(htt_stats_buf->data_rc));195len += scnprintf(buf + len, buf_len - len, "mpdu_dropped_xretry = %u\n",196le32_to_cpu(htt_stats_buf->mpdu_dropped_xretry));197len += scnprintf(buf + len, buf_len - len, "illegal_rate_phy_err = %u\n",198le32_to_cpu(htt_stats_buf->illgl_rate_phy_err));199len += scnprintf(buf + len, buf_len - len, "cont_xretry = %u\n",200le32_to_cpu(htt_stats_buf->cont_xretry));201len += scnprintf(buf + len, buf_len - len, "tx_timeout = %u\n",202le32_to_cpu(htt_stats_buf->tx_timeout));203len += scnprintf(buf + len, buf_len - len, "tx_time_dur_data = %u\n",204le32_to_cpu(htt_stats_buf->tx_time_dur_data));205len += scnprintf(buf + len, buf_len - len, "pdev_resets = %u\n",206le32_to_cpu(htt_stats_buf->pdev_resets));207len += scnprintf(buf + len, buf_len - len, "phy_underrun = %u\n",208le32_to_cpu(htt_stats_buf->phy_underrun));209len += scnprintf(buf + len, buf_len - len, "txop_ovf = %u\n",210le32_to_cpu(htt_stats_buf->txop_ovf));211len += scnprintf(buf + len, buf_len - len, "seq_posted = %u\n",212le32_to_cpu(htt_stats_buf->seq_posted));213len += scnprintf(buf + len, buf_len - len, "seq_failed_queueing = %u\n",214le32_to_cpu(htt_stats_buf->seq_failed_queueing));215len += scnprintf(buf + len, buf_len - len, "seq_completed = %u\n",216le32_to_cpu(htt_stats_buf->seq_completed));217len += scnprintf(buf + len, buf_len - len, "seq_restarted = %u\n",218le32_to_cpu(htt_stats_buf->seq_restarted));219len += scnprintf(buf + len, buf_len - len, "seq_txop_repost_stop = %u\n",220le32_to_cpu(htt_stats_buf->seq_txop_repost_stop));221len += scnprintf(buf + len, buf_len - len, "next_seq_cancel = %u\n",222le32_to_cpu(htt_stats_buf->next_seq_cancel));223len += scnprintf(buf + len, buf_len - len, "dl_mu_mimo_seq_posted = %u\n",224le32_to_cpu(htt_stats_buf->mu_seq_posted));225len += scnprintf(buf + len, buf_len - len, "dl_mu_ofdma_seq_posted = %u\n",226le32_to_cpu(htt_stats_buf->mu_ofdma_seq_posted));227len += scnprintf(buf + len, buf_len - len, "ul_mu_mimo_seq_posted = %u\n",228le32_to_cpu(htt_stats_buf->ul_mumimo_seq_posted));229len += scnprintf(buf + len, buf_len - len, "ul_mu_ofdma_seq_posted = %u\n",230le32_to_cpu(htt_stats_buf->ul_ofdma_seq_posted));231len += scnprintf(buf + len, buf_len - len, "mu_mimo_peer_blacklisted = %u\n",232le32_to_cpu(htt_stats_buf->num_mu_peer_blacklisted));233len += scnprintf(buf + len, buf_len - len, "seq_qdepth_repost_stop = %u\n",234le32_to_cpu(htt_stats_buf->seq_qdepth_repost_stop));235len += scnprintf(buf + len, buf_len - len, "seq_min_msdu_repost_stop = %u\n",236le32_to_cpu(htt_stats_buf->seq_min_msdu_repost_stop));237len += scnprintf(buf + len, buf_len - len, "mu_seq_min_msdu_repost_stop = %u\n",238le32_to_cpu(htt_stats_buf->mu_seq_min_msdu_repost_stop));239len += scnprintf(buf + len, buf_len - len, "seq_switch_hw_paused = %u\n",240le32_to_cpu(htt_stats_buf->seq_switch_hw_paused));241len += scnprintf(buf + len, buf_len - len, "next_seq_posted_dsr = %u\n",242le32_to_cpu(htt_stats_buf->next_seq_posted_dsr));243len += scnprintf(buf + len, buf_len - len, "seq_posted_isr = %u\n",244le32_to_cpu(htt_stats_buf->seq_posted_isr));245len += scnprintf(buf + len, buf_len - len, "seq_ctrl_cached = %u\n",246le32_to_cpu(htt_stats_buf->seq_ctrl_cached));247len += scnprintf(buf + len, buf_len - len, "mpdu_count_tqm = %u\n",248le32_to_cpu(htt_stats_buf->mpdu_count_tqm));249len += scnprintf(buf + len, buf_len - len, "msdu_count_tqm = %u\n",250le32_to_cpu(htt_stats_buf->msdu_count_tqm));251len += scnprintf(buf + len, buf_len - len, "mpdu_removed_tqm = %u\n",252le32_to_cpu(htt_stats_buf->mpdu_removed_tqm));253len += scnprintf(buf + len, buf_len - len, "msdu_removed_tqm = %u\n",254le32_to_cpu(htt_stats_buf->msdu_removed_tqm));255len += scnprintf(buf + len, buf_len - len, "remove_mpdus_max_retries = %u\n",256le32_to_cpu(htt_stats_buf->remove_mpdus_max_retries));257len += scnprintf(buf + len, buf_len - len, "mpdus_sw_flush = %u\n",258le32_to_cpu(htt_stats_buf->mpdus_sw_flush));259len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",260le32_to_cpu(htt_stats_buf->mpdus_hw_filter));261len += scnprintf(buf + len, buf_len - len, "mpdus_truncated = %u\n",262le32_to_cpu(htt_stats_buf->mpdus_truncated));263len += scnprintf(buf + len, buf_len - len, "mpdus_ack_failed = %u\n",264le32_to_cpu(htt_stats_buf->mpdus_ack_failed));265len += scnprintf(buf + len, buf_len - len, "mpdus_expired = %u\n",266le32_to_cpu(htt_stats_buf->mpdus_expired));267len += scnprintf(buf + len, buf_len - len, "mpdus_seq_hw_retry = %u\n",268le32_to_cpu(htt_stats_buf->mpdus_seq_hw_retry));269len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",270le32_to_cpu(htt_stats_buf->ack_tlv_proc));271len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt_valid = %u\n",272le32_to_cpu(htt_stats_buf->coex_abort_mpdu_cnt_valid));273len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt = %u\n",274le32_to_cpu(htt_stats_buf->coex_abort_mpdu_cnt));275len += scnprintf(buf + len, buf_len - len, "num_total_ppdus_tried_ota = %u\n",276le32_to_cpu(htt_stats_buf->num_total_ppdus_tried_ota));277len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_tried_ota = %u\n",278le32_to_cpu(htt_stats_buf->num_data_ppdus_tried_ota));279len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_enqued = %u\n",280le32_to_cpu(htt_stats_buf->local_ctrl_mgmt_enqued));281len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_freed = %u\n",282le32_to_cpu(htt_stats_buf->local_ctrl_mgmt_freed));283len += scnprintf(buf + len, buf_len - len, "local_data_enqued = %u\n",284le32_to_cpu(htt_stats_buf->local_data_enqued));285len += scnprintf(buf + len, buf_len - len, "local_data_freed = %u\n",286le32_to_cpu(htt_stats_buf->local_data_freed));287len += scnprintf(buf + len, buf_len - len, "mpdu_tried = %u\n",288le32_to_cpu(htt_stats_buf->mpdu_tried));289len += scnprintf(buf + len, buf_len - len, "isr_wait_seq_posted = %u\n",290le32_to_cpu(htt_stats_buf->isr_wait_seq_posted));291len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_low = %u\n",292le32_to_cpu(htt_stats_buf->tx_active_dur_us_low));293len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_high = %u\n",294le32_to_cpu(htt_stats_buf->tx_active_dur_us_high));295len += scnprintf(buf + len, buf_len - len, "fes_offsets_err_cnt = %u\n\n",296le32_to_cpu(htt_stats_buf->fes_offsets_err_cnt));297298stats_req->buf_len = len;299}300301static void302htt_print_tx_pdev_stats_urrn_tlv(const void *tag_buf,303u16 tag_len,304struct debug_htt_stats_req *stats_req)305{306const struct ath12k_htt_tx_pdev_stats_urrn_tlv *htt_stats_buf = tag_buf;307u8 *buf = stats_req->buf;308u32 len = stats_req->buf_len;309u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;310u16 num_elems = min_t(u16, (tag_len >> 2),311HTT_TX_PDEV_MAX_URRN_STATS);312313len += scnprintf(buf + len, buf_len - len,314"HTT_TX_PDEV_STATS_URRN_TLV:\n");315316len += print_array_to_buf(buf, len, "urrn_stats", htt_stats_buf->urrn_stats,317num_elems, "\n\n");318319stats_req->buf_len = len;320}321322static void323htt_print_tx_pdev_stats_flush_tlv(const void *tag_buf,324u16 tag_len,325struct debug_htt_stats_req *stats_req)326{327const struct ath12k_htt_tx_pdev_stats_flush_tlv *htt_stats_buf = tag_buf;328u8 *buf = stats_req->buf;329u32 len = stats_req->buf_len;330u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;331u16 num_elems = min_t(u16, (tag_len >> 2),332ATH12K_HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);333334len += scnprintf(buf + len, buf_len - len,335"HTT_TX_PDEV_STATS_FLUSH_TLV:\n");336337len += print_array_to_buf(buf, len, "flush_errs", htt_stats_buf->flush_errs,338num_elems, "\n\n");339340stats_req->buf_len = len;341}342343static void344htt_print_tx_pdev_stats_sifs_tlv(const void *tag_buf,345u16 tag_len,346struct debug_htt_stats_req *stats_req)347{348const struct ath12k_htt_tx_pdev_stats_sifs_tlv *htt_stats_buf = tag_buf;349u8 *buf = stats_req->buf;350u32 len = stats_req->buf_len;351u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;352u16 num_elems = min_t(u16, (tag_len >> 2),353ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_STATS);354355len += scnprintf(buf + len, buf_len - len,356"HTT_TX_PDEV_STATS_SIFS_TLV:\n");357358len += print_array_to_buf(buf, len, "sifs_status", htt_stats_buf->sifs_status,359num_elems, "\n\n");360361stats_req->buf_len = len;362}363364static void365htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, u16 tag_len,366struct debug_htt_stats_req *stats_req)367{368const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv *htt_stats_buf = tag_buf;369char *mode;370u8 j, hw_mode, i, str_buf_len;371u8 *buf = stats_req->buf;372u32 len = stats_req->buf_len;373u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;374u32 stats_value;375u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST;376u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS;377char str_buf[ATH12K_HTT_MAX_STRING_LEN];378379if (tag_len < sizeof(*htt_stats_buf))380return;381382hw_mode = le32_to_cpu(htt_stats_buf->hw_mode);383384switch (hw_mode) {385case ATH12K_HTT_STATS_HWMODE_AC:386len += scnprintf(buf + len, buf_len - len,387"HTT_TX_PDEV_AC_MU_PPDU_DISTRIBUTION_STATS:\n");388mode = "ac";389break;390case ATH12K_HTT_STATS_HWMODE_AX:391len += scnprintf(buf + len, buf_len - len,392"HTT_TX_PDEV_AX_MU_PPDU_DISTRIBUTION_STATS:\n");393mode = "ax";394break;395case ATH12K_HTT_STATS_HWMODE_BE:396len += scnprintf(buf + len, buf_len - len,397"HTT_TX_PDEV_BE_MU_PPDU_DISTRIBUTION_STATS:\n");398mode = "be";399break;400default:401return;402}403404for (i = 0; i < ATH12K_HTT_STATS_NUM_NR_BINS ; i++) {405len += scnprintf(buf + len, buf_len - len,406"%s_mu_mimo_num_seq_posted_nr%u = %u\n", mode,407((i + 1) * 4), htt_stats_buf->num_seq_posted[i]);408str_buf_len = 0;409memset(str_buf, 0x0, sizeof(str_buf));410for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) {411stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_posted_per_burst412[i * max_ppdu + j]);413str_buf_len += scnprintf(&str_buf[str_buf_len],414ATH12K_HTT_MAX_STRING_LEN - str_buf_len,415" %u:%u,", j, stats_value);416}417/* To overwrite the last trailing comma */418str_buf[str_buf_len - 1] = '\0';419len += scnprintf(buf + len, buf_len - len,420"%s_mu_mimo_num_ppdu_posted_per_burst_nr%u = %s\n",421mode, ((i + 1) * 4), str_buf);422str_buf_len = 0;423memset(str_buf, 0x0, sizeof(str_buf));424for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) {425stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_cmpl_per_burst426[i * max_ppdu + j]);427str_buf_len += scnprintf(&str_buf[str_buf_len],428ATH12K_HTT_MAX_STRING_LEN - str_buf_len,429" %u:%u,", j, stats_value);430}431/* To overwrite the last trailing comma */432str_buf[str_buf_len - 1] = '\0';433len += scnprintf(buf + len, buf_len - len,434"%s_mu_mimo_num_ppdu_completed_per_burst_nr%u = %s\n",435mode, ((i + 1) * 4), str_buf);436str_buf_len = 0;437memset(str_buf, 0x0, sizeof(str_buf));438for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS ; j++) {439stats_value = le32_to_cpu(htt_stats_buf->num_seq_term_status440[i * max_sched + j]);441str_buf_len += scnprintf(&str_buf[str_buf_len],442ATH12K_HTT_MAX_STRING_LEN - str_buf_len,443" %u:%u,", j, stats_value);444}445/* To overwrite the last trailing comma */446str_buf[str_buf_len - 1] = '\0';447len += scnprintf(buf + len, buf_len - len,448"%s_mu_mimo_num_seq_term_status_nr%u = %s\n\n",449mode, ((i + 1) * 4), str_buf);450}451452stats_req->buf_len = len;453}454455static void456htt_print_tx_pdev_stats_sifs_hist_tlv(const void *tag_buf,457u16 tag_len,458struct debug_htt_stats_req *stats_req)459{460const struct ath12k_htt_tx_pdev_stats_sifs_hist_tlv *htt_stats_buf = tag_buf;461u8 *buf = stats_req->buf;462u32 len = stats_req->buf_len;463u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;464u16 num_elems = min_t(u16, (tag_len >> 2),465ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS);466467len += scnprintf(buf + len, buf_len - len,468"HTT_TX_PDEV_STATS_SIFS_HIST_TLV:\n");469470len += print_array_to_buf(buf, len, "sifs_hist_status",471htt_stats_buf->sifs_hist_status, num_elems, "\n\n");472473stats_req->buf_len = len;474}475476static void477htt_print_pdev_ctrl_path_tx_stats_tlv(const void *tag_buf, u16 tag_len,478struct debug_htt_stats_req *stats_req)479{480const struct ath12k_htt_pdev_ctrl_path_tx_stats_tlv *htt_stats_buf = tag_buf;481u8 *buf = stats_req->buf;482u32 len = stats_req->buf_len;483u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;484485if (len < sizeof(*htt_stats_buf))486return;487488len += scnprintf(buf + len, buf_len - len,489"HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS:\n");490len += print_array_to_buf(buf, len, "fw_tx_mgmt_subtype",491htt_stats_buf->fw_tx_mgmt_subtype,492ATH12K_HTT_STATS_SUBTYPE_MAX, "\n\n");493494stats_req->buf_len = len;495}496497static void498ath12k_htt_print_stats_tx_sched_cmn_tlv(const void *tag_buf,499u16 tag_len,500struct debug_htt_stats_req *stats_req)501{502const struct ath12k_htt_stats_tx_sched_cmn_tlv *htt_stats_buf = tag_buf;503u8 *buf = stats_req->buf;504u32 len = stats_req->buf_len;505u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;506u32 mac_id_word;507508if (tag_len < sizeof(*htt_stats_buf))509return;510511mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);512513len += scnprintf(buf + len, buf_len - len, "HTT_STATS_TX_SCHED_CMN_TLV:\n");514len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",515u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));516len += scnprintf(buf + len, buf_len - len, "current_timestamp = %u\n\n",517le32_to_cpu(htt_stats_buf->current_timestamp));518519stats_req->buf_len = len;520}521522static void523ath12k_htt_print_tx_pdev_stats_sched_per_txq_tlv(const void *tag_buf,524u16 tag_len,525struct debug_htt_stats_req *stats_req)526{527const struct ath12k_htt_tx_pdev_stats_sched_per_txq_tlv *htt_stats_buf = tag_buf;528u8 *buf = stats_req->buf;529u32 len = stats_req->buf_len;530u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;531u32 mac_id_word;532533if (tag_len < sizeof(*htt_stats_buf))534return;535536mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);537538len += scnprintf(buf + len, buf_len - len,539"HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:\n");540len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",541u32_get_bits(mac_id_word,542ATH12K_HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID));543len += scnprintf(buf + len, buf_len - len, "txq_id = %u\n",544u32_get_bits(mac_id_word,545ATH12K_HTT_TX_PDEV_STATS_SCHED_PER_TXQ_ID));546len += scnprintf(buf + len, buf_len - len, "sched_policy = %u\n",547le32_to_cpu(htt_stats_buf->sched_policy));548len += scnprintf(buf + len, buf_len - len,549"last_sched_cmd_posted_timestamp = %u\n",550le32_to_cpu(htt_stats_buf->last_sched_cmd_posted_timestamp));551len += scnprintf(buf + len, buf_len - len,552"last_sched_cmd_compl_timestamp = %u\n",553le32_to_cpu(htt_stats_buf->last_sched_cmd_compl_timestamp));554len += scnprintf(buf + len, buf_len - len, "sched_2_tac_lwm_count = %u\n",555le32_to_cpu(htt_stats_buf->sched_2_tac_lwm_count));556len += scnprintf(buf + len, buf_len - len, "sched_2_tac_ring_full = %u\n",557le32_to_cpu(htt_stats_buf->sched_2_tac_ring_full));558len += scnprintf(buf + len, buf_len - len, "sched_cmd_post_failure = %u\n",559le32_to_cpu(htt_stats_buf->sched_cmd_post_failure));560len += scnprintf(buf + len, buf_len - len, "num_active_tids = %u\n",561le32_to_cpu(htt_stats_buf->num_active_tids));562len += scnprintf(buf + len, buf_len - len, "num_ps_schedules = %u\n",563le32_to_cpu(htt_stats_buf->num_ps_schedules));564len += scnprintf(buf + len, buf_len - len, "sched_cmds_pending = %u\n",565le32_to_cpu(htt_stats_buf->sched_cmds_pending));566len += scnprintf(buf + len, buf_len - len, "num_tid_register = %u\n",567le32_to_cpu(htt_stats_buf->num_tid_register));568len += scnprintf(buf + len, buf_len - len, "num_tid_unregister = %u\n",569le32_to_cpu(htt_stats_buf->num_tid_unregister));570len += scnprintf(buf + len, buf_len - len, "num_qstats_queried = %u\n",571le32_to_cpu(htt_stats_buf->num_qstats_queried));572len += scnprintf(buf + len, buf_len - len, "qstats_update_pending = %u\n",573le32_to_cpu(htt_stats_buf->qstats_update_pending));574len += scnprintf(buf + len, buf_len - len, "last_qstats_query_timestamp = %u\n",575le32_to_cpu(htt_stats_buf->last_qstats_query_timestamp));576len += scnprintf(buf + len, buf_len - len, "num_tqm_cmdq_full = %u\n",577le32_to_cpu(htt_stats_buf->num_tqm_cmdq_full));578len += scnprintf(buf + len, buf_len - len, "num_de_sched_algo_trigger = %u\n",579le32_to_cpu(htt_stats_buf->num_de_sched_algo_trigger));580len += scnprintf(buf + len, buf_len - len, "num_rt_sched_algo_trigger = %u\n",581le32_to_cpu(htt_stats_buf->num_rt_sched_algo_trigger));582len += scnprintf(buf + len, buf_len - len, "num_tqm_sched_algo_trigger = %u\n",583le32_to_cpu(htt_stats_buf->num_tqm_sched_algo_trigger));584len += scnprintf(buf + len, buf_len - len, "notify_sched = %u\n",585le32_to_cpu(htt_stats_buf->notify_sched));586len += scnprintf(buf + len, buf_len - len, "dur_based_sendn_term = %u\n",587le32_to_cpu(htt_stats_buf->dur_based_sendn_term));588len += scnprintf(buf + len, buf_len - len, "su_notify2_sched = %u\n",589le32_to_cpu(htt_stats_buf->su_notify2_sched));590len += scnprintf(buf + len, buf_len - len, "su_optimal_queued_msdus_sched = %u\n",591le32_to_cpu(htt_stats_buf->su_optimal_queued_msdus_sched));592len += scnprintf(buf + len, buf_len - len, "su_delay_timeout_sched = %u\n",593le32_to_cpu(htt_stats_buf->su_delay_timeout_sched));594len += scnprintf(buf + len, buf_len - len, "su_min_txtime_sched_delay = %u\n",595le32_to_cpu(htt_stats_buf->su_min_txtime_sched_delay));596len += scnprintf(buf + len, buf_len - len, "su_no_delay = %u\n",597le32_to_cpu(htt_stats_buf->su_no_delay));598len += scnprintf(buf + len, buf_len - len, "num_supercycles = %u\n",599le32_to_cpu(htt_stats_buf->num_supercycles));600len += scnprintf(buf + len, buf_len - len, "num_subcycles_with_sort = %u\n",601le32_to_cpu(htt_stats_buf->num_subcycles_with_sort));602len += scnprintf(buf + len, buf_len - len, "num_subcycles_no_sort = %u\n\n",603le32_to_cpu(htt_stats_buf->num_subcycles_no_sort));604605stats_req->buf_len = len;606}607608static void609ath12k_htt_print_sched_txq_cmd_posted_tlv(const void *tag_buf,610u16 tag_len,611struct debug_htt_stats_req *stats_req)612{613const struct ath12k_htt_sched_txq_cmd_posted_tlv *htt_stats_buf = tag_buf;614u8 *buf = stats_req->buf;615u32 len = stats_req->buf_len;616u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;617u16 num_elements = tag_len >> 2;618619len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_POSTED_TLV:\n");620len += print_array_to_buf(buf, len, "sched_cmd_posted",621htt_stats_buf->sched_cmd_posted, num_elements, "\n\n");622623stats_req->buf_len = len;624}625626static void627ath12k_htt_print_sched_txq_cmd_reaped_tlv(const void *tag_buf,628u16 tag_len,629struct debug_htt_stats_req *stats_req)630{631const struct ath12k_htt_sched_txq_cmd_reaped_tlv *htt_stats_buf = tag_buf;632u8 *buf = stats_req->buf;633u32 len = stats_req->buf_len;634u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;635u16 num_elements = tag_len >> 2;636637len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_REAPED_TLV:\n");638len += print_array_to_buf(buf, len, "sched_cmd_reaped",639htt_stats_buf->sched_cmd_reaped, num_elements, "\n\n");640641stats_req->buf_len = len;642}643644static void645ath12k_htt_print_sched_txq_sched_order_su_tlv(const void *tag_buf,646u16 tag_len,647struct debug_htt_stats_req *stats_req)648{649const struct ath12k_htt_sched_txq_sched_order_su_tlv *htt_stats_buf = tag_buf;650u8 *buf = stats_req->buf;651u32 len = stats_req->buf_len;652u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;653u32 sched_order_su_num_entries = min_t(u32, (tag_len >> 2),654ATH12K_HTT_TX_PDEV_NUM_SCHED_ORDER_LOG);655656len += scnprintf(buf + len, buf_len - len,657"HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV:\n");658len += print_array_to_buf(buf, len, "sched_order_su",659htt_stats_buf->sched_order_su,660sched_order_su_num_entries, "\n\n");661662stats_req->buf_len = len;663}664665static void666ath12k_htt_print_sched_txq_sched_ineligibility_tlv(const void *tag_buf,667u16 tag_len,668struct debug_htt_stats_req *stats_req)669{670const struct ath12k_htt_sched_txq_sched_ineligibility_tlv *htt_stats_buf =671tag_buf;672u8 *buf = stats_req->buf;673u32 len = stats_req->buf_len;674u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;675u32 sched_ineligibility_num_entries = tag_len >> 2;676677len += scnprintf(buf + len, buf_len - len,678"HTT_SCHED_TXQ_SCHED_INELIGIBILITY:\n");679len += print_array_to_buf(buf, len, "sched_ineligibility",680htt_stats_buf->sched_ineligibility,681sched_ineligibility_num_entries, "\n\n");682683stats_req->buf_len = len;684}685686static void687ath12k_htt_print_sched_txq_supercycle_trigger_tlv(const void *tag_buf,688u16 tag_len,689struct debug_htt_stats_req *stats_req)690{691const struct ath12k_htt_sched_txq_supercycle_triggers_tlv *htt_stats_buf =692tag_buf;693u8 *buf = stats_req->buf;694u32 len = stats_req->buf_len;695u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;696u16 num_elems = min_t(u16, (tag_len >> 2),697ATH12K_HTT_SCHED_SUPERCYCLE_TRIGGER_MAX);698699len += scnprintf(buf + len, buf_len - len,700"HTT_SCHED_TXQ_SUPERCYCLE_TRIGGER:\n");701len += print_array_to_buf(buf, len, "supercycle_triggers",702htt_stats_buf->supercycle_triggers, num_elems, "\n\n");703704stats_req->buf_len = len;705}706707static void708ath12k_htt_print_hw_stats_pdev_errs_tlv(const void *tag_buf, u16 tag_len,709struct debug_htt_stats_req *stats_req)710{711const struct ath12k_htt_hw_stats_pdev_errs_tlv *htt_buf = tag_buf;712u8 *buf = stats_req->buf;713u32 len = stats_req->buf_len;714u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;715u32 mac_id_word;716717if (tag_len < sizeof(*htt_buf))718return;719720mac_id_word = le32_to_cpu(htt_buf->mac_id__word);721722len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_PDEV_ERRS_TLV:\n");723len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",724u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));725len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",726le32_to_cpu(htt_buf->tx_abort));727len += scnprintf(buf + len, buf_len - len, "tx_abort_fail_count = %u\n",728le32_to_cpu(htt_buf->tx_abort_fail_count));729len += scnprintf(buf + len, buf_len - len, "rx_abort = %u\n",730le32_to_cpu(htt_buf->rx_abort));731len += scnprintf(buf + len, buf_len - len, "rx_abort_fail_count = %u\n",732le32_to_cpu(htt_buf->rx_abort_fail_count));733len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",734le32_to_cpu(htt_buf->rx_flush_cnt));735len += scnprintf(buf + len, buf_len - len, "warm_reset = %u\n",736le32_to_cpu(htt_buf->warm_reset));737len += scnprintf(buf + len, buf_len - len, "cold_reset = %u\n",738le32_to_cpu(htt_buf->cold_reset));739len += scnprintf(buf + len, buf_len - len, "mac_cold_reset_restore_cal = %u\n",740le32_to_cpu(htt_buf->mac_cold_reset_restore_cal));741len += scnprintf(buf + len, buf_len - len, "mac_cold_reset = %u\n",742le32_to_cpu(htt_buf->mac_cold_reset));743len += scnprintf(buf + len, buf_len - len, "mac_warm_reset = %u\n",744le32_to_cpu(htt_buf->mac_warm_reset));745len += scnprintf(buf + len, buf_len - len, "mac_only_reset = %u\n",746le32_to_cpu(htt_buf->mac_only_reset));747len += scnprintf(buf + len, buf_len - len, "phy_warm_reset = %u\n",748le32_to_cpu(htt_buf->phy_warm_reset));749len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_ucode_trig = %u\n",750le32_to_cpu(htt_buf->phy_warm_reset_ucode_trig));751len += scnprintf(buf + len, buf_len - len, "mac_warm_reset_restore_cal = %u\n",752le32_to_cpu(htt_buf->mac_warm_reset_restore_cal));753len += scnprintf(buf + len, buf_len - len, "mac_sfm_reset = %u\n",754le32_to_cpu(htt_buf->mac_sfm_reset));755len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_m3_ssr = %u\n",756le32_to_cpu(htt_buf->phy_warm_reset_m3_ssr));757len += scnprintf(buf + len, buf_len - len, "fw_rx_rings_reset = %u\n",758le32_to_cpu(htt_buf->fw_rx_rings_reset));759len += scnprintf(buf + len, buf_len - len, "tx_flush = %u\n",760le32_to_cpu(htt_buf->tx_flush));761len += scnprintf(buf + len, buf_len - len, "tx_glb_reset = %u\n",762le32_to_cpu(htt_buf->tx_glb_reset));763len += scnprintf(buf + len, buf_len - len, "tx_txq_reset = %u\n",764le32_to_cpu(htt_buf->tx_txq_reset));765len += scnprintf(buf + len, buf_len - len, "rx_timeout_reset = %u\n\n",766le32_to_cpu(htt_buf->rx_timeout_reset));767768len += scnprintf(buf + len, buf_len - len, "PDEV_PHY_WARM_RESET_REASONS:\n");769len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_reason_phy_m3 = %u\n",770le32_to_cpu(htt_buf->phy_warm_reset_reason_phy_m3));771len += scnprintf(buf + len, buf_len - len,772"phy_warm_reset_reason_tx_hw_stuck = %u\n",773le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_hw_stuck));774len += scnprintf(buf + len, buf_len - len,775"phy_warm_reset_reason_num_cca_rx_frame_stuck = %u\n",776le32_to_cpu(htt_buf->phy_warm_reset_reason_num_rx_frame_stuck));777len += scnprintf(buf + len, buf_len - len,778"phy_warm_reset_reason_wal_rx_recovery_rst_rx_busy = %u\n",779le32_to_cpu(htt_buf->phy_warm_reset_reason_wal_rx_rec_rx_busy));780len += scnprintf(buf + len, buf_len - len,781"phy_warm_reset_reason_wal_rx_recovery_rst_mac_hang = %u\n",782le32_to_cpu(htt_buf->phy_warm_reset_reason_wal_rx_rec_mac_hng));783len += scnprintf(buf + len, buf_len - len,784"phy_warm_reset_reason_mac_reset_converted_phy_reset = %u\n",785le32_to_cpu(htt_buf->phy_warm_reset_reason_mac_conv_phy_reset));786len += scnprintf(buf + len, buf_len - len,787"phy_warm_reset_reason_tx_lifetime_expiry_cca_stuck = %u\n",788le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_exp_cca_stuck));789len += scnprintf(buf + len, buf_len - len,790"phy_warm_reset_reason_tx_consecutive_flush9_war = %u\n",791le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_consec_flsh_war));792len += scnprintf(buf + len, buf_len - len,793"phy_warm_reset_reason_tx_hwsch_reset_war = %u\n",794le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_hwsch_reset_war));795len += scnprintf(buf + len, buf_len - len,796"phy_warm_reset_reason_hwsch_wdog_or_cca_wdog_war = %u\n\n",797le32_to_cpu(htt_buf->phy_warm_reset_reason_hwsch_cca_wdog_war));798799len += scnprintf(buf + len, buf_len - len, "WAL_RX_RECOVERY_STATS:\n");800len += scnprintf(buf + len, buf_len - len,801"wal_rx_recovery_rst_mac_hang_count = %u\n",802le32_to_cpu(htt_buf->wal_rx_recovery_rst_mac_hang_cnt));803len += scnprintf(buf + len, buf_len - len,804"wal_rx_recovery_rst_known_sig_count = %u\n",805le32_to_cpu(htt_buf->wal_rx_recovery_rst_known_sig_cnt));806len += scnprintf(buf + len, buf_len - len,807"wal_rx_recovery_rst_no_rx_count = %u\n",808le32_to_cpu(htt_buf->wal_rx_recovery_rst_no_rx_cnt));809len += scnprintf(buf + len, buf_len - len,810"wal_rx_recovery_rst_no_rx_consecutive_count = %u\n",811le32_to_cpu(htt_buf->wal_rx_recovery_rst_no_rx_consec_cnt));812len += scnprintf(buf + len, buf_len - len,813"wal_rx_recovery_rst_rx_busy_count = %u\n",814le32_to_cpu(htt_buf->wal_rx_recovery_rst_rx_busy_cnt));815len += scnprintf(buf + len, buf_len - len,816"wal_rx_recovery_rst_phy_mac_hang_count = %u\n\n",817le32_to_cpu(htt_buf->wal_rx_recovery_rst_phy_mac_hang_cnt));818819len += scnprintf(buf + len, buf_len - len, "HTT_RX_DEST_DRAIN_STATS:\n");820len += scnprintf(buf + len, buf_len - len,821"rx_dest_drain_rx_descs_leak_prevention_done = %u\n",822le32_to_cpu(htt_buf->rx_dest_drain_rx_descs_leak_prevented));823len += scnprintf(buf + len, buf_len - len,824"rx_dest_drain_rx_descs_saved_cnt = %u\n",825le32_to_cpu(htt_buf->rx_dest_drain_rx_descs_saved_cnt));826len += scnprintf(buf + len, buf_len - len,827"rx_dest_drain_rxdma2reo_leak_detected = %u\n",828le32_to_cpu(htt_buf->rx_dest_drain_rxdma2reo_leak_detected));829len += scnprintf(buf + len, buf_len - len,830"rx_dest_drain_rxdma2fw_leak_detected = %u\n",831le32_to_cpu(htt_buf->rx_dest_drain_rxdma2fw_leak_detected));832len += scnprintf(buf + len, buf_len - len,833"rx_dest_drain_rxdma2wbm_leak_detected = %u\n",834le32_to_cpu(htt_buf->rx_dest_drain_rxdma2wbm_leak_detected));835len += scnprintf(buf + len, buf_len - len,836"rx_dest_drain_rxdma1_2sw_leak_detected = %u\n",837le32_to_cpu(htt_buf->rx_dest_drain_rxdma1_2sw_leak_detected));838len += scnprintf(buf + len, buf_len - len,839"rx_dest_drain_rx_drain_ok_mac_idle = %u\n",840le32_to_cpu(htt_buf->rx_dest_drain_rx_drain_ok_mac_idle));841len += scnprintf(buf + len, buf_len - len,842"rx_dest_drain_ok_mac_not_idle = %u\n",843le32_to_cpu(htt_buf->rx_dest_drain_ok_mac_not_idle));844len += scnprintf(buf + len, buf_len - len,845"rx_dest_drain_prerequisite_invld = %u\n",846le32_to_cpu(htt_buf->rx_dest_drain_prerequisite_invld));847len += scnprintf(buf + len, buf_len - len,848"rx_dest_drain_skip_for_non_lmac_reset = %u\n",849le32_to_cpu(htt_buf->rx_dest_drain_skip_non_lmac_reset));850len += scnprintf(buf + len, buf_len - len,851"rx_dest_drain_hw_fifo_not_empty_post_drain_wait = %u\n\n",852le32_to_cpu(htt_buf->rx_dest_drain_hw_fifo_notempty_post_wait));853854stats_req->buf_len = len;855}856857static void858ath12k_htt_print_hw_stats_intr_misc_tlv(const void *tag_buf, u16 tag_len,859struct debug_htt_stats_req *stats_req)860{861const struct ath12k_htt_hw_stats_intr_misc_tlv *htt_stats_buf = tag_buf;862u8 *buf = stats_req->buf;863u32 len = stats_req->buf_len;864u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;865866if (tag_len < sizeof(*htt_stats_buf))867return;868869len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_INTR_MISC_TLV:\n");870len += scnprintf(buf + len, buf_len - len, "hw_intr_name = %s\n",871htt_stats_buf->hw_intr_name);872len += scnprintf(buf + len, buf_len - len, "mask = %u\n",873le32_to_cpu(htt_stats_buf->mask));874len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",875le32_to_cpu(htt_stats_buf->count));876877stats_req->buf_len = len;878}879880static void881ath12k_htt_print_hw_stats_whal_tx_tlv(const void *tag_buf, u16 tag_len,882struct debug_htt_stats_req *stats_req)883{884const struct ath12k_htt_hw_stats_whal_tx_tlv *htt_stats_buf = tag_buf;885u8 *buf = stats_req->buf;886u32 len = stats_req->buf_len;887u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;888u32 mac_id_word;889890if (tag_len < sizeof(*htt_stats_buf))891return;892893mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);894895len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WHAL_TX_TLV:\n");896len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",897u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));898len += scnprintf(buf + len, buf_len - len, "last_unpause_ppdu_id = %u\n",899le32_to_cpu(htt_stats_buf->last_unpause_ppdu_id));900len += scnprintf(buf + len, buf_len - len, "hwsch_unpause_wait_tqm_write = %u\n",901le32_to_cpu(htt_stats_buf->hwsch_unpause_wait_tqm_write));902len += scnprintf(buf + len, buf_len - len, "hwsch_dummy_tlv_skipped = %u\n",903le32_to_cpu(htt_stats_buf->hwsch_dummy_tlv_skipped));904len += scnprintf(buf + len, buf_len - len,905"hwsch_misaligned_offset_received = %u\n",906le32_to_cpu(htt_stats_buf->hwsch_misaligned_offset_received));907len += scnprintf(buf + len, buf_len - len, "hwsch_reset_count = %u\n",908le32_to_cpu(htt_stats_buf->hwsch_reset_count));909len += scnprintf(buf + len, buf_len - len, "hwsch_dev_reset_war = %u\n",910le32_to_cpu(htt_stats_buf->hwsch_dev_reset_war));911len += scnprintf(buf + len, buf_len - len, "hwsch_delayed_pause = %u\n",912le32_to_cpu(htt_stats_buf->hwsch_delayed_pause));913len += scnprintf(buf + len, buf_len - len, "hwsch_long_delayed_pause = %u\n",914le32_to_cpu(htt_stats_buf->hwsch_long_delayed_pause));915len += scnprintf(buf + len, buf_len - len, "sch_rx_ppdu_no_response = %u\n",916le32_to_cpu(htt_stats_buf->sch_rx_ppdu_no_response));917len += scnprintf(buf + len, buf_len - len, "sch_selfgen_response = %u\n",918le32_to_cpu(htt_stats_buf->sch_selfgen_response));919len += scnprintf(buf + len, buf_len - len, "sch_rx_sifs_resp_trigger= %u\n\n",920le32_to_cpu(htt_stats_buf->sch_rx_sifs_resp_trigger));921922stats_req->buf_len = len;923}924925static void926ath12k_htt_print_hw_war_tlv(const void *tag_buf, u16 tag_len,927struct debug_htt_stats_req *stats_req)928{929const struct ath12k_htt_hw_war_stats_tlv *htt_stats_buf = tag_buf;930u8 *buf = stats_req->buf;931u32 len = stats_req->buf_len;932u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;933u16 fixed_len, array_len;934u8 i, array_words;935u32 mac_id;936937if (tag_len < sizeof(*htt_stats_buf))938return;939940mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);941fixed_len = sizeof(*htt_stats_buf);942array_len = tag_len - fixed_len;943array_words = array_len >> 2;944945len += scnprintf(buf + len, buf_len - len, "HTT_HW_WAR_STATS_TLV:\n");946len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",947u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID));948949for (i = 0; i < array_words; i++) {950len += scnprintf(buf + len, buf_len - len, "hw_war %u = %u\n\n",951i, le32_to_cpu(htt_stats_buf->hw_wars[i]));952}953954stats_req->buf_len = len;955}956957static void958ath12k_htt_print_tx_tqm_cmn_stats_tlv(const void *tag_buf, u16 tag_len,959struct debug_htt_stats_req *stats_req)960{961const struct ath12k_htt_tx_tqm_cmn_stats_tlv *htt_stats_buf = tag_buf;962u8 *buf = stats_req->buf;963u32 len = stats_req->buf_len;964u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;965u32 mac_id_word;966967if (tag_len < sizeof(*htt_stats_buf))968return;969970mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);971972len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMN_STATS_TLV:\n");973len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",974u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));975len += scnprintf(buf + len, buf_len - len, "max_cmdq_id = %u\n",976le32_to_cpu(htt_stats_buf->max_cmdq_id));977len += scnprintf(buf + len, buf_len - len, "list_mpdu_cnt_hist_intvl = %u\n",978le32_to_cpu(htt_stats_buf->list_mpdu_cnt_hist_intvl));979len += scnprintf(buf + len, buf_len - len, "add_msdu = %u\n",980le32_to_cpu(htt_stats_buf->add_msdu));981len += scnprintf(buf + len, buf_len - len, "q_empty = %u\n",982le32_to_cpu(htt_stats_buf->q_empty));983len += scnprintf(buf + len, buf_len - len, "q_not_empty = %u\n",984le32_to_cpu(htt_stats_buf->q_not_empty));985len += scnprintf(buf + len, buf_len - len, "drop_notification = %u\n",986le32_to_cpu(htt_stats_buf->drop_notification));987len += scnprintf(buf + len, buf_len - len, "desc_threshold = %u\n",988le32_to_cpu(htt_stats_buf->desc_threshold));989len += scnprintf(buf + len, buf_len - len, "hwsch_tqm_invalid_status = %u\n",990le32_to_cpu(htt_stats_buf->hwsch_tqm_invalid_status));991len += scnprintf(buf + len, buf_len - len, "missed_tqm_gen_mpdus = %u\n",992le32_to_cpu(htt_stats_buf->missed_tqm_gen_mpdus));993len += scnprintf(buf + len, buf_len - len,994"total_msduq_timestamp_updates = %u\n",995le32_to_cpu(htt_stats_buf->msduq_timestamp_updates));996len += scnprintf(buf + len, buf_len - len,997"total_msduq_timestamp_updates_by_get_mpdu_head_info_cmd = %u\n",998le32_to_cpu(htt_stats_buf->msduq_updates_mpdu_head_info_cmd));999len += scnprintf(buf + len, buf_len - len,1000"total_msduq_timestamp_updates_by_emp_to_nonemp_status = %u\n",1001le32_to_cpu(htt_stats_buf->msduq_updates_emp_to_nonemp_status));1002len += scnprintf(buf + len, buf_len - len,1003"total_get_mpdu_head_info_cmds_by_sched_algo_la_query = %u\n",1004le32_to_cpu(htt_stats_buf->get_mpdu_head_info_cmds_by_query));1005len += scnprintf(buf + len, buf_len - len,1006"total_get_mpdu_head_info_cmds_by_tac = %u\n",1007le32_to_cpu(htt_stats_buf->get_mpdu_head_info_cmds_by_tac));1008len += scnprintf(buf + len, buf_len - len,1009"total_gen_mpdu_cmds_by_sched_algo_la_query = %u\n",1010le32_to_cpu(htt_stats_buf->gen_mpdu_cmds_by_query));1011len += scnprintf(buf + len, buf_len - len, "active_tqm_tids = %u\n",1012le32_to_cpu(htt_stats_buf->tqm_active_tids));1013len += scnprintf(buf + len, buf_len - len, "inactive_tqm_tids = %u\n",1014le32_to_cpu(htt_stats_buf->tqm_inactive_tids));1015len += scnprintf(buf + len, buf_len - len, "tqm_active_msduq_flows = %u\n",1016le32_to_cpu(htt_stats_buf->tqm_active_msduq_flows));1017len += scnprintf(buf + len, buf_len - len, "hi_prio_q_not_empty = %u\n\n",1018le32_to_cpu(htt_stats_buf->high_prio_q_not_empty));10191020stats_req->buf_len = len;1021}10221023static void1024ath12k_htt_print_tx_tqm_error_stats_tlv(const void *tag_buf, u16 tag_len,1025struct debug_htt_stats_req *stats_req)1026{1027const struct ath12k_htt_tx_tqm_error_stats_tlv *htt_stats_buf = tag_buf;1028u8 *buf = stats_req->buf;1029u32 len = stats_req->buf_len;1030u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;10311032if (tag_len < sizeof(*htt_stats_buf))1033return;10341035len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_ERROR_STATS_TLV:\n");1036len += scnprintf(buf + len, buf_len - len, "q_empty_failure = %u\n",1037le32_to_cpu(htt_stats_buf->q_empty_failure));1038len += scnprintf(buf + len, buf_len - len, "q_not_empty_failure = %u\n",1039le32_to_cpu(htt_stats_buf->q_not_empty_failure));1040len += scnprintf(buf + len, buf_len - len, "add_msdu_failure = %u\n\n",1041le32_to_cpu(htt_stats_buf->add_msdu_failure));10421043len += scnprintf(buf + len, buf_len - len, "TQM_ERROR_RESET_STATS:\n");1044len += scnprintf(buf + len, buf_len - len, "tqm_cache_ctl_err = %u\n",1045le32_to_cpu(htt_stats_buf->tqm_cache_ctl_err));1046len += scnprintf(buf + len, buf_len - len, "tqm_soft_reset = %u\n",1047le32_to_cpu(htt_stats_buf->tqm_soft_reset));1048len += scnprintf(buf + len, buf_len - len,1049"tqm_reset_total_num_in_use_link_descs = %u\n",1050le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_link_descs));1051len += scnprintf(buf + len, buf_len - len,1052"tqm_reset_worst_case_num_lost_link_descs = %u\n",1053le32_to_cpu(htt_stats_buf->tqm_reset_num_lost_link_descs));1054len += scnprintf(buf + len, buf_len - len,1055"tqm_reset_worst_case_num_lost_host_tx_bufs_count = %u\n",1056le32_to_cpu(htt_stats_buf->tqm_reset_num_lost_host_tx_buf_cnt));1057len += scnprintf(buf + len, buf_len - len,1058"tqm_reset_num_in_use_link_descs_internal_tqm = %u\n",1059le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_internal_tqm));1060len += scnprintf(buf + len, buf_len - len,1061"tqm_reset_num_in_use_link_descs_wbm_idle_link_ring = %u\n",1062le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_idle_link_rng));1063len += scnprintf(buf + len, buf_len - len,1064"tqm_reset_time_to_tqm_hang_delta_ms = %u\n",1065le32_to_cpu(htt_stats_buf->tqm_reset_time_to_tqm_hang_delta_ms));1066len += scnprintf(buf + len, buf_len - len, "tqm_reset_recovery_time_ms = %u\n",1067le32_to_cpu(htt_stats_buf->tqm_reset_recovery_time_ms));1068len += scnprintf(buf + len, buf_len - len, "tqm_reset_num_peers_hdl = %u\n",1069le32_to_cpu(htt_stats_buf->tqm_reset_num_peers_hdl));1070len += scnprintf(buf + len, buf_len - len,1071"tqm_reset_cumm_dirty_hw_mpduq_proc_cnt = %u\n",1072le32_to_cpu(htt_stats_buf->tqm_reset_cumm_dirty_hw_mpduq_cnt));1073len += scnprintf(buf + len, buf_len - len,1074"tqm_reset_cumm_dirty_hw_msduq_proc = %u\n",1075le32_to_cpu(htt_stats_buf->tqm_reset_cumm_dirty_hw_msduq_proc));1076len += scnprintf(buf + len, buf_len - len,1077"tqm_reset_flush_cache_cmd_su_cnt = %u\n",1078le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_su_cnt));1079len += scnprintf(buf + len, buf_len - len,1080"tqm_reset_flush_cache_cmd_other_cnt = %u\n",1081le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_other_cnt));1082len += scnprintf(buf + len, buf_len - len,1083"tqm_reset_flush_cache_cmd_trig_type = %u\n",1084le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_trig_type));1085len += scnprintf(buf + len, buf_len - len,1086"tqm_reset_flush_cache_cmd_trig_cfg = %u\n",1087le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_trig_cfg));1088len += scnprintf(buf + len, buf_len - len,1089"tqm_reset_flush_cache_cmd_skip_cmd_status_null = %u\n\n",1090le32_to_cpu(htt_stats_buf->tqm_reset_flush_cmd_skp_status_null));10911092stats_req->buf_len = len;1093}10941095static void1096ath12k_htt_print_tx_tqm_gen_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,1097struct debug_htt_stats_req *stats_req)1098{1099const struct ath12k_htt_tx_tqm_gen_mpdu_stats_tlv *htt_stats_buf = tag_buf;1100u8 *buf = stats_req->buf;1101u32 len = stats_req->buf_len;1102u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;1103u16 num_elements = tag_len >> 2;11041105len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_GEN_MPDU_STATS_TLV:\n");1106len += print_array_to_buf(buf, len, "gen_mpdu_end_reason",1107htt_stats_buf->gen_mpdu_end_reason, num_elements,1108"\n\n");11091110stats_req->buf_len = len;1111}11121113static void1114ath12k_htt_print_tx_tqm_list_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,1115struct debug_htt_stats_req *stats_req)1116{1117const struct ath12k_htt_tx_tqm_list_mpdu_stats_tlv *htt_stats_buf = tag_buf;1118u8 *buf = stats_req->buf;1119u32 len = stats_req->buf_len;1120u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;1121u16 num_elems = min_t(u16, (tag_len >> 2),1122ATH12K_HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);11231124len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_STATS_TLV:\n");1125len += print_array_to_buf(buf, len, "list_mpdu_end_reason",1126htt_stats_buf->list_mpdu_end_reason, num_elems, "\n\n");11271128stats_req->buf_len = len;1129}11301131static void1132ath12k_htt_print_tx_tqm_list_mpdu_cnt_tlv(const void *tag_buf, u16 tag_len,1133struct debug_htt_stats_req *stats_req)1134{1135const struct ath12k_htt_tx_tqm_list_mpdu_cnt_tlv *htt_stats_buf = tag_buf;1136u8 *buf = stats_req->buf;1137u32 len = stats_req->buf_len;1138u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;1139u16 num_elems = min_t(u16, (tag_len >> 2),1140ATH12K_HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);11411142len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:\n");1143len += print_array_to_buf(buf, len, "list_mpdu_cnt_hist",1144htt_stats_buf->list_mpdu_cnt_hist, num_elems, "\n\n");11451146stats_req->buf_len = len;1147}11481149static void1150ath12k_htt_print_tx_tqm_pdev_stats_tlv(const void *tag_buf, u16 tag_len,1151struct debug_htt_stats_req *stats_req)1152{1153const struct ath12k_htt_tx_tqm_pdev_stats_tlv *htt_stats_buf = tag_buf;1154u8 *buf = stats_req->buf;1155u32 len = stats_req->buf_len;1156u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;11571158if (tag_len < sizeof(*htt_stats_buf))1159return;11601161len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_PDEV_STATS_TLV_V:\n");1162len += scnprintf(buf + len, buf_len - len, "msdu_count = %u\n",1163le32_to_cpu(htt_stats_buf->msdu_count));1164len += scnprintf(buf + len, buf_len - len, "mpdu_count = %u\n",1165le32_to_cpu(htt_stats_buf->mpdu_count));1166len += scnprintf(buf + len, buf_len - len, "remove_msdu = %u\n",1167le32_to_cpu(htt_stats_buf->remove_msdu));1168len += scnprintf(buf + len, buf_len - len, "remove_mpdu = %u\n",1169le32_to_cpu(htt_stats_buf->remove_mpdu));1170len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl = %u\n",1171le32_to_cpu(htt_stats_buf->remove_msdu_ttl));1172len += scnprintf(buf + len, buf_len - len, "send_bar = %u\n",1173le32_to_cpu(htt_stats_buf->send_bar));1174len += scnprintf(buf + len, buf_len - len, "bar_sync = %u\n",1175le32_to_cpu(htt_stats_buf->bar_sync));1176len += scnprintf(buf + len, buf_len - len, "notify_mpdu = %u\n",1177le32_to_cpu(htt_stats_buf->notify_mpdu));1178len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",1179le32_to_cpu(htt_stats_buf->sync_cmd));1180len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",1181le32_to_cpu(htt_stats_buf->write_cmd));1182len += scnprintf(buf + len, buf_len - len, "hwsch_trigger = %u\n",1183le32_to_cpu(htt_stats_buf->hwsch_trigger));1184len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",1185le32_to_cpu(htt_stats_buf->ack_tlv_proc));1186len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",1187le32_to_cpu(htt_stats_buf->gen_mpdu_cmd));1188len += scnprintf(buf + len, buf_len - len, "gen_list_cmd = %u\n",1189le32_to_cpu(htt_stats_buf->gen_list_cmd));1190len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",1191le32_to_cpu(htt_stats_buf->remove_mpdu_cmd));1192len += scnprintf(buf + len, buf_len - len, "remove_mpdu_tried_cmd = %u\n",1193le32_to_cpu(htt_stats_buf->remove_mpdu_tried_cmd));1194len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",1195le32_to_cpu(htt_stats_buf->mpdu_queue_stats_cmd));1196len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",1197le32_to_cpu(htt_stats_buf->mpdu_head_info_cmd));1198len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",1199le32_to_cpu(htt_stats_buf->msdu_flow_stats_cmd));1200len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",1201le32_to_cpu(htt_stats_buf->remove_msdu_cmd));1202len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl_cmd = %u\n",1203le32_to_cpu(htt_stats_buf->remove_msdu_ttl_cmd));1204len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",1205le32_to_cpu(htt_stats_buf->flush_cache_cmd));1206len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",1207le32_to_cpu(htt_stats_buf->update_mpduq_cmd));1208len += scnprintf(buf + len, buf_len - len, "enqueue = %u\n",1209le32_to_cpu(htt_stats_buf->enqueue));1210len += scnprintf(buf + len, buf_len - len, "enqueue_notify = %u\n",1211le32_to_cpu(htt_stats_buf->enqueue_notify));1212len += scnprintf(buf + len, buf_len - len, "notify_mpdu_at_head = %u\n",1213le32_to_cpu(htt_stats_buf->notify_mpdu_at_head));1214len += scnprintf(buf + len, buf_len - len, "notify_mpdu_state_valid = %u\n",1215le32_to_cpu(htt_stats_buf->notify_mpdu_state_valid));1216len += scnprintf(buf + len, buf_len - len, "sched_udp_notify1 = %u\n",1217le32_to_cpu(htt_stats_buf->sched_udp_notify1));1218len += scnprintf(buf + len, buf_len - len, "sched_udp_notify2 = %u\n",1219le32_to_cpu(htt_stats_buf->sched_udp_notify2));1220len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify1 = %u\n",1221le32_to_cpu(htt_stats_buf->sched_nonudp_notify1));1222len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify2 = %u\n\n",1223le32_to_cpu(htt_stats_buf->sched_nonudp_notify2));12241225stats_req->buf_len = len;1226}12271228static void1229ath12k_htt_print_tx_de_cmn_stats_tlv(const void *tag_buf, u16 tag_len,1230struct debug_htt_stats_req *stats_req)1231{1232const struct ath12k_htt_tx_de_cmn_stats_tlv *htt_stats_buf = tag_buf;1233u8 *buf = stats_req->buf;1234u32 len = stats_req->buf_len;1235u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;1236u32 mac_id_word;12371238if (tag_len < sizeof(*htt_stats_buf))1239return;12401241mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);12421243len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CMN_STATS_TLV:\n");1244len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",1245u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));1246len += scnprintf(buf + len, buf_len - len, "tcl2fw_entry_count = %u\n",1247le32_to_cpu(htt_stats_buf->tcl2fw_entry_count));1248len += scnprintf(buf + len, buf_len - len, "not_to_fw = %u\n",1249le32_to_cpu(htt_stats_buf->not_to_fw));1250len += scnprintf(buf + len, buf_len - len, "invalid_pdev_vdev_peer = %u\n",1251le32_to_cpu(htt_stats_buf->invalid_pdev_vdev_peer));1252len += scnprintf(buf + len, buf_len - len, "tcl_res_invalid_addrx = %u\n",1253le32_to_cpu(htt_stats_buf->tcl_res_invalid_addrx));1254len += scnprintf(buf + len, buf_len - len, "wbm2fw_entry_count = %u\n",1255le32_to_cpu(htt_stats_buf->wbm2fw_entry_count));1256len += scnprintf(buf + len, buf_len - len, "invalid_pdev = %u\n",1257le32_to_cpu(htt_stats_buf->invalid_pdev));1258len += scnprintf(buf + len, buf_len - len, "tcl_res_addrx_timeout = %u\n",1259le32_to_cpu(htt_stats_buf->tcl_res_addrx_timeout));1260len += scnprintf(buf + len, buf_len - len, "invalid_vdev = %u\n",1261le32_to_cpu(htt_stats_buf->invalid_vdev));1262len += scnprintf(buf + len, buf_len - len, "invalid_tcl_exp_frame_desc = %u\n",1263le32_to_cpu(htt_stats_buf->invalid_tcl_exp_frame_desc));1264len += scnprintf(buf + len, buf_len - len, "vdev_id_mismatch_count = %u\n\n",1265le32_to_cpu(htt_stats_buf->vdev_id_mismatch_cnt));12661267stats_req->buf_len = len;1268}12691270static void1271ath12k_htt_print_tx_de_eapol_packets_stats_tlv(const void *tag_buf, u16 tag_len,1272struct debug_htt_stats_req *stats_req)1273{1274const struct ath12k_htt_tx_de_eapol_packets_stats_tlv *htt_stats_buf = tag_buf;1275u8 *buf = stats_req->buf;1276u32 len = stats_req->buf_len;1277u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;12781279if (tag_len < sizeof(*htt_stats_buf))1280return;12811282len += scnprintf(buf + len, buf_len - len,1283"HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:\n");1284len += scnprintf(buf + len, buf_len - len, "m1_packets = %u\n",1285le32_to_cpu(htt_stats_buf->m1_packets));1286len += scnprintf(buf + len, buf_len - len, "m2_packets = %u\n",1287le32_to_cpu(htt_stats_buf->m2_packets));1288len += scnprintf(buf + len, buf_len - len, "m3_packets = %u\n",1289le32_to_cpu(htt_stats_buf->m3_packets));1290len += scnprintf(buf + len, buf_len - len, "m4_packets = %u\n",1291le32_to_cpu(htt_stats_buf->m4_packets));1292len += scnprintf(buf + len, buf_len - len, "g1_packets = %u\n",1293le32_to_cpu(htt_stats_buf->g1_packets));1294len += scnprintf(buf + len, buf_len - len, "g2_packets = %u\n",1295le32_to_cpu(htt_stats_buf->g2_packets));1296len += scnprintf(buf + len, buf_len - len, "rc4_packets = %u\n",1297le32_to_cpu(htt_stats_buf->rc4_packets));1298len += scnprintf(buf + len, buf_len - len, "eap_packets = %u\n",1299le32_to_cpu(htt_stats_buf->eap_packets));1300len += scnprintf(buf + len, buf_len - len, "eapol_start_packets = %u\n",1301le32_to_cpu(htt_stats_buf->eapol_start_packets));1302len += scnprintf(buf + len, buf_len - len, "eapol_logoff_packets = %u\n",1303le32_to_cpu(htt_stats_buf->eapol_logoff_packets));1304len += scnprintf(buf + len, buf_len - len, "eapol_encap_asf_packets = %u\n\n",1305le32_to_cpu(htt_stats_buf->eapol_encap_asf_packets));13061307stats_req->buf_len = len;1308}13091310static void1311ath12k_htt_print_tx_de_classify_stats_tlv(const void *tag_buf, u16 tag_len,1312struct debug_htt_stats_req *stats_req)1313{1314const struct ath12k_htt_tx_de_classify_stats_tlv *htt_stats_buf = tag_buf;1315u8 *buf = stats_req->buf;1316u32 len = stats_req->buf_len;1317u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;13181319if (tag_len < sizeof(*htt_stats_buf))1320return;13211322len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CLASSIFY_STATS_TLV:\n");1323len += scnprintf(buf + len, buf_len - len, "arp_packets = %u\n",1324le32_to_cpu(htt_stats_buf->arp_packets));1325len += scnprintf(buf + len, buf_len - len, "igmp_packets = %u\n",1326le32_to_cpu(htt_stats_buf->igmp_packets));1327len += scnprintf(buf + len, buf_len - len, "dhcp_packets = %u\n",1328le32_to_cpu(htt_stats_buf->dhcp_packets));1329len += scnprintf(buf + len, buf_len - len, "host_inspected = %u\n",1330le32_to_cpu(htt_stats_buf->host_inspected));1331len += scnprintf(buf + len, buf_len - len, "htt_included = %u\n",1332le32_to_cpu(htt_stats_buf->htt_included));1333len += scnprintf(buf + len, buf_len - len, "htt_valid_mcs = %u\n",1334le32_to_cpu(htt_stats_buf->htt_valid_mcs));1335len += scnprintf(buf + len, buf_len - len, "htt_valid_nss = %u\n",1336le32_to_cpu(htt_stats_buf->htt_valid_nss));1337len += scnprintf(buf + len, buf_len - len, "htt_valid_preamble_type = %u\n",1338le32_to_cpu(htt_stats_buf->htt_valid_preamble_type));1339len += scnprintf(buf + len, buf_len - len, "htt_valid_chainmask = %u\n",1340le32_to_cpu(htt_stats_buf->htt_valid_chainmask));1341len += scnprintf(buf + len, buf_len - len, "htt_valid_guard_interval = %u\n",1342le32_to_cpu(htt_stats_buf->htt_valid_guard_interval));1343len += scnprintf(buf + len, buf_len - len, "htt_valid_retries = %u\n",1344le32_to_cpu(htt_stats_buf->htt_valid_retries));1345len += scnprintf(buf + len, buf_len - len, "htt_valid_bw_info = %u\n",1346le32_to_cpu(htt_stats_buf->htt_valid_bw_info));1347len += scnprintf(buf + len, buf_len - len, "htt_valid_power = %u\n",1348le32_to_cpu(htt_stats_buf->htt_valid_power));1349len += scnprintf(buf + len, buf_len - len, "htt_valid_key_flags = 0x%x\n",1350le32_to_cpu(htt_stats_buf->htt_valid_key_flags));1351len += scnprintf(buf + len, buf_len - len, "htt_valid_no_encryption = %u\n",1352le32_to_cpu(htt_stats_buf->htt_valid_no_encryption));1353len += scnprintf(buf + len, buf_len - len, "fse_entry_count = %u\n",1354le32_to_cpu(htt_stats_buf->fse_entry_count));1355len += scnprintf(buf + len, buf_len - len, "fse_priority_be = %u\n",1356le32_to_cpu(htt_stats_buf->fse_priority_be));1357len += scnprintf(buf + len, buf_len - len, "fse_priority_high = %u\n",1358le32_to_cpu(htt_stats_buf->fse_priority_high));1359len += scnprintf(buf + len, buf_len - len, "fse_priority_low = %u\n",1360le32_to_cpu(htt_stats_buf->fse_priority_low));1361len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_be = %u\n",1362le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_be));1363len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_over_sub = %u\n",1364le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_over_sub));1365len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_bursty = %u\n",1366le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_bursty));1367len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_interactive = %u\n",1368le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_interactive));1369len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_periodic = %u\n",1370le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_periodic));1371len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_alloc = %u\n",1372le32_to_cpu(htt_stats_buf->fse_hwqueue_alloc));1373len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_created = %u\n",1374le32_to_cpu(htt_stats_buf->fse_hwqueue_created));1375len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_send_to_host = %u\n",1376le32_to_cpu(htt_stats_buf->fse_hwqueue_send_to_host));1377len += scnprintf(buf + len, buf_len - len, "mcast_entry = %u\n",1378le32_to_cpu(htt_stats_buf->mcast_entry));1379len += scnprintf(buf + len, buf_len - len, "bcast_entry = %u\n",1380le32_to_cpu(htt_stats_buf->bcast_entry));1381len += scnprintf(buf + len, buf_len - len, "htt_update_peer_cache = %u\n",1382le32_to_cpu(htt_stats_buf->htt_update_peer_cache));1383len += scnprintf(buf + len, buf_len - len, "htt_learning_frame = %u\n",1384le32_to_cpu(htt_stats_buf->htt_learning_frame));1385len += scnprintf(buf + len, buf_len - len, "fse_invalid_peer = %u\n",1386le32_to_cpu(htt_stats_buf->fse_invalid_peer));1387len += scnprintf(buf + len, buf_len - len, "mec_notify = %u\n\n",1388le32_to_cpu(htt_stats_buf->mec_notify));13891390stats_req->buf_len = len;1391}13921393static void1394ath12k_htt_print_tx_de_classify_failed_stats_tlv(const void *tag_buf, u16 tag_len,1395struct debug_htt_stats_req *stats_req)1396{1397const struct ath12k_htt_tx_de_classify_failed_stats_tlv *htt_stats_buf = tag_buf;1398u8 *buf = stats_req->buf;1399u32 len = stats_req->buf_len;1400u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;14011402if (tag_len < sizeof(*htt_stats_buf))1403return;14041405len += scnprintf(buf + len, buf_len - len,1406"HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:\n");1407len += scnprintf(buf + len, buf_len - len, "ap_bss_peer_not_found = %u\n",1408le32_to_cpu(htt_stats_buf->ap_bss_peer_not_found));1409len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_no_peer = %u\n",1410le32_to_cpu(htt_stats_buf->ap_bcast_mcast_no_peer));1411len += scnprintf(buf + len, buf_len - len, "sta_delete_in_progress = %u\n",1412le32_to_cpu(htt_stats_buf->sta_delete_in_progress));1413len += scnprintf(buf + len, buf_len - len, "ibss_no_bss_peer = %u\n",1414le32_to_cpu(htt_stats_buf->ibss_no_bss_peer));1415len += scnprintf(buf + len, buf_len - len, "invalid_vdev_type = %u\n",1416le32_to_cpu(htt_stats_buf->invalid_vdev_type));1417len += scnprintf(buf + len, buf_len - len, "invalid_ast_peer_entry = %u\n",1418le32_to_cpu(htt_stats_buf->invalid_ast_peer_entry));1419len += scnprintf(buf + len, buf_len - len, "peer_entry_invalid = %u\n",1420le32_to_cpu(htt_stats_buf->peer_entry_invalid));1421len += scnprintf(buf + len, buf_len - len, "ethertype_not_ip = %u\n",1422le32_to_cpu(htt_stats_buf->ethertype_not_ip));1423len += scnprintf(buf + len, buf_len - len, "eapol_lookup_failed = %u\n",1424le32_to_cpu(htt_stats_buf->eapol_lookup_failed));1425len += scnprintf(buf + len, buf_len - len, "qpeer_not_allow_data = %u\n",1426le32_to_cpu(htt_stats_buf->qpeer_not_allow_data));1427len += scnprintf(buf + len, buf_len - len, "fse_tid_override = %u\n",1428le32_to_cpu(htt_stats_buf->fse_tid_override));1429len += scnprintf(buf + len, buf_len - len, "ipv6_jumbogram_zero_length = %u\n",1430le32_to_cpu(htt_stats_buf->ipv6_jumbogram_zero_length));1431len += scnprintf(buf + len, buf_len - len, "qos_to_non_qos_in_prog = %u\n",1432le32_to_cpu(htt_stats_buf->qos_to_non_qos_in_prog));1433len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_eapol = %u\n",1434le32_to_cpu(htt_stats_buf->ap_bcast_mcast_eapol));1435len += scnprintf(buf + len, buf_len - len, "unicast_on_ap_bss_peer = %u\n",1436le32_to_cpu(htt_stats_buf->unicast_on_ap_bss_peer));1437len += scnprintf(buf + len, buf_len - len, "ap_vdev_invalid = %u\n",1438le32_to_cpu(htt_stats_buf->ap_vdev_invalid));1439len += scnprintf(buf + len, buf_len - len, "incomplete_llc = %u\n",1440le32_to_cpu(htt_stats_buf->incomplete_llc));1441len += scnprintf(buf + len, buf_len - len, "eapol_duplicate_m3 = %u\n",1442le32_to_cpu(htt_stats_buf->eapol_duplicate_m3));1443len += scnprintf(buf + len, buf_len - len, "eapol_duplicate_m4 = %u\n\n",1444le32_to_cpu(htt_stats_buf->eapol_duplicate_m4));14451446stats_req->buf_len = len;1447}14481449static void1450ath12k_htt_print_tx_de_classify_status_stats_tlv(const void *tag_buf, u16 tag_len,1451struct debug_htt_stats_req *stats_req)1452{1453const struct ath12k_htt_tx_de_classify_status_stats_tlv *htt_stats_buf = tag_buf;1454u8 *buf = stats_req->buf;1455u32 len = stats_req->buf_len;1456u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;14571458if (tag_len < sizeof(*htt_stats_buf))1459return;14601461len += scnprintf(buf + len, buf_len - len,1462"HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:\n");1463len += scnprintf(buf + len, buf_len - len, "eok = %u\n",1464le32_to_cpu(htt_stats_buf->eok));1465len += scnprintf(buf + len, buf_len - len, "classify_done = %u\n",1466le32_to_cpu(htt_stats_buf->classify_done));1467len += scnprintf(buf + len, buf_len - len, "lookup_failed = %u\n",1468le32_to_cpu(htt_stats_buf->lookup_failed));1469len += scnprintf(buf + len, buf_len - len, "send_host_dhcp = %u\n",1470le32_to_cpu(htt_stats_buf->send_host_dhcp));1471len += scnprintf(buf + len, buf_len - len, "send_host_mcast = %u\n",1472le32_to_cpu(htt_stats_buf->send_host_mcast));1473len += scnprintf(buf + len, buf_len - len, "send_host_unknown_dest = %u\n",1474le32_to_cpu(htt_stats_buf->send_host_unknown_dest));1475len += scnprintf(buf + len, buf_len - len, "send_host = %u\n",1476le32_to_cpu(htt_stats_buf->send_host));1477len += scnprintf(buf + len, buf_len - len, "status_invalid = %u\n\n",1478le32_to_cpu(htt_stats_buf->status_invalid));14791480stats_req->buf_len = len;1481}14821483static void1484ath12k_htt_print_tx_de_enqueue_packets_stats_tlv(const void *tag_buf, u16 tag_len,1485struct debug_htt_stats_req *stats_req)1486{1487const struct ath12k_htt_tx_de_enqueue_packets_stats_tlv *htt_stats_buf = tag_buf;1488u8 *buf = stats_req->buf;1489u32 len = stats_req->buf_len;1490u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;14911492if (tag_len < sizeof(*htt_stats_buf))1493return;14941495len += scnprintf(buf + len, buf_len - len,1496"HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:\n");1497len += scnprintf(buf + len, buf_len - len, "enqueued_pkts = %u\n",1498le32_to_cpu(htt_stats_buf->enqueued_pkts));1499len += scnprintf(buf + len, buf_len - len, "to_tqm = %u\n",1500le32_to_cpu(htt_stats_buf->to_tqm));1501len += scnprintf(buf + len, buf_len - len, "to_tqm_bypass = %u\n\n",1502le32_to_cpu(htt_stats_buf->to_tqm_bypass));15031504stats_req->buf_len = len;1505}15061507static void1508ath12k_htt_print_tx_de_enqueue_discard_stats_tlv(const void *tag_buf, u16 tag_len,1509struct debug_htt_stats_req *stats_req)1510{1511const struct ath12k_htt_tx_de_enqueue_discard_stats_tlv *htt_stats_buf = tag_buf;1512u8 *buf = stats_req->buf;1513u32 len = stats_req->buf_len;1514u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;15151516if (tag_len < sizeof(*htt_stats_buf))1517return;15181519len += scnprintf(buf + len, buf_len - len,1520"HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:\n");1521len += scnprintf(buf + len, buf_len - len, "discarded_pkts = %u\n",1522le32_to_cpu(htt_stats_buf->discarded_pkts));1523len += scnprintf(buf + len, buf_len - len, "local_frames = %u\n",1524le32_to_cpu(htt_stats_buf->local_frames));1525len += scnprintf(buf + len, buf_len - len, "is_ext_msdu = %u\n\n",1526le32_to_cpu(htt_stats_buf->is_ext_msdu));15271528stats_req->buf_len = len;1529}15301531static void1532ath12k_htt_print_tx_de_compl_stats_tlv(const void *tag_buf, u16 tag_len,1533struct debug_htt_stats_req *stats_req)1534{1535const struct ath12k_htt_tx_de_compl_stats_tlv *htt_stats_buf = tag_buf;1536u8 *buf = stats_req->buf;1537u32 len = stats_req->buf_len;1538u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;15391540if (tag_len < sizeof(*htt_stats_buf))1541return;15421543len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_COMPL_STATS_TLV:\n");1544len += scnprintf(buf + len, buf_len - len, "tcl_dummy_frame = %u\n",1545le32_to_cpu(htt_stats_buf->tcl_dummy_frame));1546len += scnprintf(buf + len, buf_len - len, "tqm_dummy_frame = %u\n",1547le32_to_cpu(htt_stats_buf->tqm_dummy_frame));1548len += scnprintf(buf + len, buf_len - len, "tqm_notify_frame = %u\n",1549le32_to_cpu(htt_stats_buf->tqm_notify_frame));1550len += scnprintf(buf + len, buf_len - len, "fw2wbm_enq = %u\n",1551le32_to_cpu(htt_stats_buf->fw2wbm_enq));1552len += scnprintf(buf + len, buf_len - len, "tqm_bypass_frame = %u\n\n",1553le32_to_cpu(htt_stats_buf->tqm_bypass_frame));15541555stats_req->buf_len = len;1556}15571558static void1559ath12k_htt_print_tx_selfgen_cmn_stats_tlv(const void *tag_buf, u16 tag_len,1560struct debug_htt_stats_req *stats_req)1561{1562const struct ath12k_htt_tx_selfgen_cmn_stats_tlv *htt_stats_buf = tag_buf;1563u8 *buf = stats_req->buf;1564u32 len = stats_req->buf_len;1565u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;1566u32 mac_id_word;15671568if (tag_len < sizeof(*htt_stats_buf))1569return;15701571mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);15721573len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_CMN_STATS_TLV:\n");1574len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",1575u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));1576len += scnprintf(buf + len, buf_len - len, "su_bar = %u\n",1577le32_to_cpu(htt_stats_buf->su_bar));1578len += scnprintf(buf + len, buf_len - len, "rts = %u\n",1579le32_to_cpu(htt_stats_buf->rts));1580len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",1581le32_to_cpu(htt_stats_buf->cts2self));1582len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",1583le32_to_cpu(htt_stats_buf->qos_null));1584len += scnprintf(buf + len, buf_len - len, "delayed_bar_1 = %u\n",1585le32_to_cpu(htt_stats_buf->delayed_bar_1));1586len += scnprintf(buf + len, buf_len - len, "delayed_bar_2 = %u\n",1587le32_to_cpu(htt_stats_buf->delayed_bar_2));1588len += scnprintf(buf + len, buf_len - len, "delayed_bar_3 = %u\n",1589le32_to_cpu(htt_stats_buf->delayed_bar_3));1590len += scnprintf(buf + len, buf_len - len, "delayed_bar_4 = %u\n",1591le32_to_cpu(htt_stats_buf->delayed_bar_4));1592len += scnprintf(buf + len, buf_len - len, "delayed_bar_5 = %u\n",1593le32_to_cpu(htt_stats_buf->delayed_bar_5));1594len += scnprintf(buf + len, buf_len - len, "delayed_bar_6 = %u\n",1595le32_to_cpu(htt_stats_buf->delayed_bar_6));1596len += scnprintf(buf + len, buf_len - len, "delayed_bar_7 = %u\n\n",1597le32_to_cpu(htt_stats_buf->delayed_bar_7));15981599stats_req->buf_len = len;1600}16011602static void1603ath12k_htt_print_tx_selfgen_ac_stats_tlv(const void *tag_buf, u16 tag_len,1604struct debug_htt_stats_req *stats_req)1605{1606const struct ath12k_htt_tx_selfgen_ac_stats_tlv *htt_stats_buf = tag_buf;1607u8 *buf = stats_req->buf;1608u32 len = stats_req->buf_len;1609u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;16101611if (tag_len < sizeof(*htt_stats_buf))1612return;16131614len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_STATS_TLV:\n");1615len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_tried = %u\n",1616le32_to_cpu(htt_stats_buf->ac_su_ndpa));1617len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_tried = %u\n",1618le32_to_cpu(htt_stats_buf->ac_su_ndp));1619len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_tried = %u\n",1620le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndpa));1621len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_tried = %u\n",1622le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndp));1623len += print_array_to_buf_index(buf, len, "ac_mu_mimo_brpollX_tried = ", 1,1624htt_stats_buf->ac_mu_mimo_brpoll,1625ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS - 1,1626"\n\n");16271628stats_req->buf_len = len;1629}16301631static void1632ath12k_htt_print_tx_selfgen_ax_stats_tlv(const void *tag_buf, u16 tag_len,1633struct debug_htt_stats_req *stats_req)1634{1635const struct ath12k_htt_tx_selfgen_ax_stats_tlv *htt_stats_buf = tag_buf;1636u8 *buf = stats_req->buf;1637u32 len = stats_req->buf_len;1638u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;16391640if (tag_len < sizeof(*htt_stats_buf))1641return;16421643len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_STATS_TLV:\n");1644len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_tried = %u\n",1645le32_to_cpu(htt_stats_buf->ax_su_ndpa));1646len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_tried = %u\n",1647le32_to_cpu(htt_stats_buf->ax_su_ndp));1648len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_tried = %u\n",1649le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndpa));1650len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_tried = %u\n",1651le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndp));1652len += print_array_to_buf_index(buf, len, "ax_mu_mimo_brpollX_tried = ", 1,1653htt_stats_buf->ax_mu_mimo_brpoll,1654ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS - 1, "\n");1655len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger = %u\n",1656le32_to_cpu(htt_stats_buf->ax_basic_trigger));1657len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_total_trigger = %u\n",1658le32_to_cpu(htt_stats_buf->ax_ulmumimo_trigger));1659len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger = %u\n",1660le32_to_cpu(htt_stats_buf->ax_bsr_trigger));1661len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger = %u\n",1662le32_to_cpu(htt_stats_buf->ax_mu_bar_trigger));1663len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger = %u\n\n",1664le32_to_cpu(htt_stats_buf->ax_mu_rts_trigger));16651666stats_req->buf_len = len;1667}16681669static void1670ath12k_htt_print_tx_selfgen_be_stats_tlv(const void *tag_buf, u16 tag_len,1671struct debug_htt_stats_req *stats_req)1672{1673const struct ath12k_htt_tx_selfgen_be_stats_tlv *htt_stats_buf = tag_buf;1674u8 *buf = stats_req->buf;1675u32 len = stats_req->buf_len;1676u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;16771678if (tag_len < sizeof(*htt_stats_buf))1679return;16801681len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_BE_STATS_TLV:\n");1682len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_queued = %u\n",1683le32_to_cpu(htt_stats_buf->be_su_ndpa_queued));1684len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_tried = %u\n",1685le32_to_cpu(htt_stats_buf->be_su_ndpa));1686len += scnprintf(buf + len, buf_len - len, "be_su_ndp_queued = %u\n",1687le32_to_cpu(htt_stats_buf->be_su_ndp_queued));1688len += scnprintf(buf + len, buf_len - len, "be_su_ndp_tried = %u\n",1689le32_to_cpu(htt_stats_buf->be_su_ndp));1690len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_queued = %u\n",1691le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_queued));1692len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_tried = %u\n",1693le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa));1694len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_queued = %u\n",1695le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_queued));1696len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_tried = %u\n",1697le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp));1698len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpollX_queued = ", 1,1699htt_stats_buf->be_mu_mimo_brpoll_queued,1700ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,1701"\n");1702len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpollX_tried = ", 1,1703htt_stats_buf->be_mu_mimo_brpoll,1704ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,1705"\n");1706len += print_array_to_buf(buf, len, "be_ul_mumimo_trigger = ",1707htt_stats_buf->be_ul_mumimo_trigger,1708ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, "\n");1709len += scnprintf(buf + len, buf_len - len, "be_basic_trigger = %u\n",1710le32_to_cpu(htt_stats_buf->be_basic_trigger));1711len += scnprintf(buf + len, buf_len - len, "be_ulmumimo_total_trigger = %u\n",1712le32_to_cpu(htt_stats_buf->be_ulmumimo_trigger));1713len += scnprintf(buf + len, buf_len - len, "be_bsr_trigger = %u\n",1714le32_to_cpu(htt_stats_buf->be_bsr_trigger));1715len += scnprintf(buf + len, buf_len - len, "be_mu_bar_trigger = %u\n",1716le32_to_cpu(htt_stats_buf->be_mu_bar_trigger));1717len += scnprintf(buf + len, buf_len - len, "be_mu_rts_trigger = %u\n\n",1718le32_to_cpu(htt_stats_buf->be_mu_rts_trigger));17191720stats_req->buf_len = len;1721}17221723static void1724ath12k_htt_print_tx_selfgen_ac_err_stats_tlv(const void *tag_buf, u16 tag_len,1725struct debug_htt_stats_req *stats_req)1726{1727const struct ath12k_htt_tx_selfgen_ac_err_stats_tlv *htt_stats_buf = tag_buf;1728u8 *buf = stats_req->buf;1729u32 len = stats_req->buf_len;1730u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;17311732if (tag_len < sizeof(*htt_stats_buf))1733return;17341735len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:\n");1736len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_err = %u\n",1737le32_to_cpu(htt_stats_buf->ac_su_ndp_err));1738len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_err = %u\n",1739le32_to_cpu(htt_stats_buf->ac_su_ndpa_err));1740len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_err = %u\n",1741le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndpa_err));1742len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_err = %u\n",1743le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndp_err));1744len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp1_err = %u\n",1745le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp1_err));1746len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp2_err = %u\n",1747le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp2_err));1748len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp3_err = %u\n\n",1749le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp3_err));17501751stats_req->buf_len = len;1752}17531754static void1755ath12k_htt_print_tx_selfgen_ax_err_stats_tlv(const void *tag_buf, u16 tag_len,1756struct debug_htt_stats_req *stats_req)1757{1758const struct ath12k_htt_tx_selfgen_ax_err_stats_tlv *htt_stats_buf = tag_buf;1759u8 *buf = stats_req->buf;1760u32 len = stats_req->buf_len;1761u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;17621763if (tag_len < sizeof(*htt_stats_buf))1764return;17651766len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:\n");1767len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_err = %u\n",1768le32_to_cpu(htt_stats_buf->ax_su_ndp_err));1769len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_err = %u\n",1770le32_to_cpu(htt_stats_buf->ax_su_ndpa_err));1771len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_err = %u\n",1772le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndpa_err));1773len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_err = %u\n",1774le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndp_err));1775len += print_array_to_buf_index(buf, len, "ax_mu_mimo_brpX_err", 1,1776htt_stats_buf->ax_mu_mimo_brp_err,1777ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS - 1,1778"\n");1779len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger_err = %u\n",1780le32_to_cpu(htt_stats_buf->ax_basic_trigger_err));1781len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_total_trigger_err = %u\n",1782le32_to_cpu(htt_stats_buf->ax_ulmumimo_trigger_err));1783len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger_err = %u\n",1784le32_to_cpu(htt_stats_buf->ax_bsr_trigger_err));1785len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger_err = %u\n",1786le32_to_cpu(htt_stats_buf->ax_mu_bar_trigger_err));1787len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger_err = %u\n\n",1788le32_to_cpu(htt_stats_buf->ax_mu_rts_trigger_err));17891790stats_req->buf_len = len;1791}17921793static void1794ath12k_htt_print_tx_selfgen_be_err_stats_tlv(const void *tag_buf, u16 tag_len,1795struct debug_htt_stats_req *stats_req)1796{1797const struct ath12k_htt_tx_selfgen_be_err_stats_tlv *htt_stats_buf = tag_buf;1798u8 *buf = stats_req->buf;1799u32 len = stats_req->buf_len;1800u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;18011802if (tag_len < sizeof(*htt_stats_buf))1803return;18041805len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_BE_ERR_STATS_TLV:\n");1806len += scnprintf(buf + len, buf_len - len, "be_su_ndp_err = %u\n",1807le32_to_cpu(htt_stats_buf->be_su_ndp_err));1808len += scnprintf(buf + len, buf_len - len, "be_su_ndp_flushed = %u\n",1809le32_to_cpu(htt_stats_buf->be_su_ndp_flushed));1810len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_err = %u\n",1811le32_to_cpu(htt_stats_buf->be_su_ndpa_err));1812len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_flushed = %u\n",1813le32_to_cpu(htt_stats_buf->be_su_ndpa_flushed));1814len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_err = %u\n",1815le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_err));1816len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_flushed = %u\n",1817le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_flushed));1818len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_err = %u\n",1819le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_err));1820len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_flushed = %u\n",1821le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_flushed));1822len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpX_err", 1,1823htt_stats_buf->be_mu_mimo_brp_err,1824ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,1825"\n");1826len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpollX_flushed", 1,1827htt_stats_buf->be_mu_mimo_brpoll_flushed,1828ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,1829"\n");1830len += print_array_to_buf(buf, len, "be_mu_mimo_num_cbf_rcvd_on_brp_err",1831htt_stats_buf->be_mu_mimo_brp_err_num_cbf_rxd,1832ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, "\n");1833len += print_array_to_buf(buf, len, "be_ul_mumimo_trigger_err",1834htt_stats_buf->be_ul_mumimo_trigger_err,1835ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, "\n");1836len += scnprintf(buf + len, buf_len - len, "be_basic_trigger_err = %u\n",1837le32_to_cpu(htt_stats_buf->be_basic_trigger_err));1838len += scnprintf(buf + len, buf_len - len, "be_ulmumimo_total_trig_err = %u\n",1839le32_to_cpu(htt_stats_buf->be_ulmumimo_trigger_err));1840len += scnprintf(buf + len, buf_len - len, "be_bsr_trigger_err = %u\n",1841le32_to_cpu(htt_stats_buf->be_bsr_trigger_err));1842len += scnprintf(buf + len, buf_len - len, "be_mu_bar_trigger_err = %u\n",1843le32_to_cpu(htt_stats_buf->be_mu_bar_trigger_err));1844len += scnprintf(buf + len, buf_len - len, "be_mu_rts_trigger_err = %u\n\n",1845le32_to_cpu(htt_stats_buf->be_mu_rts_trigger_err));18461847stats_req->buf_len = len;1848}18491850static void1851ath12k_htt_print_tx_selfgen_ac_sched_status_stats_tlv(const void *tag_buf, u16 tag_len,1852struct debug_htt_stats_req *stats)1853{1854const struct ath12k_htt_tx_selfgen_ac_sched_status_stats_tlv *htt_stats_buf =1855tag_buf;1856u8 *buf = stats->buf;1857u32 len = stats->buf_len;1858u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;18591860if (tag_len < sizeof(*htt_stats_buf))1861return;18621863len += scnprintf(buf + len, buf_len - len,1864"HTT_TX_SELFGEN_AC_SCHED_STATUS_STATS_TLV:\n");1865len += print_array_to_buf(buf, len, "ac_su_ndpa_sch_status",1866htt_stats_buf->ac_su_ndpa_sch_status,1867ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1868len += print_array_to_buf(buf, len, "ac_su_ndp_sch_status",1869htt_stats_buf->ac_su_ndp_sch_status,1870ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1871len += print_array_to_buf(buf, len, "ac_mu_mimo_ndpa_sch_status",1872htt_stats_buf->ac_mu_mimo_ndpa_sch_status,1873ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1874len += print_array_to_buf(buf, len, "ac_mu_mimo_ndp_sch_status",1875htt_stats_buf->ac_mu_mimo_ndp_sch_status,1876ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1877len += print_array_to_buf(buf, len, "ac_mu_mimo_brp_sch_status",1878htt_stats_buf->ac_mu_mimo_brp_sch_status,1879ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1880len += print_array_to_buf(buf, len, "ac_su_ndp_sch_flag_err",1881htt_stats_buf->ac_su_ndp_sch_flag_err,1882ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1883len += print_array_to_buf(buf, len, "ac_mu_mimo_ndp_sch_flag_err",1884htt_stats_buf->ac_mu_mimo_ndp_sch_flag_err,1885ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1886len += print_array_to_buf(buf, len, "ac_mu_mimo_brp_sch_flag_err",1887htt_stats_buf->ac_mu_mimo_brp_sch_flag_err,1888ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n\n");18891890stats->buf_len = len;1891}18921893static void1894ath12k_htt_print_tx_selfgen_ax_sched_status_stats_tlv(const void *tag_buf, u16 tag_len,1895struct debug_htt_stats_req *stats)1896{1897const struct ath12k_htt_tx_selfgen_ax_sched_status_stats_tlv *htt_stats_buf =1898tag_buf;1899u8 *buf = stats->buf;1900u32 len = stats->buf_len;1901u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;19021903if (tag_len < sizeof(*htt_stats_buf))1904return;19051906len += scnprintf(buf + len, buf_len - len,1907"HTT_TX_SELFGEN_AX_SCHED_STATUS_STATS_TLV:\n");1908len += print_array_to_buf(buf, len, "ax_su_ndpa_sch_status",1909htt_stats_buf->ax_su_ndpa_sch_status,1910ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1911len += print_array_to_buf(buf, len, "ax_su_ndp_sch_status",1912htt_stats_buf->ax_su_ndp_sch_status,1913ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1914len += print_array_to_buf(buf, len, "ax_mu_mimo_ndpa_sch_status",1915htt_stats_buf->ax_mu_mimo_ndpa_sch_status,1916ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1917len += print_array_to_buf(buf, len, "ax_mu_mimo_ndp_sch_status",1918htt_stats_buf->ax_mu_mimo_ndp_sch_status,1919ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1920len += print_array_to_buf(buf, len, "ax_mu_brp_sch_status",1921htt_stats_buf->ax_mu_brp_sch_status,1922ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1923len += print_array_to_buf(buf, len, "ax_mu_bar_sch_status",1924htt_stats_buf->ax_mu_bar_sch_status,1925ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1926len += print_array_to_buf(buf, len, "ax_basic_trig_sch_status",1927htt_stats_buf->ax_basic_trig_sch_status,1928ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1929len += print_array_to_buf(buf, len, "ax_su_ndp_sch_flag_err",1930htt_stats_buf->ax_su_ndp_sch_flag_err,1931ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1932len += print_array_to_buf(buf, len, "ax_mu_mimo_ndp_sch_flag_err",1933htt_stats_buf->ax_mu_mimo_ndp_sch_flag_err,1934ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1935len += print_array_to_buf(buf, len, "ax_mu_brp_sch_flag_err",1936htt_stats_buf->ax_mu_brp_sch_flag_err,1937ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1938len += print_array_to_buf(buf, len, "ax_mu_bar_sch_flag_err",1939htt_stats_buf->ax_mu_bar_sch_flag_err,1940ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1941len += print_array_to_buf(buf, len, "ax_basic_trig_sch_flag_err",1942htt_stats_buf->ax_basic_trig_sch_flag_err,1943ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1944len += print_array_to_buf(buf, len, "ax_ulmumimo_trig_sch_status",1945htt_stats_buf->ax_ulmumimo_trig_sch_status,1946ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1947len += print_array_to_buf(buf, len, "ax_ulmumimo_trig_sch_flag_err",1948htt_stats_buf->ax_ulmumimo_trig_sch_flag_err,1949ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n\n");19501951stats->buf_len = len;1952}19531954static void1955ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(const void *tag_buf, u16 tag_len,1956struct debug_htt_stats_req *stats)1957{1958const struct ath12k_htt_tx_selfgen_be_sched_status_stats_tlv *htt_stats_buf =1959tag_buf;1960u8 *buf = stats->buf;1961u32 len = stats->buf_len;1962u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;19631964if (tag_len < sizeof(*htt_stats_buf))1965return;19661967len += scnprintf(buf + len, buf_len - len,1968"HTT_TX_SELFGEN_BE_SCHED_STATUS_STATS_TLV:\n");1969len += print_array_to_buf(buf, len, "be_su_ndpa_sch_status",1970htt_stats_buf->be_su_ndpa_sch_status,1971ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1972len += print_array_to_buf(buf, len, "be_su_ndp_sch_status",1973htt_stats_buf->be_su_ndp_sch_status,1974ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1975len += print_array_to_buf(buf, len, "be_mu_mimo_ndpa_sch_status",1976htt_stats_buf->be_mu_mimo_ndpa_sch_status,1977ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1978len += print_array_to_buf(buf, len, "be_mu_mimo_ndp_sch_status",1979htt_stats_buf->be_mu_mimo_ndp_sch_status,1980ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1981len += print_array_to_buf(buf, len, "be_mu_brp_sch_status",1982htt_stats_buf->be_mu_brp_sch_status,1983ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1984len += print_array_to_buf(buf, len, "be_mu_bar_sch_status",1985htt_stats_buf->be_mu_bar_sch_status,1986ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1987len += print_array_to_buf(buf, len, "be_basic_trig_sch_status",1988htt_stats_buf->be_basic_trig_sch_status,1989ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");1990len += print_array_to_buf(buf, len, "be_su_ndp_sch_flag_err",1991htt_stats_buf->be_su_ndp_sch_flag_err,1992ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1993len += print_array_to_buf(buf, len, "be_mu_mimo_ndp_sch_flag_err",1994htt_stats_buf->be_mu_mimo_ndp_sch_flag_err,1995ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1996len += print_array_to_buf(buf, len, "be_mu_brp_sch_flag_err",1997htt_stats_buf->be_mu_brp_sch_flag_err,1998ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");1999len += print_array_to_buf(buf, len, "be_mu_bar_sch_flag_err",2000htt_stats_buf->be_mu_bar_sch_flag_err,2001ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");2002len += print_array_to_buf(buf, len, "be_basic_trig_sch_flag_err",2003htt_stats_buf->be_basic_trig_sch_flag_err,2004ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n");2005len += print_array_to_buf(buf, len, "be_basic_trig_sch_flag_err",2006htt_stats_buf->be_basic_trig_sch_flag_err,2007ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n");2008len += print_array_to_buf(buf, len, "be_ulmumimo_trig_sch_flag_err",2009htt_stats_buf->be_ulmumimo_trig_sch_flag_err,2010ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n\n");20112012stats->buf_len = len;2013}20142015static void2016ath12k_htt_print_stats_string_tlv(const void *tag_buf, u16 tag_len,2017struct debug_htt_stats_req *stats_req)2018{2019const struct ath12k_htt_stats_string_tlv *htt_stats_buf = tag_buf;2020u8 *buf = stats_req->buf;2021u32 len = stats_req->buf_len;2022u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2023u8 i;2024u16 index = 0;2025u32 datum;2026char data[ATH12K_HTT_MAX_STRING_LEN] = {};20272028tag_len = tag_len >> 2;20292030len += scnprintf(buf + len, buf_len - len, "HTT_STATS_STRING_TLV:\n");2031for (i = 0; i < tag_len; i++) {2032datum = __le32_to_cpu(htt_stats_buf->data[i]);2033index += scnprintf(&data[index], ATH12K_HTT_MAX_STRING_LEN - index,2034"%.*s", 4, (char *)&datum);2035if (index >= ATH12K_HTT_MAX_STRING_LEN)2036break;2037}2038len += scnprintf(buf + len, buf_len - len, "data = %s\n\n", data);20392040stats_req->buf_len = len;2041}20422043static void2044ath12k_htt_print_sring_stats_tlv(const void *tag_buf, u16 tag_len,2045struct debug_htt_stats_req *stats_req)2046{2047const struct ath12k_htt_sring_stats_tlv *htt_stats_buf = tag_buf;2048u8 *buf = stats_req->buf;2049u32 len = stats_req->buf_len;2050u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2051u32 mac_id_word;2052u32 avail_words;2053u32 head_tail_ptr;2054u32 sring_stat;2055u32 tail_ptr;20562057if (tag_len < sizeof(*htt_stats_buf))2058return;20592060mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__ring_id__arena__ep);2061avail_words = __le32_to_cpu(htt_stats_buf->num_avail_words__num_valid_words);2062head_tail_ptr = __le32_to_cpu(htt_stats_buf->head_ptr__tail_ptr);2063sring_stat = __le32_to_cpu(htt_stats_buf->consumer_empty__producer_full);2064tail_ptr = __le32_to_cpu(htt_stats_buf->prefetch_count__internal_tail_ptr);20652066len += scnprintf(buf + len, buf_len - len, "HTT_SRING_STATS_TLV:\n");2067len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",2068u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_MAC_ID));2069len += scnprintf(buf + len, buf_len - len, "ring_id = %u\n",2070u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_RING_ID));2071len += scnprintf(buf + len, buf_len - len, "arena = %u\n",2072u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_ARENA));2073len += scnprintf(buf + len, buf_len - len, "ep = %u\n",2074u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_EP));2075len += scnprintf(buf + len, buf_len - len, "base_addr_lsb = 0x%x\n",2076le32_to_cpu(htt_stats_buf->base_addr_lsb));2077len += scnprintf(buf + len, buf_len - len, "base_addr_msb = 0x%x\n",2078le32_to_cpu(htt_stats_buf->base_addr_msb));2079len += scnprintf(buf + len, buf_len - len, "ring_size = %u\n",2080le32_to_cpu(htt_stats_buf->ring_size));2081len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",2082le32_to_cpu(htt_stats_buf->elem_size));2083len += scnprintf(buf + len, buf_len - len, "num_avail_words = %u\n",2084u32_get_bits(avail_words,2085ATH12K_HTT_SRING_STATS_NUM_AVAIL_WORDS));2086len += scnprintf(buf + len, buf_len - len, "num_valid_words = %u\n",2087u32_get_bits(avail_words,2088ATH12K_HTT_SRING_STATS_NUM_VALID_WORDS));2089len += scnprintf(buf + len, buf_len - len, "head_ptr = %u\n",2090u32_get_bits(head_tail_ptr, ATH12K_HTT_SRING_STATS_HEAD_PTR));2091len += scnprintf(buf + len, buf_len - len, "tail_ptr = %u\n",2092u32_get_bits(head_tail_ptr, ATH12K_HTT_SRING_STATS_TAIL_PTR));2093len += scnprintf(buf + len, buf_len - len, "consumer_empty = %u\n",2094u32_get_bits(sring_stat,2095ATH12K_HTT_SRING_STATS_CONSUMER_EMPTY));2096len += scnprintf(buf + len, buf_len - len, "producer_full = %u\n",2097u32_get_bits(head_tail_ptr,2098ATH12K_HTT_SRING_STATS_PRODUCER_FULL));2099len += scnprintf(buf + len, buf_len - len, "prefetch_count = %u\n",2100u32_get_bits(tail_ptr, ATH12K_HTT_SRING_STATS_PREFETCH_COUNT));2101len += scnprintf(buf + len, buf_len - len, "internal_tail_ptr = %u\n\n",2102u32_get_bits(tail_ptr,2103ATH12K_HTT_SRING_STATS_INTERNAL_TAIL_PTR));21042105stats_req->buf_len = len;2106}21072108static void2109ath12k_htt_print_sfm_cmn_tlv(const void *tag_buf, u16 tag_len,2110struct debug_htt_stats_req *stats_req)2111{2112const struct ath12k_htt_sfm_cmn_tlv *htt_stats_buf = tag_buf;2113u8 *buf = stats_req->buf;2114u32 len = stats_req->buf_len;2115u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2116u32 mac_id_word;21172118if (tag_len < sizeof(*htt_stats_buf))2119return;21202121mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);21222123len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CMN_TLV:\n");2124len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",2125u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));2126len += scnprintf(buf + len, buf_len - len, "buf_total = %u\n",2127le32_to_cpu(htt_stats_buf->buf_total));2128len += scnprintf(buf + len, buf_len - len, "mem_empty = %u\n",2129le32_to_cpu(htt_stats_buf->mem_empty));2130len += scnprintf(buf + len, buf_len - len, "deallocate_bufs = %u\n",2131le32_to_cpu(htt_stats_buf->deallocate_bufs));2132len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2133le32_to_cpu(htt_stats_buf->num_records));21342135stats_req->buf_len = len;2136}21372138static void2139ath12k_htt_print_sfm_client_tlv(const void *tag_buf, u16 tag_len,2140struct debug_htt_stats_req *stats_req)2141{2142const struct ath12k_htt_sfm_client_tlv *htt_stats_buf = tag_buf;2143u8 *buf = stats_req->buf;2144u32 len = stats_req->buf_len;2145u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;21462147if (tag_len < sizeof(*htt_stats_buf))2148return;21492150len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_TLV:\n");2151len += scnprintf(buf + len, buf_len - len, "client_id = %u\n",2152le32_to_cpu(htt_stats_buf->client_id));2153len += scnprintf(buf + len, buf_len - len, "buf_min = %u\n",2154le32_to_cpu(htt_stats_buf->buf_min));2155len += scnprintf(buf + len, buf_len - len, "buf_max = %u\n",2156le32_to_cpu(htt_stats_buf->buf_max));2157len += scnprintf(buf + len, buf_len - len, "buf_busy = %u\n",2158le32_to_cpu(htt_stats_buf->buf_busy));2159len += scnprintf(buf + len, buf_len - len, "buf_alloc = %u\n",2160le32_to_cpu(htt_stats_buf->buf_alloc));2161len += scnprintf(buf + len, buf_len - len, "buf_avail = %u\n",2162le32_to_cpu(htt_stats_buf->buf_avail));2163len += scnprintf(buf + len, buf_len - len, "num_users = %u\n\n",2164le32_to_cpu(htt_stats_buf->num_users));21652166stats_req->buf_len = len;2167}21682169static void2170ath12k_htt_print_sfm_client_user_tlv(const void *tag_buf, u16 tag_len,2171struct debug_htt_stats_req *stats_req)2172{2173const struct ath12k_htt_sfm_client_user_tlv *htt_stats_buf = tag_buf;2174u8 *buf = stats_req->buf;2175u32 len = stats_req->buf_len;2176u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2177u16 num_elems = tag_len >> 2;21782179len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_USER_TLV:\n");2180len += print_array_to_buf(buf, len, "dwords_used_by_user_n",2181htt_stats_buf->dwords_used_by_user_n,2182num_elems, "\n\n");21832184stats_req->buf_len = len;2185}21862187static void2188ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(const void *tag_buf, u16 tag_len,2189struct debug_htt_stats_req *stats_req)2190{2191const struct ath12k_htt_tx_pdev_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;2192u8 *buf = stats_req->buf;2193u32 len = stats_req->buf_len;2194u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2195u8 i;21962197if (tag_len < sizeof(*htt_stats_buf))2198return;21992200len += scnprintf(buf + len, buf_len - len,2201"HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:\n");2202len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",2203le32_to_cpu(htt_stats_buf->mu_mimo_sch_posted));2204len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",2205le32_to_cpu(htt_stats_buf->mu_mimo_sch_failed));2206len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n",2207le32_to_cpu(htt_stats_buf->mu_mimo_ppdu_posted));2208len += scnprintf(buf + len, buf_len - len,2209"\nac_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0,2210le32_to_cpu(htt_stats_buf->ac_mu_mimo_per_grp_sz[0]));2211for (i = 1; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) {2212len += scnprintf(buf + len, buf_len - len,2213"ac_mu_mimo_sch_posted_per_group_index %u ", i);2214len += scnprintf(buf + len, buf_len - len,2215"(TOTAL STREAMS = %u) = %u\n", i + 1,2216le32_to_cpu(htt_stats_buf->ac_mu_mimo_per_grp_sz[i]));2217}22182219for (i = 0; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) {2220len += scnprintf(buf + len, buf_len - len,2221"ac_mu_mimo_sch_posted_per_group_index %u ",2222i + ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS);2223len += scnprintf(buf + len, buf_len - len,2224"(TOTAL STREAMS = %u) = %u\n",2225i + ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS + 1,2226le32_to_cpu(htt_stats_buf->ac_mu_mimo_grp_sz_ext[i]));2227}22282229len += scnprintf(buf + len, buf_len - len,2230"\nax_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0,2231le32_to_cpu(htt_stats_buf->ax_mu_mimo_per_grp_sz[0]));2232for (i = 1; i < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; i++) {2233len += scnprintf(buf + len, buf_len - len,2234"ax_mu_mimo_sch_posted_per_group_index %u ", i);2235len += scnprintf(buf + len, buf_len - len,2236"(TOTAL STREAMS = %u) = %u\n", i + 1,2237le32_to_cpu(htt_stats_buf->ax_mu_mimo_per_grp_sz[i]));2238}22392240len += scnprintf(buf + len, buf_len - len,2241"\nbe_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0,2242le32_to_cpu(htt_stats_buf->be_mu_mimo_per_grp_sz[0]));2243for (i = 1; i < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; i++) {2244len += scnprintf(buf + len, buf_len - len,2245"be_mu_mimo_sch_posted_per_group_index %u ", i);2246len += scnprintf(buf + len, buf_len - len,2247"(TOTAL STREAMS = %u) = %u\n", i + 1,2248le32_to_cpu(htt_stats_buf->be_mu_mimo_per_grp_sz[i]));2249}22502251len += scnprintf(buf + len, buf_len - len, "\n11ac MU_MIMO SCH STATS:\n");2252for (i = 0; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) {2253len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_sch_nusers_");2254len += scnprintf(buf + len, buf_len - len, "%u = %u\n", i,2255le32_to_cpu(htt_stats_buf->ac_mu_mimo_sch_nusers[i]));2256}22572258len += scnprintf(buf + len, buf_len - len, "\n11ax MU_MIMO SCH STATS:\n");2259for (i = 0; i < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; i++) {2260len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_sch_nusers_");2261len += scnprintf(buf + len, buf_len - len, "%u = %u\n", i,2262le32_to_cpu(htt_stats_buf->ax_mu_mimo_sch_nusers[i]));2263}22642265len += scnprintf(buf + len, buf_len - len, "\n11be MU_MIMO SCH STATS:\n");2266for (i = 0; i < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; i++) {2267len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_sch_nusers_");2268len += scnprintf(buf + len, buf_len - len, "%u = %u\n", i,2269le32_to_cpu(htt_stats_buf->be_mu_mimo_sch_nusers[i]));2270}22712272len += scnprintf(buf + len, buf_len - len, "\n11ax OFDMA SCH STATS:\n");2273for (i = 0; i < ATH12K_HTT_TX_NUM_OFDMA_USER_STATS; i++) {2274len += scnprintf(buf + len, buf_len - len,2275"ax_ofdma_sch_nusers_%u = %u\n", i,2276le32_to_cpu(htt_stats_buf->ax_ofdma_sch_nusers[i]));2277len += scnprintf(buf + len, buf_len - len,2278"ax_ul_ofdma_basic_sch_nusers_%u = %u\n", i,2279le32_to_cpu(htt_stats_buf->ax_ul_ofdma_nusers[i]));2280len += scnprintf(buf + len, buf_len - len,2281"ax_ul_ofdma_bsr_sch_nusers_%u = %u\n", i,2282le32_to_cpu(htt_stats_buf->ax_ul_ofdma_bsr_nusers[i]));2283len += scnprintf(buf + len, buf_len - len,2284"ax_ul_ofdma_bar_sch_nusers_%u = %u\n", i,2285le32_to_cpu(htt_stats_buf->ax_ul_ofdma_bar_nusers[i]));2286len += scnprintf(buf + len, buf_len - len,2287"ax_ul_ofdma_brp_sch_nusers_%u = %u\n\n", i,2288le32_to_cpu(htt_stats_buf->ax_ul_ofdma_brp_nusers[i]));2289}22902291len += scnprintf(buf + len, buf_len - len, "11ax UL MUMIMO SCH STATS:\n");2292for (i = 0; i < ATH12K_HTT_TX_NUM_UL_MUMIMO_USER_STATS; i++) {2293len += scnprintf(buf + len, buf_len - len,2294"ax_ul_mumimo_basic_sch_nusers_%u = %u\n", i,2295le32_to_cpu(htt_stats_buf->ax_ul_mumimo_nusers[i]));2296len += scnprintf(buf + len, buf_len - len,2297"ax_ul_mumimo_brp_sch_nusers_%u = %u\n\n", i,2298le32_to_cpu(htt_stats_buf->ax_ul_mumimo_brp_nusers[i]));2299}23002301stats_req->buf_len = len;2302}23032304static void2305ath12k_htt_print_tx_pdev_mumimo_grp_stats_tlv(const void *tag_buf, u16 tag_len,2306struct debug_htt_stats_req *stats_req)2307{2308const struct ath12k_htt_tx_pdev_mumimo_grp_stats_tlv *htt_stats_buf = tag_buf;2309u8 *buf = stats_req->buf;2310u32 len = stats_req->buf_len;2311u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2312int j;23132314if (tag_len < sizeof(*htt_stats_buf))2315return;23162317len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_MUMIMO_GRP_STATS:\n");2318len += print_array_to_buf(buf, len,2319"dl_mumimo_grp_tputs_observed (per bin = 300 mbps)",2320htt_stats_buf->dl_mumimo_grp_tputs,2321ATH12K_HTT_STATS_MUMIMO_TPUT_NUM_BINS, "\n");2322len += print_array_to_buf(buf, len, "dl_mumimo_grp eligible",2323htt_stats_buf->dl_mumimo_grp_eligible,2324ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, "\n");2325len += print_array_to_buf(buf, len, "dl_mumimo_grp_ineligible",2326htt_stats_buf->dl_mumimo_grp_ineligible,2327ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, "\n");2328len += scnprintf(buf + len, buf_len - len, "dl_mumimo_grp_invalid:\n");2329for (j = 0; j < ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ; j++) {2330len += scnprintf(buf + len, buf_len - len, "grp_id = %u", j);2331len += print_array_to_buf(buf, len, "",2332htt_stats_buf->dl_mumimo_grp_invalid,2333ATH12K_HTT_STATS_MAX_INVALID_REASON_CODE,2334"\n");2335}23362337len += print_array_to_buf(buf, len, "ul_mumimo_grp_best_grp_size",2338htt_stats_buf->ul_mumimo_grp_best_grp_size,2339ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, "\n");2340len += print_array_to_buf(buf, len, "ul_mumimo_grp_best_num_usrs = ",2341htt_stats_buf->ul_mumimo_grp_best_usrs,2342ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS, "\n");2343len += print_array_to_buf(buf, len,2344"ul_mumimo_grp_tputs_observed (per bin = 300 mbps)",2345htt_stats_buf->ul_mumimo_grp_tputs,2346ATH12K_HTT_STATS_MUMIMO_TPUT_NUM_BINS, "\n\n");23472348stats_req->buf_len = len;2349}23502351static void2352ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,2353struct debug_htt_stats_req *stats_req)2354{2355const struct ath12k_htt_tx_pdev_mpdu_stats_tlv *htt_stats_buf = tag_buf;2356u8 *buf = stats_req->buf;2357u32 len = stats_req->buf_len;2358u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2359u32 user_index;2360u32 tx_sched_mode;23612362if (tag_len < sizeof(*htt_stats_buf))2363return;23642365user_index = __le32_to_cpu(htt_stats_buf->user_index);2366tx_sched_mode = __le32_to_cpu(htt_stats_buf->tx_sched_mode);23672368if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {2369if (!user_index)2370len += scnprintf(buf + len, buf_len - len,2371"HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");23722373if (user_index < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS) {2374len += scnprintf(buf + len, buf_len - len,2375"ac_mu_mimo_mpdus_queued_usr_%u = %u\n",2376user_index,2377le32_to_cpu(htt_stats_buf->mpdus_queued_usr));2378len += scnprintf(buf + len, buf_len - len,2379"ac_mu_mimo_mpdus_tried_usr_%u = %u\n",2380user_index,2381le32_to_cpu(htt_stats_buf->mpdus_tried_usr));2382len += scnprintf(buf + len, buf_len - len,2383"ac_mu_mimo_mpdus_failed_usr_%u = %u\n",2384user_index,2385le32_to_cpu(htt_stats_buf->mpdus_failed_usr));2386len += scnprintf(buf + len, buf_len - len,2387"ac_mu_mimo_mpdus_requeued_usr_%u = %u\n",2388user_index,2389le32_to_cpu(htt_stats_buf->mpdus_requeued_usr));2390len += scnprintf(buf + len, buf_len - len,2391"ac_mu_mimo_err_no_ba_usr_%u = %u\n",2392user_index,2393le32_to_cpu(htt_stats_buf->err_no_ba_usr));2394len += scnprintf(buf + len, buf_len - len,2395"ac_mu_mimo_mpdu_underrun_usr_%u = %u\n",2396user_index,2397le32_to_cpu(htt_stats_buf->mpdu_underrun_usr));2398len += scnprintf(buf + len, buf_len - len,2399"ac_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",2400user_index,2401le32_to_cpu(htt_stats_buf->ampdu_underrun_usr));2402}2403}24042405if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {2406if (!user_index)2407len += scnprintf(buf + len, buf_len - len,2408"HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");24092410if (user_index < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS) {2411len += scnprintf(buf + len, buf_len - len,2412"ax_mu_mimo_mpdus_queued_usr_%u = %u\n",2413user_index,2414le32_to_cpu(htt_stats_buf->mpdus_queued_usr));2415len += scnprintf(buf + len, buf_len - len,2416"ax_mu_mimo_mpdus_tried_usr_%u = %u\n",2417user_index,2418le32_to_cpu(htt_stats_buf->mpdus_tried_usr));2419len += scnprintf(buf + len, buf_len - len,2420"ax_mu_mimo_mpdus_failed_usr_%u = %u\n",2421user_index,2422le32_to_cpu(htt_stats_buf->mpdus_failed_usr));2423len += scnprintf(buf + len, buf_len - len,2424"ax_mu_mimo_mpdus_requeued_usr_%u = %u\n",2425user_index,2426le32_to_cpu(htt_stats_buf->mpdus_requeued_usr));2427len += scnprintf(buf + len, buf_len - len,2428"ax_mu_mimo_err_no_ba_usr_%u = %u\n",2429user_index,2430le32_to_cpu(htt_stats_buf->err_no_ba_usr));2431len += scnprintf(buf + len, buf_len - len,2432"ax_mu_mimo_mpdu_underrun_usr_%u = %u\n",2433user_index,2434le32_to_cpu(htt_stats_buf->mpdu_underrun_usr));2435len += scnprintf(buf + len, buf_len - len,2436"ax_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",2437user_index,2438le32_to_cpu(htt_stats_buf->ampdu_underrun_usr));2439}2440}24412442if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {2443if (!user_index)2444len += scnprintf(buf + len, buf_len - len,2445"HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");24462447if (user_index < ATH12K_HTT_TX_NUM_OFDMA_USER_STATS) {2448len += scnprintf(buf + len, buf_len - len,2449"ax_mu_ofdma_mpdus_queued_usr_%u = %u\n",2450user_index,2451le32_to_cpu(htt_stats_buf->mpdus_queued_usr));2452len += scnprintf(buf + len, buf_len - len,2453"ax_mu_ofdma_mpdus_tried_usr_%u = %u\n",2454user_index,2455le32_to_cpu(htt_stats_buf->mpdus_tried_usr));2456len += scnprintf(buf + len, buf_len - len,2457"ax_mu_ofdma_mpdus_failed_usr_%u = %u\n",2458user_index,2459le32_to_cpu(htt_stats_buf->mpdus_failed_usr));2460len += scnprintf(buf + len, buf_len - len,2461"ax_mu_ofdma_mpdus_requeued_usr_%u = %u\n",2462user_index,2463le32_to_cpu(htt_stats_buf->mpdus_requeued_usr));2464len += scnprintf(buf + len, buf_len - len,2465"ax_mu_ofdma_err_no_ba_usr_%u = %u\n",2466user_index,2467le32_to_cpu(htt_stats_buf->err_no_ba_usr));2468len += scnprintf(buf + len, buf_len - len,2469"ax_mu_ofdma_mpdu_underrun_usr_%u = %u\n",2470user_index,2471le32_to_cpu(htt_stats_buf->mpdu_underrun_usr));2472len += scnprintf(buf + len, buf_len - len,2473"ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n\n",2474user_index,2475le32_to_cpu(htt_stats_buf->ampdu_underrun_usr));2476}2477}24782479stats_req->buf_len = len;2480}24812482static void2483ath12k_htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf, u16 tag_len,2484struct debug_htt_stats_req *stats_req)2485{2486const struct ath12k_htt_pdev_cca_stats_hist_v1_tlv *htt_stats_buf = tag_buf;2487u8 *buf = stats_req->buf;2488u32 len = stats_req->buf_len;2489u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;24902491if (tag_len < sizeof(*htt_stats_buf))2492return;24932494len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_CCA_STATS_HIST_TLV :\n");2495len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",2496le32_to_cpu(htt_stats_buf->chan_num));2497len += scnprintf(buf + len, buf_len - len, "num_records = %u\n",2498le32_to_cpu(htt_stats_buf->num_records));2499len += scnprintf(buf + len, buf_len - len, "valid_cca_counters_bitmap = 0x%x\n",2500le32_to_cpu(htt_stats_buf->valid_cca_counters_bitmap));2501len += scnprintf(buf + len, buf_len - len, "collection_interval = %u\n\n",2502le32_to_cpu(htt_stats_buf->collection_interval));25032504stats_req->buf_len = len;2505}25062507static void2508ath12k_htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf, u16 tag_len,2509struct debug_htt_stats_req *stats_req)2510{2511const struct ath12k_htt_pdev_stats_cca_counters_tlv *htt_stats_buf = tag_buf;2512u8 *buf = stats_req->buf;2513u32 len = stats_req->buf_len;2514u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;25152516if (tag_len < sizeof(*htt_stats_buf))2517return;25182519len += scnprintf(buf + len, buf_len - len,2520"HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n");2521len += scnprintf(buf + len, buf_len - len, "tx_frame_usec = %u\n",2522le32_to_cpu(htt_stats_buf->tx_frame_usec));2523len += scnprintf(buf + len, buf_len - len, "rx_frame_usec = %u\n",2524le32_to_cpu(htt_stats_buf->rx_frame_usec));2525len += scnprintf(buf + len, buf_len - len, "rx_clear_usec = %u\n",2526le32_to_cpu(htt_stats_buf->rx_clear_usec));2527len += scnprintf(buf + len, buf_len - len, "my_rx_frame_usec = %u\n",2528le32_to_cpu(htt_stats_buf->my_rx_frame_usec));2529len += scnprintf(buf + len, buf_len - len, "usec_cnt = %u\n",2530le32_to_cpu(htt_stats_buf->usec_cnt));2531len += scnprintf(buf + len, buf_len - len, "med_rx_idle_usec = %u\n",2532le32_to_cpu(htt_stats_buf->med_rx_idle_usec));2533len += scnprintf(buf + len, buf_len - len, "med_tx_idle_global_usec = %u\n",2534le32_to_cpu(htt_stats_buf->med_tx_idle_global_usec));2535len += scnprintf(buf + len, buf_len - len, "cca_obss_usec = %u\n\n",2536le32_to_cpu(htt_stats_buf->cca_obss_usec));25372538stats_req->buf_len = len;2539}25402541static void2542ath12k_htt_print_tx_sounding_stats_tlv(const void *tag_buf, u16 tag_len,2543struct debug_htt_stats_req *stats_req)2544{2545const struct ath12k_htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf;2546const __le32 *cbf_20, *cbf_40, *cbf_80, *cbf_160, *cbf_320;2547u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2548u32 len = stats_req->buf_len;2549u8 *buf = stats_req->buf;2550u32 tx_sounding_mode;2551u8 i, u;25522553if (tag_len < sizeof(*htt_stats_buf))2554return;25552556cbf_20 = htt_stats_buf->cbf_20;2557cbf_40 = htt_stats_buf->cbf_40;2558cbf_80 = htt_stats_buf->cbf_80;2559cbf_160 = htt_stats_buf->cbf_160;2560cbf_320 = htt_stats_buf->cbf_320;2561tx_sounding_mode = le32_to_cpu(htt_stats_buf->tx_sounding_mode);25622563if (tx_sounding_mode == ATH12K_HTT_TX_AC_SOUNDING_MODE) {2564len += scnprintf(buf + len, buf_len - len,2565"HTT_TX_AC_SOUNDING_STATS_TLV:\n");2566len += scnprintf(buf + len, buf_len - len,2567"ac_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2568le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),2569le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2570le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2571len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2572le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2573le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2574len += scnprintf(buf + len, buf_len - len,2575"ac_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2576le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),2577le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2578le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2579len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2580le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2581le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2582len += scnprintf(buf + len, buf_len - len,2583"ac_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2584le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),2585le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2586le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2587len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2588le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2589le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2590len += scnprintf(buf + len, buf_len - len,2591"ac_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2592le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),2593le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2594le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2595len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2596le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2597le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));25982599for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; u++) {2600len += scnprintf(buf + len, buf_len - len,2601"Sounding User_%u = 20MHz: %u, ", u,2602le32_to_cpu(htt_stats_buf->sounding[i++]));2603len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ",2604le32_to_cpu(htt_stats_buf->sounding[i++]));2605len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ",2606le32_to_cpu(htt_stats_buf->sounding[i++]));2607len += scnprintf(buf + len, buf_len - len, "160MHz: %u\n",2608le32_to_cpu(htt_stats_buf->sounding[i++]));2609}2610} else if (tx_sounding_mode == ATH12K_HTT_TX_AX_SOUNDING_MODE) {2611len += scnprintf(buf + len, buf_len - len,2612"\nHTT_TX_AX_SOUNDING_STATS_TLV:\n");2613len += scnprintf(buf + len, buf_len - len,2614"ax_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2615le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),2616le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2617le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2618len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2619le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2620le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2621len += scnprintf(buf + len, buf_len - len,2622"ax_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2623le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),2624le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2625le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2626len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2627le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2628le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2629len += scnprintf(buf + len, buf_len - len,2630"ax_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2631le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),2632le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2633le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2634len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2635le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2636le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2637len += scnprintf(buf + len, buf_len - len,2638"ax_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2639le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),2640le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2641le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2642len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2643le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2644le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));26452646for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; u++) {2647len += scnprintf(buf + len, buf_len - len,2648"Sounding User_%u = 20MHz: %u, ", u,2649le32_to_cpu(htt_stats_buf->sounding[i++]));2650len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ",2651le32_to_cpu(htt_stats_buf->sounding[i++]));2652len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ",2653le32_to_cpu(htt_stats_buf->sounding[i++]));2654len += scnprintf(buf + len, buf_len - len, "160MHz: %u\n",2655le32_to_cpu(htt_stats_buf->sounding[i++]));2656}2657} else if (tx_sounding_mode == ATH12K_HTT_TX_BE_SOUNDING_MODE) {2658len += scnprintf(buf + len, buf_len - len,2659"\nHTT_TX_BE_SOUNDING_STATS_TLV:\n");2660len += scnprintf(buf + len, buf_len - len,2661"be_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2662le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),2663le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2664le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2665len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2666le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2667le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2668len += scnprintf(buf + len, buf_len - len,2669"be_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2670le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),2671le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2672le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2673len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2674le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2675le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2676len += scnprintf(buf + len, buf_len - len,2677"be_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2678le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),2679le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2680le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2681len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2682le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2683le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2684len += scnprintf(buf + len, buf_len - len,2685"be_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2686le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),2687le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2688le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2689len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2690le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2691le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2692len += scnprintf(buf + len, buf_len - len,2693"be_cbf_320 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",2694le32_to_cpu(cbf_320[ATH12K_HTT_IMPL_STEER_STATS]),2695le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),2696le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));2697len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",2698le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),2699le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));2700for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; u++) {2701len += scnprintf(buf + len, buf_len - len,2702"Sounding User_%u = 20MHz: %u, ", u,2703le32_to_cpu(htt_stats_buf->sounding[i++]));2704len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ",2705le32_to_cpu(htt_stats_buf->sounding[i++]));2706len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ",2707le32_to_cpu(htt_stats_buf->sounding[i++]));2708len += scnprintf(buf + len, buf_len - len,2709"160MHz: %u, 320MHz: %u\n",2710le32_to_cpu(htt_stats_buf->sounding[i++]),2711le32_to_cpu(htt_stats_buf->sounding_320[u]));2712}2713} else if (tx_sounding_mode == ATH12K_HTT_TX_CMN_SOUNDING_MODE) {2714len += scnprintf(buf + len, buf_len - len,2715"\nCV UPLOAD HANDLER STATS:\n");2716len += scnprintf(buf + len, buf_len - len, "cv_nc_mismatch_err = %u\n",2717le32_to_cpu(htt_stats_buf->cv_nc_mismatch_err));2718len += scnprintf(buf + len, buf_len - len, "cv_fcs_err = %u\n",2719le32_to_cpu(htt_stats_buf->cv_fcs_err));2720len += scnprintf(buf + len, buf_len - len, "cv_frag_idx_mismatch = %u\n",2721le32_to_cpu(htt_stats_buf->cv_frag_idx_mismatch));2722len += scnprintf(buf + len, buf_len - len, "cv_invalid_peer_id = %u\n",2723le32_to_cpu(htt_stats_buf->cv_invalid_peer_id));2724len += scnprintf(buf + len, buf_len - len, "cv_no_txbf_setup = %u\n",2725le32_to_cpu(htt_stats_buf->cv_no_txbf_setup));2726len += scnprintf(buf + len, buf_len - len, "cv_expiry_in_update = %u\n",2727le32_to_cpu(htt_stats_buf->cv_expiry_in_update));2728len += scnprintf(buf + len, buf_len - len, "cv_pkt_bw_exceed = %u\n",2729le32_to_cpu(htt_stats_buf->cv_pkt_bw_exceed));2730len += scnprintf(buf + len, buf_len - len, "cv_dma_not_done_err = %u\n",2731le32_to_cpu(htt_stats_buf->cv_dma_not_done_err));2732len += scnprintf(buf + len, buf_len - len, "cv_update_failed = %u\n",2733le32_to_cpu(htt_stats_buf->cv_update_failed));2734len += scnprintf(buf + len, buf_len - len, "cv_dma_timeout_error = %u\n",2735le32_to_cpu(htt_stats_buf->cv_dma_timeout_error));2736len += scnprintf(buf + len, buf_len - len, "cv_buf_ibf_uploads = %u\n",2737le32_to_cpu(htt_stats_buf->cv_buf_ibf_uploads));2738len += scnprintf(buf + len, buf_len - len, "cv_buf_ebf_uploads = %u\n",2739le32_to_cpu(htt_stats_buf->cv_buf_ebf_uploads));2740len += scnprintf(buf + len, buf_len - len, "cv_buf_received = %u\n",2741le32_to_cpu(htt_stats_buf->cv_buf_received));2742len += scnprintf(buf + len, buf_len - len, "cv_buf_fed_back = %u\n\n",2743le32_to_cpu(htt_stats_buf->cv_buf_fed_back));27442745len += scnprintf(buf + len, buf_len - len, "CV QUERY STATS:\n");2746len += scnprintf(buf + len, buf_len - len, "cv_total_query = %u\n",2747le32_to_cpu(htt_stats_buf->cv_total_query));2748len += scnprintf(buf + len, buf_len - len,2749"cv_total_pattern_query = %u\n",2750le32_to_cpu(htt_stats_buf->cv_total_pattern_query));2751len += scnprintf(buf + len, buf_len - len, "cv_total_bw_query = %u\n",2752le32_to_cpu(htt_stats_buf->cv_total_bw_query));2753len += scnprintf(buf + len, buf_len - len, "cv_invalid_bw_coding = %u\n",2754le32_to_cpu(htt_stats_buf->cv_invalid_bw_coding));2755len += scnprintf(buf + len, buf_len - len, "cv_forced_sounding = %u\n",2756le32_to_cpu(htt_stats_buf->cv_forced_sounding));2757len += scnprintf(buf + len, buf_len - len,2758"cv_standalone_sounding = %u\n",2759le32_to_cpu(htt_stats_buf->cv_standalone_sounding));2760len += scnprintf(buf + len, buf_len - len, "cv_nc_mismatch = %u\n",2761le32_to_cpu(htt_stats_buf->cv_nc_mismatch));2762len += scnprintf(buf + len, buf_len - len, "cv_fb_type_mismatch = %u\n",2763le32_to_cpu(htt_stats_buf->cv_fb_type_mismatch));2764len += scnprintf(buf + len, buf_len - len, "cv_ofdma_bw_mismatch = %u\n",2765le32_to_cpu(htt_stats_buf->cv_ofdma_bw_mismatch));2766len += scnprintf(buf + len, buf_len - len, "cv_bw_mismatch = %u\n",2767le32_to_cpu(htt_stats_buf->cv_bw_mismatch));2768len += scnprintf(buf + len, buf_len - len, "cv_pattern_mismatch = %u\n",2769le32_to_cpu(htt_stats_buf->cv_pattern_mismatch));2770len += scnprintf(buf + len, buf_len - len, "cv_preamble_mismatch = %u\n",2771le32_to_cpu(htt_stats_buf->cv_preamble_mismatch));2772len += scnprintf(buf + len, buf_len - len, "cv_nr_mismatch = %u\n",2773le32_to_cpu(htt_stats_buf->cv_nr_mismatch));2774len += scnprintf(buf + len, buf_len - len,2775"cv_in_use_cnt_exceeded = %u\n",2776le32_to_cpu(htt_stats_buf->cv_in_use_cnt_exceeded));2777len += scnprintf(buf + len, buf_len - len, "cv_ntbr_sounding = %u\n",2778le32_to_cpu(htt_stats_buf->cv_ntbr_sounding));2779len += scnprintf(buf + len, buf_len - len,2780"cv_found_upload_in_progress = %u\n",2781le32_to_cpu(htt_stats_buf->cv_found_upload_in_progress));2782len += scnprintf(buf + len, buf_len - len,2783"cv_expired_during_query = %u\n",2784le32_to_cpu(htt_stats_buf->cv_expired_during_query));2785len += scnprintf(buf + len, buf_len - len, "cv_found = %u\n",2786le32_to_cpu(htt_stats_buf->cv_found));2787len += scnprintf(buf + len, buf_len - len, "cv_not_found = %u\n",2788le32_to_cpu(htt_stats_buf->cv_not_found));2789len += scnprintf(buf + len, buf_len - len, "cv_total_query_ibf = %u\n",2790le32_to_cpu(htt_stats_buf->cv_total_query_ibf));2791len += scnprintf(buf + len, buf_len - len, "cv_found_ibf = %u\n",2792le32_to_cpu(htt_stats_buf->cv_found_ibf));2793len += scnprintf(buf + len, buf_len - len, "cv_not_found_ibf = %u\n",2794le32_to_cpu(htt_stats_buf->cv_not_found_ibf));2795len += scnprintf(buf + len, buf_len - len,2796"cv_expired_during_query_ibf = %u\n\n",2797le32_to_cpu(htt_stats_buf->cv_expired_during_query_ibf));2798}27992800stats_req->buf_len = len;2801}28022803static void2804ath12k_htt_print_pdev_obss_pd_stats_tlv(const void *tag_buf, u16 tag_len,2805struct debug_htt_stats_req *stats_req)2806{2807const struct ath12k_htt_pdev_obss_pd_stats_tlv *htt_stats_buf = tag_buf;2808u8 *buf = stats_req->buf;2809u32 len = stats_req->buf_len;2810u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2811u8 i;2812static const char *access_cat_names[ATH12K_HTT_NUM_AC_WMM] = {"best effort",2813"background",2814"video", "voice"};28152816if (tag_len < sizeof(*htt_stats_buf))2817return;28182819len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_OBSS_PD_STATS_TLV:\n");2820len += scnprintf(buf + len, buf_len - len, "num_spatial_reuse_tx = %u\n",2821le32_to_cpu(htt_stats_buf->num_sr_tx_transmissions));2822len += scnprintf(buf + len, buf_len - len,2823"num_spatial_reuse_opportunities = %u\n",2824le32_to_cpu(htt_stats_buf->num_spatial_reuse_opportunities));2825len += scnprintf(buf + len, buf_len - len, "num_non_srg_opportunities = %u\n",2826le32_to_cpu(htt_stats_buf->num_non_srg_opportunities));2827len += scnprintf(buf + len, buf_len - len, "num_non_srg_ppdu_tried = %u\n",2828le32_to_cpu(htt_stats_buf->num_non_srg_ppdu_tried));2829len += scnprintf(buf + len, buf_len - len, "num_non_srg_ppdu_success = %u\n",2830le32_to_cpu(htt_stats_buf->num_non_srg_ppdu_success));2831len += scnprintf(buf + len, buf_len - len, "num_srg_opportunities = %u\n",2832le32_to_cpu(htt_stats_buf->num_srg_opportunities));2833len += scnprintf(buf + len, buf_len - len, "num_srg_ppdu_tried = %u\n",2834le32_to_cpu(htt_stats_buf->num_srg_ppdu_tried));2835len += scnprintf(buf + len, buf_len - len, "num_srg_ppdu_success = %u\n",2836le32_to_cpu(htt_stats_buf->num_srg_ppdu_success));2837len += scnprintf(buf + len, buf_len - len, "num_psr_opportunities = %u\n",2838le32_to_cpu(htt_stats_buf->num_psr_opportunities));2839len += scnprintf(buf + len, buf_len - len, "num_psr_ppdu_tried = %u\n",2840le32_to_cpu(htt_stats_buf->num_psr_ppdu_tried));2841len += scnprintf(buf + len, buf_len - len, "num_psr_ppdu_success = %u\n",2842le32_to_cpu(htt_stats_buf->num_psr_ppdu_success));2843len += scnprintf(buf + len, buf_len - len, "min_duration_check_flush_cnt = %u\n",2844le32_to_cpu(htt_stats_buf->num_obss_min_dur_check_flush_cnt));2845len += scnprintf(buf + len, buf_len - len, "sr_ppdu_abort_flush_cnt = %u\n\n",2846le32_to_cpu(htt_stats_buf->num_sr_ppdu_abort_flush_cnt));28472848len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_OBSS_PD_PER_AC_STATS:\n");2849for (i = 0; i < ATH12K_HTT_NUM_AC_WMM; i++) {2850len += scnprintf(buf + len, buf_len - len, "Access Category %u (%s)\n",2851i, access_cat_names[i]);2852len += scnprintf(buf + len, buf_len - len,2853"num_non_srg_ppdu_tried = %u\n",2854le32_to_cpu(htt_stats_buf->num_non_srg_tried_per_ac[i]));2855len += scnprintf(buf + len, buf_len - len,2856"num_non_srg_ppdu_success = %u\n",2857le32_to_cpu(htt_stats_buf->num_non_srg_success_ac[i]));2858len += scnprintf(buf + len, buf_len - len, "num_srg_ppdu_tried = %u\n",2859le32_to_cpu(htt_stats_buf->num_srg_tried_per_ac[i]));2860len += scnprintf(buf + len, buf_len - len,2861"num_srg_ppdu_success = %u\n\n",2862le32_to_cpu(htt_stats_buf->num_srg_success_per_ac[i]));2863}28642865stats_req->buf_len = len;2866}28672868static void2869ath12k_htt_print_latency_prof_ctx_tlv(const void *tag_buf, u16 tag_len,2870struct debug_htt_stats_req *stats_req)2871{2872const struct ath12k_htt_latency_prof_ctx_tlv *htt_stats_buf = tag_buf;2873u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2874u32 len = stats_req->buf_len;2875u8 *buf = stats_req->buf;28762877if (tag_len < sizeof(*htt_stats_buf))2878return;28792880len += scnprintf(buf + len, buf_len - len, "HTT_STATS_LATENCY_CTX_TLV:\n");2881len += scnprintf(buf + len, buf_len - len, "duration = %u\n",2882le32_to_cpu(htt_stats_buf->duration));2883len += scnprintf(buf + len, buf_len - len, "tx_msdu_cnt = %u\n",2884le32_to_cpu(htt_stats_buf->tx_msdu_cnt));2885len += scnprintf(buf + len, buf_len - len, "tx_mpdu_cnt = %u\n",2886le32_to_cpu(htt_stats_buf->tx_mpdu_cnt));2887len += scnprintf(buf + len, buf_len - len, "rx_msdu_cnt = %u\n",2888le32_to_cpu(htt_stats_buf->rx_msdu_cnt));2889len += scnprintf(buf + len, buf_len - len, "rx_mpdu_cnt = %u\n\n",2890le32_to_cpu(htt_stats_buf->rx_mpdu_cnt));28912892stats_req->buf_len = len;2893}28942895static void2896ath12k_htt_print_latency_prof_cnt(const void *tag_buf, u16 tag_len,2897struct debug_htt_stats_req *stats_req)2898{2899const struct ath12k_htt_latency_prof_cnt_tlv *htt_stats_buf = tag_buf;2900u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2901u32 len = stats_req->buf_len;2902u8 *buf = stats_req->buf;29032904if (tag_len < sizeof(*htt_stats_buf))2905return;29062907len += scnprintf(buf + len, buf_len - len, "HTT_STATS_LATENCY_CNT_TLV:\n");2908len += scnprintf(buf + len, buf_len - len, "prof_enable_cnt = %u\n\n",2909le32_to_cpu(htt_stats_buf->prof_enable_cnt));29102911stats_req->buf_len = len;2912}29132914static void2915ath12k_htt_print_latency_prof_stats_tlv(const void *tag_buf, u16 tag_len,2916struct debug_htt_stats_req *stats_req)2917{2918const struct ath12k_htt_latency_prof_stats_tlv *htt_stats_buf = tag_buf;2919u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2920u32 len = stats_req->buf_len;2921u8 *buf = stats_req->buf;29222923if (tag_len < sizeof(*htt_stats_buf))2924return;29252926if (le32_to_cpu(htt_stats_buf->print_header) == 1) {2927len += scnprintf(buf + len, buf_len - len,2928"HTT_STATS_LATENCY_PROF_TLV:\n");2929}29302931len += scnprintf(buf + len, buf_len - len, "Latency name = %s\n",2932htt_stats_buf->latency_prof_name);2933len += scnprintf(buf + len, buf_len - len, "count = %u\n",2934le32_to_cpu(htt_stats_buf->cnt));2935len += scnprintf(buf + len, buf_len - len, "minimum = %u\n",2936le32_to_cpu(htt_stats_buf->min));2937len += scnprintf(buf + len, buf_len - len, "maximum = %u\n",2938le32_to_cpu(htt_stats_buf->max));2939len += scnprintf(buf + len, buf_len - len, "last = %u\n",2940le32_to_cpu(htt_stats_buf->last));2941len += scnprintf(buf + len, buf_len - len, "total = %u\n",2942le32_to_cpu(htt_stats_buf->tot));2943len += scnprintf(buf + len, buf_len - len, "average = %u\n",2944le32_to_cpu(htt_stats_buf->avg));2945len += scnprintf(buf + len, buf_len - len, "histogram interval = %u\n",2946le32_to_cpu(htt_stats_buf->hist_intvl));2947len += print_array_to_buf(buf, len, "histogram", htt_stats_buf->hist,2948ATH12K_HTT_LATENCY_PROFILE_NUM_MAX_HIST, "\n\n");29492950stats_req->buf_len = len;2951}29522953static void2954ath12k_htt_print_ul_ofdma_trigger_stats(const void *tag_buf, u16 tag_len,2955struct debug_htt_stats_req *stats_req)2956{2957const struct ath12k_htt_rx_pdev_ul_trigger_stats_tlv *htt_stats_buf = tag_buf;2958u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;2959u32 len = stats_req->buf_len;2960u8 *buf = stats_req->buf;2961u32 mac_id;2962u8 j;29632964if (tag_len < sizeof(*htt_stats_buf))2965return;29662967mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);29682969len += scnprintf(buf + len, buf_len - len,2970"HTT_RX_PDEV_UL_TRIGGER_STATS_TLV:\n");2971len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",2972u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID));2973len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n",2974le32_to_cpu(htt_stats_buf->rx_11ax_ul_ofdma));2975len += print_array_to_buf(buf, len, "ul_ofdma_rx_mcs",2976htt_stats_buf->ul_ofdma_rx_mcs,2977ATH12K_HTT_RX_NUM_MCS_CNTRS, "\n");2978for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) {2979len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_gi[%u]", j);2980len += print_array_to_buf(buf, len, "",2981htt_stats_buf->ul_ofdma_rx_gi[j],2982ATH12K_HTT_RX_NUM_MCS_CNTRS, "\n");2983}29842985len += print_array_to_buf_index(buf, len, "ul_ofdma_rx_nss", 1,2986htt_stats_buf->ul_ofdma_rx_nss,2987ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");2988len += print_array_to_buf(buf, len, "ul_ofdma_rx_bw",2989htt_stats_buf->ul_ofdma_rx_bw,2990ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");29912992for (j = 0; j < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; j++) {2993len += scnprintf(buf + len, buf_len - len, j == 0 ?2994"half_ul_ofdma_rx_bw" :2995"quarter_ul_ofdma_rx_bw");2996len += print_array_to_buf(buf, len, "", htt_stats_buf->red_bw[j],2997ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");2998}2999len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n",3000le32_to_cpu(htt_stats_buf->ul_ofdma_rx_stbc));3001len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n",3002le32_to_cpu(htt_stats_buf->ul_ofdma_rx_ldpc));30033004len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_data_ru_size_ppdu = ");3005for (j = 0; j < ATH12K_HTT_RX_NUM_RU_SIZE_CNTRS; j++)3006len += scnprintf(buf + len, buf_len - len, " %s:%u ",3007ath12k_htt_ax_tx_rx_ru_size_to_str(j),3008le32_to_cpu(htt_stats_buf->data_ru_size_ppdu[j]));3009len += scnprintf(buf + len, buf_len - len, "\n");30103011len += scnprintf(buf + len, buf_len - len,3012"rx_ulofdma_non_data_ru_size_ppdu = ");3013for (j = 0; j < ATH12K_HTT_RX_NUM_RU_SIZE_CNTRS; j++)3014len += scnprintf(buf + len, buf_len - len, " %s:%u ",3015ath12k_htt_ax_tx_rx_ru_size_to_str(j),3016le32_to_cpu(htt_stats_buf->non_data_ru_size_ppdu[j]));3017len += scnprintf(buf + len, buf_len - len, "\n");30183019len += print_array_to_buf(buf, len, "rx_rssi_track_sta_aid",3020htt_stats_buf->uplink_sta_aid,3021ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n");3022len += print_array_to_buf(buf, len, "rx_sta_target_rssi",3023htt_stats_buf->uplink_sta_target_rssi,3024ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n");3025len += print_array_to_buf(buf, len, "rx_sta_fd_rssi",3026htt_stats_buf->uplink_sta_fd_rssi,3027ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n");3028len += print_array_to_buf(buf, len, "rx_sta_power_headroom",3029htt_stats_buf->uplink_sta_power_headroom,3030ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n");3031len += scnprintf(buf + len, buf_len - len,3032"ul_ofdma_basic_trigger_rx_qos_null_only = %u\n\n",3033le32_to_cpu(htt_stats_buf->ul_ofdma_bsc_trig_rx_qos_null_only));30343035stats_req->buf_len = len;3036}30373038static void3039ath12k_htt_print_ul_ofdma_user_stats(const void *tag_buf, u16 tag_len,3040struct debug_htt_stats_req *stats_req)3041{3042const struct ath12k_htt_rx_pdev_ul_ofdma_user_stats_tlv *htt_stats_buf = tag_buf;3043u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3044u32 len = stats_req->buf_len;3045u8 *buf = stats_req->buf;3046u32 user_index;30473048if (tag_len < sizeof(*htt_stats_buf))3049return;30503051user_index = __le32_to_cpu(htt_stats_buf->user_index);30523053if (!user_index)3054len += scnprintf(buf + len, buf_len - len,3055"HTT_RX_PDEV_UL_OFDMA_USER_STAS_TLV:\n");3056len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_non_data_ppdu_%u = %u\n",3057user_index,3058le32_to_cpu(htt_stats_buf->rx_ulofdma_non_data_ppdu));3059len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_data_ppdu_%u = %u\n",3060user_index,3061le32_to_cpu(htt_stats_buf->rx_ulofdma_data_ppdu));3062len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_mpdu_ok_%u = %u\n",3063user_index,3064le32_to_cpu(htt_stats_buf->rx_ulofdma_mpdu_ok));3065len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_mpdu_fail_%u = %u\n",3066user_index,3067le32_to_cpu(htt_stats_buf->rx_ulofdma_mpdu_fail));3068len += scnprintf(buf + len, buf_len - len,3069"rx_ulofdma_non_data_nusers_%u = %u\n", user_index,3070le32_to_cpu(htt_stats_buf->rx_ulofdma_non_data_nusers));3071len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_data_nusers_%u = %u\n\n",3072user_index,3073le32_to_cpu(htt_stats_buf->rx_ulofdma_data_nusers));30743075stats_req->buf_len = len;3076}30773078static void3079ath12k_htt_print_ul_mumimo_trig_stats(const void *tag_buf, u16 tag_len,3080struct debug_htt_stats_req *stats_req)3081{3082const struct ath12k_htt_rx_ul_mumimo_trig_stats_tlv *htt_stats_buf = tag_buf;3083char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {};3084u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3085u32 len = stats_req->buf_len;3086u8 *buf = stats_req->buf;3087u32 mac_id;3088u16 index;3089u8 i, j;30903091if (tag_len < sizeof(*htt_stats_buf))3092return;30933094mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);30953096len += scnprintf(buf + len, buf_len - len,3097"HTT_RX_PDEV_UL_MUMIMO_TRIG_STATS_TLV:\n");3098len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",3099u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID));3100len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_mumimo = %u\n",3101le32_to_cpu(htt_stats_buf->rx_11ax_ul_mumimo));3102index = 0;3103memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);3104for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++)3105index += scnprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,3106" %u:%u,", i,3107le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs[i]));31083109for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++)3110index += scnprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,3111" %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS,3112le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs_ext[i]));3113str_buf[--index] = '\0';3114len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_mcs = %s\n", str_buf);31153116for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) {3117index = 0;3118memset(&str_buf[index], 0x0, ATH12K_HTT_MAX_STRING_LEN);3119for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++)3120index += scnprintf(&str_buf[index],3121ATH12K_HTT_MAX_STRING_LEN - index,3122" %u:%u,", i,3123le32_to_cpu(htt_stats_buf->ul_rx_gi[j][i]));31243125for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++)3126index += scnprintf(&str_buf[index],3127ATH12K_HTT_MAX_STRING_LEN - index,3128" %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS,3129le32_to_cpu(htt_stats_buf->ul_gi_ext[j][i]));3130str_buf[--index] = '\0';3131len += scnprintf(buf + len, buf_len - len,3132"ul_mumimo_rx_gi_%u = %s\n", j, str_buf);3133}31343135index = 0;3136memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);3137len += print_array_to_buf_index(buf, len, "ul_mumimo_rx_nss", 1,3138htt_stats_buf->ul_mumimo_rx_nss,3139ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");31403141len += print_array_to_buf(buf, len, "ul_mumimo_rx_bw",3142htt_stats_buf->ul_mumimo_rx_bw,3143ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");3144for (i = 0; i < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; i++) {3145index = 0;3146memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);3147for (j = 0; j < ATH12K_HTT_RX_NUM_BW_CNTRS; j++)3148index += scnprintf(&str_buf[index],3149ATH12K_HTT_MAX_STRING_LEN - index,3150" %u:%u,", j,3151le32_to_cpu(htt_stats_buf->red_bw[i][j]));3152str_buf[--index] = '\0';3153len += scnprintf(buf + len, buf_len - len, "%s = %s\n",3154i == 0 ? "half_ul_mumimo_rx_bw" :3155"quarter_ul_mumimo_rx_bw", str_buf);3156}31573158len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_stbc = %u\n",3159le32_to_cpu(htt_stats_buf->ul_mumimo_rx_stbc));3160len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_ldpc = %u\n",3161le32_to_cpu(htt_stats_buf->ul_mumimo_rx_ldpc));31623163for (j = 0; j < ATH12K_HTT_RX_NUM_SPATIAL_STREAMS; j++) {3164len += scnprintf(buf + len, buf_len - len,3165"rx_ul_mumimo_rssi_in_dbm: chain%u ", j);3166len += print_array_to_buf_s8(buf, len, "", 0,3167htt_stats_buf->ul_rssi[j],3168ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");3169}31703171for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {3172len += scnprintf(buf + len, buf_len - len,3173"rx_ul_mumimo_target_rssi: user_%u ", j);3174len += print_array_to_buf_s8(buf, len, "", 0,3175htt_stats_buf->tgt_rssi[j],3176ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");3177}31783179for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {3180len += scnprintf(buf + len, buf_len - len,3181"rx_ul_mumimo_fd_rssi: user_%u ", j);3182len += print_array_to_buf_s8(buf, len, "", 0,3183htt_stats_buf->fd[j],3184ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");3185}31863187for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {3188len += scnprintf(buf + len, buf_len - len,3189"rx_ulmumimo_pilot_evm_db_mean: user_%u ", j);3190len += print_array_to_buf_s8(buf, len, "", 0,3191htt_stats_buf->db[j],3192ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");3193}31943195len += scnprintf(buf + len, buf_len - len,3196"ul_mumimo_basic_trigger_rx_qos_null_only = %u\n\n",3197le32_to_cpu(htt_stats_buf->mumimo_bsc_trig_rx_qos_null_only));31983199stats_req->buf_len = len;3200}32013202static void3203ath12k_htt_print_rx_fse_stats_tlv(const void *tag_buf, u16 tag_len,3204struct debug_htt_stats_req *stats_req)3205{3206const struct ath12k_htt_rx_fse_stats_tlv *htt_stats_buf = tag_buf;3207u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3208u32 len = stats_req->buf_len;3209u8 *buf = stats_req->buf;32103211if (tag_len < sizeof(*htt_stats_buf))3212return;32133214len += scnprintf(buf + len, buf_len - len, "HTT_STATS_RX_FSE_STATS_TLV:\n");3215len += scnprintf(buf + len, buf_len - len, "=== Software RX FSE STATS ===\n");3216len += scnprintf(buf + len, buf_len - len, "Enable count = %u\n",3217le32_to_cpu(htt_stats_buf->fse_enable_cnt));3218len += scnprintf(buf + len, buf_len - len, "Disable count = %u\n",3219le32_to_cpu(htt_stats_buf->fse_disable_cnt));3220len += scnprintf(buf + len, buf_len - len, "Cache invalidate entry count = %u\n",3221le32_to_cpu(htt_stats_buf->fse_cache_invalidate_entry_cnt));3222len += scnprintf(buf + len, buf_len - len, "Full cache invalidate count = %u\n",3223le32_to_cpu(htt_stats_buf->fse_full_cache_invalidate_cnt));32243225len += scnprintf(buf + len, buf_len - len, "\n=== Hardware RX FSE STATS ===\n");3226len += scnprintf(buf + len, buf_len - len, "Cache hits count = %u\n",3227le32_to_cpu(htt_stats_buf->fse_num_cache_hits_cnt));3228len += scnprintf(buf + len, buf_len - len, "Cache no. of searches = %u\n",3229le32_to_cpu(htt_stats_buf->fse_num_searches_cnt));3230len += scnprintf(buf + len, buf_len - len, "Cache occupancy peak count:\n");3231len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-16] = %u [17-32] = %u ",3232le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[0]),3233le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[1]),3234le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[2]));3235len += scnprintf(buf + len, buf_len - len, "[33-48] = %u [49-64] = %u ",3236le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[3]),3237le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[4]));3238len += scnprintf(buf + len, buf_len - len, "[65-80] = %u [81-96] = %u ",3239le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[5]),3240le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[6]));3241len += scnprintf(buf + len, buf_len - len, "[97-112] = %u [113-127] = %u ",3242le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[7]),3243le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[8]));3244len += scnprintf(buf + len, buf_len - len, "[128] = %u\n",3245le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[9]));3246len += scnprintf(buf + len, buf_len - len, "Cache occupancy current count:\n");3247len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-16] = %u [17-32] = %u ",3248le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[0]),3249le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[1]),3250le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[2]));3251len += scnprintf(buf + len, buf_len - len, "[33-48] = %u [49-64] = %u ",3252le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[3]),3253le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[4]));3254len += scnprintf(buf + len, buf_len - len, "[65-80] = %u [81-96] = %u ",3255le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[5]),3256le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[6]));3257len += scnprintf(buf + len, buf_len - len, "[97-112] = %u [113-127] = %u ",3258le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[7]),3259le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[8]));3260len += scnprintf(buf + len, buf_len - len, "[128] = %u\n",3261le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[9]));3262len += scnprintf(buf + len, buf_len - len, "Cache search square count:\n");3263len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-50] = %u [51-100] = %u ",3264le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[0]),3265le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[1]),3266le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[2]));3267len += scnprintf(buf + len, buf_len - len, "[101-200] = %u [201-255] = %u ",3268le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[3]),3269le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[4]));3270len += scnprintf(buf + len, buf_len - len, "[256] = %u\n",3271le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[5]));3272len += scnprintf(buf + len, buf_len - len, "Cache search peak pending count:\n");3273len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-2] = %u [3-4] = %u ",3274le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[0]),3275le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[1]),3276le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[2]));3277len += scnprintf(buf + len, buf_len - len, "[Greater/Equal to 5] = %u\n",3278le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[3]));3279len += scnprintf(buf + len, buf_len - len, "Cache search tot pending count:\n");3280len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-2] = %u [3-4] = %u ",3281le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[0]),3282le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[1]),3283le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[2]));3284len += scnprintf(buf + len, buf_len - len, "[Greater/Equal to 5] = %u\n\n",3285le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[3]));32863287stats_req->buf_len = len;3288}32893290static void3291ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf, u16 tag_len,3292struct debug_htt_stats_req *stats_req)3293{3294const struct ath12k_htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf;3295u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3296u32 len = stats_req->buf_len;3297u8 *buf = stats_req->buf;3298u8 i;32993300if (tag_len < sizeof(*htt_stats_buf))3301return;33023303len += scnprintf(buf + len, buf_len - len,3304"HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n");3305len += scnprintf(buf + len, buf_len - len, "Legacy OFDM Rates: 6 Mbps: %u, ",3306le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[0]));3307len += scnprintf(buf + len, buf_len - len, "9 Mbps: %u, 12 Mbps: %u, ",3308le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[1]),3309le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[2]));3310len += scnprintf(buf + len, buf_len - len, "18 Mbps: %u\n",3311le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[3]));3312len += scnprintf(buf + len, buf_len - len, "24 Mbps: %u, 36 Mbps: %u, ",3313le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[4]),3314le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[5]));3315len += scnprintf(buf + len, buf_len - len, "48 Mbps: %u, 54 Mbps: %u\n",3316le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[6]),3317le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[7]));33183319len += print_array_to_buf(buf, len, "tx_ol_mcs", htt_stats_buf->tx_su_ol_mcs,3320ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, "\n");3321len += print_array_to_buf(buf, len, "tx_ibf_mcs", htt_stats_buf->tx_su_ibf_mcs,3322ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, "\n");3323len += print_array_to_buf(buf, len, "tx_txbf_mcs", htt_stats_buf->tx_su_txbf_mcs,3324ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, "\n");3325len += print_array_to_buf_index(buf, len, "tx_ol_nss", 1,3326htt_stats_buf->tx_su_ol_nss,3327ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS,3328"\n");3329len += print_array_to_buf_index(buf, len, "tx_ibf_nss", 1,3330htt_stats_buf->tx_su_ibf_nss,3331ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS,3332"\n");3333len += print_array_to_buf_index(buf, len, "tx_txbf_nss", 1,3334htt_stats_buf->tx_su_txbf_nss,3335ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS,3336"\n");3337len += print_array_to_buf(buf, len, "tx_ol_bw", htt_stats_buf->tx_su_ol_bw,3338ATH12K_HTT_TXBF_NUM_BW_CNTRS, "\n");3339for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++)3340len += print_array_to_buf(buf, len, i ? "quarter_tx_ol_bw" :3341"half_tx_ol_bw",3342htt_stats_buf->ol[i],3343ATH12K_HTT_TXBF_NUM_BW_CNTRS,3344"\n");33453346len += print_array_to_buf(buf, len, "tx_ibf_bw", htt_stats_buf->tx_su_ibf_bw,3347ATH12K_HTT_TXBF_NUM_BW_CNTRS, "\n");3348for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++)3349len += print_array_to_buf(buf, len, i ? "quarter_tx_ibf_bw" :3350"half_tx_ibf_bw",3351htt_stats_buf->ibf[i],3352ATH12K_HTT_TXBF_NUM_BW_CNTRS,3353"\n");33543355len += print_array_to_buf(buf, len, "tx_txbf_bw", htt_stats_buf->tx_su_txbf_bw,3356ATH12K_HTT_TXBF_NUM_BW_CNTRS, "\n");3357for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++)3358len += print_array_to_buf(buf, len, i ? "quarter_tx_txbf_bw" :3359"half_tx_txbf_bw",3360htt_stats_buf->txbf[i],3361ATH12K_HTT_TXBF_NUM_BW_CNTRS,3362"\n");3363len += scnprintf(buf + len, buf_len - len, "\n");33643365len += scnprintf(buf + len, buf_len - len,3366"HTT_STATS_PDEV_TXBF_FLAG_RETURN_STATS:\n");3367len += scnprintf(buf + len, buf_len - len, "TXBF_reason_code_stats: 0:%u, 1:%u,",3368le32_to_cpu(htt_stats_buf->txbf_flag_set_mu_mode),3369le32_to_cpu(htt_stats_buf->txbf_flag_set_final_status));3370len += scnprintf(buf + len, buf_len - len, " 2:%u, 3:%u, 4:%u, 5:%u, ",3371le32_to_cpu(htt_stats_buf->txbf_flag_not_set_verified_txbf_mode),3372le32_to_cpu(htt_stats_buf->txbf_flag_not_set_disable_p2p_access),3373le32_to_cpu(htt_stats_buf->txbf_flag_not_set_max_nss_in_he160),3374le32_to_cpu(htt_stats_buf->txbf_flag_not_set_disable_uldlofdma));3375len += scnprintf(buf + len, buf_len - len, "6:%u, 7:%u\n\n",3376le32_to_cpu(htt_stats_buf->txbf_flag_not_set_mcs_threshold_val),3377le32_to_cpu(htt_stats_buf->txbf_flag_not_set_final_status));33783379stats_req->buf_len = len;3380}33813382static void3383ath12k_htt_print_txbf_ofdma_ax_ndpa_stats_tlv(const void *tag_buf, u16 tag_len,3384struct debug_htt_stats_req *stats_req)3385{3386const struct ath12k_htt_txbf_ofdma_ax_ndpa_stats_tlv *stats_buf = tag_buf;3387u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3388u32 len = stats_req->buf_len;3389u8 *buf = stats_req->buf;3390u32 num_elements;3391u8 i;33923393if (tag_len < sizeof(*stats_buf))3394return;33953396num_elements = le32_to_cpu(stats_buf->num_elems_ax_ndpa_arr);33973398len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_NDPA_STATS_TLV:\n");3399len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndpa_queued =");3400for (i = 0; i < num_elements; i++)3401len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3402le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_queued));3403len--;3404*(buf + len) = '\0';34053406len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndpa_tried =");3407for (i = 0; i < num_elements; i++)3408len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3409le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_tried));3410len--;3411*(buf + len) = '\0';34123413len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndpa_flushed =");3414for (i = 0; i < num_elements; i++)3415len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3416le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_flush));3417len--;3418*(buf + len) = '\0';34193420len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndpa_err =");3421for (i = 0; i < num_elements; i++)3422len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3423le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_err));3424len--;3425*(buf + len) = '\0';34263427len += scnprintf(buf + len, buf_len - len, "\n\n");34283429stats_req->buf_len = len;3430}34313432static void3433ath12k_htt_print_txbf_ofdma_ax_ndp_stats_tlv(const void *tag_buf, u16 tag_len,3434struct debug_htt_stats_req *stats_req)3435{3436const struct ath12k_htt_txbf_ofdma_ax_ndp_stats_tlv *stats_buf = tag_buf;3437u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3438u32 len = stats_req->buf_len;3439u8 *buf = stats_req->buf;3440u32 num_elements;3441u8 i;34423443if (tag_len < sizeof(*stats_buf))3444return;34453446num_elements = le32_to_cpu(stats_buf->num_elems_ax_ndp_arr);34473448len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_NDP_STATS_TLV:\n");3449len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndp_queued =");3450for (i = 0; i < num_elements; i++)3451len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3452le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_queued));3453len--;3454*(buf + len) = '\0';34553456len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndp_tried =");3457for (i = 0; i < num_elements; i++)3458len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3459le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_tried));3460len--;3461*(buf + len) = '\0';34623463len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndp_flushed =");3464for (i = 0; i < num_elements; i++)3465len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3466le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_flush));3467len--;3468*(buf + len) = '\0';34693470len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndp_err =");3471for (i = 0; i < num_elements; i++)3472len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3473le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_err));3474len--;3475*(buf + len) = '\0';34763477len += scnprintf(buf + len, buf_len - len, "\n\n");34783479stats_req->buf_len = len;3480}34813482static void3483ath12k_htt_print_txbf_ofdma_ax_brp_stats_tlv(const void *tag_buf, u16 tag_len,3484struct debug_htt_stats_req *stats_req)3485{3486const struct ath12k_htt_txbf_ofdma_ax_brp_stats_tlv *stats_buf = tag_buf;3487u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3488u32 len = stats_req->buf_len;3489u8 *buf = stats_req->buf;3490u32 num_elements;3491u8 i;34923493if (tag_len < sizeof(*stats_buf))3494return;34953496num_elements = le32_to_cpu(stats_buf->num_elems_ax_brp_arr);34973498len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_BRP_STATS_TLV:\n");3499len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brpoll_queued =");3500for (i = 0; i < num_elements; i++)3501len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3502le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_queued));3503len--;3504*(buf + len) = '\0';35053506len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brpoll_tied =");3507for (i = 0; i < num_elements; i++)3508len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3509le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_tried));3510len--;3511*(buf + len) = '\0';35123513len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brpoll_flushed =");3514for (i = 0; i < num_elements; i++)3515len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3516le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_flushed));3517len--;3518*(buf + len) = '\0';35193520len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brp_err =");3521for (i = 0; i < num_elements; i++)3522len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3523le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_err));3524len--;3525*(buf + len) = '\0';35263527len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brp_err_num_cbf_rcvd =");3528for (i = 0; i < num_elements; i++)3529len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3530le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_num_cbf_rcvd));3531len--;3532*(buf + len) = '\0';35333534len += scnprintf(buf + len, buf_len - len, "\n\n");35353536stats_req->buf_len = len;3537}35383539static void3540ath12k_htt_print_txbf_ofdma_ax_steer_stats_tlv(const void *tag_buf, u16 tag_len,3541struct debug_htt_stats_req *stats_req)3542{3543const struct ath12k_htt_txbf_ofdma_ax_steer_stats_tlv *stats_buf = tag_buf;3544u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3545u32 len = stats_req->buf_len;3546u8 *buf = stats_req->buf;3547u32 num_elements;3548u8 i;35493550if (tag_len < sizeof(*stats_buf))3551return;35523553num_elements = le32_to_cpu(stats_buf->num_elems_ax_steer_arr);35543555len += scnprintf(buf + len, buf_len - len,3556"HTT_TXBF_OFDMA_AX_STEER_STATS_TLV:\n");3557len += scnprintf(buf + len, buf_len - len, "ax_ofdma_num_ppdu_steer =");3558for (i = 0; i < num_elements; i++)3559len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3560le32_to_cpu(stats_buf->ax_steer[i].num_ppdu_steer));3561len--;3562*(buf + len) = '\0';35633564len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_num_usrs_prefetch =");3565for (i = 0; i < num_elements; i++)3566len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3567le32_to_cpu(stats_buf->ax_steer[i].num_usr_prefetch));3568len--;3569*(buf + len) = '\0';35703571len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_num_usrs_sound =");3572for (i = 0; i < num_elements; i++)3573len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3574le32_to_cpu(stats_buf->ax_steer[i].num_usr_sound));3575len--;3576*(buf + len) = '\0';35773578len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_num_usrs_force_sound =");3579for (i = 0; i < num_elements; i++)3580len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1,3581le32_to_cpu(stats_buf->ax_steer[i].num_usr_force_sound));3582len--;3583*(buf + len) = '\0';35843585len += scnprintf(buf + len, buf_len - len, "\n\n");35863587stats_req->buf_len = len;3588}35893590static void3591ath12k_htt_print_txbf_ofdma_ax_steer_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,3592struct debug_htt_stats_req *stats_req)3593{3594const struct ath12k_htt_txbf_ofdma_ax_steer_mpdu_stats_tlv *stats_buf = tag_buf;3595u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3596u32 len = stats_req->buf_len;3597u8 *buf = stats_req->buf;35983599if (tag_len < sizeof(*stats_buf))3600return;36013602len += scnprintf(buf + len, buf_len - len,3603"HTT_TXBF_OFDMA_AX_STEER_MPDU_STATS_TLV:\n");3604len += scnprintf(buf + len, buf_len - len, "rbo_steer_mpdus_tried = %u\n",3605le32_to_cpu(stats_buf->ax_ofdma_rbo_steer_mpdus_tried));3606len += scnprintf(buf + len, buf_len - len, "rbo_steer_mpdus_failed = %u\n",3607le32_to_cpu(stats_buf->ax_ofdma_rbo_steer_mpdus_failed));3608len += scnprintf(buf + len, buf_len - len, "sifs_steer_mpdus_tried = %u\n",3609le32_to_cpu(stats_buf->ax_ofdma_sifs_steer_mpdus_tried));3610len += scnprintf(buf + len, buf_len - len, "sifs_steer_mpdus_failed = %u\n\n",3611le32_to_cpu(stats_buf->ax_ofdma_sifs_steer_mpdus_failed));36123613stats_req->buf_len = len;3614}36153616static void ath12k_htt_print_dlpager_entry(const struct ath12k_htt_pgs_info *pg_info,3617int idx, char *str_buf)3618{3619u64 page_timestamp;3620u16 index = 0;36213622page_timestamp = ath12k_le32hilo_to_u64(pg_info->ts_msb, pg_info->ts_lsb);36233624index += snprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,3625"Index - %u ; Page Number - %u ; ",3626idx, le32_to_cpu(pg_info->page_num));3627index += snprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,3628"Num of pages - %u ; Timestamp - %lluus\n",3629le32_to_cpu(pg_info->num_pgs), page_timestamp);3630}36313632static void3633ath12k_htt_print_dlpager_stats_tlv(const void *tag_buf, u16 tag_len,3634struct debug_htt_stats_req *stats_req)3635{3636const struct ath12k_htt_dl_pager_stats_tlv *stat_buf = tag_buf;3637u32 len = stats_req->buf_len;3638u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3639u32 dword_lock, dword_unlock;3640int i;3641u8 *buf = stats_req->buf;3642u8 pg_locked;3643u8 pg_unlock;3644char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {};36453646if (tag_len < sizeof(*stat_buf))3647return;36483649dword_lock = le32_get_bits(stat_buf->info2,3650ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2);3651dword_unlock = le32_get_bits(stat_buf->info2,3652ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO2);36533654pg_locked = ATH12K_HTT_STATS_PAGE_LOCKED;3655pg_unlock = ATH12K_HTT_STATS_PAGE_UNLOCKED;36563657len += scnprintf(buf + len, buf_len - len, "HTT_DLPAGER_STATS_TLV:\n");3658len += scnprintf(buf + len, buf_len - len, "ASYNC locked pages = %u\n",3659le32_get_bits(stat_buf->info0,3660ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0));3661len += scnprintf(buf + len, buf_len - len, "SYNC locked pages = %u\n",3662le32_get_bits(stat_buf->info0,3663ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0));3664len += scnprintf(buf + len, buf_len - len, "Total locked pages = %u\n",3665le32_get_bits(stat_buf->info1,3666ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1));3667len += scnprintf(buf + len, buf_len - len, "Total free pages = %u\n",3668le32_get_bits(stat_buf->info1,3669ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO1));36703671len += scnprintf(buf + len, buf_len - len, "\nLOCKED PAGES HISTORY\n");3672len += scnprintf(buf + len, buf_len - len, "last_locked_page_idx = %u\n",3673dword_lock ? dword_lock - 1 : (ATH12K_PAGER_MAX - 1));36743675for (i = 0; i < ATH12K_PAGER_MAX; i++) {3676memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);3677ath12k_htt_print_dlpager_entry(&stat_buf->pgs_info[pg_locked][i],3678i, str_buf);3679len += scnprintf(buf + len, buf_len - len, "%s", str_buf);3680}36813682len += scnprintf(buf + len, buf_len - len, "\nUNLOCKED PAGES HISTORY\n");3683len += scnprintf(buf + len, buf_len - len, "last_unlocked_page_idx = %u\n",3684dword_unlock ? dword_unlock - 1 : ATH12K_PAGER_MAX - 1);36853686for (i = 0; i < ATH12K_PAGER_MAX; i++) {3687memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);3688ath12k_htt_print_dlpager_entry(&stat_buf->pgs_info[pg_unlock][i],3689i, str_buf);3690len += scnprintf(buf + len, buf_len - len, "%s", str_buf);3691}36923693len += scnprintf(buf + len, buf_len - len, "\n");36943695stats_req->buf_len = len;3696}36973698static void3699ath12k_htt_print_phy_stats_tlv(const void *tag_buf, u16 tag_len,3700struct debug_htt_stats_req *stats_req)3701{3702const struct ath12k_htt_phy_stats_tlv *htt_stats_buf = tag_buf;3703u32 len = stats_req->buf_len;3704u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3705u8 *buf = stats_req->buf, i;37063707if (tag_len < sizeof(*htt_stats_buf))3708return;37093710len += scnprintf(buf + len, buf_len - len, "HTT_PHY_STATS_TLV:\n");3711for (i = 0; i < ATH12K_HTT_STATS_MAX_CHAINS; i++)3712len += scnprintf(buf + len, buf_len - len, "bdf_nf_chain[%d] = %d\n",3713i, a_sle32_to_cpu(htt_stats_buf->nf_chain[i]));3714for (i = 0; i < ATH12K_HTT_STATS_MAX_CHAINS; i++)3715len += scnprintf(buf + len, buf_len - len, "runtime_nf_chain[%d] = %d\n",3716i, a_sle32_to_cpu(htt_stats_buf->runtime_nf_chain[i]));3717len += scnprintf(buf + len, buf_len - len, "false_radar_cnt = %u / %u (mins)\n",3718le32_to_cpu(htt_stats_buf->false_radar_cnt),3719le32_to_cpu(htt_stats_buf->fw_run_time));3720len += scnprintf(buf + len, buf_len - len, "radar_cs_cnt = %u\n",3721le32_to_cpu(htt_stats_buf->radar_cs_cnt));3722len += scnprintf(buf + len, buf_len - len, "ani_level = %d\n\n",3723a_sle32_to_cpu(htt_stats_buf->ani_level));37243725stats_req->buf_len = len;3726}37273728static void3729ath12k_htt_print_phy_counters_tlv(const void *tag_buf, u16 tag_len,3730struct debug_htt_stats_req *stats_req)3731{3732const struct ath12k_htt_phy_counters_tlv *htt_stats_buf = tag_buf;3733u32 len = stats_req->buf_len;3734u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3735u8 *buf = stats_req->buf;37363737if (tag_len < sizeof(*htt_stats_buf))3738return;37393740len += scnprintf(buf + len, buf_len - len, "HTT_PHY_COUNTERS_TLV:\n");3741len += scnprintf(buf + len, buf_len - len, "rx_ofdma_timing_err_cnt = %u\n",3742le32_to_cpu(htt_stats_buf->rx_ofdma_timing_err_cnt));3743len += scnprintf(buf + len, buf_len - len, "rx_cck_fail_cnt = %u\n",3744le32_to_cpu(htt_stats_buf->rx_cck_fail_cnt));3745len += scnprintf(buf + len, buf_len - len, "mactx_abort_cnt = %u\n",3746le32_to_cpu(htt_stats_buf->mactx_abort_cnt));3747len += scnprintf(buf + len, buf_len - len, "macrx_abort_cnt = %u\n",3748le32_to_cpu(htt_stats_buf->macrx_abort_cnt));3749len += scnprintf(buf + len, buf_len - len, "phytx_abort_cnt = %u\n",3750le32_to_cpu(htt_stats_buf->phytx_abort_cnt));3751len += scnprintf(buf + len, buf_len - len, "phyrx_abort_cnt = %u\n",3752le32_to_cpu(htt_stats_buf->phyrx_abort_cnt));3753len += scnprintf(buf + len, buf_len - len, "phyrx_defer_abort_cnt = %u\n",3754le32_to_cpu(htt_stats_buf->phyrx_defer_abort_cnt));3755len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_lstf_event_cnt = %u\n",3756le32_to_cpu(htt_stats_buf->rx_gain_adj_lstf_event_cnt));3757len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_non_legacy_cnt = %u\n",3758le32_to_cpu(htt_stats_buf->rx_gain_adj_non_legacy_cnt));3759len += print_array_to_buf(buf, len, "rx_pkt_cnt", htt_stats_buf->rx_pkt_cnt,3760ATH12K_HTT_MAX_RX_PKT_CNT, "\n");3761len += print_array_to_buf(buf, len, "rx_pkt_crc_pass_cnt",3762htt_stats_buf->rx_pkt_crc_pass_cnt,3763ATH12K_HTT_MAX_RX_PKT_CRC_PASS_CNT, "\n");3764len += print_array_to_buf(buf, len, "per_blk_err_cnt",3765htt_stats_buf->per_blk_err_cnt,3766ATH12K_HTT_MAX_PER_BLK_ERR_CNT, "\n");3767len += print_array_to_buf(buf, len, "rx_ota_err_cnt",3768htt_stats_buf->rx_ota_err_cnt,3769ATH12K_HTT_MAX_RX_OTA_ERR_CNT, "\n\n");37703771stats_req->buf_len = len;3772}37733774static void3775ath12k_htt_print_phy_reset_stats_tlv(const void *tag_buf, u16 tag_len,3776struct debug_htt_stats_req *stats_req)3777{3778const struct ath12k_htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf;3779u32 len = stats_req->buf_len;3780u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3781u8 *buf = stats_req->buf;37823783if (tag_len < sizeof(*htt_stats_buf))3784return;37853786len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n");3787len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3788le32_to_cpu(htt_stats_buf->pdev_id));3789len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n",3790le32_to_cpu(htt_stats_buf->chan_mhz));3791len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n",3792le32_to_cpu(htt_stats_buf->chan_band_center_freq1));3793len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n",3794le32_to_cpu(htt_stats_buf->chan_band_center_freq2));3795len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n",3796le32_to_cpu(htt_stats_buf->chan_phy_mode));3797len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n",3798le32_to_cpu(htt_stats_buf->chan_flags));3799len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",3800le32_to_cpu(htt_stats_buf->chan_num));3801len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n",3802le32_to_cpu(htt_stats_buf->reset_cause));3803len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n",3804le32_to_cpu(htt_stats_buf->prev_reset_cause));3805len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n",3806le32_to_cpu(htt_stats_buf->phy_warm_reset_src));3807len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n",3808le32_to_cpu(htt_stats_buf->rx_gain_tbl_mode));3809len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n",3810le32_to_cpu(htt_stats_buf->xbar_val));3811len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n",3812le32_to_cpu(htt_stats_buf->force_calibration));3813len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n",3814le32_to_cpu(htt_stats_buf->phyrf_mode));3815len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n",3816le32_to_cpu(htt_stats_buf->phy_homechan));3817len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n",3818le32_to_cpu(htt_stats_buf->phy_tx_ch_mask));3819len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n",3820le32_to_cpu(htt_stats_buf->phy_rx_ch_mask));3821len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n",3822le32_to_cpu(htt_stats_buf->phybb_ini_mask));3823len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n",3824le32_to_cpu(htt_stats_buf->phyrf_ini_mask));3825len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n",3826le32_to_cpu(htt_stats_buf->phy_dfs_en_mask));3827len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n",3828le32_to_cpu(htt_stats_buf->phy_sscan_en_mask));3829len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n",3830le32_to_cpu(htt_stats_buf->phy_synth_sel_mask));3831len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n",3832le32_to_cpu(htt_stats_buf->phy_adfs_freq));3833len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n",3834le32_to_cpu(htt_stats_buf->cck_fir_settings));3835len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n",3836le32_to_cpu(htt_stats_buf->phy_dyn_pri_chan));3837len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n",3838le32_to_cpu(htt_stats_buf->cca_thresh));3839len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n",3840le32_to_cpu(htt_stats_buf->dyn_cca_status));3841len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n",3842le32_to_cpu(htt_stats_buf->rxdesense_thresh_hw));3843len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n\n",3844le32_to_cpu(htt_stats_buf->rxdesense_thresh_sw));38453846stats_req->buf_len = len;3847}38483849static void3850ath12k_htt_print_phy_reset_counters_tlv(const void *tag_buf, u16 tag_len,3851struct debug_htt_stats_req *stats_req)3852{3853const struct ath12k_htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf;3854u32 len = stats_req->buf_len;3855u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3856u8 *buf = stats_req->buf;38573858if (tag_len < sizeof(*htt_stats_buf))3859return;38603861len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n");3862len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3863le32_to_cpu(htt_stats_buf->pdev_id));3864len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n",3865le32_to_cpu(htt_stats_buf->cf_active_low_fail_cnt));3866len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n",3867le32_to_cpu(htt_stats_buf->cf_active_low_pass_cnt));3868len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n",3869le32_to_cpu(htt_stats_buf->phy_off_through_vreg_cnt));3870len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n",3871le32_to_cpu(htt_stats_buf->force_calibration_cnt));3872len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n",3873le32_to_cpu(htt_stats_buf->rf_mode_switch_phy_off_cnt));3874len += scnprintf(buf + len, buf_len - len, "temperature_recal_cnt = %u\n\n",3875le32_to_cpu(htt_stats_buf->temperature_recal_cnt));38763877stats_req->buf_len = len;3878}38793880static void3881ath12k_htt_print_phy_tpc_stats_tlv(const void *tag_buf, u16 tag_len,3882struct debug_htt_stats_req *stats_req)3883{3884const struct ath12k_htt_phy_tpc_stats_tlv *htt_stats_buf = tag_buf;3885u32 len = stats_req->buf_len;3886u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3887u8 *buf = stats_req->buf;38883889if (tag_len < sizeof(*htt_stats_buf))3890return;38913892len += scnprintf(buf + len, buf_len - len, "HTT_PHY_TPC_STATS_TLV:\n");3893len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3894le32_to_cpu(htt_stats_buf->pdev_id));3895len += scnprintf(buf + len, buf_len - len, "tx_power_scale = %u\n",3896le32_to_cpu(htt_stats_buf->tx_power_scale));3897len += scnprintf(buf + len, buf_len - len, "tx_power_scale_db = %u\n",3898le32_to_cpu(htt_stats_buf->tx_power_scale_db));3899len += scnprintf(buf + len, buf_len - len, "min_negative_tx_power = %d\n",3900le32_to_cpu(htt_stats_buf->min_negative_tx_power));3901len += scnprintf(buf + len, buf_len - len, "reg_ctl_domain = %u\n",3902le32_to_cpu(htt_stats_buf->reg_ctl_domain));3903len += scnprintf(buf + len, buf_len - len, "twice_max_rd_power = %u\n",3904le32_to_cpu(htt_stats_buf->twice_max_rd_power));3905len += scnprintf(buf + len, buf_len - len, "max_tx_power = %u\n",3906le32_to_cpu(htt_stats_buf->max_tx_power));3907len += scnprintf(buf + len, buf_len - len, "home_max_tx_power = %u\n",3908le32_to_cpu(htt_stats_buf->home_max_tx_power));3909len += scnprintf(buf + len, buf_len - len, "psd_power = %d\n",3910le32_to_cpu(htt_stats_buf->psd_power));3911len += scnprintf(buf + len, buf_len - len, "eirp_power = %u\n",3912le32_to_cpu(htt_stats_buf->eirp_power));3913len += scnprintf(buf + len, buf_len - len, "power_type_6ghz = %u\n",3914le32_to_cpu(htt_stats_buf->power_type_6ghz));3915len += print_array_to_buf(buf, len, "max_reg_allowed_power",3916htt_stats_buf->max_reg_allowed_power,3917ATH12K_HTT_STATS_MAX_CHAINS, "\n");3918len += print_array_to_buf(buf, len, "max_reg_allowed_power_6ghz",3919htt_stats_buf->max_reg_allowed_power_6ghz,3920ATH12K_HTT_STATS_MAX_CHAINS, "\n");3921len += print_array_to_buf(buf, len, "sub_band_cfreq",3922htt_stats_buf->sub_band_cfreq,3923ATH12K_HTT_MAX_CH_PWR_INFO_SIZE, "\n");3924len += print_array_to_buf(buf, len, "sub_band_txpower",3925htt_stats_buf->sub_band_txpower,3926ATH12K_HTT_MAX_CH_PWR_INFO_SIZE, "\n\n");39273928stats_req->buf_len = len;3929}39303931static void3932ath12k_htt_print_soc_txrx_stats_common_tlv(const void *tag_buf, u16 tag_len,3933struct debug_htt_stats_req *stats_req)3934{3935const struct ath12k_htt_t2h_soc_txrx_stats_common_tlv *htt_stats_buf = tag_buf;3936u64 drop_count;3937u32 len = stats_req->buf_len;3938u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3939u8 *buf = stats_req->buf;39403941if (tag_len < sizeof(*htt_stats_buf))3942return;39433944drop_count = ath12k_le32hilo_to_u64(htt_stats_buf->inv_peers_msdu_drop_count_hi,3945htt_stats_buf->inv_peers_msdu_drop_count_lo);39463947len += scnprintf(buf + len, buf_len - len, "HTT_SOC_COMMON_STATS_TLV:\n");3948len += scnprintf(buf + len, buf_len - len, "soc_drop_count = %llu\n\n",3949drop_count);39503951stats_req->buf_len = len;3952}39533954static void3955ath12k_htt_print_tx_per_rate_stats_tlv(const void *tag_buf, u16 tag_len,3956struct debug_htt_stats_req *stats_req)3957{3958const struct ath12k_htt_tx_per_rate_stats_tlv *stats_buf = tag_buf;3959u32 len = stats_req->buf_len;3960u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;3961u32 ru_size_cnt = 0;3962u32 rc_mode, ru_type;3963u8 *buf = stats_req->buf, i;3964const char *mode_prefix;39653966if (tag_len < sizeof(*stats_buf))3967return;39683969rc_mode = le32_to_cpu(stats_buf->rc_mode);3970ru_type = le32_to_cpu(stats_buf->ru_type);39713972switch (rc_mode) {3973case ATH12K_HTT_STATS_RC_MODE_DLSU:3974len += scnprintf(buf + len, buf_len - len, "HTT_TX_PER_STATS:\n");3975len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_SU:\n");3976mode_prefix = "su";3977break;3978case ATH12K_HTT_STATS_RC_MODE_DLMUMIMO:3979len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_DL_MUMIMO:\n");3980mode_prefix = "mu";3981break;3982case ATH12K_HTT_STATS_RC_MODE_DLOFDMA:3983len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_DL_OFDMA:\n");3984mode_prefix = "ofdma";3985if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY)3986ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_STATS_NUM_AX_RU_SIZE_CNTRS;3987else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU)3988ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS;3989break;3990case ATH12K_HTT_STATS_RC_MODE_ULMUMIMO:3991len += scnprintf(buf + len, buf_len - len, "HTT_RX_PER_STATS:\n");3992len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_UL_MUMIMO:\n");3993mode_prefix = "ulmu";3994break;3995case ATH12K_HTT_STATS_RC_MODE_ULOFDMA:3996len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_UL_OFDMA:\n");3997mode_prefix = "ulofdma";3998if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY)3999ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_STATS_NUM_AX_RU_SIZE_CNTRS;4000else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU)4001ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS;4002break;4003default:4004return;4005}40064007len += scnprintf(buf + len, buf_len - len, "\nPER per BW:\n");4008if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||4009rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)4010len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ",4011mode_prefix);4012else4013len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ",4014mode_prefix);4015for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)4016len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4017le32_to_cpu(stats_buf->per_bw[i].ppdus_tried));4018len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i,4019le32_to_cpu(stats_buf->per_bw320.ppdus_tried));40204021if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||4022rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)4023len += scnprintf(buf + len, buf_len - len, "non_data_ppdus_%s = ",4024mode_prefix);4025else4026len += scnprintf(buf + len, buf_len - len, "ppdus_ack_failed_%s = ",4027mode_prefix);4028for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)4029len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4030le32_to_cpu(stats_buf->per_bw[i].ppdus_ack_failed));4031len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i,4032le32_to_cpu(stats_buf->per_bw320.ppdus_ack_failed));40334034len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", mode_prefix);4035for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)4036len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4037le32_to_cpu(stats_buf->per_bw[i].mpdus_tried));4038len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i,4039le32_to_cpu(stats_buf->per_bw320.mpdus_tried));40404041len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", mode_prefix);4042for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)4043len += scnprintf(buf + len, buf_len - len, " %u:%u", i,4044le32_to_cpu(stats_buf->per_bw[i].mpdus_failed));4045len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i,4046le32_to_cpu(stats_buf->per_bw320.mpdus_failed));40474048len += scnprintf(buf + len, buf_len - len, "\nPER per NSS:\n");4049if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||4050rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)4051len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ",4052mode_prefix);4053else4054len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ",4055mode_prefix);4056for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)4057len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1,4058le32_to_cpu(stats_buf->per_nss[i].ppdus_tried));4059len += scnprintf(buf + len, buf_len - len, "\n");40604061if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||4062rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)4063len += scnprintf(buf + len, buf_len - len, "non_data_ppdus_%s = ",4064mode_prefix);4065else4066len += scnprintf(buf + len, buf_len - len, "ppdus_ack_failed_%s = ",4067mode_prefix);4068for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)4069len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1,4070le32_to_cpu(stats_buf->per_nss[i].ppdus_ack_failed));4071len += scnprintf(buf + len, buf_len - len, "\n");40724073len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", mode_prefix);4074for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)4075len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1,4076le32_to_cpu(stats_buf->per_nss[i].mpdus_tried));4077len += scnprintf(buf + len, buf_len - len, "\n");40784079len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", mode_prefix);4080for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)4081len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1,4082le32_to_cpu(stats_buf->per_nss[i].mpdus_failed));4083len += scnprintf(buf + len, buf_len - len, "\n");40844085len += scnprintf(buf + len, buf_len - len, "\nPER per MCS:\n");4086if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||4087rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)4088len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ",4089mode_prefix);4090else4091len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ",4092mode_prefix);4093for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)4094len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4095le32_to_cpu(stats_buf->per_mcs[i].ppdus_tried));4096len += scnprintf(buf + len, buf_len - len, "\n");40974098if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||4099rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)4100len += scnprintf(buf + len, buf_len - len, "non_data_ppdus_%s = ",4101mode_prefix);4102else4103len += scnprintf(buf + len, buf_len - len, "ppdus_ack_failed_%s = ",4104mode_prefix);4105for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)4106len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4107le32_to_cpu(stats_buf->per_mcs[i].ppdus_ack_failed));4108len += scnprintf(buf + len, buf_len - len, "\n");41094110len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", mode_prefix);4111for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)4112len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4113le32_to_cpu(stats_buf->per_mcs[i].mpdus_tried));4114len += scnprintf(buf + len, buf_len - len, "\n");41154116len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", mode_prefix);4117for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)4118len += scnprintf(buf + len, buf_len - len, " %u:%u ", i,4119le32_to_cpu(stats_buf->per_mcs[i].mpdus_failed));4120len += scnprintf(buf + len, buf_len - len, "\n");41214122if ((rc_mode == ATH12K_HTT_STATS_RC_MODE_DLOFDMA ||4123rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA) &&4124ru_type != ATH12K_HTT_STATS_RU_TYPE_INVALID) {4125len += scnprintf(buf + len, buf_len - len, "\nPER per RU:\n");41264127if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA)4128len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ",4129mode_prefix);4130else4131len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ",4132mode_prefix);4133for (i = 0; i < ru_size_cnt; i++)4134len += scnprintf(buf + len, buf_len - len, " %s:%u ",4135ath12k_tx_ru_size_to_str(ru_type, i),4136le32_to_cpu(stats_buf->ru[i].ppdus_tried));4137len += scnprintf(buf + len, buf_len - len, "\n");41384139if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA)4140len += scnprintf(buf + len, buf_len - len,4141"non_data_ppdus_%s = ", mode_prefix);4142else4143len += scnprintf(buf + len, buf_len - len,4144"ppdus_ack_failed_%s = ", mode_prefix);4145for (i = 0; i < ru_size_cnt; i++)4146len += scnprintf(buf + len, buf_len - len, " %s:%u ",4147ath12k_tx_ru_size_to_str(ru_type, i),4148le32_to_cpu(stats_buf->ru[i].ppdus_ack_failed));4149len += scnprintf(buf + len, buf_len - len, "\n");41504151len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ",4152mode_prefix);4153for (i = 0; i < ru_size_cnt; i++)4154len += scnprintf(buf + len, buf_len - len, " %s:%u ",4155ath12k_tx_ru_size_to_str(ru_type, i),4156le32_to_cpu(stats_buf->ru[i].mpdus_tried));4157len += scnprintf(buf + len, buf_len - len, "\n");41584159len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ",4160mode_prefix);4161for (i = 0; i < ru_size_cnt; i++)4162len += scnprintf(buf + len, buf_len - len, " %s:%u ",4163ath12k_tx_ru_size_to_str(ru_type, i),4164le32_to_cpu(stats_buf->ru[i].mpdus_failed));4165len += scnprintf(buf + len, buf_len - len, "\n\n");4166}41674168if (rc_mode == ATH12K_HTT_STATS_RC_MODE_DLMUMIMO) {4169len += scnprintf(buf + len, buf_len - len, "\nlast_probed_bw = %u\n",4170le32_to_cpu(stats_buf->last_probed_bw));4171len += scnprintf(buf + len, buf_len - len, "last_probed_nss = %u\n",4172le32_to_cpu(stats_buf->last_probed_nss));4173len += scnprintf(buf + len, buf_len - len, "last_probed_mcs = %u\n",4174le32_to_cpu(stats_buf->last_probed_mcs));4175len += print_array_to_buf(buf, len, "MU Probe count per RC MODE",4176stats_buf->probe_cnt,4177ATH12K_HTT_RC_MODE_2D_COUNT, "\n\n");4178}41794180stats_req->buf_len = len;4181}41824183static void4184ath12k_htt_print_ast_entry_tlv(const void *tag_buf, u16 tag_len,4185struct debug_htt_stats_req *stats_req)4186{4187const struct ath12k_htt_ast_entry_tlv *htt_stats_buf = tag_buf;4188u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4189u32 len = stats_req->buf_len;4190u8 *buf = stats_req->buf;4191u32 mac_addr_l32;4192u32 mac_addr_h16;4193u32 ast_info;41944195if (tag_len < sizeof(*htt_stats_buf))4196return;41974198mac_addr_l32 = le32_to_cpu(htt_stats_buf->mac_addr.mac_addr_l32);4199mac_addr_h16 = le32_to_cpu(htt_stats_buf->mac_addr.mac_addr_h16);4200ast_info = le32_to_cpu(htt_stats_buf->info);42014202len += scnprintf(buf + len, buf_len - len, "HTT_AST_ENTRY_TLV:\n");4203len += scnprintf(buf + len, buf_len - len, "ast_index = %u\n",4204le32_to_cpu(htt_stats_buf->ast_index));4205len += scnprintf(buf + len, buf_len - len,4206"mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",4207u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_0),4208u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_1),4209u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_2),4210u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_3),4211u32_get_bits(mac_addr_h16, ATH12K_HTT_MAC_ADDR_H16_0),4212u32_get_bits(mac_addr_h16, ATH12K_HTT_MAC_ADDR_H16_1));42134214len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",4215le32_to_cpu(htt_stats_buf->sw_peer_id));4216len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",4217u32_get_bits(ast_info, ATH12K_HTT_AST_PDEV_ID_INFO));4218len += scnprintf(buf + len, buf_len - len, "vdev_id = %u\n",4219u32_get_bits(ast_info, ATH12K_HTT_AST_VDEV_ID_INFO));4220len += scnprintf(buf + len, buf_len - len, "next_hop = %u\n",4221u32_get_bits(ast_info, ATH12K_HTT_AST_NEXT_HOP_INFO));4222len += scnprintf(buf + len, buf_len - len, "mcast = %u\n",4223u32_get_bits(ast_info, ATH12K_HTT_AST_MCAST_INFO));4224len += scnprintf(buf + len, buf_len - len, "monitor_direct = %u\n",4225u32_get_bits(ast_info, ATH12K_HTT_AST_MONITOR_DIRECT_INFO));4226len += scnprintf(buf + len, buf_len - len, "mesh_sta = %u\n",4227u32_get_bits(ast_info, ATH12K_HTT_AST_MESH_STA_INFO));4228len += scnprintf(buf + len, buf_len - len, "mec = %u\n",4229u32_get_bits(ast_info, ATH12K_HTT_AST_MEC_INFO));4230len += scnprintf(buf + len, buf_len - len, "intra_bss = %u\n\n",4231u32_get_bits(ast_info, ATH12K_HTT_AST_INTRA_BSS_INFO));42324233stats_req->buf_len = len;4234}42354236static const char*4237ath12k_htt_get_punct_dir_type_str(enum ath12k_htt_stats_direction direction)4238{4239switch (direction) {4240case ATH12K_HTT_STATS_DIRECTION_TX:4241return "tx";4242case ATH12K_HTT_STATS_DIRECTION_RX:4243return "rx";4244default:4245return "unknown";4246}4247}42484249static const char*4250ath12k_htt_get_punct_ppdu_type_str(enum ath12k_htt_stats_ppdu_type ppdu_type)4251{4252switch (ppdu_type) {4253case ATH12K_HTT_STATS_PPDU_TYPE_MODE_SU:4254return "su";4255case ATH12K_HTT_STATS_PPDU_TYPE_DL_MU_MIMO:4256return "dl_mu_mimo";4257case ATH12K_HTT_STATS_PPDU_TYPE_UL_MU_MIMO:4258return "ul_mu_mimo";4259case ATH12K_HTT_STATS_PPDU_TYPE_DL_MU_OFDMA:4260return "dl_mu_ofdma";4261case ATH12K_HTT_STATS_PPDU_TYPE_UL_MU_OFDMA:4262return "ul_mu_ofdma";4263default:4264return "unknown";4265}4266}42674268static const char*4269ath12k_htt_get_punct_pream_type_str(enum ath12k_htt_stats_param_type pream_type)4270{4271switch (pream_type) {4272case ATH12K_HTT_STATS_PREAM_OFDM:4273return "ofdm";4274case ATH12K_HTT_STATS_PREAM_CCK:4275return "cck";4276case ATH12K_HTT_STATS_PREAM_HT:4277return "ht";4278case ATH12K_HTT_STATS_PREAM_VHT:4279return "ac";4280case ATH12K_HTT_STATS_PREAM_HE:4281return "ax";4282case ATH12K_HTT_STATS_PREAM_EHT:4283return "be";4284default:4285return "unknown";4286}4287}42884289static void4290ath12k_htt_print_puncture_stats_tlv(const void *tag_buf, u16 tag_len,4291struct debug_htt_stats_req *stats_req)4292{4293const struct ath12k_htt_pdev_puncture_stats_tlv *stats_buf = tag_buf;4294u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4295u32 len = stats_req->buf_len;4296u8 *buf = stats_req->buf;4297const char *direction;4298const char *ppdu_type;4299const char *preamble;4300u32 mac_id__word;4301u32 subband_limit;4302u8 i;43034304if (tag_len < sizeof(*stats_buf))4305return;43064307mac_id__word = le32_to_cpu(stats_buf->mac_id__word);4308subband_limit = min(le32_to_cpu(stats_buf->subband_cnt),4309ATH12K_HTT_PUNCT_STATS_MAX_SUBBAND_CNT);43104311direction = ath12k_htt_get_punct_dir_type_str(le32_to_cpu(stats_buf->direction));4312ppdu_type = ath12k_htt_get_punct_ppdu_type_str(le32_to_cpu(stats_buf->ppdu_type));4313preamble = ath12k_htt_get_punct_pream_type_str(le32_to_cpu(stats_buf->preamble));43144315len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_PUNCTURE_STATS_TLV:\n");4316len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",4317u32_get_bits(mac_id__word, ATH12K_HTT_STATS_MAC_ID));4318len += scnprintf(buf + len, buf_len - len,4319"%s_%s_%s_last_used_pattern_mask = 0x%08x\n",4320direction, preamble, ppdu_type,4321le32_to_cpu(stats_buf->last_used_pattern_mask));43224323for (i = 0; i < subband_limit; i++) {4324len += scnprintf(buf + len, buf_len - len,4325"%s_%s_%s_num_subbands_used_cnt_%02d = %u\n",4326direction, preamble, ppdu_type, i + 1,4327le32_to_cpu(stats_buf->num_subbands_used_cnt[i]));4328}4329len += scnprintf(buf + len, buf_len - len, "\n");43304331stats_req->buf_len = len;4332}43334334static void4335ath12k_htt_print_dmac_reset_stats_tlv(const void *tag_buf, u16 tag_len,4336struct debug_htt_stats_req *stats_req)4337{4338const struct ath12k_htt_dmac_reset_stats_tlv *htt_stats_buf = tag_buf;4339u8 *buf = stats_req->buf;4340u32 len = stats_req->buf_len;4341u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4342u64 time;43434344if (tag_len < sizeof(*htt_stats_buf))4345return;43464347len += scnprintf(buf + len, buf_len - len, "HTT_DMAC_RESET_STATS_TLV:\n");4348len += scnprintf(buf + len, buf_len - len, "reset_count = %u\n",4349le32_to_cpu(htt_stats_buf->reset_count));4350time = ath12k_le32hilo_to_u64(htt_stats_buf->reset_time_hi_ms,4351htt_stats_buf->reset_time_lo_ms);4352len += scnprintf(buf + len, buf_len - len, "reset_time_ms = %llu\n", time);4353time = ath12k_le32hilo_to_u64(htt_stats_buf->disengage_time_hi_ms,4354htt_stats_buf->disengage_time_lo_ms);4355len += scnprintf(buf + len, buf_len - len, "disengage_time_ms = %llu\n", time);43564357time = ath12k_le32hilo_to_u64(htt_stats_buf->engage_time_hi_ms,4358htt_stats_buf->engage_time_lo_ms);4359len += scnprintf(buf + len, buf_len - len, "engage_time_ms = %llu\n", time);43604361len += scnprintf(buf + len, buf_len - len, "disengage_count = %u\n",4362le32_to_cpu(htt_stats_buf->disengage_count));4363len += scnprintf(buf + len, buf_len - len, "engage_count = %u\n",4364le32_to_cpu(htt_stats_buf->engage_count));4365len += scnprintf(buf + len, buf_len - len, "drain_dest_ring_mask = 0x%x\n\n",4366le32_to_cpu(htt_stats_buf->drain_dest_ring_mask));43674368stats_req->buf_len = len;4369}43704371static void4372ath12k_htt_print_pdev_sched_algo_ofdma_stats_tlv(const void *tag_buf, u16 tag_len,4373struct debug_htt_stats_req *stats_req)4374{4375const struct ath12k_htt_pdev_sched_algo_ofdma_stats_tlv *htt_stats_buf = tag_buf;4376u8 *buf = stats_req->buf;4377u32 len = stats_req->buf_len;4378u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4379u32 mac_id_word;43804381if (tag_len < sizeof(*htt_stats_buf))4382return;43834384mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);43854386len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_SCHED_ALGO_TLV:\n");4387len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",4388u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));4389len += print_array_to_buf(buf, len, "rate_based_dlofdma_enabled_count",4390htt_stats_buf->rate_based_dlofdma_enabled_cnt,4391ATH12K_HTT_NUM_AC_WMM, "\n");4392len += print_array_to_buf(buf, len, "rate_based_dlofdma_disabled_count",4393htt_stats_buf->rate_based_dlofdma_disabled_cnt,4394ATH12K_HTT_NUM_AC_WMM, "\n");4395len += print_array_to_buf(buf, len, "rate_based_dlofdma_probing_count",4396htt_stats_buf->rate_based_dlofdma_disabled_cnt,4397ATH12K_HTT_NUM_AC_WMM, "\n");4398len += print_array_to_buf(buf, len, "rate_based_dlofdma_monitoring_count",4399htt_stats_buf->rate_based_dlofdma_monitor_cnt,4400ATH12K_HTT_NUM_AC_WMM, "\n");4401len += print_array_to_buf(buf, len, "chan_acc_lat_based_dlofdma_enabled_count",4402htt_stats_buf->chan_acc_lat_based_dlofdma_enabled_cnt,4403ATH12K_HTT_NUM_AC_WMM, "\n");4404len += print_array_to_buf(buf, len, "chan_acc_lat_based_dlofdma_disabled_count",4405htt_stats_buf->chan_acc_lat_based_dlofdma_disabled_cnt,4406ATH12K_HTT_NUM_AC_WMM, "\n");4407len += print_array_to_buf(buf, len, "chan_acc_lat_based_dlofdma_monitoring_count",4408htt_stats_buf->chan_acc_lat_based_dlofdma_monitor_cnt,4409ATH12K_HTT_NUM_AC_WMM, "\n");4410len += print_array_to_buf(buf, len, "downgrade_to_dl_su_ru_alloc_fail",4411htt_stats_buf->downgrade_to_dl_su_ru_alloc_fail,4412ATH12K_HTT_NUM_AC_WMM, "\n");4413len += print_array_to_buf(buf, len, "candidate_list_single_user_disable_ofdma",4414htt_stats_buf->candidate_list_single_user_disable_ofdma,4415ATH12K_HTT_NUM_AC_WMM, "\n");4416len += print_array_to_buf(buf, len, "dl_cand_list_dropped_high_ul_qos_weight",4417htt_stats_buf->dl_cand_list_dropped_high_ul_qos_weight,4418ATH12K_HTT_NUM_AC_WMM, "\n");4419len += print_array_to_buf(buf, len, "ax_dlofdma_disabled_due_to_pipelining",4420htt_stats_buf->ax_dlofdma_disabled_due_to_pipelining,4421ATH12K_HTT_NUM_AC_WMM, "\n");4422len += print_array_to_buf(buf, len, "dlofdma_disabled_su_only_eligible",4423htt_stats_buf->dlofdma_disabled_su_only_eligible,4424ATH12K_HTT_NUM_AC_WMM, "\n");4425len += print_array_to_buf(buf, len, "dlofdma_disabled_consec_no_mpdus_tried",4426htt_stats_buf->dlofdma_disabled_consec_no_mpdus_tried,4427ATH12K_HTT_NUM_AC_WMM, "\n");4428len += print_array_to_buf(buf, len, "dlofdma_disabled_consec_no_mpdus_success",4429htt_stats_buf->dlofdma_disabled_consec_no_mpdus_success,4430ATH12K_HTT_NUM_AC_WMM, "\n\n");44314432stats_req->buf_len = len;4433}44344435static void4436ath12k_htt_print_tx_pdev_rate_stats_be_ofdma_tlv(const void *tag_buf, u16 tag_len,4437struct debug_htt_stats_req *stats_req)4438{4439const struct ath12k_htt_tx_pdev_rate_stats_be_ofdma_tlv *htt_stats_buf = tag_buf;4440u8 *buf = stats_req->buf;4441u32 len = stats_req->buf_len;4442u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4443u32 mac_id_word;4444u8 i;44454446if (tag_len < sizeof(*htt_stats_buf))4447return;44484449mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);44504451len += scnprintf(buf + len, buf_len - len,4452"HTT_TX_PDEV_RATE_STATS_BE_OFDMA_TLV:\n");4453len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",4454u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));4455len += scnprintf(buf + len, buf_len - len, "be_ofdma_tx_ldpc = %u\n",4456le32_to_cpu(htt_stats_buf->be_ofdma_tx_ldpc));4457len += print_array_to_buf(buf, len, "be_ofdma_tx_mcs",4458htt_stats_buf->be_ofdma_tx_mcs,4459ATH12K_HTT_TX_PDEV_NUM_BE_MCS_CNTRS, "\n");4460len += print_array_to_buf(buf, len, "be_ofdma_eht_sig_mcs",4461htt_stats_buf->be_ofdma_eht_sig_mcs,4462ATH12K_HTT_TX_PDEV_NUM_EHT_SIG_MCS_CNTRS, "\n");4463len += scnprintf(buf + len, buf_len - len, "be_ofdma_tx_ru_size = ");4464for (i = 0; i < ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS; i++)4465len += scnprintf(buf + len, buf_len - len, " %s:%u ",4466ath12k_htt_be_tx_rx_ru_size_to_str(i),4467le32_to_cpu(htt_stats_buf->be_ofdma_tx_ru_size[i]));4468len += scnprintf(buf + len, buf_len - len, "\n");4469len += print_array_to_buf_index(buf, len, "be_ofdma_tx_nss = ", 1,4470htt_stats_buf->be_ofdma_tx_nss,4471ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS,4472"\n");4473len += print_array_to_buf(buf, len, "be_ofdma_tx_bw",4474htt_stats_buf->be_ofdma_tx_bw,4475ATH12K_HTT_TX_PDEV_NUM_BE_BW_CNTRS, "\n");4476for (i = 0; i < ATH12K_HTT_TX_PDEV_NUM_GI_CNTRS; i++) {4477len += scnprintf(buf + len, buf_len - len,4478"be_ofdma_tx_gi[%u]", i);4479len += print_array_to_buf(buf, len, "", htt_stats_buf->gi[i],4480ATH12K_HTT_TX_PDEV_NUM_BE_MCS_CNTRS, "\n");4481}4482len += scnprintf(buf + len, buf_len - len, "\n");44834484stats_req->buf_len = len;4485}44864487static void4488ath12k_htt_print_pdev_mbssid_ctrl_frame_stats_tlv(const void *tag_buf, u16 tag_len,4489struct debug_htt_stats_req *stats_req)4490{4491const struct ath12k_htt_pdev_mbssid_ctrl_frame_tlv *htt_stats_buf = tag_buf;4492u8 *buf = stats_req->buf;4493u32 len = stats_req->buf_len;4494u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4495u32 mac_id_word;44964497if (tag_len < sizeof(*htt_stats_buf))4498return;44994500mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);45014502len += scnprintf(buf + len, buf_len - len, "HTT_MBSSID_CTRL_FRAME_STATS_TLV:\n");4503len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",4504u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));4505len += scnprintf(buf + len, buf_len - len, "basic_trigger_across_bss = %u\n",4506le32_to_cpu(htt_stats_buf->basic_trigger_across_bss));4507len += scnprintf(buf + len, buf_len - len, "basic_trigger_within_bss = %u\n",4508le32_to_cpu(htt_stats_buf->basic_trigger_within_bss));4509len += scnprintf(buf + len, buf_len - len, "bsr_trigger_across_bss = %u\n",4510le32_to_cpu(htt_stats_buf->bsr_trigger_across_bss));4511len += scnprintf(buf + len, buf_len - len, "bsr_trigger_within_bss = %u\n",4512le32_to_cpu(htt_stats_buf->bsr_trigger_within_bss));4513len += scnprintf(buf + len, buf_len - len, "mu_rts_across_bss = %u\n",4514le32_to_cpu(htt_stats_buf->mu_rts_across_bss));4515len += scnprintf(buf + len, buf_len - len, "mu_rts_within_bss = %u\n",4516le32_to_cpu(htt_stats_buf->mu_rts_within_bss));4517len += scnprintf(buf + len, buf_len - len, "ul_mumimo_trigger_across_bss = %u\n",4518le32_to_cpu(htt_stats_buf->ul_mumimo_trigger_across_bss));4519len += scnprintf(buf + len, buf_len - len,4520"ul_mumimo_trigger_within_bss = %u\n\n",4521le32_to_cpu(htt_stats_buf->ul_mumimo_trigger_within_bss));45224523stats_req->buf_len = len;4524}45254526static inline void4527ath12k_htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf, u16 tag_len,4528struct debug_htt_stats_req *stats_req)4529{4530const struct ath12k_htt_tx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;4531u8 *buf = stats_req->buf;4532u32 len = stats_req->buf_len;4533u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4534u8 i, j;4535u32 mac_id_word;45364537if (tag_len < sizeof(*htt_stats_buf))4538return;45394540mac_id_word = le32_to_cpu(htt_stats_buf->mac_id_word);45414542len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_RATE_STATS_TLV:\n");4543len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",4544u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));4545len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",4546le32_to_cpu(htt_stats_buf->tx_ldpc));4547len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_ldpc = %u\n",4548le32_to_cpu(htt_stats_buf->ac_mu_mimo_tx_ldpc));4549len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_ldpc = %u\n",4550le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_ldpc));4551len += scnprintf(buf + len, buf_len - len, "ofdma_tx_ldpc = %u\n",4552le32_to_cpu(htt_stats_buf->ofdma_tx_ldpc));4553len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",4554le32_to_cpu(htt_stats_buf->rts_cnt));4555len += scnprintf(buf + len, buf_len - len, "rts_success = %u\n",4556le32_to_cpu(htt_stats_buf->rts_success));4557len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",4558le32_to_cpu(htt_stats_buf->ack_rssi));4559len += scnprintf(buf + len, buf_len - len,4560"Legacy CCK Rates: 1 Mbps: %u, 2 Mbps: %u, 5.5 Mbps: %u, 12 Mbps: %u\n",4561le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[0]),4562le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[1]),4563le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[2]),4564le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[3]));4565len += scnprintf(buf + len, buf_len - len,4566"Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n"4567" 24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n",4568le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[0]),4569le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[1]),4570le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[2]),4571le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[3]),4572le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[4]),4573le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[5]),4574le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[6]),4575le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[7]));4576len += scnprintf(buf + len, buf_len - len, "HE LTF: 1x: %u, 2x: %u, 4x: %u\n",4577le32_to_cpu(htt_stats_buf->tx_he_ltf[1]),4578le32_to_cpu(htt_stats_buf->tx_he_ltf[2]),4579le32_to_cpu(htt_stats_buf->tx_he_ltf[3]));45804581len += print_array_to_buf(buf, len, "tx_mcs", htt_stats_buf->tx_mcs,4582ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);4583for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)4584len += scnprintf(buf + len, buf_len - len, ", %u:%u",4585j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4586le32_to_cpu(htt_stats_buf->tx_mcs_ext[j]));4587for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS; j++)4588len += scnprintf(buf + len, buf_len - len, ", %u:%u",4589j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS +4590ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS,4591le32_to_cpu(htt_stats_buf->tx_mcs_ext_2[j]));4592len += scnprintf(buf + len, buf_len - len, "\n");45934594len += print_array_to_buf(buf, len, "ax_mu_mimo_tx_mcs",4595htt_stats_buf->ax_mu_mimo_tx_mcs,4596ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);4597for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)4598len += scnprintf(buf + len, buf_len - len, ", %u:%u",4599j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4600le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_mcs_ext[j]));4601len += scnprintf(buf + len, buf_len - len, "\n");46024603len += print_array_to_buf(buf, len, "ofdma_tx_mcs",4604htt_stats_buf->ofdma_tx_mcs,4605ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);4606for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)4607len += scnprintf(buf + len, buf_len - len, ", %u:%u",4608j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4609le32_to_cpu(htt_stats_buf->ofdma_tx_mcs_ext[j]));4610len += scnprintf(buf + len, buf_len - len, "\n");46114612len += scnprintf(buf + len, buf_len - len, "tx_nss =");4613for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)4614len += scnprintf(buf + len, buf_len - len, " %u:%u,",4615j, le32_to_cpu(htt_stats_buf->tx_nss[j - 1]));4616len--;4617len += scnprintf(buf + len, buf_len - len, "\n");46184619len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_nss =");4620for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)4621len += scnprintf(buf + len, buf_len - len, " %u:%u,",4622j, le32_to_cpu(htt_stats_buf->ac_mu_mimo_tx_nss[j - 1]));4623len--;4624len += scnprintf(buf + len, buf_len - len, "\n");46254626len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_nss =");4627for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)4628len += scnprintf(buf + len, buf_len - len, " %u:%u,",4629j, le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_nss[j - 1]));4630len--;4631len += scnprintf(buf + len, buf_len - len, "\n");46324633len += scnprintf(buf + len, buf_len - len, "ofdma_tx_nss =");4634for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)4635len += scnprintf(buf + len, buf_len - len, " %u:%u,",4636j, le32_to_cpu(htt_stats_buf->ofdma_tx_nss[j - 1]));4637len--;4638len += scnprintf(buf + len, buf_len - len, "\n");46394640len += print_array_to_buf(buf, len, "tx_bw", htt_stats_buf->tx_bw,4641ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, NULL);4642len += scnprintf(buf + len, buf_len - len, ", %u:%u\n",4643ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS,4644le32_to_cpu(htt_stats_buf->tx_bw_320mhz));46454646len += print_array_to_buf(buf, len, "tx_stbc",4647htt_stats_buf->tx_stbc,4648ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);4649for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)4650len += scnprintf(buf + len, buf_len - len, ", %u:%u",4651j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4652le32_to_cpu(htt_stats_buf->tx_stbc_ext[j]));4653len += scnprintf(buf + len, buf_len - len, "\n");46544655for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {4656len += scnprintf(buf + len, (buf_len - len),4657"tx_gi[%u] =", j);4658len += print_array_to_buf(buf, len, NULL, htt_stats_buf->tx_gi[j],4659ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4660NULL);4661for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++)4662len += scnprintf(buf + len, buf_len - len, ", %u:%u",4663i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4664le32_to_cpu(htt_stats_buf->tx_gi_ext[j][i]));4665len += scnprintf(buf + len, buf_len - len, "\n");4666}46674668for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {4669len += scnprintf(buf + len, (buf_len - len),4670"ac_mu_mimo_tx_gi[%u] =", j);4671len += print_array_to_buf(buf, len, NULL,4672htt_stats_buf->ac_mu_mimo_tx_gi[j],4673ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4674"\n");4675}46764677for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {4678len += scnprintf(buf + len, (buf_len - len),4679"ax_mu_mimo_tx_gi[%u] =", j);4680len += print_array_to_buf(buf, len, NULL, htt_stats_buf->ax_mimo_tx_gi[j],4681ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4682NULL);4683for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++)4684len += scnprintf(buf + len, buf_len - len, ", %u:%u",4685i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4686le32_to_cpu(htt_stats_buf->ax_tx_gi_ext[j][i]));4687len += scnprintf(buf + len, buf_len - len, "\n");4688}46894690for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {4691len += scnprintf(buf + len, (buf_len - len),4692"ofdma_tx_gi[%u] = ", j);4693len += print_array_to_buf(buf, len, NULL, htt_stats_buf->ofdma_tx_gi[j],4694ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4695NULL);4696for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++)4697len += scnprintf(buf + len, buf_len - len, ", %u:%u",4698i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,4699le32_to_cpu(htt_stats_buf->ofd_tx_gi_ext[j][i]));4700len += scnprintf(buf + len, buf_len - len, "\n");4701}47024703len += print_array_to_buf(buf, len, "tx_su_mcs", htt_stats_buf->tx_su_mcs,4704ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4705len += print_array_to_buf(buf, len, "tx_mu_mcs", htt_stats_buf->tx_mu_mcs,4706ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4707len += print_array_to_buf(buf, len, "ac_mu_mimo_tx_mcs",4708htt_stats_buf->ac_mu_mimo_tx_mcs,4709ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4710len += print_array_to_buf(buf, len, "ac_mu_mimo_tx_bw",4711htt_stats_buf->ac_mu_mimo_tx_bw,4712ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");4713len += print_array_to_buf(buf, len, "ax_mu_mimo_tx_bw",4714htt_stats_buf->ax_mu_mimo_tx_bw,4715ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");4716len += print_array_to_buf(buf, len, "ofdma_tx_bw",4717htt_stats_buf->ofdma_tx_bw,4718ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");4719len += print_array_to_buf(buf, len, "tx_pream", htt_stats_buf->tx_pream,4720ATH12K_HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");4721len += print_array_to_buf(buf, len, "tx_dcm", htt_stats_buf->tx_dcm,4722ATH12K_HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");47234724stats_req->buf_len = len;4725}47264727static void4728ath12k_htt_print_histogram_stats_tlv(const void *tag_buf, u16 tag_len,4729struct debug_htt_stats_req *stats_req)4730{4731const struct ath12k_htt_tx_histogram_stats_tlv *stats_buf = tag_buf;4732u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4733u32 len = stats_req->buf_len;4734u8 *buf = stats_req->buf;47354736if (tag_len < sizeof(*stats_buf))4737return;47384739len += scnprintf(buf + len, buf_len - len, "low_latency_rate_cnt = %u\n",4740le32_to_cpu(stats_buf->low_latency_rate_cnt));4741len += scnprintf(buf + len, buf_len - len, "su_burst_rate_drop_cnt = %u\n",4742le32_to_cpu(stats_buf->su_burst_rate_drop_cnt));4743len += scnprintf(buf + len, buf_len - len, "su_burst_rate_drop_fail_cnt = %u\n",4744le32_to_cpu(stats_buf->su_burst_rate_drop_fail_cnt));4745len += scnprintf(buf + len, buf_len - len, "rate_retry_mcs_drop_cnt = %u\n",4746le32_to_cpu(stats_buf->rate_retry_mcs_drop_cnt));47474748len += scnprintf(buf + len, buf_len - len, "\nPER_HISTOGRAM_STATS\n");4749len += print_array_to_buf(buf, len, "mcs_drop_rate", stats_buf->mcs_drop_rate,4750ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_DROP_COUNTERS, "\n");4751len += print_array_to_buf(buf, len, "per_histogram_count",4752stats_buf->per_histogram_cnt,4753ATH12K_HTT_TX_PDEV_STATS_NUM_PER_COUNTERS, "\n\n");47544755stats_req->buf_len = len;4756}47574758static inline void4759ath12k_htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf, u16 tag_len,4760struct debug_htt_stats_req *stats_req)4761{4762const struct ath12k_htt_rx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;4763u8 *buf = stats_req->buf;4764u32 len = stats_req->buf_len;4765u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4766u8 i, j;4767u32 mac_id_word;47684769if (tag_len < sizeof(*htt_stats_buf))4770return;47714772mac_id_word = le32_to_cpu(htt_stats_buf->mac_id_word);47734774len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_STATS_TLV:\n");4775len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",4776u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));4777len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",4778le32_to_cpu(htt_stats_buf->nsts));4779len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",4780le32_to_cpu(htt_stats_buf->rx_ldpc));4781len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",4782le32_to_cpu(htt_stats_buf->rts_cnt));4783len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",4784le32_to_cpu(htt_stats_buf->rssi_mgmt));4785len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",4786le32_to_cpu(htt_stats_buf->rssi_data));4787len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",4788le32_to_cpu(htt_stats_buf->rssi_comb));4789len += scnprintf(buf + len, buf_len - len, "rssi_in_dbm = %d\n",4790le32_to_cpu(htt_stats_buf->rssi_in_dbm));4791len += scnprintf(buf + len, buf_len - len, "rx_evm_nss_count = %u\n",4792le32_to_cpu(htt_stats_buf->nss_count));4793len += scnprintf(buf + len, buf_len - len, "rx_evm_pilot_count = %u\n",4794le32_to_cpu(htt_stats_buf->pilot_count));4795len += scnprintf(buf + len, buf_len - len, "rx_11ax_su_ext = %u\n",4796le32_to_cpu(htt_stats_buf->rx_11ax_su_ext));4797len += scnprintf(buf + len, buf_len - len, "rx_11ac_mumimo = %u\n",4798le32_to_cpu(htt_stats_buf->rx_11ac_mumimo));4799len += scnprintf(buf + len, buf_len - len, "rx_11ax_mumimo = %u\n",4800le32_to_cpu(htt_stats_buf->rx_11ax_mumimo));4801len += scnprintf(buf + len, buf_len - len, "rx_11ax_ofdma = %u\n",4802le32_to_cpu(htt_stats_buf->rx_11ax_ofdma));4803len += scnprintf(buf + len, buf_len - len, "txbf = %u\n",4804le32_to_cpu(htt_stats_buf->txbf));4805len += scnprintf(buf + len, buf_len - len, "rx_su_ndpa = %u\n",4806le32_to_cpu(htt_stats_buf->rx_su_ndpa));4807len += scnprintf(buf + len, buf_len - len, "rx_mu_ndpa = %u\n",4808le32_to_cpu(htt_stats_buf->rx_mu_ndpa));4809len += scnprintf(buf + len, buf_len - len, "rx_br_poll = %u\n",4810le32_to_cpu(htt_stats_buf->rx_br_poll));4811len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_low = %u\n",4812le32_to_cpu(htt_stats_buf->rx_active_dur_us_low));4813len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_high = %u\n",4814le32_to_cpu(htt_stats_buf->rx_active_dur_us_high));4815len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n",4816le32_to_cpu(htt_stats_buf->rx_11ax_ul_ofdma));4817len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n",4818le32_to_cpu(htt_stats_buf->ul_ofdma_rx_stbc));4819len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n",4820le32_to_cpu(htt_stats_buf->ul_ofdma_rx_ldpc));4821len += scnprintf(buf + len, buf_len - len, "per_chain_rssi_pkt_type = %#x\n",4822le32_to_cpu(htt_stats_buf->per_chain_rssi_pkt_type));48234824len += print_array_to_buf(buf, len, "rx_nss", htt_stats_buf->rx_nss,4825ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");4826len += print_array_to_buf(buf, len, "rx_dcm", htt_stats_buf->rx_dcm,4827ATH12K_HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");4828len += print_array_to_buf(buf, len, "rx_stbc", htt_stats_buf->rx_stbc,4829ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4830len += print_array_to_buf(buf, len, "rx_bw", htt_stats_buf->rx_bw,4831ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");4832len += print_array_to_buf(buf, len, "rx_pream", htt_stats_buf->rx_pream,4833ATH12K_HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");4834len += print_array_to_buf(buf, len, "rx_11ax_su_txbf_mcs",4835htt_stats_buf->rx_11ax_su_txbf_mcs,4836ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4837len += print_array_to_buf(buf, len, "rx_11ax_mu_txbf_mcs",4838htt_stats_buf->rx_11ax_mu_txbf_mcs,4839ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4840len += print_array_to_buf(buf, len, "rx_legacy_cck_rate",4841htt_stats_buf->rx_legacy_cck_rate,4842ATH12K_HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS, "\n");4843len += print_array_to_buf(buf, len, "rx_legacy_ofdm_rate",4844htt_stats_buf->rx_legacy_ofdm_rate,4845ATH12K_HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS, "\n");4846len += print_array_to_buf(buf, len, "ul_ofdma_rx_mcs",4847htt_stats_buf->ul_ofdma_rx_mcs,4848ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4849len += print_array_to_buf(buf, len, "ul_ofdma_rx_nss",4850htt_stats_buf->ul_ofdma_rx_nss,4851ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");4852len += print_array_to_buf(buf, len, "ul_ofdma_rx_bw",4853htt_stats_buf->ul_ofdma_rx_bw,4854ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");4855len += print_array_to_buf(buf, len, "rx_ulofdma_non_data_ppdu",4856htt_stats_buf->rx_ulofdma_non_data_ppdu,4857ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");4858len += print_array_to_buf(buf, len, "rx_ulofdma_data_ppdu",4859htt_stats_buf->rx_ulofdma_data_ppdu,4860ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");4861len += print_array_to_buf(buf, len, "rx_ulofdma_mpdu_ok",4862htt_stats_buf->rx_ulofdma_mpdu_ok,4863ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");4864len += print_array_to_buf(buf, len, "rx_ulofdma_mpdu_fail",4865htt_stats_buf->rx_ulofdma_mpdu_fail,4866ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");4867len += print_array_to_buf(buf, len, "rx_ulofdma_non_data_nusers",4868htt_stats_buf->rx_ulofdma_non_data_nusers,4869ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");4870len += print_array_to_buf(buf, len, "rx_ulofdma_data_nusers",4871htt_stats_buf->rx_ulofdma_data_nusers,4872ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");4873len += print_array_to_buf(buf, len, "rx_11ax_dl_ofdma_mcs",4874htt_stats_buf->rx_11ax_dl_ofdma_mcs,4875ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");4876len += print_array_to_buf(buf, len, "rx_11ax_dl_ofdma_ru",4877htt_stats_buf->rx_11ax_dl_ofdma_ru,4878ATH12K_HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS, "\n");4879len += print_array_to_buf(buf, len, "rx_ulmumimo_non_data_ppdu",4880htt_stats_buf->rx_ulmumimo_non_data_ppdu,4881ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n");4882len += print_array_to_buf(buf, len, "rx_ulmumimo_data_ppdu",4883htt_stats_buf->rx_ulmumimo_data_ppdu,4884ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n");4885len += print_array_to_buf(buf, len, "rx_ulmumimo_mpdu_ok",4886htt_stats_buf->rx_ulmumimo_mpdu_ok,4887ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n");4888len += print_array_to_buf(buf, len, "rx_ulmumimo_mpdu_fail",4889htt_stats_buf->rx_ulmumimo_mpdu_fail,4890ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n");48914892len += print_array_to_buf(buf, len, "rx_mcs",4893htt_stats_buf->rx_mcs,4894ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);4895for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)4896len += scnprintf(buf + len, buf_len - len, ", %u:%u",4897j + ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,4898le32_to_cpu(htt_stats_buf->rx_mcs_ext[j]));4899len += scnprintf(buf + len, buf_len - len, "\n");49004901for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {4902len += scnprintf(buf + len, buf_len - len,4903"pilot_evm_db[%u] =", j);4904len += print_array_to_buf(buf, len, NULL,4905htt_stats_buf->rx_pil_evm_db[j],4906ATH12K_HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_NSS,4907"\n");4908}49094910len += scnprintf(buf + len, buf_len - len, "pilot_evm_db_mean =");4911for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)4912len += scnprintf(buf + len,4913buf_len - len,4914" %u:%d,", i,4915le32_to_cpu(htt_stats_buf->rx_pilot_evm_db_mean[i]));4916len--;4917len += scnprintf(buf + len, buf_len - len, "\n");49184919for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {4920len += scnprintf(buf + len, buf_len - len,4921"rssi_chain_in_db[%u] = ", j);4922for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)4923len += scnprintf(buf + len,4924buf_len - len,4925" %u: %d,", i,4926htt_stats_buf->rssi_chain_in_db[j][i]);4927len--;4928len += scnprintf(buf + len, buf_len - len, "\n");4929}49304931for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {4932len += scnprintf(buf + len, buf_len - len,4933"rx_gi[%u] = ", j);4934len += print_array_to_buf(buf, len, NULL,4935htt_stats_buf->rx_gi[j],4936ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,4937"\n");4938}49394940for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {4941len += scnprintf(buf + len, buf_len - len,4942"ul_ofdma_rx_gi[%u] = ", j);4943len += print_array_to_buf(buf, len, NULL,4944htt_stats_buf->ul_ofdma_rx_gi[j],4945ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,4946"\n");4947}49484949for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {4950len += scnprintf(buf + len, buf_len - len,4951"rx_ul_fd_rssi: nss[%u] = ", j);4952for (i = 0; i < ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++)4953len += scnprintf(buf + len,4954buf_len - len,4955" %u:%d,",4956i, htt_stats_buf->rx_ul_fd_rssi[j][i]);4957len--;4958len += scnprintf(buf + len, buf_len - len, "\n");4959}49604961for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {4962len += scnprintf(buf + len, buf_len - len,4963"rx_per_chain_rssi_in_dbm[%u] =", j);4964for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)4965len += scnprintf(buf + len,4966buf_len - len,4967" %u:%d,",4968i,4969htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]);4970len--;4971len += scnprintf(buf + len, buf_len - len, "\n");4972}49734974stats_req->buf_len = len;4975}49764977static inline void4978ath12k_htt_print_rx_pdev_rate_ext_stats_tlv(const void *tag_buf, u16 tag_len,4979struct debug_htt_stats_req *stats_req)4980{4981const struct ath12k_htt_rx_pdev_rate_ext_stats_tlv *htt_stats_buf = tag_buf;4982u8 *buf = stats_req->buf;4983u32 len = stats_req->buf_len;4984u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;4985u8 j;49864987if (tag_len < sizeof(*htt_stats_buf))4988return;49894990len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_EXT_STATS_TLV:\n");4991len += scnprintf(buf + len, buf_len - len, "rssi_mgmt_in_dbm = %d\n",4992le32_to_cpu(htt_stats_buf->rssi_mgmt_in_dbm));49934994len += print_array_to_buf(buf, len, "rx_stbc_ext",4995htt_stats_buf->rx_stbc_ext,4996ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");4997len += print_array_to_buf(buf, len, "ul_ofdma_rx_mcs_ext",4998htt_stats_buf->ul_ofdma_rx_mcs_ext,4999ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");5000len += print_array_to_buf(buf, len, "rx_11ax_su_txbf_mcs_ext",5001htt_stats_buf->rx_11ax_su_txbf_mcs_ext,5002ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");5003len += print_array_to_buf(buf, len, "rx_11ax_mu_txbf_mcs_ext",5004htt_stats_buf->rx_11ax_mu_txbf_mcs_ext,5005ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");5006len += print_array_to_buf(buf, len, "rx_11ax_dl_ofdma_mcs_ext",5007htt_stats_buf->rx_11ax_dl_ofdma_mcs_ext,5008ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");5009len += print_array_to_buf(buf, len, "rx_bw_ext",5010htt_stats_buf->rx_bw_ext,5011ATH12K_HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS, "\n");5012len += print_array_to_buf(buf, len, "rx_su_punctured_mode",5013htt_stats_buf->rx_su_punctured_mode,5014ATH12K_HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS,5015"\n");50165017len += print_array_to_buf(buf, len, "rx_mcs_ext",5018htt_stats_buf->rx_mcs_ext,5019ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,5020NULL);5021for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS; j++)5022len += scnprintf(buf + len, buf_len - len, ", %u:%u",5023j + ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,5024le32_to_cpu(htt_stats_buf->rx_mcs_ext_2[j]));5025len += scnprintf(buf + len, buf_len - len, "\n");50265027for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {5028len += scnprintf(buf + len, buf_len - len,5029"rx_gi_ext[%u] = ", j);5030len += print_array_to_buf(buf, len, NULL,5031htt_stats_buf->rx_gi_ext[j],5032ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,5033"\n");5034}50355036for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {5037len += scnprintf(buf + len, buf_len - len,5038"ul_ofdma_rx_gi_ext[%u] = ", j);5039len += print_array_to_buf(buf, len, NULL,5040htt_stats_buf->ul_ofdma_rx_gi_ext[j],5041ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,5042"\n");5043}50445045stats_req->buf_len = len;5046}50475048static void5049ath12k_htt_print_pdev_tdma_stats_tlv(const void *tag_buf, u16 tag_len,5050struct debug_htt_stats_req *stats_req)5051{5052const struct ath12k_htt_pdev_tdma_stats_tlv *htt_stats_buf = tag_buf;5053u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5054u32 len = stats_req->buf_len;5055u8 *buf = stats_req->buf;5056u32 mac_id_word;50575058if (tag_len < sizeof(*htt_stats_buf))5059return;50605061mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);50625063len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_TDMA_STATS_TLV:\n");5064len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",5065u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));5066len += scnprintf(buf + len, buf_len - len, "num_tdma_active_schedules = %u\n",5067le32_to_cpu(htt_stats_buf->num_tdma_active_schedules));5068len += scnprintf(buf + len, buf_len - len, "num_tdma_reserved_schedules = %u\n",5069le32_to_cpu(htt_stats_buf->num_tdma_reserved_schedules));5070len += scnprintf(buf + len, buf_len - len,5071"num_tdma_restricted_schedules = %u\n",5072le32_to_cpu(htt_stats_buf->num_tdma_restricted_schedules));5073len += scnprintf(buf + len, buf_len - len,5074"num_tdma_unconfigured_schedules = %u\n",5075le32_to_cpu(htt_stats_buf->num_tdma_unconfigured_schedules));5076len += scnprintf(buf + len, buf_len - len, "num_tdma_slot_switches = %u\n",5077le32_to_cpu(htt_stats_buf->num_tdma_slot_switches));5078len += scnprintf(buf + len, buf_len - len, "num_tdma_edca_switches = %u\n\n",5079le32_to_cpu(htt_stats_buf->num_tdma_edca_switches));50805081stats_req->buf_len = len;5082}50835084static void5085ath12k_htt_print_mlo_sched_stats_tlv(const void *tag_buf, u16 tag_len,5086struct debug_htt_stats_req *stats_req)5087{5088const struct ath12k_htt_mlo_sched_stats_tlv *stats_buf = tag_buf;5089u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5090u32 len = stats_req->buf_len;5091u8 *buf = stats_req->buf;50925093if (tag_len < sizeof(*stats_buf))5094return;50955096len += scnprintf(buf + len, buf_len - len, "HTT_STATS_MLO_SCHED_STATS:\n");5097len += scnprintf(buf + len, buf_len - len, "num_sec_link_sched = %u\n",5098le32_to_cpu(stats_buf->pref_link_num_sec_link_sched));5099len += scnprintf(buf + len, buf_len - len, "num_pref_link_timeout = %u\n",5100le32_to_cpu(stats_buf->pref_link_num_pref_link_timeout));5101len += scnprintf(buf + len, buf_len - len, "num_pref_link_sch_delay_ipc = %u\n",5102le32_to_cpu(stats_buf->pref_link_num_pref_link_sch_delay_ipc));5103len += scnprintf(buf + len, buf_len - len, "num_pref_link_timeout_ipc = %u\n\n",5104le32_to_cpu(stats_buf->pref_link_num_pref_link_timeout_ipc));51055106stats_req->buf_len = len;5107}51085109static void5110ath12k_htt_print_mlo_ipc_stats_tlv(const void *tag_buf, u16 tag_len,5111struct debug_htt_stats_req *stats_req)5112{5113const struct ath12k_htt_pdev_mlo_ipc_stats_tlv *stats_buf = tag_buf;5114u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5115u32 len = stats_req->buf_len;5116u8 *buf = stats_req->buf;5117u8 i, j;51185119if (tag_len < sizeof(*stats_buf))5120return;51215122len += scnprintf(buf + len, buf_len - len, "HTT_STATS_MLO_IPC_STATS:\n");5123for (i = 0; i < ATH12K_HTT_HWMLO_MAX_LINKS; i++) {5124len += scnprintf(buf + len, buf_len - len, "src_link: %u\n", i);5125for (j = 0; j < ATH12K_HTT_MLO_MAX_IPC_RINGS; j++)5126len += scnprintf(buf + len, buf_len - len,5127"mlo_ipc_ring_full_cnt[%u]: %u\n", j,5128le32_to_cpu(stats_buf->mlo_ipc_ring_cnt[i][j]));5129len += scnprintf(buf + len, buf_len - len, "\n");5130}51315132stats_req->buf_len = len;5133}51345135static void5136ath12k_htt_print_pdev_rtt_resp_stats_tlv(const void *tag_buf, u16 tag_len,5137struct debug_htt_stats_req *stats_req)5138{5139const struct ath12k_htt_stats_pdev_rtt_resp_stats_tlv *sbuf = tag_buf;5140u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5141u32 len = stats_req->buf_len;5142u8 *buf = stats_req->buf;51435144if (tag_len < sizeof(*sbuf))5145return;51465147len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_RTT_RESP_STATS_TLV:\n");5148len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",5149le32_to_cpu(sbuf->pdev_id));5150len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftm_suc = %u\n",5151le32_to_cpu(sbuf->tx_11mc_ftm_suc));5152len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftm_suc_retry = %u\n",5153le32_to_cpu(sbuf->tx_11mc_ftm_suc_retry));5154len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftm_fail = %u\n",5155le32_to_cpu(sbuf->tx_11mc_ftm_fail));5156len += scnprintf(buf + len, buf_len - len, "rx_11mc_ftmr_cnt = %u\n",5157le32_to_cpu(sbuf->rx_11mc_ftmr_cnt));5158len += scnprintf(buf + len, buf_len - len, "rx_11mc_ftmr_dup_cnt = %u\n",5159le32_to_cpu(sbuf->rx_11mc_ftmr_dup_cnt));5160len += scnprintf(buf + len, buf_len - len, "rx_11mc_iftmr_cnt = %u\n",5161le32_to_cpu(sbuf->rx_11mc_iftmr_cnt));5162len += scnprintf(buf + len, buf_len - len, "rx_11mc_iftmr_dup_cnt = %u\n",5163le32_to_cpu(sbuf->rx_11mc_iftmr_dup_cnt));5164len += scnprintf(buf + len, buf_len - len,5165"ftmr_drop_11mc_resp_role_not_enabled_cnt = %u\n",5166le32_to_cpu(sbuf->ftmr_drop_11mc_resp_role_not_enabled_cnt));5167len += scnprintf(buf + len, buf_len - len, "tx_11az_ftm_successful = %u\n",5168le32_to_cpu(sbuf->tx_11az_ftm_successful));5169len += scnprintf(buf + len, buf_len - len, "tx_11az_ftm_failed = %u\n",5170le32_to_cpu(sbuf->tx_11az_ftm_failed));5171len += scnprintf(buf + len, buf_len - len, "rx_11az_ftmr_cnt = %u\n",5172le32_to_cpu(sbuf->rx_11az_ftmr_cnt));5173len += scnprintf(buf + len, buf_len - len, "rx_11az_ftmr_dup_cnt = %u\n",5174le32_to_cpu(sbuf->rx_11az_ftmr_dup_cnt));5175len += scnprintf(buf + len, buf_len - len, "rx_11az_iftmr_dup_cnt = %u\n",5176le32_to_cpu(sbuf->rx_11az_iftmr_dup_cnt));5177len += scnprintf(buf + len, buf_len - len,5178"initiator_active_responder_rejected_cnt = %u\n",5179le32_to_cpu(sbuf->initiator_active_responder_rejected_cnt));5180len += scnprintf(buf + len, buf_len - len, "malformed_ftmr = %u\n",5181le32_to_cpu(sbuf->malformed_ftmr));5182len += scnprintf(buf + len, buf_len - len,5183"ftmr_drop_ntb_resp_role_not_enabled_cnt = %u\n",5184le32_to_cpu(sbuf->ftmr_drop_ntb_resp_role_not_enabled_cnt));5185len += scnprintf(buf + len, buf_len - len,5186"ftmr_drop_tb_resp_role_not_enabled_cnt = %u\n",5187le32_to_cpu(sbuf->ftmr_drop_tb_resp_role_not_enabled_cnt));5188len += scnprintf(buf + len, buf_len - len, "responder_alloc_cnt = %u\n",5189le32_to_cpu(sbuf->responder_alloc_cnt));5190len += scnprintf(buf + len, buf_len - len, "responder_alloc_failure = %u\n",5191le32_to_cpu(sbuf->responder_alloc_failure));5192len += scnprintf(buf + len, buf_len - len, "responder_terminate_cnt = %u\n",5193le32_to_cpu(sbuf->responder_terminate_cnt));5194len += scnprintf(buf + len, buf_len - len, "active_rsta_open = %u\n",5195le32_to_cpu(sbuf->active_rsta_open));5196len += scnprintf(buf + len, buf_len - len, "active_rsta_mac = %u\n",5197le32_to_cpu(sbuf->active_rsta_mac));5198len += scnprintf(buf + len, buf_len - len, "active_rsta_mac_phy = %u\n",5199le32_to_cpu(sbuf->active_rsta_mac_phy));5200len += scnprintf(buf + len, buf_len - len, "pn_check_failure_cnt = %u\n",5201le32_to_cpu(sbuf->pn_check_failure_cnt));5202len += scnprintf(buf + len, buf_len - len, "num_assoc_ranging_peers = %u\n",5203le32_to_cpu(sbuf->num_assoc_ranging_peers));5204len += scnprintf(buf + len, buf_len - len, "num_unassoc_ranging_peers = %u\n",5205le32_to_cpu(sbuf->num_unassoc_ranging_peers));5206len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_recv_cnt = %u\n",5207le32_to_cpu(sbuf->pasn_m1_auth_recv_cnt));5208len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_drop_cnt = %u\n",5209le32_to_cpu(sbuf->pasn_m1_auth_drop_cnt));5210len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_recv_cnt = %u\n",5211le32_to_cpu(sbuf->pasn_m2_auth_recv_cnt));5212len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_tx_fail_cnt = %u\n",5213le32_to_cpu(sbuf->pasn_m2_auth_tx_fail_cnt));5214len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_recv_cnt = %u\n",5215le32_to_cpu(sbuf->pasn_m3_auth_recv_cnt));5216len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_drop_cnt = %u\n",5217le32_to_cpu(sbuf->pasn_m3_auth_drop_cnt));5218len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_request_cnt = %u\n",5219le32_to_cpu(sbuf->pasn_peer_create_request_cnt));5220len += scnprintf(buf + len, buf_len - len, "pasn_peer_created_cnt = %u\n",5221le32_to_cpu(sbuf->pasn_peer_created_cnt));5222len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_timeout_cnt = %u\n",5223le32_to_cpu(sbuf->pasn_peer_create_timeout_cnt));5224len += scnprintf(buf + len, buf_len - len,5225"sec_ranging_not_supported_mfp_not_setup = %u\n",5226le32_to_cpu(sbuf->sec_ranging_not_supported_mfp_not_setup));5227len += scnprintf(buf + len, buf_len - len,5228"non_sec_ranging_discarded_for_assoc_peer_with_mfpr_set = %u\n",5229le32_to_cpu(sbuf->non_sec_ranging_discarded_for_assoc_peer));5230len += scnprintf(buf + len, buf_len - len,5231"open_ranging_discarded_with_URNM_MFPR_set_for_pasn_peer = %u\n",5232le32_to_cpu(sbuf->open_ranging_discarded_set_for_pasn_peer));5233len += scnprintf(buf + len, buf_len - len,5234"unassoc_non_pasn_ranging_not_supported_with_URNM_MFPR = %u\n",5235le32_to_cpu(sbuf->unassoc_non_pasn_ranging_not_supported));5236len += scnprintf(buf + len, buf_len - len, "invalid_ftm_request_params = %u\n",5237le32_to_cpu(sbuf->invalid_ftm_request_params));5238len += scnprintf(buf + len, buf_len - len,5239"requested_bw_format_not_supported = %u\n",5240le32_to_cpu(sbuf->requested_bw_format_not_supported));5241len += scnprintf(buf + len, buf_len - len,5242"ntb_unsec_unassoc_mode_ranging_peer_alloc_failed = %u\n",5243le32_to_cpu(sbuf->ntb_unsec_unassoc_ranging_peer_alloc_failed));5244len += scnprintf(buf + len, buf_len - len,5245"tb_unassoc_unsec_mode_pasn_peer_creation_failed = %u\n",5246le32_to_cpu(sbuf->tb_unassoc_unsec_pasn_peer_creation_failed));5247len += scnprintf(buf + len, buf_len - len,5248"num_ranging_sequences_processed = %u\n",5249le32_to_cpu(sbuf->num_ranging_sequences_processed));5250len += scnprintf(buf + len, buf_len - len, "ndp_rx_cnt = %u\n",5251le32_to_cpu(sbuf->ndp_rx_cnt));5252len += scnprintf(buf + len, buf_len - len, "num_req_bw_20_MHz = %u\n",5253le32_to_cpu(sbuf->num_req_bw_20_mhz));5254len += scnprintf(buf + len, buf_len - len, "num_req_bw_40_MHz = %u\n",5255le32_to_cpu(sbuf->num_req_bw_40_mhz));5256len += scnprintf(buf + len, buf_len - len, "num_req_bw_80_MHz = %u\n",5257le32_to_cpu(sbuf->num_req_bw_80_mhz));5258len += scnprintf(buf + len, buf_len - len, "num_req_bw_160_MHz = %u\n",5259le32_to_cpu(sbuf->num_req_bw_160_mhz));5260len += scnprintf(buf + len, buf_len - len, "ntb_tx_ndp = %u\n",5261le32_to_cpu(sbuf->ntb_tx_ndp));5262len += scnprintf(buf + len, buf_len - len, "num_ntb_ranging_NDPAs_recv = %u\n",5263le32_to_cpu(sbuf->num_ntb_ranging_ndpas_recv));5264len += scnprintf(buf + len, buf_len - len, "recv_lmr = %u\n",5265le32_to_cpu(sbuf->recv_lmr));5266len += scnprintf(buf + len, buf_len - len, "invalid_ftmr_cnt = %u\n",5267le32_to_cpu(sbuf->invalid_ftmr_cnt));5268len += scnprintf(buf + len, buf_len - len, "max_time_bw_meas_exp_cnt = %u\n\n",5269le32_to_cpu(sbuf->max_time_bw_meas_exp_cnt));52705271stats_req->buf_len = len;5272}52735274static void5275ath12k_htt_print_pdev_rtt_init_stats_tlv(const void *tag_buf, u16 tag_len,5276struct debug_htt_stats_req *stats_req)5277{5278const struct ath12k_htt_stats_pdev_rtt_init_stats_tlv *htt_stats_buf = tag_buf;5279u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5280u32 len = stats_req->buf_len;5281u8 *buf = stats_req->buf, i;5282__le32 sch_fail;52835284if (tag_len < sizeof(*htt_stats_buf))5285return;52865287len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_RTT_INIT_STATS_TLV:\n");5288len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",5289le32_to_cpu(htt_stats_buf->pdev_id));5290len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftmr_cnt = %u\n",5291le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_cnt));5292len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftmr_fail = %u\n",5293le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_fail));5294len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftmr_suc_retry = %u\n",5295le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_suc_retry));5296len += scnprintf(buf + len, buf_len - len, "rx_11mc_ftm_cnt = %u\n",5297le32_to_cpu(htt_stats_buf->rx_11mc_ftm_cnt));5298len += scnprintf(buf + len, buf_len - len, "rx_11az_ftm_cnt = %u\n",5299le32_to_cpu(htt_stats_buf->rx_11az_ftm_cnt));5300len += scnprintf(buf + len, buf_len - len, "initiator_terminate_cnt = %u\n",5301le32_to_cpu(htt_stats_buf->initiator_terminate_cnt));5302len += scnprintf(buf + len, buf_len - len, "tx_meas_req_count = %u\n",5303le32_to_cpu(htt_stats_buf->tx_meas_req_count));5304len += scnprintf(buf + len, buf_len - len, "tx_11az_ftmr_start = %u\n",5305le32_to_cpu(htt_stats_buf->tx_11az_ftmr_start));5306len += scnprintf(buf + len, buf_len - len, "tx_11az_ftmr_stop = %u\n",5307le32_to_cpu(htt_stats_buf->tx_11az_ftmr_stop));5308len += scnprintf(buf + len, buf_len - len, "tx_11az_ftmr_fail = %u\n",5309le32_to_cpu(htt_stats_buf->tx_11az_ftmr_fail));5310len += scnprintf(buf + len, buf_len - len,5311"ftmr_tx_failed_null_11az_peer = %u\n",5312le32_to_cpu(htt_stats_buf->ftmr_tx_failed_null_11az_peer));5313len += scnprintf(buf + len, buf_len - len, "ftmr_retry_timeout = %u\n",5314le32_to_cpu(htt_stats_buf->ftmr_retry_timeout));5315len += scnprintf(buf + len, buf_len - len, "ftm_parse_failure = %u\n",5316le32_to_cpu(htt_stats_buf->ftm_parse_failure));5317len += scnprintf(buf + len, buf_len - len, "incompatible_ftm_params = %u\n",5318le32_to_cpu(htt_stats_buf->incompatible_ftm_params));5319len += scnprintf(buf + len, buf_len - len,5320"ranging_negotiation_successful_cnt = %u\n",5321le32_to_cpu(htt_stats_buf->ranging_negotiation_successful_cnt));5322len += scnprintf(buf + len, buf_len - len, "active_ista = %u\n",5323le32_to_cpu(htt_stats_buf->active_ista));5324len += scnprintf(buf + len, buf_len - len, "init_role_not_enabled = %u\n",5325le32_to_cpu(htt_stats_buf->init_role_not_enabled));5326len += scnprintf(buf + len, buf_len - len, "invalid_preamble = %u\n",5327le32_to_cpu(htt_stats_buf->invalid_preamble));5328len += scnprintf(buf + len, buf_len - len, "invalid_chan_bw_format = %u\n",5329le32_to_cpu(htt_stats_buf->invalid_chan_bw_format));5330len += scnprintf(buf + len, buf_len - len, "mgmt_buff_alloc_fail_cnt = %u\n",5331le32_to_cpu(htt_stats_buf->mgmt_buff_alloc_fail_cnt));5332len += scnprintf(buf + len, buf_len - len, "sec_ranging_req_in_open_mode = %u\n",5333le32_to_cpu(htt_stats_buf->sec_ranging_req_in_open_mode));5334len += scnprintf(buf + len, buf_len - len, "max_time_bw_meas_exp_cnt = %u\n",5335le32_to_cpu(htt_stats_buf->max_time_bw_meas_exp_cnt));5336len += scnprintf(buf + len, buf_len - len, "num_tb_ranging_requests = %u\n",5337le32_to_cpu(htt_stats_buf->num_tb_ranging_requests));5338len += scnprintf(buf + len, buf_len - len, "tb_meas_duration_expiry_cnt = %u\n",5339le32_to_cpu(htt_stats_buf->tb_meas_duration_expiry_cnt));5340len += scnprintf(buf + len, buf_len - len, "ntbr_triggered_successfully = %u\n",5341le32_to_cpu(htt_stats_buf->ntbr_triggered_successfully));5342len += scnprintf(buf + len, buf_len - len, "ntbr_trigger_failed = %u\n",5343le32_to_cpu(htt_stats_buf->ntbr_trigger_failed));5344len += scnprintf(buf + len, buf_len - len, "invalid_or_no_vreg_idx = %u\n",5345le32_to_cpu(htt_stats_buf->invalid_or_no_vreg_idx));5346len += scnprintf(buf + len, buf_len - len, "set_vreg_params_failed = %u\n",5347le32_to_cpu(htt_stats_buf->set_vreg_params_failed));5348len += scnprintf(buf + len, buf_len - len, "sac_mismatch = %u\n",5349le32_to_cpu(htt_stats_buf->sac_mismatch));5350len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_recv_cnt = %u\n",5351le32_to_cpu(htt_stats_buf->pasn_m1_auth_recv_cnt));5352len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_tx_fail_cnt = %u\n",5353le32_to_cpu(htt_stats_buf->pasn_m1_auth_tx_fail_cnt));5354len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_recv_cnt = %u\n",5355le32_to_cpu(htt_stats_buf->pasn_m2_auth_recv_cnt));5356len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_drop_cnt = %u\n",5357le32_to_cpu(htt_stats_buf->pasn_m2_auth_drop_cnt));5358len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_recv_cnt = %u\n",5359le32_to_cpu(htt_stats_buf->pasn_m3_auth_recv_cnt));5360len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_tx_fail_cnt = %u\n",5361le32_to_cpu(htt_stats_buf->pasn_m3_auth_tx_fail_cnt));5362len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_request_cnt = %u\n",5363le32_to_cpu(htt_stats_buf->pasn_peer_create_request_cnt));5364len += scnprintf(buf + len, buf_len - len, "pasn_peer_created_cnt = %u\n",5365le32_to_cpu(htt_stats_buf->pasn_peer_created_cnt));5366len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_timeout_cnt = %u\n",5367le32_to_cpu(htt_stats_buf->pasn_peer_create_timeout_cnt));5368len += scnprintf(buf + len, buf_len - len, "ntbr_ndpa_failed = %u\n",5369le32_to_cpu(htt_stats_buf->ntbr_ndpa_failed));5370len += scnprintf(buf + len, buf_len - len, "ntbr_sequence_successful = %u\n",5371le32_to_cpu(htt_stats_buf->ntbr_sequence_successful));5372len += scnprintf(buf + len, buf_len - len, "ntbr_ndp_failed = %u\n",5373le32_to_cpu(htt_stats_buf->ntbr_ndp_failed));5374len += scnprintf(buf + len, buf_len - len, "num_tb_ranging_NDPAs_recv = %u\n",5375le32_to_cpu(htt_stats_buf->num_tb_ranging_ndpas_recv));5376len += scnprintf(buf + len, buf_len - len, "ndp_rx_cnt = %u\n",5377le32_to_cpu(htt_stats_buf->ndp_rx_cnt));5378len += scnprintf(buf + len, buf_len - len, "num_trigger_frames_received = %u\n",5379le32_to_cpu(htt_stats_buf->num_trigger_frames_received));5380for (i = 0; i < (ATH12K_HTT_SCH_CMD_STATUS_CNT - 1); i++)5381len += scnprintf(buf + len, buf_len - len,5382"num_sch_cmd_status_%d = %u\n", i,5383le32_to_cpu(htt_stats_buf->sch_cmd_status_cnts[i]));5384sch_fail = htt_stats_buf->sch_cmd_status_cnts[ATH12K_HTT_SCH_CMD_STATUS_CNT - 1];5385len += scnprintf(buf + len, buf_len - len,5386"num_sch_cmd_status_other_failure = %u\n",5387le32_to_cpu(sch_fail));5388len += scnprintf(buf + len, buf_len - len, "lmr_timeout = %u\n",5389le32_to_cpu(htt_stats_buf->lmr_timeout));5390len += scnprintf(buf + len, buf_len - len, "lmr_recv = %u\n\n",5391le32_to_cpu(htt_stats_buf->lmr_recv));53925393stats_req->buf_len = len;5394}53955396static void5397ath12k_htt_print_pdev_rtt_hw_stats_tlv(const void *tag_buf, u16 tag_len,5398struct debug_htt_stats_req *stats_req)5399{5400const struct ath12k_htt_stats_pdev_rtt_hw_stats_tlv *htt_stats_buf = tag_buf;5401u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5402u32 len = stats_req->buf_len;5403u8 *buf = stats_req->buf;54045405if (tag_len < sizeof(*htt_stats_buf))5406return;54075408len += scnprintf(buf + len, buf_len - len, "HTT_STATS_PDEV_RTT_HW_STATS_TAG:\n");5409len += scnprintf(buf + len, buf_len - len, "ista_ranging_ndpa_cnt = %u\n",5410le32_to_cpu(htt_stats_buf->ista_ranging_ndpa_cnt));5411len += scnprintf(buf + len, buf_len - len, "ista_ranging_ndp_cnt = %u\n",5412le32_to_cpu(htt_stats_buf->ista_ranging_ndp_cnt));5413len += scnprintf(buf + len, buf_len - len, "ista_ranging_i2r_lmr_cnt = %u\n",5414le32_to_cpu(htt_stats_buf->ista_ranging_i2r_lmr_cnt));5415len += scnprintf(buf + len, buf_len - len, "rtsa_ranging_resp_cnt = %u\n",5416le32_to_cpu(htt_stats_buf->rtsa_ranging_resp_cnt));5417len += scnprintf(buf + len, buf_len - len, "rtsa_ranging_ndp_cnt = %u\n",5418le32_to_cpu(htt_stats_buf->rtsa_ranging_ndp_cnt));5419len += scnprintf(buf + len, buf_len - len, "rsta_ranging_lmr_cnt = %u\n",5420le32_to_cpu(htt_stats_buf->rsta_ranging_lmr_cnt));5421len += scnprintf(buf + len, buf_len - len, "tb_ranging_cts2s_rcvd_cnt = %u\n",5422le32_to_cpu(htt_stats_buf->tb_ranging_cts2s_rcvd_cnt));5423len += scnprintf(buf + len, buf_len - len, "tb_ranging_ndp_rcvd_cnt = %u\n",5424le32_to_cpu(htt_stats_buf->tb_ranging_ndp_rcvd_cnt));5425len += scnprintf(buf + len, buf_len - len, "tb_ranging_lmr_rcvd_cnt = %u\n",5426le32_to_cpu(htt_stats_buf->tb_ranging_lmr_rcvd_cnt));5427len += scnprintf(buf + len, buf_len - len,5428"tb_ranging_tf_poll_resp_sent_cnt = %u\n",5429le32_to_cpu(htt_stats_buf->tb_ranging_tf_poll_resp_sent_cnt));5430len += scnprintf(buf + len, buf_len - len,5431"tb_ranging_tf_sound_resp_sent_cnt = %u\n",5432le32_to_cpu(htt_stats_buf->tb_ranging_tf_sound_resp_sent_cnt));5433len += scnprintf(buf + len, buf_len - len,5434"tb_ranging_tf_report_resp_sent_cnt = %u\n\n",5435le32_to_cpu(htt_stats_buf->tb_ranging_tf_report_resp_sent_cnt));54365437stats_req->buf_len = len;5438}54395440static void5441ath12k_htt_print_pdev_rtt_tbr_selfgen_queued_stats_tlv(const void *tag_buf, u16 tag_len,5442struct debug_htt_stats_req *req)5443{5444const struct ath12k_htt_stats_pdev_rtt_tbr_tlv *sbuf = tag_buf;5445u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5446u32 len = req->buf_len;5447u8 *buf = req->buf;54485449if (tag_len < sizeof(*sbuf))5450return;54515452len += scnprintf(buf + len, buf_len - len,5453"HTT_STATS_PDEV_RTT_TBR_SELFGEN_QUEUED_STATS_TAG:\n");5454len += scnprintf(buf + len, buf_len - len, "SU poll = %u\n",5455le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_POLL]));5456len += scnprintf(buf + len, buf_len - len, "SU sound = %u\n",5457le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_SOUND]));5458len += scnprintf(buf + len, buf_len - len, "SU NDPA = %u\n",5459le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_NDPA]));5460len += scnprintf(buf + len, buf_len - len, "SU NDP = %u\n",5461le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_NDP]));5462len += scnprintf(buf + len, buf_len - len, "SU LMR = %u\n",5463le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_LMR]));5464len += scnprintf(buf + len, buf_len - len, "SU TF_REPORT = %u\n",5465le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_RPRT]));5466len += scnprintf(buf + len, buf_len - len, "MU poll = %u\n",5467le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_POLL]));5468len += scnprintf(buf + len, buf_len - len, "MU sound = %u\n",5469le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_SOUND]));5470len += scnprintf(buf + len, buf_len - len, "MU NDPA = %u\n",5471le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_NDPA]));5472len += scnprintf(buf + len, buf_len - len, "MU NDP = %u\n",5473le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_NDP]));5474len += scnprintf(buf + len, buf_len - len, "MU LMR = %u\n",5475le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_LMR]));5476len += scnprintf(buf + len, buf_len - len, "MU TF_REPORT = %u\n\n",5477le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_RPRT]));54785479req->buf_len = len;5480}54815482static void5483ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(const void *tag_buf, u16 tag_len,5484struct debug_htt_stats_req *stats_req)5485{5486const struct ath12k_htt_stats_pdev_rtt_tbr_cmd_result_stats_tlv *sbuf = tag_buf;5487u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;5488u32 len = stats_req->buf_len;5489u8 *buf = stats_req->buf, i;54905491if (tag_len < sizeof(*sbuf))5492return;54935494len += scnprintf(buf + len, buf_len - len,5495"HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG:\n");5496for (i = 0; i < le32_to_cpu(sbuf->tbr_num_sch_cmd_result_buckets); i++) {5497len += scnprintf(buf + len, buf_len - len, "num_sch_cmd_status_%u:\n", i);5498len += scnprintf(buf + len, buf_len - len,5499"SU frame_SGEN_TF_POLL = %u\n",5500le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_POLL][i]));5501len += scnprintf(buf + len, buf_len - len,5502"SU frame_SGEN_TF_SOUND = %u\n",5503le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_SOUND][i]));5504len += scnprintf(buf + len, buf_len - len,5505"SU frame_SGEN_TBR_NDPA = %u\n",5506le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_NDPA][i]));5507len += scnprintf(buf + len, buf_len - len,5508"SU frame_SGEN_TBR_NDP = %u\n",5509le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_NDP][i]));5510len += scnprintf(buf + len, buf_len - len,5511"SU frame_SGEN_TBR_LMR = %u\n",5512le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_LMR][i]));5513len += scnprintf(buf + len, buf_len - len,5514"SU frame_SGEN_TF_REPORT = %u\n",5515le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_RPRT][i]));5516len += scnprintf(buf + len, buf_len - len,5517"MU frame_SGEN_TF_POLL = %u\n",5518le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_POLL][i]));5519len += scnprintf(buf + len, buf_len - len,5520"MU frame_SGEN_TF_SOUND = %u\n",5521le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_SOUND][i]));5522len += scnprintf(buf + len, buf_len - len,5523"MU frame_SGEN_TBR_NDPA = %u\n",5524le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_NDPA][i]));5525len += scnprintf(buf + len, buf_len - len,5526"MU frame_SGEN_TBR_NDP = %u\n",5527le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_NDP][i]));5528len += scnprintf(buf + len, buf_len - len,5529"MU frame_SGEN_TBR_LMR = %u\n",5530le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_LMR][i]));5531len += scnprintf(buf + len, buf_len - len,5532"MU frame_SGEN_TF_REPORT = %u\n\n",5533le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_RPRT][i]));5534}55355536stats_req->buf_len = len;5537}55385539static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,5540u16 tag, u16 len, const void *tag_buf,5541void *user_data)5542{5543struct debug_htt_stats_req *stats_req = user_data;55445545switch (tag) {5546case HTT_STATS_TX_PDEV_CMN_TAG:5547htt_print_tx_pdev_stats_cmn_tlv(tag_buf, len, stats_req);5548break;5549case HTT_STATS_TX_PDEV_UNDERRUN_TAG:5550htt_print_tx_pdev_stats_urrn_tlv(tag_buf, len, stats_req);5551break;5552case HTT_STATS_TX_PDEV_SIFS_TAG:5553htt_print_tx_pdev_stats_sifs_tlv(tag_buf, len, stats_req);5554break;5555case HTT_STATS_TX_PDEV_FLUSH_TAG:5556htt_print_tx_pdev_stats_flush_tlv(tag_buf, len, stats_req);5557break;5558case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:5559htt_print_tx_pdev_stats_sifs_hist_tlv(tag_buf, len, stats_req);5560break;5561case HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG:5562htt_print_pdev_ctrl_path_tx_stats_tlv(tag_buf, len, stats_req);5563break;5564case HTT_STATS_MU_PPDU_DIST_TAG:5565htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(tag_buf, len, stats_req);5566break;5567case HTT_STATS_TX_SCHED_CMN_TAG:5568ath12k_htt_print_stats_tx_sched_cmn_tlv(tag_buf, len, stats_req);5569break;5570case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:5571ath12k_htt_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf, len, stats_req);5572break;5573case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:5574ath12k_htt_print_sched_txq_cmd_posted_tlv(tag_buf, len, stats_req);5575break;5576case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:5577ath12k_htt_print_sched_txq_cmd_reaped_tlv(tag_buf, len, stats_req);5578break;5579case HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG:5580ath12k_htt_print_sched_txq_sched_order_su_tlv(tag_buf, len, stats_req);5581break;5582case HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG:5583ath12k_htt_print_sched_txq_sched_ineligibility_tlv(tag_buf, len,5584stats_req);5585break;5586case HTT_STATS_SCHED_TXQ_SUPERCYCLE_TRIGGER_TAG:5587ath12k_htt_print_sched_txq_supercycle_trigger_tlv(tag_buf, len,5588stats_req);5589break;5590case HTT_STATS_HW_PDEV_ERRS_TAG:5591ath12k_htt_print_hw_stats_pdev_errs_tlv(tag_buf, len, stats_req);5592break;5593case HTT_STATS_HW_INTR_MISC_TAG:5594ath12k_htt_print_hw_stats_intr_misc_tlv(tag_buf, len, stats_req);5595break;5596case HTT_STATS_WHAL_TX_TAG:5597ath12k_htt_print_hw_stats_whal_tx_tlv(tag_buf, len, stats_req);5598break;5599case HTT_STATS_HW_WAR_TAG:5600ath12k_htt_print_hw_war_tlv(tag_buf, len, stats_req);5601break;5602case HTT_STATS_TX_TQM_CMN_TAG:5603ath12k_htt_print_tx_tqm_cmn_stats_tlv(tag_buf, len, stats_req);5604break;5605case HTT_STATS_TX_TQM_ERROR_STATS_TAG:5606ath12k_htt_print_tx_tqm_error_stats_tlv(tag_buf, len, stats_req);5607break;5608case HTT_STATS_TX_TQM_GEN_MPDU_TAG:5609ath12k_htt_print_tx_tqm_gen_mpdu_stats_tlv(tag_buf, len, stats_req);5610break;5611case HTT_STATS_TX_TQM_LIST_MPDU_TAG:5612ath12k_htt_print_tx_tqm_list_mpdu_stats_tlv(tag_buf, len, stats_req);5613break;5614case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:5615ath12k_htt_print_tx_tqm_list_mpdu_cnt_tlv(tag_buf, len, stats_req);5616break;5617case HTT_STATS_TX_TQM_PDEV_TAG:5618ath12k_htt_print_tx_tqm_pdev_stats_tlv(tag_buf, len, stats_req);5619break;5620case HTT_STATS_TX_DE_CMN_TAG:5621ath12k_htt_print_tx_de_cmn_stats_tlv(tag_buf, len, stats_req);5622break;5623case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:5624ath12k_htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, len, stats_req);5625break;5626case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:5627ath12k_htt_print_tx_de_classify_stats_tlv(tag_buf, len, stats_req);5628break;5629case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:5630ath12k_htt_print_tx_de_classify_failed_stats_tlv(tag_buf, len, stats_req);5631break;5632case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:5633ath12k_htt_print_tx_de_classify_status_stats_tlv(tag_buf, len, stats_req);5634break;5635case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:5636ath12k_htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, len, stats_req);5637break;5638case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:5639ath12k_htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, len, stats_req);5640break;5641case HTT_STATS_TX_DE_COMPL_STATS_TAG:5642ath12k_htt_print_tx_de_compl_stats_tlv(tag_buf, len, stats_req);5643break;5644case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:5645ath12k_htt_print_tx_selfgen_cmn_stats_tlv(tag_buf, len, stats_req);5646break;5647case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:5648ath12k_htt_print_tx_selfgen_ac_stats_tlv(tag_buf, len, stats_req);5649break;5650case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:5651ath12k_htt_print_tx_selfgen_ax_stats_tlv(tag_buf, len, stats_req);5652break;5653case HTT_STATS_TX_SELFGEN_BE_STATS_TAG:5654ath12k_htt_print_tx_selfgen_be_stats_tlv(tag_buf, len, stats_req);5655break;5656case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:5657ath12k_htt_print_tx_selfgen_ac_err_stats_tlv(tag_buf, len, stats_req);5658break;5659case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:5660ath12k_htt_print_tx_selfgen_ax_err_stats_tlv(tag_buf, len, stats_req);5661break;5662case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:5663ath12k_htt_print_tx_selfgen_be_err_stats_tlv(tag_buf, len, stats_req);5664break;5665case HTT_STATS_TX_SELFGEN_AC_SCHED_STATUS_STATS_TAG:5666ath12k_htt_print_tx_selfgen_ac_sched_status_stats_tlv(tag_buf, len,5667stats_req);5668break;5669case HTT_STATS_TX_SELFGEN_AX_SCHED_STATUS_STATS_TAG:5670ath12k_htt_print_tx_selfgen_ax_sched_status_stats_tlv(tag_buf, len,5671stats_req);5672break;5673case HTT_STATS_TX_SELFGEN_BE_SCHED_STATUS_STATS_TAG:5674ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(tag_buf, len,5675stats_req);5676break;5677case HTT_STATS_STRING_TAG:5678ath12k_htt_print_stats_string_tlv(tag_buf, len, stats_req);5679break;5680case HTT_STATS_SRING_STATS_TAG:5681ath12k_htt_print_sring_stats_tlv(tag_buf, len, stats_req);5682break;5683case HTT_STATS_SFM_CMN_TAG:5684ath12k_htt_print_sfm_cmn_tlv(tag_buf, len, stats_req);5685break;5686case HTT_STATS_SFM_CLIENT_TAG:5687ath12k_htt_print_sfm_client_tlv(tag_buf, len, stats_req);5688break;5689case HTT_STATS_SFM_CLIENT_USER_TAG:5690ath12k_htt_print_sfm_client_user_tlv(tag_buf, len, stats_req);5691break;5692case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:5693ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, len, stats_req);5694break;5695case HTT_STATS_TX_PDEV_MUMIMO_GRP_STATS_TAG:5696ath12k_htt_print_tx_pdev_mumimo_grp_stats_tlv(tag_buf, len, stats_req);5697break;5698case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:5699ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, len, stats_req);5700break;5701case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG:5702case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG:5703case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG:5704ath12k_htt_print_pdev_cca_stats_hist_tlv(tag_buf, len, stats_req);5705break;5706case HTT_STATS_PDEV_CCA_COUNTERS_TAG:5707ath12k_htt_print_pdev_stats_cca_counters_tlv(tag_buf, len, stats_req);5708break;5709case HTT_STATS_TX_SOUNDING_STATS_TAG:5710ath12k_htt_print_tx_sounding_stats_tlv(tag_buf, len, stats_req);5711break;5712case HTT_STATS_PDEV_OBSS_PD_TAG:5713ath12k_htt_print_pdev_obss_pd_stats_tlv(tag_buf, len, stats_req);5714break;5715case HTT_STATS_LATENCY_CTX_TAG:5716ath12k_htt_print_latency_prof_ctx_tlv(tag_buf, len, stats_req);5717break;5718case HTT_STATS_LATENCY_CNT_TAG:5719ath12k_htt_print_latency_prof_cnt(tag_buf, len, stats_req);5720break;5721case HTT_STATS_LATENCY_PROF_STATS_TAG:5722ath12k_htt_print_latency_prof_stats_tlv(tag_buf, len, stats_req);5723break;5724case HTT_STATS_RX_PDEV_UL_TRIG_STATS_TAG:5725ath12k_htt_print_ul_ofdma_trigger_stats(tag_buf, len, stats_req);5726break;5727case HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG:5728ath12k_htt_print_ul_ofdma_user_stats(tag_buf, len, stats_req);5729break;5730case HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG:5731ath12k_htt_print_ul_mumimo_trig_stats(tag_buf, len, stats_req);5732break;5733case HTT_STATS_RX_FSE_STATS_TAG:5734ath12k_htt_print_rx_fse_stats_tlv(tag_buf, len, stats_req);5735break;5736case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG:5737ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, len, stats_req);5738break;5739case HTT_STATS_TXBF_OFDMA_AX_NDPA_STATS_TAG:5740ath12k_htt_print_txbf_ofdma_ax_ndpa_stats_tlv(tag_buf, len, stats_req);5741break;5742case HTT_STATS_TXBF_OFDMA_AX_NDP_STATS_TAG:5743ath12k_htt_print_txbf_ofdma_ax_ndp_stats_tlv(tag_buf, len, stats_req);5744break;5745case HTT_STATS_TXBF_OFDMA_AX_BRP_STATS_TAG:5746ath12k_htt_print_txbf_ofdma_ax_brp_stats_tlv(tag_buf, len, stats_req);5747break;5748case HTT_STATS_TXBF_OFDMA_AX_STEER_STATS_TAG:5749ath12k_htt_print_txbf_ofdma_ax_steer_stats_tlv(tag_buf, len, stats_req);5750break;5751case HTT_STATS_TXBF_OFDMA_AX_STEER_MPDU_STATS_TAG:5752ath12k_htt_print_txbf_ofdma_ax_steer_mpdu_stats_tlv(tag_buf, len,5753stats_req);5754break;5755case HTT_STATS_DLPAGER_STATS_TAG:5756ath12k_htt_print_dlpager_stats_tlv(tag_buf, len, stats_req);5757break;5758case HTT_STATS_PHY_STATS_TAG:5759ath12k_htt_print_phy_stats_tlv(tag_buf, len, stats_req);5760break;5761case HTT_STATS_PHY_COUNTERS_TAG:5762ath12k_htt_print_phy_counters_tlv(tag_buf, len, stats_req);5763break;5764case HTT_STATS_PHY_RESET_STATS_TAG:5765ath12k_htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req);5766break;5767case HTT_STATS_PHY_RESET_COUNTERS_TAG:5768ath12k_htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req);5769break;5770case HTT_STATS_PHY_TPC_STATS_TAG:5771ath12k_htt_print_phy_tpc_stats_tlv(tag_buf, len, stats_req);5772break;5773case HTT_STATS_SOC_TXRX_STATS_COMMON_TAG:5774ath12k_htt_print_soc_txrx_stats_common_tlv(tag_buf, len, stats_req);5775break;5776case HTT_STATS_PER_RATE_STATS_TAG:5777ath12k_htt_print_tx_per_rate_stats_tlv(tag_buf, len, stats_req);5778break;5779case HTT_STATS_AST_ENTRY_TAG:5780ath12k_htt_print_ast_entry_tlv(tag_buf, len, stats_req);5781break;5782case HTT_STATS_PDEV_PUNCTURE_STATS_TAG:5783ath12k_htt_print_puncture_stats_tlv(tag_buf, len, stats_req);5784break;5785case HTT_STATS_DMAC_RESET_STATS_TAG:5786ath12k_htt_print_dmac_reset_stats_tlv(tag_buf, len, stats_req);5787break;5788case HTT_STATS_PDEV_SCHED_ALGO_OFDMA_STATS_TAG:5789ath12k_htt_print_pdev_sched_algo_ofdma_stats_tlv(tag_buf, len, stats_req);5790break;5791case HTT_STATS_TX_PDEV_RATE_STATS_BE_OFDMA_TAG:5792ath12k_htt_print_tx_pdev_rate_stats_be_ofdma_tlv(tag_buf, len, stats_req);5793break;5794case HTT_STATS_PDEV_MBSSID_CTRL_FRAME_STATS_TAG:5795ath12k_htt_print_pdev_mbssid_ctrl_frame_stats_tlv(tag_buf, len,5796stats_req);5797break;5798case HTT_STATS_TX_PDEV_RATE_STATS_TAG:5799ath12k_htt_print_tx_pdev_rate_stats_tlv(tag_buf, len, stats_req);5800break;5801case HTT_STATS_TX_PDEV_HISTOGRAM_STATS_TAG:5802ath12k_htt_print_histogram_stats_tlv(tag_buf, len, stats_req);5803break;5804case HTT_STATS_RX_PDEV_RATE_STATS_TAG:5805ath12k_htt_print_rx_pdev_rate_stats_tlv(tag_buf, len, stats_req);5806break;5807case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:5808ath12k_htt_print_rx_pdev_rate_ext_stats_tlv(tag_buf, len, stats_req);5809break;5810case HTT_STATS_PDEV_TDMA_TAG:5811ath12k_htt_print_pdev_tdma_stats_tlv(tag_buf, len, stats_req);5812break;5813case HTT_STATS_MLO_SCHED_STATS_TAG:5814ath12k_htt_print_mlo_sched_stats_tlv(tag_buf, len, stats_req);5815break;5816case HTT_STATS_PDEV_MLO_IPC_STATS_TAG:5817ath12k_htt_print_mlo_ipc_stats_tlv(tag_buf, len, stats_req);5818break;5819case HTT_STATS_PDEV_RTT_RESP_STATS_TAG:5820ath12k_htt_print_pdev_rtt_resp_stats_tlv(tag_buf, len, stats_req);5821break;5822case HTT_STATS_PDEV_RTT_INIT_STATS_TAG:5823ath12k_htt_print_pdev_rtt_init_stats_tlv(tag_buf, len, stats_req);5824break;5825case HTT_STATS_PDEV_RTT_HW_STATS_TAG:5826ath12k_htt_print_pdev_rtt_hw_stats_tlv(tag_buf, len, stats_req);5827break;5828case HTT_STATS_PDEV_RTT_TBR_SELFGEN_QUEUED_STATS_TAG:5829ath12k_htt_print_pdev_rtt_tbr_selfgen_queued_stats_tlv(tag_buf, len,5830stats_req);5831break;5832case HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG:5833ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(tag_buf, len, stats_req);5834break;5835default:5836break;5837}58385839return 0;5840}58415842void ath12k_debugfs_htt_ext_stats_handler(struct ath12k_base *ab,5843struct sk_buff *skb)5844{5845struct ath12k_htt_extd_stats_msg *msg;5846struct debug_htt_stats_req *stats_req;5847struct ath12k *ar;5848u32 len, pdev_id, stats_info;5849u64 cookie;5850int ret;5851bool send_completion = false;58525853msg = (struct ath12k_htt_extd_stats_msg *)skb->data;5854cookie = le64_to_cpu(msg->cookie);58555856if (u64_get_bits(cookie, ATH12K_HTT_STATS_COOKIE_MSB) !=5857ATH12K_HTT_STATS_MAGIC_VALUE) {5858ath12k_warn(ab, "received invalid htt ext stats event\n");5859return;5860}58615862pdev_id = u64_get_bits(cookie, ATH12K_HTT_STATS_COOKIE_LSB);5863rcu_read_lock();5864ar = ath12k_mac_get_ar_by_pdev_id(ab, pdev_id);5865if (!ar) {5866ath12k_warn(ab, "failed to get ar for pdev_id %d\n", pdev_id);5867goto exit;5868}58695870stats_req = ar->debug.htt_stats.stats_req;5871if (!stats_req)5872goto exit;58735874spin_lock_bh(&ar->data_lock);58755876stats_info = le32_to_cpu(msg->info1);5877stats_req->done = u32_get_bits(stats_info, ATH12K_HTT_T2H_EXT_STATS_INFO1_DONE);5878if (stats_req->done)5879send_completion = true;58805881spin_unlock_bh(&ar->data_lock);58825883len = u32_get_bits(stats_info, ATH12K_HTT_T2H_EXT_STATS_INFO1_LENGTH);5884if (len > skb->len) {5885ath12k_warn(ab, "invalid length %d for HTT stats", len);5886goto exit;5887}58885889ret = ath12k_dp_htt_tlv_iter(ab, msg->data, len,5890ath12k_dbg_htt_ext_stats_parse,5891stats_req);5892if (ret)5893ath12k_warn(ab, "Failed to parse tlv %d\n", ret);58945895if (send_completion)5896complete(&stats_req->htt_stats_rcvd);5897exit:5898rcu_read_unlock();5899}59005901static ssize_t ath12k_read_htt_stats_type(struct file *file,5902char __user *user_buf,5903size_t count, loff_t *ppos)5904{5905struct ath12k *ar = file->private_data;5906enum ath12k_dbg_htt_ext_stats_type type;5907char buf[32];5908size_t len;59095910wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);5911type = ar->debug.htt_stats.type;5912wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);59135914len = scnprintf(buf, sizeof(buf), "%u\n", type);59155916return simple_read_from_buffer(user_buf, count, ppos, buf, len);5917}59185919static ssize_t ath12k_write_htt_stats_type(struct file *file,5920const char __user *user_buf,5921size_t count, loff_t *ppos)5922{5923struct ath12k *ar = file->private_data;5924enum ath12k_dbg_htt_ext_stats_type type;5925unsigned int cfg_param[4] = {};5926const int size = 32;5927int num_args;59285929if (count > size)5930return -EINVAL;59315932char *buf __free(kfree) = kzalloc(size, GFP_KERNEL);5933if (!buf)5934return -ENOMEM;59355936if (copy_from_user(buf, user_buf, count))5937return -EFAULT;59385939num_args = sscanf(buf, "%u %u %u %u %u\n", &type, &cfg_param[0],5940&cfg_param[1], &cfg_param[2], &cfg_param[3]);5941if (!num_args || num_args > 5)5942return -EINVAL;59435944if (type == ATH12K_DBG_HTT_EXT_STATS_RESET ||5945type >= ATH12K_DBG_HTT_NUM_EXT_STATS)5946return -EINVAL;59475948wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);59495950ar->debug.htt_stats.type = type;5951ar->debug.htt_stats.cfg_param[0] = cfg_param[0];5952ar->debug.htt_stats.cfg_param[1] = cfg_param[1];5953ar->debug.htt_stats.cfg_param[2] = cfg_param[2];5954ar->debug.htt_stats.cfg_param[3] = cfg_param[3];59555956wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);59575958return count;5959}59605961static const struct file_operations fops_htt_stats_type = {5962.read = ath12k_read_htt_stats_type,5963.write = ath12k_write_htt_stats_type,5964.open = simple_open,5965.owner = THIS_MODULE,5966.llseek = default_llseek,5967};59685969static int ath12k_debugfs_htt_stats_req(struct ath12k *ar)5970{5971struct debug_htt_stats_req *stats_req = ar->debug.htt_stats.stats_req;5972enum ath12k_dbg_htt_ext_stats_type type = stats_req->type;5973u64 cookie;5974int ret, pdev_id;5975struct htt_ext_stats_cfg_params cfg_params = {};59765977lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);59785979init_completion(&stats_req->htt_stats_rcvd);59805981pdev_id = ath12k_mac_get_target_pdev_id(ar);5982stats_req->done = false;5983stats_req->pdev_id = pdev_id;59845985cookie = u64_encode_bits(ATH12K_HTT_STATS_MAGIC_VALUE,5986ATH12K_HTT_STATS_COOKIE_MSB);5987cookie |= u64_encode_bits(pdev_id, ATH12K_HTT_STATS_COOKIE_LSB);59885989if (stats_req->override_cfg_param) {5990cfg_params.cfg0 = stats_req->cfg_param[0];5991cfg_params.cfg1 = stats_req->cfg_param[1];5992cfg_params.cfg2 = stats_req->cfg_param[2];5993cfg_params.cfg3 = stats_req->cfg_param[3];5994}59955996ret = ath12k_dp_tx_htt_h2t_ext_stats_req(ar, type, &cfg_params, cookie);5997if (ret) {5998ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);5999return ret;6000}6001if (!wait_for_completion_timeout(&stats_req->htt_stats_rcvd, 3 * HZ)) {6002spin_lock_bh(&ar->data_lock);6003if (!stats_req->done) {6004stats_req->done = true;6005spin_unlock_bh(&ar->data_lock);6006ath12k_warn(ar->ab, "stats request timed out\n");6007return -ETIMEDOUT;6008}6009spin_unlock_bh(&ar->data_lock);6010}60116012return 0;6013}60146015static int ath12k_open_htt_stats(struct inode *inode,6016struct file *file)6017{6018struct ath12k *ar = inode->i_private;6019struct debug_htt_stats_req *stats_req;6020enum ath12k_dbg_htt_ext_stats_type type = ar->debug.htt_stats.type;6021struct ath12k_hw *ah = ath12k_ar_to_ah(ar);6022int ret;60236024if (type == ATH12K_DBG_HTT_EXT_STATS_RESET)6025return -EPERM;60266027wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);60286029if (ah->state != ATH12K_HW_STATE_ON) {6030ret = -ENETDOWN;6031goto err_unlock;6032}60336034if (ar->debug.htt_stats.stats_req) {6035ret = -EAGAIN;6036goto err_unlock;6037}60386039stats_req = kzalloc(sizeof(*stats_req) + ATH12K_HTT_STATS_BUF_SIZE, GFP_KERNEL);6040if (!stats_req) {6041ret = -ENOMEM;6042goto err_unlock;6043}60446045ar->debug.htt_stats.stats_req = stats_req;6046stats_req->type = type;6047stats_req->cfg_param[0] = ar->debug.htt_stats.cfg_param[0];6048stats_req->cfg_param[1] = ar->debug.htt_stats.cfg_param[1];6049stats_req->cfg_param[2] = ar->debug.htt_stats.cfg_param[2];6050stats_req->cfg_param[3] = ar->debug.htt_stats.cfg_param[3];6051stats_req->override_cfg_param = !!stats_req->cfg_param[0] ||6052!!stats_req->cfg_param[1] ||6053!!stats_req->cfg_param[2] ||6054!!stats_req->cfg_param[3];60556056ret = ath12k_debugfs_htt_stats_req(ar);6057if (ret < 0)6058goto out;60596060file->private_data = stats_req;60616062wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);60636064return 0;6065out:6066kfree(stats_req);6067ar->debug.htt_stats.stats_req = NULL;6068err_unlock:6069wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);60706071return ret;6072}60736074static int ath12k_release_htt_stats(struct inode *inode,6075struct file *file)6076{6077struct ath12k *ar = inode->i_private;60786079wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);6080kfree(file->private_data);6081ar->debug.htt_stats.stats_req = NULL;6082wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);60836084return 0;6085}60866087static ssize_t ath12k_read_htt_stats(struct file *file,6088char __user *user_buf,6089size_t count, loff_t *ppos)6090{6091struct debug_htt_stats_req *stats_req = file->private_data;6092char *buf;6093u32 length;60946095buf = stats_req->buf;6096length = min_t(u32, stats_req->buf_len, ATH12K_HTT_STATS_BUF_SIZE);6097return simple_read_from_buffer(user_buf, count, ppos, buf, length);6098}60996100static const struct file_operations fops_dump_htt_stats = {6101.open = ath12k_open_htt_stats,6102.release = ath12k_release_htt_stats,6103.read = ath12k_read_htt_stats,6104.owner = THIS_MODULE,6105.llseek = default_llseek,6106};61076108static ssize_t ath12k_write_htt_stats_reset(struct file *file,6109const char __user *user_buf,6110size_t count, loff_t *ppos)6111{6112struct ath12k *ar = file->private_data;6113enum ath12k_dbg_htt_ext_stats_type type;6114struct htt_ext_stats_cfg_params cfg_params = {};6115u8 param_pos;6116int ret;61176118ret = kstrtou32_from_user(user_buf, count, 0, &type);6119if (ret)6120return ret;61216122if (type >= ATH12K_DBG_HTT_NUM_EXT_STATS ||6123type == ATH12K_DBG_HTT_EXT_STATS_RESET)6124return -E2BIG;61256126wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);6127cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET;6128param_pos = (type >> 5) + 1;61296130switch (param_pos) {6131case ATH12K_HTT_STATS_RESET_PARAM_CFG_32_BYTES:6132cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type);6133break;6134case ATH12K_HTT_STATS_RESET_PARAM_CFG_64_BYTES:6135cfg_params.cfg2 = ATH12K_HTT_STATS_RESET_BITMAP32_BIT(cfg_params.cfg0 +6136type);6137break;6138case ATH12K_HTT_STATS_RESET_PARAM_CFG_128_BYTES:6139cfg_params.cfg3 = ATH12K_HTT_STATS_RESET_BITMAP64_BIT(cfg_params.cfg0 +6140type);6141break;6142default:6143break;6144}61456146ret = ath12k_dp_tx_htt_h2t_ext_stats_req(ar,6147ATH12K_DBG_HTT_EXT_STATS_RESET,6148&cfg_params,61490ULL);6150if (ret) {6151ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);6152wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);6153return ret;6154}61556156ar->debug.htt_stats.reset = type;6157wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);61586159return count;6160}61616162static const struct file_operations fops_htt_stats_reset = {6163.write = ath12k_write_htt_stats_reset,6164.open = simple_open,6165.owner = THIS_MODULE,6166.llseek = default_llseek,6167};61686169void ath12k_debugfs_htt_stats_register(struct ath12k *ar)6170{6171debugfs_create_file("htt_stats_type", 0600, ar->debug.debugfs_pdev,6172ar, &fops_htt_stats_type);6173debugfs_create_file("htt_stats", 0400, ar->debug.debugfs_pdev,6174ar, &fops_dump_htt_stats);6175debugfs_create_file("htt_stats_reset", 0200, ar->debug.debugfs_pdev,6176ar, &fops_htt_stats_reset);6177}617861796180