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