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