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("NAN Tcp Udp checksum offload: %u ", 4950 soc_cfg_ctx->nan_tcp_udp_checksumoffload); 4951 DP_PRINT_STATS("Tcp Udp checksum offload: %u ", 4952 soc_cfg_ctx->tcp_udp_checksumoffload); 4953 DP_PRINT_STATS("Defrag timeout check: %u ", 4954 soc_cfg_ctx->defrag_timeout_check); 4955 DP_PRINT_STATS("Rx defrag min timeout: %u ", 4956 soc_cfg_ctx->rx_defrag_min_timeout); 4957 DP_PRINT_STATS("WBM release ring: %u ", 4958 soc_cfg_ctx->wbm_release_ring); 4959 DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ", 4960 soc_cfg_ctx->tcl_cmd_credit_ring); 4961 DP_PRINT_STATS("TCL Status ring: %u ", 4962 soc_cfg_ctx->tcl_status_ring); 4963 DP_PRINT_STATS("REO Reinject ring: %u ", 4964 soc_cfg_ctx->reo_reinject_ring); 4965 DP_PRINT_STATS("RX release ring: %u ", 4966 soc_cfg_ctx->rx_release_ring); 4967 DP_PRINT_STATS("REO Exception ring: %u ", 4968 soc_cfg_ctx->reo_exception_ring); 4969 DP_PRINT_STATS("REO CMD ring: %u ", 4970 soc_cfg_ctx->reo_cmd_ring); 4971 DP_PRINT_STATS("REO STATUS ring: %u ", 4972 soc_cfg_ctx->reo_status_ring); 4973 DP_PRINT_STATS("RXDMA refill ring: %u ", 4974 soc_cfg_ctx->rxdma_refill_ring); 4975 DP_PRINT_STATS("TX_desc limit_0: %u ", 4976 soc_cfg_ctx->tx_desc_limit_0); 4977 DP_PRINT_STATS("TX_desc limit_1: %u ", 4978 soc_cfg_ctx->tx_desc_limit_1); 4979 DP_PRINT_STATS("TX_desc limit_2: %u ", 4980 soc_cfg_ctx->tx_desc_limit_2); 4981 DP_PRINT_STATS("TX device limit: %u ", 4982 soc_cfg_ctx->tx_device_limit); 4983 DP_PRINT_STATS("TX sw internode queue: %u ", 4984 soc_cfg_ctx->tx_sw_internode_queue); 4985 DP_PRINT_STATS("RXDMA err dst ring: %u ", 4986 soc_cfg_ctx->rxdma_err_dst_ring); 4987 DP_PRINT_STATS("RX Flow Tag Enabled: %u ", 4988 soc_cfg_ctx->is_rx_flow_tag_enabled); 4989 DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ", 4990 soc_cfg_ctx->rx_flow_search_table_size); 4991 DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ", 4992 soc_cfg_ctx->is_rx_flow_search_table_per_pdev); 4993 } 4994 4995 void 4996 dp_print_pdev_cfg_params(struct dp_pdev *pdev) 4997 { 4998 struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx; 4999 5000 if (!pdev) { 5001 dp_err("Context is null"); 5002 return; 5003 } 5004 5005 pdev_cfg_ctx = pdev->wlan_cfg_ctx; 5006 5007 if (!pdev_cfg_ctx) { 5008 dp_err("Context is null"); 5009 return; 5010 } 5011 5012 DP_PRINT_STATS("Rx dma buf ring size: %d ", 5013 pdev_cfg_ctx->rx_dma_buf_ring_size); 5014 DP_PRINT_STATS("DMA Mon buf ring size: %d ", 5015 pdev_cfg_ctx->dma_mon_buf_ring_size); 5016 DP_PRINT_STATS("DMA Mon dest ring size: %d ", 5017 pdev_cfg_ctx->dma_mon_dest_ring_size); 5018 DP_PRINT_STATS("DMA Mon status ring size: %d ", 5019 pdev_cfg_ctx->dma_mon_status_ring_size); 5020 DP_PRINT_STATS("Rxdma monitor desc ring: %d", 5021 pdev_cfg_ctx->rxdma_monitor_desc_ring); 5022 DP_PRINT_STATS("Num mac rings: %d ", 5023 pdev_cfg_ctx->num_mac_rings); 5024 } 5025 5026 /** 5027 * dp_print_ring_stat_from_hal(): Print hal level ring stats 5028 * @soc: DP_SOC handle 5029 * @srng: DP_SRNG handle 5030 * @ring_name: SRNG name 5031 * @ring_type: srng src/dst ring 5032 * 5033 * Return: void 5034 */ 5035 static void 5036 dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, 5037 enum hal_ring_type ring_type) 5038 { 5039 uint32_t tailp; 5040 uint32_t headp; 5041 int32_t hw_headp = -1; 5042 int32_t hw_tailp = -1; 5043 const char *ring_name; 5044 struct hal_soc *hal_soc; 5045 5046 if (soc && srng && srng->hal_srng) { 5047 hal_soc = (struct hal_soc *)soc->hal_soc; 5048 ring_name = dp_srng_get_str_from_hal_ring_type(ring_type); 5049 5050 hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp); 5051 5052 DP_PRINT_STATS("%s:SW:Head pointer = %d Tail Pointer = %d\n", 5053 ring_name, headp, tailp); 5054 5055 hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp, 5056 &hw_tailp, ring_type); 5057 5058 DP_PRINT_STATS("%s:HW:Head pointer = %d Tail Pointer = %d\n", 5059 ring_name, hw_headp, hw_tailp); 5060 } 5061 } 5062 5063 #ifdef FEATURE_TSO_STATS 5064 /** 5065 * dp_print_tso_seg_stats - tso segment stats 5066 * @pdev: pdev handle 5067 * @id: tso packet id 5068 * 5069 * Return: None 5070 */ 5071 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5072 { 5073 uint8_t num_seg; 5074 uint32_t segid; 5075 5076 /* TSO LEVEL 2 - SEGMENT INFO */ 5077 num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg; 5078 for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) { 5079 DP_PRINT_STATS( 5080 "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u", 5081 segid, 5082 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5083 .tso_seg[segid].num_frags, 5084 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5085 .tso_seg[segid].total_len, 5086 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5087 .tso_seg[segid].tso_flags.tcp_seq_num, 5088 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5089 .tso_seg[segid].tso_flags.ip_id); 5090 DP_PRINT_STATS( 5091 "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u", 5092 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5093 .tso_seg[segid].tso_flags.fin, 5094 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5095 .tso_seg[segid].tso_flags.syn, 5096 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5097 .tso_seg[segid].tso_flags.rst, 5098 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5099 .tso_seg[segid].tso_flags.psh, 5100 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5101 .tso_seg[segid].tso_flags.ack, 5102 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5103 .tso_seg[segid].tso_flags.urg, 5104 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5105 .tso_seg[segid].tso_flags.ece, 5106 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5107 .tso_seg[segid].tso_flags.cwr, 5108 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5109 .tso_seg[segid].tso_flags.ns); 5110 } 5111 } 5112 #else 5113 static inline 5114 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5115 { 5116 } 5117 #endif /* FEATURE_TSO_STATS */ 5118 5119 /** 5120 * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based 5121 * on target 5122 * @pdev: physical device handle 5123 * @mac_id: mac id 5124 * 5125 * Return: void 5126 */ 5127 static inline 5128 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) 5129 { 5130 if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { 5131 dp_print_ring_stat_from_hal(pdev->soc, 5132 &pdev->soc->rxdma_mon_buf_ring[mac_id], 5133 RXDMA_MONITOR_BUF); 5134 dp_print_ring_stat_from_hal(pdev->soc, 5135 &pdev->soc->rxdma_mon_dst_ring[mac_id], 5136 RXDMA_MONITOR_DST); 5137 dp_print_ring_stat_from_hal(pdev->soc, 5138 &pdev->soc->rxdma_mon_desc_ring[mac_id], 5139 RXDMA_MONITOR_DESC); 5140 } 5141 5142 dp_print_ring_stat_from_hal(pdev->soc, 5143 &pdev->soc->rxdma_mon_status_ring[mac_id], 5144 RXDMA_MONITOR_STATUS); 5145 } 5146 5147 void 5148 dp_print_ring_stats(struct dp_pdev *pdev) 5149 { 5150 uint32_t i; 5151 int mac_id; 5152 int lmac_id; 5153 5154 if (hif_pm_runtime_get_sync(pdev->soc->hif_handle, 5155 RTPM_ID_DP_PRINT_RING_STATS)) 5156 return; 5157 5158 dp_print_ring_stat_from_hal(pdev->soc, 5159 &pdev->soc->reo_exception_ring, 5160 REO_EXCEPTION); 5161 dp_print_ring_stat_from_hal(pdev->soc, 5162 &pdev->soc->reo_reinject_ring, 5163 REO_REINJECT); 5164 dp_print_ring_stat_from_hal(pdev->soc, 5165 &pdev->soc->reo_cmd_ring, 5166 REO_CMD); 5167 dp_print_ring_stat_from_hal(pdev->soc, 5168 &pdev->soc->reo_status_ring, 5169 REO_STATUS); 5170 dp_print_ring_stat_from_hal(pdev->soc, 5171 &pdev->soc->rx_rel_ring, 5172 WBM2SW_RELEASE); 5173 dp_print_ring_stat_from_hal(pdev->soc, 5174 &pdev->soc->tcl_cmd_credit_ring, 5175 TCL_CMD_CREDIT); 5176 dp_print_ring_stat_from_hal(pdev->soc, 5177 &pdev->soc->tcl_status_ring, 5178 TCL_STATUS); 5179 dp_print_ring_stat_from_hal(pdev->soc, 5180 &pdev->soc->wbm_desc_rel_ring, 5181 SW2WBM_RELEASE); 5182 for (i = 0; i < MAX_REO_DEST_RINGS; i++) 5183 dp_print_ring_stat_from_hal(pdev->soc, 5184 &pdev->soc->reo_dest_ring[i], 5185 REO_DST); 5186 5187 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 5188 dp_print_ring_stat_from_hal(pdev->soc, 5189 &pdev->soc->tcl_data_ring[i], 5190 TCL_DATA); 5191 for (i = 0; i < MAX_TCL_DATA_RINGS; i++) 5192 dp_print_ring_stat_from_hal(pdev->soc, 5193 &pdev->soc->tx_comp_ring[i], 5194 WBM2SW_RELEASE); 5195 5196 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0, pdev->pdev_id); 5197 dp_print_ring_stat_from_hal(pdev->soc, 5198 &pdev->soc->rx_refill_buf_ring[lmac_id], 5199 RXDMA_BUF); 5200 5201 dp_print_ring_stat_from_hal(pdev->soc, 5202 &pdev->rx_refill_buf_ring2, 5203 RXDMA_BUF); 5204 5205 for (i = 0; i < MAX_RX_MAC_RINGS; i++) 5206 dp_print_ring_stat_from_hal(pdev->soc, 5207 &pdev->rx_mac_buf_ring[i], 5208 RXDMA_BUF); 5209 5210 for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { 5211 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 5212 mac_id, pdev->pdev_id); 5213 5214 dp_print_mon_ring_stat_from_hal(pdev, lmac_id); 5215 } 5216 5217 for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++) { 5218 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 5219 i, pdev->pdev_id); 5220 5221 dp_print_ring_stat_from_hal(pdev->soc, 5222 &pdev->soc->rxdma_err_dst_ring 5223 [lmac_id], 5224 RXDMA_DST); 5225 } 5226 hif_pm_runtime_put(pdev->soc->hif_handle, 5227 RTPM_ID_DP_PRINT_RING_STATS); 5228 } 5229 5230 /** 5231 * dp_print_common_rates_info(): Print common rate for tx or rx 5232 * @pkt_type_array: rate type array contains rate info 5233 * 5234 * Return:void 5235 */ 5236 static inline void 5237 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array) 5238 { 5239 uint8_t mcs, pkt_type; 5240 5241 DP_PRINT_STATS("MSDU Count"); 5242 for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) { 5243 for (mcs = 0; mcs < MAX_MCS; mcs++) { 5244 if (!dp_rate_string[pkt_type][mcs].valid) 5245 continue; 5246 5247 DP_PRINT_STATS(" %s = %d", 5248 dp_rate_string[pkt_type][mcs].mcs_type, 5249 pkt_type_array[pkt_type].mcs_count[mcs]); 5250 } 5251 5252 DP_PRINT_STATS("\n"); 5253 } 5254 } 5255 5256 /** 5257 * dp_print_common_ppdu_rates_info(): Print common rate for tx or rx 5258 * @pkt_type_array: rate type array contains rate info 5259 * 5260 * Return:void 5261 */ 5262 static inline void 5263 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array) 5264 { 5265 uint8_t mcs; 5266 5267 DP_PRINT_STATS("PPDU Count"); 5268 for (mcs = 0; mcs < MAX_MCS; mcs++) { 5269 if (!dp_ppdu_rate_string[0][mcs].valid) 5270 continue; 5271 5272 DP_PRINT_STATS(" %s = %d", 5273 dp_ppdu_rate_string[0][mcs].mcs_type, 5274 pkt_type_array->mcs_count[mcs]); 5275 } 5276 5277 DP_PRINT_STATS("\n"); 5278 } 5279 5280 /** 5281 * dp_print_mu_ppdu_rates_info(): Print mu rate for tx or rx 5282 * @rx_mu: rx MU stats array 5283 * 5284 * Return:void 5285 */ 5286 static inline void 5287 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu) 5288 { 5289 uint8_t mcs, pkt_type; 5290 5291 DP_PRINT_STATS("PPDU Count"); 5292 for (pkt_type = 0; pkt_type < RX_TYPE_MU_MAX; pkt_type++) { 5293 for (mcs = 0; mcs < MAX_MCS; mcs++) { 5294 if (!dp_mu_rate_string[pkt_type][mcs].valid) 5295 continue; 5296 5297 DP_PRINT_STATS(" %s = %d", 5298 dp_mu_rate_string[pkt_type][mcs].mcs_type, 5299 rx_mu[pkt_type].ppdu.mcs_count[mcs]); 5300 } 5301 5302 DP_PRINT_STATS("\n"); 5303 } 5304 } 5305 5306 void dp_print_rx_rates(struct dp_vdev *vdev) 5307 { 5308 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 5309 uint8_t i; 5310 uint8_t index = 0; 5311 char nss[DP_NSS_LENGTH]; 5312 5313 DP_PRINT_STATS("Rx Rate Info:\n"); 5314 dp_print_common_rates_info(pdev->stats.rx.pkt_type); 5315 5316 index = 0; 5317 for (i = 0; i < SS_COUNT; i++) { 5318 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 5319 " %d", pdev->stats.rx.nss[i]); 5320 } 5321 DP_PRINT_STATS("NSS(1-8) = %s", 5322 nss); 5323 5324 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 5325 pdev->stats.rx.sgi_count[0], 5326 pdev->stats.rx.sgi_count[1], 5327 pdev->stats.rx.sgi_count[2], 5328 pdev->stats.rx.sgi_count[3]); 5329 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 5330 pdev->stats.rx.bw[0], pdev->stats.rx.bw[1], 5331 pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]); 5332 DP_PRINT_STATS("Reception Type =" 5333 "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d", 5334 pdev->stats.rx.reception_type[0], 5335 pdev->stats.rx.reception_type[1], 5336 pdev->stats.rx.reception_type[2], 5337 pdev->stats.rx.reception_type[3]); 5338 DP_PRINT_STATS("Aggregation:\n"); 5339 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 5340 pdev->stats.rx.ampdu_cnt); 5341 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 5342 pdev->stats.rx.non_ampdu_cnt); 5343 DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d", 5344 pdev->stats.rx.amsdu_cnt); 5345 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d", 5346 pdev->stats.rx.non_amsdu_cnt); 5347 } 5348 5349 void dp_print_tx_rates(struct dp_vdev *vdev) 5350 { 5351 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 5352 5353 DP_PRINT_STATS("Tx Rate Info:\n"); 5354 dp_print_common_rates_info(pdev->stats.tx.pkt_type); 5355 5356 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 5357 pdev->stats.tx.sgi_count[0], 5358 pdev->stats.tx.sgi_count[1], 5359 pdev->stats.tx.sgi_count[2], 5360 pdev->stats.tx.sgi_count[3]); 5361 5362 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 5363 pdev->stats.tx.bw[0], pdev->stats.tx.bw[1], 5364 pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]); 5365 5366 DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma); 5367 DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc); 5368 DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc); 5369 DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries); 5370 DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi); 5371 5372 DP_PRINT_STATS("Aggregation:\n"); 5373 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 5374 pdev->stats.tx.ampdu_cnt); 5375 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 5376 pdev->stats.tx.non_ampdu_cnt); 5377 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 5378 pdev->stats.tx.amsdu_cnt); 5379 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 5380 pdev->stats.tx.non_amsdu_cnt); 5381 } 5382 5383 /** 5384 * dp_print_nss(): Print nss count 5385 * @nss: printable nss count array 5386 * @pnss: nss count array 5387 * @ss_count: number of nss 5388 * 5389 * Return:void 5390 */ 5391 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count) 5392 { 5393 uint32_t index; 5394 uint8_t i; 5395 5396 index = 0; 5397 for (i = 0; i < ss_count; i++) { 5398 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 5399 " %d", *(pnss + i)); 5400 } 5401 } 5402 5403 /** 5404 * dp_print_jitter_stats(): Print per-tid jitter stats 5405 * @peer: DP peer object 5406 * @pdev: DP pdev object 5407 * 5408 * Return: void 5409 */ 5410 #ifdef WLAN_PEER_JITTER 5411 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 5412 { 5413 uint8_t tid = 0; 5414 5415 if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) 5416 return; 5417 5418 DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n"); 5419 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 5420 struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; 5421 5422 DP_PRINT_STATS("Node tid = %d\n" 5423 "Average Jiiter : %u (us)\n" 5424 "Average Delay : %u (us)\n" 5425 "Total Average error count : %llu\n" 5426 "Total Success Count : %llu\n" 5427 "Total Drop : %llu\n", 5428 rx_tid->tid, 5429 rx_tid->tx_avg_jitter, 5430 rx_tid->tx_avg_delay, 5431 rx_tid->tx_avg_err, 5432 rx_tid->tx_total_success, 5433 rx_tid->tx_drop); 5434 } 5435 } 5436 #else 5437 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 5438 { 5439 } 5440 #endif /* WLAN_PEER_JITTER */ 5441 5442 void dp_print_peer_stats(struct dp_peer *peer) 5443 { 5444 uint8_t i; 5445 uint32_t index; 5446 uint32_t j; 5447 char nss[DP_NSS_LENGTH]; 5448 char mu_group_id[DP_MU_GROUP_LENGTH]; 5449 struct dp_pdev *pdev; 5450 uint32_t *pnss; 5451 enum cdp_mu_packet_type rx_mu_type; 5452 struct cdp_rx_mu *rx_mu; 5453 5454 pdev = peer->vdev->pdev; 5455 5456 DP_PRINT_STATS("Node Tx Stats:\n"); 5457 DP_PRINT_STATS("Total Packet Completions = %d", 5458 peer->stats.tx.comp_pkt.num); 5459 DP_PRINT_STATS("Total Bytes Completions = %llu", 5460 peer->stats.tx.comp_pkt.bytes); 5461 DP_PRINT_STATS("Success Packets = %d", 5462 peer->stats.tx.tx_success.num); 5463 DP_PRINT_STATS("Success Bytes = %llu", 5464 peer->stats.tx.tx_success.bytes); 5465 DP_PRINT_STATS("Unicast Success Packets = %d", 5466 peer->stats.tx.ucast.num); 5467 DP_PRINT_STATS("Unicast Success Bytes = %llu", 5468 peer->stats.tx.ucast.bytes); 5469 DP_PRINT_STATS("Multicast Success Packets = %d", 5470 peer->stats.tx.mcast.num); 5471 DP_PRINT_STATS("Multicast Success Bytes = %llu", 5472 peer->stats.tx.mcast.bytes); 5473 DP_PRINT_STATS("Broadcast Success Packets = %d", 5474 peer->stats.tx.bcast.num); 5475 DP_PRINT_STATS("Broadcast Success Bytes = %llu", 5476 peer->stats.tx.bcast.bytes); 5477 DP_PRINT_STATS("Packets Failed = %d", 5478 peer->stats.tx.tx_failed); 5479 DP_PRINT_STATS("Packets In OFDMA = %d", 5480 peer->stats.tx.ofdma); 5481 DP_PRINT_STATS("Packets In STBC = %d", 5482 peer->stats.tx.stbc); 5483 DP_PRINT_STATS("Packets In LDPC = %d", 5484 peer->stats.tx.ldpc); 5485 DP_PRINT_STATS("Packet Retries = %d", 5486 peer->stats.tx.retries); 5487 DP_PRINT_STATS("MSDU's Part of AMSDU = %d", 5488 peer->stats.tx.amsdu_cnt); 5489 DP_PRINT_STATS("Msdu's As Part of Ampdu = %d", 5490 peer->stats.tx.non_ampdu_cnt); 5491 DP_PRINT_STATS("Msdu's As Ampdu = %d", 5492 peer->stats.tx.ampdu_cnt); 5493 DP_PRINT_STATS("Last Packet RSSI = %d", 5494 peer->stats.tx.last_ack_rssi); 5495 DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u", 5496 peer->stats.tx.dropped.fw_rem.num); 5497 if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { 5498 DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu", 5499 peer->stats.tx.dropped.fw_rem.bytes); 5500 } 5501 DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d", 5502 peer->stats.tx.dropped.fw_rem_tx); 5503 DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d", 5504 peer->stats.tx.dropped.fw_rem_notx); 5505 DP_PRINT_STATS("Dropped : Age Out = %d", 5506 peer->stats.tx.dropped.age_out); 5507 DP_PRINT_STATS("NAWDS : "); 5508 DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d", 5509 peer->stats.tx.nawds_mcast_drop); 5510 DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %d", 5511 peer->stats.tx.nawds_mcast.num); 5512 DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu", 5513 peer->stats.tx.nawds_mcast.bytes); 5514 5515 DP_PRINT_STATS("Rate Info:"); 5516 dp_print_common_rates_info(peer->stats.tx.pkt_type); 5517 5518 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 5519 peer->stats.tx.sgi_count[0], 5520 peer->stats.tx.sgi_count[1], 5521 peer->stats.tx.sgi_count[2], 5522 peer->stats.tx.sgi_count[3]); 5523 DP_PRINT_STATS("Excess Retries per AC "); 5524 DP_PRINT_STATS(" Best effort = %d", 5525 peer->stats.tx.excess_retries_per_ac[0]); 5526 DP_PRINT_STATS(" Background= %d", 5527 peer->stats.tx.excess_retries_per_ac[1]); 5528 DP_PRINT_STATS(" Video = %d", 5529 peer->stats.tx.excess_retries_per_ac[2]); 5530 DP_PRINT_STATS(" Voice = %d", 5531 peer->stats.tx.excess_retries_per_ac[3]); 5532 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", 5533 peer->stats.tx.bw[0], peer->stats.tx.bw[1], 5534 peer->stats.tx.bw[2], peer->stats.tx.bw[3]); 5535 5536 pnss = &peer->stats.tx.nss[0]; 5537 dp_print_nss(nss, pnss, SS_COUNT); 5538 5539 DP_PRINT_STATS("NSS(1-8) = %s", nss); 5540 5541 DP_PRINT_STATS("Transmit Type :"); 5542 DP_PRINT_STATS("SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 5543 peer->stats.tx.transmit_type[SU].num_msdu, 5544 peer->stats.tx.transmit_type[MU_MIMO].num_msdu, 5545 peer->stats.tx.transmit_type[MU_OFDMA].num_msdu, 5546 peer->stats.tx.transmit_type[MU_MIMO_OFDMA].num_msdu); 5547 5548 for (i = 0; i < MAX_MU_GROUP_ID;) { 5549 index = 0; 5550 for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID; 5551 j++) { 5552 index += qdf_snprint(&mu_group_id[index], 5553 DP_MU_GROUP_LENGTH - index, 5554 " %d", 5555 peer->stats.tx.mu_group_id[i]); 5556 i++; 5557 } 5558 5559 DP_PRINT_STATS("User position list for GID %02d->%d: [%s]", 5560 i - DP_MU_GROUP_SHOW, i - 1, mu_group_id); 5561 } 5562 5563 DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]", 5564 peer->stats.tx.ru_start, peer->stats.tx.ru_tones); 5565 DP_PRINT_STATS("RU Locations RU[26 52 106 242 484 996]:"); 5566 DP_PRINT_STATS("RU_26: %d", 5567 peer->stats.tx.ru_loc[RU_26_INDEX].num_msdu); 5568 DP_PRINT_STATS("RU 52: %d", 5569 peer->stats.tx.ru_loc[RU_52_INDEX].num_msdu); 5570 DP_PRINT_STATS("RU 106: %d", 5571 peer->stats.tx.ru_loc[RU_106_INDEX].num_msdu); 5572 DP_PRINT_STATS("RU 242: %d", 5573 peer->stats.tx.ru_loc[RU_242_INDEX].num_msdu); 5574 DP_PRINT_STATS("RU 484: %d", 5575 peer->stats.tx.ru_loc[RU_484_INDEX].num_msdu); 5576 DP_PRINT_STATS("RU 996: %d", 5577 peer->stats.tx.ru_loc[RU_996_INDEX].num_msdu); 5578 5579 DP_PRINT_STATS("Aggregation:"); 5580 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 5581 peer->stats.tx.amsdu_cnt); 5582 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 5583 peer->stats.tx.non_amsdu_cnt); 5584 5585 DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:"); 5586 DP_PRINT_STATS(" Bytes transmitted in last sec: %d", 5587 peer->stats.tx.tx_byte_rate); 5588 DP_PRINT_STATS(" Data transmitted in last sec: %d", 5589 peer->stats.tx.tx_data_rate); 5590 5591 dp_print_jitter_stats(peer, pdev); 5592 5593 DP_PRINT_STATS("Node Rx Stats:"); 5594 DP_PRINT_STATS("Packets Sent To Stack = %d", 5595 peer->stats.rx.to_stack.num); 5596 DP_PRINT_STATS("Bytes Sent To Stack = %llu", 5597 peer->stats.rx.to_stack.bytes); 5598 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 5599 DP_PRINT_STATS("Ring Id = %d", i); 5600 DP_PRINT_STATS(" Packets Received = %d", 5601 peer->stats.rx.rcvd_reo[i].num); 5602 DP_PRINT_STATS(" Bytes Received = %llu", 5603 peer->stats.rx.rcvd_reo[i].bytes); 5604 } 5605 DP_PRINT_STATS("Multicast Packets Received = %d", 5606 peer->stats.rx.multicast.num); 5607 DP_PRINT_STATS("Multicast Bytes Received = %llu", 5608 peer->stats.rx.multicast.bytes); 5609 DP_PRINT_STATS("Broadcast Packets Received = %d", 5610 peer->stats.rx.bcast.num); 5611 DP_PRINT_STATS("Broadcast Bytes Received = %llu", 5612 peer->stats.rx.bcast.bytes); 5613 DP_PRINT_STATS("Intra BSS Packets Received = %d", 5614 peer->stats.rx.intra_bss.pkts.num); 5615 DP_PRINT_STATS("Intra BSS Bytes Received = %llu", 5616 peer->stats.rx.intra_bss.pkts.bytes); 5617 DP_PRINT_STATS("Raw Packets Received = %d", 5618 peer->stats.rx.raw.num); 5619 DP_PRINT_STATS("Raw Bytes Received = %llu", 5620 peer->stats.rx.raw.bytes); 5621 DP_PRINT_STATS("Errors: MIC Errors = %d", 5622 peer->stats.rx.err.mic_err); 5623 DP_PRINT_STATS("Erros: Decryption Errors = %d", 5624 peer->stats.rx.err.decrypt_err); 5625 DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d", 5626 peer->stats.rx.non_ampdu_cnt); 5627 DP_PRINT_STATS("Msdu's Recived As Ampdu = %d", 5628 peer->stats.rx.ampdu_cnt); 5629 DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d", 5630 peer->stats.rx.non_amsdu_cnt); 5631 DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d", 5632 peer->stats.rx.amsdu_cnt); 5633 DP_PRINT_STATS("NAWDS : "); 5634 DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d", 5635 peer->stats.rx.nawds_mcast_drop); 5636 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 5637 peer->stats.rx.sgi_count[0], 5638 peer->stats.rx.sgi_count[1], 5639 peer->stats.rx.sgi_count[2], 5640 peer->stats.rx.sgi_count[3]); 5641 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", 5642 peer->stats.rx.bw[0], peer->stats.rx.bw[1], 5643 peer->stats.rx.bw[2], peer->stats.rx.bw[3]); 5644 DP_PRINT_STATS("MSDU Reception Type"); 5645 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 5646 peer->stats.rx.reception_type[0], 5647 peer->stats.rx.reception_type[1], 5648 peer->stats.rx.reception_type[2], 5649 peer->stats.rx.reception_type[3]); 5650 DP_PRINT_STATS("PPDU Reception Type"); 5651 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 5652 peer->stats.rx.ppdu_cnt[0], 5653 peer->stats.rx.ppdu_cnt[1], 5654 peer->stats.rx.ppdu_cnt[2], 5655 peer->stats.rx.ppdu_cnt[3]); 5656 5657 dp_print_common_rates_info(peer->stats.rx.pkt_type); 5658 dp_print_common_ppdu_rates_info(&peer->stats.rx.su_ax_ppdu_cnt); 5659 dp_print_mu_ppdu_rates_info(&peer->stats.rx.rx_mu[0]); 5660 5661 pnss = &peer->stats.rx.nss[0]; 5662 dp_print_nss(nss, pnss, SS_COUNT); 5663 DP_PRINT_STATS("MSDU Count"); 5664 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 5665 5666 DP_PRINT_STATS("reception mode SU"); 5667 pnss = &peer->stats.rx.ppdu_nss[0]; 5668 dp_print_nss(nss, pnss, SS_COUNT); 5669 5670 DP_PRINT_STATS(" PPDU Count"); 5671 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 5672 5673 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 5674 peer->stats.rx.mpdu_cnt_fcs_ok, 5675 peer->stats.rx.mpdu_cnt_fcs_err); 5676 5677 for (rx_mu_type = 0; rx_mu_type < RX_TYPE_MU_MAX; rx_mu_type++) { 5678 DP_PRINT_STATS("reception mode %s", 5679 mu_reception_mode[rx_mu_type]); 5680 rx_mu = &peer->stats.rx.rx_mu[rx_mu_type]; 5681 5682 pnss = &rx_mu->ppdu_nss[0]; 5683 dp_print_nss(nss, pnss, SS_COUNT); 5684 DP_PRINT_STATS(" PPDU Count"); 5685 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 5686 5687 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 5688 rx_mu->mpdu_cnt_fcs_ok, 5689 rx_mu->mpdu_cnt_fcs_err); 5690 } 5691 5692 DP_PRINT_STATS("Aggregation:"); 5693 DP_PRINT_STATS(" Msdu's Part of Ampdu = %d", 5694 peer->stats.rx.ampdu_cnt); 5695 DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %d", 5696 peer->stats.rx.non_ampdu_cnt); 5697 DP_PRINT_STATS(" Msdu's Part of Amsdu = %d", 5698 peer->stats.rx.amsdu_cnt); 5699 DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %d", 5700 peer->stats.rx.non_amsdu_cnt); 5701 5702 DP_PRINT_STATS("Bytes and Packets received in last one sec:"); 5703 DP_PRINT_STATS(" Bytes received in last sec: %d", 5704 peer->stats.rx.rx_byte_rate); 5705 DP_PRINT_STATS(" Data received in last sec: %d", 5706 peer->stats.rx.rx_data_rate); 5707 DP_PRINT_STATS("Multipass Rx Packet Drop = %d", 5708 peer->stats.rx.multipass_rx_pkt_drop); 5709 } 5710 5711 void dp_print_per_ring_stats(struct dp_soc *soc) 5712 { 5713 uint8_t ring; 5714 uint16_t core; 5715 uint64_t total_packets; 5716 5717 DP_PRINT_STATS("Reo packets per ring:"); 5718 for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) { 5719 total_packets = 0; 5720 DP_PRINT_STATS("Packets on ring %u:", ring); 5721 for (core = 0; core < num_possible_cpus(); core++) { 5722 if (!soc->stats.rx.ring_packets[core][ring]) 5723 continue; 5724 DP_PRINT_STATS("Packets arriving on core %u: %llu", 5725 core, 5726 soc->stats.rx.ring_packets[core][ring]); 5727 total_packets += soc->stats.rx.ring_packets[core][ring]; 5728 } 5729 DP_PRINT_STATS("Total packets on ring %u: %llu", 5730 ring, total_packets); 5731 } 5732 } 5733 5734 void dp_txrx_path_stats(struct dp_soc *soc) 5735 { 5736 uint8_t error_code; 5737 uint8_t loop_pdev; 5738 struct dp_pdev *pdev; 5739 uint8_t i; 5740 5741 if (!soc) { 5742 dp_err("%s: Invalid access", __func__); 5743 return; 5744 } 5745 5746 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 5747 pdev = soc->pdev_list[loop_pdev]; 5748 dp_aggregate_pdev_stats(pdev); 5749 DP_PRINT_STATS("Tx path Statistics:"); 5750 DP_PRINT_STATS("from stack: %u msdus (%llu bytes)", 5751 pdev->stats.tx_i.rcvd.num, 5752 pdev->stats.tx_i.rcvd.bytes); 5753 DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)", 5754 pdev->stats.tx_i.processed.num, 5755 pdev->stats.tx_i.processed.bytes); 5756 DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)", 5757 pdev->stats.tx.tx_success.num, 5758 pdev->stats.tx.tx_success.bytes); 5759 5760 DP_PRINT_STATS("Dropped in host:"); 5761 DP_PRINT_STATS("Total packets dropped: %u,", 5762 pdev->stats.tx_i.dropped.dropped_pkt.num); 5763 DP_PRINT_STATS("Descriptor not available: %u", 5764 pdev->stats.tx_i.dropped.desc_na.num); 5765 DP_PRINT_STATS("Ring full: %u", 5766 pdev->stats.tx_i.dropped.ring_full); 5767 DP_PRINT_STATS("Enqueue fail: %u", 5768 pdev->stats.tx_i.dropped.enqueue_fail); 5769 DP_PRINT_STATS("DMA Error: %u", 5770 pdev->stats.tx_i.dropped.dma_error); 5771 5772 DP_PRINT_STATS("Dropped in hardware:"); 5773 DP_PRINT_STATS("total packets dropped: %u", 5774 pdev->stats.tx.tx_failed); 5775 DP_PRINT_STATS("mpdu age out: %u", 5776 pdev->stats.tx.dropped.age_out); 5777 DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)", 5778 pdev->stats.tx.dropped.fw_rem.num, 5779 pdev->stats.tx.dropped.fw_rem.bytes); 5780 DP_PRINT_STATS("firmware removed tx: %u", 5781 pdev->stats.tx.dropped.fw_rem_tx); 5782 DP_PRINT_STATS("firmware removed notx %u", 5783 pdev->stats.tx.dropped.fw_rem_notx); 5784 DP_PRINT_STATS("Invalid peer on tx path: %u", 5785 pdev->soc->stats.tx.tx_invalid_peer.num); 5786 5787 DP_PRINT_STATS("Tx packets sent per interrupt:"); 5788 DP_PRINT_STATS("Single Packet: %u", 5789 pdev->stats.tx_comp_histogram.pkts_1); 5790 DP_PRINT_STATS("2-20 Packets: %u", 5791 pdev->stats.tx_comp_histogram.pkts_2_20); 5792 DP_PRINT_STATS("21-40 Packets: %u", 5793 pdev->stats.tx_comp_histogram.pkts_21_40); 5794 DP_PRINT_STATS("41-60 Packets: %u", 5795 pdev->stats.tx_comp_histogram.pkts_41_60); 5796 DP_PRINT_STATS("61-80 Packets: %u", 5797 pdev->stats.tx_comp_histogram.pkts_61_80); 5798 DP_PRINT_STATS("81-100 Packets: %u", 5799 pdev->stats.tx_comp_histogram.pkts_81_100); 5800 DP_PRINT_STATS("101-200 Packets: %u", 5801 pdev->stats.tx_comp_histogram.pkts_101_200); 5802 DP_PRINT_STATS(" 201+ Packets: %u", 5803 pdev->stats.tx_comp_histogram.pkts_201_plus); 5804 5805 DP_PRINT_STATS("Rx path statistics"); 5806 5807 DP_PRINT_STATS("delivered %u msdus ( %llu bytes),", 5808 pdev->stats.rx.to_stack.num, 5809 pdev->stats.rx.to_stack.bytes); 5810 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 5811 if (!pdev->stats.rx.rcvd_reo[i].num) 5812 continue; 5813 DP_PRINT_STATS( 5814 "received on reo[%d] %u msdus( %llu bytes),", 5815 i, pdev->stats.rx.rcvd_reo[i].num, 5816 pdev->stats.rx.rcvd_reo[i].bytes); 5817 } 5818 DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),", 5819 pdev->stats.rx.intra_bss.pkts.num, 5820 pdev->stats.rx.intra_bss.pkts.bytes); 5821 DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),", 5822 pdev->stats.rx.intra_bss.fail.num, 5823 pdev->stats.rx.intra_bss.fail.bytes); 5824 DP_PRINT_STATS("intra-bss no mdns fwds %u msdus", 5825 pdev->stats.rx.intra_bss.mdns_no_fwd); 5826 5827 DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),", 5828 pdev->stats.rx.raw.num, 5829 pdev->stats.rx.raw.bytes); 5830 DP_PRINT_STATS("mic errors %u", 5831 pdev->stats.rx.err.mic_err); 5832 DP_PRINT_STATS("Invalid peer on rx path: %u", 5833 pdev->soc->stats.rx.err.rx_invalid_peer.num); 5834 DP_PRINT_STATS("sw_peer_id invalid %u", 5835 pdev->soc->stats.rx.err.rx_invalid_peer_id.num); 5836 DP_PRINT_STATS("packet_len invalid %u", 5837 pdev->soc->stats.rx.err.rx_invalid_pkt_len.num); 5838 DP_PRINT_STATS("sa or da idx invalid %u", 5839 pdev->soc->stats.rx.err.invalid_sa_da_idx); 5840 DP_PRINT_STATS("defrag peer uninit %u", 5841 pdev->soc->stats.rx.err.defrag_peer_uninit); 5842 DP_PRINT_STATS("pkts delivered no peer %u", 5843 pdev->soc->stats.rx.err.pkt_delivered_no_peer); 5844 DP_PRINT_STATS("RX invalid cookie: %d", 5845 soc->stats.rx.err.invalid_cookie); 5846 DP_PRINT_STATS("2k jump delba sent: %u", 5847 pdev->soc->stats.rx.err.rx_2k_jump_delba_sent); 5848 DP_PRINT_STATS("2k jump msdu to stack: %u", 5849 pdev->soc->stats.rx.err.rx_2k_jump_to_stack); 5850 DP_PRINT_STATS("2k jump msdu drop: %u", 5851 pdev->soc->stats.rx.err.rx_2k_jump_drop); 5852 DP_PRINT_STATS("REO err oor msdu to stack %u", 5853 pdev->soc->stats.rx.err.reo_err_oor_to_stack); 5854 DP_PRINT_STATS("REO err oor msdu drop: %u", 5855 pdev->soc->stats.rx.err.reo_err_oor_drop); 5856 DP_PRINT_STATS("Rx err msdu rejected: %d", 5857 soc->stats.rx.err.rejected); 5858 5859 DP_PRINT_STATS("Reo Statistics"); 5860 DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full); 5861 DP_PRINT_STATS("rbm error: %u msdus", 5862 pdev->soc->stats.rx.err.invalid_rbm); 5863 DP_PRINT_STATS("hal ring access fail: %u msdus", 5864 pdev->soc->stats.rx.err.hal_ring_access_fail); 5865 5866 DP_PRINT_STATS("hal ring access full fail: %u msdus", 5867 pdev->soc->stats.rx.err.hal_ring_access_full_fail); 5868 5869 for (error_code = 0; error_code < HAL_REO_ERR_MAX; 5870 error_code++) { 5871 if (!pdev->soc->stats.rx.err.reo_error[error_code]) 5872 continue; 5873 DP_PRINT_STATS("Reo error number (%u): %u msdus", 5874 error_code, 5875 pdev->soc->stats.rx.err 5876 .reo_error[error_code]); 5877 } 5878 5879 for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX; 5880 error_code++) { 5881 if (!pdev->soc->stats.rx.err.rxdma_error[error_code]) 5882 continue; 5883 DP_PRINT_STATS("Rxdma error number (%u): %u msdus", 5884 error_code, 5885 pdev->soc->stats.rx.err 5886 .rxdma_error[error_code]); 5887 } 5888 5889 DP_PRINT_STATS("Rx packets reaped per interrupt:"); 5890 DP_PRINT_STATS("Single Packet: %u", 5891 pdev->stats.rx_ind_histogram.pkts_1); 5892 DP_PRINT_STATS("2-20 Packets: %u", 5893 pdev->stats.rx_ind_histogram.pkts_2_20); 5894 DP_PRINT_STATS("21-40 Packets: %u", 5895 pdev->stats.rx_ind_histogram.pkts_21_40); 5896 DP_PRINT_STATS("41-60 Packets: %u", 5897 pdev->stats.rx_ind_histogram.pkts_41_60); 5898 DP_PRINT_STATS("61-80 Packets: %u", 5899 pdev->stats.rx_ind_histogram.pkts_61_80); 5900 DP_PRINT_STATS("81-100 Packets: %u", 5901 pdev->stats.rx_ind_histogram.pkts_81_100); 5902 DP_PRINT_STATS("101-200 Packets: %u", 5903 pdev->stats.rx_ind_histogram.pkts_101_200); 5904 DP_PRINT_STATS(" 201+ Packets: %u", 5905 pdev->stats.rx_ind_histogram.pkts_201_plus); 5906 5907 DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u", 5908 __func__, 5909 pdev->soc->wlan_cfg_ctx 5910 ->tso_enabled, 5911 pdev->soc->wlan_cfg_ctx 5912 ->lro_enabled, 5913 pdev->soc->wlan_cfg_ctx 5914 ->rx_hash, 5915 pdev->soc->wlan_cfg_ctx 5916 ->napi_enabled); 5917 #ifdef QCA_LL_TX_FLOW_CONTROL_V2 5918 DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u", 5919 __func__, 5920 pdev->soc->wlan_cfg_ctx 5921 ->tx_flow_stop_queue_threshold, 5922 pdev->soc->wlan_cfg_ctx 5923 ->tx_flow_start_queue_offset); 5924 #endif 5925 } 5926 } 5927 5928 /* 5929 * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats 5930 * Current scope is bar received count 5931 * 5932 * @pdev_handle: DP_PDEV handle 5933 * 5934 * Return: void 5935 */ 5936 static void 5937 dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev) 5938 { 5939 struct dp_vdev *vdev; 5940 struct dp_peer *peer; 5941 uint32_t waitcnt; 5942 5943 TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { 5944 TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { 5945 if (!peer) { 5946 dp_err("DP Invalid Peer refernce"); 5947 return; 5948 } 5949 5950 if (peer->delete_in_progress) { 5951 dp_err("DP Peer deletion in progress"); 5952 continue; 5953 } 5954 qdf_atomic_inc(&peer->ref_cnt); 5955 waitcnt = 0; 5956 dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev); 5957 while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) && 5958 waitcnt < 10) { 5959 schedule_timeout_interruptible( 5960 STATS_PROC_TIMEOUT); 5961 waitcnt++; 5962 } 5963 qdf_atomic_set(&pdev->stats_cmd_complete, 0); 5964 dp_peer_unref_delete(peer); 5965 } 5966 } 5967 } 5968 5969 void 5970 dp_print_pdev_tx_stats(struct dp_pdev *pdev) 5971 { 5972 uint8_t i = 0, index = 0; 5973 5974 DP_PRINT_STATS("PDEV Tx Stats:\n"); 5975 DP_PRINT_STATS("Received From Stack:"); 5976 DP_PRINT_STATS(" Packets = %d", 5977 pdev->stats.tx_i.rcvd.num); 5978 DP_PRINT_STATS(" Bytes = %llu", 5979 pdev->stats.tx_i.rcvd.bytes); 5980 DP_PRINT_STATS("Processed:"); 5981 DP_PRINT_STATS(" Packets = %d", 5982 pdev->stats.tx_i.processed.num); 5983 DP_PRINT_STATS(" Bytes = %llu", 5984 pdev->stats.tx_i.processed.bytes); 5985 DP_PRINT_STATS("Total Completions:"); 5986 DP_PRINT_STATS(" Packets = %u", 5987 pdev->stats.tx.comp_pkt.num); 5988 DP_PRINT_STATS(" Bytes = %llu", 5989 pdev->stats.tx.comp_pkt.bytes); 5990 DP_PRINT_STATS("Successful Completions:"); 5991 DP_PRINT_STATS(" Packets = %u", 5992 pdev->stats.tx.tx_success.num); 5993 DP_PRINT_STATS(" Bytes = %llu", 5994 pdev->stats.tx.tx_success.bytes); 5995 DP_PRINT_STATS("Dropped:"); 5996 DP_PRINT_STATS(" Total = %d", 5997 pdev->stats.tx_i.dropped.dropped_pkt.num); 5998 DP_PRINT_STATS(" Dma_map_error = %d", 5999 pdev->stats.tx_i.dropped.dma_error); 6000 DP_PRINT_STATS(" Ring Full = %d", 6001 pdev->stats.tx_i.dropped.ring_full); 6002 DP_PRINT_STATS(" Descriptor Not available = %d", 6003 pdev->stats.tx_i.dropped.desc_na.num); 6004 DP_PRINT_STATS(" HW enqueue failed= %d", 6005 pdev->stats.tx_i.dropped.enqueue_fail); 6006 DP_PRINT_STATS(" Resources Full = %d", 6007 pdev->stats.tx_i.dropped.res_full); 6008 DP_PRINT_STATS(" FW removed Pkts = %u", 6009 pdev->stats.tx.dropped.fw_rem.num); 6010 DP_PRINT_STATS(" FW removed bytes= %llu", 6011 pdev->stats.tx.dropped.fw_rem.bytes); 6012 DP_PRINT_STATS(" FW removed transmitted = %d", 6013 pdev->stats.tx.dropped.fw_rem_tx); 6014 DP_PRINT_STATS(" FW removed untransmitted = %d", 6015 pdev->stats.tx.dropped.fw_rem_notx); 6016 DP_PRINT_STATS(" FW removed untransmitted fw_reason1 = %d", 6017 pdev->stats.tx.dropped.fw_reason1); 6018 DP_PRINT_STATS(" FW removed untransmitted fw_reason2 = %d", 6019 pdev->stats.tx.dropped.fw_reason2); 6020 DP_PRINT_STATS(" FW removed untransmitted fw_reason3 = %d", 6021 pdev->stats.tx.dropped.fw_reason3); 6022 DP_PRINT_STATS(" Aged Out from msdu/mpdu queues = %d", 6023 pdev->stats.tx.dropped.age_out); 6024 DP_PRINT_STATS(" headroom insufficient = %d", 6025 pdev->stats.tx_i.dropped.headroom_insufficient); 6026 DP_PRINT_STATS("Multicast:"); 6027 DP_PRINT_STATS(" Packets: %u", 6028 pdev->stats.tx.mcast.num); 6029 DP_PRINT_STATS(" Bytes: %llu", 6030 pdev->stats.tx.mcast.bytes); 6031 DP_PRINT_STATS("Scatter Gather:"); 6032 DP_PRINT_STATS(" Packets = %d", 6033 pdev->stats.tx_i.sg.sg_pkt.num); 6034 DP_PRINT_STATS(" Bytes = %llu", 6035 pdev->stats.tx_i.sg.sg_pkt.bytes); 6036 DP_PRINT_STATS(" Dropped By Host = %d", 6037 pdev->stats.tx_i.sg.dropped_host.num); 6038 DP_PRINT_STATS(" Dropped By Target = %d", 6039 pdev->stats.tx_i.sg.dropped_target); 6040 DP_PRINT_STATS("Mcast Enhancement:"); 6041 DP_PRINT_STATS(" Packets = %d", 6042 pdev->stats.tx_i.mcast_en.mcast_pkt.num); 6043 DP_PRINT_STATS(" Bytes = %llu", 6044 pdev->stats.tx_i.mcast_en.mcast_pkt.bytes); 6045 DP_PRINT_STATS(" Dropped: Map Errors = %d", 6046 pdev->stats.tx_i.mcast_en.dropped_map_error); 6047 DP_PRINT_STATS(" Dropped: Self Mac = %d", 6048 pdev->stats.tx_i.mcast_en.dropped_self_mac); 6049 DP_PRINT_STATS(" Dropped: Send Fail = %d", 6050 pdev->stats.tx_i.mcast_en.dropped_send_fail); 6051 DP_PRINT_STATS(" Unicast sent = %d", 6052 pdev->stats.tx_i.mcast_en.ucast); 6053 DP_PRINT_STATS("Raw:"); 6054 DP_PRINT_STATS(" Packets = %d", 6055 pdev->stats.tx_i.raw.raw_pkt.num); 6056 DP_PRINT_STATS(" Bytes = %llu", 6057 pdev->stats.tx_i.raw.raw_pkt.bytes); 6058 DP_PRINT_STATS(" DMA map error = %d", 6059 pdev->stats.tx_i.raw.dma_map_error); 6060 DP_PRINT_STATS(" RAW pkt type[!data] error = %d", 6061 pdev->stats.tx_i.raw.invalid_raw_pkt_datatype); 6062 DP_PRINT_STATS("Reinjected:"); 6063 DP_PRINT_STATS(" Packets = %d", 6064 pdev->stats.tx_i.reinject_pkts.num); 6065 DP_PRINT_STATS(" Bytes = %llu\n", 6066 pdev->stats.tx_i.reinject_pkts.bytes); 6067 DP_PRINT_STATS("Inspected:"); 6068 DP_PRINT_STATS(" Packets = %d", 6069 pdev->stats.tx_i.inspect_pkts.num); 6070 DP_PRINT_STATS(" Bytes = %llu", 6071 pdev->stats.tx_i.inspect_pkts.bytes); 6072 DP_PRINT_STATS("Nawds Multicast:"); 6073 DP_PRINT_STATS(" Packets = %d", 6074 pdev->stats.tx_i.nawds_mcast.num); 6075 DP_PRINT_STATS(" Bytes = %llu", 6076 pdev->stats.tx_i.nawds_mcast.bytes); 6077 DP_PRINT_STATS("CCE Classified:"); 6078 DP_PRINT_STATS(" CCE Classified Packets: %u", 6079 pdev->stats.tx_i.cce_classified); 6080 DP_PRINT_STATS(" RAW CCE Classified Packets: %u", 6081 pdev->stats.tx_i.cce_classified_raw); 6082 DP_PRINT_STATS("Mesh stats:"); 6083 DP_PRINT_STATS(" frames to firmware: %u", 6084 pdev->stats.tx_i.mesh.exception_fw); 6085 DP_PRINT_STATS(" completions from fw: %u", 6086 pdev->stats.tx_i.mesh.completion_fw); 6087 DP_PRINT_STATS("PPDU stats counter"); 6088 for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) { 6089 DP_PRINT_STATS(" Tag[%d] = %llu", index, 6090 pdev->stats.ppdu_stats_counter[index]); 6091 } 6092 DP_PRINT_STATS("BA not received for delayed_ba: %d", 6093 pdev->stats.cdp_delayed_ba_not_recev); 6094 DP_PRINT_STATS("tx_ppdu_proc: %llu", 6095 pdev->stats.tx_ppdu_proc); 6096 DP_PRINT_STATS("ack ba comes twice: %llu", 6097 pdev->stats.ack_ba_comes_twice); 6098 DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu", 6099 pdev->stats.ppdu_drop); 6100 6101 for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) { 6102 if (!pdev->stats.wdi_event[i]) 6103 DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d", 6104 i, pdev->stats.wdi_event[i]); 6105 } 6106 6107 dp_print_pdev_tx_capture_stats(pdev); 6108 } 6109 6110 void 6111 dp_print_pdev_rx_stats(struct dp_pdev *pdev) 6112 { 6113 DP_PRINT_STATS("PDEV Rx Stats:\n"); 6114 DP_PRINT_STATS("Received From HW (Per Rx Ring):"); 6115 DP_PRINT_STATS(" Packets = %d %d %d %d", 6116 pdev->stats.rx.rcvd_reo[0].num, 6117 pdev->stats.rx.rcvd_reo[1].num, 6118 pdev->stats.rx.rcvd_reo[2].num, 6119 pdev->stats.rx.rcvd_reo[3].num); 6120 DP_PRINT_STATS(" Bytes = %llu %llu %llu %llu", 6121 pdev->stats.rx.rcvd_reo[0].bytes, 6122 pdev->stats.rx.rcvd_reo[1].bytes, 6123 pdev->stats.rx.rcvd_reo[2].bytes, 6124 pdev->stats.rx.rcvd_reo[3].bytes); 6125 DP_PRINT_STATS("Replenished:"); 6126 DP_PRINT_STATS(" Packets = %d", 6127 pdev->stats.replenish.pkts.num); 6128 DP_PRINT_STATS(" Buffers Added To Freelist = %d", 6129 pdev->stats.buf_freelist); 6130 DP_PRINT_STATS(" Low threshold intr = %d", 6131 pdev->stats.replenish.low_thresh_intrs); 6132 DP_PRINT_STATS("Dropped:"); 6133 DP_PRINT_STATS(" msdu_not_done = %d", 6134 pdev->stats.dropped.msdu_not_done); 6135 DP_PRINT_STATS(" wifi parse = %d", 6136 pdev->stats.dropped.wifi_parse); 6137 DP_PRINT_STATS(" mon_rx_drop = %d", 6138 pdev->stats.dropped.mon_rx_drop); 6139 DP_PRINT_STATS(" mon_radiotap_update_err = %d", 6140 pdev->stats.dropped.mon_radiotap_update_err); 6141 DP_PRINT_STATS(" mec_drop = %d", 6142 pdev->stats.rx.mec_drop.num); 6143 DP_PRINT_STATS(" Bytes = %llu", 6144 pdev->stats.rx.mec_drop.bytes); 6145 DP_PRINT_STATS("Sent To Stack:"); 6146 DP_PRINT_STATS(" Packets = %d", 6147 pdev->stats.rx.to_stack.num); 6148 DP_PRINT_STATS(" Bytes = %llu", 6149 pdev->stats.rx.to_stack.bytes); 6150 DP_PRINT_STATS(" vlan_tag_stp_cnt = %d", 6151 pdev->stats.vlan_tag_stp_cnt); 6152 DP_PRINT_STATS("Multicast/Broadcast:"); 6153 DP_PRINT_STATS(" Packets = %d", 6154 pdev->stats.rx.multicast.num); 6155 DP_PRINT_STATS(" Bytes = %llu", 6156 pdev->stats.rx.multicast.bytes); 6157 DP_PRINT_STATS("Errors:"); 6158 DP_PRINT_STATS(" Rxdma Ring Un-inititalized = %d", 6159 pdev->stats.replenish.rxdma_err); 6160 DP_PRINT_STATS(" Desc Alloc Failed: = %d", 6161 pdev->stats.err.desc_alloc_fail); 6162 DP_PRINT_STATS(" IP checksum error = %d", 6163 pdev->stats.err.ip_csum_err); 6164 DP_PRINT_STATS(" TCP/UDP checksum error = %d", 6165 pdev->stats.err.tcp_udp_csum_err); 6166 6167 /* Get bar_recv_cnt */ 6168 dp_aggregate_pdev_ctrl_frames_stats(pdev); 6169 DP_PRINT_STATS("BAR Received Count: = %d", 6170 pdev->stats.rx.bar_recv_cnt); 6171 } 6172 6173 void 6174 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) 6175 { 6176 struct cdp_pdev_mon_stats *rx_mon_stats; 6177 uint32_t *stat_ring_ppdu_ids; 6178 uint32_t *dest_ring_ppdu_ids; 6179 int i, idx; 6180 6181 rx_mon_stats = &pdev->rx_mon_stats; 6182 6183 DP_PRINT_STATS("PDEV Rx Monitor Stats:\n"); 6184 6185 DP_PRINT_STATS("status_ppdu_compl_cnt = %d", 6186 rx_mon_stats->status_ppdu_compl); 6187 DP_PRINT_STATS("status_ppdu_start_cnt = %d", 6188 rx_mon_stats->status_ppdu_start); 6189 DP_PRINT_STATS("status_ppdu_end_cnt = %d", 6190 rx_mon_stats->status_ppdu_end); 6191 DP_PRINT_STATS("status_ppdu_start_mis_cnt = %d", 6192 rx_mon_stats->status_ppdu_start_mis); 6193 DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d", 6194 rx_mon_stats->status_ppdu_end_mis); 6195 DP_PRINT_STATS("status_ppdu_done_cnt = %d", 6196 rx_mon_stats->status_ppdu_done); 6197 DP_PRINT_STATS("dest_ppdu_done_cnt = %d", 6198 rx_mon_stats->dest_ppdu_done); 6199 DP_PRINT_STATS("dest_mpdu_done_cnt = %d", 6200 rx_mon_stats->dest_mpdu_done); 6201 DP_PRINT_STATS("tlv_tag_status_err_cnt = %u", 6202 rx_mon_stats->tlv_tag_status_err); 6203 DP_PRINT_STATS("dest_mpdu_drop_cnt = %d", 6204 rx_mon_stats->dest_mpdu_drop); 6205 DP_PRINT_STATS("dup_mon_linkdesc_cnt = %d", 6206 rx_mon_stats->dup_mon_linkdesc_cnt); 6207 DP_PRINT_STATS("dup_mon_buf_cnt = %d", 6208 rx_mon_stats->dup_mon_buf_cnt); 6209 DP_PRINT_STATS("mon_rx_buf_reaped = %u", 6210 rx_mon_stats->mon_rx_bufs_reaped_dest); 6211 DP_PRINT_STATS("mon_rx_buf_replenished = %u", 6212 rx_mon_stats->mon_rx_bufs_replenished_dest); 6213 DP_PRINT_STATS("ppdu_id_mismatch = %u", 6214 rx_mon_stats->ppdu_id_mismatch); 6215 DP_PRINT_STATS("mpdu_ppdu_id_match_cnt = %d", 6216 rx_mon_stats->ppdu_id_match); 6217 DP_PRINT_STATS("ppdus dropped frm status ring = %d", 6218 rx_mon_stats->status_ppdu_drop); 6219 DP_PRINT_STATS("ppdus dropped frm dest ring = %d", 6220 rx_mon_stats->dest_ppdu_drop); 6221 stat_ring_ppdu_ids = 6222 (uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST); 6223 dest_ring_ppdu_ids = 6224 (uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST); 6225 6226 if (!stat_ring_ppdu_ids || !dest_ring_ppdu_ids) 6227 DP_PRINT_STATS("Unable to allocate ppdu id hist mem\n"); 6228 6229 qdf_spin_lock_bh(&pdev->mon_lock); 6230 idx = rx_mon_stats->ppdu_id_hist_idx; 6231 qdf_mem_copy(stat_ring_ppdu_ids, 6232 rx_mon_stats->stat_ring_ppdu_id_hist, 6233 sizeof(uint32_t) * MAX_PPDU_ID_HIST); 6234 qdf_mem_copy(dest_ring_ppdu_ids, 6235 rx_mon_stats->dest_ring_ppdu_id_hist, 6236 sizeof(uint32_t) * MAX_PPDU_ID_HIST); 6237 qdf_spin_unlock_bh(&pdev->mon_lock); 6238 6239 DP_PRINT_STATS("PPDU Id history:"); 6240 DP_PRINT_STATS("stat_ring_ppdu_ids\t dest_ring_ppdu_ids"); 6241 for (i = 0; i < MAX_PPDU_ID_HIST; i++) { 6242 idx = (idx + 1) & (MAX_PPDU_ID_HIST - 1); 6243 DP_PRINT_STATS("%*u\t%*u", 16, 6244 rx_mon_stats->stat_ring_ppdu_id_hist[idx], 16, 6245 rx_mon_stats->dest_ring_ppdu_id_hist[idx]); 6246 } 6247 qdf_mem_free(stat_ring_ppdu_ids); 6248 qdf_mem_free(dest_ring_ppdu_ids); 6249 DP_PRINT_STATS("mon_rx_dest_stuck = %d", 6250 rx_mon_stats->mon_rx_dest_stuck); 6251 } 6252 6253 void 6254 dp_print_soc_tx_stats(struct dp_soc *soc) 6255 { 6256 uint8_t desc_pool_id; 6257 6258 soc->stats.tx.desc_in_use = 0; 6259 6260 DP_PRINT_STATS("SOC Tx Stats:\n"); 6261 6262 for (desc_pool_id = 0; 6263 desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); 6264 desc_pool_id++) 6265 soc->stats.tx.desc_in_use += 6266 soc->tx_desc[desc_pool_id].num_allocated; 6267 6268 DP_PRINT_STATS("Tx Descriptors In Use = %d", 6269 soc->stats.tx.desc_in_use); 6270 DP_PRINT_STATS("Tx Invalid peer:"); 6271 DP_PRINT_STATS(" Packets = %d", 6272 soc->stats.tx.tx_invalid_peer.num); 6273 DP_PRINT_STATS(" Bytes = %llu", 6274 soc->stats.tx.tx_invalid_peer.bytes); 6275 DP_PRINT_STATS("Packets dropped due to TCL ring full = %d %d %d", 6276 soc->stats.tx.tcl_ring_full[0], 6277 soc->stats.tx.tcl_ring_full[1], 6278 soc->stats.tx.tcl_ring_full[2]); 6279 DP_PRINT_STATS("Tx invalid completion release = %d", 6280 soc->stats.tx.invalid_release_source); 6281 DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]", 6282 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL], 6283 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER], 6284 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC], 6285 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF], 6286 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]); 6287 DP_PRINT_STATS("Tx comp non wbm internal error = %d", 6288 soc->stats.tx.non_wbm_internal_err); 6289 DP_PRINT_STATS("Tx comp loop pkt limit hit = %d", 6290 soc->stats.tx.tx_comp_loop_pkt_limit_hit); 6291 DP_PRINT_STATS("Tx comp HP out of sync2 = %d", 6292 soc->stats.tx.hp_oos2); 6293 } 6294 6295 void dp_print_soc_interrupt_stats(struct dp_soc *soc) 6296 { 6297 int i = 0; 6298 struct dp_intr_stats *intr_stats; 6299 6300 DP_PRINT_STATS("INT: Total |txComps|reo[0] |reo[1] |reo[2] |reo[3] |mon |rx_err | wbm |reo_sta|rxdm2hst|hst2rxdm|"); 6301 for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { 6302 intr_stats = &soc->intr_ctx[i].intr_stats; 6303 DP_PRINT_STATS("%3u[%3d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u", 6304 i, 6305 hif_get_int_ctx_irq_num(soc->hif_handle, i), 6306 intr_stats->num_masks, 6307 intr_stats->num_tx_ring_masks[0], 6308 intr_stats->num_rx_ring_masks[0], 6309 intr_stats->num_rx_ring_masks[1], 6310 intr_stats->num_rx_ring_masks[2], 6311 intr_stats->num_rx_ring_masks[3], 6312 intr_stats->num_rx_mon_ring_masks, 6313 intr_stats->num_rx_err_ring_masks, 6314 intr_stats->num_rx_wbm_rel_ring_masks, 6315 intr_stats->num_reo_status_ring_masks, 6316 intr_stats->num_rxdma2host_ring_masks, 6317 intr_stats->num_host2rxdma_ring_masks); 6318 } 6319 } 6320 6321 void 6322 dp_print_soc_rx_stats(struct dp_soc *soc) 6323 { 6324 uint32_t i; 6325 char reo_error[DP_REO_ERR_LENGTH]; 6326 char rxdma_error[DP_RXDMA_ERR_LENGTH]; 6327 uint8_t index = 0; 6328 6329 DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries); 6330 DP_PRINT_STATS("SOC Rx Stats:\n"); 6331 DP_PRINT_STATS("Fragmented packets: %u", 6332 soc->stats.rx.rx_frags); 6333 DP_PRINT_STATS("Reo reinjected packets: %u", 6334 soc->stats.rx.reo_reinject); 6335 DP_PRINT_STATS("Errors:\n"); 6336 DP_PRINT_STATS("Rx Decrypt Errors = %d", 6337 (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] + 6338 soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC])); 6339 DP_PRINT_STATS("Invalid RBM = %d", 6340 soc->stats.rx.err.invalid_rbm); 6341 DP_PRINT_STATS("Invalid Vdev = %d", 6342 soc->stats.rx.err.invalid_vdev); 6343 DP_PRINT_STATS("Invalid sa_idx or da_idx = %d", 6344 soc->stats.rx.err.invalid_sa_da_idx); 6345 DP_PRINT_STATS("Defrag peer uninit = %d", 6346 soc->stats.rx.err.defrag_peer_uninit); 6347 DP_PRINT_STATS("Pkts delivered no peer = %d", 6348 soc->stats.rx.err.pkt_delivered_no_peer); 6349 DP_PRINT_STATS("Invalid Pdev = %d", 6350 soc->stats.rx.err.invalid_pdev); 6351 DP_PRINT_STATS("Invalid Peer = %d", 6352 soc->stats.rx.err.rx_invalid_peer.num); 6353 DP_PRINT_STATS("HAL Ring Access Fail = %d", 6354 soc->stats.rx.err.hal_ring_access_fail); 6355 DP_PRINT_STATS("HAL Ring Access Full Fail = %d", 6356 soc->stats.rx.err.hal_ring_access_full_fail); 6357 DP_PRINT_STATS("MSDU Done failures = %d", 6358 soc->stats.rx.err.msdu_done_fail); 6359 DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags); 6360 DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait); 6361 DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err); 6362 6363 DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2); 6364 DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full); 6365 6366 DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d", 6367 soc->stats.rx.reap_loop_pkt_limit_hit); 6368 DP_PRINT_STATS("RX DESC invalid magic: %u", 6369 soc->stats.rx.err.rx_desc_invalid_magic); 6370 DP_PRINT_STATS("RX DUP DESC: %d", 6371 soc->stats.rx.err.hal_reo_dest_dup); 6372 DP_PRINT_STATS("RX REL DUP DESC: %d", 6373 soc->stats.rx.err.hal_wbm_rel_dup); 6374 6375 DP_PRINT_STATS("RXDMA ERR DUP DESC: %d", 6376 soc->stats.rx.err.hal_rxdma_err_dup); 6377 6378 DP_PRINT_STATS("RX scatter msdu: %d", 6379 soc->stats.rx.err.scatter_msdu); 6380 6381 DP_PRINT_STATS("RX invalid cookie: %d", 6382 soc->stats.rx.err.invalid_cookie); 6383 6384 DP_PRINT_STATS("RX wait completed msdu break: %d", 6385 soc->stats.rx.msdu_scatter_wait_break); 6386 6387 DP_PRINT_STATS("2k jump delba sent: %d", 6388 soc->stats.rx.err.rx_2k_jump_delba_sent); 6389 6390 DP_PRINT_STATS("2k jump msdu to stack: %d", 6391 soc->stats.rx.err.rx_2k_jump_to_stack); 6392 6393 DP_PRINT_STATS("2k jump msdu drop: %d", 6394 soc->stats.rx.err.rx_2k_jump_drop); 6395 6396 DP_PRINT_STATS("REO err oor msdu to stack %d", 6397 soc->stats.rx.err.reo_err_oor_to_stack); 6398 6399 DP_PRINT_STATS("REO err oor msdu drop: %d", 6400 soc->stats.rx.err.reo_err_oor_drop); 6401 6402 DP_PRINT_STATS("Rx err msdu rejected: %d", 6403 soc->stats.rx.err.rejected); 6404 6405 for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) { 6406 index += qdf_snprint(&rxdma_error[index], 6407 DP_RXDMA_ERR_LENGTH - index, 6408 " %d", soc->stats.rx.err.rxdma_error[i]); 6409 } 6410 DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error); 6411 6412 index = 0; 6413 for (i = 0; i < HAL_REO_ERR_MAX; i++) { 6414 index += qdf_snprint(&reo_error[index], 6415 DP_REO_ERR_LENGTH - index, 6416 " %d", soc->stats.rx.err.reo_error[i]); 6417 } 6418 DP_PRINT_STATS("REO Error(0-14):%s", reo_error); 6419 DP_PRINT_STATS("REO CMD SEND FAIL: %d", 6420 soc->stats.rx.err.reo_cmd_send_fail); 6421 } 6422 6423 #ifdef FEATURE_TSO_STATS 6424 void dp_print_tso_stats(struct dp_soc *soc, 6425 enum qdf_stats_verbosity_level level) 6426 { 6427 uint8_t loop_pdev; 6428 uint32_t id; 6429 struct dp_pdev *pdev; 6430 6431 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 6432 pdev = soc->pdev_list[loop_pdev]; 6433 DP_PRINT_STATS("TSO Statistics\n"); 6434 DP_PRINT_STATS( 6435 "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d", 6436 pdev->stats.tx_i.rcvd.num, 6437 pdev->stats.tx.tx_success.num, 6438 pdev->stats.tso_stats.num_tso_pkts.num, 6439 pdev->stats.tso_stats.tso_comp); 6440 6441 for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) { 6442 /* TSO LEVEL 1 - PACKET INFO */ 6443 DP_PRINT_STATS( 6444 "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u", 6445 id, 6446 pdev->stats.tso_stats.tso_info 6447 .tso_packet_info[id].tso_packet_len, 6448 pdev->stats.tso_stats.tso_info 6449 .tso_packet_info[id].num_seg); 6450 /* TSO LEVEL 2 */ 6451 if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH) 6452 dp_print_tso_seg_stats(pdev, id); 6453 } 6454 6455 DP_PRINT_STATS( 6456 "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu", 6457 pdev->stats.tso_stats.seg_histogram.segs_1, 6458 pdev->stats.tso_stats.seg_histogram.segs_2_5, 6459 pdev->stats.tso_stats.seg_histogram.segs_6_10, 6460 pdev->stats.tso_stats.seg_histogram.segs_11_15, 6461 pdev->stats.tso_stats.seg_histogram.segs_16_20, 6462 pdev->stats.tso_stats.seg_histogram.segs_20_plus); 6463 } 6464 } 6465 6466 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev, 6467 uint8_t _p_cntrs) 6468 { 6469 if (_p_cntrs == 1) { 6470 DP_STATS_INC(pdev, 6471 tso_stats.seg_histogram.segs_1, 1); 6472 } else if (_p_cntrs >= 2 && _p_cntrs <= 5) { 6473 DP_STATS_INC(pdev, 6474 tso_stats.seg_histogram.segs_2_5, 1); 6475 } else if (_p_cntrs > 5 && _p_cntrs <= 10) { 6476 DP_STATS_INC(pdev, 6477 tso_stats.seg_histogram.segs_6_10, 1); 6478 } else if (_p_cntrs > 10 && _p_cntrs <= 15) { 6479 DP_STATS_INC(pdev, 6480 tso_stats.seg_histogram.segs_11_15, 1); 6481 } else if (_p_cntrs > 15 && _p_cntrs <= 20) { 6482 DP_STATS_INC(pdev, 6483 tso_stats.seg_histogram.segs_16_20, 1); 6484 } else if (_p_cntrs > 20) { 6485 DP_STATS_INC(pdev, 6486 tso_stats.seg_histogram.segs_20_plus, 1); 6487 } 6488 } 6489 6490 void dp_tso_segment_update(struct dp_pdev *pdev, 6491 uint32_t stats_idx, 6492 uint8_t idx, 6493 struct qdf_tso_seg_t seg) 6494 { 6495 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6496 .tso_seg[idx].num_frags, 6497 seg.num_frags); 6498 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6499 .tso_seg[idx].total_len, 6500 seg.total_len); 6501 6502 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6503 .tso_seg[idx].tso_flags.tso_enable, 6504 seg.tso_flags.tso_enable); 6505 6506 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6507 .tso_seg[idx].tso_flags.fin, 6508 seg.tso_flags.fin); 6509 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6510 .tso_seg[idx].tso_flags.syn, 6511 seg.tso_flags.syn); 6512 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6513 .tso_seg[idx].tso_flags.rst, 6514 seg.tso_flags.rst); 6515 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6516 .tso_seg[idx].tso_flags.psh, 6517 seg.tso_flags.psh); 6518 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6519 .tso_seg[idx].tso_flags.ack, 6520 seg.tso_flags.ack); 6521 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6522 .tso_seg[idx].tso_flags.urg, 6523 seg.tso_flags.urg); 6524 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6525 .tso_seg[idx].tso_flags.ece, 6526 seg.tso_flags.ece); 6527 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6528 .tso_seg[idx].tso_flags.cwr, 6529 seg.tso_flags.cwr); 6530 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6531 .tso_seg[idx].tso_flags.ns, 6532 seg.tso_flags.ns); 6533 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6534 .tso_seg[idx].tso_flags.tcp_seq_num, 6535 seg.tso_flags.tcp_seq_num); 6536 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 6537 .tso_seg[idx].tso_flags.ip_id, 6538 seg.tso_flags.ip_id); 6539 } 6540 6541 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx, 6542 qdf_nbuf_t msdu, uint16_t num_segs) 6543 { 6544 DP_STATS_UPD(pdev, 6545 tso_stats.tso_info.tso_packet_info[stats_idx] 6546 .num_seg, 6547 num_segs); 6548 6549 DP_STATS_UPD(pdev, 6550 tso_stats.tso_info.tso_packet_info[stats_idx] 6551 .tso_packet_len, 6552 qdf_nbuf_get_tcp_payload_len(msdu)); 6553 } 6554 6555 void dp_tso_segment_stats_update(struct dp_pdev *pdev, 6556 struct qdf_tso_seg_elem_t *stats_seg, 6557 uint32_t stats_idx) 6558 { 6559 uint8_t tso_seg_idx = 0; 6560 6561 while (stats_seg && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) { 6562 dp_tso_segment_update(pdev, stats_idx, 6563 tso_seg_idx, 6564 stats_seg->seg); 6565 ++tso_seg_idx; 6566 stats_seg = stats_seg->next; 6567 } 6568 } 6569 6570 void dp_txrx_clear_tso_stats(struct dp_soc *soc) 6571 { 6572 uint8_t loop_pdev; 6573 struct dp_pdev *pdev; 6574 6575 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 6576 pdev = soc->pdev_list[loop_pdev]; 6577 dp_init_tso_stats(pdev); 6578 } 6579 } 6580 #endif /* FEATURE_TSO_STATS */ 6581