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