1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 5 */ 6 7 #include <linux/vmalloc.h> 8 #include "core.h" 9 #include "debug.h" 10 #include "debugfs_htt_stats.h" 11 #include "dp_tx.h" 12 #include "dp_rx.h" 13 14 static u32 15 print_array_to_buf_index(u8 *buf, u32 offset, const char *header, u32 stats_index, 16 const __le32 *array, u32 array_len, const char *footer) 17 { 18 int index = 0; 19 u8 i; 20 21 if (header) { 22 index += scnprintf(buf + offset, 23 ATH12K_HTT_STATS_BUF_SIZE - offset, 24 "%s = ", header); 25 } 26 for (i = 0; i < array_len; i++) { 27 index += scnprintf(buf + offset + index, 28 (ATH12K_HTT_STATS_BUF_SIZE - offset) - index, 29 " %u:%u,", stats_index++, le32_to_cpu(array[i])); 30 } 31 /* To overwrite the last trailing comma */ 32 if (array_len > 0) { 33 index--; 34 *(buf + offset + index) = '\0'; 35 } 36 37 if (footer) { 38 index += scnprintf(buf + offset + index, 39 (ATH12K_HTT_STATS_BUF_SIZE - offset) - index, 40 "%s", footer); 41 } 42 return index; 43 } 44 45 static u32 46 print_array_to_buf(u8 *buf, u32 offset, const char *header, 47 const __le32 *array, u32 array_len, const char *footer) 48 { 49 return print_array_to_buf_index(buf, offset, header, 0, array, array_len, 50 footer); 51 } 52 53 static u32 54 print_array_to_buf_s8(u8 *buf, u32 offset, const char *header, u32 stats_index, 55 const s8 *array, u32 array_len, const char *footer) 56 { 57 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 58 int index = 0; 59 u8 i; 60 61 if (header) 62 index += scnprintf(buf + offset, buf_len - offset, "%s = ", header); 63 64 for (i = 0; i < array_len; i++) { 65 index += scnprintf(buf + offset + index, (buf_len - offset) - index, 66 " %u:%d,", stats_index++, array[i]); 67 } 68 69 index--; 70 if ((offset + index) < buf_len) 71 buf[offset + index] = '\0'; 72 73 if (footer) { 74 index += scnprintf(buf + offset + index, (buf_len - offset) - index, 75 "%s", footer); 76 } 77 78 return index; 79 } 80 81 static const char *ath12k_htt_ax_tx_rx_ru_size_to_str(u8 ru_size) 82 { 83 switch (ru_size) { 84 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_26: 85 return "26"; 86 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_52: 87 return "52"; 88 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_106: 89 return "106"; 90 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_242: 91 return "242"; 92 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_484: 93 return "484"; 94 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_996: 95 return "996"; 96 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_996x2: 97 return "996x2"; 98 default: 99 return "unknown"; 100 } 101 } 102 103 static const char *ath12k_htt_be_tx_rx_ru_size_to_str(u8 ru_size) 104 { 105 switch (ru_size) { 106 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_26: 107 return "26"; 108 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_52: 109 return "52"; 110 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_52_26: 111 return "52+26"; 112 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_106: 113 return "106"; 114 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_106_26: 115 return "106+26"; 116 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_242: 117 return "242"; 118 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_484: 119 return "484"; 120 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_484_242: 121 return "484+242"; 122 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996: 123 return "996"; 124 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996_484: 125 return "996+484"; 126 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996_484_242: 127 return "996+484+242"; 128 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x2: 129 return "996x2"; 130 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x2_484: 131 return "996x2+484"; 132 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x3: 133 return "996x3"; 134 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x3_484: 135 return "996x3+484"; 136 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x4: 137 return "996x4"; 138 default: 139 return "unknown"; 140 } 141 } 142 143 static const char* 144 ath12k_tx_ru_size_to_str(enum ath12k_htt_stats_ru_type ru_type, u8 ru_size) 145 { 146 if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY) 147 return ath12k_htt_ax_tx_rx_ru_size_to_str(ru_size); 148 else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU) 149 return ath12k_htt_be_tx_rx_ru_size_to_str(ru_size); 150 else 151 return "unknown"; 152 } 153 154 static void 155 htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf, u16 tag_len, 156 struct debug_htt_stats_req *stats_req) 157 { 158 const struct ath12k_htt_tx_pdev_stats_cmn_tlv *htt_stats_buf = tag_buf; 159 u8 *buf = stats_req->buf; 160 u32 len = stats_req->buf_len; 161 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 162 u32 mac_id_word; 163 164 if (tag_len < sizeof(*htt_stats_buf)) 165 return; 166 167 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word); 168 169 len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_CMN_TLV:\n"); 170 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 171 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 172 len += scnprintf(buf + len, buf_len - len, "comp_delivered = %u\n", 173 le32_to_cpu(htt_stats_buf->comp_delivered)); 174 len += scnprintf(buf + len, buf_len - len, "self_triggers = %u\n", 175 le32_to_cpu(htt_stats_buf->self_triggers)); 176 len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n", 177 le32_to_cpu(htt_stats_buf->hw_queued)); 178 len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n", 179 le32_to_cpu(htt_stats_buf->hw_reaped)); 180 len += scnprintf(buf + len, buf_len - len, "underrun = %u\n", 181 le32_to_cpu(htt_stats_buf->underrun)); 182 len += scnprintf(buf + len, buf_len - len, "hw_paused = %u\n", 183 le32_to_cpu(htt_stats_buf->hw_paused)); 184 len += scnprintf(buf + len, buf_len - len, "hw_flush = %u\n", 185 le32_to_cpu(htt_stats_buf->hw_flush)); 186 len += scnprintf(buf + len, buf_len - len, "hw_filt = %u\n", 187 le32_to_cpu(htt_stats_buf->hw_filt)); 188 len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n", 189 le32_to_cpu(htt_stats_buf->tx_abort)); 190 len += scnprintf(buf + len, buf_len - len, "ppdu_ok = %u\n", 191 le32_to_cpu(htt_stats_buf->ppdu_ok)); 192 len += scnprintf(buf + len, buf_len - len, "mpdu_requeued = %u\n", 193 le32_to_cpu(htt_stats_buf->mpdu_requed)); 194 len += scnprintf(buf + len, buf_len - len, "tx_xretry = %u\n", 195 le32_to_cpu(htt_stats_buf->tx_xretry)); 196 len += scnprintf(buf + len, buf_len - len, "data_rc = %u\n", 197 le32_to_cpu(htt_stats_buf->data_rc)); 198 len += scnprintf(buf + len, buf_len - len, "mpdu_dropped_xretry = %u\n", 199 le32_to_cpu(htt_stats_buf->mpdu_dropped_xretry)); 200 len += scnprintf(buf + len, buf_len - len, "illegal_rate_phy_err = %u\n", 201 le32_to_cpu(htt_stats_buf->illgl_rate_phy_err)); 202 len += scnprintf(buf + len, buf_len - len, "cont_xretry = %u\n", 203 le32_to_cpu(htt_stats_buf->cont_xretry)); 204 len += scnprintf(buf + len, buf_len - len, "tx_timeout = %u\n", 205 le32_to_cpu(htt_stats_buf->tx_timeout)); 206 len += scnprintf(buf + len, buf_len - len, "tx_time_dur_data = %u\n", 207 le32_to_cpu(htt_stats_buf->tx_time_dur_data)); 208 len += scnprintf(buf + len, buf_len - len, "pdev_resets = %u\n", 209 le32_to_cpu(htt_stats_buf->pdev_resets)); 210 len += scnprintf(buf + len, buf_len - len, "phy_underrun = %u\n", 211 le32_to_cpu(htt_stats_buf->phy_underrun)); 212 len += scnprintf(buf + len, buf_len - len, "txop_ovf = %u\n", 213 le32_to_cpu(htt_stats_buf->txop_ovf)); 214 len += scnprintf(buf + len, buf_len - len, "seq_posted = %u\n", 215 le32_to_cpu(htt_stats_buf->seq_posted)); 216 len += scnprintf(buf + len, buf_len - len, "seq_failed_queueing = %u\n", 217 le32_to_cpu(htt_stats_buf->seq_failed_queueing)); 218 len += scnprintf(buf + len, buf_len - len, "seq_completed = %u\n", 219 le32_to_cpu(htt_stats_buf->seq_completed)); 220 len += scnprintf(buf + len, buf_len - len, "seq_restarted = %u\n", 221 le32_to_cpu(htt_stats_buf->seq_restarted)); 222 len += scnprintf(buf + len, buf_len - len, "seq_txop_repost_stop = %u\n", 223 le32_to_cpu(htt_stats_buf->seq_txop_repost_stop)); 224 len += scnprintf(buf + len, buf_len - len, "next_seq_cancel = %u\n", 225 le32_to_cpu(htt_stats_buf->next_seq_cancel)); 226 len += scnprintf(buf + len, buf_len - len, "dl_mu_mimo_seq_posted = %u\n", 227 le32_to_cpu(htt_stats_buf->mu_seq_posted)); 228 len += scnprintf(buf + len, buf_len - len, "dl_mu_ofdma_seq_posted = %u\n", 229 le32_to_cpu(htt_stats_buf->mu_ofdma_seq_posted)); 230 len += scnprintf(buf + len, buf_len - len, "ul_mu_mimo_seq_posted = %u\n", 231 le32_to_cpu(htt_stats_buf->ul_mumimo_seq_posted)); 232 len += scnprintf(buf + len, buf_len - len, "ul_mu_ofdma_seq_posted = %u\n", 233 le32_to_cpu(htt_stats_buf->ul_ofdma_seq_posted)); 234 len += scnprintf(buf + len, buf_len - len, "mu_mimo_peer_blacklisted = %u\n", 235 le32_to_cpu(htt_stats_buf->num_mu_peer_blacklisted)); 236 len += scnprintf(buf + len, buf_len - len, "seq_qdepth_repost_stop = %u\n", 237 le32_to_cpu(htt_stats_buf->seq_qdepth_repost_stop)); 238 len += scnprintf(buf + len, buf_len - len, "seq_min_msdu_repost_stop = %u\n", 239 le32_to_cpu(htt_stats_buf->seq_min_msdu_repost_stop)); 240 len += scnprintf(buf + len, buf_len - len, "mu_seq_min_msdu_repost_stop = %u\n", 241 le32_to_cpu(htt_stats_buf->mu_seq_min_msdu_repost_stop)); 242 len += scnprintf(buf + len, buf_len - len, "seq_switch_hw_paused = %u\n", 243 le32_to_cpu(htt_stats_buf->seq_switch_hw_paused)); 244 len += scnprintf(buf + len, buf_len - len, "next_seq_posted_dsr = %u\n", 245 le32_to_cpu(htt_stats_buf->next_seq_posted_dsr)); 246 len += scnprintf(buf + len, buf_len - len, "seq_posted_isr = %u\n", 247 le32_to_cpu(htt_stats_buf->seq_posted_isr)); 248 len += scnprintf(buf + len, buf_len - len, "seq_ctrl_cached = %u\n", 249 le32_to_cpu(htt_stats_buf->seq_ctrl_cached)); 250 len += scnprintf(buf + len, buf_len - len, "mpdu_count_tqm = %u\n", 251 le32_to_cpu(htt_stats_buf->mpdu_count_tqm)); 252 len += scnprintf(buf + len, buf_len - len, "msdu_count_tqm = %u\n", 253 le32_to_cpu(htt_stats_buf->msdu_count_tqm)); 254 len += scnprintf(buf + len, buf_len - len, "mpdu_removed_tqm = %u\n", 255 le32_to_cpu(htt_stats_buf->mpdu_removed_tqm)); 256 len += scnprintf(buf + len, buf_len - len, "msdu_removed_tqm = %u\n", 257 le32_to_cpu(htt_stats_buf->msdu_removed_tqm)); 258 len += scnprintf(buf + len, buf_len - len, "remove_mpdus_max_retries = %u\n", 259 le32_to_cpu(htt_stats_buf->remove_mpdus_max_retries)); 260 len += scnprintf(buf + len, buf_len - len, "mpdus_sw_flush = %u\n", 261 le32_to_cpu(htt_stats_buf->mpdus_sw_flush)); 262 len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n", 263 le32_to_cpu(htt_stats_buf->mpdus_hw_filter)); 264 len += scnprintf(buf + len, buf_len - len, "mpdus_truncated = %u\n", 265 le32_to_cpu(htt_stats_buf->mpdus_truncated)); 266 len += scnprintf(buf + len, buf_len - len, "mpdus_ack_failed = %u\n", 267 le32_to_cpu(htt_stats_buf->mpdus_ack_failed)); 268 len += scnprintf(buf + len, buf_len - len, "mpdus_expired = %u\n", 269 le32_to_cpu(htt_stats_buf->mpdus_expired)); 270 len += scnprintf(buf + len, buf_len - len, "mpdus_seq_hw_retry = %u\n", 271 le32_to_cpu(htt_stats_buf->mpdus_seq_hw_retry)); 272 len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n", 273 le32_to_cpu(htt_stats_buf->ack_tlv_proc)); 274 len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt_valid = %u\n", 275 le32_to_cpu(htt_stats_buf->coex_abort_mpdu_cnt_valid)); 276 len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt = %u\n", 277 le32_to_cpu(htt_stats_buf->coex_abort_mpdu_cnt)); 278 len += scnprintf(buf + len, buf_len - len, "num_total_ppdus_tried_ota = %u\n", 279 le32_to_cpu(htt_stats_buf->num_total_ppdus_tried_ota)); 280 len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_tried_ota = %u\n", 281 le32_to_cpu(htt_stats_buf->num_data_ppdus_tried_ota)); 282 len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_enqued = %u\n", 283 le32_to_cpu(htt_stats_buf->local_ctrl_mgmt_enqued)); 284 len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_freed = %u\n", 285 le32_to_cpu(htt_stats_buf->local_ctrl_mgmt_freed)); 286 len += scnprintf(buf + len, buf_len - len, "local_data_enqued = %u\n", 287 le32_to_cpu(htt_stats_buf->local_data_enqued)); 288 len += scnprintf(buf + len, buf_len - len, "local_data_freed = %u\n", 289 le32_to_cpu(htt_stats_buf->local_data_freed)); 290 len += scnprintf(buf + len, buf_len - len, "mpdu_tried = %u\n", 291 le32_to_cpu(htt_stats_buf->mpdu_tried)); 292 len += scnprintf(buf + len, buf_len - len, "isr_wait_seq_posted = %u\n", 293 le32_to_cpu(htt_stats_buf->isr_wait_seq_posted)); 294 len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_low = %u\n", 295 le32_to_cpu(htt_stats_buf->tx_active_dur_us_low)); 296 len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_high = %u\n", 297 le32_to_cpu(htt_stats_buf->tx_active_dur_us_high)); 298 len += scnprintf(buf + len, buf_len - len, "fes_offsets_err_cnt = %u\n\n", 299 le32_to_cpu(htt_stats_buf->fes_offsets_err_cnt)); 300 301 stats_req->buf_len = len; 302 } 303 304 static void 305 htt_print_tx_pdev_stats_urrn_tlv(const void *tag_buf, 306 u16 tag_len, 307 struct debug_htt_stats_req *stats_req) 308 { 309 const struct ath12k_htt_tx_pdev_stats_urrn_tlv *htt_stats_buf = tag_buf; 310 u8 *buf = stats_req->buf; 311 u32 len = stats_req->buf_len; 312 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 313 u16 num_elems = min_t(u16, (tag_len >> 2), 314 HTT_TX_PDEV_MAX_URRN_STATS); 315 316 len += scnprintf(buf + len, buf_len - len, 317 "HTT_TX_PDEV_STATS_URRN_TLV:\n"); 318 319 len += print_array_to_buf(buf, len, "urrn_stats", htt_stats_buf->urrn_stats, 320 num_elems, "\n\n"); 321 322 stats_req->buf_len = len; 323 } 324 325 static void 326 htt_print_tx_pdev_stats_flush_tlv(const void *tag_buf, 327 u16 tag_len, 328 struct debug_htt_stats_req *stats_req) 329 { 330 const struct ath12k_htt_tx_pdev_stats_flush_tlv *htt_stats_buf = tag_buf; 331 u8 *buf = stats_req->buf; 332 u32 len = stats_req->buf_len; 333 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 334 u16 num_elems = min_t(u16, (tag_len >> 2), 335 ATH12K_HTT_TX_PDEV_MAX_FLUSH_REASON_STATS); 336 337 len += scnprintf(buf + len, buf_len - len, 338 "HTT_TX_PDEV_STATS_FLUSH_TLV:\n"); 339 340 len += print_array_to_buf(buf, len, "flush_errs", htt_stats_buf->flush_errs, 341 num_elems, "\n\n"); 342 343 stats_req->buf_len = len; 344 } 345 346 static void 347 htt_print_tx_pdev_stats_sifs_tlv(const void *tag_buf, 348 u16 tag_len, 349 struct debug_htt_stats_req *stats_req) 350 { 351 const struct ath12k_htt_tx_pdev_stats_sifs_tlv *htt_stats_buf = tag_buf; 352 u8 *buf = stats_req->buf; 353 u32 len = stats_req->buf_len; 354 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 355 u16 num_elems = min_t(u16, (tag_len >> 2), 356 ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_STATS); 357 358 len += scnprintf(buf + len, buf_len - len, 359 "HTT_TX_PDEV_STATS_SIFS_TLV:\n"); 360 361 len += print_array_to_buf(buf, len, "sifs_status", htt_stats_buf->sifs_status, 362 num_elems, "\n\n"); 363 364 stats_req->buf_len = len; 365 } 366 367 static void 368 htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, u16 tag_len, 369 struct debug_htt_stats_req *stats_req) 370 { 371 const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv *htt_stats_buf = tag_buf; 372 char *mode; 373 u8 j, hw_mode, i, str_buf_len; 374 u8 *buf = stats_req->buf; 375 u32 len = stats_req->buf_len; 376 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 377 u32 stats_value; 378 u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; 379 u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; 380 char str_buf[ATH12K_HTT_MAX_STRING_LEN]; 381 382 if (tag_len < sizeof(*htt_stats_buf)) 383 return; 384 385 hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); 386 387 switch (hw_mode) { 388 case ATH12K_HTT_STATS_HWMODE_AC: 389 len += scnprintf(buf + len, buf_len - len, 390 "HTT_TX_PDEV_AC_MU_PPDU_DISTRIBUTION_STATS:\n"); 391 mode = "ac"; 392 break; 393 case ATH12K_HTT_STATS_HWMODE_AX: 394 len += scnprintf(buf + len, buf_len - len, 395 "HTT_TX_PDEV_AX_MU_PPDU_DISTRIBUTION_STATS:\n"); 396 mode = "ax"; 397 break; 398 case ATH12K_HTT_STATS_HWMODE_BE: 399 len += scnprintf(buf + len, buf_len - len, 400 "HTT_TX_PDEV_BE_MU_PPDU_DISTRIBUTION_STATS:\n"); 401 mode = "be"; 402 break; 403 default: 404 return; 405 } 406 407 for (i = 0; i < ATH12K_HTT_STATS_NUM_NR_BINS ; i++) { 408 len += scnprintf(buf + len, buf_len - len, 409 "%s_mu_mimo_num_seq_posted_nr%u = %u\n", mode, 410 ((i + 1) * 4), htt_stats_buf->num_seq_posted[i]); 411 str_buf_len = 0; 412 memset(str_buf, 0x0, sizeof(str_buf)); 413 for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) { 414 stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_posted_per_burst 415 [i * max_ppdu + j]); 416 str_buf_len += scnprintf(&str_buf[str_buf_len], 417 ATH12K_HTT_MAX_STRING_LEN - str_buf_len, 418 " %u:%u,", j, stats_value); 419 } 420 /* To overwrite the last trailing comma */ 421 str_buf[str_buf_len - 1] = '\0'; 422 len += scnprintf(buf + len, buf_len - len, 423 "%s_mu_mimo_num_ppdu_posted_per_burst_nr%u = %s\n", 424 mode, ((i + 1) * 4), str_buf); 425 str_buf_len = 0; 426 memset(str_buf, 0x0, sizeof(str_buf)); 427 for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) { 428 stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_cmpl_per_burst 429 [i * max_ppdu + j]); 430 str_buf_len += scnprintf(&str_buf[str_buf_len], 431 ATH12K_HTT_MAX_STRING_LEN - str_buf_len, 432 " %u:%u,", j, stats_value); 433 } 434 /* To overwrite the last trailing comma */ 435 str_buf[str_buf_len - 1] = '\0'; 436 len += scnprintf(buf + len, buf_len - len, 437 "%s_mu_mimo_num_ppdu_completed_per_burst_nr%u = %s\n", 438 mode, ((i + 1) * 4), str_buf); 439 str_buf_len = 0; 440 memset(str_buf, 0x0, sizeof(str_buf)); 441 for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS ; j++) { 442 stats_value = le32_to_cpu(htt_stats_buf->num_seq_term_status 443 [i * max_sched + j]); 444 str_buf_len += scnprintf(&str_buf[str_buf_len], 445 ATH12K_HTT_MAX_STRING_LEN - str_buf_len, 446 " %u:%u,", j, stats_value); 447 } 448 /* To overwrite the last trailing comma */ 449 str_buf[str_buf_len - 1] = '\0'; 450 len += scnprintf(buf + len, buf_len - len, 451 "%s_mu_mimo_num_seq_term_status_nr%u = %s\n\n", 452 mode, ((i + 1) * 4), str_buf); 453 } 454 455 stats_req->buf_len = len; 456 } 457 458 static void 459 htt_print_tx_pdev_stats_sifs_hist_tlv(const void *tag_buf, 460 u16 tag_len, 461 struct debug_htt_stats_req *stats_req) 462 { 463 const struct ath12k_htt_tx_pdev_stats_sifs_hist_tlv *htt_stats_buf = tag_buf; 464 u8 *buf = stats_req->buf; 465 u32 len = stats_req->buf_len; 466 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 467 u16 num_elems = min_t(u16, (tag_len >> 2), 468 ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS); 469 470 len += scnprintf(buf + len, buf_len - len, 471 "HTT_TX_PDEV_STATS_SIFS_HIST_TLV:\n"); 472 473 len += print_array_to_buf(buf, len, "sifs_hist_status", 474 htt_stats_buf->sifs_hist_status, num_elems, "\n\n"); 475 476 stats_req->buf_len = len; 477 } 478 479 static void 480 htt_print_pdev_ctrl_path_tx_stats_tlv(const void *tag_buf, u16 tag_len, 481 struct debug_htt_stats_req *stats_req) 482 { 483 const struct ath12k_htt_pdev_ctrl_path_tx_stats_tlv *htt_stats_buf = tag_buf; 484 u8 *buf = stats_req->buf; 485 u32 len = stats_req->buf_len; 486 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 487 488 if (len < sizeof(*htt_stats_buf)) 489 return; 490 491 len += scnprintf(buf + len, buf_len - len, 492 "HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS:\n"); 493 len += print_array_to_buf(buf, len, "fw_tx_mgmt_subtype", 494 htt_stats_buf->fw_tx_mgmt_subtype, 495 ATH12K_HTT_STATS_SUBTYPE_MAX, "\n\n"); 496 497 stats_req->buf_len = len; 498 } 499 500 static void 501 ath12k_htt_print_stats_tx_sched_cmn_tlv(const void *tag_buf, 502 u16 tag_len, 503 struct debug_htt_stats_req *stats_req) 504 { 505 const struct ath12k_htt_stats_tx_sched_cmn_tlv *htt_stats_buf = tag_buf; 506 u8 *buf = stats_req->buf; 507 u32 len = stats_req->buf_len; 508 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 509 u32 mac_id_word; 510 511 if (tag_len < sizeof(*htt_stats_buf)) 512 return; 513 514 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 515 516 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_TX_SCHED_CMN_TLV:\n"); 517 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 518 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 519 len += scnprintf(buf + len, buf_len - len, "current_timestamp = %u\n\n", 520 le32_to_cpu(htt_stats_buf->current_timestamp)); 521 522 stats_req->buf_len = len; 523 } 524 525 static void 526 ath12k_htt_print_tx_pdev_stats_sched_per_txq_tlv(const void *tag_buf, 527 u16 tag_len, 528 struct debug_htt_stats_req *stats_req) 529 { 530 const struct ath12k_htt_tx_pdev_stats_sched_per_txq_tlv *htt_stats_buf = tag_buf; 531 u8 *buf = stats_req->buf; 532 u32 len = stats_req->buf_len; 533 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 534 u32 mac_id_word; 535 536 if (tag_len < sizeof(*htt_stats_buf)) 537 return; 538 539 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 540 541 len += scnprintf(buf + len, buf_len - len, 542 "HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:\n"); 543 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 544 u32_get_bits(mac_id_word, 545 ATH12K_HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID)); 546 len += scnprintf(buf + len, buf_len - len, "txq_id = %u\n", 547 u32_get_bits(mac_id_word, 548 ATH12K_HTT_TX_PDEV_STATS_SCHED_PER_TXQ_ID)); 549 len += scnprintf(buf + len, buf_len - len, "sched_policy = %u\n", 550 le32_to_cpu(htt_stats_buf->sched_policy)); 551 len += scnprintf(buf + len, buf_len - len, 552 "last_sched_cmd_posted_timestamp = %u\n", 553 le32_to_cpu(htt_stats_buf->last_sched_cmd_posted_timestamp)); 554 len += scnprintf(buf + len, buf_len - len, 555 "last_sched_cmd_compl_timestamp = %u\n", 556 le32_to_cpu(htt_stats_buf->last_sched_cmd_compl_timestamp)); 557 len += scnprintf(buf + len, buf_len - len, "sched_2_tac_lwm_count = %u\n", 558 le32_to_cpu(htt_stats_buf->sched_2_tac_lwm_count)); 559 len += scnprintf(buf + len, buf_len - len, "sched_2_tac_ring_full = %u\n", 560 le32_to_cpu(htt_stats_buf->sched_2_tac_ring_full)); 561 len += scnprintf(buf + len, buf_len - len, "sched_cmd_post_failure = %u\n", 562 le32_to_cpu(htt_stats_buf->sched_cmd_post_failure)); 563 len += scnprintf(buf + len, buf_len - len, "num_active_tids = %u\n", 564 le32_to_cpu(htt_stats_buf->num_active_tids)); 565 len += scnprintf(buf + len, buf_len - len, "num_ps_schedules = %u\n", 566 le32_to_cpu(htt_stats_buf->num_ps_schedules)); 567 len += scnprintf(buf + len, buf_len - len, "sched_cmds_pending = %u\n", 568 le32_to_cpu(htt_stats_buf->sched_cmds_pending)); 569 len += scnprintf(buf + len, buf_len - len, "num_tid_register = %u\n", 570 le32_to_cpu(htt_stats_buf->num_tid_register)); 571 len += scnprintf(buf + len, buf_len - len, "num_tid_unregister = %u\n", 572 le32_to_cpu(htt_stats_buf->num_tid_unregister)); 573 len += scnprintf(buf + len, buf_len - len, "num_qstats_queried = %u\n", 574 le32_to_cpu(htt_stats_buf->num_qstats_queried)); 575 len += scnprintf(buf + len, buf_len - len, "qstats_update_pending = %u\n", 576 le32_to_cpu(htt_stats_buf->qstats_update_pending)); 577 len += scnprintf(buf + len, buf_len - len, "last_qstats_query_timestamp = %u\n", 578 le32_to_cpu(htt_stats_buf->last_qstats_query_timestamp)); 579 len += scnprintf(buf + len, buf_len - len, "num_tqm_cmdq_full = %u\n", 580 le32_to_cpu(htt_stats_buf->num_tqm_cmdq_full)); 581 len += scnprintf(buf + len, buf_len - len, "num_de_sched_algo_trigger = %u\n", 582 le32_to_cpu(htt_stats_buf->num_de_sched_algo_trigger)); 583 len += scnprintf(buf + len, buf_len - len, "num_rt_sched_algo_trigger = %u\n", 584 le32_to_cpu(htt_stats_buf->num_rt_sched_algo_trigger)); 585 len += scnprintf(buf + len, buf_len - len, "num_tqm_sched_algo_trigger = %u\n", 586 le32_to_cpu(htt_stats_buf->num_tqm_sched_algo_trigger)); 587 len += scnprintf(buf + len, buf_len - len, "notify_sched = %u\n", 588 le32_to_cpu(htt_stats_buf->notify_sched)); 589 len += scnprintf(buf + len, buf_len - len, "dur_based_sendn_term = %u\n", 590 le32_to_cpu(htt_stats_buf->dur_based_sendn_term)); 591 len += scnprintf(buf + len, buf_len - len, "su_notify2_sched = %u\n", 592 le32_to_cpu(htt_stats_buf->su_notify2_sched)); 593 len += scnprintf(buf + len, buf_len - len, "su_optimal_queued_msdus_sched = %u\n", 594 le32_to_cpu(htt_stats_buf->su_optimal_queued_msdus_sched)); 595 len += scnprintf(buf + len, buf_len - len, "su_delay_timeout_sched = %u\n", 596 le32_to_cpu(htt_stats_buf->su_delay_timeout_sched)); 597 len += scnprintf(buf + len, buf_len - len, "su_min_txtime_sched_delay = %u\n", 598 le32_to_cpu(htt_stats_buf->su_min_txtime_sched_delay)); 599 len += scnprintf(buf + len, buf_len - len, "su_no_delay = %u\n", 600 le32_to_cpu(htt_stats_buf->su_no_delay)); 601 len += scnprintf(buf + len, buf_len - len, "num_supercycles = %u\n", 602 le32_to_cpu(htt_stats_buf->num_supercycles)); 603 len += scnprintf(buf + len, buf_len - len, "num_subcycles_with_sort = %u\n", 604 le32_to_cpu(htt_stats_buf->num_subcycles_with_sort)); 605 len += scnprintf(buf + len, buf_len - len, "num_subcycles_no_sort = %u\n\n", 606 le32_to_cpu(htt_stats_buf->num_subcycles_no_sort)); 607 608 stats_req->buf_len = len; 609 } 610 611 static void 612 ath12k_htt_print_sched_txq_cmd_posted_tlv(const void *tag_buf, 613 u16 tag_len, 614 struct debug_htt_stats_req *stats_req) 615 { 616 const struct ath12k_htt_sched_txq_cmd_posted_tlv *htt_stats_buf = tag_buf; 617 u8 *buf = stats_req->buf; 618 u32 len = stats_req->buf_len; 619 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 620 u16 num_elements = tag_len >> 2; 621 622 len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_POSTED_TLV:\n"); 623 len += print_array_to_buf(buf, len, "sched_cmd_posted", 624 htt_stats_buf->sched_cmd_posted, num_elements, "\n\n"); 625 626 stats_req->buf_len = len; 627 } 628 629 static void 630 ath12k_htt_print_sched_txq_cmd_reaped_tlv(const void *tag_buf, 631 u16 tag_len, 632 struct debug_htt_stats_req *stats_req) 633 { 634 const struct ath12k_htt_sched_txq_cmd_reaped_tlv *htt_stats_buf = tag_buf; 635 u8 *buf = stats_req->buf; 636 u32 len = stats_req->buf_len; 637 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 638 u16 num_elements = tag_len >> 2; 639 640 len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_REAPED_TLV:\n"); 641 len += print_array_to_buf(buf, len, "sched_cmd_reaped", 642 htt_stats_buf->sched_cmd_reaped, num_elements, "\n\n"); 643 644 stats_req->buf_len = len; 645 } 646 647 static void 648 ath12k_htt_print_sched_txq_sched_order_su_tlv(const void *tag_buf, 649 u16 tag_len, 650 struct debug_htt_stats_req *stats_req) 651 { 652 const struct ath12k_htt_sched_txq_sched_order_su_tlv *htt_stats_buf = tag_buf; 653 u8 *buf = stats_req->buf; 654 u32 len = stats_req->buf_len; 655 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 656 u32 sched_order_su_num_entries = min_t(u32, (tag_len >> 2), 657 ATH12K_HTT_TX_PDEV_NUM_SCHED_ORDER_LOG); 658 659 len += scnprintf(buf + len, buf_len - len, 660 "HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV:\n"); 661 len += print_array_to_buf(buf, len, "sched_order_su", 662 htt_stats_buf->sched_order_su, 663 sched_order_su_num_entries, "\n\n"); 664 665 stats_req->buf_len = len; 666 } 667 668 static void 669 ath12k_htt_print_sched_txq_sched_ineligibility_tlv(const void *tag_buf, 670 u16 tag_len, 671 struct debug_htt_stats_req *stats_req) 672 { 673 const struct ath12k_htt_sched_txq_sched_ineligibility_tlv *htt_stats_buf = 674 tag_buf; 675 u8 *buf = stats_req->buf; 676 u32 len = stats_req->buf_len; 677 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 678 u32 sched_ineligibility_num_entries = tag_len >> 2; 679 680 len += scnprintf(buf + len, buf_len - len, 681 "HTT_SCHED_TXQ_SCHED_INELIGIBILITY:\n"); 682 len += print_array_to_buf(buf, len, "sched_ineligibility", 683 htt_stats_buf->sched_ineligibility, 684 sched_ineligibility_num_entries, "\n\n"); 685 686 stats_req->buf_len = len; 687 } 688 689 static void 690 ath12k_htt_print_sched_txq_supercycle_trigger_tlv(const void *tag_buf, 691 u16 tag_len, 692 struct debug_htt_stats_req *stats_req) 693 { 694 const struct ath12k_htt_sched_txq_supercycle_triggers_tlv *htt_stats_buf = 695 tag_buf; 696 u8 *buf = stats_req->buf; 697 u32 len = stats_req->buf_len; 698 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 699 u16 num_elems = min_t(u16, (tag_len >> 2), 700 ATH12K_HTT_SCHED_SUPERCYCLE_TRIGGER_MAX); 701 702 len += scnprintf(buf + len, buf_len - len, 703 "HTT_SCHED_TXQ_SUPERCYCLE_TRIGGER:\n"); 704 len += print_array_to_buf(buf, len, "supercycle_triggers", 705 htt_stats_buf->supercycle_triggers, num_elems, "\n\n"); 706 707 stats_req->buf_len = len; 708 } 709 710 static void 711 ath12k_htt_print_hw_stats_pdev_errs_tlv(const void *tag_buf, u16 tag_len, 712 struct debug_htt_stats_req *stats_req) 713 { 714 const struct ath12k_htt_hw_stats_pdev_errs_tlv *htt_buf = tag_buf; 715 u8 *buf = stats_req->buf; 716 u32 len = stats_req->buf_len; 717 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 718 u32 mac_id_word; 719 720 if (tag_len < sizeof(*htt_buf)) 721 return; 722 723 mac_id_word = le32_to_cpu(htt_buf->mac_id__word); 724 725 len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_PDEV_ERRS_TLV:\n"); 726 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 727 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 728 len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n", 729 le32_to_cpu(htt_buf->tx_abort)); 730 len += scnprintf(buf + len, buf_len - len, "tx_abort_fail_count = %u\n", 731 le32_to_cpu(htt_buf->tx_abort_fail_count)); 732 len += scnprintf(buf + len, buf_len - len, "rx_abort = %u\n", 733 le32_to_cpu(htt_buf->rx_abort)); 734 len += scnprintf(buf + len, buf_len - len, "rx_abort_fail_count = %u\n", 735 le32_to_cpu(htt_buf->rx_abort_fail_count)); 736 len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n", 737 le32_to_cpu(htt_buf->rx_flush_cnt)); 738 len += scnprintf(buf + len, buf_len - len, "warm_reset = %u\n", 739 le32_to_cpu(htt_buf->warm_reset)); 740 len += scnprintf(buf + len, buf_len - len, "cold_reset = %u\n", 741 le32_to_cpu(htt_buf->cold_reset)); 742 len += scnprintf(buf + len, buf_len - len, "mac_cold_reset_restore_cal = %u\n", 743 le32_to_cpu(htt_buf->mac_cold_reset_restore_cal)); 744 len += scnprintf(buf + len, buf_len - len, "mac_cold_reset = %u\n", 745 le32_to_cpu(htt_buf->mac_cold_reset)); 746 len += scnprintf(buf + len, buf_len - len, "mac_warm_reset = %u\n", 747 le32_to_cpu(htt_buf->mac_warm_reset)); 748 len += scnprintf(buf + len, buf_len - len, "mac_only_reset = %u\n", 749 le32_to_cpu(htt_buf->mac_only_reset)); 750 len += scnprintf(buf + len, buf_len - len, "phy_warm_reset = %u\n", 751 le32_to_cpu(htt_buf->phy_warm_reset)); 752 len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_ucode_trig = %u\n", 753 le32_to_cpu(htt_buf->phy_warm_reset_ucode_trig)); 754 len += scnprintf(buf + len, buf_len - len, "mac_warm_reset_restore_cal = %u\n", 755 le32_to_cpu(htt_buf->mac_warm_reset_restore_cal)); 756 len += scnprintf(buf + len, buf_len - len, "mac_sfm_reset = %u\n", 757 le32_to_cpu(htt_buf->mac_sfm_reset)); 758 len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_m3_ssr = %u\n", 759 le32_to_cpu(htt_buf->phy_warm_reset_m3_ssr)); 760 len += scnprintf(buf + len, buf_len - len, "fw_rx_rings_reset = %u\n", 761 le32_to_cpu(htt_buf->fw_rx_rings_reset)); 762 len += scnprintf(buf + len, buf_len - len, "tx_flush = %u\n", 763 le32_to_cpu(htt_buf->tx_flush)); 764 len += scnprintf(buf + len, buf_len - len, "tx_glb_reset = %u\n", 765 le32_to_cpu(htt_buf->tx_glb_reset)); 766 len += scnprintf(buf + len, buf_len - len, "tx_txq_reset = %u\n", 767 le32_to_cpu(htt_buf->tx_txq_reset)); 768 len += scnprintf(buf + len, buf_len - len, "rx_timeout_reset = %u\n\n", 769 le32_to_cpu(htt_buf->rx_timeout_reset)); 770 771 len += scnprintf(buf + len, buf_len - len, "PDEV_PHY_WARM_RESET_REASONS:\n"); 772 len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_reason_phy_m3 = %u\n", 773 le32_to_cpu(htt_buf->phy_warm_reset_reason_phy_m3)); 774 len += scnprintf(buf + len, buf_len - len, 775 "phy_warm_reset_reason_tx_hw_stuck = %u\n", 776 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_hw_stuck)); 777 len += scnprintf(buf + len, buf_len - len, 778 "phy_warm_reset_reason_num_cca_rx_frame_stuck = %u\n", 779 le32_to_cpu(htt_buf->phy_warm_reset_reason_num_rx_frame_stuck)); 780 len += scnprintf(buf + len, buf_len - len, 781 "phy_warm_reset_reason_wal_rx_recovery_rst_rx_busy = %u\n", 782 le32_to_cpu(htt_buf->phy_warm_reset_reason_wal_rx_rec_rx_busy)); 783 len += scnprintf(buf + len, buf_len - len, 784 "phy_warm_reset_reason_wal_rx_recovery_rst_mac_hang = %u\n", 785 le32_to_cpu(htt_buf->phy_warm_reset_reason_wal_rx_rec_mac_hng)); 786 len += scnprintf(buf + len, buf_len - len, 787 "phy_warm_reset_reason_mac_reset_converted_phy_reset = %u\n", 788 le32_to_cpu(htt_buf->phy_warm_reset_reason_mac_conv_phy_reset)); 789 len += scnprintf(buf + len, buf_len - len, 790 "phy_warm_reset_reason_tx_lifetime_expiry_cca_stuck = %u\n", 791 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_exp_cca_stuck)); 792 len += scnprintf(buf + len, buf_len - len, 793 "phy_warm_reset_reason_tx_consecutive_flush9_war = %u\n", 794 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_consec_flsh_war)); 795 len += scnprintf(buf + len, buf_len - len, 796 "phy_warm_reset_reason_tx_hwsch_reset_war = %u\n", 797 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_hwsch_reset_war)); 798 len += scnprintf(buf + len, buf_len - len, 799 "phy_warm_reset_reason_hwsch_wdog_or_cca_wdog_war = %u\n\n", 800 le32_to_cpu(htt_buf->phy_warm_reset_reason_hwsch_cca_wdog_war)); 801 802 len += scnprintf(buf + len, buf_len - len, "WAL_RX_RECOVERY_STATS:\n"); 803 len += scnprintf(buf + len, buf_len - len, 804 "wal_rx_recovery_rst_mac_hang_count = %u\n", 805 le32_to_cpu(htt_buf->wal_rx_recovery_rst_mac_hang_cnt)); 806 len += scnprintf(buf + len, buf_len - len, 807 "wal_rx_recovery_rst_known_sig_count = %u\n", 808 le32_to_cpu(htt_buf->wal_rx_recovery_rst_known_sig_cnt)); 809 len += scnprintf(buf + len, buf_len - len, 810 "wal_rx_recovery_rst_no_rx_count = %u\n", 811 le32_to_cpu(htt_buf->wal_rx_recovery_rst_no_rx_cnt)); 812 len += scnprintf(buf + len, buf_len - len, 813 "wal_rx_recovery_rst_no_rx_consecutive_count = %u\n", 814 le32_to_cpu(htt_buf->wal_rx_recovery_rst_no_rx_consec_cnt)); 815 len += scnprintf(buf + len, buf_len - len, 816 "wal_rx_recovery_rst_rx_busy_count = %u\n", 817 le32_to_cpu(htt_buf->wal_rx_recovery_rst_rx_busy_cnt)); 818 len += scnprintf(buf + len, buf_len - len, 819 "wal_rx_recovery_rst_phy_mac_hang_count = %u\n\n", 820 le32_to_cpu(htt_buf->wal_rx_recovery_rst_phy_mac_hang_cnt)); 821 822 len += scnprintf(buf + len, buf_len - len, "HTT_RX_DEST_DRAIN_STATS:\n"); 823 len += scnprintf(buf + len, buf_len - len, 824 "rx_dest_drain_rx_descs_leak_prevention_done = %u\n", 825 le32_to_cpu(htt_buf->rx_dest_drain_rx_descs_leak_prevented)); 826 len += scnprintf(buf + len, buf_len - len, 827 "rx_dest_drain_rx_descs_saved_cnt = %u\n", 828 le32_to_cpu(htt_buf->rx_dest_drain_rx_descs_saved_cnt)); 829 len += scnprintf(buf + len, buf_len - len, 830 "rx_dest_drain_rxdma2reo_leak_detected = %u\n", 831 le32_to_cpu(htt_buf->rx_dest_drain_rxdma2reo_leak_detected)); 832 len += scnprintf(buf + len, buf_len - len, 833 "rx_dest_drain_rxdma2fw_leak_detected = %u\n", 834 le32_to_cpu(htt_buf->rx_dest_drain_rxdma2fw_leak_detected)); 835 len += scnprintf(buf + len, buf_len - len, 836 "rx_dest_drain_rxdma2wbm_leak_detected = %u\n", 837 le32_to_cpu(htt_buf->rx_dest_drain_rxdma2wbm_leak_detected)); 838 len += scnprintf(buf + len, buf_len - len, 839 "rx_dest_drain_rxdma1_2sw_leak_detected = %u\n", 840 le32_to_cpu(htt_buf->rx_dest_drain_rxdma1_2sw_leak_detected)); 841 len += scnprintf(buf + len, buf_len - len, 842 "rx_dest_drain_rx_drain_ok_mac_idle = %u\n", 843 le32_to_cpu(htt_buf->rx_dest_drain_rx_drain_ok_mac_idle)); 844 len += scnprintf(buf + len, buf_len - len, 845 "rx_dest_drain_ok_mac_not_idle = %u\n", 846 le32_to_cpu(htt_buf->rx_dest_drain_ok_mac_not_idle)); 847 len += scnprintf(buf + len, buf_len - len, 848 "rx_dest_drain_prerequisite_invld = %u\n", 849 le32_to_cpu(htt_buf->rx_dest_drain_prerequisite_invld)); 850 len += scnprintf(buf + len, buf_len - len, 851 "rx_dest_drain_skip_for_non_lmac_reset = %u\n", 852 le32_to_cpu(htt_buf->rx_dest_drain_skip_non_lmac_reset)); 853 len += scnprintf(buf + len, buf_len - len, 854 "rx_dest_drain_hw_fifo_not_empty_post_drain_wait = %u\n\n", 855 le32_to_cpu(htt_buf->rx_dest_drain_hw_fifo_notempty_post_wait)); 856 857 stats_req->buf_len = len; 858 } 859 860 static void 861 ath12k_htt_print_hw_stats_intr_misc_tlv(const void *tag_buf, u16 tag_len, 862 struct debug_htt_stats_req *stats_req) 863 { 864 const struct ath12k_htt_hw_stats_intr_misc_tlv *htt_stats_buf = tag_buf; 865 u8 *buf = stats_req->buf; 866 u32 len = stats_req->buf_len; 867 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 868 869 if (tag_len < sizeof(*htt_stats_buf)) 870 return; 871 872 len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_INTR_MISC_TLV:\n"); 873 len += scnprintf(buf + len, buf_len - len, "hw_intr_name = %s\n", 874 htt_stats_buf->hw_intr_name); 875 len += scnprintf(buf + len, buf_len - len, "mask = %u\n", 876 le32_to_cpu(htt_stats_buf->mask)); 877 len += scnprintf(buf + len, buf_len - len, "count = %u\n\n", 878 le32_to_cpu(htt_stats_buf->count)); 879 880 stats_req->buf_len = len; 881 } 882 883 static void 884 ath12k_htt_print_hw_stats_whal_tx_tlv(const void *tag_buf, u16 tag_len, 885 struct debug_htt_stats_req *stats_req) 886 { 887 const struct ath12k_htt_hw_stats_whal_tx_tlv *htt_stats_buf = tag_buf; 888 u8 *buf = stats_req->buf; 889 u32 len = stats_req->buf_len; 890 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 891 u32 mac_id_word; 892 893 if (tag_len < sizeof(*htt_stats_buf)) 894 return; 895 896 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 897 898 len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WHAL_TX_TLV:\n"); 899 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 900 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 901 len += scnprintf(buf + len, buf_len - len, "last_unpause_ppdu_id = %u\n", 902 le32_to_cpu(htt_stats_buf->last_unpause_ppdu_id)); 903 len += scnprintf(buf + len, buf_len - len, "hwsch_unpause_wait_tqm_write = %u\n", 904 le32_to_cpu(htt_stats_buf->hwsch_unpause_wait_tqm_write)); 905 len += scnprintf(buf + len, buf_len - len, "hwsch_dummy_tlv_skipped = %u\n", 906 le32_to_cpu(htt_stats_buf->hwsch_dummy_tlv_skipped)); 907 len += scnprintf(buf + len, buf_len - len, 908 "hwsch_misaligned_offset_received = %u\n", 909 le32_to_cpu(htt_stats_buf->hwsch_misaligned_offset_received)); 910 len += scnprintf(buf + len, buf_len - len, "hwsch_reset_count = %u\n", 911 le32_to_cpu(htt_stats_buf->hwsch_reset_count)); 912 len += scnprintf(buf + len, buf_len - len, "hwsch_dev_reset_war = %u\n", 913 le32_to_cpu(htt_stats_buf->hwsch_dev_reset_war)); 914 len += scnprintf(buf + len, buf_len - len, "hwsch_delayed_pause = %u\n", 915 le32_to_cpu(htt_stats_buf->hwsch_delayed_pause)); 916 len += scnprintf(buf + len, buf_len - len, "hwsch_long_delayed_pause = %u\n", 917 le32_to_cpu(htt_stats_buf->hwsch_long_delayed_pause)); 918 len += scnprintf(buf + len, buf_len - len, "sch_rx_ppdu_no_response = %u\n", 919 le32_to_cpu(htt_stats_buf->sch_rx_ppdu_no_response)); 920 len += scnprintf(buf + len, buf_len - len, "sch_selfgen_response = %u\n", 921 le32_to_cpu(htt_stats_buf->sch_selfgen_response)); 922 len += scnprintf(buf + len, buf_len - len, "sch_rx_sifs_resp_trigger= %u\n\n", 923 le32_to_cpu(htt_stats_buf->sch_rx_sifs_resp_trigger)); 924 925 stats_req->buf_len = len; 926 } 927 928 static void 929 ath12k_htt_print_hw_war_tlv(const void *tag_buf, u16 tag_len, 930 struct debug_htt_stats_req *stats_req) 931 { 932 const struct ath12k_htt_hw_war_stats_tlv *htt_stats_buf = tag_buf; 933 u8 *buf = stats_req->buf; 934 u32 len = stats_req->buf_len; 935 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 936 u16 fixed_len, array_len; 937 u8 i, array_words; 938 u32 mac_id; 939 940 if (tag_len < sizeof(*htt_stats_buf)) 941 return; 942 943 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word); 944 fixed_len = sizeof(*htt_stats_buf); 945 array_len = tag_len - fixed_len; 946 array_words = array_len >> 2; 947 948 len += scnprintf(buf + len, buf_len - len, "HTT_HW_WAR_STATS_TLV:\n"); 949 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 950 u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID)); 951 952 for (i = 0; i < array_words; i++) { 953 len += scnprintf(buf + len, buf_len - len, "hw_war %u = %u\n\n", 954 i, le32_to_cpu(htt_stats_buf->hw_wars[i])); 955 } 956 957 stats_req->buf_len = len; 958 } 959 960 static void 961 ath12k_htt_print_tx_tqm_cmn_stats_tlv(const void *tag_buf, u16 tag_len, 962 struct debug_htt_stats_req *stats_req) 963 { 964 const struct ath12k_htt_tx_tqm_cmn_stats_tlv *htt_stats_buf = tag_buf; 965 u8 *buf = stats_req->buf; 966 u32 len = stats_req->buf_len; 967 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 968 u32 mac_id_word; 969 970 if (tag_len < sizeof(*htt_stats_buf)) 971 return; 972 973 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 974 975 len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMN_STATS_TLV:\n"); 976 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 977 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 978 len += scnprintf(buf + len, buf_len - len, "max_cmdq_id = %u\n", 979 le32_to_cpu(htt_stats_buf->max_cmdq_id)); 980 len += scnprintf(buf + len, buf_len - len, "list_mpdu_cnt_hist_intvl = %u\n", 981 le32_to_cpu(htt_stats_buf->list_mpdu_cnt_hist_intvl)); 982 len += scnprintf(buf + len, buf_len - len, "add_msdu = %u\n", 983 le32_to_cpu(htt_stats_buf->add_msdu)); 984 len += scnprintf(buf + len, buf_len - len, "q_empty = %u\n", 985 le32_to_cpu(htt_stats_buf->q_empty)); 986 len += scnprintf(buf + len, buf_len - len, "q_not_empty = %u\n", 987 le32_to_cpu(htt_stats_buf->q_not_empty)); 988 len += scnprintf(buf + len, buf_len - len, "drop_notification = %u\n", 989 le32_to_cpu(htt_stats_buf->drop_notification)); 990 len += scnprintf(buf + len, buf_len - len, "desc_threshold = %u\n", 991 le32_to_cpu(htt_stats_buf->desc_threshold)); 992 len += scnprintf(buf + len, buf_len - len, "hwsch_tqm_invalid_status = %u\n", 993 le32_to_cpu(htt_stats_buf->hwsch_tqm_invalid_status)); 994 len += scnprintf(buf + len, buf_len - len, "missed_tqm_gen_mpdus = %u\n", 995 le32_to_cpu(htt_stats_buf->missed_tqm_gen_mpdus)); 996 len += scnprintf(buf + len, buf_len - len, 997 "total_msduq_timestamp_updates = %u\n", 998 le32_to_cpu(htt_stats_buf->msduq_timestamp_updates)); 999 len += scnprintf(buf + len, buf_len - len, 1000 "total_msduq_timestamp_updates_by_get_mpdu_head_info_cmd = %u\n", 1001 le32_to_cpu(htt_stats_buf->msduq_updates_mpdu_head_info_cmd)); 1002 len += scnprintf(buf + len, buf_len - len, 1003 "total_msduq_timestamp_updates_by_emp_to_nonemp_status = %u\n", 1004 le32_to_cpu(htt_stats_buf->msduq_updates_emp_to_nonemp_status)); 1005 len += scnprintf(buf + len, buf_len - len, 1006 "total_get_mpdu_head_info_cmds_by_sched_algo_la_query = %u\n", 1007 le32_to_cpu(htt_stats_buf->get_mpdu_head_info_cmds_by_query)); 1008 len += scnprintf(buf + len, buf_len - len, 1009 "total_get_mpdu_head_info_cmds_by_tac = %u\n", 1010 le32_to_cpu(htt_stats_buf->get_mpdu_head_info_cmds_by_tac)); 1011 len += scnprintf(buf + len, buf_len - len, 1012 "total_gen_mpdu_cmds_by_sched_algo_la_query = %u\n", 1013 le32_to_cpu(htt_stats_buf->gen_mpdu_cmds_by_query)); 1014 len += scnprintf(buf + len, buf_len - len, "active_tqm_tids = %u\n", 1015 le32_to_cpu(htt_stats_buf->tqm_active_tids)); 1016 len += scnprintf(buf + len, buf_len - len, "inactive_tqm_tids = %u\n", 1017 le32_to_cpu(htt_stats_buf->tqm_inactive_tids)); 1018 len += scnprintf(buf + len, buf_len - len, "tqm_active_msduq_flows = %u\n", 1019 le32_to_cpu(htt_stats_buf->tqm_active_msduq_flows)); 1020 len += scnprintf(buf + len, buf_len - len, "hi_prio_q_not_empty = %u\n\n", 1021 le32_to_cpu(htt_stats_buf->high_prio_q_not_empty)); 1022 1023 stats_req->buf_len = len; 1024 } 1025 1026 static void 1027 ath12k_htt_print_tx_tqm_error_stats_tlv(const void *tag_buf, u16 tag_len, 1028 struct debug_htt_stats_req *stats_req) 1029 { 1030 const struct ath12k_htt_tx_tqm_error_stats_tlv *htt_stats_buf = tag_buf; 1031 u8 *buf = stats_req->buf; 1032 u32 len = stats_req->buf_len; 1033 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1034 1035 if (tag_len < sizeof(*htt_stats_buf)) 1036 return; 1037 1038 len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_ERROR_STATS_TLV:\n"); 1039 len += scnprintf(buf + len, buf_len - len, "q_empty_failure = %u\n", 1040 le32_to_cpu(htt_stats_buf->q_empty_failure)); 1041 len += scnprintf(buf + len, buf_len - len, "q_not_empty_failure = %u\n", 1042 le32_to_cpu(htt_stats_buf->q_not_empty_failure)); 1043 len += scnprintf(buf + len, buf_len - len, "add_msdu_failure = %u\n\n", 1044 le32_to_cpu(htt_stats_buf->add_msdu_failure)); 1045 1046 len += scnprintf(buf + len, buf_len - len, "TQM_ERROR_RESET_STATS:\n"); 1047 len += scnprintf(buf + len, buf_len - len, "tqm_cache_ctl_err = %u\n", 1048 le32_to_cpu(htt_stats_buf->tqm_cache_ctl_err)); 1049 len += scnprintf(buf + len, buf_len - len, "tqm_soft_reset = %u\n", 1050 le32_to_cpu(htt_stats_buf->tqm_soft_reset)); 1051 len += scnprintf(buf + len, buf_len - len, 1052 "tqm_reset_total_num_in_use_link_descs = %u\n", 1053 le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_link_descs)); 1054 len += scnprintf(buf + len, buf_len - len, 1055 "tqm_reset_worst_case_num_lost_link_descs = %u\n", 1056 le32_to_cpu(htt_stats_buf->tqm_reset_num_lost_link_descs)); 1057 len += scnprintf(buf + len, buf_len - len, 1058 "tqm_reset_worst_case_num_lost_host_tx_bufs_count = %u\n", 1059 le32_to_cpu(htt_stats_buf->tqm_reset_num_lost_host_tx_buf_cnt)); 1060 len += scnprintf(buf + len, buf_len - len, 1061 "tqm_reset_num_in_use_link_descs_internal_tqm = %u\n", 1062 le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_internal_tqm)); 1063 len += scnprintf(buf + len, buf_len - len, 1064 "tqm_reset_num_in_use_link_descs_wbm_idle_link_ring = %u\n", 1065 le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_idle_link_rng)); 1066 len += scnprintf(buf + len, buf_len - len, 1067 "tqm_reset_time_to_tqm_hang_delta_ms = %u\n", 1068 le32_to_cpu(htt_stats_buf->tqm_reset_time_to_tqm_hang_delta_ms)); 1069 len += scnprintf(buf + len, buf_len - len, "tqm_reset_recovery_time_ms = %u\n", 1070 le32_to_cpu(htt_stats_buf->tqm_reset_recovery_time_ms)); 1071 len += scnprintf(buf + len, buf_len - len, "tqm_reset_num_peers_hdl = %u\n", 1072 le32_to_cpu(htt_stats_buf->tqm_reset_num_peers_hdl)); 1073 len += scnprintf(buf + len, buf_len - len, 1074 "tqm_reset_cumm_dirty_hw_mpduq_proc_cnt = %u\n", 1075 le32_to_cpu(htt_stats_buf->tqm_reset_cumm_dirty_hw_mpduq_cnt)); 1076 len += scnprintf(buf + len, buf_len - len, 1077 "tqm_reset_cumm_dirty_hw_msduq_proc = %u\n", 1078 le32_to_cpu(htt_stats_buf->tqm_reset_cumm_dirty_hw_msduq_proc)); 1079 len += scnprintf(buf + len, buf_len - len, 1080 "tqm_reset_flush_cache_cmd_su_cnt = %u\n", 1081 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_su_cnt)); 1082 len += scnprintf(buf + len, buf_len - len, 1083 "tqm_reset_flush_cache_cmd_other_cnt = %u\n", 1084 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_other_cnt)); 1085 len += scnprintf(buf + len, buf_len - len, 1086 "tqm_reset_flush_cache_cmd_trig_type = %u\n", 1087 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_trig_type)); 1088 len += scnprintf(buf + len, buf_len - len, 1089 "tqm_reset_flush_cache_cmd_trig_cfg = %u\n", 1090 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_trig_cfg)); 1091 len += scnprintf(buf + len, buf_len - len, 1092 "tqm_reset_flush_cache_cmd_skip_cmd_status_null = %u\n\n", 1093 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cmd_skp_status_null)); 1094 1095 stats_req->buf_len = len; 1096 } 1097 1098 static void 1099 ath12k_htt_print_tx_tqm_gen_mpdu_stats_tlv(const void *tag_buf, u16 tag_len, 1100 struct debug_htt_stats_req *stats_req) 1101 { 1102 const struct ath12k_htt_tx_tqm_gen_mpdu_stats_tlv *htt_stats_buf = tag_buf; 1103 u8 *buf = stats_req->buf; 1104 u32 len = stats_req->buf_len; 1105 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1106 u16 num_elements = tag_len >> 2; 1107 1108 len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_GEN_MPDU_STATS_TLV:\n"); 1109 len += print_array_to_buf(buf, len, "gen_mpdu_end_reason", 1110 htt_stats_buf->gen_mpdu_end_reason, num_elements, 1111 "\n\n"); 1112 1113 stats_req->buf_len = len; 1114 } 1115 1116 static void 1117 ath12k_htt_print_tx_tqm_list_mpdu_stats_tlv(const void *tag_buf, u16 tag_len, 1118 struct debug_htt_stats_req *stats_req) 1119 { 1120 const struct ath12k_htt_tx_tqm_list_mpdu_stats_tlv *htt_stats_buf = tag_buf; 1121 u8 *buf = stats_req->buf; 1122 u32 len = stats_req->buf_len; 1123 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1124 u16 num_elems = min_t(u16, (tag_len >> 2), 1125 ATH12K_HTT_TX_TQM_MAX_LIST_MPDU_END_REASON); 1126 1127 len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_STATS_TLV:\n"); 1128 len += print_array_to_buf(buf, len, "list_mpdu_end_reason", 1129 htt_stats_buf->list_mpdu_end_reason, num_elems, "\n\n"); 1130 1131 stats_req->buf_len = len; 1132 } 1133 1134 static void 1135 ath12k_htt_print_tx_tqm_list_mpdu_cnt_tlv(const void *tag_buf, u16 tag_len, 1136 struct debug_htt_stats_req *stats_req) 1137 { 1138 const struct ath12k_htt_tx_tqm_list_mpdu_cnt_tlv *htt_stats_buf = tag_buf; 1139 u8 *buf = stats_req->buf; 1140 u32 len = stats_req->buf_len; 1141 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1142 u16 num_elems = min_t(u16, (tag_len >> 2), 1143 ATH12K_HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS); 1144 1145 len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:\n"); 1146 len += print_array_to_buf(buf, len, "list_mpdu_cnt_hist", 1147 htt_stats_buf->list_mpdu_cnt_hist, num_elems, "\n\n"); 1148 1149 stats_req->buf_len = len; 1150 } 1151 1152 static void 1153 ath12k_htt_print_tx_tqm_pdev_stats_tlv(const void *tag_buf, u16 tag_len, 1154 struct debug_htt_stats_req *stats_req) 1155 { 1156 const struct ath12k_htt_tx_tqm_pdev_stats_tlv *htt_stats_buf = tag_buf; 1157 u8 *buf = stats_req->buf; 1158 u32 len = stats_req->buf_len; 1159 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1160 1161 if (tag_len < sizeof(*htt_stats_buf)) 1162 return; 1163 1164 len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_PDEV_STATS_TLV_V:\n"); 1165 len += scnprintf(buf + len, buf_len - len, "msdu_count = %u\n", 1166 le32_to_cpu(htt_stats_buf->msdu_count)); 1167 len += scnprintf(buf + len, buf_len - len, "mpdu_count = %u\n", 1168 le32_to_cpu(htt_stats_buf->mpdu_count)); 1169 len += scnprintf(buf + len, buf_len - len, "remove_msdu = %u\n", 1170 le32_to_cpu(htt_stats_buf->remove_msdu)); 1171 len += scnprintf(buf + len, buf_len - len, "remove_mpdu = %u\n", 1172 le32_to_cpu(htt_stats_buf->remove_mpdu)); 1173 len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl = %u\n", 1174 le32_to_cpu(htt_stats_buf->remove_msdu_ttl)); 1175 len += scnprintf(buf + len, buf_len - len, "send_bar = %u\n", 1176 le32_to_cpu(htt_stats_buf->send_bar)); 1177 len += scnprintf(buf + len, buf_len - len, "bar_sync = %u\n", 1178 le32_to_cpu(htt_stats_buf->bar_sync)); 1179 len += scnprintf(buf + len, buf_len - len, "notify_mpdu = %u\n", 1180 le32_to_cpu(htt_stats_buf->notify_mpdu)); 1181 len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n", 1182 le32_to_cpu(htt_stats_buf->sync_cmd)); 1183 len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n", 1184 le32_to_cpu(htt_stats_buf->write_cmd)); 1185 len += scnprintf(buf + len, buf_len - len, "hwsch_trigger = %u\n", 1186 le32_to_cpu(htt_stats_buf->hwsch_trigger)); 1187 len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n", 1188 le32_to_cpu(htt_stats_buf->ack_tlv_proc)); 1189 len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n", 1190 le32_to_cpu(htt_stats_buf->gen_mpdu_cmd)); 1191 len += scnprintf(buf + len, buf_len - len, "gen_list_cmd = %u\n", 1192 le32_to_cpu(htt_stats_buf->gen_list_cmd)); 1193 len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n", 1194 le32_to_cpu(htt_stats_buf->remove_mpdu_cmd)); 1195 len += scnprintf(buf + len, buf_len - len, "remove_mpdu_tried_cmd = %u\n", 1196 le32_to_cpu(htt_stats_buf->remove_mpdu_tried_cmd)); 1197 len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n", 1198 le32_to_cpu(htt_stats_buf->mpdu_queue_stats_cmd)); 1199 len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n", 1200 le32_to_cpu(htt_stats_buf->mpdu_head_info_cmd)); 1201 len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n", 1202 le32_to_cpu(htt_stats_buf->msdu_flow_stats_cmd)); 1203 len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n", 1204 le32_to_cpu(htt_stats_buf->remove_msdu_cmd)); 1205 len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl_cmd = %u\n", 1206 le32_to_cpu(htt_stats_buf->remove_msdu_ttl_cmd)); 1207 len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n", 1208 le32_to_cpu(htt_stats_buf->flush_cache_cmd)); 1209 len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n", 1210 le32_to_cpu(htt_stats_buf->update_mpduq_cmd)); 1211 len += scnprintf(buf + len, buf_len - len, "enqueue = %u\n", 1212 le32_to_cpu(htt_stats_buf->enqueue)); 1213 len += scnprintf(buf + len, buf_len - len, "enqueue_notify = %u\n", 1214 le32_to_cpu(htt_stats_buf->enqueue_notify)); 1215 len += scnprintf(buf + len, buf_len - len, "notify_mpdu_at_head = %u\n", 1216 le32_to_cpu(htt_stats_buf->notify_mpdu_at_head)); 1217 len += scnprintf(buf + len, buf_len - len, "notify_mpdu_state_valid = %u\n", 1218 le32_to_cpu(htt_stats_buf->notify_mpdu_state_valid)); 1219 len += scnprintf(buf + len, buf_len - len, "sched_udp_notify1 = %u\n", 1220 le32_to_cpu(htt_stats_buf->sched_udp_notify1)); 1221 len += scnprintf(buf + len, buf_len - len, "sched_udp_notify2 = %u\n", 1222 le32_to_cpu(htt_stats_buf->sched_udp_notify2)); 1223 len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify1 = %u\n", 1224 le32_to_cpu(htt_stats_buf->sched_nonudp_notify1)); 1225 len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify2 = %u\n\n", 1226 le32_to_cpu(htt_stats_buf->sched_nonudp_notify2)); 1227 1228 stats_req->buf_len = len; 1229 } 1230 1231 static void 1232 ath12k_htt_print_tx_de_cmn_stats_tlv(const void *tag_buf, u16 tag_len, 1233 struct debug_htt_stats_req *stats_req) 1234 { 1235 const struct ath12k_htt_tx_de_cmn_stats_tlv *htt_stats_buf = tag_buf; 1236 u8 *buf = stats_req->buf; 1237 u32 len = stats_req->buf_len; 1238 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1239 u32 mac_id_word; 1240 1241 if (tag_len < sizeof(*htt_stats_buf)) 1242 return; 1243 1244 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 1245 1246 len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CMN_STATS_TLV:\n"); 1247 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 1248 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 1249 len += scnprintf(buf + len, buf_len - len, "tcl2fw_entry_count = %u\n", 1250 le32_to_cpu(htt_stats_buf->tcl2fw_entry_count)); 1251 len += scnprintf(buf + len, buf_len - len, "not_to_fw = %u\n", 1252 le32_to_cpu(htt_stats_buf->not_to_fw)); 1253 len += scnprintf(buf + len, buf_len - len, "invalid_pdev_vdev_peer = %u\n", 1254 le32_to_cpu(htt_stats_buf->invalid_pdev_vdev_peer)); 1255 len += scnprintf(buf + len, buf_len - len, "tcl_res_invalid_addrx = %u\n", 1256 le32_to_cpu(htt_stats_buf->tcl_res_invalid_addrx)); 1257 len += scnprintf(buf + len, buf_len - len, "wbm2fw_entry_count = %u\n", 1258 le32_to_cpu(htt_stats_buf->wbm2fw_entry_count)); 1259 len += scnprintf(buf + len, buf_len - len, "invalid_pdev = %u\n", 1260 le32_to_cpu(htt_stats_buf->invalid_pdev)); 1261 len += scnprintf(buf + len, buf_len - len, "tcl_res_addrx_timeout = %u\n", 1262 le32_to_cpu(htt_stats_buf->tcl_res_addrx_timeout)); 1263 len += scnprintf(buf + len, buf_len - len, "invalid_vdev = %u\n", 1264 le32_to_cpu(htt_stats_buf->invalid_vdev)); 1265 len += scnprintf(buf + len, buf_len - len, "invalid_tcl_exp_frame_desc = %u\n", 1266 le32_to_cpu(htt_stats_buf->invalid_tcl_exp_frame_desc)); 1267 len += scnprintf(buf + len, buf_len - len, "vdev_id_mismatch_count = %u\n\n", 1268 le32_to_cpu(htt_stats_buf->vdev_id_mismatch_cnt)); 1269 1270 stats_req->buf_len = len; 1271 } 1272 1273 static void 1274 ath12k_htt_print_tx_de_eapol_packets_stats_tlv(const void *tag_buf, u16 tag_len, 1275 struct debug_htt_stats_req *stats_req) 1276 { 1277 const struct ath12k_htt_tx_de_eapol_packets_stats_tlv *htt_stats_buf = tag_buf; 1278 u8 *buf = stats_req->buf; 1279 u32 len = stats_req->buf_len; 1280 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1281 1282 if (tag_len < sizeof(*htt_stats_buf)) 1283 return; 1284 1285 len += scnprintf(buf + len, buf_len - len, 1286 "HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:\n"); 1287 len += scnprintf(buf + len, buf_len - len, "m1_packets = %u\n", 1288 le32_to_cpu(htt_stats_buf->m1_packets)); 1289 len += scnprintf(buf + len, buf_len - len, "m2_packets = %u\n", 1290 le32_to_cpu(htt_stats_buf->m2_packets)); 1291 len += scnprintf(buf + len, buf_len - len, "m3_packets = %u\n", 1292 le32_to_cpu(htt_stats_buf->m3_packets)); 1293 len += scnprintf(buf + len, buf_len - len, "m4_packets = %u\n", 1294 le32_to_cpu(htt_stats_buf->m4_packets)); 1295 len += scnprintf(buf + len, buf_len - len, "g1_packets = %u\n", 1296 le32_to_cpu(htt_stats_buf->g1_packets)); 1297 len += scnprintf(buf + len, buf_len - len, "g2_packets = %u\n", 1298 le32_to_cpu(htt_stats_buf->g2_packets)); 1299 len += scnprintf(buf + len, buf_len - len, "rc4_packets = %u\n", 1300 le32_to_cpu(htt_stats_buf->rc4_packets)); 1301 len += scnprintf(buf + len, buf_len - len, "eap_packets = %u\n", 1302 le32_to_cpu(htt_stats_buf->eap_packets)); 1303 len += scnprintf(buf + len, buf_len - len, "eapol_start_packets = %u\n", 1304 le32_to_cpu(htt_stats_buf->eapol_start_packets)); 1305 len += scnprintf(buf + len, buf_len - len, "eapol_logoff_packets = %u\n", 1306 le32_to_cpu(htt_stats_buf->eapol_logoff_packets)); 1307 len += scnprintf(buf + len, buf_len - len, "eapol_encap_asf_packets = %u\n\n", 1308 le32_to_cpu(htt_stats_buf->eapol_encap_asf_packets)); 1309 1310 stats_req->buf_len = len; 1311 } 1312 1313 static void 1314 ath12k_htt_print_tx_de_classify_stats_tlv(const void *tag_buf, u16 tag_len, 1315 struct debug_htt_stats_req *stats_req) 1316 { 1317 const struct ath12k_htt_tx_de_classify_stats_tlv *htt_stats_buf = tag_buf; 1318 u8 *buf = stats_req->buf; 1319 u32 len = stats_req->buf_len; 1320 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1321 1322 if (tag_len < sizeof(*htt_stats_buf)) 1323 return; 1324 1325 len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CLASSIFY_STATS_TLV:\n"); 1326 len += scnprintf(buf + len, buf_len - len, "arp_packets = %u\n", 1327 le32_to_cpu(htt_stats_buf->arp_packets)); 1328 len += scnprintf(buf + len, buf_len - len, "igmp_packets = %u\n", 1329 le32_to_cpu(htt_stats_buf->igmp_packets)); 1330 len += scnprintf(buf + len, buf_len - len, "dhcp_packets = %u\n", 1331 le32_to_cpu(htt_stats_buf->dhcp_packets)); 1332 len += scnprintf(buf + len, buf_len - len, "host_inspected = %u\n", 1333 le32_to_cpu(htt_stats_buf->host_inspected)); 1334 len += scnprintf(buf + len, buf_len - len, "htt_included = %u\n", 1335 le32_to_cpu(htt_stats_buf->htt_included)); 1336 len += scnprintf(buf + len, buf_len - len, "htt_valid_mcs = %u\n", 1337 le32_to_cpu(htt_stats_buf->htt_valid_mcs)); 1338 len += scnprintf(buf + len, buf_len - len, "htt_valid_nss = %u\n", 1339 le32_to_cpu(htt_stats_buf->htt_valid_nss)); 1340 len += scnprintf(buf + len, buf_len - len, "htt_valid_preamble_type = %u\n", 1341 le32_to_cpu(htt_stats_buf->htt_valid_preamble_type)); 1342 len += scnprintf(buf + len, buf_len - len, "htt_valid_chainmask = %u\n", 1343 le32_to_cpu(htt_stats_buf->htt_valid_chainmask)); 1344 len += scnprintf(buf + len, buf_len - len, "htt_valid_guard_interval = %u\n", 1345 le32_to_cpu(htt_stats_buf->htt_valid_guard_interval)); 1346 len += scnprintf(buf + len, buf_len - len, "htt_valid_retries = %u\n", 1347 le32_to_cpu(htt_stats_buf->htt_valid_retries)); 1348 len += scnprintf(buf + len, buf_len - len, "htt_valid_bw_info = %u\n", 1349 le32_to_cpu(htt_stats_buf->htt_valid_bw_info)); 1350 len += scnprintf(buf + len, buf_len - len, "htt_valid_power = %u\n", 1351 le32_to_cpu(htt_stats_buf->htt_valid_power)); 1352 len += scnprintf(buf + len, buf_len - len, "htt_valid_key_flags = 0x%x\n", 1353 le32_to_cpu(htt_stats_buf->htt_valid_key_flags)); 1354 len += scnprintf(buf + len, buf_len - len, "htt_valid_no_encryption = %u\n", 1355 le32_to_cpu(htt_stats_buf->htt_valid_no_encryption)); 1356 len += scnprintf(buf + len, buf_len - len, "fse_entry_count = %u\n", 1357 le32_to_cpu(htt_stats_buf->fse_entry_count)); 1358 len += scnprintf(buf + len, buf_len - len, "fse_priority_be = %u\n", 1359 le32_to_cpu(htt_stats_buf->fse_priority_be)); 1360 len += scnprintf(buf + len, buf_len - len, "fse_priority_high = %u\n", 1361 le32_to_cpu(htt_stats_buf->fse_priority_high)); 1362 len += scnprintf(buf + len, buf_len - len, "fse_priority_low = %u\n", 1363 le32_to_cpu(htt_stats_buf->fse_priority_low)); 1364 len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_be = %u\n", 1365 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_be)); 1366 len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_over_sub = %u\n", 1367 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_over_sub)); 1368 len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_bursty = %u\n", 1369 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_bursty)); 1370 len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_interactive = %u\n", 1371 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_interactive)); 1372 len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_periodic = %u\n", 1373 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_periodic)); 1374 len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_alloc = %u\n", 1375 le32_to_cpu(htt_stats_buf->fse_hwqueue_alloc)); 1376 len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_created = %u\n", 1377 le32_to_cpu(htt_stats_buf->fse_hwqueue_created)); 1378 len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_send_to_host = %u\n", 1379 le32_to_cpu(htt_stats_buf->fse_hwqueue_send_to_host)); 1380 len += scnprintf(buf + len, buf_len - len, "mcast_entry = %u\n", 1381 le32_to_cpu(htt_stats_buf->mcast_entry)); 1382 len += scnprintf(buf + len, buf_len - len, "bcast_entry = %u\n", 1383 le32_to_cpu(htt_stats_buf->bcast_entry)); 1384 len += scnprintf(buf + len, buf_len - len, "htt_update_peer_cache = %u\n", 1385 le32_to_cpu(htt_stats_buf->htt_update_peer_cache)); 1386 len += scnprintf(buf + len, buf_len - len, "htt_learning_frame = %u\n", 1387 le32_to_cpu(htt_stats_buf->htt_learning_frame)); 1388 len += scnprintf(buf + len, buf_len - len, "fse_invalid_peer = %u\n", 1389 le32_to_cpu(htt_stats_buf->fse_invalid_peer)); 1390 len += scnprintf(buf + len, buf_len - len, "mec_notify = %u\n\n", 1391 le32_to_cpu(htt_stats_buf->mec_notify)); 1392 1393 stats_req->buf_len = len; 1394 } 1395 1396 static void 1397 ath12k_htt_print_tx_de_classify_failed_stats_tlv(const void *tag_buf, u16 tag_len, 1398 struct debug_htt_stats_req *stats_req) 1399 { 1400 const struct ath12k_htt_tx_de_classify_failed_stats_tlv *htt_stats_buf = tag_buf; 1401 u8 *buf = stats_req->buf; 1402 u32 len = stats_req->buf_len; 1403 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1404 1405 if (tag_len < sizeof(*htt_stats_buf)) 1406 return; 1407 1408 len += scnprintf(buf + len, buf_len - len, 1409 "HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:\n"); 1410 len += scnprintf(buf + len, buf_len - len, "ap_bss_peer_not_found = %u\n", 1411 le32_to_cpu(htt_stats_buf->ap_bss_peer_not_found)); 1412 len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_no_peer = %u\n", 1413 le32_to_cpu(htt_stats_buf->ap_bcast_mcast_no_peer)); 1414 len += scnprintf(buf + len, buf_len - len, "sta_delete_in_progress = %u\n", 1415 le32_to_cpu(htt_stats_buf->sta_delete_in_progress)); 1416 len += scnprintf(buf + len, buf_len - len, "ibss_no_bss_peer = %u\n", 1417 le32_to_cpu(htt_stats_buf->ibss_no_bss_peer)); 1418 len += scnprintf(buf + len, buf_len - len, "invalid_vdev_type = %u\n", 1419 le32_to_cpu(htt_stats_buf->invalid_vdev_type)); 1420 len += scnprintf(buf + len, buf_len - len, "invalid_ast_peer_entry = %u\n", 1421 le32_to_cpu(htt_stats_buf->invalid_ast_peer_entry)); 1422 len += scnprintf(buf + len, buf_len - len, "peer_entry_invalid = %u\n", 1423 le32_to_cpu(htt_stats_buf->peer_entry_invalid)); 1424 len += scnprintf(buf + len, buf_len - len, "ethertype_not_ip = %u\n", 1425 le32_to_cpu(htt_stats_buf->ethertype_not_ip)); 1426 len += scnprintf(buf + len, buf_len - len, "eapol_lookup_failed = %u\n", 1427 le32_to_cpu(htt_stats_buf->eapol_lookup_failed)); 1428 len += scnprintf(buf + len, buf_len - len, "qpeer_not_allow_data = %u\n", 1429 le32_to_cpu(htt_stats_buf->qpeer_not_allow_data)); 1430 len += scnprintf(buf + len, buf_len - len, "fse_tid_override = %u\n", 1431 le32_to_cpu(htt_stats_buf->fse_tid_override)); 1432 len += scnprintf(buf + len, buf_len - len, "ipv6_jumbogram_zero_length = %u\n", 1433 le32_to_cpu(htt_stats_buf->ipv6_jumbogram_zero_length)); 1434 len += scnprintf(buf + len, buf_len - len, "qos_to_non_qos_in_prog = %u\n", 1435 le32_to_cpu(htt_stats_buf->qos_to_non_qos_in_prog)); 1436 len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_eapol = %u\n", 1437 le32_to_cpu(htt_stats_buf->ap_bcast_mcast_eapol)); 1438 len += scnprintf(buf + len, buf_len - len, "unicast_on_ap_bss_peer = %u\n", 1439 le32_to_cpu(htt_stats_buf->unicast_on_ap_bss_peer)); 1440 len += scnprintf(buf + len, buf_len - len, "ap_vdev_invalid = %u\n", 1441 le32_to_cpu(htt_stats_buf->ap_vdev_invalid)); 1442 len += scnprintf(buf + len, buf_len - len, "incomplete_llc = %u\n", 1443 le32_to_cpu(htt_stats_buf->incomplete_llc)); 1444 len += scnprintf(buf + len, buf_len - len, "eapol_duplicate_m3 = %u\n", 1445 le32_to_cpu(htt_stats_buf->eapol_duplicate_m3)); 1446 len += scnprintf(buf + len, buf_len - len, "eapol_duplicate_m4 = %u\n\n", 1447 le32_to_cpu(htt_stats_buf->eapol_duplicate_m4)); 1448 1449 stats_req->buf_len = len; 1450 } 1451 1452 static void 1453 ath12k_htt_print_tx_de_classify_status_stats_tlv(const void *tag_buf, u16 tag_len, 1454 struct debug_htt_stats_req *stats_req) 1455 { 1456 const struct ath12k_htt_tx_de_classify_status_stats_tlv *htt_stats_buf = tag_buf; 1457 u8 *buf = stats_req->buf; 1458 u32 len = stats_req->buf_len; 1459 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1460 1461 if (tag_len < sizeof(*htt_stats_buf)) 1462 return; 1463 1464 len += scnprintf(buf + len, buf_len - len, 1465 "HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:\n"); 1466 len += scnprintf(buf + len, buf_len - len, "eok = %u\n", 1467 le32_to_cpu(htt_stats_buf->eok)); 1468 len += scnprintf(buf + len, buf_len - len, "classify_done = %u\n", 1469 le32_to_cpu(htt_stats_buf->classify_done)); 1470 len += scnprintf(buf + len, buf_len - len, "lookup_failed = %u\n", 1471 le32_to_cpu(htt_stats_buf->lookup_failed)); 1472 len += scnprintf(buf + len, buf_len - len, "send_host_dhcp = %u\n", 1473 le32_to_cpu(htt_stats_buf->send_host_dhcp)); 1474 len += scnprintf(buf + len, buf_len - len, "send_host_mcast = %u\n", 1475 le32_to_cpu(htt_stats_buf->send_host_mcast)); 1476 len += scnprintf(buf + len, buf_len - len, "send_host_unknown_dest = %u\n", 1477 le32_to_cpu(htt_stats_buf->send_host_unknown_dest)); 1478 len += scnprintf(buf + len, buf_len - len, "send_host = %u\n", 1479 le32_to_cpu(htt_stats_buf->send_host)); 1480 len += scnprintf(buf + len, buf_len - len, "status_invalid = %u\n\n", 1481 le32_to_cpu(htt_stats_buf->status_invalid)); 1482 1483 stats_req->buf_len = len; 1484 } 1485 1486 static void 1487 ath12k_htt_print_tx_de_enqueue_packets_stats_tlv(const void *tag_buf, u16 tag_len, 1488 struct debug_htt_stats_req *stats_req) 1489 { 1490 const struct ath12k_htt_tx_de_enqueue_packets_stats_tlv *htt_stats_buf = tag_buf; 1491 u8 *buf = stats_req->buf; 1492 u32 len = stats_req->buf_len; 1493 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1494 1495 if (tag_len < sizeof(*htt_stats_buf)) 1496 return; 1497 1498 len += scnprintf(buf + len, buf_len - len, 1499 "HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:\n"); 1500 len += scnprintf(buf + len, buf_len - len, "enqueued_pkts = %u\n", 1501 le32_to_cpu(htt_stats_buf->enqueued_pkts)); 1502 len += scnprintf(buf + len, buf_len - len, "to_tqm = %u\n", 1503 le32_to_cpu(htt_stats_buf->to_tqm)); 1504 len += scnprintf(buf + len, buf_len - len, "to_tqm_bypass = %u\n\n", 1505 le32_to_cpu(htt_stats_buf->to_tqm_bypass)); 1506 1507 stats_req->buf_len = len; 1508 } 1509 1510 static void 1511 ath12k_htt_print_tx_de_enqueue_discard_stats_tlv(const void *tag_buf, u16 tag_len, 1512 struct debug_htt_stats_req *stats_req) 1513 { 1514 const struct ath12k_htt_tx_de_enqueue_discard_stats_tlv *htt_stats_buf = tag_buf; 1515 u8 *buf = stats_req->buf; 1516 u32 len = stats_req->buf_len; 1517 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1518 1519 if (tag_len < sizeof(*htt_stats_buf)) 1520 return; 1521 1522 len += scnprintf(buf + len, buf_len - len, 1523 "HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:\n"); 1524 len += scnprintf(buf + len, buf_len - len, "discarded_pkts = %u\n", 1525 le32_to_cpu(htt_stats_buf->discarded_pkts)); 1526 len += scnprintf(buf + len, buf_len - len, "local_frames = %u\n", 1527 le32_to_cpu(htt_stats_buf->local_frames)); 1528 len += scnprintf(buf + len, buf_len - len, "is_ext_msdu = %u\n\n", 1529 le32_to_cpu(htt_stats_buf->is_ext_msdu)); 1530 1531 stats_req->buf_len = len; 1532 } 1533 1534 static void 1535 ath12k_htt_print_tx_de_compl_stats_tlv(const void *tag_buf, u16 tag_len, 1536 struct debug_htt_stats_req *stats_req) 1537 { 1538 const struct ath12k_htt_tx_de_compl_stats_tlv *htt_stats_buf = tag_buf; 1539 u8 *buf = stats_req->buf; 1540 u32 len = stats_req->buf_len; 1541 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1542 1543 if (tag_len < sizeof(*htt_stats_buf)) 1544 return; 1545 1546 len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_COMPL_STATS_TLV:\n"); 1547 len += scnprintf(buf + len, buf_len - len, "tcl_dummy_frame = %u\n", 1548 le32_to_cpu(htt_stats_buf->tcl_dummy_frame)); 1549 len += scnprintf(buf + len, buf_len - len, "tqm_dummy_frame = %u\n", 1550 le32_to_cpu(htt_stats_buf->tqm_dummy_frame)); 1551 len += scnprintf(buf + len, buf_len - len, "tqm_notify_frame = %u\n", 1552 le32_to_cpu(htt_stats_buf->tqm_notify_frame)); 1553 len += scnprintf(buf + len, buf_len - len, "fw2wbm_enq = %u\n", 1554 le32_to_cpu(htt_stats_buf->fw2wbm_enq)); 1555 len += scnprintf(buf + len, buf_len - len, "tqm_bypass_frame = %u\n\n", 1556 le32_to_cpu(htt_stats_buf->tqm_bypass_frame)); 1557 1558 stats_req->buf_len = len; 1559 } 1560 1561 static void 1562 ath12k_htt_print_tx_selfgen_cmn_stats_tlv(const void *tag_buf, u16 tag_len, 1563 struct debug_htt_stats_req *stats_req) 1564 { 1565 const struct ath12k_htt_tx_selfgen_cmn_stats_tlv *htt_stats_buf = tag_buf; 1566 u8 *buf = stats_req->buf; 1567 u32 len = stats_req->buf_len; 1568 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1569 u32 mac_id_word; 1570 1571 if (tag_len < sizeof(*htt_stats_buf)) 1572 return; 1573 1574 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 1575 1576 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_CMN_STATS_TLV:\n"); 1577 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 1578 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 1579 len += scnprintf(buf + len, buf_len - len, "su_bar = %u\n", 1580 le32_to_cpu(htt_stats_buf->su_bar)); 1581 len += scnprintf(buf + len, buf_len - len, "rts = %u\n", 1582 le32_to_cpu(htt_stats_buf->rts)); 1583 len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n", 1584 le32_to_cpu(htt_stats_buf->cts2self)); 1585 len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n", 1586 le32_to_cpu(htt_stats_buf->qos_null)); 1587 len += scnprintf(buf + len, buf_len - len, "delayed_bar_1 = %u\n", 1588 le32_to_cpu(htt_stats_buf->delayed_bar_1)); 1589 len += scnprintf(buf + len, buf_len - len, "delayed_bar_2 = %u\n", 1590 le32_to_cpu(htt_stats_buf->delayed_bar_2)); 1591 len += scnprintf(buf + len, buf_len - len, "delayed_bar_3 = %u\n", 1592 le32_to_cpu(htt_stats_buf->delayed_bar_3)); 1593 len += scnprintf(buf + len, buf_len - len, "delayed_bar_4 = %u\n", 1594 le32_to_cpu(htt_stats_buf->delayed_bar_4)); 1595 len += scnprintf(buf + len, buf_len - len, "delayed_bar_5 = %u\n", 1596 le32_to_cpu(htt_stats_buf->delayed_bar_5)); 1597 len += scnprintf(buf + len, buf_len - len, "delayed_bar_6 = %u\n", 1598 le32_to_cpu(htt_stats_buf->delayed_bar_6)); 1599 len += scnprintf(buf + len, buf_len - len, "delayed_bar_7 = %u\n\n", 1600 le32_to_cpu(htt_stats_buf->delayed_bar_7)); 1601 1602 stats_req->buf_len = len; 1603 } 1604 1605 static void 1606 ath12k_htt_print_tx_selfgen_ac_stats_tlv(const void *tag_buf, u16 tag_len, 1607 struct debug_htt_stats_req *stats_req) 1608 { 1609 const struct ath12k_htt_tx_selfgen_ac_stats_tlv *htt_stats_buf = tag_buf; 1610 u8 *buf = stats_req->buf; 1611 u32 len = stats_req->buf_len; 1612 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1613 1614 if (tag_len < sizeof(*htt_stats_buf)) 1615 return; 1616 1617 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_STATS_TLV:\n"); 1618 len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_tried = %u\n", 1619 le32_to_cpu(htt_stats_buf->ac_su_ndpa)); 1620 len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_tried = %u\n", 1621 le32_to_cpu(htt_stats_buf->ac_su_ndp)); 1622 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_tried = %u\n", 1623 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndpa)); 1624 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_tried = %u\n", 1625 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndp)); 1626 len += print_array_to_buf_index(buf, len, "ac_mu_mimo_brpollX_tried = ", 1, 1627 htt_stats_buf->ac_mu_mimo_brpoll, 1628 ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS - 1, 1629 "\n\n"); 1630 1631 stats_req->buf_len = len; 1632 } 1633 1634 static void 1635 ath12k_htt_print_tx_selfgen_ax_stats_tlv(const void *tag_buf, u16 tag_len, 1636 struct debug_htt_stats_req *stats_req) 1637 { 1638 const struct ath12k_htt_tx_selfgen_ax_stats_tlv *htt_stats_buf = tag_buf; 1639 u8 *buf = stats_req->buf; 1640 u32 len = stats_req->buf_len; 1641 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1642 1643 if (tag_len < sizeof(*htt_stats_buf)) 1644 return; 1645 1646 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_STATS_TLV:\n"); 1647 len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_tried = %u\n", 1648 le32_to_cpu(htt_stats_buf->ax_su_ndpa)); 1649 len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_tried = %u\n", 1650 le32_to_cpu(htt_stats_buf->ax_su_ndp)); 1651 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_tried = %u\n", 1652 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndpa)); 1653 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_tried = %u\n", 1654 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndp)); 1655 len += print_array_to_buf_index(buf, len, "ax_mu_mimo_brpollX_tried = ", 1, 1656 htt_stats_buf->ax_mu_mimo_brpoll, 1657 ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS - 1, "\n"); 1658 len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger = %u\n", 1659 le32_to_cpu(htt_stats_buf->ax_basic_trigger)); 1660 len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_total_trigger = %u\n", 1661 le32_to_cpu(htt_stats_buf->ax_ulmumimo_trigger)); 1662 len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger = %u\n", 1663 le32_to_cpu(htt_stats_buf->ax_bsr_trigger)); 1664 len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger = %u\n", 1665 le32_to_cpu(htt_stats_buf->ax_mu_bar_trigger)); 1666 len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger = %u\n\n", 1667 le32_to_cpu(htt_stats_buf->ax_mu_rts_trigger)); 1668 1669 stats_req->buf_len = len; 1670 } 1671 1672 static void 1673 ath12k_htt_print_tx_selfgen_be_stats_tlv(const void *tag_buf, u16 tag_len, 1674 struct debug_htt_stats_req *stats_req) 1675 { 1676 const struct ath12k_htt_tx_selfgen_be_stats_tlv *htt_stats_buf = tag_buf; 1677 u8 *buf = stats_req->buf; 1678 u32 len = stats_req->buf_len; 1679 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1680 1681 if (tag_len < sizeof(*htt_stats_buf)) 1682 return; 1683 1684 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_BE_STATS_TLV:\n"); 1685 len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_queued = %u\n", 1686 le32_to_cpu(htt_stats_buf->be_su_ndpa_queued)); 1687 len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_tried = %u\n", 1688 le32_to_cpu(htt_stats_buf->be_su_ndpa)); 1689 len += scnprintf(buf + len, buf_len - len, "be_su_ndp_queued = %u\n", 1690 le32_to_cpu(htt_stats_buf->be_su_ndp_queued)); 1691 len += scnprintf(buf + len, buf_len - len, "be_su_ndp_tried = %u\n", 1692 le32_to_cpu(htt_stats_buf->be_su_ndp)); 1693 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_queued = %u\n", 1694 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_queued)); 1695 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_tried = %u\n", 1696 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa)); 1697 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_queued = %u\n", 1698 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_queued)); 1699 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_tried = %u\n", 1700 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp)); 1701 len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpollX_queued = ", 1, 1702 htt_stats_buf->be_mu_mimo_brpoll_queued, 1703 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1, 1704 "\n"); 1705 len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpollX_tried = ", 1, 1706 htt_stats_buf->be_mu_mimo_brpoll, 1707 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1, 1708 "\n"); 1709 len += print_array_to_buf(buf, len, "be_ul_mumimo_trigger = ", 1710 htt_stats_buf->be_ul_mumimo_trigger, 1711 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, "\n"); 1712 len += scnprintf(buf + len, buf_len - len, "be_basic_trigger = %u\n", 1713 le32_to_cpu(htt_stats_buf->be_basic_trigger)); 1714 len += scnprintf(buf + len, buf_len - len, "be_ulmumimo_total_trigger = %u\n", 1715 le32_to_cpu(htt_stats_buf->be_ulmumimo_trigger)); 1716 len += scnprintf(buf + len, buf_len - len, "be_bsr_trigger = %u\n", 1717 le32_to_cpu(htt_stats_buf->be_bsr_trigger)); 1718 len += scnprintf(buf + len, buf_len - len, "be_mu_bar_trigger = %u\n", 1719 le32_to_cpu(htt_stats_buf->be_mu_bar_trigger)); 1720 len += scnprintf(buf + len, buf_len - len, "be_mu_rts_trigger = %u\n\n", 1721 le32_to_cpu(htt_stats_buf->be_mu_rts_trigger)); 1722 1723 stats_req->buf_len = len; 1724 } 1725 1726 static void 1727 ath12k_htt_print_tx_selfgen_ac_err_stats_tlv(const void *tag_buf, u16 tag_len, 1728 struct debug_htt_stats_req *stats_req) 1729 { 1730 const struct ath12k_htt_tx_selfgen_ac_err_stats_tlv *htt_stats_buf = tag_buf; 1731 u8 *buf = stats_req->buf; 1732 u32 len = stats_req->buf_len; 1733 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1734 1735 if (tag_len < sizeof(*htt_stats_buf)) 1736 return; 1737 1738 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:\n"); 1739 len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_err = %u\n", 1740 le32_to_cpu(htt_stats_buf->ac_su_ndp_err)); 1741 len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_err = %u\n", 1742 le32_to_cpu(htt_stats_buf->ac_su_ndpa_err)); 1743 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_err = %u\n", 1744 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndpa_err)); 1745 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_err = %u\n", 1746 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndp_err)); 1747 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp1_err = %u\n", 1748 le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp1_err)); 1749 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp2_err = %u\n", 1750 le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp2_err)); 1751 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp3_err = %u\n\n", 1752 le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp3_err)); 1753 1754 stats_req->buf_len = len; 1755 } 1756 1757 static void 1758 ath12k_htt_print_tx_selfgen_ax_err_stats_tlv(const void *tag_buf, u16 tag_len, 1759 struct debug_htt_stats_req *stats_req) 1760 { 1761 const struct ath12k_htt_tx_selfgen_ax_err_stats_tlv *htt_stats_buf = tag_buf; 1762 u8 *buf = stats_req->buf; 1763 u32 len = stats_req->buf_len; 1764 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1765 1766 if (tag_len < sizeof(*htt_stats_buf)) 1767 return; 1768 1769 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:\n"); 1770 len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_err = %u\n", 1771 le32_to_cpu(htt_stats_buf->ax_su_ndp_err)); 1772 len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_err = %u\n", 1773 le32_to_cpu(htt_stats_buf->ax_su_ndpa_err)); 1774 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_err = %u\n", 1775 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndpa_err)); 1776 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_err = %u\n", 1777 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndp_err)); 1778 len += print_array_to_buf_index(buf, len, "ax_mu_mimo_brpX_err", 1, 1779 htt_stats_buf->ax_mu_mimo_brp_err, 1780 ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS - 1, 1781 "\n"); 1782 len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger_err = %u\n", 1783 le32_to_cpu(htt_stats_buf->ax_basic_trigger_err)); 1784 len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_total_trigger_err = %u\n", 1785 le32_to_cpu(htt_stats_buf->ax_ulmumimo_trigger_err)); 1786 len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger_err = %u\n", 1787 le32_to_cpu(htt_stats_buf->ax_bsr_trigger_err)); 1788 len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger_err = %u\n", 1789 le32_to_cpu(htt_stats_buf->ax_mu_bar_trigger_err)); 1790 len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger_err = %u\n\n", 1791 le32_to_cpu(htt_stats_buf->ax_mu_rts_trigger_err)); 1792 1793 stats_req->buf_len = len; 1794 } 1795 1796 static void 1797 ath12k_htt_print_tx_selfgen_be_err_stats_tlv(const void *tag_buf, u16 tag_len, 1798 struct debug_htt_stats_req *stats_req) 1799 { 1800 const struct ath12k_htt_tx_selfgen_be_err_stats_tlv *htt_stats_buf = tag_buf; 1801 u8 *buf = stats_req->buf; 1802 u32 len = stats_req->buf_len; 1803 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1804 1805 if (tag_len < sizeof(*htt_stats_buf)) 1806 return; 1807 1808 len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_BE_ERR_STATS_TLV:\n"); 1809 len += scnprintf(buf + len, buf_len - len, "be_su_ndp_err = %u\n", 1810 le32_to_cpu(htt_stats_buf->be_su_ndp_err)); 1811 len += scnprintf(buf + len, buf_len - len, "be_su_ndp_flushed = %u\n", 1812 le32_to_cpu(htt_stats_buf->be_su_ndp_flushed)); 1813 len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_err = %u\n", 1814 le32_to_cpu(htt_stats_buf->be_su_ndpa_err)); 1815 len += scnprintf(buf + len, buf_len - len, "be_su_ndpa_flushed = %u\n", 1816 le32_to_cpu(htt_stats_buf->be_su_ndpa_flushed)); 1817 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_err = %u\n", 1818 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_err)); 1819 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndpa_flushed = %u\n", 1820 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_flushed)); 1821 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_err = %u\n", 1822 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_err)); 1823 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_ndp_flushed = %u\n", 1824 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_flushed)); 1825 len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpX_err", 1, 1826 htt_stats_buf->be_mu_mimo_brp_err, 1827 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1, 1828 "\n"); 1829 len += print_array_to_buf_index(buf, len, "be_mu_mimo_brpollX_flushed", 1, 1830 htt_stats_buf->be_mu_mimo_brpoll_flushed, 1831 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1, 1832 "\n"); 1833 len += print_array_to_buf(buf, len, "be_mu_mimo_num_cbf_rcvd_on_brp_err", 1834 htt_stats_buf->be_mu_mimo_brp_err_num_cbf_rxd, 1835 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, "\n"); 1836 len += print_array_to_buf(buf, len, "be_ul_mumimo_trigger_err", 1837 htt_stats_buf->be_ul_mumimo_trigger_err, 1838 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, "\n"); 1839 len += scnprintf(buf + len, buf_len - len, "be_basic_trigger_err = %u\n", 1840 le32_to_cpu(htt_stats_buf->be_basic_trigger_err)); 1841 len += scnprintf(buf + len, buf_len - len, "be_ulmumimo_total_trig_err = %u\n", 1842 le32_to_cpu(htt_stats_buf->be_ulmumimo_trigger_err)); 1843 len += scnprintf(buf + len, buf_len - len, "be_bsr_trigger_err = %u\n", 1844 le32_to_cpu(htt_stats_buf->be_bsr_trigger_err)); 1845 len += scnprintf(buf + len, buf_len - len, "be_mu_bar_trigger_err = %u\n", 1846 le32_to_cpu(htt_stats_buf->be_mu_bar_trigger_err)); 1847 len += scnprintf(buf + len, buf_len - len, "be_mu_rts_trigger_err = %u\n\n", 1848 le32_to_cpu(htt_stats_buf->be_mu_rts_trigger_err)); 1849 1850 stats_req->buf_len = len; 1851 } 1852 1853 static void 1854 ath12k_htt_print_tx_selfgen_ac_sched_status_stats_tlv(const void *tag_buf, u16 tag_len, 1855 struct debug_htt_stats_req *stats) 1856 { 1857 const struct ath12k_htt_tx_selfgen_ac_sched_status_stats_tlv *htt_stats_buf = 1858 tag_buf; 1859 u8 *buf = stats->buf; 1860 u32 len = stats->buf_len; 1861 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1862 1863 if (tag_len < sizeof(*htt_stats_buf)) 1864 return; 1865 1866 len += scnprintf(buf + len, buf_len - len, 1867 "HTT_TX_SELFGEN_AC_SCHED_STATUS_STATS_TLV:\n"); 1868 len += print_array_to_buf(buf, len, "ac_su_ndpa_sch_status", 1869 htt_stats_buf->ac_su_ndpa_sch_status, 1870 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1871 len += print_array_to_buf(buf, len, "ac_su_ndp_sch_status", 1872 htt_stats_buf->ac_su_ndp_sch_status, 1873 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1874 len += print_array_to_buf(buf, len, "ac_mu_mimo_ndpa_sch_status", 1875 htt_stats_buf->ac_mu_mimo_ndpa_sch_status, 1876 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1877 len += print_array_to_buf(buf, len, "ac_mu_mimo_ndp_sch_status", 1878 htt_stats_buf->ac_mu_mimo_ndp_sch_status, 1879 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1880 len += print_array_to_buf(buf, len, "ac_mu_mimo_brp_sch_status", 1881 htt_stats_buf->ac_mu_mimo_brp_sch_status, 1882 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1883 len += print_array_to_buf(buf, len, "ac_su_ndp_sch_flag_err", 1884 htt_stats_buf->ac_su_ndp_sch_flag_err, 1885 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1886 len += print_array_to_buf(buf, len, "ac_mu_mimo_ndp_sch_flag_err", 1887 htt_stats_buf->ac_mu_mimo_ndp_sch_flag_err, 1888 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1889 len += print_array_to_buf(buf, len, "ac_mu_mimo_brp_sch_flag_err", 1890 htt_stats_buf->ac_mu_mimo_brp_sch_flag_err, 1891 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n\n"); 1892 1893 stats->buf_len = len; 1894 } 1895 1896 static void 1897 ath12k_htt_print_tx_selfgen_ax_sched_status_stats_tlv(const void *tag_buf, u16 tag_len, 1898 struct debug_htt_stats_req *stats) 1899 { 1900 const struct ath12k_htt_tx_selfgen_ax_sched_status_stats_tlv *htt_stats_buf = 1901 tag_buf; 1902 u8 *buf = stats->buf; 1903 u32 len = stats->buf_len; 1904 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1905 1906 if (tag_len < sizeof(*htt_stats_buf)) 1907 return; 1908 1909 len += scnprintf(buf + len, buf_len - len, 1910 "HTT_TX_SELFGEN_AX_SCHED_STATUS_STATS_TLV:\n"); 1911 len += print_array_to_buf(buf, len, "ax_su_ndpa_sch_status", 1912 htt_stats_buf->ax_su_ndpa_sch_status, 1913 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1914 len += print_array_to_buf(buf, len, "ax_su_ndp_sch_status", 1915 htt_stats_buf->ax_su_ndp_sch_status, 1916 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1917 len += print_array_to_buf(buf, len, "ax_mu_mimo_ndpa_sch_status", 1918 htt_stats_buf->ax_mu_mimo_ndpa_sch_status, 1919 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1920 len += print_array_to_buf(buf, len, "ax_mu_mimo_ndp_sch_status", 1921 htt_stats_buf->ax_mu_mimo_ndp_sch_status, 1922 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1923 len += print_array_to_buf(buf, len, "ax_mu_brp_sch_status", 1924 htt_stats_buf->ax_mu_brp_sch_status, 1925 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1926 len += print_array_to_buf(buf, len, "ax_mu_bar_sch_status", 1927 htt_stats_buf->ax_mu_bar_sch_status, 1928 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1929 len += print_array_to_buf(buf, len, "ax_basic_trig_sch_status", 1930 htt_stats_buf->ax_basic_trig_sch_status, 1931 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1932 len += print_array_to_buf(buf, len, "ax_su_ndp_sch_flag_err", 1933 htt_stats_buf->ax_su_ndp_sch_flag_err, 1934 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1935 len += print_array_to_buf(buf, len, "ax_mu_mimo_ndp_sch_flag_err", 1936 htt_stats_buf->ax_mu_mimo_ndp_sch_flag_err, 1937 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1938 len += print_array_to_buf(buf, len, "ax_mu_brp_sch_flag_err", 1939 htt_stats_buf->ax_mu_brp_sch_flag_err, 1940 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1941 len += print_array_to_buf(buf, len, "ax_mu_bar_sch_flag_err", 1942 htt_stats_buf->ax_mu_bar_sch_flag_err, 1943 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1944 len += print_array_to_buf(buf, len, "ax_basic_trig_sch_flag_err", 1945 htt_stats_buf->ax_basic_trig_sch_flag_err, 1946 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1947 len += print_array_to_buf(buf, len, "ax_ulmumimo_trig_sch_status", 1948 htt_stats_buf->ax_ulmumimo_trig_sch_status, 1949 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1950 len += print_array_to_buf(buf, len, "ax_ulmumimo_trig_sch_flag_err", 1951 htt_stats_buf->ax_ulmumimo_trig_sch_flag_err, 1952 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n\n"); 1953 1954 stats->buf_len = len; 1955 } 1956 1957 static void 1958 ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(const void *tag_buf, u16 tag_len, 1959 struct debug_htt_stats_req *stats) 1960 { 1961 const struct ath12k_htt_tx_selfgen_be_sched_status_stats_tlv *htt_stats_buf = 1962 tag_buf; 1963 u8 *buf = stats->buf; 1964 u32 len = stats->buf_len; 1965 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 1966 1967 if (tag_len < sizeof(*htt_stats_buf)) 1968 return; 1969 1970 len += scnprintf(buf + len, buf_len - len, 1971 "HTT_TX_SELFGEN_BE_SCHED_STATUS_STATS_TLV:\n"); 1972 len += print_array_to_buf(buf, len, "be_su_ndpa_sch_status", 1973 htt_stats_buf->be_su_ndpa_sch_status, 1974 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1975 len += print_array_to_buf(buf, len, "be_su_ndp_sch_status", 1976 htt_stats_buf->be_su_ndp_sch_status, 1977 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1978 len += print_array_to_buf(buf, len, "be_mu_mimo_ndpa_sch_status", 1979 htt_stats_buf->be_mu_mimo_ndpa_sch_status, 1980 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1981 len += print_array_to_buf(buf, len, "be_mu_mimo_ndp_sch_status", 1982 htt_stats_buf->be_mu_mimo_ndp_sch_status, 1983 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1984 len += print_array_to_buf(buf, len, "be_mu_brp_sch_status", 1985 htt_stats_buf->be_mu_brp_sch_status, 1986 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1987 len += print_array_to_buf(buf, len, "be_mu_bar_sch_status", 1988 htt_stats_buf->be_mu_bar_sch_status, 1989 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1990 len += print_array_to_buf(buf, len, "be_basic_trig_sch_status", 1991 htt_stats_buf->be_basic_trig_sch_status, 1992 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 1993 len += print_array_to_buf(buf, len, "be_su_ndp_sch_flag_err", 1994 htt_stats_buf->be_su_ndp_sch_flag_err, 1995 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1996 len += print_array_to_buf(buf, len, "be_mu_mimo_ndp_sch_flag_err", 1997 htt_stats_buf->be_mu_mimo_ndp_sch_flag_err, 1998 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 1999 len += print_array_to_buf(buf, len, "be_mu_brp_sch_flag_err", 2000 htt_stats_buf->be_mu_brp_sch_flag_err, 2001 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 2002 len += print_array_to_buf(buf, len, "be_mu_bar_sch_flag_err", 2003 htt_stats_buf->be_mu_bar_sch_flag_err, 2004 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 2005 len += print_array_to_buf(buf, len, "be_basic_trig_sch_flag_err", 2006 htt_stats_buf->be_basic_trig_sch_flag_err, 2007 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n"); 2008 len += print_array_to_buf(buf, len, "be_basic_trig_sch_flag_err", 2009 htt_stats_buf->be_basic_trig_sch_flag_err, 2010 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, "\n"); 2011 len += print_array_to_buf(buf, len, "be_ulmumimo_trig_sch_flag_err", 2012 htt_stats_buf->be_ulmumimo_trig_sch_flag_err, 2013 ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, "\n\n"); 2014 2015 stats->buf_len = len; 2016 } 2017 2018 static void 2019 ath12k_htt_print_stats_string_tlv(const void *tag_buf, u16 tag_len, 2020 struct debug_htt_stats_req *stats_req) 2021 { 2022 const struct ath12k_htt_stats_string_tlv *htt_stats_buf = tag_buf; 2023 u8 *buf = stats_req->buf; 2024 u32 len = stats_req->buf_len; 2025 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2026 u8 i; 2027 u16 index = 0; 2028 u32 datum; 2029 char data[ATH12K_HTT_MAX_STRING_LEN] = {}; 2030 2031 tag_len = tag_len >> 2; 2032 2033 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_STRING_TLV:\n"); 2034 for (i = 0; i < tag_len; i++) { 2035 datum = __le32_to_cpu(htt_stats_buf->data[i]); 2036 index += scnprintf(&data[index], ATH12K_HTT_MAX_STRING_LEN - index, 2037 "%.*s", 4, (char *)&datum); 2038 if (index >= ATH12K_HTT_MAX_STRING_LEN) 2039 break; 2040 } 2041 len += scnprintf(buf + len, buf_len - len, "data = %s\n\n", data); 2042 2043 stats_req->buf_len = len; 2044 } 2045 2046 static void 2047 ath12k_htt_print_sring_stats_tlv(const void *tag_buf, u16 tag_len, 2048 struct debug_htt_stats_req *stats_req) 2049 { 2050 const struct ath12k_htt_sring_stats_tlv *htt_stats_buf = tag_buf; 2051 u8 *buf = stats_req->buf; 2052 u32 len = stats_req->buf_len; 2053 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2054 u32 mac_id_word; 2055 u32 avail_words; 2056 u32 head_tail_ptr; 2057 u32 sring_stat; 2058 u32 tail_ptr; 2059 2060 if (tag_len < sizeof(*htt_stats_buf)) 2061 return; 2062 2063 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__ring_id__arena__ep); 2064 avail_words = __le32_to_cpu(htt_stats_buf->num_avail_words__num_valid_words); 2065 head_tail_ptr = __le32_to_cpu(htt_stats_buf->head_ptr__tail_ptr); 2066 sring_stat = __le32_to_cpu(htt_stats_buf->consumer_empty__producer_full); 2067 tail_ptr = __le32_to_cpu(htt_stats_buf->prefetch_count__internal_tail_ptr); 2068 2069 len += scnprintf(buf + len, buf_len - len, "HTT_SRING_STATS_TLV:\n"); 2070 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 2071 u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_MAC_ID)); 2072 len += scnprintf(buf + len, buf_len - len, "ring_id = %u\n", 2073 u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_RING_ID)); 2074 len += scnprintf(buf + len, buf_len - len, "arena = %u\n", 2075 u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_ARENA)); 2076 len += scnprintf(buf + len, buf_len - len, "ep = %u\n", 2077 u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_EP)); 2078 len += scnprintf(buf + len, buf_len - len, "base_addr_lsb = 0x%x\n", 2079 le32_to_cpu(htt_stats_buf->base_addr_lsb)); 2080 len += scnprintf(buf + len, buf_len - len, "base_addr_msb = 0x%x\n", 2081 le32_to_cpu(htt_stats_buf->base_addr_msb)); 2082 len += scnprintf(buf + len, buf_len - len, "ring_size = %u\n", 2083 le32_to_cpu(htt_stats_buf->ring_size)); 2084 len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n", 2085 le32_to_cpu(htt_stats_buf->elem_size)); 2086 len += scnprintf(buf + len, buf_len - len, "num_avail_words = %u\n", 2087 u32_get_bits(avail_words, 2088 ATH12K_HTT_SRING_STATS_NUM_AVAIL_WORDS)); 2089 len += scnprintf(buf + len, buf_len - len, "num_valid_words = %u\n", 2090 u32_get_bits(avail_words, 2091 ATH12K_HTT_SRING_STATS_NUM_VALID_WORDS)); 2092 len += scnprintf(buf + len, buf_len - len, "head_ptr = %u\n", 2093 u32_get_bits(head_tail_ptr, ATH12K_HTT_SRING_STATS_HEAD_PTR)); 2094 len += scnprintf(buf + len, buf_len - len, "tail_ptr = %u\n", 2095 u32_get_bits(head_tail_ptr, ATH12K_HTT_SRING_STATS_TAIL_PTR)); 2096 len += scnprintf(buf + len, buf_len - len, "consumer_empty = %u\n", 2097 u32_get_bits(sring_stat, 2098 ATH12K_HTT_SRING_STATS_CONSUMER_EMPTY)); 2099 len += scnprintf(buf + len, buf_len - len, "producer_full = %u\n", 2100 u32_get_bits(head_tail_ptr, 2101 ATH12K_HTT_SRING_STATS_PRODUCER_FULL)); 2102 len += scnprintf(buf + len, buf_len - len, "prefetch_count = %u\n", 2103 u32_get_bits(tail_ptr, ATH12K_HTT_SRING_STATS_PREFETCH_COUNT)); 2104 len += scnprintf(buf + len, buf_len - len, "internal_tail_ptr = %u\n\n", 2105 u32_get_bits(tail_ptr, 2106 ATH12K_HTT_SRING_STATS_INTERNAL_TAIL_PTR)); 2107 2108 stats_req->buf_len = len; 2109 } 2110 2111 static void 2112 ath12k_htt_print_sfm_cmn_tlv(const void *tag_buf, u16 tag_len, 2113 struct debug_htt_stats_req *stats_req) 2114 { 2115 const struct ath12k_htt_sfm_cmn_tlv *htt_stats_buf = tag_buf; 2116 u8 *buf = stats_req->buf; 2117 u32 len = stats_req->buf_len; 2118 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2119 u32 mac_id_word; 2120 2121 if (tag_len < sizeof(*htt_stats_buf)) 2122 return; 2123 2124 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word); 2125 2126 len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CMN_TLV:\n"); 2127 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 2128 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 2129 len += scnprintf(buf + len, buf_len - len, "buf_total = %u\n", 2130 le32_to_cpu(htt_stats_buf->buf_total)); 2131 len += scnprintf(buf + len, buf_len - len, "mem_empty = %u\n", 2132 le32_to_cpu(htt_stats_buf->mem_empty)); 2133 len += scnprintf(buf + len, buf_len - len, "deallocate_bufs = %u\n", 2134 le32_to_cpu(htt_stats_buf->deallocate_bufs)); 2135 len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n", 2136 le32_to_cpu(htt_stats_buf->num_records)); 2137 2138 stats_req->buf_len = len; 2139 } 2140 2141 static void 2142 ath12k_htt_print_sfm_client_tlv(const void *tag_buf, u16 tag_len, 2143 struct debug_htt_stats_req *stats_req) 2144 { 2145 const struct ath12k_htt_sfm_client_tlv *htt_stats_buf = tag_buf; 2146 u8 *buf = stats_req->buf; 2147 u32 len = stats_req->buf_len; 2148 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2149 2150 if (tag_len < sizeof(*htt_stats_buf)) 2151 return; 2152 2153 len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_TLV:\n"); 2154 len += scnprintf(buf + len, buf_len - len, "client_id = %u\n", 2155 le32_to_cpu(htt_stats_buf->client_id)); 2156 len += scnprintf(buf + len, buf_len - len, "buf_min = %u\n", 2157 le32_to_cpu(htt_stats_buf->buf_min)); 2158 len += scnprintf(buf + len, buf_len - len, "buf_max = %u\n", 2159 le32_to_cpu(htt_stats_buf->buf_max)); 2160 len += scnprintf(buf + len, buf_len - len, "buf_busy = %u\n", 2161 le32_to_cpu(htt_stats_buf->buf_busy)); 2162 len += scnprintf(buf + len, buf_len - len, "buf_alloc = %u\n", 2163 le32_to_cpu(htt_stats_buf->buf_alloc)); 2164 len += scnprintf(buf + len, buf_len - len, "buf_avail = %u\n", 2165 le32_to_cpu(htt_stats_buf->buf_avail)); 2166 len += scnprintf(buf + len, buf_len - len, "num_users = %u\n\n", 2167 le32_to_cpu(htt_stats_buf->num_users)); 2168 2169 stats_req->buf_len = len; 2170 } 2171 2172 static void 2173 ath12k_htt_print_sfm_client_user_tlv(const void *tag_buf, u16 tag_len, 2174 struct debug_htt_stats_req *stats_req) 2175 { 2176 const struct ath12k_htt_sfm_client_user_tlv *htt_stats_buf = tag_buf; 2177 u8 *buf = stats_req->buf; 2178 u32 len = stats_req->buf_len; 2179 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2180 u16 num_elems = tag_len >> 2; 2181 2182 len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_USER_TLV:\n"); 2183 len += print_array_to_buf(buf, len, "dwords_used_by_user_n", 2184 htt_stats_buf->dwords_used_by_user_n, 2185 num_elems, "\n\n"); 2186 2187 stats_req->buf_len = len; 2188 } 2189 2190 static void 2191 ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(const void *tag_buf, u16 tag_len, 2192 struct debug_htt_stats_req *stats_req) 2193 { 2194 const struct ath12k_htt_tx_pdev_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf; 2195 u8 *buf = stats_req->buf; 2196 u32 len = stats_req->buf_len; 2197 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2198 u8 i; 2199 2200 if (tag_len < sizeof(*htt_stats_buf)) 2201 return; 2202 2203 len += scnprintf(buf + len, buf_len - len, 2204 "HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:\n"); 2205 len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n", 2206 le32_to_cpu(htt_stats_buf->mu_mimo_sch_posted)); 2207 len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n", 2208 le32_to_cpu(htt_stats_buf->mu_mimo_sch_failed)); 2209 len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n", 2210 le32_to_cpu(htt_stats_buf->mu_mimo_ppdu_posted)); 2211 len += scnprintf(buf + len, buf_len - len, 2212 "\nac_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0, 2213 le32_to_cpu(htt_stats_buf->ac_mu_mimo_per_grp_sz[0])); 2214 for (i = 1; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) { 2215 len += scnprintf(buf + len, buf_len - len, 2216 "ac_mu_mimo_sch_posted_per_group_index %u ", i); 2217 len += scnprintf(buf + len, buf_len - len, 2218 "(TOTAL STREAMS = %u) = %u\n", i + 1, 2219 le32_to_cpu(htt_stats_buf->ac_mu_mimo_per_grp_sz[i])); 2220 } 2221 2222 for (i = 0; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) { 2223 len += scnprintf(buf + len, buf_len - len, 2224 "ac_mu_mimo_sch_posted_per_group_index %u ", 2225 i + ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS); 2226 len += scnprintf(buf + len, buf_len - len, 2227 "(TOTAL STREAMS = %u) = %u\n", 2228 i + ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS + 1, 2229 le32_to_cpu(htt_stats_buf->ac_mu_mimo_grp_sz_ext[i])); 2230 } 2231 2232 len += scnprintf(buf + len, buf_len - len, 2233 "\nax_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0, 2234 le32_to_cpu(htt_stats_buf->ax_mu_mimo_per_grp_sz[0])); 2235 for (i = 1; i < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; i++) { 2236 len += scnprintf(buf + len, buf_len - len, 2237 "ax_mu_mimo_sch_posted_per_group_index %u ", i); 2238 len += scnprintf(buf + len, buf_len - len, 2239 "(TOTAL STREAMS = %u) = %u\n", i + 1, 2240 le32_to_cpu(htt_stats_buf->ax_mu_mimo_per_grp_sz[i])); 2241 } 2242 2243 len += scnprintf(buf + len, buf_len - len, 2244 "\nbe_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0, 2245 le32_to_cpu(htt_stats_buf->be_mu_mimo_per_grp_sz[0])); 2246 for (i = 1; i < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; i++) { 2247 len += scnprintf(buf + len, buf_len - len, 2248 "be_mu_mimo_sch_posted_per_group_index %u ", i); 2249 len += scnprintf(buf + len, buf_len - len, 2250 "(TOTAL STREAMS = %u) = %u\n", i + 1, 2251 le32_to_cpu(htt_stats_buf->be_mu_mimo_per_grp_sz[i])); 2252 } 2253 2254 len += scnprintf(buf + len, buf_len - len, "\n11ac MU_MIMO SCH STATS:\n"); 2255 for (i = 0; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) { 2256 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_sch_nusers_"); 2257 len += scnprintf(buf + len, buf_len - len, "%u = %u\n", i, 2258 le32_to_cpu(htt_stats_buf->ac_mu_mimo_sch_nusers[i])); 2259 } 2260 2261 len += scnprintf(buf + len, buf_len - len, "\n11ax MU_MIMO SCH STATS:\n"); 2262 for (i = 0; i < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; i++) { 2263 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_sch_nusers_"); 2264 len += scnprintf(buf + len, buf_len - len, "%u = %u\n", i, 2265 le32_to_cpu(htt_stats_buf->ax_mu_mimo_sch_nusers[i])); 2266 } 2267 2268 len += scnprintf(buf + len, buf_len - len, "\n11be MU_MIMO SCH STATS:\n"); 2269 for (i = 0; i < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; i++) { 2270 len += scnprintf(buf + len, buf_len - len, "be_mu_mimo_sch_nusers_"); 2271 len += scnprintf(buf + len, buf_len - len, "%u = %u\n", i, 2272 le32_to_cpu(htt_stats_buf->be_mu_mimo_sch_nusers[i])); 2273 } 2274 2275 len += scnprintf(buf + len, buf_len - len, "\n11ax OFDMA SCH STATS:\n"); 2276 for (i = 0; i < ATH12K_HTT_TX_NUM_OFDMA_USER_STATS; i++) { 2277 len += scnprintf(buf + len, buf_len - len, 2278 "ax_ofdma_sch_nusers_%u = %u\n", i, 2279 le32_to_cpu(htt_stats_buf->ax_ofdma_sch_nusers[i])); 2280 len += scnprintf(buf + len, buf_len - len, 2281 "ax_ul_ofdma_basic_sch_nusers_%u = %u\n", i, 2282 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_nusers[i])); 2283 len += scnprintf(buf + len, buf_len - len, 2284 "ax_ul_ofdma_bsr_sch_nusers_%u = %u\n", i, 2285 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_bsr_nusers[i])); 2286 len += scnprintf(buf + len, buf_len - len, 2287 "ax_ul_ofdma_bar_sch_nusers_%u = %u\n", i, 2288 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_bar_nusers[i])); 2289 len += scnprintf(buf + len, buf_len - len, 2290 "ax_ul_ofdma_brp_sch_nusers_%u = %u\n\n", i, 2291 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_brp_nusers[i])); 2292 } 2293 2294 len += scnprintf(buf + len, buf_len - len, "11ax UL MUMIMO SCH STATS:\n"); 2295 for (i = 0; i < ATH12K_HTT_TX_NUM_UL_MUMIMO_USER_STATS; i++) { 2296 len += scnprintf(buf + len, buf_len - len, 2297 "ax_ul_mumimo_basic_sch_nusers_%u = %u\n", i, 2298 le32_to_cpu(htt_stats_buf->ax_ul_mumimo_nusers[i])); 2299 len += scnprintf(buf + len, buf_len - len, 2300 "ax_ul_mumimo_brp_sch_nusers_%u = %u\n\n", i, 2301 le32_to_cpu(htt_stats_buf->ax_ul_mumimo_brp_nusers[i])); 2302 } 2303 2304 stats_req->buf_len = len; 2305 } 2306 2307 static void 2308 ath12k_htt_print_tx_pdev_mumimo_grp_stats_tlv(const void *tag_buf, u16 tag_len, 2309 struct debug_htt_stats_req *stats_req) 2310 { 2311 const struct ath12k_htt_tx_pdev_mumimo_grp_stats_tlv *htt_stats_buf = tag_buf; 2312 u8 *buf = stats_req->buf; 2313 u32 len = stats_req->buf_len; 2314 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2315 int j; 2316 2317 if (tag_len < sizeof(*htt_stats_buf)) 2318 return; 2319 2320 len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_MUMIMO_GRP_STATS:\n"); 2321 len += print_array_to_buf(buf, len, 2322 "dl_mumimo_grp_tputs_observed (per bin = 300 mbps)", 2323 htt_stats_buf->dl_mumimo_grp_tputs, 2324 ATH12K_HTT_STATS_MUMIMO_TPUT_NUM_BINS, "\n"); 2325 len += print_array_to_buf(buf, len, "dl_mumimo_grp eligible", 2326 htt_stats_buf->dl_mumimo_grp_eligible, 2327 ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, "\n"); 2328 len += print_array_to_buf(buf, len, "dl_mumimo_grp_ineligible", 2329 htt_stats_buf->dl_mumimo_grp_ineligible, 2330 ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, "\n"); 2331 len += scnprintf(buf + len, buf_len - len, "dl_mumimo_grp_invalid:\n"); 2332 for (j = 0; j < ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ; j++) { 2333 len += scnprintf(buf + len, buf_len - len, "grp_id = %u", j); 2334 len += print_array_to_buf(buf, len, "", 2335 htt_stats_buf->dl_mumimo_grp_invalid, 2336 ATH12K_HTT_STATS_MAX_INVALID_REASON_CODE, 2337 "\n"); 2338 } 2339 2340 len += print_array_to_buf(buf, len, "ul_mumimo_grp_best_grp_size", 2341 htt_stats_buf->ul_mumimo_grp_best_grp_size, 2342 ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, "\n"); 2343 len += print_array_to_buf(buf, len, "ul_mumimo_grp_best_num_usrs = ", 2344 htt_stats_buf->ul_mumimo_grp_best_usrs, 2345 ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS, "\n"); 2346 len += print_array_to_buf(buf, len, 2347 "ul_mumimo_grp_tputs_observed (per bin = 300 mbps)", 2348 htt_stats_buf->ul_mumimo_grp_tputs, 2349 ATH12K_HTT_STATS_MUMIMO_TPUT_NUM_BINS, "\n\n"); 2350 2351 stats_req->buf_len = len; 2352 } 2353 2354 static void 2355 ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf, u16 tag_len, 2356 struct debug_htt_stats_req *stats_req) 2357 { 2358 const struct ath12k_htt_tx_pdev_mpdu_stats_tlv *htt_stats_buf = tag_buf; 2359 u8 *buf = stats_req->buf; 2360 u32 len = stats_req->buf_len; 2361 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2362 u32 user_index; 2363 u32 tx_sched_mode; 2364 2365 if (tag_len < sizeof(*htt_stats_buf)) 2366 return; 2367 2368 user_index = __le32_to_cpu(htt_stats_buf->user_index); 2369 tx_sched_mode = __le32_to_cpu(htt_stats_buf->tx_sched_mode); 2370 2371 if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) { 2372 if (!user_index) 2373 len += scnprintf(buf + len, buf_len - len, 2374 "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n"); 2375 2376 if (user_index < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS) { 2377 len += scnprintf(buf + len, buf_len - len, 2378 "ac_mu_mimo_mpdus_queued_usr_%u = %u\n", 2379 user_index, 2380 le32_to_cpu(htt_stats_buf->mpdus_queued_usr)); 2381 len += scnprintf(buf + len, buf_len - len, 2382 "ac_mu_mimo_mpdus_tried_usr_%u = %u\n", 2383 user_index, 2384 le32_to_cpu(htt_stats_buf->mpdus_tried_usr)); 2385 len += scnprintf(buf + len, buf_len - len, 2386 "ac_mu_mimo_mpdus_failed_usr_%u = %u\n", 2387 user_index, 2388 le32_to_cpu(htt_stats_buf->mpdus_failed_usr)); 2389 len += scnprintf(buf + len, buf_len - len, 2390 "ac_mu_mimo_mpdus_requeued_usr_%u = %u\n", 2391 user_index, 2392 le32_to_cpu(htt_stats_buf->mpdus_requeued_usr)); 2393 len += scnprintf(buf + len, buf_len - len, 2394 "ac_mu_mimo_err_no_ba_usr_%u = %u\n", 2395 user_index, 2396 le32_to_cpu(htt_stats_buf->err_no_ba_usr)); 2397 len += scnprintf(buf + len, buf_len - len, 2398 "ac_mu_mimo_mpdu_underrun_usr_%u = %u\n", 2399 user_index, 2400 le32_to_cpu(htt_stats_buf->mpdu_underrun_usr)); 2401 len += scnprintf(buf + len, buf_len - len, 2402 "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n\n", 2403 user_index, 2404 le32_to_cpu(htt_stats_buf->ampdu_underrun_usr)); 2405 } 2406 } 2407 2408 if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) { 2409 if (!user_index) 2410 len += scnprintf(buf + len, buf_len - len, 2411 "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n"); 2412 2413 if (user_index < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS) { 2414 len += scnprintf(buf + len, buf_len - len, 2415 "ax_mu_mimo_mpdus_queued_usr_%u = %u\n", 2416 user_index, 2417 le32_to_cpu(htt_stats_buf->mpdus_queued_usr)); 2418 len += scnprintf(buf + len, buf_len - len, 2419 "ax_mu_mimo_mpdus_tried_usr_%u = %u\n", 2420 user_index, 2421 le32_to_cpu(htt_stats_buf->mpdus_tried_usr)); 2422 len += scnprintf(buf + len, buf_len - len, 2423 "ax_mu_mimo_mpdus_failed_usr_%u = %u\n", 2424 user_index, 2425 le32_to_cpu(htt_stats_buf->mpdus_failed_usr)); 2426 len += scnprintf(buf + len, buf_len - len, 2427 "ax_mu_mimo_mpdus_requeued_usr_%u = %u\n", 2428 user_index, 2429 le32_to_cpu(htt_stats_buf->mpdus_requeued_usr)); 2430 len += scnprintf(buf + len, buf_len - len, 2431 "ax_mu_mimo_err_no_ba_usr_%u = %u\n", 2432 user_index, 2433 le32_to_cpu(htt_stats_buf->err_no_ba_usr)); 2434 len += scnprintf(buf + len, buf_len - len, 2435 "ax_mu_mimo_mpdu_underrun_usr_%u = %u\n", 2436 user_index, 2437 le32_to_cpu(htt_stats_buf->mpdu_underrun_usr)); 2438 len += scnprintf(buf + len, buf_len - len, 2439 "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n\n", 2440 user_index, 2441 le32_to_cpu(htt_stats_buf->ampdu_underrun_usr)); 2442 } 2443 } 2444 2445 if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) { 2446 if (!user_index) 2447 len += scnprintf(buf + len, buf_len - len, 2448 "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n"); 2449 2450 if (user_index < ATH12K_HTT_TX_NUM_OFDMA_USER_STATS) { 2451 len += scnprintf(buf + len, buf_len - len, 2452 "ax_mu_ofdma_mpdus_queued_usr_%u = %u\n", 2453 user_index, 2454 le32_to_cpu(htt_stats_buf->mpdus_queued_usr)); 2455 len += scnprintf(buf + len, buf_len - len, 2456 "ax_mu_ofdma_mpdus_tried_usr_%u = %u\n", 2457 user_index, 2458 le32_to_cpu(htt_stats_buf->mpdus_tried_usr)); 2459 len += scnprintf(buf + len, buf_len - len, 2460 "ax_mu_ofdma_mpdus_failed_usr_%u = %u\n", 2461 user_index, 2462 le32_to_cpu(htt_stats_buf->mpdus_failed_usr)); 2463 len += scnprintf(buf + len, buf_len - len, 2464 "ax_mu_ofdma_mpdus_requeued_usr_%u = %u\n", 2465 user_index, 2466 le32_to_cpu(htt_stats_buf->mpdus_requeued_usr)); 2467 len += scnprintf(buf + len, buf_len - len, 2468 "ax_mu_ofdma_err_no_ba_usr_%u = %u\n", 2469 user_index, 2470 le32_to_cpu(htt_stats_buf->err_no_ba_usr)); 2471 len += scnprintf(buf + len, buf_len - len, 2472 "ax_mu_ofdma_mpdu_underrun_usr_%u = %u\n", 2473 user_index, 2474 le32_to_cpu(htt_stats_buf->mpdu_underrun_usr)); 2475 len += scnprintf(buf + len, buf_len - len, 2476 "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n\n", 2477 user_index, 2478 le32_to_cpu(htt_stats_buf->ampdu_underrun_usr)); 2479 } 2480 } 2481 2482 stats_req->buf_len = len; 2483 } 2484 2485 static void 2486 ath12k_htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf, u16 tag_len, 2487 struct debug_htt_stats_req *stats_req) 2488 { 2489 const struct ath12k_htt_pdev_cca_stats_hist_v1_tlv *htt_stats_buf = tag_buf; 2490 u8 *buf = stats_req->buf; 2491 u32 len = stats_req->buf_len; 2492 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2493 2494 if (tag_len < sizeof(*htt_stats_buf)) 2495 return; 2496 2497 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_CCA_STATS_HIST_TLV :\n"); 2498 len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n", 2499 le32_to_cpu(htt_stats_buf->chan_num)); 2500 len += scnprintf(buf + len, buf_len - len, "num_records = %u\n", 2501 le32_to_cpu(htt_stats_buf->num_records)); 2502 len += scnprintf(buf + len, buf_len - len, "valid_cca_counters_bitmap = 0x%x\n", 2503 le32_to_cpu(htt_stats_buf->valid_cca_counters_bitmap)); 2504 len += scnprintf(buf + len, buf_len - len, "collection_interval = %u\n\n", 2505 le32_to_cpu(htt_stats_buf->collection_interval)); 2506 2507 stats_req->buf_len = len; 2508 } 2509 2510 static void 2511 ath12k_htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf, u16 tag_len, 2512 struct debug_htt_stats_req *stats_req) 2513 { 2514 const struct ath12k_htt_pdev_stats_cca_counters_tlv *htt_stats_buf = tag_buf; 2515 u8 *buf = stats_req->buf; 2516 u32 len = stats_req->buf_len; 2517 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2518 2519 if (tag_len < sizeof(*htt_stats_buf)) 2520 return; 2521 2522 len += scnprintf(buf + len, buf_len - len, 2523 "HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n"); 2524 len += scnprintf(buf + len, buf_len - len, "tx_frame_usec = %u\n", 2525 le32_to_cpu(htt_stats_buf->tx_frame_usec)); 2526 len += scnprintf(buf + len, buf_len - len, "rx_frame_usec = %u\n", 2527 le32_to_cpu(htt_stats_buf->rx_frame_usec)); 2528 len += scnprintf(buf + len, buf_len - len, "rx_clear_usec = %u\n", 2529 le32_to_cpu(htt_stats_buf->rx_clear_usec)); 2530 len += scnprintf(buf + len, buf_len - len, "my_rx_frame_usec = %u\n", 2531 le32_to_cpu(htt_stats_buf->my_rx_frame_usec)); 2532 len += scnprintf(buf + len, buf_len - len, "usec_cnt = %u\n", 2533 le32_to_cpu(htt_stats_buf->usec_cnt)); 2534 len += scnprintf(buf + len, buf_len - len, "med_rx_idle_usec = %u\n", 2535 le32_to_cpu(htt_stats_buf->med_rx_idle_usec)); 2536 len += scnprintf(buf + len, buf_len - len, "med_tx_idle_global_usec = %u\n", 2537 le32_to_cpu(htt_stats_buf->med_tx_idle_global_usec)); 2538 len += scnprintf(buf + len, buf_len - len, "cca_obss_usec = %u\n\n", 2539 le32_to_cpu(htt_stats_buf->cca_obss_usec)); 2540 2541 stats_req->buf_len = len; 2542 } 2543 2544 static void 2545 ath12k_htt_print_tx_sounding_stats_tlv(const void *tag_buf, u16 tag_len, 2546 struct debug_htt_stats_req *stats_req) 2547 { 2548 const struct ath12k_htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf; 2549 const __le32 *cbf_20, *cbf_40, *cbf_80, *cbf_160, *cbf_320; 2550 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2551 u32 len = stats_req->buf_len; 2552 u8 *buf = stats_req->buf; 2553 u32 tx_sounding_mode; 2554 u8 i, u; 2555 2556 if (tag_len < sizeof(*htt_stats_buf)) 2557 return; 2558 2559 cbf_20 = htt_stats_buf->cbf_20; 2560 cbf_40 = htt_stats_buf->cbf_40; 2561 cbf_80 = htt_stats_buf->cbf_80; 2562 cbf_160 = htt_stats_buf->cbf_160; 2563 cbf_320 = htt_stats_buf->cbf_320; 2564 tx_sounding_mode = le32_to_cpu(htt_stats_buf->tx_sounding_mode); 2565 2566 if (tx_sounding_mode == ATH12K_HTT_TX_AC_SOUNDING_MODE) { 2567 len += scnprintf(buf + len, buf_len - len, 2568 "HTT_TX_AC_SOUNDING_STATS_TLV:\n"); 2569 len += scnprintf(buf + len, buf_len - len, 2570 "ac_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2571 le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]), 2572 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2573 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2574 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2575 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2576 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2577 len += scnprintf(buf + len, buf_len - len, 2578 "ac_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2579 le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]), 2580 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2581 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2582 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2583 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2584 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2585 len += scnprintf(buf + len, buf_len - len, 2586 "ac_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2587 le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]), 2588 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2589 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2590 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2591 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2592 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2593 len += scnprintf(buf + len, buf_len - len, 2594 "ac_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2595 le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]), 2596 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2597 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2598 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2599 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2600 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2601 2602 for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; u++) { 2603 len += scnprintf(buf + len, buf_len - len, 2604 "Sounding User_%u = 20MHz: %u, ", u, 2605 le32_to_cpu(htt_stats_buf->sounding[i++])); 2606 len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ", 2607 le32_to_cpu(htt_stats_buf->sounding[i++])); 2608 len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ", 2609 le32_to_cpu(htt_stats_buf->sounding[i++])); 2610 len += scnprintf(buf + len, buf_len - len, "160MHz: %u\n", 2611 le32_to_cpu(htt_stats_buf->sounding[i++])); 2612 } 2613 } else if (tx_sounding_mode == ATH12K_HTT_TX_AX_SOUNDING_MODE) { 2614 len += scnprintf(buf + len, buf_len - len, 2615 "\nHTT_TX_AX_SOUNDING_STATS_TLV:\n"); 2616 len += scnprintf(buf + len, buf_len - len, 2617 "ax_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2618 le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]), 2619 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2620 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2621 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2622 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2623 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2624 len += scnprintf(buf + len, buf_len - len, 2625 "ax_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2626 le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]), 2627 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2628 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2629 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2630 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2631 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2632 len += scnprintf(buf + len, buf_len - len, 2633 "ax_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2634 le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]), 2635 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2636 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2637 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2638 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2639 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2640 len += scnprintf(buf + len, buf_len - len, 2641 "ax_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2642 le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]), 2643 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2644 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2645 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2646 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2647 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2648 2649 for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; u++) { 2650 len += scnprintf(buf + len, buf_len - len, 2651 "Sounding User_%u = 20MHz: %u, ", u, 2652 le32_to_cpu(htt_stats_buf->sounding[i++])); 2653 len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ", 2654 le32_to_cpu(htt_stats_buf->sounding[i++])); 2655 len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ", 2656 le32_to_cpu(htt_stats_buf->sounding[i++])); 2657 len += scnprintf(buf + len, buf_len - len, "160MHz: %u\n", 2658 le32_to_cpu(htt_stats_buf->sounding[i++])); 2659 } 2660 } else if (tx_sounding_mode == ATH12K_HTT_TX_BE_SOUNDING_MODE) { 2661 len += scnprintf(buf + len, buf_len - len, 2662 "\nHTT_TX_BE_SOUNDING_STATS_TLV:\n"); 2663 len += scnprintf(buf + len, buf_len - len, 2664 "be_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2665 le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]), 2666 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2667 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2668 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2669 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2670 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2671 len += scnprintf(buf + len, buf_len - len, 2672 "be_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2673 le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]), 2674 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2675 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2676 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2677 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2678 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2679 len += scnprintf(buf + len, buf_len - len, 2680 "be_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2681 le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]), 2682 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2683 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2684 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2685 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2686 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2687 len += scnprintf(buf + len, buf_len - len, 2688 "be_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2689 le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]), 2690 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2691 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2692 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2693 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2694 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2695 len += scnprintf(buf + len, buf_len - len, 2696 "be_cbf_320 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ", 2697 le32_to_cpu(cbf_320[ATH12K_HTT_IMPL_STEER_STATS]), 2698 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]), 2699 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SURBO_STEER_STATS])); 2700 len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n", 2701 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]), 2702 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MURBO_STEER_STATS])); 2703 for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; u++) { 2704 len += scnprintf(buf + len, buf_len - len, 2705 "Sounding User_%u = 20MHz: %u, ", u, 2706 le32_to_cpu(htt_stats_buf->sounding[i++])); 2707 len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ", 2708 le32_to_cpu(htt_stats_buf->sounding[i++])); 2709 len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ", 2710 le32_to_cpu(htt_stats_buf->sounding[i++])); 2711 len += scnprintf(buf + len, buf_len - len, 2712 "160MHz: %u, 320MHz: %u\n", 2713 le32_to_cpu(htt_stats_buf->sounding[i++]), 2714 le32_to_cpu(htt_stats_buf->sounding_320[u])); 2715 } 2716 } else if (tx_sounding_mode == ATH12K_HTT_TX_CMN_SOUNDING_MODE) { 2717 len += scnprintf(buf + len, buf_len - len, 2718 "\nCV UPLOAD HANDLER STATS:\n"); 2719 len += scnprintf(buf + len, buf_len - len, "cv_nc_mismatch_err = %u\n", 2720 le32_to_cpu(htt_stats_buf->cv_nc_mismatch_err)); 2721 len += scnprintf(buf + len, buf_len - len, "cv_fcs_err = %u\n", 2722 le32_to_cpu(htt_stats_buf->cv_fcs_err)); 2723 len += scnprintf(buf + len, buf_len - len, "cv_frag_idx_mismatch = %u\n", 2724 le32_to_cpu(htt_stats_buf->cv_frag_idx_mismatch)); 2725 len += scnprintf(buf + len, buf_len - len, "cv_invalid_peer_id = %u\n", 2726 le32_to_cpu(htt_stats_buf->cv_invalid_peer_id)); 2727 len += scnprintf(buf + len, buf_len - len, "cv_no_txbf_setup = %u\n", 2728 le32_to_cpu(htt_stats_buf->cv_no_txbf_setup)); 2729 len += scnprintf(buf + len, buf_len - len, "cv_expiry_in_update = %u\n", 2730 le32_to_cpu(htt_stats_buf->cv_expiry_in_update)); 2731 len += scnprintf(buf + len, buf_len - len, "cv_pkt_bw_exceed = %u\n", 2732 le32_to_cpu(htt_stats_buf->cv_pkt_bw_exceed)); 2733 len += scnprintf(buf + len, buf_len - len, "cv_dma_not_done_err = %u\n", 2734 le32_to_cpu(htt_stats_buf->cv_dma_not_done_err)); 2735 len += scnprintf(buf + len, buf_len - len, "cv_update_failed = %u\n", 2736 le32_to_cpu(htt_stats_buf->cv_update_failed)); 2737 len += scnprintf(buf + len, buf_len - len, "cv_dma_timeout_error = %u\n", 2738 le32_to_cpu(htt_stats_buf->cv_dma_timeout_error)); 2739 len += scnprintf(buf + len, buf_len - len, "cv_buf_ibf_uploads = %u\n", 2740 le32_to_cpu(htt_stats_buf->cv_buf_ibf_uploads)); 2741 len += scnprintf(buf + len, buf_len - len, "cv_buf_ebf_uploads = %u\n", 2742 le32_to_cpu(htt_stats_buf->cv_buf_ebf_uploads)); 2743 len += scnprintf(buf + len, buf_len - len, "cv_buf_received = %u\n", 2744 le32_to_cpu(htt_stats_buf->cv_buf_received)); 2745 len += scnprintf(buf + len, buf_len - len, "cv_buf_fed_back = %u\n\n", 2746 le32_to_cpu(htt_stats_buf->cv_buf_fed_back)); 2747 2748 len += scnprintf(buf + len, buf_len - len, "CV QUERY STATS:\n"); 2749 len += scnprintf(buf + len, buf_len - len, "cv_total_query = %u\n", 2750 le32_to_cpu(htt_stats_buf->cv_total_query)); 2751 len += scnprintf(buf + len, buf_len - len, 2752 "cv_total_pattern_query = %u\n", 2753 le32_to_cpu(htt_stats_buf->cv_total_pattern_query)); 2754 len += scnprintf(buf + len, buf_len - len, "cv_total_bw_query = %u\n", 2755 le32_to_cpu(htt_stats_buf->cv_total_bw_query)); 2756 len += scnprintf(buf + len, buf_len - len, "cv_invalid_bw_coding = %u\n", 2757 le32_to_cpu(htt_stats_buf->cv_invalid_bw_coding)); 2758 len += scnprintf(buf + len, buf_len - len, "cv_forced_sounding = %u\n", 2759 le32_to_cpu(htt_stats_buf->cv_forced_sounding)); 2760 len += scnprintf(buf + len, buf_len - len, 2761 "cv_standalone_sounding = %u\n", 2762 le32_to_cpu(htt_stats_buf->cv_standalone_sounding)); 2763 len += scnprintf(buf + len, buf_len - len, "cv_nc_mismatch = %u\n", 2764 le32_to_cpu(htt_stats_buf->cv_nc_mismatch)); 2765 len += scnprintf(buf + len, buf_len - len, "cv_fb_type_mismatch = %u\n", 2766 le32_to_cpu(htt_stats_buf->cv_fb_type_mismatch)); 2767 len += scnprintf(buf + len, buf_len - len, "cv_ofdma_bw_mismatch = %u\n", 2768 le32_to_cpu(htt_stats_buf->cv_ofdma_bw_mismatch)); 2769 len += scnprintf(buf + len, buf_len - len, "cv_bw_mismatch = %u\n", 2770 le32_to_cpu(htt_stats_buf->cv_bw_mismatch)); 2771 len += scnprintf(buf + len, buf_len - len, "cv_pattern_mismatch = %u\n", 2772 le32_to_cpu(htt_stats_buf->cv_pattern_mismatch)); 2773 len += scnprintf(buf + len, buf_len - len, "cv_preamble_mismatch = %u\n", 2774 le32_to_cpu(htt_stats_buf->cv_preamble_mismatch)); 2775 len += scnprintf(buf + len, buf_len - len, "cv_nr_mismatch = %u\n", 2776 le32_to_cpu(htt_stats_buf->cv_nr_mismatch)); 2777 len += scnprintf(buf + len, buf_len - len, 2778 "cv_in_use_cnt_exceeded = %u\n", 2779 le32_to_cpu(htt_stats_buf->cv_in_use_cnt_exceeded)); 2780 len += scnprintf(buf + len, buf_len - len, "cv_ntbr_sounding = %u\n", 2781 le32_to_cpu(htt_stats_buf->cv_ntbr_sounding)); 2782 len += scnprintf(buf + len, buf_len - len, 2783 "cv_found_upload_in_progress = %u\n", 2784 le32_to_cpu(htt_stats_buf->cv_found_upload_in_progress)); 2785 len += scnprintf(buf + len, buf_len - len, 2786 "cv_expired_during_query = %u\n", 2787 le32_to_cpu(htt_stats_buf->cv_expired_during_query)); 2788 len += scnprintf(buf + len, buf_len - len, "cv_found = %u\n", 2789 le32_to_cpu(htt_stats_buf->cv_found)); 2790 len += scnprintf(buf + len, buf_len - len, "cv_not_found = %u\n", 2791 le32_to_cpu(htt_stats_buf->cv_not_found)); 2792 len += scnprintf(buf + len, buf_len - len, "cv_total_query_ibf = %u\n", 2793 le32_to_cpu(htt_stats_buf->cv_total_query_ibf)); 2794 len += scnprintf(buf + len, buf_len - len, "cv_found_ibf = %u\n", 2795 le32_to_cpu(htt_stats_buf->cv_found_ibf)); 2796 len += scnprintf(buf + len, buf_len - len, "cv_not_found_ibf = %u\n", 2797 le32_to_cpu(htt_stats_buf->cv_not_found_ibf)); 2798 len += scnprintf(buf + len, buf_len - len, 2799 "cv_expired_during_query_ibf = %u\n\n", 2800 le32_to_cpu(htt_stats_buf->cv_expired_during_query_ibf)); 2801 } 2802 2803 stats_req->buf_len = len; 2804 } 2805 2806 static void 2807 ath12k_htt_print_pdev_obss_pd_stats_tlv(const void *tag_buf, u16 tag_len, 2808 struct debug_htt_stats_req *stats_req) 2809 { 2810 const struct ath12k_htt_pdev_obss_pd_stats_tlv *htt_stats_buf = tag_buf; 2811 u8 *buf = stats_req->buf; 2812 u32 len = stats_req->buf_len; 2813 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2814 u8 i; 2815 static const char *access_cat_names[ATH12K_HTT_NUM_AC_WMM] = {"best effort", 2816 "background", 2817 "video", "voice"}; 2818 2819 if (tag_len < sizeof(*htt_stats_buf)) 2820 return; 2821 2822 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_OBSS_PD_STATS_TLV:\n"); 2823 len += scnprintf(buf + len, buf_len - len, "num_spatial_reuse_tx = %u\n", 2824 le32_to_cpu(htt_stats_buf->num_sr_tx_transmissions)); 2825 len += scnprintf(buf + len, buf_len - len, 2826 "num_spatial_reuse_opportunities = %u\n", 2827 le32_to_cpu(htt_stats_buf->num_spatial_reuse_opportunities)); 2828 len += scnprintf(buf + len, buf_len - len, "num_non_srg_opportunities = %u\n", 2829 le32_to_cpu(htt_stats_buf->num_non_srg_opportunities)); 2830 len += scnprintf(buf + len, buf_len - len, "num_non_srg_ppdu_tried = %u\n", 2831 le32_to_cpu(htt_stats_buf->num_non_srg_ppdu_tried)); 2832 len += scnprintf(buf + len, buf_len - len, "num_non_srg_ppdu_success = %u\n", 2833 le32_to_cpu(htt_stats_buf->num_non_srg_ppdu_success)); 2834 len += scnprintf(buf + len, buf_len - len, "num_srg_opportunities = %u\n", 2835 le32_to_cpu(htt_stats_buf->num_srg_opportunities)); 2836 len += scnprintf(buf + len, buf_len - len, "num_srg_ppdu_tried = %u\n", 2837 le32_to_cpu(htt_stats_buf->num_srg_ppdu_tried)); 2838 len += scnprintf(buf + len, buf_len - len, "num_srg_ppdu_success = %u\n", 2839 le32_to_cpu(htt_stats_buf->num_srg_ppdu_success)); 2840 len += scnprintf(buf + len, buf_len - len, "num_psr_opportunities = %u\n", 2841 le32_to_cpu(htt_stats_buf->num_psr_opportunities)); 2842 len += scnprintf(buf + len, buf_len - len, "num_psr_ppdu_tried = %u\n", 2843 le32_to_cpu(htt_stats_buf->num_psr_ppdu_tried)); 2844 len += scnprintf(buf + len, buf_len - len, "num_psr_ppdu_success = %u\n", 2845 le32_to_cpu(htt_stats_buf->num_psr_ppdu_success)); 2846 len += scnprintf(buf + len, buf_len - len, "min_duration_check_flush_cnt = %u\n", 2847 le32_to_cpu(htt_stats_buf->num_obss_min_dur_check_flush_cnt)); 2848 len += scnprintf(buf + len, buf_len - len, "sr_ppdu_abort_flush_cnt = %u\n\n", 2849 le32_to_cpu(htt_stats_buf->num_sr_ppdu_abort_flush_cnt)); 2850 2851 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_OBSS_PD_PER_AC_STATS:\n"); 2852 for (i = 0; i < ATH12K_HTT_NUM_AC_WMM; i++) { 2853 len += scnprintf(buf + len, buf_len - len, "Access Category %u (%s)\n", 2854 i, access_cat_names[i]); 2855 len += scnprintf(buf + len, buf_len - len, 2856 "num_non_srg_ppdu_tried = %u\n", 2857 le32_to_cpu(htt_stats_buf->num_non_srg_tried_per_ac[i])); 2858 len += scnprintf(buf + len, buf_len - len, 2859 "num_non_srg_ppdu_success = %u\n", 2860 le32_to_cpu(htt_stats_buf->num_non_srg_success_ac[i])); 2861 len += scnprintf(buf + len, buf_len - len, "num_srg_ppdu_tried = %u\n", 2862 le32_to_cpu(htt_stats_buf->num_srg_tried_per_ac[i])); 2863 len += scnprintf(buf + len, buf_len - len, 2864 "num_srg_ppdu_success = %u\n\n", 2865 le32_to_cpu(htt_stats_buf->num_srg_success_per_ac[i])); 2866 } 2867 2868 stats_req->buf_len = len; 2869 } 2870 2871 static void 2872 ath12k_htt_print_latency_prof_ctx_tlv(const void *tag_buf, u16 tag_len, 2873 struct debug_htt_stats_req *stats_req) 2874 { 2875 const struct ath12k_htt_latency_prof_ctx_tlv *htt_stats_buf = tag_buf; 2876 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2877 u32 len = stats_req->buf_len; 2878 u8 *buf = stats_req->buf; 2879 2880 if (tag_len < sizeof(*htt_stats_buf)) 2881 return; 2882 2883 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_LATENCY_CTX_TLV:\n"); 2884 len += scnprintf(buf + len, buf_len - len, "duration = %u\n", 2885 le32_to_cpu(htt_stats_buf->duration)); 2886 len += scnprintf(buf + len, buf_len - len, "tx_msdu_cnt = %u\n", 2887 le32_to_cpu(htt_stats_buf->tx_msdu_cnt)); 2888 len += scnprintf(buf + len, buf_len - len, "tx_mpdu_cnt = %u\n", 2889 le32_to_cpu(htt_stats_buf->tx_mpdu_cnt)); 2890 len += scnprintf(buf + len, buf_len - len, "rx_msdu_cnt = %u\n", 2891 le32_to_cpu(htt_stats_buf->rx_msdu_cnt)); 2892 len += scnprintf(buf + len, buf_len - len, "rx_mpdu_cnt = %u\n\n", 2893 le32_to_cpu(htt_stats_buf->rx_mpdu_cnt)); 2894 2895 stats_req->buf_len = len; 2896 } 2897 2898 static void 2899 ath12k_htt_print_latency_prof_cnt(const void *tag_buf, u16 tag_len, 2900 struct debug_htt_stats_req *stats_req) 2901 { 2902 const struct ath12k_htt_latency_prof_cnt_tlv *htt_stats_buf = tag_buf; 2903 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2904 u32 len = stats_req->buf_len; 2905 u8 *buf = stats_req->buf; 2906 2907 if (tag_len < sizeof(*htt_stats_buf)) 2908 return; 2909 2910 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_LATENCY_CNT_TLV:\n"); 2911 len += scnprintf(buf + len, buf_len - len, "prof_enable_cnt = %u\n\n", 2912 le32_to_cpu(htt_stats_buf->prof_enable_cnt)); 2913 2914 stats_req->buf_len = len; 2915 } 2916 2917 static void 2918 ath12k_htt_print_latency_prof_stats_tlv(const void *tag_buf, u16 tag_len, 2919 struct debug_htt_stats_req *stats_req) 2920 { 2921 const struct ath12k_htt_latency_prof_stats_tlv *htt_stats_buf = tag_buf; 2922 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2923 u32 len = stats_req->buf_len; 2924 u8 *buf = stats_req->buf; 2925 2926 if (tag_len < sizeof(*htt_stats_buf)) 2927 return; 2928 2929 if (le32_to_cpu(htt_stats_buf->print_header) == 1) { 2930 len += scnprintf(buf + len, buf_len - len, 2931 "HTT_STATS_LATENCY_PROF_TLV:\n"); 2932 } 2933 2934 len += scnprintf(buf + len, buf_len - len, "Latency name = %s\n", 2935 htt_stats_buf->latency_prof_name); 2936 len += scnprintf(buf + len, buf_len - len, "count = %u\n", 2937 le32_to_cpu(htt_stats_buf->cnt)); 2938 len += scnprintf(buf + len, buf_len - len, "minimum = %u\n", 2939 le32_to_cpu(htt_stats_buf->min)); 2940 len += scnprintf(buf + len, buf_len - len, "maximum = %u\n", 2941 le32_to_cpu(htt_stats_buf->max)); 2942 len += scnprintf(buf + len, buf_len - len, "last = %u\n", 2943 le32_to_cpu(htt_stats_buf->last)); 2944 len += scnprintf(buf + len, buf_len - len, "total = %u\n", 2945 le32_to_cpu(htt_stats_buf->tot)); 2946 len += scnprintf(buf + len, buf_len - len, "average = %u\n", 2947 le32_to_cpu(htt_stats_buf->avg)); 2948 len += scnprintf(buf + len, buf_len - len, "histogram interval = %u\n", 2949 le32_to_cpu(htt_stats_buf->hist_intvl)); 2950 len += print_array_to_buf(buf, len, "histogram", htt_stats_buf->hist, 2951 ATH12K_HTT_LATENCY_PROFILE_NUM_MAX_HIST, "\n\n"); 2952 2953 stats_req->buf_len = len; 2954 } 2955 2956 static void 2957 ath12k_htt_print_ul_ofdma_trigger_stats(const void *tag_buf, u16 tag_len, 2958 struct debug_htt_stats_req *stats_req) 2959 { 2960 const struct ath12k_htt_rx_pdev_ul_trigger_stats_tlv *htt_stats_buf = tag_buf; 2961 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 2962 u32 len = stats_req->buf_len; 2963 u8 *buf = stats_req->buf; 2964 u32 mac_id; 2965 u8 j; 2966 2967 if (tag_len < sizeof(*htt_stats_buf)) 2968 return; 2969 2970 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word); 2971 2972 len += scnprintf(buf + len, buf_len - len, 2973 "HTT_RX_PDEV_UL_TRIGGER_STATS_TLV:\n"); 2974 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 2975 u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID)); 2976 len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n", 2977 le32_to_cpu(htt_stats_buf->rx_11ax_ul_ofdma)); 2978 len += print_array_to_buf(buf, len, "ul_ofdma_rx_mcs", 2979 htt_stats_buf->ul_ofdma_rx_mcs, 2980 ATH12K_HTT_RX_NUM_MCS_CNTRS, "\n"); 2981 for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) { 2982 len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_gi[%u]", j); 2983 len += print_array_to_buf(buf, len, "", 2984 htt_stats_buf->ul_ofdma_rx_gi[j], 2985 ATH12K_HTT_RX_NUM_MCS_CNTRS, "\n"); 2986 } 2987 2988 len += print_array_to_buf_index(buf, len, "ul_ofdma_rx_nss", 1, 2989 htt_stats_buf->ul_ofdma_rx_nss, 2990 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n"); 2991 len += print_array_to_buf(buf, len, "ul_ofdma_rx_bw", 2992 htt_stats_buf->ul_ofdma_rx_bw, 2993 ATH12K_HTT_RX_NUM_BW_CNTRS, "\n"); 2994 2995 for (j = 0; j < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; j++) { 2996 len += scnprintf(buf + len, buf_len - len, j == 0 ? 2997 "half_ul_ofdma_rx_bw" : 2998 "quarter_ul_ofdma_rx_bw"); 2999 len += print_array_to_buf(buf, len, "", htt_stats_buf->red_bw[j], 3000 ATH12K_HTT_RX_NUM_BW_CNTRS, "\n"); 3001 } 3002 len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n", 3003 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_stbc)); 3004 len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n", 3005 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_ldpc)); 3006 3007 len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_data_ru_size_ppdu = "); 3008 for (j = 0; j < ATH12K_HTT_RX_NUM_RU_SIZE_CNTRS; j++) 3009 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 3010 ath12k_htt_ax_tx_rx_ru_size_to_str(j), 3011 le32_to_cpu(htt_stats_buf->data_ru_size_ppdu[j])); 3012 len += scnprintf(buf + len, buf_len - len, "\n"); 3013 3014 len += scnprintf(buf + len, buf_len - len, 3015 "rx_ulofdma_non_data_ru_size_ppdu = "); 3016 for (j = 0; j < ATH12K_HTT_RX_NUM_RU_SIZE_CNTRS; j++) 3017 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 3018 ath12k_htt_ax_tx_rx_ru_size_to_str(j), 3019 le32_to_cpu(htt_stats_buf->non_data_ru_size_ppdu[j])); 3020 len += scnprintf(buf + len, buf_len - len, "\n"); 3021 3022 len += print_array_to_buf(buf, len, "rx_rssi_track_sta_aid", 3023 htt_stats_buf->uplink_sta_aid, 3024 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n"); 3025 len += print_array_to_buf(buf, len, "rx_sta_target_rssi", 3026 htt_stats_buf->uplink_sta_target_rssi, 3027 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n"); 3028 len += print_array_to_buf(buf, len, "rx_sta_fd_rssi", 3029 htt_stats_buf->uplink_sta_fd_rssi, 3030 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n"); 3031 len += print_array_to_buf(buf, len, "rx_sta_power_headroom", 3032 htt_stats_buf->uplink_sta_power_headroom, 3033 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n"); 3034 len += scnprintf(buf + len, buf_len - len, 3035 "ul_ofdma_basic_trigger_rx_qos_null_only = %u\n\n", 3036 le32_to_cpu(htt_stats_buf->ul_ofdma_bsc_trig_rx_qos_null_only)); 3037 3038 stats_req->buf_len = len; 3039 } 3040 3041 static void 3042 ath12k_htt_print_ul_ofdma_user_stats(const void *tag_buf, u16 tag_len, 3043 struct debug_htt_stats_req *stats_req) 3044 { 3045 const struct ath12k_htt_rx_pdev_ul_ofdma_user_stats_tlv *htt_stats_buf = tag_buf; 3046 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3047 u32 len = stats_req->buf_len; 3048 u8 *buf = stats_req->buf; 3049 u32 user_index; 3050 3051 if (tag_len < sizeof(*htt_stats_buf)) 3052 return; 3053 3054 user_index = __le32_to_cpu(htt_stats_buf->user_index); 3055 3056 if (!user_index) 3057 len += scnprintf(buf + len, buf_len - len, 3058 "HTT_RX_PDEV_UL_OFDMA_USER_STAS_TLV:\n"); 3059 len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_non_data_ppdu_%u = %u\n", 3060 user_index, 3061 le32_to_cpu(htt_stats_buf->rx_ulofdma_non_data_ppdu)); 3062 len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_data_ppdu_%u = %u\n", 3063 user_index, 3064 le32_to_cpu(htt_stats_buf->rx_ulofdma_data_ppdu)); 3065 len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_mpdu_ok_%u = %u\n", 3066 user_index, 3067 le32_to_cpu(htt_stats_buf->rx_ulofdma_mpdu_ok)); 3068 len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_mpdu_fail_%u = %u\n", 3069 user_index, 3070 le32_to_cpu(htt_stats_buf->rx_ulofdma_mpdu_fail)); 3071 len += scnprintf(buf + len, buf_len - len, 3072 "rx_ulofdma_non_data_nusers_%u = %u\n", user_index, 3073 le32_to_cpu(htt_stats_buf->rx_ulofdma_non_data_nusers)); 3074 len += scnprintf(buf + len, buf_len - len, "rx_ulofdma_data_nusers_%u = %u\n\n", 3075 user_index, 3076 le32_to_cpu(htt_stats_buf->rx_ulofdma_data_nusers)); 3077 3078 stats_req->buf_len = len; 3079 } 3080 3081 static void 3082 ath12k_htt_print_ul_mumimo_trig_stats(const void *tag_buf, u16 tag_len, 3083 struct debug_htt_stats_req *stats_req) 3084 { 3085 const struct ath12k_htt_rx_ul_mumimo_trig_stats_tlv *htt_stats_buf = tag_buf; 3086 char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {}; 3087 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3088 u32 len = stats_req->buf_len; 3089 u8 *buf = stats_req->buf; 3090 u32 mac_id; 3091 u16 index; 3092 u8 i, j; 3093 3094 if (tag_len < sizeof(*htt_stats_buf)) 3095 return; 3096 3097 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word); 3098 3099 len += scnprintf(buf + len, buf_len - len, 3100 "HTT_RX_PDEV_UL_MUMIMO_TRIG_STATS_TLV:\n"); 3101 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 3102 u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID)); 3103 len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_mumimo = %u\n", 3104 le32_to_cpu(htt_stats_buf->rx_11ax_ul_mumimo)); 3105 index = 0; 3106 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN); 3107 for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++) 3108 index += scnprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index, 3109 " %u:%u,", i, 3110 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs[i])); 3111 3112 for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++) 3113 index += scnprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index, 3114 " %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS, 3115 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs_ext[i])); 3116 str_buf[--index] = '\0'; 3117 len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_mcs = %s\n", str_buf); 3118 3119 for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) { 3120 index = 0; 3121 memset(&str_buf[index], 0x0, ATH12K_HTT_MAX_STRING_LEN); 3122 for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++) 3123 index += scnprintf(&str_buf[index], 3124 ATH12K_HTT_MAX_STRING_LEN - index, 3125 " %u:%u,", i, 3126 le32_to_cpu(htt_stats_buf->ul_rx_gi[j][i])); 3127 3128 for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++) 3129 index += scnprintf(&str_buf[index], 3130 ATH12K_HTT_MAX_STRING_LEN - index, 3131 " %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS, 3132 le32_to_cpu(htt_stats_buf->ul_gi_ext[j][i])); 3133 str_buf[--index] = '\0'; 3134 len += scnprintf(buf + len, buf_len - len, 3135 "ul_mumimo_rx_gi_%u = %s\n", j, str_buf); 3136 } 3137 3138 index = 0; 3139 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN); 3140 len += print_array_to_buf_index(buf, len, "ul_mumimo_rx_nss", 1, 3141 htt_stats_buf->ul_mumimo_rx_nss, 3142 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n"); 3143 3144 len += print_array_to_buf(buf, len, "ul_mumimo_rx_bw", 3145 htt_stats_buf->ul_mumimo_rx_bw, 3146 ATH12K_HTT_RX_NUM_BW_CNTRS, "\n"); 3147 for (i = 0; i < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; i++) { 3148 index = 0; 3149 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN); 3150 for (j = 0; j < ATH12K_HTT_RX_NUM_BW_CNTRS; j++) 3151 index += scnprintf(&str_buf[index], 3152 ATH12K_HTT_MAX_STRING_LEN - index, 3153 " %u:%u,", j, 3154 le32_to_cpu(htt_stats_buf->red_bw[i][j])); 3155 str_buf[--index] = '\0'; 3156 len += scnprintf(buf + len, buf_len - len, "%s = %s\n", 3157 i == 0 ? "half_ul_mumimo_rx_bw" : 3158 "quarter_ul_mumimo_rx_bw", str_buf); 3159 } 3160 3161 len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_stbc = %u\n", 3162 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_stbc)); 3163 len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_ldpc = %u\n", 3164 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_ldpc)); 3165 3166 for (j = 0; j < ATH12K_HTT_RX_NUM_SPATIAL_STREAMS; j++) { 3167 len += scnprintf(buf + len, buf_len - len, 3168 "rx_ul_mumimo_rssi_in_dbm: chain%u ", j); 3169 len += print_array_to_buf_s8(buf, len, "", 0, 3170 htt_stats_buf->ul_rssi[j], 3171 ATH12K_HTT_RX_NUM_BW_CNTRS, "\n"); 3172 } 3173 3174 for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) { 3175 len += scnprintf(buf + len, buf_len - len, 3176 "rx_ul_mumimo_target_rssi: user_%u ", j); 3177 len += print_array_to_buf_s8(buf, len, "", 0, 3178 htt_stats_buf->tgt_rssi[j], 3179 ATH12K_HTT_RX_NUM_BW_CNTRS, "\n"); 3180 } 3181 3182 for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) { 3183 len += scnprintf(buf + len, buf_len - len, 3184 "rx_ul_mumimo_fd_rssi: user_%u ", j); 3185 len += print_array_to_buf_s8(buf, len, "", 0, 3186 htt_stats_buf->fd[j], 3187 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n"); 3188 } 3189 3190 for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) { 3191 len += scnprintf(buf + len, buf_len - len, 3192 "rx_ulmumimo_pilot_evm_db_mean: user_%u ", j); 3193 len += print_array_to_buf_s8(buf, len, "", 0, 3194 htt_stats_buf->db[j], 3195 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n"); 3196 } 3197 3198 len += scnprintf(buf + len, buf_len - len, 3199 "ul_mumimo_basic_trigger_rx_qos_null_only = %u\n\n", 3200 le32_to_cpu(htt_stats_buf->mumimo_bsc_trig_rx_qos_null_only)); 3201 3202 stats_req->buf_len = len; 3203 } 3204 3205 static void 3206 ath12k_htt_print_rx_fse_stats_tlv(const void *tag_buf, u16 tag_len, 3207 struct debug_htt_stats_req *stats_req) 3208 { 3209 const struct ath12k_htt_rx_fse_stats_tlv *htt_stats_buf = tag_buf; 3210 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3211 u32 len = stats_req->buf_len; 3212 u8 *buf = stats_req->buf; 3213 3214 if (tag_len < sizeof(*htt_stats_buf)) 3215 return; 3216 3217 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_RX_FSE_STATS_TLV:\n"); 3218 len += scnprintf(buf + len, buf_len - len, "=== Software RX FSE STATS ===\n"); 3219 len += scnprintf(buf + len, buf_len - len, "Enable count = %u\n", 3220 le32_to_cpu(htt_stats_buf->fse_enable_cnt)); 3221 len += scnprintf(buf + len, buf_len - len, "Disable count = %u\n", 3222 le32_to_cpu(htt_stats_buf->fse_disable_cnt)); 3223 len += scnprintf(buf + len, buf_len - len, "Cache invalidate entry count = %u\n", 3224 le32_to_cpu(htt_stats_buf->fse_cache_invalidate_entry_cnt)); 3225 len += scnprintf(buf + len, buf_len - len, "Full cache invalidate count = %u\n", 3226 le32_to_cpu(htt_stats_buf->fse_full_cache_invalidate_cnt)); 3227 3228 len += scnprintf(buf + len, buf_len - len, "\n=== Hardware RX FSE STATS ===\n"); 3229 len += scnprintf(buf + len, buf_len - len, "Cache hits count = %u\n", 3230 le32_to_cpu(htt_stats_buf->fse_num_cache_hits_cnt)); 3231 len += scnprintf(buf + len, buf_len - len, "Cache no. of searches = %u\n", 3232 le32_to_cpu(htt_stats_buf->fse_num_searches_cnt)); 3233 len += scnprintf(buf + len, buf_len - len, "Cache occupancy peak count:\n"); 3234 len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-16] = %u [17-32] = %u ", 3235 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[0]), 3236 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[1]), 3237 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[2])); 3238 len += scnprintf(buf + len, buf_len - len, "[33-48] = %u [49-64] = %u ", 3239 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[3]), 3240 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[4])); 3241 len += scnprintf(buf + len, buf_len - len, "[65-80] = %u [81-96] = %u ", 3242 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[5]), 3243 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[6])); 3244 len += scnprintf(buf + len, buf_len - len, "[97-112] = %u [113-127] = %u ", 3245 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[7]), 3246 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[8])); 3247 len += scnprintf(buf + len, buf_len - len, "[128] = %u\n", 3248 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[9])); 3249 len += scnprintf(buf + len, buf_len - len, "Cache occupancy current count:\n"); 3250 len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-16] = %u [17-32] = %u ", 3251 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[0]), 3252 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[1]), 3253 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[2])); 3254 len += scnprintf(buf + len, buf_len - len, "[33-48] = %u [49-64] = %u ", 3255 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[3]), 3256 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[4])); 3257 len += scnprintf(buf + len, buf_len - len, "[65-80] = %u [81-96] = %u ", 3258 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[5]), 3259 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[6])); 3260 len += scnprintf(buf + len, buf_len - len, "[97-112] = %u [113-127] = %u ", 3261 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[7]), 3262 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[8])); 3263 len += scnprintf(buf + len, buf_len - len, "[128] = %u\n", 3264 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[9])); 3265 len += scnprintf(buf + len, buf_len - len, "Cache search square count:\n"); 3266 len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-50] = %u [51-100] = %u ", 3267 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[0]), 3268 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[1]), 3269 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[2])); 3270 len += scnprintf(buf + len, buf_len - len, "[101-200] = %u [201-255] = %u ", 3271 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[3]), 3272 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[4])); 3273 len += scnprintf(buf + len, buf_len - len, "[256] = %u\n", 3274 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[5])); 3275 len += scnprintf(buf + len, buf_len - len, "Cache search peak pending count:\n"); 3276 len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-2] = %u [3-4] = %u ", 3277 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[0]), 3278 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[1]), 3279 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[2])); 3280 len += scnprintf(buf + len, buf_len - len, "[Greater/Equal to 5] = %u\n", 3281 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[3])); 3282 len += scnprintf(buf + len, buf_len - len, "Cache search tot pending count:\n"); 3283 len += scnprintf(buf + len, buf_len - len, "[0] = %u [1-2] = %u [3-4] = %u ", 3284 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[0]), 3285 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[1]), 3286 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[2])); 3287 len += scnprintf(buf + len, buf_len - len, "[Greater/Equal to 5] = %u\n\n", 3288 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[3])); 3289 3290 stats_req->buf_len = len; 3291 } 3292 3293 static void 3294 ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf, u16 tag_len, 3295 struct debug_htt_stats_req *stats_req) 3296 { 3297 const struct ath12k_htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf; 3298 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3299 u32 len = stats_req->buf_len; 3300 u8 *buf = stats_req->buf; 3301 u8 i; 3302 3303 if (tag_len < sizeof(*htt_stats_buf)) 3304 return; 3305 3306 len += scnprintf(buf + len, buf_len - len, 3307 "HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n"); 3308 len += scnprintf(buf + len, buf_len - len, "Legacy OFDM Rates: 6 Mbps: %u, ", 3309 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[0])); 3310 len += scnprintf(buf + len, buf_len - len, "9 Mbps: %u, 12 Mbps: %u, ", 3311 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[1]), 3312 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[2])); 3313 len += scnprintf(buf + len, buf_len - len, "18 Mbps: %u\n", 3314 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[3])); 3315 len += scnprintf(buf + len, buf_len - len, "24 Mbps: %u, 36 Mbps: %u, ", 3316 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[4]), 3317 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[5])); 3318 len += scnprintf(buf + len, buf_len - len, "48 Mbps: %u, 54 Mbps: %u\n", 3319 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[6]), 3320 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[7])); 3321 3322 len += print_array_to_buf(buf, len, "tx_ol_mcs", htt_stats_buf->tx_su_ol_mcs, 3323 ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, "\n"); 3324 len += print_array_to_buf(buf, len, "tx_ibf_mcs", htt_stats_buf->tx_su_ibf_mcs, 3325 ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, "\n"); 3326 len += print_array_to_buf(buf, len, "tx_txbf_mcs", htt_stats_buf->tx_su_txbf_mcs, 3327 ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, "\n"); 3328 len += print_array_to_buf_index(buf, len, "tx_ol_nss", 1, 3329 htt_stats_buf->tx_su_ol_nss, 3330 ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, 3331 "\n"); 3332 len += print_array_to_buf_index(buf, len, "tx_ibf_nss", 1, 3333 htt_stats_buf->tx_su_ibf_nss, 3334 ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, 3335 "\n"); 3336 len += print_array_to_buf_index(buf, len, "tx_txbf_nss", 1, 3337 htt_stats_buf->tx_su_txbf_nss, 3338 ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, 3339 "\n"); 3340 len += print_array_to_buf(buf, len, "tx_ol_bw", htt_stats_buf->tx_su_ol_bw, 3341 ATH12K_HTT_TXBF_NUM_BW_CNTRS, "\n"); 3342 for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++) 3343 len += print_array_to_buf(buf, len, i ? "quarter_tx_ol_bw" : 3344 "half_tx_ol_bw", 3345 htt_stats_buf->ol[i], 3346 ATH12K_HTT_TXBF_NUM_BW_CNTRS, 3347 "\n"); 3348 3349 len += print_array_to_buf(buf, len, "tx_ibf_bw", htt_stats_buf->tx_su_ibf_bw, 3350 ATH12K_HTT_TXBF_NUM_BW_CNTRS, "\n"); 3351 for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++) 3352 len += print_array_to_buf(buf, len, i ? "quarter_tx_ibf_bw" : 3353 "half_tx_ibf_bw", 3354 htt_stats_buf->ibf[i], 3355 ATH12K_HTT_TXBF_NUM_BW_CNTRS, 3356 "\n"); 3357 3358 len += print_array_to_buf(buf, len, "tx_txbf_bw", htt_stats_buf->tx_su_txbf_bw, 3359 ATH12K_HTT_TXBF_NUM_BW_CNTRS, "\n"); 3360 for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++) 3361 len += print_array_to_buf(buf, len, i ? "quarter_tx_txbf_bw" : 3362 "half_tx_txbf_bw", 3363 htt_stats_buf->txbf[i], 3364 ATH12K_HTT_TXBF_NUM_BW_CNTRS, 3365 "\n"); 3366 len += scnprintf(buf + len, buf_len - len, "\n"); 3367 3368 len += scnprintf(buf + len, buf_len - len, 3369 "HTT_STATS_PDEV_TXBF_FLAG_RETURN_STATS:\n"); 3370 len += scnprintf(buf + len, buf_len - len, "TXBF_reason_code_stats: 0:%u, 1:%u,", 3371 le32_to_cpu(htt_stats_buf->txbf_flag_set_mu_mode), 3372 le32_to_cpu(htt_stats_buf->txbf_flag_set_final_status)); 3373 len += scnprintf(buf + len, buf_len - len, " 2:%u, 3:%u, 4:%u, 5:%u, ", 3374 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_verified_txbf_mode), 3375 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_disable_p2p_access), 3376 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_max_nss_in_he160), 3377 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_disable_uldlofdma)); 3378 len += scnprintf(buf + len, buf_len - len, "6:%u, 7:%u\n\n", 3379 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_mcs_threshold_val), 3380 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_final_status)); 3381 3382 stats_req->buf_len = len; 3383 } 3384 3385 static void 3386 ath12k_htt_print_txbf_ofdma_ax_ndpa_stats_tlv(const void *tag_buf, u16 tag_len, 3387 struct debug_htt_stats_req *stats_req) 3388 { 3389 const struct ath12k_htt_txbf_ofdma_ax_ndpa_stats_tlv *stats_buf = tag_buf; 3390 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3391 u32 len = stats_req->buf_len; 3392 u8 *buf = stats_req->buf; 3393 u32 num_elements; 3394 u8 i; 3395 3396 if (tag_len < sizeof(*stats_buf)) 3397 return; 3398 3399 num_elements = le32_to_cpu(stats_buf->num_elems_ax_ndpa_arr); 3400 3401 len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_NDPA_STATS_TLV:\n"); 3402 len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndpa_queued ="); 3403 for (i = 0; i < num_elements; i++) 3404 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3405 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_queued)); 3406 len--; 3407 *(buf + len) = '\0'; 3408 3409 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndpa_tried ="); 3410 for (i = 0; i < num_elements; i++) 3411 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3412 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_tried)); 3413 len--; 3414 *(buf + len) = '\0'; 3415 3416 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndpa_flushed ="); 3417 for (i = 0; i < num_elements; i++) 3418 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3419 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_flush)); 3420 len--; 3421 *(buf + len) = '\0'; 3422 3423 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndpa_err ="); 3424 for (i = 0; i < num_elements; i++) 3425 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3426 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_err)); 3427 len--; 3428 *(buf + len) = '\0'; 3429 3430 len += scnprintf(buf + len, buf_len - len, "\n\n"); 3431 3432 stats_req->buf_len = len; 3433 } 3434 3435 static void 3436 ath12k_htt_print_txbf_ofdma_ax_ndp_stats_tlv(const void *tag_buf, u16 tag_len, 3437 struct debug_htt_stats_req *stats_req) 3438 { 3439 const struct ath12k_htt_txbf_ofdma_ax_ndp_stats_tlv *stats_buf = tag_buf; 3440 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3441 u32 len = stats_req->buf_len; 3442 u8 *buf = stats_req->buf; 3443 u32 num_elements; 3444 u8 i; 3445 3446 if (tag_len < sizeof(*stats_buf)) 3447 return; 3448 3449 num_elements = le32_to_cpu(stats_buf->num_elems_ax_ndp_arr); 3450 3451 len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_NDP_STATS_TLV:\n"); 3452 len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndp_queued ="); 3453 for (i = 0; i < num_elements; i++) 3454 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3455 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_queued)); 3456 len--; 3457 *(buf + len) = '\0'; 3458 3459 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndp_tried ="); 3460 for (i = 0; i < num_elements; i++) 3461 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3462 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_tried)); 3463 len--; 3464 *(buf + len) = '\0'; 3465 3466 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndp_flushed ="); 3467 for (i = 0; i < num_elements; i++) 3468 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3469 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_flush)); 3470 len--; 3471 *(buf + len) = '\0'; 3472 3473 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_ndp_err ="); 3474 for (i = 0; i < num_elements; i++) 3475 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3476 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_err)); 3477 len--; 3478 *(buf + len) = '\0'; 3479 3480 len += scnprintf(buf + len, buf_len - len, "\n\n"); 3481 3482 stats_req->buf_len = len; 3483 } 3484 3485 static void 3486 ath12k_htt_print_txbf_ofdma_ax_brp_stats_tlv(const void *tag_buf, u16 tag_len, 3487 struct debug_htt_stats_req *stats_req) 3488 { 3489 const struct ath12k_htt_txbf_ofdma_ax_brp_stats_tlv *stats_buf = tag_buf; 3490 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3491 u32 len = stats_req->buf_len; 3492 u8 *buf = stats_req->buf; 3493 u32 num_elements; 3494 u8 i; 3495 3496 if (tag_len < sizeof(*stats_buf)) 3497 return; 3498 3499 num_elements = le32_to_cpu(stats_buf->num_elems_ax_brp_arr); 3500 3501 len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_BRP_STATS_TLV:\n"); 3502 len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brpoll_queued ="); 3503 for (i = 0; i < num_elements; i++) 3504 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3505 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_queued)); 3506 len--; 3507 *(buf + len) = '\0'; 3508 3509 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brpoll_tied ="); 3510 for (i = 0; i < num_elements; i++) 3511 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3512 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_tried)); 3513 len--; 3514 *(buf + len) = '\0'; 3515 3516 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brpoll_flushed ="); 3517 for (i = 0; i < num_elements; i++) 3518 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3519 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_flushed)); 3520 len--; 3521 *(buf + len) = '\0'; 3522 3523 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brp_err ="); 3524 for (i = 0; i < num_elements; i++) 3525 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3526 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_err)); 3527 len--; 3528 *(buf + len) = '\0'; 3529 3530 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_brp_err_num_cbf_rcvd ="); 3531 for (i = 0; i < num_elements; i++) 3532 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3533 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_num_cbf_rcvd)); 3534 len--; 3535 *(buf + len) = '\0'; 3536 3537 len += scnprintf(buf + len, buf_len - len, "\n\n"); 3538 3539 stats_req->buf_len = len; 3540 } 3541 3542 static void 3543 ath12k_htt_print_txbf_ofdma_ax_steer_stats_tlv(const void *tag_buf, u16 tag_len, 3544 struct debug_htt_stats_req *stats_req) 3545 { 3546 const struct ath12k_htt_txbf_ofdma_ax_steer_stats_tlv *stats_buf = tag_buf; 3547 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3548 u32 len = stats_req->buf_len; 3549 u8 *buf = stats_req->buf; 3550 u32 num_elements; 3551 u8 i; 3552 3553 if (tag_len < sizeof(*stats_buf)) 3554 return; 3555 3556 num_elements = le32_to_cpu(stats_buf->num_elems_ax_steer_arr); 3557 3558 len += scnprintf(buf + len, buf_len - len, 3559 "HTT_TXBF_OFDMA_AX_STEER_STATS_TLV:\n"); 3560 len += scnprintf(buf + len, buf_len - len, "ax_ofdma_num_ppdu_steer ="); 3561 for (i = 0; i < num_elements; i++) 3562 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3563 le32_to_cpu(stats_buf->ax_steer[i].num_ppdu_steer)); 3564 len--; 3565 *(buf + len) = '\0'; 3566 3567 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_num_usrs_prefetch ="); 3568 for (i = 0; i < num_elements; i++) 3569 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3570 le32_to_cpu(stats_buf->ax_steer[i].num_usr_prefetch)); 3571 len--; 3572 *(buf + len) = '\0'; 3573 3574 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_num_usrs_sound ="); 3575 for (i = 0; i < num_elements; i++) 3576 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3577 le32_to_cpu(stats_buf->ax_steer[i].num_usr_sound)); 3578 len--; 3579 *(buf + len) = '\0'; 3580 3581 len += scnprintf(buf + len, buf_len - len, "\nax_ofdma_num_usrs_force_sound ="); 3582 for (i = 0; i < num_elements; i++) 3583 len += scnprintf(buf + len, buf_len - len, " %u:%u,", i + 1, 3584 le32_to_cpu(stats_buf->ax_steer[i].num_usr_force_sound)); 3585 len--; 3586 *(buf + len) = '\0'; 3587 3588 len += scnprintf(buf + len, buf_len - len, "\n\n"); 3589 3590 stats_req->buf_len = len; 3591 } 3592 3593 static void 3594 ath12k_htt_print_txbf_ofdma_ax_steer_mpdu_stats_tlv(const void *tag_buf, u16 tag_len, 3595 struct debug_htt_stats_req *stats_req) 3596 { 3597 const struct ath12k_htt_txbf_ofdma_ax_steer_mpdu_stats_tlv *stats_buf = tag_buf; 3598 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3599 u32 len = stats_req->buf_len; 3600 u8 *buf = stats_req->buf; 3601 3602 if (tag_len < sizeof(*stats_buf)) 3603 return; 3604 3605 len += scnprintf(buf + len, buf_len - len, 3606 "HTT_TXBF_OFDMA_AX_STEER_MPDU_STATS_TLV:\n"); 3607 len += scnprintf(buf + len, buf_len - len, "rbo_steer_mpdus_tried = %u\n", 3608 le32_to_cpu(stats_buf->ax_ofdma_rbo_steer_mpdus_tried)); 3609 len += scnprintf(buf + len, buf_len - len, "rbo_steer_mpdus_failed = %u\n", 3610 le32_to_cpu(stats_buf->ax_ofdma_rbo_steer_mpdus_failed)); 3611 len += scnprintf(buf + len, buf_len - len, "sifs_steer_mpdus_tried = %u\n", 3612 le32_to_cpu(stats_buf->ax_ofdma_sifs_steer_mpdus_tried)); 3613 len += scnprintf(buf + len, buf_len - len, "sifs_steer_mpdus_failed = %u\n\n", 3614 le32_to_cpu(stats_buf->ax_ofdma_sifs_steer_mpdus_failed)); 3615 3616 stats_req->buf_len = len; 3617 } 3618 3619 static void ath12k_htt_print_dlpager_entry(const struct ath12k_htt_pgs_info *pg_info, 3620 int idx, char *str_buf) 3621 { 3622 u64 page_timestamp; 3623 u16 index = 0; 3624 3625 page_timestamp = ath12k_le32hilo_to_u64(pg_info->ts_msb, pg_info->ts_lsb); 3626 3627 index += snprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index, 3628 "Index - %u ; Page Number - %u ; ", 3629 idx, le32_to_cpu(pg_info->page_num)); 3630 index += snprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index, 3631 "Num of pages - %u ; Timestamp - %lluus\n", 3632 le32_to_cpu(pg_info->num_pgs), page_timestamp); 3633 } 3634 3635 static void 3636 ath12k_htt_print_dlpager_stats_tlv(const void *tag_buf, u16 tag_len, 3637 struct debug_htt_stats_req *stats_req) 3638 { 3639 const struct ath12k_htt_dl_pager_stats_tlv *stat_buf = tag_buf; 3640 u32 len = stats_req->buf_len; 3641 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3642 u32 dword_lock, dword_unlock; 3643 int i; 3644 u8 *buf = stats_req->buf; 3645 u8 pg_locked; 3646 u8 pg_unlock; 3647 char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {}; 3648 3649 if (tag_len < sizeof(*stat_buf)) 3650 return; 3651 3652 dword_lock = le32_get_bits(stat_buf->info2, 3653 ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2); 3654 dword_unlock = le32_get_bits(stat_buf->info2, 3655 ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO2); 3656 3657 pg_locked = ATH12K_HTT_STATS_PAGE_LOCKED; 3658 pg_unlock = ATH12K_HTT_STATS_PAGE_UNLOCKED; 3659 3660 len += scnprintf(buf + len, buf_len - len, "HTT_DLPAGER_STATS_TLV:\n"); 3661 len += scnprintf(buf + len, buf_len - len, "ASYNC locked pages = %u\n", 3662 le32_get_bits(stat_buf->info0, 3663 ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0)); 3664 len += scnprintf(buf + len, buf_len - len, "SYNC locked pages = %u\n", 3665 le32_get_bits(stat_buf->info0, 3666 ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0)); 3667 len += scnprintf(buf + len, buf_len - len, "Total locked pages = %u\n", 3668 le32_get_bits(stat_buf->info1, 3669 ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1)); 3670 len += scnprintf(buf + len, buf_len - len, "Total free pages = %u\n", 3671 le32_get_bits(stat_buf->info1, 3672 ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO1)); 3673 3674 len += scnprintf(buf + len, buf_len - len, "\nLOCKED PAGES HISTORY\n"); 3675 len += scnprintf(buf + len, buf_len - len, "last_locked_page_idx = %u\n", 3676 dword_lock ? dword_lock - 1 : (ATH12K_PAGER_MAX - 1)); 3677 3678 for (i = 0; i < ATH12K_PAGER_MAX; i++) { 3679 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN); 3680 ath12k_htt_print_dlpager_entry(&stat_buf->pgs_info[pg_locked][i], 3681 i, str_buf); 3682 len += scnprintf(buf + len, buf_len - len, "%s", str_buf); 3683 } 3684 3685 len += scnprintf(buf + len, buf_len - len, "\nUNLOCKED PAGES HISTORY\n"); 3686 len += scnprintf(buf + len, buf_len - len, "last_unlocked_page_idx = %u\n", 3687 dword_unlock ? dword_unlock - 1 : ATH12K_PAGER_MAX - 1); 3688 3689 for (i = 0; i < ATH12K_PAGER_MAX; i++) { 3690 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN); 3691 ath12k_htt_print_dlpager_entry(&stat_buf->pgs_info[pg_unlock][i], 3692 i, str_buf); 3693 len += scnprintf(buf + len, buf_len - len, "%s", str_buf); 3694 } 3695 3696 len += scnprintf(buf + len, buf_len - len, "\n"); 3697 3698 stats_req->buf_len = len; 3699 } 3700 3701 static void 3702 ath12k_htt_print_phy_stats_tlv(const void *tag_buf, u16 tag_len, 3703 struct debug_htt_stats_req *stats_req) 3704 { 3705 const struct ath12k_htt_phy_stats_tlv *htt_stats_buf = tag_buf; 3706 u32 len = stats_req->buf_len; 3707 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3708 u8 *buf = stats_req->buf, i; 3709 3710 if (tag_len < sizeof(*htt_stats_buf)) 3711 return; 3712 3713 len += scnprintf(buf + len, buf_len - len, "HTT_PHY_STATS_TLV:\n"); 3714 for (i = 0; i < ATH12K_HTT_STATS_MAX_CHAINS; i++) 3715 len += scnprintf(buf + len, buf_len - len, "bdf_nf_chain[%d] = %d\n", 3716 i, a_sle32_to_cpu(htt_stats_buf->nf_chain[i])); 3717 for (i = 0; i < ATH12K_HTT_STATS_MAX_CHAINS; i++) 3718 len += scnprintf(buf + len, buf_len - len, "runtime_nf_chain[%d] = %d\n", 3719 i, a_sle32_to_cpu(htt_stats_buf->runtime_nf_chain[i])); 3720 len += scnprintf(buf + len, buf_len - len, "false_radar_cnt = %u / %u (mins)\n", 3721 le32_to_cpu(htt_stats_buf->false_radar_cnt), 3722 le32_to_cpu(htt_stats_buf->fw_run_time)); 3723 len += scnprintf(buf + len, buf_len - len, "radar_cs_cnt = %u\n", 3724 le32_to_cpu(htt_stats_buf->radar_cs_cnt)); 3725 len += scnprintf(buf + len, buf_len - len, "ani_level = %d\n\n", 3726 a_sle32_to_cpu(htt_stats_buf->ani_level)); 3727 3728 stats_req->buf_len = len; 3729 } 3730 3731 static void 3732 ath12k_htt_print_phy_counters_tlv(const void *tag_buf, u16 tag_len, 3733 struct debug_htt_stats_req *stats_req) 3734 { 3735 const struct ath12k_htt_phy_counters_tlv *htt_stats_buf = tag_buf; 3736 u32 len = stats_req->buf_len; 3737 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3738 u8 *buf = stats_req->buf; 3739 3740 if (tag_len < sizeof(*htt_stats_buf)) 3741 return; 3742 3743 len += scnprintf(buf + len, buf_len - len, "HTT_PHY_COUNTERS_TLV:\n"); 3744 len += scnprintf(buf + len, buf_len - len, "rx_ofdma_timing_err_cnt = %u\n", 3745 le32_to_cpu(htt_stats_buf->rx_ofdma_timing_err_cnt)); 3746 len += scnprintf(buf + len, buf_len - len, "rx_cck_fail_cnt = %u\n", 3747 le32_to_cpu(htt_stats_buf->rx_cck_fail_cnt)); 3748 len += scnprintf(buf + len, buf_len - len, "mactx_abort_cnt = %u\n", 3749 le32_to_cpu(htt_stats_buf->mactx_abort_cnt)); 3750 len += scnprintf(buf + len, buf_len - len, "macrx_abort_cnt = %u\n", 3751 le32_to_cpu(htt_stats_buf->macrx_abort_cnt)); 3752 len += scnprintf(buf + len, buf_len - len, "phytx_abort_cnt = %u\n", 3753 le32_to_cpu(htt_stats_buf->phytx_abort_cnt)); 3754 len += scnprintf(buf + len, buf_len - len, "phyrx_abort_cnt = %u\n", 3755 le32_to_cpu(htt_stats_buf->phyrx_abort_cnt)); 3756 len += scnprintf(buf + len, buf_len - len, "phyrx_defer_abort_cnt = %u\n", 3757 le32_to_cpu(htt_stats_buf->phyrx_defer_abort_cnt)); 3758 len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_lstf_event_cnt = %u\n", 3759 le32_to_cpu(htt_stats_buf->rx_gain_adj_lstf_event_cnt)); 3760 len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_non_legacy_cnt = %u\n", 3761 le32_to_cpu(htt_stats_buf->rx_gain_adj_non_legacy_cnt)); 3762 len += print_array_to_buf(buf, len, "rx_pkt_cnt", htt_stats_buf->rx_pkt_cnt, 3763 ATH12K_HTT_MAX_RX_PKT_CNT, "\n"); 3764 len += print_array_to_buf(buf, len, "rx_pkt_crc_pass_cnt", 3765 htt_stats_buf->rx_pkt_crc_pass_cnt, 3766 ATH12K_HTT_MAX_RX_PKT_CRC_PASS_CNT, "\n"); 3767 len += print_array_to_buf(buf, len, "per_blk_err_cnt", 3768 htt_stats_buf->per_blk_err_cnt, 3769 ATH12K_HTT_MAX_PER_BLK_ERR_CNT, "\n"); 3770 len += print_array_to_buf(buf, len, "rx_ota_err_cnt", 3771 htt_stats_buf->rx_ota_err_cnt, 3772 ATH12K_HTT_MAX_RX_OTA_ERR_CNT, "\n\n"); 3773 3774 stats_req->buf_len = len; 3775 } 3776 3777 static void 3778 ath12k_htt_print_phy_reset_stats_tlv(const void *tag_buf, u16 tag_len, 3779 struct debug_htt_stats_req *stats_req) 3780 { 3781 const struct ath12k_htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf; 3782 u32 len = stats_req->buf_len; 3783 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3784 u8 *buf = stats_req->buf; 3785 3786 if (tag_len < sizeof(*htt_stats_buf)) 3787 return; 3788 3789 len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n"); 3790 len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", 3791 le32_to_cpu(htt_stats_buf->pdev_id)); 3792 len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n", 3793 le32_to_cpu(htt_stats_buf->chan_mhz)); 3794 len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n", 3795 le32_to_cpu(htt_stats_buf->chan_band_center_freq1)); 3796 len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n", 3797 le32_to_cpu(htt_stats_buf->chan_band_center_freq2)); 3798 len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n", 3799 le32_to_cpu(htt_stats_buf->chan_phy_mode)); 3800 len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n", 3801 le32_to_cpu(htt_stats_buf->chan_flags)); 3802 len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n", 3803 le32_to_cpu(htt_stats_buf->chan_num)); 3804 len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n", 3805 le32_to_cpu(htt_stats_buf->reset_cause)); 3806 len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n", 3807 le32_to_cpu(htt_stats_buf->prev_reset_cause)); 3808 len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n", 3809 le32_to_cpu(htt_stats_buf->phy_warm_reset_src)); 3810 len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n", 3811 le32_to_cpu(htt_stats_buf->rx_gain_tbl_mode)); 3812 len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n", 3813 le32_to_cpu(htt_stats_buf->xbar_val)); 3814 len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n", 3815 le32_to_cpu(htt_stats_buf->force_calibration)); 3816 len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n", 3817 le32_to_cpu(htt_stats_buf->phyrf_mode)); 3818 len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n", 3819 le32_to_cpu(htt_stats_buf->phy_homechan)); 3820 len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n", 3821 le32_to_cpu(htt_stats_buf->phy_tx_ch_mask)); 3822 len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n", 3823 le32_to_cpu(htt_stats_buf->phy_rx_ch_mask)); 3824 len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n", 3825 le32_to_cpu(htt_stats_buf->phybb_ini_mask)); 3826 len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n", 3827 le32_to_cpu(htt_stats_buf->phyrf_ini_mask)); 3828 len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n", 3829 le32_to_cpu(htt_stats_buf->phy_dfs_en_mask)); 3830 len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n", 3831 le32_to_cpu(htt_stats_buf->phy_sscan_en_mask)); 3832 len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n", 3833 le32_to_cpu(htt_stats_buf->phy_synth_sel_mask)); 3834 len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n", 3835 le32_to_cpu(htt_stats_buf->phy_adfs_freq)); 3836 len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n", 3837 le32_to_cpu(htt_stats_buf->cck_fir_settings)); 3838 len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n", 3839 le32_to_cpu(htt_stats_buf->phy_dyn_pri_chan)); 3840 len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n", 3841 le32_to_cpu(htt_stats_buf->cca_thresh)); 3842 len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n", 3843 le32_to_cpu(htt_stats_buf->dyn_cca_status)); 3844 len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n", 3845 le32_to_cpu(htt_stats_buf->rxdesense_thresh_hw)); 3846 len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n\n", 3847 le32_to_cpu(htt_stats_buf->rxdesense_thresh_sw)); 3848 3849 stats_req->buf_len = len; 3850 } 3851 3852 static void 3853 ath12k_htt_print_phy_reset_counters_tlv(const void *tag_buf, u16 tag_len, 3854 struct debug_htt_stats_req *stats_req) 3855 { 3856 const struct ath12k_htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf; 3857 u32 len = stats_req->buf_len; 3858 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3859 u8 *buf = stats_req->buf; 3860 3861 if (tag_len < sizeof(*htt_stats_buf)) 3862 return; 3863 3864 len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n"); 3865 len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", 3866 le32_to_cpu(htt_stats_buf->pdev_id)); 3867 len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n", 3868 le32_to_cpu(htt_stats_buf->cf_active_low_fail_cnt)); 3869 len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n", 3870 le32_to_cpu(htt_stats_buf->cf_active_low_pass_cnt)); 3871 len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n", 3872 le32_to_cpu(htt_stats_buf->phy_off_through_vreg_cnt)); 3873 len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n", 3874 le32_to_cpu(htt_stats_buf->force_calibration_cnt)); 3875 len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n", 3876 le32_to_cpu(htt_stats_buf->rf_mode_switch_phy_off_cnt)); 3877 len += scnprintf(buf + len, buf_len - len, "temperature_recal_cnt = %u\n\n", 3878 le32_to_cpu(htt_stats_buf->temperature_recal_cnt)); 3879 3880 stats_req->buf_len = len; 3881 } 3882 3883 static void 3884 ath12k_htt_print_phy_tpc_stats_tlv(const void *tag_buf, u16 tag_len, 3885 struct debug_htt_stats_req *stats_req) 3886 { 3887 const struct ath12k_htt_phy_tpc_stats_tlv *htt_stats_buf = tag_buf; 3888 u32 len = stats_req->buf_len; 3889 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3890 u8 *buf = stats_req->buf; 3891 3892 if (tag_len < sizeof(*htt_stats_buf)) 3893 return; 3894 3895 len += scnprintf(buf + len, buf_len - len, "HTT_PHY_TPC_STATS_TLV:\n"); 3896 len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", 3897 le32_to_cpu(htt_stats_buf->pdev_id)); 3898 len += scnprintf(buf + len, buf_len - len, "tx_power_scale = %u\n", 3899 le32_to_cpu(htt_stats_buf->tx_power_scale)); 3900 len += scnprintf(buf + len, buf_len - len, "tx_power_scale_db = %u\n", 3901 le32_to_cpu(htt_stats_buf->tx_power_scale_db)); 3902 len += scnprintf(buf + len, buf_len - len, "min_negative_tx_power = %d\n", 3903 le32_to_cpu(htt_stats_buf->min_negative_tx_power)); 3904 len += scnprintf(buf + len, buf_len - len, "reg_ctl_domain = %u\n", 3905 le32_to_cpu(htt_stats_buf->reg_ctl_domain)); 3906 len += scnprintf(buf + len, buf_len - len, "twice_max_rd_power = %u\n", 3907 le32_to_cpu(htt_stats_buf->twice_max_rd_power)); 3908 len += scnprintf(buf + len, buf_len - len, "max_tx_power = %u\n", 3909 le32_to_cpu(htt_stats_buf->max_tx_power)); 3910 len += scnprintf(buf + len, buf_len - len, "home_max_tx_power = %u\n", 3911 le32_to_cpu(htt_stats_buf->home_max_tx_power)); 3912 len += scnprintf(buf + len, buf_len - len, "psd_power = %d\n", 3913 le32_to_cpu(htt_stats_buf->psd_power)); 3914 len += scnprintf(buf + len, buf_len - len, "eirp_power = %u\n", 3915 le32_to_cpu(htt_stats_buf->eirp_power)); 3916 len += scnprintf(buf + len, buf_len - len, "power_type_6ghz = %u\n", 3917 le32_to_cpu(htt_stats_buf->power_type_6ghz)); 3918 len += print_array_to_buf(buf, len, "max_reg_allowed_power", 3919 htt_stats_buf->max_reg_allowed_power, 3920 ATH12K_HTT_STATS_MAX_CHAINS, "\n"); 3921 len += print_array_to_buf(buf, len, "max_reg_allowed_power_6ghz", 3922 htt_stats_buf->max_reg_allowed_power_6ghz, 3923 ATH12K_HTT_STATS_MAX_CHAINS, "\n"); 3924 len += print_array_to_buf(buf, len, "sub_band_cfreq", 3925 htt_stats_buf->sub_band_cfreq, 3926 ATH12K_HTT_MAX_CH_PWR_INFO_SIZE, "\n"); 3927 len += print_array_to_buf(buf, len, "sub_band_txpower", 3928 htt_stats_buf->sub_band_txpower, 3929 ATH12K_HTT_MAX_CH_PWR_INFO_SIZE, "\n\n"); 3930 3931 stats_req->buf_len = len; 3932 } 3933 3934 static void 3935 ath12k_htt_print_soc_txrx_stats_common_tlv(const void *tag_buf, u16 tag_len, 3936 struct debug_htt_stats_req *stats_req) 3937 { 3938 const struct ath12k_htt_t2h_soc_txrx_stats_common_tlv *htt_stats_buf = tag_buf; 3939 u64 drop_count; 3940 u32 len = stats_req->buf_len; 3941 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3942 u8 *buf = stats_req->buf; 3943 3944 if (tag_len < sizeof(*htt_stats_buf)) 3945 return; 3946 3947 drop_count = ath12k_le32hilo_to_u64(htt_stats_buf->inv_peers_msdu_drop_count_hi, 3948 htt_stats_buf->inv_peers_msdu_drop_count_lo); 3949 3950 len += scnprintf(buf + len, buf_len - len, "HTT_SOC_COMMON_STATS_TLV:\n"); 3951 len += scnprintf(buf + len, buf_len - len, "soc_drop_count = %llu\n\n", 3952 drop_count); 3953 3954 stats_req->buf_len = len; 3955 } 3956 3957 static void 3958 ath12k_htt_print_tx_per_rate_stats_tlv(const void *tag_buf, u16 tag_len, 3959 struct debug_htt_stats_req *stats_req) 3960 { 3961 const struct ath12k_htt_tx_per_rate_stats_tlv *stats_buf = tag_buf; 3962 u32 len = stats_req->buf_len; 3963 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 3964 u32 ru_size_cnt = 0; 3965 u32 rc_mode, ru_type; 3966 u8 *buf = stats_req->buf, i; 3967 const char *mode_prefix; 3968 3969 if (tag_len < sizeof(*stats_buf)) 3970 return; 3971 3972 rc_mode = le32_to_cpu(stats_buf->rc_mode); 3973 ru_type = le32_to_cpu(stats_buf->ru_type); 3974 3975 switch (rc_mode) { 3976 case ATH12K_HTT_STATS_RC_MODE_DLSU: 3977 len += scnprintf(buf + len, buf_len - len, "HTT_TX_PER_STATS:\n"); 3978 len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_SU:\n"); 3979 mode_prefix = "su"; 3980 break; 3981 case ATH12K_HTT_STATS_RC_MODE_DLMUMIMO: 3982 len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_DL_MUMIMO:\n"); 3983 mode_prefix = "mu"; 3984 break; 3985 case ATH12K_HTT_STATS_RC_MODE_DLOFDMA: 3986 len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_DL_OFDMA:\n"); 3987 mode_prefix = "ofdma"; 3988 if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY) 3989 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_STATS_NUM_AX_RU_SIZE_CNTRS; 3990 else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU) 3991 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS; 3992 break; 3993 case ATH12K_HTT_STATS_RC_MODE_ULMUMIMO: 3994 len += scnprintf(buf + len, buf_len - len, "HTT_RX_PER_STATS:\n"); 3995 len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_UL_MUMIMO:\n"); 3996 mode_prefix = "ulmu"; 3997 break; 3998 case ATH12K_HTT_STATS_RC_MODE_ULOFDMA: 3999 len += scnprintf(buf + len, buf_len - len, "\nPER_STATS_UL_OFDMA:\n"); 4000 mode_prefix = "ulofdma"; 4001 if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY) 4002 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_STATS_NUM_AX_RU_SIZE_CNTRS; 4003 else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU) 4004 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS; 4005 break; 4006 default: 4007 return; 4008 } 4009 4010 len += scnprintf(buf + len, buf_len - len, "\nPER per BW:\n"); 4011 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA || 4012 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO) 4013 len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ", 4014 mode_prefix); 4015 else 4016 len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ", 4017 mode_prefix); 4018 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++) 4019 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4020 le32_to_cpu(stats_buf->per_bw[i].ppdus_tried)); 4021 len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i, 4022 le32_to_cpu(stats_buf->per_bw320.ppdus_tried)); 4023 4024 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA || 4025 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO) 4026 len += scnprintf(buf + len, buf_len - len, "non_data_ppdus_%s = ", 4027 mode_prefix); 4028 else 4029 len += scnprintf(buf + len, buf_len - len, "ppdus_ack_failed_%s = ", 4030 mode_prefix); 4031 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++) 4032 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4033 le32_to_cpu(stats_buf->per_bw[i].ppdus_ack_failed)); 4034 len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i, 4035 le32_to_cpu(stats_buf->per_bw320.ppdus_ack_failed)); 4036 4037 len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", mode_prefix); 4038 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++) 4039 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4040 le32_to_cpu(stats_buf->per_bw[i].mpdus_tried)); 4041 len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i, 4042 le32_to_cpu(stats_buf->per_bw320.mpdus_tried)); 4043 4044 len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", mode_prefix); 4045 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++) 4046 len += scnprintf(buf + len, buf_len - len, " %u:%u", i, 4047 le32_to_cpu(stats_buf->per_bw[i].mpdus_failed)); 4048 len += scnprintf(buf + len, buf_len - len, " %u:%u\n", i, 4049 le32_to_cpu(stats_buf->per_bw320.mpdus_failed)); 4050 4051 len += scnprintf(buf + len, buf_len - len, "\nPER per NSS:\n"); 4052 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA || 4053 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO) 4054 len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ", 4055 mode_prefix); 4056 else 4057 len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ", 4058 mode_prefix); 4059 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++) 4060 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1, 4061 le32_to_cpu(stats_buf->per_nss[i].ppdus_tried)); 4062 len += scnprintf(buf + len, buf_len - len, "\n"); 4063 4064 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA || 4065 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO) 4066 len += scnprintf(buf + len, buf_len - len, "non_data_ppdus_%s = ", 4067 mode_prefix); 4068 else 4069 len += scnprintf(buf + len, buf_len - len, "ppdus_ack_failed_%s = ", 4070 mode_prefix); 4071 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++) 4072 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1, 4073 le32_to_cpu(stats_buf->per_nss[i].ppdus_ack_failed)); 4074 len += scnprintf(buf + len, buf_len - len, "\n"); 4075 4076 len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", mode_prefix); 4077 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++) 4078 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1, 4079 le32_to_cpu(stats_buf->per_nss[i].mpdus_tried)); 4080 len += scnprintf(buf + len, buf_len - len, "\n"); 4081 4082 len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", mode_prefix); 4083 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++) 4084 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i + 1, 4085 le32_to_cpu(stats_buf->per_nss[i].mpdus_failed)); 4086 len += scnprintf(buf + len, buf_len - len, "\n"); 4087 4088 len += scnprintf(buf + len, buf_len - len, "\nPER per MCS:\n"); 4089 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA || 4090 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO) 4091 len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ", 4092 mode_prefix); 4093 else 4094 len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ", 4095 mode_prefix); 4096 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++) 4097 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4098 le32_to_cpu(stats_buf->per_mcs[i].ppdus_tried)); 4099 len += scnprintf(buf + len, buf_len - len, "\n"); 4100 4101 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA || 4102 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO) 4103 len += scnprintf(buf + len, buf_len - len, "non_data_ppdus_%s = ", 4104 mode_prefix); 4105 else 4106 len += scnprintf(buf + len, buf_len - len, "ppdus_ack_failed_%s = ", 4107 mode_prefix); 4108 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++) 4109 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4110 le32_to_cpu(stats_buf->per_mcs[i].ppdus_ack_failed)); 4111 len += scnprintf(buf + len, buf_len - len, "\n"); 4112 4113 len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", mode_prefix); 4114 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++) 4115 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4116 le32_to_cpu(stats_buf->per_mcs[i].mpdus_tried)); 4117 len += scnprintf(buf + len, buf_len - len, "\n"); 4118 4119 len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", mode_prefix); 4120 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++) 4121 len += scnprintf(buf + len, buf_len - len, " %u:%u ", i, 4122 le32_to_cpu(stats_buf->per_mcs[i].mpdus_failed)); 4123 len += scnprintf(buf + len, buf_len - len, "\n"); 4124 4125 if ((rc_mode == ATH12K_HTT_STATS_RC_MODE_DLOFDMA || 4126 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA) && 4127 ru_type != ATH12K_HTT_STATS_RU_TYPE_INVALID) { 4128 len += scnprintf(buf + len, buf_len - len, "\nPER per RU:\n"); 4129 4130 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA) 4131 len += scnprintf(buf + len, buf_len - len, "data_ppdus_%s = ", 4132 mode_prefix); 4133 else 4134 len += scnprintf(buf + len, buf_len - len, "ppdus_tried_%s = ", 4135 mode_prefix); 4136 for (i = 0; i < ru_size_cnt; i++) 4137 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 4138 ath12k_tx_ru_size_to_str(ru_type, i), 4139 le32_to_cpu(stats_buf->ru[i].ppdus_tried)); 4140 len += scnprintf(buf + len, buf_len - len, "\n"); 4141 4142 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA) 4143 len += scnprintf(buf + len, buf_len - len, 4144 "non_data_ppdus_%s = ", mode_prefix); 4145 else 4146 len += scnprintf(buf + len, buf_len - len, 4147 "ppdus_ack_failed_%s = ", mode_prefix); 4148 for (i = 0; i < ru_size_cnt; i++) 4149 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 4150 ath12k_tx_ru_size_to_str(ru_type, i), 4151 le32_to_cpu(stats_buf->ru[i].ppdus_ack_failed)); 4152 len += scnprintf(buf + len, buf_len - len, "\n"); 4153 4154 len += scnprintf(buf + len, buf_len - len, "mpdus_tried_%s = ", 4155 mode_prefix); 4156 for (i = 0; i < ru_size_cnt; i++) 4157 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 4158 ath12k_tx_ru_size_to_str(ru_type, i), 4159 le32_to_cpu(stats_buf->ru[i].mpdus_tried)); 4160 len += scnprintf(buf + len, buf_len - len, "\n"); 4161 4162 len += scnprintf(buf + len, buf_len - len, "mpdus_failed_%s = ", 4163 mode_prefix); 4164 for (i = 0; i < ru_size_cnt; i++) 4165 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 4166 ath12k_tx_ru_size_to_str(ru_type, i), 4167 le32_to_cpu(stats_buf->ru[i].mpdus_failed)); 4168 len += scnprintf(buf + len, buf_len - len, "\n\n"); 4169 } 4170 4171 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_DLMUMIMO) { 4172 len += scnprintf(buf + len, buf_len - len, "\nlast_probed_bw = %u\n", 4173 le32_to_cpu(stats_buf->last_probed_bw)); 4174 len += scnprintf(buf + len, buf_len - len, "last_probed_nss = %u\n", 4175 le32_to_cpu(stats_buf->last_probed_nss)); 4176 len += scnprintf(buf + len, buf_len - len, "last_probed_mcs = %u\n", 4177 le32_to_cpu(stats_buf->last_probed_mcs)); 4178 len += print_array_to_buf(buf, len, "MU Probe count per RC MODE", 4179 stats_buf->probe_cnt, 4180 ATH12K_HTT_RC_MODE_2D_COUNT, "\n\n"); 4181 } 4182 4183 stats_req->buf_len = len; 4184 } 4185 4186 static void 4187 ath12k_htt_print_ast_entry_tlv(const void *tag_buf, u16 tag_len, 4188 struct debug_htt_stats_req *stats_req) 4189 { 4190 const struct ath12k_htt_ast_entry_tlv *htt_stats_buf = tag_buf; 4191 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4192 u32 len = stats_req->buf_len; 4193 u8 *buf = stats_req->buf; 4194 u32 mac_addr_l32; 4195 u32 mac_addr_h16; 4196 u32 ast_info; 4197 4198 if (tag_len < sizeof(*htt_stats_buf)) 4199 return; 4200 4201 mac_addr_l32 = le32_to_cpu(htt_stats_buf->mac_addr.mac_addr_l32); 4202 mac_addr_h16 = le32_to_cpu(htt_stats_buf->mac_addr.mac_addr_h16); 4203 ast_info = le32_to_cpu(htt_stats_buf->info); 4204 4205 len += scnprintf(buf + len, buf_len - len, "HTT_AST_ENTRY_TLV:\n"); 4206 len += scnprintf(buf + len, buf_len - len, "ast_index = %u\n", 4207 le32_to_cpu(htt_stats_buf->ast_index)); 4208 len += scnprintf(buf + len, buf_len - len, 4209 "mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n", 4210 u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_0), 4211 u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_1), 4212 u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_2), 4213 u32_get_bits(mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_3), 4214 u32_get_bits(mac_addr_h16, ATH12K_HTT_MAC_ADDR_H16_0), 4215 u32_get_bits(mac_addr_h16, ATH12K_HTT_MAC_ADDR_H16_1)); 4216 4217 len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n", 4218 le32_to_cpu(htt_stats_buf->sw_peer_id)); 4219 len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", 4220 u32_get_bits(ast_info, ATH12K_HTT_AST_PDEV_ID_INFO)); 4221 len += scnprintf(buf + len, buf_len - len, "vdev_id = %u\n", 4222 u32_get_bits(ast_info, ATH12K_HTT_AST_VDEV_ID_INFO)); 4223 len += scnprintf(buf + len, buf_len - len, "next_hop = %u\n", 4224 u32_get_bits(ast_info, ATH12K_HTT_AST_NEXT_HOP_INFO)); 4225 len += scnprintf(buf + len, buf_len - len, "mcast = %u\n", 4226 u32_get_bits(ast_info, ATH12K_HTT_AST_MCAST_INFO)); 4227 len += scnprintf(buf + len, buf_len - len, "monitor_direct = %u\n", 4228 u32_get_bits(ast_info, ATH12K_HTT_AST_MONITOR_DIRECT_INFO)); 4229 len += scnprintf(buf + len, buf_len - len, "mesh_sta = %u\n", 4230 u32_get_bits(ast_info, ATH12K_HTT_AST_MESH_STA_INFO)); 4231 len += scnprintf(buf + len, buf_len - len, "mec = %u\n", 4232 u32_get_bits(ast_info, ATH12K_HTT_AST_MEC_INFO)); 4233 len += scnprintf(buf + len, buf_len - len, "intra_bss = %u\n\n", 4234 u32_get_bits(ast_info, ATH12K_HTT_AST_INTRA_BSS_INFO)); 4235 4236 stats_req->buf_len = len; 4237 } 4238 4239 static const char* 4240 ath12k_htt_get_punct_dir_type_str(enum ath12k_htt_stats_direction direction) 4241 { 4242 switch (direction) { 4243 case ATH12K_HTT_STATS_DIRECTION_TX: 4244 return "tx"; 4245 case ATH12K_HTT_STATS_DIRECTION_RX: 4246 return "rx"; 4247 default: 4248 return "unknown"; 4249 } 4250 } 4251 4252 static const char* 4253 ath12k_htt_get_punct_ppdu_type_str(enum ath12k_htt_stats_ppdu_type ppdu_type) 4254 { 4255 switch (ppdu_type) { 4256 case ATH12K_HTT_STATS_PPDU_TYPE_MODE_SU: 4257 return "su"; 4258 case ATH12K_HTT_STATS_PPDU_TYPE_DL_MU_MIMO: 4259 return "dl_mu_mimo"; 4260 case ATH12K_HTT_STATS_PPDU_TYPE_UL_MU_MIMO: 4261 return "ul_mu_mimo"; 4262 case ATH12K_HTT_STATS_PPDU_TYPE_DL_MU_OFDMA: 4263 return "dl_mu_ofdma"; 4264 case ATH12K_HTT_STATS_PPDU_TYPE_UL_MU_OFDMA: 4265 return "ul_mu_ofdma"; 4266 default: 4267 return "unknown"; 4268 } 4269 } 4270 4271 static const char* 4272 ath12k_htt_get_punct_pream_type_str(enum ath12k_htt_stats_param_type pream_type) 4273 { 4274 switch (pream_type) { 4275 case ATH12K_HTT_STATS_PREAM_OFDM: 4276 return "ofdm"; 4277 case ATH12K_HTT_STATS_PREAM_CCK: 4278 return "cck"; 4279 case ATH12K_HTT_STATS_PREAM_HT: 4280 return "ht"; 4281 case ATH12K_HTT_STATS_PREAM_VHT: 4282 return "ac"; 4283 case ATH12K_HTT_STATS_PREAM_HE: 4284 return "ax"; 4285 case ATH12K_HTT_STATS_PREAM_EHT: 4286 return "be"; 4287 default: 4288 return "unknown"; 4289 } 4290 } 4291 4292 static void 4293 ath12k_htt_print_puncture_stats_tlv(const void *tag_buf, u16 tag_len, 4294 struct debug_htt_stats_req *stats_req) 4295 { 4296 const struct ath12k_htt_pdev_puncture_stats_tlv *stats_buf = tag_buf; 4297 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4298 u32 len = stats_req->buf_len; 4299 u8 *buf = stats_req->buf; 4300 const char *direction; 4301 const char *ppdu_type; 4302 const char *preamble; 4303 u32 mac_id__word; 4304 u32 subband_limit; 4305 u8 i; 4306 4307 if (tag_len < sizeof(*stats_buf)) 4308 return; 4309 4310 mac_id__word = le32_to_cpu(stats_buf->mac_id__word); 4311 subband_limit = min(le32_to_cpu(stats_buf->subband_cnt), 4312 ATH12K_HTT_PUNCT_STATS_MAX_SUBBAND_CNT); 4313 4314 direction = ath12k_htt_get_punct_dir_type_str(le32_to_cpu(stats_buf->direction)); 4315 ppdu_type = ath12k_htt_get_punct_ppdu_type_str(le32_to_cpu(stats_buf->ppdu_type)); 4316 preamble = ath12k_htt_get_punct_pream_type_str(le32_to_cpu(stats_buf->preamble)); 4317 4318 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_PUNCTURE_STATS_TLV:\n"); 4319 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 4320 u32_get_bits(mac_id__word, ATH12K_HTT_STATS_MAC_ID)); 4321 len += scnprintf(buf + len, buf_len - len, 4322 "%s_%s_%s_last_used_pattern_mask = 0x%08x\n", 4323 direction, preamble, ppdu_type, 4324 le32_to_cpu(stats_buf->last_used_pattern_mask)); 4325 4326 for (i = 0; i < subband_limit; i++) { 4327 len += scnprintf(buf + len, buf_len - len, 4328 "%s_%s_%s_num_subbands_used_cnt_%02d = %u\n", 4329 direction, preamble, ppdu_type, i + 1, 4330 le32_to_cpu(stats_buf->num_subbands_used_cnt[i])); 4331 } 4332 len += scnprintf(buf + len, buf_len - len, "\n"); 4333 4334 stats_req->buf_len = len; 4335 } 4336 4337 static void 4338 ath12k_htt_print_dmac_reset_stats_tlv(const void *tag_buf, u16 tag_len, 4339 struct debug_htt_stats_req *stats_req) 4340 { 4341 const struct ath12k_htt_dmac_reset_stats_tlv *htt_stats_buf = tag_buf; 4342 u8 *buf = stats_req->buf; 4343 u32 len = stats_req->buf_len; 4344 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4345 u64 time; 4346 4347 if (tag_len < sizeof(*htt_stats_buf)) 4348 return; 4349 4350 len += scnprintf(buf + len, buf_len - len, "HTT_DMAC_RESET_STATS_TLV:\n"); 4351 len += scnprintf(buf + len, buf_len - len, "reset_count = %u\n", 4352 le32_to_cpu(htt_stats_buf->reset_count)); 4353 time = ath12k_le32hilo_to_u64(htt_stats_buf->reset_time_hi_ms, 4354 htt_stats_buf->reset_time_lo_ms); 4355 len += scnprintf(buf + len, buf_len - len, "reset_time_ms = %llu\n", time); 4356 time = ath12k_le32hilo_to_u64(htt_stats_buf->disengage_time_hi_ms, 4357 htt_stats_buf->disengage_time_lo_ms); 4358 len += scnprintf(buf + len, buf_len - len, "disengage_time_ms = %llu\n", time); 4359 4360 time = ath12k_le32hilo_to_u64(htt_stats_buf->engage_time_hi_ms, 4361 htt_stats_buf->engage_time_lo_ms); 4362 len += scnprintf(buf + len, buf_len - len, "engage_time_ms = %llu\n", time); 4363 4364 len += scnprintf(buf + len, buf_len - len, "disengage_count = %u\n", 4365 le32_to_cpu(htt_stats_buf->disengage_count)); 4366 len += scnprintf(buf + len, buf_len - len, "engage_count = %u\n", 4367 le32_to_cpu(htt_stats_buf->engage_count)); 4368 len += scnprintf(buf + len, buf_len - len, "drain_dest_ring_mask = 0x%x\n\n", 4369 le32_to_cpu(htt_stats_buf->drain_dest_ring_mask)); 4370 4371 stats_req->buf_len = len; 4372 } 4373 4374 static void 4375 ath12k_htt_print_pdev_sched_algo_ofdma_stats_tlv(const void *tag_buf, u16 tag_len, 4376 struct debug_htt_stats_req *stats_req) 4377 { 4378 const struct ath12k_htt_pdev_sched_algo_ofdma_stats_tlv *htt_stats_buf = tag_buf; 4379 u8 *buf = stats_req->buf; 4380 u32 len = stats_req->buf_len; 4381 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4382 u32 mac_id_word; 4383 4384 if (tag_len < sizeof(*htt_stats_buf)) 4385 return; 4386 4387 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word); 4388 4389 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_SCHED_ALGO_TLV:\n"); 4390 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 4391 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 4392 len += print_array_to_buf(buf, len, "rate_based_dlofdma_enabled_count", 4393 htt_stats_buf->rate_based_dlofdma_enabled_cnt, 4394 ATH12K_HTT_NUM_AC_WMM, "\n"); 4395 len += print_array_to_buf(buf, len, "rate_based_dlofdma_disabled_count", 4396 htt_stats_buf->rate_based_dlofdma_disabled_cnt, 4397 ATH12K_HTT_NUM_AC_WMM, "\n"); 4398 len += print_array_to_buf(buf, len, "rate_based_dlofdma_probing_count", 4399 htt_stats_buf->rate_based_dlofdma_disabled_cnt, 4400 ATH12K_HTT_NUM_AC_WMM, "\n"); 4401 len += print_array_to_buf(buf, len, "rate_based_dlofdma_monitoring_count", 4402 htt_stats_buf->rate_based_dlofdma_monitor_cnt, 4403 ATH12K_HTT_NUM_AC_WMM, "\n"); 4404 len += print_array_to_buf(buf, len, "chan_acc_lat_based_dlofdma_enabled_count", 4405 htt_stats_buf->chan_acc_lat_based_dlofdma_enabled_cnt, 4406 ATH12K_HTT_NUM_AC_WMM, "\n"); 4407 len += print_array_to_buf(buf, len, "chan_acc_lat_based_dlofdma_disabled_count", 4408 htt_stats_buf->chan_acc_lat_based_dlofdma_disabled_cnt, 4409 ATH12K_HTT_NUM_AC_WMM, "\n"); 4410 len += print_array_to_buf(buf, len, "chan_acc_lat_based_dlofdma_monitoring_count", 4411 htt_stats_buf->chan_acc_lat_based_dlofdma_monitor_cnt, 4412 ATH12K_HTT_NUM_AC_WMM, "\n"); 4413 len += print_array_to_buf(buf, len, "downgrade_to_dl_su_ru_alloc_fail", 4414 htt_stats_buf->downgrade_to_dl_su_ru_alloc_fail, 4415 ATH12K_HTT_NUM_AC_WMM, "\n"); 4416 len += print_array_to_buf(buf, len, "candidate_list_single_user_disable_ofdma", 4417 htt_stats_buf->candidate_list_single_user_disable_ofdma, 4418 ATH12K_HTT_NUM_AC_WMM, "\n"); 4419 len += print_array_to_buf(buf, len, "dl_cand_list_dropped_high_ul_qos_weight", 4420 htt_stats_buf->dl_cand_list_dropped_high_ul_qos_weight, 4421 ATH12K_HTT_NUM_AC_WMM, "\n"); 4422 len += print_array_to_buf(buf, len, "ax_dlofdma_disabled_due_to_pipelining", 4423 htt_stats_buf->ax_dlofdma_disabled_due_to_pipelining, 4424 ATH12K_HTT_NUM_AC_WMM, "\n"); 4425 len += print_array_to_buf(buf, len, "dlofdma_disabled_su_only_eligible", 4426 htt_stats_buf->dlofdma_disabled_su_only_eligible, 4427 ATH12K_HTT_NUM_AC_WMM, "\n"); 4428 len += print_array_to_buf(buf, len, "dlofdma_disabled_consec_no_mpdus_tried", 4429 htt_stats_buf->dlofdma_disabled_consec_no_mpdus_tried, 4430 ATH12K_HTT_NUM_AC_WMM, "\n"); 4431 len += print_array_to_buf(buf, len, "dlofdma_disabled_consec_no_mpdus_success", 4432 htt_stats_buf->dlofdma_disabled_consec_no_mpdus_success, 4433 ATH12K_HTT_NUM_AC_WMM, "\n\n"); 4434 4435 stats_req->buf_len = len; 4436 } 4437 4438 static void 4439 ath12k_htt_print_tx_pdev_rate_stats_be_ofdma_tlv(const void *tag_buf, u16 tag_len, 4440 struct debug_htt_stats_req *stats_req) 4441 { 4442 const struct ath12k_htt_tx_pdev_rate_stats_be_ofdma_tlv *htt_stats_buf = tag_buf; 4443 u8 *buf = stats_req->buf; 4444 u32 len = stats_req->buf_len; 4445 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4446 u32 mac_id_word; 4447 u8 i; 4448 4449 if (tag_len < sizeof(*htt_stats_buf)) 4450 return; 4451 4452 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word); 4453 4454 len += scnprintf(buf + len, buf_len - len, 4455 "HTT_TX_PDEV_RATE_STATS_BE_OFDMA_TLV:\n"); 4456 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 4457 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 4458 len += scnprintf(buf + len, buf_len - len, "be_ofdma_tx_ldpc = %u\n", 4459 le32_to_cpu(htt_stats_buf->be_ofdma_tx_ldpc)); 4460 len += print_array_to_buf(buf, len, "be_ofdma_tx_mcs", 4461 htt_stats_buf->be_ofdma_tx_mcs, 4462 ATH12K_HTT_TX_PDEV_NUM_BE_MCS_CNTRS, "\n"); 4463 len += print_array_to_buf(buf, len, "be_ofdma_eht_sig_mcs", 4464 htt_stats_buf->be_ofdma_eht_sig_mcs, 4465 ATH12K_HTT_TX_PDEV_NUM_EHT_SIG_MCS_CNTRS, "\n"); 4466 len += scnprintf(buf + len, buf_len - len, "be_ofdma_tx_ru_size = "); 4467 for (i = 0; i < ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS; i++) 4468 len += scnprintf(buf + len, buf_len - len, " %s:%u ", 4469 ath12k_htt_be_tx_rx_ru_size_to_str(i), 4470 le32_to_cpu(htt_stats_buf->be_ofdma_tx_ru_size[i])); 4471 len += scnprintf(buf + len, buf_len - len, "\n"); 4472 len += print_array_to_buf_index(buf, len, "be_ofdma_tx_nss = ", 1, 4473 htt_stats_buf->be_ofdma_tx_nss, 4474 ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS, 4475 "\n"); 4476 len += print_array_to_buf(buf, len, "be_ofdma_tx_bw", 4477 htt_stats_buf->be_ofdma_tx_bw, 4478 ATH12K_HTT_TX_PDEV_NUM_BE_BW_CNTRS, "\n"); 4479 for (i = 0; i < ATH12K_HTT_TX_PDEV_NUM_GI_CNTRS; i++) { 4480 len += scnprintf(buf + len, buf_len - len, 4481 "be_ofdma_tx_gi[%u]", i); 4482 len += print_array_to_buf(buf, len, "", htt_stats_buf->gi[i], 4483 ATH12K_HTT_TX_PDEV_NUM_BE_MCS_CNTRS, "\n"); 4484 } 4485 len += scnprintf(buf + len, buf_len - len, "\n"); 4486 4487 stats_req->buf_len = len; 4488 } 4489 4490 static void 4491 ath12k_htt_print_pdev_mbssid_ctrl_frame_stats_tlv(const void *tag_buf, u16 tag_len, 4492 struct debug_htt_stats_req *stats_req) 4493 { 4494 const struct ath12k_htt_pdev_mbssid_ctrl_frame_tlv *htt_stats_buf = tag_buf; 4495 u8 *buf = stats_req->buf; 4496 u32 len = stats_req->buf_len; 4497 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4498 u32 mac_id_word; 4499 4500 if (tag_len < sizeof(*htt_stats_buf)) 4501 return; 4502 4503 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word); 4504 4505 len += scnprintf(buf + len, buf_len - len, "HTT_MBSSID_CTRL_FRAME_STATS_TLV:\n"); 4506 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 4507 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 4508 len += scnprintf(buf + len, buf_len - len, "basic_trigger_across_bss = %u\n", 4509 le32_to_cpu(htt_stats_buf->basic_trigger_across_bss)); 4510 len += scnprintf(buf + len, buf_len - len, "basic_trigger_within_bss = %u\n", 4511 le32_to_cpu(htt_stats_buf->basic_trigger_within_bss)); 4512 len += scnprintf(buf + len, buf_len - len, "bsr_trigger_across_bss = %u\n", 4513 le32_to_cpu(htt_stats_buf->bsr_trigger_across_bss)); 4514 len += scnprintf(buf + len, buf_len - len, "bsr_trigger_within_bss = %u\n", 4515 le32_to_cpu(htt_stats_buf->bsr_trigger_within_bss)); 4516 len += scnprintf(buf + len, buf_len - len, "mu_rts_across_bss = %u\n", 4517 le32_to_cpu(htt_stats_buf->mu_rts_across_bss)); 4518 len += scnprintf(buf + len, buf_len - len, "mu_rts_within_bss = %u\n", 4519 le32_to_cpu(htt_stats_buf->mu_rts_within_bss)); 4520 len += scnprintf(buf + len, buf_len - len, "ul_mumimo_trigger_across_bss = %u\n", 4521 le32_to_cpu(htt_stats_buf->ul_mumimo_trigger_across_bss)); 4522 len += scnprintf(buf + len, buf_len - len, 4523 "ul_mumimo_trigger_within_bss = %u\n\n", 4524 le32_to_cpu(htt_stats_buf->ul_mumimo_trigger_within_bss)); 4525 4526 stats_req->buf_len = len; 4527 } 4528 4529 static inline void 4530 ath12k_htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf, u16 tag_len, 4531 struct debug_htt_stats_req *stats_req) 4532 { 4533 const struct ath12k_htt_tx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf; 4534 u8 *buf = stats_req->buf; 4535 u32 len = stats_req->buf_len; 4536 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4537 u8 i, j; 4538 u32 mac_id_word; 4539 4540 if (tag_len < sizeof(*htt_stats_buf)) 4541 return; 4542 4543 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id_word); 4544 4545 len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_RATE_STATS_TLV:\n"); 4546 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 4547 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 4548 len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n", 4549 le32_to_cpu(htt_stats_buf->tx_ldpc)); 4550 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_ldpc = %u\n", 4551 le32_to_cpu(htt_stats_buf->ac_mu_mimo_tx_ldpc)); 4552 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_ldpc = %u\n", 4553 le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_ldpc)); 4554 len += scnprintf(buf + len, buf_len - len, "ofdma_tx_ldpc = %u\n", 4555 le32_to_cpu(htt_stats_buf->ofdma_tx_ldpc)); 4556 len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n", 4557 le32_to_cpu(htt_stats_buf->rts_cnt)); 4558 len += scnprintf(buf + len, buf_len - len, "rts_success = %u\n", 4559 le32_to_cpu(htt_stats_buf->rts_success)); 4560 len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n", 4561 le32_to_cpu(htt_stats_buf->ack_rssi)); 4562 len += scnprintf(buf + len, buf_len - len, 4563 "Legacy CCK Rates: 1 Mbps: %u, 2 Mbps: %u, 5.5 Mbps: %u, 12 Mbps: %u\n", 4564 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[0]), 4565 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[1]), 4566 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[2]), 4567 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[3])); 4568 len += scnprintf(buf + len, buf_len - len, 4569 "Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n" 4570 " 24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n", 4571 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[0]), 4572 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[1]), 4573 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[2]), 4574 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[3]), 4575 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[4]), 4576 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[5]), 4577 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[6]), 4578 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[7])); 4579 len += scnprintf(buf + len, buf_len - len, "HE LTF: 1x: %u, 2x: %u, 4x: %u\n", 4580 le32_to_cpu(htt_stats_buf->tx_he_ltf[1]), 4581 le32_to_cpu(htt_stats_buf->tx_he_ltf[2]), 4582 le32_to_cpu(htt_stats_buf->tx_he_ltf[3])); 4583 4584 len += print_array_to_buf(buf, len, "tx_mcs", htt_stats_buf->tx_mcs, 4585 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL); 4586 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++) 4587 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4588 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4589 le32_to_cpu(htt_stats_buf->tx_mcs_ext[j])); 4590 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS; j++) 4591 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4592 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS + 4593 ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS, 4594 le32_to_cpu(htt_stats_buf->tx_mcs_ext_2[j])); 4595 len += scnprintf(buf + len, buf_len - len, "\n"); 4596 4597 len += print_array_to_buf(buf, len, "ax_mu_mimo_tx_mcs", 4598 htt_stats_buf->ax_mu_mimo_tx_mcs, 4599 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL); 4600 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++) 4601 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4602 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4603 le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_mcs_ext[j])); 4604 len += scnprintf(buf + len, buf_len - len, "\n"); 4605 4606 len += print_array_to_buf(buf, len, "ofdma_tx_mcs", 4607 htt_stats_buf->ofdma_tx_mcs, 4608 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL); 4609 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++) 4610 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4611 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4612 le32_to_cpu(htt_stats_buf->ofdma_tx_mcs_ext[j])); 4613 len += scnprintf(buf + len, buf_len - len, "\n"); 4614 4615 len += scnprintf(buf + len, buf_len - len, "tx_nss ="); 4616 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) 4617 len += scnprintf(buf + len, buf_len - len, " %u:%u,", 4618 j, le32_to_cpu(htt_stats_buf->tx_nss[j - 1])); 4619 len--; 4620 len += scnprintf(buf + len, buf_len - len, "\n"); 4621 4622 len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_nss ="); 4623 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) 4624 len += scnprintf(buf + len, buf_len - len, " %u:%u,", 4625 j, le32_to_cpu(htt_stats_buf->ac_mu_mimo_tx_nss[j - 1])); 4626 len--; 4627 len += scnprintf(buf + len, buf_len - len, "\n"); 4628 4629 len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_nss ="); 4630 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) 4631 len += scnprintf(buf + len, buf_len - len, " %u:%u,", 4632 j, le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_nss[j - 1])); 4633 len--; 4634 len += scnprintf(buf + len, buf_len - len, "\n"); 4635 4636 len += scnprintf(buf + len, buf_len - len, "ofdma_tx_nss ="); 4637 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) 4638 len += scnprintf(buf + len, buf_len - len, " %u:%u,", 4639 j, le32_to_cpu(htt_stats_buf->ofdma_tx_nss[j - 1])); 4640 len--; 4641 len += scnprintf(buf + len, buf_len - len, "\n"); 4642 4643 len += print_array_to_buf(buf, len, "tx_bw", htt_stats_buf->tx_bw, 4644 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, NULL); 4645 len += scnprintf(buf + len, buf_len - len, ", %u:%u\n", 4646 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, 4647 le32_to_cpu(htt_stats_buf->tx_bw_320mhz)); 4648 4649 len += print_array_to_buf(buf, len, "tx_stbc", 4650 htt_stats_buf->tx_stbc, 4651 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL); 4652 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++) 4653 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4654 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4655 le32_to_cpu(htt_stats_buf->tx_stbc_ext[j])); 4656 len += scnprintf(buf + len, buf_len - len, "\n"); 4657 4658 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 4659 len += scnprintf(buf + len, (buf_len - len), 4660 "tx_gi[%u] =", j); 4661 len += print_array_to_buf(buf, len, NULL, htt_stats_buf->tx_gi[j], 4662 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4663 NULL); 4664 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) 4665 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4666 i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4667 le32_to_cpu(htt_stats_buf->tx_gi_ext[j][i])); 4668 len += scnprintf(buf + len, buf_len - len, "\n"); 4669 } 4670 4671 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 4672 len += scnprintf(buf + len, (buf_len - len), 4673 "ac_mu_mimo_tx_gi[%u] =", j); 4674 len += print_array_to_buf(buf, len, NULL, 4675 htt_stats_buf->ac_mu_mimo_tx_gi[j], 4676 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4677 "\n"); 4678 } 4679 4680 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 4681 len += scnprintf(buf + len, (buf_len - len), 4682 "ax_mu_mimo_tx_gi[%u] =", j); 4683 len += print_array_to_buf(buf, len, NULL, htt_stats_buf->ax_mimo_tx_gi[j], 4684 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4685 NULL); 4686 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) 4687 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4688 i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4689 le32_to_cpu(htt_stats_buf->ax_tx_gi_ext[j][i])); 4690 len += scnprintf(buf + len, buf_len - len, "\n"); 4691 } 4692 4693 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 4694 len += scnprintf(buf + len, (buf_len - len), 4695 "ofdma_tx_gi[%u] = ", j); 4696 len += print_array_to_buf(buf, len, NULL, htt_stats_buf->ofdma_tx_gi[j], 4697 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4698 NULL); 4699 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) 4700 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4701 i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 4702 le32_to_cpu(htt_stats_buf->ofd_tx_gi_ext[j][i])); 4703 len += scnprintf(buf + len, buf_len - len, "\n"); 4704 } 4705 4706 len += print_array_to_buf(buf, len, "tx_su_mcs", htt_stats_buf->tx_su_mcs, 4707 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4708 len += print_array_to_buf(buf, len, "tx_mu_mcs", htt_stats_buf->tx_mu_mcs, 4709 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4710 len += print_array_to_buf(buf, len, "ac_mu_mimo_tx_mcs", 4711 htt_stats_buf->ac_mu_mimo_tx_mcs, 4712 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4713 len += print_array_to_buf(buf, len, "ac_mu_mimo_tx_bw", 4714 htt_stats_buf->ac_mu_mimo_tx_bw, 4715 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n"); 4716 len += print_array_to_buf(buf, len, "ax_mu_mimo_tx_bw", 4717 htt_stats_buf->ax_mu_mimo_tx_bw, 4718 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n"); 4719 len += print_array_to_buf(buf, len, "ofdma_tx_bw", 4720 htt_stats_buf->ofdma_tx_bw, 4721 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n"); 4722 len += print_array_to_buf(buf, len, "tx_pream", htt_stats_buf->tx_pream, 4723 ATH12K_HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n"); 4724 len += print_array_to_buf(buf, len, "tx_dcm", htt_stats_buf->tx_dcm, 4725 ATH12K_HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n"); 4726 4727 stats_req->buf_len = len; 4728 } 4729 4730 static void 4731 ath12k_htt_print_histogram_stats_tlv(const void *tag_buf, u16 tag_len, 4732 struct debug_htt_stats_req *stats_req) 4733 { 4734 const struct ath12k_htt_tx_histogram_stats_tlv *stats_buf = tag_buf; 4735 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4736 u32 len = stats_req->buf_len; 4737 u8 *buf = stats_req->buf; 4738 4739 if (tag_len < sizeof(*stats_buf)) 4740 return; 4741 4742 len += scnprintf(buf + len, buf_len - len, "low_latency_rate_cnt = %u\n", 4743 le32_to_cpu(stats_buf->low_latency_rate_cnt)); 4744 len += scnprintf(buf + len, buf_len - len, "su_burst_rate_drop_cnt = %u\n", 4745 le32_to_cpu(stats_buf->su_burst_rate_drop_cnt)); 4746 len += scnprintf(buf + len, buf_len - len, "su_burst_rate_drop_fail_cnt = %u\n", 4747 le32_to_cpu(stats_buf->su_burst_rate_drop_fail_cnt)); 4748 len += scnprintf(buf + len, buf_len - len, "rate_retry_mcs_drop_cnt = %u\n", 4749 le32_to_cpu(stats_buf->rate_retry_mcs_drop_cnt)); 4750 4751 len += scnprintf(buf + len, buf_len - len, "\nPER_HISTOGRAM_STATS\n"); 4752 len += print_array_to_buf(buf, len, "mcs_drop_rate", stats_buf->mcs_drop_rate, 4753 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_DROP_COUNTERS, "\n"); 4754 len += print_array_to_buf(buf, len, "per_histogram_count", 4755 stats_buf->per_histogram_cnt, 4756 ATH12K_HTT_TX_PDEV_STATS_NUM_PER_COUNTERS, "\n\n"); 4757 4758 stats_req->buf_len = len; 4759 } 4760 4761 static inline void 4762 ath12k_htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf, u16 tag_len, 4763 struct debug_htt_stats_req *stats_req) 4764 { 4765 const struct ath12k_htt_rx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf; 4766 u8 *buf = stats_req->buf; 4767 u32 len = stats_req->buf_len; 4768 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4769 u8 i, j; 4770 u32 mac_id_word; 4771 4772 if (tag_len < sizeof(*htt_stats_buf)) 4773 return; 4774 4775 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id_word); 4776 4777 len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_STATS_TLV:\n"); 4778 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 4779 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 4780 len += scnprintf(buf + len, buf_len - len, "nsts = %u\n", 4781 le32_to_cpu(htt_stats_buf->nsts)); 4782 len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n", 4783 le32_to_cpu(htt_stats_buf->rx_ldpc)); 4784 len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n", 4785 le32_to_cpu(htt_stats_buf->rts_cnt)); 4786 len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n", 4787 le32_to_cpu(htt_stats_buf->rssi_mgmt)); 4788 len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n", 4789 le32_to_cpu(htt_stats_buf->rssi_data)); 4790 len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n", 4791 le32_to_cpu(htt_stats_buf->rssi_comb)); 4792 len += scnprintf(buf + len, buf_len - len, "rssi_in_dbm = %d\n", 4793 le32_to_cpu(htt_stats_buf->rssi_in_dbm)); 4794 len += scnprintf(buf + len, buf_len - len, "rx_evm_nss_count = %u\n", 4795 le32_to_cpu(htt_stats_buf->nss_count)); 4796 len += scnprintf(buf + len, buf_len - len, "rx_evm_pilot_count = %u\n", 4797 le32_to_cpu(htt_stats_buf->pilot_count)); 4798 len += scnprintf(buf + len, buf_len - len, "rx_11ax_su_ext = %u\n", 4799 le32_to_cpu(htt_stats_buf->rx_11ax_su_ext)); 4800 len += scnprintf(buf + len, buf_len - len, "rx_11ac_mumimo = %u\n", 4801 le32_to_cpu(htt_stats_buf->rx_11ac_mumimo)); 4802 len += scnprintf(buf + len, buf_len - len, "rx_11ax_mumimo = %u\n", 4803 le32_to_cpu(htt_stats_buf->rx_11ax_mumimo)); 4804 len += scnprintf(buf + len, buf_len - len, "rx_11ax_ofdma = %u\n", 4805 le32_to_cpu(htt_stats_buf->rx_11ax_ofdma)); 4806 len += scnprintf(buf + len, buf_len - len, "txbf = %u\n", 4807 le32_to_cpu(htt_stats_buf->txbf)); 4808 len += scnprintf(buf + len, buf_len - len, "rx_su_ndpa = %u\n", 4809 le32_to_cpu(htt_stats_buf->rx_su_ndpa)); 4810 len += scnprintf(buf + len, buf_len - len, "rx_mu_ndpa = %u\n", 4811 le32_to_cpu(htt_stats_buf->rx_mu_ndpa)); 4812 len += scnprintf(buf + len, buf_len - len, "rx_br_poll = %u\n", 4813 le32_to_cpu(htt_stats_buf->rx_br_poll)); 4814 len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_low = %u\n", 4815 le32_to_cpu(htt_stats_buf->rx_active_dur_us_low)); 4816 len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_high = %u\n", 4817 le32_to_cpu(htt_stats_buf->rx_active_dur_us_high)); 4818 len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n", 4819 le32_to_cpu(htt_stats_buf->rx_11ax_ul_ofdma)); 4820 len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n", 4821 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_stbc)); 4822 len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n", 4823 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_ldpc)); 4824 len += scnprintf(buf + len, buf_len - len, "per_chain_rssi_pkt_type = %#x\n", 4825 le32_to_cpu(htt_stats_buf->per_chain_rssi_pkt_type)); 4826 4827 len += print_array_to_buf(buf, len, "rx_nss", htt_stats_buf->rx_nss, 4828 ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n"); 4829 len += print_array_to_buf(buf, len, "rx_dcm", htt_stats_buf->rx_dcm, 4830 ATH12K_HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n"); 4831 len += print_array_to_buf(buf, len, "rx_stbc", htt_stats_buf->rx_stbc, 4832 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4833 len += print_array_to_buf(buf, len, "rx_bw", htt_stats_buf->rx_bw, 4834 ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n"); 4835 len += print_array_to_buf(buf, len, "rx_pream", htt_stats_buf->rx_pream, 4836 ATH12K_HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n"); 4837 len += print_array_to_buf(buf, len, "rx_11ax_su_txbf_mcs", 4838 htt_stats_buf->rx_11ax_su_txbf_mcs, 4839 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4840 len += print_array_to_buf(buf, len, "rx_11ax_mu_txbf_mcs", 4841 htt_stats_buf->rx_11ax_mu_txbf_mcs, 4842 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4843 len += print_array_to_buf(buf, len, "rx_legacy_cck_rate", 4844 htt_stats_buf->rx_legacy_cck_rate, 4845 ATH12K_HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS, "\n"); 4846 len += print_array_to_buf(buf, len, "rx_legacy_ofdm_rate", 4847 htt_stats_buf->rx_legacy_ofdm_rate, 4848 ATH12K_HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS, "\n"); 4849 len += print_array_to_buf(buf, len, "ul_ofdma_rx_mcs", 4850 htt_stats_buf->ul_ofdma_rx_mcs, 4851 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4852 len += print_array_to_buf(buf, len, "ul_ofdma_rx_nss", 4853 htt_stats_buf->ul_ofdma_rx_nss, 4854 ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n"); 4855 len += print_array_to_buf(buf, len, "ul_ofdma_rx_bw", 4856 htt_stats_buf->ul_ofdma_rx_bw, 4857 ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n"); 4858 len += print_array_to_buf(buf, len, "rx_ulofdma_non_data_ppdu", 4859 htt_stats_buf->rx_ulofdma_non_data_ppdu, 4860 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n"); 4861 len += print_array_to_buf(buf, len, "rx_ulofdma_data_ppdu", 4862 htt_stats_buf->rx_ulofdma_data_ppdu, 4863 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n"); 4864 len += print_array_to_buf(buf, len, "rx_ulofdma_mpdu_ok", 4865 htt_stats_buf->rx_ulofdma_mpdu_ok, 4866 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n"); 4867 len += print_array_to_buf(buf, len, "rx_ulofdma_mpdu_fail", 4868 htt_stats_buf->rx_ulofdma_mpdu_fail, 4869 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n"); 4870 len += print_array_to_buf(buf, len, "rx_ulofdma_non_data_nusers", 4871 htt_stats_buf->rx_ulofdma_non_data_nusers, 4872 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n"); 4873 len += print_array_to_buf(buf, len, "rx_ulofdma_data_nusers", 4874 htt_stats_buf->rx_ulofdma_data_nusers, 4875 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n"); 4876 len += print_array_to_buf(buf, len, "rx_11ax_dl_ofdma_mcs", 4877 htt_stats_buf->rx_11ax_dl_ofdma_mcs, 4878 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); 4879 len += print_array_to_buf(buf, len, "rx_11ax_dl_ofdma_ru", 4880 htt_stats_buf->rx_11ax_dl_ofdma_ru, 4881 ATH12K_HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS, "\n"); 4882 len += print_array_to_buf(buf, len, "rx_ulmumimo_non_data_ppdu", 4883 htt_stats_buf->rx_ulmumimo_non_data_ppdu, 4884 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n"); 4885 len += print_array_to_buf(buf, len, "rx_ulmumimo_data_ppdu", 4886 htt_stats_buf->rx_ulmumimo_data_ppdu, 4887 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n"); 4888 len += print_array_to_buf(buf, len, "rx_ulmumimo_mpdu_ok", 4889 htt_stats_buf->rx_ulmumimo_mpdu_ok, 4890 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n"); 4891 len += print_array_to_buf(buf, len, "rx_ulmumimo_mpdu_fail", 4892 htt_stats_buf->rx_ulmumimo_mpdu_fail, 4893 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, "\n"); 4894 4895 len += print_array_to_buf(buf, len, "rx_mcs", 4896 htt_stats_buf->rx_mcs, 4897 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, NULL); 4898 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++) 4899 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 4900 j + ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, 4901 le32_to_cpu(htt_stats_buf->rx_mcs_ext[j])); 4902 len += scnprintf(buf + len, buf_len - len, "\n"); 4903 4904 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) { 4905 len += scnprintf(buf + len, buf_len - len, 4906 "pilot_evm_db[%u] =", j); 4907 len += print_array_to_buf(buf, len, NULL, 4908 htt_stats_buf->rx_pil_evm_db[j], 4909 ATH12K_HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_NSS, 4910 "\n"); 4911 } 4912 4913 len += scnprintf(buf + len, buf_len - len, "pilot_evm_db_mean ="); 4914 for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) 4915 len += scnprintf(buf + len, 4916 buf_len - len, 4917 " %u:%d,", i, 4918 le32_to_cpu(htt_stats_buf->rx_pilot_evm_db_mean[i])); 4919 len--; 4920 len += scnprintf(buf + len, buf_len - len, "\n"); 4921 4922 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) { 4923 len += scnprintf(buf + len, buf_len - len, 4924 "rssi_chain_in_db[%u] = ", j); 4925 for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) 4926 len += scnprintf(buf + len, 4927 buf_len - len, 4928 " %u: %d,", i, 4929 htt_stats_buf->rssi_chain_in_db[j][i]); 4930 len--; 4931 len += scnprintf(buf + len, buf_len - len, "\n"); 4932 } 4933 4934 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 4935 len += scnprintf(buf + len, buf_len - len, 4936 "rx_gi[%u] = ", j); 4937 len += print_array_to_buf(buf, len, NULL, 4938 htt_stats_buf->rx_gi[j], 4939 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, 4940 "\n"); 4941 } 4942 4943 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 4944 len += scnprintf(buf + len, buf_len - len, 4945 "ul_ofdma_rx_gi[%u] = ", j); 4946 len += print_array_to_buf(buf, len, NULL, 4947 htt_stats_buf->ul_ofdma_rx_gi[j], 4948 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, 4949 "\n"); 4950 } 4951 4952 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) { 4953 len += scnprintf(buf + len, buf_len - len, 4954 "rx_ul_fd_rssi: nss[%u] = ", j); 4955 for (i = 0; i < ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) 4956 len += scnprintf(buf + len, 4957 buf_len - len, 4958 " %u:%d,", 4959 i, htt_stats_buf->rx_ul_fd_rssi[j][i]); 4960 len--; 4961 len += scnprintf(buf + len, buf_len - len, "\n"); 4962 } 4963 4964 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) { 4965 len += scnprintf(buf + len, buf_len - len, 4966 "rx_per_chain_rssi_in_dbm[%u] =", j); 4967 for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) 4968 len += scnprintf(buf + len, 4969 buf_len - len, 4970 " %u:%d,", 4971 i, 4972 htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]); 4973 len--; 4974 len += scnprintf(buf + len, buf_len - len, "\n"); 4975 } 4976 4977 stats_req->buf_len = len; 4978 } 4979 4980 static inline void 4981 ath12k_htt_print_rx_pdev_rate_ext_stats_tlv(const void *tag_buf, u16 tag_len, 4982 struct debug_htt_stats_req *stats_req) 4983 { 4984 const struct ath12k_htt_rx_pdev_rate_ext_stats_tlv *htt_stats_buf = tag_buf; 4985 u8 *buf = stats_req->buf; 4986 u32 len = stats_req->buf_len; 4987 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 4988 u8 j; 4989 4990 if (tag_len < sizeof(*htt_stats_buf)) 4991 return; 4992 4993 len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_EXT_STATS_TLV:\n"); 4994 len += scnprintf(buf + len, buf_len - len, "rssi_mgmt_in_dbm = %d\n", 4995 le32_to_cpu(htt_stats_buf->rssi_mgmt_in_dbm)); 4996 4997 len += print_array_to_buf(buf, len, "rx_stbc_ext", 4998 htt_stats_buf->rx_stbc_ext, 4999 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n"); 5000 len += print_array_to_buf(buf, len, "ul_ofdma_rx_mcs_ext", 5001 htt_stats_buf->ul_ofdma_rx_mcs_ext, 5002 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n"); 5003 len += print_array_to_buf(buf, len, "rx_11ax_su_txbf_mcs_ext", 5004 htt_stats_buf->rx_11ax_su_txbf_mcs_ext, 5005 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n"); 5006 len += print_array_to_buf(buf, len, "rx_11ax_mu_txbf_mcs_ext", 5007 htt_stats_buf->rx_11ax_mu_txbf_mcs_ext, 5008 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n"); 5009 len += print_array_to_buf(buf, len, "rx_11ax_dl_ofdma_mcs_ext", 5010 htt_stats_buf->rx_11ax_dl_ofdma_mcs_ext, 5011 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n"); 5012 len += print_array_to_buf(buf, len, "rx_bw_ext", 5013 htt_stats_buf->rx_bw_ext, 5014 ATH12K_HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS, "\n"); 5015 len += print_array_to_buf(buf, len, "rx_su_punctured_mode", 5016 htt_stats_buf->rx_su_punctured_mode, 5017 ATH12K_HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS, 5018 "\n"); 5019 5020 len += print_array_to_buf(buf, len, "rx_mcs_ext", 5021 htt_stats_buf->rx_mcs_ext, 5022 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, 5023 NULL); 5024 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS; j++) 5025 len += scnprintf(buf + len, buf_len - len, ", %u:%u", 5026 j + ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, 5027 le32_to_cpu(htt_stats_buf->rx_mcs_ext_2[j])); 5028 len += scnprintf(buf + len, buf_len - len, "\n"); 5029 5030 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 5031 len += scnprintf(buf + len, buf_len - len, 5032 "rx_gi_ext[%u] = ", j); 5033 len += print_array_to_buf(buf, len, NULL, 5034 htt_stats_buf->rx_gi_ext[j], 5035 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, 5036 "\n"); 5037 } 5038 5039 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 5040 len += scnprintf(buf + len, buf_len - len, 5041 "ul_ofdma_rx_gi_ext[%u] = ", j); 5042 len += print_array_to_buf(buf, len, NULL, 5043 htt_stats_buf->ul_ofdma_rx_gi_ext[j], 5044 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, 5045 "\n"); 5046 } 5047 5048 stats_req->buf_len = len; 5049 } 5050 5051 static void 5052 ath12k_htt_print_pdev_tdma_stats_tlv(const void *tag_buf, u16 tag_len, 5053 struct debug_htt_stats_req *stats_req) 5054 { 5055 const struct ath12k_htt_pdev_tdma_stats_tlv *htt_stats_buf = tag_buf; 5056 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5057 u32 len = stats_req->buf_len; 5058 u8 *buf = stats_req->buf; 5059 u32 mac_id_word; 5060 5061 if (tag_len < sizeof(*htt_stats_buf)) 5062 return; 5063 5064 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word); 5065 5066 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_TDMA_STATS_TLV:\n"); 5067 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 5068 u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID)); 5069 len += scnprintf(buf + len, buf_len - len, "num_tdma_active_schedules = %u\n", 5070 le32_to_cpu(htt_stats_buf->num_tdma_active_schedules)); 5071 len += scnprintf(buf + len, buf_len - len, "num_tdma_reserved_schedules = %u\n", 5072 le32_to_cpu(htt_stats_buf->num_tdma_reserved_schedules)); 5073 len += scnprintf(buf + len, buf_len - len, 5074 "num_tdma_restricted_schedules = %u\n", 5075 le32_to_cpu(htt_stats_buf->num_tdma_restricted_schedules)); 5076 len += scnprintf(buf + len, buf_len - len, 5077 "num_tdma_unconfigured_schedules = %u\n", 5078 le32_to_cpu(htt_stats_buf->num_tdma_unconfigured_schedules)); 5079 len += scnprintf(buf + len, buf_len - len, "num_tdma_slot_switches = %u\n", 5080 le32_to_cpu(htt_stats_buf->num_tdma_slot_switches)); 5081 len += scnprintf(buf + len, buf_len - len, "num_tdma_edca_switches = %u\n\n", 5082 le32_to_cpu(htt_stats_buf->num_tdma_edca_switches)); 5083 5084 stats_req->buf_len = len; 5085 } 5086 5087 static void 5088 ath12k_htt_print_mlo_sched_stats_tlv(const void *tag_buf, u16 tag_len, 5089 struct debug_htt_stats_req *stats_req) 5090 { 5091 const struct ath12k_htt_mlo_sched_stats_tlv *stats_buf = tag_buf; 5092 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5093 u32 len = stats_req->buf_len; 5094 u8 *buf = stats_req->buf; 5095 5096 if (tag_len < sizeof(*stats_buf)) 5097 return; 5098 5099 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_MLO_SCHED_STATS:\n"); 5100 len += scnprintf(buf + len, buf_len - len, "num_sec_link_sched = %u\n", 5101 le32_to_cpu(stats_buf->pref_link_num_sec_link_sched)); 5102 len += scnprintf(buf + len, buf_len - len, "num_pref_link_timeout = %u\n", 5103 le32_to_cpu(stats_buf->pref_link_num_pref_link_timeout)); 5104 len += scnprintf(buf + len, buf_len - len, "num_pref_link_sch_delay_ipc = %u\n", 5105 le32_to_cpu(stats_buf->pref_link_num_pref_link_sch_delay_ipc)); 5106 len += scnprintf(buf + len, buf_len - len, "num_pref_link_timeout_ipc = %u\n\n", 5107 le32_to_cpu(stats_buf->pref_link_num_pref_link_timeout_ipc)); 5108 5109 stats_req->buf_len = len; 5110 } 5111 5112 static void 5113 ath12k_htt_print_mlo_ipc_stats_tlv(const void *tag_buf, u16 tag_len, 5114 struct debug_htt_stats_req *stats_req) 5115 { 5116 const struct ath12k_htt_pdev_mlo_ipc_stats_tlv *stats_buf = tag_buf; 5117 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5118 u32 len = stats_req->buf_len; 5119 u8 *buf = stats_req->buf; 5120 u8 i, j; 5121 5122 if (tag_len < sizeof(*stats_buf)) 5123 return; 5124 5125 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_MLO_IPC_STATS:\n"); 5126 for (i = 0; i < ATH12K_HTT_HWMLO_MAX_LINKS; i++) { 5127 len += scnprintf(buf + len, buf_len - len, "src_link: %u\n", i); 5128 for (j = 0; j < ATH12K_HTT_MLO_MAX_IPC_RINGS; j++) 5129 len += scnprintf(buf + len, buf_len - len, 5130 "mlo_ipc_ring_full_cnt[%u]: %u\n", j, 5131 le32_to_cpu(stats_buf->mlo_ipc_ring_cnt[i][j])); 5132 len += scnprintf(buf + len, buf_len - len, "\n"); 5133 } 5134 5135 stats_req->buf_len = len; 5136 } 5137 5138 static void 5139 ath12k_htt_print_pdev_rtt_resp_stats_tlv(const void *tag_buf, u16 tag_len, 5140 struct debug_htt_stats_req *stats_req) 5141 { 5142 const struct ath12k_htt_stats_pdev_rtt_resp_stats_tlv *sbuf = tag_buf; 5143 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5144 u32 len = stats_req->buf_len; 5145 u8 *buf = stats_req->buf; 5146 5147 if (tag_len < sizeof(*sbuf)) 5148 return; 5149 5150 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_RTT_RESP_STATS_TLV:\n"); 5151 len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", 5152 le32_to_cpu(sbuf->pdev_id)); 5153 len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftm_suc = %u\n", 5154 le32_to_cpu(sbuf->tx_11mc_ftm_suc)); 5155 len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftm_suc_retry = %u\n", 5156 le32_to_cpu(sbuf->tx_11mc_ftm_suc_retry)); 5157 len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftm_fail = %u\n", 5158 le32_to_cpu(sbuf->tx_11mc_ftm_fail)); 5159 len += scnprintf(buf + len, buf_len - len, "rx_11mc_ftmr_cnt = %u\n", 5160 le32_to_cpu(sbuf->rx_11mc_ftmr_cnt)); 5161 len += scnprintf(buf + len, buf_len - len, "rx_11mc_ftmr_dup_cnt = %u\n", 5162 le32_to_cpu(sbuf->rx_11mc_ftmr_dup_cnt)); 5163 len += scnprintf(buf + len, buf_len - len, "rx_11mc_iftmr_cnt = %u\n", 5164 le32_to_cpu(sbuf->rx_11mc_iftmr_cnt)); 5165 len += scnprintf(buf + len, buf_len - len, "rx_11mc_iftmr_dup_cnt = %u\n", 5166 le32_to_cpu(sbuf->rx_11mc_iftmr_dup_cnt)); 5167 len += scnprintf(buf + len, buf_len - len, 5168 "ftmr_drop_11mc_resp_role_not_enabled_cnt = %u\n", 5169 le32_to_cpu(sbuf->ftmr_drop_11mc_resp_role_not_enabled_cnt)); 5170 len += scnprintf(buf + len, buf_len - len, "tx_11az_ftm_successful = %u\n", 5171 le32_to_cpu(sbuf->tx_11az_ftm_successful)); 5172 len += scnprintf(buf + len, buf_len - len, "tx_11az_ftm_failed = %u\n", 5173 le32_to_cpu(sbuf->tx_11az_ftm_failed)); 5174 len += scnprintf(buf + len, buf_len - len, "rx_11az_ftmr_cnt = %u\n", 5175 le32_to_cpu(sbuf->rx_11az_ftmr_cnt)); 5176 len += scnprintf(buf + len, buf_len - len, "rx_11az_ftmr_dup_cnt = %u\n", 5177 le32_to_cpu(sbuf->rx_11az_ftmr_dup_cnt)); 5178 len += scnprintf(buf + len, buf_len - len, "rx_11az_iftmr_dup_cnt = %u\n", 5179 le32_to_cpu(sbuf->rx_11az_iftmr_dup_cnt)); 5180 len += scnprintf(buf + len, buf_len - len, 5181 "initiator_active_responder_rejected_cnt = %u\n", 5182 le32_to_cpu(sbuf->initiator_active_responder_rejected_cnt)); 5183 len += scnprintf(buf + len, buf_len - len, "malformed_ftmr = %u\n", 5184 le32_to_cpu(sbuf->malformed_ftmr)); 5185 len += scnprintf(buf + len, buf_len - len, 5186 "ftmr_drop_ntb_resp_role_not_enabled_cnt = %u\n", 5187 le32_to_cpu(sbuf->ftmr_drop_ntb_resp_role_not_enabled_cnt)); 5188 len += scnprintf(buf + len, buf_len - len, 5189 "ftmr_drop_tb_resp_role_not_enabled_cnt = %u\n", 5190 le32_to_cpu(sbuf->ftmr_drop_tb_resp_role_not_enabled_cnt)); 5191 len += scnprintf(buf + len, buf_len - len, "responder_alloc_cnt = %u\n", 5192 le32_to_cpu(sbuf->responder_alloc_cnt)); 5193 len += scnprintf(buf + len, buf_len - len, "responder_alloc_failure = %u\n", 5194 le32_to_cpu(sbuf->responder_alloc_failure)); 5195 len += scnprintf(buf + len, buf_len - len, "responder_terminate_cnt = %u\n", 5196 le32_to_cpu(sbuf->responder_terminate_cnt)); 5197 len += scnprintf(buf + len, buf_len - len, "active_rsta_open = %u\n", 5198 le32_to_cpu(sbuf->active_rsta_open)); 5199 len += scnprintf(buf + len, buf_len - len, "active_rsta_mac = %u\n", 5200 le32_to_cpu(sbuf->active_rsta_mac)); 5201 len += scnprintf(buf + len, buf_len - len, "active_rsta_mac_phy = %u\n", 5202 le32_to_cpu(sbuf->active_rsta_mac_phy)); 5203 len += scnprintf(buf + len, buf_len - len, "pn_check_failure_cnt = %u\n", 5204 le32_to_cpu(sbuf->pn_check_failure_cnt)); 5205 len += scnprintf(buf + len, buf_len - len, "num_assoc_ranging_peers = %u\n", 5206 le32_to_cpu(sbuf->num_assoc_ranging_peers)); 5207 len += scnprintf(buf + len, buf_len - len, "num_unassoc_ranging_peers = %u\n", 5208 le32_to_cpu(sbuf->num_unassoc_ranging_peers)); 5209 len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_recv_cnt = %u\n", 5210 le32_to_cpu(sbuf->pasn_m1_auth_recv_cnt)); 5211 len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_drop_cnt = %u\n", 5212 le32_to_cpu(sbuf->pasn_m1_auth_drop_cnt)); 5213 len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_recv_cnt = %u\n", 5214 le32_to_cpu(sbuf->pasn_m2_auth_recv_cnt)); 5215 len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_tx_fail_cnt = %u\n", 5216 le32_to_cpu(sbuf->pasn_m2_auth_tx_fail_cnt)); 5217 len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_recv_cnt = %u\n", 5218 le32_to_cpu(sbuf->pasn_m3_auth_recv_cnt)); 5219 len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_drop_cnt = %u\n", 5220 le32_to_cpu(sbuf->pasn_m3_auth_drop_cnt)); 5221 len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_request_cnt = %u\n", 5222 le32_to_cpu(sbuf->pasn_peer_create_request_cnt)); 5223 len += scnprintf(buf + len, buf_len - len, "pasn_peer_created_cnt = %u\n", 5224 le32_to_cpu(sbuf->pasn_peer_created_cnt)); 5225 len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_timeout_cnt = %u\n", 5226 le32_to_cpu(sbuf->pasn_peer_create_timeout_cnt)); 5227 len += scnprintf(buf + len, buf_len - len, 5228 "sec_ranging_not_supported_mfp_not_setup = %u\n", 5229 le32_to_cpu(sbuf->sec_ranging_not_supported_mfp_not_setup)); 5230 len += scnprintf(buf + len, buf_len - len, 5231 "non_sec_ranging_discarded_for_assoc_peer_with_mfpr_set = %u\n", 5232 le32_to_cpu(sbuf->non_sec_ranging_discarded_for_assoc_peer)); 5233 len += scnprintf(buf + len, buf_len - len, 5234 "open_ranging_discarded_with_URNM_MFPR_set_for_pasn_peer = %u\n", 5235 le32_to_cpu(sbuf->open_ranging_discarded_set_for_pasn_peer)); 5236 len += scnprintf(buf + len, buf_len - len, 5237 "unassoc_non_pasn_ranging_not_supported_with_URNM_MFPR = %u\n", 5238 le32_to_cpu(sbuf->unassoc_non_pasn_ranging_not_supported)); 5239 len += scnprintf(buf + len, buf_len - len, "invalid_ftm_request_params = %u\n", 5240 le32_to_cpu(sbuf->invalid_ftm_request_params)); 5241 len += scnprintf(buf + len, buf_len - len, 5242 "requested_bw_format_not_supported = %u\n", 5243 le32_to_cpu(sbuf->requested_bw_format_not_supported)); 5244 len += scnprintf(buf + len, buf_len - len, 5245 "ntb_unsec_unassoc_mode_ranging_peer_alloc_failed = %u\n", 5246 le32_to_cpu(sbuf->ntb_unsec_unassoc_ranging_peer_alloc_failed)); 5247 len += scnprintf(buf + len, buf_len - len, 5248 "tb_unassoc_unsec_mode_pasn_peer_creation_failed = %u\n", 5249 le32_to_cpu(sbuf->tb_unassoc_unsec_pasn_peer_creation_failed)); 5250 len += scnprintf(buf + len, buf_len - len, 5251 "num_ranging_sequences_processed = %u\n", 5252 le32_to_cpu(sbuf->num_ranging_sequences_processed)); 5253 len += scnprintf(buf + len, buf_len - len, "ndp_rx_cnt = %u\n", 5254 le32_to_cpu(sbuf->ndp_rx_cnt)); 5255 len += scnprintf(buf + len, buf_len - len, "num_req_bw_20_MHz = %u\n", 5256 le32_to_cpu(sbuf->num_req_bw_20_mhz)); 5257 len += scnprintf(buf + len, buf_len - len, "num_req_bw_40_MHz = %u\n", 5258 le32_to_cpu(sbuf->num_req_bw_40_mhz)); 5259 len += scnprintf(buf + len, buf_len - len, "num_req_bw_80_MHz = %u\n", 5260 le32_to_cpu(sbuf->num_req_bw_80_mhz)); 5261 len += scnprintf(buf + len, buf_len - len, "num_req_bw_160_MHz = %u\n", 5262 le32_to_cpu(sbuf->num_req_bw_160_mhz)); 5263 len += scnprintf(buf + len, buf_len - len, "ntb_tx_ndp = %u\n", 5264 le32_to_cpu(sbuf->ntb_tx_ndp)); 5265 len += scnprintf(buf + len, buf_len - len, "num_ntb_ranging_NDPAs_recv = %u\n", 5266 le32_to_cpu(sbuf->num_ntb_ranging_ndpas_recv)); 5267 len += scnprintf(buf + len, buf_len - len, "recv_lmr = %u\n", 5268 le32_to_cpu(sbuf->recv_lmr)); 5269 len += scnprintf(buf + len, buf_len - len, "invalid_ftmr_cnt = %u\n", 5270 le32_to_cpu(sbuf->invalid_ftmr_cnt)); 5271 len += scnprintf(buf + len, buf_len - len, "max_time_bw_meas_exp_cnt = %u\n\n", 5272 le32_to_cpu(sbuf->max_time_bw_meas_exp_cnt)); 5273 5274 stats_req->buf_len = len; 5275 } 5276 5277 static void 5278 ath12k_htt_print_pdev_rtt_init_stats_tlv(const void *tag_buf, u16 tag_len, 5279 struct debug_htt_stats_req *stats_req) 5280 { 5281 const struct ath12k_htt_stats_pdev_rtt_init_stats_tlv *htt_stats_buf = tag_buf; 5282 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5283 u32 len = stats_req->buf_len; 5284 u8 *buf = stats_req->buf, i; 5285 __le32 sch_fail; 5286 5287 if (tag_len < sizeof(*htt_stats_buf)) 5288 return; 5289 5290 len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_RTT_INIT_STATS_TLV:\n"); 5291 len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", 5292 le32_to_cpu(htt_stats_buf->pdev_id)); 5293 len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftmr_cnt = %u\n", 5294 le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_cnt)); 5295 len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftmr_fail = %u\n", 5296 le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_fail)); 5297 len += scnprintf(buf + len, buf_len - len, "tx_11mc_ftmr_suc_retry = %u\n", 5298 le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_suc_retry)); 5299 len += scnprintf(buf + len, buf_len - len, "rx_11mc_ftm_cnt = %u\n", 5300 le32_to_cpu(htt_stats_buf->rx_11mc_ftm_cnt)); 5301 len += scnprintf(buf + len, buf_len - len, "rx_11az_ftm_cnt = %u\n", 5302 le32_to_cpu(htt_stats_buf->rx_11az_ftm_cnt)); 5303 len += scnprintf(buf + len, buf_len - len, "initiator_terminate_cnt = %u\n", 5304 le32_to_cpu(htt_stats_buf->initiator_terminate_cnt)); 5305 len += scnprintf(buf + len, buf_len - len, "tx_meas_req_count = %u\n", 5306 le32_to_cpu(htt_stats_buf->tx_meas_req_count)); 5307 len += scnprintf(buf + len, buf_len - len, "tx_11az_ftmr_start = %u\n", 5308 le32_to_cpu(htt_stats_buf->tx_11az_ftmr_start)); 5309 len += scnprintf(buf + len, buf_len - len, "tx_11az_ftmr_stop = %u\n", 5310 le32_to_cpu(htt_stats_buf->tx_11az_ftmr_stop)); 5311 len += scnprintf(buf + len, buf_len - len, "tx_11az_ftmr_fail = %u\n", 5312 le32_to_cpu(htt_stats_buf->tx_11az_ftmr_fail)); 5313 len += scnprintf(buf + len, buf_len - len, 5314 "ftmr_tx_failed_null_11az_peer = %u\n", 5315 le32_to_cpu(htt_stats_buf->ftmr_tx_failed_null_11az_peer)); 5316 len += scnprintf(buf + len, buf_len - len, "ftmr_retry_timeout = %u\n", 5317 le32_to_cpu(htt_stats_buf->ftmr_retry_timeout)); 5318 len += scnprintf(buf + len, buf_len - len, "ftm_parse_failure = %u\n", 5319 le32_to_cpu(htt_stats_buf->ftm_parse_failure)); 5320 len += scnprintf(buf + len, buf_len - len, "incompatible_ftm_params = %u\n", 5321 le32_to_cpu(htt_stats_buf->incompatible_ftm_params)); 5322 len += scnprintf(buf + len, buf_len - len, 5323 "ranging_negotiation_successful_cnt = %u\n", 5324 le32_to_cpu(htt_stats_buf->ranging_negotiation_successful_cnt)); 5325 len += scnprintf(buf + len, buf_len - len, "active_ista = %u\n", 5326 le32_to_cpu(htt_stats_buf->active_ista)); 5327 len += scnprintf(buf + len, buf_len - len, "init_role_not_enabled = %u\n", 5328 le32_to_cpu(htt_stats_buf->init_role_not_enabled)); 5329 len += scnprintf(buf + len, buf_len - len, "invalid_preamble = %u\n", 5330 le32_to_cpu(htt_stats_buf->invalid_preamble)); 5331 len += scnprintf(buf + len, buf_len - len, "invalid_chan_bw_format = %u\n", 5332 le32_to_cpu(htt_stats_buf->invalid_chan_bw_format)); 5333 len += scnprintf(buf + len, buf_len - len, "mgmt_buff_alloc_fail_cnt = %u\n", 5334 le32_to_cpu(htt_stats_buf->mgmt_buff_alloc_fail_cnt)); 5335 len += scnprintf(buf + len, buf_len - len, "sec_ranging_req_in_open_mode = %u\n", 5336 le32_to_cpu(htt_stats_buf->sec_ranging_req_in_open_mode)); 5337 len += scnprintf(buf + len, buf_len - len, "max_time_bw_meas_exp_cnt = %u\n", 5338 le32_to_cpu(htt_stats_buf->max_time_bw_meas_exp_cnt)); 5339 len += scnprintf(buf + len, buf_len - len, "num_tb_ranging_requests = %u\n", 5340 le32_to_cpu(htt_stats_buf->num_tb_ranging_requests)); 5341 len += scnprintf(buf + len, buf_len - len, "tb_meas_duration_expiry_cnt = %u\n", 5342 le32_to_cpu(htt_stats_buf->tb_meas_duration_expiry_cnt)); 5343 len += scnprintf(buf + len, buf_len - len, "ntbr_triggered_successfully = %u\n", 5344 le32_to_cpu(htt_stats_buf->ntbr_triggered_successfully)); 5345 len += scnprintf(buf + len, buf_len - len, "ntbr_trigger_failed = %u\n", 5346 le32_to_cpu(htt_stats_buf->ntbr_trigger_failed)); 5347 len += scnprintf(buf + len, buf_len - len, "invalid_or_no_vreg_idx = %u\n", 5348 le32_to_cpu(htt_stats_buf->invalid_or_no_vreg_idx)); 5349 len += scnprintf(buf + len, buf_len - len, "set_vreg_params_failed = %u\n", 5350 le32_to_cpu(htt_stats_buf->set_vreg_params_failed)); 5351 len += scnprintf(buf + len, buf_len - len, "sac_mismatch = %u\n", 5352 le32_to_cpu(htt_stats_buf->sac_mismatch)); 5353 len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_recv_cnt = %u\n", 5354 le32_to_cpu(htt_stats_buf->pasn_m1_auth_recv_cnt)); 5355 len += scnprintf(buf + len, buf_len - len, "pasn_m1_auth_tx_fail_cnt = %u\n", 5356 le32_to_cpu(htt_stats_buf->pasn_m1_auth_tx_fail_cnt)); 5357 len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_recv_cnt = %u\n", 5358 le32_to_cpu(htt_stats_buf->pasn_m2_auth_recv_cnt)); 5359 len += scnprintf(buf + len, buf_len - len, "pasn_m2_auth_drop_cnt = %u\n", 5360 le32_to_cpu(htt_stats_buf->pasn_m2_auth_drop_cnt)); 5361 len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_recv_cnt = %u\n", 5362 le32_to_cpu(htt_stats_buf->pasn_m3_auth_recv_cnt)); 5363 len += scnprintf(buf + len, buf_len - len, "pasn_m3_auth_tx_fail_cnt = %u\n", 5364 le32_to_cpu(htt_stats_buf->pasn_m3_auth_tx_fail_cnt)); 5365 len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_request_cnt = %u\n", 5366 le32_to_cpu(htt_stats_buf->pasn_peer_create_request_cnt)); 5367 len += scnprintf(buf + len, buf_len - len, "pasn_peer_created_cnt = %u\n", 5368 le32_to_cpu(htt_stats_buf->pasn_peer_created_cnt)); 5369 len += scnprintf(buf + len, buf_len - len, "pasn_peer_create_timeout_cnt = %u\n", 5370 le32_to_cpu(htt_stats_buf->pasn_peer_create_timeout_cnt)); 5371 len += scnprintf(buf + len, buf_len - len, "ntbr_ndpa_failed = %u\n", 5372 le32_to_cpu(htt_stats_buf->ntbr_ndpa_failed)); 5373 len += scnprintf(buf + len, buf_len - len, "ntbr_sequence_successful = %u\n", 5374 le32_to_cpu(htt_stats_buf->ntbr_sequence_successful)); 5375 len += scnprintf(buf + len, buf_len - len, "ntbr_ndp_failed = %u\n", 5376 le32_to_cpu(htt_stats_buf->ntbr_ndp_failed)); 5377 len += scnprintf(buf + len, buf_len - len, "num_tb_ranging_NDPAs_recv = %u\n", 5378 le32_to_cpu(htt_stats_buf->num_tb_ranging_ndpas_recv)); 5379 len += scnprintf(buf + len, buf_len - len, "ndp_rx_cnt = %u\n", 5380 le32_to_cpu(htt_stats_buf->ndp_rx_cnt)); 5381 len += scnprintf(buf + len, buf_len - len, "num_trigger_frames_received = %u\n", 5382 le32_to_cpu(htt_stats_buf->num_trigger_frames_received)); 5383 for (i = 0; i < (ATH12K_HTT_SCH_CMD_STATUS_CNT - 1); i++) 5384 len += scnprintf(buf + len, buf_len - len, 5385 "num_sch_cmd_status_%d = %u\n", i, 5386 le32_to_cpu(htt_stats_buf->sch_cmd_status_cnts[i])); 5387 sch_fail = htt_stats_buf->sch_cmd_status_cnts[ATH12K_HTT_SCH_CMD_STATUS_CNT - 1]; 5388 len += scnprintf(buf + len, buf_len - len, 5389 "num_sch_cmd_status_other_failure = %u\n", 5390 le32_to_cpu(sch_fail)); 5391 len += scnprintf(buf + len, buf_len - len, "lmr_timeout = %u\n", 5392 le32_to_cpu(htt_stats_buf->lmr_timeout)); 5393 len += scnprintf(buf + len, buf_len - len, "lmr_recv = %u\n\n", 5394 le32_to_cpu(htt_stats_buf->lmr_recv)); 5395 5396 stats_req->buf_len = len; 5397 } 5398 5399 static void 5400 ath12k_htt_print_pdev_rtt_hw_stats_tlv(const void *tag_buf, u16 tag_len, 5401 struct debug_htt_stats_req *stats_req) 5402 { 5403 const struct ath12k_htt_stats_pdev_rtt_hw_stats_tlv *htt_stats_buf = tag_buf; 5404 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5405 u32 len = stats_req->buf_len; 5406 u8 *buf = stats_req->buf; 5407 5408 if (tag_len < sizeof(*htt_stats_buf)) 5409 return; 5410 5411 len += scnprintf(buf + len, buf_len - len, "HTT_STATS_PDEV_RTT_HW_STATS_TAG:\n"); 5412 len += scnprintf(buf + len, buf_len - len, "ista_ranging_ndpa_cnt = %u\n", 5413 le32_to_cpu(htt_stats_buf->ista_ranging_ndpa_cnt)); 5414 len += scnprintf(buf + len, buf_len - len, "ista_ranging_ndp_cnt = %u\n", 5415 le32_to_cpu(htt_stats_buf->ista_ranging_ndp_cnt)); 5416 len += scnprintf(buf + len, buf_len - len, "ista_ranging_i2r_lmr_cnt = %u\n", 5417 le32_to_cpu(htt_stats_buf->ista_ranging_i2r_lmr_cnt)); 5418 len += scnprintf(buf + len, buf_len - len, "rtsa_ranging_resp_cnt = %u\n", 5419 le32_to_cpu(htt_stats_buf->rtsa_ranging_resp_cnt)); 5420 len += scnprintf(buf + len, buf_len - len, "rtsa_ranging_ndp_cnt = %u\n", 5421 le32_to_cpu(htt_stats_buf->rtsa_ranging_ndp_cnt)); 5422 len += scnprintf(buf + len, buf_len - len, "rsta_ranging_lmr_cnt = %u\n", 5423 le32_to_cpu(htt_stats_buf->rsta_ranging_lmr_cnt)); 5424 len += scnprintf(buf + len, buf_len - len, "tb_ranging_cts2s_rcvd_cnt = %u\n", 5425 le32_to_cpu(htt_stats_buf->tb_ranging_cts2s_rcvd_cnt)); 5426 len += scnprintf(buf + len, buf_len - len, "tb_ranging_ndp_rcvd_cnt = %u\n", 5427 le32_to_cpu(htt_stats_buf->tb_ranging_ndp_rcvd_cnt)); 5428 len += scnprintf(buf + len, buf_len - len, "tb_ranging_lmr_rcvd_cnt = %u\n", 5429 le32_to_cpu(htt_stats_buf->tb_ranging_lmr_rcvd_cnt)); 5430 len += scnprintf(buf + len, buf_len - len, 5431 "tb_ranging_tf_poll_resp_sent_cnt = %u\n", 5432 le32_to_cpu(htt_stats_buf->tb_ranging_tf_poll_resp_sent_cnt)); 5433 len += scnprintf(buf + len, buf_len - len, 5434 "tb_ranging_tf_sound_resp_sent_cnt = %u\n", 5435 le32_to_cpu(htt_stats_buf->tb_ranging_tf_sound_resp_sent_cnt)); 5436 len += scnprintf(buf + len, buf_len - len, 5437 "tb_ranging_tf_report_resp_sent_cnt = %u\n\n", 5438 le32_to_cpu(htt_stats_buf->tb_ranging_tf_report_resp_sent_cnt)); 5439 5440 stats_req->buf_len = len; 5441 } 5442 5443 static void 5444 ath12k_htt_print_pdev_rtt_tbr_selfgen_queued_stats_tlv(const void *tag_buf, u16 tag_len, 5445 struct debug_htt_stats_req *req) 5446 { 5447 const struct ath12k_htt_stats_pdev_rtt_tbr_tlv *sbuf = tag_buf; 5448 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5449 u32 len = req->buf_len; 5450 u8 *buf = req->buf; 5451 5452 if (tag_len < sizeof(*sbuf)) 5453 return; 5454 5455 len += scnprintf(buf + len, buf_len - len, 5456 "HTT_STATS_PDEV_RTT_TBR_SELFGEN_QUEUED_STATS_TAG:\n"); 5457 len += scnprintf(buf + len, buf_len - len, "SU poll = %u\n", 5458 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_POLL])); 5459 len += scnprintf(buf + len, buf_len - len, "SU sound = %u\n", 5460 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_SOUND])); 5461 len += scnprintf(buf + len, buf_len - len, "SU NDPA = %u\n", 5462 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_NDPA])); 5463 len += scnprintf(buf + len, buf_len - len, "SU NDP = %u\n", 5464 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_NDP])); 5465 len += scnprintf(buf + len, buf_len - len, "SU LMR = %u\n", 5466 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_LMR])); 5467 len += scnprintf(buf + len, buf_len - len, "SU TF_REPORT = %u\n", 5468 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_RPRT])); 5469 len += scnprintf(buf + len, buf_len - len, "MU poll = %u\n", 5470 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_POLL])); 5471 len += scnprintf(buf + len, buf_len - len, "MU sound = %u\n", 5472 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_SOUND])); 5473 len += scnprintf(buf + len, buf_len - len, "MU NDPA = %u\n", 5474 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_NDPA])); 5475 len += scnprintf(buf + len, buf_len - len, "MU NDP = %u\n", 5476 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_NDP])); 5477 len += scnprintf(buf + len, buf_len - len, "MU LMR = %u\n", 5478 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_LMR])); 5479 len += scnprintf(buf + len, buf_len - len, "MU TF_REPORT = %u\n\n", 5480 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_RPRT])); 5481 5482 req->buf_len = len; 5483 } 5484 5485 static void 5486 ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(const void *tag_buf, u16 tag_len, 5487 struct debug_htt_stats_req *stats_req) 5488 { 5489 const struct ath12k_htt_stats_pdev_rtt_tbr_cmd_result_stats_tlv *sbuf = tag_buf; 5490 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5491 u32 len = stats_req->buf_len; 5492 u8 *buf = stats_req->buf, i; 5493 5494 if (tag_len < sizeof(*sbuf)) 5495 return; 5496 5497 len += scnprintf(buf + len, buf_len - len, 5498 "HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG:\n"); 5499 for (i = 0; i < le32_to_cpu(sbuf->tbr_num_sch_cmd_result_buckets); i++) { 5500 len += scnprintf(buf + len, buf_len - len, "num_sch_cmd_status_%u:\n", i); 5501 len += scnprintf(buf + len, buf_len - len, 5502 "SU frame_SGEN_TF_POLL = %u\n", 5503 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_POLL][i])); 5504 len += scnprintf(buf + len, buf_len - len, 5505 "SU frame_SGEN_TF_SOUND = %u\n", 5506 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_SOUND][i])); 5507 len += scnprintf(buf + len, buf_len - len, 5508 "SU frame_SGEN_TBR_NDPA = %u\n", 5509 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_NDPA][i])); 5510 len += scnprintf(buf + len, buf_len - len, 5511 "SU frame_SGEN_TBR_NDP = %u\n", 5512 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_NDP][i])); 5513 len += scnprintf(buf + len, buf_len - len, 5514 "SU frame_SGEN_TBR_LMR = %u\n", 5515 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_LMR][i])); 5516 len += scnprintf(buf + len, buf_len - len, 5517 "SU frame_SGEN_TF_REPORT = %u\n", 5518 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_RPRT][i])); 5519 len += scnprintf(buf + len, buf_len - len, 5520 "MU frame_SGEN_TF_POLL = %u\n", 5521 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_POLL][i])); 5522 len += scnprintf(buf + len, buf_len - len, 5523 "MU frame_SGEN_TF_SOUND = %u\n", 5524 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_SOUND][i])); 5525 len += scnprintf(buf + len, buf_len - len, 5526 "MU frame_SGEN_TBR_NDPA = %u\n", 5527 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_NDPA][i])); 5528 len += scnprintf(buf + len, buf_len - len, 5529 "MU frame_SGEN_TBR_NDP = %u\n", 5530 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_NDP][i])); 5531 len += scnprintf(buf + len, buf_len - len, 5532 "MU frame_SGEN_TBR_LMR = %u\n", 5533 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_LMR][i])); 5534 len += scnprintf(buf + len, buf_len - len, 5535 "MU frame_SGEN_TF_REPORT = %u\n\n", 5536 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_RPRT][i])); 5537 } 5538 5539 stats_req->buf_len = len; 5540 } 5541 5542 static void 5543 ath12k_htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf, u16 tag_len, 5544 struct debug_htt_stats_req *stats_req) 5545 { 5546 const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf; 5547 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5548 u32 len = stats_req->buf_len; 5549 u8 *buf = stats_req->buf; 5550 5551 if (tag_len < sizeof(*htt_stats_buf)) 5552 return; 5553 5554 len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n"); 5555 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 5556 le32_to_cpu(htt_stats_buf->mac_id__word) & 0xFF); 5557 len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n", 5558 le32_to_cpu(htt_stats_buf->ppdu_recvd)); 5559 len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n", 5560 le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_ok)); 5561 len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n", 5562 le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_err)); 5563 len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n", 5564 le32_to_cpu(htt_stats_buf->tcp_msdu_cnt)); 5565 len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n", 5566 le32_to_cpu(htt_stats_buf->tcp_ack_msdu_cnt)); 5567 len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n", 5568 le32_to_cpu(htt_stats_buf->udp_msdu_cnt)); 5569 len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n", 5570 le32_to_cpu(htt_stats_buf->other_msdu_cnt)); 5571 len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n", 5572 le32_to_cpu(htt_stats_buf->fw_ring_mpdu_ind)); 5573 len += print_array_to_buf(buf, len, "fw_ring_mgmt_subtype", 5574 htt_stats_buf->fw_ring_mgmt_subtype, 5575 ATH12K_HTT_STATS_SUBTYPE_MAX, "\n"); 5576 len += print_array_to_buf(buf, len, "fw_ring_ctrl_subtype", 5577 htt_stats_buf->fw_ring_ctrl_subtype, 5578 ATH12K_HTT_STATS_SUBTYPE_MAX, "\n"); 5579 len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n", 5580 le32_to_cpu(htt_stats_buf->fw_ring_mcast_data_msdu)); 5581 len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n", 5582 le32_to_cpu(htt_stats_buf->fw_ring_bcast_data_msdu)); 5583 len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n", 5584 le32_to_cpu(htt_stats_buf->fw_ring_ucast_data_msdu)); 5585 len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n", 5586 le32_to_cpu(htt_stats_buf->fw_ring_null_data_msdu)); 5587 len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n", 5588 le32_to_cpu(htt_stats_buf->fw_ring_mpdu_drop)); 5589 len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n", 5590 le32_to_cpu(htt_stats_buf->ofld_local_data_ind_cnt)); 5591 len += scnprintf(buf + len, buf_len - len, 5592 "ofld_local_data_buf_recycle_cnt = %u\n", 5593 le32_to_cpu(htt_stats_buf->ofld_local_data_buf_recycle_cnt)); 5594 len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n", 5595 le32_to_cpu(htt_stats_buf->drx_local_data_ind_cnt)); 5596 len += scnprintf(buf + len, buf_len - len, 5597 "drx_local_data_buf_recycle_cnt = %u\n", 5598 le32_to_cpu(htt_stats_buf->drx_local_data_buf_recycle_cnt)); 5599 len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n", 5600 le32_to_cpu(htt_stats_buf->local_nondata_ind_cnt)); 5601 len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n", 5602 le32_to_cpu(htt_stats_buf->local_nondata_buf_recycle_cnt)); 5603 len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n", 5604 le32_to_cpu(htt_stats_buf->fw_status_buf_ring_refill_cnt)); 5605 len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n", 5606 le32_to_cpu(htt_stats_buf->fw_status_buf_ring_empty_cnt)); 5607 len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n", 5608 le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_refill_cnt)); 5609 len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n", 5610 le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_empty_cnt)); 5611 len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n", 5612 le32_to_cpu(htt_stats_buf->fw_link_buf_ring_refill_cnt)); 5613 len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n", 5614 le32_to_cpu(htt_stats_buf->fw_link_buf_ring_empty_cnt)); 5615 len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n", 5616 le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_refill_cnt)); 5617 len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n", 5618 le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_empty_cnt)); 5619 len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n", 5620 le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_refill_cnt)); 5621 len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n", 5622 le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_empty_cnt)); 5623 len += scnprintf(buf + len, buf_len - len, 5624 "mon_status_buf_ring_refill_cnt = %u\n", 5625 le32_to_cpu(htt_stats_buf->mon_status_buf_ring_refill_cnt)); 5626 len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n", 5627 le32_to_cpu(htt_stats_buf->mon_status_buf_ring_empty_cnt)); 5628 len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n", 5629 le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_refill_cnt)); 5630 len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n", 5631 le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_empty_cnt)); 5632 len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n", 5633 le32_to_cpu(htt_stats_buf->mon_dest_ring_update_cnt)); 5634 len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n", 5635 le32_to_cpu(htt_stats_buf->mon_dest_ring_full_cnt)); 5636 len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n", 5637 le32_to_cpu(htt_stats_buf->rx_suspend_cnt)); 5638 len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n", 5639 le32_to_cpu(htt_stats_buf->rx_suspend_fail_cnt)); 5640 len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n", 5641 le32_to_cpu(htt_stats_buf->rx_resume_cnt)); 5642 len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n", 5643 le32_to_cpu(htt_stats_buf->rx_resume_fail_cnt)); 5644 len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n", 5645 le32_to_cpu(htt_stats_buf->rx_ring_switch_cnt)); 5646 len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n", 5647 le32_to_cpu(htt_stats_buf->rx_ring_restore_cnt)); 5648 len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n", 5649 le32_to_cpu(htt_stats_buf->rx_flush_cnt)); 5650 len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n", 5651 le32_to_cpu(htt_stats_buf->rx_recovery_reset_cnt)); 5652 len += scnprintf(buf + len, buf_len - len, "rx_lwm_prom_filter_dis = %u\n", 5653 le32_to_cpu(htt_stats_buf->rx_lwm_prom_filter_dis)); 5654 len += scnprintf(buf + len, buf_len - len, "rx_hwm_prom_filter_en = %u\n", 5655 le32_to_cpu(htt_stats_buf->rx_hwm_prom_filter_en)); 5656 len += scnprintf(buf + len, buf_len - len, "bytes_received_low_32 = %u\n", 5657 le32_to_cpu(htt_stats_buf->bytes_received_low_32)); 5658 len += scnprintf(buf + len, buf_len - len, "bytes_received_high_32 = %u\n", 5659 le32_to_cpu(htt_stats_buf->bytes_received_high_32)); 5660 5661 stats_req->buf_len = len; 5662 } 5663 5664 static void 5665 ath12k_htt_print_tx_hwq_stats_cmn_tlv(const void *tag_buf, u16 tag_len, 5666 struct debug_htt_stats_req *stats_req) 5667 { 5668 const struct htt_tx_hwq_stats_cmn_tlv *htt_stats_buf = tag_buf; 5669 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; 5670 u32 len = stats_req->buf_len; 5671 u8 *buf = stats_req->buf; 5672 5673 if (tag_len < sizeof(*htt_stats_buf)) 5674 return; 5675 5676 len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_STATS_CMN_TLV:\n"); 5677 len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n", 5678 le32_to_cpu(htt_stats_buf->mac_id__hwq_id__word) & 0xFF); 5679 len += scnprintf(buf + len, buf_len - len, "hwq_id = %u\n", 5680 (le32_to_cpu(htt_stats_buf->mac_id__hwq_id__word) & 0xFF00) >> 8); 5681 len += scnprintf(buf + len, buf_len - len, "xretry = %u\n", 5682 le32_to_cpu(htt_stats_buf->xretry)); 5683 len += scnprintf(buf + len, buf_len - len, "underrun_cnt = %u\n", 5684 le32_to_cpu(htt_stats_buf->underrun_cnt)); 5685 len += scnprintf(buf + len, buf_len - len, "flush_cnt = %u\n", 5686 le32_to_cpu(htt_stats_buf->flush_cnt)); 5687 len += scnprintf(buf + len, buf_len - len, "filt_cnt = %u\n", 5688 le32_to_cpu(htt_stats_buf->filt_cnt)); 5689 len += scnprintf(buf + len, buf_len - len, "null_mpdu_bmap = %u\n", 5690 le32_to_cpu(htt_stats_buf->null_mpdu_bmap)); 5691 len += scnprintf(buf + len, buf_len - len, "user_ack_failure = %u\n", 5692 le32_to_cpu(htt_stats_buf->user_ack_failure)); 5693 len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n", 5694 le32_to_cpu(htt_stats_buf->ack_tlv_proc)); 5695 len += scnprintf(buf + len, buf_len - len, "sched_id_proc = %u\n", 5696 le32_to_cpu(htt_stats_buf->sched_id_proc)); 5697 len += scnprintf(buf + len, buf_len - len, "null_mpdu_tx_count = %u\n", 5698 le32_to_cpu(htt_stats_buf->null_mpdu_tx_count)); 5699 len += scnprintf(buf + len, buf_len - len, "mpdu_bmap_not_recvd = %u\n", 5700 le32_to_cpu(htt_stats_buf->mpdu_bmap_not_recvd)); 5701 len += scnprintf(buf + len, buf_len - len, "num_bar = %u\n", 5702 le32_to_cpu(htt_stats_buf->num_bar)); 5703 len += scnprintf(buf + len, buf_len - len, "rts = %u\n", 5704 le32_to_cpu(htt_stats_buf->rts)); 5705 len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n", 5706 le32_to_cpu(htt_stats_buf->cts2self)); 5707 len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n", 5708 le32_to_cpu(htt_stats_buf->qos_null)); 5709 len += scnprintf(buf + len, buf_len - len, "mpdu_tried_cnt = %u\n", 5710 le32_to_cpu(htt_stats_buf->mpdu_tried_cnt)); 5711 len += scnprintf(buf + len, buf_len - len, "mpdu_queued_cnt = %u\n", 5712 le32_to_cpu(htt_stats_buf->mpdu_queued_cnt)); 5713 len += scnprintf(buf + len, buf_len - len, "mpdu_ack_fail_cnt = %u\n", 5714 le32_to_cpu(htt_stats_buf->mpdu_ack_fail_cnt)); 5715 len += scnprintf(buf + len, buf_len - len, "mpdu_filt_cnt = %u\n", 5716 le32_to_cpu(htt_stats_buf->mpdu_filt_cnt)); 5717 len += scnprintf(buf + len, buf_len - len, "false_mpdu_ack_count = %u\n", 5718 le32_to_cpu(htt_stats_buf->false_mpdu_ack_count)); 5719 len += scnprintf(buf + len, buf_len - len, "txq_timeout = %u\n", 5720 le32_to_cpu(htt_stats_buf->txq_timeout)); 5721 5722 stats_req->buf_len = len; 5723 } 5724 5725 static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab, 5726 u16 tag, u16 len, const void *tag_buf, 5727 void *user_data) 5728 { 5729 struct debug_htt_stats_req *stats_req = user_data; 5730 5731 switch (tag) { 5732 case HTT_STATS_TX_PDEV_CMN_TAG: 5733 htt_print_tx_pdev_stats_cmn_tlv(tag_buf, len, stats_req); 5734 break; 5735 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 5736 htt_print_tx_pdev_stats_urrn_tlv(tag_buf, len, stats_req); 5737 break; 5738 case HTT_STATS_TX_PDEV_SIFS_TAG: 5739 htt_print_tx_pdev_stats_sifs_tlv(tag_buf, len, stats_req); 5740 break; 5741 case HTT_STATS_TX_PDEV_FLUSH_TAG: 5742 htt_print_tx_pdev_stats_flush_tlv(tag_buf, len, stats_req); 5743 break; 5744 case HTT_STATS_TX_PDEV_SIFS_HIST_TAG: 5745 htt_print_tx_pdev_stats_sifs_hist_tlv(tag_buf, len, stats_req); 5746 break; 5747 case HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG: 5748 htt_print_pdev_ctrl_path_tx_stats_tlv(tag_buf, len, stats_req); 5749 break; 5750 case HTT_STATS_MU_PPDU_DIST_TAG: 5751 htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(tag_buf, len, stats_req); 5752 break; 5753 case HTT_STATS_TX_SCHED_CMN_TAG: 5754 ath12k_htt_print_stats_tx_sched_cmn_tlv(tag_buf, len, stats_req); 5755 break; 5756 case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG: 5757 ath12k_htt_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf, len, stats_req); 5758 break; 5759 case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG: 5760 ath12k_htt_print_sched_txq_cmd_posted_tlv(tag_buf, len, stats_req); 5761 break; 5762 case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG: 5763 ath12k_htt_print_sched_txq_cmd_reaped_tlv(tag_buf, len, stats_req); 5764 break; 5765 case HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG: 5766 ath12k_htt_print_sched_txq_sched_order_su_tlv(tag_buf, len, stats_req); 5767 break; 5768 case HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG: 5769 ath12k_htt_print_sched_txq_sched_ineligibility_tlv(tag_buf, len, 5770 stats_req); 5771 break; 5772 case HTT_STATS_SCHED_TXQ_SUPERCYCLE_TRIGGER_TAG: 5773 ath12k_htt_print_sched_txq_supercycle_trigger_tlv(tag_buf, len, 5774 stats_req); 5775 break; 5776 case HTT_STATS_HW_PDEV_ERRS_TAG: 5777 ath12k_htt_print_hw_stats_pdev_errs_tlv(tag_buf, len, stats_req); 5778 break; 5779 case HTT_STATS_HW_INTR_MISC_TAG: 5780 ath12k_htt_print_hw_stats_intr_misc_tlv(tag_buf, len, stats_req); 5781 break; 5782 case HTT_STATS_WHAL_TX_TAG: 5783 ath12k_htt_print_hw_stats_whal_tx_tlv(tag_buf, len, stats_req); 5784 break; 5785 case HTT_STATS_HW_WAR_TAG: 5786 ath12k_htt_print_hw_war_tlv(tag_buf, len, stats_req); 5787 break; 5788 case HTT_STATS_TX_TQM_CMN_TAG: 5789 ath12k_htt_print_tx_tqm_cmn_stats_tlv(tag_buf, len, stats_req); 5790 break; 5791 case HTT_STATS_TX_TQM_ERROR_STATS_TAG: 5792 ath12k_htt_print_tx_tqm_error_stats_tlv(tag_buf, len, stats_req); 5793 break; 5794 case HTT_STATS_TX_TQM_GEN_MPDU_TAG: 5795 ath12k_htt_print_tx_tqm_gen_mpdu_stats_tlv(tag_buf, len, stats_req); 5796 break; 5797 case HTT_STATS_TX_TQM_LIST_MPDU_TAG: 5798 ath12k_htt_print_tx_tqm_list_mpdu_stats_tlv(tag_buf, len, stats_req); 5799 break; 5800 case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG: 5801 ath12k_htt_print_tx_tqm_list_mpdu_cnt_tlv(tag_buf, len, stats_req); 5802 break; 5803 case HTT_STATS_TX_TQM_PDEV_TAG: 5804 ath12k_htt_print_tx_tqm_pdev_stats_tlv(tag_buf, len, stats_req); 5805 break; 5806 case HTT_STATS_TX_DE_CMN_TAG: 5807 ath12k_htt_print_tx_de_cmn_stats_tlv(tag_buf, len, stats_req); 5808 break; 5809 case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG: 5810 ath12k_htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, len, stats_req); 5811 break; 5812 case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG: 5813 ath12k_htt_print_tx_de_classify_stats_tlv(tag_buf, len, stats_req); 5814 break; 5815 case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG: 5816 ath12k_htt_print_tx_de_classify_failed_stats_tlv(tag_buf, len, stats_req); 5817 break; 5818 case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG: 5819 ath12k_htt_print_tx_de_classify_status_stats_tlv(tag_buf, len, stats_req); 5820 break; 5821 case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG: 5822 ath12k_htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, len, stats_req); 5823 break; 5824 case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG: 5825 ath12k_htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, len, stats_req); 5826 break; 5827 case HTT_STATS_TX_DE_COMPL_STATS_TAG: 5828 ath12k_htt_print_tx_de_compl_stats_tlv(tag_buf, len, stats_req); 5829 break; 5830 case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG: 5831 ath12k_htt_print_tx_selfgen_cmn_stats_tlv(tag_buf, len, stats_req); 5832 break; 5833 case HTT_STATS_TX_SELFGEN_AC_STATS_TAG: 5834 ath12k_htt_print_tx_selfgen_ac_stats_tlv(tag_buf, len, stats_req); 5835 break; 5836 case HTT_STATS_TX_SELFGEN_AX_STATS_TAG: 5837 ath12k_htt_print_tx_selfgen_ax_stats_tlv(tag_buf, len, stats_req); 5838 break; 5839 case HTT_STATS_TX_SELFGEN_BE_STATS_TAG: 5840 ath12k_htt_print_tx_selfgen_be_stats_tlv(tag_buf, len, stats_req); 5841 break; 5842 case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG: 5843 ath12k_htt_print_tx_selfgen_ac_err_stats_tlv(tag_buf, len, stats_req); 5844 break; 5845 case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG: 5846 ath12k_htt_print_tx_selfgen_ax_err_stats_tlv(tag_buf, len, stats_req); 5847 break; 5848 case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG: 5849 ath12k_htt_print_tx_selfgen_be_err_stats_tlv(tag_buf, len, stats_req); 5850 break; 5851 case HTT_STATS_TX_SELFGEN_AC_SCHED_STATUS_STATS_TAG: 5852 ath12k_htt_print_tx_selfgen_ac_sched_status_stats_tlv(tag_buf, len, 5853 stats_req); 5854 break; 5855 case HTT_STATS_TX_SELFGEN_AX_SCHED_STATUS_STATS_TAG: 5856 ath12k_htt_print_tx_selfgen_ax_sched_status_stats_tlv(tag_buf, len, 5857 stats_req); 5858 break; 5859 case HTT_STATS_TX_SELFGEN_BE_SCHED_STATUS_STATS_TAG: 5860 ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(tag_buf, len, 5861 stats_req); 5862 break; 5863 case HTT_STATS_STRING_TAG: 5864 ath12k_htt_print_stats_string_tlv(tag_buf, len, stats_req); 5865 break; 5866 case HTT_STATS_SRING_STATS_TAG: 5867 ath12k_htt_print_sring_stats_tlv(tag_buf, len, stats_req); 5868 break; 5869 case HTT_STATS_SFM_CMN_TAG: 5870 ath12k_htt_print_sfm_cmn_tlv(tag_buf, len, stats_req); 5871 break; 5872 case HTT_STATS_SFM_CLIENT_TAG: 5873 ath12k_htt_print_sfm_client_tlv(tag_buf, len, stats_req); 5874 break; 5875 case HTT_STATS_SFM_CLIENT_USER_TAG: 5876 ath12k_htt_print_sfm_client_user_tlv(tag_buf, len, stats_req); 5877 break; 5878 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 5879 ath12k_htt_print_rx_pdev_fw_stats_tlv(tag_buf, len, stats_req); 5880 break; 5881 case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG: 5882 ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, len, stats_req); 5883 break; 5884 case HTT_STATS_TX_PDEV_MUMIMO_GRP_STATS_TAG: 5885 ath12k_htt_print_tx_pdev_mumimo_grp_stats_tlv(tag_buf, len, stats_req); 5886 break; 5887 case HTT_STATS_TX_PDEV_MPDU_STATS_TAG: 5888 ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, len, stats_req); 5889 break; 5890 case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG: 5891 case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG: 5892 case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG: 5893 ath12k_htt_print_pdev_cca_stats_hist_tlv(tag_buf, len, stats_req); 5894 break; 5895 case HTT_STATS_PDEV_CCA_COUNTERS_TAG: 5896 ath12k_htt_print_pdev_stats_cca_counters_tlv(tag_buf, len, stats_req); 5897 break; 5898 case HTT_STATS_TX_SOUNDING_STATS_TAG: 5899 ath12k_htt_print_tx_sounding_stats_tlv(tag_buf, len, stats_req); 5900 break; 5901 case HTT_STATS_PDEV_OBSS_PD_TAG: 5902 ath12k_htt_print_pdev_obss_pd_stats_tlv(tag_buf, len, stats_req); 5903 break; 5904 case HTT_STATS_LATENCY_CTX_TAG: 5905 ath12k_htt_print_latency_prof_ctx_tlv(tag_buf, len, stats_req); 5906 break; 5907 case HTT_STATS_LATENCY_CNT_TAG: 5908 ath12k_htt_print_latency_prof_cnt(tag_buf, len, stats_req); 5909 break; 5910 case HTT_STATS_LATENCY_PROF_STATS_TAG: 5911 ath12k_htt_print_latency_prof_stats_tlv(tag_buf, len, stats_req); 5912 break; 5913 case HTT_STATS_RX_PDEV_UL_TRIG_STATS_TAG: 5914 ath12k_htt_print_ul_ofdma_trigger_stats(tag_buf, len, stats_req); 5915 break; 5916 case HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG: 5917 ath12k_htt_print_ul_ofdma_user_stats(tag_buf, len, stats_req); 5918 break; 5919 case HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG: 5920 ath12k_htt_print_ul_mumimo_trig_stats(tag_buf, len, stats_req); 5921 break; 5922 case HTT_STATS_RX_FSE_STATS_TAG: 5923 ath12k_htt_print_rx_fse_stats_tlv(tag_buf, len, stats_req); 5924 break; 5925 case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG: 5926 ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, len, stats_req); 5927 break; 5928 case HTT_STATS_TXBF_OFDMA_AX_NDPA_STATS_TAG: 5929 ath12k_htt_print_txbf_ofdma_ax_ndpa_stats_tlv(tag_buf, len, stats_req); 5930 break; 5931 case HTT_STATS_TXBF_OFDMA_AX_NDP_STATS_TAG: 5932 ath12k_htt_print_txbf_ofdma_ax_ndp_stats_tlv(tag_buf, len, stats_req); 5933 break; 5934 case HTT_STATS_TXBF_OFDMA_AX_BRP_STATS_TAG: 5935 ath12k_htt_print_txbf_ofdma_ax_brp_stats_tlv(tag_buf, len, stats_req); 5936 break; 5937 case HTT_STATS_TXBF_OFDMA_AX_STEER_STATS_TAG: 5938 ath12k_htt_print_txbf_ofdma_ax_steer_stats_tlv(tag_buf, len, stats_req); 5939 break; 5940 case HTT_STATS_TXBF_OFDMA_AX_STEER_MPDU_STATS_TAG: 5941 ath12k_htt_print_txbf_ofdma_ax_steer_mpdu_stats_tlv(tag_buf, len, 5942 stats_req); 5943 break; 5944 case HTT_STATS_DLPAGER_STATS_TAG: 5945 ath12k_htt_print_dlpager_stats_tlv(tag_buf, len, stats_req); 5946 break; 5947 case HTT_STATS_PHY_STATS_TAG: 5948 ath12k_htt_print_phy_stats_tlv(tag_buf, len, stats_req); 5949 break; 5950 case HTT_STATS_PHY_COUNTERS_TAG: 5951 ath12k_htt_print_phy_counters_tlv(tag_buf, len, stats_req); 5952 break; 5953 case HTT_STATS_PHY_RESET_STATS_TAG: 5954 ath12k_htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req); 5955 break; 5956 case HTT_STATS_PHY_RESET_COUNTERS_TAG: 5957 ath12k_htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req); 5958 break; 5959 case HTT_STATS_PHY_TPC_STATS_TAG: 5960 ath12k_htt_print_phy_tpc_stats_tlv(tag_buf, len, stats_req); 5961 break; 5962 case HTT_STATS_SOC_TXRX_STATS_COMMON_TAG: 5963 ath12k_htt_print_soc_txrx_stats_common_tlv(tag_buf, len, stats_req); 5964 break; 5965 case HTT_STATS_PER_RATE_STATS_TAG: 5966 ath12k_htt_print_tx_per_rate_stats_tlv(tag_buf, len, stats_req); 5967 break; 5968 case HTT_STATS_AST_ENTRY_TAG: 5969 ath12k_htt_print_ast_entry_tlv(tag_buf, len, stats_req); 5970 break; 5971 case HTT_STATS_PDEV_PUNCTURE_STATS_TAG: 5972 ath12k_htt_print_puncture_stats_tlv(tag_buf, len, stats_req); 5973 break; 5974 case HTT_STATS_DMAC_RESET_STATS_TAG: 5975 ath12k_htt_print_dmac_reset_stats_tlv(tag_buf, len, stats_req); 5976 break; 5977 case HTT_STATS_PDEV_SCHED_ALGO_OFDMA_STATS_TAG: 5978 ath12k_htt_print_pdev_sched_algo_ofdma_stats_tlv(tag_buf, len, stats_req); 5979 break; 5980 case HTT_STATS_TX_PDEV_RATE_STATS_BE_OFDMA_TAG: 5981 ath12k_htt_print_tx_pdev_rate_stats_be_ofdma_tlv(tag_buf, len, stats_req); 5982 break; 5983 case HTT_STATS_PDEV_MBSSID_CTRL_FRAME_STATS_TAG: 5984 ath12k_htt_print_pdev_mbssid_ctrl_frame_stats_tlv(tag_buf, len, 5985 stats_req); 5986 break; 5987 case HTT_STATS_TX_PDEV_RATE_STATS_TAG: 5988 ath12k_htt_print_tx_pdev_rate_stats_tlv(tag_buf, len, stats_req); 5989 break; 5990 case HTT_STATS_TX_PDEV_HISTOGRAM_STATS_TAG: 5991 ath12k_htt_print_histogram_stats_tlv(tag_buf, len, stats_req); 5992 break; 5993 case HTT_STATS_RX_PDEV_RATE_STATS_TAG: 5994 ath12k_htt_print_rx_pdev_rate_stats_tlv(tag_buf, len, stats_req); 5995 break; 5996 case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG: 5997 ath12k_htt_print_rx_pdev_rate_ext_stats_tlv(tag_buf, len, stats_req); 5998 break; 5999 case HTT_STATS_PDEV_TDMA_TAG: 6000 ath12k_htt_print_pdev_tdma_stats_tlv(tag_buf, len, stats_req); 6001 break; 6002 case HTT_STATS_MLO_SCHED_STATS_TAG: 6003 ath12k_htt_print_mlo_sched_stats_tlv(tag_buf, len, stats_req); 6004 break; 6005 case HTT_STATS_PDEV_MLO_IPC_STATS_TAG: 6006 ath12k_htt_print_mlo_ipc_stats_tlv(tag_buf, len, stats_req); 6007 break; 6008 case HTT_STATS_PDEV_RTT_RESP_STATS_TAG: 6009 ath12k_htt_print_pdev_rtt_resp_stats_tlv(tag_buf, len, stats_req); 6010 break; 6011 case HTT_STATS_PDEV_RTT_INIT_STATS_TAG: 6012 ath12k_htt_print_pdev_rtt_init_stats_tlv(tag_buf, len, stats_req); 6013 break; 6014 case HTT_STATS_PDEV_RTT_HW_STATS_TAG: 6015 ath12k_htt_print_pdev_rtt_hw_stats_tlv(tag_buf, len, stats_req); 6016 break; 6017 case HTT_STATS_PDEV_RTT_TBR_SELFGEN_QUEUED_STATS_TAG: 6018 ath12k_htt_print_pdev_rtt_tbr_selfgen_queued_stats_tlv(tag_buf, len, 6019 stats_req); 6020 break; 6021 case HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG: 6022 ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(tag_buf, len, stats_req); 6023 break; 6024 case HTT_STATS_TX_HWQ_CMN_TAG: 6025 ath12k_htt_print_tx_hwq_stats_cmn_tlv(tag_buf, len, stats_req); 6026 break; 6027 default: 6028 break; 6029 } 6030 6031 return 0; 6032 } 6033 6034 void ath12k_debugfs_htt_ext_stats_handler(struct ath12k_base *ab, 6035 struct sk_buff *skb) 6036 { 6037 struct ath12k_htt_extd_stats_msg *msg; 6038 struct debug_htt_stats_req *stats_req; 6039 struct ath12k *ar; 6040 u32 len, pdev_id, stats_info; 6041 u64 cookie; 6042 int ret; 6043 bool send_completion = false; 6044 6045 msg = (struct ath12k_htt_extd_stats_msg *)skb->data; 6046 cookie = le64_to_cpu(msg->cookie); 6047 6048 if (u64_get_bits(cookie, ATH12K_HTT_STATS_COOKIE_MSB) != 6049 ATH12K_HTT_STATS_MAGIC_VALUE) { 6050 ath12k_warn(ab, "received invalid htt ext stats event\n"); 6051 return; 6052 } 6053 6054 pdev_id = u64_get_bits(cookie, ATH12K_HTT_STATS_COOKIE_LSB); 6055 rcu_read_lock(); 6056 ar = ath12k_mac_get_ar_by_pdev_id(ab, pdev_id); 6057 if (!ar) { 6058 ath12k_warn(ab, "failed to get ar for pdev_id %d\n", pdev_id); 6059 goto exit; 6060 } 6061 6062 stats_req = ar->debug.htt_stats.stats_req; 6063 if (!stats_req) 6064 goto exit; 6065 6066 spin_lock_bh(&ar->data_lock); 6067 6068 stats_info = le32_to_cpu(msg->info1); 6069 stats_req->done = u32_get_bits(stats_info, ATH12K_HTT_T2H_EXT_STATS_INFO1_DONE); 6070 if (stats_req->done) 6071 send_completion = true; 6072 6073 spin_unlock_bh(&ar->data_lock); 6074 6075 len = u32_get_bits(stats_info, ATH12K_HTT_T2H_EXT_STATS_INFO1_LENGTH); 6076 if (len > skb->len) { 6077 ath12k_warn(ab, "invalid length %d for HTT stats", len); 6078 goto exit; 6079 } 6080 6081 ret = ath12k_dp_htt_tlv_iter(ab, msg->data, len, 6082 ath12k_dbg_htt_ext_stats_parse, 6083 stats_req); 6084 if (ret) 6085 ath12k_warn(ab, "Failed to parse tlv %d\n", ret); 6086 6087 if (send_completion) 6088 complete(&stats_req->htt_stats_rcvd); 6089 exit: 6090 rcu_read_unlock(); 6091 } 6092 6093 static ssize_t ath12k_read_htt_stats_type(struct file *file, 6094 char __user *user_buf, 6095 size_t count, loff_t *ppos) 6096 { 6097 struct ath12k *ar = file->private_data; 6098 enum ath12k_dbg_htt_ext_stats_type type; 6099 char buf[32]; 6100 size_t len; 6101 6102 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 6103 type = ar->debug.htt_stats.type; 6104 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6105 6106 len = scnprintf(buf, sizeof(buf), "%u\n", type); 6107 6108 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 6109 } 6110 6111 static ssize_t ath12k_write_htt_stats_type(struct file *file, 6112 const char __user *user_buf, 6113 size_t count, loff_t *ppos) 6114 { 6115 struct ath12k *ar = file->private_data; 6116 enum ath12k_dbg_htt_ext_stats_type type; 6117 unsigned int cfg_param[4] = {}; 6118 const int size = 32; 6119 int num_args; 6120 6121 if (count > size) 6122 return -EINVAL; 6123 6124 char *buf __free(kfree) = kzalloc(size, GFP_KERNEL); 6125 if (!buf) 6126 return -ENOMEM; 6127 6128 if (copy_from_user(buf, user_buf, count)) 6129 return -EFAULT; 6130 6131 num_args = sscanf(buf, "%u %u %u %u %u\n", &type, &cfg_param[0], 6132 &cfg_param[1], &cfg_param[2], &cfg_param[3]); 6133 if (!num_args || num_args > 5) 6134 return -EINVAL; 6135 6136 if (type == ATH12K_DBG_HTT_EXT_STATS_RESET || 6137 type >= ATH12K_DBG_HTT_NUM_EXT_STATS) 6138 return -EINVAL; 6139 6140 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 6141 6142 ar->debug.htt_stats.type = type; 6143 ar->debug.htt_stats.cfg_param[0] = cfg_param[0]; 6144 ar->debug.htt_stats.cfg_param[1] = cfg_param[1]; 6145 ar->debug.htt_stats.cfg_param[2] = cfg_param[2]; 6146 ar->debug.htt_stats.cfg_param[3] = cfg_param[3]; 6147 6148 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6149 6150 return count; 6151 } 6152 6153 static const struct file_operations fops_htt_stats_type = { 6154 .read = ath12k_read_htt_stats_type, 6155 .write = ath12k_write_htt_stats_type, 6156 .open = simple_open, 6157 .owner = THIS_MODULE, 6158 .llseek = default_llseek, 6159 }; 6160 6161 static int ath12k_debugfs_htt_stats_req(struct ath12k *ar) 6162 { 6163 struct debug_htt_stats_req *stats_req = ar->debug.htt_stats.stats_req; 6164 enum ath12k_dbg_htt_ext_stats_type type = stats_req->type; 6165 u64 cookie; 6166 int ret, pdev_id; 6167 struct htt_ext_stats_cfg_params cfg_params = {}; 6168 6169 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6170 6171 init_completion(&stats_req->htt_stats_rcvd); 6172 6173 pdev_id = ath12k_mac_get_target_pdev_id(ar); 6174 stats_req->done = false; 6175 stats_req->pdev_id = pdev_id; 6176 6177 cookie = u64_encode_bits(ATH12K_HTT_STATS_MAGIC_VALUE, 6178 ATH12K_HTT_STATS_COOKIE_MSB); 6179 cookie |= u64_encode_bits(pdev_id, ATH12K_HTT_STATS_COOKIE_LSB); 6180 6181 if (stats_req->override_cfg_param) { 6182 cfg_params.cfg0 = stats_req->cfg_param[0]; 6183 cfg_params.cfg1 = stats_req->cfg_param[1]; 6184 cfg_params.cfg2 = stats_req->cfg_param[2]; 6185 cfg_params.cfg3 = stats_req->cfg_param[3]; 6186 } 6187 6188 ret = ath12k_dp_tx_htt_h2t_ext_stats_req(ar, type, &cfg_params, cookie); 6189 if (ret) { 6190 ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret); 6191 return ret; 6192 } 6193 if (!wait_for_completion_timeout(&stats_req->htt_stats_rcvd, 3 * HZ)) { 6194 spin_lock_bh(&ar->data_lock); 6195 if (!stats_req->done) { 6196 stats_req->done = true; 6197 spin_unlock_bh(&ar->data_lock); 6198 ath12k_warn(ar->ab, "stats request timed out\n"); 6199 return -ETIMEDOUT; 6200 } 6201 spin_unlock_bh(&ar->data_lock); 6202 } 6203 6204 return 0; 6205 } 6206 6207 static int ath12k_open_htt_stats(struct inode *inode, 6208 struct file *file) 6209 { 6210 struct ath12k *ar = inode->i_private; 6211 struct debug_htt_stats_req *stats_req; 6212 enum ath12k_dbg_htt_ext_stats_type type = ar->debug.htt_stats.type; 6213 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 6214 int ret; 6215 6216 if (type == ATH12K_DBG_HTT_EXT_STATS_RESET) 6217 return -EPERM; 6218 6219 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 6220 6221 if (ah->state != ATH12K_HW_STATE_ON) { 6222 ret = -ENETDOWN; 6223 goto err_unlock; 6224 } 6225 6226 if (ar->debug.htt_stats.stats_req) { 6227 ret = -EAGAIN; 6228 goto err_unlock; 6229 } 6230 6231 stats_req = kzalloc(sizeof(*stats_req) + ATH12K_HTT_STATS_BUF_SIZE, GFP_KERNEL); 6232 if (!stats_req) { 6233 ret = -ENOMEM; 6234 goto err_unlock; 6235 } 6236 6237 ar->debug.htt_stats.stats_req = stats_req; 6238 stats_req->type = type; 6239 stats_req->cfg_param[0] = ar->debug.htt_stats.cfg_param[0]; 6240 stats_req->cfg_param[1] = ar->debug.htt_stats.cfg_param[1]; 6241 stats_req->cfg_param[2] = ar->debug.htt_stats.cfg_param[2]; 6242 stats_req->cfg_param[3] = ar->debug.htt_stats.cfg_param[3]; 6243 stats_req->override_cfg_param = !!stats_req->cfg_param[0] || 6244 !!stats_req->cfg_param[1] || 6245 !!stats_req->cfg_param[2] || 6246 !!stats_req->cfg_param[3]; 6247 6248 ret = ath12k_debugfs_htt_stats_req(ar); 6249 if (ret < 0) 6250 goto out; 6251 6252 file->private_data = stats_req; 6253 6254 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6255 6256 return 0; 6257 out: 6258 kfree(stats_req); 6259 ar->debug.htt_stats.stats_req = NULL; 6260 err_unlock: 6261 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6262 6263 return ret; 6264 } 6265 6266 static int ath12k_release_htt_stats(struct inode *inode, 6267 struct file *file) 6268 { 6269 struct ath12k *ar = inode->i_private; 6270 6271 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 6272 kfree(file->private_data); 6273 ar->debug.htt_stats.stats_req = NULL; 6274 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6275 6276 return 0; 6277 } 6278 6279 static ssize_t ath12k_read_htt_stats(struct file *file, 6280 char __user *user_buf, 6281 size_t count, loff_t *ppos) 6282 { 6283 struct debug_htt_stats_req *stats_req = file->private_data; 6284 char *buf; 6285 u32 length; 6286 6287 buf = stats_req->buf; 6288 length = min_t(u32, stats_req->buf_len, ATH12K_HTT_STATS_BUF_SIZE); 6289 return simple_read_from_buffer(user_buf, count, ppos, buf, length); 6290 } 6291 6292 static const struct file_operations fops_dump_htt_stats = { 6293 .open = ath12k_open_htt_stats, 6294 .release = ath12k_release_htt_stats, 6295 .read = ath12k_read_htt_stats, 6296 .owner = THIS_MODULE, 6297 .llseek = default_llseek, 6298 }; 6299 6300 static ssize_t ath12k_write_htt_stats_reset(struct file *file, 6301 const char __user *user_buf, 6302 size_t count, loff_t *ppos) 6303 { 6304 struct ath12k *ar = file->private_data; 6305 enum ath12k_dbg_htt_ext_stats_type type; 6306 struct htt_ext_stats_cfg_params cfg_params = {}; 6307 u8 param_pos; 6308 int ret; 6309 6310 ret = kstrtou32_from_user(user_buf, count, 0, &type); 6311 if (ret) 6312 return ret; 6313 6314 if (type >= ATH12K_DBG_HTT_NUM_EXT_STATS || 6315 type == ATH12K_DBG_HTT_EXT_STATS_RESET) 6316 return -E2BIG; 6317 6318 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 6319 cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET; 6320 param_pos = (type >> 5) + 1; 6321 6322 switch (param_pos) { 6323 case ATH12K_HTT_STATS_RESET_PARAM_CFG_32_BYTES: 6324 cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type); 6325 break; 6326 case ATH12K_HTT_STATS_RESET_PARAM_CFG_64_BYTES: 6327 cfg_params.cfg2 = ATH12K_HTT_STATS_RESET_BITMAP32_BIT(cfg_params.cfg0 + 6328 type); 6329 break; 6330 case ATH12K_HTT_STATS_RESET_PARAM_CFG_128_BYTES: 6331 cfg_params.cfg3 = ATH12K_HTT_STATS_RESET_BITMAP64_BIT(cfg_params.cfg0 + 6332 type); 6333 break; 6334 default: 6335 break; 6336 } 6337 6338 ret = ath12k_dp_tx_htt_h2t_ext_stats_req(ar, 6339 ATH12K_DBG_HTT_EXT_STATS_RESET, 6340 &cfg_params, 6341 0ULL); 6342 if (ret) { 6343 ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret); 6344 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6345 return ret; 6346 } 6347 6348 ar->debug.htt_stats.reset = type; 6349 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 6350 6351 return count; 6352 } 6353 6354 static const struct file_operations fops_htt_stats_reset = { 6355 .write = ath12k_write_htt_stats_reset, 6356 .open = simple_open, 6357 .owner = THIS_MODULE, 6358 .llseek = default_llseek, 6359 }; 6360 6361 void ath12k_debugfs_htt_stats_register(struct ath12k *ar) 6362 { 6363 debugfs_create_file("htt_stats_type", 0600, ar->debug.debugfs_pdev, 6364 ar, &fops_htt_stats_type); 6365 debugfs_create_file("htt_stats", 0400, ar->debug.debugfs_pdev, 6366 ar, &fops_dump_htt_stats); 6367 debugfs_create_file("htt_stats_reset", 0200, ar->debug.debugfs_pdev, 6368 ar, &fops_htt_stats_reset); 6369 } 6370