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