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