brintos

brintos / linux-shallow public Read only

0
0
Text · 174.5 KiB · 870e86a Raw
4905 lines · c
1// SPDX-License-Identifier: BSD-3-Clause-Clear2/*3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.4 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.5 */6 7#include <linux/vmalloc.h>8#include "core.h"9#include "dp_tx.h"10#include "dp_rx.h"11#include "debug.h"12#include "debugfs_htt_stats.h"13 14#define HTT_MAX_PRINT_CHAR_PER_ELEM 1515 16#define HTT_TLV_HDR_LEN 417 18#define PRINT_ARRAY_TO_BUF(out, buflen, arr, str, len, newline)				\19	do {										\20		int index = 0; u8 i; const char *str_val = str;				\21		const char *new_line = newline;						\22		if (str_val) {								\23			index += scnprintf((out + buflen),				\24				 (ATH11K_HTT_STATS_BUF_SIZE - buflen),			\25				 "%s = ", str_val);					\26		}									\27		for (i = 0; i < len; i++) {						\28			index += scnprintf((out + buflen) + index,			\29				 (ATH11K_HTT_STATS_BUF_SIZE - buflen) - index,		\30				 " %u:%u,", i, arr[i]);					\31		}									\32		index += scnprintf((out + buflen) + index,				\33			 (ATH11K_HTT_STATS_BUF_SIZE - buflen) - index,			\34			  "%s", new_line);						\35		buflen += index;							\36	} while (0)37 38static inline void htt_print_stats_string_tlv(const void *tag_buf,39					      u16 tag_len,40					      struct debug_htt_stats_req *stats_req)41{42	const struct htt_stats_string_tlv *htt_stats_buf = tag_buf;43	u8 *buf = stats_req->buf;44	u32 len = stats_req->buf_len;45	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;46	u8  i;47 48	tag_len = tag_len >> 2;49 50	len += scnprintf(buf + len, buf_len - len, "HTT_STATS_STRING_TLV:\n");51 52	len += scnprintf(buf + len, buf_len - len,53			 "data = ");54	for (i = 0; i < tag_len; i++) {55		len += scnprintf(buf + len,56				 buf_len - len,57				 "%.*s", 4, (char *)&(htt_stats_buf->data[i]));58	}59	/* New lines are added for better display */60	len += scnprintf(buf + len, buf_len - len, "\n\n");61 62	if (len >= buf_len)63		buf[buf_len - 1] = 0;64	else65		buf[len] = 0;66 67	stats_req->buf_len = len;68}69 70static inline void htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf,71						   struct debug_htt_stats_req *stats_req)72{73	const struct htt_tx_pdev_stats_cmn_tlv *htt_stats_buf = tag_buf;74	u8 *buf = stats_req->buf;75	u32 len = stats_req->buf_len;76	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;77 78	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_CMN_TLV:\n");79	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",80			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));81	len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",82			 htt_stats_buf->hw_queued);83	len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",84			 htt_stats_buf->hw_reaped);85	len += scnprintf(buf + len, buf_len - len, "underrun = %u\n",86			 htt_stats_buf->underrun);87	len += scnprintf(buf + len, buf_len - len, "hw_paused = %u\n",88			 htt_stats_buf->hw_paused);89	len += scnprintf(buf + len, buf_len - len, "hw_flush = %u\n",90			 htt_stats_buf->hw_flush);91	len += scnprintf(buf + len, buf_len - len, "hw_filt = %u\n",92			 htt_stats_buf->hw_filt);93	len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",94			 htt_stats_buf->tx_abort);95	len += scnprintf(buf + len, buf_len - len, "mpdu_requeued = %u\n",96			 htt_stats_buf->mpdu_requeued);97	len += scnprintf(buf + len, buf_len - len, "tx_xretry = %u\n",98			 htt_stats_buf->tx_xretry);99	len += scnprintf(buf + len, buf_len - len, "data_rc = %u\n",100			 htt_stats_buf->data_rc);101	len += scnprintf(buf + len, buf_len - len, "mpdu_dropped_xretry = %u\n",102			 htt_stats_buf->mpdu_dropped_xretry);103	len += scnprintf(buf + len, buf_len - len, "illegal_rate_phy_err = %u\n",104			 htt_stats_buf->illgl_rate_phy_err);105	len += scnprintf(buf + len, buf_len - len, "cont_xretry = %u\n",106			 htt_stats_buf->cont_xretry);107	len += scnprintf(buf + len, buf_len - len, "tx_timeout = %u\n",108			 htt_stats_buf->tx_timeout);109	len += scnprintf(buf + len, buf_len - len, "pdev_resets = %u\n",110			 htt_stats_buf->pdev_resets);111	len += scnprintf(buf + len, buf_len - len, "phy_underrun = %u\n",112			 htt_stats_buf->phy_underrun);113	len += scnprintf(buf + len, buf_len - len, "txop_ovf = %u\n",114			 htt_stats_buf->txop_ovf);115	len += scnprintf(buf + len, buf_len - len, "seq_posted = %u\n",116			 htt_stats_buf->seq_posted);117	len += scnprintf(buf + len, buf_len - len, "seq_failed_queueing = %u\n",118			 htt_stats_buf->seq_failed_queueing);119	len += scnprintf(buf + len, buf_len - len, "seq_completed = %u\n",120			 htt_stats_buf->seq_completed);121	len += scnprintf(buf + len, buf_len - len, "seq_restarted = %u\n",122			 htt_stats_buf->seq_restarted);123	len += scnprintf(buf + len, buf_len - len, "mu_seq_posted = %u\n",124			 htt_stats_buf->mu_seq_posted);125	len += scnprintf(buf + len, buf_len - len, "seq_switch_hw_paused = %u\n",126			 htt_stats_buf->seq_switch_hw_paused);127	len += scnprintf(buf + len, buf_len - len, "next_seq_posted_dsr = %u\n",128			 htt_stats_buf->next_seq_posted_dsr);129	len += scnprintf(buf + len, buf_len - len, "seq_posted_isr = %u\n",130			 htt_stats_buf->seq_posted_isr);131	len += scnprintf(buf + len, buf_len - len, "seq_ctrl_cached = %u\n",132			 htt_stats_buf->seq_ctrl_cached);133	len += scnprintf(buf + len, buf_len - len, "mpdu_count_tqm = %u\n",134			 htt_stats_buf->mpdu_count_tqm);135	len += scnprintf(buf + len, buf_len - len, "msdu_count_tqm = %u\n",136			 htt_stats_buf->msdu_count_tqm);137	len += scnprintf(buf + len, buf_len - len, "mpdu_removed_tqm = %u\n",138			 htt_stats_buf->mpdu_removed_tqm);139	len += scnprintf(buf + len, buf_len - len, "msdu_removed_tqm = %u\n",140			 htt_stats_buf->msdu_removed_tqm);141	len += scnprintf(buf + len, buf_len - len, "mpdus_sw_flush = %u\n",142			 htt_stats_buf->mpdus_sw_flush);143	len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",144			 htt_stats_buf->mpdus_hw_filter);145	len += scnprintf(buf + len, buf_len - len, "mpdus_truncated = %u\n",146			 htt_stats_buf->mpdus_truncated);147	len += scnprintf(buf + len, buf_len - len, "mpdus_ack_failed = %u\n",148			 htt_stats_buf->mpdus_ack_failed);149	len += scnprintf(buf + len, buf_len - len, "mpdus_expired = %u\n",150			 htt_stats_buf->mpdus_expired);151	len += scnprintf(buf + len, buf_len - len, "mpdus_seq_hw_retry = %u\n",152			 htt_stats_buf->mpdus_seq_hw_retry);153	len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",154			 htt_stats_buf->ack_tlv_proc);155	len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt_valid = %u\n",156			 htt_stats_buf->coex_abort_mpdu_cnt_valid);157	len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt = %u\n",158			 htt_stats_buf->coex_abort_mpdu_cnt);159	len += scnprintf(buf + len, buf_len - len, "num_total_ppdus_tried_ota = %u\n",160			 htt_stats_buf->num_total_ppdus_tried_ota);161	len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_tried_ota = %u\n",162			 htt_stats_buf->num_data_ppdus_tried_ota);163	len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_enqued = %u\n",164			 htt_stats_buf->local_ctrl_mgmt_enqued);165	len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_freed = %u\n",166			 htt_stats_buf->local_ctrl_mgmt_freed);167	len += scnprintf(buf + len, buf_len - len, "local_data_enqued = %u\n",168			 htt_stats_buf->local_data_enqued);169	len += scnprintf(buf + len, buf_len - len, "local_data_freed = %u\n",170			 htt_stats_buf->local_data_freed);171	len += scnprintf(buf + len, buf_len - len, "mpdu_tried = %u\n",172			 htt_stats_buf->mpdu_tried);173	len += scnprintf(buf + len, buf_len - len, "isr_wait_seq_posted = %u\n",174			 htt_stats_buf->isr_wait_seq_posted);175	len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_low = %u\n",176			 htt_stats_buf->tx_active_dur_us_low);177	len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_high = %u\n\n",178			 htt_stats_buf->tx_active_dur_us_high);179 180	if (len >= buf_len)181		buf[buf_len - 1] = 0;182	else183		buf[len] = 0;184 185	stats_req->buf_len = len;186}187 188static inline void189htt_print_tx_pdev_stats_urrn_tlv_v(const void *tag_buf,190				   u16 tag_len,191				   struct debug_htt_stats_req *stats_req)192{193	const struct htt_tx_pdev_stats_urrn_tlv_v *htt_stats_buf = tag_buf;194	u8 *buf = stats_req->buf;195	u32 len = stats_req->buf_len;196	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;197	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_URRN_STATS);198 199	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_URRN_TLV_V:\n");200 201	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->urrn_stats, "urrn_stats",202			   num_elems, "\n\n");203 204	if (len >= buf_len)205		buf[buf_len - 1] = 0;206	else207		buf[len] = 0;208 209	stats_req->buf_len = len;210}211 212static inline void213htt_print_tx_pdev_stats_flush_tlv_v(const void *tag_buf,214				    u16 tag_len,215				    struct debug_htt_stats_req *stats_req)216{217	const struct htt_tx_pdev_stats_flush_tlv_v *htt_stats_buf = tag_buf;218	u8 *buf = stats_req->buf;219	u32 len = stats_req->buf_len;220	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;221	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);222 223	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_FLUSH_TLV_V:\n");224 225	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->flush_errs, "flush_errs",226			   num_elems, "\n\n");227 228	if (len >= buf_len)229		buf[buf_len - 1] = 0;230	else231		buf[len] = 0;232 233	stats_req->buf_len = len;234}235 236static inline void237htt_print_tx_pdev_stats_sifs_tlv_v(const void *tag_buf,238				   u16 tag_len,239				   struct debug_htt_stats_req *stats_req)240{241	const struct htt_tx_pdev_stats_sifs_tlv_v *htt_stats_buf = tag_buf;242	u8 *buf = stats_req->buf;243	u32 len = stats_req->buf_len;244	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;245	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_SIFS_BURST_STATS);246 247	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_SIFS_TLV_V:\n");248 249	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sifs_status, "sifs_status",250			   num_elems, "\n\n");251 252	if (len >= buf_len)253		buf[buf_len - 1] = 0;254	else255		buf[len] = 0;256 257	stats_req->buf_len = len;258}259 260static inline void261htt_print_tx_pdev_stats_phy_err_tlv_v(const void *tag_buf,262				      u16 tag_len,263				      struct debug_htt_stats_req *stats_req)264{265	const struct htt_tx_pdev_stats_phy_err_tlv_v *htt_stats_buf = tag_buf;266	u8 *buf = stats_req->buf;267	u32 len = stats_req->buf_len;268	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;269	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_PHY_ERR_STATS);270 271	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:\n");272 273	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->phy_errs, "phy_errs",274			   num_elems, "\n\n");275 276	if (len >= buf_len)277		buf[buf_len - 1] = 0;278	else279		buf[len] = 0;280 281	stats_req->buf_len = len;282}283 284static inline void285htt_print_tx_pdev_stats_sifs_hist_tlv_v(const void *tag_buf,286					u16 tag_len,287					struct debug_htt_stats_req *stats_req)288{289	const struct htt_tx_pdev_stats_sifs_hist_tlv_v *htt_stats_buf = tag_buf;290	u8 *buf = stats_req->buf;291	u32 len = stats_req->buf_len;292	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;293	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS);294 295	len += scnprintf(buf + len, buf_len - len,296			 "HTT_TX_PDEV_STATS_SIFS_HIST_TLV_V:\n");297 298	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sifs_hist_status,299			   "sifs_hist_status", num_elems, "\n\n");300 301	if (len >= buf_len)302		buf[buf_len - 1] = 0;303	else304		buf[len] = 0;305 306	stats_req->buf_len = len;307}308 309static inline void310htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(const void *tag_buf,311					    struct debug_htt_stats_req *stats_req)312{313	const struct htt_tx_pdev_stats_tx_ppdu_stats_tlv_v *htt_stats_buf = tag_buf;314	u8 *buf = stats_req->buf;315	u32 len = stats_req->buf_len;316	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;317 318	len += scnprintf(buf + len, buf_len - len,319			 "HTT_TX_PDEV_STATS_TX_PPDU_STATS_TLV_V:\n");320 321	len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_legacy_su = %u\n",322			 htt_stats_buf->num_data_ppdus_legacy_su);323 324	len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ac_su = %u\n",325			 htt_stats_buf->num_data_ppdus_ac_su);326 327	len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ax_su = %u\n",328			 htt_stats_buf->num_data_ppdus_ax_su);329 330	len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ac_su_txbf = %u\n",331			 htt_stats_buf->num_data_ppdus_ac_su_txbf);332 333	len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ax_su_txbf = %u\n\n",334			 htt_stats_buf->num_data_ppdus_ax_su_txbf);335 336	if (len >= buf_len)337		buf[buf_len - 1] = 0;338	else339		buf[len] = 0;340 341	stats_req->buf_len = len;342}343 344static inline void345htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(const void *tag_buf,346						  u16 tag_len,347						  struct debug_htt_stats_req *stats_req)348{349	const struct htt_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v *htt_stats_buf = tag_buf;350	u8 *buf = stats_req->buf;351	u32 len = stats_req->buf_len;352	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;353	u32  num_elements = ((tag_len - sizeof(htt_stats_buf->hist_bin_size)) >> 2);354 355	len += scnprintf(buf + len, buf_len - len,356			 "HTT_TX_PDEV_STATS_TRIED_MPDU_CNT_HIST_TLV_V:\n");357	len += scnprintf(buf + len, buf_len - len, "TRIED_MPDU_CNT_HIST_BIN_SIZE : %u\n",358			 htt_stats_buf->hist_bin_size);359 360	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tried_mpdu_cnt_hist,361			   "tried_mpdu_cnt_hist", num_elements, "\n\n");362 363	if (len >= buf_len)364		buf[buf_len - 1] = 0;365	else366		buf[len] = 0;367 368	stats_req->buf_len = len;369}370 371static inline void htt_print_hw_stats_intr_misc_tlv(const void *tag_buf,372						    struct debug_htt_stats_req *stats_req)373{374	const struct htt_hw_stats_intr_misc_tlv *htt_stats_buf = tag_buf;375	u8 *buf = stats_req->buf;376	u32 len = stats_req->buf_len;377	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;378	char hw_intr_name[HTT_STATS_MAX_HW_INTR_NAME_LEN + 1] = {0};379 380	len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_INTR_MISC_TLV:\n");381	memcpy(hw_intr_name, &(htt_stats_buf->hw_intr_name[0]),382	       HTT_STATS_MAX_HW_INTR_NAME_LEN);383	len += scnprintf(buf + len, buf_len - len, "hw_intr_name = %s\n", hw_intr_name);384	len += scnprintf(buf + len, buf_len - len, "mask = %u\n",385			 htt_stats_buf->mask);386	len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",387			 htt_stats_buf->count);388 389	if (len >= buf_len)390		buf[buf_len - 1] = 0;391	else392		buf[len] = 0;393 394	stats_req->buf_len = len;395}396 397static inline void398htt_print_hw_stats_wd_timeout_tlv(const void *tag_buf,399				  struct debug_htt_stats_req *stats_req)400{401	const struct htt_hw_stats_wd_timeout_tlv *htt_stats_buf = tag_buf;402	u8 *buf = stats_req->buf;403	u32 len = stats_req->buf_len;404	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;405	char hw_module_name[HTT_STATS_MAX_HW_MODULE_NAME_LEN + 1] = {0};406 407	len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WD_TIMEOUT_TLV:\n");408	memcpy(hw_module_name, &(htt_stats_buf->hw_module_name[0]),409	       HTT_STATS_MAX_HW_MODULE_NAME_LEN);410	len += scnprintf(buf + len, buf_len - len, "hw_module_name = %s\n",411			 hw_module_name);412	len += scnprintf(buf + len, buf_len - len, "count = %u\n",413			 htt_stats_buf->count);414 415	if (len >= buf_len)416		buf[buf_len - 1] = 0;417	else418		buf[len] = 0;419 420	stats_req->buf_len = len;421}422 423static inline void htt_print_hw_stats_pdev_errs_tlv(const void *tag_buf,424						    struct debug_htt_stats_req *stats_req)425{426	const struct htt_hw_stats_pdev_errs_tlv *htt_stats_buf = tag_buf;427	u8 *buf = stats_req->buf;428	u32 len = stats_req->buf_len;429	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;430 431	len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_PDEV_ERRS_TLV:\n");432	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",433			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));434	len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",435			 htt_stats_buf->tx_abort);436	len += scnprintf(buf + len, buf_len - len, "tx_abort_fail_count = %u\n",437			 htt_stats_buf->tx_abort_fail_count);438	len += scnprintf(buf + len, buf_len - len, "rx_abort = %u\n",439			 htt_stats_buf->rx_abort);440	len += scnprintf(buf + len, buf_len - len, "rx_abort_fail_count = %u\n",441			 htt_stats_buf->rx_abort_fail_count);442	len += scnprintf(buf + len, buf_len - len, "warm_reset = %u\n",443			 htt_stats_buf->warm_reset);444	len += scnprintf(buf + len, buf_len - len, "cold_reset = %u\n",445			 htt_stats_buf->cold_reset);446	len += scnprintf(buf + len, buf_len - len, "tx_flush = %u\n",447			 htt_stats_buf->tx_flush);448	len += scnprintf(buf + len, buf_len - len, "tx_glb_reset = %u\n",449			 htt_stats_buf->tx_glb_reset);450	len += scnprintf(buf + len, buf_len - len, "tx_txq_reset = %u\n",451			 htt_stats_buf->tx_txq_reset);452	len += scnprintf(buf + len, buf_len - len, "rx_timeout_reset = %u\n\n",453			 htt_stats_buf->rx_timeout_reset);454 455	if (len >= buf_len)456		buf[buf_len - 1] = 0;457	else458		buf[len] = 0;459 460	stats_req->buf_len = len;461}462 463static inline void htt_print_msdu_flow_stats_tlv(const void *tag_buf,464						 struct debug_htt_stats_req *stats_req)465{466	const struct htt_msdu_flow_stats_tlv *htt_stats_buf = tag_buf;467	u8 *buf = stats_req->buf;468	u32 len = stats_req->buf_len;469	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;470 471	len += scnprintf(buf + len, buf_len - len, "HTT_MSDU_FLOW_STATS_TLV:\n");472	len += scnprintf(buf + len, buf_len - len, "last_update_timestamp = %u\n",473			 htt_stats_buf->last_update_timestamp);474	len += scnprintf(buf + len, buf_len - len, "last_add_timestamp = %u\n",475			 htt_stats_buf->last_add_timestamp);476	len += scnprintf(buf + len, buf_len - len, "last_remove_timestamp = %u\n",477			 htt_stats_buf->last_remove_timestamp);478	len += scnprintf(buf + len, buf_len - len, "total_processed_msdu_count = %u\n",479			 htt_stats_buf->total_processed_msdu_count);480	len += scnprintf(buf + len, buf_len - len, "cur_msdu_count_in_flowq = %u\n",481			 htt_stats_buf->cur_msdu_count_in_flowq);482	len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",483			 htt_stats_buf->sw_peer_id);484	len += scnprintf(buf + len, buf_len - len, "tx_flow_no = %lu\n",485			 FIELD_GET(HTT_MSDU_FLOW_STATS_TX_FLOW_NO,486				   htt_stats_buf->tx_flow_no__tid_num__drop_rule));487	len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",488			 FIELD_GET(HTT_MSDU_FLOW_STATS_TID_NUM,489				   htt_stats_buf->tx_flow_no__tid_num__drop_rule));490	len += scnprintf(buf + len, buf_len - len, "drop_rule = %lu\n",491			 FIELD_GET(HTT_MSDU_FLOW_STATS_DROP_RULE,492				   htt_stats_buf->tx_flow_no__tid_num__drop_rule));493	len += scnprintf(buf + len, buf_len - len, "last_cycle_enqueue_count = %u\n",494			 htt_stats_buf->last_cycle_enqueue_count);495	len += scnprintf(buf + len, buf_len - len, "last_cycle_dequeue_count = %u\n",496			 htt_stats_buf->last_cycle_dequeue_count);497	len += scnprintf(buf + len, buf_len - len, "last_cycle_drop_count = %u\n",498			 htt_stats_buf->last_cycle_drop_count);499	len += scnprintf(buf + len, buf_len - len, "current_drop_th = %u\n\n",500			 htt_stats_buf->current_drop_th);501 502	if (len >= buf_len)503		buf[buf_len - 1] = 0;504	else505		buf[len] = 0;506 507	stats_req->buf_len = len;508}509 510static inline void htt_print_tx_tid_stats_tlv(const void *tag_buf,511					      struct debug_htt_stats_req *stats_req)512{513	const struct htt_tx_tid_stats_tlv *htt_stats_buf = tag_buf;514	u8 *buf = stats_req->buf;515	u32 len = stats_req->buf_len;516	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;517	char tid_name[MAX_HTT_TID_NAME + 1] = {0};518 519	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TID_STATS_TLV:\n");520	memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);521	len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);522	len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",523			 FIELD_GET(HTT_TX_TID_STATS_SW_PEER_ID,524				   htt_stats_buf->sw_peer_id__tid_num));525	len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",526			 FIELD_GET(HTT_TX_TID_STATS_TID_NUM,527				   htt_stats_buf->sw_peer_id__tid_num));528	len += scnprintf(buf + len, buf_len - len, "num_sched_pending = %lu\n",529			 FIELD_GET(HTT_TX_TID_STATS_NUM_SCHED_PENDING,530				   htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));531	len += scnprintf(buf + len, buf_len - len, "num_ppdu_in_hwq = %lu\n",532			 FIELD_GET(HTT_TX_TID_STATS_NUM_PPDU_IN_HWQ,533				   htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));534	len += scnprintf(buf + len, buf_len - len, "tid_flags = 0x%x\n",535			 htt_stats_buf->tid_flags);536	len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",537			 htt_stats_buf->hw_queued);538	len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",539			 htt_stats_buf->hw_reaped);540	len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",541			 htt_stats_buf->mpdus_hw_filter);542	len += scnprintf(buf + len, buf_len - len, "qdepth_bytes = %u\n",543			 htt_stats_buf->qdepth_bytes);544	len += scnprintf(buf + len, buf_len - len, "qdepth_num_msdu = %u\n",545			 htt_stats_buf->qdepth_num_msdu);546	len += scnprintf(buf + len, buf_len - len, "qdepth_num_mpdu = %u\n",547			 htt_stats_buf->qdepth_num_mpdu);548	len += scnprintf(buf + len, buf_len - len, "last_scheduled_tsmp = %u\n",549			 htt_stats_buf->last_scheduled_tsmp);550	len += scnprintf(buf + len, buf_len - len, "pause_module_id = %u\n",551			 htt_stats_buf->pause_module_id);552	len += scnprintf(buf + len, buf_len - len, "block_module_id = %u\n\n",553			 htt_stats_buf->block_module_id);554 555	if (len >= buf_len)556		buf[buf_len - 1] = 0;557	else558		buf[len] = 0;559 560	stats_req->buf_len = len;561}562 563static inline void htt_print_tx_tid_stats_v1_tlv(const void *tag_buf,564						 struct debug_htt_stats_req *stats_req)565{566	const struct htt_tx_tid_stats_v1_tlv *htt_stats_buf = tag_buf;567	u8 *buf = stats_req->buf;568	u32 len = stats_req->buf_len;569	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;570	char tid_name[MAX_HTT_TID_NAME + 1] = {0};571 572	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TID_STATS_V1_TLV:\n");573	memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);574	len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);575	len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",576			 FIELD_GET(HTT_TX_TID_STATS_V1_SW_PEER_ID,577				   htt_stats_buf->sw_peer_id__tid_num));578	len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",579			 FIELD_GET(HTT_TX_TID_STATS_V1_TID_NUM,580				   htt_stats_buf->sw_peer_id__tid_num));581	len += scnprintf(buf + len, buf_len - len, "num_sched_pending = %lu\n",582			 FIELD_GET(HTT_TX_TID_STATS_V1_NUM_SCHED_PENDING,583				   htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));584	len += scnprintf(buf + len, buf_len - len, "num_ppdu_in_hwq = %lu\n",585			 FIELD_GET(HTT_TX_TID_STATS_V1_NUM_PPDU_IN_HWQ,586				   htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));587	len += scnprintf(buf + len, buf_len - len, "tid_flags = 0x%x\n",588			 htt_stats_buf->tid_flags);589	len += scnprintf(buf + len, buf_len - len, "max_qdepth_bytes = %u\n",590			 htt_stats_buf->max_qdepth_bytes);591	len += scnprintf(buf + len, buf_len - len, "max_qdepth_n_msdus = %u\n",592			 htt_stats_buf->max_qdepth_n_msdus);593	len += scnprintf(buf + len, buf_len - len, "rsvd = %u\n",594			 htt_stats_buf->rsvd);595	len += scnprintf(buf + len, buf_len - len, "qdepth_bytes = %u\n",596			 htt_stats_buf->qdepth_bytes);597	len += scnprintf(buf + len, buf_len - len, "qdepth_num_msdu = %u\n",598			 htt_stats_buf->qdepth_num_msdu);599	len += scnprintf(buf + len, buf_len - len, "qdepth_num_mpdu = %u\n",600			 htt_stats_buf->qdepth_num_mpdu);601	len += scnprintf(buf + len, buf_len - len, "last_scheduled_tsmp = %u\n",602			 htt_stats_buf->last_scheduled_tsmp);603	len += scnprintf(buf + len, buf_len - len, "pause_module_id = %u\n",604			 htt_stats_buf->pause_module_id);605	len += scnprintf(buf + len, buf_len - len, "block_module_id = %u\n",606			 htt_stats_buf->block_module_id);607	len += scnprintf(buf + len, buf_len - len, "allow_n_flags = 0x%x\n",608			 htt_stats_buf->allow_n_flags);609	len += scnprintf(buf + len, buf_len - len, "sendn_frms_allowed = %u\n\n",610			 htt_stats_buf->sendn_frms_allowed);611 612	if (len >= buf_len)613		buf[buf_len - 1] = 0;614	else615		buf[len] = 0;616 617	stats_req->buf_len = len;618}619 620static inline void htt_print_rx_tid_stats_tlv(const void *tag_buf,621					      struct debug_htt_stats_req *stats_req)622{623	const struct htt_rx_tid_stats_tlv *htt_stats_buf = tag_buf;624	u8 *buf = stats_req->buf;625	u32 len = stats_req->buf_len;626	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;627	char tid_name[MAX_HTT_TID_NAME + 1] = {0};628 629	len += scnprintf(buf + len, buf_len - len, "HTT_RX_TID_STATS_TLV:\n");630	len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",631			 FIELD_GET(HTT_RX_TID_STATS_SW_PEER_ID,632				   htt_stats_buf->sw_peer_id__tid_num));633	len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",634			 FIELD_GET(HTT_RX_TID_STATS_TID_NUM,635				   htt_stats_buf->sw_peer_id__tid_num));636	memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);637	len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);638	len += scnprintf(buf + len, buf_len - len, "dup_in_reorder = %u\n",639			 htt_stats_buf->dup_in_reorder);640	len += scnprintf(buf + len, buf_len - len, "dup_past_outside_window = %u\n",641			 htt_stats_buf->dup_past_outside_window);642	len += scnprintf(buf + len, buf_len - len, "dup_past_within_window = %u\n",643			 htt_stats_buf->dup_past_within_window);644	len += scnprintf(buf + len, buf_len - len, "rxdesc_err_decrypt = %u\n\n",645			 htt_stats_buf->rxdesc_err_decrypt);646 647	if (len >= buf_len)648		buf[buf_len - 1] = 0;649	else650		buf[len] = 0;651 652	stats_req->buf_len = len;653}654 655static inline void htt_print_counter_tlv(const void *tag_buf,656					 struct debug_htt_stats_req *stats_req)657{658	const struct htt_counter_tlv *htt_stats_buf = tag_buf;659	u8 *buf = stats_req->buf;660	u32 len = stats_req->buf_len;661	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;662 663	len += scnprintf(buf + len, buf_len - len, "HTT_COUNTER_TLV:\n");664 665	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->counter_name,666			   "counter_name",667			   HTT_MAX_COUNTER_NAME, "\n");668	len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",669			 htt_stats_buf->count);670 671	if (len >= buf_len)672		buf[buf_len - 1] = 0;673	else674		buf[len] = 0;675 676	stats_req->buf_len = len;677}678 679static inline void htt_print_peer_stats_cmn_tlv(const void *tag_buf,680						struct debug_htt_stats_req *stats_req)681{682	const struct htt_peer_stats_cmn_tlv *htt_stats_buf = tag_buf;683	u8 *buf = stats_req->buf;684	u32 len = stats_req->buf_len;685	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;686 687	len += scnprintf(buf + len, buf_len - len, "HTT_PEER_STATS_CMN_TLV:\n");688	len += scnprintf(buf + len, buf_len - len, "ppdu_cnt = %u\n",689			 htt_stats_buf->ppdu_cnt);690	len += scnprintf(buf + len, buf_len - len, "mpdu_cnt = %u\n",691			 htt_stats_buf->mpdu_cnt);692	len += scnprintf(buf + len, buf_len - len, "msdu_cnt = %u\n",693			 htt_stats_buf->msdu_cnt);694	len += scnprintf(buf + len, buf_len - len, "pause_bitmap = %u\n",695			 htt_stats_buf->pause_bitmap);696	len += scnprintf(buf + len, buf_len - len, "block_bitmap = %u\n",697			 htt_stats_buf->block_bitmap);698	len += scnprintf(buf + len, buf_len - len, "last_rssi = %d\n",699			 htt_stats_buf->rssi);700	len += scnprintf(buf + len, buf_len - len, "enqueued_count = %llu\n",701			 htt_stats_buf->peer_enqueued_count_low |702			 ((u64)htt_stats_buf->peer_enqueued_count_high << 32));703	len += scnprintf(buf + len, buf_len - len, "dequeued_count = %llu\n",704			 htt_stats_buf->peer_dequeued_count_low |705			 ((u64)htt_stats_buf->peer_dequeued_count_high << 32));706	len += scnprintf(buf + len, buf_len - len, "dropped_count = %llu\n",707			 htt_stats_buf->peer_dropped_count_low |708			 ((u64)htt_stats_buf->peer_dropped_count_high << 32));709	len += scnprintf(buf + len, buf_len - len, "transmitted_ppdu_bytes = %llu\n",710			 htt_stats_buf->ppdu_transmitted_bytes_low |711			 ((u64)htt_stats_buf->ppdu_transmitted_bytes_high << 32));712	len += scnprintf(buf + len, buf_len - len, "ttl_removed_count = %u\n",713			 htt_stats_buf->peer_ttl_removed_count);714	len += scnprintf(buf + len, buf_len - len, "inactive_time = %u\n\n",715			 htt_stats_buf->inactive_time);716 717	if (len >= buf_len)718		buf[buf_len - 1] = 0;719	else720		buf[len] = 0;721 722	stats_req->buf_len = len;723}724 725static inline void htt_print_peer_details_tlv(const void *tag_buf,726					      struct debug_htt_stats_req *stats_req)727{728	const struct htt_peer_details_tlv *htt_stats_buf = tag_buf;729	u8 *buf = stats_req->buf;730	u32 len = stats_req->buf_len;731	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;732 733	len += scnprintf(buf + len, buf_len - len, "HTT_PEER_DETAILS_TLV:\n");734	len += scnprintf(buf + len, buf_len - len, "peer_type = %u\n",735			 htt_stats_buf->peer_type);736	len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",737			 htt_stats_buf->sw_peer_id);738	len += scnprintf(buf + len, buf_len - len, "vdev_id = %lu\n",739			 FIELD_GET(HTT_PEER_DETAILS_VDEV_ID,740				   htt_stats_buf->vdev_pdev_ast_idx));741	len += scnprintf(buf + len, buf_len - len, "pdev_id = %lu\n",742			 FIELD_GET(HTT_PEER_DETAILS_PDEV_ID,743				   htt_stats_buf->vdev_pdev_ast_idx));744	len += scnprintf(buf + len, buf_len - len, "ast_idx = %lu\n",745			 FIELD_GET(HTT_PEER_DETAILS_AST_IDX,746				   htt_stats_buf->vdev_pdev_ast_idx));747	len += scnprintf(buf + len, buf_len - len,748			 "mac_addr = %02lx:%02lx:%02lx:%02lx:%02lx:%02lx\n",749			 FIELD_GET(HTT_MAC_ADDR_L32_0,750				   htt_stats_buf->mac_addr.mac_addr_l32),751			 FIELD_GET(HTT_MAC_ADDR_L32_1,752				   htt_stats_buf->mac_addr.mac_addr_l32),753			 FIELD_GET(HTT_MAC_ADDR_L32_2,754				   htt_stats_buf->mac_addr.mac_addr_l32),755			 FIELD_GET(HTT_MAC_ADDR_L32_3,756				   htt_stats_buf->mac_addr.mac_addr_l32),757			 FIELD_GET(HTT_MAC_ADDR_H16_0,758				   htt_stats_buf->mac_addr.mac_addr_h16),759			 FIELD_GET(HTT_MAC_ADDR_H16_1,760				   htt_stats_buf->mac_addr.mac_addr_h16));761	len += scnprintf(buf + len, buf_len - len, "peer_flags = 0x%x\n",762			 htt_stats_buf->peer_flags);763	len += scnprintf(buf + len, buf_len - len, "qpeer_flags = 0x%x\n\n",764			 htt_stats_buf->qpeer_flags);765 766	if (len >= buf_len)767		buf[buf_len - 1] = 0;768	else769		buf[len] = 0;770 771	stats_req->buf_len = len;772}773 774static inline void htt_print_tx_peer_rate_stats_tlv(const void *tag_buf,775						    struct debug_htt_stats_req *stats_req)776{777	const struct htt_tx_peer_rate_stats_tlv *htt_stats_buf = tag_buf;778	u8 *buf = stats_req->buf;779	u32 len = stats_req->buf_len;780	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;781	u8 j;782 783	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PEER_RATE_STATS_TLV:\n");784	len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",785			 htt_stats_buf->tx_ldpc);786	len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",787			 htt_stats_buf->rts_cnt);788	len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",789			 htt_stats_buf->ack_rssi);790 791	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mcs, "tx_mcs",792			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");793	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_su_mcs, "tx_su_mcs",794			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");795	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mu_mcs, "tx_mu_mcs",796			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");797	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_nss, "tx_nss",798			   HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");799	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_bw, "tx_bw",800			   HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");801	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_stbc, "tx_stbc",802			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");803	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_pream, "tx_pream",804			   HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");805 806	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {807		len += scnprintf(buf + len, buf_len - len,808				 "tx_gi[%u] = ", j);809		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_gi[j], NULL,810				   HTT_TX_PEER_STATS_NUM_MCS_COUNTERS, "\n");811	}812 813	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_dcm, "tx_dcm",814			   HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");815 816	if (len >= buf_len)817		buf[buf_len - 1] = 0;818	else819		buf[len] = 0;820 821	stats_req->buf_len = len;822}823 824static inline void htt_print_rx_peer_rate_stats_tlv(const void *tag_buf,825						    struct debug_htt_stats_req *stats_req)826{827	const struct htt_rx_peer_rate_stats_tlv *htt_stats_buf = tag_buf;828	u8 *buf = stats_req->buf;829	u32 len = stats_req->buf_len;830	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;831	u8 j;832 833	len += scnprintf(buf + len, buf_len - len, "HTT_RX_PEER_RATE_STATS_TLV:\n");834	len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",835			 htt_stats_buf->nsts);836	len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",837			 htt_stats_buf->rx_ldpc);838	len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",839			 htt_stats_buf->rts_cnt);840	len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",841			 htt_stats_buf->rssi_mgmt);842	len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",843			 htt_stats_buf->rssi_data);844	len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",845			 htt_stats_buf->rssi_comb);846 847	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs, "rx_mcs",848			   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");849	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_nss, "rx_nss",850			   HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");851	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_dcm, "rx_dcm",852			   HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");853	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc, "rx_stbc",854			   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");855	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_bw, "rx_bw",856			   HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");857 858	for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++) {859		len += scnprintf(buf + len, (buf_len - len),860				 "rssi_chain[%u] = ", j);861		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain[j], NULL,862				   HTT_RX_PEER_STATS_NUM_BW_COUNTERS, "\n");863	}864 865	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {866		len += scnprintf(buf + len, (buf_len - len),867				 "rx_gi[%u] = ", j);868		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi[j], NULL,869				   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");870	}871 872	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_pream, "rx_pream",873			   HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");874 875	if (len >= buf_len)876		buf[buf_len - 1] = 0;877	else878		buf[len] = 0;879 880	stats_req->buf_len = len;881}882 883static inline void884htt_print_tx_hwq_mu_mimo_sch_stats_tlv(const void *tag_buf,885				       struct debug_htt_stats_req *stats_req)886{887	const struct htt_tx_hwq_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;888	u8 *buf = stats_req->buf;889	u32 len = stats_req->buf_len;890	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;891 892	len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:\n");893	len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",894			 htt_stats_buf->mu_mimo_sch_posted);895	len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",896			 htt_stats_buf->mu_mimo_sch_failed);897	len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n\n",898			 htt_stats_buf->mu_mimo_ppdu_posted);899 900	if (len >= buf_len)901		buf[buf_len - 1] = 0;902	else903		buf[len] = 0;904 905	stats_req->buf_len = len;906}907 908static inline void909htt_print_tx_hwq_mu_mimo_mpdu_stats_tlv(const void *tag_buf,910					struct debug_htt_stats_req *stats_req)911{912	const struct htt_tx_hwq_mu_mimo_mpdu_stats_tlv *htt_stats_buf = tag_buf;913	u8 *buf = stats_req->buf;914	u32 len = stats_req->buf_len;915	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;916 917	len += scnprintf(buf + len, buf_len - len,918			 "HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:\n");919	len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_queued_usr = %u\n",920			 htt_stats_buf->mu_mimo_mpdus_queued_usr);921	len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_tried_usr = %u\n",922			 htt_stats_buf->mu_mimo_mpdus_tried_usr);923	len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_failed_usr = %u\n",924			 htt_stats_buf->mu_mimo_mpdus_failed_usr);925	len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_requeued_usr = %u\n",926			 htt_stats_buf->mu_mimo_mpdus_requeued_usr);927	len += scnprintf(buf + len, buf_len - len, "mu_mimo_err_no_ba_usr = %u\n",928			 htt_stats_buf->mu_mimo_err_no_ba_usr);929	len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdu_underrun_usr = %u\n",930			 htt_stats_buf->mu_mimo_mpdu_underrun_usr);931	len += scnprintf(buf + len, buf_len - len, "mu_mimo_ampdu_underrun_usr = %u\n\n",932			 htt_stats_buf->mu_mimo_ampdu_underrun_usr);933 934	if (len >= buf_len)935		buf[buf_len - 1] = 0;936	else937		buf[len] = 0;938 939	stats_req->buf_len = len;940}941 942static inline void943htt_print_tx_hwq_mu_mimo_cmn_stats_tlv(const void *tag_buf,944				       struct debug_htt_stats_req *stats_req)945{946	const struct htt_tx_hwq_mu_mimo_cmn_stats_tlv *htt_stats_buf = tag_buf;947	u8 *buf = stats_req->buf;948	u32 len = stats_req->buf_len;949	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;950 951	len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:\n");952	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",953			 FIELD_GET(HTT_TX_HWQ_STATS_MAC_ID,954				   htt_stats_buf->mac_id__hwq_id__word));955	len += scnprintf(buf + len, buf_len - len, "hwq_id = %lu\n\n",956			 FIELD_GET(HTT_TX_HWQ_STATS_HWQ_ID,957				   htt_stats_buf->mac_id__hwq_id__word));958 959	if (len >= buf_len)960		buf[buf_len - 1] = 0;961	else962		buf[len] = 0;963 964	stats_req->buf_len = len;965}966 967static inline void968htt_print_tx_hwq_stats_cmn_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req)969{970	const struct htt_tx_hwq_stats_cmn_tlv *htt_stats_buf = tag_buf;971	u8 *buf = stats_req->buf;972	u32 len = stats_req->buf_len;973	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;974 975	/* TODO: HKDBG */976	len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_STATS_CMN_TLV:\n");977	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",978			 FIELD_GET(HTT_TX_HWQ_STATS_MAC_ID,979				   htt_stats_buf->mac_id__hwq_id__word));980	len += scnprintf(buf + len, buf_len - len, "hwq_id = %lu\n",981			 FIELD_GET(HTT_TX_HWQ_STATS_HWQ_ID,982				   htt_stats_buf->mac_id__hwq_id__word));983	len += scnprintf(buf + len, buf_len - len, "xretry = %u\n",984			 htt_stats_buf->xretry);985	len += scnprintf(buf + len, buf_len - len, "underrun_cnt = %u\n",986			 htt_stats_buf->underrun_cnt);987	len += scnprintf(buf + len, buf_len - len, "flush_cnt = %u\n",988			 htt_stats_buf->flush_cnt);989	len += scnprintf(buf + len, buf_len - len, "filt_cnt = %u\n",990			 htt_stats_buf->filt_cnt);991	len += scnprintf(buf + len, buf_len - len, "null_mpdu_bmap = %u\n",992			 htt_stats_buf->null_mpdu_bmap);993	len += scnprintf(buf + len, buf_len - len, "user_ack_failure = %u\n",994			 htt_stats_buf->user_ack_failure);995	len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",996			 htt_stats_buf->ack_tlv_proc);997	len += scnprintf(buf + len, buf_len - len, "sched_id_proc = %u\n",998			 htt_stats_buf->sched_id_proc);999	len += scnprintf(buf + len, buf_len - len, "null_mpdu_tx_count = %u\n",1000			 htt_stats_buf->null_mpdu_tx_count);1001	len += scnprintf(buf + len, buf_len - len, "mpdu_bmap_not_recvd = %u\n",1002			 htt_stats_buf->mpdu_bmap_not_recvd);1003	len += scnprintf(buf + len, buf_len - len, "num_bar = %u\n",1004			 htt_stats_buf->num_bar);1005	len += scnprintf(buf + len, buf_len - len, "rts = %u\n",1006			 htt_stats_buf->rts);1007	len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",1008			 htt_stats_buf->cts2self);1009	len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",1010			 htt_stats_buf->qos_null);1011	len += scnprintf(buf + len, buf_len - len, "mpdu_tried_cnt = %u\n",1012			 htt_stats_buf->mpdu_tried_cnt);1013	len += scnprintf(buf + len, buf_len - len, "mpdu_queued_cnt = %u\n",1014			 htt_stats_buf->mpdu_queued_cnt);1015	len += scnprintf(buf + len, buf_len - len, "mpdu_ack_fail_cnt = %u\n",1016			 htt_stats_buf->mpdu_ack_fail_cnt);1017	len += scnprintf(buf + len, buf_len - len, "mpdu_filt_cnt = %u\n",1018			 htt_stats_buf->mpdu_filt_cnt);1019	len += scnprintf(buf + len, buf_len - len, "false_mpdu_ack_count = %u\n",1020			 htt_stats_buf->false_mpdu_ack_count);1021	len += scnprintf(buf + len, buf_len - len, "txq_timeout = %u\n\n",1022			 htt_stats_buf->txq_timeout);1023 1024	if (len >= buf_len)1025		buf[buf_len - 1] = 0;1026	else1027		buf[len] = 0;1028 1029	stats_req->buf_len = len;1030}1031 1032static inline void1033htt_print_tx_hwq_difs_latency_stats_tlv_v(const void *tag_buf,1034					  u16 tag_len,1035					  struct debug_htt_stats_req *stats_req)1036{1037	const struct htt_tx_hwq_difs_latency_stats_tlv_v *htt_stats_buf = tag_buf;1038	u8 *buf = stats_req->buf;1039	u32 len = stats_req->buf_len;1040	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1041	u16 data_len = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);1042 1043	len += scnprintf(buf + len, buf_len - len,1044			 "HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:\n");1045	len += scnprintf(buf + len, buf_len - len, "hist_intvl = %u\n",1046			 htt_stats_buf->hist_intvl);1047 1048	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->difs_latency_hist,1049			   "difs_latency_hist", data_len, "\n\n");1050 1051	if (len >= buf_len)1052		buf[buf_len - 1] = 0;1053	else1054		buf[len] = 0;1055 1056	stats_req->buf_len = len;1057}1058 1059static inline void1060htt_print_tx_hwq_cmd_result_stats_tlv_v(const void *tag_buf,1061					u16 tag_len,1062					struct debug_htt_stats_req *stats_req)1063{1064	const struct htt_tx_hwq_cmd_result_stats_tlv_v *htt_stats_buf = tag_buf;1065	u8 *buf = stats_req->buf;1066	u32 len = stats_req->buf_len;1067	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1068	u16 data_len;1069 1070	data_len = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_CMD_RESULT_STATS);1071 1072	len += scnprintf(buf + len, buf_len - len,1073			 "HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:\n");1074 1075	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->cmd_result, "cmd_result",1076			   data_len, "\n\n");1077 1078	if (len >= buf_len)1079		buf[buf_len - 1] = 0;1080	else1081		buf[len] = 0;1082 1083	stats_req->buf_len = len;1084}1085 1086static inline void1087htt_print_tx_hwq_cmd_stall_stats_tlv_v(const void *tag_buf,1088				       u16 tag_len,1089				       struct debug_htt_stats_req *stats_req)1090{1091	const struct htt_tx_hwq_cmd_stall_stats_tlv_v *htt_stats_buf = tag_buf;1092	u8 *buf = stats_req->buf;1093	u32 len = stats_req->buf_len;1094	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1095	u16 num_elems;1096 1097	num_elems = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_CMD_STALL_STATS);1098 1099	len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:\n");1100 1101	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->cmd_stall_status,1102			   "cmd_stall_status", num_elems, "\n\n");1103 1104	if (len >= buf_len)1105		buf[buf_len - 1] = 0;1106	else1107		buf[len] = 0;1108 1109	stats_req->buf_len = len;1110}1111 1112static inline void1113htt_print_tx_hwq_fes_result_stats_tlv_v(const void *tag_buf,1114					u16 tag_len,1115					struct debug_htt_stats_req *stats_req)1116{1117	const struct htt_tx_hwq_fes_result_stats_tlv_v *htt_stats_buf = tag_buf;1118	u8 *buf = stats_req->buf;1119	u32 len = stats_req->buf_len;1120	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1121	u16 num_elems;1122 1123	num_elems = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_FES_RESULT_STATS);1124 1125	len += scnprintf(buf + len, buf_len - len,1126			 "HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:\n");1127 1128	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fes_result, "fes_result",1129			   num_elems, "\n\n");1130 1131	if (len >= buf_len)1132		buf[buf_len - 1] = 0;1133	else1134		buf[len] = 0;1135 1136	stats_req->buf_len = len;1137}1138 1139static inline void1140htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(const void *tag_buf,1141					   u16 tag_len,1142					   struct debug_htt_stats_req *stats_req)1143{1144	const struct htt_tx_hwq_tried_mpdu_cnt_hist_tlv_v *htt_stats_buf = tag_buf;1145	u8 *buf = stats_req->buf;1146	u32 len = stats_req->buf_len;1147	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1148	u32  num_elements = ((tag_len -1149			    sizeof(htt_stats_buf->hist_bin_size)) >> 2);1150 1151	len += scnprintf(buf + len, buf_len - len,1152			 "HTT_TX_HWQ_TRIED_MPDU_CNT_HIST_TLV_V:\n");1153	len += scnprintf(buf + len, buf_len - len, "TRIED_MPDU_CNT_HIST_BIN_SIZE : %u\n",1154			 htt_stats_buf->hist_bin_size);1155 1156	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tried_mpdu_cnt_hist,1157			   "tried_mpdu_cnt_hist", num_elements, "\n\n");1158 1159	if (len >= buf_len)1160		buf[buf_len - 1] = 0;1161	else1162		buf[len] = 0;1163 1164	stats_req->buf_len = len;1165}1166 1167static inline void1168htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(const void *tag_buf,1169					  u16 tag_len,1170					  struct debug_htt_stats_req *stats_req)1171{1172	const struct htt_tx_hwq_txop_used_cnt_hist_tlv_v *htt_stats_buf = tag_buf;1173	u8 *buf = stats_req->buf;1174	u32 len = stats_req->buf_len;1175	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1176	u32 num_elements = tag_len >> 2;1177 1178	len += scnprintf(buf + len, buf_len - len,1179			 "HTT_TX_HWQ_TXOP_USED_CNT_HIST_TLV_V:\n");1180 1181	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->txop_used_cnt_hist,1182			   "txop_used_cnt_hist", num_elements, "\n\n");1183 1184	if (len >= buf_len)1185		buf[buf_len - 1] = 0;1186	else1187		buf[len] = 0;1188 1189	stats_req->buf_len = len;1190}1191 1192static inline void htt_print_tx_sounding_stats_tlv(const void *tag_buf,1193						   struct debug_htt_stats_req *stats_req)1194{1195	s32 i;1196	const struct htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf;1197	u8 *buf = stats_req->buf;1198	u32 len = stats_req->buf_len;1199	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1200	const u32 *cbf_20 = htt_stats_buf->cbf_20;1201	const u32 *cbf_40 = htt_stats_buf->cbf_40;1202	const u32 *cbf_80 = htt_stats_buf->cbf_80;1203	const u32 *cbf_160 = htt_stats_buf->cbf_160;1204 1205	if (htt_stats_buf->tx_sounding_mode == HTT_TX_AC_SOUNDING_MODE) {1206		len += scnprintf(buf + len, buf_len - len,1207				 "\nHTT_TX_AC_SOUNDING_STATS_TLV:\n\n");1208		len += scnprintf(buf + len, buf_len - len,1209				 "ac_cbf_20 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1210				 cbf_20[HTT_IMPLICIT_TXBF_STEER_STATS],1211				 cbf_20[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1212				 cbf_20[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1213				 cbf_20[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1214				 cbf_20[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1215		len += scnprintf(buf + len, buf_len - len,1216				 "ac_cbf_40 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1217				 cbf_40[HTT_IMPLICIT_TXBF_STEER_STATS],1218				 cbf_40[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1219				 cbf_40[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1220				 cbf_40[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1221				 cbf_40[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1222		len += scnprintf(buf + len, buf_len - len,1223				 "ac_cbf_80 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1224				 cbf_80[HTT_IMPLICIT_TXBF_STEER_STATS],1225				 cbf_80[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1226				 cbf_80[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1227				 cbf_80[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1228				 cbf_80[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1229		len += scnprintf(buf + len, buf_len - len,1230				 "ac_cbf_160 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1231				 cbf_160[HTT_IMPLICIT_TXBF_STEER_STATS],1232				 cbf_160[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1233				 cbf_160[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1234				 cbf_160[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1235				 cbf_160[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1236 1237		for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {1238			len += scnprintf(buf + len, buf_len - len,1239					 "Sounding User %u = 20MHz: %u, 40MHz : %u, 80MHz: %u, 160MHz: %u\n",1240					 i,1241					 htt_stats_buf->sounding[0],1242					 htt_stats_buf->sounding[1],1243					 htt_stats_buf->sounding[2],1244					 htt_stats_buf->sounding[3]);1245		}1246	} else if (htt_stats_buf->tx_sounding_mode == HTT_TX_AX_SOUNDING_MODE) {1247		len += scnprintf(buf + len, buf_len - len,1248				 "\nHTT_TX_AX_SOUNDING_STATS_TLV:\n");1249		len += scnprintf(buf + len, buf_len - len,1250				 "ax_cbf_20 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1251				 cbf_20[HTT_IMPLICIT_TXBF_STEER_STATS],1252				 cbf_20[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1253				 cbf_20[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1254				 cbf_20[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1255				 cbf_20[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1256		len += scnprintf(buf + len, buf_len - len,1257				 "ax_cbf_40 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1258				 cbf_40[HTT_IMPLICIT_TXBF_STEER_STATS],1259				 cbf_40[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1260				 cbf_40[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1261				 cbf_40[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1262				 cbf_40[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1263		len += scnprintf(buf + len, buf_len - len,1264				 "ax_cbf_80 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1265				 cbf_80[HTT_IMPLICIT_TXBF_STEER_STATS],1266				 cbf_80[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1267				 cbf_80[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1268				 cbf_80[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1269				 cbf_80[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1270		len += scnprintf(buf + len, buf_len - len,1271				 "ax_cbf_160 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",1272				 cbf_160[HTT_IMPLICIT_TXBF_STEER_STATS],1273				 cbf_160[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],1274				 cbf_160[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],1275				 cbf_160[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],1276				 cbf_160[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);1277 1278		for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {1279			len += scnprintf(buf + len, buf_len - len,1280					 "Sounding User %u = 20MHz: %u, 40MHz : %u, 80MHz: %u, 160MHz: %u\n",1281					 i,1282					 htt_stats_buf->sounding[0],1283					 htt_stats_buf->sounding[1],1284					 htt_stats_buf->sounding[2],1285					 htt_stats_buf->sounding[3]);1286		}1287	}1288 1289	if (len >= buf_len)1290		buf[buf_len - 1] = 0;1291	else1292		buf[len] = 0;1293 1294	stats_req->buf_len = len;1295}1296 1297static inline void1298htt_print_tx_selfgen_cmn_stats_tlv(const void *tag_buf,1299				   struct debug_htt_stats_req *stats_req)1300{1301	const struct htt_tx_selfgen_cmn_stats_tlv *htt_stats_buf = tag_buf;1302	u8 *buf = stats_req->buf;1303	u32 len = stats_req->buf_len;1304	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1305 1306	len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_CMN_STATS_TLV:\n");1307	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",1308			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));1309	len += scnprintf(buf + len, buf_len - len, "su_bar = %u\n",1310			 htt_stats_buf->su_bar);1311	len += scnprintf(buf + len, buf_len - len, "rts = %u\n",1312			 htt_stats_buf->rts);1313	len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",1314			 htt_stats_buf->cts2self);1315	len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",1316			 htt_stats_buf->qos_null);1317	len += scnprintf(buf + len, buf_len - len, "delayed_bar_1 = %u\n",1318			 htt_stats_buf->delayed_bar_1);1319	len += scnprintf(buf + len, buf_len - len, "delayed_bar_2 = %u\n",1320			 htt_stats_buf->delayed_bar_2);1321	len += scnprintf(buf + len, buf_len - len, "delayed_bar_3 = %u\n",1322			 htt_stats_buf->delayed_bar_3);1323	len += scnprintf(buf + len, buf_len - len, "delayed_bar_4 = %u\n",1324			 htt_stats_buf->delayed_bar_4);1325	len += scnprintf(buf + len, buf_len - len, "delayed_bar_5 = %u\n",1326			 htt_stats_buf->delayed_bar_5);1327	len += scnprintf(buf + len, buf_len - len, "delayed_bar_6 = %u\n",1328			 htt_stats_buf->delayed_bar_6);1329	len += scnprintf(buf + len, buf_len - len, "delayed_bar_7 = %u\n\n",1330			 htt_stats_buf->delayed_bar_7);1331 1332	if (len >= buf_len)1333		buf[buf_len - 1] = 0;1334	else1335		buf[len] = 0;1336 1337	stats_req->buf_len = len;1338}1339 1340static inline void1341htt_print_tx_selfgen_ac_stats_tlv(const void *tag_buf,1342				  struct debug_htt_stats_req *stats_req)1343{1344	const struct htt_tx_selfgen_ac_stats_tlv *htt_stats_buf = tag_buf;1345	u8 *buf = stats_req->buf;1346	u32 len = stats_req->buf_len;1347	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1348 1349	len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_STATS_TLV:\n");1350	len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa = %u\n",1351			 htt_stats_buf->ac_su_ndpa);1352	len += scnprintf(buf + len, buf_len - len, "ac_su_ndp = %u\n",1353			 htt_stats_buf->ac_su_ndp);1354	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa = %u\n",1355			 htt_stats_buf->ac_mu_mimo_ndpa);1356	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp = %u\n",1357			 htt_stats_buf->ac_mu_mimo_ndp);1358	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_1 = %u\n",1359			 htt_stats_buf->ac_mu_mimo_brpoll_1);1360	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_2 = %u\n",1361			 htt_stats_buf->ac_mu_mimo_brpoll_2);1362	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_3 = %u\n\n",1363			 htt_stats_buf->ac_mu_mimo_brpoll_3);1364 1365	if (len >= buf_len)1366		buf[buf_len - 1] = 0;1367	else1368		buf[len] = 0;1369 1370	stats_req->buf_len = len;1371}1372 1373static inline void1374htt_print_tx_selfgen_ax_stats_tlv(const void *tag_buf,1375				  struct debug_htt_stats_req *stats_req)1376{1377	const struct htt_tx_selfgen_ax_stats_tlv *htt_stats_buf = tag_buf;1378	u8 *buf = stats_req->buf;1379	u32 len = stats_req->buf_len;1380	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1381 1382	len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_STATS_TLV:\n");1383	len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa = %u\n",1384			 htt_stats_buf->ax_su_ndpa);1385	len += scnprintf(buf + len, buf_len - len, "ax_su_ndp = %u\n",1386			 htt_stats_buf->ax_su_ndp);1387	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa = %u\n",1388			 htt_stats_buf->ax_mu_mimo_ndpa);1389	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp = %u\n",1390			 htt_stats_buf->ax_mu_mimo_ndp);1391	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_1 = %u\n",1392			 htt_stats_buf->ax_mu_mimo_brpoll_1);1393	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_2 = %u\n",1394			 htt_stats_buf->ax_mu_mimo_brpoll_2);1395	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_3 = %u\n",1396			 htt_stats_buf->ax_mu_mimo_brpoll_3);1397	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_4 = %u\n",1398			 htt_stats_buf->ax_mu_mimo_brpoll_4);1399	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_5 = %u\n",1400			 htt_stats_buf->ax_mu_mimo_brpoll_5);1401	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_6 = %u\n",1402			 htt_stats_buf->ax_mu_mimo_brpoll_6);1403	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_7 = %u\n",1404			 htt_stats_buf->ax_mu_mimo_brpoll_7);1405	len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger = %u\n",1406			 htt_stats_buf->ax_basic_trigger);1407	len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_trigger = %u\n",1408			 htt_stats_buf->ax_ulmumimo_trigger);1409	len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger = %u\n",1410			 htt_stats_buf->ax_bsr_trigger);1411	len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger = %u\n",1412			 htt_stats_buf->ax_mu_bar_trigger);1413	len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger = %u\n\n",1414			 htt_stats_buf->ax_mu_rts_trigger);1415 1416	if (len >= buf_len)1417		buf[buf_len - 1] = 0;1418	else1419		buf[len] = 0;1420 1421	stats_req->buf_len = len;1422}1423 1424static inline void1425htt_print_tx_selfgen_ac_err_stats_tlv(const void *tag_buf,1426				      struct debug_htt_stats_req *stats_req)1427{1428	const struct htt_tx_selfgen_ac_err_stats_tlv *htt_stats_buf = tag_buf;1429	u8 *buf = stats_req->buf;1430	u32 len = stats_req->buf_len;1431	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1432 1433	len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:\n");1434	len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_err = %u\n",1435			 htt_stats_buf->ac_su_ndp_err);1436	len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_err = %u\n",1437			 htt_stats_buf->ac_su_ndpa_err);1438	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_err = %u\n",1439			 htt_stats_buf->ac_mu_mimo_ndpa_err);1440	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_err = %u\n",1441			 htt_stats_buf->ac_mu_mimo_ndp_err);1442	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp1_err = %u\n",1443			 htt_stats_buf->ac_mu_mimo_brp1_err);1444	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp2_err = %u\n",1445			 htt_stats_buf->ac_mu_mimo_brp2_err);1446	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp3_err = %u\n\n",1447			 htt_stats_buf->ac_mu_mimo_brp3_err);1448 1449	if (len >= buf_len)1450		buf[buf_len - 1] = 0;1451	else1452		buf[len] = 0;1453 1454	stats_req->buf_len = len;1455}1456 1457static inline void1458htt_print_tx_selfgen_ax_err_stats_tlv(const void *tag_buf,1459				      struct debug_htt_stats_req *stats_req)1460{1461	const struct htt_tx_selfgen_ax_err_stats_tlv *htt_stats_buf = tag_buf;1462	u8 *buf = stats_req->buf;1463	u32 len = stats_req->buf_len;1464	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1465 1466	len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:\n");1467	len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_err = %u\n",1468			 htt_stats_buf->ax_su_ndp_err);1469	len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_err = %u\n",1470			 htt_stats_buf->ax_su_ndpa_err);1471	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_err = %u\n",1472			 htt_stats_buf->ax_mu_mimo_ndpa_err);1473	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_err = %u\n",1474			 htt_stats_buf->ax_mu_mimo_ndp_err);1475	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp1_err = %u\n",1476			 htt_stats_buf->ax_mu_mimo_brp1_err);1477	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp2_err = %u\n",1478			 htt_stats_buf->ax_mu_mimo_brp2_err);1479	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp3_err = %u\n",1480			 htt_stats_buf->ax_mu_mimo_brp3_err);1481	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp4_err = %u\n",1482			 htt_stats_buf->ax_mu_mimo_brp4_err);1483	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp5_err = %u\n",1484			 htt_stats_buf->ax_mu_mimo_brp5_err);1485	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp6_err = %u\n",1486			 htt_stats_buf->ax_mu_mimo_brp6_err);1487	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp7_err = %u\n",1488			 htt_stats_buf->ax_mu_mimo_brp7_err);1489	len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger_err = %u\n",1490			 htt_stats_buf->ax_basic_trigger_err);1491	len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_trigger_err = %u\n",1492			 htt_stats_buf->ax_ulmumimo_trigger_err);1493	len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger_err = %u\n",1494			 htt_stats_buf->ax_bsr_trigger_err);1495	len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger_err = %u\n",1496			 htt_stats_buf->ax_mu_bar_trigger_err);1497	len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger_err = %u\n\n",1498			 htt_stats_buf->ax_mu_rts_trigger_err);1499 1500	if (len >= buf_len)1501		buf[buf_len - 1] = 0;1502	else1503		buf[len] = 0;1504 1505	stats_req->buf_len = len;1506}1507 1508static inline void1509htt_print_tx_pdev_mu_mimo_sch_stats_tlv(const void *tag_buf,1510					struct debug_htt_stats_req *stats_req)1511{1512	const struct htt_tx_pdev_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;1513	u8 *buf = stats_req->buf;1514	u32 len = stats_req->buf_len;1515	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1516	u8 i;1517 1518	len += scnprintf(buf + len, buf_len - len,1519			 "HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:\n");1520	len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",1521			 htt_stats_buf->mu_mimo_sch_posted);1522	len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",1523			 htt_stats_buf->mu_mimo_sch_failed);1524	len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n\n",1525			 htt_stats_buf->mu_mimo_ppdu_posted);1526 1527	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++)1528		len += scnprintf(buf + len, buf_len - len,1529				 "ac_mu_mimo_sch_posted_per_group_index %u = %u\n",1530				 i, htt_stats_buf->ac_mu_mimo_sch_posted_per_grp_sz[i]);1531 1532	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++)1533		len += scnprintf(buf + len, buf_len - len,1534				 "ax_mu_mimo_sch_posted_per_group_index %u = %u\n",1535				 i, htt_stats_buf->ax_mu_mimo_sch_posted_per_grp_sz[i]);1536 1537	len += scnprintf(buf + len, buf_len - len, "11ac MU_MIMO SCH STATS:\n");1538 1539	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++)1540		len += scnprintf(buf + len, buf_len - len,1541				 "ac_mu_mimo_sch_nusers_%u = %u\n",1542				 i, htt_stats_buf->ac_mu_mimo_sch_nusers[i]);1543 1544	len += scnprintf(buf + len, buf_len - len, "\n11ax MU_MIMO SCH STATS:\n");1545 1546	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++)1547		len += scnprintf(buf + len, buf_len - len,1548				 "ax_mu_mimo_sch_nusers_%u = %u\n",1549				 i, htt_stats_buf->ax_mu_mimo_sch_nusers[i]);1550 1551	len += scnprintf(buf + len, buf_len - len, "\n11ax OFDMA SCH STATS:\n");1552 1553	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {1554		len += scnprintf(buf + len, buf_len - len,1555				 "ax_ofdma_sch_nusers_%u = %u\n",1556				 i, htt_stats_buf->ax_ofdma_sch_nusers[i]);1557		len += scnprintf(buf + len, buf_len - len,1558				 "ax_ul_ofdma_basic_sch_nusers_%u = %u\n",1559				 i, htt_stats_buf->ax_ul_ofdma_basic_sch_nusers[i]);1560		len += scnprintf(buf + len, buf_len - len,1561				 "ax_ul_ofdma_bsr_sch_nusers_%u = %u\n",1562				 i, htt_stats_buf->ax_ul_ofdma_bsr_sch_nusers[i]);1563		len += scnprintf(buf + len, buf_len - len,1564				 "ax_ul_ofdma_sch_bar_nusers_%u = %u\n",1565				 i, htt_stats_buf->ax_ul_ofdma_bar_sch_nusers[i]);1566		len += scnprintf(buf + len, buf_len - len,1567				 "ax_ul_ofdma_brp_sch_nusers_%u = %u\n",1568				 i, htt_stats_buf->ax_ul_ofdma_brp_sch_nusers[i]);1569	}1570 1571	len += scnprintf(buf + len, buf_len - len, "\n11ax UL MUMIO SCH STATS:\n");1572 1573	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS; i++) {1574		len += scnprintf(buf + len, buf_len - len,1575				 "ax_ul_mumimo_basic_sch_nusers_%u = %u\n",1576				 i, htt_stats_buf->ax_ul_mumimo_basic_sch_nusers[i]);1577		len += scnprintf(buf + len, buf_len - len,1578				 "ax_ul_mumimo_brp_sch_nusers_%u = %u\n",1579				 i, htt_stats_buf->ax_ul_mumimo_brp_sch_nusers[i]);1580	}1581 1582	if (len >= buf_len)1583		buf[buf_len - 1] = 0;1584	else1585		buf[len] = 0;1586 1587	stats_req->buf_len = len;1588}1589 1590static inline void1591htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf,1592					 struct debug_htt_stats_req *stats_req)1593{1594	const struct htt_tx_pdev_mpdu_stats_tlv *htt_stats_buf = tag_buf;1595	u8 *buf = stats_req->buf;1596	u32 len = stats_req->buf_len;1597	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1598 1599	if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {1600		if (!htt_stats_buf->user_index)1601			len += scnprintf(buf + len, buf_len - len,1602					 "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");1603 1604		if (htt_stats_buf->user_index <1605		    HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {1606			len += scnprintf(buf + len, buf_len - len,1607					 "ac_mu_mimo_mpdus_queued_usr_%u = %u\n",1608					 htt_stats_buf->user_index,1609					 htt_stats_buf->mpdus_queued_usr);1610			len += scnprintf(buf + len, buf_len - len,1611					 "ac_mu_mimo_mpdus_tried_usr_%u = %u\n",1612					 htt_stats_buf->user_index,1613					 htt_stats_buf->mpdus_tried_usr);1614			len += scnprintf(buf + len, buf_len - len,1615					 "ac_mu_mimo_mpdus_failed_usr_%u = %u\n",1616					 htt_stats_buf->user_index,1617					 htt_stats_buf->mpdus_failed_usr);1618			len += scnprintf(buf + len, buf_len - len,1619					 "ac_mu_mimo_mpdus_requeued_usr_%u = %u\n",1620					 htt_stats_buf->user_index,1621					 htt_stats_buf->mpdus_requeued_usr);1622			len += scnprintf(buf + len, buf_len - len,1623					 "ac_mu_mimo_err_no_ba_usr_%u = %u\n",1624					 htt_stats_buf->user_index,1625					 htt_stats_buf->err_no_ba_usr);1626			len += scnprintf(buf + len, buf_len - len,1627					 "ac_mu_mimo_mpdu_underrun_usr_%u = %u\n",1628					 htt_stats_buf->user_index,1629					 htt_stats_buf->mpdu_underrun_usr);1630			len += scnprintf(buf + len, buf_len - len,1631					 "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",1632					 htt_stats_buf->user_index,1633					 htt_stats_buf->ampdu_underrun_usr);1634		}1635	}1636 1637	if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {1638		if (!htt_stats_buf->user_index)1639			len += scnprintf(buf + len, buf_len - len,1640					 "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");1641 1642		if (htt_stats_buf->user_index <1643		    HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {1644			len += scnprintf(buf + len, buf_len - len,1645					 "ax_mu_mimo_mpdus_queued_usr_%u = %u\n",1646					 htt_stats_buf->user_index,1647					 htt_stats_buf->mpdus_queued_usr);1648			len += scnprintf(buf + len, buf_len - len,1649					 "ax_mu_mimo_mpdus_tried_usr_%u = %u\n",1650					 htt_stats_buf->user_index,1651					 htt_stats_buf->mpdus_tried_usr);1652			len += scnprintf(buf + len, buf_len - len,1653					 "ax_mu_mimo_mpdus_failed_usr_%u = %u\n",1654					 htt_stats_buf->user_index,1655					 htt_stats_buf->mpdus_failed_usr);1656			len += scnprintf(buf + len, buf_len - len,1657					 "ax_mu_mimo_mpdus_requeued_usr_%u = %u\n",1658					 htt_stats_buf->user_index,1659					 htt_stats_buf->mpdus_requeued_usr);1660			len += scnprintf(buf + len, buf_len - len,1661					 "ax_mu_mimo_err_no_ba_usr_%u = %u\n",1662					 htt_stats_buf->user_index,1663					 htt_stats_buf->err_no_ba_usr);1664			len += scnprintf(buf + len, buf_len - len,1665					 "ax_mu_mimo_mpdu_underrun_usr_%u = %u\n",1666					 htt_stats_buf->user_index,1667					 htt_stats_buf->mpdu_underrun_usr);1668			len += scnprintf(buf + len, buf_len - len,1669					 "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",1670					 htt_stats_buf->user_index,1671					 htt_stats_buf->ampdu_underrun_usr);1672		}1673	}1674 1675	if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {1676		if (!htt_stats_buf->user_index)1677			len += scnprintf(buf + len, buf_len - len,1678					 "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");1679 1680		if (htt_stats_buf->user_index < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {1681			len += scnprintf(buf + len, buf_len - len,1682					 "ax_mu_ofdma_mpdus_queued_usr_%u = %u\n",1683					 htt_stats_buf->user_index,1684					 htt_stats_buf->mpdus_queued_usr);1685			len += scnprintf(buf + len, buf_len - len,1686					 "ax_mu_ofdma_mpdus_tried_usr_%u = %u\n",1687					 htt_stats_buf->user_index,1688					 htt_stats_buf->mpdus_tried_usr);1689			len += scnprintf(buf + len, buf_len - len,1690					 "ax_mu_ofdma_mpdus_failed_usr_%u = %u\n",1691					 htt_stats_buf->user_index,1692					 htt_stats_buf->mpdus_failed_usr);1693			len += scnprintf(buf + len, buf_len - len,1694					 "ax_mu_ofdma_mpdus_requeued_usr_%u = %u\n",1695					 htt_stats_buf->user_index,1696					 htt_stats_buf->mpdus_requeued_usr);1697			len += scnprintf(buf + len, buf_len - len,1698					 "ax_mu_ofdma_err_no_ba_usr_%u = %u\n",1699					 htt_stats_buf->user_index,1700					 htt_stats_buf->err_no_ba_usr);1701			len += scnprintf(buf + len, buf_len - len,1702					 "ax_mu_ofdma_mpdu_underrun_usr_%u = %u\n",1703					 htt_stats_buf->user_index,1704					 htt_stats_buf->mpdu_underrun_usr);1705			len += scnprintf(buf + len, buf_len - len,1706					 "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n\n",1707					 htt_stats_buf->user_index,1708					 htt_stats_buf->ampdu_underrun_usr);1709		}1710	}1711 1712	if (len >= buf_len)1713		buf[buf_len - 1] = 0;1714	else1715		buf[len] = 0;1716 1717	stats_req->buf_len = len;1718}1719 1720static inline void1721htt_print_sched_txq_cmd_posted_tlv_v(const void *tag_buf,1722				     u16 tag_len,1723				     struct debug_htt_stats_req *stats_req)1724{1725	const struct htt_sched_txq_cmd_posted_tlv_v *htt_stats_buf = tag_buf;1726	u8 *buf = stats_req->buf;1727	u32 len = stats_req->buf_len;1728	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1729	u16 num_elements = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_SCHED_TX_MODE_MAX);1730 1731	len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_POSTED_TLV_V:\n");1732 1733	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_cmd_posted,1734			   "sched_cmd_posted", num_elements, "\n\n");1735 1736	if (len >= buf_len)1737		buf[buf_len - 1] = 0;1738	else1739		buf[len] = 0;1740 1741	stats_req->buf_len = len;1742}1743 1744static inline void1745htt_print_sched_txq_cmd_reaped_tlv_v(const void *tag_buf,1746				     u16 tag_len,1747				     struct debug_htt_stats_req *stats_req)1748{1749	const struct htt_sched_txq_cmd_reaped_tlv_v *htt_stats_buf = tag_buf;1750	u8 *buf = stats_req->buf;1751	u32 len = stats_req->buf_len;1752	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1753	u16 num_elements = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_SCHED_TX_MODE_MAX);1754 1755	len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_REAPED_TLV_V:\n");1756 1757	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_cmd_reaped,1758			   "sched_cmd_reaped", num_elements, "\n\n");1759 1760	if (len >= buf_len)1761		buf[buf_len - 1] = 0;1762	else1763		buf[len] = 0;1764 1765	stats_req->buf_len = len;1766}1767 1768static inline void1769htt_print_sched_txq_sched_order_su_tlv_v(const void *tag_buf,1770					 u16 tag_len,1771					 struct debug_htt_stats_req *stats_req)1772{1773	const struct htt_sched_txq_sched_order_su_tlv_v *htt_stats_buf = tag_buf;1774	u8 *buf = stats_req->buf;1775	u32 len = stats_req->buf_len;1776	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1777	/* each entry is u32, i.e. 4 bytes */1778	u32 sched_order_su_num_entries =1779		min_t(u32, (tag_len >> 2), HTT_TX_PDEV_NUM_SCHED_ORDER_LOG);1780 1781	len += scnprintf(buf + len, buf_len - len,1782			 "HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV_V:\n");1783 1784	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_order_su, "sched_order_su",1785			   sched_order_su_num_entries, "\n\n");1786 1787	if (len >= buf_len)1788		buf[buf_len - 1] = 0;1789	else1790		buf[len] = 0;1791 1792	stats_req->buf_len = len;1793}1794 1795static inline void1796htt_print_sched_txq_sched_ineligibility_tlv_v(const void *tag_buf,1797					      u16 tag_len,1798					      struct debug_htt_stats_req *stats_req)1799{1800	const struct htt_sched_txq_sched_ineligibility_tlv_v *htt_stats_buf = tag_buf;1801	u8 *buf = stats_req->buf;1802	u32 len = stats_req->buf_len;1803	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1804	/* each entry is u32, i.e. 4 bytes */1805	u32 sched_ineligibility_num_entries = tag_len >> 2;1806 1807	len += scnprintf(buf + len, buf_len - len,1808			 "HTT_SCHED_TXQ_SCHED_INELIGIBILITY_V:\n");1809 1810	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_ineligibility,1811			   "sched_ineligibility", sched_ineligibility_num_entries,1812			   "\n\n");1813 1814	if (len >= buf_len)1815		buf[buf_len - 1] = 0;1816	else1817		buf[len] = 0;1818 1819	stats_req->buf_len = len;1820}1821 1822static inline void1823htt_print_tx_pdev_stats_sched_per_txq_tlv(const void *tag_buf,1824					  struct debug_htt_stats_req *stats_req)1825{1826	const struct htt_tx_pdev_stats_sched_per_txq_tlv *htt_stats_buf = tag_buf;1827	u8 *buf = stats_req->buf;1828	u32 len = stats_req->buf_len;1829	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1830 1831	len += scnprintf(buf + len, buf_len - len,1832			 "HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:\n");1833	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",1834			 FIELD_GET(HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID,1835				   htt_stats_buf->mac_id__txq_id__word));1836	len += scnprintf(buf + len, buf_len - len, "txq_id = %lu\n",1837			 FIELD_GET(HTT_TX_PDEV_STATS_SCHED_PER_TXQ_ID,1838				   htt_stats_buf->mac_id__txq_id__word));1839	len += scnprintf(buf + len, buf_len - len, "sched_policy = %u\n",1840			 htt_stats_buf->sched_policy);1841	len += scnprintf(buf + len, buf_len - len,1842			 "last_sched_cmd_posted_timestamp = %u\n",1843			 htt_stats_buf->last_sched_cmd_posted_timestamp);1844	len += scnprintf(buf + len, buf_len - len,1845			 "last_sched_cmd_compl_timestamp = %u\n",1846			 htt_stats_buf->last_sched_cmd_compl_timestamp);1847	len += scnprintf(buf + len, buf_len - len, "sched_2_tac_lwm_count = %u\n",1848			 htt_stats_buf->sched_2_tac_lwm_count);1849	len += scnprintf(buf + len, buf_len - len, "sched_2_tac_ring_full = %u\n",1850			 htt_stats_buf->sched_2_tac_ring_full);1851	len += scnprintf(buf + len, buf_len - len, "sched_cmd_post_failure = %u\n",1852			 htt_stats_buf->sched_cmd_post_failure);1853	len += scnprintf(buf + len, buf_len - len, "num_active_tids = %u\n",1854			 htt_stats_buf->num_active_tids);1855	len += scnprintf(buf + len, buf_len - len, "num_ps_schedules = %u\n",1856			 htt_stats_buf->num_ps_schedules);1857	len += scnprintf(buf + len, buf_len - len, "sched_cmds_pending = %u\n",1858			 htt_stats_buf->sched_cmds_pending);1859	len += scnprintf(buf + len, buf_len - len, "num_tid_register = %u\n",1860			 htt_stats_buf->num_tid_register);1861	len += scnprintf(buf + len, buf_len - len, "num_tid_unregister = %u\n",1862			 htt_stats_buf->num_tid_unregister);1863	len += scnprintf(buf + len, buf_len - len, "num_qstats_queried = %u\n",1864			 htt_stats_buf->num_qstats_queried);1865	len += scnprintf(buf + len, buf_len - len, "qstats_update_pending = %u\n",1866			 htt_stats_buf->qstats_update_pending);1867	len += scnprintf(buf + len, buf_len - len, "last_qstats_query_timestamp = %u\n",1868			 htt_stats_buf->last_qstats_query_timestamp);1869	len += scnprintf(buf + len, buf_len - len, "num_tqm_cmdq_full = %u\n",1870			 htt_stats_buf->num_tqm_cmdq_full);1871	len += scnprintf(buf + len, buf_len - len, "num_de_sched_algo_trigger = %u\n",1872			 htt_stats_buf->num_de_sched_algo_trigger);1873	len += scnprintf(buf + len, buf_len - len, "num_rt_sched_algo_trigger = %u\n",1874			 htt_stats_buf->num_rt_sched_algo_trigger);1875	len += scnprintf(buf + len, buf_len - len, "num_tqm_sched_algo_trigger = %u\n",1876			 htt_stats_buf->num_tqm_sched_algo_trigger);1877	len += scnprintf(buf + len, buf_len - len, "notify_sched = %u\n\n",1878			 htt_stats_buf->notify_sched);1879	len += scnprintf(buf + len, buf_len - len, "dur_based_sendn_term = %u\n\n",1880			 htt_stats_buf->dur_based_sendn_term);1881 1882	if (len >= buf_len)1883		buf[buf_len - 1] = 0;1884	else1885		buf[len] = 0;1886 1887	stats_req->buf_len = len;1888}1889 1890static inline void htt_print_stats_tx_sched_cmn_tlv(const void *tag_buf,1891						    struct debug_htt_stats_req *stats_req)1892{1893	const struct htt_stats_tx_sched_cmn_tlv *htt_stats_buf = tag_buf;1894	u8 *buf = stats_req->buf;1895	u32 len = stats_req->buf_len;1896	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1897 1898	len += scnprintf(buf + len, buf_len - len, "HTT_STATS_TX_SCHED_CMN_TLV:\n");1899	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",1900			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));1901	len += scnprintf(buf + len, buf_len - len, "current_timestamp = %u\n\n",1902			 htt_stats_buf->current_timestamp);1903 1904	if (len >= buf_len)1905		buf[buf_len - 1] = 0;1906	else1907		buf[len] = 0;1908 1909	stats_req->buf_len = len;1910}1911 1912static inline void1913htt_print_tx_tqm_gen_mpdu_stats_tlv_v(const void *tag_buf,1914				      u16 tag_len,1915				      struct debug_htt_stats_req *stats_req)1916{1917	const struct htt_tx_tqm_gen_mpdu_stats_tlv_v *htt_stats_buf = tag_buf;1918	u8 *buf = stats_req->buf;1919	u32 len = stats_req->buf_len;1920	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1921	u16 num_elements = min_t(u16, (tag_len >> 2),1922				 HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);1923 1924	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:\n");1925 1926	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->gen_mpdu_end_reason,1927			   "gen_mpdu_end_reason", num_elements, "\n\n");1928 1929	if (len >= buf_len)1930		buf[buf_len - 1] = 0;1931	else1932		buf[len] = 0;1933 1934	stats_req->buf_len = len;1935}1936 1937static inline void1938htt_print_tx_tqm_list_mpdu_stats_tlv_v(const void *tag_buf,1939				       u16 tag_len,1940				       struct debug_htt_stats_req *stats_req)1941{1942	const struct htt_tx_tqm_list_mpdu_stats_tlv_v *htt_stats_buf = tag_buf;1943	u8 *buf = stats_req->buf;1944	u32 len = stats_req->buf_len;1945	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1946	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);1947 1948	len += scnprintf(buf + len, buf_len - len,1949			 "HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:\n");1950 1951	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->list_mpdu_end_reason,1952			   "list_mpdu_end_reason", num_elems, "\n\n");1953 1954	if (len >= buf_len)1955		buf[buf_len - 1] = 0;1956	else1957		buf[len] = 0;1958 1959	stats_req->buf_len = len;1960}1961 1962static inline void1963htt_print_tx_tqm_list_mpdu_cnt_tlv_v(const void *tag_buf,1964				     u16 tag_len,1965				     struct debug_htt_stats_req *stats_req)1966{1967	const struct htt_tx_tqm_list_mpdu_cnt_tlv_v *htt_stats_buf = tag_buf;1968	u8 *buf = stats_req->buf;1969	u32 len = stats_req->buf_len;1970	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1971	u16 num_elems = min_t(u16, (tag_len >> 2),1972			      HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);1973 1974	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:\n");1975 1976	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->list_mpdu_cnt_hist,1977			   "list_mpdu_cnt_hist", num_elems, "\n\n");1978 1979	if (len >= buf_len)1980		buf[buf_len - 1] = 0;1981	else1982		buf[len] = 0;1983 1984	stats_req->buf_len = len;1985}1986 1987static inline void1988htt_print_tx_tqm_pdev_stats_tlv_v(const void *tag_buf,1989				  struct debug_htt_stats_req *stats_req)1990{1991	const struct htt_tx_tqm_pdev_stats_tlv_v *htt_stats_buf = tag_buf;1992	u8 *buf = stats_req->buf;1993	u32 len = stats_req->buf_len;1994	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;1995 1996	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_PDEV_STATS_TLV_V:\n");1997	len += scnprintf(buf + len, buf_len - len, "msdu_count = %u\n",1998			 htt_stats_buf->msdu_count);1999	len += scnprintf(buf + len, buf_len - len, "mpdu_count = %u\n",2000			 htt_stats_buf->mpdu_count);2001	len += scnprintf(buf + len, buf_len - len, "remove_msdu = %u\n",2002			 htt_stats_buf->remove_msdu);2003	len += scnprintf(buf + len, buf_len - len, "remove_mpdu = %u\n",2004			 htt_stats_buf->remove_mpdu);2005	len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl = %u\n",2006			 htt_stats_buf->remove_msdu_ttl);2007	len += scnprintf(buf + len, buf_len - len, "send_bar = %u\n",2008			 htt_stats_buf->send_bar);2009	len += scnprintf(buf + len, buf_len - len, "bar_sync = %u\n",2010			 htt_stats_buf->bar_sync);2011	len += scnprintf(buf + len, buf_len - len, "notify_mpdu = %u\n",2012			 htt_stats_buf->notify_mpdu);2013	len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",2014			 htt_stats_buf->sync_cmd);2015	len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",2016			 htt_stats_buf->write_cmd);2017	len += scnprintf(buf + len, buf_len - len, "hwsch_trigger = %u\n",2018			 htt_stats_buf->hwsch_trigger);2019	len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",2020			 htt_stats_buf->ack_tlv_proc);2021	len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",2022			 htt_stats_buf->gen_mpdu_cmd);2023	len += scnprintf(buf + len, buf_len - len, "gen_list_cmd = %u\n",2024			 htt_stats_buf->gen_list_cmd);2025	len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",2026			 htt_stats_buf->remove_mpdu_cmd);2027	len += scnprintf(buf + len, buf_len - len, "remove_mpdu_tried_cmd = %u\n",2028			 htt_stats_buf->remove_mpdu_tried_cmd);2029	len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",2030			 htt_stats_buf->mpdu_queue_stats_cmd);2031	len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",2032			 htt_stats_buf->mpdu_head_info_cmd);2033	len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",2034			 htt_stats_buf->msdu_flow_stats_cmd);2035	len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",2036			 htt_stats_buf->remove_msdu_cmd);2037	len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl_cmd = %u\n",2038			 htt_stats_buf->remove_msdu_ttl_cmd);2039	len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",2040			 htt_stats_buf->flush_cache_cmd);2041	len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",2042			 htt_stats_buf->update_mpduq_cmd);2043	len += scnprintf(buf + len, buf_len - len, "enqueue = %u\n",2044			 htt_stats_buf->enqueue);2045	len += scnprintf(buf + len, buf_len - len, "enqueue_notify = %u\n",2046			 htt_stats_buf->enqueue_notify);2047	len += scnprintf(buf + len, buf_len - len, "notify_mpdu_at_head = %u\n",2048			 htt_stats_buf->notify_mpdu_at_head);2049	len += scnprintf(buf + len, buf_len - len, "notify_mpdu_state_valid = %u\n",2050			 htt_stats_buf->notify_mpdu_state_valid);2051	len += scnprintf(buf + len, buf_len - len, "sched_udp_notify1 = %u\n",2052			 htt_stats_buf->sched_udp_notify1);2053	len += scnprintf(buf + len, buf_len - len, "sched_udp_notify2 = %u\n",2054			 htt_stats_buf->sched_udp_notify2);2055	len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify1 = %u\n",2056			 htt_stats_buf->sched_nonudp_notify1);2057	len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify2 = %u\n\n",2058			 htt_stats_buf->sched_nonudp_notify2);2059 2060	if (len >= buf_len)2061		buf[buf_len - 1] = 0;2062	else2063		buf[len] = 0;2064 2065	stats_req->buf_len = len;2066}2067 2068static inline void htt_print_tx_tqm_cmn_stats_tlv(const void *tag_buf,2069						  struct debug_htt_stats_req *stats_req)2070{2071	const struct htt_tx_tqm_cmn_stats_tlv *htt_stats_buf = tag_buf;2072	u8 *buf = stats_req->buf;2073	u32 len = stats_req->buf_len;2074	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2075 2076	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMN_STATS_TLV:\n");2077	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2078			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2079	len += scnprintf(buf + len, buf_len - len, "max_cmdq_id = %u\n",2080			 htt_stats_buf->max_cmdq_id);2081	len += scnprintf(buf + len, buf_len - len, "list_mpdu_cnt_hist_intvl = %u\n",2082			 htt_stats_buf->list_mpdu_cnt_hist_intvl);2083	len += scnprintf(buf + len, buf_len - len, "add_msdu = %u\n",2084			 htt_stats_buf->add_msdu);2085	len += scnprintf(buf + len, buf_len - len, "q_empty = %u\n",2086			 htt_stats_buf->q_empty);2087	len += scnprintf(buf + len, buf_len - len, "q_not_empty = %u\n",2088			 htt_stats_buf->q_not_empty);2089	len += scnprintf(buf + len, buf_len - len, "drop_notification = %u\n",2090			 htt_stats_buf->drop_notification);2091	len += scnprintf(buf + len, buf_len - len, "desc_threshold = %u\n\n",2092			 htt_stats_buf->desc_threshold);2093 2094	if (len >= buf_len)2095		buf[buf_len - 1] = 0;2096	else2097		buf[len] = 0;2098 2099	stats_req->buf_len = len;2100}2101 2102static inline void htt_print_tx_tqm_error_stats_tlv(const void *tag_buf,2103						    struct debug_htt_stats_req *stats_req)2104{2105	const struct htt_tx_tqm_error_stats_tlv *htt_stats_buf = tag_buf;2106	u8 *buf = stats_req->buf;2107	u32 len = stats_req->buf_len;2108	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2109 2110	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_ERROR_STATS_TLV:\n");2111	len += scnprintf(buf + len, buf_len - len, "q_empty_failure = %u\n",2112			 htt_stats_buf->q_empty_failure);2113	len += scnprintf(buf + len, buf_len - len, "q_not_empty_failure = %u\n",2114			 htt_stats_buf->q_not_empty_failure);2115	len += scnprintf(buf + len, buf_len - len, "add_msdu_failure = %u\n\n",2116			 htt_stats_buf->add_msdu_failure);2117 2118	if (len >= buf_len)2119		buf[buf_len - 1] = 0;2120	else2121		buf[len] = 0;2122 2123	stats_req->buf_len = len;2124}2125 2126static inline void htt_print_tx_tqm_cmdq_status_tlv(const void *tag_buf,2127						    struct debug_htt_stats_req *stats_req)2128{2129	const struct htt_tx_tqm_cmdq_status_tlv *htt_stats_buf = tag_buf;2130	u8 *buf = stats_req->buf;2131	u32 len = stats_req->buf_len;2132	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2133 2134	len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMDQ_STATUS_TLV:\n");2135	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2136			 FIELD_GET(HTT_TX_TQM_CMDQ_STATUS_MAC_ID,2137				   htt_stats_buf->mac_id__cmdq_id__word));2138	len += scnprintf(buf + len, buf_len - len, "cmdq_id = %lu\n\n",2139			 FIELD_GET(HTT_TX_TQM_CMDQ_STATUS_CMDQ_ID,2140				   htt_stats_buf->mac_id__cmdq_id__word));2141	len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",2142			 htt_stats_buf->sync_cmd);2143	len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",2144			 htt_stats_buf->write_cmd);2145	len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",2146			 htt_stats_buf->gen_mpdu_cmd);2147	len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",2148			 htt_stats_buf->mpdu_queue_stats_cmd);2149	len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",2150			 htt_stats_buf->mpdu_head_info_cmd);2151	len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",2152			 htt_stats_buf->msdu_flow_stats_cmd);2153	len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",2154			 htt_stats_buf->remove_mpdu_cmd);2155	len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",2156			 htt_stats_buf->remove_msdu_cmd);2157	len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",2158			 htt_stats_buf->flush_cache_cmd);2159	len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",2160			 htt_stats_buf->update_mpduq_cmd);2161	len += scnprintf(buf + len, buf_len - len, "update_msduq_cmd = %u\n\n",2162			 htt_stats_buf->update_msduq_cmd);2163 2164	if (len >= buf_len)2165		buf[buf_len - 1] = 0;2166	else2167		buf[len] = 0;2168 2169	stats_req->buf_len = len;2170}2171 2172static inline void2173htt_print_tx_de_eapol_packets_stats_tlv(const void *tag_buf,2174					struct debug_htt_stats_req *stats_req)2175{2176	const struct htt_tx_de_eapol_packets_stats_tlv *htt_stats_buf = tag_buf;2177	u8 *buf = stats_req->buf;2178	u32 len = stats_req->buf_len;2179	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2180 2181	len += scnprintf(buf + len, buf_len - len,2182			   "HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:\n");2183	len += scnprintf(buf + len, buf_len - len, "m1_packets = %u\n",2184			 htt_stats_buf->m1_packets);2185	len += scnprintf(buf + len, buf_len - len, "m2_packets = %u\n",2186			 htt_stats_buf->m2_packets);2187	len += scnprintf(buf + len, buf_len - len, "m3_packets = %u\n",2188			 htt_stats_buf->m3_packets);2189	len += scnprintf(buf + len, buf_len - len, "m4_packets = %u\n",2190			 htt_stats_buf->m4_packets);2191	len += scnprintf(buf + len, buf_len - len, "g1_packets = %u\n",2192			 htt_stats_buf->g1_packets);2193	len += scnprintf(buf + len, buf_len - len, "g2_packets = %u\n\n",2194			 htt_stats_buf->g2_packets);2195 2196	if (len >= buf_len)2197		buf[buf_len - 1] = 0;2198	else2199		buf[len] = 0;2200 2201	stats_req->buf_len = len;2202}2203 2204static inline void2205htt_print_tx_de_classify_failed_stats_tlv(const void *tag_buf,2206					  struct debug_htt_stats_req *stats_req)2207{2208	const struct htt_tx_de_classify_failed_stats_tlv *htt_stats_buf = tag_buf;2209	u8 *buf = stats_req->buf;2210	u32 len = stats_req->buf_len;2211	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2212 2213	len += scnprintf(buf + len, buf_len - len,2214			   "HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:\n");2215	len += scnprintf(buf + len, buf_len - len, "ap_bss_peer_not_found = %u\n",2216			 htt_stats_buf->ap_bss_peer_not_found);2217	len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_no_peer = %u\n",2218			 htt_stats_buf->ap_bcast_mcast_no_peer);2219	len += scnprintf(buf + len, buf_len - len, "sta_delete_in_progress = %u\n",2220			 htt_stats_buf->sta_delete_in_progress);2221	len += scnprintf(buf + len, buf_len - len, "ibss_no_bss_peer = %u\n",2222			 htt_stats_buf->ibss_no_bss_peer);2223	len += scnprintf(buf + len, buf_len - len, "invalid_vdev_type = %u\n",2224			 htt_stats_buf->invalid_vdev_type);2225	len += scnprintf(buf + len, buf_len - len, "invalid_ast_peer_entry = %u\n",2226			 htt_stats_buf->invalid_ast_peer_entry);2227	len += scnprintf(buf + len, buf_len - len, "peer_entry_invalid = %u\n",2228			 htt_stats_buf->peer_entry_invalid);2229	len += scnprintf(buf + len, buf_len - len, "ethertype_not_ip = %u\n",2230			 htt_stats_buf->ethertype_not_ip);2231	len += scnprintf(buf + len, buf_len - len, "eapol_lookup_failed = %u\n",2232			 htt_stats_buf->eapol_lookup_failed);2233	len += scnprintf(buf + len, buf_len - len, "qpeer_not_allow_data = %u\n",2234			 htt_stats_buf->qpeer_not_allow_data);2235	len += scnprintf(buf + len, buf_len - len, "fse_tid_override = %u\n",2236			 htt_stats_buf->fse_tid_override);2237	len += scnprintf(buf + len, buf_len - len, "ipv6_jumbogram_zero_length = %u\n",2238			 htt_stats_buf->ipv6_jumbogram_zero_length);2239	len += scnprintf(buf + len, buf_len - len, "qos_to_non_qos_in_prog = %u\n\n",2240			 htt_stats_buf->qos_to_non_qos_in_prog);2241 2242	if (len >= buf_len)2243		buf[buf_len - 1] = 0;2244	else2245		buf[len] = 0;2246 2247	stats_req->buf_len = len;2248}2249 2250static inline void2251htt_print_tx_de_classify_stats_tlv(const void *tag_buf,2252				   struct debug_htt_stats_req *stats_req)2253{2254	const struct htt_tx_de_classify_stats_tlv *htt_stats_buf = tag_buf;2255	u8 *buf = stats_req->buf;2256	u32 len = stats_req->buf_len;2257	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2258 2259	len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CLASSIFY_STATS_TLV:\n");2260	len += scnprintf(buf + len, buf_len - len, "arp_packets = %u\n",2261			 htt_stats_buf->arp_packets);2262	len += scnprintf(buf + len, buf_len - len, "igmp_packets = %u\n",2263			 htt_stats_buf->igmp_packets);2264	len += scnprintf(buf + len, buf_len - len, "dhcp_packets = %u\n",2265			 htt_stats_buf->dhcp_packets);2266	len += scnprintf(buf + len, buf_len - len, "host_inspected = %u\n",2267			 htt_stats_buf->host_inspected);2268	len += scnprintf(buf + len, buf_len - len, "htt_included = %u\n",2269			 htt_stats_buf->htt_included);2270	len += scnprintf(buf + len, buf_len - len, "htt_valid_mcs = %u\n",2271			 htt_stats_buf->htt_valid_mcs);2272	len += scnprintf(buf + len, buf_len - len, "htt_valid_nss = %u\n",2273			 htt_stats_buf->htt_valid_nss);2274	len += scnprintf(buf + len, buf_len - len, "htt_valid_preamble_type = %u\n",2275			 htt_stats_buf->htt_valid_preamble_type);2276	len += scnprintf(buf + len, buf_len - len, "htt_valid_chainmask = %u\n",2277			 htt_stats_buf->htt_valid_chainmask);2278	len += scnprintf(buf + len, buf_len - len, "htt_valid_guard_interval = %u\n",2279			 htt_stats_buf->htt_valid_guard_interval);2280	len += scnprintf(buf + len, buf_len - len, "htt_valid_retries = %u\n",2281			 htt_stats_buf->htt_valid_retries);2282	len += scnprintf(buf + len, buf_len - len, "htt_valid_bw_info = %u\n",2283			 htt_stats_buf->htt_valid_bw_info);2284	len += scnprintf(buf + len, buf_len - len, "htt_valid_power = %u\n",2285			 htt_stats_buf->htt_valid_power);2286	len += scnprintf(buf + len, buf_len - len, "htt_valid_key_flags = 0x%x\n",2287			 htt_stats_buf->htt_valid_key_flags);2288	len += scnprintf(buf + len, buf_len - len, "htt_valid_no_encryption = %u\n",2289			 htt_stats_buf->htt_valid_no_encryption);2290	len += scnprintf(buf + len, buf_len - len, "fse_entry_count = %u\n",2291			 htt_stats_buf->fse_entry_count);2292	len += scnprintf(buf + len, buf_len - len, "fse_priority_be = %u\n",2293			 htt_stats_buf->fse_priority_be);2294	len += scnprintf(buf + len, buf_len - len, "fse_priority_high = %u\n",2295			 htt_stats_buf->fse_priority_high);2296	len += scnprintf(buf + len, buf_len - len, "fse_priority_low = %u\n",2297			 htt_stats_buf->fse_priority_low);2298	len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_be = %u\n",2299			 htt_stats_buf->fse_traffic_ptrn_be);2300	len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_over_sub = %u\n",2301			 htt_stats_buf->fse_traffic_ptrn_over_sub);2302	len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_bursty = %u\n",2303			 htt_stats_buf->fse_traffic_ptrn_bursty);2304	len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_interactive = %u\n",2305			 htt_stats_buf->fse_traffic_ptrn_interactive);2306	len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_periodic = %u\n",2307			 htt_stats_buf->fse_traffic_ptrn_periodic);2308	len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_alloc = %u\n",2309			 htt_stats_buf->fse_hwqueue_alloc);2310	len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_created = %u\n",2311			 htt_stats_buf->fse_hwqueue_created);2312	len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_send_to_host = %u\n",2313			 htt_stats_buf->fse_hwqueue_send_to_host);2314	len += scnprintf(buf + len, buf_len - len, "mcast_entry = %u\n",2315			 htt_stats_buf->mcast_entry);2316	len += scnprintf(buf + len, buf_len - len, "bcast_entry = %u\n",2317			 htt_stats_buf->bcast_entry);2318	len += scnprintf(buf + len, buf_len - len, "htt_update_peer_cache = %u\n",2319			 htt_stats_buf->htt_update_peer_cache);2320	len += scnprintf(buf + len, buf_len - len, "htt_learning_frame = %u\n",2321			 htt_stats_buf->htt_learning_frame);2322	len += scnprintf(buf + len, buf_len - len, "fse_invalid_peer = %u\n",2323			 htt_stats_buf->fse_invalid_peer);2324	len += scnprintf(buf + len, buf_len - len, "mec_notify = %u\n\n",2325			 htt_stats_buf->mec_notify);2326 2327	if (len >= buf_len)2328		buf[buf_len - 1] = 0;2329	else2330		buf[len] = 0;2331 2332	stats_req->buf_len = len;2333}2334 2335static inline void2336htt_print_tx_de_classify_status_stats_tlv(const void *tag_buf,2337					  struct debug_htt_stats_req *stats_req)2338{2339	const struct htt_tx_de_classify_status_stats_tlv *htt_stats_buf = tag_buf;2340	u8 *buf = stats_req->buf;2341	u32 len = stats_req->buf_len;2342	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2343 2344	len += scnprintf(buf + len, buf_len - len,2345			   "HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:\n");2346	len += scnprintf(buf + len, buf_len - len, "eok = %u\n",2347			 htt_stats_buf->eok);2348	len += scnprintf(buf + len, buf_len - len, "classify_done = %u\n",2349			 htt_stats_buf->classify_done);2350	len += scnprintf(buf + len, buf_len - len, "lookup_failed = %u\n",2351			 htt_stats_buf->lookup_failed);2352	len += scnprintf(buf + len, buf_len - len, "send_host_dhcp = %u\n",2353			 htt_stats_buf->send_host_dhcp);2354	len += scnprintf(buf + len, buf_len - len, "send_host_mcast = %u\n",2355			 htt_stats_buf->send_host_mcast);2356	len += scnprintf(buf + len, buf_len - len, "send_host_unknown_dest = %u\n",2357			 htt_stats_buf->send_host_unknown_dest);2358	len += scnprintf(buf + len, buf_len - len, "send_host = %u\n",2359			 htt_stats_buf->send_host);2360	len += scnprintf(buf + len, buf_len - len, "status_invalid = %u\n\n",2361			 htt_stats_buf->status_invalid);2362 2363	if (len >= buf_len)2364		buf[buf_len - 1] = 0;2365	else2366		buf[len] = 0;2367 2368	stats_req->buf_len = len;2369}2370 2371static inline void2372htt_print_tx_de_enqueue_packets_stats_tlv(const void *tag_buf,2373					  struct debug_htt_stats_req *stats_req)2374{2375	const struct htt_tx_de_enqueue_packets_stats_tlv *htt_stats_buf = tag_buf;2376	u8 *buf = stats_req->buf;2377	u32 len = stats_req->buf_len;2378	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2379 2380	len += scnprintf(buf + len, buf_len - len,2381			 "HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:\n");2382	len += scnprintf(buf + len, buf_len - len, "enqueued_pkts = %u\n",2383			 htt_stats_buf->enqueued_pkts);2384	len += scnprintf(buf + len, buf_len - len, "to_tqm = %u\n",2385			 htt_stats_buf->to_tqm);2386	len += scnprintf(buf + len, buf_len - len, "to_tqm_bypass = %u\n\n",2387			 htt_stats_buf->to_tqm_bypass);2388 2389	if (len >= buf_len)2390		buf[buf_len - 1] = 0;2391	else2392		buf[len] = 0;2393 2394	stats_req->buf_len = len;2395}2396 2397static inline void2398htt_print_tx_de_enqueue_discard_stats_tlv(const void *tag_buf,2399					  struct debug_htt_stats_req *stats_req)2400{2401	const struct htt_tx_de_enqueue_discard_stats_tlv *htt_stats_buf = tag_buf;2402	u8 *buf = stats_req->buf;2403	u32 len = stats_req->buf_len;2404	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2405 2406	len += scnprintf(buf + len, buf_len - len,2407			 "HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:\n");2408	len += scnprintf(buf + len, buf_len - len, "discarded_pkts = %u\n",2409			 htt_stats_buf->discarded_pkts);2410	len += scnprintf(buf + len, buf_len - len, "local_frames = %u\n",2411			 htt_stats_buf->local_frames);2412	len += scnprintf(buf + len, buf_len - len, "is_ext_msdu = %u\n\n",2413			 htt_stats_buf->is_ext_msdu);2414 2415	if (len >= buf_len)2416		buf[buf_len - 1] = 0;2417	else2418		buf[len] = 0;2419 2420	stats_req->buf_len = len;2421}2422 2423static inline void htt_print_tx_de_compl_stats_tlv(const void *tag_buf,2424						   struct debug_htt_stats_req *stats_req)2425{2426	const struct htt_tx_de_compl_stats_tlv *htt_stats_buf = tag_buf;2427	u8 *buf = stats_req->buf;2428	u32 len = stats_req->buf_len;2429	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2430 2431	len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_COMPL_STATS_TLV:\n");2432	len += scnprintf(buf + len, buf_len - len, "tcl_dummy_frame = %u\n",2433			 htt_stats_buf->tcl_dummy_frame);2434	len += scnprintf(buf + len, buf_len - len, "tqm_dummy_frame = %u\n",2435			 htt_stats_buf->tqm_dummy_frame);2436	len += scnprintf(buf + len, buf_len - len, "tqm_notify_frame = %u\n",2437			 htt_stats_buf->tqm_notify_frame);2438	len += scnprintf(buf + len, buf_len - len, "fw2wbm_enq = %u\n",2439			 htt_stats_buf->fw2wbm_enq);2440	len += scnprintf(buf + len, buf_len - len, "tqm_bypass_frame = %u\n\n",2441			 htt_stats_buf->tqm_bypass_frame);2442 2443	if (len >= buf_len)2444		buf[buf_len - 1] = 0;2445	else2446		buf[len] = 0;2447 2448	stats_req->buf_len = len;2449}2450 2451static inline void2452htt_print_tx_de_fw2wbm_ring_full_hist_tlv(const void *tag_buf,2453					  u16 tag_len,2454					  struct debug_htt_stats_req *stats_req)2455{2456	const struct htt_tx_de_fw2wbm_ring_full_hist_tlv *htt_stats_buf = tag_buf;2457	u8 *buf = stats_req->buf;2458	u32 len = stats_req->buf_len;2459	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2460	u16  num_elements = tag_len >> 2;2461 2462	len += scnprintf(buf + len, buf_len - len,2463			 "HTT_TX_DE_FW2WBM_RING_FULL_HIST_TLV");2464 2465	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw2wbm_ring_full_hist,2466			   "fw2wbm_ring_full_hist", num_elements, "\n\n");2467 2468	if (len >= buf_len)2469		buf[buf_len - 1] = 0;2470	else2471		buf[len] = 0;2472 2473	stats_req->buf_len = len;2474}2475 2476static inline void2477htt_print_tx_de_cmn_stats_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req)2478{2479	const struct htt_tx_de_cmn_stats_tlv *htt_stats_buf = tag_buf;2480	u8 *buf = stats_req->buf;2481	u32 len = stats_req->buf_len;2482	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2483 2484	len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CMN_STATS_TLV:\n");2485	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2486			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2487	len += scnprintf(buf + len, buf_len - len, "tcl2fw_entry_count = %u\n",2488			 htt_stats_buf->tcl2fw_entry_count);2489	len += scnprintf(buf + len, buf_len - len, "not_to_fw = %u\n",2490			 htt_stats_buf->not_to_fw);2491	len += scnprintf(buf + len, buf_len - len, "invalid_pdev_vdev_peer = %u\n",2492			 htt_stats_buf->invalid_pdev_vdev_peer);2493	len += scnprintf(buf + len, buf_len - len, "tcl_res_invalid_addrx = %u\n",2494			 htt_stats_buf->tcl_res_invalid_addrx);2495	len += scnprintf(buf + len, buf_len - len, "wbm2fw_entry_count = %u\n",2496			 htt_stats_buf->wbm2fw_entry_count);2497	len += scnprintf(buf + len, buf_len - len, "invalid_pdev = %u\n\n",2498			 htt_stats_buf->invalid_pdev);2499 2500	if (len >= buf_len)2501		buf[buf_len - 1] = 0;2502	else2503		buf[len] = 0;2504 2505	stats_req->buf_len = len;2506}2507 2508static inline void htt_print_ring_if_stats_tlv(const void *tag_buf,2509					       struct debug_htt_stats_req *stats_req)2510{2511	const struct htt_ring_if_stats_tlv *htt_stats_buf = tag_buf;2512	u8 *buf = stats_req->buf;2513	u32 len = stats_req->buf_len;2514	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2515 2516	len += scnprintf(buf + len, buf_len - len, "HTT_RING_IF_STATS_TLV:\n");2517	len += scnprintf(buf + len, buf_len - len, "base_addr = %u\n",2518			 htt_stats_buf->base_addr);2519	len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",2520			 htt_stats_buf->elem_size);2521	len += scnprintf(buf + len, buf_len - len, "num_elems = %lu\n",2522			 FIELD_GET(HTT_RING_IF_STATS_NUM_ELEMS,2523				   htt_stats_buf->num_elems__prefetch_tail_idx));2524	len += scnprintf(buf + len, buf_len - len, "prefetch_tail_idx = %lu\n",2525			 FIELD_GET(HTT_RING_IF_STATS_PREFETCH_TAIL_INDEX,2526				   htt_stats_buf->num_elems__prefetch_tail_idx));2527	len += scnprintf(buf + len, buf_len - len, "head_idx = %lu\n",2528			 FIELD_GET(HTT_RING_IF_STATS_HEAD_IDX,2529				   htt_stats_buf->head_idx__tail_idx));2530	len += scnprintf(buf + len, buf_len - len, "tail_idx = %lu\n",2531			 FIELD_GET(HTT_RING_IF_STATS_TAIL_IDX,2532				   htt_stats_buf->head_idx__tail_idx));2533	len += scnprintf(buf + len, buf_len - len, "shadow_head_idx = %lu\n",2534			 FIELD_GET(HTT_RING_IF_STATS_SHADOW_HEAD_IDX,2535				   htt_stats_buf->shadow_head_idx__shadow_tail_idx));2536	len += scnprintf(buf + len, buf_len - len, "shadow_tail_idx = %lu\n",2537			 FIELD_GET(HTT_RING_IF_STATS_SHADOW_TAIL_IDX,2538				   htt_stats_buf->shadow_head_idx__shadow_tail_idx));2539	len += scnprintf(buf + len, buf_len - len, "num_tail_incr = %u\n",2540			 htt_stats_buf->num_tail_incr);2541	len += scnprintf(buf + len, buf_len - len, "lwm_thresh = %lu\n",2542			 FIELD_GET(HTT_RING_IF_STATS_LWM_THRESH,2543				   htt_stats_buf->lwm_thresh__hwm_thresh));2544	len += scnprintf(buf + len, buf_len - len, "hwm_thresh = %lu\n",2545			 FIELD_GET(HTT_RING_IF_STATS_HWM_THRESH,2546				   htt_stats_buf->lwm_thresh__hwm_thresh));2547	len += scnprintf(buf + len, buf_len - len, "overrun_hit_count = %u\n",2548			 htt_stats_buf->overrun_hit_count);2549	len += scnprintf(buf + len, buf_len - len, "underrun_hit_count = %u\n",2550			 htt_stats_buf->underrun_hit_count);2551	len += scnprintf(buf + len, buf_len - len, "prod_blockwait_count = %u\n",2552			 htt_stats_buf->prod_blockwait_count);2553	len += scnprintf(buf + len, buf_len - len, "cons_blockwait_count = %u\n",2554			 htt_stats_buf->cons_blockwait_count);2555 2556	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->low_wm_hit_count,2557			   "low_wm_hit_count", HTT_STATS_LOW_WM_BINS, "\n");2558	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->high_wm_hit_count,2559			   "high_wm_hit_count", HTT_STATS_HIGH_WM_BINS, "\n\n");2560 2561	if (len >= buf_len)2562		buf[buf_len - 1] = 0;2563	else2564		buf[len] = 0;2565 2566	stats_req->buf_len = len;2567}2568 2569static inline void htt_print_ring_if_cmn_tlv(const void *tag_buf,2570					     struct debug_htt_stats_req *stats_req)2571{2572	const struct htt_ring_if_cmn_tlv *htt_stats_buf = tag_buf;2573	u8 *buf = stats_req->buf;2574	u32 len = stats_req->buf_len;2575	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2576 2577	len += scnprintf(buf + len, buf_len - len, "HTT_RING_IF_CMN_TLV:\n");2578	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2579			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2580	len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2581			 htt_stats_buf->num_records);2582 2583	if (len >= buf_len)2584		buf[buf_len - 1] = 0;2585	else2586		buf[len] = 0;2587 2588	stats_req->buf_len = len;2589}2590 2591static inline void htt_print_sfm_client_user_tlv_v(const void *tag_buf,2592						   u16 tag_len,2593						   struct debug_htt_stats_req *stats_req)2594{2595	const struct htt_sfm_client_user_tlv_v *htt_stats_buf = tag_buf;2596	u8 *buf = stats_req->buf;2597	u32 len = stats_req->buf_len;2598	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2599	u16 num_elems = tag_len >> 2;2600 2601	len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_USER_TLV_V:\n");2602 2603	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->dwords_used_by_user_n,2604			   "dwords_used_by_user_n", num_elems, "\n\n");2605 2606	if (len >= buf_len)2607		buf[buf_len - 1] = 0;2608	else2609		buf[len] = 0;2610 2611	stats_req->buf_len = len;2612}2613 2614static inline void htt_print_sfm_client_tlv(const void *tag_buf,2615					    struct debug_htt_stats_req *stats_req)2616{2617	const struct htt_sfm_client_tlv *htt_stats_buf = tag_buf;2618	u8 *buf = stats_req->buf;2619	u32 len = stats_req->buf_len;2620	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2621 2622	len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_TLV:\n");2623	len += scnprintf(buf + len, buf_len - len, "client_id = %u\n",2624			 htt_stats_buf->client_id);2625	len += scnprintf(buf + len, buf_len - len, "buf_min = %u\n",2626			 htt_stats_buf->buf_min);2627	len += scnprintf(buf + len, buf_len - len, "buf_max = %u\n",2628			 htt_stats_buf->buf_max);2629	len += scnprintf(buf + len, buf_len - len, "buf_busy = %u\n",2630			 htt_stats_buf->buf_busy);2631	len += scnprintf(buf + len, buf_len - len, "buf_alloc = %u\n",2632			 htt_stats_buf->buf_alloc);2633	len += scnprintf(buf + len, buf_len - len, "buf_avail = %u\n",2634			 htt_stats_buf->buf_avail);2635	len += scnprintf(buf + len, buf_len - len, "num_users = %u\n\n",2636			 htt_stats_buf->num_users);2637 2638	if (len >= buf_len)2639		buf[buf_len - 1] = 0;2640	else2641		buf[len] = 0;2642 2643	stats_req->buf_len = len;2644}2645 2646static inline void htt_print_sfm_cmn_tlv(const void *tag_buf,2647					 struct debug_htt_stats_req *stats_req)2648{2649	const struct htt_sfm_cmn_tlv *htt_stats_buf = tag_buf;2650	u8 *buf = stats_req->buf;2651	u32 len = stats_req->buf_len;2652	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2653 2654	len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CMN_TLV:\n");2655	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2656			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2657	len += scnprintf(buf + len, buf_len - len, "buf_total = %u\n",2658			 htt_stats_buf->buf_total);2659	len += scnprintf(buf + len, buf_len - len, "mem_empty = %u\n",2660			 htt_stats_buf->mem_empty);2661	len += scnprintf(buf + len, buf_len - len, "deallocate_bufs = %u\n",2662			 htt_stats_buf->deallocate_bufs);2663	len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2664			 htt_stats_buf->num_records);2665 2666	if (len >= buf_len)2667		buf[buf_len - 1] = 0;2668	else2669		buf[len] = 0;2670 2671	stats_req->buf_len = len;2672}2673 2674static inline void htt_print_sring_stats_tlv(const void *tag_buf,2675					     struct debug_htt_stats_req *stats_req)2676{2677	const struct htt_sring_stats_tlv *htt_stats_buf = tag_buf;2678	u8 *buf = stats_req->buf;2679	u32 len = stats_req->buf_len;2680	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2681 2682	len += scnprintf(buf + len, buf_len - len, "HTT_SRING_STATS_TLV:\n");2683	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2684			 FIELD_GET(HTT_SRING_STATS_MAC_ID,2685				   htt_stats_buf->mac_id__ring_id__arena__ep));2686	len += scnprintf(buf + len, buf_len - len, "ring_id = %lu\n",2687			 FIELD_GET(HTT_SRING_STATS_RING_ID,2688				   htt_stats_buf->mac_id__ring_id__arena__ep));2689	len += scnprintf(buf + len, buf_len - len, "arena = %lu\n",2690			 FIELD_GET(HTT_SRING_STATS_ARENA,2691				   htt_stats_buf->mac_id__ring_id__arena__ep));2692	len += scnprintf(buf + len, buf_len - len, "ep = %lu\n",2693			 FIELD_GET(HTT_SRING_STATS_EP,2694				   htt_stats_buf->mac_id__ring_id__arena__ep));2695	len += scnprintf(buf + len, buf_len - len, "base_addr_lsb = 0x%x\n",2696			 htt_stats_buf->base_addr_lsb);2697	len += scnprintf(buf + len, buf_len - len, "base_addr_msb = 0x%x\n",2698			 htt_stats_buf->base_addr_msb);2699	len += scnprintf(buf + len, buf_len - len, "ring_size = %u\n",2700			 htt_stats_buf->ring_size);2701	len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",2702			 htt_stats_buf->elem_size);2703	len += scnprintf(buf + len, buf_len - len, "num_avail_words = %lu\n",2704			 FIELD_GET(HTT_SRING_STATS_NUM_AVAIL_WORDS,2705				   htt_stats_buf->num_avail_words__num_valid_words));2706	len += scnprintf(buf + len, buf_len - len, "num_valid_words = %lu\n",2707			 FIELD_GET(HTT_SRING_STATS_NUM_VALID_WORDS,2708				   htt_stats_buf->num_avail_words__num_valid_words));2709	len += scnprintf(buf + len, buf_len - len, "head_ptr = %lu\n",2710			 FIELD_GET(HTT_SRING_STATS_HEAD_PTR,2711				   htt_stats_buf->head_ptr__tail_ptr));2712	len += scnprintf(buf + len, buf_len - len, "tail_ptr = %lu\n",2713			 FIELD_GET(HTT_SRING_STATS_TAIL_PTR,2714				   htt_stats_buf->head_ptr__tail_ptr));2715	len += scnprintf(buf + len, buf_len - len, "consumer_empty = %lu\n",2716			 FIELD_GET(HTT_SRING_STATS_CONSUMER_EMPTY,2717				   htt_stats_buf->consumer_empty__producer_full));2718	len += scnprintf(buf + len, buf_len - len, "producer_full = %lu\n",2719			 FIELD_GET(HTT_SRING_STATS_PRODUCER_FULL,2720				   htt_stats_buf->consumer_empty__producer_full));2721	len += scnprintf(buf + len, buf_len - len, "prefetch_count = %lu\n",2722			 FIELD_GET(HTT_SRING_STATS_PREFETCH_COUNT,2723				   htt_stats_buf->prefetch_count__internal_tail_ptr));2724	len += scnprintf(buf + len, buf_len - len, "internal_tail_ptr = %lu\n\n",2725			 FIELD_GET(HTT_SRING_STATS_INTERNAL_TAIL_PTR,2726				   htt_stats_buf->prefetch_count__internal_tail_ptr));2727 2728	if (len >= buf_len)2729		buf[buf_len - 1] = 0;2730	else2731		buf[len] = 0;2732 2733	stats_req->buf_len = len;2734}2735 2736static inline void htt_print_sring_cmn_tlv(const void *tag_buf,2737					   struct debug_htt_stats_req *stats_req)2738{2739	const struct htt_sring_cmn_tlv *htt_stats_buf = tag_buf;2740	u8 *buf = stats_req->buf;2741	u32 len = stats_req->buf_len;2742	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2743 2744	len += scnprintf(buf + len, buf_len - len, "HTT_SRING_CMN_TLV:\n");2745	len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",2746			 htt_stats_buf->num_records);2747 2748	if (len >= buf_len)2749		buf[buf_len - 1] = 0;2750	else2751		buf[len] = 0;2752 2753	stats_req->buf_len = len;2754}2755 2756static inline void htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf,2757						    struct debug_htt_stats_req *stats_req)2758{2759	const struct htt_tx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;2760	u8 *buf = stats_req->buf;2761	u32 len = stats_req->buf_len;2762	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2763	u8 j;2764 2765	len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_RATE_STATS_TLV:\n");2766	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2767			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2768	len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",2769			 htt_stats_buf->tx_ldpc);2770	len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_ldpc = %u\n",2771			 htt_stats_buf->ac_mu_mimo_tx_ldpc);2772	len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_ldpc = %u\n",2773			 htt_stats_buf->ax_mu_mimo_tx_ldpc);2774	len += scnprintf(buf + len, buf_len - len, "ofdma_tx_ldpc = %u\n",2775			 htt_stats_buf->ofdma_tx_ldpc);2776	len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",2777			 htt_stats_buf->rts_cnt);2778	len += scnprintf(buf + len, buf_len - len, "rts_success = %u\n",2779			 htt_stats_buf->rts_success);2780	len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",2781			 htt_stats_buf->ack_rssi);2782 2783	len += scnprintf(buf + len, buf_len - len,2784			 "Legacy CCK Rates: 1 Mbps: %u, 2 Mbps: %u, 5.5 Mbps: %u, 11 Mbps: %u\n",2785			 htt_stats_buf->tx_legacy_cck_rate[0],2786			 htt_stats_buf->tx_legacy_cck_rate[1],2787			 htt_stats_buf->tx_legacy_cck_rate[2],2788			 htt_stats_buf->tx_legacy_cck_rate[3]);2789 2790	len += scnprintf(buf + len, buf_len - len,2791			 "Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n"2792			 "                   24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n",2793			 htt_stats_buf->tx_legacy_ofdm_rate[0],2794			 htt_stats_buf->tx_legacy_ofdm_rate[1],2795			 htt_stats_buf->tx_legacy_ofdm_rate[2],2796			 htt_stats_buf->tx_legacy_ofdm_rate[3],2797			 htt_stats_buf->tx_legacy_ofdm_rate[4],2798			 htt_stats_buf->tx_legacy_ofdm_rate[5],2799			 htt_stats_buf->tx_legacy_ofdm_rate[6],2800			 htt_stats_buf->tx_legacy_ofdm_rate[7]);2801 2802	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mcs, "tx_mcs",2803			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2804	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_mcs,2805			   "ac_mu_mimo_tx_mcs", HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2806	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_mcs,2807			   "ax_mu_mimo_tx_mcs", HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2808	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_mcs, "ofdma_tx_mcs",2809			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2810	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_nss, "tx_nss",2811			   HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2812	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_nss,2813			   "ac_mu_mimo_tx_nss",2814			   HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2815	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_nss,2816			   "ax_mu_mimo_tx_nss",2817			   HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2818	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_nss, "ofdma_tx_nss",2819			   HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2820	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_bw, "tx_bw",2821			   HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2822	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_bw,2823			   "ac_mu_mimo_tx_bw", HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2824	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_bw,2825			   "ax_mu_mimo_tx_bw",2826			   HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2827	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_bw, "ofdma_tx_bw",2828			   HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2829	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_stbc, "tx_stbc",2830			   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2831	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_pream, "tx_pream",2832			   HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");2833 2834	len += scnprintf(buf + len, buf_len - len, "HE LTF: 1x: %u, 2x: %u, 4x: %u\n",2835			 htt_stats_buf->tx_he_ltf[1],2836			 htt_stats_buf->tx_he_ltf[2],2837			 htt_stats_buf->tx_he_ltf[3]);2838 2839	/* SU GI Stats */2840	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2841		len += scnprintf(buf + len, (buf_len - len),2842				 "tx_gi[%u] = ", j);2843		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_gi[j], NULL,2844				   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2845	}2846 2847	/* AC MU-MIMO GI Stats */2848	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2849		len += scnprintf(buf + len, (buf_len - len),2850				 "ac_mu_mimo_tx_gi[%u] = ", j);2851		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_gi[j],2852				   NULL, HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2853	}2854 2855	/* AX MU-MIMO GI Stats */2856	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2857		len += scnprintf(buf + len, (buf_len - len),2858				 "ax_mu_mimo_tx_gi[%u] = ", j);2859		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_gi[j],2860				   NULL, HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2861	}2862 2863	/* DL OFDMA GI Stats */2864	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2865		len += scnprintf(buf + len, (buf_len - len),2866				 "ofdma_tx_gi[%u] = ", j);2867		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_gi[j], NULL,2868				   HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2869	}2870 2871	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_dcm, "tx_dcm",2872			   HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");2873 2874	if (len >= buf_len)2875		buf[buf_len - 1] = 0;2876	else2877		buf[len] = 0;2878 2879	stats_req->buf_len = len;2880}2881 2882static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,2883						    struct debug_htt_stats_req *stats_req)2884{2885	const struct htt_rx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;2886	u8 *buf = stats_req->buf;2887	u32 len = stats_req->buf_len;2888	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;2889	u8 i, j;2890 2891	len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_STATS_TLV:\n");2892	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",2893			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));2894	len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",2895			 htt_stats_buf->nsts);2896	len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",2897			 htt_stats_buf->rx_ldpc);2898	len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",2899			 htt_stats_buf->rts_cnt);2900	len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",2901			 htt_stats_buf->rssi_mgmt);2902	len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",2903			 htt_stats_buf->rssi_data);2904	len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",2905			 htt_stats_buf->rssi_comb);2906	len += scnprintf(buf + len, buf_len - len, "rssi_in_dbm = %d\n",2907			 htt_stats_buf->rssi_in_dbm);2908 2909	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs, "rx_mcs",2910			   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2911	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_nss, "rx_nss",2912			   HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");2913	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_dcm, "rx_dcm",2914			   HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");2915	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc, "rx_stbc",2916			   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2917	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_bw, "rx_bw",2918			   HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2919 2920	len += scnprintf(buf + len, buf_len - len, "rx_evm_nss_count = %u\n",2921			 htt_stats_buf->nss_count);2922 2923	len += scnprintf(buf + len, buf_len - len, "rx_evm_pilot_count = %u\n",2924			 htt_stats_buf->pilot_count);2925 2926	for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {2927		len += scnprintf(buf + len, buf_len - len,2928				 "pilot_evm_db[%u] = ", j);2929		for (i = 0; i < HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS; i++)2930			len += scnprintf(buf + len,2931					 buf_len - len,2932					 " %u:%d,",2933					 i,2934					 htt_stats_buf->rx_pilot_evm_db[j][i]);2935		len += scnprintf(buf + len, buf_len - len, "\n");2936	}2937 2938	len += scnprintf(buf + len, buf_len - len,2939			 "pilot_evm_db_mean = ");2940	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)2941		len += scnprintf(buf + len,2942				 buf_len - len,2943				 " %u:%d,", i,2944				 htt_stats_buf->rx_pilot_evm_db_mean[i]);2945	len += scnprintf(buf + len, buf_len - len, "\n");2946 2947	for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {2948		len += scnprintf(buf + len, buf_len - len,2949				 "rssi_chain[%u] = ", j);2950		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain[j], NULL,2951				   HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");2952	}2953 2954	for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {2955		len += scnprintf(buf + len, buf_len - len,2956				 "rx_gi[%u] = ", j);2957		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi[j], NULL,2958				   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");2959	}2960 2961	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_pream, "rx_pream",2962			   HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");2963 2964	len += scnprintf(buf + len, buf_len - len, "rx_11ax_su_ext = %u\n",2965			 htt_stats_buf->rx_11ax_su_ext);2966	len += scnprintf(buf + len, buf_len - len, "rx_11ac_mumimo = %u\n",2967			 htt_stats_buf->rx_11ac_mumimo);2968	len += scnprintf(buf + len, buf_len - len, "rx_11ax_mumimo = %u\n",2969			 htt_stats_buf->rx_11ax_mumimo);2970	len += scnprintf(buf + len, buf_len - len, "rx_11ax_ofdma = %u\n",2971			 htt_stats_buf->rx_11ax_ofdma);2972	len += scnprintf(buf + len, buf_len - len, "txbf = %u\n",2973			 htt_stats_buf->txbf);2974 2975	len += scnprintf(buf + len, buf_len - len, "\nrx_su_ndpa = %u",2976			 htt_stats_buf->rx_su_ndpa);2977	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_su_txbf_mcs,2978			   "rx_11ax_su_txbf_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,2979			   "\n");2980 2981	len += scnprintf(buf + len, buf_len - len, "\nrx_mu_ndpa = %u",2982			 htt_stats_buf->rx_mu_ndpa);2983	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_mu_txbf_mcs,2984			   "rx_11ax_mu_txbf_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,2985			   "\n");2986 2987	len += scnprintf(buf + len, buf_len - len, "\nrx_br_poll = %u",2988			 htt_stats_buf->rx_br_poll);2989 2990	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_legacy_cck_rate,2991			   "rx_legacy_cck_rate",2992			   HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS, "\n");2993 2994	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_legacy_ofdm_rate,2995			   "rx_legacy_ofdm_rate",2996			   HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS, "\n");2997 2998	len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_low = %u\n",2999			 htt_stats_buf->rx_active_dur_us_low);3000	len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_high = %u\n",3001			 htt_stats_buf->rx_active_dur_us_high);3002	len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n",3003			 htt_stats_buf->rx_11ax_ul_ofdma);3004 3005	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_mcs,3006			   "ul_ofdma_rx_mcs",3007			   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");3008 3009	for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {3010		len += scnprintf(buf + len, buf_len - len,3011				 "ul_ofdma_rx_gi[%u] = ", j);3012		PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_gi[j], NULL,3013				   HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");3014	}3015 3016	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_nss,3017			   "ul_ofdma_rx_nss",3018			   HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");3019 3020	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_bw, "ul_ofdma_rx_bw",3021			   HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");3022 3023	len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n",3024			htt_stats_buf->ul_ofdma_rx_stbc);3025	len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n",3026			htt_stats_buf->ul_ofdma_rx_ldpc);3027 3028	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_non_data_ppdu,3029			   "rx_ulofdma_non_data_ppdu",3030			   HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");3031 3032	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_data_ppdu,3033			   "rx_ulofdma_data_ppdu", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");3034 3035	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_mpdu_ok,3036			   "rx_ulofdma_mpdu_ok", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");3037 3038	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_mpdu_fail,3039			   "rx_ulofdma_mpdu_fail", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");3040 3041	for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {3042		len += scnprintf(buf + len, buf_len - len,3043				 "rx_ul_fd_rssi: nss[%u] = ", j);3044		for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++)3045			len += scnprintf(buf + len,3046					 buf_len - len,3047					 " %u:%d,",3048					 i, htt_stats_buf->rx_ul_fd_rssi[j][i]);3049		len += scnprintf(buf + len, buf_len - len, "\n");3050	}3051 3052	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_non_data_nusers,3053			   "rx_ulofdma_non_data_nusers", HTT_RX_PDEV_MAX_OFDMA_NUM_USER,3054			   "\n");3055 3056	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_data_nusers,3057			   "rx_ulofdma_data_nusers", HTT_RX_PDEV_MAX_OFDMA_NUM_USER,3058			   "\n");3059 3060	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_mcs,3061			   "rx_11ax_dl_ofdma_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,3062			   "\n");3063 3064	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_ru,3065			   "rx_11ax_dl_ofdma_ru", HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS,3066			   "\n");3067 3068	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_non_data_ppdu,3069			   "rx_ulmumimo_non_data_ppdu", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3070			   "\n");3071 3072	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_data_ppdu,3073			   "rx_ulmumimo_data_ppdu", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3074			   "\n");3075 3076	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_mpdu_ok,3077			   "rx_ulmumimo_mpdu_ok", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3078			   "\n");3079 3080	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_mpdu_fail,3081			   "rx_ulmumimo_mpdu_fail", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,3082			   "\n");3083 3084	len += scnprintf(buf + len, buf_len - len, "per_chain_rssi_pkt_type = %#x\n",3085			 htt_stats_buf->per_chain_rssi_pkt_type);3086 3087	for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {3088		len += scnprintf(buf + len, buf_len - len,3089				 "rx_per_chain_rssi_in_dbm[%u] = ", j);3090		for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)3091			len += scnprintf(buf + len,3092					 buf_len - len,3093					 " %u:%d,",3094					 i,3095					 htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]);3096		len += scnprintf(buf + len, buf_len - len, "\n");3097	}3098	len += scnprintf(buf + len, buf_len - len, "\n");3099 3100	if (len >= buf_len)3101		buf[buf_len - 1] = 0;3102	else3103		buf[len] = 0;3104 3105	stats_req->buf_len = len;3106}3107 3108static inline void htt_print_rx_soc_fw_stats_tlv(const void *tag_buf,3109						 struct debug_htt_stats_req *stats_req)3110{3111	const struct htt_rx_soc_fw_stats_tlv *htt_stats_buf = tag_buf;3112	u8 *buf = stats_req->buf;3113	u32 len = stats_req->buf_len;3114	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3115 3116	len += scnprintf(buf + len, buf_len - len, "HTT_RX_SOC_FW_STATS_TLV:\n");3117	len += scnprintf(buf + len, buf_len - len, "fw_reo_ring_data_msdu = %u\n",3118			 htt_stats_buf->fw_reo_ring_data_msdu);3119	len += scnprintf(buf + len, buf_len - len, "fw_to_host_data_msdu_bcmc = %u\n",3120			 htt_stats_buf->fw_to_host_data_msdu_bcmc);3121	len += scnprintf(buf + len, buf_len - len, "fw_to_host_data_msdu_uc = %u\n",3122			 htt_stats_buf->fw_to_host_data_msdu_uc);3123	len += scnprintf(buf + len, buf_len - len,3124			 "ofld_remote_data_buf_recycle_cnt = %u\n",3125			 htt_stats_buf->ofld_remote_data_buf_recycle_cnt);3126	len += scnprintf(buf + len, buf_len - len,3127			 "ofld_remote_free_buf_indication_cnt = %u\n",3128			 htt_stats_buf->ofld_remote_free_buf_indication_cnt);3129	len += scnprintf(buf + len, buf_len - len,3130			 "ofld_buf_to_host_data_msdu_uc = %u\n",3131			 htt_stats_buf->ofld_buf_to_host_data_msdu_uc);3132	len += scnprintf(buf + len, buf_len - len,3133			 "reo_fw_ring_to_host_data_msdu_uc = %u\n",3134			 htt_stats_buf->reo_fw_ring_to_host_data_msdu_uc);3135	len += scnprintf(buf + len, buf_len - len, "wbm_sw_ring_reap = %u\n",3136			 htt_stats_buf->wbm_sw_ring_reap);3137	len += scnprintf(buf + len, buf_len - len, "wbm_forward_to_host_cnt = %u\n",3138			 htt_stats_buf->wbm_forward_to_host_cnt);3139	len += scnprintf(buf + len, buf_len - len, "wbm_target_recycle_cnt = %u\n",3140			 htt_stats_buf->wbm_target_recycle_cnt);3141	len += scnprintf(buf + len, buf_len - len,3142			 "target_refill_ring_recycle_cnt = %u\n",3143			 htt_stats_buf->target_refill_ring_recycle_cnt);3144 3145	if (len >= buf_len)3146		buf[buf_len - 1] = 0;3147	else3148		buf[len] = 0;3149 3150	stats_req->buf_len = len;3151}3152 3153static inline void3154htt_print_rx_soc_fw_refill_ring_empty_tlv_v(const void *tag_buf,3155					    u16 tag_len,3156					    struct debug_htt_stats_req *stats_req)3157{3158	const struct htt_rx_soc_fw_refill_ring_empty_tlv_v *htt_stats_buf = tag_buf;3159	u8 *buf = stats_req->buf;3160	u32 len = stats_req->buf_len;3161	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3162	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_REFILL_MAX_RING);3163 3164	len += scnprintf(buf + len, buf_len - len,3165			 "HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:\n");3166 3167	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->refill_ring_empty_cnt,3168			   "refill_ring_empty_cnt", num_elems, "\n\n");3169 3170	if (len >= buf_len)3171		buf[buf_len - 1] = 0;3172	else3173		buf[len] = 0;3174 3175	stats_req->buf_len = len;3176}3177 3178static inline void3179htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(const void *tag_buf,3180						    u16 tag_len,3181						    struct debug_htt_stats_req *stats_req)3182{3183	const struct htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *htt_stats_buf =3184		tag_buf;3185	u8 *buf = stats_req->buf;3186	u32 len = stats_req->buf_len;3187	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3188	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_RXDMA_MAX_ERR_CODE);3189 3190	len += scnprintf(buf + len, buf_len - len,3191			 "HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V:\n");3192 3193	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rxdma_err, "rxdma_err",3194			   num_elems, "\n\n");3195 3196	if (len >= buf_len)3197		buf[buf_len - 1] = 0;3198	else3199		buf[len] = 0;3200 3201	stats_req->buf_len = len;3202}3203 3204static inline void3205htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(const void *tag_buf,3206						  u16 tag_len,3207						  struct debug_htt_stats_req *stats_req)3208{3209	const struct htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *htt_stats_buf = tag_buf;3210	u8 *buf = stats_req->buf;3211	u32 len = stats_req->buf_len;3212	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3213	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_REO_MAX_ERR_CODE);3214 3215	len += scnprintf(buf + len, buf_len - len,3216			 "HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V:\n");3217 3218	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->reo_err, "reo_err",3219			   num_elems, "\n\n");3220 3221	if (len >= buf_len)3222		buf[buf_len - 1] = 0;3223	else3224		buf[len] = 0;3225 3226	stats_req->buf_len = len;3227}3228 3229static inline void3230htt_print_rx_reo_debug_stats_tlv_v(const void *tag_buf,3231				   struct debug_htt_stats_req *stats_req)3232{3233	const struct htt_rx_reo_resource_stats_tlv_v *htt_stats_buf = tag_buf;3234	u8 *buf = stats_req->buf;3235	u32 len = stats_req->buf_len;3236	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3237 3238	len += scnprintf(buf + len, buf_len - len, "HTT_RX_REO_RESOURCE_STATS_TLV:\n");3239	len += scnprintf(buf + len, buf_len - len, "sample_id = %u\n",3240			 htt_stats_buf->sample_id);3241	len += scnprintf(buf + len, buf_len - len, "total_max = %u\n",3242			 htt_stats_buf->total_max);3243	len += scnprintf(buf + len, buf_len - len, "total_avg = %u\n",3244			 htt_stats_buf->total_avg);3245	len += scnprintf(buf + len, buf_len - len, "total_sample = %u\n",3246			 htt_stats_buf->total_sample);3247	len += scnprintf(buf + len, buf_len - len, "non_zeros_avg = %u\n",3248			 htt_stats_buf->non_zeros_avg);3249	len += scnprintf(buf + len, buf_len - len, "non_zeros_sample = %u\n",3250			 htt_stats_buf->non_zeros_sample);3251	len += scnprintf(buf + len, buf_len - len, "last_non_zeros_max = %u\n",3252			 htt_stats_buf->last_non_zeros_max);3253	len += scnprintf(buf + len, buf_len - len, "last_non_zeros_min %u\n",3254			 htt_stats_buf->last_non_zeros_min);3255	len += scnprintf(buf + len, buf_len - len, "last_non_zeros_avg %u\n",3256			 htt_stats_buf->last_non_zeros_avg);3257	len += scnprintf(buf + len, buf_len - len, "last_non_zeros_sample %u\n\n",3258			 htt_stats_buf->last_non_zeros_sample);3259 3260	if (len >= buf_len)3261		buf[buf_len - 1] = 0;3262	else3263		buf[len] = 0;3264 3265	stats_req->buf_len = len;3266}3267 3268static inline void3269htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(const void *tag_buf,3270						 u16 tag_len,3271						 struct debug_htt_stats_req *stats_req)3272{3273	const struct htt_rx_soc_fw_refill_ring_num_refill_tlv_v *htt_stats_buf = tag_buf;3274	u8 *buf = stats_req->buf;3275	u32 len = stats_req->buf_len;3276	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3277	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_REFILL_MAX_RING);3278 3279	len += scnprintf(buf + len, buf_len - len,3280			 "HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:\n");3281 3282	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->refill_ring_num_refill,3283			   "refill_ring_num_refill", num_elems, "\n\n");3284 3285	if (len >= buf_len)3286		buf[buf_len - 1] = 0;3287	else3288		buf[len] = 0;3289 3290	stats_req->buf_len = len;3291}3292 3293static inline void htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf,3294						  struct debug_htt_stats_req *stats_req)3295{3296	const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf;3297	u8 *buf = stats_req->buf;3298	u32 len = stats_req->buf_len;3299	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3300 3301	len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n");3302	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",3303			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));3304	len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n",3305			 htt_stats_buf->ppdu_recvd);3306	len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n",3307			 htt_stats_buf->mpdu_cnt_fcs_ok);3308	len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n",3309			 htt_stats_buf->mpdu_cnt_fcs_err);3310	len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n",3311			 htt_stats_buf->tcp_msdu_cnt);3312	len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n",3313			 htt_stats_buf->tcp_ack_msdu_cnt);3314	len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n",3315			 htt_stats_buf->udp_msdu_cnt);3316	len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n",3317			 htt_stats_buf->other_msdu_cnt);3318	len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n",3319			 htt_stats_buf->fw_ring_mpdu_ind);3320 3321	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_mgmt_subtype,3322			   "fw_ring_mgmt_subtype", HTT_STATS_SUBTYPE_MAX, "\n");3323 3324	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_ctrl_subtype,3325			   "fw_ring_ctrl_subtype", HTT_STATS_SUBTYPE_MAX, "\n");3326 3327	len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n",3328			 htt_stats_buf->fw_ring_mcast_data_msdu);3329	len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n",3330			 htt_stats_buf->fw_ring_bcast_data_msdu);3331	len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n",3332			 htt_stats_buf->fw_ring_ucast_data_msdu);3333	len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n",3334			 htt_stats_buf->fw_ring_null_data_msdu);3335	len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n",3336			 htt_stats_buf->fw_ring_mpdu_drop);3337	len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n",3338			 htt_stats_buf->ofld_local_data_ind_cnt);3339	len += scnprintf(buf + len, buf_len - len,3340			 "ofld_local_data_buf_recycle_cnt = %u\n",3341			 htt_stats_buf->ofld_local_data_buf_recycle_cnt);3342	len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n",3343			 htt_stats_buf->drx_local_data_ind_cnt);3344	len += scnprintf(buf + len, buf_len - len,3345			 "drx_local_data_buf_recycle_cnt = %u\n",3346			 htt_stats_buf->drx_local_data_buf_recycle_cnt);3347	len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n",3348			 htt_stats_buf->local_nondata_ind_cnt);3349	len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n",3350			 htt_stats_buf->local_nondata_buf_recycle_cnt);3351	len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n",3352			 htt_stats_buf->fw_status_buf_ring_refill_cnt);3353	len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n",3354			 htt_stats_buf->fw_status_buf_ring_empty_cnt);3355	len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n",3356			 htt_stats_buf->fw_pkt_buf_ring_refill_cnt);3357	len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n",3358			 htt_stats_buf->fw_pkt_buf_ring_empty_cnt);3359	len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n",3360			 htt_stats_buf->fw_link_buf_ring_refill_cnt);3361	len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n",3362			 htt_stats_buf->fw_link_buf_ring_empty_cnt);3363	len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n",3364			 htt_stats_buf->host_pkt_buf_ring_refill_cnt);3365	len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n",3366			 htt_stats_buf->host_pkt_buf_ring_empty_cnt);3367	len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n",3368			 htt_stats_buf->mon_pkt_buf_ring_refill_cnt);3369	len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n",3370			 htt_stats_buf->mon_pkt_buf_ring_empty_cnt);3371	len += scnprintf(buf + len, buf_len - len,3372			 "mon_status_buf_ring_refill_cnt = %u\n",3373			 htt_stats_buf->mon_status_buf_ring_refill_cnt);3374	len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n",3375			 htt_stats_buf->mon_status_buf_ring_empty_cnt);3376	len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n",3377			 htt_stats_buf->mon_desc_buf_ring_refill_cnt);3378	len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n",3379			 htt_stats_buf->mon_desc_buf_ring_empty_cnt);3380	len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n",3381			 htt_stats_buf->mon_dest_ring_update_cnt);3382	len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n",3383			 htt_stats_buf->mon_dest_ring_full_cnt);3384	len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n",3385			 htt_stats_buf->rx_suspend_cnt);3386	len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n",3387			 htt_stats_buf->rx_suspend_fail_cnt);3388	len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n",3389			 htt_stats_buf->rx_resume_cnt);3390	len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n",3391			 htt_stats_buf->rx_resume_fail_cnt);3392	len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n",3393			 htt_stats_buf->rx_ring_switch_cnt);3394	len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n",3395			 htt_stats_buf->rx_ring_restore_cnt);3396	len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",3397			 htt_stats_buf->rx_flush_cnt);3398	len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n\n",3399			 htt_stats_buf->rx_recovery_reset_cnt);3400 3401	if (len >= buf_len)3402		buf[buf_len - 1] = 0;3403	else3404		buf[len] = 0;3405 3406	stats_req->buf_len = len;3407}3408 3409static inline void3410htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(const void *tag_buf,3411					 struct debug_htt_stats_req *stats_req)3412{3413	const struct htt_rx_pdev_fw_ring_mpdu_err_tlv_v *htt_stats_buf = tag_buf;3414	u8 *buf = stats_req->buf;3415	u32 len = stats_req->buf_len;3416	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3417 3418	len += scnprintf(buf + len, buf_len - len,3419			 "HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:\n");3420 3421	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_mpdu_err,3422			   "fw_ring_mpdu_err", HTT_RX_STATS_RXDMA_MAX_ERR, "\n");3423 3424	if (len >= buf_len)3425		buf[buf_len - 1] = 0;3426	else3427		buf[len] = 0;3428 3429	stats_req->buf_len = len;3430}3431 3432static inline void3433htt_print_rx_pdev_fw_mpdu_drop_tlv_v(const void *tag_buf,3434				     u16 tag_len,3435				     struct debug_htt_stats_req *stats_req)3436{3437	const struct htt_rx_pdev_fw_mpdu_drop_tlv_v *htt_stats_buf = tag_buf;3438	u8 *buf = stats_req->buf;3439	u32 len = stats_req->buf_len;3440	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3441	u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_FW_DROP_REASON_MAX);3442 3443	len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:\n");3444 3445	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_mpdu_drop, "fw_mpdu_drop",3446			   num_elems, "\n\n");3447 3448	if (len >= buf_len)3449		buf[buf_len - 1] = 0;3450	else3451		buf[len] = 0;3452 3453	stats_req->buf_len = len;3454}3455 3456static inline void3457htt_print_rx_pdev_fw_stats_phy_err_tlv(const void *tag_buf,3458				       struct debug_htt_stats_req *stats_req)3459{3460	const struct htt_rx_pdev_fw_stats_phy_err_tlv *htt_stats_buf = tag_buf;3461	u8 *buf = stats_req->buf;3462	u32 len = stats_req->buf_len;3463	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3464 3465	len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV:\n");3466	len += scnprintf(buf + len, buf_len - len, "mac_id__word = %u\n",3467			 htt_stats_buf->mac_id__word);3468	len += scnprintf(buf + len, buf_len - len, "total_phy_err_nct = %u\n",3469			 htt_stats_buf->total_phy_err_cnt);3470 3471	PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->phy_err, "phy_errs",3472			   HTT_STATS_PHY_ERR_MAX, "\n\n");3473 3474	if (len >= buf_len)3475		buf[buf_len - 1] = 0;3476	else3477		buf[len] = 0;3478 3479	stats_req->buf_len = len;3480}3481 3482static inline void3483htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf,3484				  struct debug_htt_stats_req *stats_req)3485{3486	const struct htt_pdev_cca_stats_hist_v1_tlv *htt_stats_buf = tag_buf;3487	u8 *buf = stats_req->buf;3488	u32 len = stats_req->buf_len;3489	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3490 3491	len += scnprintf(buf + len, buf_len - len, "\nHTT_PDEV_CCA_STATS_HIST_TLV:\n");3492	len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",3493			 htt_stats_buf->chan_num);3494	len += scnprintf(buf + len, buf_len - len, "num_records = %u\n",3495			 htt_stats_buf->num_records);3496	len += scnprintf(buf + len, buf_len - len, "valid_cca_counters_bitmap = 0x%x\n",3497			 htt_stats_buf->valid_cca_counters_bitmap);3498	len += scnprintf(buf + len, buf_len - len, "collection_interval = %u\n\n",3499			 htt_stats_buf->collection_interval);3500 3501	len += scnprintf(buf + len, buf_len - len,3502			 "HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n");3503	len += scnprintf(buf + len, buf_len - len,3504			 "|  tx_frame|   rx_frame|   rx_clear| my_rx_frame|        cnt| med_rx_idle| med_tx_idle_global|   cca_obss|\n");3505 3506	if (len >= buf_len)3507		buf[buf_len - 1] = 0;3508	else3509		buf[len] = 0;3510 3511	stats_req->buf_len = len;3512}3513 3514static inline void3515htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf,3516				      struct debug_htt_stats_req *stats_req)3517{3518	const struct htt_pdev_stats_cca_counters_tlv *htt_stats_buf = tag_buf;3519	u8 *buf = stats_req->buf;3520	u32 len = stats_req->buf_len;3521	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3522 3523	len += scnprintf(buf + len, buf_len - len,3524			 "|%10u| %10u| %10u| %11u| %10u| %11u| %18u| %10u|\n",3525			 htt_stats_buf->tx_frame_usec,3526			 htt_stats_buf->rx_frame_usec,3527			 htt_stats_buf->rx_clear_usec,3528			 htt_stats_buf->my_rx_frame_usec,3529			 htt_stats_buf->usec_cnt,3530			 htt_stats_buf->med_rx_idle_usec,3531			 htt_stats_buf->med_tx_idle_global_usec,3532			 htt_stats_buf->cca_obss_usec);3533 3534	if (len >= buf_len)3535		buf[buf_len - 1] = 0;3536	else3537		buf[len] = 0;3538 3539	stats_req->buf_len = len;3540}3541 3542static inline void htt_print_hw_stats_whal_tx_tlv(const void *tag_buf,3543						  struct debug_htt_stats_req *stats_req)3544{3545	const struct htt_hw_stats_whal_tx_tlv *htt_stats_buf = tag_buf;3546	u8 *buf = stats_req->buf;3547	u32 len = stats_req->buf_len;3548	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3549 3550	len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WHAL_TX_TLV:\n");3551	len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",3552			 FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));3553	len += scnprintf(buf + len, buf_len - len, "last_unpause_ppdu_id = %u\n",3554			 htt_stats_buf->last_unpause_ppdu_id);3555	len += scnprintf(buf + len, buf_len - len, "hwsch_unpause_wait_tqm_write = %u\n",3556			 htt_stats_buf->hwsch_unpause_wait_tqm_write);3557	len += scnprintf(buf + len, buf_len - len, "hwsch_dummy_tlv_skipped = %u\n",3558			 htt_stats_buf->hwsch_dummy_tlv_skipped);3559	len += scnprintf(buf + len, buf_len - len,3560			 "hwsch_misaligned_offset_received = %u\n",3561			 htt_stats_buf->hwsch_misaligned_offset_received);3562	len += scnprintf(buf + len, buf_len - len, "hwsch_reset_count = %u\n",3563			 htt_stats_buf->hwsch_reset_count);3564	len += scnprintf(buf + len, buf_len - len, "hwsch_dev_reset_war = %u\n",3565			 htt_stats_buf->hwsch_dev_reset_war);3566	len += scnprintf(buf + len, buf_len - len, "hwsch_delayed_pause = %u\n",3567			 htt_stats_buf->hwsch_delayed_pause);3568	len += scnprintf(buf + len, buf_len - len, "hwsch_long_delayed_pause = %u\n",3569			 htt_stats_buf->hwsch_long_delayed_pause);3570	len += scnprintf(buf + len, buf_len - len, "sch_rx_ppdu_no_response = %u\n",3571			 htt_stats_buf->sch_rx_ppdu_no_response);3572	len += scnprintf(buf + len, buf_len - len, "sch_selfgen_response = %u\n",3573			 htt_stats_buf->sch_selfgen_response);3574	len += scnprintf(buf + len, buf_len - len, "sch_rx_sifs_resp_trigger= %u\n\n",3575			 htt_stats_buf->sch_rx_sifs_resp_trigger);3576 3577	if (len >= buf_len)3578		buf[buf_len - 1] = 0;3579	else3580		buf[len] = 0;3581 3582	stats_req->buf_len = len;3583}3584 3585static inline void3586htt_print_pdev_stats_twt_sessions_tlv(const void *tag_buf,3587				      struct debug_htt_stats_req *stats_req)3588{3589	const struct htt_pdev_stats_twt_sessions_tlv *htt_stats_buf = tag_buf;3590	u8 *buf = stats_req->buf;3591	u32 len = stats_req->buf_len;3592	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3593 3594	len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_STATS_TWT_SESSIONS_TLV:\n");3595	len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3596			 htt_stats_buf->pdev_id);3597	len += scnprintf(buf + len, buf_len - len, "num_sessions = %u\n\n",3598			 htt_stats_buf->num_sessions);3599 3600	if (len >= buf_len)3601		buf[buf_len - 1] = 0;3602	else3603		buf[len] = 0;3604 3605	stats_req->buf_len = len;3606}3607 3608static inline void3609htt_print_pdev_stats_twt_session_tlv(const void *tag_buf,3610				     struct debug_htt_stats_req *stats_req)3611{3612	const struct htt_pdev_stats_twt_session_tlv *htt_stats_buf = tag_buf;3613	u8 *buf = stats_req->buf;3614	u32 len = stats_req->buf_len;3615	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3616 3617	len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_STATS_TWT_SESSION_TLV:\n");3618	len += scnprintf(buf + len, buf_len - len, "vdev_id = %u\n",3619			 htt_stats_buf->vdev_id);3620	len += scnprintf(buf + len, buf_len - len,3621			 "peer_mac = %02lx:%02lx:%02lx:%02lx:%02lx:%02lx\n",3622			 FIELD_GET(HTT_MAC_ADDR_L32_0,3623				   htt_stats_buf->peer_mac.mac_addr_l32),3624			 FIELD_GET(HTT_MAC_ADDR_L32_1,3625				   htt_stats_buf->peer_mac.mac_addr_l32),3626			 FIELD_GET(HTT_MAC_ADDR_L32_2,3627				   htt_stats_buf->peer_mac.mac_addr_l32),3628			 FIELD_GET(HTT_MAC_ADDR_L32_3,3629				   htt_stats_buf->peer_mac.mac_addr_l32),3630			 FIELD_GET(HTT_MAC_ADDR_H16_0,3631				   htt_stats_buf->peer_mac.mac_addr_h16),3632			 FIELD_GET(HTT_MAC_ADDR_H16_1,3633				   htt_stats_buf->peer_mac.mac_addr_h16));3634	len += scnprintf(buf + len, buf_len - len, "flow_id_flags = %u\n",3635			 htt_stats_buf->flow_id_flags);3636	len += scnprintf(buf + len, buf_len - len, "dialog_id = %u\n",3637			 htt_stats_buf->dialog_id);3638	len += scnprintf(buf + len, buf_len - len, "wake_dura_us = %u\n",3639			 htt_stats_buf->wake_dura_us);3640	len += scnprintf(buf + len, buf_len - len, "wake_intvl_us = %u\n",3641			 htt_stats_buf->wake_intvl_us);3642	len += scnprintf(buf + len, buf_len - len, "sp_offset_us = %u\n\n",3643			 htt_stats_buf->sp_offset_us);3644 3645	if (len >= buf_len)3646		buf[buf_len - 1] = 0;3647	else3648		buf[len] = 0;3649 3650	stats_req->buf_len = len;3651}3652 3653static inline void3654htt_print_pdev_obss_pd_stats_tlv_v(const void *tag_buf,3655				   struct debug_htt_stats_req *stats_req)3656{3657	const struct htt_pdev_obss_pd_stats_tlv *htt_stats_buf = tag_buf;3658	u8 *buf = stats_req->buf;3659	u32 len = stats_req->buf_len;3660	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3661 3662	len += scnprintf(buf + len, buf_len - len, "OBSS Tx success PPDU = %u\n",3663			   htt_stats_buf->num_obss_tx_ppdu_success);3664	len += scnprintf(buf + len, buf_len - len, "OBSS Tx failures PPDU = %u\n",3665			   htt_stats_buf->num_obss_tx_ppdu_failure);3666	len += scnprintf(buf + len, buf_len - len, "Non-SRG Opportunities = %u\n",3667			   htt_stats_buf->num_non_srg_opportunities);3668	len += scnprintf(buf + len, buf_len - len, "Non-SRG tried PPDU = %u\n",3669			   htt_stats_buf->num_non_srg_ppdu_tried);3670	len += scnprintf(buf + len, buf_len - len, "Non-SRG success PPDU = %u\n",3671			   htt_stats_buf->num_non_srg_ppdu_success);3672	len += scnprintf(buf + len, buf_len - len, "SRG Opportunities = %u\n",3673			   htt_stats_buf->num_srg_opportunities);3674	len += scnprintf(buf + len, buf_len - len, "SRG tried PPDU = %u\n",3675			   htt_stats_buf->num_srg_ppdu_tried);3676	len += scnprintf(buf + len, buf_len - len, "SRG success PPDU = %u\n\n",3677			   htt_stats_buf->num_srg_ppdu_success);3678 3679	if (len >= buf_len)3680		buf[buf_len - 1] = 0;3681	else3682		buf[len] = 0;3683 3684	stats_req->buf_len = len;3685}3686 3687static inline void htt_print_backpressure_stats_tlv_v(const u32 *tag_buf,3688						      u8 *data)3689{3690	struct debug_htt_stats_req *stats_req =3691			(struct debug_htt_stats_req *)data;3692	struct htt_ring_backpressure_stats_tlv *htt_stats_buf =3693			(struct htt_ring_backpressure_stats_tlv *)tag_buf;3694	int i;3695	u8 *buf = stats_req->buf;3696	u32 len = stats_req->buf_len;3697	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3698 3699	len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",3700			 htt_stats_buf->pdev_id);3701	len += scnprintf(buf + len, buf_len - len, "current_head_idx = %u\n",3702			 htt_stats_buf->current_head_idx);3703	len += scnprintf(buf + len, buf_len - len, "current_tail_idx = %u\n",3704			 htt_stats_buf->current_tail_idx);3705	len += scnprintf(buf + len, buf_len - len, "num_htt_msgs_sent = %u\n",3706			 htt_stats_buf->num_htt_msgs_sent);3707	len += scnprintf(buf + len, buf_len - len,3708			 "backpressure_time_ms = %u\n",3709			 htt_stats_buf->backpressure_time_ms);3710 3711	for (i = 0; i < 5; i++)3712		len += scnprintf(buf + len, buf_len - len,3713				 "backpressure_hist_%u = %u\n",3714				 i + 1, htt_stats_buf->backpressure_hist[i]);3715 3716	len += scnprintf(buf + len, buf_len - len,3717			 "============================\n");3718 3719	if (len >= buf_len) {3720		buf[buf_len - 1] = 0;3721		stats_req->buf_len = buf_len - 1;3722	} else {3723		buf[len] = 0;3724		stats_req->buf_len = len;3725	}3726}3727 3728static inline3729void htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf,3730					   struct debug_htt_stats_req *stats_req)3731{3732	const struct htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf;3733	u8 *buf = stats_req->buf;3734	u32 len = stats_req->buf_len;3735	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3736	int i;3737 3738	len += scnprintf(buf + len, buf_len - len,3739			 "HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n");3740 3741	len += scnprintf(buf + len, buf_len - len, "tx_ol_mcs = ");3742	for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)3743		len += scnprintf(buf + len, buf_len - len,3744				 "%d:%u,", i, htt_stats_buf->tx_su_ol_mcs[i]);3745	len--;3746 3747	len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_mcs = ");3748	for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)3749		len += scnprintf(buf + len, buf_len - len,3750				 "%d:%u,", i, htt_stats_buf->tx_su_ibf_mcs[i]);3751	len--;3752 3753	len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_mcs =");3754	for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)3755		len += scnprintf(buf + len, buf_len - len,3756				 "%d:%u,", i, htt_stats_buf->tx_su_txbf_mcs[i]);3757	len--;3758 3759	len += scnprintf(buf + len, buf_len - len, "\ntx_ol_nss = ");3760	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)3761		len += scnprintf(buf + len, buf_len - len,3762				 "%d:%u,", i, htt_stats_buf->tx_su_ol_nss[i]);3763	len--;3764 3765	len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_nss = ");3766	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)3767		len += scnprintf(buf + len, buf_len - len,3768				 "%d:%u,", i, htt_stats_buf->tx_su_ibf_nss[i]);3769	len--;3770 3771	len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_nss = ");3772	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)3773		len += scnprintf(buf + len, buf_len - len,3774				 "%d:%u,", i, htt_stats_buf->tx_su_txbf_nss[i]);3775	len--;3776 3777	len += scnprintf(buf + len, buf_len - len, "\ntx_ol_bw = ");3778	for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)3779		len += scnprintf(buf + len, buf_len - len,3780				 "%d:%u,", i, htt_stats_buf->tx_su_ol_bw[i]);3781	len--;3782 3783	len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_bw = ");3784	for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)3785		len += scnprintf(buf + len, buf_len - len,3786				 "%d:%u,", i, htt_stats_buf->tx_su_ibf_bw[i]);3787	len--;3788 3789	len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_bw = ");3790	for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)3791		len += scnprintf(buf + len, buf_len - len,3792				 "%d:%u,", i, htt_stats_buf->tx_su_txbf_bw[i]);3793	len--;3794 3795	len += scnprintf(buf + len, buf_len - len, "\n");3796 3797	stats_req->buf_len = len;3798}3799 3800static inline3801void htt_print_txbf_ofdma_ndpa_stats_tlv(const void *tag_buf,3802					 struct debug_htt_stats_req *stats_req)3803{3804	const struct htt_txbf_ofdma_ndpa_stats_tlv *htt_stats_buf = tag_buf;3805	u8 *buf = stats_req->buf;3806	u32 len = stats_req->buf_len;3807	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3808	int i;3809 3810	len += scnprintf(buf + len, buf_len - len,3811			 "HTT_TXBF_OFDMA_NDPA_STATS_TLV:\n");3812 3813	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3814		len += scnprintf(buf + len, buf_len - len,3815				 "ax_ofdma_ndpa_queued_user%d = %u\n",3816				 i, htt_stats_buf->ax_ofdma_ndpa_queued[i]);3817		len += scnprintf(buf + len, buf_len - len,3818				 "ax_ofdma_ndpa_tried_user%d = %u\n",3819				 i, htt_stats_buf->ax_ofdma_ndpa_tried[i]);3820		len += scnprintf(buf + len, buf_len - len,3821				 "ax_ofdma_ndpa_flushed_user%d = %u\n",3822				 i, htt_stats_buf->ax_ofdma_ndpa_flushed[i]);3823		len += scnprintf(buf + len, buf_len - len,3824				 "ax_ofdma_ndpa_err_user%d = %u\n",3825				 i, htt_stats_buf->ax_ofdma_ndpa_err[i]);3826		len += scnprintf(buf + len, buf_len - len, "\n");3827	}3828 3829	stats_req->buf_len = len;3830}3831 3832static inline3833void htt_print_txbf_ofdma_ndp_stats_tlv(const void *tag_buf,3834					struct debug_htt_stats_req *stats_req)3835{3836	const struct htt_txbf_ofdma_ndp_stats_tlv *htt_stats_buf = tag_buf;3837	u8 *buf = stats_req->buf;3838	u32 len = stats_req->buf_len;3839	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3840	int i;3841 3842	len += scnprintf(buf + len, buf_len - len,3843			 "HTT_TXBF_OFDMA_NDP_STATS_TLV:\n");3844 3845	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3846		len += scnprintf(buf + len, buf_len - len,3847				 "ax_ofdma_ndp_queued_user%d = %u\n",3848				 i, htt_stats_buf->ax_ofdma_ndp_queued[i]);3849		len += scnprintf(buf + len, buf_len - len,3850				 "ax_ofdma_ndp_tried_user%d = %u\n",3851				 i, htt_stats_buf->ax_ofdma_ndp_tried[i]);3852		len += scnprintf(buf + len, buf_len - len,3853				 "ax_ofdma_ndp_flushed_user%d = %u\n",3854				 i, htt_stats_buf->ax_ofdma_ndp_flushed[i]);3855		len += scnprintf(buf + len, buf_len - len,3856				 "ax_ofdma_ndp_err_user%d = %u\n",3857				 i, htt_stats_buf->ax_ofdma_ndp_err[i]);3858		len += scnprintf(buf + len, buf_len - len, "\n");3859	}3860 3861	stats_req->buf_len = len;3862}3863 3864static inline3865void htt_print_txbf_ofdma_brp_stats_tlv(const void *tag_buf,3866					struct debug_htt_stats_req *stats_req)3867{3868	const struct htt_txbf_ofdma_brp_stats_tlv *htt_stats_buf = tag_buf;3869	u8 *buf = stats_req->buf;3870	u32 len = stats_req->buf_len;3871	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3872	int i;3873 3874	len += scnprintf(buf + len, buf_len - len,3875			 "HTT_TXBF_OFDMA_BRP_STATS_TLV:\n");3876 3877	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3878		len += scnprintf(buf + len, buf_len - len,3879				 "ax_ofdma_brpoll_queued_user%d = %u\n",3880				 i, htt_stats_buf->ax_ofdma_brpoll_queued[i]);3881		len += scnprintf(buf + len, buf_len - len,3882				 "ax_ofdma_brpoll_tried_user%d = %u\n",3883				 i, htt_stats_buf->ax_ofdma_brpoll_tried[i]);3884		len += scnprintf(buf + len, buf_len - len,3885				 "ax_ofdma_brpoll_flushed_user%d = %u\n",3886				 i, htt_stats_buf->ax_ofdma_brpoll_flushed[i]);3887		len += scnprintf(buf + len, buf_len - len,3888				 "ax_ofdma_brp_err_user%d = %u\n",3889				 i, htt_stats_buf->ax_ofdma_brp_err[i]);3890		len += scnprintf(buf + len, buf_len - len,3891				 "ax_ofdma_brp_err_num_cbf_rcvd_user%d = %u\n",3892				 i, htt_stats_buf->ax_ofdma_brp_err_num_cbf_rcvd[i]);3893		len += scnprintf(buf + len, buf_len - len, "\n");3894	}3895 3896	stats_req->buf_len = len;3897}3898 3899static inline3900void htt_print_txbf_ofdma_steer_stats_tlv(const void *tag_buf,3901					  struct debug_htt_stats_req *stats_req)3902{3903	const struct htt_txbf_ofdma_steer_stats_tlv *htt_stats_buf = tag_buf;3904	u8 *buf = stats_req->buf;3905	u32 len = stats_req->buf_len;3906	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3907	int i;3908 3909	len += scnprintf(buf + len, buf_len - len,3910			 "HTT_TXBF_OFDMA_STEER_STATS_TLV:\n");3911 3912	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {3913		len += scnprintf(buf + len, buf_len - len,3914				 "ax_ofdma_num_ppdu_steer_user%d = %u\n",3915				 i, htt_stats_buf->ax_ofdma_num_ppdu_steer[i]);3916		len += scnprintf(buf + len, buf_len - len,3917				 "ax_ofdma_num_ppdu_ol_user%d = %u\n",3918				 i, htt_stats_buf->ax_ofdma_num_ppdu_ol[i]);3919		len += scnprintf(buf + len, buf_len - len,3920				 "ax_ofdma_num_usrs_prefetch_user%d = %u\n",3921				 i, htt_stats_buf->ax_ofdma_num_usrs_prefetch[i]);3922		len += scnprintf(buf + len, buf_len - len,3923				 "ax_ofdma_num_usrs_sound_user%d = %u\n",3924				 i, htt_stats_buf->ax_ofdma_num_usrs_sound[i]);3925		len += scnprintf(buf + len, buf_len - len,3926				 "ax_ofdma_num_usrs_force_sound_user%d = %u\n",3927				 i, htt_stats_buf->ax_ofdma_num_usrs_force_sound[i]);3928		len += scnprintf(buf + len, buf_len - len, "\n");3929	}3930 3931	stats_req->buf_len = len;3932}3933 3934static inline3935void htt_print_phy_counters_tlv(const void *tag_buf,3936				struct debug_htt_stats_req *stats_req)3937{3938	const struct htt_phy_counters_tlv *htt_stats_buf = tag_buf;3939	u8 *buf = stats_req->buf;3940	u32 len = stats_req->buf_len;3941	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3942	int i;3943 3944	len += scnprintf(buf + len, buf_len - len, "HTT_PHY_COUNTERS_TLV:\n");3945	len += scnprintf(buf + len, buf_len - len, "rx_ofdma_timing_err_cnt = %u\n",3946			 htt_stats_buf->rx_ofdma_timing_err_cnt);3947	len += scnprintf(buf + len, buf_len - len, "rx_cck_fail_cnt = %u\n",3948			 htt_stats_buf->rx_cck_fail_cnt);3949	len += scnprintf(buf + len, buf_len - len, "mactx_abort_cnt = %u\n",3950			 htt_stats_buf->mactx_abort_cnt);3951	len += scnprintf(buf + len, buf_len - len, "macrx_abort_cnt = %u\n",3952			 htt_stats_buf->macrx_abort_cnt);3953	len += scnprintf(buf + len, buf_len - len, "phytx_abort_cnt = %u\n",3954			 htt_stats_buf->phytx_abort_cnt);3955	len += scnprintf(buf + len, buf_len - len, "phyrx_abort_cnt = %u\n",3956			 htt_stats_buf->phyrx_abort_cnt);3957	len += scnprintf(buf + len, buf_len - len, "phyrx_defer_abort_cnt = %u\n",3958			 htt_stats_buf->phyrx_defer_abort_cnt);3959	len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_lstf_event_cnt = %u\n",3960			 htt_stats_buf->rx_gain_adj_lstf_event_cnt);3961	len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_non_legacy_cnt = %u\n",3962			 htt_stats_buf->rx_gain_adj_non_legacy_cnt);3963 3964	for (i = 0; i < HTT_MAX_RX_PKT_CNT; i++)3965		len += scnprintf(buf + len, buf_len - len, "rx_pkt_cnt[%d] = %u\n",3966				 i, htt_stats_buf->rx_pkt_cnt[i]);3967 3968	for (i = 0; i < HTT_MAX_RX_PKT_CRC_PASS_CNT; i++)3969		len += scnprintf(buf + len, buf_len - len,3970				 "rx_pkt_crc_pass_cnt[%d] = %u\n",3971				 i, htt_stats_buf->rx_pkt_crc_pass_cnt[i]);3972 3973	for (i = 0; i < HTT_MAX_PER_BLK_ERR_CNT; i++)3974		len += scnprintf(buf + len, buf_len - len,3975				 "per_blk_err_cnt[%d] = %u\n",3976				 i, htt_stats_buf->per_blk_err_cnt[i]);3977 3978	for (i = 0; i < HTT_MAX_RX_OTA_ERR_CNT; i++)3979		len += scnprintf(buf + len, buf_len - len,3980				 "rx_ota_err_cnt[%d] = %u\n",3981				 i, htt_stats_buf->rx_ota_err_cnt[i]);3982 3983	stats_req->buf_len = len;3984}3985 3986static inline3987void htt_print_phy_stats_tlv(const void *tag_buf,3988			     struct debug_htt_stats_req *stats_req)3989{3990	const struct htt_phy_stats_tlv *htt_stats_buf = tag_buf;3991	u8 *buf = stats_req->buf;3992	u32 len = stats_req->buf_len;3993	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;3994	int i;3995 3996	len += scnprintf(buf + len, buf_len - len, "HTT_PHY_STATS_TLV:\n");3997 3998	for (i = 0; i < HTT_STATS_MAX_CHAINS; i++)3999		len += scnprintf(buf + len, buf_len - len, "nf_chain[%d] = %d\n",4000				 i, htt_stats_buf->nf_chain[i]);4001 4002	len += scnprintf(buf + len, buf_len - len, "false_radar_cnt = %u\n",4003			 htt_stats_buf->false_radar_cnt);4004	len += scnprintf(buf + len, buf_len - len, "radar_cs_cnt = %u\n",4005			 htt_stats_buf->radar_cs_cnt);4006	len += scnprintf(buf + len, buf_len - len, "ani_level = %d\n",4007			 htt_stats_buf->ani_level);4008	len += scnprintf(buf + len, buf_len - len, "fw_run_time = %u\n",4009			 htt_stats_buf->fw_run_time);4010 4011	stats_req->buf_len = len;4012}4013 4014static inline void4015htt_print_phy_reset_counters_tlv(const void *tag_buf,4016				 u16 tag_len,4017				 struct debug_htt_stats_req *stats_req)4018{4019	const struct htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf;4020	u8 *buf = stats_req->buf;4021	u32 len = stats_req->buf_len;4022	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;4023 4024	if (tag_len < sizeof(*htt_stats_buf))4025		return;4026 4027	len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n");4028 4029	len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",4030			 htt_stats_buf->pdev_id);4031	len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n",4032			 htt_stats_buf->cf_active_low_fail_cnt);4033	len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n",4034			 htt_stats_buf->cf_active_low_pass_cnt);4035	len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n",4036			 htt_stats_buf->phy_off_through_vreg_cnt);4037	len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n",4038			 htt_stats_buf->force_calibration_cnt);4039	len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n",4040			 htt_stats_buf->rf_mode_switch_phy_off_cnt);4041 4042	stats_req->buf_len = len;4043}4044 4045static inline void4046htt_print_phy_reset_stats_tlv(const void *tag_buf,4047			      u16 tag_len,4048			      struct debug_htt_stats_req *stats_req)4049{4050	const struct htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf;4051	u8 *buf = stats_req->buf;4052	u32 len = stats_req->buf_len;4053	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;4054 4055	if (tag_len < sizeof(*htt_stats_buf))4056		return;4057 4058	len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n");4059 4060	len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",4061			 htt_stats_buf->pdev_id);4062	len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n",4063			 htt_stats_buf->chan_mhz);4064	len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n",4065			 htt_stats_buf->chan_band_center_freq1);4066	len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n",4067			 htt_stats_buf->chan_band_center_freq2);4068	len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n",4069			 htt_stats_buf->chan_phy_mode);4070	len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n",4071			 htt_stats_buf->chan_flags);4072	len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",4073			 htt_stats_buf->chan_num);4074	len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n",4075			 htt_stats_buf->reset_cause);4076	len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n",4077			 htt_stats_buf->prev_reset_cause);4078	len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n",4079			 htt_stats_buf->phy_warm_reset_src);4080	len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n",4081			 htt_stats_buf->rx_gain_tbl_mode);4082	len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n",4083			 htt_stats_buf->xbar_val);4084	len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n",4085			 htt_stats_buf->force_calibration);4086	len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n",4087			 htt_stats_buf->phyrf_mode);4088	len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n",4089			 htt_stats_buf->phy_homechan);4090	len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n",4091			 htt_stats_buf->phy_tx_ch_mask);4092	len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n",4093			 htt_stats_buf->phy_rx_ch_mask);4094	len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n",4095			 htt_stats_buf->phybb_ini_mask);4096	len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n",4097			 htt_stats_buf->phyrf_ini_mask);4098	len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n",4099			 htt_stats_buf->phy_dfs_en_mask);4100	len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n",4101			 htt_stats_buf->phy_sscan_en_mask);4102	len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n",4103			 htt_stats_buf->phy_synth_sel_mask);4104	len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n",4105			 htt_stats_buf->phy_adfs_freq);4106	len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n",4107			 htt_stats_buf->cck_fir_settings);4108	len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n",4109			 htt_stats_buf->phy_dyn_pri_chan);4110	len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n",4111			 htt_stats_buf->cca_thresh);4112	len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n",4113			 htt_stats_buf->dyn_cca_status);4114	len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n",4115			 htt_stats_buf->rxdesense_thresh_hw);4116	len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n",4117			 htt_stats_buf->rxdesense_thresh_sw);4118 4119	stats_req->buf_len = len;4120}4121 4122static inline4123void htt_print_peer_ctrl_path_txrx_stats_tlv(const void *tag_buf,4124					     struct debug_htt_stats_req *stats_req)4125{4126	const struct htt_peer_ctrl_path_txrx_stats_tlv *htt_stat_buf = tag_buf;4127	u8 *buf = stats_req->buf;4128	u32 len = stats_req->buf_len;4129	u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;4130	int i;4131	const char *mgmt_frm_type[ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1] = {4132		"assoc_req", "assoc_resp",4133		"reassoc_req", "reassoc_resp",4134		"probe_req", "probe_resp",4135		"timing_advertisement", "reserved",4136		"beacon", "atim", "disassoc",4137		"auth", "deauth", "action", "action_no_ack"};4138 4139	len += scnprintf(buf + len, buf_len - len,4140			 "HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:\n");4141	len += scnprintf(buf + len, buf_len - len,4142			 "peer_mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",4143			 htt_stat_buf->peer_mac_addr[0], htt_stat_buf->peer_mac_addr[1],4144			 htt_stat_buf->peer_mac_addr[2], htt_stat_buf->peer_mac_addr[3],4145			 htt_stat_buf->peer_mac_addr[4], htt_stat_buf->peer_mac_addr[5]);4146 4147	len += scnprintf(buf + len, buf_len - len, "peer_tx_mgmt_subtype:\n");4148	for (i = 0; i < ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1; i++)4149		len += scnprintf(buf + len, buf_len - len, "%s:%u\n",4150				 mgmt_frm_type[i],4151				 htt_stat_buf->peer_rx_mgmt_subtype[i]);4152 4153	len += scnprintf(buf + len, buf_len - len, "peer_rx_mgmt_subtype:\n");4154	for (i = 0; i < ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1; i++)4155		len += scnprintf(buf + len, buf_len - len, "%s:%u\n",4156				 mgmt_frm_type[i],4157				 htt_stat_buf->peer_rx_mgmt_subtype[i]);4158 4159	len += scnprintf(buf + len, buf_len - len, "\n");4160 4161	stats_req->buf_len = len;4162}4163 4164static int ath11k_dbg_htt_ext_stats_parse(struct ath11k_base *ab,4165					  u16 tag, u16 len, const void *tag_buf,4166					  void *user_data)4167{4168	struct debug_htt_stats_req *stats_req = user_data;4169 4170	switch (tag) {4171	case HTT_STATS_TX_PDEV_CMN_TAG:4172		htt_print_tx_pdev_stats_cmn_tlv(tag_buf, stats_req);4173		break;4174	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:4175		htt_print_tx_pdev_stats_urrn_tlv_v(tag_buf, len, stats_req);4176		break;4177	case HTT_STATS_TX_PDEV_SIFS_TAG:4178		htt_print_tx_pdev_stats_sifs_tlv_v(tag_buf, len, stats_req);4179		break;4180	case HTT_STATS_TX_PDEV_FLUSH_TAG:4181		htt_print_tx_pdev_stats_flush_tlv_v(tag_buf, len, stats_req);4182		break;4183	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:4184		htt_print_tx_pdev_stats_phy_err_tlv_v(tag_buf, len, stats_req);4185		break;4186	case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:4187		htt_print_tx_pdev_stats_sifs_hist_tlv_v(tag_buf, len, stats_req);4188		break;4189 4190	case HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG:4191		htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(tag_buf, stats_req);4192		break;4193 4194	case HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG:4195		htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(tag_buf, len,4196								  stats_req);4197		break;4198 4199	case HTT_STATS_STRING_TAG:4200		htt_print_stats_string_tlv(tag_buf, len, stats_req);4201		break;4202 4203	case HTT_STATS_TX_HWQ_CMN_TAG:4204		htt_print_tx_hwq_stats_cmn_tlv(tag_buf, stats_req);4205		break;4206 4207	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:4208		htt_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf, len, stats_req);4209		break;4210 4211	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:4212		htt_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf, len, stats_req);4213		break;4214 4215	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:4216		htt_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf, len, stats_req);4217		break;4218 4219	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:4220		htt_print_tx_hwq_fes_result_stats_tlv_v(tag_buf, len, stats_req);4221		break;4222 4223	case HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG:4224		htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(tag_buf, len, stats_req);4225		break;4226 4227	case HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG:4228		htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(tag_buf, len, stats_req);4229		break;4230	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:4231		htt_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf, len, stats_req);4232		break;4233 4234	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:4235		htt_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf, len, stats_req);4236		break;4237 4238	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:4239		htt_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf, len, stats_req);4240		break;4241 4242	case HTT_STATS_TX_TQM_CMN_TAG:4243		htt_print_tx_tqm_cmn_stats_tlv(tag_buf, stats_req);4244		break;4245 4246	case HTT_STATS_TX_TQM_PDEV_TAG:4247		htt_print_tx_tqm_pdev_stats_tlv_v(tag_buf, stats_req);4248		break;4249 4250	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:4251		htt_print_tx_tqm_cmdq_status_tlv(tag_buf, stats_req);4252		break;4253 4254	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:4255		htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, stats_req);4256		break;4257 4258	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:4259		htt_print_tx_de_classify_failed_stats_tlv(tag_buf, stats_req);4260		break;4261 4262	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:4263		htt_print_tx_de_classify_stats_tlv(tag_buf, stats_req);4264		break;4265 4266	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:4267		htt_print_tx_de_classify_status_stats_tlv(tag_buf, stats_req);4268		break;4269 4270	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:4271		htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, stats_req);4272		break;4273 4274	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:4275		htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, stats_req);4276		break;4277 4278	case HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG:4279		htt_print_tx_de_fw2wbm_ring_full_hist_tlv(tag_buf, len, stats_req);4280		break;4281 4282	case HTT_STATS_TX_DE_CMN_TAG:4283		htt_print_tx_de_cmn_stats_tlv(tag_buf, stats_req);4284		break;4285 4286	case HTT_STATS_RING_IF_TAG:4287		htt_print_ring_if_stats_tlv(tag_buf, stats_req);4288		break;4289 4290	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:4291		htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, stats_req);4292		break;4293 4294	case HTT_STATS_SFM_CMN_TAG:4295		htt_print_sfm_cmn_tlv(tag_buf, stats_req);4296		break;4297 4298	case HTT_STATS_SRING_STATS_TAG:4299		htt_print_sring_stats_tlv(tag_buf, stats_req);4300		break;4301 4302	case HTT_STATS_RX_PDEV_FW_STATS_TAG:4303		htt_print_rx_pdev_fw_stats_tlv(tag_buf, stats_req);4304		break;4305 4306	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:4307		htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf, stats_req);4308		break;4309 4310	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:4311		htt_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf, len, stats_req);4312		break;4313 4314	case HTT_STATS_RX_SOC_FW_STATS_TAG:4315		htt_print_rx_soc_fw_stats_tlv(tag_buf, stats_req);4316		break;4317 4318	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:4319		htt_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf, len, stats_req);4320		break;4321 4322	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:4323		htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(4324				tag_buf, len, stats_req);4325		break;4326	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:4327		htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(4328				tag_buf, len, stats_req);4329		break;4330 4331	case HTT_STATS_RX_REFILL_REO_ERR_TAG:4332		htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(4333				tag_buf, len, stats_req);4334		break;4335 4336	case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:4337		htt_print_rx_reo_debug_stats_tlv_v(4338				tag_buf, stats_req);4339		break;4340	case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:4341		htt_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf, stats_req);4342		break;4343 4344	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:4345		htt_print_tx_pdev_rate_stats_tlv(tag_buf, stats_req);4346		break;4347 4348	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:4349		htt_print_rx_pdev_rate_stats_tlv(tag_buf, stats_req);4350		break;4351 4352	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:4353		htt_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf, stats_req);4354		break;4355	case HTT_STATS_TX_SCHED_CMN_TAG:4356		htt_print_stats_tx_sched_cmn_tlv(tag_buf, stats_req);4357		break;4358 4359	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:4360		htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, stats_req);4361		break;4362 4363	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:4364		htt_print_sched_txq_cmd_posted_tlv_v(tag_buf, len, stats_req);4365		break;4366 4367	case HTT_STATS_RING_IF_CMN_TAG:4368		htt_print_ring_if_cmn_tlv(tag_buf, stats_req);4369		break;4370 4371	case HTT_STATS_SFM_CLIENT_USER_TAG:4372		htt_print_sfm_client_user_tlv_v(tag_buf, len, stats_req);4373		break;4374 4375	case HTT_STATS_SFM_CLIENT_TAG:4376		htt_print_sfm_client_tlv(tag_buf, stats_req);4377		break;4378 4379	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:4380		htt_print_tx_tqm_error_stats_tlv(tag_buf, stats_req);4381		break;4382 4383	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:4384		htt_print_sched_txq_cmd_reaped_tlv_v(tag_buf, len, stats_req);4385		break;4386 4387	case HTT_STATS_SRING_CMN_TAG:4388		htt_print_sring_cmn_tlv(tag_buf, stats_req);4389		break;4390 4391	case HTT_STATS_TX_SOUNDING_STATS_TAG:4392		htt_print_tx_sounding_stats_tlv(tag_buf, stats_req);4393		break;4394 4395	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:4396		htt_print_tx_selfgen_ac_err_stats_tlv(tag_buf, stats_req);4397		break;4398 4399	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:4400		htt_print_tx_selfgen_cmn_stats_tlv(tag_buf, stats_req);4401		break;4402 4403	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:4404		htt_print_tx_selfgen_ac_stats_tlv(tag_buf, stats_req);4405		break;4406 4407	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:4408		htt_print_tx_selfgen_ax_stats_tlv(tag_buf, stats_req);4409		break;4410 4411	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:4412		htt_print_tx_selfgen_ax_err_stats_tlv(tag_buf, stats_req);4413		break;4414 4415	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:4416		htt_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf, stats_req);4417		break;4418 4419	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:4420		htt_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf, stats_req);4421		break;4422 4423	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:4424		htt_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf, stats_req);4425		break;4426 4427	case HTT_STATS_HW_INTR_MISC_TAG:4428		htt_print_hw_stats_intr_misc_tlv(tag_buf, stats_req);4429		break;4430 4431	case HTT_STATS_HW_WD_TIMEOUT_TAG:4432		htt_print_hw_stats_wd_timeout_tlv(tag_buf, stats_req);4433		break;4434 4435	case HTT_STATS_HW_PDEV_ERRS_TAG:4436		htt_print_hw_stats_pdev_errs_tlv(tag_buf, stats_req);4437		break;4438 4439	case HTT_STATS_COUNTER_NAME_TAG:4440		htt_print_counter_tlv(tag_buf, stats_req);4441		break;4442 4443	case HTT_STATS_TX_TID_DETAILS_TAG:4444		htt_print_tx_tid_stats_tlv(tag_buf, stats_req);4445		break;4446 4447	case HTT_STATS_TX_TID_DETAILS_V1_TAG:4448		htt_print_tx_tid_stats_v1_tlv(tag_buf, stats_req);4449		break;4450 4451	case HTT_STATS_RX_TID_DETAILS_TAG:4452		htt_print_rx_tid_stats_tlv(tag_buf, stats_req);4453		break;4454 4455	case HTT_STATS_PEER_STATS_CMN_TAG:4456		htt_print_peer_stats_cmn_tlv(tag_buf, stats_req);4457		break;4458 4459	case HTT_STATS_PEER_DETAILS_TAG:4460		htt_print_peer_details_tlv(tag_buf, stats_req);4461		break;4462 4463	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:4464		htt_print_msdu_flow_stats_tlv(tag_buf, stats_req);4465		break;4466 4467	case HTT_STATS_PEER_TX_RATE_STATS_TAG:4468		htt_print_tx_peer_rate_stats_tlv(tag_buf, stats_req);4469		break;4470 4471	case HTT_STATS_PEER_RX_RATE_STATS_TAG:4472		htt_print_rx_peer_rate_stats_tlv(tag_buf, stats_req);4473		break;4474 4475	case HTT_STATS_TX_DE_COMPL_STATS_TAG:4476		htt_print_tx_de_compl_stats_tlv(tag_buf, stats_req);4477		break;4478 4479	case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG:4480	case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG:4481	case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG:4482		htt_print_pdev_cca_stats_hist_tlv(tag_buf, stats_req);4483		break;4484 4485	case HTT_STATS_PDEV_CCA_COUNTERS_TAG:4486		htt_print_pdev_stats_cca_counters_tlv(tag_buf, stats_req);4487		break;4488 4489	case HTT_STATS_WHAL_TX_TAG:4490		htt_print_hw_stats_whal_tx_tlv(tag_buf, stats_req);4491		break;4492 4493	case HTT_STATS_PDEV_TWT_SESSIONS_TAG:4494		htt_print_pdev_stats_twt_sessions_tlv(tag_buf, stats_req);4495		break;4496 4497	case HTT_STATS_PDEV_TWT_SESSION_TAG:4498		htt_print_pdev_stats_twt_session_tlv(tag_buf, stats_req);4499		break;4500 4501	case HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG:4502		htt_print_sched_txq_sched_order_su_tlv_v(tag_buf, len, stats_req);4503		break;4504 4505	case HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG:4506		htt_print_sched_txq_sched_ineligibility_tlv_v(tag_buf, len, stats_req);4507		break;4508 4509	case HTT_STATS_PDEV_OBSS_PD_TAG:4510		htt_print_pdev_obss_pd_stats_tlv_v(tag_buf, stats_req);4511		break;4512	case HTT_STATS_RING_BACKPRESSURE_STATS_TAG:4513		htt_print_backpressure_stats_tlv_v(tag_buf, user_data);4514		break;4515	case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG:4516		htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, stats_req);4517		break;4518	case HTT_STATS_TXBF_OFDMA_NDPA_STATS_TAG:4519		htt_print_txbf_ofdma_ndpa_stats_tlv(tag_buf, stats_req);4520		break;4521	case HTT_STATS_TXBF_OFDMA_NDP_STATS_TAG:4522		htt_print_txbf_ofdma_ndp_stats_tlv(tag_buf, stats_req);4523		break;4524	case HTT_STATS_TXBF_OFDMA_BRP_STATS_TAG:4525		htt_print_txbf_ofdma_brp_stats_tlv(tag_buf, stats_req);4526		break;4527	case HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG:4528		htt_print_txbf_ofdma_steer_stats_tlv(tag_buf, stats_req);4529		break;4530	case HTT_STATS_PHY_COUNTERS_TAG:4531		htt_print_phy_counters_tlv(tag_buf, stats_req);4532		break;4533	case HTT_STATS_PHY_STATS_TAG:4534		htt_print_phy_stats_tlv(tag_buf, stats_req);4535		break;4536	case HTT_STATS_PHY_RESET_COUNTERS_TAG:4537		htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req);4538		break;4539	case HTT_STATS_PHY_RESET_STATS_TAG:4540		htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req);4541		break;4542	case HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:4543		htt_print_peer_ctrl_path_txrx_stats_tlv(tag_buf, stats_req);4544		break;4545	default:4546		break;4547	}4548 4549	return 0;4550}4551 4552void ath11k_debugfs_htt_ext_stats_handler(struct ath11k_base *ab,4553					  struct sk_buff *skb)4554{4555	struct ath11k_htt_extd_stats_msg *msg;4556	struct debug_htt_stats_req *stats_req;4557	struct ath11k *ar;4558	u32 len;4559	u64 cookie;4560	int ret;4561	bool send_completion = false;4562	u8 pdev_id;4563 4564	msg = (struct ath11k_htt_extd_stats_msg *)skb->data;4565	cookie = msg->cookie;4566 4567	if (FIELD_GET(HTT_STATS_COOKIE_MSB, cookie) != HTT_STATS_MAGIC_VALUE) {4568		ath11k_warn(ab, "received invalid htt ext stats event\n");4569		return;4570	}4571 4572	pdev_id = FIELD_GET(HTT_STATS_COOKIE_LSB, cookie);4573	rcu_read_lock();4574	ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id);4575	rcu_read_unlock();4576	if (!ar) {4577		ath11k_warn(ab, "failed to get ar for pdev_id %d\n", pdev_id);4578		return;4579	}4580 4581	stats_req = ar->debug.htt_stats.stats_req;4582	if (!stats_req)4583		return;4584 4585	spin_lock_bh(&ar->debug.htt_stats.lock);4586 4587	stats_req->done = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_DONE, msg->info1);4588	if (stats_req->done)4589		send_completion = true;4590 4591	spin_unlock_bh(&ar->debug.htt_stats.lock);4592 4593	len = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_LENGTH, msg->info1);4594	ret = ath11k_dp_htt_tlv_iter(ab, msg->data, len,4595				     ath11k_dbg_htt_ext_stats_parse,4596				     stats_req);4597	if (ret)4598		ath11k_warn(ab, "Failed to parse tlv %d\n", ret);4599 4600	if (send_completion)4601		complete(&stats_req->cmpln);4602}4603 4604static ssize_t ath11k_read_htt_stats_type(struct file *file,4605					  char __user *user_buf,4606					  size_t count, loff_t *ppos)4607{4608	struct ath11k *ar = file->private_data;4609	char buf[32];4610	size_t len;4611 4612	len = scnprintf(buf, sizeof(buf), "%u\n", ar->debug.htt_stats.type);4613 4614	return simple_read_from_buffer(user_buf, count, ppos, buf, len);4615}4616 4617static ssize_t ath11k_write_htt_stats_type(struct file *file,4618					   const char __user *user_buf,4619					   size_t count, loff_t *ppos)4620{4621	struct ath11k *ar = file->private_data;4622	u8 type;4623	int ret;4624 4625	ret = kstrtou8_from_user(user_buf, count, 0, &type);4626	if (ret)4627		return ret;4628 4629	if (type >= ATH11K_DBG_HTT_NUM_EXT_STATS)4630		return -E2BIG;4631 4632	if (type == ATH11K_DBG_HTT_EXT_STATS_RESET)4633		return -EPERM;4634 4635	ar->debug.htt_stats.type = type;4636 4637	ret = count;4638 4639	return ret;4640}4641 4642static const struct file_operations fops_htt_stats_type = {4643	.read = ath11k_read_htt_stats_type,4644	.write = ath11k_write_htt_stats_type,4645	.open = simple_open,4646	.owner = THIS_MODULE,4647	.llseek = default_llseek,4648};4649 4650static int ath11k_prep_htt_stats_cfg_params(struct ath11k *ar, u8 type,4651					    const u8 *mac_addr,4652					    struct htt_ext_stats_cfg_params *cfg_params)4653{4654	if (!cfg_params)4655		return -EINVAL;4656 4657	switch (type) {4658	case ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_HWQ:4659	case ATH11K_DBG_HTT_EXT_STATS_TX_MU_HWQ:4660		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_HWQS;4661		break;4662	case ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED:4663		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_TXQS;4664		break;4665	case ATH11K_DBG_HTT_EXT_STATS_TQM_CMDQ:4666		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_CMDQS;4667		break;4668	case ATH11K_DBG_HTT_EXT_STATS_PEER_INFO:4669		cfg_params->cfg0 = HTT_STAT_PEER_INFO_MAC_ADDR;4670		cfg_params->cfg0 |= FIELD_PREP(GENMASK(15, 1),4671					HTT_PEER_STATS_REQ_MODE_FLUSH_TQM);4672		cfg_params->cfg1 = HTT_STAT_DEFAULT_PEER_REQ_TYPE;4673		cfg_params->cfg2 |= FIELD_PREP(GENMASK(7, 0), mac_addr[0]);4674		cfg_params->cfg2 |= FIELD_PREP(GENMASK(15, 8), mac_addr[1]);4675		cfg_params->cfg2 |= FIELD_PREP(GENMASK(23, 16), mac_addr[2]);4676		cfg_params->cfg2 |= FIELD_PREP(GENMASK(31, 24), mac_addr[3]);4677		cfg_params->cfg3 |= FIELD_PREP(GENMASK(7, 0), mac_addr[4]);4678		cfg_params->cfg3 |= FIELD_PREP(GENMASK(15, 8), mac_addr[5]);4679		break;4680	case ATH11K_DBG_HTT_EXT_STATS_RING_IF_INFO:4681	case ATH11K_DBG_HTT_EXT_STATS_SRNG_INFO:4682		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_RINGS;4683		break;4684	case ATH11K_DBG_HTT_EXT_STATS_ACTIVE_PEERS_LIST:4685		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ACTIVE_PEERS;4686		break;4687	case ATH11K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS:4688		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_CCA_CUMULATIVE;4689		break;4690	case ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO:4691		cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ACTIVE_VDEVS;4692		break;4693	case ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS:4694		cfg_params->cfg0 = HTT_STAT_PEER_INFO_MAC_ADDR;4695		cfg_params->cfg1 |= FIELD_PREP(GENMASK(7, 0), mac_addr[0]);4696		cfg_params->cfg1 |= FIELD_PREP(GENMASK(15, 8), mac_addr[1]);4697		cfg_params->cfg1 |= FIELD_PREP(GENMASK(23, 16), mac_addr[2]);4698		cfg_params->cfg1 |= FIELD_PREP(GENMASK(31, 24), mac_addr[3]);4699		cfg_params->cfg2 |= FIELD_PREP(GENMASK(7, 0), mac_addr[4]);4700		cfg_params->cfg2 |= FIELD_PREP(GENMASK(15, 8), mac_addr[5]);4701		break;4702	default:4703		break;4704	}4705 4706	return 0;4707}4708 4709int ath11k_debugfs_htt_stats_req(struct ath11k *ar)4710{4711	struct debug_htt_stats_req *stats_req = ar->debug.htt_stats.stats_req;4712	u8 type = stats_req->type;4713	u64 cookie = 0;4714	int ret, pdev_id = ar->pdev->pdev_id;4715	struct htt_ext_stats_cfg_params cfg_params = { 0 };4716 4717	init_completion(&stats_req->cmpln);4718 4719	stats_req->done = false;4720	stats_req->pdev_id = pdev_id;4721 4722	cookie = FIELD_PREP(HTT_STATS_COOKIE_MSB, HTT_STATS_MAGIC_VALUE) |4723		 FIELD_PREP(HTT_STATS_COOKIE_LSB, pdev_id);4724 4725	ret = ath11k_prep_htt_stats_cfg_params(ar, type, stats_req->peer_addr,4726					       &cfg_params);4727	if (ret) {4728		ath11k_warn(ar->ab, "failed to set htt stats cfg params: %d\n", ret);4729		return ret;4730	}4731 4732	ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar, type, &cfg_params, cookie);4733	if (ret) {4734		ath11k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);4735		return ret;4736	}4737 4738	while (!wait_for_completion_timeout(&stats_req->cmpln, 3 * HZ)) {4739		spin_lock_bh(&ar->debug.htt_stats.lock);4740		if (!stats_req->done) {4741			stats_req->done = true;4742			spin_unlock_bh(&ar->debug.htt_stats.lock);4743			ath11k_warn(ar->ab, "stats request timed out\n");4744			return -ETIMEDOUT;4745		}4746		spin_unlock_bh(&ar->debug.htt_stats.lock);4747	}4748 4749	return 0;4750}4751 4752static int ath11k_open_htt_stats(struct inode *inode, struct file *file)4753{4754	struct ath11k *ar = inode->i_private;4755	struct debug_htt_stats_req *stats_req;4756	u8 type = ar->debug.htt_stats.type;4757	int ret;4758 4759	if (type == ATH11K_DBG_HTT_EXT_STATS_RESET ||4760	    type == ATH11K_DBG_HTT_EXT_STATS_PEER_INFO ||4761	    type == ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS)4762		return -EPERM;4763 4764	mutex_lock(&ar->conf_mutex);4765 4766	if (ar->state != ATH11K_STATE_ON) {4767		ret = -ENETDOWN;4768		goto err_unlock;4769	}4770 4771	if (ar->debug.htt_stats.stats_req) {4772		ret = -EAGAIN;4773		goto err_unlock;4774	}4775 4776	stats_req = vzalloc(sizeof(*stats_req) + ATH11K_HTT_STATS_BUF_SIZE);4777	if (!stats_req) {4778		ret = -ENOMEM;4779		goto err_unlock;4780	}4781 4782	ar->debug.htt_stats.stats_req = stats_req;4783	stats_req->type = type;4784 4785	ret = ath11k_debugfs_htt_stats_req(ar);4786	if (ret < 0)4787		goto out;4788 4789	file->private_data = stats_req;4790 4791	mutex_unlock(&ar->conf_mutex);4792 4793	return 0;4794out:4795	vfree(stats_req);4796	ar->debug.htt_stats.stats_req = NULL;4797err_unlock:4798	mutex_unlock(&ar->conf_mutex);4799 4800	return ret;4801}4802 4803static int ath11k_release_htt_stats(struct inode *inode, struct file *file)4804{4805	struct ath11k *ar = inode->i_private;4806 4807	mutex_lock(&ar->conf_mutex);4808	vfree(file->private_data);4809	ar->debug.htt_stats.stats_req = NULL;4810	mutex_unlock(&ar->conf_mutex);4811 4812	return 0;4813}4814 4815static ssize_t ath11k_read_htt_stats(struct file *file,4816				     char __user *user_buf,4817				     size_t count, loff_t *ppos)4818{4819	struct debug_htt_stats_req *stats_req = file->private_data;4820	char *buf;4821	u32 length = 0;4822 4823	buf = stats_req->buf;4824	length = min_t(u32, stats_req->buf_len, ATH11K_HTT_STATS_BUF_SIZE);4825	return simple_read_from_buffer(user_buf, count, ppos, buf, length);4826}4827 4828static const struct file_operations fops_dump_htt_stats = {4829	.open = ath11k_open_htt_stats,4830	.release = ath11k_release_htt_stats,4831	.read = ath11k_read_htt_stats,4832	.owner = THIS_MODULE,4833	.llseek = default_llseek,4834};4835 4836static ssize_t ath11k_read_htt_stats_reset(struct file *file,4837					   char __user *user_buf,4838					   size_t count, loff_t *ppos)4839{4840	struct ath11k *ar = file->private_data;4841	char buf[32];4842	size_t len;4843 4844	len = scnprintf(buf, sizeof(buf), "%u\n", ar->debug.htt_stats.reset);4845 4846	return simple_read_from_buffer(user_buf, count, ppos, buf, len);4847}4848 4849static ssize_t ath11k_write_htt_stats_reset(struct file *file,4850					    const char __user *user_buf,4851					    size_t count, loff_t *ppos)4852{4853	struct ath11k *ar = file->private_data;4854	u8 type;4855	struct htt_ext_stats_cfg_params cfg_params = { 0 };4856	int ret;4857 4858	ret = kstrtou8_from_user(user_buf, count, 0, &type);4859	if (ret)4860		return ret;4861 4862	if (type >= ATH11K_DBG_HTT_NUM_EXT_STATS ||4863	    type == ATH11K_DBG_HTT_EXT_STATS_RESET)4864		return -E2BIG;4865 4866	mutex_lock(&ar->conf_mutex);4867	cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET;4868	cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type);4869	ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar,4870						 ATH11K_DBG_HTT_EXT_STATS_RESET,4871						 &cfg_params,4872						 0ULL);4873	if (ret) {4874		ath11k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);4875		mutex_unlock(&ar->conf_mutex);4876		return ret;4877	}4878 4879	ar->debug.htt_stats.reset = type;4880	mutex_unlock(&ar->conf_mutex);4881 4882	ret = count;4883 4884	return ret;4885}4886 4887static const struct file_operations fops_htt_stats_reset = {4888	.read = ath11k_read_htt_stats_reset,4889	.write = ath11k_write_htt_stats_reset,4890	.open = simple_open,4891	.owner = THIS_MODULE,4892	.llseek = default_llseek,4893};4894 4895void ath11k_debugfs_htt_stats_init(struct ath11k *ar)4896{4897	spin_lock_init(&ar->debug.htt_stats.lock);4898	debugfs_create_file("htt_stats_type", 0600, ar->debug.debugfs_pdev,4899			    ar, &fops_htt_stats_type);4900	debugfs_create_file("htt_stats", 0400, ar->debug.debugfs_pdev,4901			    ar, &fops_dump_htt_stats);4902	debugfs_create_file("htt_stats_reset", 0600, ar->debug.debugfs_pdev,4903			    ar, &fops_htt_stats_reset);4904}4905