1 /* 2 * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 #include "qdf_types.h" 19 #include "dp_peer.h" 20 #include "dp_types.h" 21 #include "dp_internal.h" 22 #include "htt_stats.h" 23 #include "htt_ppdu_stats.h" 24 #include "dp_htt.h" 25 26 #define DP_MAX_STRING_LEN 500 27 28 #define DP_HTT_HW_INTR_NAME_LEN HTT_STATS_MAX_HW_INTR_NAME_LEN 29 #define DP_HTT_HW_MODULE_NAME_LEN HTT_STATS_MAX_HW_MODULE_NAME_LEN 30 #define DP_HTT_COUNTER_NAME_LEN HTT_MAX_COUNTER_NAME 31 #define DP_HTT_LOW_WM_HIT_COUNT_LEN HTT_STATS_LOW_WM_BINS 32 #define DP_HTT_HIGH_WM_HIT_COUNT_LEN HTT_STATS_HIGH_WM_BINS 33 #define DP_HTT_TX_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 34 #define DP_HTT_TX_SU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 35 #define DP_HTT_TX_MU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 36 #define DP_HTT_TX_NSS_LEN HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS 37 #define DP_HTT_TX_BW_LEN HTT_TX_PDEV_STATS_NUM_BW_COUNTERS 38 #define DP_HTT_TX_PREAM_LEN HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES 39 #define DP_HTT_TX_PDEV_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS 40 #define DP_HTT_TX_DCM_LEN HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS 41 #define DP_HTT_RX_MCS_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS 42 #define DP_HTT_RX_NSS_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 43 #define DP_HTT_RX_DCM_LEN HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS 44 #define DP_HTT_RX_BW_LEN HTT_RX_PDEV_STATS_NUM_BW_COUNTERS 45 #define DP_HTT_RX_PREAM_LEN HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES 46 #define DP_HTT_RSSI_CHAIN_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 47 #define DP_HTT_RX_GI_LEN HTT_RX_PDEV_STATS_NUM_GI_COUNTERS 48 #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX 49 #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX 50 #define DP_HTT_FW_RING_MPDU_ERR_LEN HTT_RX_STATS_RXDMA_MAX_ERR 51 #define DP_HTT_TID_NAME_LEN MAX_HTT_TID_NAME 52 #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS 53 #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS 54 55 #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS) 56 #define DP_NSS_LENGTH (6 * SS_COUNT) 57 #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW) 58 #define DP_MU_GROUP_SHOW 16 59 #define DP_MAX_MCS_STRING_LEN 30 60 #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX) 61 #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX) 62 #define STATS_PROC_TIMEOUT (HZ / 1000) 63 64 #define MCS_VALID 1 65 #define MCS_INVALID 0 66 67 /* 68 * struct dp_rate_debug 69 * 70 * @mcs_type: print string for a given mcs 71 * @valid: valid mcs rate? 72 */ 73 struct dp_rate_debug { 74 char mcs_type[DP_MAX_MCS_STRING_LEN]; 75 uint8_t valid; 76 }; 77 78 static const struct dp_rate_debug dp_rate_string[DOT11_MAX][MAX_MCS] = { 79 { 80 {"OFDM 48 Mbps", MCS_VALID}, 81 {"OFDM 24 Mbps", MCS_VALID}, 82 {"OFDM 12 Mbps", MCS_VALID}, 83 {"OFDM 6 Mbps ", MCS_VALID}, 84 {"OFDM 54 Mbps", MCS_VALID}, 85 {"OFDM 36 Mbps", MCS_VALID}, 86 {"OFDM 18 Mbps", MCS_VALID}, 87 {"OFDM 9 Mbps ", MCS_VALID}, 88 {"INVALID ", MCS_INVALID}, 89 {"INVALID ", MCS_INVALID}, 90 {"INVALID ", MCS_INVALID}, 91 {"INVALID ", MCS_INVALID}, 92 {"INVALID ", MCS_VALID}, 93 }, 94 { 95 {"CCK 11 Mbps Long ", MCS_VALID}, 96 {"CCK 5.5 Mbps Long ", MCS_VALID}, 97 {"CCK 2 Mbps Long ", MCS_VALID}, 98 {"CCK 1 Mbps Long ", MCS_VALID}, 99 {"CCK 11 Mbps Short ", MCS_VALID}, 100 {"CCK 5.5 Mbps Short", MCS_VALID}, 101 {"CCK 2 Mbps Short ", MCS_VALID}, 102 {"INVALID ", MCS_INVALID}, 103 {"INVALID ", MCS_INVALID}, 104 {"INVALID ", MCS_INVALID}, 105 {"INVALID ", MCS_INVALID}, 106 {"INVALID ", MCS_INVALID}, 107 {"INVALID ", MCS_VALID}, 108 }, 109 { 110 {"HT MCS 0 (BPSK 1/2) ", MCS_VALID}, 111 {"HT MCS 1 (QPSK 1/2) ", MCS_VALID}, 112 {"HT MCS 2 (QPSK 3/4) ", MCS_VALID}, 113 {"HT MCS 3 (16-QAM 1/2)", MCS_VALID}, 114 {"HT MCS 4 (16-QAM 3/4)", MCS_VALID}, 115 {"HT MCS 5 (64-QAM 2/3)", MCS_VALID}, 116 {"HT MCS 6 (64-QAM 3/4)", MCS_VALID}, 117 {"HT MCS 7 (64-QAM 5/6)", MCS_VALID}, 118 {"INVALID ", MCS_INVALID}, 119 {"INVALID ", MCS_INVALID}, 120 {"INVALID ", MCS_INVALID}, 121 {"INVALID ", MCS_INVALID}, 122 {"INVALID ", MCS_VALID}, 123 }, 124 { 125 {"VHT MCS 0 (BPSK 1/2) ", MCS_VALID}, 126 {"VHT MCS 1 (QPSK 1/2) ", MCS_VALID}, 127 {"VHT MCS 2 (QPSK 3/4) ", MCS_VALID}, 128 {"VHT MCS 3 (16-QAM 1/2) ", MCS_VALID}, 129 {"VHT MCS 4 (16-QAM 3/4) ", MCS_VALID}, 130 {"VHT MCS 5 (64-QAM 2/3) ", MCS_VALID}, 131 {"VHT MCS 6 (64-QAM 3/4) ", MCS_VALID}, 132 {"VHT MCS 7 (64-QAM 5/6) ", MCS_VALID}, 133 {"VHT MCS 8 (256-QAM 3/4) ", MCS_VALID}, 134 {"VHT MCS 9 (256-QAM 5/6) ", MCS_VALID}, 135 {"VHT MCS 10 (1024-QAM 3/4)", MCS_VALID}, 136 {"VHT MCS 11 (1024-QAM 5/6)", MCS_VALID}, 137 {"INVALID ", MCS_VALID}, 138 }, 139 { 140 {"HE MCS 0 (BPSK 1/2) ", MCS_VALID}, 141 {"HE MCS 1 (QPSK 1/2) ", MCS_VALID}, 142 {"HE MCS 2 (QPSK 3/4) ", MCS_VALID}, 143 {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID}, 144 {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID}, 145 {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID}, 146 {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID}, 147 {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID}, 148 {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID}, 149 {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID}, 150 {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID}, 151 {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, 152 {"INVALID ", MCS_VALID}, 153 } 154 }; 155 156 #ifdef CONFIG_WIN 157 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 158 "0 to 10 ms", "11 to 20 ms", 159 "21 to 30 ms", "31 to 40 ms", 160 "41 to 50 ms", "51 to 60 ms", 161 "61 to 70 ms", "71 to 80 ms", 162 "81 to 90 ms", "91 to 100 ms", 163 "101 to 250 ms", "251 to 500 ms", "500+ ms" 164 }; 165 166 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 167 "0 to 1 ms", "1 to 2 ms", 168 "2 to 3 ms", "3 to 4 ms", 169 "4 to 5 ms", "5 to 6 ms", 170 "6 to 7 ms", "7 to 8 ms", 171 "8 to 9 ms", "9 to 10 ms", 172 "10 to 11 ms", "11 to 12 ms", "12+ ms" 173 }; 174 175 const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 176 "0 to 5 ms", "6 to 10 ms", 177 "11 to 15 ms", "16 to 20 ms", 178 "21 to 25 ms", "26 to 30 ms", 179 "31 to 35 ms", "36 to 40 ms", 180 "41 to 45 ms", "46 to 50 ms", 181 "51 to 55 ms", "56 to 60 ms", "60+ ms" 182 }; 183 #endif 184 185 #ifdef WLAN_TX_PKT_CAPTURE_ENH 186 #include "dp_tx_capture.h" 187 #endif 188 189 /* 190 * dp_print_stats_string_tlv: display htt_stats_string_tlv 191 * @tag_buf: buffer containing the tlv htt_stats_string_tlv 192 * 193 * return:void 194 */ 195 static inline void dp_print_stats_string_tlv(uint32_t *tag_buf) 196 { 197 htt_stats_string_tlv *dp_stats_buf = 198 (htt_stats_string_tlv *)tag_buf; 199 uint8_t i; 200 uint16_t index = 0; 201 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 202 char *data = qdf_mem_malloc(DP_MAX_STRING_LEN); 203 204 if (!data) { 205 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 206 FL("Output buffer not allocated")); 207 return; 208 } 209 210 DP_PRINT_STATS("HTT_STATS_STRING_TLV:"); 211 for (i = 0; i < tag_len; i++) { 212 index += qdf_snprint(&data[index], 213 DP_MAX_STRING_LEN - index, 214 " %u:%u,", i, dp_stats_buf->data[i]); 215 } 216 DP_PRINT_STATS("data = %s\n", data); 217 qdf_mem_free(data); 218 } 219 220 /* 221 * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv 222 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv 223 * 224 * return:void 225 */ 226 static inline void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf) 227 { 228 htt_tx_pdev_stats_cmn_tlv *dp_stats_buf = 229 (htt_tx_pdev_stats_cmn_tlv *)tag_buf; 230 231 DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:"); 232 DP_PRINT_STATS("mac_id__word = %u", 233 dp_stats_buf->mac_id__word); 234 DP_PRINT_STATS("hw_queued = %u", 235 dp_stats_buf->hw_queued); 236 DP_PRINT_STATS("hw_reaped = %u", 237 dp_stats_buf->hw_reaped); 238 DP_PRINT_STATS("underrun = %u", 239 dp_stats_buf->underrun); 240 DP_PRINT_STATS("hw_paused = %u", 241 dp_stats_buf->hw_paused); 242 DP_PRINT_STATS("hw_flush = %u", 243 dp_stats_buf->hw_flush); 244 DP_PRINT_STATS("hw_filt = %u", 245 dp_stats_buf->hw_filt); 246 DP_PRINT_STATS("tx_abort = %u", 247 dp_stats_buf->tx_abort); 248 DP_PRINT_STATS("mpdu_requeued = %u", 249 dp_stats_buf->mpdu_requed); 250 DP_PRINT_STATS("tx_xretry = %u", 251 dp_stats_buf->tx_xretry); 252 DP_PRINT_STATS("data_rc = %u", 253 dp_stats_buf->data_rc); 254 DP_PRINT_STATS("mpdu_dropped_xretry = %u", 255 dp_stats_buf->mpdu_dropped_xretry); 256 DP_PRINT_STATS("illegal_rate_phy_err = %u", 257 dp_stats_buf->illgl_rate_phy_err); 258 DP_PRINT_STATS("cont_xretry = %u", 259 dp_stats_buf->cont_xretry); 260 DP_PRINT_STATS("tx_timeout = %u", 261 dp_stats_buf->tx_timeout); 262 DP_PRINT_STATS("pdev_resets = %u", 263 dp_stats_buf->pdev_resets); 264 DP_PRINT_STATS("phy_underrun = %u", 265 dp_stats_buf->phy_underrun); 266 DP_PRINT_STATS("txop_ovf = %u", 267 dp_stats_buf->txop_ovf); 268 DP_PRINT_STATS("seq_posted = %u", 269 dp_stats_buf->seq_posted); 270 DP_PRINT_STATS("seq_failed_queueing = %u", 271 dp_stats_buf->seq_failed_queueing); 272 DP_PRINT_STATS("seq_completed = %u", 273 dp_stats_buf->seq_completed); 274 DP_PRINT_STATS("seq_restarted = %u", 275 dp_stats_buf->seq_restarted); 276 DP_PRINT_STATS("mu_seq_posted = %u", 277 dp_stats_buf->mu_seq_posted); 278 DP_PRINT_STATS("seq_switch_hw_paused = %u", 279 dp_stats_buf->seq_switch_hw_paused); 280 DP_PRINT_STATS("next_seq_posted_dsr = %u", 281 dp_stats_buf->next_seq_posted_dsr); 282 DP_PRINT_STATS("seq_posted_isr = %u", 283 dp_stats_buf->seq_posted_isr); 284 DP_PRINT_STATS("seq_ctrl_cached = %u", 285 dp_stats_buf->seq_ctrl_cached); 286 DP_PRINT_STATS("mpdu_count_tqm = %u", 287 dp_stats_buf->mpdu_count_tqm); 288 DP_PRINT_STATS("msdu_count_tqm = %u", 289 dp_stats_buf->msdu_count_tqm); 290 DP_PRINT_STATS("mpdu_removed_tqm = %u", 291 dp_stats_buf->mpdu_removed_tqm); 292 DP_PRINT_STATS("msdu_removed_tqm = %u", 293 dp_stats_buf->msdu_removed_tqm); 294 DP_PRINT_STATS("mpdus_sw_flush = %u", 295 dp_stats_buf->mpdus_sw_flush); 296 DP_PRINT_STATS("mpdus_hw_filter = %u", 297 dp_stats_buf->mpdus_hw_filter); 298 DP_PRINT_STATS("mpdus_truncated = %u", 299 dp_stats_buf->mpdus_truncated); 300 DP_PRINT_STATS("mpdus_ack_failed = %u", 301 dp_stats_buf->mpdus_ack_failed); 302 DP_PRINT_STATS("mpdus_expired = %u", 303 dp_stats_buf->mpdus_expired); 304 DP_PRINT_STATS("mpdus_seq_hw_retry = %u", 305 dp_stats_buf->mpdus_seq_hw_retry); 306 DP_PRINT_STATS("ack_tlv_proc = %u", 307 dp_stats_buf->ack_tlv_proc); 308 DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u", 309 dp_stats_buf->coex_abort_mpdu_cnt_valid); 310 DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n", 311 dp_stats_buf->coex_abort_mpdu_cnt); 312 } 313 314 /* 315 * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v 316 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v 317 * 318 * return:void 319 */ 320 static inline void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf) 321 { 322 htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf = 323 (htt_tx_pdev_stats_urrn_tlv_v *)tag_buf; 324 uint8_t i; 325 uint16_t index = 0; 326 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 327 char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN); 328 329 if (!urrn_stats) { 330 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 331 FL("Output buffer not allocated")); 332 return; 333 } 334 335 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS); 336 DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:"); 337 for (i = 0; i < tag_len; i++) { 338 index += qdf_snprint(&urrn_stats[index], 339 DP_MAX_STRING_LEN - index, 340 " %u:%u,", i, dp_stats_buf->urrn_stats[i]); 341 } 342 DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats); 343 qdf_mem_free(urrn_stats); 344 } 345 346 /* 347 * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v 348 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v 349 * 350 * return:void 351 */ 352 static inline void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf) 353 { 354 htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf = 355 (htt_tx_pdev_stats_flush_tlv_v *)tag_buf; 356 uint8_t i; 357 uint16_t index = 0; 358 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 359 char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN); 360 361 if (!flush_errs) { 362 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 363 FL("Output buffer not allocated")); 364 return; 365 } 366 367 tag_len = qdf_min(tag_len, 368 (uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS); 369 370 DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:"); 371 for (i = 0; i < tag_len; i++) { 372 index += qdf_snprint(&flush_errs[index], 373 DP_MAX_STRING_LEN - index, 374 " %u:%u,", i, dp_stats_buf->flush_errs[i]); 375 } 376 DP_PRINT_STATS("flush_errs = %s\n", flush_errs); 377 qdf_mem_free(flush_errs); 378 } 379 380 /* 381 * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v 382 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v 383 * 384 * return:void 385 */ 386 static inline void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf) 387 { 388 htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf = 389 (htt_tx_pdev_stats_sifs_tlv_v *)tag_buf; 390 uint8_t i; 391 uint16_t index = 0; 392 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 393 char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN); 394 395 if (!sifs_status) { 396 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 397 FL("Output buffer not allocated")); 398 return; 399 } 400 401 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS); 402 403 DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:"); 404 for (i = 0; i < tag_len; i++) { 405 index += qdf_snprint(&sifs_status[index], 406 DP_MAX_STRING_LEN - index, 407 " %u:%u,", i, dp_stats_buf->sifs_status[i]); 408 } 409 DP_PRINT_STATS("sifs_status = %s\n", sifs_status); 410 qdf_mem_free(sifs_status); 411 } 412 413 /* 414 * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v 415 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v 416 * 417 * return:void 418 */ 419 static inline void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf) 420 { 421 htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf = 422 (htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf; 423 uint8_t i; 424 uint16_t index = 0; 425 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 426 char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN); 427 428 if (!phy_errs) { 429 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 430 FL("Output buffer not allocated")); 431 return; 432 } 433 434 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS); 435 436 DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:"); 437 for (i = 0; i < tag_len; i++) { 438 index += qdf_snprint(&phy_errs[index], 439 DP_MAX_STRING_LEN - index, 440 " %u:%u,", i, dp_stats_buf->phy_errs[i]); 441 } 442 DP_PRINT_STATS("phy_errs = %s\n", phy_errs); 443 qdf_mem_free(phy_errs); 444 } 445 446 /* 447 * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv 448 * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv 449 * 450 * return:void 451 */ 452 static inline void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf) 453 { 454 htt_hw_stats_intr_misc_tlv *dp_stats_buf = 455 (htt_hw_stats_intr_misc_tlv *)tag_buf; 456 uint8_t i; 457 uint16_t index = 0; 458 char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 459 460 if (!hw_intr_name) { 461 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 462 FL("Output buffer not allocated")); 463 return; 464 } 465 466 DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:"); 467 for (i = 0; i < DP_HTT_HW_INTR_NAME_LEN; i++) { 468 index += qdf_snprint(&hw_intr_name[index], 469 DP_MAX_STRING_LEN - index, 470 " %u:%u,", i, dp_stats_buf->hw_intr_name[i]); 471 } 472 DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name); 473 DP_PRINT_STATS("mask = %u", 474 dp_stats_buf->mask); 475 DP_PRINT_STATS("count = %u\n", 476 dp_stats_buf->count); 477 qdf_mem_free(hw_intr_name); 478 } 479 480 /* 481 * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv 482 * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv 483 * 484 * return:void 485 */ 486 static inline void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf) 487 { 488 htt_hw_stats_wd_timeout_tlv *dp_stats_buf = 489 (htt_hw_stats_wd_timeout_tlv *)tag_buf; 490 uint8_t i; 491 uint16_t index = 0; 492 char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 493 494 if (!hw_module_name) { 495 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 496 FL("Output buffer not allocated")); 497 return; 498 } 499 500 DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:"); 501 for (i = 0; i < DP_HTT_HW_MODULE_NAME_LEN; i++) { 502 index += qdf_snprint(&hw_module_name[index], 503 DP_MAX_STRING_LEN - index, 504 " %u:%u,", i, dp_stats_buf->hw_module_name[i]); 505 } 506 DP_PRINT_STATS("hw_module_name = %s ", hw_module_name); 507 DP_PRINT_STATS("count = %u", 508 dp_stats_buf->count); 509 qdf_mem_free(hw_module_name); 510 } 511 512 /* 513 * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv 514 * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv 515 * 516 * return:void 517 */ 518 static inline void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf) 519 { 520 htt_hw_stats_pdev_errs_tlv *dp_stats_buf = 521 (htt_hw_stats_pdev_errs_tlv *)tag_buf; 522 523 DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:"); 524 DP_PRINT_STATS("mac_id__word = %u", 525 dp_stats_buf->mac_id__word); 526 DP_PRINT_STATS("tx_abort = %u", 527 dp_stats_buf->tx_abort); 528 DP_PRINT_STATS("tx_abort_fail_count = %u", 529 dp_stats_buf->tx_abort_fail_count); 530 DP_PRINT_STATS("rx_abort = %u", 531 dp_stats_buf->rx_abort); 532 DP_PRINT_STATS("rx_abort_fail_count = %u", 533 dp_stats_buf->rx_abort_fail_count); 534 DP_PRINT_STATS("warm_reset = %u", 535 dp_stats_buf->warm_reset); 536 DP_PRINT_STATS("cold_reset = %u", 537 dp_stats_buf->cold_reset); 538 DP_PRINT_STATS("tx_flush = %u", 539 dp_stats_buf->tx_flush); 540 DP_PRINT_STATS("tx_glb_reset = %u", 541 dp_stats_buf->tx_glb_reset); 542 DP_PRINT_STATS("tx_txq_reset = %u", 543 dp_stats_buf->tx_txq_reset); 544 DP_PRINT_STATS("rx_timeout_reset = %u\n", 545 dp_stats_buf->rx_timeout_reset); 546 } 547 548 /* 549 * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv 550 * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv 551 * 552 * return:void 553 */ 554 static inline void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf) 555 { 556 htt_msdu_flow_stats_tlv *dp_stats_buf = 557 (htt_msdu_flow_stats_tlv *)tag_buf; 558 559 DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:"); 560 DP_PRINT_STATS("last_update_timestamp = %u", 561 dp_stats_buf->last_update_timestamp); 562 DP_PRINT_STATS("last_add_timestamp = %u", 563 dp_stats_buf->last_add_timestamp); 564 DP_PRINT_STATS("last_remove_timestamp = %u", 565 dp_stats_buf->last_remove_timestamp); 566 DP_PRINT_STATS("total_processed_msdu_count = %u", 567 dp_stats_buf->total_processed_msdu_count); 568 DP_PRINT_STATS("cur_msdu_count_in_flowq = %u", 569 dp_stats_buf->cur_msdu_count_in_flowq); 570 DP_PRINT_STATS("sw_peer_id = %u", 571 dp_stats_buf->sw_peer_id); 572 DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n", 573 dp_stats_buf->tx_flow_no__tid_num__drop_rule); 574 } 575 576 /* 577 * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv 578 * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv 579 * 580 * return:void 581 */ 582 static inline void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf) 583 { 584 htt_tx_tid_stats_tlv *dp_stats_buf = 585 (htt_tx_tid_stats_tlv *)tag_buf; 586 uint8_t i; 587 uint16_t index = 0; 588 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 589 590 if (!tid_name) { 591 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 592 FL("Output buffer not allocated")); 593 return; 594 } 595 596 DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:"); 597 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 598 index += qdf_snprint(&tid_name[index], 599 DP_MAX_STRING_LEN - index, 600 " %u:%u,", i, dp_stats_buf->tid_name[i]); 601 } 602 DP_PRINT_STATS("tid_name = %s ", tid_name); 603 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 604 dp_stats_buf->sw_peer_id__tid_num); 605 DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u", 606 dp_stats_buf->num_sched_pending__num_ppdu_in_hwq); 607 DP_PRINT_STATS("tid_flags = %u", 608 dp_stats_buf->tid_flags); 609 DP_PRINT_STATS("hw_queued = %u", 610 dp_stats_buf->hw_queued); 611 DP_PRINT_STATS("hw_reaped = %u", 612 dp_stats_buf->hw_reaped); 613 DP_PRINT_STATS("mpdus_hw_filter = %u", 614 dp_stats_buf->mpdus_hw_filter); 615 DP_PRINT_STATS("qdepth_bytes = %u", 616 dp_stats_buf->qdepth_bytes); 617 DP_PRINT_STATS("qdepth_num_msdu = %u", 618 dp_stats_buf->qdepth_num_msdu); 619 DP_PRINT_STATS("qdepth_num_mpdu = %u", 620 dp_stats_buf->qdepth_num_mpdu); 621 DP_PRINT_STATS("last_scheduled_tsmp = %u", 622 dp_stats_buf->last_scheduled_tsmp); 623 DP_PRINT_STATS("pause_module_id = %u", 624 dp_stats_buf->pause_module_id); 625 DP_PRINT_STATS("block_module_id = %u\n", 626 dp_stats_buf->block_module_id); 627 DP_PRINT_STATS("tid_tx_airtime = %u\n", 628 dp_stats_buf->tid_tx_airtime); 629 qdf_mem_free(tid_name); 630 } 631 632 /* 633 * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv 634 * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv 635 * 636 * return:void 637 */ 638 static inline void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf) 639 { 640 htt_tx_tid_stats_v1_tlv *dp_stats_buf = 641 (htt_tx_tid_stats_v1_tlv *)tag_buf; 642 uint8_t i; 643 uint16_t index = 0; 644 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 645 646 if (!tid_name) { 647 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 648 FL("Output buffer not allocated")); 649 return; 650 } 651 652 DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:"); 653 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 654 index += qdf_snprint(&tid_name[index], 655 DP_MAX_STRING_LEN - index, 656 " %u:%u,", i, dp_stats_buf->tid_name[i]); 657 } 658 DP_PRINT_STATS("tid_name = %s ", tid_name); 659 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 660 dp_stats_buf->sw_peer_id__tid_num); 661 DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u", 662 dp_stats_buf->num_sched_pending__num_ppdu_in_hwq); 663 DP_PRINT_STATS("tid_flags = %u", 664 dp_stats_buf->tid_flags); 665 DP_PRINT_STATS("max_qdepth_bytes = %u", 666 dp_stats_buf->max_qdepth_bytes); 667 DP_PRINT_STATS("max_qdepth_n_msdus = %u", 668 dp_stats_buf->max_qdepth_n_msdus); 669 DP_PRINT_STATS("rsvd = %u", 670 dp_stats_buf->rsvd); 671 DP_PRINT_STATS("qdepth_bytes = %u", 672 dp_stats_buf->qdepth_bytes); 673 DP_PRINT_STATS("qdepth_num_msdu = %u", 674 dp_stats_buf->qdepth_num_msdu); 675 DP_PRINT_STATS("qdepth_num_mpdu = %u", 676 dp_stats_buf->qdepth_num_mpdu); 677 DP_PRINT_STATS("last_scheduled_tsmp = %u", 678 dp_stats_buf->last_scheduled_tsmp); 679 DP_PRINT_STATS("pause_module_id = %u", 680 dp_stats_buf->pause_module_id); 681 DP_PRINT_STATS("block_module_id = %u\n", 682 dp_stats_buf->block_module_id); 683 DP_PRINT_STATS("tid_tx_airtime = %u\n", 684 dp_stats_buf->tid_tx_airtime); 685 qdf_mem_free(tid_name); 686 } 687 688 /* 689 * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv 690 * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv 691 * 692 * return:void 693 */ 694 static inline void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf) 695 { 696 htt_rx_tid_stats_tlv *dp_stats_buf = 697 (htt_rx_tid_stats_tlv *)tag_buf; 698 uint8_t i; 699 uint16_t index = 0; 700 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 701 702 if (!tid_name) { 703 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 704 FL("Output buffer not allocated")); 705 return; 706 } 707 708 DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:"); 709 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 710 dp_stats_buf->sw_peer_id__tid_num); 711 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 712 index += qdf_snprint(&tid_name[index], 713 DP_MAX_STRING_LEN - index, 714 " %u:%u,", i, dp_stats_buf->tid_name[i]); 715 } 716 DP_PRINT_STATS("tid_name = %s ", tid_name); 717 DP_PRINT_STATS("dup_in_reorder = %u", 718 dp_stats_buf->dup_in_reorder); 719 DP_PRINT_STATS("dup_past_outside_window = %u", 720 dp_stats_buf->dup_past_outside_window); 721 DP_PRINT_STATS("dup_past_within_window = %u", 722 dp_stats_buf->dup_past_within_window); 723 DP_PRINT_STATS("rxdesc_err_decrypt = %u\n", 724 dp_stats_buf->rxdesc_err_decrypt); 725 qdf_mem_free(tid_name); 726 } 727 728 /* 729 * dp_print_counter_tlv: display htt_counter_tlv 730 * @tag_buf: buffer containing the tlv htt_counter_tlv 731 * 732 * return:void 733 */ 734 static inline void dp_print_counter_tlv(uint32_t *tag_buf) 735 { 736 htt_counter_tlv *dp_stats_buf = 737 (htt_counter_tlv *)tag_buf; 738 uint8_t i; 739 uint16_t index = 0; 740 char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 741 742 if (!counter_name) { 743 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 744 FL("Output buffer not allocated")); 745 return; 746 } 747 748 DP_PRINT_STATS("HTT_COUNTER_TLV:"); 749 for (i = 0; i < DP_HTT_COUNTER_NAME_LEN; i++) { 750 index += qdf_snprint(&counter_name[index], 751 DP_MAX_STRING_LEN - index, 752 " %u:%u,", i, dp_stats_buf->counter_name[i]); 753 } 754 DP_PRINT_STATS("counter_name = %s ", counter_name); 755 DP_PRINT_STATS("count = %u\n", 756 dp_stats_buf->count); 757 qdf_mem_free(counter_name); 758 } 759 760 /* 761 * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv 762 * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv 763 * 764 * return:void 765 */ 766 static inline void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf) 767 { 768 htt_peer_stats_cmn_tlv *dp_stats_buf = 769 (htt_peer_stats_cmn_tlv *)tag_buf; 770 771 DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:"); 772 DP_PRINT_STATS("ppdu_cnt = %u", 773 dp_stats_buf->ppdu_cnt); 774 DP_PRINT_STATS("mpdu_cnt = %u", 775 dp_stats_buf->mpdu_cnt); 776 DP_PRINT_STATS("msdu_cnt = %u", 777 dp_stats_buf->msdu_cnt); 778 DP_PRINT_STATS("pause_bitmap = %u", 779 dp_stats_buf->pause_bitmap); 780 DP_PRINT_STATS("block_bitmap = %u", 781 dp_stats_buf->block_bitmap); 782 DP_PRINT_STATS("current_timestamp = %u\n", 783 dp_stats_buf->current_timestamp); 784 DP_PRINT_STATS("inactive_time = %u", 785 dp_stats_buf->inactive_time); 786 } 787 788 /* 789 * dp_print_peer_details_tlv: display htt_peer_details_tlv 790 * @tag_buf: buffer containing the tlv htt_peer_details_tlv 791 * 792 * return:void 793 */ 794 static inline void dp_print_peer_details_tlv(uint32_t *tag_buf) 795 { 796 htt_peer_details_tlv *dp_stats_buf = 797 (htt_peer_details_tlv *)tag_buf; 798 799 DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:"); 800 DP_PRINT_STATS("peer_type = %u", 801 dp_stats_buf->peer_type); 802 DP_PRINT_STATS("sw_peer_id = %u", 803 dp_stats_buf->sw_peer_id); 804 DP_PRINT_STATS("vdev_pdev_ast_idx = %u", 805 dp_stats_buf->vdev_pdev_ast_idx); 806 DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u", 807 dp_stats_buf->mac_addr.mac_addr31to0); 808 DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u", 809 dp_stats_buf->mac_addr.mac_addr47to32); 810 DP_PRINT_STATS("peer_flags = %u", 811 dp_stats_buf->peer_flags); 812 DP_PRINT_STATS("qpeer_flags = %u\n", 813 dp_stats_buf->qpeer_flags); 814 } 815 816 /* 817 * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv 818 * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv 819 * 820 * return:void 821 */ 822 static inline void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf) 823 { 824 htt_tx_peer_rate_stats_tlv *dp_stats_buf = 825 (htt_tx_peer_rate_stats_tlv *)tag_buf; 826 uint8_t i, j; 827 uint16_t index = 0; 828 char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS]; 829 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 830 831 if (!str_buf) { 832 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 833 FL("Output buffer not allocated")); 834 return; 835 } 836 837 for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) 838 tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 839 840 DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:"); 841 DP_PRINT_STATS("tx_ldpc = %u", 842 dp_stats_buf->tx_ldpc); 843 DP_PRINT_STATS("rts_cnt = %u", 844 dp_stats_buf->rts_cnt); 845 DP_PRINT_STATS("ack_rssi = %u", 846 dp_stats_buf->ack_rssi); 847 848 index = 0; 849 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 850 for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) { 851 index += qdf_snprint(&str_buf[index], 852 DP_MAX_STRING_LEN - index, 853 " %u:%u,", i, dp_stats_buf->tx_mcs[i]); 854 } 855 DP_PRINT_STATS("tx_mcs = %s ", str_buf); 856 857 index = 0; 858 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 859 for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) { 860 index += qdf_snprint(&str_buf[index], 861 DP_MAX_STRING_LEN - index, 862 " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]); 863 } 864 DP_PRINT_STATS("tx_su_mcs = %s ", str_buf); 865 index = 0; 866 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 867 for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) { 868 index += qdf_snprint(&str_buf[index], 869 DP_MAX_STRING_LEN - index, 870 " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]); 871 } 872 DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf); 873 index = 0; 874 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 875 for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) { 876 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 877 index += qdf_snprint(&str_buf[index], 878 DP_MAX_STRING_LEN - index, 879 " %u:%u,", (i + 1), 880 dp_stats_buf->tx_nss[i]); 881 } 882 DP_PRINT_STATS("tx_nss = %s ", str_buf); 883 index = 0; 884 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 885 for (i = 0; i < DP_HTT_TX_BW_LEN; i++) { 886 index += qdf_snprint(&str_buf[index], 887 DP_MAX_STRING_LEN - index, 888 " %u:%u,", i, dp_stats_buf->tx_bw[i]); 889 } 890 DP_PRINT_STATS("tx_bw = %s ", str_buf); 891 index = 0; 892 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 893 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 894 index += qdf_snprint(&str_buf[index], 895 DP_MAX_STRING_LEN - index, 896 " %u:%u,", i, dp_stats_buf->tx_stbc[i]); 897 } 898 DP_PRINT_STATS("tx_stbc = %s ", str_buf); 899 index = 0; 900 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 901 902 for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) { 903 index += qdf_snprint(&str_buf[index], 904 DP_MAX_STRING_LEN - index, 905 " %u:%u,", i, dp_stats_buf->tx_pream[i]); 906 } 907 DP_PRINT_STATS("tx_pream = %s ", str_buf); 908 909 for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) { 910 index = 0; 911 for (i = 0; i < HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) { 912 index += qdf_snprint(&tx_gi[j][index], 913 DP_MAX_STRING_LEN - index, 914 " %u:%u,", i, 915 dp_stats_buf->tx_gi[j][i]); 916 } 917 DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]); 918 } 919 920 index = 0; 921 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 922 for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) { 923 index += qdf_snprint(&str_buf[index], 924 DP_MAX_STRING_LEN - index, 925 " %u:%u,", i, dp_stats_buf->tx_dcm[i]); 926 } 927 DP_PRINT_STATS("tx_dcm = %s\n", str_buf); 928 for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) 929 qdf_mem_free(tx_gi[i]); 930 931 qdf_mem_free(str_buf); 932 } 933 934 /* 935 * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv 936 * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv 937 * 938 * return:void 939 */ 940 static inline void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf) 941 { 942 htt_rx_peer_rate_stats_tlv *dp_stats_buf = 943 (htt_rx_peer_rate_stats_tlv *)tag_buf; 944 uint8_t i, j; 945 uint16_t index = 0; 946 char *rssi_chain[DP_HTT_PEER_NUM_SS]; 947 char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS]; 948 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 949 950 if (!str_buf) { 951 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 952 FL("Output buffer not allocated")); 953 return; 954 } 955 956 for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) 957 rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 958 for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) 959 rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 960 961 DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:"); 962 DP_PRINT_STATS("nsts = %u", 963 dp_stats_buf->nsts); 964 DP_PRINT_STATS("rx_ldpc = %u", 965 dp_stats_buf->rx_ldpc); 966 DP_PRINT_STATS("rts_cnt = %u", 967 dp_stats_buf->rts_cnt); 968 DP_PRINT_STATS("rssi_mgmt = %u", 969 dp_stats_buf->rssi_mgmt); 970 DP_PRINT_STATS("rssi_data = %u", 971 dp_stats_buf->rssi_data); 972 DP_PRINT_STATS("rssi_comb = %u", 973 dp_stats_buf->rssi_comb); 974 975 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 976 for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) { 977 index += qdf_snprint(&str_buf[index], 978 DP_MAX_STRING_LEN - index, 979 " %u:%u,", i, dp_stats_buf->rx_mcs[i]); 980 } 981 DP_PRINT_STATS("rx_mcs = %s ", str_buf); 982 983 index = 0; 984 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 985 for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) { 986 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 987 index += qdf_snprint(&str_buf[index], 988 DP_MAX_STRING_LEN - index, 989 " %u:%u,", (i + 1), 990 dp_stats_buf->rx_nss[i]); 991 } 992 DP_PRINT_STATS("rx_nss = %s ", str_buf); 993 994 index = 0; 995 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 996 for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) { 997 index += qdf_snprint(&str_buf[index], 998 DP_MAX_STRING_LEN - index, 999 " %u:%u,", i, dp_stats_buf->rx_dcm[i]); 1000 } 1001 DP_PRINT_STATS("rx_dcm = %s ", str_buf); 1002 1003 index = 0; 1004 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1005 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1006 index += qdf_snprint(&str_buf[index], 1007 DP_MAX_STRING_LEN - index, 1008 " %u:%u,", i, dp_stats_buf->rx_stbc[i]); 1009 } 1010 DP_PRINT_STATS("rx_stbc = %s ", str_buf); 1011 1012 index = 0; 1013 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1014 for (i = 0; i < DP_HTT_RX_BW_LEN; i++) { 1015 index += qdf_snprint(&str_buf[index], 1016 DP_MAX_STRING_LEN - index, 1017 " %u:%u,", i, dp_stats_buf->rx_bw[i]); 1018 } 1019 DP_PRINT_STATS("rx_bw = %s ", str_buf); 1020 1021 for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) { 1022 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1023 index = 0; 1024 for (i = 0; i < HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) { 1025 index += qdf_snprint(&rssi_chain[j][index], 1026 DP_MAX_STRING_LEN - index, 1027 " %u:%u,", i, 1028 dp_stats_buf->rssi_chain[j][i]); 1029 } 1030 DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]); 1031 } 1032 1033 for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1034 index = 0; 1035 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1036 index += qdf_snprint(&rx_gi[j][index], 1037 DP_MAX_STRING_LEN - index, 1038 " %u:%u,", i, 1039 dp_stats_buf->rx_gi[j][i]); 1040 } 1041 DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]); 1042 } 1043 index = 0; 1044 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1045 for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) { 1046 index += qdf_snprint(&str_buf[index], 1047 DP_MAX_STRING_LEN - index, 1048 " %u:%u,", i, dp_stats_buf->rx_pream[i]); 1049 } 1050 DP_PRINT_STATS("rx_pream = %s\n", str_buf); 1051 1052 for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) 1053 qdf_mem_free(rssi_chain[i]); 1054 for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) 1055 qdf_mem_free(rx_gi[i]); 1056 1057 qdf_mem_free(str_buf); 1058 } 1059 1060 /* 1061 * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats 1062 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv 1063 * 1064 * return:void 1065 */ 1066 static inline void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf) 1067 { 1068 htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf = 1069 (htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf; 1070 1071 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:"); 1072 DP_PRINT_STATS("mu_mimo_sch_posted = %u", 1073 dp_stats_buf->mu_mimo_sch_posted); 1074 DP_PRINT_STATS("mu_mimo_sch_failed = %u", 1075 dp_stats_buf->mu_mimo_sch_failed); 1076 DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n", 1077 dp_stats_buf->mu_mimo_ppdu_posted); 1078 } 1079 1080 /* 1081 * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats 1082 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv 1083 * 1084 * return:void 1085 */ 1086 static inline void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf) 1087 { 1088 htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf = 1089 (htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf; 1090 1091 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:"); 1092 DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u", 1093 dp_stats_buf->mu_mimo_mpdus_queued_usr); 1094 DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u", 1095 dp_stats_buf->mu_mimo_mpdus_tried_usr); 1096 DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u", 1097 dp_stats_buf->mu_mimo_mpdus_failed_usr); 1098 DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u", 1099 dp_stats_buf->mu_mimo_mpdus_requeued_usr); 1100 DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u", 1101 dp_stats_buf->mu_mimo_err_no_ba_usr); 1102 DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u", 1103 dp_stats_buf->mu_mimo_mpdu_underrun_usr); 1104 DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n", 1105 dp_stats_buf->mu_mimo_ampdu_underrun_usr); 1106 } 1107 1108 /* 1109 * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats 1110 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv 1111 * 1112 * return:void 1113 */ 1114 static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf) 1115 { 1116 htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf = 1117 (htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf; 1118 1119 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:"); 1120 DP_PRINT_STATS("mac_id__hwq_id__word = %u\n", 1121 dp_stats_buf->mac_id__hwq_id__word); 1122 } 1123 1124 /* 1125 * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv 1126 * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv 1127 * 1128 * return:void 1129 */ 1130 static inline void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf) 1131 { 1132 htt_tx_hwq_stats_cmn_tlv *dp_stats_buf = 1133 (htt_tx_hwq_stats_cmn_tlv *)tag_buf; 1134 1135 DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:"); 1136 DP_PRINT_STATS("mac_id__hwq_id__word = %u", 1137 dp_stats_buf->mac_id__hwq_id__word); 1138 DP_PRINT_STATS("xretry = %u", 1139 dp_stats_buf->xretry); 1140 DP_PRINT_STATS("underrun_cnt = %u", 1141 dp_stats_buf->underrun_cnt); 1142 DP_PRINT_STATS("flush_cnt = %u", 1143 dp_stats_buf->flush_cnt); 1144 DP_PRINT_STATS("filt_cnt = %u", 1145 dp_stats_buf->filt_cnt); 1146 DP_PRINT_STATS("null_mpdu_bmap = %u", 1147 dp_stats_buf->null_mpdu_bmap); 1148 DP_PRINT_STATS("user_ack_failure = %u", 1149 dp_stats_buf->user_ack_failure); 1150 DP_PRINT_STATS("ack_tlv_proc = %u", 1151 dp_stats_buf->ack_tlv_proc); 1152 DP_PRINT_STATS("sched_id_proc = %u", 1153 dp_stats_buf->sched_id_proc); 1154 DP_PRINT_STATS("null_mpdu_tx_count = %u", 1155 dp_stats_buf->null_mpdu_tx_count); 1156 DP_PRINT_STATS("mpdu_bmap_not_recvd = %u", 1157 dp_stats_buf->mpdu_bmap_not_recvd); 1158 DP_PRINT_STATS("num_bar = %u", 1159 dp_stats_buf->num_bar); 1160 DP_PRINT_STATS("rts = %u", 1161 dp_stats_buf->rts); 1162 DP_PRINT_STATS("cts2self = %u", 1163 dp_stats_buf->cts2self); 1164 DP_PRINT_STATS("qos_null = %u", 1165 dp_stats_buf->qos_null); 1166 DP_PRINT_STATS("mpdu_tried_cnt = %u", 1167 dp_stats_buf->mpdu_tried_cnt); 1168 DP_PRINT_STATS("mpdu_queued_cnt = %u", 1169 dp_stats_buf->mpdu_queued_cnt); 1170 DP_PRINT_STATS("mpdu_ack_fail_cnt = %u", 1171 dp_stats_buf->mpdu_ack_fail_cnt); 1172 DP_PRINT_STATS("mpdu_filt_cnt = %u", 1173 dp_stats_buf->mpdu_filt_cnt); 1174 DP_PRINT_STATS("false_mpdu_ack_count = %u\n", 1175 dp_stats_buf->false_mpdu_ack_count); 1176 } 1177 1178 /* 1179 * dp_print_tx_hwq_difs_latency_stats_tlv_v: display 1180 * htt_tx_hwq_difs_latency_stats_tlv_v 1181 * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v 1182 * 1183 *return:void 1184 */ 1185 static inline void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf) 1186 { 1187 htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf = 1188 (htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf; 1189 uint8_t i; 1190 uint16_t index = 0; 1191 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1192 char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN); 1193 1194 if (!difs_latency_hist) { 1195 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1196 FL("Output buffer not allocated")); 1197 return; 1198 } 1199 1200 tag_len = qdf_min(tag_len, 1201 (uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS); 1202 1203 DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:"); 1204 DP_PRINT_STATS("hist_intvl = %u", 1205 dp_stats_buf->hist_intvl); 1206 1207 for (i = 0; i < tag_len; i++) { 1208 index += qdf_snprint(&difs_latency_hist[index], 1209 DP_MAX_STRING_LEN - index, 1210 " %u:%u,", i, 1211 dp_stats_buf->difs_latency_hist[i]); 1212 } 1213 DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist); 1214 qdf_mem_free(difs_latency_hist); 1215 } 1216 1217 /* 1218 * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats 1219 * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v 1220 * 1221 * return:void 1222 */ 1223 static inline void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf) 1224 { 1225 htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf = 1226 (htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf; 1227 uint8_t i; 1228 uint16_t index = 0; 1229 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1230 char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN); 1231 1232 if (!cmd_result) { 1233 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1234 FL("Output buffer not allocated")); 1235 return; 1236 } 1237 1238 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS); 1239 1240 DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:"); 1241 for (i = 0; i < tag_len; i++) { 1242 index += qdf_snprint(&cmd_result[index], 1243 DP_MAX_STRING_LEN - index, 1244 " %u:%u,", i, dp_stats_buf->cmd_result[i]); 1245 } 1246 DP_PRINT_STATS("cmd_result = %s ", cmd_result); 1247 qdf_mem_free(cmd_result); 1248 } 1249 1250 /* 1251 * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv 1252 * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v 1253 * 1254 * return:void 1255 */ 1256 static inline void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf) 1257 { 1258 htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf = 1259 (htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf; 1260 uint8_t i; 1261 uint16_t index = 0; 1262 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1263 char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN); 1264 1265 if (!cmd_stall_status) { 1266 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1267 FL("Output buffer not allocated")); 1268 return; 1269 } 1270 1271 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS); 1272 1273 DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:"); 1274 for (i = 0; i < tag_len; i++) { 1275 index += qdf_snprint(&cmd_stall_status[index], 1276 DP_MAX_STRING_LEN - index, 1277 " %u:%u,", i, 1278 dp_stats_buf->cmd_stall_status[i]); 1279 } 1280 DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status); 1281 qdf_mem_free(cmd_stall_status); 1282 } 1283 1284 /* 1285 * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats 1286 * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v 1287 * 1288 * return:void 1289 */ 1290 static inline void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf) 1291 { 1292 htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf = 1293 (htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf; 1294 uint8_t i; 1295 uint16_t index = 0; 1296 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1297 char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN); 1298 1299 if (!fes_result) { 1300 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1301 FL("Output buffer not allocated")); 1302 return; 1303 } 1304 1305 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS); 1306 1307 DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:"); 1308 for (i = 0; i < tag_len; i++) { 1309 index += qdf_snprint(&fes_result[index], 1310 DP_MAX_STRING_LEN - index, 1311 " %u:%u,", i, dp_stats_buf->fes_result[i]); 1312 } 1313 DP_PRINT_STATS("fes_result = %s ", fes_result); 1314 qdf_mem_free(fes_result); 1315 } 1316 1317 /* 1318 * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv 1319 * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv 1320 * 1321 * return:void 1322 */ 1323 static inline void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf) 1324 { 1325 htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf = 1326 (htt_tx_selfgen_cmn_stats_tlv *)tag_buf; 1327 1328 DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:"); 1329 DP_PRINT_STATS("mac_id__word = %u", 1330 dp_stats_buf->mac_id__word); 1331 DP_PRINT_STATS("su_bar = %u", 1332 dp_stats_buf->su_bar); 1333 DP_PRINT_STATS("rts = %u", 1334 dp_stats_buf->rts); 1335 DP_PRINT_STATS("cts2self = %u", 1336 dp_stats_buf->cts2self); 1337 DP_PRINT_STATS("qos_null = %u", 1338 dp_stats_buf->qos_null); 1339 DP_PRINT_STATS("delayed_bar_1 = %u", 1340 dp_stats_buf->delayed_bar_1); 1341 DP_PRINT_STATS("delayed_bar_2 = %u", 1342 dp_stats_buf->delayed_bar_2); 1343 DP_PRINT_STATS("delayed_bar_3 = %u", 1344 dp_stats_buf->delayed_bar_3); 1345 DP_PRINT_STATS("delayed_bar_4 = %u", 1346 dp_stats_buf->delayed_bar_4); 1347 DP_PRINT_STATS("delayed_bar_5 = %u", 1348 dp_stats_buf->delayed_bar_5); 1349 DP_PRINT_STATS("delayed_bar_6 = %u", 1350 dp_stats_buf->delayed_bar_6); 1351 DP_PRINT_STATS("delayed_bar_7 = %u\n", 1352 dp_stats_buf->delayed_bar_7); 1353 } 1354 1355 /* 1356 * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv 1357 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv 1358 * 1359 * return:void 1360 */ 1361 static inline void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf) 1362 { 1363 htt_tx_selfgen_ac_stats_tlv *dp_stats_buf = 1364 (htt_tx_selfgen_ac_stats_tlv *)tag_buf; 1365 1366 DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:"); 1367 DP_PRINT_STATS("ac_su_ndpa = %u", 1368 dp_stats_buf->ac_su_ndpa); 1369 DP_PRINT_STATS("ac_su_ndp = %u", 1370 dp_stats_buf->ac_su_ndp); 1371 DP_PRINT_STATS("ac_mu_mimo_ndpa = %u", 1372 dp_stats_buf->ac_mu_mimo_ndpa); 1373 DP_PRINT_STATS("ac_mu_mimo_ndp = %u", 1374 dp_stats_buf->ac_mu_mimo_ndp); 1375 DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u", 1376 dp_stats_buf->ac_mu_mimo_brpoll_1); 1377 DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u", 1378 dp_stats_buf->ac_mu_mimo_brpoll_2); 1379 DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n", 1380 dp_stats_buf->ac_mu_mimo_brpoll_3); 1381 } 1382 1383 /* 1384 * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv 1385 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv 1386 * 1387 * return:void 1388 */ 1389 static inline void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf) 1390 { 1391 htt_tx_selfgen_ax_stats_tlv *dp_stats_buf = 1392 (htt_tx_selfgen_ax_stats_tlv *)tag_buf; 1393 1394 DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:"); 1395 DP_PRINT_STATS("ax_su_ndpa = %u", 1396 dp_stats_buf->ax_su_ndpa); 1397 DP_PRINT_STATS("ax_su_ndp = %u", 1398 dp_stats_buf->ax_su_ndp); 1399 DP_PRINT_STATS("ax_mu_mimo_ndpa = %u", 1400 dp_stats_buf->ax_mu_mimo_ndpa); 1401 DP_PRINT_STATS("ax_mu_mimo_ndp = %u", 1402 dp_stats_buf->ax_mu_mimo_ndp); 1403 DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u", 1404 dp_stats_buf->ax_mu_mimo_brpoll_1); 1405 DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u", 1406 dp_stats_buf->ax_mu_mimo_brpoll_2); 1407 DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u", 1408 dp_stats_buf->ax_mu_mimo_brpoll_3); 1409 DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u", 1410 dp_stats_buf->ax_mu_mimo_brpoll_4); 1411 DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u", 1412 dp_stats_buf->ax_mu_mimo_brpoll_5); 1413 DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u", 1414 dp_stats_buf->ax_mu_mimo_brpoll_6); 1415 DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u", 1416 dp_stats_buf->ax_mu_mimo_brpoll_7); 1417 DP_PRINT_STATS("ax_basic_trigger = %u", 1418 dp_stats_buf->ax_basic_trigger); 1419 DP_PRINT_STATS("ax_bsr_trigger = %u", 1420 dp_stats_buf->ax_bsr_trigger); 1421 DP_PRINT_STATS("ax_mu_bar_trigger = %u", 1422 dp_stats_buf->ax_mu_bar_trigger); 1423 DP_PRINT_STATS("ax_mu_rts_trigger = %u\n", 1424 dp_stats_buf->ax_mu_rts_trigger); 1425 } 1426 1427 /* 1428 * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv 1429 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv 1430 * 1431 * return:void 1432 */ 1433 static inline void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf) 1434 { 1435 htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf = 1436 (htt_tx_selfgen_ac_err_stats_tlv *)tag_buf; 1437 1438 DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:"); 1439 DP_PRINT_STATS("ac_su_ndp_err = %u", 1440 dp_stats_buf->ac_su_ndp_err); 1441 DP_PRINT_STATS("ac_su_ndpa_err = %u", 1442 dp_stats_buf->ac_su_ndpa_err); 1443 DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u", 1444 dp_stats_buf->ac_mu_mimo_ndpa_err); 1445 DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u", 1446 dp_stats_buf->ac_mu_mimo_ndp_err); 1447 DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u", 1448 dp_stats_buf->ac_mu_mimo_brp1_err); 1449 DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u", 1450 dp_stats_buf->ac_mu_mimo_brp2_err); 1451 DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n", 1452 dp_stats_buf->ac_mu_mimo_brp3_err); 1453 } 1454 1455 /* 1456 * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv 1457 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv 1458 * 1459 * return:void 1460 */ 1461 static inline void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf) 1462 { 1463 htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf = 1464 (htt_tx_selfgen_ax_err_stats_tlv *)tag_buf; 1465 1466 DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:"); 1467 DP_PRINT_STATS("ax_su_ndp_err = %u", 1468 dp_stats_buf->ax_su_ndp_err); 1469 DP_PRINT_STATS("ax_su_ndpa_err = %u", 1470 dp_stats_buf->ax_su_ndpa_err); 1471 DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u", 1472 dp_stats_buf->ax_mu_mimo_ndpa_err); 1473 DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u", 1474 dp_stats_buf->ax_mu_mimo_ndp_err); 1475 DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u", 1476 dp_stats_buf->ax_mu_mimo_brp1_err); 1477 DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u", 1478 dp_stats_buf->ax_mu_mimo_brp2_err); 1479 DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u", 1480 dp_stats_buf->ax_mu_mimo_brp3_err); 1481 DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u", 1482 dp_stats_buf->ax_mu_mimo_brp4_err); 1483 DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u", 1484 dp_stats_buf->ax_mu_mimo_brp5_err); 1485 DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u", 1486 dp_stats_buf->ax_mu_mimo_brp6_err); 1487 DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u", 1488 dp_stats_buf->ax_mu_mimo_brp7_err); 1489 DP_PRINT_STATS("ax_basic_trigger_err = %u", 1490 dp_stats_buf->ax_basic_trigger_err); 1491 DP_PRINT_STATS("ax_bsr_trigger_err = %u", 1492 dp_stats_buf->ax_bsr_trigger_err); 1493 DP_PRINT_STATS("ax_mu_bar_trigger_err = %u", 1494 dp_stats_buf->ax_mu_bar_trigger_err); 1495 DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n", 1496 dp_stats_buf->ax_mu_rts_trigger_err); 1497 } 1498 1499 /* 1500 * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats 1501 * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv 1502 * 1503 * return:void 1504 */ 1505 static inline void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf) 1506 { 1507 uint8_t i; 1508 htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf = 1509 (htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf; 1510 1511 DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:"); 1512 DP_PRINT_STATS("mu_mimo_sch_posted = %u", 1513 dp_stats_buf->mu_mimo_sch_posted); 1514 DP_PRINT_STATS("mu_mimo_sch_failed = %u", 1515 dp_stats_buf->mu_mimo_sch_failed); 1516 DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n", 1517 dp_stats_buf->mu_mimo_ppdu_posted); 1518 1519 DP_PRINT_STATS("11ac MU_MIMO SCH STATS:"); 1520 1521 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) { 1522 DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i, 1523 dp_stats_buf->ac_mu_mimo_sch_nusers[i]); 1524 } 1525 1526 DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:"); 1527 1528 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) { 1529 DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i, 1530 dp_stats_buf->ax_mu_mimo_sch_nusers[i]); 1531 } 1532 1533 DP_PRINT_STATS("\n11ax OFDMA SCH STATS:"); 1534 1535 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) { 1536 DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i, 1537 dp_stats_buf->ax_ofdma_sch_nusers[i]); 1538 } 1539 } 1540 1541 /* 1542 * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display 1543 * htt_tx_pdev_mu_mimo_mpdu_stats_tlv 1544 * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv 1545 * 1546 * return:void 1547 */ 1548 static inline void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf) 1549 { 1550 htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf = 1551 (htt_tx_pdev_mpdu_stats_tlv *)tag_buf; 1552 1553 if (dp_stats_buf->tx_sched_mode == 1554 HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) { 1555 if (!dp_stats_buf->user_index) 1556 DP_PRINT_STATS( 1557 "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n"); 1558 1559 if (dp_stats_buf->user_index < 1560 HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) { 1561 DP_PRINT_STATS( 1562 "ac_mu_mimo_mpdus_queued_usr_%u = %u", 1563 dp_stats_buf->user_index, 1564 dp_stats_buf->mpdus_queued_usr); 1565 DP_PRINT_STATS( 1566 "ac_mu_mimo_mpdus_tried_usr_%u = %u", 1567 dp_stats_buf->user_index, 1568 dp_stats_buf->mpdus_tried_usr); 1569 DP_PRINT_STATS( 1570 "ac_mu_mimo_mpdus_failed_usr_%u = %u", 1571 dp_stats_buf->user_index, 1572 dp_stats_buf->mpdus_failed_usr); 1573 DP_PRINT_STATS( 1574 "ac_mu_mimo_mpdus_requeued_usr_%u = %u", 1575 dp_stats_buf->user_index, 1576 dp_stats_buf->mpdus_requeued_usr); 1577 DP_PRINT_STATS( 1578 "ac_mu_mimo_err_no_ba_usr_%u = %u", 1579 dp_stats_buf->user_index, 1580 dp_stats_buf->err_no_ba_usr); 1581 DP_PRINT_STATS( 1582 "ac_mu_mimo_mpdu_underrun_usr_%u = %u", 1583 dp_stats_buf->user_index, 1584 dp_stats_buf->mpdu_underrun_usr); 1585 DP_PRINT_STATS( 1586 "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n", 1587 dp_stats_buf->user_index, 1588 dp_stats_buf->ampdu_underrun_usr); 1589 } 1590 } 1591 1592 if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) { 1593 if (!dp_stats_buf->user_index) 1594 DP_PRINT_STATS( 1595 "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n"); 1596 1597 if (dp_stats_buf->user_index < 1598 HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) { 1599 DP_PRINT_STATS( 1600 "ax_mu_mimo_mpdus_queued_usr_%u = %u", 1601 dp_stats_buf->user_index, 1602 dp_stats_buf->mpdus_queued_usr); 1603 DP_PRINT_STATS( 1604 "ax_mu_mimo_mpdus_tried_usr_%u = %u", 1605 dp_stats_buf->user_index, 1606 dp_stats_buf->mpdus_tried_usr); 1607 DP_PRINT_STATS( 1608 "ax_mu_mimo_mpdus_failed_usr_%u = %u", 1609 dp_stats_buf->user_index, 1610 dp_stats_buf->mpdus_failed_usr); 1611 DP_PRINT_STATS( 1612 "ax_mu_mimo_mpdus_requeued_usr_%u = %u", 1613 dp_stats_buf->user_index, 1614 dp_stats_buf->mpdus_requeued_usr); 1615 DP_PRINT_STATS( 1616 "ax_mu_mimo_err_no_ba_usr_%u = %u", 1617 dp_stats_buf->user_index, 1618 dp_stats_buf->err_no_ba_usr); 1619 DP_PRINT_STATS( 1620 "ax_mu_mimo_mpdu_underrun_usr_%u = %u", 1621 dp_stats_buf->user_index, 1622 dp_stats_buf->mpdu_underrun_usr); 1623 DP_PRINT_STATS( 1624 "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n", 1625 dp_stats_buf->user_index, 1626 dp_stats_buf->ampdu_underrun_usr); 1627 } 1628 } 1629 1630 if (dp_stats_buf->tx_sched_mode == 1631 HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) { 1632 if (!dp_stats_buf->user_index) 1633 DP_PRINT_STATS( 1634 "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n"); 1635 1636 if (dp_stats_buf->user_index < 1637 HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) { 1638 DP_PRINT_STATS( 1639 "ax_mu_ofdma_mpdus_queued_usr_%u = %u", 1640 dp_stats_buf->user_index, 1641 dp_stats_buf->mpdus_queued_usr); 1642 DP_PRINT_STATS( 1643 "ax_mu_ofdma_mpdus_tried_usr_%u = %u", 1644 dp_stats_buf->user_index, 1645 dp_stats_buf->mpdus_tried_usr); 1646 DP_PRINT_STATS( 1647 "ax_mu_ofdma_mpdus_failed_usr_%u = %u", 1648 dp_stats_buf->user_index, 1649 dp_stats_buf->mpdus_failed_usr); 1650 DP_PRINT_STATS( 1651 "ax_mu_ofdma_mpdus_requeued_usr_%u = %u", 1652 dp_stats_buf->user_index, 1653 dp_stats_buf->mpdus_requeued_usr); 1654 DP_PRINT_STATS( 1655 "ax_mu_ofdma_err_no_ba_usr_%u = %u", 1656 dp_stats_buf->user_index, 1657 dp_stats_buf->err_no_ba_usr); 1658 DP_PRINT_STATS( 1659 "ax_mu_ofdma_mpdu_underrun_usr_%u = %u", 1660 dp_stats_buf->user_index, 1661 dp_stats_buf->mpdu_underrun_usr); 1662 DP_PRINT_STATS( 1663 "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n", 1664 dp_stats_buf->user_index, 1665 dp_stats_buf->ampdu_underrun_usr); 1666 } 1667 } 1668 } 1669 1670 /* 1671 * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v 1672 * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v 1673 * 1674 * return:void 1675 */ 1676 static inline void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf) 1677 { 1678 htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf = 1679 (htt_sched_txq_cmd_posted_tlv_v *)tag_buf; 1680 uint8_t i; 1681 uint16_t index = 0; 1682 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1683 char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN); 1684 1685 if (!sched_cmd_posted) { 1686 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1687 FL("Output buffer not allocated")); 1688 return; 1689 } 1690 1691 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX); 1692 1693 DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:"); 1694 for (i = 0; i < tag_len; i++) { 1695 index += qdf_snprint(&sched_cmd_posted[index], 1696 DP_MAX_STRING_LEN - index, 1697 " %u:%u,", i, 1698 dp_stats_buf->sched_cmd_posted[i]); 1699 } 1700 DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted); 1701 qdf_mem_free(sched_cmd_posted); 1702 } 1703 1704 /* 1705 * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v 1706 * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v 1707 * 1708 * return:void 1709 */ 1710 static inline void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf) 1711 { 1712 htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf = 1713 (htt_sched_txq_cmd_reaped_tlv_v *)tag_buf; 1714 uint8_t i; 1715 uint16_t index = 0; 1716 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1717 char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN); 1718 1719 if (!sched_cmd_reaped) { 1720 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1721 FL("Output buffer not allocated")); 1722 return; 1723 } 1724 1725 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX); 1726 1727 DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:"); 1728 for (i = 0; i < tag_len; i++) { 1729 index += qdf_snprint(&sched_cmd_reaped[index], 1730 DP_MAX_STRING_LEN - index, 1731 " %u:%u,", i, 1732 dp_stats_buf->sched_cmd_reaped[i]); 1733 } 1734 DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped); 1735 qdf_mem_free(sched_cmd_reaped); 1736 } 1737 1738 /* 1739 * dp_print_tx_pdev_stats_sched_per_txq_tlv: display 1740 * htt_tx_pdev_stats_sched_per_txq_tlv 1741 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv 1742 * 1743 * return:void 1744 */ 1745 static inline void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf) 1746 { 1747 htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf = 1748 (htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf; 1749 1750 DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:"); 1751 DP_PRINT_STATS("mac_id__txq_id__word = %u", 1752 dp_stats_buf->mac_id__txq_id__word); 1753 DP_PRINT_STATS("sched_policy = %u", 1754 dp_stats_buf->sched_policy); 1755 DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u", 1756 dp_stats_buf->last_sched_cmd_posted_timestamp); 1757 DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u", 1758 dp_stats_buf->last_sched_cmd_compl_timestamp); 1759 DP_PRINT_STATS("sched_2_tac_lwm_count = %u", 1760 dp_stats_buf->sched_2_tac_lwm_count); 1761 DP_PRINT_STATS("sched_2_tac_ring_full = %u", 1762 dp_stats_buf->sched_2_tac_ring_full); 1763 DP_PRINT_STATS("sched_cmd_post_failure = %u", 1764 dp_stats_buf->sched_cmd_post_failure); 1765 DP_PRINT_STATS("num_active_tids = %u", 1766 dp_stats_buf->num_active_tids); 1767 DP_PRINT_STATS("num_ps_schedules = %u", 1768 dp_stats_buf->num_ps_schedules); 1769 DP_PRINT_STATS("sched_cmds_pending = %u", 1770 dp_stats_buf->sched_cmds_pending); 1771 DP_PRINT_STATS("num_tid_register = %u", 1772 dp_stats_buf->num_tid_register); 1773 DP_PRINT_STATS("num_tid_unregister = %u", 1774 dp_stats_buf->num_tid_unregister); 1775 DP_PRINT_STATS("num_qstats_queried = %u", 1776 dp_stats_buf->num_qstats_queried); 1777 DP_PRINT_STATS("qstats_update_pending = %u", 1778 dp_stats_buf->qstats_update_pending); 1779 DP_PRINT_STATS("last_qstats_query_timestamp = %u", 1780 dp_stats_buf->last_qstats_query_timestamp); 1781 DP_PRINT_STATS("num_tqm_cmdq_full = %u", 1782 dp_stats_buf->num_tqm_cmdq_full); 1783 DP_PRINT_STATS("num_de_sched_algo_trigger = %u", 1784 dp_stats_buf->num_de_sched_algo_trigger); 1785 DP_PRINT_STATS("num_rt_sched_algo_trigger = %u", 1786 dp_stats_buf->num_rt_sched_algo_trigger); 1787 DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u", 1788 dp_stats_buf->num_tqm_sched_algo_trigger); 1789 DP_PRINT_STATS("notify_sched = %u\n", 1790 dp_stats_buf->notify_sched); 1791 } 1792 1793 /* 1794 * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv 1795 * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv 1796 * 1797 * return:void 1798 */ 1799 static inline void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf) 1800 { 1801 htt_stats_tx_sched_cmn_tlv *dp_stats_buf = 1802 (htt_stats_tx_sched_cmn_tlv *)tag_buf; 1803 1804 DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:"); 1805 DP_PRINT_STATS("mac_id__word = %u", 1806 dp_stats_buf->mac_id__word); 1807 DP_PRINT_STATS("current_timestamp = %u\n", 1808 dp_stats_buf->current_timestamp); 1809 } 1810 1811 /* 1812 * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v 1813 * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v 1814 * 1815 * return:void 1816 */ 1817 static inline void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf) 1818 { 1819 htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf = 1820 (htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf; 1821 uint8_t i; 1822 uint16_t index = 0; 1823 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1824 char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN); 1825 1826 if (!gen_mpdu_end_reason) { 1827 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1828 FL("Output buffer not allocated")); 1829 return; 1830 } 1831 1832 tag_len = qdf_min(tag_len, 1833 (uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON); 1834 1835 DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:"); 1836 for (i = 0; i < tag_len; i++) { 1837 index += qdf_snprint(&gen_mpdu_end_reason[index], 1838 DP_MAX_STRING_LEN - index, 1839 " %u:%u,", i, 1840 dp_stats_buf->gen_mpdu_end_reason[i]); 1841 } 1842 DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason); 1843 qdf_mem_free(gen_mpdu_end_reason); 1844 } 1845 1846 /* 1847 * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv 1848 * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v 1849 * 1850 * return:void 1851 */ 1852 static inline void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf) 1853 { 1854 htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf = 1855 (htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf; 1856 uint8_t i; 1857 uint16_t index = 0; 1858 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1859 char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN); 1860 1861 if (!list_mpdu_end_reason) { 1862 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1863 FL("Output buffer not allocated")); 1864 return; 1865 } 1866 1867 tag_len = qdf_min(tag_len, 1868 (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON); 1869 1870 DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:"); 1871 for (i = 0; i < tag_len; i++) { 1872 index += qdf_snprint(&list_mpdu_end_reason[index], 1873 DP_MAX_STRING_LEN - index, 1874 " %u:%u,", i, 1875 dp_stats_buf->list_mpdu_end_reason[i]); 1876 } 1877 DP_PRINT_STATS("list_mpdu_end_reason = %s\n", 1878 list_mpdu_end_reason); 1879 qdf_mem_free(list_mpdu_end_reason); 1880 } 1881 1882 /* 1883 * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v 1884 * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v 1885 * 1886 * return:void 1887 */ 1888 static inline void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf) 1889 { 1890 htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf = 1891 (htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf; 1892 uint8_t i; 1893 uint16_t index = 0; 1894 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1895 char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN); 1896 1897 if (!list_mpdu_cnt_hist) { 1898 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1899 FL("Output buffer not allocated")); 1900 return; 1901 } 1902 1903 tag_len = qdf_min(tag_len, 1904 (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS); 1905 1906 DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:"); 1907 for (i = 0; i < tag_len; i++) { 1908 index += qdf_snprint(&list_mpdu_cnt_hist[index], 1909 DP_MAX_STRING_LEN - index, 1910 " %u:%u,", i, 1911 dp_stats_buf->list_mpdu_cnt_hist[i]); 1912 } 1913 DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist); 1914 qdf_mem_free(list_mpdu_cnt_hist); 1915 } 1916 1917 /* 1918 * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v 1919 * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v 1920 * 1921 * return:void 1922 */ 1923 static inline void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf) 1924 { 1925 htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf = 1926 (htt_tx_tqm_pdev_stats_tlv_v *)tag_buf; 1927 1928 DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:"); 1929 DP_PRINT_STATS("msdu_count = %u", 1930 dp_stats_buf->msdu_count); 1931 DP_PRINT_STATS("mpdu_count = %u", 1932 dp_stats_buf->mpdu_count); 1933 DP_PRINT_STATS("remove_msdu = %u", 1934 dp_stats_buf->remove_msdu); 1935 DP_PRINT_STATS("remove_mpdu = %u", 1936 dp_stats_buf->remove_mpdu); 1937 DP_PRINT_STATS("remove_msdu_ttl = %u", 1938 dp_stats_buf->remove_msdu_ttl); 1939 DP_PRINT_STATS("send_bar = %u", 1940 dp_stats_buf->send_bar); 1941 DP_PRINT_STATS("bar_sync = %u", 1942 dp_stats_buf->bar_sync); 1943 DP_PRINT_STATS("notify_mpdu = %u", 1944 dp_stats_buf->notify_mpdu); 1945 DP_PRINT_STATS("sync_cmd = %u", 1946 dp_stats_buf->sync_cmd); 1947 DP_PRINT_STATS("write_cmd = %u", 1948 dp_stats_buf->write_cmd); 1949 DP_PRINT_STATS("hwsch_trigger = %u", 1950 dp_stats_buf->hwsch_trigger); 1951 DP_PRINT_STATS("ack_tlv_proc = %u", 1952 dp_stats_buf->ack_tlv_proc); 1953 DP_PRINT_STATS("gen_mpdu_cmd = %u", 1954 dp_stats_buf->gen_mpdu_cmd); 1955 DP_PRINT_STATS("gen_list_cmd = %u", 1956 dp_stats_buf->gen_list_cmd); 1957 DP_PRINT_STATS("remove_mpdu_cmd = %u", 1958 dp_stats_buf->remove_mpdu_cmd); 1959 DP_PRINT_STATS("remove_mpdu_tried_cmd = %u", 1960 dp_stats_buf->remove_mpdu_tried_cmd); 1961 DP_PRINT_STATS("mpdu_queue_stats_cmd = %u", 1962 dp_stats_buf->mpdu_queue_stats_cmd); 1963 DP_PRINT_STATS("mpdu_head_info_cmd = %u", 1964 dp_stats_buf->mpdu_head_info_cmd); 1965 DP_PRINT_STATS("msdu_flow_stats_cmd = %u", 1966 dp_stats_buf->msdu_flow_stats_cmd); 1967 DP_PRINT_STATS("remove_msdu_cmd = %u", 1968 dp_stats_buf->remove_msdu_cmd); 1969 DP_PRINT_STATS("remove_msdu_ttl_cmd = %u", 1970 dp_stats_buf->remove_msdu_ttl_cmd); 1971 DP_PRINT_STATS("flush_cache_cmd = %u", 1972 dp_stats_buf->flush_cache_cmd); 1973 DP_PRINT_STATS("update_mpduq_cmd = %u", 1974 dp_stats_buf->update_mpduq_cmd); 1975 DP_PRINT_STATS("enqueue = %u", 1976 dp_stats_buf->enqueue); 1977 DP_PRINT_STATS("enqueue_notify = %u", 1978 dp_stats_buf->enqueue_notify); 1979 DP_PRINT_STATS("notify_mpdu_at_head = %u", 1980 dp_stats_buf->notify_mpdu_at_head); 1981 DP_PRINT_STATS("notify_mpdu_state_valid = %u\n", 1982 dp_stats_buf->notify_mpdu_state_valid); 1983 } 1984 1985 /* 1986 * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv 1987 * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv 1988 * 1989 * return:void 1990 */ 1991 static inline void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf) 1992 { 1993 htt_tx_tqm_cmn_stats_tlv *dp_stats_buf = 1994 (htt_tx_tqm_cmn_stats_tlv *)tag_buf; 1995 1996 DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:"); 1997 DP_PRINT_STATS("mac_id__word = %u", 1998 dp_stats_buf->mac_id__word); 1999 DP_PRINT_STATS("max_cmdq_id = %u", 2000 dp_stats_buf->max_cmdq_id); 2001 DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u", 2002 dp_stats_buf->list_mpdu_cnt_hist_intvl); 2003 DP_PRINT_STATS("add_msdu = %u", 2004 dp_stats_buf->add_msdu); 2005 DP_PRINT_STATS("q_empty = %u", 2006 dp_stats_buf->q_empty); 2007 DP_PRINT_STATS("q_not_empty = %u", 2008 dp_stats_buf->q_not_empty); 2009 DP_PRINT_STATS("drop_notification = %u", 2010 dp_stats_buf->drop_notification); 2011 DP_PRINT_STATS("desc_threshold = %u\n", 2012 dp_stats_buf->desc_threshold); 2013 } 2014 2015 /* 2016 * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv 2017 * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv 2018 * 2019 * return:void 2020 */ 2021 static inline void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf) 2022 { 2023 htt_tx_tqm_error_stats_tlv *dp_stats_buf = 2024 (htt_tx_tqm_error_stats_tlv *)tag_buf; 2025 2026 DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:"); 2027 DP_PRINT_STATS("q_empty_failure = %u", 2028 dp_stats_buf->q_empty_failure); 2029 DP_PRINT_STATS("q_not_empty_failure = %u", 2030 dp_stats_buf->q_not_empty_failure); 2031 DP_PRINT_STATS("add_msdu_failure = %u\n", 2032 dp_stats_buf->add_msdu_failure); 2033 } 2034 2035 /* 2036 * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv 2037 * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv 2038 * 2039 * return:void 2040 */ 2041 static inline void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf) 2042 { 2043 htt_tx_tqm_cmdq_status_tlv *dp_stats_buf = 2044 (htt_tx_tqm_cmdq_status_tlv *)tag_buf; 2045 2046 DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:"); 2047 DP_PRINT_STATS("mac_id__cmdq_id__word = %u", 2048 dp_stats_buf->mac_id__cmdq_id__word); 2049 DP_PRINT_STATS("sync_cmd = %u", 2050 dp_stats_buf->sync_cmd); 2051 DP_PRINT_STATS("write_cmd = %u", 2052 dp_stats_buf->write_cmd); 2053 DP_PRINT_STATS("gen_mpdu_cmd = %u", 2054 dp_stats_buf->gen_mpdu_cmd); 2055 DP_PRINT_STATS("mpdu_queue_stats_cmd = %u", 2056 dp_stats_buf->mpdu_queue_stats_cmd); 2057 DP_PRINT_STATS("mpdu_head_info_cmd = %u", 2058 dp_stats_buf->mpdu_head_info_cmd); 2059 DP_PRINT_STATS("msdu_flow_stats_cmd = %u", 2060 dp_stats_buf->msdu_flow_stats_cmd); 2061 DP_PRINT_STATS("remove_mpdu_cmd = %u", 2062 dp_stats_buf->remove_mpdu_cmd); 2063 DP_PRINT_STATS("remove_msdu_cmd = %u", 2064 dp_stats_buf->remove_msdu_cmd); 2065 DP_PRINT_STATS("flush_cache_cmd = %u", 2066 dp_stats_buf->flush_cache_cmd); 2067 DP_PRINT_STATS("update_mpduq_cmd = %u", 2068 dp_stats_buf->update_mpduq_cmd); 2069 DP_PRINT_STATS("update_msduq_cmd = %u\n", 2070 dp_stats_buf->update_msduq_cmd); 2071 } 2072 2073 /* 2074 * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats 2075 * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv 2076 * 2077 * return:void 2078 */ 2079 static inline void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf) 2080 { 2081 htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf = 2082 (htt_tx_de_eapol_packets_stats_tlv *)tag_buf; 2083 2084 DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:"); 2085 DP_PRINT_STATS("m1_packets = %u", 2086 dp_stats_buf->m1_packets); 2087 DP_PRINT_STATS("m2_packets = %u", 2088 dp_stats_buf->m2_packets); 2089 DP_PRINT_STATS("m3_packets = %u", 2090 dp_stats_buf->m3_packets); 2091 DP_PRINT_STATS("m4_packets = %u", 2092 dp_stats_buf->m4_packets); 2093 DP_PRINT_STATS("g1_packets = %u", 2094 dp_stats_buf->g1_packets); 2095 DP_PRINT_STATS("g2_packets = %u\n", 2096 dp_stats_buf->g2_packets); 2097 } 2098 2099 /* 2100 * dp_print_tx_de_classify_failed_stats_tlv: display 2101 * htt_tx_de_classify_failed_stats_tlv 2102 * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv 2103 * 2104 * return:void 2105 */ 2106 static inline void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf) 2107 { 2108 htt_tx_de_classify_failed_stats_tlv *dp_stats_buf = 2109 (htt_tx_de_classify_failed_stats_tlv *)tag_buf; 2110 2111 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:"); 2112 DP_PRINT_STATS("ap_bss_peer_not_found = %u", 2113 dp_stats_buf->ap_bss_peer_not_found); 2114 DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u", 2115 dp_stats_buf->ap_bcast_mcast_no_peer); 2116 DP_PRINT_STATS("sta_delete_in_progress = %u", 2117 dp_stats_buf->sta_delete_in_progress); 2118 DP_PRINT_STATS("ibss_no_bss_peer = %u", 2119 dp_stats_buf->ibss_no_bss_peer); 2120 DP_PRINT_STATS("invaild_vdev_type = %u", 2121 dp_stats_buf->invaild_vdev_type); 2122 DP_PRINT_STATS("invalid_ast_peer_entry = %u", 2123 dp_stats_buf->invalid_ast_peer_entry); 2124 DP_PRINT_STATS("peer_entry_invalid = %u", 2125 dp_stats_buf->peer_entry_invalid); 2126 DP_PRINT_STATS("ethertype_not_ip = %u", 2127 dp_stats_buf->ethertype_not_ip); 2128 DP_PRINT_STATS("eapol_lookup_failed = %u", 2129 dp_stats_buf->eapol_lookup_failed); 2130 DP_PRINT_STATS("qpeer_not_allow_data = %u", 2131 dp_stats_buf->qpeer_not_allow_data); 2132 DP_PRINT_STATS("fse_tid_override = %u\n", 2133 dp_stats_buf->fse_tid_override); 2134 } 2135 2136 /* 2137 * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv 2138 * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv 2139 * 2140 * return:void 2141 */ 2142 static inline void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf) 2143 { 2144 htt_tx_de_classify_stats_tlv *dp_stats_buf = 2145 (htt_tx_de_classify_stats_tlv *)tag_buf; 2146 2147 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:"); 2148 DP_PRINT_STATS("arp_packets = %u", 2149 dp_stats_buf->arp_packets); 2150 DP_PRINT_STATS("igmp_packets = %u", 2151 dp_stats_buf->igmp_packets); 2152 DP_PRINT_STATS("dhcp_packets = %u", 2153 dp_stats_buf->dhcp_packets); 2154 DP_PRINT_STATS("host_inspected = %u", 2155 dp_stats_buf->host_inspected); 2156 DP_PRINT_STATS("htt_included = %u", 2157 dp_stats_buf->htt_included); 2158 DP_PRINT_STATS("htt_valid_mcs = %u", 2159 dp_stats_buf->htt_valid_mcs); 2160 DP_PRINT_STATS("htt_valid_nss = %u", 2161 dp_stats_buf->htt_valid_nss); 2162 DP_PRINT_STATS("htt_valid_preamble_type = %u", 2163 dp_stats_buf->htt_valid_preamble_type); 2164 DP_PRINT_STATS("htt_valid_chainmask = %u", 2165 dp_stats_buf->htt_valid_chainmask); 2166 DP_PRINT_STATS("htt_valid_guard_interval = %u", 2167 dp_stats_buf->htt_valid_guard_interval); 2168 DP_PRINT_STATS("htt_valid_retries = %u", 2169 dp_stats_buf->htt_valid_retries); 2170 DP_PRINT_STATS("htt_valid_bw_info = %u", 2171 dp_stats_buf->htt_valid_bw_info); 2172 DP_PRINT_STATS("htt_valid_power = %u", 2173 dp_stats_buf->htt_valid_power); 2174 DP_PRINT_STATS("htt_valid_key_flags = %u", 2175 dp_stats_buf->htt_valid_key_flags); 2176 DP_PRINT_STATS("htt_valid_no_encryption = %u", 2177 dp_stats_buf->htt_valid_no_encryption); 2178 DP_PRINT_STATS("fse_entry_count = %u", 2179 dp_stats_buf->fse_entry_count); 2180 DP_PRINT_STATS("fse_priority_be = %u", 2181 dp_stats_buf->fse_priority_be); 2182 DP_PRINT_STATS("fse_priority_high = %u", 2183 dp_stats_buf->fse_priority_high); 2184 DP_PRINT_STATS("fse_priority_low = %u", 2185 dp_stats_buf->fse_priority_low); 2186 DP_PRINT_STATS("fse_traffic_ptrn_be = %u", 2187 dp_stats_buf->fse_traffic_ptrn_be); 2188 DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u", 2189 dp_stats_buf->fse_traffic_ptrn_over_sub); 2190 DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u", 2191 dp_stats_buf->fse_traffic_ptrn_bursty); 2192 DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u", 2193 dp_stats_buf->fse_traffic_ptrn_interactive); 2194 DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u", 2195 dp_stats_buf->fse_traffic_ptrn_periodic); 2196 DP_PRINT_STATS("fse_hwqueue_alloc = %u", 2197 dp_stats_buf->fse_hwqueue_alloc); 2198 DP_PRINT_STATS("fse_hwqueue_created = %u", 2199 dp_stats_buf->fse_hwqueue_created); 2200 DP_PRINT_STATS("fse_hwqueue_send_to_host = %u", 2201 dp_stats_buf->fse_hwqueue_send_to_host); 2202 DP_PRINT_STATS("mcast_entry = %u", 2203 dp_stats_buf->mcast_entry); 2204 DP_PRINT_STATS("bcast_entry = %u\n", 2205 dp_stats_buf->bcast_entry); 2206 } 2207 2208 /* 2209 * dp_print_tx_de_classify_status_stats_tlv: display 2210 * htt_tx_de_classify_status_stats_tlv 2211 * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv 2212 * 2213 * return:void 2214 */ 2215 static inline void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf) 2216 { 2217 htt_tx_de_classify_status_stats_tlv *dp_stats_buf = 2218 (htt_tx_de_classify_status_stats_tlv *)tag_buf; 2219 2220 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:"); 2221 DP_PRINT_STATS("eok = %u", 2222 dp_stats_buf->eok); 2223 DP_PRINT_STATS("classify_done = %u", 2224 dp_stats_buf->classify_done); 2225 DP_PRINT_STATS("lookup_failed = %u", 2226 dp_stats_buf->lookup_failed); 2227 DP_PRINT_STATS("send_host_dhcp = %u", 2228 dp_stats_buf->send_host_dhcp); 2229 DP_PRINT_STATS("send_host_mcast = %u", 2230 dp_stats_buf->send_host_mcast); 2231 DP_PRINT_STATS("send_host_unknown_dest = %u", 2232 dp_stats_buf->send_host_unknown_dest); 2233 DP_PRINT_STATS("send_host = %u", 2234 dp_stats_buf->send_host); 2235 DP_PRINT_STATS("status_invalid = %u\n", 2236 dp_stats_buf->status_invalid); 2237 } 2238 2239 /* 2240 * dp_print_tx_de_enqueue_packets_stats_tlv: display 2241 * htt_tx_de_enqueue_packets_stats_tlv 2242 * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv 2243 * 2244 * return:void 2245 */ 2246 static inline void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf) 2247 { 2248 htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf = 2249 (htt_tx_de_enqueue_packets_stats_tlv *)tag_buf; 2250 2251 DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:"); 2252 DP_PRINT_STATS("enqueued_pkts = %u", 2253 dp_stats_buf->enqueued_pkts); 2254 DP_PRINT_STATS("to_tqm = %u", 2255 dp_stats_buf->to_tqm); 2256 DP_PRINT_STATS("to_tqm_bypass = %u\n", 2257 dp_stats_buf->to_tqm_bypass); 2258 } 2259 2260 /* 2261 * dp_print_tx_de_enqueue_discard_stats_tlv: display 2262 * htt_tx_de_enqueue_discard_stats_tlv 2263 * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv 2264 * 2265 * return:void 2266 */ 2267 static inline void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf) 2268 { 2269 htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf = 2270 (htt_tx_de_enqueue_discard_stats_tlv *)tag_buf; 2271 2272 DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:"); 2273 DP_PRINT_STATS("discarded_pkts = %u", 2274 dp_stats_buf->discarded_pkts); 2275 DP_PRINT_STATS("local_frames = %u", 2276 dp_stats_buf->local_frames); 2277 DP_PRINT_STATS("is_ext_msdu = %u\n", 2278 dp_stats_buf->is_ext_msdu); 2279 } 2280 2281 /* 2282 * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv 2283 * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv 2284 * 2285 * return:void 2286 */ 2287 static inline void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf) 2288 { 2289 htt_tx_de_compl_stats_tlv *dp_stats_buf = 2290 (htt_tx_de_compl_stats_tlv *)tag_buf; 2291 2292 DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:"); 2293 DP_PRINT_STATS("tcl_dummy_frame = %u", 2294 dp_stats_buf->tcl_dummy_frame); 2295 DP_PRINT_STATS("tqm_dummy_frame = %u", 2296 dp_stats_buf->tqm_dummy_frame); 2297 DP_PRINT_STATS("tqm_notify_frame = %u", 2298 dp_stats_buf->tqm_notify_frame); 2299 DP_PRINT_STATS("fw2wbm_enq = %u", 2300 dp_stats_buf->fw2wbm_enq); 2301 DP_PRINT_STATS("tqm_bypass_frame = %u\n", 2302 dp_stats_buf->tqm_bypass_frame); 2303 } 2304 2305 /* 2306 * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv 2307 * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv 2308 * 2309 * return:void 2310 */ 2311 static inline void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf) 2312 { 2313 htt_tx_de_cmn_stats_tlv *dp_stats_buf = 2314 (htt_tx_de_cmn_stats_tlv *)tag_buf; 2315 2316 DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:"); 2317 DP_PRINT_STATS("mac_id__word = %u", 2318 dp_stats_buf->mac_id__word); 2319 DP_PRINT_STATS("tcl2fw_entry_count = %u", 2320 dp_stats_buf->tcl2fw_entry_count); 2321 DP_PRINT_STATS("not_to_fw = %u", 2322 dp_stats_buf->not_to_fw); 2323 DP_PRINT_STATS("invalid_pdev_vdev_peer = %u", 2324 dp_stats_buf->invalid_pdev_vdev_peer); 2325 DP_PRINT_STATS("tcl_res_invalid_addrx = %u", 2326 dp_stats_buf->tcl_res_invalid_addrx); 2327 DP_PRINT_STATS("wbm2fw_entry_count = %u", 2328 dp_stats_buf->wbm2fw_entry_count); 2329 DP_PRINT_STATS("invalid_pdev = %u\n", 2330 dp_stats_buf->invalid_pdev); 2331 } 2332 2333 /* 2334 * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv 2335 * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv 2336 * 2337 * return:void 2338 */ 2339 static inline void dp_print_ring_if_stats_tlv(uint32_t *tag_buf) 2340 { 2341 htt_ring_if_stats_tlv *dp_stats_buf = 2342 (htt_ring_if_stats_tlv *)tag_buf; 2343 uint8_t i; 2344 uint16_t index = 0; 2345 char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN); 2346 2347 if (!wm_hit_count) { 2348 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 2349 FL("Output buffer not allocated")); 2350 return; 2351 } 2352 2353 DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:"); 2354 DP_PRINT_STATS("base_addr = %u", 2355 dp_stats_buf->base_addr); 2356 DP_PRINT_STATS("elem_size = %u", 2357 dp_stats_buf->elem_size); 2358 DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u", 2359 dp_stats_buf->num_elems__prefetch_tail_idx); 2360 DP_PRINT_STATS("head_idx__tail_idx = %u", 2361 dp_stats_buf->head_idx__tail_idx); 2362 DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u", 2363 dp_stats_buf->shadow_head_idx__shadow_tail_idx); 2364 DP_PRINT_STATS("num_tail_incr = %u", 2365 dp_stats_buf->num_tail_incr); 2366 DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u", 2367 dp_stats_buf->lwm_thresh__hwm_thresh); 2368 DP_PRINT_STATS("overrun_hit_count = %u", 2369 dp_stats_buf->overrun_hit_count); 2370 DP_PRINT_STATS("underrun_hit_count = %u", 2371 dp_stats_buf->underrun_hit_count); 2372 DP_PRINT_STATS("prod_blockwait_count = %u", 2373 dp_stats_buf->prod_blockwait_count); 2374 DP_PRINT_STATS("cons_blockwait_count = %u", 2375 dp_stats_buf->cons_blockwait_count); 2376 2377 for (i = 0; i < DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) { 2378 index += qdf_snprint(&wm_hit_count[index], 2379 DP_MAX_STRING_LEN - index, 2380 " %u:%u,", i, 2381 dp_stats_buf->low_wm_hit_count[i]); 2382 } 2383 DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count); 2384 2385 qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN); 2386 2387 index = 0; 2388 for (i = 0; i < DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) { 2389 index += qdf_snprint(&wm_hit_count[index], 2390 DP_MAX_STRING_LEN - index, 2391 " %u:%u,", i, 2392 dp_stats_buf->high_wm_hit_count[i]); 2393 } 2394 DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count); 2395 } 2396 2397 /* 2398 * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv 2399 * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv 2400 * 2401 * return:void 2402 */ 2403 static inline void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf) 2404 { 2405 htt_ring_if_cmn_tlv *dp_stats_buf = 2406 (htt_ring_if_cmn_tlv *)tag_buf; 2407 2408 DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:"); 2409 DP_PRINT_STATS("mac_id__word = %u", 2410 dp_stats_buf->mac_id__word); 2411 DP_PRINT_STATS("num_records = %u\n", 2412 dp_stats_buf->num_records); 2413 } 2414 2415 /* 2416 * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v 2417 * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v 2418 * 2419 * return:void 2420 */ 2421 static inline void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf) 2422 { 2423 htt_sfm_client_user_tlv_v *dp_stats_buf = 2424 (htt_sfm_client_user_tlv_v *)tag_buf; 2425 uint8_t i; 2426 uint16_t index = 0; 2427 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2428 char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN); 2429 2430 if (!dwords_used_by_user_n) { 2431 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 2432 FL("Output buffer not allocated")); 2433 return; 2434 } 2435 2436 DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:"); 2437 for (i = 0; i < tag_len; i++) { 2438 index += qdf_snprint(&dwords_used_by_user_n[index], 2439 DP_MAX_STRING_LEN - index, 2440 " %u:%u,", i, 2441 dp_stats_buf->dwords_used_by_user_n[i]); 2442 } 2443 DP_PRINT_STATS("dwords_used_by_user_n = %s\n", 2444 dwords_used_by_user_n); 2445 qdf_mem_free(dwords_used_by_user_n); 2446 } 2447 2448 /* 2449 * dp_print_sfm_client_tlv: display htt_sfm_client_tlv 2450 * @tag_buf: buffer containing the tlv htt_sfm_client_tlv 2451 * 2452 * return:void 2453 */ 2454 static inline void dp_print_sfm_client_tlv(uint32_t *tag_buf) 2455 { 2456 htt_sfm_client_tlv *dp_stats_buf = 2457 (htt_sfm_client_tlv *)tag_buf; 2458 2459 DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:"); 2460 DP_PRINT_STATS("client_id = %u", 2461 dp_stats_buf->client_id); 2462 DP_PRINT_STATS("buf_min = %u", 2463 dp_stats_buf->buf_min); 2464 DP_PRINT_STATS("buf_max = %u", 2465 dp_stats_buf->buf_max); 2466 DP_PRINT_STATS("buf_busy = %u", 2467 dp_stats_buf->buf_busy); 2468 DP_PRINT_STATS("buf_alloc = %u", 2469 dp_stats_buf->buf_alloc); 2470 DP_PRINT_STATS("buf_avail = %u", 2471 dp_stats_buf->buf_avail); 2472 DP_PRINT_STATS("num_users = %u\n", 2473 dp_stats_buf->num_users); 2474 } 2475 2476 /* 2477 * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv 2478 * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv 2479 * 2480 * return:void 2481 */ 2482 static inline void dp_print_sfm_cmn_tlv(uint32_t *tag_buf) 2483 { 2484 htt_sfm_cmn_tlv *dp_stats_buf = 2485 (htt_sfm_cmn_tlv *)tag_buf; 2486 2487 DP_PRINT_STATS("HTT_SFM_CMN_TLV:"); 2488 DP_PRINT_STATS("mac_id__word = %u", 2489 dp_stats_buf->mac_id__word); 2490 DP_PRINT_STATS("buf_total = %u", 2491 dp_stats_buf->buf_total); 2492 DP_PRINT_STATS("mem_empty = %u", 2493 dp_stats_buf->mem_empty); 2494 DP_PRINT_STATS("deallocate_bufs = %u", 2495 dp_stats_buf->deallocate_bufs); 2496 DP_PRINT_STATS("num_records = %u\n", 2497 dp_stats_buf->num_records); 2498 } 2499 2500 /* 2501 * dp_print_sring_stats_tlv: display htt_sring_stats_tlv 2502 * @tag_buf: buffer containing the tlv htt_sring_stats_tlv 2503 * 2504 * return:void 2505 */ 2506 static inline void dp_print_sring_stats_tlv(uint32_t *tag_buf) 2507 { 2508 htt_sring_stats_tlv *dp_stats_buf = 2509 (htt_sring_stats_tlv *)tag_buf; 2510 2511 DP_PRINT_STATS("HTT_SRING_STATS_TLV:"); 2512 DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u", 2513 dp_stats_buf->mac_id__ring_id__arena__ep); 2514 DP_PRINT_STATS("base_addr_lsb = %u", 2515 dp_stats_buf->base_addr_lsb); 2516 DP_PRINT_STATS("base_addr_msb = %u", 2517 dp_stats_buf->base_addr_msb); 2518 DP_PRINT_STATS("ring_size = %u", 2519 dp_stats_buf->ring_size); 2520 DP_PRINT_STATS("elem_size = %u", 2521 dp_stats_buf->elem_size); 2522 DP_PRINT_STATS("num_avail_words__num_valid_words = %u", 2523 dp_stats_buf->num_avail_words__num_valid_words); 2524 DP_PRINT_STATS("head_ptr__tail_ptr = %u", 2525 dp_stats_buf->head_ptr__tail_ptr); 2526 DP_PRINT_STATS("consumer_empty__producer_full = %u", 2527 dp_stats_buf->consumer_empty__producer_full); 2528 DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n", 2529 dp_stats_buf->prefetch_count__internal_tail_ptr); 2530 } 2531 2532 /* 2533 * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv 2534 * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv 2535 * 2536 * return:void 2537 */ 2538 static inline void dp_print_sring_cmn_tlv(uint32_t *tag_buf) 2539 { 2540 htt_sring_cmn_tlv *dp_stats_buf = 2541 (htt_sring_cmn_tlv *)tag_buf; 2542 2543 DP_PRINT_STATS("HTT_SRING_CMN_TLV:"); 2544 DP_PRINT_STATS("num_records = %u\n", 2545 dp_stats_buf->num_records); 2546 } 2547 2548 /* 2549 * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv 2550 * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv 2551 * 2552 * return:void 2553 */ 2554 static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf) 2555 { 2556 htt_tx_pdev_rate_stats_tlv *dp_stats_buf = 2557 (htt_tx_pdev_rate_stats_tlv *)tag_buf; 2558 uint8_t i, j; 2559 uint16_t index = 0; 2560 char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 2561 char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 2562 char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 2563 char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 2564 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 2565 2566 if (!str_buf) { 2567 dp_err("Output buffer not allocated"); 2568 return; 2569 } 2570 2571 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 2572 tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 2573 if (!tx_gi[i]) { 2574 dp_err("Unable to allocate buffer for tx_gi"); 2575 goto fail1; 2576 } 2577 ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 2578 if (!ac_mu_mimo_tx_gi[i]) { 2579 dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi"); 2580 goto fail2; 2581 } 2582 ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 2583 if (!ax_mu_mimo_tx_gi[i]) { 2584 dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi"); 2585 goto fail3; 2586 } 2587 ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 2588 if (!ofdma_tx_gi[i]) { 2589 dp_err("Unable to allocate buffer for ofdma_tx_gi"); 2590 goto fail4; 2591 } 2592 } 2593 2594 DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:"); 2595 DP_PRINT_STATS("mac_id__word = %u", 2596 dp_stats_buf->mac_id__word); 2597 DP_PRINT_STATS("tx_ldpc = %u", 2598 dp_stats_buf->tx_ldpc); 2599 DP_PRINT_STATS("rts_cnt = %u", 2600 dp_stats_buf->rts_cnt); 2601 DP_PRINT_STATS("rts_success = %u", 2602 dp_stats_buf->rts_success); 2603 2604 DP_PRINT_STATS("ack_rssi = %u", 2605 dp_stats_buf->ack_rssi); 2606 2607 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2608 for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) { 2609 index += qdf_snprint(&str_buf[index], 2610 DP_MAX_STRING_LEN - index, 2611 " %u:%u,", i, dp_stats_buf->tx_mcs[i]); 2612 } 2613 DP_PRINT_STATS("tx_mcs = %s ", str_buf); 2614 2615 index = 0; 2616 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2617 for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) { 2618 index += qdf_snprint(&str_buf[index], 2619 DP_MAX_STRING_LEN - index, 2620 " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]); 2621 } 2622 DP_PRINT_STATS("tx_su_mcs = %s ", str_buf); 2623 2624 index = 0; 2625 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2626 for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) { 2627 index += qdf_snprint(&str_buf[index], 2628 DP_MAX_STRING_LEN - index, 2629 " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]); 2630 } 2631 DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf); 2632 2633 index = 0; 2634 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2635 for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) { 2636 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 2637 index += qdf_snprint(&str_buf[index], 2638 DP_MAX_STRING_LEN - index, 2639 " %u:%u,", (i + 1), 2640 dp_stats_buf->tx_nss[i]); 2641 } 2642 DP_PRINT_STATS("tx_nss = %s ", str_buf); 2643 2644 index = 0; 2645 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2646 for (i = 0; i < DP_HTT_TX_BW_LEN; i++) { 2647 index += qdf_snprint(&str_buf[index], 2648 DP_MAX_STRING_LEN - index, 2649 " %u:%u,", i, dp_stats_buf->tx_bw[i]); 2650 } 2651 DP_PRINT_STATS("tx_bw = %s ", str_buf); 2652 2653 index = 0; 2654 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2655 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2656 index += qdf_snprint(&str_buf[index], 2657 DP_MAX_STRING_LEN - index, 2658 " %u:%u,", i, dp_stats_buf->tx_stbc[i]); 2659 } 2660 DP_PRINT_STATS("tx_stbc = %s ", str_buf); 2661 2662 index = 0; 2663 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2664 for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) { 2665 index += qdf_snprint(&str_buf[index], 2666 DP_MAX_STRING_LEN - index, 2667 " %u:%u,", i, dp_stats_buf->tx_pream[i]); 2668 } 2669 DP_PRINT_STATS("tx_pream = %s ", str_buf); 2670 2671 for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) { 2672 index = 0; 2673 qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN); 2674 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2675 index += qdf_snprint(&tx_gi[j][index], 2676 DP_MAX_STRING_LEN - index, 2677 " %u:%u,", i, 2678 dp_stats_buf->tx_gi[j][i]); 2679 } 2680 DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]); 2681 } 2682 2683 index = 0; 2684 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2685 for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) { 2686 index += qdf_snprint(&str_buf[index], 2687 DP_MAX_STRING_LEN - index, 2688 " %u:%u,", i, dp_stats_buf->tx_dcm[i]); 2689 } 2690 DP_PRINT_STATS("tx_dcm = %s\n", str_buf); 2691 2692 DP_PRINT_STATS("rts_success = %u", 2693 dp_stats_buf->rts_success); 2694 DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u", 2695 dp_stats_buf->ac_mu_mimo_tx_ldpc); 2696 DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u", 2697 dp_stats_buf->ax_mu_mimo_tx_ldpc); 2698 DP_PRINT_STATS("ofdma_tx_ldpc = %u", 2699 dp_stats_buf->ofdma_tx_ldpc); 2700 2701 index = 0; 2702 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2703 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) { 2704 index += qdf_snprint(&str_buf[index], 2705 DP_MAX_STRING_LEN - index, 2706 " %u:%u,", 2707 i, dp_stats_buf->tx_legacy_cck_rate[i]); 2708 } 2709 DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf); 2710 2711 index = 0; 2712 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2713 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) { 2714 index += qdf_snprint(&str_buf[index], 2715 DP_MAX_STRING_LEN - index, 2716 " %u:%u,", i, 2717 dp_stats_buf->tx_legacy_ofdm_rate[i]); 2718 } 2719 DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf); 2720 2721 index = 0; 2722 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2723 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LTF; i++) { 2724 index += qdf_snprint(&str_buf[index], 2725 DP_MAX_STRING_LEN - index, 2726 " %u:%u,", 2727 i, dp_stats_buf->tx_he_ltf[i]); 2728 } 2729 DP_PRINT_STATS("tx_he_ltf = %s ", str_buf); 2730 2731 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2732 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2733 index += qdf_snprint(&str_buf[index], 2734 DP_MAX_STRING_LEN - index, 2735 " %u:%u,", 2736 i, dp_stats_buf->ofdma_tx_mcs[i]); 2737 } 2738 DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf); 2739 2740 index = 0; 2741 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2742 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2743 index += qdf_snprint(&str_buf[index], 2744 DP_MAX_STRING_LEN - index, 2745 " %u:%u,", 2746 i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]); 2747 } 2748 DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf); 2749 2750 index = 0; 2751 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2752 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2753 index += qdf_snprint(&str_buf[index], 2754 DP_MAX_STRING_LEN - index, 2755 " %u:%u,", 2756 i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]); 2757 } 2758 DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf); 2759 2760 index = 0; 2761 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2762 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2763 index += qdf_snprint(&str_buf[index], 2764 DP_MAX_STRING_LEN - index, 2765 " %u:%u,", 2766 i, dp_stats_buf->ofdma_tx_mcs[i]); 2767 } 2768 DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf); 2769 2770 index = 0; 2771 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2772 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 2773 index += qdf_snprint(&str_buf[index], 2774 DP_MAX_STRING_LEN - index, 2775 " %u:%u,", 2776 i, dp_stats_buf->ac_mu_mimo_tx_nss[i]); 2777 } 2778 DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf); 2779 2780 index = 0; 2781 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2782 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 2783 index += qdf_snprint(&str_buf[index], 2784 DP_MAX_STRING_LEN - index, 2785 " %u:%u,", 2786 i, dp_stats_buf->ax_mu_mimo_tx_nss[i]); 2787 } 2788 DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf); 2789 2790 index = 0; 2791 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2792 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 2793 index += qdf_snprint(&str_buf[index], 2794 DP_MAX_STRING_LEN - index, 2795 " %u:%u,", 2796 i, dp_stats_buf->ofdma_tx_nss[i]); 2797 } 2798 DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf); 2799 2800 index = 0; 2801 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2802 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 2803 index += qdf_snprint(&str_buf[index], 2804 DP_MAX_STRING_LEN - index, 2805 " %u:%u,", 2806 i, dp_stats_buf->ac_mu_mimo_tx_bw[i]); 2807 } 2808 DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf); 2809 2810 index = 0; 2811 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2812 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 2813 index += qdf_snprint(&str_buf[index], 2814 DP_MAX_STRING_LEN - index, 2815 " %u:%u,", 2816 i, dp_stats_buf->ax_mu_mimo_tx_bw[i]); 2817 } 2818 DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf); 2819 2820 index = 0; 2821 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2822 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 2823 index += qdf_snprint(&str_buf[index], 2824 DP_MAX_STRING_LEN - index, 2825 " %u:%u,", 2826 i, dp_stats_buf->ofdma_tx_bw[i]); 2827 } 2828 2829 DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf); 2830 2831 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 2832 index = 0; 2833 qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN); 2834 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2835 index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index], 2836 DP_MAX_STRING_LEN - index, 2837 " %u:%u,", i, 2838 dp_stats_buf-> 2839 ac_mu_mimo_tx_gi[j][i]); 2840 } 2841 DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ", 2842 j, ac_mu_mimo_tx_gi[j]); 2843 } 2844 2845 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 2846 index = 0; 2847 qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN); 2848 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2849 index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index], 2850 DP_MAX_STRING_LEN - index, 2851 " %u:%u,", i, 2852 dp_stats_buf->ax_mu_mimo_tx_gi[j][i]); 2853 } 2854 DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ", 2855 j, ax_mu_mimo_tx_gi[j]); 2856 } 2857 2858 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 2859 index = 0; 2860 qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN); 2861 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2862 index += qdf_snprint(&ofdma_tx_gi[j][index], 2863 DP_MAX_STRING_LEN - index, 2864 " %u:%u,", i, 2865 dp_stats_buf->ofdma_tx_gi[j][i]); 2866 } 2867 DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ", 2868 j, ofdma_tx_gi[j]); 2869 } 2870 2871 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 2872 qdf_mem_free(ofdma_tx_gi[i]); 2873 2874 fail4: 2875 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 2876 qdf_mem_free(ax_mu_mimo_tx_gi[i]); 2877 fail3: 2878 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 2879 qdf_mem_free(ac_mu_mimo_tx_gi[i]); 2880 fail2: 2881 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 2882 qdf_mem_free(tx_gi[i]); 2883 2884 fail1: 2885 qdf_mem_free(str_buf); 2886 } 2887 2888 /* 2889 * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv 2890 * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv 2891 * 2892 * return:void 2893 */ 2894 static inline void dp_print_rx_pdev_rate_stats_tlv(uint32_t *tag_buf) 2895 { 2896 htt_rx_pdev_rate_stats_tlv *dp_stats_buf = 2897 (htt_rx_pdev_rate_stats_tlv *)tag_buf; 2898 uint8_t i, j; 2899 uint16_t index = 0; 2900 char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN]; 2901 char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS]; 2902 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 2903 char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 2904 2905 if (!str_buf) { 2906 dp_err("Output buffer not allocated"); 2907 return; 2908 } 2909 2910 for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) { 2911 rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 2912 if (!rssi_chain[i]) { 2913 dp_err("Unable to allocate buffer for rssi_chain"); 2914 goto fail1; 2915 } 2916 } 2917 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 2918 rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 2919 if (!rx_gi[i]) { 2920 dp_err("Unable to allocate buffer for rx_gi"); 2921 goto fail2; 2922 } 2923 } 2924 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 2925 ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 2926 if (!ul_ofdma_rx_gi[i]) { 2927 dp_err("Unable to allocate buffer for ul_ofdma_rx_gi"); 2928 goto fail3; 2929 } 2930 } 2931 2932 DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:"); 2933 DP_PRINT_STATS("mac_id__word = %u", 2934 dp_stats_buf->mac_id__word); 2935 DP_PRINT_STATS("nsts = %u", 2936 dp_stats_buf->nsts); 2937 DP_PRINT_STATS("rx_ldpc = %u", 2938 dp_stats_buf->rx_ldpc); 2939 DP_PRINT_STATS("rts_cnt = %u", 2940 dp_stats_buf->rts_cnt); 2941 DP_PRINT_STATS("rssi_mgmt = %u", 2942 dp_stats_buf->rssi_mgmt); 2943 DP_PRINT_STATS("rssi_data = %u", 2944 dp_stats_buf->rssi_data); 2945 DP_PRINT_STATS("rssi_comb = %u", 2946 dp_stats_buf->rssi_comb); 2947 DP_PRINT_STATS("rx_in_dbm = %u", 2948 dp_stats_buf->rssi_in_dbm); 2949 DP_PRINT_STATS("rx_11ax_su_ext = %u", 2950 dp_stats_buf->rx_11ax_su_ext); 2951 DP_PRINT_STATS("rx_11ac_mumimo = %u", 2952 dp_stats_buf->rx_11ac_mumimo); 2953 DP_PRINT_STATS("rx_11ax_mumimo = %u", 2954 dp_stats_buf->rx_11ax_mumimo); 2955 DP_PRINT_STATS("rx_11ax_ofdma = %u", 2956 dp_stats_buf->rx_11ax_ofdma); 2957 DP_PRINT_STATS("txbf = %u", 2958 dp_stats_buf->txbf); 2959 2960 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2961 for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) { 2962 index += qdf_snprint(&str_buf[index], 2963 DP_MAX_STRING_LEN - index, 2964 " %u:%u,", i, dp_stats_buf->rx_mcs[i]); 2965 } 2966 DP_PRINT_STATS("rx_mcs = %s ", str_buf); 2967 2968 index = 0; 2969 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2970 for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) { 2971 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 2972 index += qdf_snprint(&str_buf[index], 2973 DP_MAX_STRING_LEN - index, 2974 " %u:%u,", (i + 1), 2975 dp_stats_buf->rx_nss[i]); 2976 } 2977 DP_PRINT_STATS("rx_nss = %s ", str_buf); 2978 2979 index = 0; 2980 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2981 for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) { 2982 index += qdf_snprint(&str_buf[index], 2983 DP_MAX_STRING_LEN - index, 2984 " %u:%u,", i, dp_stats_buf->rx_dcm[i]); 2985 } 2986 DP_PRINT_STATS("rx_dcm = %s ", str_buf); 2987 2988 index = 0; 2989 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2990 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 2991 index += qdf_snprint(&str_buf[index], 2992 DP_MAX_STRING_LEN - index, 2993 " %u:%u,", i, dp_stats_buf->rx_stbc[i]); 2994 } 2995 DP_PRINT_STATS("rx_stbc = %s ", str_buf); 2996 2997 index = 0; 2998 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 2999 for (i = 0; i < DP_HTT_RX_BW_LEN; i++) { 3000 index += qdf_snprint(&str_buf[index], 3001 DP_MAX_STRING_LEN - index, 3002 " %u:%u,", i, dp_stats_buf->rx_bw[i]); 3003 } 3004 DP_PRINT_STATS("rx_bw = %s ", str_buf); 3005 3006 for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) { 3007 index = 0; 3008 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3009 index += qdf_snprint(&rssi_chain[j][index], 3010 DP_MAX_STRING_LEN - index, 3011 " %u:%u,", i, 3012 dp_stats_buf->rssi_chain[j][i]); 3013 } 3014 DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]); 3015 } 3016 3017 for (j = 0; j < DP_HTT_RX_GI_LEN; j++) { 3018 index = 0; 3019 qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN); 3020 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3021 index += qdf_snprint(&rx_gi[j][index], 3022 DP_MAX_STRING_LEN - index, 3023 " %u:%u,", i, 3024 dp_stats_buf->rx_gi[j][i]); 3025 } 3026 DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]); 3027 } 3028 3029 index = 0; 3030 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3031 for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) { 3032 index += qdf_snprint(&str_buf[index], 3033 DP_MAX_STRING_LEN - index, 3034 " %u:%u,", 3035 i, 3036 dp_stats_buf->rx_pream[i]); 3037 } 3038 DP_PRINT_STATS("rx_pream = %s", str_buf); 3039 3040 index = 0; 3041 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3042 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) { 3043 index += qdf_snprint(&str_buf[index], 3044 DP_MAX_STRING_LEN - index, 3045 " %u:%u,", 3046 i, 3047 dp_stats_buf->rx_legacy_cck_rate[i]); 3048 } 3049 DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf); 3050 3051 index = 0; 3052 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3053 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) { 3054 index += qdf_snprint(&str_buf[index], 3055 DP_MAX_STRING_LEN - index, 3056 " %u:%u,", 3057 i, 3058 dp_stats_buf->rx_legacy_ofdm_rate[i]); 3059 } 3060 DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf); 3061 3062 index = 0; 3063 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3064 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3065 index += qdf_snprint(&str_buf[index], 3066 DP_MAX_STRING_LEN - index, 3067 " %u:%u,", 3068 i, dp_stats_buf->ul_ofdma_rx_mcs[i]); 3069 } 3070 DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf); 3071 3072 DP_PRINT_STATS("rx_11ax_ul_ofdma = %u", 3073 dp_stats_buf->rx_11ax_ul_ofdma); 3074 3075 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3076 index = 0; 3077 qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN); 3078 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3079 index += qdf_snprint(&ul_ofdma_rx_gi[j][index], 3080 DP_MAX_STRING_LEN - index, 3081 " %u:%u,", i, 3082 dp_stats_buf-> 3083 ul_ofdma_rx_gi[j][i]); 3084 } 3085 DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ", 3086 j, ul_ofdma_rx_gi[j]); 3087 } 3088 3089 index = 0; 3090 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3091 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3092 index += qdf_snprint(&str_buf[index], 3093 DP_MAX_STRING_LEN - index, 3094 " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]); 3095 } 3096 DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf); 3097 3098 index = 0; 3099 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3100 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3101 index += qdf_snprint(&str_buf[index], 3102 DP_MAX_STRING_LEN - index, 3103 " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]); 3104 } 3105 DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf); 3106 DP_PRINT_STATS("ul_ofdma_rx_stbc = %u", 3107 dp_stats_buf->ul_ofdma_rx_stbc); 3108 DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u", 3109 dp_stats_buf->ul_ofdma_rx_ldpc); 3110 3111 index = 0; 3112 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3113 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3114 index += qdf_snprint(&str_buf[index], 3115 DP_MAX_STRING_LEN - index, 3116 " %u:%u,", i, 3117 dp_stats_buf->rx_ulofdma_non_data_ppdu[i]); 3118 } 3119 DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf); 3120 3121 index = 0; 3122 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3123 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3124 index += qdf_snprint(&str_buf[index], 3125 DP_MAX_STRING_LEN - index, 3126 " %u:%u,", 3127 i, dp_stats_buf->rx_ulofdma_data_ppdu[i]); 3128 } 3129 DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf); 3130 3131 index = 0; 3132 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3133 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3134 index += qdf_snprint(&str_buf[index], 3135 DP_MAX_STRING_LEN - index, 3136 " %u:%u,", 3137 i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]); 3138 } 3139 DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf); 3140 3141 index = 0; 3142 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3143 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3144 index += qdf_snprint(&str_buf[index], 3145 DP_MAX_STRING_LEN - index, 3146 " %u:%u,", 3147 i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]); 3148 } 3149 DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf); 3150 3151 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 3152 qdf_mem_free(ul_ofdma_rx_gi[i]); 3153 3154 fail3: 3155 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) 3156 qdf_mem_free(rx_gi[i]); 3157 fail2: 3158 for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) 3159 qdf_mem_free(rssi_chain[i]); 3160 fail1: 3161 qdf_mem_free(str_buf); 3162 3163 } 3164 3165 /* 3166 * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv 3167 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv 3168 * 3169 * return:void 3170 */ 3171 static inline void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf) 3172 { 3173 htt_rx_soc_fw_stats_tlv *dp_stats_buf = 3174 (htt_rx_soc_fw_stats_tlv *)tag_buf; 3175 3176 DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:"); 3177 DP_PRINT_STATS("fw_reo_ring_data_msdu = %u", 3178 dp_stats_buf->fw_reo_ring_data_msdu); 3179 DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u", 3180 dp_stats_buf->fw_to_host_data_msdu_bcmc); 3181 DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u", 3182 dp_stats_buf->fw_to_host_data_msdu_uc); 3183 DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u", 3184 dp_stats_buf->ofld_remote_data_buf_recycle_cnt); 3185 DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u", 3186 dp_stats_buf->ofld_remote_free_buf_indication_cnt); 3187 DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ", 3188 dp_stats_buf->ofld_buf_to_host_data_msdu_uc); 3189 DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ", 3190 dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc); 3191 DP_PRINT_STATS("wbm_sw_ring_reap = %u ", 3192 dp_stats_buf->wbm_sw_ring_reap); 3193 DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ", 3194 dp_stats_buf->wbm_forward_to_host_cnt); 3195 DP_PRINT_STATS("wbm_target_recycle_cnt = %u ", 3196 dp_stats_buf->wbm_target_recycle_cnt); 3197 DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u", 3198 dp_stats_buf->target_refill_ring_recycle_cnt); 3199 3200 } 3201 3202 /* 3203 * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display 3204 * htt_rx_soc_fw_refill_ring_empty_tlv_v 3205 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v 3206 * 3207 * return:void 3208 */ 3209 static inline void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf) 3210 { 3211 htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf = 3212 (htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf; 3213 uint8_t i; 3214 uint16_t index = 0; 3215 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 3216 char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN); 3217 3218 if (!refill_ring_empty_cnt) { 3219 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 3220 FL("Output buffer not allocated")); 3221 return; 3222 } 3223 3224 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING); 3225 3226 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:"); 3227 for (i = 0; i < tag_len; i++) { 3228 index += qdf_snprint(&refill_ring_empty_cnt[index], 3229 DP_MAX_STRING_LEN - index, 3230 " %u:%u,", i, 3231 dp_stats_buf->refill_ring_empty_cnt[i]); 3232 } 3233 DP_PRINT_STATS("refill_ring_empty_cnt = %s\n", 3234 refill_ring_empty_cnt); 3235 qdf_mem_free(refill_ring_empty_cnt); 3236 } 3237 3238 /* 3239 * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display 3240 * htt_rx_soc_fw_refill_ring_num_refill_tlv_v 3241 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv 3242 * 3243 * return:void 3244 */ 3245 static inline void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 3246 uint32_t *tag_buf) 3247 { 3248 htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf = 3249 (htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf; 3250 uint8_t i; 3251 uint16_t index = 0; 3252 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 3253 char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN); 3254 3255 if (!refill_ring_num_refill) { 3256 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 3257 FL("Output buffer not allocated")); 3258 return; 3259 } 3260 3261 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS); 3262 3263 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:"); 3264 for (i = 0; i < tag_len; i++) { 3265 index += qdf_snprint(&refill_ring_num_refill[index], 3266 DP_MAX_STRING_LEN - index, 3267 " %u:%u,", i, 3268 dp_stats_buf->refill_ring_num_refill[i]); 3269 } 3270 DP_PRINT_STATS("refill_ring_num_refill = %s\n", 3271 refill_ring_num_refill); 3272 qdf_mem_free(refill_ring_num_refill); 3273 } 3274 3275 /* 3276 * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv 3277 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv 3278 * 3279 * return:void 3280 */ 3281 static inline void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf) 3282 { 3283 htt_rx_pdev_fw_stats_tlv *dp_stats_buf = 3284 (htt_rx_pdev_fw_stats_tlv *)tag_buf; 3285 uint8_t i; 3286 uint16_t index = 0; 3287 char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN]; 3288 char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN]; 3289 3290 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:"); 3291 DP_PRINT_STATS("mac_id__word = %u", 3292 dp_stats_buf->mac_id__word); 3293 DP_PRINT_STATS("ppdu_recvd = %u", 3294 dp_stats_buf->ppdu_recvd); 3295 DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u", 3296 dp_stats_buf->mpdu_cnt_fcs_ok); 3297 DP_PRINT_STATS("mpdu_cnt_fcs_err = %u", 3298 dp_stats_buf->mpdu_cnt_fcs_err); 3299 DP_PRINT_STATS("tcp_msdu_cnt = %u", 3300 dp_stats_buf->tcp_msdu_cnt); 3301 DP_PRINT_STATS("tcp_ack_msdu_cnt = %u", 3302 dp_stats_buf->tcp_ack_msdu_cnt); 3303 DP_PRINT_STATS("udp_msdu_cnt = %u", 3304 dp_stats_buf->udp_msdu_cnt); 3305 DP_PRINT_STATS("other_msdu_cnt = %u", 3306 dp_stats_buf->other_msdu_cnt); 3307 DP_PRINT_STATS("fw_ring_mpdu_ind = %u", 3308 dp_stats_buf->fw_ring_mpdu_ind); 3309 3310 for (i = 0; i < DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) { 3311 index += qdf_snprint(&fw_ring_mgmt_subtype[index], 3312 DP_MAX_STRING_LEN - index, 3313 " %u:%u,", i, 3314 dp_stats_buf->fw_ring_mgmt_subtype[i]); 3315 } 3316 DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype); 3317 3318 index = 0; 3319 for (i = 0; i < DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) { 3320 index += qdf_snprint(&fw_ring_ctrl_subtype[index], 3321 DP_MAX_STRING_LEN - index, 3322 " %u:%u,", i, 3323 dp_stats_buf->fw_ring_ctrl_subtype[i]); 3324 } 3325 DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype); 3326 DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u", 3327 dp_stats_buf->fw_ring_mcast_data_msdu); 3328 DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u", 3329 dp_stats_buf->fw_ring_bcast_data_msdu); 3330 DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u", 3331 dp_stats_buf->fw_ring_ucast_data_msdu); 3332 DP_PRINT_STATS("fw_ring_null_data_msdu = %u", 3333 dp_stats_buf->fw_ring_null_data_msdu); 3334 DP_PRINT_STATS("fw_ring_mpdu_drop = %u", 3335 dp_stats_buf->fw_ring_mpdu_drop); 3336 DP_PRINT_STATS("ofld_local_data_ind_cnt = %u", 3337 dp_stats_buf->ofld_local_data_ind_cnt); 3338 DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u", 3339 dp_stats_buf->ofld_local_data_buf_recycle_cnt); 3340 DP_PRINT_STATS("drx_local_data_ind_cnt = %u", 3341 dp_stats_buf->drx_local_data_ind_cnt); 3342 DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u", 3343 dp_stats_buf->drx_local_data_buf_recycle_cnt); 3344 DP_PRINT_STATS("local_nondata_ind_cnt = %u", 3345 dp_stats_buf->local_nondata_ind_cnt); 3346 DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u", 3347 dp_stats_buf->local_nondata_buf_recycle_cnt); 3348 DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u", 3349 dp_stats_buf->fw_status_buf_ring_refill_cnt); 3350 DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u", 3351 dp_stats_buf->fw_status_buf_ring_empty_cnt); 3352 DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u", 3353 dp_stats_buf->fw_pkt_buf_ring_refill_cnt); 3354 DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u", 3355 dp_stats_buf->fw_pkt_buf_ring_empty_cnt); 3356 DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u", 3357 dp_stats_buf->fw_link_buf_ring_refill_cnt); 3358 DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u", 3359 dp_stats_buf->fw_link_buf_ring_empty_cnt); 3360 DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u", 3361 dp_stats_buf->host_pkt_buf_ring_refill_cnt); 3362 DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u", 3363 dp_stats_buf->host_pkt_buf_ring_empty_cnt); 3364 DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u", 3365 dp_stats_buf->mon_pkt_buf_ring_refill_cnt); 3366 DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u", 3367 dp_stats_buf->mon_pkt_buf_ring_empty_cnt); 3368 DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u", 3369 dp_stats_buf->mon_status_buf_ring_refill_cnt); 3370 DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u", 3371 dp_stats_buf->mon_status_buf_ring_empty_cnt); 3372 DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u", 3373 dp_stats_buf->mon_desc_buf_ring_refill_cnt); 3374 DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u", 3375 dp_stats_buf->mon_desc_buf_ring_empty_cnt); 3376 DP_PRINT_STATS("mon_dest_ring_update_cnt = %u", 3377 dp_stats_buf->mon_dest_ring_update_cnt); 3378 DP_PRINT_STATS("mon_dest_ring_full_cnt = %u", 3379 dp_stats_buf->mon_dest_ring_full_cnt); 3380 DP_PRINT_STATS("rx_suspend_cnt = %u", 3381 dp_stats_buf->rx_suspend_cnt); 3382 DP_PRINT_STATS("rx_suspend_fail_cnt = %u", 3383 dp_stats_buf->rx_suspend_fail_cnt); 3384 DP_PRINT_STATS("rx_resume_cnt = %u", 3385 dp_stats_buf->rx_resume_cnt); 3386 DP_PRINT_STATS("rx_resume_fail_cnt = %u", 3387 dp_stats_buf->rx_resume_fail_cnt); 3388 DP_PRINT_STATS("rx_ring_switch_cnt = %u", 3389 dp_stats_buf->rx_ring_switch_cnt); 3390 DP_PRINT_STATS("rx_ring_restore_cnt = %u", 3391 dp_stats_buf->rx_ring_restore_cnt); 3392 DP_PRINT_STATS("rx_flush_cnt = %u\n", 3393 dp_stats_buf->rx_flush_cnt); 3394 } 3395 3396 /* 3397 * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display 3398 * htt_rx_pdev_fw_ring_mpdu_err_tlv_v 3399 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v 3400 * 3401 * return:void 3402 */ 3403 static inline void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf) 3404 { 3405 htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf = 3406 (htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf; 3407 uint8_t i; 3408 uint16_t index = 0; 3409 char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN); 3410 3411 if (!fw_ring_mpdu_err) { 3412 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 3413 FL("Output buffer not allocated")); 3414 return; 3415 } 3416 3417 DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:"); 3418 for (i = 0; i < DP_HTT_FW_RING_MPDU_ERR_LEN; i++) { 3419 index += qdf_snprint(&fw_ring_mpdu_err[index], 3420 DP_MAX_STRING_LEN - index, 3421 " %u:%u,", i, 3422 dp_stats_buf->fw_ring_mpdu_err[i]); 3423 } 3424 DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err); 3425 qdf_mem_free(fw_ring_mpdu_err); 3426 } 3427 3428 /* 3429 * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v 3430 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v 3431 * 3432 * return:void 3433 */ 3434 static inline void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf) 3435 { 3436 htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf = 3437 (htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf; 3438 uint8_t i; 3439 uint16_t index = 0; 3440 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 3441 char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN); 3442 3443 if (!fw_mpdu_drop) { 3444 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 3445 FL("Output buffer not allocated")); 3446 return; 3447 } 3448 3449 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX); 3450 3451 DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:"); 3452 for (i = 0; i < tag_len; i++) { 3453 index += qdf_snprint(&fw_mpdu_drop[index], 3454 DP_MAX_STRING_LEN - index, 3455 " %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]); 3456 } 3457 DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop); 3458 qdf_mem_free(fw_mpdu_drop); 3459 } 3460 3461 /* 3462 * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error 3463 * packets 3464 * 3465 * tag_buf - Buffer 3466 * Return - NULL 3467 */ 3468 static inline void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf) 3469 { 3470 htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf = 3471 (htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf; 3472 3473 uint8_t i; 3474 uint16_t index = 0; 3475 char rxdma_err_cnt[DP_MAX_STRING_LEN]; 3476 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 3477 3478 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE); 3479 3480 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V"); 3481 3482 for (i = 0; i < tag_len; i++) { 3483 index += snprintf(&rxdma_err_cnt[index], 3484 DP_MAX_STRING_LEN - index, 3485 " %u:%u,", i, 3486 dp_stats_buf->rxdma_err[i]); 3487 } 3488 3489 DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt); 3490 } 3491 3492 /* 3493 * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error 3494 * packets 3495 * 3496 * tag_buf - Buffer 3497 * Return - NULL 3498 */ 3499 static inline void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf) 3500 { 3501 htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf = 3502 (htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf; 3503 3504 uint8_t i; 3505 uint16_t index = 0; 3506 char reo_err_cnt[DP_MAX_STRING_LEN]; 3507 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 3508 3509 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE); 3510 3511 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V"); 3512 3513 for (i = 0; i < tag_len; i++) { 3514 index += snprintf(&reo_err_cnt[index], 3515 DP_MAX_STRING_LEN - index, 3516 " %u:%u,", i, 3517 dp_stats_buf->reo_err[i]); 3518 } 3519 3520 DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt); 3521 } 3522 3523 /* 3524 * dp_print_rx_reo_debug_stats_tlv() - REO Statistics 3525 * 3526 * tag_buf - Buffer 3527 * Return - NULL 3528 */ 3529 static inline void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf) 3530 { 3531 htt_rx_reo_resource_stats_tlv_v *dp_stats_buf = 3532 (htt_rx_reo_resource_stats_tlv_v *)tag_buf; 3533 3534 DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV"); 3535 3536 DP_PRINT_STATS("sample_id: %u ", 3537 dp_stats_buf->sample_id); 3538 DP_PRINT_STATS("total_max: %u ", 3539 dp_stats_buf->total_max); 3540 DP_PRINT_STATS("total_avg: %u ", 3541 dp_stats_buf->total_avg); 3542 DP_PRINT_STATS("total_sample: %u ", 3543 dp_stats_buf->total_sample); 3544 DP_PRINT_STATS("non_zeros_avg: %u ", 3545 dp_stats_buf->non_zeros_avg); 3546 DP_PRINT_STATS("non_zeros_sample: %u ", 3547 dp_stats_buf->non_zeros_sample); 3548 DP_PRINT_STATS("last_non_zeros_max: %u ", 3549 dp_stats_buf->last_non_zeros_max); 3550 DP_PRINT_STATS("last_non_zeros_min: %u ", 3551 dp_stats_buf->last_non_zeros_min); 3552 DP_PRINT_STATS("last_non_zeros_avg: %u ", 3553 dp_stats_buf->last_non_zeros_avg); 3554 DP_PRINT_STATS("last_non_zeros_sample: %u\n ", 3555 dp_stats_buf->last_non_zeros_sample); 3556 } 3557 3558 /* 3559 * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors 3560 * 3561 * tag_buf - Buffer 3562 * Return - NULL 3563 */ 3564 static inline void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf) 3565 { 3566 htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf = 3567 (htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf; 3568 3569 uint8_t i = 0; 3570 uint16_t index = 0; 3571 char phy_errs[DP_MAX_STRING_LEN]; 3572 3573 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV"); 3574 3575 DP_PRINT_STATS("mac_id_word: %u", 3576 dp_stats_buf->mac_id__word); 3577 DP_PRINT_STATS("total_phy_err_cnt: %u", 3578 dp_stats_buf->total_phy_err_cnt); 3579 3580 for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) { 3581 index += snprintf(&phy_errs[index], 3582 DP_MAX_STRING_LEN - index, 3583 " %u:%u,", i, dp_stats_buf->phy_err[i]); 3584 } 3585 3586 DP_PRINT_STATS("phy_errs: %s\n", phy_errs); 3587 } 3588 3589 /* 3590 * dp_htt_stats_print_tag: function to select the tag type and 3591 * print the corresponding tag structure 3592 * @tag_type: tag type that is to be printed 3593 * @tag_buf: pointer to the tag structure 3594 * 3595 * return: void 3596 */ 3597 void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf) 3598 { 3599 switch (tag_type) { 3600 case HTT_STATS_TX_PDEV_CMN_TAG: 3601 dp_print_tx_pdev_stats_cmn_tlv(tag_buf); 3602 break; 3603 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 3604 dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf); 3605 break; 3606 case HTT_STATS_TX_PDEV_SIFS_TAG: 3607 dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf); 3608 break; 3609 case HTT_STATS_TX_PDEV_FLUSH_TAG: 3610 dp_print_tx_pdev_stats_flush_tlv_v(tag_buf); 3611 break; 3612 3613 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 3614 dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf); 3615 break; 3616 3617 case HTT_STATS_STRING_TAG: 3618 dp_print_stats_string_tlv(tag_buf); 3619 break; 3620 3621 case HTT_STATS_TX_HWQ_CMN_TAG: 3622 dp_print_tx_hwq_stats_cmn_tlv(tag_buf); 3623 break; 3624 3625 case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG: 3626 dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf); 3627 break; 3628 3629 case HTT_STATS_TX_HWQ_CMD_RESULT_TAG: 3630 dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf); 3631 break; 3632 3633 case HTT_STATS_TX_HWQ_CMD_STALL_TAG: 3634 dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf); 3635 break; 3636 3637 case HTT_STATS_TX_HWQ_FES_STATUS_TAG: 3638 dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf); 3639 break; 3640 3641 case HTT_STATS_TX_TQM_GEN_MPDU_TAG: 3642 dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf); 3643 break; 3644 3645 case HTT_STATS_TX_TQM_LIST_MPDU_TAG: 3646 dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf); 3647 break; 3648 3649 case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG: 3650 dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf); 3651 break; 3652 3653 case HTT_STATS_TX_TQM_CMN_TAG: 3654 dp_print_tx_tqm_cmn_stats_tlv(tag_buf); 3655 break; 3656 3657 case HTT_STATS_TX_TQM_PDEV_TAG: 3658 dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf); 3659 break; 3660 3661 case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG: 3662 dp_print_tx_tqm_cmdq_status_tlv(tag_buf); 3663 break; 3664 3665 case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG: 3666 dp_print_tx_de_eapol_packets_stats_tlv(tag_buf); 3667 break; 3668 3669 case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG: 3670 dp_print_tx_de_classify_failed_stats_tlv(tag_buf); 3671 break; 3672 3673 case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG: 3674 dp_print_tx_de_classify_stats_tlv(tag_buf); 3675 break; 3676 3677 case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG: 3678 dp_print_tx_de_classify_status_stats_tlv(tag_buf); 3679 break; 3680 3681 case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG: 3682 dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf); 3683 break; 3684 3685 case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG: 3686 dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf); 3687 break; 3688 3689 case HTT_STATS_TX_DE_CMN_TAG: 3690 dp_print_tx_de_cmn_stats_tlv(tag_buf); 3691 break; 3692 3693 case HTT_STATS_RING_IF_TAG: 3694 dp_print_ring_if_stats_tlv(tag_buf); 3695 break; 3696 3697 case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG: 3698 dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf); 3699 break; 3700 3701 case HTT_STATS_SFM_CMN_TAG: 3702 dp_print_sfm_cmn_tlv(tag_buf); 3703 break; 3704 3705 case HTT_STATS_SRING_STATS_TAG: 3706 dp_print_sring_stats_tlv(tag_buf); 3707 break; 3708 3709 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 3710 dp_print_rx_pdev_fw_stats_tlv(tag_buf); 3711 break; 3712 3713 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 3714 dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf); 3715 break; 3716 3717 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 3718 dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf); 3719 break; 3720 3721 case HTT_STATS_RX_SOC_FW_STATS_TAG: 3722 dp_print_rx_soc_fw_stats_tlv(tag_buf); 3723 break; 3724 3725 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 3726 dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf); 3727 break; 3728 3729 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 3730 dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 3731 tag_buf); 3732 break; 3733 3734 case HTT_STATS_TX_PDEV_RATE_STATS_TAG: 3735 dp_print_tx_pdev_rate_stats_tlv(tag_buf); 3736 break; 3737 3738 case HTT_STATS_RX_PDEV_RATE_STATS_TAG: 3739 dp_print_rx_pdev_rate_stats_tlv(tag_buf); 3740 break; 3741 3742 case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG: 3743 dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf); 3744 break; 3745 3746 case HTT_STATS_TX_SCHED_CMN_TAG: 3747 dp_print_stats_tx_sched_cmn_tlv(tag_buf); 3748 break; 3749 3750 case HTT_STATS_TX_PDEV_MPDU_STATS_TAG: 3751 dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf); 3752 break; 3753 3754 case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG: 3755 dp_print_sched_txq_cmd_posted_tlv_v(tag_buf); 3756 break; 3757 3758 case HTT_STATS_RING_IF_CMN_TAG: 3759 dp_print_ring_if_cmn_tlv(tag_buf); 3760 break; 3761 3762 case HTT_STATS_SFM_CLIENT_USER_TAG: 3763 dp_print_sfm_client_user_tlv_v(tag_buf); 3764 break; 3765 3766 case HTT_STATS_SFM_CLIENT_TAG: 3767 dp_print_sfm_client_tlv(tag_buf); 3768 break; 3769 3770 case HTT_STATS_TX_TQM_ERROR_STATS_TAG: 3771 dp_print_tx_tqm_error_stats_tlv(tag_buf); 3772 break; 3773 3774 case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG: 3775 dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf); 3776 break; 3777 3778 case HTT_STATS_SRING_CMN_TAG: 3779 dp_print_sring_cmn_tlv(tag_buf); 3780 break; 3781 3782 case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG: 3783 dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf); 3784 break; 3785 3786 case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG: 3787 dp_print_tx_selfgen_cmn_stats_tlv(tag_buf); 3788 break; 3789 3790 case HTT_STATS_TX_SELFGEN_AC_STATS_TAG: 3791 dp_print_tx_selfgen_ac_stats_tlv(tag_buf); 3792 break; 3793 3794 case HTT_STATS_TX_SELFGEN_AX_STATS_TAG: 3795 dp_print_tx_selfgen_ax_stats_tlv(tag_buf); 3796 break; 3797 3798 case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG: 3799 dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf); 3800 break; 3801 3802 case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG: 3803 dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf); 3804 break; 3805 3806 case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG: 3807 dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf); 3808 break; 3809 3810 case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG: 3811 dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf); 3812 break; 3813 3814 case HTT_STATS_HW_INTR_MISC_TAG: 3815 dp_print_hw_stats_intr_misc_tlv(tag_buf); 3816 break; 3817 3818 case HTT_STATS_HW_WD_TIMEOUT_TAG: 3819 dp_print_hw_stats_wd_timeout_tlv(tag_buf); 3820 break; 3821 3822 case HTT_STATS_HW_PDEV_ERRS_TAG: 3823 dp_print_hw_stats_pdev_errs_tlv(tag_buf); 3824 break; 3825 3826 case HTT_STATS_COUNTER_NAME_TAG: 3827 dp_print_counter_tlv(tag_buf); 3828 break; 3829 3830 case HTT_STATS_TX_TID_DETAILS_TAG: 3831 dp_print_tx_tid_stats_tlv(tag_buf); 3832 break; 3833 3834 #ifdef CONFIG_WIN 3835 case HTT_STATS_TX_TID_DETAILS_V1_TAG: 3836 dp_print_tx_tid_stats_v1_tlv(tag_buf); 3837 break; 3838 #endif 3839 3840 case HTT_STATS_RX_TID_DETAILS_TAG: 3841 dp_print_rx_tid_stats_tlv(tag_buf); 3842 break; 3843 3844 case HTT_STATS_PEER_STATS_CMN_TAG: 3845 dp_print_peer_stats_cmn_tlv(tag_buf); 3846 break; 3847 3848 case HTT_STATS_PEER_DETAILS_TAG: 3849 dp_print_peer_details_tlv(tag_buf); 3850 break; 3851 3852 case HTT_STATS_PEER_MSDU_FLOWQ_TAG: 3853 dp_print_msdu_flow_stats_tlv(tag_buf); 3854 break; 3855 3856 case HTT_STATS_PEER_TX_RATE_STATS_TAG: 3857 dp_print_tx_peer_rate_stats_tlv(tag_buf); 3858 break; 3859 3860 case HTT_STATS_PEER_RX_RATE_STATS_TAG: 3861 dp_print_rx_peer_rate_stats_tlv(tag_buf); 3862 break; 3863 3864 case HTT_STATS_TX_DE_COMPL_STATS_TAG: 3865 dp_print_tx_de_compl_stats_tlv(tag_buf); 3866 break; 3867 3868 case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG: 3869 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf); 3870 break; 3871 3872 case HTT_STATS_RX_REFILL_REO_ERR_TAG: 3873 dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf); 3874 break; 3875 3876 case HTT_STATS_RX_REO_RESOURCE_STATS_TAG: 3877 dp_print_rx_reo_debug_stats_tlv(tag_buf); 3878 break; 3879 3880 case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG: 3881 dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf); 3882 break; 3883 3884 default: 3885 break; 3886 } 3887 } 3888 3889 /* 3890 * dp_htt_stats_copy_tag: function to select the tag type and 3891 * copy the corresponding tag structure 3892 * @pdev: DP_PDEV handle 3893 * @tag_type: tag type that is to be printed 3894 * @tag_buf: pointer to the tag structure 3895 * 3896 * return: void 3897 */ 3898 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf) 3899 { 3900 void *dest_ptr = NULL; 3901 uint32_t size = 0; 3902 3903 switch (tag_type) { 3904 case HTT_STATS_TX_PDEV_CMN_TAG: 3905 dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv; 3906 size = sizeof(htt_tx_pdev_stats_cmn_tlv); 3907 break; 3908 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 3909 dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv; 3910 size = sizeof(htt_tx_pdev_stats_urrn_tlv_v); 3911 break; 3912 case HTT_STATS_TX_PDEV_SIFS_TAG: 3913 dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv; 3914 size = sizeof(htt_tx_pdev_stats_sifs_tlv_v); 3915 break; 3916 case HTT_STATS_TX_PDEV_FLUSH_TAG: 3917 dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv; 3918 size = sizeof(htt_tx_pdev_stats_flush_tlv_v); 3919 break; 3920 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 3921 dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv; 3922 size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v); 3923 break; 3924 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 3925 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv; 3926 size = sizeof(htt_rx_pdev_fw_stats_tlv); 3927 break; 3928 case HTT_STATS_RX_SOC_FW_STATS_TAG: 3929 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv; 3930 size = sizeof(htt_rx_soc_fw_stats_tlv); 3931 break; 3932 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 3933 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv; 3934 size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v); 3935 break; 3936 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 3937 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv; 3938 size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 3939 break; 3940 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 3941 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv; 3942 size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 3943 break; 3944 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 3945 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop; 3946 size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v); 3947 break; 3948 default: 3949 break; 3950 } 3951 3952 if (dest_ptr) 3953 qdf_mem_copy(dest_ptr, tag_buf, size); 3954 } 3955 QDF_STATUS dp_peer_stats_notify(struct dp_peer *peer) 3956 { 3957 struct dp_pdev *dp_pdev; 3958 struct cdp_interface_peer_stats peer_stats_intf; 3959 struct cdp_peer_stats *peer_stats = &peer->stats; 3960 3961 if (!peer->vdev) 3962 return QDF_STATUS_E_FAULT; 3963 3964 dp_pdev = peer->vdev->pdev; 3965 qdf_mem_zero(&peer_stats_intf, sizeof(peer_stats_intf)); 3966 if (peer_stats->rx.last_rssi != peer_stats->rx.rssi) 3967 peer_stats_intf.rssi_changed = true; 3968 3969 if ((peer_stats->rx.rssi && peer_stats_intf.rssi_changed) || 3970 (peer_stats->tx.tx_rate && 3971 peer_stats->tx.tx_rate != peer_stats->tx.last_tx_rate)) { 3972 peer_stats_intf.peer_hdl = peer->ctrl_peer; 3973 peer_stats_intf.last_peer_tx_rate = peer_stats->tx.last_tx_rate; 3974 peer_stats_intf.peer_tx_rate = peer_stats->tx.tx_rate; 3975 peer_stats_intf.peer_rssi = peer_stats->rx.rssi; 3976 peer_stats_intf.tx_packet_count = peer_stats->tx.ucast.num; 3977 peer_stats_intf.rx_packet_count = peer_stats->rx.to_stack.num; 3978 peer_stats_intf.tx_byte_count = peer_stats->tx.tx_success.bytes; 3979 peer_stats_intf.rx_byte_count = peer_stats->rx.to_stack.bytes; 3980 peer_stats_intf.per = peer_stats->tx.last_per; 3981 peer_stats_intf.ack_rssi = peer_stats->tx.last_ack_rssi; 3982 dp_wdi_event_handler(WDI_EVENT_PEER_STATS, dp_pdev->soc, 3983 (void *)&peer_stats_intf, 0, 3984 WDI_NO_VAL, dp_pdev->pdev_id); 3985 } 3986 3987 return QDF_STATUS_SUCCESS; 3988 } 3989 3990 #ifdef CONFIG_WIN 3991 /** 3992 * dp_vow_str_fw_to_hw_delay() - Return string for a delay 3993 * @index: Index of delay 3994 * 3995 * Return: char const pointer 3996 */ 3997 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index) 3998 { 3999 if (index > CDP_DELAY_BUCKET_MAX) { 4000 return "Invalid index"; 4001 } 4002 return fw_to_hw_delay_bucket[index]; 4003 } 4004 4005 /** 4006 * dp_vow_str_sw_enq_delay() - Return string for a delay 4007 * @index: Index of delay 4008 * 4009 * Return: char const pointer 4010 */ 4011 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index) 4012 { 4013 if (index > CDP_DELAY_BUCKET_MAX) { 4014 return "Invalid index"; 4015 } 4016 return sw_enq_delay_bucket[index]; 4017 } 4018 4019 /** 4020 * dp_vow_str_intfrm_delay() - Return string for a delay 4021 * @index: Index of delay 4022 * 4023 * Return: char const pointer 4024 */ 4025 static inline const char *dp_vow_str_intfrm_delay(uint8_t index) 4026 { 4027 if (index > CDP_DELAY_BUCKET_MAX) { 4028 return "Invalid index"; 4029 } 4030 return intfrm_delay_bucket[index]; 4031 } 4032 4033 void dp_pdev_print_tid_stats(struct dp_pdev *pdev) 4034 { 4035 struct cdp_tid_stats *tid_stats; 4036 struct cdp_tid_tx_stats *txstats; 4037 struct cdp_tid_rx_stats *rxstats; 4038 struct dp_soc *soc = pdev->soc; 4039 uint8_t tid; 4040 4041 if (!soc) 4042 return; 4043 tid = 0; 4044 rxstats = NULL; 4045 txstats = NULL; 4046 tid_stats = &pdev->stats.tid_stats; 4047 4048 DP_PRINT_STATS("Packets received in hardstart: %llu ", 4049 tid_stats->ingress_stack); 4050 DP_PRINT_STATS("Packets dropped in osif layer: %llu ", 4051 tid_stats->osif_drop); 4052 DP_PRINT_STATS("Per TID Video Stats:\n"); 4053 4054 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 4055 txstats = &tid_stats->tid_tx_stats[tid]; 4056 rxstats = &tid_stats->tid_rx_stats[tid]; 4057 DP_PRINT_STATS("----TID: %d----", tid); 4058 DP_PRINT_STATS("Tx Success Count: %llu", txstats->success_cnt); 4059 DP_PRINT_STATS("Tx Complete Count: %llu", 4060 txstats->complete_cnt); 4061 DP_PRINT_STATS("Tx Firmware Drop Count: %llu", 4062 txstats->comp_fail_cnt); 4063 DP_PRINT_STATS("Tx Hardware Drop Count: %llu", 4064 txstats->swdrop_cnt[TX_HW_ENQUEUE]); 4065 DP_PRINT_STATS("Tx Software Drop Count: %llu", 4066 txstats->swdrop_cnt[TX_SW_ENQUEUE]); 4067 DP_PRINT_STATS("Tx Descriptor Error Count: %llu", 4068 txstats->swdrop_cnt[TX_DESC_ERR]); 4069 DP_PRINT_STATS("Tx HAL Ring Error Count: %llu", 4070 txstats->swdrop_cnt[TX_HAL_RING_ACCESS_ERR]); 4071 DP_PRINT_STATS("Tx Dma Map Error Count: %llu", 4072 txstats->swdrop_cnt[TX_DMA_MAP_ERR]); 4073 DP_PRINT_STATS("Rx Delievered Count: %llu", 4074 rxstats->delivered_to_stack); 4075 DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu", 4076 rxstats->fail_cnt[ENQUEUE_DROP]); 4077 DP_PRINT_STATS("Rx Intrabss Drop Count: %llu", 4078 rxstats->fail_cnt[INTRABSS_DROP]); 4079 DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu", 4080 rxstats->fail_cnt[MSDU_DONE_FAILURE]); 4081 DP_PRINT_STATS("Rx Invalid Peer Count: %llu", 4082 rxstats->fail_cnt[INVALID_PEER_VDEV]); 4083 DP_PRINT_STATS("Rx Policy Check Drop Count: %llu", 4084 rxstats->fail_cnt[POLICY_CHECK_DROP]); 4085 DP_PRINT_STATS("Rx Mec Drop Count: %llu", 4086 rxstats->fail_cnt[MEC_DROP]); 4087 DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu", 4088 rxstats->fail_cnt[NAWDS_MCAST_DROP]); 4089 DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu", 4090 rxstats->fail_cnt[MESH_FILTER_DROP]); 4091 DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu", 4092 rxstats->intrabss_cnt); 4093 DP_PRINT_STATS("Rx MSDU Count: %llu", rxstats->msdu_cnt); 4094 DP_PRINT_STATS("Rx Multicast MSDU Count: %llu", 4095 rxstats->mcast_msdu_cnt); 4096 DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n", 4097 rxstats->bcast_msdu_cnt); 4098 } 4099 } 4100 4101 void dp_pdev_print_delay_stats(struct dp_pdev *pdev) 4102 { 4103 struct dp_soc *soc = pdev->soc; 4104 struct cdp_tid_tx_stats *txstats = NULL; 4105 struct cdp_tid_rx_stats *rxstats; 4106 uint8_t tid, index; 4107 uint64_t count = 0; 4108 4109 if (!soc) 4110 return; 4111 4112 tid = 0; 4113 index = 0; 4114 rxstats = NULL; 4115 4116 DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n"); 4117 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 4118 DP_PRINT_STATS("----TID: %d----", tid); 4119 txstats = &pdev->stats.tid_stats.tid_tx_stats[tid]; 4120 rxstats = &pdev->stats.tid_stats.tid_rx_stats[tid]; 4121 4122 DP_PRINT_STATS("Software Enqueue Delay:"); 4123 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 4124 count = txstats->swq_delay.delay_bucket[index]; 4125 if (count) { 4126 DP_PRINT_STATS("%s: Packets = %llu", 4127 dp_vow_str_sw_enq_delay(index), 4128 count); 4129 } 4130 } 4131 4132 DP_PRINT_STATS("Min = %u", txstats->swq_delay.min_delay); 4133 DP_PRINT_STATS("Max = %u", txstats->swq_delay.max_delay); 4134 DP_PRINT_STATS("Avg = %u\n", txstats->swq_delay.avg_delay); 4135 4136 DP_PRINT_STATS("Hardware Transmission Delay:"); 4137 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 4138 count = txstats->hwtx_delay.delay_bucket[index]; 4139 if (count) { 4140 DP_PRINT_STATS("%s: Packets = %llu", 4141 dp_vow_str_fw_to_hw_delay(index), 4142 count); 4143 } 4144 } 4145 DP_PRINT_STATS("Min = %u", txstats->hwtx_delay.min_delay); 4146 DP_PRINT_STATS("Max = %u", txstats->hwtx_delay.max_delay); 4147 DP_PRINT_STATS("Avg = %u\n", txstats->hwtx_delay.avg_delay); 4148 4149 DP_PRINT_STATS("Tx Interframe Delay:"); 4150 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 4151 count = txstats->intfrm_delay.delay_bucket[index]; 4152 if (count) { 4153 DP_PRINT_STATS("%s: Packets = %llu", 4154 dp_vow_str_intfrm_delay(index), 4155 count); 4156 } 4157 } 4158 DP_PRINT_STATS("Min = %u", txstats->intfrm_delay.min_delay); 4159 DP_PRINT_STATS("Max = %u", txstats->intfrm_delay.max_delay); 4160 DP_PRINT_STATS("Avg = %u\n", txstats->intfrm_delay.avg_delay); 4161 4162 DP_PRINT_STATS("Rx Interframe Delay:"); 4163 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 4164 count = rxstats->intfrm_delay.delay_bucket[index]; 4165 if (count) { 4166 DP_PRINT_STATS("%s: Packets = %llu", 4167 dp_vow_str_intfrm_delay(index), 4168 count); 4169 } 4170 } 4171 DP_PRINT_STATS("Min = %u", rxstats->intfrm_delay.min_delay); 4172 DP_PRINT_STATS("Max = %u", rxstats->intfrm_delay.max_delay); 4173 DP_PRINT_STATS("Avg = %u\n", rxstats->intfrm_delay.avg_delay); 4174 4175 DP_PRINT_STATS("Rx Reap to Stack Delay:"); 4176 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 4177 count = rxstats->to_stack_delay.delay_bucket[index]; 4178 if (count) { 4179 DP_PRINT_STATS("%s: Packets = %llu", 4180 dp_vow_str_intfrm_delay(index), 4181 count); 4182 } 4183 } 4184 4185 DP_PRINT_STATS("Min = %u", rxstats->to_stack_delay.min_delay); 4186 DP_PRINT_STATS("Max = %u", rxstats->to_stack_delay.max_delay); 4187 DP_PRINT_STATS("Avg = %u\n", rxstats->to_stack_delay.avg_delay); 4188 } 4189 } 4190 #endif 4191 4192 void dp_print_soc_cfg_params(struct dp_soc *soc) 4193 { 4194 struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; 4195 uint8_t index = 0, i = 0; 4196 char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH]; 4197 int num_of_int_contexts; 4198 4199 if (!soc) { 4200 dp_err("Context is null"); 4201 return; 4202 } 4203 4204 soc_cfg_ctx = soc->wlan_cfg_ctx; 4205 4206 if (!soc_cfg_ctx) { 4207 dp_err("Context is null"); 4208 return; 4209 } 4210 4211 num_of_int_contexts = 4212 wlan_cfg_get_num_contexts(soc_cfg_ctx); 4213 4214 DP_PRINT_STATS("No. of interrupt contexts: %u", 4215 soc_cfg_ctx->num_int_ctxts); 4216 DP_PRINT_STATS("Max clients: %u", 4217 soc_cfg_ctx->max_clients); 4218 DP_PRINT_STATS("Max alloc size: %u ", 4219 soc_cfg_ctx->max_alloc_size); 4220 DP_PRINT_STATS("Per pdev tx ring: %u ", 4221 soc_cfg_ctx->per_pdev_tx_ring); 4222 DP_PRINT_STATS("Num tcl data rings: %u ", 4223 soc_cfg_ctx->num_tcl_data_rings); 4224 DP_PRINT_STATS("Per pdev rx ring: %u ", 4225 soc_cfg_ctx->per_pdev_rx_ring); 4226 DP_PRINT_STATS("Per pdev lmac ring: %u ", 4227 soc_cfg_ctx->per_pdev_lmac_ring); 4228 DP_PRINT_STATS("Num of reo dest rings: %u ", 4229 soc_cfg_ctx->num_reo_dest_rings); 4230 DP_PRINT_STATS("Num tx desc pool: %u ", 4231 soc_cfg_ctx->num_tx_desc_pool); 4232 DP_PRINT_STATS("Num tx ext desc pool: %u ", 4233 soc_cfg_ctx->num_tx_ext_desc_pool); 4234 DP_PRINT_STATS("Num tx desc: %u ", 4235 soc_cfg_ctx->num_tx_desc); 4236 DP_PRINT_STATS("Num tx ext desc: %u ", 4237 soc_cfg_ctx->num_tx_ext_desc); 4238 DP_PRINT_STATS("Htt packet type: %u ", 4239 soc_cfg_ctx->htt_packet_type); 4240 DP_PRINT_STATS("Max peer_ids: %u ", 4241 soc_cfg_ctx->max_peer_id); 4242 DP_PRINT_STATS("Tx ring size: %u ", 4243 soc_cfg_ctx->tx_ring_size); 4244 DP_PRINT_STATS("Tx comp ring size: %u ", 4245 soc_cfg_ctx->tx_comp_ring_size); 4246 DP_PRINT_STATS("Tx comp ring size nss: %u ", 4247 soc_cfg_ctx->tx_comp_ring_size_nss); 4248 DP_PRINT_STATS("Int batch threshold tx: %u ", 4249 soc_cfg_ctx->int_batch_threshold_tx); 4250 DP_PRINT_STATS("Int timer threshold tx: %u ", 4251 soc_cfg_ctx->int_timer_threshold_tx); 4252 DP_PRINT_STATS("Int batch threshold rx: %u ", 4253 soc_cfg_ctx->int_batch_threshold_rx); 4254 DP_PRINT_STATS("Int timer threshold rx: %u ", 4255 soc_cfg_ctx->int_timer_threshold_rx); 4256 DP_PRINT_STATS("Int batch threshold other: %u ", 4257 soc_cfg_ctx->int_batch_threshold_other); 4258 DP_PRINT_STATS("Int timer threshold other: %u ", 4259 soc_cfg_ctx->int_timer_threshold_other); 4260 4261 for (i = 0; i < num_of_int_contexts; i++) { 4262 index += qdf_snprint(&ring_mask[index], 4263 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4264 " %d", 4265 soc_cfg_ctx->int_tx_ring_mask[i]); 4266 } 4267 4268 DP_PRINT_STATS("Tx ring mask (0-%d):%s", 4269 num_of_int_contexts, ring_mask); 4270 4271 index = 0; 4272 for (i = 0; i < num_of_int_contexts; i++) { 4273 index += qdf_snprint(&ring_mask[index], 4274 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4275 " %d", 4276 soc_cfg_ctx->int_rx_ring_mask[i]); 4277 } 4278 4279 DP_PRINT_STATS("Rx ring mask (0-%d):%s", 4280 num_of_int_contexts, ring_mask); 4281 4282 index = 0; 4283 for (i = 0; i < num_of_int_contexts; i++) { 4284 index += qdf_snprint(&ring_mask[index], 4285 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4286 " %d", 4287 soc_cfg_ctx->int_rx_mon_ring_mask[i]); 4288 } 4289 4290 DP_PRINT_STATS("Rx mon ring mask (0-%d):%s", 4291 num_of_int_contexts, ring_mask); 4292 4293 index = 0; 4294 for (i = 0; i < num_of_int_contexts; i++) { 4295 index += qdf_snprint(&ring_mask[index], 4296 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4297 " %d", 4298 soc_cfg_ctx->int_rx_err_ring_mask[i]); 4299 } 4300 4301 DP_PRINT_STATS("Rx err ring mask (0-%d):%s", 4302 num_of_int_contexts, ring_mask); 4303 4304 index = 0; 4305 for (i = 0; i < num_of_int_contexts; i++) { 4306 index += qdf_snprint(&ring_mask[index], 4307 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4308 " %d", 4309 soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]); 4310 } 4311 4312 DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s", 4313 num_of_int_contexts, ring_mask); 4314 4315 index = 0; 4316 for (i = 0; i < num_of_int_contexts; i++) { 4317 index += qdf_snprint(&ring_mask[index], 4318 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4319 " %d", 4320 soc_cfg_ctx->int_reo_status_ring_mask[i]); 4321 } 4322 4323 DP_PRINT_STATS("Reo ring mask (0-%d):%s", 4324 num_of_int_contexts, ring_mask); 4325 4326 index = 0; 4327 for (i = 0; i < num_of_int_contexts; i++) { 4328 index += qdf_snprint(&ring_mask[index], 4329 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4330 " %d", 4331 soc_cfg_ctx->int_rxdma2host_ring_mask[i]); 4332 } 4333 4334 DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s", 4335 num_of_int_contexts, ring_mask); 4336 4337 index = 0; 4338 for (i = 0; i < num_of_int_contexts; i++) { 4339 index += qdf_snprint(&ring_mask[index], 4340 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 4341 " %d", 4342 soc_cfg_ctx->int_host2rxdma_ring_mask[i]); 4343 } 4344 4345 DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s", 4346 num_of_int_contexts, ring_mask); 4347 4348 DP_PRINT_STATS("Rx hash: %u ", 4349 soc_cfg_ctx->rx_hash); 4350 DP_PRINT_STATS("Tso enabled: %u ", 4351 soc_cfg_ctx->tso_enabled); 4352 DP_PRINT_STATS("Lro enabled: %u ", 4353 soc_cfg_ctx->lro_enabled); 4354 DP_PRINT_STATS("Sg enabled: %u ", 4355 soc_cfg_ctx->sg_enabled); 4356 DP_PRINT_STATS("Gro enabled: %u ", 4357 soc_cfg_ctx->gro_enabled); 4358 DP_PRINT_STATS("rawmode enabled: %u ", 4359 soc_cfg_ctx->rawmode_enabled); 4360 DP_PRINT_STATS("peer flow ctrl enabled: %u ", 4361 soc_cfg_ctx->peer_flow_ctrl_enabled); 4362 DP_PRINT_STATS("napi enabled: %u ", 4363 soc_cfg_ctx->napi_enabled); 4364 DP_PRINT_STATS("Tcp Udp checksum offload: %u ", 4365 soc_cfg_ctx->tcp_udp_checksumoffload); 4366 DP_PRINT_STATS("Defrag timeout check: %u ", 4367 soc_cfg_ctx->defrag_timeout_check); 4368 DP_PRINT_STATS("Rx defrag min timeout: %u ", 4369 soc_cfg_ctx->rx_defrag_min_timeout); 4370 DP_PRINT_STATS("WBM release ring: %u ", 4371 soc_cfg_ctx->wbm_release_ring); 4372 DP_PRINT_STATS("TCL CMD ring: %u ", 4373 soc_cfg_ctx->tcl_cmd_ring); 4374 DP_PRINT_STATS("TCL Status ring: %u ", 4375 soc_cfg_ctx->tcl_status_ring); 4376 DP_PRINT_STATS("REO Reinject ring: %u ", 4377 soc_cfg_ctx->reo_reinject_ring); 4378 DP_PRINT_STATS("RX release ring: %u ", 4379 soc_cfg_ctx->rx_release_ring); 4380 DP_PRINT_STATS("REO Exception ring: %u ", 4381 soc_cfg_ctx->reo_exception_ring); 4382 DP_PRINT_STATS("REO CMD ring: %u ", 4383 soc_cfg_ctx->reo_cmd_ring); 4384 DP_PRINT_STATS("REO STATUS ring: %u ", 4385 soc_cfg_ctx->reo_status_ring); 4386 DP_PRINT_STATS("RXDMA refill ring: %u ", 4387 soc_cfg_ctx->rxdma_refill_ring); 4388 DP_PRINT_STATS("RXDMA err dst ring: %u ", 4389 soc_cfg_ctx->rxdma_err_dst_ring); 4390 } 4391 4392 void 4393 dp_print_pdev_cfg_params(struct dp_pdev *pdev) 4394 { 4395 struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx; 4396 4397 if (!pdev) { 4398 dp_err("Context is null"); 4399 return; 4400 } 4401 4402 pdev_cfg_ctx = pdev->wlan_cfg_ctx; 4403 4404 if (!pdev_cfg_ctx) { 4405 dp_err("Context is null"); 4406 return; 4407 } 4408 4409 DP_PRINT_STATS("Rx dma buf ring size: %d ", 4410 pdev_cfg_ctx->rx_dma_buf_ring_size); 4411 DP_PRINT_STATS("DMA Mon buf ring size: %d ", 4412 pdev_cfg_ctx->dma_mon_buf_ring_size); 4413 DP_PRINT_STATS("DMA Mon dest ring size: %d ", 4414 pdev_cfg_ctx->dma_mon_dest_ring_size); 4415 DP_PRINT_STATS("DMA Mon status ring size: %d ", 4416 pdev_cfg_ctx->dma_mon_status_ring_size); 4417 DP_PRINT_STATS("Rxdma monitor desc ring: %d", 4418 pdev_cfg_ctx->rxdma_monitor_desc_ring); 4419 DP_PRINT_STATS("Num mac rings: %d ", 4420 pdev_cfg_ctx->num_mac_rings); 4421 } 4422 4423 /** 4424 * dp_print_ring_stat_from_hal(): Print hal level ring stats 4425 * @soc: DP_SOC handle 4426 * @srng: DP_SRNG handle 4427 * @ring_name: SRNG name 4428 * @ring_type: srng src/dst ring 4429 * 4430 * Return: void 4431 */ 4432 static void 4433 dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, 4434 enum hal_ring_type ring_type) 4435 { 4436 uint32_t tailp; 4437 uint32_t headp; 4438 int32_t hw_headp = -1; 4439 int32_t hw_tailp = -1; 4440 const char *ring_name; 4441 struct hal_soc *hal_soc; 4442 4443 if (soc && srng && srng->hal_srng) { 4444 hal_soc = (struct hal_soc *)soc->hal_soc; 4445 ring_name = dp_srng_get_str_from_hal_ring_type(ring_type); 4446 4447 hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp); 4448 4449 DP_PRINT_STATS("%s:SW:Head pointer = %d Tail Pointer = %d\n", 4450 ring_name, headp, tailp); 4451 4452 hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp, 4453 &hw_tailp, ring_type); 4454 4455 DP_PRINT_STATS("%s:HW:Head pointer = %d Tail Pointer = %d\n", 4456 ring_name, hw_headp, hw_tailp); 4457 } 4458 } 4459 4460 /** 4461 * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based 4462 * on target 4463 * @pdev: physical device handle 4464 * @mac_id: mac id 4465 * 4466 * Return: void 4467 */ 4468 static inline 4469 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) 4470 { 4471 if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { 4472 dp_print_ring_stat_from_hal(pdev->soc, 4473 &pdev->rxdma_mon_buf_ring[mac_id], 4474 RXDMA_MONITOR_BUF); 4475 dp_print_ring_stat_from_hal(pdev->soc, 4476 &pdev->rxdma_mon_dst_ring[mac_id], 4477 RXDMA_MONITOR_DST); 4478 dp_print_ring_stat_from_hal(pdev->soc, 4479 &pdev->rxdma_mon_desc_ring[mac_id], 4480 RXDMA_MONITOR_DESC); 4481 } 4482 4483 dp_print_ring_stat_from_hal(pdev->soc, 4484 &pdev->rxdma_mon_status_ring[mac_id], 4485 RXDMA_MONITOR_STATUS); 4486 } 4487 4488 void 4489 dp_print_ring_stats(struct dp_pdev *pdev) 4490 { 4491 uint32_t i; 4492 int mac_id; 4493 4494 dp_print_ring_stat_from_hal(pdev->soc, 4495 &pdev->soc->reo_exception_ring, 4496 REO_EXCEPTION); 4497 dp_print_ring_stat_from_hal(pdev->soc, 4498 &pdev->soc->reo_reinject_ring, 4499 REO_REINJECT); 4500 dp_print_ring_stat_from_hal(pdev->soc, 4501 &pdev->soc->reo_cmd_ring, 4502 REO_CMD); 4503 dp_print_ring_stat_from_hal(pdev->soc, 4504 &pdev->soc->reo_status_ring, 4505 REO_STATUS); 4506 dp_print_ring_stat_from_hal(pdev->soc, 4507 &pdev->soc->rx_rel_ring, 4508 WBM2SW_RELEASE); 4509 dp_print_ring_stat_from_hal(pdev->soc, 4510 &pdev->soc->tcl_cmd_ring, 4511 TCL_CMD); 4512 dp_print_ring_stat_from_hal(pdev->soc, 4513 &pdev->soc->tcl_status_ring, 4514 TCL_STATUS); 4515 dp_print_ring_stat_from_hal(pdev->soc, 4516 &pdev->soc->wbm_desc_rel_ring, 4517 SW2WBM_RELEASE); 4518 for (i = 0; i < MAX_REO_DEST_RINGS; i++) 4519 dp_print_ring_stat_from_hal(pdev->soc, 4520 &pdev->soc->reo_dest_ring[i], 4521 REO_DST); 4522 4523 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 4524 dp_print_ring_stat_from_hal(pdev->soc, 4525 &pdev->soc->tcl_data_ring[i], 4526 TCL_DATA); 4527 for (i = 0; i < MAX_TCL_DATA_RINGS; i++) 4528 dp_print_ring_stat_from_hal(pdev->soc, 4529 &pdev->soc->tx_comp_ring[i], 4530 WBM2SW_RELEASE); 4531 4532 dp_print_ring_stat_from_hal(pdev->soc, 4533 &pdev->rx_refill_buf_ring, 4534 RXDMA_BUF); 4535 4536 dp_print_ring_stat_from_hal(pdev->soc, 4537 &pdev->rx_refill_buf_ring2, 4538 RXDMA_BUF); 4539 4540 for (i = 0; i < MAX_RX_MAC_RINGS; i++) 4541 dp_print_ring_stat_from_hal(pdev->soc, 4542 &pdev->rx_mac_buf_ring[i], 4543 RXDMA_BUF); 4544 4545 for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) 4546 dp_print_mon_ring_stat_from_hal(pdev, mac_id); 4547 4548 for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++) 4549 dp_print_ring_stat_from_hal(pdev->soc, 4550 &pdev->rxdma_err_dst_ring[i], 4551 RXDMA_DST); 4552 } 4553 4554 /** 4555 * dp_print_common_rates_info(): Print common rate for tx or rx 4556 * @pkt_type_array: rate type array contains rate info 4557 * 4558 * Return:void 4559 */ 4560 static inline void 4561 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array) 4562 { 4563 uint8_t mcs, pkt_type; 4564 4565 for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) { 4566 for (mcs = 0; mcs < MAX_MCS; mcs++) { 4567 if (!dp_rate_string[pkt_type][mcs].valid) 4568 continue; 4569 4570 DP_PRINT_STATS(" %s = %d", 4571 dp_rate_string[pkt_type][mcs].mcs_type, 4572 pkt_type_array[pkt_type].mcs_count[mcs]); 4573 } 4574 4575 DP_PRINT_STATS("\n"); 4576 } 4577 } 4578 4579 void dp_print_rx_rates(struct dp_vdev *vdev) 4580 { 4581 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 4582 uint8_t i; 4583 uint8_t index = 0; 4584 char nss[DP_NSS_LENGTH]; 4585 4586 DP_PRINT_STATS("Rx Rate Info:\n"); 4587 dp_print_common_rates_info(pdev->stats.rx.pkt_type); 4588 4589 index = 0; 4590 for (i = 0; i < SS_COUNT; i++) { 4591 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 4592 " %d", pdev->stats.rx.nss[i]); 4593 } 4594 DP_PRINT_STATS("NSS(1-8) = %s", 4595 nss); 4596 4597 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 4598 pdev->stats.rx.sgi_count[0], 4599 pdev->stats.rx.sgi_count[1], 4600 pdev->stats.rx.sgi_count[2], 4601 pdev->stats.rx.sgi_count[3]); 4602 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 4603 pdev->stats.rx.bw[0], pdev->stats.rx.bw[1], 4604 pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]); 4605 DP_PRINT_STATS("Reception Type =" 4606 "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d", 4607 pdev->stats.rx.reception_type[0], 4608 pdev->stats.rx.reception_type[1], 4609 pdev->stats.rx.reception_type[2], 4610 pdev->stats.rx.reception_type[3]); 4611 DP_PRINT_STATS("Aggregation:\n"); 4612 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 4613 pdev->stats.rx.ampdu_cnt); 4614 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 4615 pdev->stats.rx.non_ampdu_cnt); 4616 DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d", 4617 pdev->stats.rx.amsdu_cnt); 4618 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d", 4619 pdev->stats.rx.non_amsdu_cnt); 4620 } 4621 4622 void dp_print_tx_rates(struct dp_vdev *vdev) 4623 { 4624 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 4625 4626 DP_PRINT_STATS("Tx Rate Info:\n"); 4627 dp_print_common_rates_info(pdev->stats.tx.pkt_type); 4628 4629 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 4630 pdev->stats.tx.sgi_count[0], 4631 pdev->stats.tx.sgi_count[1], 4632 pdev->stats.tx.sgi_count[2], 4633 pdev->stats.tx.sgi_count[3]); 4634 4635 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 4636 pdev->stats.tx.bw[0], pdev->stats.tx.bw[1], 4637 pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]); 4638 4639 DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma); 4640 DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc); 4641 DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc); 4642 DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries); 4643 DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi); 4644 4645 DP_PRINT_STATS("Aggregation:\n"); 4646 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 4647 pdev->stats.tx.ampdu_cnt); 4648 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 4649 pdev->stats.tx.non_ampdu_cnt); 4650 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 4651 pdev->stats.tx.amsdu_cnt); 4652 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 4653 pdev->stats.tx.non_amsdu_cnt); 4654 } 4655 4656 void dp_print_peer_stats(struct dp_peer *peer) 4657 { 4658 uint8_t i; 4659 uint32_t index; 4660 uint32_t j; 4661 char nss[DP_NSS_LENGTH]; 4662 char mu_group_id[DP_MU_GROUP_LENGTH]; 4663 4664 DP_PRINT_STATS("Node Tx Stats:\n"); 4665 DP_PRINT_STATS("Total Packet Completions = %d", 4666 peer->stats.tx.comp_pkt.num); 4667 DP_PRINT_STATS("Total Bytes Completions = %llu", 4668 peer->stats.tx.comp_pkt.bytes); 4669 DP_PRINT_STATS("Success Packets = %d", 4670 peer->stats.tx.tx_success.num); 4671 DP_PRINT_STATS("Success Bytes = %llu", 4672 peer->stats.tx.tx_success.bytes); 4673 DP_PRINT_STATS("Unicast Success Packets = %d", 4674 peer->stats.tx.ucast.num); 4675 DP_PRINT_STATS("Unicast Success Bytes = %llu", 4676 peer->stats.tx.ucast.bytes); 4677 DP_PRINT_STATS("Multicast Success Packets = %d", 4678 peer->stats.tx.mcast.num); 4679 DP_PRINT_STATS("Multicast Success Bytes = %llu", 4680 peer->stats.tx.mcast.bytes); 4681 DP_PRINT_STATS("Broadcast Success Packets = %d", 4682 peer->stats.tx.bcast.num); 4683 DP_PRINT_STATS("Broadcast Success Bytes = %llu", 4684 peer->stats.tx.bcast.bytes); 4685 DP_PRINT_STATS("Packets Failed = %d", 4686 peer->stats.tx.tx_failed); 4687 DP_PRINT_STATS("Packets In OFDMA = %d", 4688 peer->stats.tx.ofdma); 4689 DP_PRINT_STATS("Packets In STBC = %d", 4690 peer->stats.tx.stbc); 4691 DP_PRINT_STATS("Packets In LDPC = %d", 4692 peer->stats.tx.ldpc); 4693 DP_PRINT_STATS("Packet Retries = %d", 4694 peer->stats.tx.retries); 4695 DP_PRINT_STATS("MSDU's Part of AMSDU = %d", 4696 peer->stats.tx.amsdu_cnt); 4697 DP_PRINT_STATS("Msdu's As Part of Ampdu = %d", 4698 peer->stats.tx.non_ampdu_cnt); 4699 DP_PRINT_STATS("Msdu's As Ampdu = %d", 4700 peer->stats.tx.ampdu_cnt); 4701 DP_PRINT_STATS("Last Packet RSSI = %d", 4702 peer->stats.tx.last_ack_rssi); 4703 DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u", 4704 peer->stats.tx.dropped.fw_rem.num); 4705 DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu", 4706 peer->stats.tx.dropped.fw_rem.bytes); 4707 DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d", 4708 peer->stats.tx.dropped.fw_rem_tx); 4709 DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d", 4710 peer->stats.tx.dropped.fw_rem_notx); 4711 DP_PRINT_STATS("Dropped : Age Out = %d", 4712 peer->stats.tx.dropped.age_out); 4713 DP_PRINT_STATS("NAWDS : "); 4714 DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d", 4715 peer->stats.tx.nawds_mcast_drop); 4716 DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %d", 4717 peer->stats.tx.nawds_mcast.num); 4718 DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu", 4719 peer->stats.tx.nawds_mcast.bytes); 4720 4721 DP_PRINT_STATS("Rate Info:"); 4722 dp_print_common_rates_info(peer->stats.tx.pkt_type); 4723 4724 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 4725 peer->stats.tx.sgi_count[0], 4726 peer->stats.tx.sgi_count[1], 4727 peer->stats.tx.sgi_count[2], 4728 peer->stats.tx.sgi_count[3]); 4729 DP_PRINT_STATS("Excess Retries per AC "); 4730 DP_PRINT_STATS(" Best effort = %d", 4731 peer->stats.tx.excess_retries_per_ac[0]); 4732 DP_PRINT_STATS(" Background= %d", 4733 peer->stats.tx.excess_retries_per_ac[1]); 4734 DP_PRINT_STATS(" Video = %d", 4735 peer->stats.tx.excess_retries_per_ac[2]); 4736 DP_PRINT_STATS(" Voice = %d", 4737 peer->stats.tx.excess_retries_per_ac[3]); 4738 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", 4739 peer->stats.tx.bw[0], peer->stats.tx.bw[1], 4740 peer->stats.tx.bw[2], peer->stats.tx.bw[3]); 4741 4742 index = 0; 4743 for (i = 0; i < SS_COUNT; i++) { 4744 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 4745 " %d", peer->stats.tx.nss[i]); 4746 } 4747 DP_PRINT_STATS("NSS(1-8) = %s", nss); 4748 4749 DP_PRINT_STATS("Transmit Type :"); 4750 DP_PRINT_STATS("SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 4751 peer->stats.tx.transmit_type[0], 4752 peer->stats.tx.transmit_type[1], 4753 peer->stats.tx.transmit_type[2], 4754 peer->stats.tx.transmit_type[3]); 4755 4756 for (i = 0; i < MAX_MU_GROUP_ID;) { 4757 index = 0; 4758 for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID; 4759 j++) { 4760 index += qdf_snprint(&mu_group_id[index], 4761 DP_MU_GROUP_LENGTH - index, 4762 " %d", 4763 peer->stats.tx.mu_group_id[i]); 4764 i++; 4765 } 4766 4767 DP_PRINT_STATS("User position list for GID %02d->%d: [%s]", 4768 i - DP_MU_GROUP_SHOW, i - 1, mu_group_id); 4769 } 4770 4771 DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]", 4772 peer->stats.tx.ru_start, peer->stats.tx.ru_tones); 4773 DP_PRINT_STATS("RU Locations RU[26 52 106 242 484 996]:"); 4774 DP_PRINT_STATS("RU_26: %d", peer->stats.tx.ru_loc[0]); 4775 DP_PRINT_STATS("RU 52: %d", peer->stats.tx.ru_loc[1]); 4776 DP_PRINT_STATS("RU 106: %d", peer->stats.tx.ru_loc[2]); 4777 DP_PRINT_STATS("RU 242: %d", peer->stats.tx.ru_loc[3]); 4778 DP_PRINT_STATS("RU 484: %d", peer->stats.tx.ru_loc[4]); 4779 DP_PRINT_STATS("RU 996: %d", peer->stats.tx.ru_loc[5]); 4780 4781 DP_PRINT_STATS("Aggregation:"); 4782 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 4783 peer->stats.tx.amsdu_cnt); 4784 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 4785 peer->stats.tx.non_amsdu_cnt); 4786 4787 DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:"); 4788 DP_PRINT_STATS(" Bytes transmitted in last sec: %d", 4789 peer->stats.tx.tx_byte_rate); 4790 DP_PRINT_STATS(" Data transmitted in last sec: %d", 4791 peer->stats.tx.tx_data_rate); 4792 4793 DP_PRINT_STATS("Node Rx Stats:"); 4794 DP_PRINT_STATS("Packets Sent To Stack = %d", 4795 peer->stats.rx.to_stack.num); 4796 DP_PRINT_STATS("Bytes Sent To Stack = %llu", 4797 peer->stats.rx.to_stack.bytes); 4798 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 4799 DP_PRINT_STATS("Ring Id = %d", i); 4800 DP_PRINT_STATS(" Packets Received = %d", 4801 peer->stats.rx.rcvd_reo[i].num); 4802 DP_PRINT_STATS(" Bytes Received = %llu", 4803 peer->stats.rx.rcvd_reo[i].bytes); 4804 } 4805 DP_PRINT_STATS("Multicast Packets Received = %d", 4806 peer->stats.rx.multicast.num); 4807 DP_PRINT_STATS("Multicast Bytes Received = %llu", 4808 peer->stats.rx.multicast.bytes); 4809 DP_PRINT_STATS("Broadcast Packets Received = %d", 4810 peer->stats.rx.bcast.num); 4811 DP_PRINT_STATS("Broadcast Bytes Received = %llu", 4812 peer->stats.rx.bcast.bytes); 4813 DP_PRINT_STATS("Intra BSS Packets Received = %d", 4814 peer->stats.rx.intra_bss.pkts.num); 4815 DP_PRINT_STATS("Intra BSS Bytes Received = %llu", 4816 peer->stats.rx.intra_bss.pkts.bytes); 4817 DP_PRINT_STATS("Raw Packets Received = %d", 4818 peer->stats.rx.raw.num); 4819 DP_PRINT_STATS("Raw Bytes Received = %llu", 4820 peer->stats.rx.raw.bytes); 4821 DP_PRINT_STATS("Errors: MIC Errors = %d", 4822 peer->stats.rx.err.mic_err); 4823 DP_PRINT_STATS("Erros: Decryption Errors = %d", 4824 peer->stats.rx.err.decrypt_err); 4825 DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d", 4826 peer->stats.rx.non_ampdu_cnt); 4827 DP_PRINT_STATS("Msdu's Recived As Ampdu = %d", 4828 peer->stats.rx.ampdu_cnt); 4829 DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d", 4830 peer->stats.rx.non_amsdu_cnt); 4831 DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d", 4832 peer->stats.rx.amsdu_cnt); 4833 DP_PRINT_STATS("NAWDS : "); 4834 DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d", 4835 peer->stats.rx.nawds_mcast_drop); 4836 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 4837 peer->stats.rx.sgi_count[0], 4838 peer->stats.rx.sgi_count[1], 4839 peer->stats.rx.sgi_count[2], 4840 peer->stats.rx.sgi_count[3]); 4841 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", 4842 peer->stats.rx.bw[0], peer->stats.rx.bw[1], 4843 peer->stats.rx.bw[2], peer->stats.rx.bw[3]); 4844 DP_PRINT_STATS("Reception Type = SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 4845 peer->stats.rx.reception_type[0], 4846 peer->stats.rx.reception_type[1], 4847 peer->stats.rx.reception_type[2], 4848 peer->stats.rx.reception_type[3]); 4849 4850 dp_print_common_rates_info(peer->stats.rx.pkt_type); 4851 4852 index = 0; 4853 for (i = 0; i < SS_COUNT; i++) { 4854 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 4855 " %d", peer->stats.rx.nss[i]); 4856 } 4857 DP_PRINT_STATS("NSS(1-8) = %s", 4858 nss); 4859 4860 DP_PRINT_STATS("Aggregation:"); 4861 DP_PRINT_STATS(" Msdu's Part of Ampdu = %d", 4862 peer->stats.rx.ampdu_cnt); 4863 DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %d", 4864 peer->stats.rx.non_ampdu_cnt); 4865 DP_PRINT_STATS(" Msdu's Part of Amsdu = %d", 4866 peer->stats.rx.amsdu_cnt); 4867 DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %d", 4868 peer->stats.rx.non_amsdu_cnt); 4869 4870 DP_PRINT_STATS("Bytes and Packets received in last one sec:"); 4871 DP_PRINT_STATS(" Bytes received in last sec: %d", 4872 peer->stats.rx.rx_byte_rate); 4873 DP_PRINT_STATS(" Data received in last sec: %d", 4874 peer->stats.rx.rx_data_rate); 4875 } 4876 4877 void dp_print_per_ring_stats(struct dp_soc *soc) 4878 { 4879 uint8_t ring; 4880 uint16_t core; 4881 uint64_t total_packets; 4882 4883 DP_PRINT_STATS("Reo packets per ring:"); 4884 for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) { 4885 total_packets = 0; 4886 DP_PRINT_STATS("Packets on ring %u:", ring); 4887 for (core = 0; core < num_possible_cpus(); core++) { 4888 DP_PRINT_STATS("Packets arriving on core %u: %llu", 4889 core, 4890 soc->stats.rx.ring_packets[core][ring]); 4891 total_packets += soc->stats.rx.ring_packets[core][ring]; 4892 } 4893 DP_PRINT_STATS("Total packets on ring %u: %llu", 4894 ring, total_packets); 4895 } 4896 } 4897 4898 void dp_txrx_path_stats(struct dp_soc *soc) 4899 { 4900 uint8_t error_code; 4901 uint8_t loop_pdev; 4902 struct dp_pdev *pdev; 4903 uint8_t i; 4904 4905 if (!soc) { 4906 dp_err("%s: Invalid access", __func__); 4907 return; 4908 } 4909 4910 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 4911 pdev = soc->pdev_list[loop_pdev]; 4912 dp_aggregate_pdev_stats(pdev); 4913 DP_PRINT_STATS("Tx path Statistics:"); 4914 DP_PRINT_STATS("from stack: %u msdus (%llu bytes)", 4915 pdev->stats.tx_i.rcvd.num, 4916 pdev->stats.tx_i.rcvd.bytes); 4917 DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)", 4918 pdev->stats.tx_i.processed.num, 4919 pdev->stats.tx_i.processed.bytes); 4920 DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)", 4921 pdev->stats.tx.tx_success.num, 4922 pdev->stats.tx.tx_success.bytes); 4923 4924 DP_PRINT_STATS("Dropped in host:"); 4925 DP_PRINT_STATS("Total packets dropped: %u,", 4926 pdev->stats.tx_i.dropped.dropped_pkt.num); 4927 DP_PRINT_STATS("Descriptor not available: %u", 4928 pdev->stats.tx_i.dropped.desc_na.num); 4929 DP_PRINT_STATS("Ring full: %u", 4930 pdev->stats.tx_i.dropped.ring_full); 4931 DP_PRINT_STATS("Enqueue fail: %u", 4932 pdev->stats.tx_i.dropped.enqueue_fail); 4933 DP_PRINT_STATS("DMA Error: %u", 4934 pdev->stats.tx_i.dropped.dma_error); 4935 4936 DP_PRINT_STATS("Dropped in hardware:"); 4937 DP_PRINT_STATS("total packets dropped: %u", 4938 pdev->stats.tx.tx_failed); 4939 DP_PRINT_STATS("mpdu age out: %u", 4940 pdev->stats.tx.dropped.age_out); 4941 DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)", 4942 pdev->stats.tx.dropped.fw_rem.num, 4943 pdev->stats.tx.dropped.fw_rem.bytes); 4944 DP_PRINT_STATS("firmware removed tx: %u", 4945 pdev->stats.tx.dropped.fw_rem_tx); 4946 DP_PRINT_STATS("firmware removed notx %u", 4947 pdev->stats.tx.dropped.fw_rem_notx); 4948 DP_PRINT_STATS("Invalid peer on tx path: %u", 4949 pdev->soc->stats.tx.tx_invalid_peer.num); 4950 4951 DP_PRINT_STATS("Tx packets sent per interrupt:"); 4952 DP_PRINT_STATS("Single Packet: %u", 4953 pdev->stats.tx_comp_histogram.pkts_1); 4954 DP_PRINT_STATS("2-20 Packets: %u", 4955 pdev->stats.tx_comp_histogram.pkts_2_20); 4956 DP_PRINT_STATS("21-40 Packets: %u", 4957 pdev->stats.tx_comp_histogram.pkts_21_40); 4958 DP_PRINT_STATS("41-60 Packets: %u", 4959 pdev->stats.tx_comp_histogram.pkts_41_60); 4960 DP_PRINT_STATS("61-80 Packets: %u", 4961 pdev->stats.tx_comp_histogram.pkts_61_80); 4962 DP_PRINT_STATS("81-100 Packets: %u", 4963 pdev->stats.tx_comp_histogram.pkts_81_100); 4964 DP_PRINT_STATS("101-200 Packets: %u", 4965 pdev->stats.tx_comp_histogram.pkts_101_200); 4966 DP_PRINT_STATS(" 201+ Packets: %u", 4967 pdev->stats.tx_comp_histogram.pkts_201_plus); 4968 4969 DP_PRINT_STATS("Rx path statistics"); 4970 4971 DP_PRINT_STATS("delivered %u msdus ( %llu bytes),", 4972 pdev->stats.rx.to_stack.num, 4973 pdev->stats.rx.to_stack.bytes); 4974 for (i = 0; i < CDP_MAX_RX_RINGS; i++) 4975 DP_PRINT_STATS( 4976 "received on reo[%d] %u msdus( %llu bytes),", 4977 i, pdev->stats.rx.rcvd_reo[i].num, 4978 pdev->stats.rx.rcvd_reo[i].bytes); 4979 DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),", 4980 pdev->stats.rx.intra_bss.pkts.num, 4981 pdev->stats.rx.intra_bss.pkts.bytes); 4982 DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),", 4983 pdev->stats.rx.intra_bss.fail.num, 4984 pdev->stats.rx.intra_bss.fail.bytes); 4985 DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),", 4986 pdev->stats.rx.raw.num, 4987 pdev->stats.rx.raw.bytes); 4988 DP_PRINT_STATS("mic errors %u", 4989 pdev->stats.rx.err.mic_err); 4990 DP_PRINT_STATS("Invalid peer on rx path: %u", 4991 pdev->soc->stats.rx.err.rx_invalid_peer.num); 4992 DP_PRINT_STATS("sw_peer_id invalid %u", 4993 pdev->soc->stats.rx.err.rx_invalid_peer_id.num); 4994 DP_PRINT_STATS("packet_len invalid %u", 4995 pdev->soc->stats.rx.err.rx_invalid_pkt_len.num); 4996 4997 DP_PRINT_STATS("Reo Statistics"); 4998 DP_PRINT_STATS("rbm error: %u msdus", 4999 pdev->soc->stats.rx.err.invalid_rbm); 5000 DP_PRINT_STATS("hal ring access fail: %u msdus", 5001 pdev->soc->stats.rx.err.hal_ring_access_fail); 5002 5003 for (error_code = 0; error_code < HAL_REO_ERR_MAX; 5004 error_code++) { 5005 if (!pdev->soc->stats.rx.err.reo_error[error_code]) 5006 continue; 5007 DP_PRINT_STATS("Reo error number (%u): %u msdus", 5008 error_code, 5009 pdev->soc->stats.rx.err 5010 .reo_error[error_code]); 5011 } 5012 5013 for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX; 5014 error_code++) { 5015 if (!pdev->soc->stats.rx.err.rxdma_error[error_code]) 5016 continue; 5017 DP_PRINT_STATS("Rxdma error number (%u): %u msdus", 5018 error_code, 5019 pdev->soc->stats.rx.err 5020 .rxdma_error[error_code]); 5021 } 5022 5023 DP_PRINT_STATS("Rx packets reaped per interrupt:"); 5024 DP_PRINT_STATS("Single Packet: %u", 5025 pdev->stats.rx_ind_histogram.pkts_1); 5026 DP_PRINT_STATS("2-20 Packets: %u", 5027 pdev->stats.rx_ind_histogram.pkts_2_20); 5028 DP_PRINT_STATS("21-40 Packets: %u", 5029 pdev->stats.rx_ind_histogram.pkts_21_40); 5030 DP_PRINT_STATS("41-60 Packets: %u", 5031 pdev->stats.rx_ind_histogram.pkts_41_60); 5032 DP_PRINT_STATS("61-80 Packets: %u", 5033 pdev->stats.rx_ind_histogram.pkts_61_80); 5034 DP_PRINT_STATS("81-100 Packets: %u", 5035 pdev->stats.rx_ind_histogram.pkts_81_100); 5036 DP_PRINT_STATS("101-200 Packets: %u", 5037 pdev->stats.rx_ind_histogram.pkts_101_200); 5038 DP_PRINT_STATS(" 201+ Packets: %u", 5039 pdev->stats.rx_ind_histogram.pkts_201_plus); 5040 5041 DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u", 5042 __func__, 5043 pdev->soc->wlan_cfg_ctx 5044 ->tso_enabled, 5045 pdev->soc->wlan_cfg_ctx 5046 ->lro_enabled, 5047 pdev->soc->wlan_cfg_ctx 5048 ->rx_hash, 5049 pdev->soc->wlan_cfg_ctx 5050 ->napi_enabled); 5051 #ifdef QCA_LL_TX_FLOW_CONTROL_V2 5052 DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u", 5053 __func__, 5054 pdev->soc->wlan_cfg_ctx 5055 ->tx_flow_stop_queue_threshold, 5056 pdev->soc->wlan_cfg_ctx 5057 ->tx_flow_start_queue_offset); 5058 #endif 5059 } 5060 } 5061 5062 /* 5063 * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats 5064 * Current scope is bar received count 5065 * 5066 * @pdev_handle: DP_PDEV handle 5067 * 5068 * Return: void 5069 */ 5070 static void 5071 dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev) 5072 { 5073 struct dp_vdev *vdev; 5074 struct dp_peer *peer; 5075 uint32_t waitcnt; 5076 5077 TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { 5078 TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { 5079 if (!peer) { 5080 dp_err("DP Invalid Peer refernce"); 5081 return; 5082 } 5083 5084 if (peer->delete_in_progress) { 5085 dp_err("DP Peer deletion in progress"); 5086 continue; 5087 } 5088 qdf_atomic_inc(&peer->ref_cnt); 5089 waitcnt = 0; 5090 dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev); 5091 while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) && 5092 waitcnt < 10) { 5093 schedule_timeout_interruptible( 5094 STATS_PROC_TIMEOUT); 5095 waitcnt++; 5096 } 5097 qdf_atomic_set(&pdev->stats_cmd_complete, 0); 5098 dp_peer_unref_delete(peer); 5099 } 5100 } 5101 } 5102 5103 void 5104 dp_print_pdev_tx_stats(struct dp_pdev *pdev) 5105 { 5106 uint8_t i = 0, index = 0; 5107 5108 DP_PRINT_STATS("PDEV Tx Stats:\n"); 5109 DP_PRINT_STATS("Received From Stack:"); 5110 DP_PRINT_STATS(" Packets = %d", 5111 pdev->stats.tx_i.rcvd.num); 5112 DP_PRINT_STATS(" Bytes = %llu", 5113 pdev->stats.tx_i.rcvd.bytes); 5114 DP_PRINT_STATS("Processed:"); 5115 DP_PRINT_STATS(" Packets = %d", 5116 pdev->stats.tx_i.processed.num); 5117 DP_PRINT_STATS(" Bytes = %llu", 5118 pdev->stats.tx_i.processed.bytes); 5119 DP_PRINT_STATS("Total Completions:"); 5120 DP_PRINT_STATS(" Packets = %u", 5121 pdev->stats.tx.comp_pkt.num); 5122 DP_PRINT_STATS(" Bytes = %llu", 5123 pdev->stats.tx.comp_pkt.bytes); 5124 DP_PRINT_STATS("Successful Completions:"); 5125 DP_PRINT_STATS(" Packets = %u", 5126 pdev->stats.tx.tx_success.num); 5127 DP_PRINT_STATS(" Bytes = %llu", 5128 pdev->stats.tx.tx_success.bytes); 5129 DP_PRINT_STATS("Dropped:"); 5130 DP_PRINT_STATS(" Total = %d", 5131 pdev->stats.tx_i.dropped.dropped_pkt.num); 5132 DP_PRINT_STATS(" Dma_map_error = %d", 5133 pdev->stats.tx_i.dropped.dma_error); 5134 DP_PRINT_STATS(" Ring Full = %d", 5135 pdev->stats.tx_i.dropped.ring_full); 5136 DP_PRINT_STATS(" Descriptor Not available = %d", 5137 pdev->stats.tx_i.dropped.desc_na.num); 5138 DP_PRINT_STATS(" HW enqueue failed= %d", 5139 pdev->stats.tx_i.dropped.enqueue_fail); 5140 DP_PRINT_STATS(" Resources Full = %d", 5141 pdev->stats.tx_i.dropped.res_full); 5142 DP_PRINT_STATS(" FW removed Pkts = %u", 5143 pdev->stats.tx.dropped.fw_rem.num); 5144 DP_PRINT_STATS(" FW removed bytes= %llu", 5145 pdev->stats.tx.dropped.fw_rem.bytes); 5146 DP_PRINT_STATS(" FW removed transmitted = %d", 5147 pdev->stats.tx.dropped.fw_rem_tx); 5148 DP_PRINT_STATS(" FW removed untransmitted = %d", 5149 pdev->stats.tx.dropped.fw_rem_notx); 5150 DP_PRINT_STATS(" FW removed untransmitted fw_reason1 = %d", 5151 pdev->stats.tx.dropped.fw_reason1); 5152 DP_PRINT_STATS(" FW removed untransmitted fw_reason2 = %d", 5153 pdev->stats.tx.dropped.fw_reason2); 5154 DP_PRINT_STATS(" FW removed untransmitted fw_reason3 = %d", 5155 pdev->stats.tx.dropped.fw_reason3); 5156 DP_PRINT_STATS(" Aged Out from msdu/mpdu queues = %d", 5157 pdev->stats.tx.dropped.age_out); 5158 DP_PRINT_STATS(" headroom insufficient = %d", 5159 pdev->stats.tx_i.dropped.headroom_insufficient); 5160 DP_PRINT_STATS(" Multicast:"); 5161 DP_PRINT_STATS(" Packets: %u", 5162 pdev->stats.tx.mcast.num); 5163 DP_PRINT_STATS(" Bytes: %llu", 5164 pdev->stats.tx.mcast.bytes); 5165 DP_PRINT_STATS("Scatter Gather:"); 5166 DP_PRINT_STATS(" Packets = %d", 5167 pdev->stats.tx_i.sg.sg_pkt.num); 5168 DP_PRINT_STATS(" Bytes = %llu", 5169 pdev->stats.tx_i.sg.sg_pkt.bytes); 5170 DP_PRINT_STATS(" Dropped By Host = %d", 5171 pdev->stats.tx_i.sg.dropped_host.num); 5172 DP_PRINT_STATS(" Dropped By Target = %d", 5173 pdev->stats.tx_i.sg.dropped_target); 5174 DP_PRINT_STATS("TSO:"); 5175 DP_PRINT_STATS(" Number of Segments = %d", 5176 pdev->stats.tx_i.tso.num_seg); 5177 DP_PRINT_STATS(" Packets = %d", 5178 pdev->stats.tx_i.tso.tso_pkt.num); 5179 DP_PRINT_STATS(" Bytes = %llu", 5180 pdev->stats.tx_i.tso.tso_pkt.bytes); 5181 DP_PRINT_STATS(" Dropped By Host = %d", 5182 pdev->stats.tx_i.tso.dropped_host.num); 5183 DP_PRINT_STATS("Mcast Enhancement:"); 5184 DP_PRINT_STATS(" Packets = %d", 5185 pdev->stats.tx_i.mcast_en.mcast_pkt.num); 5186 DP_PRINT_STATS(" Bytes = %llu", 5187 pdev->stats.tx_i.mcast_en.mcast_pkt.bytes); 5188 DP_PRINT_STATS(" Dropped: Map Errors = %d", 5189 pdev->stats.tx_i.mcast_en.dropped_map_error); 5190 DP_PRINT_STATS(" Dropped: Self Mac = %d", 5191 pdev->stats.tx_i.mcast_en.dropped_self_mac); 5192 DP_PRINT_STATS(" Dropped: Send Fail = %d", 5193 pdev->stats.tx_i.mcast_en.dropped_send_fail); 5194 DP_PRINT_STATS(" Unicast sent = %d", 5195 pdev->stats.tx_i.mcast_en.ucast); 5196 DP_PRINT_STATS("Raw:"); 5197 DP_PRINT_STATS(" Packets = %d", 5198 pdev->stats.tx_i.raw.raw_pkt.num); 5199 DP_PRINT_STATS(" Bytes = %llu", 5200 pdev->stats.tx_i.raw.raw_pkt.bytes); 5201 DP_PRINT_STATS(" DMA map error = %d", 5202 pdev->stats.tx_i.raw.dma_map_error); 5203 DP_PRINT_STATS("Reinjected:"); 5204 DP_PRINT_STATS(" Packets = %d", 5205 pdev->stats.tx_i.reinject_pkts.num); 5206 DP_PRINT_STATS(" Bytes = %llu\n", 5207 pdev->stats.tx_i.reinject_pkts.bytes); 5208 DP_PRINT_STATS("Inspected:"); 5209 DP_PRINT_STATS(" Packets = %d", 5210 pdev->stats.tx_i.inspect_pkts.num); 5211 DP_PRINT_STATS(" Bytes = %llu", 5212 pdev->stats.tx_i.inspect_pkts.bytes); 5213 DP_PRINT_STATS("Nawds Multicast:"); 5214 DP_PRINT_STATS(" Packets = %d", 5215 pdev->stats.tx_i.nawds_mcast.num); 5216 DP_PRINT_STATS(" Bytes = %llu", 5217 pdev->stats.tx_i.nawds_mcast.bytes); 5218 DP_PRINT_STATS("CCE Classified:"); 5219 DP_PRINT_STATS(" CCE Classified Packets: %u", 5220 pdev->stats.tx_i.cce_classified); 5221 DP_PRINT_STATS(" RAW CCE Classified Packets: %u", 5222 pdev->stats.tx_i.cce_classified_raw); 5223 DP_PRINT_STATS("Mesh stats:"); 5224 DP_PRINT_STATS(" frames to firmware: %u", 5225 pdev->stats.tx_i.mesh.exception_fw); 5226 DP_PRINT_STATS(" completions from fw: %u", 5227 pdev->stats.tx_i.mesh.completion_fw); 5228 DP_PRINT_STATS("PPDU stats counter"); 5229 for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) { 5230 DP_PRINT_STATS(" Tag[%d] = %llu", index, 5231 pdev->stats.ppdu_stats_counter[index]); 5232 } 5233 DP_PRINT_STATS("tx_ppdu_proc: %llu\n", 5234 pdev->tx_ppdu_proc); 5235 5236 for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) { 5237 if (!pdev->stats.wdi_event[i]) 5238 DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d", 5239 i, pdev->stats.wdi_event[i]); 5240 } 5241 } 5242 5243 void 5244 dp_print_pdev_rx_stats(struct dp_pdev *pdev) 5245 { 5246 DP_PRINT_STATS("PDEV Rx Stats:\n"); 5247 DP_PRINT_STATS("Received From HW (Per Rx Ring):"); 5248 DP_PRINT_STATS(" Packets = %d %d %d %d", 5249 pdev->stats.rx.rcvd_reo[0].num, 5250 pdev->stats.rx.rcvd_reo[1].num, 5251 pdev->stats.rx.rcvd_reo[2].num, 5252 pdev->stats.rx.rcvd_reo[3].num); 5253 DP_PRINT_STATS(" Bytes = %llu %llu %llu %llu", 5254 pdev->stats.rx.rcvd_reo[0].bytes, 5255 pdev->stats.rx.rcvd_reo[1].bytes, 5256 pdev->stats.rx.rcvd_reo[2].bytes, 5257 pdev->stats.rx.rcvd_reo[3].bytes); 5258 DP_PRINT_STATS("Replenished:"); 5259 DP_PRINT_STATS(" Packets = %d", 5260 pdev->stats.replenish.pkts.num); 5261 DP_PRINT_STATS(" Bytes = %llu", 5262 pdev->stats.replenish.pkts.bytes); 5263 DP_PRINT_STATS(" Buffers Added To Freelist = %d", 5264 pdev->stats.buf_freelist); 5265 DP_PRINT_STATS(" Low threshold intr = %d", 5266 pdev->stats.replenish.low_thresh_intrs); 5267 DP_PRINT_STATS("Dropped:"); 5268 DP_PRINT_STATS(" msdu_not_done = %d", 5269 pdev->stats.dropped.msdu_not_done); 5270 DP_PRINT_STATS(" wifi parse = %d", 5271 pdev->stats.dropped.wifi_parse); 5272 DP_PRINT_STATS(" mon_rx_drop = %d", 5273 pdev->stats.dropped.mon_rx_drop); 5274 DP_PRINT_STATS(" mec_drop = %d", 5275 pdev->stats.rx.mec_drop.num); 5276 DP_PRINT_STATS(" Bytes = %llu", 5277 pdev->stats.rx.mec_drop.bytes); 5278 DP_PRINT_STATS("Sent To Stack:"); 5279 DP_PRINT_STATS(" Packets = %d", 5280 pdev->stats.rx.to_stack.num); 5281 DP_PRINT_STATS(" Bytes = %llu", 5282 pdev->stats.rx.to_stack.bytes); 5283 DP_PRINT_STATS(" vlan_tag_stp_cnt = %d", 5284 pdev->stats.vlan_tag_stp_cnt); 5285 DP_PRINT_STATS("Multicast/Broadcast:"); 5286 DP_PRINT_STATS(" Packets = %d", 5287 pdev->stats.rx.multicast.num); 5288 DP_PRINT_STATS(" Bytes = %llu", 5289 pdev->stats.rx.multicast.bytes); 5290 DP_PRINT_STATS("Errors:"); 5291 DP_PRINT_STATS(" Rxdma Ring Un-inititalized = %d", 5292 pdev->stats.replenish.rxdma_err); 5293 DP_PRINT_STATS(" Desc Alloc Failed: = %d", 5294 pdev->stats.err.desc_alloc_fail); 5295 DP_PRINT_STATS(" IP checksum error = %d", 5296 pdev->stats.err.ip_csum_err); 5297 DP_PRINT_STATS(" TCP/UDP checksum error = %d", 5298 pdev->stats.err.tcp_udp_csum_err); 5299 5300 /* Get bar_recv_cnt */ 5301 dp_aggregate_pdev_ctrl_frames_stats(pdev); 5302 DP_PRINT_STATS("BAR Received Count: = %d", 5303 pdev->stats.rx.bar_recv_cnt); 5304 } 5305 5306 void 5307 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) 5308 { 5309 struct cdp_pdev_mon_stats *rx_mon_stats; 5310 uint32_t *stat_ring_ppdu_ids; 5311 uint32_t *dest_ring_ppdu_ids; 5312 int i, idx; 5313 5314 rx_mon_stats = &pdev->rx_mon_stats; 5315 5316 DP_PRINT_STATS("PDEV Rx Monitor Stats:\n"); 5317 5318 DP_PRINT_STATS("status_ppdu_compl_cnt = %d", 5319 rx_mon_stats->status_ppdu_compl); 5320 DP_PRINT_STATS("status_ppdu_start_cnt = %d", 5321 rx_mon_stats->status_ppdu_start); 5322 DP_PRINT_STATS("status_ppdu_end_cnt = %d", 5323 rx_mon_stats->status_ppdu_end); 5324 DP_PRINT_STATS("status_ppdu_start_mis_cnt = %d", 5325 rx_mon_stats->status_ppdu_start_mis); 5326 DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d", 5327 rx_mon_stats->status_ppdu_end_mis); 5328 DP_PRINT_STATS("status_ppdu_done_cnt = %d", 5329 rx_mon_stats->status_ppdu_done); 5330 DP_PRINT_STATS("dest_ppdu_done_cnt = %d", 5331 rx_mon_stats->dest_ppdu_done); 5332 DP_PRINT_STATS("dest_mpdu_done_cnt = %d", 5333 rx_mon_stats->dest_mpdu_done); 5334 DP_PRINT_STATS("dest_mpdu_drop_cnt = %d", 5335 rx_mon_stats->dest_mpdu_drop); 5336 DP_PRINT_STATS("dup_mon_linkdesc_cnt = %d", 5337 rx_mon_stats->dup_mon_linkdesc_cnt); 5338 DP_PRINT_STATS("dup_mon_buf_cnt = %d", 5339 rx_mon_stats->dup_mon_buf_cnt); 5340 stat_ring_ppdu_ids = 5341 (uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST); 5342 dest_ring_ppdu_ids = 5343 (uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST); 5344 5345 if (!stat_ring_ppdu_ids || !dest_ring_ppdu_ids) 5346 DP_PRINT_STATS("Unable to allocate ppdu id hist mem\n"); 5347 5348 qdf_spin_lock_bh(&pdev->mon_lock); 5349 idx = rx_mon_stats->ppdu_id_hist_idx; 5350 qdf_mem_copy(stat_ring_ppdu_ids, 5351 rx_mon_stats->stat_ring_ppdu_id_hist, 5352 sizeof(uint32_t) * MAX_PPDU_ID_HIST); 5353 qdf_mem_copy(dest_ring_ppdu_ids, 5354 rx_mon_stats->dest_ring_ppdu_id_hist, 5355 sizeof(uint32_t) * MAX_PPDU_ID_HIST); 5356 qdf_spin_unlock_bh(&pdev->mon_lock); 5357 5358 DP_PRINT_STATS("PPDU Id history:"); 5359 DP_PRINT_STATS("stat_ring_ppdu_ids\t dest_ring_ppdu_ids"); 5360 for (i = 0; i < MAX_PPDU_ID_HIST; i++) { 5361 idx = (idx + 1) & (MAX_PPDU_ID_HIST - 1); 5362 DP_PRINT_STATS("%*u\t%*u", 16, 5363 rx_mon_stats->stat_ring_ppdu_id_hist[idx], 16, 5364 rx_mon_stats->dest_ring_ppdu_id_hist[idx]); 5365 } 5366 qdf_mem_free(stat_ring_ppdu_ids); 5367 qdf_mem_free(dest_ring_ppdu_ids); 5368 } 5369 5370 void 5371 dp_print_soc_tx_stats(struct dp_soc *soc) 5372 { 5373 uint8_t desc_pool_id; 5374 5375 soc->stats.tx.desc_in_use = 0; 5376 5377 DP_PRINT_STATS("SOC Tx Stats:\n"); 5378 5379 for (desc_pool_id = 0; 5380 desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); 5381 desc_pool_id++) 5382 soc->stats.tx.desc_in_use += 5383 soc->tx_desc[desc_pool_id].num_allocated; 5384 5385 DP_PRINT_STATS("Tx Descriptors In Use = %d", 5386 soc->stats.tx.desc_in_use); 5387 DP_PRINT_STATS("Tx Invalid peer:"); 5388 DP_PRINT_STATS(" Packets = %d", 5389 soc->stats.tx.tx_invalid_peer.num); 5390 DP_PRINT_STATS(" Bytes = %llu", 5391 soc->stats.tx.tx_invalid_peer.bytes); 5392 DP_PRINT_STATS("Packets dropped due to TCL ring full = %d %d %d", 5393 soc->stats.tx.tcl_ring_full[0], 5394 soc->stats.tx.tcl_ring_full[1], 5395 soc->stats.tx.tcl_ring_full[2]); 5396 DP_PRINT_STATS("Tx invalid completion release = %d", 5397 soc->stats.tx.invalid_release_source); 5398 DP_PRINT_STATS("Tx comp loop pkt limit hit = %d", 5399 soc->stats.tx.tx_comp_loop_pkt_limit_hit); 5400 DP_PRINT_STATS("Tx comp HP out of sync2 = %d", 5401 soc->stats.tx.hp_oos2); 5402 } 5403 5404 void dp_print_soc_interrupt_stats(struct dp_soc *soc) 5405 { 5406 int i = 0; 5407 struct dp_intr_stats *intr_stats; 5408 5409 DP_PRINT_STATS("INT: Total |txComps|reo[0] |reo[1] |reo[2] |reo[3] |mon |rx_err | wbm |reo_sta|rxdm2hst|hst2rxdm|"); 5410 for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { 5411 intr_stats = &soc->intr_ctx[i].intr_stats; 5412 DP_PRINT_STATS("%3u[%d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u", 5413 i, 5414 hif_get_int_ctx_irq_num(soc->hif_handle, i), 5415 intr_stats->num_masks, 5416 intr_stats->num_tx_ring_masks[0], 5417 intr_stats->num_rx_ring_masks[0], 5418 intr_stats->num_rx_ring_masks[1], 5419 intr_stats->num_rx_ring_masks[2], 5420 intr_stats->num_rx_ring_masks[3], 5421 intr_stats->num_rx_mon_ring_masks, 5422 intr_stats->num_rx_err_ring_masks, 5423 intr_stats->num_rx_wbm_rel_ring_masks, 5424 intr_stats->num_reo_status_ring_masks, 5425 intr_stats->num_rxdma2host_ring_masks, 5426 intr_stats->num_host2rxdma_ring_masks); 5427 } 5428 } 5429 5430 void 5431 dp_print_soc_rx_stats(struct dp_soc *soc) 5432 { 5433 uint32_t i; 5434 char reo_error[DP_REO_ERR_LENGTH]; 5435 char rxdma_error[DP_RXDMA_ERR_LENGTH]; 5436 uint8_t index = 0; 5437 5438 DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries); 5439 DP_PRINT_STATS("SOC Rx Stats:\n"); 5440 DP_PRINT_STATS("Fragmented packets: %u", 5441 soc->stats.rx.rx_frags); 5442 DP_PRINT_STATS("Reo reinjected packets: %u", 5443 soc->stats.rx.reo_reinject); 5444 DP_PRINT_STATS("Errors:\n"); 5445 DP_PRINT_STATS("Rx Decrypt Errors = %d", 5446 (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] + 5447 soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC])); 5448 DP_PRINT_STATS("Invalid RBM = %d", 5449 soc->stats.rx.err.invalid_rbm); 5450 DP_PRINT_STATS("Invalid Vdev = %d", 5451 soc->stats.rx.err.invalid_vdev); 5452 DP_PRINT_STATS("Invalid sa_idx or da_idx = %d", 5453 soc->stats.rx.err.invalid_sa_da_idx); 5454 DP_PRINT_STATS("Invalid Pdev = %d", 5455 soc->stats.rx.err.invalid_pdev); 5456 DP_PRINT_STATS("Invalid Peer = %d", 5457 soc->stats.rx.err.rx_invalid_peer.num); 5458 DP_PRINT_STATS("HAL Ring Access Fail = %d", 5459 soc->stats.rx.err.hal_ring_access_fail); 5460 DP_PRINT_STATS("MSDU Done failures = %d", 5461 soc->stats.rx.err.msdu_done_fail); 5462 DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags); 5463 DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait); 5464 DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err); 5465 5466 DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2); 5467 DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d", 5468 soc->stats.rx.reap_loop_pkt_limit_hit); 5469 DP_PRINT_STATS("RX DESC invalid magic: %u", 5470 soc->stats.rx.err.rx_desc_invalid_magic); 5471 DP_PRINT_STATS("RX DUP DESC: %d", 5472 soc->stats.rx.err.hal_reo_dest_dup); 5473 DP_PRINT_STATS("RX REL DUP DESC: %d", 5474 soc->stats.rx.err.hal_wbm_rel_dup); 5475 5476 DP_PRINT_STATS("RXDMA ERR DUP DESC: %d", 5477 soc->stats.rx.err.hal_rxdma_err_dup); 5478 5479 for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) { 5480 index += qdf_snprint(&rxdma_error[index], 5481 DP_RXDMA_ERR_LENGTH - index, 5482 " %d", soc->stats.rx.err.rxdma_error[i]); 5483 } 5484 DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error); 5485 5486 index = 0; 5487 for (i = 0; i < HAL_REO_ERR_MAX; i++) { 5488 index += qdf_snprint(&reo_error[index], 5489 DP_REO_ERR_LENGTH - index, 5490 " %d", soc->stats.rx.err.reo_error[i]); 5491 } 5492 DP_PRINT_STATS("REO Error(0-14):%s", reo_error); 5493 } 5494 5495