1 /* 2 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 #include "qdf_types.h" 20 #include "dp_peer.h" 21 #include "dp_types.h" 22 #include "dp_internal.h" 23 #include "htt_stats.h" 24 #include "htt_ppdu_stats.h" 25 #ifdef QCA_PEER_EXT_STATS 26 #include <cdp_txrx_hist_struct.h> 27 #include "dp_hist.h" 28 #endif 29 #ifdef WIFI_MONITOR_SUPPORT 30 #include "dp_htt.h" 31 #include <dp_mon.h> 32 #endif 33 34 #define DP_MAX_STRING_LEN 500 35 #define DP_HTT_TX_RX_EXPECTED_TLVS (((uint64_t)1 << HTT_STATS_TX_PDEV_CMN_TAG) |\ 36 ((uint64_t)1 << HTT_STATS_TX_PDEV_UNDERRUN_TAG) |\ 37 ((uint64_t)1 << HTT_STATS_TX_PDEV_SIFS_TAG) |\ 38 ((uint64_t)1 << HTT_STATS_TX_PDEV_FLUSH_TAG) |\ 39 ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_STATS_TAG) |\ 40 ((uint64_t)1 << HTT_STATS_RX_SOC_FW_STATS_TAG) |\ 41 ((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG) |\ 42 ((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG) |\ 43 ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG) |\ 44 ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG)) 45 46 #define DP_HTT_HW_INTR_NAME_LEN HTT_STATS_MAX_HW_INTR_NAME_LEN 47 #define DP_HTT_HW_MODULE_NAME_LEN HTT_STATS_MAX_HW_MODULE_NAME_LEN 48 #define DP_HTT_COUNTER_NAME_LEN HTT_MAX_COUNTER_NAME 49 #define DP_HTT_LOW_WM_HIT_COUNT_LEN HTT_STATS_LOW_WM_BINS 50 #define DP_HTT_HIGH_WM_HIT_COUNT_LEN HTT_STATS_HIGH_WM_BINS 51 #define DP_HTT_TX_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 52 #define DP_HTT_TX_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 53 #define DP_HTT_TX_MCS_EXT2_LEN HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS 54 #define DP_HTT_TX_SU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 55 #define DP_HTT_TX_SU_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 56 #define DP_HTT_TX_MU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 57 #define DP_HTT_TX_MU_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 58 #define DP_HTT_TX_NSS_LEN HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS 59 #define DP_HTT_TX_BW_LEN HTT_TX_PDEV_STATS_NUM_BW_COUNTERS 60 #define DP_HTT_TX_PREAM_LEN HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES 61 #define DP_HTT_TX_PDEV_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS 62 #define DP_HTT_TX_DCM_LEN HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS 63 #define DP_HTT_RX_MCS_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS 64 #define DP_HTT_RX_MCS_EXT_LEN HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 65 #define DP_HTT_RX_PDEV_MCS_LEN_EXT HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT 66 #define DP_HTT_RX_PDEV_MCS_LEN_EXT2 HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS 67 #define DP_HTT_RX_NSS_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 68 #define DP_HTT_RX_DCM_LEN HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS 69 #define DP_HTT_RX_BW_LEN HTT_RX_PDEV_STATS_NUM_BW_COUNTERS 70 #define DP_HTT_RX_PREAM_LEN HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES 71 #define DP_HTT_RSSI_CHAIN_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 72 #define DP_HTT_RX_GI_LEN HTT_RX_PDEV_STATS_NUM_GI_COUNTERS 73 #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX 74 #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX 75 #define DP_HTT_FW_RING_MPDU_ERR_LEN HTT_RX_STATS_RXDMA_MAX_ERR 76 #define DP_HTT_TID_NAME_LEN MAX_HTT_TID_NAME 77 #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS 78 #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS 79 80 #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS) 81 #define DP_NSS_LENGTH (6 * SS_COUNT) 82 #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW) 83 #define DP_MU_GROUP_SHOW 16 84 #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX) 85 #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX) 86 #define STATS_PROC_TIMEOUT (HZ / 1000) 87 88 #define dp_stats_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_STATS, params) 89 #define dp_stats_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_STATS, params) 90 #define dp_stats_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_STATS, params) 91 #define dp_stats_info(params...) \ 92 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_STATS, ## params) 93 #define dp_stats_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_STATS, params) 94 95 #ifdef WLAN_FEATURE_11BE 96 static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = { 97 { 98 {"HE MCS 0 (BPSK 1/2) ", MCS_VALID}, 99 {"HE MCS 1 (QPSK 1/2) ", MCS_VALID}, 100 {"HE MCS 2 (QPSK 3/4) ", MCS_VALID}, 101 {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID}, 102 {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID}, 103 {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID}, 104 {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID}, 105 {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID}, 106 {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID}, 107 {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID}, 108 {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID}, 109 {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, 110 {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID}, 111 {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID}, 112 {"INVALID ", MCS_INVALID}, 113 {"INVALID ", MCS_INVALID}, 114 {"INVALID ", MCS_INVALID}, 115 }, 116 { 117 {"EHT MCS 0 (BPSK 1/2) ", MCS_VALID}, 118 {"EHT MCS 1 (QPSK 1/2) ", MCS_VALID}, 119 {"EHT MCS 2 (QPSK 3/4) ", MCS_VALID}, 120 {"EHT MCS 3 (16-QAM 1/2) ", MCS_VALID}, 121 {"EHT MCS 4 (16-QAM 3/4) ", MCS_VALID}, 122 {"EHT MCS 5 (64-QAM 2/3) ", MCS_VALID}, 123 {"EHT MCS 6 (64-QAM 3/4) ", MCS_VALID}, 124 {"EHT MCS 7 (64-QAM 5/6) ", MCS_VALID}, 125 {"EHT MCS 8 (256-QAM 3/4) ", MCS_VALID}, 126 {"EHT MCS 9 (256-QAM 5/6) ", MCS_VALID}, 127 {"EHT MCS 10 (1024-QAM 3/4)", MCS_VALID}, 128 {"EHT MCS 11 (1024-QAM 5/6)", MCS_VALID}, 129 {"EHT MCS 12 (4096-QAM 3/4)", MCS_VALID}, 130 {"EHT MCS 13 (4096-QAM 5/6)", MCS_VALID}, 131 {"EHT MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, 132 {"EHT MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, 133 {"INVALID ", MCS_INVALID}, 134 } 135 }; 136 #else 137 static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = { 138 { 139 {"HE MCS 0 (BPSK 1/2) ", MCS_VALID}, 140 {"HE MCS 1 (QPSK 1/2) ", MCS_VALID}, 141 {"HE MCS 2 (QPSK 3/4) ", MCS_VALID}, 142 {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID}, 143 {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID}, 144 {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID}, 145 {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID}, 146 {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID}, 147 {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID}, 148 {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID}, 149 {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID}, 150 {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, 151 {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID}, 152 {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID}, 153 {"INVALID ", MCS_INVALID}, 154 } 155 }; 156 #endif 157 158 #ifdef WLAN_FEATURE_11BE 159 static const struct cdp_rate_debug 160 dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { 161 { 162 {"HE MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID}, 163 {"HE MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID}, 164 {"HE MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID}, 165 {"HE MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID}, 166 {"HE MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID}, 167 {"HE MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID}, 168 {"HE MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID}, 169 {"HE MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID}, 170 {"HE MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID}, 171 {"HE MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID}, 172 {"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID}, 173 {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, 174 {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, 175 {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, 176 {"INVALID ", MCS_INVALID}, 177 {"INVALID ", MCS_INVALID}, 178 {"INVALID ", MCS_INVALID}, 179 }, 180 { 181 {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, 182 {"HE OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID}, 183 {"HE OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID}, 184 {"HE OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID}, 185 {"HE OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID}, 186 {"HE OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID}, 187 {"HE OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID}, 188 {"HE OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID}, 189 {"HE OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID}, 190 {"HE OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID}, 191 {"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID}, 192 {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, 193 {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, 194 {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, 195 {"INVALID ", MCS_INVALID}, 196 {"INVALID ", MCS_INVALID}, 197 {"INVALID ", MCS_INVALID}, 198 } 199 }; 200 201 static const struct cdp_rate_debug 202 dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { 203 { 204 {"EHT MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID}, 205 {"EHT MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID}, 206 {"EHT MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID}, 207 {"EHT MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID}, 208 {"EHT MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID}, 209 {"EHT MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID}, 210 {"EHT MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID}, 211 {"EHT MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID}, 212 {"EHT MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID}, 213 {"EHT MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID}, 214 {"EHT MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID}, 215 {"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, 216 {"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, 217 {"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, 218 {"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, 219 {"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, 220 {"INVALID ", MCS_INVALID}, 221 }, 222 { 223 {"EHT OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, 224 {"EHT OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID}, 225 {"EHT OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID}, 226 {"EHT OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID}, 227 {"EHT OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID}, 228 {"EHT OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID}, 229 {"EHT OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID}, 230 {"EHT OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID}, 231 {"EHT OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID}, 232 {"EHT OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID}, 233 {"EHT OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID}, 234 {"EHT OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, 235 {"EHT OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, 236 {"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, 237 {"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, 238 {"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, 239 {"INVALID ", MCS_INVALID}, 240 } 241 }; 242 #else 243 static const struct cdp_rate_debug 244 dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { 245 { 246 {"HE MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID}, 247 {"HE MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID}, 248 {"HE MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID}, 249 {"HE MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID}, 250 {"HE MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID}, 251 {"HE MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID}, 252 {"HE MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID}, 253 {"HE MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID}, 254 {"HE MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID}, 255 {"HE MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID}, 256 {"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID}, 257 {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, 258 {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, 259 {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, 260 {"INVALID ", MCS_INVALID}, 261 }, 262 { 263 {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, 264 {"HE OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID}, 265 {"HE OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID}, 266 {"HE OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID}, 267 {"HE OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID}, 268 {"HE OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID}, 269 {"HE OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID}, 270 {"HE OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID}, 271 {"HE OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID}, 272 {"HE OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID}, 273 {"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID}, 274 {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, 275 {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, 276 {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, 277 {"INVALID ", MCS_INVALID}, 278 } 279 }; 280 #endif 281 282 const char *mu_reception_mode[TXRX_TYPE_MU_MAX] = { 283 "MU MIMO", "MU OFDMA" 284 }; 285 286 #ifdef QCA_ENH_V3_STATS_SUPPORT 287 #ifndef WLAN_CONFIG_TX_DELAY 288 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 289 "0 to 9 ms", "10 to 19 ms", 290 "20 to 29 ms", "30 to 39 ms", 291 "40 to 49 ms", "50 to 59 ms", 292 "60 to 69 ms", "70 to 79 ms", 293 "80 to 89 ms", "90 to 99 ms", 294 "101 to 249 ms", "250 to 499 ms", "500+ ms" 295 }; 296 #else 297 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 298 "0 to 250 us", "250 to 500 us", 299 "500 to 750 us", "750 to 1000 us", 300 "1000 to 1500 us", "1500 to 2000 us", 301 "2000 to 2500 us", "2500 to 5000 us", 302 "5000 to 6000 us", "6000 to 7000 ms", 303 "7000 to 8000 us", "8000 to 9000 us", "9000+ us" 304 }; 305 #endif 306 #elif defined(HW_TX_DELAY_STATS_ENABLE) 307 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 308 "0 to 2 ms", "2 to 4 ms", 309 "4 to 6 ms", "6 to 8 ms", 310 "8 to 10 ms", "10 to 20 ms", 311 "20 to 30 ms", "30 to 40 ms", 312 "40 to 50 ms", "50 to 100 ms", 313 "100 to 250 ms", "250 to 500 ms", "500+ ms" 314 }; 315 #endif 316 317 #ifdef QCA_ENH_V3_STATS_SUPPORT 318 #ifndef WLAN_CONFIG_TX_DELAY 319 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 320 "0 to 1 ms", "1 to 2 ms", 321 "2 to 3 ms", "3 to 4 ms", 322 "4 to 5 ms", "5 to 6 ms", 323 "6 to 7 ms", "7 to 8 ms", 324 "8 to 9 ms", "9 to 10 ms", 325 "10 to 11 ms", "11 to 12 ms", "12+ ms" 326 }; 327 #else 328 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 329 "0 to 250 us", "250 to 500 us", 330 "500 to 750 us", "750 to 1000 us", 331 "1000 to 1500 us", "1500 to 2000 us", 332 "2000 to 2500 us", "2500 to 5000 us", 333 "5000 to 6000 us", "6000 to 7000 ms", 334 "7000 to 8000 us", "8000 to 9000 us", "9000+ us" 335 }; 336 #endif 337 338 const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 339 "0 to 4 ms", "5 to 9 ms", 340 "10 to 14 ms", "15 to 19 ms", 341 "20 to 24 ms", "25 to 29 ms", 342 "30 to 34 ms", "35 to 39 ms", 343 "40 to 44 ms", "45 to 49 ms", 344 "50 to 54 ms", "55 to 59 ms", "60+ ms" 345 }; 346 #endif 347 348 #define TID_COUNTER_STATS 1 /* Success/drop stats type */ 349 #define TID_DELAY_STATS 2 /* Delay stats type */ 350 #define TID_RX_ERROR_STATS 3 /* Rx Error stats type */ 351 352 #ifdef WLAN_SYSFS_DP_STATS 353 void DP_PRINT_STATS(const char *fmt, ...) 354 { 355 void *soc_void = NULL; 356 va_list val; 357 uint16_t buf_written = 0; 358 uint16_t curr_len = 0; 359 uint16_t max_len = 0; 360 struct dp_soc *soc = NULL; 361 362 soc_void = cds_get_context(QDF_MODULE_ID_SOC); 363 if (!soc_void) 364 return; 365 366 soc = cdp_soc_t_to_dp_soc(soc_void); 367 368 va_start(val, fmt); 369 QDF_VTRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, (char *)fmt, val); 370 /* writing to the buffer */ 371 if (soc->sysfs_config && soc->sysfs_config->printing_mode == PRINTING_MODE_ENABLED) { 372 if (soc->sysfs_config->process_id == qdf_get_current_pid()) { 373 curr_len = soc->sysfs_config->curr_buffer_length; 374 max_len = soc->sysfs_config->max_buffer_length; 375 if ((max_len - curr_len) <= 1) 376 return; 377 378 qdf_spinlock_acquire(&soc->sysfs_config->sysfs_write_user_buffer); 379 if (soc->sysfs_config->buf) { 380 buf_written = vscnprintf(soc->sysfs_config->buf + curr_len, 381 max_len - curr_len, fmt, val); 382 curr_len += buf_written; 383 if ((max_len - curr_len) <= 1) 384 return; 385 386 buf_written += scnprintf(soc->sysfs_config->buf + curr_len, 387 max_len - curr_len, "\n"); 388 soc->sysfs_config->curr_buffer_length += buf_written; 389 } 390 qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer); 391 } 392 } 393 va_end(val); 394 } 395 #endif /* WLAN_SYSFS_DP_STATS */ 396 /* 397 * dp_print_stats_string_tlv: display htt_stats_string_tlv 398 * @tag_buf: buffer containing the tlv htt_stats_string_tlv 399 * 400 * return:void 401 */ 402 static void dp_print_stats_string_tlv(uint32_t *tag_buf) 403 { 404 htt_stats_string_tlv *dp_stats_buf = 405 (htt_stats_string_tlv *)tag_buf; 406 uint8_t i; 407 uint16_t index = 0; 408 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 409 char *data = qdf_mem_malloc(DP_MAX_STRING_LEN); 410 411 if (!data) { 412 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 413 FL("Output buffer not allocated")); 414 return; 415 } 416 417 DP_PRINT_STATS("HTT_STATS_STRING_TLV:"); 418 for (i = 0; i < tag_len; i++) { 419 index += qdf_snprint(&data[index], 420 DP_MAX_STRING_LEN - index, 421 " %u:%u,", i, dp_stats_buf->data[i]); 422 } 423 DP_PRINT_STATS("data = %s\n", data); 424 qdf_mem_free(data); 425 } 426 427 /* 428 * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv 429 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv 430 * 431 * return:void 432 */ 433 static void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf) 434 { 435 htt_tx_pdev_stats_cmn_tlv *dp_stats_buf = 436 (htt_tx_pdev_stats_cmn_tlv *)tag_buf; 437 438 DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:"); 439 DP_PRINT_STATS("mac_id__word = %u", 440 dp_stats_buf->mac_id__word); 441 DP_PRINT_STATS("hw_queued = %u", 442 dp_stats_buf->hw_queued); 443 DP_PRINT_STATS("hw_reaped = %u", 444 dp_stats_buf->hw_reaped); 445 DP_PRINT_STATS("underrun = %u", 446 dp_stats_buf->underrun); 447 DP_PRINT_STATS("hw_paused = %u", 448 dp_stats_buf->hw_paused); 449 DP_PRINT_STATS("hw_flush = %u", 450 dp_stats_buf->hw_flush); 451 DP_PRINT_STATS("hw_filt = %u", 452 dp_stats_buf->hw_filt); 453 DP_PRINT_STATS("tx_abort = %u", 454 dp_stats_buf->tx_abort); 455 DP_PRINT_STATS("mpdu_requeued = %u", 456 dp_stats_buf->mpdu_requed); 457 DP_PRINT_STATS("tx_xretry = %u", 458 dp_stats_buf->tx_xretry); 459 DP_PRINT_STATS("data_rc = %u", 460 dp_stats_buf->data_rc); 461 DP_PRINT_STATS("mpdu_dropped_xretry = %u", 462 dp_stats_buf->mpdu_dropped_xretry); 463 DP_PRINT_STATS("illegal_rate_phy_err = %u", 464 dp_stats_buf->illgl_rate_phy_err); 465 DP_PRINT_STATS("cont_xretry = %u", 466 dp_stats_buf->cont_xretry); 467 DP_PRINT_STATS("tx_timeout = %u", 468 dp_stats_buf->tx_timeout); 469 DP_PRINT_STATS("pdev_resets = %u", 470 dp_stats_buf->pdev_resets); 471 DP_PRINT_STATS("phy_underrun = %u", 472 dp_stats_buf->phy_underrun); 473 DP_PRINT_STATS("txop_ovf = %u", 474 dp_stats_buf->txop_ovf); 475 DP_PRINT_STATS("seq_posted = %u", 476 dp_stats_buf->seq_posted); 477 DP_PRINT_STATS("seq_failed_queueing = %u", 478 dp_stats_buf->seq_failed_queueing); 479 DP_PRINT_STATS("seq_completed = %u", 480 dp_stats_buf->seq_completed); 481 DP_PRINT_STATS("seq_restarted = %u", 482 dp_stats_buf->seq_restarted); 483 DP_PRINT_STATS("mu_seq_posted = %u", 484 dp_stats_buf->mu_seq_posted); 485 DP_PRINT_STATS("seq_switch_hw_paused = %u", 486 dp_stats_buf->seq_switch_hw_paused); 487 DP_PRINT_STATS("next_seq_posted_dsr = %u", 488 dp_stats_buf->next_seq_posted_dsr); 489 DP_PRINT_STATS("seq_posted_isr = %u", 490 dp_stats_buf->seq_posted_isr); 491 DP_PRINT_STATS("seq_ctrl_cached = %u", 492 dp_stats_buf->seq_ctrl_cached); 493 DP_PRINT_STATS("mpdu_count_tqm = %u", 494 dp_stats_buf->mpdu_count_tqm); 495 DP_PRINT_STATS("msdu_count_tqm = %u", 496 dp_stats_buf->msdu_count_tqm); 497 DP_PRINT_STATS("mpdu_removed_tqm = %u", 498 dp_stats_buf->mpdu_removed_tqm); 499 DP_PRINT_STATS("msdu_removed_tqm = %u", 500 dp_stats_buf->msdu_removed_tqm); 501 DP_PRINT_STATS("mpdus_sw_flush = %u", 502 dp_stats_buf->mpdus_sw_flush); 503 DP_PRINT_STATS("mpdus_hw_filter = %u", 504 dp_stats_buf->mpdus_hw_filter); 505 DP_PRINT_STATS("mpdus_truncated = %u", 506 dp_stats_buf->mpdus_truncated); 507 DP_PRINT_STATS("mpdus_ack_failed = %u", 508 dp_stats_buf->mpdus_ack_failed); 509 DP_PRINT_STATS("mpdus_expired = %u", 510 dp_stats_buf->mpdus_expired); 511 DP_PRINT_STATS("mpdus_seq_hw_retry = %u", 512 dp_stats_buf->mpdus_seq_hw_retry); 513 DP_PRINT_STATS("ack_tlv_proc = %u", 514 dp_stats_buf->ack_tlv_proc); 515 DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u", 516 dp_stats_buf->coex_abort_mpdu_cnt_valid); 517 DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n", 518 dp_stats_buf->coex_abort_mpdu_cnt); 519 } 520 521 /* 522 * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v 523 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v 524 * 525 * return:void 526 */ 527 static void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf) 528 { 529 htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf = 530 (htt_tx_pdev_stats_urrn_tlv_v *)tag_buf; 531 uint8_t i; 532 uint16_t index = 0; 533 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 534 char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN); 535 536 if (!urrn_stats) { 537 dp_stats_err("Output buffer not allocated"); 538 return; 539 } 540 541 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS); 542 DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:"); 543 for (i = 0; i < tag_len; i++) { 544 index += qdf_snprint(&urrn_stats[index], 545 DP_MAX_STRING_LEN - index, 546 " %u:%u,", i, dp_stats_buf->urrn_stats[i]); 547 } 548 DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats); 549 qdf_mem_free(urrn_stats); 550 } 551 552 /* 553 * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v 554 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v 555 * 556 * return:void 557 */ 558 static void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf) 559 { 560 htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf = 561 (htt_tx_pdev_stats_flush_tlv_v *)tag_buf; 562 uint8_t i; 563 uint16_t index = 0; 564 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 565 char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN); 566 567 if (!flush_errs) { 568 dp_stats_err("Output buffer not allocated"); 569 return; 570 } 571 572 tag_len = qdf_min(tag_len, 573 (uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS); 574 575 DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:"); 576 for (i = 0; i < tag_len; i++) { 577 index += qdf_snprint(&flush_errs[index], 578 DP_MAX_STRING_LEN - index, 579 " %u:%u,", i, dp_stats_buf->flush_errs[i]); 580 } 581 DP_PRINT_STATS("flush_errs = %s\n", flush_errs); 582 qdf_mem_free(flush_errs); 583 } 584 585 /* 586 * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v 587 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v 588 * 589 * return:void 590 */ 591 static void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf) 592 { 593 htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf = 594 (htt_tx_pdev_stats_sifs_tlv_v *)tag_buf; 595 uint8_t i; 596 uint16_t index = 0; 597 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 598 char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN); 599 600 if (!sifs_status) { 601 dp_stats_err("Output buffer not allocated"); 602 return; 603 } 604 605 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS); 606 607 DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:"); 608 for (i = 0; i < tag_len; i++) { 609 index += qdf_snprint(&sifs_status[index], 610 DP_MAX_STRING_LEN - index, 611 " %u:%u,", i, dp_stats_buf->sifs_status[i]); 612 } 613 DP_PRINT_STATS("sifs_status = %s\n", sifs_status); 614 qdf_mem_free(sifs_status); 615 } 616 617 /* 618 * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v 619 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v 620 * 621 * return:void 622 */ 623 static void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf) 624 { 625 htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf = 626 (htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf; 627 uint8_t i; 628 uint16_t index = 0; 629 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 630 char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN); 631 632 if (!phy_errs) { 633 dp_stats_err("Output buffer not allocated"); 634 return; 635 } 636 637 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS); 638 639 DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:"); 640 for (i = 0; i < tag_len; i++) { 641 index += qdf_snprint(&phy_errs[index], 642 DP_MAX_STRING_LEN - index, 643 " %u:%u,", i, dp_stats_buf->phy_errs[i]); 644 } 645 DP_PRINT_STATS("phy_errs = %s\n", phy_errs); 646 qdf_mem_free(phy_errs); 647 } 648 649 /* 650 * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv 651 * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv 652 * 653 * return:void 654 */ 655 static void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf) 656 { 657 htt_hw_stats_intr_misc_tlv *dp_stats_buf = 658 (htt_hw_stats_intr_misc_tlv *)tag_buf; 659 uint8_t i; 660 uint16_t index = 0; 661 char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 662 663 if (!hw_intr_name) { 664 dp_stats_err("Output buffer not allocated"); 665 return; 666 } 667 668 DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:"); 669 for (i = 0; i < DP_HTT_HW_INTR_NAME_LEN; i++) { 670 index += qdf_snprint(&hw_intr_name[index], 671 DP_MAX_STRING_LEN - index, 672 " %u:%u,", i, dp_stats_buf->hw_intr_name[i]); 673 } 674 DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name); 675 DP_PRINT_STATS("mask = %u", 676 dp_stats_buf->mask); 677 DP_PRINT_STATS("count = %u\n", 678 dp_stats_buf->count); 679 qdf_mem_free(hw_intr_name); 680 } 681 682 /* 683 * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv 684 * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv 685 * 686 * return:void 687 */ 688 static void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf) 689 { 690 htt_hw_stats_wd_timeout_tlv *dp_stats_buf = 691 (htt_hw_stats_wd_timeout_tlv *)tag_buf; 692 uint8_t i; 693 uint16_t index = 0; 694 char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 695 696 if (!hw_module_name) { 697 dp_stats_err("Output buffer not allocated"); 698 return; 699 } 700 701 DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:"); 702 for (i = 0; i < DP_HTT_HW_MODULE_NAME_LEN; i++) { 703 index += qdf_snprint(&hw_module_name[index], 704 DP_MAX_STRING_LEN - index, 705 " %u:%u,", i, dp_stats_buf->hw_module_name[i]); 706 } 707 DP_PRINT_STATS("hw_module_name = %s ", hw_module_name); 708 DP_PRINT_STATS("count = %u", 709 dp_stats_buf->count); 710 qdf_mem_free(hw_module_name); 711 } 712 713 /* 714 * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv 715 * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv 716 * 717 * return:void 718 */ 719 static void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf) 720 { 721 htt_hw_stats_pdev_errs_tlv *dp_stats_buf = 722 (htt_hw_stats_pdev_errs_tlv *)tag_buf; 723 724 DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:"); 725 DP_PRINT_STATS("mac_id__word = %u", 726 dp_stats_buf->mac_id__word); 727 DP_PRINT_STATS("tx_abort = %u", 728 dp_stats_buf->tx_abort); 729 DP_PRINT_STATS("tx_abort_fail_count = %u", 730 dp_stats_buf->tx_abort_fail_count); 731 DP_PRINT_STATS("rx_abort = %u", 732 dp_stats_buf->rx_abort); 733 DP_PRINT_STATS("rx_abort_fail_count = %u", 734 dp_stats_buf->rx_abort_fail_count); 735 DP_PRINT_STATS("warm_reset = %u", 736 dp_stats_buf->warm_reset); 737 DP_PRINT_STATS("cold_reset = %u", 738 dp_stats_buf->cold_reset); 739 DP_PRINT_STATS("tx_flush = %u", 740 dp_stats_buf->tx_flush); 741 DP_PRINT_STATS("tx_glb_reset = %u", 742 dp_stats_buf->tx_glb_reset); 743 DP_PRINT_STATS("tx_txq_reset = %u", 744 dp_stats_buf->tx_txq_reset); 745 DP_PRINT_STATS("rx_timeout_reset = %u\n", 746 dp_stats_buf->rx_timeout_reset); 747 } 748 749 /* 750 * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv 751 * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv 752 * 753 * return:void 754 */ 755 static void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf) 756 { 757 htt_msdu_flow_stats_tlv *dp_stats_buf = 758 (htt_msdu_flow_stats_tlv *)tag_buf; 759 760 DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:"); 761 DP_PRINT_STATS("last_update_timestamp = %u", 762 dp_stats_buf->last_update_timestamp); 763 DP_PRINT_STATS("last_add_timestamp = %u", 764 dp_stats_buf->last_add_timestamp); 765 DP_PRINT_STATS("last_remove_timestamp = %u", 766 dp_stats_buf->last_remove_timestamp); 767 DP_PRINT_STATS("total_processed_msdu_count = %u", 768 dp_stats_buf->total_processed_msdu_count); 769 DP_PRINT_STATS("cur_msdu_count_in_flowq = %u", 770 dp_stats_buf->cur_msdu_count_in_flowq); 771 DP_PRINT_STATS("sw_peer_id = %u", 772 dp_stats_buf->sw_peer_id); 773 DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n", 774 dp_stats_buf->tx_flow_no__tid_num__drop_rule); 775 } 776 777 /* 778 * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv 779 * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv 780 * 781 * return:void 782 */ 783 static void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf) 784 { 785 htt_tx_tid_stats_tlv *dp_stats_buf = 786 (htt_tx_tid_stats_tlv *)tag_buf; 787 uint8_t i; 788 uint16_t index = 0; 789 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 790 791 if (!tid_name) { 792 dp_stats_err("Output buffer not allocated"); 793 return; 794 } 795 796 DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:"); 797 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 798 index += qdf_snprint(&tid_name[index], 799 DP_MAX_STRING_LEN - index, 800 " %u:%u,", i, dp_stats_buf->tid_name[i]); 801 } 802 DP_PRINT_STATS("tid_name = %s ", tid_name); 803 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 804 dp_stats_buf->sw_peer_id__tid_num); 805 DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u", 806 dp_stats_buf->num_sched_pending__num_ppdu_in_hwq); 807 DP_PRINT_STATS("tid_flags = %u", 808 dp_stats_buf->tid_flags); 809 DP_PRINT_STATS("hw_queued = %u", 810 dp_stats_buf->hw_queued); 811 DP_PRINT_STATS("hw_reaped = %u", 812 dp_stats_buf->hw_reaped); 813 DP_PRINT_STATS("mpdus_hw_filter = %u", 814 dp_stats_buf->mpdus_hw_filter); 815 DP_PRINT_STATS("qdepth_bytes = %u", 816 dp_stats_buf->qdepth_bytes); 817 DP_PRINT_STATS("qdepth_num_msdu = %u", 818 dp_stats_buf->qdepth_num_msdu); 819 DP_PRINT_STATS("qdepth_num_mpdu = %u", 820 dp_stats_buf->qdepth_num_mpdu); 821 DP_PRINT_STATS("last_scheduled_tsmp = %u", 822 dp_stats_buf->last_scheduled_tsmp); 823 DP_PRINT_STATS("pause_module_id = %u", 824 dp_stats_buf->pause_module_id); 825 DP_PRINT_STATS("block_module_id = %u\n", 826 dp_stats_buf->block_module_id); 827 DP_PRINT_STATS("tid_tx_airtime = %u\n", 828 dp_stats_buf->tid_tx_airtime); 829 qdf_mem_free(tid_name); 830 } 831 832 /* 833 * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv 834 * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv 835 * 836 * return:void 837 */ 838 static void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf) 839 { 840 htt_tx_tid_stats_v1_tlv *dp_stats_buf = 841 (htt_tx_tid_stats_v1_tlv *)tag_buf; 842 uint8_t i; 843 uint16_t index = 0; 844 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 845 846 if (!tid_name) { 847 dp_stats_err("Output buffer not allocated"); 848 return; 849 } 850 851 DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:"); 852 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 853 index += qdf_snprint(&tid_name[index], 854 DP_MAX_STRING_LEN - index, 855 " %u:%u,", i, dp_stats_buf->tid_name[i]); 856 } 857 DP_PRINT_STATS("tid_name = %s ", tid_name); 858 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 859 dp_stats_buf->sw_peer_id__tid_num); 860 DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u", 861 dp_stats_buf->num_sched_pending__num_ppdu_in_hwq); 862 DP_PRINT_STATS("tid_flags = %u", 863 dp_stats_buf->tid_flags); 864 DP_PRINT_STATS("max_qdepth_bytes = %u", 865 dp_stats_buf->max_qdepth_bytes); 866 DP_PRINT_STATS("max_qdepth_n_msdus = %u", 867 dp_stats_buf->max_qdepth_n_msdus); 868 DP_PRINT_STATS("rsvd = %u", 869 dp_stats_buf->rsvd); 870 DP_PRINT_STATS("qdepth_bytes = %u", 871 dp_stats_buf->qdepth_bytes); 872 DP_PRINT_STATS("qdepth_num_msdu = %u", 873 dp_stats_buf->qdepth_num_msdu); 874 DP_PRINT_STATS("qdepth_num_mpdu = %u", 875 dp_stats_buf->qdepth_num_mpdu); 876 DP_PRINT_STATS("last_scheduled_tsmp = %u", 877 dp_stats_buf->last_scheduled_tsmp); 878 DP_PRINT_STATS("pause_module_id = %u", 879 dp_stats_buf->pause_module_id); 880 DP_PRINT_STATS("block_module_id = %u\n", 881 dp_stats_buf->block_module_id); 882 DP_PRINT_STATS("tid_tx_airtime = %u\n", 883 dp_stats_buf->tid_tx_airtime); 884 qdf_mem_free(tid_name); 885 } 886 887 /* 888 * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv 889 * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv 890 * 891 * return:void 892 */ 893 static void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf) 894 { 895 htt_rx_tid_stats_tlv *dp_stats_buf = 896 (htt_rx_tid_stats_tlv *)tag_buf; 897 uint8_t i; 898 uint16_t index = 0; 899 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 900 901 if (!tid_name) { 902 dp_stats_err("Output buffer not allocated"); 903 return; 904 } 905 906 DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:"); 907 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 908 dp_stats_buf->sw_peer_id__tid_num); 909 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 910 index += qdf_snprint(&tid_name[index], 911 DP_MAX_STRING_LEN - index, 912 " %u:%u,", i, dp_stats_buf->tid_name[i]); 913 } 914 DP_PRINT_STATS("tid_name = %s ", tid_name); 915 DP_PRINT_STATS("dup_in_reorder = %u", 916 dp_stats_buf->dup_in_reorder); 917 DP_PRINT_STATS("dup_past_outside_window = %u", 918 dp_stats_buf->dup_past_outside_window); 919 DP_PRINT_STATS("dup_past_within_window = %u", 920 dp_stats_buf->dup_past_within_window); 921 DP_PRINT_STATS("rxdesc_err_decrypt = %u\n", 922 dp_stats_buf->rxdesc_err_decrypt); 923 qdf_mem_free(tid_name); 924 } 925 926 /* 927 * dp_print_counter_tlv: display htt_counter_tlv 928 * @tag_buf: buffer containing the tlv htt_counter_tlv 929 * 930 * return:void 931 */ 932 static void dp_print_counter_tlv(uint32_t *tag_buf) 933 { 934 htt_counter_tlv *dp_stats_buf = 935 (htt_counter_tlv *)tag_buf; 936 uint8_t i; 937 uint16_t index = 0; 938 char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 939 940 if (!counter_name) { 941 dp_stats_err("Output buffer not allocated"); 942 return; 943 } 944 945 DP_PRINT_STATS("HTT_COUNTER_TLV:"); 946 for (i = 0; i < DP_HTT_COUNTER_NAME_LEN; i++) { 947 index += qdf_snprint(&counter_name[index], 948 DP_MAX_STRING_LEN - index, 949 " %u:%u,", i, dp_stats_buf->counter_name[i]); 950 } 951 DP_PRINT_STATS("counter_name = %s ", counter_name); 952 DP_PRINT_STATS("count = %u\n", 953 dp_stats_buf->count); 954 qdf_mem_free(counter_name); 955 } 956 957 /* 958 * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv 959 * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv 960 * 961 * return:void 962 */ 963 static void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf) 964 { 965 htt_peer_stats_cmn_tlv *dp_stats_buf = 966 (htt_peer_stats_cmn_tlv *)tag_buf; 967 968 DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:"); 969 DP_PRINT_STATS("ppdu_cnt = %u", 970 dp_stats_buf->ppdu_cnt); 971 DP_PRINT_STATS("mpdu_cnt = %u", 972 dp_stats_buf->mpdu_cnt); 973 DP_PRINT_STATS("msdu_cnt = %u", 974 dp_stats_buf->msdu_cnt); 975 DP_PRINT_STATS("pause_bitmap = %u", 976 dp_stats_buf->pause_bitmap); 977 DP_PRINT_STATS("block_bitmap = %u", 978 dp_stats_buf->block_bitmap); 979 DP_PRINT_STATS("current_timestamp = %u\n", 980 dp_stats_buf->current_timestamp); 981 DP_PRINT_STATS("inactive_time = %u", 982 dp_stats_buf->inactive_time); 983 } 984 985 /* 986 * dp_print_peer_details_tlv: display htt_peer_details_tlv 987 * @tag_buf: buffer containing the tlv htt_peer_details_tlv 988 * 989 * return:void 990 */ 991 static void dp_print_peer_details_tlv(uint32_t *tag_buf) 992 { 993 htt_peer_details_tlv *dp_stats_buf = 994 (htt_peer_details_tlv *)tag_buf; 995 996 DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:"); 997 DP_PRINT_STATS("peer_type = %u", 998 dp_stats_buf->peer_type); 999 DP_PRINT_STATS("sw_peer_id = %u", 1000 dp_stats_buf->sw_peer_id); 1001 DP_PRINT_STATS("vdev_pdev_ast_idx = %u", 1002 dp_stats_buf->vdev_pdev_ast_idx); 1003 DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u", 1004 dp_stats_buf->mac_addr.mac_addr31to0); 1005 DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u", 1006 dp_stats_buf->mac_addr.mac_addr47to32); 1007 DP_PRINT_STATS("peer_flags = %u", 1008 dp_stats_buf->peer_flags); 1009 DP_PRINT_STATS("qpeer_flags = %u\n", 1010 dp_stats_buf->qpeer_flags); 1011 } 1012 1013 /* 1014 * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv 1015 * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv 1016 * 1017 * return:void 1018 */ 1019 static void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf) 1020 { 1021 htt_tx_peer_rate_stats_tlv *dp_stats_buf = 1022 (htt_tx_peer_rate_stats_tlv *)tag_buf; 1023 uint8_t i, j; 1024 uint16_t index = 0; 1025 char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1026 char *tx_gi_ext[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1027 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 1028 1029 if (!str_buf) { 1030 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1031 FL("Output buffer not allocated")); 1032 return; 1033 } 1034 1035 for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1036 tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 1037 tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 1038 if (!tx_gi[i] || !tx_gi_ext[i]) { 1039 dp_err("Unable to allocate buffer for tx_gi"); 1040 goto fail1; 1041 } 1042 } 1043 1044 DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:"); 1045 DP_PRINT_STATS("tx_ldpc = %u", 1046 dp_stats_buf->tx_ldpc); 1047 DP_PRINT_STATS("rts_cnt = %u", 1048 dp_stats_buf->rts_cnt); 1049 DP_PRINT_STATS("ack_rssi = %u", 1050 dp_stats_buf->ack_rssi); 1051 1052 index = 0; 1053 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1054 for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) { 1055 index += qdf_snprint(&str_buf[index], 1056 DP_MAX_STRING_LEN - index, 1057 " %u:%u,", i, dp_stats_buf->tx_mcs[i]); 1058 } 1059 for (i = 0; i < DP_HTT_TX_MCS_EXT_LEN; i++) { 1060 index += qdf_snprint(&str_buf[index], 1061 DP_MAX_STRING_LEN - index, 1062 " %u:%u,", i + DP_HTT_TX_MCS_LEN, 1063 dp_stats_buf->tx_mcs_ext[i]); 1064 } 1065 DP_PRINT_STATS("tx_mcs = %s ", str_buf); 1066 1067 index = 0; 1068 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1069 for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) { 1070 index += qdf_snprint(&str_buf[index], 1071 DP_MAX_STRING_LEN - index, 1072 " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]); 1073 } 1074 for (i = 0; i < DP_HTT_TX_SU_MCS_EXT_LEN; i++) { 1075 index += qdf_snprint(&str_buf[index], 1076 DP_MAX_STRING_LEN - index, 1077 " %u:%u,", i + DP_HTT_TX_SU_MCS_LEN, 1078 dp_stats_buf->tx_su_mcs_ext[i]); 1079 } 1080 DP_PRINT_STATS("tx_su_mcs = %s ", str_buf); 1081 1082 1083 index = 0; 1084 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1085 for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) { 1086 index += qdf_snprint(&str_buf[index], 1087 DP_MAX_STRING_LEN - index, 1088 " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]); 1089 } 1090 for (i = 0; i < DP_HTT_TX_MU_MCS_EXT_LEN; i++) { 1091 index += qdf_snprint(&str_buf[index], 1092 DP_MAX_STRING_LEN - index, 1093 " %u:%u,", i + DP_HTT_TX_MU_MCS_LEN, 1094 dp_stats_buf->tx_mu_mcs_ext[i]); 1095 } 1096 DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf); 1097 1098 index = 0; 1099 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1100 for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) { 1101 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 1102 index += qdf_snprint(&str_buf[index], 1103 DP_MAX_STRING_LEN - index, 1104 " %u:%u,", (i + 1), 1105 dp_stats_buf->tx_nss[i]); 1106 } 1107 DP_PRINT_STATS("tx_nss = %s ", str_buf); 1108 index = 0; 1109 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1110 for (i = 0; i < DP_HTT_TX_BW_LEN; i++) { 1111 index += qdf_snprint(&str_buf[index], 1112 DP_MAX_STRING_LEN - index, 1113 " %u:%u,", i, dp_stats_buf->tx_bw[i]); 1114 } 1115 DP_PRINT_STATS("tx_bw = %s ", str_buf); 1116 1117 index = 0; 1118 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1119 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1120 index += qdf_snprint(&str_buf[index], 1121 DP_MAX_STRING_LEN - index, 1122 " %u:%u,", i, dp_stats_buf->tx_stbc[i]); 1123 } 1124 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1125 index += qdf_snprint(&str_buf[index], 1126 DP_MAX_STRING_LEN - index, 1127 " %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 1128 dp_stats_buf->tx_stbc_ext[i]); 1129 } 1130 DP_PRINT_STATS("tx_stbc = %s ", str_buf); 1131 1132 1133 index = 0; 1134 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1135 1136 for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) { 1137 index += qdf_snprint(&str_buf[index], 1138 DP_MAX_STRING_LEN - index, 1139 " %u:%u,", i, dp_stats_buf->tx_pream[i]); 1140 } 1141 DP_PRINT_STATS("tx_pream = %s ", str_buf); 1142 1143 for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1144 index = 0; 1145 for (i = 0; i < HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) { 1146 index += qdf_snprint(&tx_gi[j][index], 1147 DP_MAX_STRING_LEN - index, 1148 " %u:%u,", i, 1149 dp_stats_buf->tx_gi[j][i]); 1150 } 1151 DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]); 1152 } 1153 1154 for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1155 index = 0; 1156 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1157 index += qdf_snprint(&tx_gi_ext[j][index], 1158 DP_MAX_STRING_LEN - index, 1159 " %u:%u,", i, 1160 dp_stats_buf->tx_gi_ext[j][i]); 1161 } 1162 DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]); 1163 } 1164 1165 index = 0; 1166 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1167 for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) { 1168 index += qdf_snprint(&str_buf[index], 1169 DP_MAX_STRING_LEN - index, 1170 " %u:%u,", i, dp_stats_buf->tx_dcm[i]); 1171 } 1172 DP_PRINT_STATS("tx_dcm = %s\n", str_buf); 1173 1174 fail1: 1175 for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1176 if (tx_gi[i]) 1177 qdf_mem_free(tx_gi[i]); 1178 if (tx_gi_ext[i]) 1179 qdf_mem_free(tx_gi_ext[i]); 1180 } 1181 qdf_mem_free(str_buf); 1182 } 1183 1184 /* 1185 * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv 1186 * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv 1187 * 1188 * return:void 1189 */ 1190 static void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf) 1191 { 1192 htt_rx_peer_rate_stats_tlv *dp_stats_buf = 1193 (htt_rx_peer_rate_stats_tlv *)tag_buf; 1194 uint8_t i, j; 1195 uint16_t index = 0; 1196 char *rssi_chain[DP_HTT_PEER_NUM_SS] = {0}; 1197 char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1198 char *rx_gi_ext[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1199 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 1200 1201 if (!str_buf) { 1202 dp_stats_err("Output buffer not allocated"); 1203 return; 1204 } 1205 1206 for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) { 1207 rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 1208 if (!rssi_chain[i]) { 1209 dp_err("Unable to allocate buffer for rssi_chain"); 1210 goto fail1; 1211 } 1212 } 1213 1214 for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1215 rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 1216 rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 1217 if (!rx_gi[i] || !rx_gi_ext[i]) { 1218 dp_err("Unable to allocate buffer for rx_gi"); 1219 goto fail1; 1220 } 1221 } 1222 1223 DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:"); 1224 DP_PRINT_STATS("nsts = %u", 1225 dp_stats_buf->nsts); 1226 DP_PRINT_STATS("rx_ldpc = %u", 1227 dp_stats_buf->rx_ldpc); 1228 DP_PRINT_STATS("rts_cnt = %u", 1229 dp_stats_buf->rts_cnt); 1230 DP_PRINT_STATS("rssi_mgmt = %u", 1231 dp_stats_buf->rssi_mgmt); 1232 DP_PRINT_STATS("rssi_data = %u", 1233 dp_stats_buf->rssi_data); 1234 DP_PRINT_STATS("rssi_comb = %u", 1235 dp_stats_buf->rssi_comb); 1236 1237 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1238 for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) { 1239 index += qdf_snprint(&str_buf[index], 1240 DP_MAX_STRING_LEN - index, 1241 " %u:%u,", i, dp_stats_buf->rx_mcs[i]); 1242 } 1243 for (i = 0; i < DP_HTT_RX_MCS_EXT_LEN; i++) { 1244 index += qdf_snprint(&str_buf[index], 1245 DP_MAX_STRING_LEN - index, 1246 " %u:%u,", i + DP_HTT_RX_MCS_LEN, 1247 dp_stats_buf->rx_mcs_ext[i]); 1248 } 1249 DP_PRINT_STATS("rx_mcs = %s ", str_buf); 1250 1251 index = 0; 1252 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1253 for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) { 1254 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 1255 index += qdf_snprint(&str_buf[index], 1256 DP_MAX_STRING_LEN - index, 1257 " %u:%u,", (i + 1), 1258 dp_stats_buf->rx_nss[i]); 1259 } 1260 DP_PRINT_STATS("rx_nss = %s ", str_buf); 1261 1262 index = 0; 1263 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1264 for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) { 1265 index += qdf_snprint(&str_buf[index], 1266 DP_MAX_STRING_LEN - index, 1267 " %u:%u,", i, dp_stats_buf->rx_dcm[i]); 1268 } 1269 DP_PRINT_STATS("rx_dcm = %s ", str_buf); 1270 1271 index = 0; 1272 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1273 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1274 index += qdf_snprint(&str_buf[index], 1275 DP_MAX_STRING_LEN - index, 1276 " %u:%u,", i, dp_stats_buf->rx_stbc[i]); 1277 } 1278 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1279 index += qdf_snprint(&str_buf[index], 1280 DP_MAX_STRING_LEN - index, 1281 " %u:%u,", i + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, 1282 dp_stats_buf->rx_stbc_ext[i]); 1283 } 1284 DP_PRINT_STATS("rx_stbc = %s ", str_buf); 1285 1286 index = 0; 1287 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1288 for (i = 0; i < DP_HTT_RX_BW_LEN; i++) { 1289 index += qdf_snprint(&str_buf[index], 1290 DP_MAX_STRING_LEN - index, 1291 " %u:%u,", i, dp_stats_buf->rx_bw[i]); 1292 } 1293 DP_PRINT_STATS("rx_bw = %s ", str_buf); 1294 1295 for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) { 1296 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1297 index = 0; 1298 for (i = 0; i < HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) { 1299 index += qdf_snprint(&rssi_chain[j][index], 1300 DP_MAX_STRING_LEN - index, 1301 " %u:%u,", i, 1302 dp_stats_buf->rssi_chain[j][i]); 1303 } 1304 DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]); 1305 } 1306 1307 for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1308 index = 0; 1309 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1310 index += qdf_snprint(&rx_gi[j][index], 1311 DP_MAX_STRING_LEN - index, 1312 " %u:%u,", i, 1313 dp_stats_buf->rx_gi[j][i]); 1314 } 1315 DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]); 1316 } 1317 1318 for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1319 index = 0; 1320 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1321 index += qdf_snprint(&rx_gi_ext[j][index], 1322 DP_MAX_STRING_LEN - index, 1323 " %u:%u,", i, 1324 dp_stats_buf->rx_gi_ext[j][i]); 1325 } 1326 DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]); 1327 } 1328 1329 index = 0; 1330 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1331 for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) { 1332 index += qdf_snprint(&str_buf[index], 1333 DP_MAX_STRING_LEN - index, 1334 " %u:%u,", i, dp_stats_buf->rx_pream[i]); 1335 } 1336 DP_PRINT_STATS("rx_pream = %s\n", str_buf); 1337 1338 fail1: 1339 for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) { 1340 if (!rssi_chain[i]) 1341 break; 1342 qdf_mem_free(rssi_chain[i]); 1343 } 1344 1345 for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1346 if (rx_gi[i]) 1347 qdf_mem_free(rx_gi[i]); 1348 if (rx_gi_ext[i]) 1349 qdf_mem_free(rx_gi_ext[i]); 1350 } 1351 qdf_mem_free(str_buf); 1352 } 1353 1354 /* 1355 * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats 1356 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv 1357 * 1358 * return:void 1359 */ 1360 static void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf) 1361 { 1362 htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf = 1363 (htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf; 1364 1365 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:"); 1366 DP_PRINT_STATS("mu_mimo_sch_posted = %u", 1367 dp_stats_buf->mu_mimo_sch_posted); 1368 DP_PRINT_STATS("mu_mimo_sch_failed = %u", 1369 dp_stats_buf->mu_mimo_sch_failed); 1370 DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n", 1371 dp_stats_buf->mu_mimo_ppdu_posted); 1372 } 1373 1374 /* 1375 * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats 1376 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv 1377 * 1378 * return:void 1379 */ 1380 static void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf) 1381 { 1382 htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf = 1383 (htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf; 1384 1385 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:"); 1386 DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u", 1387 dp_stats_buf->mu_mimo_mpdus_queued_usr); 1388 DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u", 1389 dp_stats_buf->mu_mimo_mpdus_tried_usr); 1390 DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u", 1391 dp_stats_buf->mu_mimo_mpdus_failed_usr); 1392 DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u", 1393 dp_stats_buf->mu_mimo_mpdus_requeued_usr); 1394 DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u", 1395 dp_stats_buf->mu_mimo_err_no_ba_usr); 1396 DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u", 1397 dp_stats_buf->mu_mimo_mpdu_underrun_usr); 1398 DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n", 1399 dp_stats_buf->mu_mimo_ampdu_underrun_usr); 1400 } 1401 1402 /* 1403 * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats 1404 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv 1405 * 1406 * return:void 1407 */ 1408 static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf) 1409 { 1410 htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf = 1411 (htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf; 1412 1413 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:"); 1414 DP_PRINT_STATS("mac_id__hwq_id__word = %u\n", 1415 dp_stats_buf->mac_id__hwq_id__word); 1416 } 1417 1418 /* 1419 * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv 1420 * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv 1421 * 1422 * return:void 1423 */ 1424 static void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf) 1425 { 1426 htt_tx_hwq_stats_cmn_tlv *dp_stats_buf = 1427 (htt_tx_hwq_stats_cmn_tlv *)tag_buf; 1428 1429 DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:"); 1430 DP_PRINT_STATS("mac_id__hwq_id__word = %u", 1431 dp_stats_buf->mac_id__hwq_id__word); 1432 DP_PRINT_STATS("xretry = %u", 1433 dp_stats_buf->xretry); 1434 DP_PRINT_STATS("underrun_cnt = %u", 1435 dp_stats_buf->underrun_cnt); 1436 DP_PRINT_STATS("flush_cnt = %u", 1437 dp_stats_buf->flush_cnt); 1438 DP_PRINT_STATS("filt_cnt = %u", 1439 dp_stats_buf->filt_cnt); 1440 DP_PRINT_STATS("null_mpdu_bmap = %u", 1441 dp_stats_buf->null_mpdu_bmap); 1442 DP_PRINT_STATS("user_ack_failure = %u", 1443 dp_stats_buf->user_ack_failure); 1444 DP_PRINT_STATS("ack_tlv_proc = %u", 1445 dp_stats_buf->ack_tlv_proc); 1446 DP_PRINT_STATS("sched_id_proc = %u", 1447 dp_stats_buf->sched_id_proc); 1448 DP_PRINT_STATS("null_mpdu_tx_count = %u", 1449 dp_stats_buf->null_mpdu_tx_count); 1450 DP_PRINT_STATS("mpdu_bmap_not_recvd = %u", 1451 dp_stats_buf->mpdu_bmap_not_recvd); 1452 DP_PRINT_STATS("num_bar = %u", 1453 dp_stats_buf->num_bar); 1454 DP_PRINT_STATS("rts = %u", 1455 dp_stats_buf->rts); 1456 DP_PRINT_STATS("cts2self = %u", 1457 dp_stats_buf->cts2self); 1458 DP_PRINT_STATS("qos_null = %u", 1459 dp_stats_buf->qos_null); 1460 DP_PRINT_STATS("mpdu_tried_cnt = %u", 1461 dp_stats_buf->mpdu_tried_cnt); 1462 DP_PRINT_STATS("mpdu_queued_cnt = %u", 1463 dp_stats_buf->mpdu_queued_cnt); 1464 DP_PRINT_STATS("mpdu_ack_fail_cnt = %u", 1465 dp_stats_buf->mpdu_ack_fail_cnt); 1466 DP_PRINT_STATS("mpdu_filt_cnt = %u", 1467 dp_stats_buf->mpdu_filt_cnt); 1468 DP_PRINT_STATS("false_mpdu_ack_count = %u\n", 1469 dp_stats_buf->false_mpdu_ack_count); 1470 } 1471 1472 /* 1473 * dp_print_tx_hwq_difs_latency_stats_tlv_v: display 1474 * htt_tx_hwq_difs_latency_stats_tlv_v 1475 * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v 1476 * 1477 *return:void 1478 */ 1479 static void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf) 1480 { 1481 htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf = 1482 (htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf; 1483 uint8_t i; 1484 uint16_t index = 0; 1485 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1486 char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN); 1487 1488 if (!difs_latency_hist) { 1489 dp_stats_err("Output buffer not allocated"); 1490 return; 1491 } 1492 1493 tag_len = qdf_min(tag_len, 1494 (uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS); 1495 1496 DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:"); 1497 DP_PRINT_STATS("hist_intvl = %u", 1498 dp_stats_buf->hist_intvl); 1499 1500 for (i = 0; i < tag_len; i++) { 1501 index += qdf_snprint(&difs_latency_hist[index], 1502 DP_MAX_STRING_LEN - index, 1503 " %u:%u,", i, 1504 dp_stats_buf->difs_latency_hist[i]); 1505 } 1506 DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist); 1507 qdf_mem_free(difs_latency_hist); 1508 } 1509 1510 /* 1511 * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats 1512 * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v 1513 * 1514 * return:void 1515 */ 1516 static void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf) 1517 { 1518 htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf = 1519 (htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf; 1520 uint8_t i; 1521 uint16_t index = 0; 1522 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1523 char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN); 1524 1525 if (!cmd_result) { 1526 dp_stats_err("Output buffer not allocated"); 1527 return; 1528 } 1529 1530 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS); 1531 1532 DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:"); 1533 for (i = 0; i < tag_len; i++) { 1534 index += qdf_snprint(&cmd_result[index], 1535 DP_MAX_STRING_LEN - index, 1536 " %u:%u,", i, dp_stats_buf->cmd_result[i]); 1537 } 1538 DP_PRINT_STATS("cmd_result = %s ", cmd_result); 1539 qdf_mem_free(cmd_result); 1540 } 1541 1542 /* 1543 * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv 1544 * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v 1545 * 1546 * return:void 1547 */ 1548 static void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf) 1549 { 1550 htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf = 1551 (htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf; 1552 uint8_t i; 1553 uint16_t index = 0; 1554 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1555 char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN); 1556 1557 if (!cmd_stall_status) { 1558 dp_stats_err("Output buffer not allocated"); 1559 return; 1560 } 1561 1562 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS); 1563 1564 DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:"); 1565 for (i = 0; i < tag_len; i++) { 1566 index += qdf_snprint(&cmd_stall_status[index], 1567 DP_MAX_STRING_LEN - index, 1568 " %u:%u,", i, 1569 dp_stats_buf->cmd_stall_status[i]); 1570 } 1571 DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status); 1572 qdf_mem_free(cmd_stall_status); 1573 } 1574 1575 /* 1576 * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats 1577 * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v 1578 * 1579 * return:void 1580 */ 1581 static void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf) 1582 { 1583 htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf = 1584 (htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf; 1585 uint8_t i; 1586 uint16_t index = 0; 1587 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1588 char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN); 1589 1590 if (!fes_result) { 1591 dp_stats_err("Output buffer not allocated"); 1592 return; 1593 } 1594 1595 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS); 1596 1597 DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:"); 1598 for (i = 0; i < tag_len; i++) { 1599 index += qdf_snprint(&fes_result[index], 1600 DP_MAX_STRING_LEN - index, 1601 " %u:%u,", i, dp_stats_buf->fes_result[i]); 1602 } 1603 DP_PRINT_STATS("fes_result = %s ", fes_result); 1604 qdf_mem_free(fes_result); 1605 } 1606 1607 /* 1608 * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv 1609 * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv 1610 * 1611 * return:void 1612 */ 1613 static void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf) 1614 { 1615 htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf = 1616 (htt_tx_selfgen_cmn_stats_tlv *)tag_buf; 1617 DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:"); 1618 DP_PRINT_STATS("mac_id__word = %u", 1619 dp_stats_buf->mac_id__word); 1620 DP_PRINT_STATS("su_bar = %u", 1621 dp_stats_buf->su_bar); 1622 DP_PRINT_STATS("rts = %u", 1623 dp_stats_buf->rts); 1624 DP_PRINT_STATS("cts2self = %u", 1625 dp_stats_buf->cts2self); 1626 DP_PRINT_STATS("qos_null = %u", 1627 dp_stats_buf->qos_null); 1628 DP_PRINT_STATS("delayed_bar_1 = %u", 1629 dp_stats_buf->delayed_bar_1); 1630 DP_PRINT_STATS("delayed_bar_2 = %u", 1631 dp_stats_buf->delayed_bar_2); 1632 DP_PRINT_STATS("delayed_bar_3 = %u", 1633 dp_stats_buf->delayed_bar_3); 1634 DP_PRINT_STATS("delayed_bar_4 = %u", 1635 dp_stats_buf->delayed_bar_4); 1636 DP_PRINT_STATS("delayed_bar_5 = %u", 1637 dp_stats_buf->delayed_bar_5); 1638 DP_PRINT_STATS("delayed_bar_6 = %u", 1639 dp_stats_buf->delayed_bar_6); 1640 DP_PRINT_STATS("delayed_bar_7 = %u\n", 1641 dp_stats_buf->delayed_bar_7); 1642 } 1643 1644 /* 1645 * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv 1646 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv 1647 * 1648 * return:void 1649 */ 1650 static void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf) 1651 { 1652 htt_tx_selfgen_ac_stats_tlv *dp_stats_buf = 1653 (htt_tx_selfgen_ac_stats_tlv *)tag_buf; 1654 1655 DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:"); 1656 DP_PRINT_STATS("ac_su_ndpa = %u", 1657 dp_stats_buf->ac_su_ndpa); 1658 DP_PRINT_STATS("ac_su_ndp = %u", 1659 dp_stats_buf->ac_su_ndp); 1660 DP_PRINT_STATS("ac_mu_mimo_ndpa = %u", 1661 dp_stats_buf->ac_mu_mimo_ndpa); 1662 DP_PRINT_STATS("ac_mu_mimo_ndp = %u", 1663 dp_stats_buf->ac_mu_mimo_ndp); 1664 DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u", 1665 dp_stats_buf->ac_mu_mimo_brpoll_1); 1666 DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u", 1667 dp_stats_buf->ac_mu_mimo_brpoll_2); 1668 DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n", 1669 dp_stats_buf->ac_mu_mimo_brpoll_3); 1670 } 1671 1672 /* 1673 * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv 1674 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv 1675 * 1676 * return:void 1677 */ 1678 static void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf) 1679 { 1680 htt_tx_selfgen_ax_stats_tlv *dp_stats_buf = 1681 (htt_tx_selfgen_ax_stats_tlv *)tag_buf; 1682 1683 DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:"); 1684 DP_PRINT_STATS("ax_su_ndpa = %u", 1685 dp_stats_buf->ax_su_ndpa); 1686 DP_PRINT_STATS("ax_su_ndp = %u", 1687 dp_stats_buf->ax_su_ndp); 1688 DP_PRINT_STATS("ax_mu_mimo_ndpa = %u", 1689 dp_stats_buf->ax_mu_mimo_ndpa); 1690 DP_PRINT_STATS("ax_mu_mimo_ndp = %u", 1691 dp_stats_buf->ax_mu_mimo_ndp); 1692 DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u", 1693 dp_stats_buf->ax_mu_mimo_brpoll_1); 1694 DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u", 1695 dp_stats_buf->ax_mu_mimo_brpoll_2); 1696 DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u", 1697 dp_stats_buf->ax_mu_mimo_brpoll_3); 1698 DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u", 1699 dp_stats_buf->ax_mu_mimo_brpoll_4); 1700 DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u", 1701 dp_stats_buf->ax_mu_mimo_brpoll_5); 1702 DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u", 1703 dp_stats_buf->ax_mu_mimo_brpoll_6); 1704 DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u", 1705 dp_stats_buf->ax_mu_mimo_brpoll_7); 1706 DP_PRINT_STATS("ax_basic_trigger = %u", 1707 dp_stats_buf->ax_basic_trigger); 1708 DP_PRINT_STATS("ax_bsr_trigger = %u", 1709 dp_stats_buf->ax_bsr_trigger); 1710 DP_PRINT_STATS("ax_mu_bar_trigger = %u", 1711 dp_stats_buf->ax_mu_bar_trigger); 1712 DP_PRINT_STATS("ax_mu_rts_trigger = %u\n", 1713 dp_stats_buf->ax_mu_rts_trigger); 1714 } 1715 1716 /* 1717 * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv 1718 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv 1719 * 1720 * return:void 1721 */ 1722 static void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf) 1723 { 1724 htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf = 1725 (htt_tx_selfgen_ac_err_stats_tlv *)tag_buf; 1726 1727 DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:"); 1728 DP_PRINT_STATS("ac_su_ndp_err = %u", 1729 dp_stats_buf->ac_su_ndp_err); 1730 DP_PRINT_STATS("ac_su_ndpa_err = %u", 1731 dp_stats_buf->ac_su_ndpa_err); 1732 DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u", 1733 dp_stats_buf->ac_mu_mimo_ndpa_err); 1734 DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u", 1735 dp_stats_buf->ac_mu_mimo_ndp_err); 1736 DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u", 1737 dp_stats_buf->ac_mu_mimo_brp1_err); 1738 DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u", 1739 dp_stats_buf->ac_mu_mimo_brp2_err); 1740 DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n", 1741 dp_stats_buf->ac_mu_mimo_brp3_err); 1742 } 1743 1744 /* dp_print_tx_selfgen_be_err_stats_tlv: display htt_tx_selfgen_be_err_stats_tlv 1745 * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_err_stats_tlv 1746 * 1747 * return:void 1748 */ 1749 static void dp_print_tx_selfgen_be_err_stats_tlv(uint32_t *tag_buf) 1750 { 1751 htt_tx_selfgen_be_err_stats_tlv *dp_stats_buf = 1752 (htt_tx_selfgen_be_err_stats_tlv *)tag_buf; 1753 uint16_t i; 1754 1755 DP_PRINT_STATS("HTT_TX_SELFGEN_BE_ERR_STATS_TLV:"); 1756 DP_PRINT_STATS("be_su_ndp_err = %u", 1757 dp_stats_buf->be_su_ndp_err); 1758 DP_PRINT_STATS("be_su_ndpa_err = %u", 1759 dp_stats_buf->be_su_ndpa_err); 1760 DP_PRINT_STATS("be_mu_mimo_ndpa_err = %u", 1761 dp_stats_buf->be_mu_mimo_ndpa_err); 1762 DP_PRINT_STATS("be_mu_mimo_ndp_err = %u", 1763 dp_stats_buf->be_mu_mimo_ndp_err); 1764 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1765 DP_PRINT_STATS("be_mu_mimo_brp_err_%d: %u", 1766 i, dp_stats_buf->be_mu_mimo_brp_err[i]); 1767 DP_PRINT_STATS("be_basic_trigger_err = %u", 1768 dp_stats_buf->be_basic_trigger_err); 1769 DP_PRINT_STATS("be_bsr_trigger_err = %u", 1770 dp_stats_buf->be_bsr_trigger_err); 1771 DP_PRINT_STATS("be_mu_bar_trigger_err = %u", 1772 dp_stats_buf->be_mu_bar_trigger_err); 1773 DP_PRINT_STATS("be_mu_rts_trigger_err = %u", 1774 dp_stats_buf->be_mu_rts_trigger_err); 1775 DP_PRINT_STATS("be_ulmumimo_trigger_err = %u", 1776 dp_stats_buf->be_ulmumimo_trigger_err); 1777 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1778 DP_PRINT_STATS("be_mu_mimo_brp_err_num_cbf_received _%d: %u", i, 1779 dp_stats_buf->be_mu_mimo_brp_err_num_cbf_received[i]); 1780 DP_PRINT_STATS("be_su_ndpa_flushed = %u", 1781 dp_stats_buf->be_su_ndpa_flushed); 1782 DP_PRINT_STATS("be_su_ndp_flushed = %u", 1783 dp_stats_buf->be_su_ndp_flushed); 1784 DP_PRINT_STATS("be_mu_mimo_ndpa_flushed = %u", 1785 dp_stats_buf->be_mu_mimo_ndpa_flushed); 1786 DP_PRINT_STATS("be_mu_mimo_ndp_flushed = %u", 1787 dp_stats_buf->be_mu_mimo_ndp_flushed); 1788 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1789 DP_PRINT_STATS("be_mu_mimo_brpoll_flushed_%d: %u", 1790 i, dp_stats_buf->be_mu_mimo_brpoll_flushed[i]); 1791 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1792 DP_PRINT_STATS("be_ul_mumimo_trigger_err_%d: %u", 1793 i, dp_stats_buf->be_ul_mumimo_trigger_err[i]); 1794 } 1795 1796 /* 1797 * dp_print_tx_selfgen_be_stats_tlv: display htt_tx_selfgen_be_stats_tlv 1798 * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_stats_tlv 1799 * 1800 * return:void 1801 */ 1802 static void dp_print_tx_selfgen_be_stats_tlv(uint32_t *tag_buf) 1803 { 1804 htt_tx_selfgen_be_stats_tlv *dp_stats_buf = 1805 (htt_tx_selfgen_be_stats_tlv *)tag_buf; 1806 uint16_t i; 1807 1808 DP_PRINT_STATS("HTT_TX_SELFGEN_BE_STATS_TLV:"); 1809 DP_PRINT_STATS("be_su_ndpa = %u", 1810 dp_stats_buf->be_su_ndpa); 1811 DP_PRINT_STATS("be_su_ndp = %u", 1812 dp_stats_buf->be_su_ndp); 1813 DP_PRINT_STATS("be_mu_mimo_ndpa = %u", 1814 dp_stats_buf->be_mu_mimo_ndpa); 1815 DP_PRINT_STATS("be_mu_mimo_ndp = %u", 1816 dp_stats_buf->be_mu_mimo_ndp); 1817 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1818 DP_PRINT_STATS("be_mu_mimo_brpoll_%d = %u", 1819 i, dp_stats_buf->be_mu_mimo_brpoll[i]); 1820 DP_PRINT_STATS("be_basic_trigger = %u", 1821 dp_stats_buf->be_basic_trigger); 1822 DP_PRINT_STATS("be_bsr_trigger = %u", 1823 dp_stats_buf->be_bsr_trigger); 1824 DP_PRINT_STATS("be_mu_bar_trigger = %u", 1825 dp_stats_buf->be_mu_bar_trigger); 1826 DP_PRINT_STATS("be_mu_rts_trigger = %u", 1827 dp_stats_buf->be_mu_rts_trigger); 1828 DP_PRINT_STATS("be_ulmumimo_trigger = %u", 1829 dp_stats_buf->be_ulmumimo_trigger); 1830 DP_PRINT_STATS("be_su_ndpa_queued = %u", 1831 dp_stats_buf->be_su_ndpa_queued); 1832 DP_PRINT_STATS("be_su_ndp_queued = %u", 1833 dp_stats_buf->be_su_ndp_queued); 1834 DP_PRINT_STATS("be_mu_mimo_ndpa_queued = %u", 1835 dp_stats_buf->be_mu_mimo_ndpa_queued); 1836 DP_PRINT_STATS("be_mu_mimo_ndp_queued = %u", 1837 dp_stats_buf->be_mu_mimo_ndp_queued); 1838 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1839 DP_PRINT_STATS("be_mu_mimo_brpoll_queued_%d = %u", 1840 i, dp_stats_buf->be_mu_mimo_brpoll_queued[i]); 1841 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1842 DP_PRINT_STATS("be_ul_mumimo_trigger_%d = %u", 1843 i, dp_stats_buf->be_ul_mumimo_trigger[i]); 1844 } 1845 1846 /* 1847 * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv 1848 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv 1849 * 1850 * return:void 1851 */ 1852 static void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf) 1853 { 1854 htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf = 1855 (htt_tx_selfgen_ax_err_stats_tlv *)tag_buf; 1856 1857 DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:"); 1858 DP_PRINT_STATS("ax_su_ndp_err = %u", 1859 dp_stats_buf->ax_su_ndp_err); 1860 DP_PRINT_STATS("ax_su_ndpa_err = %u", 1861 dp_stats_buf->ax_su_ndpa_err); 1862 DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u", 1863 dp_stats_buf->ax_mu_mimo_ndpa_err); 1864 DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u", 1865 dp_stats_buf->ax_mu_mimo_ndp_err); 1866 DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u", 1867 dp_stats_buf->ax_mu_mimo_brp1_err); 1868 DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u", 1869 dp_stats_buf->ax_mu_mimo_brp2_err); 1870 DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u", 1871 dp_stats_buf->ax_mu_mimo_brp3_err); 1872 DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u", 1873 dp_stats_buf->ax_mu_mimo_brp4_err); 1874 DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u", 1875 dp_stats_buf->ax_mu_mimo_brp5_err); 1876 DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u", 1877 dp_stats_buf->ax_mu_mimo_brp6_err); 1878 DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u", 1879 dp_stats_buf->ax_mu_mimo_brp7_err); 1880 DP_PRINT_STATS("ax_basic_trigger_err = %u", 1881 dp_stats_buf->ax_basic_trigger_err); 1882 DP_PRINT_STATS("ax_bsr_trigger_err = %u", 1883 dp_stats_buf->ax_bsr_trigger_err); 1884 DP_PRINT_STATS("ax_mu_bar_trigger_err = %u", 1885 dp_stats_buf->ax_mu_bar_trigger_err); 1886 DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n", 1887 dp_stats_buf->ax_mu_rts_trigger_err); 1888 } 1889 1890 /* 1891 * dp_print_tx_sounding_stats_tlv: display htt_tx_sounding_stats_tlv 1892 * @tag_buf: buffer containing the tlv htt_tx_soundig_stats_tlv 1893 * 1894 * return:void 1895 */ 1896 static void dp_print_tx_sounding_stats_tlv(uint32_t *tag_buf) 1897 { 1898 htt_tx_sounding_stats_tlv *dp_stats_buf = 1899 (htt_tx_sounding_stats_tlv *)tag_buf; 1900 uint16_t i; 1901 uint16_t max_bw = HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; 1902 1903 switch (dp_stats_buf->tx_sounding_mode) { 1904 case HTT_TX_AC_SOUNDING_MODE: 1905 DP_PRINT_STATS("\n HTT_TX_AC_SOUNDING_STATS_TLV: "); 1906 DP_PRINT_STATS("ac_cbf_20 = IBF : %d, SU_SIFS : %d, " 1907 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1908 dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1], 1909 dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3], 1910 dp_stats_buf->cbf_20[4]); 1911 DP_PRINT_STATS("ac_cbf_40 = IBF : %d, SU_SIFS : %d, " 1912 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1913 dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1], 1914 dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3], 1915 dp_stats_buf->cbf_40[4]); 1916 DP_PRINT_STATS("ac_cbf_80 = IBF : %d, SU_SIFS : %d, " 1917 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1918 dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1], 1919 dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3], 1920 dp_stats_buf->cbf_80[4]); 1921 DP_PRINT_STATS("ac_cbf_160 = IBF : %d, SU_SIFS : %d, " 1922 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1923 dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1], 1924 dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3], 1925 dp_stats_buf->cbf_160[4]); 1926 for (i = 0; 1927 i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; 1928 i++) { 1929 DP_PRINT_STATS("Sounding User %d = 20MHz: %d, " 1930 "40MHz : %d, 80MHz: %d, 160MHz: %d", i, 1931 dp_stats_buf->sounding[(i * max_bw) + 0], 1932 dp_stats_buf->sounding[(i * max_bw) + 1], 1933 dp_stats_buf->sounding[(i * max_bw) + 2], 1934 dp_stats_buf->sounding[(i * max_bw) + 3]); 1935 } 1936 break; 1937 case HTT_TX_AX_SOUNDING_MODE: 1938 DP_PRINT_STATS("\n HTT_TX_AX_SOUNDING_STATS_TLV: "); 1939 DP_PRINT_STATS("ax_cbf_20 = IBF : %d, SU_SIFS : %d, " 1940 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1941 dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1], 1942 dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3], 1943 dp_stats_buf->cbf_20[4]); 1944 DP_PRINT_STATS("ax_cbf_40 = IBF : %d, SU_SIFS : %d, " 1945 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1946 dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1], 1947 dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3], 1948 dp_stats_buf->cbf_40[4]); 1949 DP_PRINT_STATS("ax_cbf_80 = IBF : %d, SU_SIFS : %d, " 1950 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1951 dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1], 1952 dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3], 1953 dp_stats_buf->cbf_80[4]); 1954 DP_PRINT_STATS("ax_cbf_160 = IBF : %d, SU_SIFS : %d, " 1955 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1956 dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1], 1957 dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3], 1958 dp_stats_buf->cbf_160[4]); 1959 for (i = 0; 1960 i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; 1961 i++) { 1962 DP_PRINT_STATS("Sounding User %d = 20MHz: %d, " 1963 "40MHz : %d, 80MHz: %d, 160MHz: %d", i, 1964 dp_stats_buf->sounding[(i * max_bw) + 0], 1965 dp_stats_buf->sounding[(i * max_bw) + 1], 1966 dp_stats_buf->sounding[(i * max_bw) + 2], 1967 dp_stats_buf->sounding[(i * max_bw) + 3]); 1968 } 1969 break; 1970 case HTT_TX_BE_SOUNDING_MODE: 1971 DP_PRINT_STATS("\n HTT_TX_BE_SOUNDING_STATS_TLV: "); 1972 DP_PRINT_STATS("be_cbf_20 = IBF : %d, SU_SIFS : %d, " 1973 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1974 dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1], 1975 dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3], 1976 dp_stats_buf->cbf_20[4]); 1977 DP_PRINT_STATS("be_cbf_40 = IBF : %d, SU_SIFS : %d, " 1978 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1979 dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1], 1980 dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3], 1981 dp_stats_buf->cbf_40[4]); 1982 DP_PRINT_STATS("be_cbf_80 = IBF : %d, SU_SIFS : %d, " 1983 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1984 dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1], 1985 dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3], 1986 dp_stats_buf->cbf_80[4]); 1987 DP_PRINT_STATS("be_cbf_160 = IBF : %d, SU_SIFS : %d, " 1988 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1989 dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1], 1990 dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3], 1991 dp_stats_buf->cbf_160[4]); 1992 DP_PRINT_STATS("be_cbf_320 = IBF : %d, SU_SIFS : %d, " 1993 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1994 dp_stats_buf->cbf_320[0], dp_stats_buf->cbf_320[1], 1995 dp_stats_buf->cbf_320[2], dp_stats_buf->cbf_320[3], 1996 dp_stats_buf->cbf_320[4]); 1997 for (i = 0; 1998 i < HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS; 1999 i++) { 2000 DP_PRINT_STATS("Sounding User %d = 20MHz: %d, " 2001 "40MHz : %d, 80MHz: %d, 160MHz: %d, " 2002 "320MHz: %d", i, 2003 dp_stats_buf->sounding[(i * max_bw) + 0], 2004 dp_stats_buf->sounding[(i * max_bw) + 1], 2005 dp_stats_buf->sounding[(i * max_bw) + 2], 2006 dp_stats_buf->sounding[(i * max_bw) + 3], 2007 dp_stats_buf->sounding_320[i]); 2008 } 2009 break; 2010 case HTT_TX_CMN_SOUNDING_MODE: 2011 DP_PRINT_STATS("\n CV UPLOAD HANDLER STATS:"); 2012 DP_PRINT_STATS("cv_nc_mismatch_err : %u", 2013 dp_stats_buf->cv_nc_mismatch_err); 2014 DP_PRINT_STATS("cv_fcs_err : %u", 2015 dp_stats_buf->cv_fcs_err); 2016 DP_PRINT_STATS("cv_frag_idx_mismatch : %u", 2017 dp_stats_buf->cv_frag_idx_mismatch); 2018 DP_PRINT_STATS("cv_invalid_peer_id : %u", 2019 dp_stats_buf->cv_invalid_peer_id); 2020 DP_PRINT_STATS("cv_no_txbf_setup : %u", 2021 dp_stats_buf->cv_no_txbf_setup); 2022 DP_PRINT_STATS("cv_expiry_in_update : %u", 2023 dp_stats_buf->cv_expiry_in_update); 2024 DP_PRINT_STATS("cv_pkt_bw_exceed : %u", 2025 dp_stats_buf->cv_pkt_bw_exceed); 2026 DP_PRINT_STATS("cv_dma_not_done_err : %u", 2027 dp_stats_buf->cv_dma_not_done_err); 2028 DP_PRINT_STATS("cv_update_failed : %u\n", 2029 dp_stats_buf->cv_update_failed); 2030 2031 DP_PRINT_STATS("\n CV QUERY STATS:"); 2032 DP_PRINT_STATS("cv_total_query : %u", 2033 dp_stats_buf->cv_total_query); 2034 DP_PRINT_STATS("cv_total_pattern_query : %u", 2035 dp_stats_buf->cv_total_pattern_query); 2036 DP_PRINT_STATS("cv_total_bw_query : %u", 2037 dp_stats_buf->cv_total_bw_query); 2038 DP_PRINT_STATS("cv_total_query : %u", 2039 dp_stats_buf->cv_total_query); 2040 DP_PRINT_STATS("cv_invalid_bw_coding : %u", 2041 dp_stats_buf->cv_invalid_bw_coding); 2042 DP_PRINT_STATS("cv_forced_sounding : %u", 2043 dp_stats_buf->cv_forced_sounding); 2044 DP_PRINT_STATS("cv_standalone_sounding : %u", 2045 dp_stats_buf->cv_standalone_sounding); 2046 DP_PRINT_STATS("cv_nc_mismatch : %u", 2047 dp_stats_buf->cv_nc_mismatch); 2048 DP_PRINT_STATS("cv_fb_type_mismatch : %u", 2049 dp_stats_buf->cv_fb_type_mismatch); 2050 DP_PRINT_STATS("cv_ofdma_bw_mismatch : %u", 2051 dp_stats_buf->cv_ofdma_bw_mismatch); 2052 DP_PRINT_STATS("cv_bw_mismatch : %u", 2053 dp_stats_buf->cv_bw_mismatch); 2054 DP_PRINT_STATS("cv_pattern_mismatch : %u", 2055 dp_stats_buf->cv_pattern_mismatch); 2056 DP_PRINT_STATS("cv_preamble_mismatch : %u", 2057 dp_stats_buf->cv_preamble_mismatch); 2058 DP_PRINT_STATS("cv_nr_mismatch : %u", 2059 dp_stats_buf->cv_nr_mismatch); 2060 DP_PRINT_STATS("cv_in_use_cnt_exceeded : %u", 2061 dp_stats_buf->cv_in_use_cnt_exceeded); 2062 DP_PRINT_STATS("cv_found : %u", 2063 dp_stats_buf->cv_found); 2064 DP_PRINT_STATS("cv_not found : %u", 2065 dp_stats_buf->cv_not_found); 2066 DP_PRINT_STATS("cv_ntbr_sounding : %u", 2067 dp_stats_buf->cv_ntbr_sounding); 2068 DP_PRINT_STATS("cv_found_upload_in_progress: %u", 2069 dp_stats_buf->cv_found_upload_in_progress); 2070 DP_PRINT_STATS("cv_expired_during_query : %u\n", 2071 dp_stats_buf->cv_expired_during_query); 2072 break; 2073 default: 2074 break; 2075 2076 } 2077 } 2078 2079 /* 2080 * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats 2081 * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv 2082 * 2083 * return:void 2084 */ 2085 static void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf) 2086 { 2087 uint8_t i; 2088 htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf = 2089 (htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf; 2090 2091 DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:"); 2092 DP_PRINT_STATS("mu_mimo_sch_posted = %u", 2093 dp_stats_buf->mu_mimo_sch_posted); 2094 DP_PRINT_STATS("mu_mimo_sch_failed = %u", 2095 dp_stats_buf->mu_mimo_sch_failed); 2096 DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n", 2097 dp_stats_buf->mu_mimo_ppdu_posted); 2098 2099 DP_PRINT_STATS("11ac MU_MIMO SCH STATS:"); 2100 2101 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) { 2102 DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i, 2103 dp_stats_buf->ac_mu_mimo_sch_nusers[i]); 2104 } 2105 2106 DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:"); 2107 2108 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) { 2109 DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i, 2110 dp_stats_buf->ax_mu_mimo_sch_nusers[i]); 2111 } 2112 2113 DP_PRINT_STATS("\n11ax OFDMA SCH STATS:"); 2114 2115 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) { 2116 DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i, 2117 dp_stats_buf->ax_ofdma_sch_nusers[i]); 2118 } 2119 } 2120 2121 /* 2122 * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display 2123 * htt_tx_pdev_mu_mimo_mpdu_stats_tlv 2124 * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv 2125 * 2126 * return:void 2127 */ 2128 static void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf) 2129 { 2130 htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf = 2131 (htt_tx_pdev_mpdu_stats_tlv *)tag_buf; 2132 2133 if (dp_stats_buf->tx_sched_mode == 2134 HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) { 2135 if (!dp_stats_buf->user_index) 2136 DP_PRINT_STATS( 2137 "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n"); 2138 2139 if (dp_stats_buf->user_index < 2140 HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) { 2141 DP_PRINT_STATS( 2142 "ac_mu_mimo_mpdus_queued_usr_%u = %u", 2143 dp_stats_buf->user_index, 2144 dp_stats_buf->mpdus_queued_usr); 2145 DP_PRINT_STATS( 2146 "ac_mu_mimo_mpdus_tried_usr_%u = %u", 2147 dp_stats_buf->user_index, 2148 dp_stats_buf->mpdus_tried_usr); 2149 DP_PRINT_STATS( 2150 "ac_mu_mimo_mpdus_failed_usr_%u = %u", 2151 dp_stats_buf->user_index, 2152 dp_stats_buf->mpdus_failed_usr); 2153 DP_PRINT_STATS( 2154 "ac_mu_mimo_mpdus_requeued_usr_%u = %u", 2155 dp_stats_buf->user_index, 2156 dp_stats_buf->mpdus_requeued_usr); 2157 DP_PRINT_STATS( 2158 "ac_mu_mimo_err_no_ba_usr_%u = %u", 2159 dp_stats_buf->user_index, 2160 dp_stats_buf->err_no_ba_usr); 2161 DP_PRINT_STATS( 2162 "ac_mu_mimo_mpdu_underrun_usr_%u = %u", 2163 dp_stats_buf->user_index, 2164 dp_stats_buf->mpdu_underrun_usr); 2165 DP_PRINT_STATS( 2166 "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n", 2167 dp_stats_buf->user_index, 2168 dp_stats_buf->ampdu_underrun_usr); 2169 } 2170 } 2171 2172 if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) { 2173 if (!dp_stats_buf->user_index) 2174 DP_PRINT_STATS( 2175 "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n"); 2176 2177 if (dp_stats_buf->user_index < 2178 HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) { 2179 DP_PRINT_STATS( 2180 "ax_mu_mimo_mpdus_queued_usr_%u = %u", 2181 dp_stats_buf->user_index, 2182 dp_stats_buf->mpdus_queued_usr); 2183 DP_PRINT_STATS( 2184 "ax_mu_mimo_mpdus_tried_usr_%u = %u", 2185 dp_stats_buf->user_index, 2186 dp_stats_buf->mpdus_tried_usr); 2187 DP_PRINT_STATS( 2188 "ax_mu_mimo_mpdus_failed_usr_%u = %u", 2189 dp_stats_buf->user_index, 2190 dp_stats_buf->mpdus_failed_usr); 2191 DP_PRINT_STATS( 2192 "ax_mu_mimo_mpdus_requeued_usr_%u = %u", 2193 dp_stats_buf->user_index, 2194 dp_stats_buf->mpdus_requeued_usr); 2195 DP_PRINT_STATS( 2196 "ax_mu_mimo_err_no_ba_usr_%u = %u", 2197 dp_stats_buf->user_index, 2198 dp_stats_buf->err_no_ba_usr); 2199 DP_PRINT_STATS( 2200 "ax_mu_mimo_mpdu_underrun_usr_%u = %u", 2201 dp_stats_buf->user_index, 2202 dp_stats_buf->mpdu_underrun_usr); 2203 DP_PRINT_STATS( 2204 "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n", 2205 dp_stats_buf->user_index, 2206 dp_stats_buf->ampdu_underrun_usr); 2207 } 2208 } 2209 2210 if (dp_stats_buf->tx_sched_mode == 2211 HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) { 2212 if (!dp_stats_buf->user_index) 2213 DP_PRINT_STATS( 2214 "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n"); 2215 2216 if (dp_stats_buf->user_index < 2217 HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) { 2218 DP_PRINT_STATS( 2219 "ax_mu_ofdma_mpdus_queued_usr_%u = %u", 2220 dp_stats_buf->user_index, 2221 dp_stats_buf->mpdus_queued_usr); 2222 DP_PRINT_STATS( 2223 "ax_mu_ofdma_mpdus_tried_usr_%u = %u", 2224 dp_stats_buf->user_index, 2225 dp_stats_buf->mpdus_tried_usr); 2226 DP_PRINT_STATS( 2227 "ax_mu_ofdma_mpdus_failed_usr_%u = %u", 2228 dp_stats_buf->user_index, 2229 dp_stats_buf->mpdus_failed_usr); 2230 DP_PRINT_STATS( 2231 "ax_mu_ofdma_mpdus_requeued_usr_%u = %u", 2232 dp_stats_buf->user_index, 2233 dp_stats_buf->mpdus_requeued_usr); 2234 DP_PRINT_STATS( 2235 "ax_mu_ofdma_err_no_ba_usr_%u = %u", 2236 dp_stats_buf->user_index, 2237 dp_stats_buf->err_no_ba_usr); 2238 DP_PRINT_STATS( 2239 "ax_mu_ofdma_mpdu_underrun_usr_%u = %u", 2240 dp_stats_buf->user_index, 2241 dp_stats_buf->mpdu_underrun_usr); 2242 DP_PRINT_STATS( 2243 "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n", 2244 dp_stats_buf->user_index, 2245 dp_stats_buf->ampdu_underrun_usr); 2246 } 2247 } 2248 } 2249 2250 /* 2251 * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v 2252 * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v 2253 * 2254 * return:void 2255 */ 2256 static void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf) 2257 { 2258 htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf = 2259 (htt_sched_txq_cmd_posted_tlv_v *)tag_buf; 2260 uint8_t i; 2261 uint16_t index = 0; 2262 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2263 char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN); 2264 2265 if (!sched_cmd_posted) { 2266 dp_stats_err("Output buffer not allocated"); 2267 return; 2268 } 2269 2270 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX); 2271 2272 DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:"); 2273 for (i = 0; i < tag_len; i++) { 2274 index += qdf_snprint(&sched_cmd_posted[index], 2275 DP_MAX_STRING_LEN - index, 2276 " %u:%u,", i, 2277 dp_stats_buf->sched_cmd_posted[i]); 2278 } 2279 DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted); 2280 qdf_mem_free(sched_cmd_posted); 2281 } 2282 2283 /* 2284 * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v 2285 * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v 2286 * 2287 * return:void 2288 */ 2289 static void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf) 2290 { 2291 htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf = 2292 (htt_sched_txq_cmd_reaped_tlv_v *)tag_buf; 2293 uint8_t i; 2294 uint16_t index = 0; 2295 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2296 char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN); 2297 2298 if (!sched_cmd_reaped) { 2299 dp_stats_err("Output buffer not allocated"); 2300 return; 2301 } 2302 2303 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX); 2304 2305 DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:"); 2306 for (i = 0; i < tag_len; i++) { 2307 index += qdf_snprint(&sched_cmd_reaped[index], 2308 DP_MAX_STRING_LEN - index, 2309 " %u:%u,", i, 2310 dp_stats_buf->sched_cmd_reaped[i]); 2311 } 2312 DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped); 2313 qdf_mem_free(sched_cmd_reaped); 2314 } 2315 2316 /* 2317 * dp_print_tx_pdev_stats_sched_per_txq_tlv: display 2318 * htt_tx_pdev_stats_sched_per_txq_tlv 2319 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv 2320 * 2321 * return:void 2322 */ 2323 static void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf) 2324 { 2325 htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf = 2326 (htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf; 2327 2328 DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:"); 2329 DP_PRINT_STATS("mac_id__txq_id__word = %u", 2330 dp_stats_buf->mac_id__txq_id__word); 2331 DP_PRINT_STATS("sched_policy = %u", 2332 dp_stats_buf->sched_policy); 2333 DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u", 2334 dp_stats_buf->last_sched_cmd_posted_timestamp); 2335 DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u", 2336 dp_stats_buf->last_sched_cmd_compl_timestamp); 2337 DP_PRINT_STATS("sched_2_tac_lwm_count = %u", 2338 dp_stats_buf->sched_2_tac_lwm_count); 2339 DP_PRINT_STATS("sched_2_tac_ring_full = %u", 2340 dp_stats_buf->sched_2_tac_ring_full); 2341 DP_PRINT_STATS("sched_cmd_post_failure = %u", 2342 dp_stats_buf->sched_cmd_post_failure); 2343 DP_PRINT_STATS("num_active_tids = %u", 2344 dp_stats_buf->num_active_tids); 2345 DP_PRINT_STATS("num_ps_schedules = %u", 2346 dp_stats_buf->num_ps_schedules); 2347 DP_PRINT_STATS("sched_cmds_pending = %u", 2348 dp_stats_buf->sched_cmds_pending); 2349 DP_PRINT_STATS("num_tid_register = %u", 2350 dp_stats_buf->num_tid_register); 2351 DP_PRINT_STATS("num_tid_unregister = %u", 2352 dp_stats_buf->num_tid_unregister); 2353 DP_PRINT_STATS("num_qstats_queried = %u", 2354 dp_stats_buf->num_qstats_queried); 2355 DP_PRINT_STATS("qstats_update_pending = %u", 2356 dp_stats_buf->qstats_update_pending); 2357 DP_PRINT_STATS("last_qstats_query_timestamp = %u", 2358 dp_stats_buf->last_qstats_query_timestamp); 2359 DP_PRINT_STATS("num_tqm_cmdq_full = %u", 2360 dp_stats_buf->num_tqm_cmdq_full); 2361 DP_PRINT_STATS("num_de_sched_algo_trigger = %u", 2362 dp_stats_buf->num_de_sched_algo_trigger); 2363 DP_PRINT_STATS("num_rt_sched_algo_trigger = %u", 2364 dp_stats_buf->num_rt_sched_algo_trigger); 2365 DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u", 2366 dp_stats_buf->num_tqm_sched_algo_trigger); 2367 DP_PRINT_STATS("notify_sched = %u\n", 2368 dp_stats_buf->notify_sched); 2369 } 2370 2371 /* 2372 * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv 2373 * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv 2374 * 2375 * return:void 2376 */ 2377 static void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf) 2378 { 2379 htt_stats_tx_sched_cmn_tlv *dp_stats_buf = 2380 (htt_stats_tx_sched_cmn_tlv *)tag_buf; 2381 2382 DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:"); 2383 DP_PRINT_STATS("mac_id__word = %u", 2384 dp_stats_buf->mac_id__word); 2385 DP_PRINT_STATS("current_timestamp = %u\n", 2386 dp_stats_buf->current_timestamp); 2387 } 2388 2389 /* 2390 * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v 2391 * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v 2392 * 2393 * return:void 2394 */ 2395 static void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf) 2396 { 2397 htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf = 2398 (htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf; 2399 uint8_t i; 2400 uint16_t index = 0; 2401 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2402 char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN); 2403 2404 if (!gen_mpdu_end_reason) { 2405 dp_stats_err("Output buffer not allocated"); 2406 return; 2407 } 2408 2409 tag_len = qdf_min(tag_len, 2410 (uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON); 2411 2412 DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:"); 2413 for (i = 0; i < tag_len; i++) { 2414 index += qdf_snprint(&gen_mpdu_end_reason[index], 2415 DP_MAX_STRING_LEN - index, 2416 " %u:%u,", i, 2417 dp_stats_buf->gen_mpdu_end_reason[i]); 2418 } 2419 DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason); 2420 qdf_mem_free(gen_mpdu_end_reason); 2421 } 2422 2423 /* 2424 * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv 2425 * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v 2426 * 2427 * return:void 2428 */ 2429 static void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf) 2430 { 2431 htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf = 2432 (htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf; 2433 uint8_t i; 2434 uint16_t index = 0; 2435 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2436 char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN); 2437 2438 if (!list_mpdu_end_reason) { 2439 dp_stats_err("Output buffer not allocated"); 2440 return; 2441 } 2442 2443 tag_len = qdf_min(tag_len, 2444 (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON); 2445 2446 DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:"); 2447 for (i = 0; i < tag_len; i++) { 2448 index += qdf_snprint(&list_mpdu_end_reason[index], 2449 DP_MAX_STRING_LEN - index, 2450 " %u:%u,", i, 2451 dp_stats_buf->list_mpdu_end_reason[i]); 2452 } 2453 DP_PRINT_STATS("list_mpdu_end_reason = %s\n", 2454 list_mpdu_end_reason); 2455 qdf_mem_free(list_mpdu_end_reason); 2456 } 2457 2458 /* 2459 * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v 2460 * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v 2461 * 2462 * return:void 2463 */ 2464 static void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf) 2465 { 2466 htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf = 2467 (htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf; 2468 uint8_t i; 2469 uint16_t index = 0; 2470 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2471 char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN); 2472 2473 if (!list_mpdu_cnt_hist) { 2474 dp_stats_err("Output buffer not allocated"); 2475 return; 2476 } 2477 2478 tag_len = qdf_min(tag_len, 2479 (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS); 2480 2481 DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:"); 2482 for (i = 0; i < tag_len; i++) { 2483 index += qdf_snprint(&list_mpdu_cnt_hist[index], 2484 DP_MAX_STRING_LEN - index, 2485 " %u:%u,", i, 2486 dp_stats_buf->list_mpdu_cnt_hist[i]); 2487 } 2488 DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist); 2489 qdf_mem_free(list_mpdu_cnt_hist); 2490 } 2491 2492 /* 2493 * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v 2494 * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v 2495 * 2496 * return:void 2497 */ 2498 static void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf) 2499 { 2500 htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf = 2501 (htt_tx_tqm_pdev_stats_tlv_v *)tag_buf; 2502 2503 DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:"); 2504 DP_PRINT_STATS("msdu_count = %u", 2505 dp_stats_buf->msdu_count); 2506 DP_PRINT_STATS("mpdu_count = %u", 2507 dp_stats_buf->mpdu_count); 2508 DP_PRINT_STATS("remove_msdu = %u", 2509 dp_stats_buf->remove_msdu); 2510 DP_PRINT_STATS("remove_mpdu = %u", 2511 dp_stats_buf->remove_mpdu); 2512 DP_PRINT_STATS("remove_msdu_ttl = %u", 2513 dp_stats_buf->remove_msdu_ttl); 2514 DP_PRINT_STATS("send_bar = %u", 2515 dp_stats_buf->send_bar); 2516 DP_PRINT_STATS("bar_sync = %u", 2517 dp_stats_buf->bar_sync); 2518 DP_PRINT_STATS("notify_mpdu = %u", 2519 dp_stats_buf->notify_mpdu); 2520 DP_PRINT_STATS("sync_cmd = %u", 2521 dp_stats_buf->sync_cmd); 2522 DP_PRINT_STATS("write_cmd = %u", 2523 dp_stats_buf->write_cmd); 2524 DP_PRINT_STATS("hwsch_trigger = %u", 2525 dp_stats_buf->hwsch_trigger); 2526 DP_PRINT_STATS("ack_tlv_proc = %u", 2527 dp_stats_buf->ack_tlv_proc); 2528 DP_PRINT_STATS("gen_mpdu_cmd = %u", 2529 dp_stats_buf->gen_mpdu_cmd); 2530 DP_PRINT_STATS("gen_list_cmd = %u", 2531 dp_stats_buf->gen_list_cmd); 2532 DP_PRINT_STATS("remove_mpdu_cmd = %u", 2533 dp_stats_buf->remove_mpdu_cmd); 2534 DP_PRINT_STATS("remove_mpdu_tried_cmd = %u", 2535 dp_stats_buf->remove_mpdu_tried_cmd); 2536 DP_PRINT_STATS("mpdu_queue_stats_cmd = %u", 2537 dp_stats_buf->mpdu_queue_stats_cmd); 2538 DP_PRINT_STATS("mpdu_head_info_cmd = %u", 2539 dp_stats_buf->mpdu_head_info_cmd); 2540 DP_PRINT_STATS("msdu_flow_stats_cmd = %u", 2541 dp_stats_buf->msdu_flow_stats_cmd); 2542 DP_PRINT_STATS("remove_msdu_cmd = %u", 2543 dp_stats_buf->remove_msdu_cmd); 2544 DP_PRINT_STATS("remove_msdu_ttl_cmd = %u", 2545 dp_stats_buf->remove_msdu_ttl_cmd); 2546 DP_PRINT_STATS("flush_cache_cmd = %u", 2547 dp_stats_buf->flush_cache_cmd); 2548 DP_PRINT_STATS("update_mpduq_cmd = %u", 2549 dp_stats_buf->update_mpduq_cmd); 2550 DP_PRINT_STATS("enqueue = %u", 2551 dp_stats_buf->enqueue); 2552 DP_PRINT_STATS("enqueue_notify = %u", 2553 dp_stats_buf->enqueue_notify); 2554 DP_PRINT_STATS("notify_mpdu_at_head = %u", 2555 dp_stats_buf->notify_mpdu_at_head); 2556 DP_PRINT_STATS("notify_mpdu_state_valid = %u\n", 2557 dp_stats_buf->notify_mpdu_state_valid); 2558 } 2559 2560 /* 2561 * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv 2562 * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv 2563 * 2564 * return:void 2565 */ 2566 static void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf) 2567 { 2568 htt_tx_tqm_cmn_stats_tlv *dp_stats_buf = 2569 (htt_tx_tqm_cmn_stats_tlv *)tag_buf; 2570 2571 DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:"); 2572 DP_PRINT_STATS("mac_id__word = %u", 2573 dp_stats_buf->mac_id__word); 2574 DP_PRINT_STATS("max_cmdq_id = %u", 2575 dp_stats_buf->max_cmdq_id); 2576 DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u", 2577 dp_stats_buf->list_mpdu_cnt_hist_intvl); 2578 DP_PRINT_STATS("add_msdu = %u", 2579 dp_stats_buf->add_msdu); 2580 DP_PRINT_STATS("q_empty = %u", 2581 dp_stats_buf->q_empty); 2582 DP_PRINT_STATS("q_not_empty = %u", 2583 dp_stats_buf->q_not_empty); 2584 DP_PRINT_STATS("drop_notification = %u", 2585 dp_stats_buf->drop_notification); 2586 DP_PRINT_STATS("desc_threshold = %u\n", 2587 dp_stats_buf->desc_threshold); 2588 } 2589 2590 /* 2591 * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv 2592 * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv 2593 * 2594 * return:void 2595 */ 2596 static void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf) 2597 { 2598 htt_tx_tqm_error_stats_tlv *dp_stats_buf = 2599 (htt_tx_tqm_error_stats_tlv *)tag_buf; 2600 2601 DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:"); 2602 DP_PRINT_STATS("q_empty_failure = %u", 2603 dp_stats_buf->q_empty_failure); 2604 DP_PRINT_STATS("q_not_empty_failure = %u", 2605 dp_stats_buf->q_not_empty_failure); 2606 DP_PRINT_STATS("add_msdu_failure = %u\n", 2607 dp_stats_buf->add_msdu_failure); 2608 } 2609 2610 /* 2611 * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv 2612 * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv 2613 * 2614 * return:void 2615 */ 2616 static void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf) 2617 { 2618 htt_tx_tqm_cmdq_status_tlv *dp_stats_buf = 2619 (htt_tx_tqm_cmdq_status_tlv *)tag_buf; 2620 2621 DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:"); 2622 DP_PRINT_STATS("mac_id__cmdq_id__word = %u", 2623 dp_stats_buf->mac_id__cmdq_id__word); 2624 DP_PRINT_STATS("sync_cmd = %u", 2625 dp_stats_buf->sync_cmd); 2626 DP_PRINT_STATS("write_cmd = %u", 2627 dp_stats_buf->write_cmd); 2628 DP_PRINT_STATS("gen_mpdu_cmd = %u", 2629 dp_stats_buf->gen_mpdu_cmd); 2630 DP_PRINT_STATS("mpdu_queue_stats_cmd = %u", 2631 dp_stats_buf->mpdu_queue_stats_cmd); 2632 DP_PRINT_STATS("mpdu_head_info_cmd = %u", 2633 dp_stats_buf->mpdu_head_info_cmd); 2634 DP_PRINT_STATS("msdu_flow_stats_cmd = %u", 2635 dp_stats_buf->msdu_flow_stats_cmd); 2636 DP_PRINT_STATS("remove_mpdu_cmd = %u", 2637 dp_stats_buf->remove_mpdu_cmd); 2638 DP_PRINT_STATS("remove_msdu_cmd = %u", 2639 dp_stats_buf->remove_msdu_cmd); 2640 DP_PRINT_STATS("flush_cache_cmd = %u", 2641 dp_stats_buf->flush_cache_cmd); 2642 DP_PRINT_STATS("update_mpduq_cmd = %u", 2643 dp_stats_buf->update_mpduq_cmd); 2644 DP_PRINT_STATS("update_msduq_cmd = %u\n", 2645 dp_stats_buf->update_msduq_cmd); 2646 } 2647 2648 /* 2649 * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats 2650 * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv 2651 * 2652 * return:void 2653 */ 2654 static void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf) 2655 { 2656 htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf = 2657 (htt_tx_de_eapol_packets_stats_tlv *)tag_buf; 2658 2659 DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:"); 2660 DP_PRINT_STATS("m1_packets = %u", 2661 dp_stats_buf->m1_packets); 2662 DP_PRINT_STATS("m2_packets = %u", 2663 dp_stats_buf->m2_packets); 2664 DP_PRINT_STATS("m3_packets = %u", 2665 dp_stats_buf->m3_packets); 2666 DP_PRINT_STATS("m4_packets = %u", 2667 dp_stats_buf->m4_packets); 2668 DP_PRINT_STATS("g1_packets = %u", 2669 dp_stats_buf->g1_packets); 2670 DP_PRINT_STATS("g2_packets = %u\n", 2671 dp_stats_buf->g2_packets); 2672 } 2673 2674 /* 2675 * dp_print_tx_de_classify_failed_stats_tlv: display 2676 * htt_tx_de_classify_failed_stats_tlv 2677 * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv 2678 * 2679 * return:void 2680 */ 2681 static void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf) 2682 { 2683 htt_tx_de_classify_failed_stats_tlv *dp_stats_buf = 2684 (htt_tx_de_classify_failed_stats_tlv *)tag_buf; 2685 2686 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:"); 2687 DP_PRINT_STATS("ap_bss_peer_not_found = %u", 2688 dp_stats_buf->ap_bss_peer_not_found); 2689 DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u", 2690 dp_stats_buf->ap_bcast_mcast_no_peer); 2691 DP_PRINT_STATS("sta_delete_in_progress = %u", 2692 dp_stats_buf->sta_delete_in_progress); 2693 DP_PRINT_STATS("ibss_no_bss_peer = %u", 2694 dp_stats_buf->ibss_no_bss_peer); 2695 DP_PRINT_STATS("invaild_vdev_type = %u", 2696 dp_stats_buf->invaild_vdev_type); 2697 DP_PRINT_STATS("invalid_ast_peer_entry = %u", 2698 dp_stats_buf->invalid_ast_peer_entry); 2699 DP_PRINT_STATS("peer_entry_invalid = %u", 2700 dp_stats_buf->peer_entry_invalid); 2701 DP_PRINT_STATS("ethertype_not_ip = %u", 2702 dp_stats_buf->ethertype_not_ip); 2703 DP_PRINT_STATS("eapol_lookup_failed = %u", 2704 dp_stats_buf->eapol_lookup_failed); 2705 DP_PRINT_STATS("qpeer_not_allow_data = %u", 2706 dp_stats_buf->qpeer_not_allow_data); 2707 DP_PRINT_STATS("fse_tid_override = %u\n", 2708 dp_stats_buf->fse_tid_override); 2709 } 2710 2711 /* 2712 * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv 2713 * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv 2714 * 2715 * return:void 2716 */ 2717 static void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf) 2718 { 2719 htt_tx_de_classify_stats_tlv *dp_stats_buf = 2720 (htt_tx_de_classify_stats_tlv *)tag_buf; 2721 2722 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:"); 2723 DP_PRINT_STATS("arp_packets = %u", 2724 dp_stats_buf->arp_packets); 2725 DP_PRINT_STATS("igmp_packets = %u", 2726 dp_stats_buf->igmp_packets); 2727 DP_PRINT_STATS("dhcp_packets = %u", 2728 dp_stats_buf->dhcp_packets); 2729 DP_PRINT_STATS("host_inspected = %u", 2730 dp_stats_buf->host_inspected); 2731 DP_PRINT_STATS("htt_included = %u", 2732 dp_stats_buf->htt_included); 2733 DP_PRINT_STATS("htt_valid_mcs = %u", 2734 dp_stats_buf->htt_valid_mcs); 2735 DP_PRINT_STATS("htt_valid_nss = %u", 2736 dp_stats_buf->htt_valid_nss); 2737 DP_PRINT_STATS("htt_valid_preamble_type = %u", 2738 dp_stats_buf->htt_valid_preamble_type); 2739 DP_PRINT_STATS("htt_valid_chainmask = %u", 2740 dp_stats_buf->htt_valid_chainmask); 2741 DP_PRINT_STATS("htt_valid_guard_interval = %u", 2742 dp_stats_buf->htt_valid_guard_interval); 2743 DP_PRINT_STATS("htt_valid_retries = %u", 2744 dp_stats_buf->htt_valid_retries); 2745 DP_PRINT_STATS("htt_valid_bw_info = %u", 2746 dp_stats_buf->htt_valid_bw_info); 2747 DP_PRINT_STATS("htt_valid_power = %u", 2748 dp_stats_buf->htt_valid_power); 2749 DP_PRINT_STATS("htt_valid_key_flags = %u", 2750 dp_stats_buf->htt_valid_key_flags); 2751 DP_PRINT_STATS("htt_valid_no_encryption = %u", 2752 dp_stats_buf->htt_valid_no_encryption); 2753 DP_PRINT_STATS("fse_entry_count = %u", 2754 dp_stats_buf->fse_entry_count); 2755 DP_PRINT_STATS("fse_priority_be = %u", 2756 dp_stats_buf->fse_priority_be); 2757 DP_PRINT_STATS("fse_priority_high = %u", 2758 dp_stats_buf->fse_priority_high); 2759 DP_PRINT_STATS("fse_priority_low = %u", 2760 dp_stats_buf->fse_priority_low); 2761 DP_PRINT_STATS("fse_traffic_ptrn_be = %u", 2762 dp_stats_buf->fse_traffic_ptrn_be); 2763 DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u", 2764 dp_stats_buf->fse_traffic_ptrn_over_sub); 2765 DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u", 2766 dp_stats_buf->fse_traffic_ptrn_bursty); 2767 DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u", 2768 dp_stats_buf->fse_traffic_ptrn_interactive); 2769 DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u", 2770 dp_stats_buf->fse_traffic_ptrn_periodic); 2771 DP_PRINT_STATS("fse_hwqueue_alloc = %u", 2772 dp_stats_buf->fse_hwqueue_alloc); 2773 DP_PRINT_STATS("fse_hwqueue_created = %u", 2774 dp_stats_buf->fse_hwqueue_created); 2775 DP_PRINT_STATS("fse_hwqueue_send_to_host = %u", 2776 dp_stats_buf->fse_hwqueue_send_to_host); 2777 DP_PRINT_STATS("mcast_entry = %u", 2778 dp_stats_buf->mcast_entry); 2779 DP_PRINT_STATS("bcast_entry = %u\n", 2780 dp_stats_buf->bcast_entry); 2781 } 2782 2783 /* 2784 * dp_print_tx_de_classify_status_stats_tlv: display 2785 * htt_tx_de_classify_status_stats_tlv 2786 * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv 2787 * 2788 * return:void 2789 */ 2790 static void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf) 2791 { 2792 htt_tx_de_classify_status_stats_tlv *dp_stats_buf = 2793 (htt_tx_de_classify_status_stats_tlv *)tag_buf; 2794 2795 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:"); 2796 DP_PRINT_STATS("eok = %u", 2797 dp_stats_buf->eok); 2798 DP_PRINT_STATS("classify_done = %u", 2799 dp_stats_buf->classify_done); 2800 DP_PRINT_STATS("lookup_failed = %u", 2801 dp_stats_buf->lookup_failed); 2802 DP_PRINT_STATS("send_host_dhcp = %u", 2803 dp_stats_buf->send_host_dhcp); 2804 DP_PRINT_STATS("send_host_mcast = %u", 2805 dp_stats_buf->send_host_mcast); 2806 DP_PRINT_STATS("send_host_unknown_dest = %u", 2807 dp_stats_buf->send_host_unknown_dest); 2808 DP_PRINT_STATS("send_host = %u", 2809 dp_stats_buf->send_host); 2810 DP_PRINT_STATS("status_invalid = %u\n", 2811 dp_stats_buf->status_invalid); 2812 } 2813 2814 /* 2815 * dp_print_tx_de_enqueue_packets_stats_tlv: display 2816 * htt_tx_de_enqueue_packets_stats_tlv 2817 * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv 2818 * 2819 * return:void 2820 */ 2821 static void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf) 2822 { 2823 htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf = 2824 (htt_tx_de_enqueue_packets_stats_tlv *)tag_buf; 2825 2826 DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:"); 2827 DP_PRINT_STATS("enqueued_pkts = %u", 2828 dp_stats_buf->enqueued_pkts); 2829 DP_PRINT_STATS("to_tqm = %u", 2830 dp_stats_buf->to_tqm); 2831 DP_PRINT_STATS("to_tqm_bypass = %u\n", 2832 dp_stats_buf->to_tqm_bypass); 2833 } 2834 2835 /* 2836 * dp_print_tx_de_enqueue_discard_stats_tlv: display 2837 * htt_tx_de_enqueue_discard_stats_tlv 2838 * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv 2839 * 2840 * return:void 2841 */ 2842 static void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf) 2843 { 2844 htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf = 2845 (htt_tx_de_enqueue_discard_stats_tlv *)tag_buf; 2846 2847 DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:"); 2848 DP_PRINT_STATS("discarded_pkts = %u", 2849 dp_stats_buf->discarded_pkts); 2850 DP_PRINT_STATS("local_frames = %u", 2851 dp_stats_buf->local_frames); 2852 DP_PRINT_STATS("is_ext_msdu = %u\n", 2853 dp_stats_buf->is_ext_msdu); 2854 } 2855 2856 /* 2857 * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv 2858 * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv 2859 * 2860 * return:void 2861 */ 2862 static void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf) 2863 { 2864 htt_tx_de_compl_stats_tlv *dp_stats_buf = 2865 (htt_tx_de_compl_stats_tlv *)tag_buf; 2866 2867 DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:"); 2868 DP_PRINT_STATS("tcl_dummy_frame = %u", 2869 dp_stats_buf->tcl_dummy_frame); 2870 DP_PRINT_STATS("tqm_dummy_frame = %u", 2871 dp_stats_buf->tqm_dummy_frame); 2872 DP_PRINT_STATS("tqm_notify_frame = %u", 2873 dp_stats_buf->tqm_notify_frame); 2874 DP_PRINT_STATS("fw2wbm_enq = %u", 2875 dp_stats_buf->fw2wbm_enq); 2876 DP_PRINT_STATS("tqm_bypass_frame = %u\n", 2877 dp_stats_buf->tqm_bypass_frame); 2878 } 2879 2880 /* 2881 * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv 2882 * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv 2883 * 2884 * return:void 2885 */ 2886 static void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf) 2887 { 2888 htt_tx_de_cmn_stats_tlv *dp_stats_buf = 2889 (htt_tx_de_cmn_stats_tlv *)tag_buf; 2890 2891 DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:"); 2892 DP_PRINT_STATS("mac_id__word = %u", 2893 dp_stats_buf->mac_id__word); 2894 DP_PRINT_STATS("tcl2fw_entry_count = %u", 2895 dp_stats_buf->tcl2fw_entry_count); 2896 DP_PRINT_STATS("not_to_fw = %u", 2897 dp_stats_buf->not_to_fw); 2898 DP_PRINT_STATS("invalid_pdev_vdev_peer = %u", 2899 dp_stats_buf->invalid_pdev_vdev_peer); 2900 DP_PRINT_STATS("tcl_res_invalid_addrx = %u", 2901 dp_stats_buf->tcl_res_invalid_addrx); 2902 DP_PRINT_STATS("wbm2fw_entry_count = %u", 2903 dp_stats_buf->wbm2fw_entry_count); 2904 DP_PRINT_STATS("invalid_pdev = %u\n", 2905 dp_stats_buf->invalid_pdev); 2906 } 2907 2908 /* 2909 * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv 2910 * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv 2911 * 2912 * return:void 2913 */ 2914 static void dp_print_ring_if_stats_tlv(uint32_t *tag_buf) 2915 { 2916 htt_ring_if_stats_tlv *dp_stats_buf = 2917 (htt_ring_if_stats_tlv *)tag_buf; 2918 uint8_t i; 2919 uint16_t index = 0; 2920 char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN); 2921 2922 if (!wm_hit_count) { 2923 dp_stats_err("Output buffer not allocated"); 2924 return; 2925 } 2926 2927 DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:"); 2928 DP_PRINT_STATS("base_addr = %u", 2929 dp_stats_buf->base_addr); 2930 DP_PRINT_STATS("elem_size = %u", 2931 dp_stats_buf->elem_size); 2932 DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u", 2933 dp_stats_buf->num_elems__prefetch_tail_idx); 2934 DP_PRINT_STATS("head_idx__tail_idx = %u", 2935 dp_stats_buf->head_idx__tail_idx); 2936 DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u", 2937 dp_stats_buf->shadow_head_idx__shadow_tail_idx); 2938 DP_PRINT_STATS("num_tail_incr = %u", 2939 dp_stats_buf->num_tail_incr); 2940 DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u", 2941 dp_stats_buf->lwm_thresh__hwm_thresh); 2942 DP_PRINT_STATS("overrun_hit_count = %u", 2943 dp_stats_buf->overrun_hit_count); 2944 DP_PRINT_STATS("underrun_hit_count = %u", 2945 dp_stats_buf->underrun_hit_count); 2946 DP_PRINT_STATS("prod_blockwait_count = %u", 2947 dp_stats_buf->prod_blockwait_count); 2948 DP_PRINT_STATS("cons_blockwait_count = %u", 2949 dp_stats_buf->cons_blockwait_count); 2950 2951 for (i = 0; i < DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) { 2952 index += qdf_snprint(&wm_hit_count[index], 2953 DP_MAX_STRING_LEN - index, 2954 " %u:%u,", i, 2955 dp_stats_buf->low_wm_hit_count[i]); 2956 } 2957 DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count); 2958 2959 qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN); 2960 2961 index = 0; 2962 for (i = 0; i < DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) { 2963 index += qdf_snprint(&wm_hit_count[index], 2964 DP_MAX_STRING_LEN - index, 2965 " %u:%u,", i, 2966 dp_stats_buf->high_wm_hit_count[i]); 2967 } 2968 DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count); 2969 } 2970 2971 /* 2972 * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv 2973 * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv 2974 * 2975 * return:void 2976 */ 2977 static void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf) 2978 { 2979 htt_ring_if_cmn_tlv *dp_stats_buf = 2980 (htt_ring_if_cmn_tlv *)tag_buf; 2981 2982 DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:"); 2983 DP_PRINT_STATS("mac_id__word = %u", 2984 dp_stats_buf->mac_id__word); 2985 DP_PRINT_STATS("num_records = %u\n", 2986 dp_stats_buf->num_records); 2987 } 2988 2989 /* 2990 * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v 2991 * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v 2992 * 2993 * return:void 2994 */ 2995 static void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf) 2996 { 2997 htt_sfm_client_user_tlv_v *dp_stats_buf = 2998 (htt_sfm_client_user_tlv_v *)tag_buf; 2999 uint8_t i; 3000 uint16_t index = 0; 3001 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 3002 char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN); 3003 3004 if (!dwords_used_by_user_n) { 3005 dp_stats_err("Output buffer not allocated"); 3006 return; 3007 } 3008 3009 DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:"); 3010 for (i = 0; i < tag_len; i++) { 3011 index += qdf_snprint(&dwords_used_by_user_n[index], 3012 DP_MAX_STRING_LEN - index, 3013 " %u:%u,", i, 3014 dp_stats_buf->dwords_used_by_user_n[i]); 3015 } 3016 DP_PRINT_STATS("dwords_used_by_user_n = %s\n", 3017 dwords_used_by_user_n); 3018 qdf_mem_free(dwords_used_by_user_n); 3019 } 3020 3021 /* 3022 * dp_print_sfm_client_tlv: display htt_sfm_client_tlv 3023 * @tag_buf: buffer containing the tlv htt_sfm_client_tlv 3024 * 3025 * return:void 3026 */ 3027 static void dp_print_sfm_client_tlv(uint32_t *tag_buf) 3028 { 3029 htt_sfm_client_tlv *dp_stats_buf = 3030 (htt_sfm_client_tlv *)tag_buf; 3031 3032 DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:"); 3033 DP_PRINT_STATS("client_id = %u", 3034 dp_stats_buf->client_id); 3035 DP_PRINT_STATS("buf_min = %u", 3036 dp_stats_buf->buf_min); 3037 DP_PRINT_STATS("buf_max = %u", 3038 dp_stats_buf->buf_max); 3039 DP_PRINT_STATS("buf_busy = %u", 3040 dp_stats_buf->buf_busy); 3041 DP_PRINT_STATS("buf_alloc = %u", 3042 dp_stats_buf->buf_alloc); 3043 DP_PRINT_STATS("buf_avail = %u", 3044 dp_stats_buf->buf_avail); 3045 DP_PRINT_STATS("num_users = %u\n", 3046 dp_stats_buf->num_users); 3047 } 3048 3049 /* 3050 * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv 3051 * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv 3052 * 3053 * return:void 3054 */ 3055 static void dp_print_sfm_cmn_tlv(uint32_t *tag_buf) 3056 { 3057 htt_sfm_cmn_tlv *dp_stats_buf = 3058 (htt_sfm_cmn_tlv *)tag_buf; 3059 3060 DP_PRINT_STATS("HTT_SFM_CMN_TLV:"); 3061 DP_PRINT_STATS("mac_id__word = %u", 3062 dp_stats_buf->mac_id__word); 3063 DP_PRINT_STATS("buf_total = %u", 3064 dp_stats_buf->buf_total); 3065 DP_PRINT_STATS("mem_empty = %u", 3066 dp_stats_buf->mem_empty); 3067 DP_PRINT_STATS("deallocate_bufs = %u", 3068 dp_stats_buf->deallocate_bufs); 3069 DP_PRINT_STATS("num_records = %u\n", 3070 dp_stats_buf->num_records); 3071 } 3072 3073 /* 3074 * dp_print_sring_stats_tlv: display htt_sring_stats_tlv 3075 * @tag_buf: buffer containing the tlv htt_sring_stats_tlv 3076 * 3077 * return:void 3078 */ 3079 static void dp_print_sring_stats_tlv(uint32_t *tag_buf) 3080 { 3081 htt_sring_stats_tlv *dp_stats_buf = 3082 (htt_sring_stats_tlv *)tag_buf; 3083 3084 DP_PRINT_STATS("HTT_SRING_STATS_TLV:"); 3085 DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u", 3086 dp_stats_buf->mac_id__ring_id__arena__ep); 3087 DP_PRINT_STATS("base_addr_lsb = %u", 3088 dp_stats_buf->base_addr_lsb); 3089 DP_PRINT_STATS("base_addr_msb = %u", 3090 dp_stats_buf->base_addr_msb); 3091 DP_PRINT_STATS("ring_size = %u", 3092 dp_stats_buf->ring_size); 3093 DP_PRINT_STATS("elem_size = %u", 3094 dp_stats_buf->elem_size); 3095 DP_PRINT_STATS("num_avail_words__num_valid_words = %u", 3096 dp_stats_buf->num_avail_words__num_valid_words); 3097 DP_PRINT_STATS("head_ptr__tail_ptr = %u", 3098 dp_stats_buf->head_ptr__tail_ptr); 3099 DP_PRINT_STATS("consumer_empty__producer_full = %u", 3100 dp_stats_buf->consumer_empty__producer_full); 3101 DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n", 3102 dp_stats_buf->prefetch_count__internal_tail_ptr); 3103 } 3104 3105 /* 3106 * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv 3107 * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv 3108 * 3109 * return:void 3110 */ 3111 static void dp_print_sring_cmn_tlv(uint32_t *tag_buf) 3112 { 3113 htt_sring_cmn_tlv *dp_stats_buf = 3114 (htt_sring_cmn_tlv *)tag_buf; 3115 3116 DP_PRINT_STATS("HTT_SRING_CMN_TLV:"); 3117 DP_PRINT_STATS("num_records = %u\n", 3118 dp_stats_buf->num_records); 3119 } 3120 3121 /* 3122 * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv 3123 * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv 3124 * 3125 * return:void 3126 */ 3127 static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf) 3128 { 3129 htt_tx_pdev_rate_stats_tlv *dp_stats_buf = 3130 (htt_tx_pdev_rate_stats_tlv *)tag_buf; 3131 uint8_t i, j; 3132 uint16_t index = 0; 3133 char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3134 char *tx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3135 char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3136 char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3137 char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3138 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 3139 3140 if (!str_buf) { 3141 dp_err("Output buffer not allocated"); 3142 return; 3143 } 3144 3145 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3146 tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3147 tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3148 if (!tx_gi[i] || !tx_gi_ext[i]) { 3149 dp_err("Unable to allocate buffer for tx_gi"); 3150 goto fail1; 3151 } 3152 ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3153 if (!ac_mu_mimo_tx_gi[i]) { 3154 dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi"); 3155 goto fail1; 3156 } 3157 ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3158 if (!ax_mu_mimo_tx_gi[i]) { 3159 dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi"); 3160 goto fail1; 3161 } 3162 ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3163 if (!ofdma_tx_gi[i]) { 3164 dp_err("Unable to allocate buffer for ofdma_tx_gi"); 3165 goto fail1; 3166 } 3167 } 3168 3169 DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:"); 3170 DP_PRINT_STATS("mac_id__word = %u", 3171 dp_stats_buf->mac_id__word); 3172 DP_PRINT_STATS("tx_ldpc = %u", 3173 dp_stats_buf->tx_ldpc); 3174 DP_PRINT_STATS("rts_cnt = %u", 3175 dp_stats_buf->rts_cnt); 3176 DP_PRINT_STATS("rts_success = %u", 3177 dp_stats_buf->rts_success); 3178 3179 DP_PRINT_STATS("ack_rssi = %u", 3180 dp_stats_buf->ack_rssi); 3181 3182 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3183 for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) { 3184 index += qdf_snprint(&str_buf[index], 3185 DP_MAX_STRING_LEN - index, 3186 " %u:%u,", i, dp_stats_buf->tx_mcs[i]); 3187 } 3188 3189 for (i = 0; i < DP_HTT_TX_MCS_EXT_LEN; i++) { 3190 index += qdf_snprint(&str_buf[index], 3191 DP_MAX_STRING_LEN - index, 3192 " %u:%u,", i + DP_HTT_TX_MCS_LEN, 3193 dp_stats_buf->tx_mcs_ext[i]); 3194 } 3195 3196 for (i = 0; i < DP_HTT_TX_MCS_EXT2_LEN; i++) { 3197 index += qdf_snprint(&str_buf[index], 3198 DP_MAX_STRING_LEN - index, 3199 " %u:%u,", i + DP_HTT_TX_MCS_LEN + 3200 DP_HTT_TX_MCS_EXT_LEN, 3201 dp_stats_buf->tx_mcs_ext_2[i]); 3202 } 3203 DP_PRINT_STATS("tx_mcs = %s ", str_buf); 3204 3205 index = 0; 3206 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3207 for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) { 3208 index += qdf_snprint(&str_buf[index], 3209 DP_MAX_STRING_LEN - index, 3210 " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]); 3211 } 3212 DP_PRINT_STATS("tx_su_mcs = %s ", str_buf); 3213 3214 index = 0; 3215 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3216 for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) { 3217 index += qdf_snprint(&str_buf[index], 3218 DP_MAX_STRING_LEN - index, 3219 " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]); 3220 } 3221 DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf); 3222 3223 index = 0; 3224 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3225 for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) { 3226 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 3227 index += qdf_snprint(&str_buf[index], 3228 DP_MAX_STRING_LEN - index, 3229 " %u:%u,", (i + 1), 3230 dp_stats_buf->tx_nss[i]); 3231 } 3232 DP_PRINT_STATS("tx_nss = %s ", str_buf); 3233 3234 index = 0; 3235 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3236 for (i = 0; i < DP_HTT_TX_BW_LEN; i++) { 3237 index += qdf_snprint(&str_buf[index], 3238 DP_MAX_STRING_LEN - index, 3239 " %u:%u,", i, dp_stats_buf->tx_bw[i]); 3240 } 3241 DP_PRINT_STATS("tx_bw = %s ", str_buf); 3242 3243 DP_PRINT_STATS("tx_bw_320mhz = %u ", dp_stats_buf->tx_bw_320mhz); 3244 3245 index = 0; 3246 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3247 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3248 index += qdf_snprint(&str_buf[index], 3249 DP_MAX_STRING_LEN - index, 3250 " %u:%u,", i, dp_stats_buf->tx_stbc[i]); 3251 } 3252 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 3253 index += qdf_snprint(&str_buf[index], 3254 DP_MAX_STRING_LEN - index, 3255 " %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 3256 dp_stats_buf->tx_stbc_ext[i]); 3257 } 3258 DP_PRINT_STATS("tx_stbc = %s ", str_buf); 3259 3260 index = 0; 3261 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3262 for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) { 3263 index += qdf_snprint(&str_buf[index], 3264 DP_MAX_STRING_LEN - index, 3265 " %u:%u,", i, dp_stats_buf->tx_pream[i]); 3266 } 3267 DP_PRINT_STATS("tx_pream = %s ", str_buf); 3268 3269 for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) { 3270 index = 0; 3271 qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN); 3272 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3273 index += qdf_snprint(&tx_gi[j][index], 3274 DP_MAX_STRING_LEN - index, 3275 " %u:%u,", i, 3276 dp_stats_buf->tx_gi[j][i]); 3277 } 3278 DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]); 3279 } 3280 3281 for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) { 3282 index = 0; 3283 qdf_mem_zero(tx_gi_ext[j], DP_MAX_STRING_LEN); 3284 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 3285 index += qdf_snprint(&tx_gi_ext[j][index], 3286 DP_MAX_STRING_LEN - index, 3287 " %u:%u,", i, 3288 dp_stats_buf->tx_gi_ext[j][i]); 3289 } 3290 DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]); 3291 } 3292 3293 index = 0; 3294 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3295 for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) { 3296 index += qdf_snprint(&str_buf[index], 3297 DP_MAX_STRING_LEN - index, 3298 " %u:%u,", i, dp_stats_buf->tx_dcm[i]); 3299 } 3300 DP_PRINT_STATS("tx_dcm = %s", str_buf); 3301 3302 index = 0; 3303 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3304 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) { 3305 index += qdf_snprint(&str_buf[index], 3306 DP_MAX_STRING_LEN - index, 3307 " %u:%u,", i, 3308 dp_stats_buf->tx_su_punctured_mode[i]); 3309 } 3310 DP_PRINT_STATS("tx_su_punctured_mode = %s\n", str_buf); 3311 3312 DP_PRINT_STATS("rts_success = %u", 3313 dp_stats_buf->rts_success); 3314 DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u", 3315 dp_stats_buf->ac_mu_mimo_tx_ldpc); 3316 DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u", 3317 dp_stats_buf->ax_mu_mimo_tx_ldpc); 3318 DP_PRINT_STATS("ofdma_tx_ldpc = %u", 3319 dp_stats_buf->ofdma_tx_ldpc); 3320 3321 index = 0; 3322 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3323 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) { 3324 index += qdf_snprint(&str_buf[index], 3325 DP_MAX_STRING_LEN - index, 3326 " %u:%u,", 3327 i, dp_stats_buf->tx_legacy_cck_rate[i]); 3328 } 3329 DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf); 3330 3331 index = 0; 3332 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3333 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) { 3334 index += qdf_snprint(&str_buf[index], 3335 DP_MAX_STRING_LEN - index, 3336 " %u:%u,", i, 3337 dp_stats_buf->tx_legacy_ofdm_rate[i]); 3338 } 3339 DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf); 3340 3341 index = 0; 3342 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3343 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LTF; i++) { 3344 index += qdf_snprint(&str_buf[index], 3345 DP_MAX_STRING_LEN - index, 3346 " %u:%u,", 3347 i, dp_stats_buf->tx_he_ltf[i]); 3348 } 3349 DP_PRINT_STATS("tx_he_ltf = %s ", str_buf); 3350 3351 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3352 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3353 index += qdf_snprint(&str_buf[index], 3354 DP_MAX_STRING_LEN - index, 3355 " %u:%u,", 3356 i, dp_stats_buf->ofdma_tx_mcs[i]); 3357 } 3358 DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf); 3359 3360 index = 0; 3361 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3362 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3363 index += qdf_snprint(&str_buf[index], 3364 DP_MAX_STRING_LEN - index, 3365 " %u:%u,", 3366 i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]); 3367 } 3368 DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf); 3369 3370 index = 0; 3371 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3372 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3373 index += qdf_snprint(&str_buf[index], 3374 DP_MAX_STRING_LEN - index, 3375 " %u:%u,", 3376 i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]); 3377 } 3378 DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf); 3379 3380 index = 0; 3381 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3382 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3383 index += qdf_snprint(&str_buf[index], 3384 DP_MAX_STRING_LEN - index, 3385 " %u:%u,", 3386 i, dp_stats_buf->ofdma_tx_mcs[i]); 3387 } 3388 DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf); 3389 3390 index = 0; 3391 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3392 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3393 index += qdf_snprint(&str_buf[index], 3394 DP_MAX_STRING_LEN - index, 3395 " %u:%u,", 3396 i, dp_stats_buf->ac_mu_mimo_tx_nss[i]); 3397 } 3398 DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf); 3399 3400 index = 0; 3401 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3402 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3403 index += qdf_snprint(&str_buf[index], 3404 DP_MAX_STRING_LEN - index, 3405 " %u:%u,", 3406 i, dp_stats_buf->ax_mu_mimo_tx_nss[i]); 3407 } 3408 DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf); 3409 3410 index = 0; 3411 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3412 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3413 index += qdf_snprint(&str_buf[index], 3414 DP_MAX_STRING_LEN - index, 3415 " %u:%u,", 3416 i, dp_stats_buf->ofdma_tx_nss[i]); 3417 } 3418 DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf); 3419 3420 index = 0; 3421 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3422 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3423 index += qdf_snprint(&str_buf[index], 3424 DP_MAX_STRING_LEN - index, 3425 " %u:%u,", 3426 i, dp_stats_buf->ac_mu_mimo_tx_bw[i]); 3427 } 3428 DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf); 3429 3430 index = 0; 3431 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3432 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3433 index += qdf_snprint(&str_buf[index], 3434 DP_MAX_STRING_LEN - index, 3435 " %u:%u,", 3436 i, dp_stats_buf->ax_mu_mimo_tx_bw[i]); 3437 } 3438 DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf); 3439 3440 index = 0; 3441 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3442 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3443 index += qdf_snprint(&str_buf[index], 3444 DP_MAX_STRING_LEN - index, 3445 " %u:%u,", 3446 i, dp_stats_buf->ofdma_tx_bw[i]); 3447 } 3448 3449 DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf); 3450 3451 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3452 index = 0; 3453 qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN); 3454 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3455 index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index], 3456 DP_MAX_STRING_LEN - index, 3457 " %u:%u,", i, 3458 dp_stats_buf-> 3459 ac_mu_mimo_tx_gi[j][i]); 3460 } 3461 DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ", 3462 j, ac_mu_mimo_tx_gi[j]); 3463 } 3464 3465 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3466 index = 0; 3467 qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN); 3468 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3469 index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index], 3470 DP_MAX_STRING_LEN - index, 3471 " %u:%u,", i, 3472 dp_stats_buf->ax_mu_mimo_tx_gi[j][i]); 3473 } 3474 DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ", 3475 j, ax_mu_mimo_tx_gi[j]); 3476 } 3477 3478 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3479 index = 0; 3480 qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN); 3481 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3482 index += qdf_snprint(&ofdma_tx_gi[j][index], 3483 DP_MAX_STRING_LEN - index, 3484 " %u:%u,", i, 3485 dp_stats_buf->ofdma_tx_gi[j][i]); 3486 } 3487 DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ", 3488 j, ofdma_tx_gi[j]); 3489 } 3490 3491 fail1: 3492 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3493 if (tx_gi[i]) 3494 qdf_mem_free(tx_gi[i]); 3495 if (tx_gi_ext[i]) 3496 qdf_mem_free(tx_gi_ext[i]); 3497 if (ac_mu_mimo_tx_gi[i]) 3498 qdf_mem_free(ac_mu_mimo_tx_gi[i]); 3499 if (ax_mu_mimo_tx_gi[i]) 3500 qdf_mem_free(ax_mu_mimo_tx_gi[i]); 3501 if (ofdma_tx_gi[i]) 3502 qdf_mem_free(ofdma_tx_gi[i]); 3503 } 3504 qdf_mem_free(str_buf); 3505 } 3506 3507 /* 3508 * dp_print_rx_pdev_rate_ext_stats_tlv: display htt_rx_pdev_rate_ext_stats_tlv 3509 * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_ext_stats_tlv 3510 * 3511 * return:void 3512 */ 3513 static void dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev *pdev, 3514 uint32_t *tag_buf) 3515 { 3516 htt_rx_pdev_rate_ext_stats_tlv *dp_stats_buf = 3517 (htt_rx_pdev_rate_ext_stats_tlv *)tag_buf; 3518 uint8_t i, j; 3519 uint16_t index = 0; 3520 char *rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3521 char *ul_ofdma_rx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3522 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 3523 3524 if (!str_buf) { 3525 dp_err("Output buffer not allocated"); 3526 return; 3527 } 3528 3529 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3530 rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3531 if (!rx_gi_ext[i]) { 3532 dp_err("Unable to allocate buffer for rx_gi_ext"); 3533 goto fail1; 3534 } 3535 3536 ul_ofdma_rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3537 if (!ul_ofdma_rx_gi_ext[i]) { 3538 dp_err("Unable to allocate buffer for ul_ofdma_rx_gi_ext"); 3539 goto fail1; 3540 } 3541 } 3542 3543 index = 0; 3544 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3545 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3546 index += qdf_snprint(&str_buf[index], 3547 DP_MAX_STRING_LEN - index, 3548 " %u:%u,", i, dp_stats_buf->rx_mcs_ext[i]); 3549 } 3550 3551 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT2; i++) { 3552 index += qdf_snprint(&str_buf[index], 3553 DP_MAX_STRING_LEN - index, 3554 " %u:%u,", i + DP_HTT_RX_PDEV_MCS_LEN_EXT, 3555 dp_stats_buf->rx_mcs_ext_2[i]); 3556 } 3557 DP_PRINT_STATS("rx_mcs_ext = %s ", str_buf); 3558 3559 index = 0; 3560 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3561 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3562 index += qdf_snprint(&str_buf[index], 3563 DP_MAX_STRING_LEN - index, 3564 " %u:%u,", i, dp_stats_buf->rx_stbc_ext[i]); 3565 } 3566 DP_PRINT_STATS("rx_stbc_ext = %s ", str_buf); 3567 3568 for (j = 0; j < DP_HTT_RX_GI_LEN; j++) { 3569 index = 0; 3570 qdf_mem_zero(rx_gi_ext[j], DP_MAX_STRING_LEN); 3571 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3572 index += qdf_snprint(&rx_gi_ext[j][index], 3573 DP_MAX_STRING_LEN - index, 3574 " %u:%u,", i, 3575 dp_stats_buf->rx_gi_ext[j][i]); 3576 } 3577 DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]); 3578 } 3579 3580 index = 0; 3581 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3582 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3583 index += qdf_snprint(&str_buf[index], 3584 DP_MAX_STRING_LEN - index, 3585 " %u:%u,", 3586 i, dp_stats_buf->ul_ofdma_rx_mcs_ext[i]); 3587 } 3588 DP_PRINT_STATS("ul_ofdma_rx_mcs_ext = %s", str_buf); 3589 3590 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3591 index = 0; 3592 qdf_mem_zero(ul_ofdma_rx_gi_ext[j], DP_MAX_STRING_LEN); 3593 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3594 index += qdf_snprint(&ul_ofdma_rx_gi_ext[j][index], 3595 DP_MAX_STRING_LEN - index, 3596 " %u:%u,", i, 3597 dp_stats_buf-> 3598 ul_ofdma_rx_gi_ext[j][i]); 3599 } 3600 DP_PRINT_STATS("ul_ofdma_rx_gi_ext[%u] = %s ", 3601 j, ul_ofdma_rx_gi_ext[j]); 3602 } 3603 3604 index = 0; 3605 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3606 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3607 index += qdf_snprint(&str_buf[index], 3608 DP_MAX_STRING_LEN - index, 3609 " %u:%u,", i, 3610 dp_stats_buf->rx_11ax_su_txbf_mcs_ext[i]); 3611 } 3612 DP_PRINT_STATS("rx_11ax_su_txbf_mcs_ext = %s ", str_buf); 3613 3614 index = 0; 3615 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3616 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3617 index += qdf_snprint(&str_buf[index], 3618 DP_MAX_STRING_LEN - index, 3619 " %u:%u,", i, 3620 dp_stats_buf->rx_11ax_mu_txbf_mcs_ext[i]); 3621 } 3622 DP_PRINT_STATS("rx_11ax_mu_txbf_mcs_ext = %s ", str_buf); 3623 3624 index = 0; 3625 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3626 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3627 index += qdf_snprint(&str_buf[index], 3628 DP_MAX_STRING_LEN - index, 3629 " %u:%u,", i, 3630 dp_stats_buf->rx_11ax_dl_ofdma_mcs_ext[i]); 3631 } 3632 DP_PRINT_STATS("rx_11ax_dl_ofdma_mcs_ext = %s ", str_buf); 3633 3634 index = 0; 3635 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3636 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS; i++) { 3637 index += qdf_snprint(&str_buf[index], 3638 DP_MAX_STRING_LEN - index, 3639 " %u:%u,", i, 3640 dp_stats_buf->rx_bw_ext[i]); 3641 } 3642 DP_PRINT_STATS("rx_bw_ext = %s ", str_buf); 3643 3644 index = 0; 3645 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3646 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) { 3647 index += qdf_snprint(&str_buf[index], 3648 DP_MAX_STRING_LEN - index, 3649 " %u:%u,", i, 3650 dp_stats_buf->rx_su_punctured_mode[i]); 3651 } 3652 DP_PRINT_STATS("rx_su_punctured_mode = %s ", str_buf); 3653 3654 fail1: 3655 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3656 if (ul_ofdma_rx_gi_ext[i]) 3657 qdf_mem_free(ul_ofdma_rx_gi_ext[i]); 3658 if (rx_gi_ext[i]) 3659 qdf_mem_free(rx_gi_ext[i]); 3660 } 3661 3662 qdf_mem_free(str_buf); 3663 } 3664 3665 /* 3666 * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv 3667 * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv 3668 * 3669 * return:void 3670 */ 3671 static void dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev *pdev, 3672 uint32_t *tag_buf) 3673 { 3674 htt_rx_pdev_rate_stats_tlv *dp_stats_buf = 3675 (htt_rx_pdev_rate_stats_tlv *)tag_buf; 3676 uint8_t i, j; 3677 uint16_t index = 0; 3678 char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN]; 3679 char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS]; 3680 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 3681 char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 3682 3683 if (!str_buf) { 3684 dp_err("Output buffer not allocated"); 3685 return; 3686 } 3687 3688 for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) { 3689 rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3690 if (!rssi_chain[i]) { 3691 dp_err("Unable to allocate buffer for rssi_chain"); 3692 goto fail1; 3693 } 3694 } 3695 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3696 rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3697 if (!rx_gi[i]) { 3698 dp_err("Unable to allocate buffer for rx_gi"); 3699 goto fail2; 3700 } 3701 } 3702 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3703 ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3704 if (!ul_ofdma_rx_gi[i]) { 3705 dp_err("Unable to allocate buffer for ul_ofdma_rx_gi"); 3706 goto fail3; 3707 } 3708 } 3709 3710 DP_PRINT_STATS("ul_ofdma_data_rx_ppdu = %d", 3711 pdev->stats.ul_ofdma.data_rx_ppdu); 3712 3713 for (i = 0; i < OFDMA_NUM_USERS; i++) { 3714 DP_PRINT_STATS("ul_ofdma data %d user = %d", 3715 i, pdev->stats.ul_ofdma.data_users[i]); 3716 } 3717 3718 index = 0; 3719 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3720 for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) { 3721 index += qdf_snprint(&str_buf[index], 3722 DP_MAX_STRING_LEN - index, 3723 " %u:%u,", i, 3724 pdev->stats.ul_ofdma.data_rx_ru_size[i]); 3725 } 3726 DP_PRINT_STATS("ul_ofdma_data_rx_ru_size= %s", str_buf); 3727 3728 index = 0; 3729 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3730 for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) { 3731 index += qdf_snprint(&str_buf[index], 3732 DP_MAX_STRING_LEN - index, 3733 " %u:%u,", i, 3734 pdev->stats.ul_ofdma.nondata_rx_ru_size[i]); 3735 } 3736 DP_PRINT_STATS("ul_ofdma_nondata_rx_ru_size= %s", str_buf); 3737 3738 DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:"); 3739 DP_PRINT_STATS("mac_id__word = %u", 3740 dp_stats_buf->mac_id__word); 3741 DP_PRINT_STATS("nsts = %u", 3742 dp_stats_buf->nsts); 3743 DP_PRINT_STATS("rx_ldpc = %u", 3744 dp_stats_buf->rx_ldpc); 3745 DP_PRINT_STATS("rts_cnt = %u", 3746 dp_stats_buf->rts_cnt); 3747 DP_PRINT_STATS("rssi_mgmt = %u", 3748 dp_stats_buf->rssi_mgmt); 3749 DP_PRINT_STATS("rssi_data = %u", 3750 dp_stats_buf->rssi_data); 3751 DP_PRINT_STATS("rssi_comb = %u", 3752 dp_stats_buf->rssi_comb); 3753 DP_PRINT_STATS("rssi_in_dbm = %d", 3754 dp_stats_buf->rssi_in_dbm); 3755 DP_PRINT_STATS("rx_11ax_su_ext = %u", 3756 dp_stats_buf->rx_11ax_su_ext); 3757 DP_PRINT_STATS("rx_11ac_mumimo = %u", 3758 dp_stats_buf->rx_11ac_mumimo); 3759 DP_PRINT_STATS("rx_11ax_mumimo = %u", 3760 dp_stats_buf->rx_11ax_mumimo); 3761 DP_PRINT_STATS("rx_11ax_ofdma = %u", 3762 dp_stats_buf->rx_11ax_ofdma); 3763 DP_PRINT_STATS("txbf = %u", 3764 dp_stats_buf->txbf); 3765 DP_PRINT_STATS("rx_su_ndpa = %u", 3766 dp_stats_buf->rx_su_ndpa); 3767 DP_PRINT_STATS("rx_br_poll = %u", 3768 dp_stats_buf->rx_br_poll); 3769 3770 index = 0; 3771 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3772 for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) { 3773 index += qdf_snprint(&str_buf[index], 3774 DP_MAX_STRING_LEN - index, 3775 " %u:%u,", i, dp_stats_buf->rx_mcs[i]); 3776 } 3777 DP_PRINT_STATS("rx_mcs = %s ", str_buf); 3778 3779 index = 0; 3780 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3781 for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) { 3782 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 3783 index += qdf_snprint(&str_buf[index], 3784 DP_MAX_STRING_LEN - index, 3785 " %u:%u,", (i + 1), 3786 dp_stats_buf->rx_nss[i]); 3787 } 3788 DP_PRINT_STATS("rx_nss = %s ", str_buf); 3789 3790 index = 0; 3791 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3792 for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) { 3793 index += qdf_snprint(&str_buf[index], 3794 DP_MAX_STRING_LEN - index, 3795 " %u:%u,", i, dp_stats_buf->rx_dcm[i]); 3796 } 3797 DP_PRINT_STATS("rx_dcm = %s ", str_buf); 3798 3799 index = 0; 3800 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3801 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3802 index += qdf_snprint(&str_buf[index], 3803 DP_MAX_STRING_LEN - index, 3804 " %u:%u,", i, dp_stats_buf->rx_stbc[i]); 3805 } 3806 DP_PRINT_STATS("rx_stbc = %s ", str_buf); 3807 3808 index = 0; 3809 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3810 for (i = 0; i < DP_HTT_RX_BW_LEN; i++) { 3811 index += qdf_snprint(&str_buf[index], 3812 DP_MAX_STRING_LEN - index, 3813 " %u:%u,", i, dp_stats_buf->rx_bw[i]); 3814 } 3815 DP_PRINT_STATS("rx_bw = %s ", str_buf); 3816 3817 for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) { 3818 index = 0; 3819 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3820 index += qdf_snprint(&rssi_chain[j][index], 3821 DP_MAX_STRING_LEN - index, 3822 " %u:%u,", i, 3823 dp_stats_buf->rssi_chain[j][i]); 3824 } 3825 DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]); 3826 } 3827 3828 for (j = 0; j < DP_HTT_RX_GI_LEN; j++) { 3829 index = 0; 3830 qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN); 3831 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3832 index += qdf_snprint(&rx_gi[j][index], 3833 DP_MAX_STRING_LEN - index, 3834 " %u:%u,", i, 3835 dp_stats_buf->rx_gi[j][i]); 3836 } 3837 DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]); 3838 } 3839 3840 index = 0; 3841 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3842 for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) { 3843 index += qdf_snprint(&str_buf[index], 3844 DP_MAX_STRING_LEN - index, 3845 " %u:%u,", 3846 i, 3847 dp_stats_buf->rx_pream[i]); 3848 } 3849 DP_PRINT_STATS("rx_pream = %s", str_buf); 3850 3851 index = 0; 3852 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3853 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) { 3854 index += qdf_snprint(&str_buf[index], 3855 DP_MAX_STRING_LEN - index, 3856 " %u:%u,", 3857 i, 3858 dp_stats_buf->rx_legacy_cck_rate[i]); 3859 } 3860 DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf); 3861 3862 index = 0; 3863 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3864 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) { 3865 index += qdf_snprint(&str_buf[index], 3866 DP_MAX_STRING_LEN - index, 3867 " %u:%u,", 3868 i, 3869 dp_stats_buf->rx_legacy_ofdm_rate[i]); 3870 } 3871 DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf); 3872 3873 index = 0; 3874 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3875 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3876 index += qdf_snprint(&str_buf[index], 3877 DP_MAX_STRING_LEN - index, 3878 " %u:%u,", 3879 i, dp_stats_buf->ul_ofdma_rx_mcs[i]); 3880 } 3881 DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf); 3882 3883 DP_PRINT_STATS("rx_11ax_ul_ofdma = %u", 3884 dp_stats_buf->rx_11ax_ul_ofdma); 3885 3886 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3887 index = 0; 3888 qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN); 3889 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3890 index += qdf_snprint(&ul_ofdma_rx_gi[j][index], 3891 DP_MAX_STRING_LEN - index, 3892 " %u:%u,", i, 3893 dp_stats_buf-> 3894 ul_ofdma_rx_gi[j][i]); 3895 } 3896 DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ", 3897 j, ul_ofdma_rx_gi[j]); 3898 } 3899 3900 index = 0; 3901 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3902 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3903 index += qdf_snprint(&str_buf[index], 3904 DP_MAX_STRING_LEN - index, 3905 " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]); 3906 } 3907 DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf); 3908 3909 index = 0; 3910 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3911 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3912 index += qdf_snprint(&str_buf[index], 3913 DP_MAX_STRING_LEN - index, 3914 " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]); 3915 } 3916 DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf); 3917 DP_PRINT_STATS("ul_ofdma_rx_stbc = %u", 3918 dp_stats_buf->ul_ofdma_rx_stbc); 3919 DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u", 3920 dp_stats_buf->ul_ofdma_rx_ldpc); 3921 3922 index = 0; 3923 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3924 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3925 index += qdf_snprint(&str_buf[index], 3926 DP_MAX_STRING_LEN - index, 3927 " %u:%u,", i, 3928 dp_stats_buf->rx_ulofdma_non_data_ppdu[i]); 3929 } 3930 DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf); 3931 3932 index = 0; 3933 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3934 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3935 index += qdf_snprint(&str_buf[index], 3936 DP_MAX_STRING_LEN - index, 3937 " %u:%u,", 3938 i, dp_stats_buf->rx_ulofdma_data_ppdu[i]); 3939 } 3940 DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf); 3941 3942 index = 0; 3943 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3944 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3945 index += qdf_snprint(&str_buf[index], 3946 DP_MAX_STRING_LEN - index, 3947 " %u:%u,", 3948 i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]); 3949 } 3950 DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf); 3951 3952 index = 0; 3953 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3954 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3955 index += qdf_snprint(&str_buf[index], 3956 DP_MAX_STRING_LEN - index, 3957 " %u:%u,", 3958 i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]); 3959 } 3960 DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf); 3961 3962 index = 0; 3963 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3964 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3965 index += qdf_snprint(&str_buf[index], 3966 DP_MAX_STRING_LEN - index, 3967 " %u:%u,", 3968 i, dp_stats_buf->rx_11ax_su_txbf_mcs[i]); 3969 } 3970 DP_PRINT_STATS("rx_11ax_su_txbf_mcs = %s", str_buf); 3971 3972 index = 0; 3973 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3974 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3975 index += qdf_snprint(&str_buf[index], 3976 DP_MAX_STRING_LEN - index, 3977 " %u:%u,", 3978 i, dp_stats_buf->rx_11ax_mu_txbf_mcs[i]); 3979 } 3980 DP_PRINT_STATS("rx_11ax_mu_txbf_mcs = %s", str_buf); 3981 3982 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 3983 qdf_mem_free(ul_ofdma_rx_gi[i]); 3984 3985 fail3: 3986 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) 3987 qdf_mem_free(rx_gi[i]); 3988 fail2: 3989 for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) 3990 qdf_mem_free(rssi_chain[i]); 3991 fail1: 3992 qdf_mem_free(str_buf); 3993 3994 } 3995 3996 /* 3997 * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv 3998 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv 3999 * 4000 * return:void 4001 */ 4002 static void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf) 4003 { 4004 htt_rx_soc_fw_stats_tlv *dp_stats_buf = 4005 (htt_rx_soc_fw_stats_tlv *)tag_buf; 4006 4007 DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:"); 4008 DP_PRINT_STATS("fw_reo_ring_data_msdu = %u", 4009 dp_stats_buf->fw_reo_ring_data_msdu); 4010 DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u", 4011 dp_stats_buf->fw_to_host_data_msdu_bcmc); 4012 DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u", 4013 dp_stats_buf->fw_to_host_data_msdu_uc); 4014 DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u", 4015 dp_stats_buf->ofld_remote_data_buf_recycle_cnt); 4016 DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u", 4017 dp_stats_buf->ofld_remote_free_buf_indication_cnt); 4018 DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ", 4019 dp_stats_buf->ofld_buf_to_host_data_msdu_uc); 4020 DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ", 4021 dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc); 4022 DP_PRINT_STATS("wbm_sw_ring_reap = %u ", 4023 dp_stats_buf->wbm_sw_ring_reap); 4024 DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ", 4025 dp_stats_buf->wbm_forward_to_host_cnt); 4026 DP_PRINT_STATS("wbm_target_recycle_cnt = %u ", 4027 dp_stats_buf->wbm_target_recycle_cnt); 4028 DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u", 4029 dp_stats_buf->target_refill_ring_recycle_cnt); 4030 4031 } 4032 4033 /* 4034 * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display 4035 * htt_rx_soc_fw_refill_ring_empty_tlv_v 4036 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v 4037 * 4038 * return:void 4039 */ 4040 static void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf) 4041 { 4042 htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf = 4043 (htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf; 4044 uint8_t i; 4045 uint16_t index = 0; 4046 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4047 char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN); 4048 4049 if (!refill_ring_empty_cnt) { 4050 dp_stats_err("Output buffer not allocated"); 4051 return; 4052 } 4053 4054 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING); 4055 4056 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:"); 4057 for (i = 0; i < tag_len; i++) { 4058 index += qdf_snprint(&refill_ring_empty_cnt[index], 4059 DP_MAX_STRING_LEN - index, 4060 " %u:%u,", i, 4061 dp_stats_buf->refill_ring_empty_cnt[i]); 4062 } 4063 DP_PRINT_STATS("refill_ring_empty_cnt = %s\n", 4064 refill_ring_empty_cnt); 4065 qdf_mem_free(refill_ring_empty_cnt); 4066 } 4067 4068 /* 4069 * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display 4070 * htt_rx_soc_fw_refill_ring_num_refill_tlv_v 4071 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv 4072 * 4073 * return:void 4074 */ 4075 static void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 4076 uint32_t *tag_buf) 4077 { 4078 htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf = 4079 (htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf; 4080 uint8_t i; 4081 uint16_t index = 0; 4082 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4083 char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN); 4084 4085 if (!refill_ring_num_refill) { 4086 dp_stats_err("Output buffer not allocated"); 4087 return; 4088 } 4089 4090 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS); 4091 4092 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:"); 4093 for (i = 0; i < tag_len; i++) { 4094 index += qdf_snprint(&refill_ring_num_refill[index], 4095 DP_MAX_STRING_LEN - index, 4096 " %u:%u,", i, 4097 dp_stats_buf->refill_ring_num_refill[i]); 4098 } 4099 DP_PRINT_STATS("refill_ring_num_refill = %s\n", 4100 refill_ring_num_refill); 4101 qdf_mem_free(refill_ring_num_refill); 4102 } 4103 4104 /* 4105 * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv 4106 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv 4107 * 4108 * return:void 4109 */ 4110 static void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf) 4111 { 4112 htt_rx_pdev_fw_stats_tlv *dp_stats_buf = 4113 (htt_rx_pdev_fw_stats_tlv *)tag_buf; 4114 uint8_t i; 4115 uint16_t index = 0; 4116 char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN]; 4117 char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN]; 4118 4119 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:"); 4120 DP_PRINT_STATS("mac_id__word = %u", 4121 dp_stats_buf->mac_id__word); 4122 DP_PRINT_STATS("ppdu_recvd = %u", 4123 dp_stats_buf->ppdu_recvd); 4124 DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u", 4125 dp_stats_buf->mpdu_cnt_fcs_ok); 4126 DP_PRINT_STATS("mpdu_cnt_fcs_err = %u", 4127 dp_stats_buf->mpdu_cnt_fcs_err); 4128 DP_PRINT_STATS("tcp_msdu_cnt = %u", 4129 dp_stats_buf->tcp_msdu_cnt); 4130 DP_PRINT_STATS("tcp_ack_msdu_cnt = %u", 4131 dp_stats_buf->tcp_ack_msdu_cnt); 4132 DP_PRINT_STATS("udp_msdu_cnt = %u", 4133 dp_stats_buf->udp_msdu_cnt); 4134 DP_PRINT_STATS("other_msdu_cnt = %u", 4135 dp_stats_buf->other_msdu_cnt); 4136 DP_PRINT_STATS("fw_ring_mpdu_ind = %u", 4137 dp_stats_buf->fw_ring_mpdu_ind); 4138 4139 for (i = 0; i < DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) { 4140 index += qdf_snprint(&fw_ring_mgmt_subtype[index], 4141 DP_MAX_STRING_LEN - index, 4142 " %u:%u,", i, 4143 dp_stats_buf->fw_ring_mgmt_subtype[i]); 4144 } 4145 DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype); 4146 4147 index = 0; 4148 for (i = 0; i < DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) { 4149 index += qdf_snprint(&fw_ring_ctrl_subtype[index], 4150 DP_MAX_STRING_LEN - index, 4151 " %u:%u,", i, 4152 dp_stats_buf->fw_ring_ctrl_subtype[i]); 4153 } 4154 DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype); 4155 DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u", 4156 dp_stats_buf->fw_ring_mcast_data_msdu); 4157 DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u", 4158 dp_stats_buf->fw_ring_bcast_data_msdu); 4159 DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u", 4160 dp_stats_buf->fw_ring_ucast_data_msdu); 4161 DP_PRINT_STATS("fw_ring_null_data_msdu = %u", 4162 dp_stats_buf->fw_ring_null_data_msdu); 4163 DP_PRINT_STATS("fw_ring_mpdu_drop = %u", 4164 dp_stats_buf->fw_ring_mpdu_drop); 4165 DP_PRINT_STATS("ofld_local_data_ind_cnt = %u", 4166 dp_stats_buf->ofld_local_data_ind_cnt); 4167 DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u", 4168 dp_stats_buf->ofld_local_data_buf_recycle_cnt); 4169 DP_PRINT_STATS("drx_local_data_ind_cnt = %u", 4170 dp_stats_buf->drx_local_data_ind_cnt); 4171 DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u", 4172 dp_stats_buf->drx_local_data_buf_recycle_cnt); 4173 DP_PRINT_STATS("local_nondata_ind_cnt = %u", 4174 dp_stats_buf->local_nondata_ind_cnt); 4175 DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u", 4176 dp_stats_buf->local_nondata_buf_recycle_cnt); 4177 DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u", 4178 dp_stats_buf->fw_status_buf_ring_refill_cnt); 4179 DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u", 4180 dp_stats_buf->fw_status_buf_ring_empty_cnt); 4181 DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u", 4182 dp_stats_buf->fw_pkt_buf_ring_refill_cnt); 4183 DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u", 4184 dp_stats_buf->fw_pkt_buf_ring_empty_cnt); 4185 DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u", 4186 dp_stats_buf->fw_link_buf_ring_refill_cnt); 4187 DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u", 4188 dp_stats_buf->fw_link_buf_ring_empty_cnt); 4189 DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u", 4190 dp_stats_buf->host_pkt_buf_ring_refill_cnt); 4191 DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u", 4192 dp_stats_buf->host_pkt_buf_ring_empty_cnt); 4193 DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u", 4194 dp_stats_buf->mon_pkt_buf_ring_refill_cnt); 4195 DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u", 4196 dp_stats_buf->mon_pkt_buf_ring_empty_cnt); 4197 DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u", 4198 dp_stats_buf->mon_status_buf_ring_refill_cnt); 4199 DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u", 4200 dp_stats_buf->mon_status_buf_ring_empty_cnt); 4201 DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u", 4202 dp_stats_buf->mon_desc_buf_ring_refill_cnt); 4203 DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u", 4204 dp_stats_buf->mon_desc_buf_ring_empty_cnt); 4205 DP_PRINT_STATS("mon_dest_ring_update_cnt = %u", 4206 dp_stats_buf->mon_dest_ring_update_cnt); 4207 DP_PRINT_STATS("mon_dest_ring_full_cnt = %u", 4208 dp_stats_buf->mon_dest_ring_full_cnt); 4209 DP_PRINT_STATS("rx_suspend_cnt = %u", 4210 dp_stats_buf->rx_suspend_cnt); 4211 DP_PRINT_STATS("rx_suspend_fail_cnt = %u", 4212 dp_stats_buf->rx_suspend_fail_cnt); 4213 DP_PRINT_STATS("rx_resume_cnt = %u", 4214 dp_stats_buf->rx_resume_cnt); 4215 DP_PRINT_STATS("rx_resume_fail_cnt = %u", 4216 dp_stats_buf->rx_resume_fail_cnt); 4217 DP_PRINT_STATS("rx_ring_switch_cnt = %u", 4218 dp_stats_buf->rx_ring_switch_cnt); 4219 DP_PRINT_STATS("rx_ring_restore_cnt = %u", 4220 dp_stats_buf->rx_ring_restore_cnt); 4221 DP_PRINT_STATS("rx_flush_cnt = %u\n", 4222 dp_stats_buf->rx_flush_cnt); 4223 } 4224 4225 /* 4226 * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display 4227 * htt_rx_pdev_fw_ring_mpdu_err_tlv_v 4228 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v 4229 * 4230 * return:void 4231 */ 4232 static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf) 4233 { 4234 htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf = 4235 (htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf; 4236 uint8_t i; 4237 uint16_t index = 0; 4238 char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN); 4239 4240 if (!fw_ring_mpdu_err) { 4241 dp_stats_err("Output buffer not allocated"); 4242 return; 4243 } 4244 4245 DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:"); 4246 for (i = 0; i < DP_HTT_FW_RING_MPDU_ERR_LEN; i++) { 4247 index += qdf_snprint(&fw_ring_mpdu_err[index], 4248 DP_MAX_STRING_LEN - index, 4249 " %u:%u,", i, 4250 dp_stats_buf->fw_ring_mpdu_err[i]); 4251 } 4252 DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err); 4253 qdf_mem_free(fw_ring_mpdu_err); 4254 } 4255 4256 /* 4257 * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v 4258 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v 4259 * 4260 * return:void 4261 */ 4262 static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf) 4263 { 4264 htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf = 4265 (htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf; 4266 uint8_t i; 4267 uint16_t index = 0; 4268 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4269 char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN); 4270 4271 if (!fw_mpdu_drop) { 4272 dp_stats_err("Output buffer not allocated"); 4273 return; 4274 } 4275 4276 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX); 4277 4278 DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:"); 4279 for (i = 0; i < tag_len; i++) { 4280 index += qdf_snprint(&fw_mpdu_drop[index], 4281 DP_MAX_STRING_LEN - index, 4282 " %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]); 4283 } 4284 DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop); 4285 qdf_mem_free(fw_mpdu_drop); 4286 } 4287 4288 /* 4289 * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error 4290 * packets 4291 * 4292 * tag_buf - Buffer 4293 * Return - NULL 4294 */ 4295 static void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf) 4296 { 4297 htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf = 4298 (htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf; 4299 4300 uint8_t i; 4301 uint16_t index = 0; 4302 char rxdma_err_cnt[DP_MAX_STRING_LEN]; 4303 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4304 4305 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE); 4306 4307 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V"); 4308 4309 for (i = 0; i < tag_len; i++) { 4310 index += snprintf(&rxdma_err_cnt[index], 4311 DP_MAX_STRING_LEN - index, 4312 " %u:%u,", i, 4313 dp_stats_buf->rxdma_err[i]); 4314 } 4315 4316 DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt); 4317 } 4318 4319 /* 4320 * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error 4321 * packets 4322 * 4323 * tag_buf - Buffer 4324 * Return - NULL 4325 */ 4326 static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf) 4327 { 4328 htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf = 4329 (htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf; 4330 4331 uint8_t i; 4332 uint16_t index = 0; 4333 char reo_err_cnt[DP_MAX_STRING_LEN]; 4334 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4335 4336 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE); 4337 4338 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V"); 4339 4340 for (i = 0; i < tag_len; i++) { 4341 index += snprintf(&reo_err_cnt[index], 4342 DP_MAX_STRING_LEN - index, 4343 " %u:%u,", i, 4344 dp_stats_buf->reo_err[i]); 4345 } 4346 4347 DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt); 4348 } 4349 4350 /* 4351 * dp_print_rx_reo_debug_stats_tlv() - REO Statistics 4352 * 4353 * tag_buf - Buffer 4354 * Return - NULL 4355 */ 4356 static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf) 4357 { 4358 htt_rx_reo_resource_stats_tlv_v *dp_stats_buf = 4359 (htt_rx_reo_resource_stats_tlv_v *)tag_buf; 4360 4361 DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV"); 4362 4363 DP_PRINT_STATS("sample_id: %u ", 4364 dp_stats_buf->sample_id); 4365 DP_PRINT_STATS("total_max: %u ", 4366 dp_stats_buf->total_max); 4367 DP_PRINT_STATS("total_avg: %u ", 4368 dp_stats_buf->total_avg); 4369 DP_PRINT_STATS("total_sample: %u ", 4370 dp_stats_buf->total_sample); 4371 DP_PRINT_STATS("non_zeros_avg: %u ", 4372 dp_stats_buf->non_zeros_avg); 4373 DP_PRINT_STATS("non_zeros_sample: %u ", 4374 dp_stats_buf->non_zeros_sample); 4375 DP_PRINT_STATS("last_non_zeros_max: %u ", 4376 dp_stats_buf->last_non_zeros_max); 4377 DP_PRINT_STATS("last_non_zeros_min: %u ", 4378 dp_stats_buf->last_non_zeros_min); 4379 DP_PRINT_STATS("last_non_zeros_avg: %u ", 4380 dp_stats_buf->last_non_zeros_avg); 4381 DP_PRINT_STATS("last_non_zeros_sample: %u\n ", 4382 dp_stats_buf->last_non_zeros_sample); 4383 } 4384 4385 /* 4386 * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors 4387 * 4388 * tag_buf - Buffer 4389 * Return - NULL 4390 */ 4391 static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf) 4392 { 4393 htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf = 4394 (htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf; 4395 4396 uint8_t i = 0; 4397 uint16_t index = 0; 4398 char phy_errs[DP_MAX_STRING_LEN]; 4399 4400 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV"); 4401 4402 DP_PRINT_STATS("mac_id_word: %u", 4403 dp_stats_buf->mac_id__word); 4404 DP_PRINT_STATS("total_phy_err_cnt: %u", 4405 dp_stats_buf->total_phy_err_cnt); 4406 4407 for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) { 4408 index += snprintf(&phy_errs[index], 4409 DP_MAX_STRING_LEN - index, 4410 " %u:%u,", i, dp_stats_buf->phy_err[i]); 4411 } 4412 4413 DP_PRINT_STATS("phy_errs: %s\n", phy_errs); 4414 } 4415 4416 /* 4417 * dp_htt_stats_print_tag: function to select the tag type and 4418 * print the corresponding tag structure 4419 * @pdev: pdev pointer 4420 * @tag_type: tag type that is to be printed 4421 * @tag_buf: pointer to the tag structure 4422 * 4423 * return: void 4424 */ 4425 void dp_htt_stats_print_tag(struct dp_pdev *pdev, 4426 uint8_t tag_type, uint32_t *tag_buf) 4427 { 4428 switch (tag_type) { 4429 case HTT_STATS_TX_PDEV_CMN_TAG: 4430 dp_print_tx_pdev_stats_cmn_tlv(tag_buf); 4431 break; 4432 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 4433 dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf); 4434 break; 4435 case HTT_STATS_TX_PDEV_SIFS_TAG: 4436 dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf); 4437 break; 4438 case HTT_STATS_TX_PDEV_FLUSH_TAG: 4439 dp_print_tx_pdev_stats_flush_tlv_v(tag_buf); 4440 break; 4441 4442 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 4443 dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf); 4444 break; 4445 4446 case HTT_STATS_STRING_TAG: 4447 dp_print_stats_string_tlv(tag_buf); 4448 break; 4449 4450 case HTT_STATS_TX_HWQ_CMN_TAG: 4451 dp_print_tx_hwq_stats_cmn_tlv(tag_buf); 4452 break; 4453 4454 case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG: 4455 dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf); 4456 break; 4457 4458 case HTT_STATS_TX_HWQ_CMD_RESULT_TAG: 4459 dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf); 4460 break; 4461 4462 case HTT_STATS_TX_HWQ_CMD_STALL_TAG: 4463 dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf); 4464 break; 4465 4466 case HTT_STATS_TX_HWQ_FES_STATUS_TAG: 4467 dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf); 4468 break; 4469 4470 case HTT_STATS_TX_TQM_GEN_MPDU_TAG: 4471 dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf); 4472 break; 4473 4474 case HTT_STATS_TX_TQM_LIST_MPDU_TAG: 4475 dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf); 4476 break; 4477 4478 case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG: 4479 dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf); 4480 break; 4481 4482 case HTT_STATS_TX_TQM_CMN_TAG: 4483 dp_print_tx_tqm_cmn_stats_tlv(tag_buf); 4484 break; 4485 4486 case HTT_STATS_TX_TQM_PDEV_TAG: 4487 dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf); 4488 break; 4489 4490 case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG: 4491 dp_print_tx_tqm_cmdq_status_tlv(tag_buf); 4492 break; 4493 4494 case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG: 4495 dp_print_tx_de_eapol_packets_stats_tlv(tag_buf); 4496 break; 4497 4498 case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG: 4499 dp_print_tx_de_classify_failed_stats_tlv(tag_buf); 4500 break; 4501 4502 case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG: 4503 dp_print_tx_de_classify_stats_tlv(tag_buf); 4504 break; 4505 4506 case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG: 4507 dp_print_tx_de_classify_status_stats_tlv(tag_buf); 4508 break; 4509 4510 case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG: 4511 dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf); 4512 break; 4513 4514 case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG: 4515 dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf); 4516 break; 4517 4518 case HTT_STATS_TX_DE_CMN_TAG: 4519 dp_print_tx_de_cmn_stats_tlv(tag_buf); 4520 break; 4521 4522 case HTT_STATS_RING_IF_TAG: 4523 dp_print_ring_if_stats_tlv(tag_buf); 4524 break; 4525 4526 case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG: 4527 dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf); 4528 break; 4529 4530 case HTT_STATS_SFM_CMN_TAG: 4531 dp_print_sfm_cmn_tlv(tag_buf); 4532 break; 4533 4534 case HTT_STATS_SRING_STATS_TAG: 4535 dp_print_sring_stats_tlv(tag_buf); 4536 break; 4537 4538 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 4539 dp_print_rx_pdev_fw_stats_tlv(tag_buf); 4540 break; 4541 4542 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 4543 dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf); 4544 break; 4545 4546 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 4547 dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf); 4548 break; 4549 4550 case HTT_STATS_RX_SOC_FW_STATS_TAG: 4551 dp_print_rx_soc_fw_stats_tlv(tag_buf); 4552 break; 4553 4554 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 4555 dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf); 4556 break; 4557 4558 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 4559 dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 4560 tag_buf); 4561 break; 4562 4563 case HTT_STATS_TX_PDEV_RATE_STATS_TAG: 4564 dp_print_tx_pdev_rate_stats_tlv(tag_buf); 4565 break; 4566 4567 case HTT_STATS_RX_PDEV_RATE_STATS_TAG: 4568 dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf); 4569 break; 4570 4571 case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG: 4572 dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf); 4573 break; 4574 4575 case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG: 4576 dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf); 4577 break; 4578 4579 case HTT_STATS_TX_SCHED_CMN_TAG: 4580 dp_print_stats_tx_sched_cmn_tlv(tag_buf); 4581 break; 4582 4583 case HTT_STATS_TX_PDEV_MPDU_STATS_TAG: 4584 dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf); 4585 break; 4586 4587 case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG: 4588 dp_print_sched_txq_cmd_posted_tlv_v(tag_buf); 4589 break; 4590 4591 case HTT_STATS_RING_IF_CMN_TAG: 4592 dp_print_ring_if_cmn_tlv(tag_buf); 4593 break; 4594 4595 case HTT_STATS_SFM_CLIENT_USER_TAG: 4596 dp_print_sfm_client_user_tlv_v(tag_buf); 4597 break; 4598 4599 case HTT_STATS_SFM_CLIENT_TAG: 4600 dp_print_sfm_client_tlv(tag_buf); 4601 break; 4602 4603 case HTT_STATS_TX_TQM_ERROR_STATS_TAG: 4604 dp_print_tx_tqm_error_stats_tlv(tag_buf); 4605 break; 4606 4607 case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG: 4608 dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf); 4609 break; 4610 4611 case HTT_STATS_SRING_CMN_TAG: 4612 dp_print_sring_cmn_tlv(tag_buf); 4613 break; 4614 4615 case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG: 4616 dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf); 4617 break; 4618 4619 case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG: 4620 dp_print_tx_selfgen_cmn_stats_tlv(tag_buf); 4621 break; 4622 4623 case HTT_STATS_TX_SELFGEN_AC_STATS_TAG: 4624 dp_print_tx_selfgen_ac_stats_tlv(tag_buf); 4625 break; 4626 4627 case HTT_STATS_TX_SELFGEN_AX_STATS_TAG: 4628 dp_print_tx_selfgen_ax_stats_tlv(tag_buf); 4629 break; 4630 4631 case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG: 4632 dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf); 4633 break; 4634 4635 case HTT_STATS_TX_SELFGEN_BE_STATS_TAG: 4636 dp_print_tx_selfgen_be_stats_tlv(tag_buf); 4637 break; 4638 4639 case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG: 4640 dp_print_tx_selfgen_be_err_stats_tlv(tag_buf); 4641 break; 4642 4643 case HTT_STATS_TX_SOUNDING_STATS_TAG: 4644 dp_print_tx_sounding_stats_tlv(tag_buf); 4645 break; 4646 4647 case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG: 4648 dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf); 4649 break; 4650 4651 case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG: 4652 dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf); 4653 break; 4654 4655 case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG: 4656 dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf); 4657 break; 4658 4659 case HTT_STATS_HW_INTR_MISC_TAG: 4660 dp_print_hw_stats_intr_misc_tlv(tag_buf); 4661 break; 4662 4663 case HTT_STATS_HW_WD_TIMEOUT_TAG: 4664 dp_print_hw_stats_wd_timeout_tlv(tag_buf); 4665 break; 4666 4667 case HTT_STATS_HW_PDEV_ERRS_TAG: 4668 dp_print_hw_stats_pdev_errs_tlv(tag_buf); 4669 break; 4670 4671 case HTT_STATS_COUNTER_NAME_TAG: 4672 dp_print_counter_tlv(tag_buf); 4673 break; 4674 4675 case HTT_STATS_TX_TID_DETAILS_TAG: 4676 dp_print_tx_tid_stats_tlv(tag_buf); 4677 break; 4678 4679 case HTT_STATS_TX_TID_DETAILS_V1_TAG: 4680 dp_print_tx_tid_stats_v1_tlv(tag_buf); 4681 break; 4682 4683 case HTT_STATS_RX_TID_DETAILS_TAG: 4684 dp_print_rx_tid_stats_tlv(tag_buf); 4685 break; 4686 4687 case HTT_STATS_PEER_STATS_CMN_TAG: 4688 dp_print_peer_stats_cmn_tlv(tag_buf); 4689 break; 4690 4691 case HTT_STATS_PEER_DETAILS_TAG: 4692 dp_print_peer_details_tlv(tag_buf); 4693 break; 4694 4695 case HTT_STATS_PEER_MSDU_FLOWQ_TAG: 4696 dp_print_msdu_flow_stats_tlv(tag_buf); 4697 break; 4698 4699 case HTT_STATS_PEER_TX_RATE_STATS_TAG: 4700 dp_print_tx_peer_rate_stats_tlv(tag_buf); 4701 break; 4702 4703 case HTT_STATS_PEER_RX_RATE_STATS_TAG: 4704 dp_print_rx_peer_rate_stats_tlv(tag_buf); 4705 break; 4706 4707 case HTT_STATS_TX_DE_COMPL_STATS_TAG: 4708 dp_print_tx_de_compl_stats_tlv(tag_buf); 4709 break; 4710 4711 case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG: 4712 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf); 4713 break; 4714 4715 case HTT_STATS_RX_REFILL_REO_ERR_TAG: 4716 dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf); 4717 break; 4718 4719 case HTT_STATS_RX_REO_RESOURCE_STATS_TAG: 4720 dp_print_rx_reo_debug_stats_tlv(tag_buf); 4721 break; 4722 4723 case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG: 4724 dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf); 4725 break; 4726 4727 default: 4728 break; 4729 } 4730 } 4731 4732 /* 4733 * dp_htt_stats_copy_tag: function to select the tag type and 4734 * copy the corresponding tag structure 4735 * @pdev: DP_PDEV handle 4736 * @tag_type: tag type that is to be printed 4737 * @tag_buf: pointer to the tag structure 4738 * 4739 * return: void 4740 */ 4741 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf) 4742 { 4743 void *dest_ptr = NULL; 4744 uint32_t size = 0; 4745 uint32_t size_expected = 0; 4746 uint64_t val = 1; 4747 4748 pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type); 4749 switch (tag_type) { 4750 case HTT_STATS_TX_PDEV_CMN_TAG: 4751 dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv; 4752 size = sizeof(htt_tx_pdev_stats_cmn_tlv); 4753 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv); 4754 break; 4755 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 4756 dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv; 4757 size = sizeof(htt_tx_pdev_stats_urrn_tlv_v); 4758 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v); 4759 break; 4760 case HTT_STATS_TX_PDEV_SIFS_TAG: 4761 dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv; 4762 size = sizeof(htt_tx_pdev_stats_sifs_tlv_v); 4763 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v); 4764 break; 4765 case HTT_STATS_TX_PDEV_FLUSH_TAG: 4766 dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv; 4767 size = sizeof(htt_tx_pdev_stats_flush_tlv_v); 4768 size_expected = 4769 sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v); 4770 break; 4771 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 4772 dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv; 4773 size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v); 4774 size_expected = 4775 sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v); 4776 break; 4777 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 4778 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv; 4779 size = sizeof(htt_rx_pdev_fw_stats_tlv); 4780 size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv); 4781 break; 4782 case HTT_STATS_RX_SOC_FW_STATS_TAG: 4783 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv; 4784 size = sizeof(htt_rx_soc_fw_stats_tlv); 4785 size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv); 4786 break; 4787 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 4788 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv; 4789 size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v); 4790 size_expected = 4791 sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v); 4792 break; 4793 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 4794 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv; 4795 size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 4796 size_expected = 4797 sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 4798 break; 4799 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 4800 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv; 4801 size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 4802 size_expected = 4803 sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 4804 break; 4805 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 4806 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop; 4807 size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v); 4808 size_expected = 4809 sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v); 4810 break; 4811 default: 4812 break; 4813 } 4814 4815 if (size_expected < size) 4816 dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d" 4817 , size, size_expected); 4818 4819 if (dest_ptr) 4820 qdf_mem_copy(dest_ptr, tag_buf, size_expected); 4821 4822 if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS) 4823 == DP_HTT_TX_RX_EXPECTED_TLVS) { 4824 qdf_event_set(&pdev->fw_stats_event); 4825 } 4826 } 4827 4828 #ifdef VDEV_PEER_PROTOCOL_COUNT 4829 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING 4830 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev, 4831 bool is_egress, 4832 bool is_rx) 4833 { 4834 int mask; 4835 4836 if (is_egress) 4837 if (is_rx) 4838 mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK; 4839 else 4840 mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK; 4841 else 4842 if (is_rx) 4843 mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK; 4844 else 4845 mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK; 4846 4847 if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) { 4848 dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask); 4849 return QDF_STATUS_SUCCESS; 4850 } 4851 return QDF_STATUS_E_FAILURE; 4852 } 4853 4854 #else 4855 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev, 4856 bool is_egress, 4857 bool is_rx) 4858 { 4859 return QDF_STATUS_E_FAILURE; 4860 } 4861 #endif 4862 4863 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev, 4864 qdf_nbuf_t nbuf, 4865 struct dp_txrx_peer *txrx_peer, 4866 bool is_egress, 4867 bool is_rx) 4868 { 4869 struct dp_peer_per_pkt_stats *per_pkt_stats; 4870 struct protocol_trace_count *protocol_trace_cnt; 4871 enum cdp_protocol_trace prot; 4872 struct dp_soc *soc; 4873 struct ether_header *eh; 4874 char *mac; 4875 bool new_peer_ref = false; 4876 struct dp_peer *peer = NULL; 4877 4878 if (qdf_likely(!vdev->peer_protocol_count_track)) 4879 return; 4880 if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev, 4881 is_egress, 4882 is_rx) == 4883 QDF_STATUS_SUCCESS)) 4884 return; 4885 4886 soc = vdev->pdev->soc; 4887 eh = (struct ether_header *)qdf_nbuf_data(nbuf); 4888 if (is_rx) 4889 mac = eh->ether_shost; 4890 else 4891 mac = eh->ether_dhost; 4892 4893 if (!txrx_peer) { 4894 peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id, 4895 DP_MOD_ID_GENERIC_STATS); 4896 new_peer_ref = true; 4897 if (!peer) 4898 return; 4899 4900 txrx_peer = peer->txrx_peer; 4901 if (!txrx_peer) 4902 goto dp_vdev_peer_stats_update_protocol_cnt_free_peer; 4903 } 4904 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 4905 4906 if (qdf_nbuf_is_icmp_pkt(nbuf) == true) 4907 prot = CDP_TRACE_ICMP; 4908 else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true) 4909 prot = CDP_TRACE_ARP; 4910 else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true) 4911 prot = CDP_TRACE_EAP; 4912 else 4913 goto dp_vdev_peer_stats_update_protocol_cnt_free_peer; 4914 4915 if (is_rx) 4916 protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt; 4917 else 4918 protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt; 4919 4920 if (is_egress) 4921 protocol_trace_cnt[prot].egress_cnt++; 4922 else 4923 protocol_trace_cnt[prot].ingress_cnt++; 4924 dp_vdev_peer_stats_update_protocol_cnt_free_peer: 4925 if (new_peer_ref) 4926 dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS); 4927 } 4928 4929 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl, 4930 int8_t vdev_id, 4931 qdf_nbuf_t nbuf, 4932 bool is_egress, 4933 bool is_rx) 4934 { 4935 struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); 4936 struct dp_vdev *vdev; 4937 4938 vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS); 4939 if (!vdev) 4940 return; 4941 4942 if (qdf_likely(vdev->peer_protocol_count_track)) 4943 dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 4944 is_egress, is_rx); 4945 4946 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 4947 } 4948 #endif 4949 4950 #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE) 4951 /** 4952 * dp_vow_str_fw_to_hw_delay() - Return string for a delay 4953 * @index: Index of delay 4954 * 4955 * Return: char const pointer 4956 */ 4957 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index) 4958 { 4959 if (index > CDP_DELAY_BUCKET_MAX) { 4960 return "Invalid index"; 4961 } 4962 return fw_to_hw_delay_bucket[index]; 4963 } 4964 4965 /** 4966 * dp_accumulate_delay_stats() - Update delay stats members 4967 * @total: Update stats total structure 4968 * @per_ring: per ring structures from where stats need to be accumulated 4969 * 4970 * Return: void 4971 */ 4972 static void 4973 dp_accumulate_delay_stats(struct cdp_delay_stats *total, 4974 struct cdp_delay_stats *per_ring) 4975 { 4976 uint8_t index; 4977 4978 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) 4979 total->delay_bucket[index] += per_ring->delay_bucket[index]; 4980 total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay); 4981 total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay); 4982 total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1); 4983 } 4984 #endif 4985 4986 #ifdef QCA_ENH_V3_STATS_SUPPORT 4987 /** 4988 * dp_vow_str_sw_enq_delay() - Return string for a delay 4989 * @index: Index of delay 4990 * 4991 * Return: char const pointer 4992 */ 4993 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index) 4994 { 4995 if (index > CDP_DELAY_BUCKET_MAX) { 4996 return "Invalid index"; 4997 } 4998 return sw_enq_delay_bucket[index]; 4999 } 5000 5001 /** 5002 * dp_vow_str_intfrm_delay() - Return string for a delay 5003 * @index: Index of delay 5004 * 5005 * Return: char const pointer 5006 */ 5007 static inline const char *dp_vow_str_intfrm_delay(uint8_t index) 5008 { 5009 if (index > CDP_DELAY_BUCKET_MAX) { 5010 return "Invalid index"; 5011 } 5012 return intfrm_delay_bucket[index]; 5013 } 5014 5015 /** 5016 * dp_accumulate_tid_stats() - Accumulate TID stats from each ring 5017 * @pdev: pdev handle 5018 * @tid: traffic ID 5019 * @total_tx: fill this tx structure to get stats from all wbm rings 5020 * @total_rx: fill this rx structure to get stats from all reo rings 5021 * @type: delay stats or regular frame counters 5022 * 5023 * Return: void 5024 */ 5025 static void 5026 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid, 5027 struct cdp_tid_tx_stats *total_tx, 5028 struct cdp_tid_rx_stats *total_rx, uint8_t type) 5029 { 5030 uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0; 5031 struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats; 5032 struct cdp_tid_tx_stats *per_ring_tx = NULL; 5033 struct cdp_tid_rx_stats *per_ring_rx = NULL; 5034 5035 if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) { 5036 qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid], 5037 sizeof(struct cdp_tid_tx_stats)); 5038 qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid], 5039 sizeof(struct cdp_tid_rx_stats)); 5040 return; 5041 } else { 5042 qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats)); 5043 qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats)); 5044 } 5045 5046 switch (type) { 5047 case TID_COUNTER_STATS: 5048 { 5049 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5050 per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid]; 5051 total_tx->success_cnt += per_ring_tx->success_cnt; 5052 total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt; 5053 for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) { 5054 total_tx->tqm_status_cnt[tqm_status_idx] += 5055 per_ring_tx->tqm_status_cnt[tqm_status_idx]; 5056 } 5057 5058 for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) { 5059 total_tx->htt_status_cnt[htt_status_idx] += 5060 per_ring_tx->htt_status_cnt[htt_status_idx]; 5061 } 5062 5063 for (drop = 0; drop < TX_MAX_DROP; drop++) 5064 total_tx->swdrop_cnt[drop] += 5065 per_ring_tx->swdrop_cnt[drop]; 5066 } 5067 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5068 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5069 total_rx->delivered_to_stack += 5070 per_ring_rx->delivered_to_stack; 5071 total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt; 5072 total_rx->msdu_cnt += per_ring_rx->msdu_cnt; 5073 total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt; 5074 total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt; 5075 for (drop = 0; drop < RX_MAX_DROP; drop++) 5076 total_rx->fail_cnt[drop] += 5077 per_ring_rx->fail_cnt[drop]; 5078 } 5079 break; 5080 } 5081 5082 case TID_DELAY_STATS: 5083 { 5084 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5085 per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid]; 5086 dp_accumulate_delay_stats(&total_tx->swq_delay, 5087 &per_ring_tx->swq_delay); 5088 dp_accumulate_delay_stats(&total_tx->hwtx_delay, 5089 &per_ring_tx->hwtx_delay); 5090 dp_accumulate_delay_stats(&total_tx->intfrm_delay, 5091 &per_ring_tx->intfrm_delay); 5092 } 5093 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5094 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5095 dp_accumulate_delay_stats(&total_rx->intfrm_delay, 5096 &per_ring_rx->intfrm_delay); 5097 dp_accumulate_delay_stats(&total_rx->to_stack_delay, 5098 &per_ring_rx->to_stack_delay); 5099 } 5100 break; 5101 } 5102 5103 case TID_RX_ERROR_STATS: 5104 { 5105 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5106 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5107 total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv; 5108 for (i = 0; i < CDP_REO_CODE_MAX; i++) { 5109 total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i]; 5110 } 5111 5112 total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv; 5113 for (i = 0; i < CDP_DMA_CODE_MAX; i++) { 5114 total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i]; 5115 } 5116 } 5117 break; 5118 } 5119 default: 5120 qdf_err("Invalid stats type"); 5121 break; 5122 } 5123 } 5124 5125 void dp_pdev_print_tid_stats(struct dp_pdev *pdev) 5126 { 5127 struct cdp_tid_tx_stats total_tx; 5128 struct cdp_tid_rx_stats total_rx; 5129 uint8_t tid, tqm_status_idx, htt_status_idx; 5130 struct cdp_tid_rx_stats *rx_wbm_stats = NULL; 5131 5132 DP_PRINT_STATS("Packets received in hardstart: %llu ", 5133 pdev->stats.tid_stats.ingress_stack); 5134 DP_PRINT_STATS("Packets dropped in osif layer: %llu ", 5135 pdev->stats.tid_stats.osif_drop); 5136 DP_PRINT_STATS("Per TID Video Stats:\n"); 5137 5138 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5139 rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid]; 5140 5141 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5142 TID_COUNTER_STATS); 5143 DP_PRINT_STATS("----TID: %d----", tid); 5144 DP_PRINT_STATS("Tx TQM Success Count: %llu", 5145 total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]); 5146 DP_PRINT_STATS("Tx HTT Success Count: %llu", 5147 total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]); 5148 for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) { 5149 if (total_tx.tqm_status_cnt[tqm_status_idx]) { 5150 DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu", 5151 tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]); 5152 } 5153 } 5154 5155 for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) { 5156 if (total_tx.htt_status_cnt[htt_status_idx]) { 5157 DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu", 5158 htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]); 5159 } 5160 } 5161 5162 DP_PRINT_STATS("Tx Hardware Drop Count: %llu", 5163 total_tx.swdrop_cnt[TX_HW_ENQUEUE]); 5164 DP_PRINT_STATS("Tx Software Drop Count: %llu", 5165 total_tx.swdrop_cnt[TX_SW_ENQUEUE]); 5166 DP_PRINT_STATS("Tx Descriptor Error Count: %llu", 5167 total_tx.swdrop_cnt[TX_DESC_ERR]); 5168 DP_PRINT_STATS("Tx HAL Ring Error Count: %llu", 5169 total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]); 5170 DP_PRINT_STATS("Tx Dma Map Error Count: %llu", 5171 total_tx.swdrop_cnt[TX_DMA_MAP_ERR]); 5172 DP_PRINT_STATS("Rx Delievered Count: %llu", 5173 total_rx.delivered_to_stack); 5174 DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu", 5175 total_rx.fail_cnt[ENQUEUE_DROP]); 5176 DP_PRINT_STATS("Rx Intrabss Drop Count: %llu", 5177 total_rx.fail_cnt[INTRABSS_DROP]); 5178 DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu", 5179 total_rx.fail_cnt[MSDU_DONE_FAILURE]); 5180 DP_PRINT_STATS("Rx Invalid Peer Count: %llu", 5181 total_rx.fail_cnt[INVALID_PEER_VDEV]); 5182 DP_PRINT_STATS("Rx Policy Check Drop Count: %llu", 5183 total_rx.fail_cnt[POLICY_CHECK_DROP]); 5184 DP_PRINT_STATS("Rx Mec Drop Count: %llu", 5185 total_rx.fail_cnt[MEC_DROP]); 5186 DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu", 5187 total_rx.fail_cnt[NAWDS_MCAST_DROP]); 5188 DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu", 5189 total_rx.fail_cnt[MESH_FILTER_DROP]); 5190 DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu", 5191 total_rx.intrabss_cnt); 5192 DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt); 5193 DP_PRINT_STATS("Rx Multicast MSDU Count: %llu", 5194 total_rx.mcast_msdu_cnt); 5195 DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n", 5196 total_rx.bcast_msdu_cnt); 5197 DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu", 5198 rx_wbm_stats->intrabss_cnt); 5199 DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu", 5200 rx_wbm_stats->fail_cnt[INTRABSS_DROP]); 5201 } 5202 } 5203 5204 void dp_pdev_print_delay_stats(struct dp_pdev *pdev) 5205 { 5206 struct dp_soc *soc = pdev->soc; 5207 struct cdp_tid_tx_stats total_tx; 5208 struct cdp_tid_rx_stats total_rx; 5209 struct cdp_tid_stats *tid_stats; 5210 5211 uint8_t tid, index; 5212 uint64_t count = 0; 5213 5214 if (!soc) 5215 return; 5216 5217 tid = 0; 5218 index = 0; 5219 tid_stats = &pdev->stats.tid_stats; 5220 5221 DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n"); 5222 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5223 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5224 TID_DELAY_STATS); 5225 DP_PRINT_STATS("----TID: %d----", tid); 5226 5227 DP_PRINT_STATS("Software Enqueue Delay:"); 5228 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5229 count = total_tx.swq_delay.delay_bucket[index]; 5230 if (count) { 5231 DP_PRINT_STATS("%s: Packets = %llu", 5232 dp_vow_str_sw_enq_delay(index), 5233 count); 5234 } 5235 } 5236 5237 DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay); 5238 DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay); 5239 DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay); 5240 5241 DP_PRINT_STATS("Hardware Transmission Delay:"); 5242 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5243 count = total_tx.hwtx_delay.delay_bucket[index]; 5244 if (count) { 5245 DP_PRINT_STATS("%s: Packets = %llu", 5246 dp_vow_str_fw_to_hw_delay(index), 5247 count); 5248 } 5249 } 5250 DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay); 5251 DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay); 5252 DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay); 5253 5254 DP_PRINT_STATS("Tx Interframe Delay:"); 5255 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5256 count = total_tx.intfrm_delay.delay_bucket[index]; 5257 if (count) { 5258 DP_PRINT_STATS("%s: Packets = %llu", 5259 dp_vow_str_intfrm_delay(index), 5260 count); 5261 } 5262 } 5263 DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay); 5264 DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay); 5265 DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay); 5266 5267 DP_PRINT_STATS("Rx Interframe Delay:"); 5268 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5269 count = total_rx.intfrm_delay.delay_bucket[index]; 5270 if (count) { 5271 DP_PRINT_STATS("%s: Packets = %llu", 5272 dp_vow_str_intfrm_delay(index), 5273 count); 5274 } 5275 } 5276 DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay); 5277 DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay); 5278 DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay); 5279 5280 DP_PRINT_STATS("Rx Reap to Stack Delay:"); 5281 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5282 count = total_rx.to_stack_delay.delay_bucket[index]; 5283 if (count) { 5284 DP_PRINT_STATS("%s: Packets = %llu", 5285 dp_vow_str_intfrm_delay(index), 5286 count); 5287 } 5288 } 5289 5290 DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay); 5291 DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay); 5292 DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay); 5293 } 5294 } 5295 5296 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev) 5297 { 5298 struct dp_soc *soc = pdev->soc; 5299 struct cdp_tid_rx_stats total_rx; 5300 struct cdp_tid_tx_stats total_tx; 5301 struct cdp_tid_stats *tid_stats; 5302 5303 uint8_t tid, index; 5304 5305 if (!soc) 5306 return; 5307 5308 tid_stats = &pdev->stats.tid_stats; 5309 5310 DP_PRINT_STATS("Per TID RX Error Stats:\n"); 5311 for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) { 5312 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5313 TID_RX_ERROR_STATS); 5314 DP_PRINT_STATS("----TID: %d----", tid + 4); 5315 5316 DP_PRINT_STATS("Rx REO Error stats:"); 5317 DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv); 5318 for (index = 0; index < CDP_REO_CODE_MAX; index++) { 5319 DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]); 5320 } 5321 5322 DP_PRINT_STATS("Rx Rxdma Error stats:"); 5323 DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv); 5324 for (index = 0; index < CDP_DMA_CODE_MAX; index++) { 5325 DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]); 5326 } 5327 } 5328 } 5329 5330 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 5331 struct cdp_tid_stats_intf *tid_stats) 5332 { 5333 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 5334 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 5335 struct cdp_tid_rx_stats rx; 5336 struct cdp_tid_tx_stats tx; 5337 uint8_t tid; 5338 uint32_t size; 5339 5340 if (!pdev) 5341 return QDF_STATUS_E_INVAL; 5342 5343 size = sizeof(struct cdp_delay_stats); 5344 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5345 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS); 5346 /* Copy specific accumulated Tx tid stats */ 5347 tid_stats->tx_total[tid].success_cnt = tx.success_cnt; 5348 tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt; 5349 qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0], 5350 &tx.tqm_status_cnt[0], 5351 CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t)); 5352 qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0], 5353 &tx.htt_status_cnt[0], 5354 CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t)); 5355 qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0], 5356 &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t)); 5357 5358 /* Copy specific accumulated Rx tid stats */ 5359 tid_stats->rx_total[tid].delivered_to_stack = 5360 rx.delivered_to_stack; 5361 tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt; 5362 tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt; 5363 tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt; 5364 tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt; 5365 qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0], 5366 &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t)); 5367 5368 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS); 5369 /* Copy specific accumulated Tx delay stats */ 5370 qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay, 5371 &tx.swq_delay, size); 5372 qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay, 5373 &tx.hwtx_delay, size); 5374 qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay, 5375 &tx.intfrm_delay, size); 5376 5377 /* Copy specific accumulated Rx delay stats */ 5378 qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay, 5379 &rx.intfrm_delay, size); 5380 qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay, 5381 &rx.to_stack_delay, size); 5382 } 5383 for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) { 5384 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, 5385 TID_RX_ERROR_STATS); 5386 /* Copy specific accumulated VOW Rx stats */ 5387 qdf_mem_copy(&tid_stats->rx_total[tid].reo_err, 5388 &rx.reo_err, sizeof(struct cdp_reo_error_stats)); 5389 qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err, 5390 sizeof(struct cdp_rxdma_error_stats)); 5391 } 5392 tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack; 5393 tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop; 5394 5395 return QDF_STATUS_SUCCESS; 5396 } 5397 #else 5398 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 5399 struct cdp_tid_stats_intf *tid_stats) 5400 { 5401 return QDF_STATUS_E_INVAL; 5402 } 5403 #endif 5404 5405 #ifdef HW_TX_DELAY_STATS_ENABLE 5406 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev) 5407 { 5408 struct cdp_delay_stats delay_stats; 5409 struct cdp_tid_tx_stats *per_ring; 5410 uint8_t tid, index; 5411 uint64_t count = 0; 5412 uint8_t ring_id; 5413 5414 if (!vdev) 5415 return; 5416 5417 DP_PRINT_STATS("vdev_id: %d Per TID Delay Non-Zero Stats:\n", 5418 vdev->vdev_id); 5419 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5420 qdf_mem_zero(&delay_stats, sizeof(delay_stats)); 5421 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5422 per_ring = &vdev->stats.tid_tx_stats[ring_id][tid]; 5423 dp_accumulate_delay_stats(&delay_stats, 5424 &per_ring->hwtx_delay); 5425 } 5426 5427 DP_PRINT_STATS("Hardware Tx completion latency stats TID: %d", 5428 tid); 5429 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5430 count = delay_stats.delay_bucket[index]; 5431 if (count) { 5432 DP_PRINT_STATS("%s: Packets = %llu", 5433 dp_vow_str_fw_to_hw_delay(index), 5434 count); 5435 } 5436 } 5437 5438 DP_PRINT_STATS("Min = %u", delay_stats.min_delay); 5439 DP_PRINT_STATS("Max = %u", delay_stats.max_delay); 5440 DP_PRINT_STATS("Avg = %u\n", delay_stats.avg_delay); 5441 } 5442 } 5443 5444 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc) 5445 { 5446 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0); 5447 struct dp_vdev *vdev; 5448 struct dp_vdev **vdev_array = NULL; 5449 int index = 0, num_vdev = 0; 5450 5451 if (!pdev) { 5452 dp_err("pdev is NULL"); 5453 return; 5454 } 5455 5456 vdev_array = 5457 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 5458 if (!vdev_array) 5459 return; 5460 5461 qdf_spin_lock_bh(&pdev->vdev_list_lock); 5462 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 5463 if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS)) 5464 continue; 5465 vdev_array[index] = vdev; 5466 index = index + 1; 5467 } 5468 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 5469 5470 num_vdev = index; 5471 5472 for (index = 0; index < num_vdev; index++) { 5473 vdev = vdev_array[index]; 5474 dp_vdev_print_tx_delay_stats(vdev); 5475 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 5476 } 5477 qdf_mem_free(vdev_array); 5478 } 5479 5480 /** 5481 * dp_reset_delay_stats() - reset delay stats 5482 * @per_ring: per ring structures from where stats need to be accumulated 5483 * 5484 * Return: void 5485 */ 5486 static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring) 5487 { 5488 qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats)); 5489 } 5490 5491 /** 5492 * dp_vdev_init_tx_delay_stats() - Clear tx delay stats 5493 * @vdev: vdev handle 5494 * 5495 * Return: None 5496 */ 5497 static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev) 5498 { 5499 struct cdp_tid_tx_stats *per_ring; 5500 uint8_t tid; 5501 uint8_t ring_id; 5502 5503 if (!vdev) 5504 return; 5505 5506 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5507 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5508 per_ring = &vdev->stats.tid_tx_stats[ring_id][tid]; 5509 dp_reset_delay_stats(&per_ring->hwtx_delay); 5510 } 5511 } 5512 } 5513 5514 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc) 5515 { 5516 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0); 5517 struct dp_vdev *vdev; 5518 struct dp_vdev **vdev_array = NULL; 5519 int index = 0, num_vdev = 0; 5520 5521 if (!pdev) { 5522 dp_err("pdev is NULL"); 5523 return; 5524 } 5525 5526 vdev_array = 5527 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 5528 if (!vdev_array) 5529 return; 5530 5531 qdf_spin_lock_bh(&pdev->vdev_list_lock); 5532 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 5533 if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) != 5534 QDF_STATUS_SUCCESS) 5535 continue; 5536 vdev_array[index] = vdev; 5537 index = index + 1; 5538 } 5539 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 5540 5541 num_vdev = index; 5542 5543 for (index = 0; index < num_vdev; index++) { 5544 vdev = vdev_array[index]; 5545 dp_vdev_init_tx_delay_stats(vdev); 5546 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 5547 } 5548 qdf_mem_free(vdev_array); 5549 } 5550 #endif 5551 5552 void dp_print_soc_cfg_params(struct dp_soc *soc) 5553 { 5554 struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; 5555 uint8_t index = 0, i = 0; 5556 char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH]; 5557 int num_of_int_contexts; 5558 5559 if (!soc) { 5560 dp_err("Context is null"); 5561 return; 5562 } 5563 5564 soc_cfg_ctx = soc->wlan_cfg_ctx; 5565 5566 if (!soc_cfg_ctx) { 5567 dp_err("Context is null"); 5568 return; 5569 } 5570 5571 num_of_int_contexts = 5572 wlan_cfg_get_num_contexts(soc_cfg_ctx); 5573 5574 DP_PRINT_STATS("No. of interrupt contexts: %u", 5575 soc_cfg_ctx->num_int_ctxts); 5576 DP_PRINT_STATS("Max clients: %u", 5577 soc_cfg_ctx->max_clients); 5578 DP_PRINT_STATS("Max alloc size: %u ", 5579 soc_cfg_ctx->max_alloc_size); 5580 DP_PRINT_STATS("Per pdev tx ring: %u ", 5581 soc_cfg_ctx->per_pdev_tx_ring); 5582 DP_PRINT_STATS("Num tcl data rings: %u ", 5583 soc_cfg_ctx->num_tcl_data_rings); 5584 DP_PRINT_STATS("Per pdev rx ring: %u ", 5585 soc_cfg_ctx->per_pdev_rx_ring); 5586 DP_PRINT_STATS("Per pdev lmac ring: %u ", 5587 soc_cfg_ctx->per_pdev_lmac_ring); 5588 DP_PRINT_STATS("Num of reo dest rings: %u ", 5589 soc_cfg_ctx->num_reo_dest_rings); 5590 DP_PRINT_STATS("Num tx desc pool: %u ", 5591 soc_cfg_ctx->num_tx_desc_pool); 5592 DP_PRINT_STATS("Num tx ext desc pool: %u ", 5593 soc_cfg_ctx->num_tx_ext_desc_pool); 5594 DP_PRINT_STATS("Num tx desc: %u ", 5595 soc_cfg_ctx->num_tx_desc); 5596 DP_PRINT_STATS("Num tx ext desc: %u ", 5597 soc_cfg_ctx->num_tx_ext_desc); 5598 DP_PRINT_STATS("Htt packet type: %u ", 5599 soc_cfg_ctx->htt_packet_type); 5600 DP_PRINT_STATS("Max peer_ids: %u ", 5601 soc_cfg_ctx->max_peer_id); 5602 DP_PRINT_STATS("Tx ring size: %u ", 5603 soc_cfg_ctx->tx_ring_size); 5604 DP_PRINT_STATS("Tx comp ring size: %u ", 5605 soc_cfg_ctx->tx_comp_ring_size); 5606 DP_PRINT_STATS("Tx comp ring size nss: %u ", 5607 soc_cfg_ctx->tx_comp_ring_size_nss); 5608 DP_PRINT_STATS("Int batch threshold tx: %u ", 5609 soc_cfg_ctx->int_batch_threshold_tx); 5610 DP_PRINT_STATS("Int timer threshold tx: %u ", 5611 soc_cfg_ctx->int_timer_threshold_tx); 5612 DP_PRINT_STATS("Int batch threshold rx: %u ", 5613 soc_cfg_ctx->int_batch_threshold_rx); 5614 DP_PRINT_STATS("Int timer threshold rx: %u ", 5615 soc_cfg_ctx->int_timer_threshold_rx); 5616 DP_PRINT_STATS("Int batch threshold other: %u ", 5617 soc_cfg_ctx->int_batch_threshold_other); 5618 DP_PRINT_STATS("Int timer threshold other: %u ", 5619 soc_cfg_ctx->int_timer_threshold_other); 5620 DP_PRINT_STATS("DP NAPI scale factor: %u ", 5621 soc_cfg_ctx->napi_scale_factor); 5622 5623 for (i = 0; i < num_of_int_contexts; i++) { 5624 index += qdf_snprint(&ring_mask[index], 5625 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5626 " %d", 5627 soc_cfg_ctx->int_tx_ring_mask[i]); 5628 } 5629 5630 DP_PRINT_STATS("Tx ring mask (0-%d):%s", 5631 num_of_int_contexts, ring_mask); 5632 5633 index = 0; 5634 for (i = 0; i < num_of_int_contexts; i++) { 5635 index += qdf_snprint(&ring_mask[index], 5636 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5637 " %d", 5638 soc_cfg_ctx->int_rx_ring_mask[i]); 5639 } 5640 5641 DP_PRINT_STATS("Rx ring mask (0-%d):%s", 5642 num_of_int_contexts, ring_mask); 5643 5644 index = 0; 5645 for (i = 0; i < num_of_int_contexts; i++) { 5646 index += qdf_snprint(&ring_mask[index], 5647 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5648 " %d", 5649 soc_cfg_ctx->int_rx_mon_ring_mask[i]); 5650 } 5651 5652 DP_PRINT_STATS("Rx mon ring mask (0-%d):%s", 5653 num_of_int_contexts, ring_mask); 5654 5655 index = 0; 5656 for (i = 0; i < num_of_int_contexts; i++) { 5657 index += qdf_snprint(&ring_mask[index], 5658 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5659 " %d", 5660 soc_cfg_ctx->int_rx_err_ring_mask[i]); 5661 } 5662 5663 DP_PRINT_STATS("Rx err ring mask (0-%d):%s", 5664 num_of_int_contexts, ring_mask); 5665 5666 index = 0; 5667 for (i = 0; i < num_of_int_contexts; i++) { 5668 index += qdf_snprint(&ring_mask[index], 5669 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5670 " %d", 5671 soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]); 5672 } 5673 5674 DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s", 5675 num_of_int_contexts, ring_mask); 5676 5677 index = 0; 5678 for (i = 0; i < num_of_int_contexts; i++) { 5679 index += qdf_snprint(&ring_mask[index], 5680 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5681 " %d", 5682 soc_cfg_ctx->int_reo_status_ring_mask[i]); 5683 } 5684 5685 DP_PRINT_STATS("Reo ring mask (0-%d):%s", 5686 num_of_int_contexts, ring_mask); 5687 5688 index = 0; 5689 for (i = 0; i < num_of_int_contexts; i++) { 5690 index += qdf_snprint(&ring_mask[index], 5691 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5692 " %d", 5693 soc_cfg_ctx->int_rxdma2host_ring_mask[i]); 5694 } 5695 5696 DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s", 5697 num_of_int_contexts, ring_mask); 5698 5699 index = 0; 5700 for (i = 0; i < num_of_int_contexts; i++) { 5701 index += qdf_snprint(&ring_mask[index], 5702 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5703 " %d", 5704 soc_cfg_ctx->int_host2rxdma_ring_mask[i]); 5705 } 5706 5707 DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s", 5708 num_of_int_contexts, ring_mask); 5709 5710 DP_PRINT_STATS("Rx hash: %u ", 5711 soc_cfg_ctx->rx_hash); 5712 DP_PRINT_STATS("Tso enabled: %u ", 5713 soc_cfg_ctx->tso_enabled); 5714 DP_PRINT_STATS("Lro enabled: %u ", 5715 soc_cfg_ctx->lro_enabled); 5716 DP_PRINT_STATS("Sg enabled: %u ", 5717 soc_cfg_ctx->sg_enabled); 5718 DP_PRINT_STATS("Gro enabled: %u ", 5719 soc_cfg_ctx->gro_enabled); 5720 DP_PRINT_STATS("TC based dynamic GRO: %u ", 5721 soc_cfg_ctx->tc_based_dynamic_gro); 5722 DP_PRINT_STATS("TC ingress prio: %u ", 5723 soc_cfg_ctx->tc_ingress_prio); 5724 DP_PRINT_STATS("rawmode enabled: %u ", 5725 soc_cfg_ctx->rawmode_enabled); 5726 DP_PRINT_STATS("peer flow ctrl enabled: %u ", 5727 soc_cfg_ctx->peer_flow_ctrl_enabled); 5728 DP_PRINT_STATS("napi enabled: %u ", 5729 soc_cfg_ctx->napi_enabled); 5730 DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ", 5731 soc_cfg_ctx->p2p_tcp_udp_checksumoffload); 5732 DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ", 5733 soc_cfg_ctx->nan_tcp_udp_checksumoffload); 5734 DP_PRINT_STATS("Tcp Udp checksum offload: %u ", 5735 soc_cfg_ctx->tcp_udp_checksumoffload); 5736 DP_PRINT_STATS("Defrag timeout check: %u ", 5737 soc_cfg_ctx->defrag_timeout_check); 5738 DP_PRINT_STATS("Rx defrag min timeout: %u ", 5739 soc_cfg_ctx->rx_defrag_min_timeout); 5740 DP_PRINT_STATS("WBM release ring: %u ", 5741 soc_cfg_ctx->wbm_release_ring); 5742 DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ", 5743 soc_cfg_ctx->tcl_cmd_credit_ring); 5744 DP_PRINT_STATS("TCL Status ring: %u ", 5745 soc_cfg_ctx->tcl_status_ring); 5746 DP_PRINT_STATS("REO Destination ring: %u ", 5747 soc_cfg_ctx->reo_dst_ring_size); 5748 DP_PRINT_STATS("REO Reinject ring: %u ", 5749 soc_cfg_ctx->reo_reinject_ring); 5750 DP_PRINT_STATS("RX release ring: %u ", 5751 soc_cfg_ctx->rx_release_ring); 5752 DP_PRINT_STATS("REO Exception ring: %u ", 5753 soc_cfg_ctx->reo_exception_ring); 5754 DP_PRINT_STATS("REO CMD ring: %u ", 5755 soc_cfg_ctx->reo_cmd_ring); 5756 DP_PRINT_STATS("REO STATUS ring: %u ", 5757 soc_cfg_ctx->reo_status_ring); 5758 DP_PRINT_STATS("RXDMA refill ring: %u ", 5759 soc_cfg_ctx->rxdma_refill_ring); 5760 DP_PRINT_STATS("TX_desc limit_0: %u ", 5761 soc_cfg_ctx->tx_desc_limit_0); 5762 DP_PRINT_STATS("TX_desc limit_1: %u ", 5763 soc_cfg_ctx->tx_desc_limit_1); 5764 DP_PRINT_STATS("TX_desc limit_2: %u ", 5765 soc_cfg_ctx->tx_desc_limit_2); 5766 DP_PRINT_STATS("TX device limit: %u ", 5767 soc_cfg_ctx->tx_device_limit); 5768 DP_PRINT_STATS("TX sw internode queue: %u ", 5769 soc_cfg_ctx->tx_sw_internode_queue); 5770 DP_PRINT_STATS("RXDMA err dst ring: %u ", 5771 soc_cfg_ctx->rxdma_err_dst_ring); 5772 DP_PRINT_STATS("RX Flow Tag Enabled: %u ", 5773 soc_cfg_ctx->is_rx_flow_tag_enabled); 5774 DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ", 5775 soc_cfg_ctx->rx_flow_search_table_size); 5776 DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ", 5777 soc_cfg_ctx->is_rx_flow_search_table_per_pdev); 5778 DP_PRINT_STATS("Rx desc pool size: %u ", 5779 soc_cfg_ctx->rx_sw_desc_num); 5780 } 5781 5782 void 5783 dp_print_pdev_cfg_params(struct dp_pdev *pdev) 5784 { 5785 struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx; 5786 5787 if (!pdev) { 5788 dp_err("Context is null"); 5789 return; 5790 } 5791 5792 pdev_cfg_ctx = pdev->wlan_cfg_ctx; 5793 5794 if (!pdev_cfg_ctx) { 5795 dp_err("Context is null"); 5796 return; 5797 } 5798 5799 DP_PRINT_STATS("Rx dma buf ring size: %d ", 5800 pdev_cfg_ctx->rx_dma_buf_ring_size); 5801 DP_PRINT_STATS("DMA Mon buf ring size: %d ", 5802 pdev_cfg_ctx->dma_mon_buf_ring_size); 5803 DP_PRINT_STATS("DMA Mon dest ring size: %d ", 5804 pdev_cfg_ctx->dma_rx_mon_dest_ring_size); 5805 DP_PRINT_STATS("DMA Mon status ring size: %d ", 5806 pdev_cfg_ctx->dma_mon_status_ring_size); 5807 DP_PRINT_STATS("Rxdma monitor desc ring: %d", 5808 pdev_cfg_ctx->rxdma_monitor_desc_ring); 5809 DP_PRINT_STATS("Num mac rings: %d ", 5810 pdev_cfg_ctx->num_mac_rings); 5811 } 5812 5813 /** 5814 * dp_print_ring_stat_from_hal(): Print hal level ring stats 5815 * @soc: DP_SOC handle 5816 * @srng: DP_SRNG handle 5817 * @ring_name: SRNG name 5818 * @ring_type: srng src/dst ring 5819 * 5820 * Return: void 5821 */ 5822 static void 5823 dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, 5824 enum hal_ring_type ring_type) 5825 { 5826 uint32_t tailp; 5827 uint32_t headp; 5828 int32_t hw_headp = -1; 5829 int32_t hw_tailp = -1; 5830 uint32_t ring_usage; 5831 const char *ring_name; 5832 struct hal_soc *hal_soc; 5833 5834 if (soc && srng && srng->hal_srng) { 5835 hal_soc = (struct hal_soc *)soc->hal_soc; 5836 ring_name = dp_srng_get_str_from_hal_ring_type(ring_type); 5837 hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp); 5838 ring_usage = hal_get_ring_usage(srng->hal_srng, 5839 ring_type, &headp, &tailp); 5840 5841 DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u", 5842 ring_name, headp, tailp, ring_usage); 5843 5844 hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp, 5845 &hw_tailp, ring_type); 5846 ring_usage = 0; 5847 if (hw_headp >= 0 && tailp >= 0) 5848 ring_usage = 5849 hal_get_ring_usage( 5850 srng->hal_srng, ring_type, 5851 &hw_headp, &hw_tailp); 5852 DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u", 5853 ring_name, hw_headp, hw_tailp, ring_usage); 5854 } 5855 } 5856 5857 #ifdef FEATURE_TSO_STATS 5858 /** 5859 * dp_print_tso_seg_stats - tso segment stats 5860 * @pdev: pdev handle 5861 * @id: tso packet id 5862 * 5863 * Return: None 5864 */ 5865 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5866 { 5867 uint8_t num_seg; 5868 uint32_t segid; 5869 5870 /* TSO LEVEL 2 - SEGMENT INFO */ 5871 num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg; 5872 for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) { 5873 DP_PRINT_STATS( 5874 "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u", 5875 segid, 5876 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5877 .tso_seg[segid].num_frags, 5878 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5879 .tso_seg[segid].total_len, 5880 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5881 .tso_seg[segid].tso_flags.tcp_seq_num, 5882 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5883 .tso_seg[segid].tso_flags.ip_id); 5884 DP_PRINT_STATS( 5885 "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u", 5886 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5887 .tso_seg[segid].tso_flags.fin, 5888 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5889 .tso_seg[segid].tso_flags.syn, 5890 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5891 .tso_seg[segid].tso_flags.rst, 5892 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5893 .tso_seg[segid].tso_flags.psh, 5894 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5895 .tso_seg[segid].tso_flags.ack, 5896 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5897 .tso_seg[segid].tso_flags.urg, 5898 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5899 .tso_seg[segid].tso_flags.ece, 5900 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5901 .tso_seg[segid].tso_flags.cwr, 5902 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5903 .tso_seg[segid].tso_flags.ns); 5904 } 5905 } 5906 #else 5907 static inline 5908 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5909 { 5910 } 5911 #endif /* FEATURE_TSO_STATS */ 5912 5913 /** 5914 * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based 5915 * on target 5916 * @pdev: physical device handle 5917 * @mac_id: mac id 5918 * 5919 * Return: void 5920 */ 5921 static inline 5922 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) 5923 { 5924 if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { 5925 dp_print_ring_stat_from_hal(pdev->soc, 5926 &pdev->soc->rxdma_mon_buf_ring[mac_id], 5927 RXDMA_MONITOR_BUF); 5928 dp_print_ring_stat_from_hal(pdev->soc, 5929 &pdev->soc->rxdma_mon_dst_ring[mac_id], 5930 RXDMA_MONITOR_DST); 5931 dp_print_ring_stat_from_hal(pdev->soc, 5932 &pdev->soc->rxdma_mon_desc_ring[mac_id], 5933 RXDMA_MONITOR_DESC); 5934 } 5935 5936 dp_print_ring_stat_from_hal(pdev->soc, 5937 &pdev->soc->rxdma_mon_status_ring[mac_id], 5938 RXDMA_MONITOR_STATUS); 5939 } 5940 5941 void 5942 dp_print_ring_stats(struct dp_pdev *pdev) 5943 { 5944 struct dp_soc *soc = pdev->soc; 5945 uint32_t i; 5946 int mac_id; 5947 int lmac_id; 5948 5949 if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS)) 5950 return; 5951 5952 dp_print_ring_stat_from_hal(pdev->soc, 5953 &pdev->soc->wbm_idle_link_ring, 5954 WBM_IDLE_LINK); 5955 dp_print_ring_stat_from_hal(pdev->soc, 5956 &pdev->soc->reo_exception_ring, 5957 REO_EXCEPTION); 5958 dp_print_ring_stat_from_hal(pdev->soc, 5959 &pdev->soc->reo_reinject_ring, 5960 REO_REINJECT); 5961 dp_print_ring_stat_from_hal(pdev->soc, 5962 &pdev->soc->reo_cmd_ring, 5963 REO_CMD); 5964 dp_print_ring_stat_from_hal(pdev->soc, 5965 &pdev->soc->reo_status_ring, 5966 REO_STATUS); 5967 dp_print_ring_stat_from_hal(pdev->soc, 5968 &pdev->soc->rx_rel_ring, 5969 WBM2SW_RELEASE); 5970 dp_print_ring_stat_from_hal(pdev->soc, 5971 &pdev->soc->tcl_cmd_credit_ring, 5972 TCL_CMD_CREDIT); 5973 dp_print_ring_stat_from_hal(pdev->soc, 5974 &pdev->soc->tcl_status_ring, 5975 TCL_STATUS); 5976 dp_print_ring_stat_from_hal(pdev->soc, 5977 &pdev->soc->wbm_desc_rel_ring, 5978 SW2WBM_RELEASE); 5979 for (i = 0; i < MAX_REO_DEST_RINGS; i++) 5980 dp_print_ring_stat_from_hal(pdev->soc, 5981 &pdev->soc->reo_dest_ring[i], 5982 REO_DST); 5983 5984 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 5985 dp_print_ring_stat_from_hal(pdev->soc, 5986 &pdev->soc->tcl_data_ring[i], 5987 TCL_DATA); 5988 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 5989 dp_print_ring_stat_from_hal(pdev->soc, 5990 &pdev->soc->tx_comp_ring[i], 5991 WBM2SW_RELEASE); 5992 5993 if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) { 5994 for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) { 5995 dp_print_ring_stat_from_hal 5996 (pdev->soc, &pdev->soc->rx_refill_buf_ring[i], 5997 RXDMA_BUF); 5998 } 5999 } else { 6000 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0, 6001 pdev->pdev_id); 6002 dp_print_ring_stat_from_hal 6003 (pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id], 6004 RXDMA_BUF); 6005 } 6006 6007 dp_print_ring_stat_from_hal(pdev->soc, 6008 &pdev->rx_refill_buf_ring2, 6009 RXDMA_BUF); 6010 6011 for (i = 0; i < MAX_RX_MAC_RINGS; i++) 6012 dp_print_ring_stat_from_hal(pdev->soc, 6013 &pdev->rx_mac_buf_ring[i], 6014 RXDMA_BUF); 6015 6016 for (mac_id = 0; 6017 mac_id < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev; 6018 mac_id++) { 6019 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 6020 mac_id, pdev->pdev_id); 6021 6022 dp_print_mon_ring_stat_from_hal(pdev, lmac_id); 6023 } 6024 6025 for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) { 6026 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 6027 i, pdev->pdev_id); 6028 6029 dp_print_ring_stat_from_hal(pdev->soc, 6030 &pdev->soc->rxdma_err_dst_ring 6031 [lmac_id], 6032 RXDMA_DST); 6033 } 6034 hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS); 6035 } 6036 6037 /** 6038 * dp_print_common_rates_info(): Print common rate for tx or rx 6039 * @pkt_type_array: rate type array contains rate info 6040 * 6041 * Return:void 6042 */ 6043 static inline void 6044 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array) 6045 { 6046 uint8_t mcs, pkt_type; 6047 6048 DP_PRINT_STATS("MSDU Count"); 6049 for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) { 6050 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6051 if (!cdp_rate_string[pkt_type][mcs].valid) 6052 continue; 6053 6054 DP_PRINT_STATS(" %s = %d", 6055 cdp_rate_string[pkt_type][mcs].mcs_type, 6056 pkt_type_array[pkt_type].mcs_count[mcs]); 6057 } 6058 6059 DP_PRINT_STATS("\n"); 6060 } 6061 } 6062 6063 /** 6064 * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx 6065 * @pkt_type_array: rate type array contains rate info 6066 * @pkt_type: packet type 6067 * 6068 * Return:void 6069 */ 6070 #ifdef WLAN_FEATURE_11BE 6071 static inline void 6072 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array, 6073 enum cdp_packet_type pkt_type) 6074 { 6075 uint8_t mcs; 6076 6077 DP_PRINT_STATS("PPDU Count"); 6078 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6079 if (pkt_type == DOT11_AX) { 6080 if (!dp_ppdu_rate_string[0][mcs].valid) 6081 continue; 6082 6083 DP_PRINT_STATS(" %s = %d", 6084 dp_ppdu_rate_string[0][mcs].mcs_type, 6085 pkt_type_array->mcs_count[mcs]); 6086 } else if (pkt_type == DOT11_BE) { 6087 if (!dp_ppdu_rate_string[1][mcs].valid) 6088 continue; 6089 6090 DP_PRINT_STATS(" %s = %d", 6091 dp_ppdu_rate_string[1][mcs].mcs_type, 6092 pkt_type_array->mcs_count[mcs]); 6093 } 6094 } 6095 6096 DP_PRINT_STATS("\n"); 6097 } 6098 #else 6099 static inline void 6100 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array, 6101 enum cdp_packet_type pkt_type) 6102 { 6103 uint8_t mcs; 6104 6105 DP_PRINT_STATS("PPDU Count"); 6106 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6107 if (!dp_ppdu_rate_string[0][mcs].valid) 6108 continue; 6109 6110 DP_PRINT_STATS(" %s = %d", 6111 dp_ppdu_rate_string[0][mcs].mcs_type, 6112 pkt_type_array->mcs_count[mcs]); 6113 } 6114 6115 DP_PRINT_STATS("\n"); 6116 } 6117 #endif 6118 6119 /** 6120 * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx 6121 * @pkt_type_array: rate type array contains rate info 6122 * 6123 * Return:void 6124 */ 6125 #ifdef WLAN_FEATURE_11BE 6126 static inline void 6127 dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array) 6128 { 6129 uint8_t mcs, pkt_type; 6130 6131 DP_PRINT_STATS("PPDU Count"); 6132 for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) { 6133 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6134 if (!dp_mu_be_rate_string[pkt_type][mcs].valid) 6135 continue; 6136 6137 DP_PRINT_STATS(" %s = %d", 6138 dp_mu_be_rate_string[pkt_type][mcs].mcs_type, 6139 pkt_type_array[pkt_type].mcs_count[mcs]); 6140 } 6141 6142 DP_PRINT_STATS("\n"); 6143 } 6144 } 6145 #endif 6146 6147 static inline void 6148 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu) 6149 { 6150 uint8_t mcs, pkt_type; 6151 6152 DP_PRINT_STATS("PPDU Count"); 6153 for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) { 6154 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6155 if (!dp_mu_rate_string[pkt_type][mcs].valid) 6156 continue; 6157 6158 DP_PRINT_STATS(" %s = %d", 6159 dp_mu_rate_string[pkt_type][mcs].mcs_type, 6160 rx_mu[pkt_type].ppdu.mcs_count[mcs]); 6161 } 6162 6163 DP_PRINT_STATS("\n"); 6164 } 6165 } 6166 6167 void dp_print_rx_rates(struct dp_vdev *vdev) 6168 { 6169 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 6170 uint8_t i; 6171 uint8_t index = 0; 6172 char nss[DP_NSS_LENGTH]; 6173 6174 DP_PRINT_STATS("Rx Rate Info:\n"); 6175 dp_print_common_rates_info(pdev->stats.rx.pkt_type); 6176 6177 index = 0; 6178 for (i = 0; i < SS_COUNT; i++) { 6179 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 6180 " %d", pdev->stats.rx.nss[i]); 6181 } 6182 DP_PRINT_STATS("NSS(1-8) = %s", 6183 nss); 6184 6185 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6186 pdev->stats.rx.sgi_count[0], 6187 pdev->stats.rx.sgi_count[1], 6188 pdev->stats.rx.sgi_count[2], 6189 pdev->stats.rx.sgi_count[3]); 6190 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 6191 pdev->stats.rx.bw[0], pdev->stats.rx.bw[1], 6192 pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]); 6193 DP_PRINT_STATS("Reception Type =" 6194 "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d", 6195 pdev->stats.rx.reception_type[0], 6196 pdev->stats.rx.reception_type[1], 6197 pdev->stats.rx.reception_type[2], 6198 pdev->stats.rx.reception_type[3]); 6199 DP_PRINT_STATS("Aggregation:\n"); 6200 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 6201 pdev->stats.rx.ampdu_cnt); 6202 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 6203 pdev->stats.rx.non_ampdu_cnt); 6204 DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d", 6205 pdev->stats.rx.amsdu_cnt); 6206 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d", 6207 pdev->stats.rx.non_amsdu_cnt); 6208 } 6209 6210 void dp_print_tx_rates(struct dp_vdev *vdev) 6211 { 6212 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 6213 6214 DP_PRINT_STATS("Tx Rate Info:\n"); 6215 dp_print_common_rates_info(pdev->stats.tx.pkt_type); 6216 6217 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6218 pdev->stats.tx.sgi_count[0], 6219 pdev->stats.tx.sgi_count[1], 6220 pdev->stats.tx.sgi_count[2], 6221 pdev->stats.tx.sgi_count[3]); 6222 6223 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 6224 pdev->stats.tx.bw[0], pdev->stats.tx.bw[1], 6225 pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]); 6226 6227 DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma); 6228 DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc); 6229 DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc); 6230 DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries); 6231 DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi); 6232 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d", 6233 pdev->stats.tx.pream_punct_cnt); 6234 6235 DP_PRINT_STATS("Aggregation:\n"); 6236 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 6237 pdev->stats.tx.ampdu_cnt); 6238 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 6239 pdev->stats.tx.non_ampdu_cnt); 6240 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 6241 pdev->stats.tx.amsdu_cnt); 6242 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 6243 pdev->stats.tx.non_amsdu_cnt); 6244 } 6245 6246 /** 6247 * dp_print_nss(): Print nss count 6248 * @nss: printable nss count array 6249 * @pnss: nss count array 6250 * @ss_count: number of nss 6251 * 6252 * Return:void 6253 */ 6254 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count) 6255 { 6256 uint32_t index; 6257 uint8_t i; 6258 6259 index = 0; 6260 for (i = 0; i < ss_count; i++) { 6261 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 6262 " %d", *(pnss + i)); 6263 } 6264 } 6265 6266 /** 6267 * dp_print_jitter_stats(): Print per-tid jitter stats 6268 * @peer: DP peer object 6269 * @pdev: DP pdev object 6270 * 6271 * Return: void 6272 */ 6273 #ifdef WLAN_PEER_JITTER 6274 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 6275 { 6276 uint8_t tid = 0; 6277 6278 if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) 6279 return; 6280 6281 if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) 6282 return; 6283 6284 DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n"); 6285 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 6286 struct cdp_peer_tid_stats *rx_tid = 6287 &peer->txrx_peer->jitter_stats[tid]; 6288 6289 DP_PRINT_STATS("Node tid = %d\n" 6290 "Average Jiiter : %u (us)\n" 6291 "Average Delay : %u (us)\n" 6292 "Total Average error count : %llu\n" 6293 "Total Success Count : %llu\n" 6294 "Total Drop : %llu\n", 6295 tid, 6296 rx_tid->tx_avg_jitter, 6297 rx_tid->tx_avg_delay, 6298 rx_tid->tx_avg_err, 6299 rx_tid->tx_total_success, 6300 rx_tid->tx_drop); 6301 } 6302 } 6303 #else 6304 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 6305 { 6306 } 6307 #endif /* WLAN_PEER_JITTER */ 6308 6309 #ifdef QCA_PEER_EXT_STATS 6310 /* 6311 * dp_print_hist_stats() : Print delay histogram 6312 * @hstats: Histogram stats 6313 * 6314 * Return: void 6315 */ 6316 static void dp_print_hist_stats(struct cdp_hist_stats *hstats, 6317 enum cdp_hist_types hist_type) 6318 { 6319 uint8_t index = 0; 6320 uint64_t count = 0; 6321 bool hist_delay_data = false; 6322 6323 for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) { 6324 count = hstats->hist.freq[index]; 6325 if (!count) 6326 continue; 6327 hist_delay_data = true; 6328 if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY) 6329 DP_PRINT_STATS("%s: Packets = %llu", 6330 dp_vow_str_sw_enq_delay(index), 6331 count); 6332 else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY) 6333 DP_PRINT_STATS("%s: Packets = %llu", 6334 dp_vow_str_fw_to_hw_delay(index), 6335 count); 6336 else if (hist_type == CDP_HIST_TYPE_REAP_STACK) 6337 DP_PRINT_STATS("%s: Packets = %llu", 6338 dp_vow_str_intfrm_delay(index), 6339 count); 6340 } 6341 6342 /* 6343 * If none of the buckets have any packets, 6344 * there is no need to display the stats. 6345 */ 6346 if (hist_delay_data) { 6347 DP_PRINT_STATS("Min = %u", hstats->min); 6348 DP_PRINT_STATS("Max = %u", hstats->max); 6349 DP_PRINT_STATS("Avg = %u\n", hstats->avg); 6350 } 6351 } 6352 6353 /* 6354 * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the 6355 * hist stats. 6356 * @soc: DP SoC handle 6357 * @stats: cdp_delay_tid stats 6358 * @dst_hstats: Destination histogram to copy tid stats 6359 * @tid: TID value 6360 * 6361 * Return: void 6362 */ 6363 static void dp_accumulate_delay_tid_stats(struct dp_soc *soc, 6364 struct cdp_delay_tid_stats stats[] 6365 [CDP_MAX_TXRX_CTX], 6366 struct cdp_hist_stats *dst_hstats, 6367 uint8_t tid, uint32_t mode) 6368 { 6369 uint8_t ring_id; 6370 6371 if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) { 6372 struct cdp_delay_tid_stats *dstats = 6373 &stats[tid][0]; 6374 struct cdp_hist_stats *src_hstats = NULL; 6375 6376 switch (mode) { 6377 case CDP_HIST_TYPE_SW_ENQEUE_DELAY: 6378 src_hstats = &dstats->tx_delay.tx_swq_delay; 6379 break; 6380 case CDP_HIST_TYPE_HW_COMP_DELAY: 6381 src_hstats = &dstats->tx_delay.hwtx_delay; 6382 break; 6383 case CDP_HIST_TYPE_REAP_STACK: 6384 src_hstats = &dstats->rx_delay.to_stack_delay; 6385 break; 6386 default: 6387 break; 6388 } 6389 6390 if (src_hstats) 6391 dp_copy_hist_stats(src_hstats, dst_hstats); 6392 6393 return; 6394 } 6395 6396 for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) { 6397 struct cdp_delay_tid_stats *dstats = 6398 &stats[tid][ring_id]; 6399 struct cdp_hist_stats *src_hstats = NULL; 6400 6401 switch (mode) { 6402 case CDP_HIST_TYPE_SW_ENQEUE_DELAY: 6403 src_hstats = &dstats->tx_delay.tx_swq_delay; 6404 break; 6405 case CDP_HIST_TYPE_HW_COMP_DELAY: 6406 src_hstats = &dstats->tx_delay.hwtx_delay; 6407 break; 6408 case CDP_HIST_TYPE_REAP_STACK: 6409 src_hstats = &dstats->rx_delay.to_stack_delay; 6410 break; 6411 default: 6412 break; 6413 } 6414 6415 if (src_hstats) 6416 dp_accumulate_hist_stats(src_hstats, dst_hstats); 6417 } 6418 } 6419 6420 /* 6421 * dp_peer_print_delay_stats(): Print peer delay stats 6422 * @soc: DP SoC handle 6423 * @peer: DP peer handle 6424 * 6425 * Return: void 6426 */ 6427 void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev, 6428 struct dp_peer *peer) 6429 { 6430 struct dp_peer_delay_stats *delay_stats; 6431 struct dp_soc *soc = NULL; 6432 struct cdp_hist_stats hist_stats; 6433 uint8_t tid; 6434 6435 if (!peer || !peer->txrx_peer) 6436 return; 6437 6438 if (!pdev || !pdev->soc) 6439 return; 6440 6441 soc = pdev->soc; 6442 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 6443 return; 6444 6445 delay_stats = peer->txrx_peer->delay_stats; 6446 if (!delay_stats) 6447 return; 6448 6449 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 6450 DP_PRINT_STATS("----TID: %d----", tid); 6451 DP_PRINT_STATS("Software Enqueue Delay:"); 6452 dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY); 6453 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 6454 &hist_stats, tid, 6455 CDP_HIST_TYPE_SW_ENQEUE_DELAY); 6456 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY); 6457 6458 DP_PRINT_STATS("Hardware Transmission Delay:"); 6459 dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY); 6460 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 6461 &hist_stats, tid, 6462 CDP_HIST_TYPE_HW_COMP_DELAY); 6463 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY); 6464 } 6465 } 6466 6467 /* 6468 * dp_peer_print_rx_delay_stats(): Print peer delay stats 6469 * @soc: DP SoC handle 6470 * @peer: DP peer handle 6471 * 6472 * Return: void 6473 */ 6474 void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev, 6475 struct dp_peer *peer) 6476 { 6477 struct dp_peer_delay_stats *delay_stats; 6478 struct dp_soc *soc = NULL; 6479 struct cdp_hist_stats hist_stats; 6480 uint8_t tid; 6481 6482 if (!peer || !peer->txrx_peer) 6483 return; 6484 6485 if (!pdev || !pdev->soc) 6486 return; 6487 6488 soc = pdev->soc; 6489 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 6490 return; 6491 6492 delay_stats = peer->txrx_peer->delay_stats; 6493 if (!delay_stats) 6494 return; 6495 6496 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 6497 DP_PRINT_STATS("----TID: %d----", tid); 6498 DP_PRINT_STATS("Rx Reap2stack Deliver Delay:"); 6499 dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK); 6500 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 6501 &hist_stats, tid, 6502 CDP_HIST_TYPE_REAP_STACK); 6503 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK); 6504 } 6505 } 6506 6507 #else 6508 static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev, 6509 struct dp_peer *peer) 6510 { 6511 } 6512 6513 static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev, 6514 struct dp_peer *peer) 6515 { 6516 } 6517 #endif 6518 6519 #ifdef WLAN_FEATURE_11BE 6520 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, 6521 enum peer_stats_type stats_type) 6522 { 6523 uint8_t i; 6524 6525 if (stats_type == PEER_TX_STATS) { 6526 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n", 6527 peer_stats->tx.bw[CMN_BW_20MHZ], 6528 peer_stats->tx.bw[CMN_BW_40MHZ], 6529 peer_stats->tx.bw[CMN_BW_80MHZ], 6530 peer_stats->tx.bw[CMN_BW_160MHZ], 6531 peer_stats->tx.bw[CMN_BW_320MHZ]); 6532 DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", 6533 peer_stats->tx.punc_bw[NO_PUNCTURE], 6534 peer_stats->tx.punc_bw[PUNCTURED_20MHZ], 6535 peer_stats->tx.punc_bw[PUNCTURED_40MHZ], 6536 peer_stats->tx.punc_bw[PUNCTURED_80MHZ], 6537 peer_stats->tx.punc_bw[PUNCTURED_120MHZ]); 6538 DP_PRINT_STATS("RU Locations"); 6539 for (i = 0; i < RU_INDEX_MAX; i++) 6540 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6541 cdp_ru_string[i].ru_type, 6542 peer_stats->tx.ru_loc[i].num_msdu, 6543 peer_stats->tx.ru_loc[i].num_mpdu, 6544 peer_stats->tx.ru_loc[i].mpdu_tried); 6545 dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt, 6546 DOT11_BE); 6547 dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]); 6548 6549 } else { 6550 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d", 6551 peer_stats->rx.bw[CMN_BW_20MHZ], 6552 peer_stats->rx.bw[CMN_BW_40MHZ], 6553 peer_stats->rx.bw[CMN_BW_80MHZ], 6554 peer_stats->rx.bw[CMN_BW_160MHZ], 6555 peer_stats->rx.bw[CMN_BW_320MHZ]); 6556 DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", 6557 peer_stats->rx.punc_bw[NO_PUNCTURE], 6558 peer_stats->rx.punc_bw[PUNCTURED_20MHZ], 6559 peer_stats->rx.punc_bw[PUNCTURED_40MHZ], 6560 peer_stats->rx.punc_bw[PUNCTURED_80MHZ], 6561 peer_stats->rx.punc_bw[PUNCTURED_120MHZ]); 6562 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt, 6563 DOT11_BE); 6564 dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]); 6565 } 6566 } 6567 #else 6568 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, 6569 enum peer_stats_type stats_type) 6570 { 6571 } 6572 #endif 6573 6574 void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats, 6575 enum peer_stats_type stats_type) 6576 { 6577 if (stats_type == PEER_TX_STATS) { 6578 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", 6579 peer_stats->tx.bw[CMN_BW_20MHZ], 6580 peer_stats->tx.bw[CMN_BW_40MHZ], 6581 peer_stats->tx.bw[CMN_BW_80MHZ], 6582 peer_stats->tx.bw[CMN_BW_160MHZ]); 6583 DP_PRINT_STATS("RU Locations"); 6584 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6585 cdp_ru_string[RU_26_INDEX].ru_type, 6586 peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu, 6587 peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu, 6588 peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried); 6589 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6590 cdp_ru_string[RU_52_INDEX].ru_type, 6591 peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu, 6592 peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu, 6593 peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried); 6594 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6595 cdp_ru_string[RU_106_INDEX].ru_type, 6596 peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu, 6597 peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu, 6598 peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried); 6599 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6600 cdp_ru_string[RU_242_INDEX].ru_type, 6601 peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu, 6602 peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu, 6603 peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried); 6604 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6605 cdp_ru_string[RU_484_INDEX].ru_type, 6606 peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu, 6607 peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu, 6608 peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried); 6609 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6610 cdp_ru_string[RU_996_INDEX].ru_type, 6611 peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu, 6612 peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu, 6613 peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried); 6614 } else { 6615 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", 6616 peer_stats->rx.bw[CMN_BW_20MHZ], 6617 peer_stats->rx.bw[CMN_BW_40MHZ], 6618 peer_stats->rx.bw[CMN_BW_80MHZ], 6619 peer_stats->rx.bw[CMN_BW_160MHZ]); 6620 } 6621 } 6622 6623 #ifdef REO_SHARED_QREF_TABLE_EN 6624 static void dp_peer_print_reo_qref_table(struct dp_peer *peer) 6625 { 6626 struct hal_soc *hal; 6627 struct dp_peer *mld_peer; 6628 int i; 6629 uint64_t *reo_qref_addr; 6630 uint32_t peer_idx; 6631 6632 hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc; 6633 6634 if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal)) 6635 return; 6636 6637 peer_idx = (peer->peer_id * DP_MAX_TIDS); 6638 6639 if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) || 6640 (!hal->reo_qref.mlo_reo_qref_table_vaddr)) { 6641 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 6642 FL("REO shared table not allocated")); 6643 return; 6644 } 6645 6646 reo_qref_addr = &hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx]; 6647 mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer); 6648 if (mld_peer) { 6649 peer = mld_peer; 6650 hal = (struct hal_soc *) 6651 peer->vdev->pdev->soc->hal_soc; 6652 peer_idx = (mld_peer->peer_id - HAL_ML_PEER_ID_START) * 6653 DP_MAX_TIDS; 6654 reo_qref_addr = &hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx]; 6655 } 6656 DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id); 6657 6658 for (i = 0; i < DP_MAX_TIDS; i++) 6659 DP_PRINT_STATS(" Tid [%d] :%llx", i, reo_qref_addr[i]); 6660 } 6661 #else 6662 static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer) 6663 { 6664 } 6665 #endif 6666 6667 void dp_print_peer_stats(struct dp_peer *peer, 6668 struct cdp_peer_stats *peer_stats) 6669 { 6670 uint8_t i; 6671 uint32_t index; 6672 uint32_t j; 6673 char nss[DP_NSS_LENGTH]; 6674 char mu_group_id[DP_MU_GROUP_LENGTH]; 6675 struct dp_pdev *pdev; 6676 uint32_t *pnss; 6677 enum cdp_mu_packet_type rx_mu_type; 6678 struct cdp_rx_mu *rx_mu; 6679 6680 pdev = peer->vdev->pdev; 6681 6682 DP_PRINT_STATS("Node Tx Stats:\n"); 6683 DP_PRINT_STATS("Total Packet Completions = %d", 6684 peer_stats->tx.comp_pkt.num); 6685 DP_PRINT_STATS("Total Bytes Completions = %llu", 6686 peer_stats->tx.comp_pkt.bytes); 6687 DP_PRINT_STATS("Success Packets = %d", 6688 peer_stats->tx.tx_success.num); 6689 DP_PRINT_STATS("Success Bytes = %llu", 6690 peer_stats->tx.tx_success.bytes); 6691 DP_PRINT_STATS("Success Packets in TWT Session = %d", 6692 peer_stats->tx.tx_success_twt.num); 6693 DP_PRINT_STATS("Success Bytes in TWT Session = %llu", 6694 peer_stats->tx.tx_success_twt.bytes); 6695 DP_PRINT_STATS("Unicast Success Packets = %d", 6696 peer_stats->tx.ucast.num); 6697 DP_PRINT_STATS("Unicast Success Bytes = %llu", 6698 peer_stats->tx.ucast.bytes); 6699 DP_PRINT_STATS("Multicast Success Packets = %d", 6700 peer_stats->tx.mcast.num); 6701 DP_PRINT_STATS("Multicast Success Bytes = %llu", 6702 peer_stats->tx.mcast.bytes); 6703 DP_PRINT_STATS("Broadcast Success Packets = %d", 6704 peer_stats->tx.bcast.num); 6705 DP_PRINT_STATS("Broadcast Success Bytes = %llu", 6706 peer_stats->tx.bcast.bytes); 6707 DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d", 6708 peer_stats->tx.retry_count); 6709 DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d", 6710 peer_stats->tx.multiple_retry_count); 6711 DP_PRINT_STATS("Packets Failed = %d", 6712 peer_stats->tx.tx_failed); 6713 DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d", 6714 peer_stats->tx.failed_retry_count); 6715 DP_PRINT_STATS("Packets In OFDMA = %d", 6716 peer_stats->tx.ofdma); 6717 DP_PRINT_STATS("Packets In STBC = %d", 6718 peer_stats->tx.stbc); 6719 DP_PRINT_STATS("Packets In LDPC = %d", 6720 peer_stats->tx.ldpc); 6721 DP_PRINT_STATS("Packet Retries = %d", 6722 peer_stats->tx.retries); 6723 DP_PRINT_STATS("MSDU's Part of AMSDU = %d", 6724 peer_stats->tx.amsdu_cnt); 6725 DP_PRINT_STATS("Msdu's As Part of Ampdu = %d", 6726 peer_stats->tx.non_ampdu_cnt); 6727 DP_PRINT_STATS("Msdu's As Ampdu = %d", 6728 peer_stats->tx.ampdu_cnt); 6729 DP_PRINT_STATS("Last Packet RSSI = %d", 6730 peer_stats->tx.last_ack_rssi); 6731 DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u", 6732 peer_stats->tx.dropped.fw_rem.num); 6733 DP_PRINT_STATS("Release source not TQM = %u", 6734 peer_stats->tx.release_src_not_tqm); 6735 if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { 6736 DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu", 6737 peer_stats->tx.dropped.fw_rem.bytes); 6738 } 6739 DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d", 6740 peer_stats->tx.dropped.fw_rem_tx); 6741 DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d", 6742 peer_stats->tx.dropped.fw_rem_notx); 6743 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u", 6744 peer_stats->tx.dropped.fw_reason1); 6745 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u", 6746 peer_stats->tx.dropped.fw_reason2); 6747 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u", 6748 peer_stats->tx.dropped.fw_reason3); 6749 DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u", 6750 peer_stats->tx.dropped.fw_rem_queue_disable); 6751 DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u", 6752 peer_stats->tx.dropped.fw_rem_no_match); 6753 DP_PRINT_STATS("Dropped due to HW threshold criteria = %u", 6754 peer_stats->tx.dropped.drop_threshold); 6755 DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u", 6756 peer_stats->tx.dropped.drop_link_desc_na); 6757 DP_PRINT_STATS("Drop bit set or invalid flow = %u", 6758 peer_stats->tx.dropped.invalid_drop); 6759 DP_PRINT_STATS("MCAST vdev drop in HW = %u", 6760 peer_stats->tx.dropped.mcast_vdev_drop); 6761 DP_PRINT_STATS("Dropped : Age Out = %d", 6762 peer_stats->tx.dropped.age_out); 6763 DP_PRINT_STATS("Dropped : Invalid Reason = %u", 6764 peer_stats->tx.dropped.invalid_rr); 6765 DP_PRINT_STATS("NAWDS : "); 6766 DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d", 6767 peer_stats->tx.nawds_mcast_drop); 6768 DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %d", 6769 peer_stats->tx.nawds_mcast.num); 6770 DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu", 6771 peer_stats->tx.nawds_mcast.bytes); 6772 6773 DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus); 6774 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d", 6775 peer_stats->tx.pream_punct_cnt); 6776 DP_PRINT_STATS("MPDU's Successful = %d", 6777 peer_stats->tx.tx_mpdus_success); 6778 DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried); 6779 6780 DP_PRINT_STATS("Rate Info:"); 6781 dp_print_common_rates_info(peer_stats->tx.pkt_type); 6782 6783 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6784 peer_stats->tx.sgi_count[0], 6785 peer_stats->tx.sgi_count[1], 6786 peer_stats->tx.sgi_count[2], 6787 peer_stats->tx.sgi_count[3]); 6788 6789 DP_PRINT_STATS("Wireless Mutlimedia "); 6790 DP_PRINT_STATS(" Best effort = %d", 6791 peer_stats->tx.wme_ac_type[0]); 6792 DP_PRINT_STATS(" Background= %d", 6793 peer_stats->tx.wme_ac_type[1]); 6794 DP_PRINT_STATS(" Video = %d", 6795 peer_stats->tx.wme_ac_type[2]); 6796 DP_PRINT_STATS(" Voice = %d", 6797 peer_stats->tx.wme_ac_type[3]); 6798 6799 DP_PRINT_STATS("Excess Retries per AC "); 6800 DP_PRINT_STATS(" Best effort = %d", 6801 peer_stats->tx.excess_retries_per_ac[0]); 6802 DP_PRINT_STATS(" Background= %d", 6803 peer_stats->tx.excess_retries_per_ac[1]); 6804 DP_PRINT_STATS(" Video = %d", 6805 peer_stats->tx.excess_retries_per_ac[2]); 6806 DP_PRINT_STATS(" Voice = %d", 6807 peer_stats->tx.excess_retries_per_ac[3]); 6808 6809 pnss = &peer_stats->tx.nss[0]; 6810 dp_print_nss(nss, pnss, SS_COUNT); 6811 6812 DP_PRINT_STATS("NSS(1-8) = %s", nss); 6813 6814 DP_PRINT_STATS("Transmit Type :"); 6815 DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 6816 peer_stats->tx.transmit_type[SU].num_msdu, 6817 peer_stats->tx.transmit_type[MU_MIMO].num_msdu, 6818 peer_stats->tx.transmit_type[MU_OFDMA].num_msdu, 6819 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu); 6820 6821 DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 6822 peer_stats->tx.transmit_type[SU].num_mpdu, 6823 peer_stats->tx.transmit_type[MU_MIMO].num_mpdu, 6824 peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu, 6825 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu); 6826 6827 DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 6828 peer_stats->tx.transmit_type[SU].mpdu_tried, 6829 peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried, 6830 peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried, 6831 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried); 6832 6833 for (i = 0; i < MAX_MU_GROUP_ID;) { 6834 index = 0; 6835 for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID; 6836 j++) { 6837 index += qdf_snprint(&mu_group_id[index], 6838 DP_MU_GROUP_LENGTH - index, 6839 " %d", 6840 peer_stats->tx.mu_group_id[i]); 6841 i++; 6842 } 6843 6844 DP_PRINT_STATS("User position list for GID %02d->%d: [%s]", 6845 i - DP_MU_GROUP_SHOW, i - 1, mu_group_id); 6846 } 6847 6848 DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]", 6849 peer_stats->tx.ru_start, peer_stats->tx.ru_tones); 6850 6851 DP_PRINT_STATS("Aggregation:"); 6852 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 6853 peer_stats->tx.amsdu_cnt); 6854 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 6855 peer_stats->tx.non_amsdu_cnt); 6856 6857 DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:"); 6858 DP_PRINT_STATS(" Bytes transmitted in last sec: %d", 6859 peer_stats->tx.tx_byte_rate); 6860 DP_PRINT_STATS(" Data transmitted in last sec: %d", 6861 peer_stats->tx.tx_data_rate); 6862 6863 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 6864 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 6865 PEER_TX_STATS); 6866 6867 if (!IS_MLO_DP_LINK_PEER(peer)) { 6868 dp_print_jitter_stats(peer, pdev); 6869 dp_peer_print_tx_delay_stats(pdev, peer); 6870 } 6871 6872 DP_PRINT_STATS("Node Rx Stats:"); 6873 DP_PRINT_STATS("Packets Sent To Stack = %d", 6874 peer_stats->rx.to_stack.num); 6875 DP_PRINT_STATS("Bytes Sent To Stack = %llu", 6876 peer_stats->rx.to_stack.bytes); 6877 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 6878 DP_PRINT_STATS("Ring Id = %d", i); 6879 DP_PRINT_STATS(" Packets Received = %d", 6880 peer_stats->rx.rcvd_reo[i].num); 6881 DP_PRINT_STATS(" Bytes Received = %llu", 6882 peer_stats->rx.rcvd_reo[i].bytes); 6883 } 6884 for (i = 0; i < CDP_MAX_LMACS; i++) 6885 DP_PRINT_STATS("Packets Received on lmac[%d] = %d ( %llu ),", 6886 i, peer_stats->rx.rx_lmac[i].num, 6887 peer_stats->rx.rx_lmac[i].bytes); 6888 6889 DP_PRINT_STATS("Unicast Packets Received = %d", 6890 peer_stats->rx.unicast.num); 6891 DP_PRINT_STATS("Unicast Bytes Received = %llu", 6892 peer_stats->rx.unicast.bytes); 6893 DP_PRINT_STATS("Multicast Packets Received = %d", 6894 peer_stats->rx.multicast.num); 6895 DP_PRINT_STATS("Multicast Bytes Received = %llu", 6896 peer_stats->rx.multicast.bytes); 6897 DP_PRINT_STATS("Broadcast Packets Received = %d", 6898 peer_stats->rx.bcast.num); 6899 DP_PRINT_STATS("Broadcast Bytes Received = %llu", 6900 peer_stats->rx.bcast.bytes); 6901 DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %d", 6902 peer_stats->rx.to_stack_twt.num); 6903 DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu", 6904 peer_stats->rx.to_stack_twt.bytes); 6905 DP_PRINT_STATS("Intra BSS Packets Received = %d", 6906 peer_stats->rx.intra_bss.pkts.num); 6907 DP_PRINT_STATS("Intra BSS Bytes Received = %llu", 6908 peer_stats->rx.intra_bss.pkts.bytes); 6909 DP_PRINT_STATS("Intra BSS Packets Failed = %d", 6910 peer_stats->rx.intra_bss.fail.num); 6911 DP_PRINT_STATS("Intra BSS Bytes Failed = %llu", 6912 peer_stats->rx.intra_bss.fail.bytes); 6913 DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded = %d", 6914 peer_stats->rx.intra_bss.mdns_no_fwd); 6915 DP_PRINT_STATS("Raw Packets Received = %d", 6916 peer_stats->rx.raw.num); 6917 DP_PRINT_STATS("Raw Bytes Received = %llu", 6918 peer_stats->rx.raw.bytes); 6919 DP_PRINT_STATS("Errors: MIC Errors = %d", 6920 peer_stats->rx.err.mic_err); 6921 DP_PRINT_STATS("Errors: Decryption Errors = %d", 6922 peer_stats->rx.err.decrypt_err); 6923 DP_PRINT_STATS("Errors: PN Errors = %d", 6924 peer_stats->rx.err.pn_err); 6925 DP_PRINT_STATS("Errors: OOR Errors = %d", 6926 peer_stats->rx.err.oor_err); 6927 DP_PRINT_STATS("Errors: 2k Jump Errors = %d", 6928 peer_stats->rx.err.jump_2k_err); 6929 DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d", 6930 peer_stats->rx.err.rxdma_wifi_parse_err); 6931 DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d", 6932 peer_stats->rx.non_ampdu_cnt); 6933 DP_PRINT_STATS("Msdu's Received As Ampdu = %d", 6934 peer_stats->rx.ampdu_cnt); 6935 DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d", 6936 peer_stats->rx.non_amsdu_cnt); 6937 DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d", 6938 peer_stats->rx.amsdu_cnt); 6939 DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries); 6940 DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt); 6941 DP_PRINT_STATS("NAWDS : "); 6942 DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d", 6943 peer_stats->rx.nawds_mcast_drop); 6944 DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d", 6945 peer_stats->rx.mcast_3addr_drop); 6946 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6947 peer_stats->rx.sgi_count[0], 6948 peer_stats->rx.sgi_count[1], 6949 peer_stats->rx.sgi_count[2], 6950 peer_stats->rx.sgi_count[3]); 6951 6952 DP_PRINT_STATS("Wireless Mutlimedia "); 6953 DP_PRINT_STATS(" Best effort = %d", 6954 peer_stats->rx.wme_ac_type[0]); 6955 DP_PRINT_STATS(" Background= %d", 6956 peer_stats->rx.wme_ac_type[1]); 6957 DP_PRINT_STATS(" Video = %d", 6958 peer_stats->rx.wme_ac_type[2]); 6959 DP_PRINT_STATS(" Voice = %d", 6960 peer_stats->rx.wme_ac_type[3]); 6961 6962 DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus); 6963 DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus); 6964 DP_PRINT_STATS("MSDU Reception Type"); 6965 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 6966 peer_stats->rx.reception_type[0], 6967 peer_stats->rx.reception_type[1], 6968 peer_stats->rx.reception_type[2], 6969 peer_stats->rx.reception_type[3]); 6970 DP_PRINT_STATS("PPDU Reception Type"); 6971 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 6972 peer_stats->rx.ppdu_cnt[0], 6973 peer_stats->rx.ppdu_cnt[1], 6974 peer_stats->rx.ppdu_cnt[2], 6975 peer_stats->rx.ppdu_cnt[3]); 6976 6977 dp_print_common_rates_info(peer_stats->rx.pkt_type); 6978 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt, 6979 DOT11_AX); 6980 dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]); 6981 6982 pnss = &peer_stats->rx.nss[0]; 6983 dp_print_nss(nss, pnss, SS_COUNT); 6984 DP_PRINT_STATS("MSDU Count"); 6985 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 6986 6987 DP_PRINT_STATS("reception mode SU"); 6988 pnss = &peer_stats->rx.ppdu_nss[0]; 6989 dp_print_nss(nss, pnss, SS_COUNT); 6990 6991 DP_PRINT_STATS(" PPDU Count"); 6992 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 6993 6994 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 6995 peer_stats->rx.mpdu_cnt_fcs_ok, 6996 peer_stats->rx.mpdu_cnt_fcs_err); 6997 6998 for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) { 6999 DP_PRINT_STATS("reception mode %s", 7000 mu_reception_mode[rx_mu_type]); 7001 rx_mu = &peer_stats->rx.rx_mu[rx_mu_type]; 7002 7003 pnss = &rx_mu->ppdu_nss[0]; 7004 dp_print_nss(nss, pnss, SS_COUNT); 7005 DP_PRINT_STATS(" PPDU Count"); 7006 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 7007 7008 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 7009 rx_mu->mpdu_cnt_fcs_ok, 7010 rx_mu->mpdu_cnt_fcs_err); 7011 } 7012 7013 DP_PRINT_STATS("Aggregation:"); 7014 DP_PRINT_STATS(" Msdu's Part of Ampdu = %d", 7015 peer_stats->rx.ampdu_cnt); 7016 DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %d", 7017 peer_stats->rx.non_ampdu_cnt); 7018 DP_PRINT_STATS(" Msdu's Part of Amsdu = %d", 7019 peer_stats->rx.amsdu_cnt); 7020 DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %d", 7021 peer_stats->rx.non_amsdu_cnt); 7022 7023 DP_PRINT_STATS("Bytes and Packets received in last one sec:"); 7024 DP_PRINT_STATS(" Bytes received in last sec: %d", 7025 peer_stats->rx.rx_byte_rate); 7026 DP_PRINT_STATS(" Data received in last sec: %d", 7027 peer_stats->rx.rx_data_rate); 7028 DP_PRINT_STATS("MEC Packet Drop = %d", 7029 peer_stats->rx.mec_drop.num); 7030 DP_PRINT_STATS("MEC Byte Drop = %llu", 7031 peer_stats->rx.mec_drop.bytes); 7032 DP_PRINT_STATS("Multipass Rx Packet Drop = %d", 7033 peer_stats->rx.multipass_rx_pkt_drop); 7034 DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d", 7035 peer_stats->rx.peer_unauth_rx_pkt_drop); 7036 DP_PRINT_STATS("Policy Check Rx Packet Drop = %d", 7037 peer_stats->rx.policy_check_drop); 7038 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 7039 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 7040 PEER_RX_STATS); 7041 7042 if (!IS_MLO_DP_LINK_PEER(peer)) 7043 dp_peer_print_rx_delay_stats(pdev, peer); 7044 7045 dp_peer_print_reo_qref_table(peer); 7046 } 7047 7048 void dp_print_per_ring_stats(struct dp_soc *soc) 7049 { 7050 uint8_t ring; 7051 uint16_t core; 7052 uint64_t total_packets; 7053 7054 DP_PRINT_STATS("Reo packets per ring:"); 7055 for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) { 7056 total_packets = 0; 7057 DP_PRINT_STATS("Packets on ring %u:", ring); 7058 for (core = 0; core < num_possible_cpus(); core++) { 7059 if (!soc->stats.rx.ring_packets[core][ring]) 7060 continue; 7061 DP_PRINT_STATS("Packets arriving on core %u: %llu", 7062 core, 7063 soc->stats.rx.ring_packets[core][ring]); 7064 total_packets += soc->stats.rx.ring_packets[core][ring]; 7065 } 7066 DP_PRINT_STATS("Total packets on ring %u: %llu", 7067 ring, total_packets); 7068 } 7069 } 7070 7071 void dp_txrx_path_stats(struct dp_soc *soc) 7072 { 7073 uint8_t error_code; 7074 uint8_t loop_pdev; 7075 struct dp_pdev *pdev; 7076 uint8_t i; 7077 7078 if (!soc) { 7079 dp_err("%s: Invalid access", __func__); 7080 return; 7081 } 7082 7083 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 7084 pdev = soc->pdev_list[loop_pdev]; 7085 dp_aggregate_pdev_stats(pdev); 7086 DP_PRINT_STATS("Tx path Statistics:"); 7087 DP_PRINT_STATS("from stack: %u msdus (%llu bytes)", 7088 pdev->stats.tx_i.rcvd.num, 7089 pdev->stats.tx_i.rcvd.bytes); 7090 DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)", 7091 pdev->stats.tx_i.processed.num, 7092 pdev->stats.tx_i.processed.bytes); 7093 DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)", 7094 pdev->stats.tx.tx_success.num, 7095 pdev->stats.tx.tx_success.bytes); 7096 for (i = 0; i < soc->num_tcl_data_rings; i++) { 7097 DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1, 7098 soc->stats.tx.tcl_enq[i]); 7099 DP_PRINT_STATS("TX completions reaped from ring %u: %u", 7100 i, soc->stats.tx.tx_comp[i]); 7101 } 7102 7103 DP_PRINT_STATS("Invalid release source: %u", 7104 soc->stats.tx.invalid_release_source); 7105 DP_PRINT_STATS("Dropped in host:"); 7106 DP_PRINT_STATS("Total packets dropped: %u,", 7107 pdev->stats.tx_i.dropped.dropped_pkt.num); 7108 DP_PRINT_STATS("Descriptor not available: %u", 7109 pdev->stats.tx_i.dropped.desc_na.num); 7110 DP_PRINT_STATS("Ring full: %u", 7111 pdev->stats.tx_i.dropped.ring_full); 7112 DP_PRINT_STATS("Enqueue fail: %u", 7113 pdev->stats.tx_i.dropped.enqueue_fail); 7114 DP_PRINT_STATS("Pkt dropped in vdev-id check: %u", 7115 pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); 7116 DP_PRINT_STATS("DMA Error: %u", 7117 pdev->stats.tx_i.dropped.dma_error); 7118 DP_PRINT_STATS("Drop Ingress: %u", 7119 pdev->stats.tx_i.dropped.drop_ingress); 7120 7121 DP_PRINT_STATS("Dropped in hardware:"); 7122 DP_PRINT_STATS("total packets dropped: %u", 7123 pdev->stats.tx.tx_failed); 7124 DP_PRINT_STATS("mpdu age out: %u", 7125 pdev->stats.tx.dropped.age_out); 7126 DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)", 7127 pdev->stats.tx.dropped.fw_rem.num, 7128 pdev->stats.tx.dropped.fw_rem.bytes); 7129 DP_PRINT_STATS("firmware removed tx: %u", 7130 pdev->stats.tx.dropped.fw_rem_tx); 7131 DP_PRINT_STATS("firmware removed notx %u", 7132 pdev->stats.tx.dropped.fw_rem_notx); 7133 DP_PRINT_STATS("Invalid peer on tx path: %u", 7134 pdev->soc->stats.tx.tx_invalid_peer.num); 7135 DP_PRINT_STATS("Tx desc freed in non-completion path: %u", 7136 pdev->soc->stats.tx.tx_comp_exception); 7137 DP_PRINT_STATS("Tx desc force freed: %u", 7138 pdev->soc->stats.tx.tx_comp_force_freed); 7139 7140 DP_PRINT_STATS("Tx packets sent per interrupt:"); 7141 DP_PRINT_STATS("Single Packet: %u", 7142 pdev->stats.tx_comp_histogram.pkts_1); 7143 DP_PRINT_STATS("2-20 Packets: %u", 7144 pdev->stats.tx_comp_histogram.pkts_2_20); 7145 DP_PRINT_STATS("21-40 Packets: %u", 7146 pdev->stats.tx_comp_histogram.pkts_21_40); 7147 DP_PRINT_STATS("41-60 Packets: %u", 7148 pdev->stats.tx_comp_histogram.pkts_41_60); 7149 DP_PRINT_STATS("61-80 Packets: %u", 7150 pdev->stats.tx_comp_histogram.pkts_61_80); 7151 DP_PRINT_STATS("81-100 Packets: %u", 7152 pdev->stats.tx_comp_histogram.pkts_81_100); 7153 DP_PRINT_STATS("101-200 Packets: %u", 7154 pdev->stats.tx_comp_histogram.pkts_101_200); 7155 DP_PRINT_STATS(" 201+ Packets: %u", 7156 pdev->stats.tx_comp_histogram.pkts_201_plus); 7157 7158 DP_PRINT_STATS("Rx path statistics"); 7159 7160 DP_PRINT_STATS("delivered %u msdus ( %llu bytes),", 7161 pdev->stats.rx.to_stack.num, 7162 pdev->stats.rx.to_stack.bytes); 7163 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 7164 if (!pdev->stats.rx.rcvd_reo[i].num) 7165 continue; 7166 DP_PRINT_STATS( 7167 "received on reo[%d] %u msdus( %llu bytes),", 7168 i, pdev->stats.rx.rcvd_reo[i].num, 7169 pdev->stats.rx.rcvd_reo[i].bytes); 7170 } 7171 for (i = 0; i < CDP_MAX_LMACS; i++) 7172 DP_PRINT_STATS("received on lmac[%d] %u msdus (%llu bytes),", 7173 i, pdev->stats.rx.rx_lmac[i].num, 7174 pdev->stats.rx.rx_lmac[i].bytes); 7175 DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),", 7176 pdev->stats.rx.intra_bss.pkts.num, 7177 pdev->stats.rx.intra_bss.pkts.bytes); 7178 DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),", 7179 pdev->stats.rx.intra_bss.fail.num, 7180 pdev->stats.rx.intra_bss.fail.bytes); 7181 DP_PRINT_STATS("intra-bss no mdns fwds %u msdus", 7182 pdev->stats.rx.intra_bss.mdns_no_fwd); 7183 DP_PRINT_STATS("intra-bss EAPOL drops: %u", 7184 soc->stats.rx.err.intrabss_eapol_drop); 7185 7186 DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),", 7187 pdev->stats.rx.raw.num, 7188 pdev->stats.rx.raw.bytes); 7189 DP_PRINT_STATS("mic errors %u", 7190 pdev->stats.rx.err.mic_err); 7191 DP_PRINT_STATS("Invalid peer on rx path: %u", 7192 pdev->soc->stats.rx.err.rx_invalid_peer.num); 7193 DP_PRINT_STATS("sw_peer_id invalid %u", 7194 pdev->soc->stats.rx.err.rx_invalid_peer_id.num); 7195 DP_PRINT_STATS("packet_len invalid %u", 7196 pdev->soc->stats.rx.err.rx_invalid_pkt_len.num); 7197 DP_PRINT_STATS("sa or da idx invalid %u", 7198 pdev->soc->stats.rx.err.invalid_sa_da_idx); 7199 DP_PRINT_STATS("defrag peer uninit %u", 7200 pdev->soc->stats.rx.err.defrag_peer_uninit); 7201 DP_PRINT_STATS("pkts delivered no peer %u", 7202 pdev->soc->stats.rx.err.pkt_delivered_no_peer); 7203 DP_PRINT_STATS("RX invalid cookie: %d", 7204 soc->stats.rx.err.invalid_cookie); 7205 DP_PRINT_STATS("RX stale cookie: %d", 7206 soc->stats.rx.err.stale_cookie); 7207 DP_PRINT_STATS("2k jump delba sent: %u", 7208 pdev->soc->stats.rx.err.rx_2k_jump_delba_sent); 7209 DP_PRINT_STATS("2k jump msdu to stack: %u", 7210 pdev->soc->stats.rx.err.rx_2k_jump_to_stack); 7211 DP_PRINT_STATS("2k jump msdu drop: %u", 7212 pdev->soc->stats.rx.err.rx_2k_jump_drop); 7213 DP_PRINT_STATS("REO err oor msdu to stack %u", 7214 pdev->soc->stats.rx.err.reo_err_oor_to_stack); 7215 DP_PRINT_STATS("REO err oor msdu drop: %u", 7216 pdev->soc->stats.rx.err.reo_err_oor_drop); 7217 DP_PRINT_STATS("Rx err msdu rejected: %d", 7218 soc->stats.rx.err.rejected); 7219 DP_PRINT_STATS("Rx raw frame dropped: %d", 7220 soc->stats.rx.err.raw_frm_drop); 7221 DP_PRINT_STATS("Rx stale link desc cookie: %d", 7222 pdev->soc->stats.rx.err.invalid_link_cookie); 7223 DP_PRINT_STATS("Rx nbuf sanity fails: %d", 7224 pdev->soc->stats.rx.err.nbuf_sanity_fail); 7225 DP_PRINT_STATS("Rx refill duplicate link desc: %d", 7226 pdev->soc->stats.rx.err.dup_refill_link_desc); 7227 DP_PRINT_STATS("Rx ipa smmu map duplicate: %d", 7228 pdev->soc->stats.rx.err.ipa_smmu_map_dup); 7229 DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d", 7230 pdev->soc->stats.rx.err.ipa_smmu_unmap_dup); 7231 DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d", 7232 pdev->soc->stats.rx.err.ipa_unmap_no_pipe); 7233 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 7234 soc->stats.rx.err.pn_in_dest_check_fail); 7235 7236 DP_PRINT_STATS("Reo Statistics"); 7237 DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full); 7238 DP_PRINT_STATS("rbm error: %u msdus", 7239 pdev->soc->stats.rx.err.invalid_rbm); 7240 DP_PRINT_STATS("hal ring access fail: %u msdus", 7241 pdev->soc->stats.rx.err.hal_ring_access_fail); 7242 7243 DP_PRINT_STATS("hal ring access full fail: %u msdus", 7244 pdev->soc->stats.rx.err.hal_ring_access_full_fail); 7245 7246 DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame); 7247 7248 for (error_code = 0; error_code < HAL_REO_ERR_MAX; 7249 error_code++) { 7250 if (!pdev->soc->stats.rx.err.reo_error[error_code]) 7251 continue; 7252 DP_PRINT_STATS("Reo error number (%u): %u msdus", 7253 error_code, 7254 pdev->soc->stats.rx.err 7255 .reo_error[error_code]); 7256 } 7257 7258 for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX; 7259 error_code++) { 7260 if (!pdev->soc->stats.rx.err.rxdma_error[error_code]) 7261 continue; 7262 DP_PRINT_STATS("Rxdma error number (%u): %u msdus", 7263 error_code, 7264 pdev->soc->stats.rx.err 7265 .rxdma_error[error_code]); 7266 } 7267 7268 DP_PRINT_STATS("Rx packets reaped per interrupt:"); 7269 DP_PRINT_STATS("Single Packet: %u", 7270 pdev->stats.rx_ind_histogram.pkts_1); 7271 DP_PRINT_STATS("2-20 Packets: %u", 7272 pdev->stats.rx_ind_histogram.pkts_2_20); 7273 DP_PRINT_STATS("21-40 Packets: %u", 7274 pdev->stats.rx_ind_histogram.pkts_21_40); 7275 DP_PRINT_STATS("41-60 Packets: %u", 7276 pdev->stats.rx_ind_histogram.pkts_41_60); 7277 DP_PRINT_STATS("61-80 Packets: %u", 7278 pdev->stats.rx_ind_histogram.pkts_61_80); 7279 DP_PRINT_STATS("81-100 Packets: %u", 7280 pdev->stats.rx_ind_histogram.pkts_81_100); 7281 DP_PRINT_STATS("101-200 Packets: %u", 7282 pdev->stats.rx_ind_histogram.pkts_101_200); 7283 DP_PRINT_STATS(" 201+ Packets: %u", 7284 pdev->stats.rx_ind_histogram.pkts_201_plus); 7285 7286 DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u", 7287 __func__, 7288 pdev->soc->wlan_cfg_ctx 7289 ->tso_enabled, 7290 pdev->soc->wlan_cfg_ctx 7291 ->lro_enabled, 7292 pdev->soc->wlan_cfg_ctx 7293 ->rx_hash, 7294 pdev->soc->wlan_cfg_ctx 7295 ->napi_enabled); 7296 #ifdef QCA_LL_TX_FLOW_CONTROL_V2 7297 DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u", 7298 __func__, 7299 pdev->soc->wlan_cfg_ctx 7300 ->tx_flow_stop_queue_threshold, 7301 pdev->soc->wlan_cfg_ctx 7302 ->tx_flow_start_queue_offset); 7303 #endif 7304 } 7305 } 7306 7307 /* 7308 * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats 7309 * Current scope is bar received count 7310 * 7311 * @soc : Datapath SOC handle 7312 * @peer: Datapath peer handle 7313 * @arg : argument to iterate function 7314 * 7315 * Return: void 7316 */ 7317 static void 7318 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc, 7319 struct dp_peer *peer, 7320 void *arg) 7321 { 7322 uint32_t waitcnt; 7323 struct dp_pdev *pdev = peer->vdev->pdev; 7324 7325 waitcnt = 0; 7326 dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev); 7327 while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) && 7328 waitcnt < 10) { 7329 schedule_timeout_interruptible( 7330 STATS_PROC_TIMEOUT); 7331 waitcnt++; 7332 } 7333 qdf_atomic_set(&pdev->stats_cmd_complete, 0); 7334 } 7335 7336 void 7337 dp_print_pdev_tx_stats(struct dp_pdev *pdev) 7338 { 7339 uint8_t i = 0, index = 0; 7340 7341 DP_PRINT_STATS("PDEV Tx Stats:\n"); 7342 DP_PRINT_STATS("Received From Stack:"); 7343 DP_PRINT_STATS(" Packets = %u", 7344 pdev->stats.tx_i.rcvd.num); 7345 DP_PRINT_STATS(" Bytes = %llu", 7346 pdev->stats.tx_i.rcvd.bytes); 7347 DP_PRINT_STATS("Received from Stack in FP:"); 7348 DP_PRINT_STATS(" Packets = %llu", 7349 pdev->stats.tx_i.rcvd_in_fast_xmit_flow); 7350 DP_PRINT_STATS("Received from Stack per core:"); 7351 DP_PRINT_STATS(" Packets = %u %u %u %u", 7352 pdev->stats.tx_i.rcvd_per_core[0], 7353 pdev->stats.tx_i.rcvd_per_core[1], 7354 pdev->stats.tx_i.rcvd_per_core[2], 7355 pdev->stats.tx_i.rcvd_per_core[3]); 7356 DP_PRINT_STATS("Processed:"); 7357 DP_PRINT_STATS(" Packets = %u", 7358 pdev->stats.tx_i.processed.num); 7359 DP_PRINT_STATS(" Bytes = %llu", 7360 pdev->stats.tx_i.processed.bytes); 7361 DP_PRINT_STATS("Total Completions:"); 7362 DP_PRINT_STATS(" Packets = %u", 7363 pdev->stats.tx.comp_pkt.num); 7364 DP_PRINT_STATS(" Bytes = %llu", 7365 pdev->stats.tx.comp_pkt.bytes); 7366 DP_PRINT_STATS("Successful Completions:"); 7367 DP_PRINT_STATS(" Packets = %u", 7368 pdev->stats.tx.tx_success.num); 7369 DP_PRINT_STATS(" Bytes = %llu", 7370 pdev->stats.tx.tx_success.bytes); 7371 DP_PRINT_STATS("Dropped:"); 7372 DP_PRINT_STATS(" Total = %u", 7373 pdev->stats.tx_i.dropped.dropped_pkt.num); 7374 DP_PRINT_STATS(" Dma_map_error = %u", 7375 pdev->stats.tx_i.dropped.dma_error); 7376 DP_PRINT_STATS(" Ring Full = %u", 7377 pdev->stats.tx_i.dropped.ring_full); 7378 DP_PRINT_STATS(" Descriptor Not available = %u", 7379 pdev->stats.tx_i.dropped.desc_na.num); 7380 DP_PRINT_STATS(" HW enqueue failed= %u", 7381 pdev->stats.tx_i.dropped.enqueue_fail); 7382 DP_PRINT_STATS(" Descriptor alloc fail = %u", 7383 pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num); 7384 DP_PRINT_STATS(" Tx outstanding too many = %u", 7385 pdev->stats.tx_i.dropped.desc_na_exc_outstand.num); 7386 DP_PRINT_STATS(" Pkt dropped in vdev-id check= %u", 7387 pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); 7388 DP_PRINT_STATS(" Resources Full = %u", 7389 pdev->stats.tx_i.dropped.res_full); 7390 DP_PRINT_STATS(" Drop Ingress = %u", 7391 pdev->stats.tx_i.dropped.drop_ingress); 7392 DP_PRINT_STATS("Tx failed = %u", 7393 pdev->stats.tx.tx_failed); 7394 DP_PRINT_STATS(" FW removed Pkts = %u", 7395 pdev->stats.tx.dropped.fw_rem.num); 7396 DP_PRINT_STATS(" FW removed bytes= %llu", 7397 pdev->stats.tx.dropped.fw_rem.bytes); 7398 DP_PRINT_STATS(" FW removed transmitted = %u", 7399 pdev->stats.tx.dropped.fw_rem_tx); 7400 DP_PRINT_STATS(" FW removed untransmitted = %u", 7401 pdev->stats.tx.dropped.fw_rem_notx); 7402 DP_PRINT_STATS(" FW removed untransmitted fw_reason1 = %u", 7403 pdev->stats.tx.dropped.fw_reason1); 7404 DP_PRINT_STATS(" FW removed untransmitted fw_reason2 = %u", 7405 pdev->stats.tx.dropped.fw_reason2); 7406 DP_PRINT_STATS(" FW removed untransmitted fw_reason3 = %u", 7407 pdev->stats.tx.dropped.fw_reason3); 7408 DP_PRINT_STATS(" FW removed untransmitted disable queue = %u", 7409 pdev->stats.tx.dropped.fw_rem_queue_disable); 7410 DP_PRINT_STATS(" FW removed untransmitted no match = %u", 7411 pdev->stats.tx.dropped.fw_rem_no_match); 7412 DP_PRINT_STATS(" Dropped due to HW threshold criteria = %u", 7413 pdev->stats.tx.dropped.drop_threshold); 7414 DP_PRINT_STATS(" Link desc not available drop = %u", 7415 pdev->stats.tx.dropped.drop_link_desc_na); 7416 DP_PRINT_STATS(" Drop bit set or invalid flow = %u", 7417 pdev->stats.tx.dropped.invalid_drop); 7418 DP_PRINT_STATS(" MCAST vdev drop in HW = %u", 7419 pdev->stats.tx.dropped.mcast_vdev_drop); 7420 DP_PRINT_STATS(" Dropped with invalid reason = %u", 7421 pdev->stats.tx.dropped.invalid_rr); 7422 DP_PRINT_STATS(" Aged Out from msdu/mpdu queues = %u", 7423 pdev->stats.tx.dropped.age_out); 7424 DP_PRINT_STATS(" headroom insufficient = %u", 7425 pdev->stats.tx_i.dropped.headroom_insufficient); 7426 DP_PRINT_STATS("Multicast:"); 7427 DP_PRINT_STATS(" Packets: %u", 7428 pdev->stats.tx.mcast.num); 7429 DP_PRINT_STATS(" Bytes: %llu", 7430 pdev->stats.tx.mcast.bytes); 7431 DP_PRINT_STATS("Scatter Gather:"); 7432 DP_PRINT_STATS(" Packets = %d", 7433 pdev->stats.tx_i.sg.sg_pkt.num); 7434 DP_PRINT_STATS(" Bytes = %llu", 7435 pdev->stats.tx_i.sg.sg_pkt.bytes); 7436 DP_PRINT_STATS(" Dropped By Host = %u", 7437 pdev->stats.tx_i.sg.dropped_host.num); 7438 DP_PRINT_STATS(" Dropped By Target = %u", 7439 pdev->stats.tx_i.sg.dropped_target); 7440 DP_PRINT_STATS("Mcast Enhancement:"); 7441 DP_PRINT_STATS(" Packets = %u", 7442 pdev->stats.tx_i.mcast_en.mcast_pkt.num); 7443 DP_PRINT_STATS(" Bytes = %llu", 7444 pdev->stats.tx_i.mcast_en.mcast_pkt.bytes); 7445 DP_PRINT_STATS(" Dropped: Map Errors = %u", 7446 pdev->stats.tx_i.mcast_en.dropped_map_error); 7447 DP_PRINT_STATS(" Dropped: Self Mac = %u", 7448 pdev->stats.tx_i.mcast_en.dropped_self_mac); 7449 DP_PRINT_STATS(" Dropped: Send Fail = %u", 7450 pdev->stats.tx_i.mcast_en.dropped_send_fail); 7451 DP_PRINT_STATS(" Unicast sent = %u", 7452 pdev->stats.tx_i.mcast_en.ucast); 7453 DP_PRINT_STATS("IGMP Mcast Enhancement:"); 7454 DP_PRINT_STATS(" IGMP packets received = %u", 7455 pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd); 7456 DP_PRINT_STATS(" Converted to uncast = %u", 7457 pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted); 7458 DP_PRINT_STATS("Raw:"); 7459 DP_PRINT_STATS(" Packets = %u", 7460 pdev->stats.tx_i.raw.raw_pkt.num); 7461 DP_PRINT_STATS(" Bytes = %llu", 7462 pdev->stats.tx_i.raw.raw_pkt.bytes); 7463 DP_PRINT_STATS(" DMA map error = %u", 7464 pdev->stats.tx_i.raw.dma_map_error); 7465 DP_PRINT_STATS(" RAW pkt type[!data] error = %u", 7466 pdev->stats.tx_i.raw.invalid_raw_pkt_datatype); 7467 DP_PRINT_STATS(" Frags count overflow error = %u", 7468 pdev->stats.tx_i.raw.num_frags_overflow_err); 7469 DP_PRINT_STATS("Reinjected:"); 7470 DP_PRINT_STATS(" Packets = %u", 7471 pdev->stats.tx_i.reinject_pkts.num); 7472 DP_PRINT_STATS(" Bytes = %llu\n", 7473 pdev->stats.tx_i.reinject_pkts.bytes); 7474 DP_PRINT_STATS("Inspected:"); 7475 DP_PRINT_STATS(" Packets = %d", 7476 pdev->stats.tx_i.inspect_pkts.num); 7477 DP_PRINT_STATS(" Bytes = %llu", 7478 pdev->stats.tx_i.inspect_pkts.bytes); 7479 DP_PRINT_STATS("Nawds Multicast:"); 7480 DP_PRINT_STATS(" Packets = %u", 7481 pdev->stats.tx_i.nawds_mcast.num); 7482 DP_PRINT_STATS(" Bytes = %llu", 7483 pdev->stats.tx_i.nawds_mcast.bytes); 7484 DP_PRINT_STATS("CCE Classified:"); 7485 DP_PRINT_STATS(" CCE Classified Packets: %u", 7486 pdev->stats.tx_i.cce_classified); 7487 DP_PRINT_STATS(" RAW CCE Classified Packets: %u", 7488 pdev->stats.tx_i.cce_classified_raw); 7489 DP_PRINT_STATS("Mesh stats:"); 7490 DP_PRINT_STATS(" frames to firmware: %u", 7491 pdev->stats.tx_i.mesh.exception_fw); 7492 DP_PRINT_STATS(" completions from fw: %u", 7493 pdev->stats.tx_i.mesh.completion_fw); 7494 DP_PRINT_STATS("PPDU stats counter"); 7495 for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) { 7496 DP_PRINT_STATS(" Tag[%d] = %llu", index, 7497 pdev->stats.ppdu_stats_counter[index]); 7498 } 7499 DP_PRINT_STATS("BA not received for delayed_ba: %u", 7500 pdev->stats.cdp_delayed_ba_not_recev); 7501 7502 dp_monitor_print_tx_stats(pdev); 7503 7504 DP_PRINT_STATS("tx_ppdu_proc: %llu", 7505 pdev->stats.tx_ppdu_proc); 7506 DP_PRINT_STATS("ack ba comes twice: %llu", 7507 pdev->stats.ack_ba_comes_twice); 7508 DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu", 7509 pdev->stats.ppdu_drop); 7510 DP_PRINT_STATS("ppdu dropped because of wrap around: %llu", 7511 pdev->stats.ppdu_wrap_drop); 7512 7513 for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) { 7514 if (!pdev->stats.wdi_event[i]) 7515 DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d", 7516 i, pdev->stats.wdi_event[i]); 7517 } 7518 7519 dp_monitor_print_pdev_tx_capture_stats(pdev); 7520 } 7521 7522 void 7523 dp_print_pdev_rx_stats(struct dp_pdev *pdev) 7524 { 7525 uint8_t i; 7526 7527 DP_PRINT_STATS("PDEV Rx Stats:\n"); 7528 DP_PRINT_STATS("Received From HW (Per Rx Ring):"); 7529 DP_PRINT_STATS(" Packets = %u %u %u %u", 7530 pdev->stats.rx.rcvd_reo[0].num, 7531 pdev->stats.rx.rcvd_reo[1].num, 7532 pdev->stats.rx.rcvd_reo[2].num, 7533 pdev->stats.rx.rcvd_reo[3].num); 7534 DP_PRINT_STATS(" Bytes = %llu %llu %llu %llu", 7535 pdev->stats.rx.rcvd_reo[0].bytes, 7536 pdev->stats.rx.rcvd_reo[1].bytes, 7537 pdev->stats.rx.rcvd_reo[2].bytes, 7538 pdev->stats.rx.rcvd_reo[3].bytes); 7539 for (i = 0; i < CDP_MAX_LMACS; i++) 7540 DP_PRINT_STATS("Packets Received on lmac[%d] = %d (%llu)", 7541 i, pdev->stats.rx.rx_lmac[i].num, 7542 pdev->stats.rx.rx_lmac[i].bytes); 7543 DP_PRINT_STATS("Replenished:"); 7544 DP_PRINT_STATS(" Packets = %u", 7545 pdev->stats.replenish.pkts.num); 7546 DP_PRINT_STATS(" Buffers Added To Freelist = %u", 7547 pdev->stats.buf_freelist); 7548 DP_PRINT_STATS(" Low threshold intr = %d", 7549 pdev->stats.replenish.low_thresh_intrs); 7550 DP_PRINT_STATS("Dropped:"); 7551 DP_PRINT_STATS(" msdu_not_done = %u", 7552 pdev->stats.dropped.msdu_not_done); 7553 DP_PRINT_STATS(" wifi parse = %u", 7554 pdev->stats.dropped.wifi_parse); 7555 DP_PRINT_STATS(" mon_rx_drop = %u", 7556 pdev->stats.dropped.mon_rx_drop); 7557 DP_PRINT_STATS(" mon_radiotap_update_err = %u", 7558 pdev->stats.dropped.mon_radiotap_update_err); 7559 DP_PRINT_STATS(" mec_drop = %u", 7560 pdev->stats.rx.mec_drop.num); 7561 DP_PRINT_STATS(" Bytes = %llu", 7562 pdev->stats.rx.mec_drop.bytes); 7563 DP_PRINT_STATS(" peer_unauth_drop = %u", 7564 pdev->stats.rx.peer_unauth_rx_pkt_drop); 7565 DP_PRINT_STATS(" policy_check_drop = %u", 7566 pdev->stats.rx.policy_check_drop); 7567 DP_PRINT_STATS("Sent To Stack:"); 7568 DP_PRINT_STATS(" Packets = %u", 7569 pdev->stats.rx.to_stack.num); 7570 DP_PRINT_STATS(" Bytes = %llu", 7571 pdev->stats.rx.to_stack.bytes); 7572 DP_PRINT_STATS(" vlan_tag_stp_cnt = %u", 7573 pdev->stats.vlan_tag_stp_cnt); 7574 DP_PRINT_STATS("Multicast/Broadcast:"); 7575 DP_PRINT_STATS(" Packets = %u", 7576 pdev->stats.rx.multicast.num); 7577 DP_PRINT_STATS(" Bytes = %llu", 7578 pdev->stats.rx.multicast.bytes); 7579 DP_PRINT_STATS("Errors:"); 7580 DP_PRINT_STATS(" Rxdma Ring Un-inititalized = %u", 7581 pdev->stats.replenish.rxdma_err); 7582 DP_PRINT_STATS(" Desc Alloc Failed: = %u", 7583 pdev->stats.err.desc_alloc_fail); 7584 DP_PRINT_STATS(" IP checksum error = %u", 7585 pdev->stats.err.ip_csum_err); 7586 DP_PRINT_STATS(" TCP/UDP checksum error = %u", 7587 pdev->stats.err.tcp_udp_csum_err); 7588 DP_PRINT_STATS(" Failed frag alloc = %u", 7589 pdev->stats.replenish.frag_alloc_fail); 7590 7591 dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get, 7592 NULL, DP_MOD_ID_GENERIC_STATS); 7593 /* Get bar_recv_cnt */ 7594 DP_PRINT_STATS("BAR Received Count: = %u", 7595 pdev->stats.rx.bar_recv_cnt); 7596 7597 DP_PRINT_STATS("RX Buffer Pool Stats:\n"); 7598 DP_PRINT_STATS("\tBuffers consumed during refill = %llu", 7599 pdev->stats.rx_buffer_pool.num_bufs_consumed); 7600 DP_PRINT_STATS("\tSuccessful allocations during refill = %llu", 7601 pdev->stats.rx_buffer_pool.num_bufs_alloc_success); 7602 DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu", 7603 pdev->stats.rx_buffer_pool.num_pool_bufs_replenish); 7604 } 7605 7606 void 7607 dp_print_soc_tx_stats(struct dp_soc *soc) 7608 { 7609 uint8_t desc_pool_id; 7610 7611 soc->stats.tx.desc_in_use = 0; 7612 7613 DP_PRINT_STATS("SOC Tx Stats:\n"); 7614 7615 for (desc_pool_id = 0; 7616 desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); 7617 desc_pool_id++) 7618 soc->stats.tx.desc_in_use += 7619 soc->tx_desc[desc_pool_id].num_allocated; 7620 7621 DP_PRINT_STATS("Tx Descriptors In Use = %u", 7622 soc->stats.tx.desc_in_use); 7623 DP_PRINT_STATS("Tx Invalid peer:"); 7624 DP_PRINT_STATS(" Packets = %u", 7625 soc->stats.tx.tx_invalid_peer.num); 7626 DP_PRINT_STATS(" Bytes = %llu", 7627 soc->stats.tx.tx_invalid_peer.bytes); 7628 DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u", 7629 soc->stats.tx.tcl_ring_full[0], 7630 soc->stats.tx.tcl_ring_full[1], 7631 soc->stats.tx.tcl_ring_full[2], 7632 soc->stats.tx.tcl_ring_full[3]); 7633 DP_PRINT_STATS("Tx invalid completion release = %u", 7634 soc->stats.tx.invalid_release_source); 7635 DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]", 7636 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL], 7637 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER], 7638 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC], 7639 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF], 7640 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]); 7641 DP_PRINT_STATS("Tx comp non wbm internal error = %d", 7642 soc->stats.tx.non_wbm_internal_err); 7643 DP_PRINT_STATS("Tx comp loop pkt limit hit = %d", 7644 soc->stats.tx.tx_comp_loop_pkt_limit_hit); 7645 DP_PRINT_STATS("Tx comp HP out of sync2 = %d", 7646 soc->stats.tx.hp_oos2); 7647 } 7648 7649 static 7650 int dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx, 7651 char *buf, int buf_len) 7652 { int i; 7653 int pos = 0; 7654 7655 if (buf_len <= 0 || !buf) { 7656 dp_err("incorrect buf or buf_len(%d)!", buf_len); 7657 return pos; 7658 } 7659 7660 for (i = 0; i < MAX_REO_DEST_RINGS; i++) { 7661 if (intr_ctx->intr_stats.num_rx_ring_masks[i]) 7662 pos += qdf_scnprintf(buf + pos, 7663 buf_len - pos, 7664 "reo[%u]:%u ", i, 7665 intr_ctx->intr_stats.num_rx_ring_masks[i]); 7666 } 7667 return pos; 7668 } 7669 7670 static 7671 int dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx, 7672 char *buf, int buf_len) 7673 { int i; 7674 int pos = 0; 7675 7676 if (buf_len <= 0 || !buf) { 7677 dp_err("incorrect buf or buf_len(%d)!", buf_len); 7678 return pos; 7679 } 7680 7681 for (i = 0; i < MAX_TCL_DATA_RINGS; i++) { 7682 if (intr_ctx->intr_stats.num_tx_ring_masks[i]) 7683 pos += qdf_scnprintf(buf + pos, 7684 buf_len - pos, 7685 "tx_comps[%u]:%u ", i, 7686 intr_ctx->intr_stats.num_tx_ring_masks[i]); 7687 } 7688 return pos; 7689 } 7690 7691 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING 7692 #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512 7693 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask) 7694 { 7695 char *buf; 7696 int ring, pos, buf_len; 7697 char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'}; 7698 7699 if (!srng_mask) 7700 return; 7701 7702 buf = srng_high_wm_str; 7703 buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN; 7704 7705 dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s", 7706 "ring_id", "high_wm", "time", "<50", "50-60", "60-70", 7707 "70-80", "80-90", "90-100"); 7708 7709 if (srng_mask & (1 << REO_DST)) { 7710 for (ring = 0; ring < soc->num_reo_dest_rings; ring++) { 7711 pos = 0; 7712 pos += hal_dump_srng_high_wm_stats(soc->hal_soc, 7713 soc->reo_dest_ring[ring].hal_srng, 7714 buf, buf_len, pos); 7715 dp_info("%s", srng_high_wm_str); 7716 } 7717 } 7718 } 7719 #endif 7720 7721 #define DP_INT_CTX_STATS_STRING_LEN 512 7722 void dp_print_soc_interrupt_stats(struct dp_soc *soc) 7723 { 7724 char *buf; 7725 char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'}; 7726 int i, pos, buf_len; 7727 struct dp_intr_stats *intr_stats; 7728 7729 buf = int_ctx_str; 7730 buf_len = DP_INT_CTX_STATS_STRING_LEN; 7731 7732 for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { 7733 pos = 0; 7734 qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str)); 7735 intr_stats = &soc->intr_ctx[i].intr_stats; 7736 7737 if (!intr_stats->num_masks && !intr_stats->num_near_full_masks) 7738 continue; 7739 7740 pos += qdf_scnprintf(buf + pos, 7741 buf_len - pos, 7742 "%2u[%3d] - Total:%u ", 7743 i, 7744 hif_get_int_ctx_irq_num(soc->hif_handle, 7745 i), 7746 intr_stats->num_masks); 7747 7748 if (soc->intr_ctx[i].tx_ring_mask) 7749 pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i], 7750 buf + pos, 7751 buf_len - pos); 7752 7753 if (soc->intr_ctx[i].rx_ring_mask) 7754 pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i], 7755 buf + pos, 7756 buf_len - pos); 7757 if (soc->intr_ctx[i].rx_err_ring_mask) 7758 pos += qdf_scnprintf(buf + pos, 7759 buf_len - pos, 7760 "reo_err:%u ", 7761 intr_stats->num_rx_err_ring_masks); 7762 7763 if (soc->intr_ctx[i].rx_wbm_rel_ring_mask) 7764 pos += qdf_scnprintf(buf + pos, 7765 buf_len - pos, 7766 "wbm_rx_err:%u ", 7767 intr_stats->num_rx_wbm_rel_ring_masks); 7768 7769 if (soc->intr_ctx[i].rxdma2host_ring_mask) 7770 pos += qdf_scnprintf(buf + pos, 7771 buf_len - pos, 7772 "rxdma2_host_err:%u ", 7773 intr_stats->num_rxdma2host_ring_masks); 7774 7775 if (soc->intr_ctx[i].rx_near_full_grp_1_mask) 7776 pos += qdf_scnprintf(buf + pos, 7777 buf_len - pos, 7778 "rx_near_full_grp_1:%u ", 7779 intr_stats->num_near_full_masks); 7780 7781 if (soc->intr_ctx[i].rx_near_full_grp_2_mask) 7782 pos += qdf_scnprintf(buf + pos, 7783 buf_len - pos, 7784 "rx_near_full_grp_2:%u ", 7785 intr_stats->num_near_full_masks); 7786 if (soc->intr_ctx[i].tx_ring_near_full_mask) 7787 pos += qdf_scnprintf(buf + pos, 7788 buf_len - pos, 7789 "tx_near_full:%u ", 7790 intr_stats->num_near_full_masks); 7791 7792 dp_info("%s", int_ctx_str); 7793 } 7794 } 7795 7796 void 7797 dp_print_soc_rx_stats(struct dp_soc *soc) 7798 { 7799 uint32_t i; 7800 char reo_error[DP_REO_ERR_LENGTH]; 7801 char rxdma_error[DP_RXDMA_ERR_LENGTH]; 7802 uint8_t index = 0; 7803 7804 DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries); 7805 DP_PRINT_STATS("SOC Rx Stats:\n"); 7806 DP_PRINT_STATS("Fragmented packets: %u", 7807 soc->stats.rx.rx_frags); 7808 DP_PRINT_STATS("Reo reinjected packets: %u", 7809 soc->stats.rx.reo_reinject); 7810 DP_PRINT_STATS("Errors:\n"); 7811 DP_PRINT_STATS("Rx Decrypt Errors = %d", 7812 (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] + 7813 soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC])); 7814 DP_PRINT_STATS("Invalid RBM = %d", 7815 soc->stats.rx.err.invalid_rbm); 7816 DP_PRINT_STATS("Invalid Vdev = %d", 7817 soc->stats.rx.err.invalid_vdev); 7818 DP_PRINT_STATS("Invalid sa_idx or da_idx = %d", 7819 soc->stats.rx.err.invalid_sa_da_idx); 7820 DP_PRINT_STATS("Defrag peer uninit = %d", 7821 soc->stats.rx.err.defrag_peer_uninit); 7822 DP_PRINT_STATS("Pkts delivered no peer = %d", 7823 soc->stats.rx.err.pkt_delivered_no_peer); 7824 DP_PRINT_STATS("Invalid Pdev = %d", 7825 soc->stats.rx.err.invalid_pdev); 7826 DP_PRINT_STATS("Invalid Peer = %d", 7827 soc->stats.rx.err.rx_invalid_peer.num); 7828 DP_PRINT_STATS("HAL Ring Access Fail = %d", 7829 soc->stats.rx.err.hal_ring_access_fail); 7830 DP_PRINT_STATS("HAL Ring Access Full Fail = %d", 7831 soc->stats.rx.err.hal_ring_access_full_fail); 7832 DP_PRINT_STATS("MSDU Done failures = %d", 7833 soc->stats.rx.err.msdu_done_fail); 7834 DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags); 7835 DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait); 7836 DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err); 7837 DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor); 7838 7839 DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2); 7840 DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full); 7841 7842 DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d", 7843 soc->stats.rx.reap_loop_pkt_limit_hit); 7844 DP_PRINT_STATS("RX DESC invalid magic: %u", 7845 soc->stats.rx.err.rx_desc_invalid_magic); 7846 DP_PRINT_STATS("RX DUP DESC: %d", 7847 soc->stats.rx.err.hal_reo_dest_dup); 7848 DP_PRINT_STATS("RX REL DUP DESC: %d", 7849 soc->stats.rx.err.hal_wbm_rel_dup); 7850 7851 DP_PRINT_STATS("RXDMA ERR DUP DESC: %d", 7852 soc->stats.rx.err.hal_rxdma_err_dup); 7853 7854 DP_PRINT_STATS("RX scatter msdu: %d", 7855 soc->stats.rx.err.scatter_msdu); 7856 7857 DP_PRINT_STATS("RX invalid cookie: %d", 7858 soc->stats.rx.err.invalid_cookie); 7859 7860 DP_PRINT_STATS("RX stale cookie: %d", 7861 soc->stats.rx.err.stale_cookie); 7862 7863 DP_PRINT_STATS("RX wait completed msdu break: %d", 7864 soc->stats.rx.msdu_scatter_wait_break); 7865 7866 DP_PRINT_STATS("2k jump delba sent: %d", 7867 soc->stats.rx.err.rx_2k_jump_delba_sent); 7868 7869 DP_PRINT_STATS("2k jump msdu to stack: %d", 7870 soc->stats.rx.err.rx_2k_jump_to_stack); 7871 7872 DP_PRINT_STATS("2k jump msdu drop: %d", 7873 soc->stats.rx.err.rx_2k_jump_drop); 7874 7875 DP_PRINT_STATS("REO err oor msdu to stack %d", 7876 soc->stats.rx.err.reo_err_oor_to_stack); 7877 7878 DP_PRINT_STATS("REO err oor msdu drop: %d", 7879 soc->stats.rx.err.reo_err_oor_drop); 7880 7881 DP_PRINT_STATS("Rx err msdu rejected: %d", 7882 soc->stats.rx.err.rejected); 7883 7884 DP_PRINT_STATS("Rx stale link desc cookie: %d", 7885 soc->stats.rx.err.invalid_link_cookie); 7886 7887 DP_PRINT_STATS("Rx nbuf sanity fail: %d", 7888 soc->stats.rx.err.nbuf_sanity_fail); 7889 7890 DP_PRINT_STATS("Rx err msdu continuation err: %d", 7891 soc->stats.rx.err.msdu_continuation_err); 7892 7893 DP_PRINT_STATS("ssn update count: %d", 7894 soc->stats.rx.err.ssn_update_count); 7895 7896 DP_PRINT_STATS("bar handle update fail count: %d", 7897 soc->stats.rx.err.bar_handle_fail_count); 7898 7899 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 7900 soc->stats.rx.err.pn_in_dest_check_fail); 7901 7902 for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) { 7903 index += qdf_snprint(&rxdma_error[index], 7904 DP_RXDMA_ERR_LENGTH - index, 7905 " %d", soc->stats.rx.err.rxdma_error[i]); 7906 } 7907 DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error); 7908 7909 index = 0; 7910 for (i = 0; i < HAL_REO_ERR_MAX; i++) { 7911 index += qdf_snprint(&reo_error[index], 7912 DP_REO_ERR_LENGTH - index, 7913 " %d", soc->stats.rx.err.reo_error[i]); 7914 } 7915 DP_PRINT_STATS("REO Error(0-14):%s", reo_error); 7916 DP_PRINT_STATS("REO CMD SEND FAIL: %d", 7917 soc->stats.rx.err.reo_cmd_send_fail); 7918 7919 DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame); 7920 DP_PRINT_STATS("Rxdma2rel route drop:%d", 7921 soc->stats.rx.rxdma2rel_route_drop); 7922 DP_PRINT_STATS("Reo2rel route drop:%d", 7923 soc->stats.rx.reo2rel_route_drop); 7924 DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count); 7925 DP_PRINT_STATS("Rx invalid TID count:%d", 7926 soc->stats.rx.err.rx_invalid_tid_err); 7927 } 7928 7929 #ifdef FEATURE_TSO_STATS 7930 void dp_print_tso_stats(struct dp_soc *soc, 7931 enum qdf_stats_verbosity_level level) 7932 { 7933 uint8_t loop_pdev; 7934 uint32_t id; 7935 struct dp_pdev *pdev; 7936 7937 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 7938 pdev = soc->pdev_list[loop_pdev]; 7939 DP_PRINT_STATS("TSO Statistics\n"); 7940 DP_PRINT_STATS( 7941 "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d", 7942 pdev->stats.tx_i.rcvd.num, 7943 pdev->stats.tx.tx_success.num, 7944 pdev->stats.tso_stats.num_tso_pkts.num, 7945 pdev->stats.tso_stats.tso_comp); 7946 7947 for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) { 7948 /* TSO LEVEL 1 - PACKET INFO */ 7949 DP_PRINT_STATS( 7950 "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u", 7951 id, 7952 pdev->stats.tso_stats.tso_info 7953 .tso_packet_info[id].tso_packet_len, 7954 pdev->stats.tso_stats.tso_info 7955 .tso_packet_info[id].num_seg); 7956 /* TSO LEVEL 2 */ 7957 if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH) 7958 dp_print_tso_seg_stats(pdev, id); 7959 } 7960 7961 DP_PRINT_STATS( 7962 "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu", 7963 pdev->stats.tso_stats.seg_histogram.segs_1, 7964 pdev->stats.tso_stats.seg_histogram.segs_2_5, 7965 pdev->stats.tso_stats.seg_histogram.segs_6_10, 7966 pdev->stats.tso_stats.seg_histogram.segs_11_15, 7967 pdev->stats.tso_stats.seg_histogram.segs_16_20, 7968 pdev->stats.tso_stats.seg_histogram.segs_20_plus); 7969 } 7970 } 7971 7972 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev, 7973 uint8_t _p_cntrs) 7974 { 7975 if (_p_cntrs == 1) { 7976 DP_STATS_INC(pdev, 7977 tso_stats.seg_histogram.segs_1, 1); 7978 } else if (_p_cntrs >= 2 && _p_cntrs <= 5) { 7979 DP_STATS_INC(pdev, 7980 tso_stats.seg_histogram.segs_2_5, 1); 7981 } else if (_p_cntrs > 5 && _p_cntrs <= 10) { 7982 DP_STATS_INC(pdev, 7983 tso_stats.seg_histogram.segs_6_10, 1); 7984 } else if (_p_cntrs > 10 && _p_cntrs <= 15) { 7985 DP_STATS_INC(pdev, 7986 tso_stats.seg_histogram.segs_11_15, 1); 7987 } else if (_p_cntrs > 15 && _p_cntrs <= 20) { 7988 DP_STATS_INC(pdev, 7989 tso_stats.seg_histogram.segs_16_20, 1); 7990 } else if (_p_cntrs > 20) { 7991 DP_STATS_INC(pdev, 7992 tso_stats.seg_histogram.segs_20_plus, 1); 7993 } 7994 } 7995 7996 void dp_tso_segment_update(struct dp_pdev *pdev, 7997 uint32_t stats_idx, 7998 uint8_t idx, 7999 struct qdf_tso_seg_t seg) 8000 { 8001 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8002 .tso_seg[idx].num_frags, 8003 seg.num_frags); 8004 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8005 .tso_seg[idx].total_len, 8006 seg.total_len); 8007 8008 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8009 .tso_seg[idx].tso_flags.tso_enable, 8010 seg.tso_flags.tso_enable); 8011 8012 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8013 .tso_seg[idx].tso_flags.fin, 8014 seg.tso_flags.fin); 8015 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8016 .tso_seg[idx].tso_flags.syn, 8017 seg.tso_flags.syn); 8018 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8019 .tso_seg[idx].tso_flags.rst, 8020 seg.tso_flags.rst); 8021 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8022 .tso_seg[idx].tso_flags.psh, 8023 seg.tso_flags.psh); 8024 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8025 .tso_seg[idx].tso_flags.ack, 8026 seg.tso_flags.ack); 8027 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8028 .tso_seg[idx].tso_flags.urg, 8029 seg.tso_flags.urg); 8030 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8031 .tso_seg[idx].tso_flags.ece, 8032 seg.tso_flags.ece); 8033 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8034 .tso_seg[idx].tso_flags.cwr, 8035 seg.tso_flags.cwr); 8036 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8037 .tso_seg[idx].tso_flags.ns, 8038 seg.tso_flags.ns); 8039 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8040 .tso_seg[idx].tso_flags.tcp_seq_num, 8041 seg.tso_flags.tcp_seq_num); 8042 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8043 .tso_seg[idx].tso_flags.ip_id, 8044 seg.tso_flags.ip_id); 8045 } 8046 8047 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx, 8048 qdf_nbuf_t msdu, uint16_t num_segs) 8049 { 8050 DP_STATS_UPD(pdev, 8051 tso_stats.tso_info.tso_packet_info[stats_idx] 8052 .num_seg, 8053 num_segs); 8054 8055 DP_STATS_UPD(pdev, 8056 tso_stats.tso_info.tso_packet_info[stats_idx] 8057 .tso_packet_len, 8058 qdf_nbuf_get_tcp_payload_len(msdu)); 8059 } 8060 8061 void dp_tso_segment_stats_update(struct dp_pdev *pdev, 8062 struct qdf_tso_seg_elem_t *stats_seg, 8063 uint32_t stats_idx) 8064 { 8065 uint8_t tso_seg_idx = 0; 8066 8067 while (stats_seg && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) { 8068 dp_tso_segment_update(pdev, stats_idx, 8069 tso_seg_idx, 8070 stats_seg->seg); 8071 ++tso_seg_idx; 8072 stats_seg = stats_seg->next; 8073 } 8074 } 8075 8076 void dp_txrx_clear_tso_stats(struct dp_soc *soc) 8077 { 8078 uint8_t loop_pdev; 8079 struct dp_pdev *pdev; 8080 8081 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 8082 pdev = soc->pdev_list[loop_pdev]; 8083 dp_init_tso_stats(pdev); 8084 } 8085 } 8086 #endif /* FEATURE_TSO_STATS */ 8087 8088 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer, 8089 enum cdp_peer_stats_type type, 8090 cdp_peer_stats_param_t *buf) 8091 { 8092 QDF_STATUS ret = QDF_STATUS_SUCCESS; 8093 struct dp_peer *tgt_peer; 8094 struct dp_txrx_peer *txrx_peer; 8095 struct dp_peer_per_pkt_stats *peer_stats; 8096 8097 txrx_peer = dp_get_txrx_peer(peer); 8098 if (!txrx_peer) 8099 return QDF_STATUS_E_FAILURE; 8100 8101 peer_stats = &txrx_peer->stats.per_pkt_stats; 8102 switch (type) { 8103 case cdp_peer_tx_ucast: 8104 buf->tx_ucast = peer_stats->tx.ucast; 8105 break; 8106 case cdp_peer_tx_mcast: 8107 buf->tx_mcast = peer_stats->tx.mcast; 8108 break; 8109 case cdp_peer_tx_inactive_time: 8110 tgt_peer = dp_get_tgt_peer_from_peer(peer); 8111 if (tgt_peer) 8112 buf->tx_inactive_time = 8113 tgt_peer->stats.tx.inactive_time; 8114 else 8115 ret = QDF_STATUS_E_FAILURE; 8116 break; 8117 case cdp_peer_rx_ucast: 8118 buf->rx_ucast = peer_stats->rx.unicast; 8119 break; 8120 default: 8121 ret = QDF_STATUS_E_FAILURE; 8122 break; 8123 } 8124 8125 return ret; 8126 } 8127 8128 #ifdef QCA_ENHANCED_STATS_SUPPORT 8129 #ifdef WLAN_FEATURE_11BE_MLO 8130 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8131 enum cdp_peer_stats_type type, 8132 cdp_peer_stats_param_t *buf) 8133 { 8134 QDF_STATUS ret = QDF_STATUS_E_FAILURE; 8135 struct dp_soc *soc = peer->vdev->pdev->soc; 8136 8137 if (IS_MLO_DP_MLD_PEER(peer)) { 8138 struct dp_peer *link_peer; 8139 struct dp_soc *link_peer_soc; 8140 8141 link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id, 8142 DP_MOD_ID_CDP); 8143 8144 if (link_peer) { 8145 link_peer_soc = link_peer->vdev->pdev->soc; 8146 ret = dp_monitor_peer_get_stats_param(link_peer_soc, 8147 link_peer, 8148 type, buf); 8149 dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP); 8150 } 8151 return ret; 8152 } else { 8153 return dp_monitor_peer_get_stats_param(soc, peer, type, buf); 8154 } 8155 } 8156 #else 8157 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8158 enum cdp_peer_stats_type type, 8159 cdp_peer_stats_param_t *buf) 8160 { 8161 struct dp_soc *soc = peer->vdev->pdev->soc; 8162 8163 return dp_monitor_peer_get_stats_param(soc, peer, type, buf); 8164 } 8165 #endif 8166 #else 8167 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8168 enum cdp_peer_stats_type type, 8169 cdp_peer_stats_param_t *buf) 8170 { 8171 QDF_STATUS ret = QDF_STATUS_SUCCESS; 8172 struct dp_txrx_peer *txrx_peer; 8173 struct dp_peer_extd_stats *peer_stats; 8174 8175 txrx_peer = dp_get_txrx_peer(peer); 8176 if (!txrx_peer) 8177 return QDF_STATUS_E_FAILURE; 8178 8179 peer_stats = &txrx_peer->stats.extd_stats; 8180 8181 switch (type) { 8182 case cdp_peer_tx_rate: 8183 buf->tx_rate = peer_stats->tx.tx_rate; 8184 break; 8185 case cdp_peer_tx_last_tx_rate: 8186 buf->last_tx_rate = peer_stats->tx.last_tx_rate; 8187 break; 8188 case cdp_peer_tx_ratecode: 8189 buf->tx_ratecode = peer_stats->tx.tx_ratecode; 8190 break; 8191 case cdp_peer_rx_rate: 8192 buf->rx_rate = peer_stats->rx.rx_rate; 8193 break; 8194 case cdp_peer_rx_last_rx_rate: 8195 buf->last_rx_rate = peer_stats->rx.last_rx_rate; 8196 break; 8197 case cdp_peer_rx_ratecode: 8198 buf->rx_ratecode = peer_stats->rx.rx_ratecode; 8199 break; 8200 case cdp_peer_rx_avg_snr: 8201 buf->rx_avg_snr = peer_stats->rx.avg_snr; 8202 break; 8203 case cdp_peer_rx_snr: 8204 buf->rx_snr = peer_stats->rx.snr; 8205 break; 8206 default: 8207 ret = QDF_STATUS_E_FAILURE; 8208 break; 8209 } 8210 8211 return ret; 8212 } 8213 #endif 8214 8215 /** 8216 * dp_is_wds_extended() - Check if wds ext is enabled 8217 * @txrx_peer: DP txrx_peer handle 8218 * 8219 * return: true if enabled, false if not 8220 */ 8221 #ifdef QCA_SUPPORT_WDS_EXTENDED 8222 static inline 8223 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer) 8224 { 8225 if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT, 8226 &txrx_peer->wds_ext.init)) 8227 return true; 8228 8229 return false; 8230 } 8231 #else 8232 static inline 8233 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer) 8234 { 8235 return false; 8236 } 8237 #endif /* QCA_SUPPORT_WDS_EXTENDED */ 8238 8239 /** 8240 * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en 8241 * @txrx_peer: DP txrx_peer handle 8242 * 8243 * Return: true if enabled, false if not 8244 */ 8245 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT 8246 static inline 8247 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer) 8248 { 8249 return txrx_peer->hw_txrx_stats_en; 8250 } 8251 #else 8252 static inline 8253 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer) 8254 { 8255 return false; 8256 } 8257 #endif 8258 8259 #ifdef WLAN_FEATURE_11BE_MLO 8260 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer) 8261 { 8262 /* ML primay link peer return mld_peer */ 8263 if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link) 8264 return peer->mld_peer; 8265 8266 return peer; 8267 } 8268 #else 8269 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer) 8270 { 8271 return peer; 8272 } 8273 #endif 8274 8275 /** 8276 * dp_update_vdev_basic_stats() - Update vdev basic stats 8277 * @txrx_peer: DP txrx_peer handle 8278 * @tgtobj: Pointer to buffer for vdev stats 8279 * 8280 * Return: None 8281 */ 8282 static inline 8283 void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer, 8284 struct cdp_vdev_stats *tgtobj) 8285 { 8286 if (qdf_unlikely(!txrx_peer || !tgtobj)) 8287 return; 8288 8289 if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) { 8290 tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num; 8291 tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes; 8292 tgtobj->tx.tx_failed += txrx_peer->tx_failed; 8293 } 8294 tgtobj->rx.to_stack.num += txrx_peer->to_stack.num; 8295 tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes; 8296 } 8297 8298 #ifdef QCA_ENHANCED_STATS_SUPPORT 8299 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj, 8300 void *arg) 8301 { 8302 struct dp_txrx_peer *txrx_peer; 8303 struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg; 8304 struct dp_peer_per_pkt_stats *per_pkt_stats; 8305 8306 txrx_peer = dp_get_txrx_peer(srcobj); 8307 if (qdf_unlikely(!txrx_peer)) 8308 goto link_stats; 8309 8310 if (qdf_unlikely(dp_is_wds_extended(txrx_peer))) 8311 return; 8312 8313 if (!dp_peer_is_primary_link_peer(srcobj)) 8314 goto link_stats; 8315 8316 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8317 8318 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8319 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8320 8321 link_stats: 8322 dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS); 8323 } 8324 8325 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 8326 struct dp_peer *peer) 8327 { 8328 struct dp_soc *soc = vdev->pdev->soc; 8329 struct dp_txrx_peer *txrx_peer; 8330 struct dp_peer_per_pkt_stats *per_pkt_stats; 8331 struct cdp_vdev_stats *vdev_stats = &vdev->stats; 8332 8333 txrx_peer = peer->txrx_peer; 8334 if (!txrx_peer) 8335 goto link_stats; 8336 8337 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8338 8339 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8340 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8341 8342 link_stats: 8343 dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS); 8344 } 8345 8346 #else 8347 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj, 8348 void *arg) 8349 { 8350 struct dp_txrx_peer *txrx_peer; 8351 struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg; 8352 struct dp_peer_per_pkt_stats *per_pkt_stats; 8353 struct dp_peer_extd_stats *extd_stats; 8354 8355 txrx_peer = dp_get_txrx_peer(srcobj); 8356 if (qdf_unlikely(!txrx_peer)) 8357 return; 8358 8359 if (qdf_unlikely(dp_is_wds_extended(txrx_peer))) 8360 return; 8361 8362 if (!dp_peer_is_primary_link_peer(srcobj)) 8363 return; 8364 8365 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8366 8367 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8368 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8369 8370 extd_stats = &txrx_peer->stats.extd_stats; 8371 DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats); 8372 } 8373 8374 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 8375 struct dp_peer *peer) 8376 { 8377 struct dp_txrx_peer *txrx_peer; 8378 struct dp_peer_per_pkt_stats *per_pkt_stats; 8379 struct dp_peer_extd_stats *extd_stats; 8380 struct cdp_vdev_stats *vdev_stats = &vdev->stats; 8381 8382 txrx_peer = peer->txrx_peer; 8383 if (!txrx_peer) 8384 return; 8385 8386 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8387 8388 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8389 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8390 8391 extd_stats = &txrx_peer->stats.extd_stats; 8392 DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats); 8393 } 8394 #endif 8395 8396 void dp_update_pdev_stats(struct dp_pdev *tgtobj, 8397 struct cdp_vdev_stats *srcobj) 8398 { 8399 uint8_t i; 8400 uint8_t pream_type; 8401 uint8_t mu_type; 8402 struct cdp_pdev_stats *pdev_stats = NULL; 8403 8404 pdev_stats = &tgtobj->stats; 8405 for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { 8406 for (i = 0; i < MAX_MCS; i++) { 8407 tgtobj->stats.tx.pkt_type[pream_type]. 8408 mcs_count[i] += 8409 srcobj->tx.pkt_type[pream_type]. 8410 mcs_count[i]; 8411 tgtobj->stats.rx.pkt_type[pream_type]. 8412 mcs_count[i] += 8413 srcobj->rx.pkt_type[pream_type]. 8414 mcs_count[i]; 8415 } 8416 } 8417 8418 for (i = 0; i < MAX_BW; i++) { 8419 tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i]; 8420 tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i]; 8421 } 8422 8423 for (i = 0; i < SS_COUNT; i++) { 8424 tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i]; 8425 tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i]; 8426 tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i]; 8427 } 8428 8429 for (i = 0; i < WME_AC_MAX; i++) { 8430 tgtobj->stats.tx.wme_ac_type[i] += 8431 srcobj->tx.wme_ac_type[i]; 8432 tgtobj->stats.rx.wme_ac_type[i] += 8433 srcobj->rx.wme_ac_type[i]; 8434 tgtobj->stats.tx.excess_retries_per_ac[i] += 8435 srcobj->tx.excess_retries_per_ac[i]; 8436 } 8437 8438 for (i = 0; i < MAX_GI; i++) { 8439 tgtobj->stats.tx.sgi_count[i] += 8440 srcobj->tx.sgi_count[i]; 8441 tgtobj->stats.rx.sgi_count[i] += 8442 srcobj->rx.sgi_count[i]; 8443 } 8444 8445 for (i = 0; i < MAX_RECEPTION_TYPES; i++) { 8446 tgtobj->stats.rx.reception_type[i] += 8447 srcobj->rx.reception_type[i]; 8448 tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i]; 8449 } 8450 8451 for (i = 0; i < MAX_TRANSMIT_TYPES; i++) { 8452 tgtobj->stats.tx.transmit_type[i].num_msdu += 8453 srcobj->tx.transmit_type[i].num_msdu; 8454 tgtobj->stats.tx.transmit_type[i].num_mpdu += 8455 srcobj->tx.transmit_type[i].num_mpdu; 8456 tgtobj->stats.tx.transmit_type[i].mpdu_tried += 8457 srcobj->tx.transmit_type[i].mpdu_tried; 8458 } 8459 8460 for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++) 8461 tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i]; 8462 8463 for (i = 0; i < MAX_MU_GROUP_ID; i++) 8464 tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i]; 8465 8466 for (i = 0; i < MAX_RU_LOCATIONS; i++) { 8467 tgtobj->stats.tx.ru_loc[i].num_msdu += 8468 srcobj->tx.ru_loc[i].num_msdu; 8469 tgtobj->stats.tx.ru_loc[i].num_mpdu += 8470 srcobj->tx.ru_loc[i].num_mpdu; 8471 tgtobj->stats.tx.ru_loc[i].mpdu_tried += 8472 srcobj->tx.ru_loc[i].mpdu_tried; 8473 } 8474 8475 tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus; 8476 tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success; 8477 tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried; 8478 tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu; 8479 tgtobj->stats.tx.mpdu_success_with_retries += 8480 srcobj->tx.mpdu_success_with_retries; 8481 tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts; 8482 tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate; 8483 tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate; 8484 tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs; 8485 tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate; 8486 tgtobj->stats.tx.mcast_last_tx_rate_mcs = 8487 srcobj->tx.mcast_last_tx_rate_mcs; 8488 tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate; 8489 tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate; 8490 tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode; 8491 tgtobj->stats.tx.ru_start = srcobj->tx.ru_start; 8492 tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones; 8493 tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi; 8494 tgtobj->stats.tx.nss_info = srcobj->tx.nss_info; 8495 tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info; 8496 tgtobj->stats.tx.bw_info = srcobj->tx.bw_info; 8497 tgtobj->stats.tx.gi_info = srcobj->tx.gi_info; 8498 tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info; 8499 tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes; 8500 tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num; 8501 tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num; 8502 tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes; 8503 tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num; 8504 tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes; 8505 tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num; 8506 tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes; 8507 tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num; 8508 tgtobj->stats.tx.tx_success.bytes += 8509 srcobj->tx.tx_success.bytes; 8510 tgtobj->stats.tx.nawds_mcast.num += 8511 srcobj->tx.nawds_mcast.num; 8512 tgtobj->stats.tx.nawds_mcast.bytes += 8513 srcobj->tx.nawds_mcast.bytes; 8514 tgtobj->stats.tx.nawds_mcast_drop += 8515 srcobj->tx.nawds_mcast_drop; 8516 tgtobj->stats.tx.num_ppdu_cookie_valid += 8517 srcobj->tx.num_ppdu_cookie_valid; 8518 tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed; 8519 tgtobj->stats.tx.ofdma += srcobj->tx.ofdma; 8520 tgtobj->stats.tx.stbc += srcobj->tx.stbc; 8521 tgtobj->stats.tx.ldpc += srcobj->tx.ldpc; 8522 tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt; 8523 tgtobj->stats.tx.retries += srcobj->tx.retries; 8524 tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt; 8525 tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt; 8526 tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt; 8527 tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt; 8528 tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num; 8529 tgtobj->stats.tx.dropped.fw_rem.bytes += 8530 srcobj->tx.dropped.fw_rem.bytes; 8531 tgtobj->stats.tx.dropped.fw_rem_tx += 8532 srcobj->tx.dropped.fw_rem_tx; 8533 tgtobj->stats.tx.dropped.fw_rem_notx += 8534 srcobj->tx.dropped.fw_rem_notx; 8535 tgtobj->stats.tx.dropped.fw_reason1 += 8536 srcobj->tx.dropped.fw_reason1; 8537 tgtobj->stats.tx.dropped.fw_reason2 += 8538 srcobj->tx.dropped.fw_reason2; 8539 tgtobj->stats.tx.dropped.fw_reason3 += 8540 srcobj->tx.dropped.fw_reason3; 8541 tgtobj->stats.tx.dropped.fw_rem_queue_disable += 8542 srcobj->tx.dropped.fw_rem_queue_disable; 8543 tgtobj->stats.tx.dropped.fw_rem_no_match += 8544 srcobj->tx.dropped.fw_rem_no_match; 8545 tgtobj->stats.tx.dropped.drop_threshold += 8546 srcobj->tx.dropped.drop_threshold; 8547 tgtobj->stats.tx.dropped.drop_link_desc_na += 8548 srcobj->tx.dropped.drop_link_desc_na; 8549 tgtobj->stats.tx.dropped.invalid_drop += 8550 srcobj->tx.dropped.invalid_drop; 8551 tgtobj->stats.tx.dropped.mcast_vdev_drop += 8552 srcobj->tx.dropped.mcast_vdev_drop; 8553 tgtobj->stats.tx.dropped.invalid_rr += 8554 srcobj->tx.dropped.invalid_rr; 8555 tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out; 8556 tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err; 8557 tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err; 8558 tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr; 8559 tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err; 8560 tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err; 8561 tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err; 8562 tgtobj->stats.rx.err.rxdma_wifi_parse_err += 8563 srcobj->rx.err.rxdma_wifi_parse_err; 8564 if (srcobj->rx.snr != 0) 8565 tgtobj->stats.rx.snr = srcobj->rx.snr; 8566 tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate; 8567 tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate; 8568 tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate; 8569 tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate; 8570 tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode; 8571 tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr; 8572 tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time; 8573 tgtobj->stats.rx.last_snr = srcobj->rx.last_snr; 8574 tgtobj->stats.rx.nss_info = srcobj->rx.nss_info; 8575 tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info; 8576 tgtobj->stats.rx.bw_info = srcobj->rx.bw_info; 8577 tgtobj->stats.rx.gi_info = srcobj->rx.gi_info; 8578 tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info; 8579 tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt; 8580 tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt; 8581 tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt; 8582 tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt; 8583 tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop; 8584 tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop; 8585 tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num; 8586 tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes; 8587 8588 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 8589 tgtobj->stats.rx.rcvd_reo[i].num += 8590 srcobj->rx.rcvd_reo[i].num; 8591 tgtobj->stats.rx.rcvd_reo[i].bytes += 8592 srcobj->rx.rcvd_reo[i].bytes; 8593 } 8594 8595 for (i = 0; i < CDP_MAX_LMACS; i++) { 8596 tgtobj->stats.rx.rx_lmac[i].num += 8597 srcobj->rx.rx_lmac[i].num; 8598 tgtobj->stats.rx.rx_lmac[i].bytes += 8599 srcobj->rx.rx_lmac[i].bytes; 8600 } 8601 8602 srcobj->rx.unicast.num = 8603 srcobj->rx.to_stack.num - 8604 (srcobj->rx.multicast.num); 8605 srcobj->rx.unicast.bytes = 8606 srcobj->rx.to_stack.bytes - 8607 (srcobj->rx.multicast.bytes); 8608 8609 tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num; 8610 tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes; 8611 tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num; 8612 tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes; 8613 tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num; 8614 tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes; 8615 tgtobj->stats.rx.raw.num += srcobj->rx.raw.num; 8616 tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes; 8617 tgtobj->stats.rx.intra_bss.pkts.num += 8618 srcobj->rx.intra_bss.pkts.num; 8619 tgtobj->stats.rx.intra_bss.pkts.bytes += 8620 srcobj->rx.intra_bss.pkts.bytes; 8621 tgtobj->stats.rx.intra_bss.fail.num += 8622 srcobj->rx.intra_bss.fail.num; 8623 tgtobj->stats.rx.intra_bss.fail.bytes += 8624 srcobj->rx.intra_bss.fail.bytes; 8625 8626 tgtobj->stats.tx.last_ack_rssi = 8627 srcobj->tx.last_ack_rssi; 8628 tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num; 8629 tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes; 8630 tgtobj->stats.rx.multipass_rx_pkt_drop += 8631 srcobj->rx.multipass_rx_pkt_drop; 8632 tgtobj->stats.rx.peer_unauth_rx_pkt_drop += 8633 srcobj->rx.peer_unauth_rx_pkt_drop; 8634 tgtobj->stats.rx.policy_check_drop += 8635 srcobj->rx.policy_check_drop; 8636 8637 for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { 8638 tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok += 8639 srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok; 8640 tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err += 8641 srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err; 8642 for (i = 0; i < SS_COUNT; i++) 8643 tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] += 8644 srcobj->rx.rx_mu[mu_type].ppdu_nss[i]; 8645 for (i = 0; i < MAX_MCS; i++) 8646 tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] += 8647 srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i]; 8648 } 8649 8650 for (i = 0; i < MAX_MCS; i++) { 8651 tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] += 8652 srcobj->rx.su_ax_ppdu_cnt.mcs_count[i]; 8653 tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i]; 8654 } 8655 8656 tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok; 8657 tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err; 8658 tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus; 8659 tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus; 8660 tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt; 8661 tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries; 8662 8663 DP_UPDATE_11BE_STATS(pdev_stats, srcobj); 8664 } 8665 8666 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj) 8667 { 8668 tgtobj->stats.tx_i.dropped.dropped_pkt.num = 8669 tgtobj->stats.tx_i.dropped.dma_error + 8670 tgtobj->stats.tx_i.dropped.ring_full + 8671 tgtobj->stats.tx_i.dropped.enqueue_fail + 8672 tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check + 8673 tgtobj->stats.tx_i.dropped.desc_na.num + 8674 tgtobj->stats.tx_i.dropped.res_full + 8675 tgtobj->stats.tx_i.dropped.drop_ingress + 8676 tgtobj->stats.tx_i.dropped.headroom_insufficient; 8677 } 8678 8679 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj, 8680 struct cdp_vdev_stats *srcobj) 8681 { 8682 tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate; 8683 tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs; 8684 tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate; 8685 tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs; 8686 tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate; 8687 } 8688 8689 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, 8690 struct dp_vdev *srcobj) 8691 { 8692 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast); 8693 8694 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd); 8695 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_in_fast_xmit_flow); 8696 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[0]); 8697 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[1]); 8698 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[2]); 8699 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[3]); 8700 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed); 8701 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts); 8702 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts); 8703 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt); 8704 DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error); 8705 DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err); 8706 DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num); 8707 DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target); 8708 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt); 8709 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt); 8710 DP_STATS_AGGR(tgtobj, srcobj, 8711 tx_i.mcast_en.dropped_map_error); 8712 DP_STATS_AGGR(tgtobj, srcobj, 8713 tx_i.mcast_en.dropped_self_mac); 8714 DP_STATS_AGGR(tgtobj, srcobj, 8715 tx_i.mcast_en.dropped_send_fail); 8716 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast); 8717 DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd); 8718 DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted); 8719 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error); 8720 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full); 8721 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail); 8722 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check); 8723 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num); 8724 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full); 8725 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress); 8726 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient); 8727 DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified); 8728 DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw); 8729 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd); 8730 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw); 8731 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw); 8732 8733 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt); 8734 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt); 8735 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt); 8736 8737 tgtobj->stats.tx_i.dropped.dropped_pkt.num = 8738 tgtobj->stats.tx_i.dropped.dma_error + 8739 tgtobj->stats.tx_i.dropped.ring_full + 8740 tgtobj->stats.tx_i.dropped.enqueue_fail + 8741 tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check + 8742 tgtobj->stats.tx_i.dropped.desc_na.num + 8743 tgtobj->stats.tx_i.dropped.res_full + 8744 tgtobj->stats.tx_i.dropped.drop_ingress + 8745 tgtobj->stats.tx_i.dropped.headroom_insufficient; 8746 } 8747 8748 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl, 8749 struct cdp_soc_stats *soc_stats) 8750 { 8751 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8752 uint8_t inx; 8753 uint8_t cpus; 8754 8755 /* soc tx stats */ 8756 soc_stats->tx.egress = soc->stats.tx.egress[0]; 8757 soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer; 8758 for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) { 8759 soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx]; 8760 soc_stats->tx.tx_hw_ring_full[inx] = 8761 soc->stats.tx.tcl_ring_full[inx]; 8762 } 8763 soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use; 8764 soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed; 8765 soc_stats->tx.invalid_release_source = 8766 soc->stats.tx.invalid_release_source; 8767 for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++) 8768 soc_stats->tx.wifi_internal_error[inx] = 8769 soc->stats.tx.wbm_internal_error[inx]; 8770 soc_stats->tx.non_wifi_internal_err = 8771 soc->stats.tx.non_wbm_internal_err; 8772 soc_stats->tx.tx_comp_loop_pkt_limit_hit = 8773 soc->stats.tx.tx_comp_loop_pkt_limit_hit; 8774 soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2; 8775 soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception; 8776 /* soc rx stats */ 8777 soc_stats->rx.ingress = soc->stats.rx.ingress; 8778 soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts; 8779 soc_stats->rx.rx_frags = soc->stats.rx.rx_frags; 8780 soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject; 8781 soc_stats->rx.bar_frame = soc->stats.rx.bar_frame; 8782 soc_stats->rx.rx_frag_err_len_error = 8783 soc->stats.rx.rx_frag_err_len_error; 8784 soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer; 8785 soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait; 8786 soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err; 8787 soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor; 8788 soc_stats->rx.reap_loop_pkt_limit_hit = 8789 soc->stats.rx.reap_loop_pkt_limit_hit; 8790 soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2; 8791 soc_stats->rx.near_full = soc->stats.rx.near_full; 8792 soc_stats->rx.msdu_scatter_wait_break = 8793 soc->stats.rx.msdu_scatter_wait_break; 8794 soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop; 8795 soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop; 8796 soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS, 8797 num_possible_cpus()); 8798 for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) { 8799 for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++) 8800 soc_stats->rx.rx_packets.pkts[cpus][inx] = 8801 soc->stats.rx.ring_packets[cpus][inx]; 8802 } 8803 soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected; 8804 soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop; 8805 soc_stats->rx.err.phy_ring_access_fail = 8806 soc->stats.rx.err.hal_ring_access_fail; 8807 soc_stats->rx.err.phy_ring_access_full_fail = 8808 soc->stats.rx.err.hal_ring_access_full_fail; 8809 for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++) 8810 soc_stats->rx.err.phy_rx_hw_error[inx] = 8811 soc->stats.rx.err.hal_reo_error[inx]; 8812 soc_stats->rx.err.phy_rx_hw_dest_dup = 8813 soc->stats.rx.err.hal_reo_dest_dup; 8814 soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup; 8815 soc_stats->rx.err.phy_rx_sw_err_dup = 8816 soc->stats.rx.err.hal_rxdma_err_dup; 8817 soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm; 8818 soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev; 8819 soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev; 8820 soc_stats->rx.err.pkt_delivered_no_peer = 8821 soc->stats.rx.err.pkt_delivered_no_peer; 8822 soc_stats->rx.err.defrag_peer_uninit = 8823 soc->stats.rx.err.defrag_peer_uninit; 8824 soc_stats->rx.err.invalid_sa_da_idx = 8825 soc->stats.rx.err.invalid_sa_da_idx; 8826 soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail; 8827 soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer; 8828 soc_stats->rx.err.rx_invalid_peer_id = 8829 soc->stats.rx.err.rx_invalid_peer_id; 8830 soc_stats->rx.err.rx_invalid_pkt_len = 8831 soc->stats.rx.err.rx_invalid_pkt_len; 8832 for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX, 8833 (uint32_t)HAL_RXDMA_ERR_MAX); inx++) 8834 soc_stats->rx.err.rx_sw_error[inx] = 8835 soc->stats.rx.err.rxdma_error[inx]; 8836 for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX, 8837 (uint32_t)HAL_REO_ERR_MAX); inx++) 8838 soc_stats->rx.err.rx_hw_error[inx] = 8839 soc->stats.rx.err.reo_error[inx]; 8840 soc_stats->rx.err.rx_desc_invalid_magic = 8841 soc->stats.rx.err.rx_desc_invalid_magic; 8842 soc_stats->rx.err.rx_hw_cmd_send_fail = 8843 soc->stats.rx.err.reo_cmd_send_fail; 8844 soc_stats->rx.err.rx_hw_cmd_send_drain = 8845 soc->stats.rx.err.reo_cmd_send_drain; 8846 soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu; 8847 soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie; 8848 soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie; 8849 soc_stats->rx.err.rx_2k_jump_delba_sent = 8850 soc->stats.rx.err.rx_2k_jump_delba_sent; 8851 soc_stats->rx.err.rx_2k_jump_to_stack = 8852 soc->stats.rx.err.rx_2k_jump_to_stack; 8853 soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop; 8854 soc_stats->rx.err.rx_hw_err_msdu_buf_rcved = 8855 soc->stats.rx.err.reo_err_msdu_buf_rcved; 8856 soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie = 8857 soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie; 8858 soc_stats->rx.err.rx_hw_err_oor_drop = 8859 soc->stats.rx.err.reo_err_oor_drop; 8860 soc_stats->rx.err.rx_hw_err_oor_to_stack = 8861 soc->stats.rx.err.reo_err_oor_to_stack; 8862 soc_stats->rx.err.rx_hw_err_oor_sg_count = 8863 soc->stats.rx.err.reo_err_oor_sg_count; 8864 soc_stats->rx.err.msdu_count_mismatch = 8865 soc->stats.rx.err.msdu_count_mismatch; 8866 soc_stats->rx.err.invalid_link_cookie = 8867 soc->stats.rx.err.invalid_link_cookie; 8868 soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail; 8869 soc_stats->rx.err.dup_refill_link_desc = 8870 soc->stats.rx.err.dup_refill_link_desc; 8871 soc_stats->rx.err.msdu_continuation_err = 8872 soc->stats.rx.err.msdu_continuation_err; 8873 soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count; 8874 soc_stats->rx.err.bar_handle_fail_count = 8875 soc->stats.rx.err.bar_handle_fail_count; 8876 soc_stats->rx.err.intrabss_eapol_drop = 8877 soc->stats.rx.err.intrabss_eapol_drop; 8878 soc_stats->rx.err.pn_in_dest_check_fail = 8879 soc->stats.rx.err.pn_in_dest_check_fail; 8880 soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err; 8881 soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count; 8882 /* soc ast stats */ 8883 soc_stats->ast.added = soc->stats.ast.added; 8884 soc_stats->ast.deleted = soc->stats.ast.deleted; 8885 soc_stats->ast.aged_out = soc->stats.ast.aged_out; 8886 soc_stats->ast.map_err = soc->stats.ast.map_err; 8887 soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch; 8888 /* soc mec stats */ 8889 soc_stats->mec.added = soc->stats.mec.added; 8890 soc_stats->mec.deleted = soc->stats.mec.deleted; 8891 8892 return QDF_STATUS_SUCCESS; 8893 } 8894 8895 #ifdef QCA_PEER_EXT_STATS 8896 QDF_STATUS 8897 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 8898 uint8_t *peer_mac, 8899 struct cdp_delay_tid_stats *delay_stats) 8900 { 8901 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8902 struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, 8903 DP_MOD_ID_CDP); 8904 struct dp_peer_delay_stats *pext_stats; 8905 struct cdp_delay_rx_stats *rx_delay; 8906 struct cdp_delay_tx_stats *tx_delay; 8907 uint8_t tid; 8908 8909 if (!peer) 8910 return QDF_STATUS_E_FAILURE; 8911 8912 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) { 8913 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8914 return QDF_STATUS_E_FAILURE; 8915 } 8916 8917 if (!peer->txrx_peer) { 8918 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8919 return QDF_STATUS_E_FAILURE; 8920 } 8921 8922 pext_stats = peer->txrx_peer->delay_stats; 8923 if (!pext_stats) { 8924 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8925 return QDF_STATUS_E_FAILURE; 8926 } 8927 8928 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 8929 rx_delay = &delay_stats[tid].rx_delay; 8930 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 8931 &rx_delay->to_stack_delay, tid, 8932 CDP_HIST_TYPE_REAP_STACK); 8933 tx_delay = &delay_stats[tid].tx_delay; 8934 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 8935 &tx_delay->tx_swq_delay, tid, 8936 CDP_HIST_TYPE_SW_ENQEUE_DELAY); 8937 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 8938 &tx_delay->hwtx_delay, tid, 8939 CDP_HIST_TYPE_HW_COMP_DELAY); 8940 } 8941 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8942 8943 return QDF_STATUS_SUCCESS; 8944 } 8945 #else 8946 QDF_STATUS 8947 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 8948 uint8_t *peer_mac, 8949 struct cdp_delay_tid_stats *delay_stats) 8950 { 8951 return QDF_STATUS_E_FAILURE; 8952 } 8953 #endif /* QCA_PEER_EXT_STATS */ 8954 8955 #ifdef WLAN_PEER_JITTER 8956 QDF_STATUS 8957 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 8958 uint8_t vdev_id, uint8_t *peer_mac, 8959 struct cdp_peer_tid_stats *tid_stats) 8960 { 8961 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8962 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 8963 struct dp_peer *peer; 8964 uint8_t tid; 8965 8966 if (!pdev) 8967 return QDF_STATUS_E_FAILURE; 8968 8969 if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) 8970 return QDF_STATUS_E_FAILURE; 8971 8972 peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, DP_MOD_ID_CDP); 8973 if (!peer) 8974 return QDF_STATUS_E_FAILURE; 8975 8976 if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) { 8977 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8978 return QDF_STATUS_E_FAILURE; 8979 } 8980 8981 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 8982 struct cdp_peer_tid_stats *rx_tid = 8983 &peer->txrx_peer->jitter_stats[tid]; 8984 8985 tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter; 8986 tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay; 8987 tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err; 8988 tid_stats[tid].tx_total_success = rx_tid->tx_total_success; 8989 tid_stats[tid].tx_drop = rx_tid->tx_drop; 8990 } 8991 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8992 8993 return QDF_STATUS_SUCCESS; 8994 } 8995 #else 8996 QDF_STATUS 8997 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 8998 uint8_t vdev_id, uint8_t *peer_mac, 8999 struct cdp_peer_tid_stats *tid_stats) 9000 { 9001 return QDF_STATUS_E_FAILURE; 9002 } 9003 #endif /* WLAN_PEER_JITTER */ 9004 9005 #ifdef WLAN_TX_PKT_CAPTURE_ENH 9006 QDF_STATUS 9007 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 9008 uint8_t vdev_id, uint8_t *peer_mac, 9009 struct cdp_peer_tx_capture_stats *stats) 9010 { 9011 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9012 struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, 9013 DP_MOD_ID_TX_CAPTURE); 9014 QDF_STATUS status; 9015 9016 if (!peer) 9017 return QDF_STATUS_E_FAILURE; 9018 9019 status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats); 9020 dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE); 9021 9022 return status; 9023 } 9024 9025 QDF_STATUS 9026 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9027 struct cdp_pdev_tx_capture_stats *stats) 9028 { 9029 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9030 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9031 9032 if (!pdev) 9033 return QDF_STATUS_E_FAILURE; 9034 9035 return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats); 9036 } 9037 #else /* WLAN_TX_PKT_CAPTURE_ENH */ 9038 QDF_STATUS 9039 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 9040 uint8_t vdev_id, uint8_t *peer_mac, 9041 struct cdp_peer_tx_capture_stats *stats) 9042 { 9043 return QDF_STATUS_E_FAILURE; 9044 } 9045 9046 QDF_STATUS 9047 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9048 struct cdp_pdev_tx_capture_stats *stats) 9049 { 9050 return QDF_STATUS_E_FAILURE; 9051 } 9052 #endif /* WLAN_TX_PKT_CAPTURE_ENH */ 9053 9054 #ifdef WLAN_TELEMETRY_STATS_SUPPORT 9055 QDF_STATUS 9056 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9057 struct cdp_pdev_telemetry_stats *stats) 9058 { 9059 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9060 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9061 uint8_t ac = 0; 9062 9063 if (!pdev) 9064 return QDF_STATUS_E_FAILURE; 9065 9066 /* consumption is in micro seconds, convert it to seconds and 9067 * then calculate %age per sec 9068 */ 9069 for (ac = 0; ac < WME_AC_MAX; ac++) 9070 stats->link_airtime[ac] = 9071 ((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000); 9072 stats->tx_mpdu_failed = pdev->stats.telemetry_stats.tx_mpdu_failed; 9073 stats->tx_mpdu_total = pdev->stats.telemetry_stats.tx_mpdu_total; 9074 9075 return QDF_STATUS_SUCCESS; 9076 } 9077 9078 QDF_STATUS 9079 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, 9080 struct cdp_peer_telemetry_stats *stats) 9081 { 9082 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9083 struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL, 9084 DP_MOD_ID_MISC); 9085 9086 if (!peer) 9087 return QDF_STATUS_E_FAILURE; 9088 9089 dp_monitor_peer_telemetry_stats(peer, stats); 9090 dp_peer_unref_delete(peer, DP_MOD_ID_MISC); 9091 9092 return QDF_STATUS_SUCCESS; 9093 } 9094 #endif 9095