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