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