Path: blob/main/sys/contrib/dev/athk/ath11k/debugfs_htt_stats.c
48378 views
// SPDX-License-Identifier: BSD-3-Clause-Clear1/*2* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.3* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.4*/56#include <linux/vmalloc.h>7#include "core.h"8#include "dp_tx.h"9#include "dp_rx.h"10#include "debug.h"11#include "debugfs_htt_stats.h"1213#define HTT_MAX_PRINT_CHAR_PER_ELEM 151415#define HTT_TLV_HDR_LEN 41617#define PRINT_ARRAY_TO_BUF(out, buflen, arr, str, len, newline) \18do { \19int index = 0; u8 i; const char *str_val = str; \20const char *new_line = newline; \21if (str_val) { \22index += scnprintf((out + buflen), \23(ATH11K_HTT_STATS_BUF_SIZE - buflen), \24"%s = ", str_val); \25} \26for (i = 0; i < len; i++) { \27index += scnprintf((out + buflen) + index, \28(ATH11K_HTT_STATS_BUF_SIZE - buflen) - index, \29" %u:%u,", i, arr[i]); \30} \31index += scnprintf((out + buflen) + index, \32(ATH11K_HTT_STATS_BUF_SIZE - buflen) - index, \33"%s", new_line); \34buflen += index; \35} while (0)3637static inline void htt_print_stats_string_tlv(const void *tag_buf,38u16 tag_len,39struct debug_htt_stats_req *stats_req)40{41const struct htt_stats_string_tlv *htt_stats_buf = tag_buf;42u8 *buf = stats_req->buf;43u32 len = stats_req->buf_len;44u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;45u8 i;4647tag_len = tag_len >> 2;4849len += scnprintf(buf + len, buf_len - len, "HTT_STATS_STRING_TLV:\n");5051len += scnprintf(buf + len, buf_len - len,52"data = ");53for (i = 0; i < tag_len; i++) {54len += scnprintf(buf + len,55buf_len - len,56"%.*s", 4, (char *)&(htt_stats_buf->data[i]));57}58/* New lines are added for better display */59len += scnprintf(buf + len, buf_len - len, "\n\n");6061if (len >= buf_len)62buf[buf_len - 1] = 0;63else64buf[len] = 0;6566stats_req->buf_len = len;67}6869static inline void htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf,70struct debug_htt_stats_req *stats_req)71{72const struct htt_tx_pdev_stats_cmn_tlv *htt_stats_buf = tag_buf;73u8 *buf = stats_req->buf;74u32 len = stats_req->buf_len;75u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;7677len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_CMN_TLV:\n");78len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",79FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));80len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",81htt_stats_buf->hw_queued);82len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",83htt_stats_buf->hw_reaped);84len += scnprintf(buf + len, buf_len - len, "underrun = %u\n",85htt_stats_buf->underrun);86len += scnprintf(buf + len, buf_len - len, "hw_paused = %u\n",87htt_stats_buf->hw_paused);88len += scnprintf(buf + len, buf_len - len, "hw_flush = %u\n",89htt_stats_buf->hw_flush);90len += scnprintf(buf + len, buf_len - len, "hw_filt = %u\n",91htt_stats_buf->hw_filt);92len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",93htt_stats_buf->tx_abort);94len += scnprintf(buf + len, buf_len - len, "mpdu_requeued = %u\n",95htt_stats_buf->mpdu_requeued);96len += scnprintf(buf + len, buf_len - len, "tx_xretry = %u\n",97htt_stats_buf->tx_xretry);98len += scnprintf(buf + len, buf_len - len, "data_rc = %u\n",99htt_stats_buf->data_rc);100len += scnprintf(buf + len, buf_len - len, "mpdu_dropped_xretry = %u\n",101htt_stats_buf->mpdu_dropped_xretry);102len += scnprintf(buf + len, buf_len - len, "illegal_rate_phy_err = %u\n",103htt_stats_buf->illgl_rate_phy_err);104len += scnprintf(buf + len, buf_len - len, "cont_xretry = %u\n",105htt_stats_buf->cont_xretry);106len += scnprintf(buf + len, buf_len - len, "tx_timeout = %u\n",107htt_stats_buf->tx_timeout);108len += scnprintf(buf + len, buf_len - len, "pdev_resets = %u\n",109htt_stats_buf->pdev_resets);110len += scnprintf(buf + len, buf_len - len, "phy_underrun = %u\n",111htt_stats_buf->phy_underrun);112len += scnprintf(buf + len, buf_len - len, "txop_ovf = %u\n",113htt_stats_buf->txop_ovf);114len += scnprintf(buf + len, buf_len - len, "seq_posted = %u\n",115htt_stats_buf->seq_posted);116len += scnprintf(buf + len, buf_len - len, "seq_failed_queueing = %u\n",117htt_stats_buf->seq_failed_queueing);118len += scnprintf(buf + len, buf_len - len, "seq_completed = %u\n",119htt_stats_buf->seq_completed);120len += scnprintf(buf + len, buf_len - len, "seq_restarted = %u\n",121htt_stats_buf->seq_restarted);122len += scnprintf(buf + len, buf_len - len, "mu_seq_posted = %u\n",123htt_stats_buf->mu_seq_posted);124len += scnprintf(buf + len, buf_len - len, "seq_switch_hw_paused = %u\n",125htt_stats_buf->seq_switch_hw_paused);126len += scnprintf(buf + len, buf_len - len, "next_seq_posted_dsr = %u\n",127htt_stats_buf->next_seq_posted_dsr);128len += scnprintf(buf + len, buf_len - len, "seq_posted_isr = %u\n",129htt_stats_buf->seq_posted_isr);130len += scnprintf(buf + len, buf_len - len, "seq_ctrl_cached = %u\n",131htt_stats_buf->seq_ctrl_cached);132len += scnprintf(buf + len, buf_len - len, "mpdu_count_tqm = %u\n",133htt_stats_buf->mpdu_count_tqm);134len += scnprintf(buf + len, buf_len - len, "msdu_count_tqm = %u\n",135htt_stats_buf->msdu_count_tqm);136len += scnprintf(buf + len, buf_len - len, "mpdu_removed_tqm = %u\n",137htt_stats_buf->mpdu_removed_tqm);138len += scnprintf(buf + len, buf_len - len, "msdu_removed_tqm = %u\n",139htt_stats_buf->msdu_removed_tqm);140len += scnprintf(buf + len, buf_len - len, "mpdus_sw_flush = %u\n",141htt_stats_buf->mpdus_sw_flush);142len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",143htt_stats_buf->mpdus_hw_filter);144len += scnprintf(buf + len, buf_len - len, "mpdus_truncated = %u\n",145htt_stats_buf->mpdus_truncated);146len += scnprintf(buf + len, buf_len - len, "mpdus_ack_failed = %u\n",147htt_stats_buf->mpdus_ack_failed);148len += scnprintf(buf + len, buf_len - len, "mpdus_expired = %u\n",149htt_stats_buf->mpdus_expired);150len += scnprintf(buf + len, buf_len - len, "mpdus_seq_hw_retry = %u\n",151htt_stats_buf->mpdus_seq_hw_retry);152len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",153htt_stats_buf->ack_tlv_proc);154len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt_valid = %u\n",155htt_stats_buf->coex_abort_mpdu_cnt_valid);156len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt = %u\n",157htt_stats_buf->coex_abort_mpdu_cnt);158len += scnprintf(buf + len, buf_len - len, "num_total_ppdus_tried_ota = %u\n",159htt_stats_buf->num_total_ppdus_tried_ota);160len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_tried_ota = %u\n",161htt_stats_buf->num_data_ppdus_tried_ota);162len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_enqued = %u\n",163htt_stats_buf->local_ctrl_mgmt_enqued);164len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_freed = %u\n",165htt_stats_buf->local_ctrl_mgmt_freed);166len += scnprintf(buf + len, buf_len - len, "local_data_enqued = %u\n",167htt_stats_buf->local_data_enqued);168len += scnprintf(buf + len, buf_len - len, "local_data_freed = %u\n",169htt_stats_buf->local_data_freed);170len += scnprintf(buf + len, buf_len - len, "mpdu_tried = %u\n",171htt_stats_buf->mpdu_tried);172len += scnprintf(buf + len, buf_len - len, "isr_wait_seq_posted = %u\n",173htt_stats_buf->isr_wait_seq_posted);174len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_low = %u\n",175htt_stats_buf->tx_active_dur_us_low);176len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_high = %u\n\n",177htt_stats_buf->tx_active_dur_us_high);178179if (len >= buf_len)180buf[buf_len - 1] = 0;181else182buf[len] = 0;183184stats_req->buf_len = len;185}186187static inline void188htt_print_tx_pdev_stats_urrn_tlv_v(const void *tag_buf,189u16 tag_len,190struct debug_htt_stats_req *stats_req)191{192const struct htt_tx_pdev_stats_urrn_tlv_v *htt_stats_buf = tag_buf;193u8 *buf = stats_req->buf;194u32 len = stats_req->buf_len;195u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;196u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_URRN_STATS);197198len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_URRN_TLV_V:\n");199200PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->urrn_stats, "urrn_stats",201num_elems, "\n\n");202203if (len >= buf_len)204buf[buf_len - 1] = 0;205else206buf[len] = 0;207208stats_req->buf_len = len;209}210211static inline void212htt_print_tx_pdev_stats_flush_tlv_v(const void *tag_buf,213u16 tag_len,214struct debug_htt_stats_req *stats_req)215{216const struct htt_tx_pdev_stats_flush_tlv_v *htt_stats_buf = tag_buf;217u8 *buf = stats_req->buf;218u32 len = stats_req->buf_len;219u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;220u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);221222len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_FLUSH_TLV_V:\n");223224PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->flush_errs, "flush_errs",225num_elems, "\n\n");226227if (len >= buf_len)228buf[buf_len - 1] = 0;229else230buf[len] = 0;231232stats_req->buf_len = len;233}234235static inline void236htt_print_tx_pdev_stats_sifs_tlv_v(const void *tag_buf,237u16 tag_len,238struct debug_htt_stats_req *stats_req)239{240const struct htt_tx_pdev_stats_sifs_tlv_v *htt_stats_buf = tag_buf;241u8 *buf = stats_req->buf;242u32 len = stats_req->buf_len;243u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;244u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_SIFS_BURST_STATS);245246len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_SIFS_TLV_V:\n");247248PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sifs_status, "sifs_status",249num_elems, "\n\n");250251if (len >= buf_len)252buf[buf_len - 1] = 0;253else254buf[len] = 0;255256stats_req->buf_len = len;257}258259static inline void260htt_print_tx_pdev_stats_phy_err_tlv_v(const void *tag_buf,261u16 tag_len,262struct debug_htt_stats_req *stats_req)263{264const struct htt_tx_pdev_stats_phy_err_tlv_v *htt_stats_buf = tag_buf;265u8 *buf = stats_req->buf;266u32 len = stats_req->buf_len;267u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;268u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_PHY_ERR_STATS);269270len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:\n");271272PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->phy_errs, "phy_errs",273num_elems, "\n\n");274275if (len >= buf_len)276buf[buf_len - 1] = 0;277else278buf[len] = 0;279280stats_req->buf_len = len;281}282283static inline void284htt_print_tx_pdev_stats_sifs_hist_tlv_v(const void *tag_buf,285u16 tag_len,286struct debug_htt_stats_req *stats_req)287{288const struct htt_tx_pdev_stats_sifs_hist_tlv_v *htt_stats_buf = tag_buf;289u8 *buf = stats_req->buf;290u32 len = stats_req->buf_len;291u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;292u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS);293294len += scnprintf(buf + len, buf_len - len,295"HTT_TX_PDEV_STATS_SIFS_HIST_TLV_V:\n");296297PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sifs_hist_status,298"sifs_hist_status", num_elems, "\n\n");299300if (len >= buf_len)301buf[buf_len - 1] = 0;302else303buf[len] = 0;304305stats_req->buf_len = len;306}307308static inline void309htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(const void *tag_buf,310struct debug_htt_stats_req *stats_req)311{312const struct htt_tx_pdev_stats_tx_ppdu_stats_tlv_v *htt_stats_buf = tag_buf;313u8 *buf = stats_req->buf;314u32 len = stats_req->buf_len;315u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;316317len += scnprintf(buf + len, buf_len - len,318"HTT_TX_PDEV_STATS_TX_PPDU_STATS_TLV_V:\n");319320len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_legacy_su = %u\n",321htt_stats_buf->num_data_ppdus_legacy_su);322323len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ac_su = %u\n",324htt_stats_buf->num_data_ppdus_ac_su);325326len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ax_su = %u\n",327htt_stats_buf->num_data_ppdus_ax_su);328329len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ac_su_txbf = %u\n",330htt_stats_buf->num_data_ppdus_ac_su_txbf);331332len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ax_su_txbf = %u\n\n",333htt_stats_buf->num_data_ppdus_ax_su_txbf);334335if (len >= buf_len)336buf[buf_len - 1] = 0;337else338buf[len] = 0;339340stats_req->buf_len = len;341}342343static inline void344htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(const void *tag_buf,345u16 tag_len,346struct debug_htt_stats_req *stats_req)347{348const struct htt_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v *htt_stats_buf = tag_buf;349u8 *buf = stats_req->buf;350u32 len = stats_req->buf_len;351u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;352u32 num_elements = ((tag_len - sizeof(htt_stats_buf->hist_bin_size)) >> 2);353354len += scnprintf(buf + len, buf_len - len,355"HTT_TX_PDEV_STATS_TRIED_MPDU_CNT_HIST_TLV_V:\n");356len += scnprintf(buf + len, buf_len - len, "TRIED_MPDU_CNT_HIST_BIN_SIZE : %u\n",357htt_stats_buf->hist_bin_size);358359PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tried_mpdu_cnt_hist,360"tried_mpdu_cnt_hist", num_elements, "\n\n");361362if (len >= buf_len)363buf[buf_len - 1] = 0;364else365buf[len] = 0;366367stats_req->buf_len = len;368}369370static inline void htt_print_hw_stats_intr_misc_tlv(const void *tag_buf,371struct debug_htt_stats_req *stats_req)372{373const struct htt_hw_stats_intr_misc_tlv *htt_stats_buf = tag_buf;374u8 *buf = stats_req->buf;375u32 len = stats_req->buf_len;376u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;377char hw_intr_name[HTT_STATS_MAX_HW_INTR_NAME_LEN + 1] = {0};378379len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_INTR_MISC_TLV:\n");380memcpy(hw_intr_name, &(htt_stats_buf->hw_intr_name[0]),381HTT_STATS_MAX_HW_INTR_NAME_LEN);382len += scnprintf(buf + len, buf_len - len, "hw_intr_name = %s\n", hw_intr_name);383len += scnprintf(buf + len, buf_len - len, "mask = %u\n",384htt_stats_buf->mask);385len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",386htt_stats_buf->count);387388if (len >= buf_len)389buf[buf_len - 1] = 0;390else391buf[len] = 0;392393stats_req->buf_len = len;394}395396static inline void397htt_print_hw_stats_wd_timeout_tlv(const void *tag_buf,398struct debug_htt_stats_req *stats_req)399{400const struct htt_hw_stats_wd_timeout_tlv *htt_stats_buf = tag_buf;401u8 *buf = stats_req->buf;402u32 len = stats_req->buf_len;403u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;404char hw_module_name[HTT_STATS_MAX_HW_MODULE_NAME_LEN + 1] = {0};405406len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WD_TIMEOUT_TLV:\n");407memcpy(hw_module_name, &(htt_stats_buf->hw_module_name[0]),408HTT_STATS_MAX_HW_MODULE_NAME_LEN);409len += scnprintf(buf + len, buf_len - len, "hw_module_name = %s\n",410hw_module_name);411len += scnprintf(buf + len, buf_len - len, "count = %u\n",412htt_stats_buf->count);413414if (len >= buf_len)415buf[buf_len - 1] = 0;416else417buf[len] = 0;418419stats_req->buf_len = len;420}421422static inline void htt_print_hw_stats_pdev_errs_tlv(const void *tag_buf,423struct debug_htt_stats_req *stats_req)424{425const struct htt_hw_stats_pdev_errs_tlv *htt_stats_buf = tag_buf;426u8 *buf = stats_req->buf;427u32 len = stats_req->buf_len;428u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;429430len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_PDEV_ERRS_TLV:\n");431len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",432FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));433len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",434htt_stats_buf->tx_abort);435len += scnprintf(buf + len, buf_len - len, "tx_abort_fail_count = %u\n",436htt_stats_buf->tx_abort_fail_count);437len += scnprintf(buf + len, buf_len - len, "rx_abort = %u\n",438htt_stats_buf->rx_abort);439len += scnprintf(buf + len, buf_len - len, "rx_abort_fail_count = %u\n",440htt_stats_buf->rx_abort_fail_count);441len += scnprintf(buf + len, buf_len - len, "warm_reset = %u\n",442htt_stats_buf->warm_reset);443len += scnprintf(buf + len, buf_len - len, "cold_reset = %u\n",444htt_stats_buf->cold_reset);445len += scnprintf(buf + len, buf_len - len, "tx_flush = %u\n",446htt_stats_buf->tx_flush);447len += scnprintf(buf + len, buf_len - len, "tx_glb_reset = %u\n",448htt_stats_buf->tx_glb_reset);449len += scnprintf(buf + len, buf_len - len, "tx_txq_reset = %u\n",450htt_stats_buf->tx_txq_reset);451len += scnprintf(buf + len, buf_len - len, "rx_timeout_reset = %u\n\n",452htt_stats_buf->rx_timeout_reset);453454if (len >= buf_len)455buf[buf_len - 1] = 0;456else457buf[len] = 0;458459stats_req->buf_len = len;460}461462static inline void htt_print_msdu_flow_stats_tlv(const void *tag_buf,463struct debug_htt_stats_req *stats_req)464{465const struct htt_msdu_flow_stats_tlv *htt_stats_buf = tag_buf;466u8 *buf = stats_req->buf;467u32 len = stats_req->buf_len;468u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;469470len += scnprintf(buf + len, buf_len - len, "HTT_MSDU_FLOW_STATS_TLV:\n");471len += scnprintf(buf + len, buf_len - len, "last_update_timestamp = %u\n",472htt_stats_buf->last_update_timestamp);473len += scnprintf(buf + len, buf_len - len, "last_add_timestamp = %u\n",474htt_stats_buf->last_add_timestamp);475len += scnprintf(buf + len, buf_len - len, "last_remove_timestamp = %u\n",476htt_stats_buf->last_remove_timestamp);477len += scnprintf(buf + len, buf_len - len, "total_processed_msdu_count = %u\n",478htt_stats_buf->total_processed_msdu_count);479len += scnprintf(buf + len, buf_len - len, "cur_msdu_count_in_flowq = %u\n",480htt_stats_buf->cur_msdu_count_in_flowq);481len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",482htt_stats_buf->sw_peer_id);483len += scnprintf(buf + len, buf_len - len, "tx_flow_no = %lu\n",484FIELD_GET(HTT_MSDU_FLOW_STATS_TX_FLOW_NO,485htt_stats_buf->tx_flow_no__tid_num__drop_rule));486len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",487FIELD_GET(HTT_MSDU_FLOW_STATS_TID_NUM,488htt_stats_buf->tx_flow_no__tid_num__drop_rule));489len += scnprintf(buf + len, buf_len - len, "drop_rule = %lu\n",490FIELD_GET(HTT_MSDU_FLOW_STATS_DROP_RULE,491htt_stats_buf->tx_flow_no__tid_num__drop_rule));492len += scnprintf(buf + len, buf_len - len, "last_cycle_enqueue_count = %u\n",493htt_stats_buf->last_cycle_enqueue_count);494len += scnprintf(buf + len, buf_len - len, "last_cycle_dequeue_count = %u\n",495htt_stats_buf->last_cycle_dequeue_count);496len += scnprintf(buf + len, buf_len - len, "last_cycle_drop_count = %u\n",497htt_stats_buf->last_cycle_drop_count);498len += scnprintf(buf + len, buf_len - len, "current_drop_th = %u\n\n",499htt_stats_buf->current_drop_th);500501if (len >= buf_len)502buf[buf_len - 1] = 0;503else504buf[len] = 0;505506stats_req->buf_len = len;507}508509static inline void htt_print_tx_tid_stats_tlv(const void *tag_buf,510struct debug_htt_stats_req *stats_req)511{512const struct htt_tx_tid_stats_tlv *htt_stats_buf = tag_buf;513u8 *buf = stats_req->buf;514u32 len = stats_req->buf_len;515u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;516char tid_name[MAX_HTT_TID_NAME + 1] = {0};517518len += scnprintf(buf + len, buf_len - len, "HTT_TX_TID_STATS_TLV:\n");519memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);520len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);521len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",522FIELD_GET(HTT_TX_TID_STATS_SW_PEER_ID,523htt_stats_buf->sw_peer_id__tid_num));524len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",525FIELD_GET(HTT_TX_TID_STATS_TID_NUM,526htt_stats_buf->sw_peer_id__tid_num));527len += scnprintf(buf + len, buf_len - len, "num_sched_pending = %lu\n",528FIELD_GET(HTT_TX_TID_STATS_NUM_SCHED_PENDING,529htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));530len += scnprintf(buf + len, buf_len - len, "num_ppdu_in_hwq = %lu\n",531FIELD_GET(HTT_TX_TID_STATS_NUM_PPDU_IN_HWQ,532htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));533len += scnprintf(buf + len, buf_len - len, "tid_flags = 0x%x\n",534htt_stats_buf->tid_flags);535len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",536htt_stats_buf->hw_queued);537len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",538htt_stats_buf->hw_reaped);539len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",540htt_stats_buf->mpdus_hw_filter);541len += scnprintf(buf + len, buf_len - len, "qdepth_bytes = %u\n",542htt_stats_buf->qdepth_bytes);543len += scnprintf(buf + len, buf_len - len, "qdepth_num_msdu = %u\n",544htt_stats_buf->qdepth_num_msdu);545len += scnprintf(buf + len, buf_len - len, "qdepth_num_mpdu = %u\n",546htt_stats_buf->qdepth_num_mpdu);547len += scnprintf(buf + len, buf_len - len, "last_scheduled_tsmp = %u\n",548htt_stats_buf->last_scheduled_tsmp);549len += scnprintf(buf + len, buf_len - len, "pause_module_id = %u\n",550htt_stats_buf->pause_module_id);551len += scnprintf(buf + len, buf_len - len, "block_module_id = %u\n\n",552htt_stats_buf->block_module_id);553554if (len >= buf_len)555buf[buf_len - 1] = 0;556else557buf[len] = 0;558559stats_req->buf_len = len;560}561562static inline void htt_print_tx_tid_stats_v1_tlv(const void *tag_buf,563struct debug_htt_stats_req *stats_req)564{565const struct htt_tx_tid_stats_v1_tlv *htt_stats_buf = tag_buf;566u8 *buf = stats_req->buf;567u32 len = stats_req->buf_len;568u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;569char tid_name[MAX_HTT_TID_NAME + 1] = {0};570571len += scnprintf(buf + len, buf_len - len, "HTT_TX_TID_STATS_V1_TLV:\n");572memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);573len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);574len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",575FIELD_GET(HTT_TX_TID_STATS_V1_SW_PEER_ID,576htt_stats_buf->sw_peer_id__tid_num));577len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",578FIELD_GET(HTT_TX_TID_STATS_V1_TID_NUM,579htt_stats_buf->sw_peer_id__tid_num));580len += scnprintf(buf + len, buf_len - len, "num_sched_pending = %lu\n",581FIELD_GET(HTT_TX_TID_STATS_V1_NUM_SCHED_PENDING,582htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));583len += scnprintf(buf + len, buf_len - len, "num_ppdu_in_hwq = %lu\n",584FIELD_GET(HTT_TX_TID_STATS_V1_NUM_PPDU_IN_HWQ,585htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));586len += scnprintf(buf + len, buf_len - len, "tid_flags = 0x%x\n",587htt_stats_buf->tid_flags);588len += scnprintf(buf + len, buf_len - len, "max_qdepth_bytes = %u\n",589htt_stats_buf->max_qdepth_bytes);590len += scnprintf(buf + len, buf_len - len, "max_qdepth_n_msdus = %u\n",591htt_stats_buf->max_qdepth_n_msdus);592len += scnprintf(buf + len, buf_len - len, "rsvd = %u\n",593htt_stats_buf->rsvd);594len += scnprintf(buf + len, buf_len - len, "qdepth_bytes = %u\n",595htt_stats_buf->qdepth_bytes);596len += scnprintf(buf + len, buf_len - len, "qdepth_num_msdu = %u\n",597htt_stats_buf->qdepth_num_msdu);598len += scnprintf(buf + len, buf_len - len, "qdepth_num_mpdu = %u\n",599htt_stats_buf->qdepth_num_mpdu);600len += scnprintf(buf + len, buf_len - len, "last_scheduled_tsmp = %u\n",601htt_stats_buf->last_scheduled_tsmp);602len += scnprintf(buf + len, buf_len - len, "pause_module_id = %u\n",603htt_stats_buf->pause_module_id);604len += scnprintf(buf + len, buf_len - len, "block_module_id = %u\n",605htt_stats_buf->block_module_id);606len += scnprintf(buf + len, buf_len - len, "allow_n_flags = 0x%x\n",607htt_stats_buf->allow_n_flags);608len += scnprintf(buf + len, buf_len - len, "sendn_frms_allowed = %u\n\n",609htt_stats_buf->sendn_frms_allowed);610611if (len >= buf_len)612buf[buf_len - 1] = 0;613else614buf[len] = 0;615616stats_req->buf_len = len;617}618619static inline void htt_print_rx_tid_stats_tlv(const void *tag_buf,620struct debug_htt_stats_req *stats_req)621{622const struct htt_rx_tid_stats_tlv *htt_stats_buf = tag_buf;623u8 *buf = stats_req->buf;624u32 len = stats_req->buf_len;625u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;626char tid_name[MAX_HTT_TID_NAME + 1] = {0};627628len += scnprintf(buf + len, buf_len - len, "HTT_RX_TID_STATS_TLV:\n");629len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",630FIELD_GET(HTT_RX_TID_STATS_SW_PEER_ID,631htt_stats_buf->sw_peer_id__tid_num));632len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",633FIELD_GET(HTT_RX_TID_STATS_TID_NUM,634htt_stats_buf->sw_peer_id__tid_num));635memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);636len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);637len += scnprintf(buf + len, buf_len - len, "dup_in_reorder = %u\n",638htt_stats_buf->dup_in_reorder);639len += scnprintf(buf + len, buf_len - len, "dup_past_outside_window = %u\n",640htt_stats_buf->dup_past_outside_window);641len += scnprintf(buf + len, buf_len - len, "dup_past_within_window = %u\n",642htt_stats_buf->dup_past_within_window);643len += scnprintf(buf + len, buf_len - len, "rxdesc_err_decrypt = %u\n\n",644htt_stats_buf->rxdesc_err_decrypt);645646if (len >= buf_len)647buf[buf_len - 1] = 0;648else649buf[len] = 0;650651stats_req->buf_len = len;652}653654static inline void htt_print_counter_tlv(const void *tag_buf,655struct debug_htt_stats_req *stats_req)656{657const struct htt_counter_tlv *htt_stats_buf = tag_buf;658u8 *buf = stats_req->buf;659u32 len = stats_req->buf_len;660u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;661662len += scnprintf(buf + len, buf_len - len, "HTT_COUNTER_TLV:\n");663664PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->counter_name,665"counter_name",666HTT_MAX_COUNTER_NAME, "\n");667len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",668htt_stats_buf->count);669670if (len >= buf_len)671buf[buf_len - 1] = 0;672else673buf[len] = 0;674675stats_req->buf_len = len;676}677678static inline void htt_print_peer_stats_cmn_tlv(const void *tag_buf,679struct debug_htt_stats_req *stats_req)680{681const struct htt_peer_stats_cmn_tlv *htt_stats_buf = tag_buf;682u8 *buf = stats_req->buf;683u32 len = stats_req->buf_len;684u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;685686len += scnprintf(buf + len, buf_len - len, "HTT_PEER_STATS_CMN_TLV:\n");687len += scnprintf(buf + len, buf_len - len, "ppdu_cnt = %u\n",688htt_stats_buf->ppdu_cnt);689len += scnprintf(buf + len, buf_len - len, "mpdu_cnt = %u\n",690htt_stats_buf->mpdu_cnt);691len += scnprintf(buf + len, buf_len - len, "msdu_cnt = %u\n",692htt_stats_buf->msdu_cnt);693len += scnprintf(buf + len, buf_len - len, "pause_bitmap = %u\n",694htt_stats_buf->pause_bitmap);695len += scnprintf(buf + len, buf_len - len, "block_bitmap = %u\n",696htt_stats_buf->block_bitmap);697len += scnprintf(buf + len, buf_len - len, "last_rssi = %d\n",698htt_stats_buf->rssi);699len += scnprintf(buf + len, buf_len - len, "enqueued_count = %llu\n",700htt_stats_buf->peer_enqueued_count_low |701((u64)htt_stats_buf->peer_enqueued_count_high << 32));702len += scnprintf(buf + len, buf_len - len, "dequeued_count = %llu\n",703htt_stats_buf->peer_dequeued_count_low |704((u64)htt_stats_buf->peer_dequeued_count_high << 32));705len += scnprintf(buf + len, buf_len - len, "dropped_count = %llu\n",706htt_stats_buf->peer_dropped_count_low |707((u64)htt_stats_buf->peer_dropped_count_high << 32));708len += scnprintf(buf + len, buf_len - len, "transmitted_ppdu_bytes = %llu\n",709htt_stats_buf->ppdu_transmitted_bytes_low |710((u64)htt_stats_buf->ppdu_transmitted_bytes_high << 32));711len += scnprintf(buf + len, buf_len - len, "ttl_removed_count = %u\n",712htt_stats_buf->peer_ttl_removed_count);713len += scnprintf(buf + len, buf_len - len, "inactive_time = %u\n\n",714htt_stats_buf->inactive_time);715716if (len >= buf_len)717buf[buf_len - 1] = 0;718else719buf[len] = 0;720721stats_req->buf_len = len;722}723724static inline void htt_print_peer_details_tlv(const void *tag_buf,725struct debug_htt_stats_req *stats_req)726{727const struct htt_peer_details_tlv *htt_stats_buf = tag_buf;728u8 *buf = stats_req->buf;729u32 len = stats_req->buf_len;730u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;731732len += scnprintf(buf + len, buf_len - len, "HTT_PEER_DETAILS_TLV:\n");733len += scnprintf(buf + len, buf_len - len, "peer_type = %u\n",734htt_stats_buf->peer_type);735len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",736htt_stats_buf->sw_peer_id);737len += scnprintf(buf + len, buf_len - len, "vdev_id = %lu\n",738FIELD_GET(HTT_PEER_DETAILS_VDEV_ID,739htt_stats_buf->vdev_pdev_ast_idx));740len += scnprintf(buf + len, buf_len - len, "pdev_id = %lu\n",741FIELD_GET(HTT_PEER_DETAILS_PDEV_ID,742htt_stats_buf->vdev_pdev_ast_idx));743len += scnprintf(buf + len, buf_len - len, "ast_idx = %lu\n",744FIELD_GET(HTT_PEER_DETAILS_AST_IDX,745htt_stats_buf->vdev_pdev_ast_idx));746len += scnprintf(buf + len, buf_len - len,747"mac_addr = %02lx:%02lx:%02lx:%02lx:%02lx:%02lx\n",748FIELD_GET(HTT_MAC_ADDR_L32_0,749htt_stats_buf->mac_addr.mac_addr_l32),750FIELD_GET(HTT_MAC_ADDR_L32_1,751htt_stats_buf->mac_addr.mac_addr_l32),752FIELD_GET(HTT_MAC_ADDR_L32_2,753htt_stats_buf->mac_addr.mac_addr_l32),754FIELD_GET(HTT_MAC_ADDR_L32_3,755htt_stats_buf->mac_addr.mac_addr_l32),756FIELD_GET(HTT_MAC_ADDR_H16_0,757htt_stats_buf->mac_addr.mac_addr_h16),758FIELD_GET(HTT_MAC_ADDR_H16_1,759htt_stats_buf->mac_addr.mac_addr_h16));760len += scnprintf(buf + len, buf_len - len, "peer_flags = 0x%x\n",761htt_stats_buf->peer_flags);762len += scnprintf(buf + len, buf_len - len, "qpeer_flags = 0x%x\n\n",763htt_stats_buf->qpeer_flags);764765if (len >= buf_len)766buf[buf_len - 1] = 0;767else768buf[len] = 0;769770stats_req->buf_len = len;771}772773static inline void htt_print_tx_peer_rate_stats_tlv(const void *tag_buf,774struct debug_htt_stats_req *stats_req)775{776const struct htt_tx_peer_rate_stats_tlv *htt_stats_buf = tag_buf;777u8 *buf = stats_req->buf;778u32 len = stats_req->buf_len;779u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;780u8 j;781782len += scnprintf(buf + len, buf_len - len, "HTT_TX_PEER_RATE_STATS_TLV:\n");783len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",784htt_stats_buf->tx_ldpc);785len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",786htt_stats_buf->rts_cnt);787len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",788htt_stats_buf->ack_rssi);789790PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mcs, "tx_mcs",791HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");792PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_su_mcs, "tx_su_mcs",793HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");794PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mu_mcs, "tx_mu_mcs",795HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");796PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_nss, "tx_nss",797HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");798PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_bw, "tx_bw",799HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");800PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_stbc, "tx_stbc",801HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");802PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_pream, "tx_pream",803HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");804805for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {806len += scnprintf(buf + len, buf_len - len,807"tx_gi[%u] = ", j);808PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_gi[j], NULL,809HTT_TX_PEER_STATS_NUM_MCS_COUNTERS, "\n");810}811812PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_dcm, "tx_dcm",813HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");814815if (len >= buf_len)816buf[buf_len - 1] = 0;817else818buf[len] = 0;819820stats_req->buf_len = len;821}822823static inline void htt_print_rx_peer_rate_stats_tlv(const void *tag_buf,824struct debug_htt_stats_req *stats_req)825{826const struct htt_rx_peer_rate_stats_tlv *htt_stats_buf = tag_buf;827u8 *buf = stats_req->buf;828u32 len = stats_req->buf_len;829u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;830u8 j;831832len += scnprintf(buf + len, buf_len - len, "HTT_RX_PEER_RATE_STATS_TLV:\n");833len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",834htt_stats_buf->nsts);835len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",836htt_stats_buf->rx_ldpc);837len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",838htt_stats_buf->rts_cnt);839len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",840htt_stats_buf->rssi_mgmt);841len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",842htt_stats_buf->rssi_data);843len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",844htt_stats_buf->rssi_comb);845846PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs, "rx_mcs",847HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");848PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_nss, "rx_nss",849HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");850PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_dcm, "rx_dcm",851HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");852PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc, "rx_stbc",853HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");854PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_bw, "rx_bw",855HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");856857for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++) {858len += scnprintf(buf + len, (buf_len - len),859"rssi_chain[%u] = ", j);860PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain[j], NULL,861HTT_RX_PEER_STATS_NUM_BW_COUNTERS, "\n");862}863864for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {865len += scnprintf(buf + len, (buf_len - len),866"rx_gi[%u] = ", j);867PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi[j], NULL,868HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");869}870871PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_pream, "rx_pream",872HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");873874if (len >= buf_len)875buf[buf_len - 1] = 0;876else877buf[len] = 0;878879stats_req->buf_len = len;880}881882static inline void883htt_print_tx_hwq_mu_mimo_sch_stats_tlv(const void *tag_buf,884struct debug_htt_stats_req *stats_req)885{886const struct htt_tx_hwq_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;887u8 *buf = stats_req->buf;888u32 len = stats_req->buf_len;889u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;890891len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:\n");892len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",893htt_stats_buf->mu_mimo_sch_posted);894len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",895htt_stats_buf->mu_mimo_sch_failed);896len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n\n",897htt_stats_buf->mu_mimo_ppdu_posted);898899if (len >= buf_len)900buf[buf_len - 1] = 0;901else902buf[len] = 0;903904stats_req->buf_len = len;905}906907static inline void908htt_print_tx_hwq_mu_mimo_mpdu_stats_tlv(const void *tag_buf,909struct debug_htt_stats_req *stats_req)910{911const struct htt_tx_hwq_mu_mimo_mpdu_stats_tlv *htt_stats_buf = tag_buf;912u8 *buf = stats_req->buf;913u32 len = stats_req->buf_len;914u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;915916len += scnprintf(buf + len, buf_len - len,917"HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:\n");918len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_queued_usr = %u\n",919htt_stats_buf->mu_mimo_mpdus_queued_usr);920len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_tried_usr = %u\n",921htt_stats_buf->mu_mimo_mpdus_tried_usr);922len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_failed_usr = %u\n",923htt_stats_buf->mu_mimo_mpdus_failed_usr);924len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_requeued_usr = %u\n",925htt_stats_buf->mu_mimo_mpdus_requeued_usr);926len += scnprintf(buf + len, buf_len - len, "mu_mimo_err_no_ba_usr = %u\n",927htt_stats_buf->mu_mimo_err_no_ba_usr);928len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdu_underrun_usr = %u\n",929htt_stats_buf->mu_mimo_mpdu_underrun_usr);930len += scnprintf(buf + len, buf_len - len, "mu_mimo_ampdu_underrun_usr = %u\n\n",931htt_stats_buf->mu_mimo_ampdu_underrun_usr);932933if (len >= buf_len)934buf[buf_len - 1] = 0;935else936buf[len] = 0;937938stats_req->buf_len = len;939}940941static inline void942htt_print_tx_hwq_mu_mimo_cmn_stats_tlv(const void *tag_buf,943struct debug_htt_stats_req *stats_req)944{945const struct htt_tx_hwq_mu_mimo_cmn_stats_tlv *htt_stats_buf = tag_buf;946u8 *buf = stats_req->buf;947u32 len = stats_req->buf_len;948u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;949950len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:\n");951len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",952FIELD_GET(HTT_TX_HWQ_STATS_MAC_ID,953htt_stats_buf->mac_id__hwq_id__word));954len += scnprintf(buf + len, buf_len - len, "hwq_id = %lu\n\n",955FIELD_GET(HTT_TX_HWQ_STATS_HWQ_ID,956htt_stats_buf->mac_id__hwq_id__word));957958if (len >= buf_len)959buf[buf_len - 1] = 0;960else961buf[len] = 0;962963stats_req->buf_len = len;964}965966static inline void967htt_print_tx_hwq_stats_cmn_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req)968{969const struct htt_tx_hwq_stats_cmn_tlv *htt_stats_buf = tag_buf;970u8 *buf = stats_req->buf;971u32 len = stats_req->buf_len;972u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;973974/* TODO: HKDBG */975len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_STATS_CMN_TLV:\n");976len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",977FIELD_GET(HTT_TX_HWQ_STATS_MAC_ID,978htt_stats_buf->mac_id__hwq_id__word));979len += scnprintf(buf + len, buf_len - len, "hwq_id = %lu\n",980FIELD_GET(HTT_TX_HWQ_STATS_HWQ_ID,981htt_stats_buf->mac_id__hwq_id__word));982len += scnprintf(buf + len, buf_len - len, "xretry = %u\n",983htt_stats_buf->xretry);984len += scnprintf(buf + len, buf_len - len, "underrun_cnt = %u\n",985htt_stats_buf->underrun_cnt);986len += scnprintf(buf + len, buf_len - len, "flush_cnt = %u\n",987htt_stats_buf->flush_cnt);988len += scnprintf(buf + len, buf_len - len, "filt_cnt = %u\n",989htt_stats_buf->filt_cnt);990len += scnprintf(buf + len, buf_len - len, "null_mpdu_bmap = %u\n",991htt_stats_buf->null_mpdu_bmap);992len += scnprintf(buf + len, buf_len - len, "user_ack_failure = %u\n",993htt_stats_buf->user_ack_failure);994len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",995htt_stats_buf->ack_tlv_proc);996len += scnprintf(buf + len, buf_len - len, "sched_id_proc = %u\n",997htt_stats_buf->sched_id_proc);998len += scnprintf(buf + len, buf_len - len, "null_mpdu_tx_count = %u\n",999htt_stats_buf->null_mpdu_tx_count);1000len += scnprintf(buf + len, buf_len - len, "mpdu_bmap_not_recvd = %u\n",1001htt_stats_buf->mpdu_bmap_not_recvd);1002len += scnprintf(buf + len, buf_len - len, "num_bar = %u\n",1003htt_stats_buf->num_bar);1004len += scnprintf(buf + len, buf_len - len, "rts = %u\n",1005htt_stats_buf->rts);1006len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",1007htt_stats_buf->cts2self);1008len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",1009htt_stats_buf->qos_null);1010len += scnprintf(buf + len, buf_len - len, "mpdu_tried_cnt = %u\n",1011htt_stats_buf->mpdu_tried_cnt);1012len += scnprintf(buf + len, buf_len - len, "mpdu_queued_cnt = %u\n",1013htt_stats_buf->mpdu_queued_cnt);1014len += scnprintf(buf + len, buf_len - len, "mpdu_ack_fail_cnt = %u\n",1015htt_stats_buf->mpdu_ack_fail_cnt);1016len += scnprintf(buf + len, buf_len - len, "mpdu_filt_cnt = %u\n",1017htt_stats_buf->mpdu_filt_cnt);1018len += scnprintf(buf + len, buf_len - len, "false_mpdu_ack_count = %u\n",1019htt_stats_buf->false_mpdu_ack_count);1020len += scnprintf(buf + len, buf_len - len, "txq_timeout = %u\n\n",1021htt_stats_buf->txq_timeout);10221023if (len >= buf_len)1024buf[buf_len - 1] = 0;1025else1026buf[len] = 0;10271028stats_req->buf_len = len;1029}10301031static inline void1032htt_print_tx_hwq_difs_latency_stats_tlv_v(const void *tag_buf,1033u16 tag_len,1034struct debug_htt_stats_req *stats_req)1035{1036const struct htt_tx_hwq_difs_latency_stats_tlv_v *htt_stats_buf = tag_buf;1037u8 *buf = stats_req->buf;1038u32 len = stats_req->buf_len;1039u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1040u16 data_len = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);10411042len += scnprintf(buf + len, buf_len - len,1043"HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:\n");1044len += scnprintf(buf + len, buf_len - len, "hist_intvl = %u\n",1045htt_stats_buf->hist_intvl);10461047PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->difs_latency_hist,1048"difs_latency_hist", data_len, "\n\n");10491050if (len >= buf_len)1051buf[buf_len - 1] = 0;1052else1053buf[len] = 0;10541055stats_req->buf_len = len;1056}10571058static inline void1059htt_print_tx_hwq_cmd_result_stats_tlv_v(const void *tag_buf,1060u16 tag_len,1061struct debug_htt_stats_req *stats_req)1062{1063const struct htt_tx_hwq_cmd_result_stats_tlv_v *htt_stats_buf = tag_buf;1064u8 *buf = stats_req->buf;1065u32 len = stats_req->buf_len;1066u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1067u16 data_len;10681069data_len = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_CMD_RESULT_STATS);10701071len += scnprintf(buf + len, buf_len - len,1072"HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:\n");10731074PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->cmd_result, "cmd_result",1075data_len, "\n\n");10761077if (len >= buf_len)1078buf[buf_len - 1] = 0;1079else1080buf[len] = 0;10811082stats_req->buf_len = len;1083}10841085static inline void1086htt_print_tx_hwq_cmd_stall_stats_tlv_v(const void *tag_buf,1087u16 tag_len,1088struct debug_htt_stats_req *stats_req)1089{1090const struct htt_tx_hwq_cmd_stall_stats_tlv_v *htt_stats_buf = tag_buf;1091u8 *buf = stats_req->buf;1092u32 len = stats_req->buf_len;1093u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1094u16 num_elems;10951096num_elems = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_CMD_STALL_STATS);10971098len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:\n");10991100PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->cmd_stall_status,1101"cmd_stall_status", num_elems, "\n\n");11021103if (len >= buf_len)1104buf[buf_len - 1] = 0;1105else1106buf[len] = 0;11071108stats_req->buf_len = len;1109}11101111static inline void1112htt_print_tx_hwq_fes_result_stats_tlv_v(const void *tag_buf,1113u16 tag_len,1114struct debug_htt_stats_req *stats_req)1115{1116const struct htt_tx_hwq_fes_result_stats_tlv_v *htt_stats_buf = tag_buf;1117u8 *buf = stats_req->buf;1118u32 len = stats_req->buf_len;1119u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1120u16 num_elems;11211122num_elems = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_FES_RESULT_STATS);11231124len += scnprintf(buf + len, buf_len - len,1125"HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:\n");11261127PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fes_result, "fes_result",1128num_elems, "\n\n");11291130if (len >= buf_len)1131buf[buf_len - 1] = 0;1132else1133buf[len] = 0;11341135stats_req->buf_len = len;1136}11371138static inline void1139htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(const void *tag_buf,1140u16 tag_len,1141struct debug_htt_stats_req *stats_req)1142{1143const struct htt_tx_hwq_tried_mpdu_cnt_hist_tlv_v *htt_stats_buf = tag_buf;1144u8 *buf = stats_req->buf;1145u32 len = stats_req->buf_len;1146u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1147u32 num_elements = ((tag_len -1148sizeof(htt_stats_buf->hist_bin_size)) >> 2);11491150len += scnprintf(buf + len, buf_len - len,1151"HTT_TX_HWQ_TRIED_MPDU_CNT_HIST_TLV_V:\n");1152len += scnprintf(buf + len, buf_len - len, "TRIED_MPDU_CNT_HIST_BIN_SIZE : %u\n",1153htt_stats_buf->hist_bin_size);11541155PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tried_mpdu_cnt_hist,1156"tried_mpdu_cnt_hist", num_elements, "\n\n");11571158if (len >= buf_len)1159buf[buf_len - 1] = 0;1160else1161buf[len] = 0;11621163stats_req->buf_len = len;1164}11651166static inline void1167htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(const void *tag_buf,1168u16 tag_len,1169struct debug_htt_stats_req *stats_req)1170{1171const struct htt_tx_hwq_txop_used_cnt_hist_tlv_v *htt_stats_buf = tag_buf;1172u8 *buf = stats_req->buf;1173u32 len = stats_req->buf_len;1174u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1175u32 num_elements = tag_len >> 2;11761177len += scnprintf(buf + len, buf_len - len,1178"HTT_TX_HWQ_TXOP_USED_CNT_HIST_TLV_V:\n");11791180PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->txop_used_cnt_hist,1181"txop_used_cnt_hist", num_elements, "\n\n");11821183if (len >= buf_len)1184buf[buf_len - 1] = 0;1185else1186buf[len] = 0;11871188stats_req->buf_len = len;1189}11901191static inline void htt_print_tx_sounding_stats_tlv(const void *tag_buf,1192struct debug_htt_stats_req *stats_req)1193{1194s32 i;1195const struct htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf;1196u8 *buf = stats_req->buf;1197u32 len = stats_req->buf_len;1198u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1199const u32 *cbf_20 = htt_stats_buf->cbf_20;1200const u32 *cbf_40 = htt_stats_buf->cbf_40;1201const u32 *cbf_80 = htt_stats_buf->cbf_80;1202const u32 *cbf_160 = htt_stats_buf->cbf_160;12031204if (htt_stats_buf->tx_sounding_mode == HTT_TX_AC_SOUNDING_MODE) {1205len += scnprintf(buf + len, buf_len - len,1206"\nHTT_TX_AC_SOUNDING_STATS_TLV:\n\n");1207len += scnprintf(buf + len, buf_len - len,1208"ac_cbf_20 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1209cbf_20[HTT_IMPLICIT_TXBF_STEER_STATS],1210cbf_20[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1211cbf_20[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1212cbf_20[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1213cbf_20[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1214len += scnprintf(buf + len, buf_len - len,1215"ac_cbf_40 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1216cbf_40[HTT_IMPLICIT_TXBF_STEER_STATS],1217cbf_40[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1218cbf_40[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1219cbf_40[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1220cbf_40[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1221len += scnprintf(buf + len, buf_len - len,1222"ac_cbf_80 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1223cbf_80[HTT_IMPLICIT_TXBF_STEER_STATS],1224cbf_80[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1225cbf_80[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1226cbf_80[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1227cbf_80[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1228len += scnprintf(buf + len, buf_len - len,1229"ac_cbf_160 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1230cbf_160[HTT_IMPLICIT_TXBF_STEER_STATS],1231cbf_160[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1232cbf_160[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1233cbf_160[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1234cbf_160[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);12351236for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {1237len += scnprintf(buf + len, buf_len - len,1238"Sounding User %u = 20MHz: %u, 40MHz : %u, 80MHz: %u, 160MHz: %u\n",1239i,1240htt_stats_buf->sounding[0],1241htt_stats_buf->sounding[1],1242htt_stats_buf->sounding[2],1243htt_stats_buf->sounding[3]);1244}1245} else if (htt_stats_buf->tx_sounding_mode == HTT_TX_AX_SOUNDING_MODE) {1246len += scnprintf(buf + len, buf_len - len,1247"\nHTT_TX_AX_SOUNDING_STATS_TLV:\n");1248len += scnprintf(buf + len, buf_len - len,1249"ax_cbf_20 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1250cbf_20[HTT_IMPLICIT_TXBF_STEER_STATS],1251cbf_20[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1252cbf_20[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1253cbf_20[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1254cbf_20[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1255len += scnprintf(buf + len, buf_len - len,1256"ax_cbf_40 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1257cbf_40[HTT_IMPLICIT_TXBF_STEER_STATS],1258cbf_40[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1259cbf_40[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1260cbf_40[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1261cbf_40[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1262len += scnprintf(buf + len, buf_len - len,1263"ax_cbf_80 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1264cbf_80[HTT_IMPLICIT_TXBF_STEER_STATS],1265cbf_80[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1266cbf_80[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1267cbf_80[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1268cbf_80[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1269len += scnprintf(buf + len, buf_len - len,1270"ax_cbf_160 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1271cbf_160[HTT_IMPLICIT_TXBF_STEER_STATS],1272cbf_160[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1273cbf_160[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1274cbf_160[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1275cbf_160[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);12761277for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {1278len += scnprintf(buf + len, buf_len - len,1279"Sounding User %u = 20MHz: %u, 40MHz : %u, 80MHz: %u, 160MHz: %u\n",1280i,1281htt_stats_buf->sounding[0],1282htt_stats_buf->sounding[1],1283htt_stats_buf->sounding[2],1284htt_stats_buf->sounding[3]);1285}1286}12871288if (len >= buf_len)1289buf[buf_len - 1] = 0;1290else1291buf[len] = 0;12921293stats_req->buf_len = len;1294}12951296static inline void1297htt_print_tx_selfgen_cmn_stats_tlv(const void *tag_buf,1298struct debug_htt_stats_req *stats_req)1299{1300const struct htt_tx_selfgen_cmn_stats_tlv *htt_stats_buf = tag_buf;1301u8 *buf = stats_req->buf;1302u32 len = stats_req->buf_len;1303u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;13041305len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_CMN_STATS_TLV:\n");1306len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",1307FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));1308len += scnprintf(buf + len, buf_len - len, "su_bar = %u\n",1309htt_stats_buf->su_bar);1310len += scnprintf(buf + len, buf_len - len, "rts = %u\n",1311htt_stats_buf->rts);1312len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",1313htt_stats_buf->cts2self);1314len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",1315htt_stats_buf->qos_null);1316len += scnprintf(buf + len, buf_len - len, "delayed_bar_1 = %u\n",1317htt_stats_buf->delayed_bar_1);1318len += scnprintf(buf + len, buf_len - len, "delayed_bar_2 = %u\n",1319htt_stats_buf->delayed_bar_2);1320len += scnprintf(buf + len, buf_len - len, "delayed_bar_3 = %u\n",1321htt_stats_buf->delayed_bar_3);1322len += scnprintf(buf + len, buf_len - len, "delayed_bar_4 = %u\n",1323htt_stats_buf->delayed_bar_4);1324len += scnprintf(buf + len, buf_len - len, "delayed_bar_5 = %u\n",1325htt_stats_buf->delayed_bar_5);1326len += scnprintf(buf + len, buf_len - len, "delayed_bar_6 = %u\n",1327htt_stats_buf->delayed_bar_6);1328len += scnprintf(buf + len, buf_len - len, "delayed_bar_7 = %u\n\n",1329htt_stats_buf->delayed_bar_7);13301331if (len >= buf_len)1332buf[buf_len - 1] = 0;1333else1334buf[len] = 0;13351336stats_req->buf_len = len;1337}13381339static inline void1340htt_print_tx_selfgen_ac_stats_tlv(const void *tag_buf,1341struct debug_htt_stats_req *stats_req)1342{1343const struct htt_tx_selfgen_ac_stats_tlv *htt_stats_buf = tag_buf;1344u8 *buf = stats_req->buf;1345u32 len = stats_req->buf_len;1346u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;13471348len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_STATS_TLV:\n");1349len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa = %u\n",1350htt_stats_buf->ac_su_ndpa);1351len += scnprintf(buf + len, buf_len - len, "ac_su_ndp = %u\n",1352htt_stats_buf->ac_su_ndp);1353len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa = %u\n",1354htt_stats_buf->ac_mu_mimo_ndpa);1355len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp = %u\n",1356htt_stats_buf->ac_mu_mimo_ndp);1357len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_1 = %u\n",1358htt_stats_buf->ac_mu_mimo_brpoll_1);1359len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_2 = %u\n",1360htt_stats_buf->ac_mu_mimo_brpoll_2);1361len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_3 = %u\n\n",1362htt_stats_buf->ac_mu_mimo_brpoll_3);13631364if (len >= buf_len)1365buf[buf_len - 1] = 0;1366else1367buf[len] = 0;13681369stats_req->buf_len = len;1370}13711372static inline void1373htt_print_tx_selfgen_ax_stats_tlv(const void *tag_buf,1374struct debug_htt_stats_req *stats_req)1375{1376const struct htt_tx_selfgen_ax_stats_tlv *htt_stats_buf = tag_buf;1377u8 *buf = stats_req->buf;1378u32 len = stats_req->buf_len;1379u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;13801381len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_STATS_TLV:\n");1382len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa = %u\n",1383htt_stats_buf->ax_su_ndpa);1384len += scnprintf(buf + len, buf_len - len, "ax_su_ndp = %u\n",1385htt_stats_buf->ax_su_ndp);1386len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa = %u\n",1387htt_stats_buf->ax_mu_mimo_ndpa);1388len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp = %u\n",1389htt_stats_buf->ax_mu_mimo_ndp);1390len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_1 = %u\n",1391htt_stats_buf->ax_mu_mimo_brpoll_1);1392len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_2 = %u\n",1393htt_stats_buf->ax_mu_mimo_brpoll_2);1394len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_3 = %u\n",1395htt_stats_buf->ax_mu_mimo_brpoll_3);1396len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_4 = %u\n",1397htt_stats_buf->ax_mu_mimo_brpoll_4);1398len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_5 = %u\n",1399htt_stats_buf->ax_mu_mimo_brpoll_5);1400len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_6 = %u\n",1401htt_stats_buf->ax_mu_mimo_brpoll_6);1402len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_7 = %u\n",1403htt_stats_buf->ax_mu_mimo_brpoll_7);1404len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger = %u\n",1405htt_stats_buf->ax_basic_trigger);1406len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_trigger = %u\n",1407htt_stats_buf->ax_ulmumimo_trigger);1408len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger = %u\n",1409htt_stats_buf->ax_bsr_trigger);1410len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger = %u\n",1411htt_stats_buf->ax_mu_bar_trigger);1412len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger = %u\n\n",1413htt_stats_buf->ax_mu_rts_trigger);14141415if (len >= buf_len)1416buf[buf_len - 1] = 0;1417else1418buf[len] = 0;14191420stats_req->buf_len = len;1421}14221423static inline void1424htt_print_tx_selfgen_ac_err_stats_tlv(const void *tag_buf,1425struct debug_htt_stats_req *stats_req)1426{1427const struct htt_tx_selfgen_ac_err_stats_tlv *htt_stats_buf = tag_buf;1428u8 *buf = stats_req->buf;1429u32 len = stats_req->buf_len;1430u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;14311432len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:\n");1433len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_err = %u\n",1434htt_stats_buf->ac_su_ndp_err);1435len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_err = %u\n",1436htt_stats_buf->ac_su_ndpa_err);1437len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_err = %u\n",1438htt_stats_buf->ac_mu_mimo_ndpa_err);1439len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_err = %u\n",1440htt_stats_buf->ac_mu_mimo_ndp_err);1441len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp1_err = %u\n",1442htt_stats_buf->ac_mu_mimo_brp1_err);1443len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp2_err = %u\n",1444htt_stats_buf->ac_mu_mimo_brp2_err);1445len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp3_err = %u\n\n",1446htt_stats_buf->ac_mu_mimo_brp3_err);14471448if (len >= buf_len)1449buf[buf_len - 1] = 0;1450else1451buf[len] = 0;14521453stats_req->buf_len = len;1454}14551456static inline void1457htt_print_tx_selfgen_ax_err_stats_tlv(const void *tag_buf,1458struct debug_htt_stats_req *stats_req)1459{1460const struct htt_tx_selfgen_ax_err_stats_tlv *htt_stats_buf = tag_buf;1461u8 *buf = stats_req->buf;1462u32 len = stats_req->buf_len;1463u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;14641465len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:\n");1466len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_err = %u\n",1467htt_stats_buf->ax_su_ndp_err);1468len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_err = %u\n",1469htt_stats_buf->ax_su_ndpa_err);1470len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_err = %u\n",1471htt_stats_buf->ax_mu_mimo_ndpa_err);1472len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_err = %u\n",1473htt_stats_buf->ax_mu_mimo_ndp_err);1474len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp1_err = %u\n",1475htt_stats_buf->ax_mu_mimo_brp1_err);1476len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp2_err = %u\n",1477htt_stats_buf->ax_mu_mimo_brp2_err);1478len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp3_err = %u\n",1479htt_stats_buf->ax_mu_mimo_brp3_err);1480len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp4_err = %u\n",1481htt_stats_buf->ax_mu_mimo_brp4_err);1482len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp5_err = %u\n",1483htt_stats_buf->ax_mu_mimo_brp5_err);1484len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp6_err = %u\n",1485htt_stats_buf->ax_mu_mimo_brp6_err);1486len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp7_err = %u\n",1487htt_stats_buf->ax_mu_mimo_brp7_err);1488len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger_err = %u\n",1489htt_stats_buf->ax_basic_trigger_err);1490len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_trigger_err = %u\n",1491htt_stats_buf->ax_ulmumimo_trigger_err);1492len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger_err = %u\n",1493htt_stats_buf->ax_bsr_trigger_err);1494len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger_err = %u\n",1495htt_stats_buf->ax_mu_bar_trigger_err);1496len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger_err = %u\n\n",1497htt_stats_buf->ax_mu_rts_trigger_err);14981499if (len >= buf_len)1500buf[buf_len - 1] = 0;1501else1502buf[len] = 0;15031504stats_req->buf_len = len;1505}15061507static inline void1508htt_print_tx_pdev_mu_mimo_sch_stats_tlv(const void *tag_buf,1509struct debug_htt_stats_req *stats_req)1510{1511const struct htt_tx_pdev_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;1512u8 *buf = stats_req->buf;1513u32 len = stats_req->buf_len;1514u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1515u8 i;15161517len += scnprintf(buf + len, buf_len - len,1518"HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:\n");1519len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",1520htt_stats_buf->mu_mimo_sch_posted);1521len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",1522htt_stats_buf->mu_mimo_sch_failed);1523len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n\n",1524htt_stats_buf->mu_mimo_ppdu_posted);15251526for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++)1527len += scnprintf(buf + len, buf_len - len,1528"ac_mu_mimo_sch_posted_per_group_index %u = %u\n",1529i, htt_stats_buf->ac_mu_mimo_sch_posted_per_grp_sz[i]);15301531for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++)1532len += scnprintf(buf + len, buf_len - len,1533"ax_mu_mimo_sch_posted_per_group_index %u = %u\n",1534i, htt_stats_buf->ax_mu_mimo_sch_posted_per_grp_sz[i]);15351536len += scnprintf(buf + len, buf_len - len, "11ac MU_MIMO SCH STATS:\n");15371538for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++)1539len += scnprintf(buf + len, buf_len - len,1540"ac_mu_mimo_sch_nusers_%u = %u\n",1541i, htt_stats_buf->ac_mu_mimo_sch_nusers[i]);15421543len += scnprintf(buf + len, buf_len - len, "\n11ax MU_MIMO SCH STATS:\n");15441545for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++)1546len += scnprintf(buf + len, buf_len - len,1547"ax_mu_mimo_sch_nusers_%u = %u\n",1548i, htt_stats_buf->ax_mu_mimo_sch_nusers[i]);15491550len += scnprintf(buf + len, buf_len - len, "\n11ax OFDMA SCH STATS:\n");15511552for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {1553len += scnprintf(buf + len, buf_len - len,1554"ax_ofdma_sch_nusers_%u = %u\n",1555i, htt_stats_buf->ax_ofdma_sch_nusers[i]);1556len += scnprintf(buf + len, buf_len - len,1557"ax_ul_ofdma_basic_sch_nusers_%u = %u\n",1558i, htt_stats_buf->ax_ul_ofdma_basic_sch_nusers[i]);1559len += scnprintf(buf + len, buf_len - len,1560"ax_ul_ofdma_bsr_sch_nusers_%u = %u\n",1561i, htt_stats_buf->ax_ul_ofdma_bsr_sch_nusers[i]);1562len += scnprintf(buf + len, buf_len - len,1563"ax_ul_ofdma_sch_bar_nusers_%u = %u\n",1564i, htt_stats_buf->ax_ul_ofdma_bar_sch_nusers[i]);1565len += scnprintf(buf + len, buf_len - len,1566"ax_ul_ofdma_brp_sch_nusers_%u = %u\n",1567i, htt_stats_buf->ax_ul_ofdma_brp_sch_nusers[i]);1568}15691570len += scnprintf(buf + len, buf_len - len, "\n11ax UL MUMIO SCH STATS:\n");15711572for (i = 0; i < HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS; i++) {1573len += scnprintf(buf + len, buf_len - len,1574"ax_ul_mumimo_basic_sch_nusers_%u = %u\n",1575i, htt_stats_buf->ax_ul_mumimo_basic_sch_nusers[i]);1576len += scnprintf(buf + len, buf_len - len,1577"ax_ul_mumimo_brp_sch_nusers_%u = %u\n",1578i, htt_stats_buf->ax_ul_mumimo_brp_sch_nusers[i]);1579}15801581if (len >= buf_len)1582buf[buf_len - 1] = 0;1583else1584buf[len] = 0;15851586stats_req->buf_len = len;1587}15881589static inline void1590htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf,1591struct debug_htt_stats_req *stats_req)1592{1593const struct htt_tx_pdev_mpdu_stats_tlv *htt_stats_buf = tag_buf;1594u8 *buf = stats_req->buf;1595u32 len = stats_req->buf_len;1596u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;15971598if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {1599if (!htt_stats_buf->user_index)1600len += scnprintf(buf + len, buf_len - len,1601"HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");16021603if (htt_stats_buf->user_index <1604HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {1605len += scnprintf(buf + len, buf_len - len,1606"ac_mu_mimo_mpdus_queued_usr_%u = %u\n",1607htt_stats_buf->user_index,1608htt_stats_buf->mpdus_queued_usr);1609len += scnprintf(buf + len, buf_len - len,1610"ac_mu_mimo_mpdus_tried_usr_%u = %u\n",1611htt_stats_buf->user_index,1612htt_stats_buf->mpdus_tried_usr);1613len += scnprintf(buf + len, buf_len - len,1614"ac_mu_mimo_mpdus_failed_usr_%u = %u\n",1615htt_stats_buf->user_index,1616htt_stats_buf->mpdus_failed_usr);1617len += scnprintf(buf + len, buf_len - len,1618"ac_mu_mimo_mpdus_requeued_usr_%u = %u\n",1619htt_stats_buf->user_index,1620htt_stats_buf->mpdus_requeued_usr);1621len += scnprintf(buf + len, buf_len - len,1622"ac_mu_mimo_err_no_ba_usr_%u = %u\n",1623htt_stats_buf->user_index,1624htt_stats_buf->err_no_ba_usr);1625len += scnprintf(buf + len, buf_len - len,1626"ac_mu_mimo_mpdu_underrun_usr_%u = %u\n",1627htt_stats_buf->user_index,1628htt_stats_buf->mpdu_underrun_usr);1629len += scnprintf(buf + len, buf_len - len,1630"ac_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",1631htt_stats_buf->user_index,1632htt_stats_buf->ampdu_underrun_usr);1633}1634}16351636if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {1637if (!htt_stats_buf->user_index)1638len += scnprintf(buf + len, buf_len - len,1639"HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");16401641if (htt_stats_buf->user_index <1642HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {1643len += scnprintf(buf + len, buf_len - len,1644"ax_mu_mimo_mpdus_queued_usr_%u = %u\n",1645htt_stats_buf->user_index,1646htt_stats_buf->mpdus_queued_usr);1647len += scnprintf(buf + len, buf_len - len,1648"ax_mu_mimo_mpdus_tried_usr_%u = %u\n",1649htt_stats_buf->user_index,1650htt_stats_buf->mpdus_tried_usr);1651len += scnprintf(buf + len, buf_len - len,1652"ax_mu_mimo_mpdus_failed_usr_%u = %u\n",1653htt_stats_buf->user_index,1654htt_stats_buf->mpdus_failed_usr);1655len += scnprintf(buf + len, buf_len - len,1656"ax_mu_mimo_mpdus_requeued_usr_%u = %u\n",1657htt_stats_buf->user_index,1658htt_stats_buf->mpdus_requeued_usr);1659len += scnprintf(buf + len, buf_len - len,1660"ax_mu_mimo_err_no_ba_usr_%u = %u\n",1661htt_stats_buf->user_index,1662htt_stats_buf->err_no_ba_usr);1663len += scnprintf(buf + len, buf_len - len,1664"ax_mu_mimo_mpdu_underrun_usr_%u = %u\n",1665htt_stats_buf->user_index,1666htt_stats_buf->mpdu_underrun_usr);1667len += scnprintf(buf + len, buf_len - len,1668"ax_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",1669htt_stats_buf->user_index,1670htt_stats_buf->ampdu_underrun_usr);1671}1672}16731674if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {1675if (!htt_stats_buf->user_index)1676len += scnprintf(buf + len, buf_len - len,1677"HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");16781679if (htt_stats_buf->user_index < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {1680len += scnprintf(buf + len, buf_len - len,1681"ax_mu_ofdma_mpdus_queued_usr_%u = %u\n",1682htt_stats_buf->user_index,1683htt_stats_buf->mpdus_queued_usr);1684len += scnprintf(buf + len, buf_len - len,1685"ax_mu_ofdma_mpdus_tried_usr_%u = %u\n",1686htt_stats_buf->user_index,1687htt_stats_buf->mpdus_tried_usr);1688len += scnprintf(buf + len, buf_len - len,1689"ax_mu_ofdma_mpdus_failed_usr_%u = %u\n",1690htt_stats_buf->user_index,1691htt_stats_buf->mpdus_failed_usr);1692len += scnprintf(buf + len, buf_len - len,1693"ax_mu_ofdma_mpdus_requeued_usr_%u = %u\n",1694htt_stats_buf->user_index,1695htt_stats_buf->mpdus_requeued_usr);1696len += scnprintf(buf + len, buf_len - len,1697"ax_mu_ofdma_err_no_ba_usr_%u = %u\n",1698htt_stats_buf->user_index,1699htt_stats_buf->err_no_ba_usr);1700len += scnprintf(buf + len, buf_len - len,1701"ax_mu_ofdma_mpdu_underrun_usr_%u = %u\n",1702htt_stats_buf->user_index,1703htt_stats_buf->mpdu_underrun_usr);1704len += scnprintf(buf + len, buf_len - len,1705"ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n\n",1706htt_stats_buf->user_index,1707htt_stats_buf->ampdu_underrun_usr);1708}1709}17101711if (len >= buf_len)1712buf[buf_len - 1] = 0;1713else1714buf[len] = 0;17151716stats_req->buf_len = len;1717}17181719static inline void1720htt_print_sched_txq_cmd_posted_tlv_v(const void *tag_buf,1721u16 tag_len,1722struct debug_htt_stats_req *stats_req)1723{1724const struct htt_sched_txq_cmd_posted_tlv_v *htt_stats_buf = tag_buf;1725u8 *buf = stats_req->buf;1726u32 len = stats_req->buf_len;1727u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1728u16 num_elements = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_SCHED_TX_MODE_MAX);17291730len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_POSTED_TLV_V:\n");17311732PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_cmd_posted,1733"sched_cmd_posted", num_elements, "\n\n");17341735if (len >= buf_len)1736buf[buf_len - 1] = 0;1737else1738buf[len] = 0;17391740stats_req->buf_len = len;1741}17421743static inline void1744htt_print_sched_txq_cmd_reaped_tlv_v(const void *tag_buf,1745u16 tag_len,1746struct debug_htt_stats_req *stats_req)1747{1748const struct htt_sched_txq_cmd_reaped_tlv_v *htt_stats_buf = tag_buf;1749u8 *buf = stats_req->buf;1750u32 len = stats_req->buf_len;1751u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1752u16 num_elements = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_SCHED_TX_MODE_MAX);17531754len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_REAPED_TLV_V:\n");17551756PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_cmd_reaped,1757"sched_cmd_reaped", num_elements, "\n\n");17581759if (len >= buf_len)1760buf[buf_len - 1] = 0;1761else1762buf[len] = 0;17631764stats_req->buf_len = len;1765}17661767static inline void1768htt_print_sched_txq_sched_order_su_tlv_v(const void *tag_buf,1769u16 tag_len,1770struct debug_htt_stats_req *stats_req)1771{1772const struct htt_sched_txq_sched_order_su_tlv_v *htt_stats_buf = tag_buf;1773u8 *buf = stats_req->buf;1774u32 len = stats_req->buf_len;1775u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1776/* each entry is u32, i.e. 4 bytes */1777u32 sched_order_su_num_entries =1778min_t(u32, (tag_len >> 2), HTT_TX_PDEV_NUM_SCHED_ORDER_LOG);17791780len += scnprintf(buf + len, buf_len - len,1781"HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV_V:\n");17821783PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_order_su, "sched_order_su",1784sched_order_su_num_entries, "\n\n");17851786if (len >= buf_len)1787buf[buf_len - 1] = 0;1788else1789buf[len] = 0;17901791stats_req->buf_len = len;1792}17931794static inline void1795htt_print_sched_txq_sched_ineligibility_tlv_v(const void *tag_buf,1796u16 tag_len,1797struct debug_htt_stats_req *stats_req)1798{1799const struct htt_sched_txq_sched_ineligibility_tlv_v *htt_stats_buf = tag_buf;1800u8 *buf = stats_req->buf;1801u32 len = stats_req->buf_len;1802u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1803/* each entry is u32, i.e. 4 bytes */1804u32 sched_ineligibility_num_entries = tag_len >> 2;18051806len += scnprintf(buf + len, buf_len - len,1807"HTT_SCHED_TXQ_SCHED_INELIGIBILITY_V:\n");18081809PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_ineligibility,1810"sched_ineligibility", sched_ineligibility_num_entries,1811"\n\n");18121813if (len >= buf_len)1814buf[buf_len - 1] = 0;1815else1816buf[len] = 0;18171818stats_req->buf_len = len;1819}18201821static inline void1822htt_print_tx_pdev_stats_sched_per_txq_tlv(const void *tag_buf,1823struct debug_htt_stats_req *stats_req)1824{1825const struct htt_tx_pdev_stats_sched_per_txq_tlv *htt_stats_buf = tag_buf;1826u8 *buf = stats_req->buf;1827u32 len = stats_req->buf_len;1828u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;18291830len += scnprintf(buf + len, buf_len - len,1831"HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:\n");1832len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",1833FIELD_GET(HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID,1834htt_stats_buf->mac_id__txq_id__word));1835len += scnprintf(buf + len, buf_len - len, "txq_id = %lu\n",1836FIELD_GET(HTT_TX_PDEV_STATS_SCHED_PER_TXQ_ID,1837htt_stats_buf->mac_id__txq_id__word));1838len += scnprintf(buf + len, buf_len - len, "sched_policy = %u\n",1839htt_stats_buf->sched_policy);1840len += scnprintf(buf + len, buf_len - len,1841"last_sched_cmd_posted_timestamp = %u\n",1842htt_stats_buf->last_sched_cmd_posted_timestamp);1843len += scnprintf(buf + len, buf_len - len,1844"last_sched_cmd_compl_timestamp = %u\n",1845htt_stats_buf->last_sched_cmd_compl_timestamp);1846len += scnprintf(buf + len, buf_len - len, "sched_2_tac_lwm_count = %u\n",1847htt_stats_buf->sched_2_tac_lwm_count);1848len += scnprintf(buf + len, buf_len - len, "sched_2_tac_ring_full = %u\n",1849htt_stats_buf->sched_2_tac_ring_full);1850len += scnprintf(buf + len, buf_len - len, "sched_cmd_post_failure = %u\n",1851htt_stats_buf->sched_cmd_post_failure);1852len += scnprintf(buf + len, buf_len - len, "num_active_tids = %u\n",1853htt_stats_buf->num_active_tids);1854len += scnprintf(buf + len, buf_len - len, "num_ps_schedules = %u\n",1855htt_stats_buf->num_ps_schedules);1856len += scnprintf(buf + len, buf_len - len, "sched_cmds_pending = %u\n",1857htt_stats_buf->sched_cmds_pending);1858len += scnprintf(buf + len, buf_len - len, "num_tid_register = %u\n",1859htt_stats_buf->num_tid_register);1860len += scnprintf(buf + len, buf_len - len, "num_tid_unregister = %u\n",1861htt_stats_buf->num_tid_unregister);1862len += scnprintf(buf + len, buf_len - len, "num_qstats_queried = %u\n",1863htt_stats_buf->num_qstats_queried);1864len += scnprintf(buf + len, buf_len - len, "qstats_update_pending = %u\n",1865htt_stats_buf->qstats_update_pending);1866len += scnprintf(buf + len, buf_len - len, "last_qstats_query_timestamp = %u\n",1867htt_stats_buf->last_qstats_query_timestamp);1868len += scnprintf(buf + len, buf_len - len, "num_tqm_cmdq_full = %u\n",1869htt_stats_buf->num_tqm_cmdq_full);1870len += scnprintf(buf + len, buf_len - len, "num_de_sched_algo_trigger = %u\n",1871htt_stats_buf->num_de_sched_algo_trigger);1872len += scnprintf(buf + len, buf_len - len, "num_rt_sched_algo_trigger = %u\n",1873htt_stats_buf->num_rt_sched_algo_trigger);1874len += scnprintf(buf + len, buf_len - len, "num_tqm_sched_algo_trigger = %u\n",1875htt_stats_buf->num_tqm_sched_algo_trigger);1876len += scnprintf(buf + len, buf_len - len, "notify_sched = %u\n\n",1877htt_stats_buf->notify_sched);1878len += scnprintf(buf + len, buf_len - len, "dur_based_sendn_term = %u\n\n",1879htt_stats_buf->dur_based_sendn_term);18801881if (len >= buf_len)1882buf[buf_len - 1] = 0;1883else1884buf[len] = 0;18851886stats_req->buf_len = len;1887}18881889static inline void htt_print_stats_tx_sched_cmn_tlv(const void *tag_buf,1890struct debug_htt_stats_req *stats_req)1891{1892const struct htt_stats_tx_sched_cmn_tlv *htt_stats_buf = tag_buf;1893u8 *buf = stats_req->buf;1894u32 len = stats_req->buf_len;1895u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;18961897len += scnprintf(buf + len, buf_len - len, "HTT_STATS_TX_SCHED_CMN_TLV:\n");1898len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",1899FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));1900len += scnprintf(buf + len, buf_len - len, "current_timestamp = %u\n\n",1901htt_stats_buf->current_timestamp);19021903if (len >= buf_len)1904buf[buf_len - 1] = 0;1905else1906buf[len] = 0;19071908stats_req->buf_len = len;1909}19101911static inline void1912htt_print_tx_tqm_gen_mpdu_stats_tlv_v(const void *tag_buf,1913u16 tag_len,1914struct debug_htt_stats_req *stats_req)1915{1916const struct htt_tx_tqm_gen_mpdu_stats_tlv_v *htt_stats_buf = tag_buf;1917u8 *buf = stats_req->buf;1918u32 len = stats_req->buf_len;1919u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1920u16 num_elements = min_t(u16, (tag_len >> 2),1921HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);19221923len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:\n");19241925PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->gen_mpdu_end_reason,1926"gen_mpdu_end_reason", num_elements, "\n\n");19271928if (len >= buf_len)1929buf[buf_len - 1] = 0;1930else1931buf[len] = 0;19321933stats_req->buf_len = len;1934}19351936static inline void1937htt_print_tx_tqm_list_mpdu_stats_tlv_v(const void *tag_buf,1938u16 tag_len,1939struct debug_htt_stats_req *stats_req)1940{1941const struct htt_tx_tqm_list_mpdu_stats_tlv_v *htt_stats_buf = tag_buf;1942u8 *buf = stats_req->buf;1943u32 len = stats_req->buf_len;1944u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1945u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);19461947len += scnprintf(buf + len, buf_len - len,1948"HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:\n");19491950PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->list_mpdu_end_reason,1951"list_mpdu_end_reason", num_elems, "\n\n");19521953if (len >= buf_len)1954buf[buf_len - 1] = 0;1955else1956buf[len] = 0;19571958stats_req->buf_len = len;1959}19601961static inline void1962htt_print_tx_tqm_list_mpdu_cnt_tlv_v(const void *tag_buf,1963u16 tag_len,1964struct debug_htt_stats_req *stats_req)1965{1966const struct htt_tx_tqm_list_mpdu_cnt_tlv_v *htt_stats_buf = tag_buf;1967u8 *buf = stats_req->buf;1968u32 len = stats_req->buf_len;1969u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1970u16 num_elems = min_t(u16, (tag_len >> 2),1971HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);19721973len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:\n");19741975PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->list_mpdu_cnt_hist,1976"list_mpdu_cnt_hist", num_elems, "\n\n");19771978if (len >= buf_len)1979buf[buf_len - 1] = 0;1980else1981buf[len] = 0;19821983stats_req->buf_len = len;1984}19851986static inline void1987htt_print_tx_tqm_pdev_stats_tlv_v(const void *tag_buf,1988struct debug_htt_stats_req *stats_req)1989{1990const struct htt_tx_tqm_pdev_stats_tlv_v *htt_stats_buf = tag_buf;1991u8 *buf = stats_req->buf;1992u32 len = stats_req->buf_len;1993u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;19941995len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_PDEV_STATS_TLV_V:\n");1996len += scnprintf(buf + len, buf_len - len, "msdu_count = %u\n",1997htt_stats_buf->msdu_count);1998len += scnprintf(buf + len, buf_len - len, "mpdu_count = %u\n",1999htt_stats_buf->mpdu_count);2000len += scnprintf(buf + len, buf_len - len, "remove_msdu = %u\n",2001htt_stats_buf->remove_msdu);2002len += scnprintf(buf + len, buf_len - len, "remove_mpdu = %u\n",2003htt_stats_buf->remove_mpdu);2004len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl = %u\n",2005htt_stats_buf->remove_msdu_ttl);2006len += scnprintf(buf + len, buf_len - len, "send_bar = %u\n",2007htt_stats_buf->send_bar);2008len += scnprintf(buf + len, buf_len - len, "bar_sync = %u\n",2009htt_stats_buf->bar_sync);2010len += scnprintf(buf + len, buf_len - len, "notify_mpdu = %u\n",2011htt_stats_buf->notify_mpdu);2012len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",2013htt_stats_buf->sync_cmd);2014len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",2015htt_stats_buf->write_cmd);2016len += scnprintf(buf + len, buf_len - len, "hwsch_trigger = %u\n",2017htt_stats_buf->hwsch_trigger);2018len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",2019htt_stats_buf->ack_tlv_proc);2020len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",2021htt_stats_buf->gen_mpdu_cmd);2022len += scnprintf(buf + len, buf_len - len, "gen_list_cmd = %u\n",2023htt_stats_buf->gen_list_cmd);2024len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",2025htt_stats_buf->remove_mpdu_cmd);2026len += scnprintf(buf + len, buf_len - len, "remove_mpdu_tried_cmd = %u\n",2027htt_stats_buf->remove_mpdu_tried_cmd);2028len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",2029htt_stats_buf->mpdu_queue_stats_cmd);2030len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",2031htt_stats_buf->mpdu_head_info_cmd);2032len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",2033htt_stats_buf->msdu_flow_stats_cmd);2034len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",2035htt_stats_buf->remove_msdu_cmd);2036len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl_cmd = %u\n",2037htt_stats_buf->remove_msdu_ttl_cmd);2038len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",2039htt_stats_buf->flush_cache_cmd);2040len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",2041htt_stats_buf->update_mpduq_cmd);2042len += scnprintf(buf + len, buf_len - len, "enqueue = %u\n",2043htt_stats_buf->enqueue);2044len += scnprintf(buf + len, buf_len - len, "enqueue_notify = %u\n",2045htt_stats_buf->enqueue_notify);2046len += scnprintf(buf + len, buf_len - len, "notify_mpdu_at_head = %u\n",2047htt_stats_buf->notify_mpdu_at_head);2048len += scnprintf(buf + len, buf_len - len, "notify_mpdu_state_valid = %u\n",2049htt_stats_buf->notify_mpdu_state_valid);2050len += scnprintf(buf + len, buf_len - len, "sched_udp_notify1 = %u\n",2051htt_stats_buf->sched_udp_notify1);2052len += scnprintf(buf + len, buf_len - len, "sched_udp_notify2 = %u\n",2053htt_stats_buf->sched_udp_notify2);2054len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify1 = %u\n",2055htt_stats_buf->sched_nonudp_notify1);2056len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify2 = %u\n\n",2057htt_stats_buf->sched_nonudp_notify2);20582059if (len >= buf_len)2060buf[buf_len - 1] = 0;2061else2062buf[len] = 0;20632064stats_req->buf_len = len;2065}20662067static inline void htt_print_tx_tqm_cmn_stats_tlv(const void *tag_buf,2068struct debug_htt_stats_req *stats_req)2069{2070const struct htt_tx_tqm_cmn_stats_tlv *htt_stats_buf = tag_buf;2071u8 *buf = stats_req->buf;2072u32 len = stats_req->buf_len;2073u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;20742075len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMN_STATS_TLV:\n");2076len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2077FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2078len += scnprintf(buf + len, buf_len - len, "max_cmdq_id = %u\n",2079htt_stats_buf->max_cmdq_id);2080len += scnprintf(buf + len, buf_len - len, "list_mpdu_cnt_hist_intvl = %u\n",2081htt_stats_buf->list_mpdu_cnt_hist_intvl);2082len += scnprintf(buf + len, buf_len - len, "add_msdu = %u\n",2083htt_stats_buf->add_msdu);2084len += scnprintf(buf + len, buf_len - len, "q_empty = %u\n",2085htt_stats_buf->q_empty);2086len += scnprintf(buf + len, buf_len - len, "q_not_empty = %u\n",2087htt_stats_buf->q_not_empty);2088len += scnprintf(buf + len, buf_len - len, "drop_notification = %u\n",2089htt_stats_buf->drop_notification);2090len += scnprintf(buf + len, buf_len - len, "desc_threshold = %u\n\n",2091htt_stats_buf->desc_threshold);20922093if (len >= buf_len)2094buf[buf_len - 1] = 0;2095else2096buf[len] = 0;20972098stats_req->buf_len = len;2099}21002101static inline void htt_print_tx_tqm_error_stats_tlv(const void *tag_buf,2102struct debug_htt_stats_req *stats_req)2103{2104const struct htt_tx_tqm_error_stats_tlv *htt_stats_buf = tag_buf;2105u8 *buf = stats_req->buf;2106u32 len = stats_req->buf_len;2107u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;21082109len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_ERROR_STATS_TLV:\n");2110len += scnprintf(buf + len, buf_len - len, "q_empty_failure = %u\n",2111htt_stats_buf->q_empty_failure);2112len += scnprintf(buf + len, buf_len - len, "q_not_empty_failure = %u\n",2113htt_stats_buf->q_not_empty_failure);2114len += scnprintf(buf + len, buf_len - len, "add_msdu_failure = %u\n\n",2115htt_stats_buf->add_msdu_failure);21162117if (len >= buf_len)2118buf[buf_len - 1] = 0;2119else2120buf[len] = 0;21212122stats_req->buf_len = len;2123}21242125static inline void htt_print_tx_tqm_cmdq_status_tlv(const void *tag_buf,2126struct debug_htt_stats_req *stats_req)2127{2128const struct htt_tx_tqm_cmdq_status_tlv *htt_stats_buf = tag_buf;2129u8 *buf = stats_req->buf;2130u32 len = stats_req->buf_len;2131u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;21322133len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMDQ_STATUS_TLV:\n");2134len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2135FIELD_GET(HTT_TX_TQM_CMDQ_STATUS_MAC_ID,2136htt_stats_buf->mac_id__cmdq_id__word));2137len += scnprintf(buf + len, buf_len - len, "cmdq_id = %lu\n\n",2138FIELD_GET(HTT_TX_TQM_CMDQ_STATUS_CMDQ_ID,2139htt_stats_buf->mac_id__cmdq_id__word));2140len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",2141htt_stats_buf->sync_cmd);2142len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",2143htt_stats_buf->write_cmd);2144len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",2145htt_stats_buf->gen_mpdu_cmd);2146len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",2147htt_stats_buf->mpdu_queue_stats_cmd);2148len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",2149htt_stats_buf->mpdu_head_info_cmd);2150len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",2151htt_stats_buf->msdu_flow_stats_cmd);2152len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",2153htt_stats_buf->remove_mpdu_cmd);2154len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",2155htt_stats_buf->remove_msdu_cmd);2156len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",2157htt_stats_buf->flush_cache_cmd);2158len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",2159htt_stats_buf->update_mpduq_cmd);2160len += scnprintf(buf + len, buf_len - len, "update_msduq_cmd = %u\n\n",2161htt_stats_buf->update_msduq_cmd);21622163if (len >= buf_len)2164buf[buf_len - 1] = 0;2165else2166buf[len] = 0;21672168stats_req->buf_len = len;2169}21702171static inline void2172htt_print_tx_de_eapol_packets_stats_tlv(const void *tag_buf,2173struct debug_htt_stats_req *stats_req)2174{2175const struct htt_tx_de_eapol_packets_stats_tlv *htt_stats_buf = tag_buf;2176u8 *buf = stats_req->buf;2177u32 len = stats_req->buf_len;2178u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;21792180len += scnprintf(buf + len, buf_len - len,2181"HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:\n");2182len += scnprintf(buf + len, buf_len - len, "m1_packets = %u\n",2183htt_stats_buf->m1_packets);2184len += scnprintf(buf + len, buf_len - len, "m2_packets = %u\n",2185htt_stats_buf->m2_packets);2186len += scnprintf(buf + len, buf_len - len, "m3_packets = %u\n",2187htt_stats_buf->m3_packets);2188len += scnprintf(buf + len, buf_len - len, "m4_packets = %u\n",2189htt_stats_buf->m4_packets);2190len += scnprintf(buf + len, buf_len - len, "g1_packets = %u\n",2191htt_stats_buf->g1_packets);2192len += scnprintf(buf + len, buf_len - len, "g2_packets = %u\n\n",2193htt_stats_buf->g2_packets);21942195if (len >= buf_len)2196buf[buf_len - 1] = 0;2197else2198buf[len] = 0;21992200stats_req->buf_len = len;2201}22022203static inline void2204htt_print_tx_de_classify_failed_stats_tlv(const void *tag_buf,2205struct debug_htt_stats_req *stats_req)2206{2207const struct htt_tx_de_classify_failed_stats_tlv *htt_stats_buf = tag_buf;2208u8 *buf = stats_req->buf;2209u32 len = stats_req->buf_len;2210u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;22112212len += scnprintf(buf + len, buf_len - len,2213"HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:\n");2214len += scnprintf(buf + len, buf_len - len, "ap_bss_peer_not_found = %u\n",2215htt_stats_buf->ap_bss_peer_not_found);2216len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_no_peer = %u\n",2217htt_stats_buf->ap_bcast_mcast_no_peer);2218len += scnprintf(buf + len, buf_len - len, "sta_delete_in_progress = %u\n",2219htt_stats_buf->sta_delete_in_progress);2220len += scnprintf(buf + len, buf_len - len, "ibss_no_bss_peer = %u\n",2221htt_stats_buf->ibss_no_bss_peer);2222len += scnprintf(buf + len, buf_len - len, "invalid_vdev_type = %u\n",2223htt_stats_buf->invalid_vdev_type);2224len += scnprintf(buf + len, buf_len - len, "invalid_ast_peer_entry = %u\n",2225htt_stats_buf->invalid_ast_peer_entry);2226len += scnprintf(buf + len, buf_len - len, "peer_entry_invalid = %u\n",2227htt_stats_buf->peer_entry_invalid);2228len += scnprintf(buf + len, buf_len - len, "ethertype_not_ip = %u\n",2229htt_stats_buf->ethertype_not_ip);2230len += scnprintf(buf + len, buf_len - len, "eapol_lookup_failed = %u\n",2231htt_stats_buf->eapol_lookup_failed);2232len += scnprintf(buf + len, buf_len - len, "qpeer_not_allow_data = %u\n",2233htt_stats_buf->qpeer_not_allow_data);2234len += scnprintf(buf + len, buf_len - len, "fse_tid_override = %u\n",2235htt_stats_buf->fse_tid_override);2236len += scnprintf(buf + len, buf_len - len, "ipv6_jumbogram_zero_length = %u\n",2237htt_stats_buf->ipv6_jumbogram_zero_length);2238len += scnprintf(buf + len, buf_len - len, "qos_to_non_qos_in_prog = %u\n\n",2239htt_stats_buf->qos_to_non_qos_in_prog);22402241if (len >= buf_len)2242buf[buf_len - 1] = 0;2243else2244buf[len] = 0;22452246stats_req->buf_len = len;2247}22482249static inline void2250htt_print_tx_de_classify_stats_tlv(const void *tag_buf,2251struct debug_htt_stats_req *stats_req)2252{2253const struct htt_tx_de_classify_stats_tlv *htt_stats_buf = tag_buf;2254u8 *buf = stats_req->buf;2255u32 len = stats_req->buf_len;2256u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;22572258len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CLASSIFY_STATS_TLV:\n");2259len += scnprintf(buf + len, buf_len - len, "arp_packets = %u\n",2260htt_stats_buf->arp_packets);2261len += scnprintf(buf + len, buf_len - len, "igmp_packets = %u\n",2262htt_stats_buf->igmp_packets);2263len += scnprintf(buf + len, buf_len - len, "dhcp_packets = %u\n",2264htt_stats_buf->dhcp_packets);2265len += scnprintf(buf + len, buf_len - len, "host_inspected = %u\n",2266htt_stats_buf->host_inspected);2267len += scnprintf(buf + len, buf_len - len, "htt_included = %u\n",2268htt_stats_buf->htt_included);2269len += scnprintf(buf + len, buf_len - len, "htt_valid_mcs = %u\n",2270htt_stats_buf->htt_valid_mcs);2271len += scnprintf(buf + len, buf_len - len, "htt_valid_nss = %u\n",2272htt_stats_buf->htt_valid_nss);2273len += scnprintf(buf + len, buf_len - len, "htt_valid_preamble_type = %u\n",2274htt_stats_buf->htt_valid_preamble_type);2275len += scnprintf(buf + len, buf_len - len, "htt_valid_chainmask = %u\n",2276htt_stats_buf->htt_valid_chainmask);2277len += scnprintf(buf + len, buf_len - len, "htt_valid_guard_interval = %u\n",2278htt_stats_buf->htt_valid_guard_interval);2279len += scnprintf(buf + len, buf_len - len, "htt_valid_retries = %u\n",2280htt_stats_buf->htt_valid_retries);2281len += scnprintf(buf + len, buf_len - len, "htt_valid_bw_info = %u\n",2282htt_stats_buf->htt_valid_bw_info);2283len += scnprintf(buf + len, buf_len - len, "htt_valid_power = %u\n",2284htt_stats_buf->htt_valid_power);2285len += scnprintf(buf + len, buf_len - len, "htt_valid_key_flags = 0x%x\n",2286htt_stats_buf->htt_valid_key_flags);2287len += scnprintf(buf + len, buf_len - len, "htt_valid_no_encryption = %u\n",2288htt_stats_buf->htt_valid_no_encryption);2289len += scnprintf(buf + len, buf_len - len, "fse_entry_count = %u\n",2290htt_stats_buf->fse_entry_count);2291len += scnprintf(buf + len, buf_len - len, "fse_priority_be = %u\n",2292htt_stats_buf->fse_priority_be);2293len += scnprintf(buf + len, buf_len - len, "fse_priority_high = %u\n",2294htt_stats_buf->fse_priority_high);2295len += scnprintf(buf + len, buf_len - len, "fse_priority_low = %u\n",2296htt_stats_buf->fse_priority_low);2297len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_be = %u\n",2298htt_stats_buf->fse_traffic_ptrn_be);2299len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_over_sub = %u\n",2300htt_stats_buf->fse_traffic_ptrn_over_sub);2301len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_bursty = %u\n",2302htt_stats_buf->fse_traffic_ptrn_bursty);2303len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_interactive = %u\n",2304htt_stats_buf->fse_traffic_ptrn_interactive);2305len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_periodic = %u\n",2306htt_stats_buf->fse_traffic_ptrn_periodic);2307len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_alloc = %u\n",2308htt_stats_buf->fse_hwqueue_alloc);2309len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_created = %u\n",2310htt_stats_buf->fse_hwqueue_created);2311len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_send_to_host = %u\n",2312htt_stats_buf->fse_hwqueue_send_to_host);2313len += scnprintf(buf + len, buf_len - len, "mcast_entry = %u\n",2314htt_stats_buf->mcast_entry);2315len += scnprintf(buf + len, buf_len - len, "bcast_entry = %u\n",2316htt_stats_buf->bcast_entry);2317len += scnprintf(buf + len, buf_len - len, "htt_update_peer_cache = %u\n",2318htt_stats_buf->htt_update_peer_cache);2319len += scnprintf(buf + len, buf_len - len, "htt_learning_frame = %u\n",2320htt_stats_buf->htt_learning_frame);2321len += scnprintf(buf + len, buf_len - len, "fse_invalid_peer = %u\n",2322htt_stats_buf->fse_invalid_peer);2323len += scnprintf(buf + len, buf_len - len, "mec_notify = %u\n\n",2324htt_stats_buf->mec_notify);23252326if (len >= buf_len)2327buf[buf_len - 1] = 0;2328else2329buf[len] = 0;23302331stats_req->buf_len = len;2332}23332334static inline void2335htt_print_tx_de_classify_status_stats_tlv(const void *tag_buf,2336struct debug_htt_stats_req *stats_req)2337{2338const struct htt_tx_de_classify_status_stats_tlv *htt_stats_buf = tag_buf;2339u8 *buf = stats_req->buf;2340u32 len = stats_req->buf_len;2341u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;23422343len += scnprintf(buf + len, buf_len - len,2344"HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:\n");2345len += scnprintf(buf + len, buf_len - len, "eok = %u\n",2346htt_stats_buf->eok);2347len += scnprintf(buf + len, buf_len - len, "classify_done = %u\n",2348htt_stats_buf->classify_done);2349len += scnprintf(buf + len, buf_len - len, "lookup_failed = %u\n",2350htt_stats_buf->lookup_failed);2351len += scnprintf(buf + len, buf_len - len, "send_host_dhcp = %u\n",2352htt_stats_buf->send_host_dhcp);2353len += scnprintf(buf + len, buf_len - len, "send_host_mcast = %u\n",2354htt_stats_buf->send_host_mcast);2355len += scnprintf(buf + len, buf_len - len, "send_host_unknown_dest = %u\n",2356htt_stats_buf->send_host_unknown_dest);2357len += scnprintf(buf + len, buf_len - len, "send_host = %u\n",2358htt_stats_buf->send_host);2359len += scnprintf(buf + len, buf_len - len, "status_invalid = %u\n\n",2360htt_stats_buf->status_invalid);23612362if (len >= buf_len)2363buf[buf_len - 1] = 0;2364else2365buf[len] = 0;23662367stats_req->buf_len = len;2368}23692370static inline void2371htt_print_tx_de_enqueue_packets_stats_tlv(const void *tag_buf,2372struct debug_htt_stats_req *stats_req)2373{2374const struct htt_tx_de_enqueue_packets_stats_tlv *htt_stats_buf = tag_buf;2375u8 *buf = stats_req->buf;2376u32 len = stats_req->buf_len;2377u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;23782379len += scnprintf(buf + len, buf_len - len,2380"HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:\n");2381len += scnprintf(buf + len, buf_len - len, "enqueued_pkts = %u\n",2382htt_stats_buf->enqueued_pkts);2383len += scnprintf(buf + len, buf_len - len, "to_tqm = %u\n",2384htt_stats_buf->to_tqm);2385len += scnprintf(buf + len, buf_len - len, "to_tqm_bypass = %u\n\n",2386htt_stats_buf->to_tqm_bypass);23872388if (len >= buf_len)2389buf[buf_len - 1] = 0;2390else2391buf[len] = 0;23922393stats_req->buf_len = len;2394}23952396static inline void2397htt_print_tx_de_enqueue_discard_stats_tlv(const void *tag_buf,2398struct debug_htt_stats_req *stats_req)2399{2400const struct htt_tx_de_enqueue_discard_stats_tlv *htt_stats_buf = tag_buf;2401u8 *buf = stats_req->buf;2402u32 len = stats_req->buf_len;2403u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;24042405len += scnprintf(buf + len, buf_len - len,2406"HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:\n");2407len += scnprintf(buf + len, buf_len - len, "discarded_pkts = %u\n",2408htt_stats_buf->discarded_pkts);2409len += scnprintf(buf + len, buf_len - len, "local_frames = %u\n",2410htt_stats_buf->local_frames);2411len += scnprintf(buf + len, buf_len - len, "is_ext_msdu = %u\n\n",2412htt_stats_buf->is_ext_msdu);24132414if (len >= buf_len)2415buf[buf_len - 1] = 0;2416else2417buf[len] = 0;24182419stats_req->buf_len = len;2420}24212422static inline void htt_print_tx_de_compl_stats_tlv(const void *tag_buf,2423struct debug_htt_stats_req *stats_req)2424{2425const struct htt_tx_de_compl_stats_tlv *htt_stats_buf = tag_buf;2426u8 *buf = stats_req->buf;2427u32 len = stats_req->buf_len;2428u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;24292430len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_COMPL_STATS_TLV:\n");2431len += scnprintf(buf + len, buf_len - len, "tcl_dummy_frame = %u\n",2432htt_stats_buf->tcl_dummy_frame);2433len += scnprintf(buf + len, buf_len - len, "tqm_dummy_frame = %u\n",2434htt_stats_buf->tqm_dummy_frame);2435len += scnprintf(buf + len, buf_len - len, "tqm_notify_frame = %u\n",2436htt_stats_buf->tqm_notify_frame);2437len += scnprintf(buf + len, buf_len - len, "fw2wbm_enq = %u\n",2438htt_stats_buf->fw2wbm_enq);2439len += scnprintf(buf + len, buf_len - len, "tqm_bypass_frame = %u\n\n",2440htt_stats_buf->tqm_bypass_frame);24412442if (len >= buf_len)2443buf[buf_len - 1] = 0;2444else2445buf[len] = 0;24462447stats_req->buf_len = len;2448}24492450static inline void2451htt_print_tx_de_fw2wbm_ring_full_hist_tlv(const void *tag_buf,2452u16 tag_len,2453struct debug_htt_stats_req *stats_req)2454{2455const struct htt_tx_de_fw2wbm_ring_full_hist_tlv *htt_stats_buf = tag_buf;2456u8 *buf = stats_req->buf;2457u32 len = stats_req->buf_len;2458u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2459u16 num_elements = tag_len >> 2;24602461len += scnprintf(buf + len, buf_len - len,2462"HTT_TX_DE_FW2WBM_RING_FULL_HIST_TLV");24632464PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw2wbm_ring_full_hist,2465"fw2wbm_ring_full_hist", num_elements, "\n\n");24662467if (len >= buf_len)2468buf[buf_len - 1] = 0;2469else2470buf[len] = 0;24712472stats_req->buf_len = len;2473}24742475static inline void2476htt_print_tx_de_cmn_stats_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req)2477{2478const struct htt_tx_de_cmn_stats_tlv *htt_stats_buf = tag_buf;2479u8 *buf = stats_req->buf;2480u32 len = stats_req->buf_len;2481u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;24822483len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CMN_STATS_TLV:\n");2484len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2485FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2486len += scnprintf(buf + len, buf_len - len, "tcl2fw_entry_count = %u\n",2487htt_stats_buf->tcl2fw_entry_count);2488len += scnprintf(buf + len, buf_len - len, "not_to_fw = %u\n",2489htt_stats_buf->not_to_fw);2490len += scnprintf(buf + len, buf_len - len, "invalid_pdev_vdev_peer = %u\n",2491htt_stats_buf->invalid_pdev_vdev_peer);2492len += scnprintf(buf + len, buf_len - len, "tcl_res_invalid_addrx = %u\n",2493htt_stats_buf->tcl_res_invalid_addrx);2494len += scnprintf(buf + len, buf_len - len, "wbm2fw_entry_count = %u\n",2495htt_stats_buf->wbm2fw_entry_count);2496len += scnprintf(buf + len, buf_len - len, "invalid_pdev = %u\n\n",2497htt_stats_buf->invalid_pdev);24982499if (len >= buf_len)2500buf[buf_len - 1] = 0;2501else2502buf[len] = 0;25032504stats_req->buf_len = len;2505}25062507static inline void htt_print_ring_if_stats_tlv(const void *tag_buf,2508struct debug_htt_stats_req *stats_req)2509{2510const struct htt_ring_if_stats_tlv *htt_stats_buf = tag_buf;2511u8 *buf = stats_req->buf;2512u32 len = stats_req->buf_len;2513u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;25142515len += scnprintf(buf + len, buf_len - len, "HTT_RING_IF_STATS_TLV:\n");2516len += scnprintf(buf + len, buf_len - len, "base_addr = %u\n",2517htt_stats_buf->base_addr);2518len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",2519htt_stats_buf->elem_size);2520len += scnprintf(buf + len, buf_len - len, "num_elems = %lu\n",2521FIELD_GET(HTT_RING_IF_STATS_NUM_ELEMS,2522htt_stats_buf->num_elems__prefetch_tail_idx));2523len += scnprintf(buf + len, buf_len - len, "prefetch_tail_idx = %lu\n",2524FIELD_GET(HTT_RING_IF_STATS_PREFETCH_TAIL_INDEX,2525htt_stats_buf->num_elems__prefetch_tail_idx));2526len += scnprintf(buf + len, buf_len - len, "head_idx = %lu\n",2527FIELD_GET(HTT_RING_IF_STATS_HEAD_IDX,2528htt_stats_buf->head_idx__tail_idx));2529len += scnprintf(buf + len, buf_len - len, "tail_idx = %lu\n",2530FIELD_GET(HTT_RING_IF_STATS_TAIL_IDX,2531htt_stats_buf->head_idx__tail_idx));2532len += scnprintf(buf + len, buf_len - len, "shadow_head_idx = %lu\n",2533FIELD_GET(HTT_RING_IF_STATS_SHADOW_HEAD_IDX,2534htt_stats_buf->shadow_head_idx__shadow_tail_idx));2535len += scnprintf(buf + len, buf_len - len, "shadow_tail_idx = %lu\n",2536FIELD_GET(HTT_RING_IF_STATS_SHADOW_TAIL_IDX,2537htt_stats_buf->shadow_head_idx__shadow_tail_idx));2538len += scnprintf(buf + len, buf_len - len, "num_tail_incr = %u\n",2539htt_stats_buf->num_tail_incr);2540len += scnprintf(buf + len, buf_len - len, "lwm_thresh = %lu\n",2541FIELD_GET(HTT_RING_IF_STATS_LWM_THRESH,2542htt_stats_buf->lwm_thresh__hwm_thresh));2543len += scnprintf(buf + len, buf_len - len, "hwm_thresh = %lu\n",2544FIELD_GET(HTT_RING_IF_STATS_HWM_THRESH,2545htt_stats_buf->lwm_thresh__hwm_thresh));2546len += scnprintf(buf + len, buf_len - len, "overrun_hit_count = %u\n",2547htt_stats_buf->overrun_hit_count);2548len += scnprintf(buf + len, buf_len - len, "underrun_hit_count = %u\n",2549htt_stats_buf->underrun_hit_count);2550len += scnprintf(buf + len, buf_len - len, "prod_blockwait_count = %u\n",2551htt_stats_buf->prod_blockwait_count);2552len += scnprintf(buf + len, buf_len - len, "cons_blockwait_count = %u\n",2553htt_stats_buf->cons_blockwait_count);25542555PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->low_wm_hit_count,2556"low_wm_hit_count", HTT_STATS_LOW_WM_BINS, "\n");2557PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->high_wm_hit_count,2558"high_wm_hit_count", HTT_STATS_HIGH_WM_BINS, "\n\n");25592560if (len >= buf_len)2561buf[buf_len - 1] = 0;2562else2563buf[len] = 0;25642565stats_req->buf_len = len;2566}25672568static inline void htt_print_ring_if_cmn_tlv(const void *tag_buf,2569struct debug_htt_stats_req *stats_req)2570{2571const struct htt_ring_if_cmn_tlv *htt_stats_buf = tag_buf;2572u8 *buf = stats_req->buf;2573u32 len = stats_req->buf_len;2574u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;25752576len += scnprintf(buf + len, buf_len - len, "HTT_RING_IF_CMN_TLV:\n");2577len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2578FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2579len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2580htt_stats_buf->num_records);25812582if (len >= buf_len)2583buf[buf_len - 1] = 0;2584else2585buf[len] = 0;25862587stats_req->buf_len = len;2588}25892590static inline void htt_print_sfm_client_user_tlv_v(const void *tag_buf,2591u16 tag_len,2592struct debug_htt_stats_req *stats_req)2593{2594const struct htt_sfm_client_user_tlv_v *htt_stats_buf = tag_buf;2595u8 *buf = stats_req->buf;2596u32 len = stats_req->buf_len;2597u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2598u16 num_elems = tag_len >> 2;25992600len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_USER_TLV_V:\n");26012602PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->dwords_used_by_user_n,2603"dwords_used_by_user_n", num_elems, "\n\n");26042605if (len >= buf_len)2606buf[buf_len - 1] = 0;2607else2608buf[len] = 0;26092610stats_req->buf_len = len;2611}26122613static inline void htt_print_sfm_client_tlv(const void *tag_buf,2614struct debug_htt_stats_req *stats_req)2615{2616const struct htt_sfm_client_tlv *htt_stats_buf = tag_buf;2617u8 *buf = stats_req->buf;2618u32 len = stats_req->buf_len;2619u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;26202621len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_TLV:\n");2622len += scnprintf(buf + len, buf_len - len, "client_id = %u\n",2623htt_stats_buf->client_id);2624len += scnprintf(buf + len, buf_len - len, "buf_min = %u\n",2625htt_stats_buf->buf_min);2626len += scnprintf(buf + len, buf_len - len, "buf_max = %u\n",2627htt_stats_buf->buf_max);2628len += scnprintf(buf + len, buf_len - len, "buf_busy = %u\n",2629htt_stats_buf->buf_busy);2630len += scnprintf(buf + len, buf_len - len, "buf_alloc = %u\n",2631htt_stats_buf->buf_alloc);2632len += scnprintf(buf + len, buf_len - len, "buf_avail = %u\n",2633htt_stats_buf->buf_avail);2634len += scnprintf(buf + len, buf_len - len, "num_users = %u\n\n",2635htt_stats_buf->num_users);26362637if (len >= buf_len)2638buf[buf_len - 1] = 0;2639else2640buf[len] = 0;26412642stats_req->buf_len = len;2643}26442645static inline void htt_print_sfm_cmn_tlv(const void *tag_buf,2646struct debug_htt_stats_req *stats_req)2647{2648const struct htt_sfm_cmn_tlv *htt_stats_buf = tag_buf;2649u8 *buf = stats_req->buf;2650u32 len = stats_req->buf_len;2651u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;26522653len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CMN_TLV:\n");2654len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2655FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2656len += scnprintf(buf + len, buf_len - len, "buf_total = %u\n",2657htt_stats_buf->buf_total);2658len += scnprintf(buf + len, buf_len - len, "mem_empty = %u\n",2659htt_stats_buf->mem_empty);2660len += scnprintf(buf + len, buf_len - len, "deallocate_bufs = %u\n",2661htt_stats_buf->deallocate_bufs);2662len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2663htt_stats_buf->num_records);26642665if (len >= buf_len)2666buf[buf_len - 1] = 0;2667else2668buf[len] = 0;26692670stats_req->buf_len = len;2671}26722673static inline void htt_print_sring_stats_tlv(const void *tag_buf,2674struct debug_htt_stats_req *stats_req)2675{2676const struct htt_sring_stats_tlv *htt_stats_buf = tag_buf;2677u8 *buf = stats_req->buf;2678u32 len = stats_req->buf_len;2679u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;26802681len += scnprintf(buf + len, buf_len - len, "HTT_SRING_STATS_TLV:\n");2682len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2683FIELD_GET(HTT_SRING_STATS_MAC_ID,2684htt_stats_buf->mac_id__ring_id__arena__ep));2685len += scnprintf(buf + len, buf_len - len, "ring_id = %lu\n",2686FIELD_GET(HTT_SRING_STATS_RING_ID,2687htt_stats_buf->mac_id__ring_id__arena__ep));2688len += scnprintf(buf + len, buf_len - len, "arena = %lu\n",2689FIELD_GET(HTT_SRING_STATS_ARENA,2690htt_stats_buf->mac_id__ring_id__arena__ep));2691len += scnprintf(buf + len, buf_len - len, "ep = %lu\n",2692FIELD_GET(HTT_SRING_STATS_EP,2693htt_stats_buf->mac_id__ring_id__arena__ep));2694len += scnprintf(buf + len, buf_len - len, "base_addr_lsb = 0x%x\n",2695htt_stats_buf->base_addr_lsb);2696len += scnprintf(buf + len, buf_len - len, "base_addr_msb = 0x%x\n",2697htt_stats_buf->base_addr_msb);2698len += scnprintf(buf + len, buf_len - len, "ring_size = %u\n",2699htt_stats_buf->ring_size);2700len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",2701htt_stats_buf->elem_size);2702len += scnprintf(buf + len, buf_len - len, "num_avail_words = %lu\n",2703FIELD_GET(HTT_SRING_STATS_NUM_AVAIL_WORDS,2704htt_stats_buf->num_avail_words__num_valid_words));2705len += scnprintf(buf + len, buf_len - len, "num_valid_words = %lu\n",2706FIELD_GET(HTT_SRING_STATS_NUM_VALID_WORDS,2707htt_stats_buf->num_avail_words__num_valid_words));2708len += scnprintf(buf + len, buf_len - len, "head_ptr = %lu\n",2709FIELD_GET(HTT_SRING_STATS_HEAD_PTR,2710htt_stats_buf->head_ptr__tail_ptr));2711len += scnprintf(buf + len, buf_len - len, "tail_ptr = %lu\n",2712FIELD_GET(HTT_SRING_STATS_TAIL_PTR,2713htt_stats_buf->head_ptr__tail_ptr));2714len += scnprintf(buf + len, buf_len - len, "consumer_empty = %lu\n",2715FIELD_GET(HTT_SRING_STATS_CONSUMER_EMPTY,2716htt_stats_buf->consumer_empty__producer_full));2717len += scnprintf(buf + len, buf_len - len, "producer_full = %lu\n",2718FIELD_GET(HTT_SRING_STATS_PRODUCER_FULL,2719htt_stats_buf->consumer_empty__producer_full));2720len += scnprintf(buf + len, buf_len - len, "prefetch_count = %lu\n",2721FIELD_GET(HTT_SRING_STATS_PREFETCH_COUNT,2722htt_stats_buf->prefetch_count__internal_tail_ptr));2723len += scnprintf(buf + len, buf_len - len, "internal_tail_ptr = %lu\n\n",2724FIELD_GET(HTT_SRING_STATS_INTERNAL_TAIL_PTR,2725htt_stats_buf->prefetch_count__internal_tail_ptr));27262727if (len >= buf_len)2728buf[buf_len - 1] = 0;2729else2730buf[len] = 0;27312732stats_req->buf_len = len;2733}27342735static inline void htt_print_sring_cmn_tlv(const void *tag_buf,2736struct debug_htt_stats_req *stats_req)2737{2738const struct htt_sring_cmn_tlv *htt_stats_buf = tag_buf;2739u8 *buf = stats_req->buf;2740u32 len = stats_req->buf_len;2741u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;27422743len += scnprintf(buf + len, buf_len - len, "HTT_SRING_CMN_TLV:\n");2744len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2745htt_stats_buf->num_records);27462747if (len >= buf_len)2748buf[buf_len - 1] = 0;2749else2750buf[len] = 0;27512752stats_req->buf_len = len;2753}27542755static inline void htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf,2756struct debug_htt_stats_req *stats_req)2757{2758const struct htt_tx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;2759u8 *buf = stats_req->buf;2760u32 len = stats_req->buf_len;2761u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2762u8 j;27632764len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_RATE_STATS_TLV:\n");2765len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2766FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2767len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",2768htt_stats_buf->tx_ldpc);2769len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_ldpc = %u\n",2770htt_stats_buf->ac_mu_mimo_tx_ldpc);2771len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_ldpc = %u\n",2772htt_stats_buf->ax_mu_mimo_tx_ldpc);2773len += scnprintf(buf + len, buf_len - len, "ofdma_tx_ldpc = %u\n",2774htt_stats_buf->ofdma_tx_ldpc);2775len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",2776htt_stats_buf->rts_cnt);2777len += scnprintf(buf + len, buf_len - len, "rts_success = %u\n",2778htt_stats_buf->rts_success);2779len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",2780htt_stats_buf->ack_rssi);27812782len += scnprintf(buf + len, buf_len - len,2783"Legacy CCK Rates: 1 Mbps: %u, 2 Mbps: %u, 5.5 Mbps: %u, 11 Mbps: %u\n",2784htt_stats_buf->tx_legacy_cck_rate[0],2785htt_stats_buf->tx_legacy_cck_rate[1],2786htt_stats_buf->tx_legacy_cck_rate[2],2787htt_stats_buf->tx_legacy_cck_rate[3]);27882789len += scnprintf(buf + len, buf_len - len,2790"Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n"2791" 24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n",2792htt_stats_buf->tx_legacy_ofdm_rate[0],2793htt_stats_buf->tx_legacy_ofdm_rate[1],2794htt_stats_buf->tx_legacy_ofdm_rate[2],2795htt_stats_buf->tx_legacy_ofdm_rate[3],2796htt_stats_buf->tx_legacy_ofdm_rate[4],2797htt_stats_buf->tx_legacy_ofdm_rate[5],2798htt_stats_buf->tx_legacy_ofdm_rate[6],2799htt_stats_buf->tx_legacy_ofdm_rate[7]);28002801PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mcs, "tx_mcs",2802HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2803PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_mcs,2804"ac_mu_mimo_tx_mcs", HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2805PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_mcs,2806"ax_mu_mimo_tx_mcs", HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2807PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_mcs, "ofdma_tx_mcs",2808HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2809PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_nss, "tx_nss",2810HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2811PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_nss,2812"ac_mu_mimo_tx_nss",2813HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2814PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_nss,2815"ax_mu_mimo_tx_nss",2816HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2817PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_nss, "ofdma_tx_nss",2818HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2819PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_bw, "tx_bw",2820HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2821PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_bw,2822"ac_mu_mimo_tx_bw", HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2823PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_bw,2824"ax_mu_mimo_tx_bw",2825HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2826PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_bw, "ofdma_tx_bw",2827HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2828PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_stbc, "tx_stbc",2829HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2830PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_pream, "tx_pream",2831HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");28322833len += scnprintf(buf + len, buf_len - len, "HE LTF: 1x: %u, 2x: %u, 4x: %u\n",2834htt_stats_buf->tx_he_ltf[1],2835htt_stats_buf->tx_he_ltf[2],2836htt_stats_buf->tx_he_ltf[3]);28372838/* SU GI Stats */2839for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2840len += scnprintf(buf + len, (buf_len - len),2841"tx_gi[%u] = ", j);2842PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_gi[j], NULL,2843HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2844}28452846/* AC MU-MIMO GI Stats */2847for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2848len += scnprintf(buf + len, (buf_len - len),2849"ac_mu_mimo_tx_gi[%u] = ", j);2850PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_gi[j],2851NULL, HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2852}28532854/* AX MU-MIMO GI Stats */2855for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2856len += scnprintf(buf + len, (buf_len - len),2857"ax_mu_mimo_tx_gi[%u] = ", j);2858PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_gi[j],2859NULL, HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2860}28612862/* DL OFDMA GI Stats */2863for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2864len += scnprintf(buf + len, (buf_len - len),2865"ofdma_tx_gi[%u] = ", j);2866PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_gi[j], NULL,2867HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2868}28692870PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_dcm, "tx_dcm",2871HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");28722873if (len >= buf_len)2874buf[buf_len - 1] = 0;2875else2876buf[len] = 0;28772878stats_req->buf_len = len;2879}28802881static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,2882struct debug_htt_stats_req *stats_req)2883{2884const struct htt_rx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;2885u8 *buf = stats_req->buf;2886u32 len = stats_req->buf_len;2887u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2888u8 i, j;28892890len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_STATS_TLV:\n");2891len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2892FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2893len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",2894htt_stats_buf->nsts);2895len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",2896htt_stats_buf->rx_ldpc);2897len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",2898htt_stats_buf->rts_cnt);2899len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",2900htt_stats_buf->rssi_mgmt);2901len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",2902htt_stats_buf->rssi_data);2903len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",2904htt_stats_buf->rssi_comb);2905len += scnprintf(buf + len, buf_len - len, "rssi_in_dbm = %d\n",2906htt_stats_buf->rssi_in_dbm);29072908PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs, "rx_mcs",2909HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2910PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_nss, "rx_nss",2911HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2912PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_dcm, "rx_dcm",2913HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");2914PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc, "rx_stbc",2915HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2916PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_bw, "rx_bw",2917HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");29182919len += scnprintf(buf + len, buf_len - len, "rx_evm_nss_count = %u\n",2920htt_stats_buf->nss_count);29212922len += scnprintf(buf + len, buf_len - len, "rx_evm_pilot_count = %u\n",2923htt_stats_buf->pilot_count);29242925for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {2926len += scnprintf(buf + len, buf_len - len,2927"pilot_evm_db[%u] = ", j);2928for (i = 0; i < HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS; i++)2929len += scnprintf(buf + len,2930buf_len - len,2931" %u:%d,",2932i,2933htt_stats_buf->rx_pilot_evm_db[j][i]);2934len += scnprintf(buf + len, buf_len - len, "\n");2935}29362937len += scnprintf(buf + len, buf_len - len,2938"pilot_evm_db_mean = ");2939for (i = 0; i < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)2940len += scnprintf(buf + len,2941buf_len - len,2942" %u:%d,", i,2943htt_stats_buf->rx_pilot_evm_db_mean[i]);2944len += scnprintf(buf + len, buf_len - len, "\n");29452946for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {2947len += scnprintf(buf + len, buf_len - len,2948"rssi_chain[%u] = ", j);2949PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain[j], NULL,2950HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2951}29522953for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2954len += scnprintf(buf + len, buf_len - len,2955"rx_gi[%u] = ", j);2956PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi[j], NULL,2957HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2958}29592960PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_pream, "rx_pream",2961HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");29622963len += scnprintf(buf + len, buf_len - len, "rx_11ax_su_ext = %u\n",2964htt_stats_buf->rx_11ax_su_ext);2965len += scnprintf(buf + len, buf_len - len, "rx_11ac_mumimo = %u\n",2966htt_stats_buf->rx_11ac_mumimo);2967len += scnprintf(buf + len, buf_len - len, "rx_11ax_mumimo = %u\n",2968htt_stats_buf->rx_11ax_mumimo);2969len += scnprintf(buf + len, buf_len - len, "rx_11ax_ofdma = %u\n",2970htt_stats_buf->rx_11ax_ofdma);2971len += scnprintf(buf + len, buf_len - len, "txbf = %u\n",2972htt_stats_buf->txbf);29732974len += scnprintf(buf + len, buf_len - len, "\nrx_su_ndpa = %u",2975htt_stats_buf->rx_su_ndpa);2976PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_su_txbf_mcs,2977"rx_11ax_su_txbf_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,2978"\n");29792980len += scnprintf(buf + len, buf_len - len, "\nrx_mu_ndpa = %u",2981htt_stats_buf->rx_mu_ndpa);2982PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_mu_txbf_mcs,2983"rx_11ax_mu_txbf_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,2984"\n");29852986len += scnprintf(buf + len, buf_len - len, "\nrx_br_poll = %u",2987htt_stats_buf->rx_br_poll);29882989PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_legacy_cck_rate,2990"rx_legacy_cck_rate",2991HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS, "\n");29922993PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_legacy_ofdm_rate,2994"rx_legacy_ofdm_rate",2995HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS, "\n");29962997len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_low = %u\n",2998htt_stats_buf->rx_active_dur_us_low);2999len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_high = %u\n",3000htt_stats_buf->rx_active_dur_us_high);3001len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n",3002htt_stats_buf->rx_11ax_ul_ofdma);30033004PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_mcs,3005"ul_ofdma_rx_mcs",3006HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");30073008for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {3009len += scnprintf(buf + len, buf_len - len,3010"ul_ofdma_rx_gi[%u] = ", j);3011PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_gi[j], NULL,3012HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");3013}30143015PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_nss,3016"ul_ofdma_rx_nss",3017HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");30183019PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_bw, "ul_ofdma_rx_bw",3020HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");30213022len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n",3023htt_stats_buf->ul_ofdma_rx_stbc);3024len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n",3025htt_stats_buf->ul_ofdma_rx_ldpc);30263027PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_non_data_ppdu,3028"rx_ulofdma_non_data_ppdu",3029HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");30303031PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_data_ppdu,3032"rx_ulofdma_data_ppdu", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");30333034PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_mpdu_ok,3035"rx_ulofdma_mpdu_ok", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");30363037PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_mpdu_fail,3038"rx_ulofdma_mpdu_fail", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");30393040for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {3041len += scnprintf(buf + len, buf_len - len,3042"rx_ul_fd_rssi: nss[%u] = ", j);3043for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++)3044len += scnprintf(buf + len,3045buf_len - len,3046" %u:%d,",3047i, htt_stats_buf->rx_ul_fd_rssi[j][i]);3048len += scnprintf(buf + len, buf_len - len, "\n");3049}30503051PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_non_data_nusers,3052"rx_ulofdma_non_data_nusers", HTT_RX_PDEV_MAX_OFDMA_NUM_USER,3053"\n");30543055PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_data_nusers,3056"rx_ulofdma_data_nusers", HTT_RX_PDEV_MAX_OFDMA_NUM_USER,3057"\n");30583059PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_mcs,3060"rx_11ax_dl_ofdma_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,3061"\n");30623063PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_ru,3064"rx_11ax_dl_ofdma_ru", HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS,3065"\n");30663067PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_non_data_ppdu,3068"rx_ulmumimo_non_data_ppdu", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3069"\n");30703071PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_data_ppdu,3072"rx_ulmumimo_data_ppdu", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3073"\n");30743075PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_mpdu_ok,3076"rx_ulmumimo_mpdu_ok", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3077"\n");30783079PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_mpdu_fail,3080"rx_ulmumimo_mpdu_fail", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3081"\n");30823083len += scnprintf(buf + len, buf_len - len, "per_chain_rssi_pkt_type = %#x\n",3084htt_stats_buf->per_chain_rssi_pkt_type);30853086for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {3087len += scnprintf(buf + len, buf_len - len,3088"rx_per_chain_rssi_in_dbm[%u] = ", j);3089for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)3090len += scnprintf(buf + len,3091buf_len - len,3092" %u:%d,",3093i,3094htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]);3095len += scnprintf(buf + len, buf_len - len, "\n");3096}3097len += scnprintf(buf + len, buf_len - len, "\n");30983099if (len >= buf_len)3100buf[buf_len - 1] = 0;3101else3102buf[len] = 0;31033104stats_req->buf_len = len;3105}31063107static inline void htt_print_rx_soc_fw_stats_tlv(const void *tag_buf,3108struct debug_htt_stats_req *stats_req)3109{3110const struct htt_rx_soc_fw_stats_tlv *htt_stats_buf = tag_buf;3111u8 *buf = stats_req->buf;3112u32 len = stats_req->buf_len;3113u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;31143115len += scnprintf(buf + len, buf_len - len, "HTT_RX_SOC_FW_STATS_TLV:\n");3116len += scnprintf(buf + len, buf_len - len, "fw_reo_ring_data_msdu = %u\n",3117htt_stats_buf->fw_reo_ring_data_msdu);3118len += scnprintf(buf + len, buf_len - len, "fw_to_host_data_msdu_bcmc = %u\n",3119htt_stats_buf->fw_to_host_data_msdu_bcmc);3120len += scnprintf(buf + len, buf_len - len, "fw_to_host_data_msdu_uc = %u\n",3121htt_stats_buf->fw_to_host_data_msdu_uc);3122len += scnprintf(buf + len, buf_len - len,3123"ofld_remote_data_buf_recycle_cnt = %u\n",3124htt_stats_buf->ofld_remote_data_buf_recycle_cnt);3125len += scnprintf(buf + len, buf_len - len,3126"ofld_remote_free_buf_indication_cnt = %u\n",3127htt_stats_buf->ofld_remote_free_buf_indication_cnt);3128len += scnprintf(buf + len, buf_len - len,3129"ofld_buf_to_host_data_msdu_uc = %u\n",3130htt_stats_buf->ofld_buf_to_host_data_msdu_uc);3131len += scnprintf(buf + len, buf_len - len,3132"reo_fw_ring_to_host_data_msdu_uc = %u\n",3133htt_stats_buf->reo_fw_ring_to_host_data_msdu_uc);3134len += scnprintf(buf + len, buf_len - len, "wbm_sw_ring_reap = %u\n",3135htt_stats_buf->wbm_sw_ring_reap);3136len += scnprintf(buf + len, buf_len - len, "wbm_forward_to_host_cnt = %u\n",3137htt_stats_buf->wbm_forward_to_host_cnt);3138len += scnprintf(buf + len, buf_len - len, "wbm_target_recycle_cnt = %u\n",3139htt_stats_buf->wbm_target_recycle_cnt);3140len += scnprintf(buf + len, buf_len - len,3141"target_refill_ring_recycle_cnt = %u\n",3142htt_stats_buf->target_refill_ring_recycle_cnt);31433144if (len >= buf_len)3145buf[buf_len - 1] = 0;3146else3147buf[len] = 0;31483149stats_req->buf_len = len;3150}31513152static inline void3153htt_print_rx_soc_fw_refill_ring_empty_tlv_v(const void *tag_buf,3154u16 tag_len,3155struct debug_htt_stats_req *stats_req)3156{3157const struct htt_rx_soc_fw_refill_ring_empty_tlv_v *htt_stats_buf = tag_buf;3158u8 *buf = stats_req->buf;3159u32 len = stats_req->buf_len;3160u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3161u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_REFILL_MAX_RING);31623163len += scnprintf(buf + len, buf_len - len,3164"HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:\n");31653166PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->refill_ring_empty_cnt,3167"refill_ring_empty_cnt", num_elems, "\n\n");31683169if (len >= buf_len)3170buf[buf_len - 1] = 0;3171else3172buf[len] = 0;31733174stats_req->buf_len = len;3175}31763177static inline void3178htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(const void *tag_buf,3179u16 tag_len,3180struct debug_htt_stats_req *stats_req)3181{3182const struct htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *htt_stats_buf =3183tag_buf;3184u8 *buf = stats_req->buf;3185u32 len = stats_req->buf_len;3186u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3187u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_RXDMA_MAX_ERR_CODE);31883189len += scnprintf(buf + len, buf_len - len,3190"HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V:\n");31913192PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rxdma_err, "rxdma_err",3193num_elems, "\n\n");31943195if (len >= buf_len)3196buf[buf_len - 1] = 0;3197else3198buf[len] = 0;31993200stats_req->buf_len = len;3201}32023203static inline void3204htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(const void *tag_buf,3205u16 tag_len,3206struct debug_htt_stats_req *stats_req)3207{3208const struct htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *htt_stats_buf = tag_buf;3209u8 *buf = stats_req->buf;3210u32 len = stats_req->buf_len;3211u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3212u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_REO_MAX_ERR_CODE);32133214len += scnprintf(buf + len, buf_len - len,3215"HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V:\n");32163217PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->reo_err, "reo_err",3218num_elems, "\n\n");32193220if (len >= buf_len)3221buf[buf_len - 1] = 0;3222else3223buf[len] = 0;32243225stats_req->buf_len = len;3226}32273228static inline void3229htt_print_rx_reo_debug_stats_tlv_v(const void *tag_buf,3230struct debug_htt_stats_req *stats_req)3231{3232const struct htt_rx_reo_resource_stats_tlv_v *htt_stats_buf = tag_buf;3233u8 *buf = stats_req->buf;3234u32 len = stats_req->buf_len;3235u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;32363237len += scnprintf(buf + len, buf_len - len, "HTT_RX_REO_RESOURCE_STATS_TLV:\n");3238len += scnprintf(buf + len, buf_len - len, "sample_id = %u\n",3239htt_stats_buf->sample_id);3240len += scnprintf(buf + len, buf_len - len, "total_max = %u\n",3241htt_stats_buf->total_max);3242len += scnprintf(buf + len, buf_len - len, "total_avg = %u\n",3243htt_stats_buf->total_avg);3244len += scnprintf(buf + len, buf_len - len, "total_sample = %u\n",3245htt_stats_buf->total_sample);3246len += scnprintf(buf + len, buf_len - len, "non_zeros_avg = %u\n",3247htt_stats_buf->non_zeros_avg);3248len += scnprintf(buf + len, buf_len - len, "non_zeros_sample = %u\n",3249htt_stats_buf->non_zeros_sample);3250len += scnprintf(buf + len, buf_len - len, "last_non_zeros_max = %u\n",3251htt_stats_buf->last_non_zeros_max);3252len += scnprintf(buf + len, buf_len - len, "last_non_zeros_min %u\n",3253htt_stats_buf->last_non_zeros_min);3254len += scnprintf(buf + len, buf_len - len, "last_non_zeros_avg %u\n",3255htt_stats_buf->last_non_zeros_avg);3256len += scnprintf(buf + len, buf_len - len, "last_non_zeros_sample %u\n\n",3257htt_stats_buf->last_non_zeros_sample);32583259if (len >= buf_len)3260buf[buf_len - 1] = 0;3261else3262buf[len] = 0;32633264stats_req->buf_len = len;3265}32663267static inline void3268htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(const void *tag_buf,3269u16 tag_len,3270struct debug_htt_stats_req *stats_req)3271{3272const struct htt_rx_soc_fw_refill_ring_num_refill_tlv_v *htt_stats_buf = tag_buf;3273u8 *buf = stats_req->buf;3274u32 len = stats_req->buf_len;3275u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3276u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_REFILL_MAX_RING);32773278len += scnprintf(buf + len, buf_len - len,3279"HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:\n");32803281PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->refill_ring_num_refill,3282"refill_ring_num_refill", num_elems, "\n\n");32833284if (len >= buf_len)3285buf[buf_len - 1] = 0;3286else3287buf[len] = 0;32883289stats_req->buf_len = len;3290}32913292static inline void htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf,3293struct debug_htt_stats_req *stats_req)3294{3295const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf;3296u8 *buf = stats_req->buf;3297u32 len = stats_req->buf_len;3298u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;32993300len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n");3301len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",3302FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));3303len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n",3304htt_stats_buf->ppdu_recvd);3305len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n",3306htt_stats_buf->mpdu_cnt_fcs_ok);3307len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n",3308htt_stats_buf->mpdu_cnt_fcs_err);3309len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n",3310htt_stats_buf->tcp_msdu_cnt);3311len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n",3312htt_stats_buf->tcp_ack_msdu_cnt);3313len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n",3314htt_stats_buf->udp_msdu_cnt);3315len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n",3316htt_stats_buf->other_msdu_cnt);3317len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n",3318htt_stats_buf->fw_ring_mpdu_ind);33193320PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_mgmt_subtype,3321"fw_ring_mgmt_subtype", HTT_STATS_SUBTYPE_MAX, "\n");33223323PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_ctrl_subtype,3324"fw_ring_ctrl_subtype", HTT_STATS_SUBTYPE_MAX, "\n");33253326len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n",3327htt_stats_buf->fw_ring_mcast_data_msdu);3328len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n",3329htt_stats_buf->fw_ring_bcast_data_msdu);3330len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n",3331htt_stats_buf->fw_ring_ucast_data_msdu);3332len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n",3333htt_stats_buf->fw_ring_null_data_msdu);3334len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n",3335htt_stats_buf->fw_ring_mpdu_drop);3336len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n",3337htt_stats_buf->ofld_local_data_ind_cnt);3338len += scnprintf(buf + len, buf_len - len,3339"ofld_local_data_buf_recycle_cnt = %u\n",3340htt_stats_buf->ofld_local_data_buf_recycle_cnt);3341len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n",3342htt_stats_buf->drx_local_data_ind_cnt);3343len += scnprintf(buf + len, buf_len - len,3344"drx_local_data_buf_recycle_cnt = %u\n",3345htt_stats_buf->drx_local_data_buf_recycle_cnt);3346len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n",3347htt_stats_buf->local_nondata_ind_cnt);3348len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n",3349htt_stats_buf->local_nondata_buf_recycle_cnt);3350len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n",3351htt_stats_buf->fw_status_buf_ring_refill_cnt);3352len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n",3353htt_stats_buf->fw_status_buf_ring_empty_cnt);3354len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n",3355htt_stats_buf->fw_pkt_buf_ring_refill_cnt);3356len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n",3357htt_stats_buf->fw_pkt_buf_ring_empty_cnt);3358len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n",3359htt_stats_buf->fw_link_buf_ring_refill_cnt);3360len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n",3361htt_stats_buf->fw_link_buf_ring_empty_cnt);3362len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n",3363htt_stats_buf->host_pkt_buf_ring_refill_cnt);3364len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n",3365htt_stats_buf->host_pkt_buf_ring_empty_cnt);3366len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n",3367htt_stats_buf->mon_pkt_buf_ring_refill_cnt);3368len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n",3369htt_stats_buf->mon_pkt_buf_ring_empty_cnt);3370len += scnprintf(buf + len, buf_len - len,3371"mon_status_buf_ring_refill_cnt = %u\n",3372htt_stats_buf->mon_status_buf_ring_refill_cnt);3373len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n",3374htt_stats_buf->mon_status_buf_ring_empty_cnt);3375len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n",3376htt_stats_buf->mon_desc_buf_ring_refill_cnt);3377len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n",3378htt_stats_buf->mon_desc_buf_ring_empty_cnt);3379len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n",3380htt_stats_buf->mon_dest_ring_update_cnt);3381len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n",3382htt_stats_buf->mon_dest_ring_full_cnt);3383len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n",3384htt_stats_buf->rx_suspend_cnt);3385len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n",3386htt_stats_buf->rx_suspend_fail_cnt);3387len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n",3388htt_stats_buf->rx_resume_cnt);3389len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n",3390htt_stats_buf->rx_resume_fail_cnt);3391len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n",3392htt_stats_buf->rx_ring_switch_cnt);3393len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n",3394htt_stats_buf->rx_ring_restore_cnt);3395len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",3396htt_stats_buf->rx_flush_cnt);3397len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n\n",3398htt_stats_buf->rx_recovery_reset_cnt);33993400if (len >= buf_len)3401buf[buf_len - 1] = 0;3402else3403buf[len] = 0;34043405stats_req->buf_len = len;3406}34073408static inline void3409htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(const void *tag_buf,3410struct debug_htt_stats_req *stats_req)3411{3412const struct htt_rx_pdev_fw_ring_mpdu_err_tlv_v *htt_stats_buf = tag_buf;3413u8 *buf = stats_req->buf;3414u32 len = stats_req->buf_len;3415u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;34163417len += scnprintf(buf + len, buf_len - len,3418"HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:\n");34193420PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_mpdu_err,3421"fw_ring_mpdu_err", HTT_RX_STATS_RXDMA_MAX_ERR, "\n");34223423if (len >= buf_len)3424buf[buf_len - 1] = 0;3425else3426buf[len] = 0;34273428stats_req->buf_len = len;3429}34303431static inline void3432htt_print_rx_pdev_fw_mpdu_drop_tlv_v(const void *tag_buf,3433u16 tag_len,3434struct debug_htt_stats_req *stats_req)3435{3436const struct htt_rx_pdev_fw_mpdu_drop_tlv_v *htt_stats_buf = tag_buf;3437u8 *buf = stats_req->buf;3438u32 len = stats_req->buf_len;3439u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3440u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_FW_DROP_REASON_MAX);34413442len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:\n");34433444PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_mpdu_drop, "fw_mpdu_drop",3445num_elems, "\n\n");34463447if (len >= buf_len)3448buf[buf_len - 1] = 0;3449else3450buf[len] = 0;34513452stats_req->buf_len = len;3453}34543455static inline void3456htt_print_rx_pdev_fw_stats_phy_err_tlv(const void *tag_buf,3457struct debug_htt_stats_req *stats_req)3458{3459const struct htt_rx_pdev_fw_stats_phy_err_tlv *htt_stats_buf = tag_buf;3460u8 *buf = stats_req->buf;3461u32 len = stats_req->buf_len;3462u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;34633464len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV:\n");3465len += scnprintf(buf + len, buf_len - len, "mac_id__word = %u\n",3466htt_stats_buf->mac_id__word);3467len += scnprintf(buf + len, buf_len - len, "total_phy_err_nct = %u\n",3468htt_stats_buf->total_phy_err_cnt);34693470PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->phy_err, "phy_errs",3471HTT_STATS_PHY_ERR_MAX, "\n\n");34723473if (len >= buf_len)3474buf[buf_len - 1] = 0;3475else3476buf[len] = 0;34773478stats_req->buf_len = len;3479}34803481static inline void3482htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf,3483struct debug_htt_stats_req *stats_req)3484{3485const struct htt_pdev_cca_stats_hist_v1_tlv *htt_stats_buf = tag_buf;3486u8 *buf = stats_req->buf;3487u32 len = stats_req->buf_len;3488u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;34893490len += scnprintf(buf + len, buf_len - len, "\nHTT_PDEV_CCA_STATS_HIST_TLV:\n");3491len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",3492htt_stats_buf->chan_num);3493len += scnprintf(buf + len, buf_len - len, "num_records = %u\n",3494htt_stats_buf->num_records);3495len += scnprintf(buf + len, buf_len - len, "valid_cca_counters_bitmap = 0x%x\n",3496htt_stats_buf->valid_cca_counters_bitmap);3497len += scnprintf(buf + len, buf_len - len, "collection_interval = %u\n\n",3498htt_stats_buf->collection_interval);34993500len += scnprintf(buf + len, buf_len - len,3501"HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n");3502len += scnprintf(buf + len, buf_len - len,3503"| tx_frame| rx_frame| rx_clear| my_rx_frame| cnt| med_rx_idle| med_tx_idle_global| cca_obss|\n");35043505if (len >= buf_len)3506buf[buf_len - 1] = 0;3507else3508buf[len] = 0;35093510stats_req->buf_len = len;3511}35123513static inline void3514htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf,3515struct debug_htt_stats_req *stats_req)3516{3517const struct htt_pdev_stats_cca_counters_tlv *htt_stats_buf = tag_buf;3518u8 *buf = stats_req->buf;3519u32 len = stats_req->buf_len;3520u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;35213522len += scnprintf(buf + len, buf_len - len,3523"|%10u| %10u| %10u| %11u| %10u| %11u| %18u| %10u|\n",3524htt_stats_buf->tx_frame_usec,3525htt_stats_buf->rx_frame_usec,3526htt_stats_buf->rx_clear_usec,3527htt_stats_buf->my_rx_frame_usec,3528htt_stats_buf->usec_cnt,3529htt_stats_buf->med_rx_idle_usec,3530htt_stats_buf->med_tx_idle_global_usec,3531htt_stats_buf->cca_obss_usec);35323533if (len >= buf_len)3534buf[buf_len - 1] = 0;3535else3536buf[len] = 0;35373538stats_req->buf_len = len;3539}35403541static inline void htt_print_hw_stats_whal_tx_tlv(const void *tag_buf,3542struct debug_htt_stats_req *stats_req)3543{3544const struct htt_hw_stats_whal_tx_tlv *htt_stats_buf = tag_buf;3545u8 *buf = stats_req->buf;3546u32 len = stats_req->buf_len;3547u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;35483549len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WHAL_TX_TLV:\n");3550len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",3551FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));3552len += scnprintf(buf + len, buf_len - len, "last_unpause_ppdu_id = %u\n",3553htt_stats_buf->last_unpause_ppdu_id);3554len += scnprintf(buf + len, buf_len - len, "hwsch_unpause_wait_tqm_write = %u\n",3555htt_stats_buf->hwsch_unpause_wait_tqm_write);3556len += scnprintf(buf + len, buf_len - len, "hwsch_dummy_tlv_skipped = %u\n",3557htt_stats_buf->hwsch_dummy_tlv_skipped);3558len += scnprintf(buf + len, buf_len - len,3559"hwsch_misaligned_offset_received = %u\n",3560htt_stats_buf->hwsch_misaligned_offset_received);3561len += scnprintf(buf + len, buf_len - len, "hwsch_reset_count = %u\n",3562htt_stats_buf->hwsch_reset_count);3563len += scnprintf(buf + len, buf_len - len, "hwsch_dev_reset_war = %u\n",3564htt_stats_buf->hwsch_dev_reset_war);3565len += scnprintf(buf + len, buf_len - len, "hwsch_delayed_pause = %u\n",3566htt_stats_buf->hwsch_delayed_pause);3567len += scnprintf(buf + len, buf_len - len, "hwsch_long_delayed_pause = %u\n",3568htt_stats_buf->hwsch_long_delayed_pause);3569len += scnprintf(buf + len, buf_len - len, "sch_rx_ppdu_no_response = %u\n",3570htt_stats_buf->sch_rx_ppdu_no_response);3571len += scnprintf(buf + len, buf_len - len, "sch_selfgen_response = %u\n",3572htt_stats_buf->sch_selfgen_response);3573len += scnprintf(buf + len, buf_len - len, "sch_rx_sifs_resp_trigger= %u\n\n",3574htt_stats_buf->sch_rx_sifs_resp_trigger);35753576if (len >= buf_len)3577buf[buf_len - 1] = 0;3578else3579buf[len] = 0;35803581stats_req->buf_len = len;3582}35833584static inline void3585htt_print_pdev_stats_twt_sessions_tlv(const void *tag_buf,3586struct debug_htt_stats_req *stats_req)3587{3588const struct htt_pdev_stats_twt_sessions_tlv *htt_stats_buf = tag_buf;3589u8 *buf = stats_req->buf;3590u32 len = stats_req->buf_len;3591u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;35923593len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_STATS_TWT_SESSIONS_TLV:\n");3594len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3595htt_stats_buf->pdev_id);3596len += scnprintf(buf + len, buf_len - len, "num_sessions = %u\n\n",3597htt_stats_buf->num_sessions);35983599if (len >= buf_len)3600buf[buf_len - 1] = 0;3601else3602buf[len] = 0;36033604stats_req->buf_len = len;3605}36063607static inline void3608htt_print_pdev_stats_twt_session_tlv(const void *tag_buf,3609struct debug_htt_stats_req *stats_req)3610{3611const struct htt_pdev_stats_twt_session_tlv *htt_stats_buf = tag_buf;3612u8 *buf = stats_req->buf;3613u32 len = stats_req->buf_len;3614u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;36153616len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_STATS_TWT_SESSION_TLV:\n");3617len += scnprintf(buf + len, buf_len - len, "vdev_id = %u\n",3618htt_stats_buf->vdev_id);3619len += scnprintf(buf + len, buf_len - len,3620"peer_mac = %02lx:%02lx:%02lx:%02lx:%02lx:%02lx\n",3621FIELD_GET(HTT_MAC_ADDR_L32_0,3622htt_stats_buf->peer_mac.mac_addr_l32),3623FIELD_GET(HTT_MAC_ADDR_L32_1,3624htt_stats_buf->peer_mac.mac_addr_l32),3625FIELD_GET(HTT_MAC_ADDR_L32_2,3626htt_stats_buf->peer_mac.mac_addr_l32),3627FIELD_GET(HTT_MAC_ADDR_L32_3,3628htt_stats_buf->peer_mac.mac_addr_l32),3629FIELD_GET(HTT_MAC_ADDR_H16_0,3630htt_stats_buf->peer_mac.mac_addr_h16),3631FIELD_GET(HTT_MAC_ADDR_H16_1,3632htt_stats_buf->peer_mac.mac_addr_h16));3633len += scnprintf(buf + len, buf_len - len, "flow_id_flags = %u\n",3634htt_stats_buf->flow_id_flags);3635len += scnprintf(buf + len, buf_len - len, "dialog_id = %u\n",3636htt_stats_buf->dialog_id);3637len += scnprintf(buf + len, buf_len - len, "wake_dura_us = %u\n",3638htt_stats_buf->wake_dura_us);3639len += scnprintf(buf + len, buf_len - len, "wake_intvl_us = %u\n",3640htt_stats_buf->wake_intvl_us);3641len += scnprintf(buf + len, buf_len - len, "sp_offset_us = %u\n\n",3642htt_stats_buf->sp_offset_us);36433644if (len >= buf_len)3645buf[buf_len - 1] = 0;3646else3647buf[len] = 0;36483649stats_req->buf_len = len;3650}36513652static inline void3653htt_print_pdev_obss_pd_stats_tlv_v(const void *tag_buf,3654struct debug_htt_stats_req *stats_req)3655{3656const struct htt_pdev_obss_pd_stats_tlv *htt_stats_buf = tag_buf;3657u8 *buf = stats_req->buf;3658u32 len = stats_req->buf_len;3659u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;36603661len += scnprintf(buf + len, buf_len - len, "OBSS Tx success PPDU = %u\n",3662htt_stats_buf->num_obss_tx_ppdu_success);3663len += scnprintf(buf + len, buf_len - len, "OBSS Tx failures PPDU = %u\n",3664htt_stats_buf->num_obss_tx_ppdu_failure);3665len += scnprintf(buf + len, buf_len - len, "Non-SRG Opportunities = %u\n",3666htt_stats_buf->num_non_srg_opportunities);3667len += scnprintf(buf + len, buf_len - len, "Non-SRG tried PPDU = %u\n",3668htt_stats_buf->num_non_srg_ppdu_tried);3669len += scnprintf(buf + len, buf_len - len, "Non-SRG success PPDU = %u\n",3670htt_stats_buf->num_non_srg_ppdu_success);3671len += scnprintf(buf + len, buf_len - len, "SRG Opportunities = %u\n",3672htt_stats_buf->num_srg_opportunities);3673len += scnprintf(buf + len, buf_len - len, "SRG tried PPDU = %u\n",3674htt_stats_buf->num_srg_ppdu_tried);3675len += scnprintf(buf + len, buf_len - len, "SRG success PPDU = %u\n\n",3676htt_stats_buf->num_srg_ppdu_success);36773678if (len >= buf_len)3679buf[buf_len - 1] = 0;3680else3681buf[len] = 0;36823683stats_req->buf_len = len;3684}36853686static inline void htt_print_backpressure_stats_tlv_v(const u32 *tag_buf,3687u8 *data)3688{3689struct debug_htt_stats_req *stats_req =3690(struct debug_htt_stats_req *)data;3691struct htt_ring_backpressure_stats_tlv *htt_stats_buf =3692(struct htt_ring_backpressure_stats_tlv *)tag_buf;3693int i;3694u8 *buf = stats_req->buf;3695u32 len = stats_req->buf_len;3696u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;36973698len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3699htt_stats_buf->pdev_id);3700len += scnprintf(buf + len, buf_len - len, "current_head_idx = %u\n",3701htt_stats_buf->current_head_idx);3702len += scnprintf(buf + len, buf_len - len, "current_tail_idx = %u\n",3703htt_stats_buf->current_tail_idx);3704len += scnprintf(buf + len, buf_len - len, "num_htt_msgs_sent = %u\n",3705htt_stats_buf->num_htt_msgs_sent);3706len += scnprintf(buf + len, buf_len - len,3707"backpressure_time_ms = %u\n",3708htt_stats_buf->backpressure_time_ms);37093710for (i = 0; i < 5; i++)3711len += scnprintf(buf + len, buf_len - len,3712"backpressure_hist_%u = %u\n",3713i + 1, htt_stats_buf->backpressure_hist[i]);37143715len += scnprintf(buf + len, buf_len - len,3716"============================\n");37173718if (len >= buf_len) {3719buf[buf_len - 1] = 0;3720stats_req->buf_len = buf_len - 1;3721} else {3722buf[len] = 0;3723stats_req->buf_len = len;3724}3725}37263727static inline3728void htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf,3729struct debug_htt_stats_req *stats_req)3730{3731const struct htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf;3732u8 *buf = stats_req->buf;3733u32 len = stats_req->buf_len;3734u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3735int i;37363737len += scnprintf(buf + len, buf_len - len,3738"HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n");37393740len += scnprintf(buf + len, buf_len - len, "tx_ol_mcs = ");3741for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)3742len += scnprintf(buf + len, buf_len - len,3743"%d:%u,", i, htt_stats_buf->tx_su_ol_mcs[i]);3744len--;37453746len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_mcs = ");3747for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)3748len += scnprintf(buf + len, buf_len - len,3749"%d:%u,", i, htt_stats_buf->tx_su_ibf_mcs[i]);3750len--;37513752len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_mcs =");3753for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)3754len += scnprintf(buf + len, buf_len - len,3755"%d:%u,", i, htt_stats_buf->tx_su_txbf_mcs[i]);3756len--;37573758len += scnprintf(buf + len, buf_len - len, "\ntx_ol_nss = ");3759for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)3760len += scnprintf(buf + len, buf_len - len,3761"%d:%u,", i, htt_stats_buf->tx_su_ol_nss[i]);3762len--;37633764len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_nss = ");3765for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)3766len += scnprintf(buf + len, buf_len - len,3767"%d:%u,", i, htt_stats_buf->tx_su_ibf_nss[i]);3768len--;37693770len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_nss = ");3771for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)3772len += scnprintf(buf + len, buf_len - len,3773"%d:%u,", i, htt_stats_buf->tx_su_txbf_nss[i]);3774len--;37753776len += scnprintf(buf + len, buf_len - len, "\ntx_ol_bw = ");3777for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)3778len += scnprintf(buf + len, buf_len - len,3779"%d:%u,", i, htt_stats_buf->tx_su_ol_bw[i]);3780len--;37813782len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_bw = ");3783for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)3784len += scnprintf(buf + len, buf_len - len,3785"%d:%u,", i, htt_stats_buf->tx_su_ibf_bw[i]);3786len--;37873788len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_bw = ");3789for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)3790len += scnprintf(buf + len, buf_len - len,3791"%d:%u,", i, htt_stats_buf->tx_su_txbf_bw[i]);3792len--;37933794len += scnprintf(buf + len, buf_len - len, "\n");37953796stats_req->buf_len = len;3797}37983799static inline3800void htt_print_txbf_ofdma_ndpa_stats_tlv(const void *tag_buf,3801struct debug_htt_stats_req *stats_req)3802{3803const struct htt_txbf_ofdma_ndpa_stats_tlv *htt_stats_buf = tag_buf;3804u8 *buf = stats_req->buf;3805u32 len = stats_req->buf_len;3806u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3807int i;38083809len += scnprintf(buf + len, buf_len - len,3810"HTT_TXBF_OFDMA_NDPA_STATS_TLV:\n");38113812for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3813len += scnprintf(buf + len, buf_len - len,3814"ax_ofdma_ndpa_queued_user%d = %u\n",3815i, htt_stats_buf->ax_ofdma_ndpa_queued[i]);3816len += scnprintf(buf + len, buf_len - len,3817"ax_ofdma_ndpa_tried_user%d = %u\n",3818i, htt_stats_buf->ax_ofdma_ndpa_tried[i]);3819len += scnprintf(buf + len, buf_len - len,3820"ax_ofdma_ndpa_flushed_user%d = %u\n",3821i, htt_stats_buf->ax_ofdma_ndpa_flushed[i]);3822len += scnprintf(buf + len, buf_len - len,3823"ax_ofdma_ndpa_err_user%d = %u\n",3824i, htt_stats_buf->ax_ofdma_ndpa_err[i]);3825len += scnprintf(buf + len, buf_len - len, "\n");3826}38273828stats_req->buf_len = len;3829}38303831static inline3832void htt_print_txbf_ofdma_ndp_stats_tlv(const void *tag_buf,3833struct debug_htt_stats_req *stats_req)3834{3835const struct htt_txbf_ofdma_ndp_stats_tlv *htt_stats_buf = tag_buf;3836u8 *buf = stats_req->buf;3837u32 len = stats_req->buf_len;3838u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3839int i;38403841len += scnprintf(buf + len, buf_len - len,3842"HTT_TXBF_OFDMA_NDP_STATS_TLV:\n");38433844for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3845len += scnprintf(buf + len, buf_len - len,3846"ax_ofdma_ndp_queued_user%d = %u\n",3847i, htt_stats_buf->ax_ofdma_ndp_queued[i]);3848len += scnprintf(buf + len, buf_len - len,3849"ax_ofdma_ndp_tried_user%d = %u\n",3850i, htt_stats_buf->ax_ofdma_ndp_tried[i]);3851len += scnprintf(buf + len, buf_len - len,3852"ax_ofdma_ndp_flushed_user%d = %u\n",3853i, htt_stats_buf->ax_ofdma_ndp_flushed[i]);3854len += scnprintf(buf + len, buf_len - len,3855"ax_ofdma_ndp_err_user%d = %u\n",3856i, htt_stats_buf->ax_ofdma_ndp_err[i]);3857len += scnprintf(buf + len, buf_len - len, "\n");3858}38593860stats_req->buf_len = len;3861}38623863static inline3864void htt_print_txbf_ofdma_brp_stats_tlv(const void *tag_buf,3865struct debug_htt_stats_req *stats_req)3866{3867const struct htt_txbf_ofdma_brp_stats_tlv *htt_stats_buf = tag_buf;3868u8 *buf = stats_req->buf;3869u32 len = stats_req->buf_len;3870u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3871int i;38723873len += scnprintf(buf + len, buf_len - len,3874"HTT_TXBF_OFDMA_BRP_STATS_TLV:\n");38753876for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3877len += scnprintf(buf + len, buf_len - len,3878"ax_ofdma_brpoll_queued_user%d = %u\n",3879i, htt_stats_buf->ax_ofdma_brpoll_queued[i]);3880len += scnprintf(buf + len, buf_len - len,3881"ax_ofdma_brpoll_tried_user%d = %u\n",3882i, htt_stats_buf->ax_ofdma_brpoll_tried[i]);3883len += scnprintf(buf + len, buf_len - len,3884"ax_ofdma_brpoll_flushed_user%d = %u\n",3885i, htt_stats_buf->ax_ofdma_brpoll_flushed[i]);3886len += scnprintf(buf + len, buf_len - len,3887"ax_ofdma_brp_err_user%d = %u\n",3888i, htt_stats_buf->ax_ofdma_brp_err[i]);3889len += scnprintf(buf + len, buf_len - len,3890"ax_ofdma_brp_err_num_cbf_rcvd_user%d = %u\n",3891i, htt_stats_buf->ax_ofdma_brp_err_num_cbf_rcvd[i]);3892len += scnprintf(buf + len, buf_len - len, "\n");3893}38943895stats_req->buf_len = len;3896}38973898static inline3899void htt_print_txbf_ofdma_steer_stats_tlv(const void *tag_buf,3900struct debug_htt_stats_req *stats_req)3901{3902const struct htt_txbf_ofdma_steer_stats_tlv *htt_stats_buf = tag_buf;3903u8 *buf = stats_req->buf;3904u32 len = stats_req->buf_len;3905u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3906int i;39073908len += scnprintf(buf + len, buf_len - len,3909"HTT_TXBF_OFDMA_STEER_STATS_TLV:\n");39103911for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3912len += scnprintf(buf + len, buf_len - len,3913"ax_ofdma_num_ppdu_steer_user%d = %u\n",3914i, htt_stats_buf->ax_ofdma_num_ppdu_steer[i]);3915len += scnprintf(buf + len, buf_len - len,3916"ax_ofdma_num_ppdu_ol_user%d = %u\n",3917i, htt_stats_buf->ax_ofdma_num_ppdu_ol[i]);3918len += scnprintf(buf + len, buf_len - len,3919"ax_ofdma_num_usrs_prefetch_user%d = %u\n",3920i, htt_stats_buf->ax_ofdma_num_usrs_prefetch[i]);3921len += scnprintf(buf + len, buf_len - len,3922"ax_ofdma_num_usrs_sound_user%d = %u\n",3923i, htt_stats_buf->ax_ofdma_num_usrs_sound[i]);3924len += scnprintf(buf + len, buf_len - len,3925"ax_ofdma_num_usrs_force_sound_user%d = %u\n",3926i, htt_stats_buf->ax_ofdma_num_usrs_force_sound[i]);3927len += scnprintf(buf + len, buf_len - len, "\n");3928}39293930stats_req->buf_len = len;3931}39323933static inline3934void htt_print_phy_counters_tlv(const void *tag_buf,3935struct debug_htt_stats_req *stats_req)3936{3937const struct htt_phy_counters_tlv *htt_stats_buf = tag_buf;3938u8 *buf = stats_req->buf;3939u32 len = stats_req->buf_len;3940u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3941int i;39423943len += scnprintf(buf + len, buf_len - len, "HTT_PHY_COUNTERS_TLV:\n");3944len += scnprintf(buf + len, buf_len - len, "rx_ofdma_timing_err_cnt = %u\n",3945htt_stats_buf->rx_ofdma_timing_err_cnt);3946len += scnprintf(buf + len, buf_len - len, "rx_cck_fail_cnt = %u\n",3947htt_stats_buf->rx_cck_fail_cnt);3948len += scnprintf(buf + len, buf_len - len, "mactx_abort_cnt = %u\n",3949htt_stats_buf->mactx_abort_cnt);3950len += scnprintf(buf + len, buf_len - len, "macrx_abort_cnt = %u\n",3951htt_stats_buf->macrx_abort_cnt);3952len += scnprintf(buf + len, buf_len - len, "phytx_abort_cnt = %u\n",3953htt_stats_buf->phytx_abort_cnt);3954len += scnprintf(buf + len, buf_len - len, "phyrx_abort_cnt = %u\n",3955htt_stats_buf->phyrx_abort_cnt);3956len += scnprintf(buf + len, buf_len - len, "phyrx_defer_abort_cnt = %u\n",3957htt_stats_buf->phyrx_defer_abort_cnt);3958len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_lstf_event_cnt = %u\n",3959htt_stats_buf->rx_gain_adj_lstf_event_cnt);3960len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_non_legacy_cnt = %u\n",3961htt_stats_buf->rx_gain_adj_non_legacy_cnt);39623963for (i = 0; i < HTT_MAX_RX_PKT_CNT; i++)3964len += scnprintf(buf + len, buf_len - len, "rx_pkt_cnt[%d] = %u\n",3965i, htt_stats_buf->rx_pkt_cnt[i]);39663967for (i = 0; i < HTT_MAX_RX_PKT_CRC_PASS_CNT; i++)3968len += scnprintf(buf + len, buf_len - len,3969"rx_pkt_crc_pass_cnt[%d] = %u\n",3970i, htt_stats_buf->rx_pkt_crc_pass_cnt[i]);39713972for (i = 0; i < HTT_MAX_PER_BLK_ERR_CNT; i++)3973len += scnprintf(buf + len, buf_len - len,3974"per_blk_err_cnt[%d] = %u\n",3975i, htt_stats_buf->per_blk_err_cnt[i]);39763977for (i = 0; i < HTT_MAX_RX_OTA_ERR_CNT; i++)3978len += scnprintf(buf + len, buf_len - len,3979"rx_ota_err_cnt[%d] = %u\n",3980i, htt_stats_buf->rx_ota_err_cnt[i]);39813982stats_req->buf_len = len;3983}39843985static inline3986void htt_print_phy_stats_tlv(const void *tag_buf,3987struct debug_htt_stats_req *stats_req)3988{3989const struct htt_phy_stats_tlv *htt_stats_buf = tag_buf;3990u8 *buf = stats_req->buf;3991u32 len = stats_req->buf_len;3992u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3993int i;39943995len += scnprintf(buf + len, buf_len - len, "HTT_PHY_STATS_TLV:\n");39963997for (i = 0; i < HTT_STATS_MAX_CHAINS; i++)3998len += scnprintf(buf + len, buf_len - len, "nf_chain[%d] = %d\n",3999i, htt_stats_buf->nf_chain[i]);40004001len += scnprintf(buf + len, buf_len - len, "false_radar_cnt = %u\n",4002htt_stats_buf->false_radar_cnt);4003len += scnprintf(buf + len, buf_len - len, "radar_cs_cnt = %u\n",4004htt_stats_buf->radar_cs_cnt);4005len += scnprintf(buf + len, buf_len - len, "ani_level = %d\n",4006htt_stats_buf->ani_level);4007len += scnprintf(buf + len, buf_len - len, "fw_run_time = %u\n",4008htt_stats_buf->fw_run_time);40094010stats_req->buf_len = len;4011}40124013static inline void4014htt_print_phy_reset_counters_tlv(const void *tag_buf,4015u16 tag_len,4016struct debug_htt_stats_req *stats_req)4017{4018const struct htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf;4019u8 *buf = stats_req->buf;4020u32 len = stats_req->buf_len;4021u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;40224023if (tag_len < sizeof(*htt_stats_buf))4024return;40254026len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n");40274028len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",4029htt_stats_buf->pdev_id);4030len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n",4031htt_stats_buf->cf_active_low_fail_cnt);4032len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n",4033htt_stats_buf->cf_active_low_pass_cnt);4034len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n",4035htt_stats_buf->phy_off_through_vreg_cnt);4036len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n",4037htt_stats_buf->force_calibration_cnt);4038len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n",4039htt_stats_buf->rf_mode_switch_phy_off_cnt);40404041stats_req->buf_len = len;4042}40434044static inline void4045htt_print_phy_reset_stats_tlv(const void *tag_buf,4046u16 tag_len,4047struct debug_htt_stats_req *stats_req)4048{4049const struct htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf;4050u8 *buf = stats_req->buf;4051u32 len = stats_req->buf_len;4052u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;40534054if (tag_len < sizeof(*htt_stats_buf))4055return;40564057len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n");40584059len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",4060htt_stats_buf->pdev_id);4061len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n",4062htt_stats_buf->chan_mhz);4063len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n",4064htt_stats_buf->chan_band_center_freq1);4065len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n",4066htt_stats_buf->chan_band_center_freq2);4067len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n",4068htt_stats_buf->chan_phy_mode);4069len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n",4070htt_stats_buf->chan_flags);4071len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",4072htt_stats_buf->chan_num);4073len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n",4074htt_stats_buf->reset_cause);4075len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n",4076htt_stats_buf->prev_reset_cause);4077len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n",4078htt_stats_buf->phy_warm_reset_src);4079len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n",4080htt_stats_buf->rx_gain_tbl_mode);4081len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n",4082htt_stats_buf->xbar_val);4083len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n",4084htt_stats_buf->force_calibration);4085len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n",4086htt_stats_buf->phyrf_mode);4087len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n",4088htt_stats_buf->phy_homechan);4089len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n",4090htt_stats_buf->phy_tx_ch_mask);4091len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n",4092htt_stats_buf->phy_rx_ch_mask);4093len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n",4094htt_stats_buf->phybb_ini_mask);4095len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n",4096htt_stats_buf->phyrf_ini_mask);4097len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n",4098htt_stats_buf->phy_dfs_en_mask);4099len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n",4100htt_stats_buf->phy_sscan_en_mask);4101len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n",4102htt_stats_buf->phy_synth_sel_mask);4103len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n",4104htt_stats_buf->phy_adfs_freq);4105len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n",4106htt_stats_buf->cck_fir_settings);4107len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n",4108htt_stats_buf->phy_dyn_pri_chan);4109len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n",4110htt_stats_buf->cca_thresh);4111len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n",4112htt_stats_buf->dyn_cca_status);4113len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n",4114htt_stats_buf->rxdesense_thresh_hw);4115len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n",4116htt_stats_buf->rxdesense_thresh_sw);41174118stats_req->buf_len = len;4119}41204121static inline4122void htt_print_peer_ctrl_path_txrx_stats_tlv(const void *tag_buf,4123struct debug_htt_stats_req *stats_req)4124{4125const struct htt_peer_ctrl_path_txrx_stats_tlv *htt_stat_buf = tag_buf;4126u8 *buf = stats_req->buf;4127u32 len = stats_req->buf_len;4128u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;4129int i;4130const char *mgmt_frm_type[ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1] = {4131"assoc_req", "assoc_resp",4132"reassoc_req", "reassoc_resp",4133"probe_req", "probe_resp",4134"timing_advertisement", "reserved",4135"beacon", "atim", "disassoc",4136"auth", "deauth", "action", "action_no_ack"};41374138len += scnprintf(buf + len, buf_len - len,4139"HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:\n");4140len += scnprintf(buf + len, buf_len - len,4141"peer_mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",4142htt_stat_buf->peer_mac_addr[0], htt_stat_buf->peer_mac_addr[1],4143htt_stat_buf->peer_mac_addr[2], htt_stat_buf->peer_mac_addr[3],4144htt_stat_buf->peer_mac_addr[4], htt_stat_buf->peer_mac_addr[5]);41454146len += scnprintf(buf + len, buf_len - len, "peer_tx_mgmt_subtype:\n");4147for (i = 0; i < ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1; i++)4148len += scnprintf(buf + len, buf_len - len, "%s:%u\n",4149mgmt_frm_type[i],4150htt_stat_buf->peer_rx_mgmt_subtype[i]);41514152len += scnprintf(buf + len, buf_len - len, "peer_rx_mgmt_subtype:\n");4153for (i = 0; i < ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1; i++)4154len += scnprintf(buf + len, buf_len - len, "%s:%u\n",4155mgmt_frm_type[i],4156htt_stat_buf->peer_rx_mgmt_subtype[i]);41574158len += scnprintf(buf + len, buf_len - len, "\n");41594160stats_req->buf_len = len;4161}41624163static int ath11k_dbg_htt_ext_stats_parse(struct ath11k_base *ab,4164u16 tag, u16 len, const void *tag_buf,4165void *user_data)4166{4167struct debug_htt_stats_req *stats_req = user_data;41684169switch (tag) {4170case HTT_STATS_TX_PDEV_CMN_TAG:4171htt_print_tx_pdev_stats_cmn_tlv(tag_buf, stats_req);4172break;4173case HTT_STATS_TX_PDEV_UNDERRUN_TAG:4174htt_print_tx_pdev_stats_urrn_tlv_v(tag_buf, len, stats_req);4175break;4176case HTT_STATS_TX_PDEV_SIFS_TAG:4177htt_print_tx_pdev_stats_sifs_tlv_v(tag_buf, len, stats_req);4178break;4179case HTT_STATS_TX_PDEV_FLUSH_TAG:4180htt_print_tx_pdev_stats_flush_tlv_v(tag_buf, len, stats_req);4181break;4182case HTT_STATS_TX_PDEV_PHY_ERR_TAG:4183htt_print_tx_pdev_stats_phy_err_tlv_v(tag_buf, len, stats_req);4184break;4185case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:4186htt_print_tx_pdev_stats_sifs_hist_tlv_v(tag_buf, len, stats_req);4187break;41884189case HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG:4190htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(tag_buf, stats_req);4191break;41924193case HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG:4194htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(tag_buf, len,4195stats_req);4196break;41974198case HTT_STATS_STRING_TAG:4199htt_print_stats_string_tlv(tag_buf, len, stats_req);4200break;42014202case HTT_STATS_TX_HWQ_CMN_TAG:4203htt_print_tx_hwq_stats_cmn_tlv(tag_buf, stats_req);4204break;42054206case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:4207htt_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf, len, stats_req);4208break;42094210case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:4211htt_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf, len, stats_req);4212break;42134214case HTT_STATS_TX_HWQ_CMD_STALL_TAG:4215htt_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf, len, stats_req);4216break;42174218case HTT_STATS_TX_HWQ_FES_STATUS_TAG:4219htt_print_tx_hwq_fes_result_stats_tlv_v(tag_buf, len, stats_req);4220break;42214222case HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG:4223htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(tag_buf, len, stats_req);4224break;42254226case HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG:4227htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(tag_buf, len, stats_req);4228break;4229case HTT_STATS_TX_TQM_GEN_MPDU_TAG:4230htt_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf, len, stats_req);4231break;42324233case HTT_STATS_TX_TQM_LIST_MPDU_TAG:4234htt_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf, len, stats_req);4235break;42364237case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:4238htt_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf, len, stats_req);4239break;42404241case HTT_STATS_TX_TQM_CMN_TAG:4242htt_print_tx_tqm_cmn_stats_tlv(tag_buf, stats_req);4243break;42444245case HTT_STATS_TX_TQM_PDEV_TAG:4246htt_print_tx_tqm_pdev_stats_tlv_v(tag_buf, stats_req);4247break;42484249case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:4250htt_print_tx_tqm_cmdq_status_tlv(tag_buf, stats_req);4251break;42524253case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:4254htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, stats_req);4255break;42564257case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:4258htt_print_tx_de_classify_failed_stats_tlv(tag_buf, stats_req);4259break;42604261case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:4262htt_print_tx_de_classify_stats_tlv(tag_buf, stats_req);4263break;42644265case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:4266htt_print_tx_de_classify_status_stats_tlv(tag_buf, stats_req);4267break;42684269case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:4270htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, stats_req);4271break;42724273case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:4274htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, stats_req);4275break;42764277case HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG:4278htt_print_tx_de_fw2wbm_ring_full_hist_tlv(tag_buf, len, stats_req);4279break;42804281case HTT_STATS_TX_DE_CMN_TAG:4282htt_print_tx_de_cmn_stats_tlv(tag_buf, stats_req);4283break;42844285case HTT_STATS_RING_IF_TAG:4286htt_print_ring_if_stats_tlv(tag_buf, stats_req);4287break;42884289case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:4290htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, stats_req);4291break;42924293case HTT_STATS_SFM_CMN_TAG:4294htt_print_sfm_cmn_tlv(tag_buf, stats_req);4295break;42964297case HTT_STATS_SRING_STATS_TAG:4298htt_print_sring_stats_tlv(tag_buf, stats_req);4299break;43004301case HTT_STATS_RX_PDEV_FW_STATS_TAG:4302htt_print_rx_pdev_fw_stats_tlv(tag_buf, stats_req);4303break;43044305case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:4306htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf, stats_req);4307break;43084309case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:4310htt_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf, len, stats_req);4311break;43124313case HTT_STATS_RX_SOC_FW_STATS_TAG:4314htt_print_rx_soc_fw_stats_tlv(tag_buf, stats_req);4315break;43164317case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:4318htt_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf, len, stats_req);4319break;43204321case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:4322htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(4323tag_buf, len, stats_req);4324break;4325case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:4326htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(4327tag_buf, len, stats_req);4328break;43294330case HTT_STATS_RX_REFILL_REO_ERR_TAG:4331htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(4332tag_buf, len, stats_req);4333break;43344335case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:4336htt_print_rx_reo_debug_stats_tlv_v(4337tag_buf, stats_req);4338break;4339case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:4340htt_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf, stats_req);4341break;43424343case HTT_STATS_TX_PDEV_RATE_STATS_TAG:4344htt_print_tx_pdev_rate_stats_tlv(tag_buf, stats_req);4345break;43464347case HTT_STATS_RX_PDEV_RATE_STATS_TAG:4348htt_print_rx_pdev_rate_stats_tlv(tag_buf, stats_req);4349break;43504351case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:4352htt_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf, stats_req);4353break;4354case HTT_STATS_TX_SCHED_CMN_TAG:4355htt_print_stats_tx_sched_cmn_tlv(tag_buf, stats_req);4356break;43574358case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:4359htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, stats_req);4360break;43614362case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:4363htt_print_sched_txq_cmd_posted_tlv_v(tag_buf, len, stats_req);4364break;43654366case HTT_STATS_RING_IF_CMN_TAG:4367htt_print_ring_if_cmn_tlv(tag_buf, stats_req);4368break;43694370case HTT_STATS_SFM_CLIENT_USER_TAG:4371htt_print_sfm_client_user_tlv_v(tag_buf, len, stats_req);4372break;43734374case HTT_STATS_SFM_CLIENT_TAG:4375htt_print_sfm_client_tlv(tag_buf, stats_req);4376break;43774378case HTT_STATS_TX_TQM_ERROR_STATS_TAG:4379htt_print_tx_tqm_error_stats_tlv(tag_buf, stats_req);4380break;43814382case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:4383htt_print_sched_txq_cmd_reaped_tlv_v(tag_buf, len, stats_req);4384break;43854386case HTT_STATS_SRING_CMN_TAG:4387htt_print_sring_cmn_tlv(tag_buf, stats_req);4388break;43894390case HTT_STATS_TX_SOUNDING_STATS_TAG:4391htt_print_tx_sounding_stats_tlv(tag_buf, stats_req);4392break;43934394case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:4395htt_print_tx_selfgen_ac_err_stats_tlv(tag_buf, stats_req);4396break;43974398case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:4399htt_print_tx_selfgen_cmn_stats_tlv(tag_buf, stats_req);4400break;44014402case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:4403htt_print_tx_selfgen_ac_stats_tlv(tag_buf, stats_req);4404break;44054406case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:4407htt_print_tx_selfgen_ax_stats_tlv(tag_buf, stats_req);4408break;44094410case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:4411htt_print_tx_selfgen_ax_err_stats_tlv(tag_buf, stats_req);4412break;44134414case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:4415htt_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf, stats_req);4416break;44174418case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:4419htt_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf, stats_req);4420break;44214422case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:4423htt_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf, stats_req);4424break;44254426case HTT_STATS_HW_INTR_MISC_TAG:4427htt_print_hw_stats_intr_misc_tlv(tag_buf, stats_req);4428break;44294430case HTT_STATS_HW_WD_TIMEOUT_TAG:4431htt_print_hw_stats_wd_timeout_tlv(tag_buf, stats_req);4432break;44334434case HTT_STATS_HW_PDEV_ERRS_TAG:4435htt_print_hw_stats_pdev_errs_tlv(tag_buf, stats_req);4436break;44374438case HTT_STATS_COUNTER_NAME_TAG:4439htt_print_counter_tlv(tag_buf, stats_req);4440break;44414442case HTT_STATS_TX_TID_DETAILS_TAG:4443htt_print_tx_tid_stats_tlv(tag_buf, stats_req);4444break;44454446case HTT_STATS_TX_TID_DETAILS_V1_TAG:4447htt_print_tx_tid_stats_v1_tlv(tag_buf, stats_req);4448break;44494450case HTT_STATS_RX_TID_DETAILS_TAG:4451htt_print_rx_tid_stats_tlv(tag_buf, stats_req);4452break;44534454case HTT_STATS_PEER_STATS_CMN_TAG:4455htt_print_peer_stats_cmn_tlv(tag_buf, stats_req);4456break;44574458case HTT_STATS_PEER_DETAILS_TAG:4459htt_print_peer_details_tlv(tag_buf, stats_req);4460break;44614462case HTT_STATS_PEER_MSDU_FLOWQ_TAG:4463htt_print_msdu_flow_stats_tlv(tag_buf, stats_req);4464break;44654466case HTT_STATS_PEER_TX_RATE_STATS_TAG:4467htt_print_tx_peer_rate_stats_tlv(tag_buf, stats_req);4468break;44694470case HTT_STATS_PEER_RX_RATE_STATS_TAG:4471htt_print_rx_peer_rate_stats_tlv(tag_buf, stats_req);4472break;44734474case HTT_STATS_TX_DE_COMPL_STATS_TAG:4475htt_print_tx_de_compl_stats_tlv(tag_buf, stats_req);4476break;44774478case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG:4479case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG:4480case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG:4481htt_print_pdev_cca_stats_hist_tlv(tag_buf, stats_req);4482break;44834484case HTT_STATS_PDEV_CCA_COUNTERS_TAG:4485htt_print_pdev_stats_cca_counters_tlv(tag_buf, stats_req);4486break;44874488case HTT_STATS_WHAL_TX_TAG:4489htt_print_hw_stats_whal_tx_tlv(tag_buf, stats_req);4490break;44914492case HTT_STATS_PDEV_TWT_SESSIONS_TAG:4493htt_print_pdev_stats_twt_sessions_tlv(tag_buf, stats_req);4494break;44954496case HTT_STATS_PDEV_TWT_SESSION_TAG:4497htt_print_pdev_stats_twt_session_tlv(tag_buf, stats_req);4498break;44994500case HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG:4501htt_print_sched_txq_sched_order_su_tlv_v(tag_buf, len, stats_req);4502break;45034504case HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG:4505htt_print_sched_txq_sched_ineligibility_tlv_v(tag_buf, len, stats_req);4506break;45074508case HTT_STATS_PDEV_OBSS_PD_TAG:4509htt_print_pdev_obss_pd_stats_tlv_v(tag_buf, stats_req);4510break;4511case HTT_STATS_RING_BACKPRESSURE_STATS_TAG:4512htt_print_backpressure_stats_tlv_v(tag_buf, user_data);4513break;4514case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG:4515htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, stats_req);4516break;4517case HTT_STATS_TXBF_OFDMA_NDPA_STATS_TAG:4518htt_print_txbf_ofdma_ndpa_stats_tlv(tag_buf, stats_req);4519break;4520case HTT_STATS_TXBF_OFDMA_NDP_STATS_TAG:4521htt_print_txbf_ofdma_ndp_stats_tlv(tag_buf, stats_req);4522break;4523case HTT_STATS_TXBF_OFDMA_BRP_STATS_TAG:4524htt_print_txbf_ofdma_brp_stats_tlv(tag_buf, stats_req);4525break;4526case HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG:4527htt_print_txbf_ofdma_steer_stats_tlv(tag_buf, stats_req);4528break;4529case HTT_STATS_PHY_COUNTERS_TAG:4530htt_print_phy_counters_tlv(tag_buf, stats_req);4531break;4532case HTT_STATS_PHY_STATS_TAG:4533htt_print_phy_stats_tlv(tag_buf, stats_req);4534break;4535case HTT_STATS_PHY_RESET_COUNTERS_TAG:4536htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req);4537break;4538case HTT_STATS_PHY_RESET_STATS_TAG:4539htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req);4540break;4541case HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:4542htt_print_peer_ctrl_path_txrx_stats_tlv(tag_buf, stats_req);4543break;4544default:4545break;4546}45474548return 0;4549}45504551void ath11k_debugfs_htt_ext_stats_handler(struct ath11k_base *ab,4552struct sk_buff *skb)4553{4554struct ath11k_htt_extd_stats_msg *msg;4555struct debug_htt_stats_req *stats_req;4556struct ath11k *ar;4557u32 len;4558u64 cookie;4559int ret;4560bool send_completion = false;4561u8 pdev_id;45624563msg = (struct ath11k_htt_extd_stats_msg *)skb->data;4564cookie = msg->cookie;45654566if (FIELD_GET(HTT_STATS_COOKIE_MSB, cookie) != HTT_STATS_MAGIC_VALUE) {4567ath11k_warn(ab, "received invalid htt ext stats event\n");4568return;4569}45704571pdev_id = FIELD_GET(HTT_STATS_COOKIE_LSB, cookie);4572rcu_read_lock();4573ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id);4574rcu_read_unlock();4575if (!ar) {4576ath11k_warn(ab, "failed to get ar for pdev_id %d\n", pdev_id);4577return;4578}45794580stats_req = ar->debug.htt_stats.stats_req;4581if (!stats_req)4582return;45834584spin_lock_bh(&ar->debug.htt_stats.lock);45854586stats_req->done = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_DONE, msg->info1);4587if (stats_req->done)4588send_completion = true;45894590spin_unlock_bh(&ar->debug.htt_stats.lock);45914592len = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_LENGTH, msg->info1);4593ret = ath11k_dp_htt_tlv_iter(ab, msg->data, len,4594ath11k_dbg_htt_ext_stats_parse,4595stats_req);4596if (ret)4597ath11k_warn(ab, "Failed to parse tlv %d\n", ret);45984599if (send_completion)4600complete(&stats_req->cmpln);4601}46024603static ssize_t ath11k_read_htt_stats_type(struct file *file,4604char __user *user_buf,4605size_t count, loff_t *ppos)4606{4607struct ath11k *ar = file->private_data;4608char buf[32];4609size_t len;46104611len = scnprintf(buf, sizeof(buf), "%u\n", ar->debug.htt_stats.type);46124613return simple_read_from_buffer(user_buf, count, ppos, buf, len);4614}46154616static ssize_t ath11k_write_htt_stats_type(struct file *file,4617const char __user *user_buf,4618size_t count, loff_t *ppos)4619{4620struct ath11k *ar = file->private_data;4621u8 type;4622int ret;46234624ret = kstrtou8_from_user(user_buf, count, 0, &type);4625if (ret)4626return ret;46274628if (type >= ATH11K_DBG_HTT_NUM_EXT_STATS)4629return -E2BIG;46304631if (type == ATH11K_DBG_HTT_EXT_STATS_RESET)4632return -EPERM;46334634ar->debug.htt_stats.type = type;46354636ret = count;46374638return ret;4639}46404641static const struct file_operations fops_htt_stats_type = {4642.read = ath11k_read_htt_stats_type,4643.write = ath11k_write_htt_stats_type,4644.open = simple_open,4645.owner = THIS_MODULE,4646.llseek = default_llseek,4647};46484649static int ath11k_prep_htt_stats_cfg_params(struct ath11k *ar, u8 type,4650const u8 *mac_addr,4651struct htt_ext_stats_cfg_params *cfg_params)4652{4653if (!cfg_params)4654return -EINVAL;46554656switch (type) {4657case ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_HWQ:4658case ATH11K_DBG_HTT_EXT_STATS_TX_MU_HWQ:4659cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_HWQS;4660break;4661case ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED:4662cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_TXQS;4663break;4664case ATH11K_DBG_HTT_EXT_STATS_TQM_CMDQ:4665cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_CMDQS;4666break;4667case ATH11K_DBG_HTT_EXT_STATS_PEER_INFO:4668cfg_params->cfg0 = HTT_STAT_PEER_INFO_MAC_ADDR;4669cfg_params->cfg0 |= FIELD_PREP(GENMASK(15, 1),4670HTT_PEER_STATS_REQ_MODE_FLUSH_TQM);4671cfg_params->cfg1 = HTT_STAT_DEFAULT_PEER_REQ_TYPE;4672cfg_params->cfg2 |= FIELD_PREP(GENMASK(7, 0), mac_addr[0]);4673cfg_params->cfg2 |= FIELD_PREP(GENMASK(15, 8), mac_addr[1]);4674cfg_params->cfg2 |= FIELD_PREP(GENMASK(23, 16), mac_addr[2]);4675cfg_params->cfg2 |= FIELD_PREP(GENMASK(31, 24), mac_addr[3]);4676cfg_params->cfg3 |= FIELD_PREP(GENMASK(7, 0), mac_addr[4]);4677cfg_params->cfg3 |= FIELD_PREP(GENMASK(15, 8), mac_addr[5]);4678break;4679case ATH11K_DBG_HTT_EXT_STATS_RING_IF_INFO:4680case ATH11K_DBG_HTT_EXT_STATS_SRNG_INFO:4681cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_RINGS;4682break;4683case ATH11K_DBG_HTT_EXT_STATS_ACTIVE_PEERS_LIST:4684cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ACTIVE_PEERS;4685break;4686case ATH11K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS:4687cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_CCA_CUMULATIVE;4688break;4689case ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO:4690cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ACTIVE_VDEVS;4691break;4692case ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS:4693cfg_params->cfg0 = HTT_STAT_PEER_INFO_MAC_ADDR;4694cfg_params->cfg1 |= FIELD_PREP(GENMASK(7, 0), mac_addr[0]);4695cfg_params->cfg1 |= FIELD_PREP(GENMASK(15, 8), mac_addr[1]);4696cfg_params->cfg1 |= FIELD_PREP(GENMASK(23, 16), mac_addr[2]);4697cfg_params->cfg1 |= FIELD_PREP(GENMASK(31, 24), mac_addr[3]);4698cfg_params->cfg2 |= FIELD_PREP(GENMASK(7, 0), mac_addr[4]);4699cfg_params->cfg2 |= FIELD_PREP(GENMASK(15, 8), mac_addr[5]);4700break;4701default:4702break;4703}47044705return 0;4706}47074708int ath11k_debugfs_htt_stats_req(struct ath11k *ar)4709{4710struct debug_htt_stats_req *stats_req = ar->debug.htt_stats.stats_req;4711u8 type = stats_req->type;4712u64 cookie = 0;4713int ret, pdev_id = ar->pdev->pdev_id;4714struct htt_ext_stats_cfg_params cfg_params = { 0 };47154716init_completion(&stats_req->cmpln);47174718stats_req->done = false;4719stats_req->pdev_id = pdev_id;47204721cookie = FIELD_PREP(HTT_STATS_COOKIE_MSB, HTT_STATS_MAGIC_VALUE) |4722FIELD_PREP(HTT_STATS_COOKIE_LSB, pdev_id);47234724ret = ath11k_prep_htt_stats_cfg_params(ar, type, stats_req->peer_addr,4725&cfg_params);4726if (ret) {4727ath11k_warn(ar->ab, "failed to set htt stats cfg params: %d\n", ret);4728return ret;4729}47304731ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar, type, &cfg_params, cookie);4732if (ret) {4733ath11k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);4734return ret;4735}47364737while (!wait_for_completion_timeout(&stats_req->cmpln, 3 * HZ)) {4738spin_lock_bh(&ar->debug.htt_stats.lock);4739if (!stats_req->done) {4740stats_req->done = true;4741spin_unlock_bh(&ar->debug.htt_stats.lock);4742ath11k_warn(ar->ab, "stats request timed out\n");4743return -ETIMEDOUT;4744}4745spin_unlock_bh(&ar->debug.htt_stats.lock);4746}47474748return 0;4749}47504751static int ath11k_open_htt_stats(struct inode *inode, struct file *file)4752{4753struct ath11k *ar = inode->i_private;4754struct debug_htt_stats_req *stats_req;4755u8 type = ar->debug.htt_stats.type;4756int ret;47574758if (type == ATH11K_DBG_HTT_EXT_STATS_RESET ||4759type == ATH11K_DBG_HTT_EXT_STATS_PEER_INFO ||4760type == ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS)4761return -EPERM;47624763mutex_lock(&ar->conf_mutex);47644765if (ar->state != ATH11K_STATE_ON) {4766ret = -ENETDOWN;4767goto err_unlock;4768}47694770if (ar->debug.htt_stats.stats_req) {4771ret = -EAGAIN;4772goto err_unlock;4773}47744775stats_req = vzalloc(sizeof(*stats_req) + ATH11K_HTT_STATS_BUF_SIZE);4776if (!stats_req) {4777ret = -ENOMEM;4778goto err_unlock;4779}47804781ar->debug.htt_stats.stats_req = stats_req;4782stats_req->type = type;47834784ret = ath11k_debugfs_htt_stats_req(ar);4785if (ret < 0)4786goto out;47874788file->private_data = stats_req;47894790mutex_unlock(&ar->conf_mutex);47914792return 0;4793out:4794vfree(stats_req);4795ar->debug.htt_stats.stats_req = NULL;4796err_unlock:4797mutex_unlock(&ar->conf_mutex);47984799return ret;4800}48014802static int ath11k_release_htt_stats(struct inode *inode, struct file *file)4803{4804struct ath11k *ar = inode->i_private;48054806mutex_lock(&ar->conf_mutex);4807vfree(file->private_data);4808ar->debug.htt_stats.stats_req = NULL;4809mutex_unlock(&ar->conf_mutex);48104811return 0;4812}48134814static ssize_t ath11k_read_htt_stats(struct file *file,4815char __user *user_buf,4816size_t count, loff_t *ppos)4817{4818struct debug_htt_stats_req *stats_req = file->private_data;4819char *buf;4820u32 length = 0;48214822buf = stats_req->buf;4823length = min_t(u32, stats_req->buf_len, ATH11K_HTT_STATS_BUF_SIZE);4824return simple_read_from_buffer(user_buf, count, ppos, buf, length);4825}48264827static const struct file_operations fops_dump_htt_stats = {4828.open = ath11k_open_htt_stats,4829.release = ath11k_release_htt_stats,4830.read = ath11k_read_htt_stats,4831.owner = THIS_MODULE,4832.llseek = default_llseek,4833};48344835static ssize_t ath11k_read_htt_stats_reset(struct file *file,4836char __user *user_buf,4837size_t count, loff_t *ppos)4838{4839struct ath11k *ar = file->private_data;4840char buf[32];4841size_t len;48424843len = scnprintf(buf, sizeof(buf), "%u\n", ar->debug.htt_stats.reset);48444845return simple_read_from_buffer(user_buf, count, ppos, buf, len);4846}48474848static ssize_t ath11k_write_htt_stats_reset(struct file *file,4849const char __user *user_buf,4850size_t count, loff_t *ppos)4851{4852struct ath11k *ar = file->private_data;4853u8 type;4854struct htt_ext_stats_cfg_params cfg_params = { 0 };4855int ret;48564857ret = kstrtou8_from_user(user_buf, count, 0, &type);4858if (ret)4859return ret;48604861if (type >= ATH11K_DBG_HTT_NUM_EXT_STATS ||4862type == ATH11K_DBG_HTT_EXT_STATS_RESET)4863return -E2BIG;48644865mutex_lock(&ar->conf_mutex);4866cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET;4867cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type);4868ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar,4869ATH11K_DBG_HTT_EXT_STATS_RESET,4870&cfg_params,48710ULL);4872if (ret) {4873ath11k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);4874mutex_unlock(&ar->conf_mutex);4875return ret;4876}48774878ar->debug.htt_stats.reset = type;4879mutex_unlock(&ar->conf_mutex);48804881ret = count;48824883return ret;4884}48854886static const struct file_operations fops_htt_stats_reset = {4887.read = ath11k_read_htt_stats_reset,4888.write = ath11k_write_htt_stats_reset,4889.open = simple_open,4890.owner = THIS_MODULE,4891.llseek = default_llseek,4892};48934894void ath11k_debugfs_htt_stats_init(struct ath11k *ar)4895{4896spin_lock_init(&ar->debug.htt_stats.lock);4897debugfs_create_file("htt_stats_type", 0600, ar->debug.debugfs_pdev,4898ar, &fops_htt_stats_type);4899debugfs_create_file("htt_stats", 0400, ar->debug.debugfs_pdev,4900ar, &fops_dump_htt_stats);4901debugfs_create_file("htt_stats_reset", 0600, ar->debug.debugfs_pdev,4902ar, &fops_htt_stats_reset);4903}490449054906