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