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