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 500 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_mgmt_subtype[DP_MAX_STRING_LEN]; 4148 char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN]; 4149 4150 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:"); 4151 DP_PRINT_STATS("mac_id__word = %u", 4152 dp_stats_buf->mac_id__word); 4153 DP_PRINT_STATS("ppdu_recvd = %u", 4154 dp_stats_buf->ppdu_recvd); 4155 DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u", 4156 dp_stats_buf->mpdu_cnt_fcs_ok); 4157 DP_PRINT_STATS("mpdu_cnt_fcs_err = %u", 4158 dp_stats_buf->mpdu_cnt_fcs_err); 4159 DP_PRINT_STATS("tcp_msdu_cnt = %u", 4160 dp_stats_buf->tcp_msdu_cnt); 4161 DP_PRINT_STATS("tcp_ack_msdu_cnt = %u", 4162 dp_stats_buf->tcp_ack_msdu_cnt); 4163 DP_PRINT_STATS("udp_msdu_cnt = %u", 4164 dp_stats_buf->udp_msdu_cnt); 4165 DP_PRINT_STATS("other_msdu_cnt = %u", 4166 dp_stats_buf->other_msdu_cnt); 4167 DP_PRINT_STATS("fw_ring_mpdu_ind = %u", 4168 dp_stats_buf->fw_ring_mpdu_ind); 4169 4170 for (i = 0; i < DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) { 4171 index += qdf_snprint(&fw_ring_mgmt_subtype[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_mgmt_subtype); 4177 4178 index = 0; 4179 for (i = 0; i < DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) { 4180 index += qdf_snprint(&fw_ring_ctrl_subtype[index], 4181 DP_MAX_STRING_LEN - index, 4182 " %u:%u,", i, 4183 dp_stats_buf->fw_ring_ctrl_subtype[i]); 4184 } 4185 DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype); 4186 DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u", 4187 dp_stats_buf->fw_ring_mcast_data_msdu); 4188 DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u", 4189 dp_stats_buf->fw_ring_bcast_data_msdu); 4190 DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u", 4191 dp_stats_buf->fw_ring_ucast_data_msdu); 4192 DP_PRINT_STATS("fw_ring_null_data_msdu = %u", 4193 dp_stats_buf->fw_ring_null_data_msdu); 4194 DP_PRINT_STATS("fw_ring_mpdu_drop = %u", 4195 dp_stats_buf->fw_ring_mpdu_drop); 4196 DP_PRINT_STATS("ofld_local_data_ind_cnt = %u", 4197 dp_stats_buf->ofld_local_data_ind_cnt); 4198 DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u", 4199 dp_stats_buf->ofld_local_data_buf_recycle_cnt); 4200 DP_PRINT_STATS("drx_local_data_ind_cnt = %u", 4201 dp_stats_buf->drx_local_data_ind_cnt); 4202 DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u", 4203 dp_stats_buf->drx_local_data_buf_recycle_cnt); 4204 DP_PRINT_STATS("local_nondata_ind_cnt = %u", 4205 dp_stats_buf->local_nondata_ind_cnt); 4206 DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u", 4207 dp_stats_buf->local_nondata_buf_recycle_cnt); 4208 DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u", 4209 dp_stats_buf->fw_status_buf_ring_refill_cnt); 4210 DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u", 4211 dp_stats_buf->fw_status_buf_ring_empty_cnt); 4212 DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u", 4213 dp_stats_buf->fw_pkt_buf_ring_refill_cnt); 4214 DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u", 4215 dp_stats_buf->fw_pkt_buf_ring_empty_cnt); 4216 DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u", 4217 dp_stats_buf->fw_link_buf_ring_refill_cnt); 4218 DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u", 4219 dp_stats_buf->fw_link_buf_ring_empty_cnt); 4220 DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u", 4221 dp_stats_buf->host_pkt_buf_ring_refill_cnt); 4222 DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u", 4223 dp_stats_buf->host_pkt_buf_ring_empty_cnt); 4224 DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u", 4225 dp_stats_buf->mon_pkt_buf_ring_refill_cnt); 4226 DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u", 4227 dp_stats_buf->mon_pkt_buf_ring_empty_cnt); 4228 DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u", 4229 dp_stats_buf->mon_status_buf_ring_refill_cnt); 4230 DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u", 4231 dp_stats_buf->mon_status_buf_ring_empty_cnt); 4232 DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u", 4233 dp_stats_buf->mon_desc_buf_ring_refill_cnt); 4234 DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u", 4235 dp_stats_buf->mon_desc_buf_ring_empty_cnt); 4236 DP_PRINT_STATS("mon_dest_ring_update_cnt = %u", 4237 dp_stats_buf->mon_dest_ring_update_cnt); 4238 DP_PRINT_STATS("mon_dest_ring_full_cnt = %u", 4239 dp_stats_buf->mon_dest_ring_full_cnt); 4240 DP_PRINT_STATS("rx_suspend_cnt = %u", 4241 dp_stats_buf->rx_suspend_cnt); 4242 DP_PRINT_STATS("rx_suspend_fail_cnt = %u", 4243 dp_stats_buf->rx_suspend_fail_cnt); 4244 DP_PRINT_STATS("rx_resume_cnt = %u", 4245 dp_stats_buf->rx_resume_cnt); 4246 DP_PRINT_STATS("rx_resume_fail_cnt = %u", 4247 dp_stats_buf->rx_resume_fail_cnt); 4248 DP_PRINT_STATS("rx_ring_switch_cnt = %u", 4249 dp_stats_buf->rx_ring_switch_cnt); 4250 DP_PRINT_STATS("rx_ring_restore_cnt = %u", 4251 dp_stats_buf->rx_ring_restore_cnt); 4252 DP_PRINT_STATS("rx_flush_cnt = %u\n", 4253 dp_stats_buf->rx_flush_cnt); 4254 } 4255 4256 /** 4257 * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v() - display 4258 * htt_rx_pdev_fw_ring_mpdu_err_tlv_v 4259 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v 4260 * 4261 * Return: void 4262 */ 4263 static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf) 4264 { 4265 htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf = 4266 (htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf; 4267 uint8_t i; 4268 uint16_t index = 0; 4269 char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN); 4270 4271 if (!fw_ring_mpdu_err) { 4272 dp_stats_err("Output buffer not allocated"); 4273 return; 4274 } 4275 4276 DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:"); 4277 for (i = 0; i < DP_HTT_FW_RING_MPDU_ERR_LEN; i++) { 4278 index += qdf_snprint(&fw_ring_mpdu_err[index], 4279 DP_MAX_STRING_LEN - index, 4280 " %u:%u,", i, 4281 dp_stats_buf->fw_ring_mpdu_err[i]); 4282 } 4283 DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err); 4284 qdf_mem_free(fw_ring_mpdu_err); 4285 } 4286 4287 /** 4288 * dp_print_rx_pdev_fw_mpdu_drop_tlv_v() - display htt_rx_pdev_fw_mpdu_drop_tlv_v 4289 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v 4290 * 4291 * Return: void 4292 */ 4293 static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf) 4294 { 4295 htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf = 4296 (htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf; 4297 uint8_t i; 4298 uint16_t index = 0; 4299 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4300 char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN); 4301 4302 if (!fw_mpdu_drop) { 4303 dp_stats_err("Output buffer not allocated"); 4304 return; 4305 } 4306 4307 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX); 4308 4309 DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:"); 4310 for (i = 0; i < tag_len; i++) { 4311 index += qdf_snprint(&fw_mpdu_drop[index], 4312 DP_MAX_STRING_LEN - index, 4313 " %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]); 4314 } 4315 DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop); 4316 qdf_mem_free(fw_mpdu_drop); 4317 } 4318 4319 /** 4320 * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error 4321 * packets 4322 * @tag_buf: Buffer 4323 * 4324 * Return: void 4325 */ 4326 static uint64_t 4327 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf) 4328 { 4329 htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf = 4330 (htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf; 4331 4332 uint8_t i; 4333 uint16_t index = 0; 4334 char rxdma_err_cnt[DP_MAX_STRING_LEN] = {'\0'}; 4335 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4336 uint64_t total_rxdma_err_cnt = 0; 4337 4338 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE); 4339 4340 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V"); 4341 4342 for (i = 0; i < tag_len; i++) { 4343 index += snprintf(&rxdma_err_cnt[index], 4344 DP_MAX_STRING_LEN - index, 4345 " %u() -%u,", i, 4346 dp_stats_buf->rxdma_err[i]); 4347 total_rxdma_err_cnt += dp_stats_buf->rxdma_err[i]; 4348 } 4349 4350 DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt); 4351 4352 return total_rxdma_err_cnt; 4353 } 4354 4355 /** 4356 * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error 4357 * packets 4358 * @tag_buf: Buffer 4359 * 4360 * Return: void 4361 */ 4362 static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf) 4363 { 4364 htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf = 4365 (htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf; 4366 4367 uint8_t i; 4368 uint16_t index = 0; 4369 char reo_err_cnt[DP_MAX_STRING_LEN] = {'\0'}; 4370 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4371 4372 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE); 4373 4374 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V"); 4375 4376 for (i = 0; i < tag_len; i++) { 4377 index += snprintf(&reo_err_cnt[index], 4378 DP_MAX_STRING_LEN - index, 4379 " %u() -%u,", i, 4380 dp_stats_buf->reo_err[i]); 4381 } 4382 4383 DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt); 4384 } 4385 4386 /** 4387 * dp_print_rx_reo_debug_stats_tlv() - REO Statistics 4388 * @tag_buf: Buffer 4389 * 4390 * Return: void 4391 */ 4392 static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf) 4393 { 4394 htt_rx_reo_resource_stats_tlv_v *dp_stats_buf = 4395 (htt_rx_reo_resource_stats_tlv_v *)tag_buf; 4396 4397 DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV"); 4398 4399 DP_PRINT_STATS("sample_id() - %u ", 4400 dp_stats_buf->sample_id); 4401 DP_PRINT_STATS("total_max: %u ", 4402 dp_stats_buf->total_max); 4403 DP_PRINT_STATS("total_avg: %u ", 4404 dp_stats_buf->total_avg); 4405 DP_PRINT_STATS("total_sample: %u ", 4406 dp_stats_buf->total_sample); 4407 DP_PRINT_STATS("non_zeros_avg: %u ", 4408 dp_stats_buf->non_zeros_avg); 4409 DP_PRINT_STATS("non_zeros_sample: %u ", 4410 dp_stats_buf->non_zeros_sample); 4411 DP_PRINT_STATS("last_non_zeros_max: %u ", 4412 dp_stats_buf->last_non_zeros_max); 4413 DP_PRINT_STATS("last_non_zeros_min: %u ", 4414 dp_stats_buf->last_non_zeros_min); 4415 DP_PRINT_STATS("last_non_zeros_avg: %u ", 4416 dp_stats_buf->last_non_zeros_avg); 4417 DP_PRINT_STATS("last_non_zeros_sample: %u\n ", 4418 dp_stats_buf->last_non_zeros_sample); 4419 } 4420 4421 /** 4422 * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors 4423 * @tag_buf: Buffer 4424 * 4425 * Return: void 4426 */ 4427 static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf) 4428 { 4429 htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf = 4430 (htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf; 4431 4432 uint8_t i = 0; 4433 uint16_t index = 0; 4434 char phy_errs[DP_MAX_STRING_LEN]; 4435 4436 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV"); 4437 4438 DP_PRINT_STATS("mac_id_word() - %u", 4439 dp_stats_buf->mac_id__word); 4440 DP_PRINT_STATS("total_phy_err_cnt: %u", 4441 dp_stats_buf->total_phy_err_cnt); 4442 4443 for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) { 4444 index += snprintf(&phy_errs[index], 4445 DP_MAX_STRING_LEN - index, 4446 " %u:%u,", i, dp_stats_buf->phy_err[i]); 4447 } 4448 4449 DP_PRINT_STATS("phy_errs: %s\n", phy_errs); 4450 } 4451 4452 void dp_htt_stats_print_tag(struct dp_pdev *pdev, 4453 uint8_t tag_type, uint32_t *tag_buf) 4454 { 4455 switch (tag_type) { 4456 case HTT_STATS_TX_PDEV_CMN_TAG: 4457 dp_print_tx_pdev_stats_cmn_tlv(tag_buf); 4458 break; 4459 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 4460 dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf); 4461 break; 4462 case HTT_STATS_TX_PDEV_SIFS_TAG: 4463 dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf); 4464 break; 4465 case HTT_STATS_TX_PDEV_FLUSH_TAG: 4466 dp_print_tx_pdev_stats_flush_tlv_v(tag_buf); 4467 break; 4468 4469 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 4470 dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf); 4471 break; 4472 4473 case HTT_STATS_STRING_TAG: 4474 dp_print_stats_string_tlv(tag_buf); 4475 break; 4476 4477 case HTT_STATS_TX_HWQ_CMN_TAG: 4478 dp_print_tx_hwq_stats_cmn_tlv(tag_buf); 4479 break; 4480 4481 case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG: 4482 dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf); 4483 break; 4484 4485 case HTT_STATS_TX_HWQ_CMD_RESULT_TAG: 4486 dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf); 4487 break; 4488 4489 case HTT_STATS_TX_HWQ_CMD_STALL_TAG: 4490 dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf); 4491 break; 4492 4493 case HTT_STATS_TX_HWQ_FES_STATUS_TAG: 4494 dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf); 4495 break; 4496 4497 case HTT_STATS_TX_TQM_GEN_MPDU_TAG: 4498 dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf); 4499 break; 4500 4501 case HTT_STATS_TX_TQM_LIST_MPDU_TAG: 4502 dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf); 4503 break; 4504 4505 case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG: 4506 dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf); 4507 break; 4508 4509 case HTT_STATS_TX_TQM_CMN_TAG: 4510 dp_print_tx_tqm_cmn_stats_tlv(tag_buf); 4511 break; 4512 4513 case HTT_STATS_TX_TQM_PDEV_TAG: 4514 dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf); 4515 break; 4516 4517 case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG: 4518 dp_print_tx_tqm_cmdq_status_tlv(tag_buf); 4519 break; 4520 4521 case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG: 4522 dp_print_tx_de_eapol_packets_stats_tlv(tag_buf); 4523 break; 4524 4525 case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG: 4526 dp_print_tx_de_classify_failed_stats_tlv(tag_buf); 4527 break; 4528 4529 case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG: 4530 dp_print_tx_de_classify_stats_tlv(tag_buf); 4531 break; 4532 4533 case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG: 4534 dp_print_tx_de_classify_status_stats_tlv(tag_buf); 4535 break; 4536 4537 case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG: 4538 dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf); 4539 break; 4540 4541 case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG: 4542 dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf); 4543 break; 4544 4545 case HTT_STATS_TX_DE_CMN_TAG: 4546 dp_print_tx_de_cmn_stats_tlv(tag_buf); 4547 break; 4548 4549 case HTT_STATS_RING_IF_TAG: 4550 dp_print_ring_if_stats_tlv(tag_buf); 4551 break; 4552 4553 case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG: 4554 dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf); 4555 break; 4556 4557 case HTT_STATS_SFM_CMN_TAG: 4558 dp_print_sfm_cmn_tlv(tag_buf); 4559 break; 4560 4561 case HTT_STATS_SRING_STATS_TAG: 4562 dp_print_sring_stats_tlv(tag_buf); 4563 break; 4564 4565 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 4566 dp_print_rx_pdev_fw_stats_tlv(tag_buf); 4567 break; 4568 4569 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 4570 dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf); 4571 break; 4572 4573 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 4574 dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf); 4575 break; 4576 4577 case HTT_STATS_RX_SOC_FW_STATS_TAG: 4578 dp_print_rx_soc_fw_stats_tlv(tag_buf); 4579 break; 4580 4581 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 4582 dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf); 4583 break; 4584 4585 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 4586 dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 4587 tag_buf); 4588 break; 4589 4590 case HTT_STATS_TX_PDEV_RATE_STATS_TAG: 4591 dp_print_tx_pdev_rate_stats_tlv(tag_buf); 4592 break; 4593 4594 case HTT_STATS_RX_PDEV_RATE_STATS_TAG: 4595 dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf); 4596 break; 4597 4598 case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG: 4599 dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf); 4600 break; 4601 4602 case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG: 4603 dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf); 4604 break; 4605 4606 case HTT_STATS_TX_SCHED_CMN_TAG: 4607 dp_print_stats_tx_sched_cmn_tlv(tag_buf); 4608 break; 4609 4610 case HTT_STATS_TX_PDEV_MPDU_STATS_TAG: 4611 dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf); 4612 break; 4613 4614 case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG: 4615 dp_print_sched_txq_cmd_posted_tlv_v(tag_buf); 4616 break; 4617 4618 case HTT_STATS_RING_IF_CMN_TAG: 4619 dp_print_ring_if_cmn_tlv(tag_buf); 4620 break; 4621 4622 case HTT_STATS_SFM_CLIENT_USER_TAG: 4623 dp_print_sfm_client_user_tlv_v(tag_buf); 4624 break; 4625 4626 case HTT_STATS_SFM_CLIENT_TAG: 4627 dp_print_sfm_client_tlv(tag_buf); 4628 break; 4629 4630 case HTT_STATS_TX_TQM_ERROR_STATS_TAG: 4631 dp_print_tx_tqm_error_stats_tlv(tag_buf); 4632 break; 4633 4634 case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG: 4635 dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf); 4636 break; 4637 4638 case HTT_STATS_SRING_CMN_TAG: 4639 dp_print_sring_cmn_tlv(tag_buf); 4640 break; 4641 4642 case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG: 4643 dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf); 4644 break; 4645 4646 case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG: 4647 dp_print_tx_selfgen_cmn_stats_tlv(tag_buf); 4648 break; 4649 4650 case HTT_STATS_TX_SELFGEN_AC_STATS_TAG: 4651 dp_print_tx_selfgen_ac_stats_tlv(tag_buf); 4652 break; 4653 4654 case HTT_STATS_TX_SELFGEN_AX_STATS_TAG: 4655 dp_print_tx_selfgen_ax_stats_tlv(tag_buf); 4656 break; 4657 4658 case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG: 4659 dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf); 4660 break; 4661 4662 case HTT_STATS_TX_SELFGEN_BE_STATS_TAG: 4663 dp_print_tx_selfgen_be_stats_tlv(tag_buf); 4664 break; 4665 4666 case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG: 4667 dp_print_tx_selfgen_be_err_stats_tlv(tag_buf); 4668 break; 4669 4670 case HTT_STATS_TX_SOUNDING_STATS_TAG: 4671 dp_print_tx_sounding_stats_tlv(tag_buf); 4672 break; 4673 4674 case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG: 4675 dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf); 4676 break; 4677 4678 case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG: 4679 dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf); 4680 break; 4681 4682 case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG: 4683 dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf); 4684 break; 4685 4686 case HTT_STATS_HW_INTR_MISC_TAG: 4687 dp_print_hw_stats_intr_misc_tlv(tag_buf); 4688 break; 4689 4690 case HTT_STATS_HW_WD_TIMEOUT_TAG: 4691 dp_print_hw_stats_wd_timeout_tlv(tag_buf); 4692 break; 4693 4694 case HTT_STATS_HW_PDEV_ERRS_TAG: 4695 dp_print_hw_stats_pdev_errs_tlv(tag_buf); 4696 break; 4697 4698 case HTT_STATS_COUNTER_NAME_TAG: 4699 dp_print_counter_tlv(tag_buf); 4700 break; 4701 4702 case HTT_STATS_TX_TID_DETAILS_TAG: 4703 dp_print_tx_tid_stats_tlv(tag_buf); 4704 break; 4705 4706 case HTT_STATS_TX_TID_DETAILS_V1_TAG: 4707 dp_print_tx_tid_stats_v1_tlv(tag_buf); 4708 break; 4709 4710 case HTT_STATS_RX_TID_DETAILS_TAG: 4711 dp_print_rx_tid_stats_tlv(tag_buf); 4712 break; 4713 4714 case HTT_STATS_PEER_STATS_CMN_TAG: 4715 dp_print_peer_stats_cmn_tlv(tag_buf); 4716 break; 4717 4718 case HTT_STATS_PEER_DETAILS_TAG: 4719 dp_print_peer_details_tlv(tag_buf); 4720 break; 4721 4722 case HTT_STATS_PEER_MSDU_FLOWQ_TAG: 4723 dp_print_msdu_flow_stats_tlv(tag_buf); 4724 break; 4725 4726 case HTT_STATS_PEER_TX_RATE_STATS_TAG: 4727 dp_print_tx_peer_rate_stats_tlv(tag_buf); 4728 break; 4729 4730 case HTT_STATS_PEER_RX_RATE_STATS_TAG: 4731 dp_print_rx_peer_rate_stats_tlv(tag_buf); 4732 break; 4733 4734 case HTT_STATS_TX_DE_COMPL_STATS_TAG: 4735 dp_print_tx_de_compl_stats_tlv(tag_buf); 4736 break; 4737 4738 case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG: 4739 pdev->stats.err.fw_reported_rxdma_error = 4740 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf); 4741 break; 4742 4743 case HTT_STATS_RX_REFILL_REO_ERR_TAG: 4744 dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf); 4745 break; 4746 4747 case HTT_STATS_RX_REO_RESOURCE_STATS_TAG: 4748 dp_print_rx_reo_debug_stats_tlv(tag_buf); 4749 break; 4750 4751 case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG: 4752 dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf); 4753 break; 4754 4755 default: 4756 break; 4757 } 4758 } 4759 4760 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf) 4761 { 4762 void *dest_ptr = NULL; 4763 uint32_t size = 0; 4764 uint32_t size_expected = 0; 4765 uint64_t val = 1; 4766 4767 pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type); 4768 switch (tag_type) { 4769 case HTT_STATS_TX_PDEV_CMN_TAG: 4770 dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv; 4771 size = sizeof(htt_tx_pdev_stats_cmn_tlv); 4772 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv); 4773 break; 4774 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 4775 dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv; 4776 size = sizeof(htt_tx_pdev_stats_urrn_tlv_v); 4777 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v); 4778 break; 4779 case HTT_STATS_TX_PDEV_SIFS_TAG: 4780 dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv; 4781 size = sizeof(htt_tx_pdev_stats_sifs_tlv_v); 4782 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v); 4783 break; 4784 case HTT_STATS_TX_PDEV_FLUSH_TAG: 4785 dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv; 4786 size = sizeof(htt_tx_pdev_stats_flush_tlv_v); 4787 size_expected = 4788 sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v); 4789 break; 4790 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 4791 dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv; 4792 size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v); 4793 size_expected = 4794 sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v); 4795 break; 4796 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 4797 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv; 4798 size = sizeof(htt_rx_pdev_fw_stats_tlv); 4799 size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv); 4800 break; 4801 case HTT_STATS_RX_SOC_FW_STATS_TAG: 4802 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv; 4803 size = sizeof(htt_rx_soc_fw_stats_tlv); 4804 size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv); 4805 break; 4806 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 4807 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv; 4808 size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v); 4809 size_expected = 4810 sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v); 4811 break; 4812 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 4813 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv; 4814 size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 4815 size_expected = 4816 sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 4817 break; 4818 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 4819 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv; 4820 size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 4821 size_expected = 4822 sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 4823 break; 4824 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 4825 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop; 4826 size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v); 4827 size_expected = 4828 sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v); 4829 break; 4830 default: 4831 break; 4832 } 4833 4834 if (size_expected < size) 4835 dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d" 4836 , size, size_expected); 4837 4838 if (dest_ptr) 4839 qdf_mem_copy(dest_ptr, tag_buf, size_expected); 4840 4841 if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS) 4842 == DP_HTT_TX_RX_EXPECTED_TLVS) { 4843 qdf_event_set(&pdev->fw_stats_event); 4844 } 4845 } 4846 4847 #ifdef VDEV_PEER_PROTOCOL_COUNT 4848 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING 4849 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev, 4850 bool is_egress, 4851 bool is_rx) 4852 { 4853 int mask; 4854 4855 if (is_egress) 4856 if (is_rx) 4857 mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK; 4858 else 4859 mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK; 4860 else 4861 if (is_rx) 4862 mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK; 4863 else 4864 mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK; 4865 4866 if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) { 4867 dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask); 4868 return QDF_STATUS_SUCCESS; 4869 } 4870 return QDF_STATUS_E_FAILURE; 4871 } 4872 4873 #else 4874 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev, 4875 bool is_egress, 4876 bool is_rx) 4877 { 4878 return QDF_STATUS_E_FAILURE; 4879 } 4880 #endif 4881 4882 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev, 4883 qdf_nbuf_t nbuf, 4884 struct dp_txrx_peer *txrx_peer, 4885 bool is_egress, 4886 bool is_rx) 4887 { 4888 struct dp_peer_per_pkt_stats *per_pkt_stats; 4889 struct protocol_trace_count *protocol_trace_cnt; 4890 enum cdp_protocol_trace prot; 4891 struct dp_soc *soc; 4892 struct ether_header *eh; 4893 char *mac; 4894 bool new_peer_ref = false; 4895 struct dp_peer *peer = NULL; 4896 4897 if (qdf_likely(!vdev->peer_protocol_count_track)) 4898 return; 4899 if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev, 4900 is_egress, 4901 is_rx) == 4902 QDF_STATUS_SUCCESS)) 4903 return; 4904 4905 soc = vdev->pdev->soc; 4906 eh = (struct ether_header *)qdf_nbuf_data(nbuf); 4907 if (is_rx) 4908 mac = eh->ether_shost; 4909 else 4910 mac = eh->ether_dhost; 4911 4912 if (!txrx_peer) { 4913 peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id, 4914 DP_MOD_ID_GENERIC_STATS); 4915 new_peer_ref = true; 4916 if (!peer) 4917 return; 4918 4919 txrx_peer = peer->txrx_peer; 4920 if (!txrx_peer) 4921 goto dp_vdev_peer_stats_update_protocol_cnt_free_peer; 4922 } 4923 per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats; 4924 4925 if (qdf_nbuf_is_icmp_pkt(nbuf) == true) 4926 prot = CDP_TRACE_ICMP; 4927 else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true) 4928 prot = CDP_TRACE_ARP; 4929 else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true) 4930 prot = CDP_TRACE_EAP; 4931 else 4932 goto dp_vdev_peer_stats_update_protocol_cnt_free_peer; 4933 4934 if (is_rx) 4935 protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt; 4936 else 4937 protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt; 4938 4939 if (is_egress) 4940 protocol_trace_cnt[prot].egress_cnt++; 4941 else 4942 protocol_trace_cnt[prot].ingress_cnt++; 4943 dp_vdev_peer_stats_update_protocol_cnt_free_peer: 4944 if (new_peer_ref) 4945 dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS); 4946 } 4947 4948 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl, 4949 int8_t vdev_id, 4950 qdf_nbuf_t nbuf, 4951 bool is_egress, 4952 bool is_rx) 4953 { 4954 struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); 4955 struct dp_vdev *vdev; 4956 4957 vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS); 4958 if (!vdev) 4959 return; 4960 4961 if (qdf_likely(vdev->peer_protocol_count_track)) 4962 dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 4963 is_egress, is_rx); 4964 4965 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 4966 } 4967 #endif 4968 4969 #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE) 4970 /** 4971 * dp_vow_str_fw_to_hw_delay() - Return string for a delay 4972 * @index: Index of delay 4973 * 4974 * Return: char const pointer 4975 */ 4976 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index) 4977 { 4978 if (index > CDP_DELAY_BUCKET_MAX) { 4979 return "Invalid index"; 4980 } 4981 return fw_to_hw_delay_bucket[index]; 4982 } 4983 4984 #if defined(HW_TX_DELAY_STATS_ENABLE) 4985 /** 4986 * dp_str_fw_to_hw_delay_bkt() - Return string for concise logging of delay 4987 * @index: Index of delay 4988 * 4989 * Return: char const pointer 4990 */ 4991 static inline const char *dp_str_fw_to_hw_delay_bkt(uint8_t index) 4992 { 4993 if (index > CDP_DELAY_BUCKET_MAX) 4994 return "Invalid"; 4995 4996 return fw_to_hw_delay_bkt_str[index]; 4997 } 4998 #endif 4999 5000 /** 5001 * dp_accumulate_delay_stats() - Update delay stats members 5002 * @total: Update stats total structure 5003 * @per_ring: per ring structures from where stats need to be accumulated 5004 * 5005 * Return: void 5006 */ 5007 static void 5008 dp_accumulate_delay_stats(struct cdp_delay_stats *total, 5009 struct cdp_delay_stats *per_ring) 5010 { 5011 uint8_t index; 5012 5013 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) 5014 total->delay_bucket[index] += per_ring->delay_bucket[index]; 5015 total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay); 5016 total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay); 5017 total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1); 5018 } 5019 #endif 5020 5021 #ifdef QCA_ENH_V3_STATS_SUPPORT 5022 /** 5023 * dp_vow_str_sw_enq_delay() - Return string for a delay 5024 * @index: Index of delay 5025 * 5026 * Return: char const pointer 5027 */ 5028 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index) 5029 { 5030 if (index > CDP_DELAY_BUCKET_MAX) { 5031 return "Invalid index"; 5032 } 5033 return sw_enq_delay_bucket[index]; 5034 } 5035 5036 /** 5037 * dp_vow_str_intfrm_delay() - Return string for a delay 5038 * @index: Index of delay 5039 * 5040 * Return: char const pointer 5041 */ 5042 static inline const char *dp_vow_str_intfrm_delay(uint8_t index) 5043 { 5044 if (index > CDP_DELAY_BUCKET_MAX) { 5045 return "Invalid index"; 5046 } 5047 return intfrm_delay_bucket[index]; 5048 } 5049 5050 /** 5051 * dp_accumulate_tid_stats() - Accumulate TID stats from each ring 5052 * @pdev: pdev handle 5053 * @tid: traffic ID 5054 * @total_tx: fill this tx structure to get stats from all wbm rings 5055 * @total_rx: fill this rx structure to get stats from all reo rings 5056 * @type: delay stats or regular frame counters 5057 * 5058 * Return: void 5059 */ 5060 static void 5061 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid, 5062 struct cdp_tid_tx_stats *total_tx, 5063 struct cdp_tid_rx_stats *total_rx, uint8_t type) 5064 { 5065 uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0; 5066 struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats; 5067 struct cdp_tid_tx_stats *per_ring_tx = NULL; 5068 struct cdp_tid_rx_stats *per_ring_rx = NULL; 5069 5070 if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) { 5071 qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid], 5072 sizeof(struct cdp_tid_tx_stats)); 5073 qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid], 5074 sizeof(struct cdp_tid_rx_stats)); 5075 return; 5076 } else { 5077 qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats)); 5078 qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats)); 5079 } 5080 5081 switch (type) { 5082 case TID_COUNTER_STATS: 5083 { 5084 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5085 per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid]; 5086 total_tx->success_cnt += per_ring_tx->success_cnt; 5087 total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt; 5088 for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) { 5089 total_tx->tqm_status_cnt[tqm_status_idx] += 5090 per_ring_tx->tqm_status_cnt[tqm_status_idx]; 5091 } 5092 5093 for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) { 5094 total_tx->htt_status_cnt[htt_status_idx] += 5095 per_ring_tx->htt_status_cnt[htt_status_idx]; 5096 } 5097 5098 for (drop = 0; drop < TX_MAX_DROP; drop++) 5099 total_tx->swdrop_cnt[drop] += 5100 per_ring_tx->swdrop_cnt[drop]; 5101 } 5102 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5103 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5104 total_rx->delivered_to_stack += 5105 per_ring_rx->delivered_to_stack; 5106 total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt; 5107 total_rx->msdu_cnt += per_ring_rx->msdu_cnt; 5108 total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt; 5109 total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt; 5110 for (drop = 0; drop < RX_MAX_DROP; drop++) 5111 total_rx->fail_cnt[drop] += 5112 per_ring_rx->fail_cnt[drop]; 5113 } 5114 break; 5115 } 5116 5117 case TID_DELAY_STATS: 5118 { 5119 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5120 per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid]; 5121 dp_accumulate_delay_stats(&total_tx->swq_delay, 5122 &per_ring_tx->swq_delay); 5123 dp_accumulate_delay_stats(&total_tx->hwtx_delay, 5124 &per_ring_tx->hwtx_delay); 5125 dp_accumulate_delay_stats(&total_tx->intfrm_delay, 5126 &per_ring_tx->intfrm_delay); 5127 } 5128 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5129 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5130 dp_accumulate_delay_stats(&total_rx->intfrm_delay, 5131 &per_ring_rx->intfrm_delay); 5132 dp_accumulate_delay_stats(&total_rx->to_stack_delay, 5133 &per_ring_rx->to_stack_delay); 5134 } 5135 break; 5136 } 5137 5138 case TID_RX_ERROR_STATS: 5139 { 5140 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5141 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5142 total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv; 5143 for (i = 0; i < CDP_REO_CODE_MAX; i++) { 5144 total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i]; 5145 } 5146 5147 total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv; 5148 for (i = 0; i < CDP_DMA_CODE_MAX; i++) { 5149 total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i]; 5150 } 5151 } 5152 break; 5153 } 5154 default: 5155 qdf_err("Invalid stats type: %d", type); 5156 break; 5157 } 5158 } 5159 5160 void dp_pdev_print_tid_stats(struct dp_pdev *pdev) 5161 { 5162 struct cdp_tid_tx_stats total_tx; 5163 struct cdp_tid_rx_stats total_rx; 5164 uint8_t tid, tqm_status_idx, htt_status_idx; 5165 struct cdp_tid_rx_stats *rx_wbm_stats = NULL; 5166 5167 DP_PRINT_STATS("Packets received in hardstart: %llu ", 5168 pdev->stats.tid_stats.ingress_stack); 5169 DP_PRINT_STATS("Packets dropped in osif layer: %llu ", 5170 pdev->stats.tid_stats.osif_drop); 5171 DP_PRINT_STATS("Per TID Video Stats:\n"); 5172 5173 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5174 rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid]; 5175 5176 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5177 TID_COUNTER_STATS); 5178 DP_PRINT_STATS("----TID: %d----", tid); 5179 DP_PRINT_STATS("Tx TQM Success Count: %llu", 5180 total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]); 5181 DP_PRINT_STATS("Tx HTT Success Count: %llu", 5182 total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]); 5183 for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) { 5184 if (total_tx.tqm_status_cnt[tqm_status_idx]) { 5185 DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu", 5186 tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]); 5187 } 5188 } 5189 5190 for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) { 5191 if (total_tx.htt_status_cnt[htt_status_idx]) { 5192 DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu", 5193 htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]); 5194 } 5195 } 5196 5197 DP_PRINT_STATS("Tx Hardware Drop Count: %llu", 5198 total_tx.swdrop_cnt[TX_HW_ENQUEUE]); 5199 DP_PRINT_STATS("Tx Software Drop Count: %llu", 5200 total_tx.swdrop_cnt[TX_SW_ENQUEUE]); 5201 DP_PRINT_STATS("Tx Descriptor Error Count: %llu", 5202 total_tx.swdrop_cnt[TX_DESC_ERR]); 5203 DP_PRINT_STATS("Tx HAL Ring Error Count: %llu", 5204 total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]); 5205 DP_PRINT_STATS("Tx Dma Map Error Count: %llu", 5206 total_tx.swdrop_cnt[TX_DMA_MAP_ERR]); 5207 DP_PRINT_STATS("Rx Delievered Count: %llu", 5208 total_rx.delivered_to_stack); 5209 DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu", 5210 total_rx.fail_cnt[ENQUEUE_DROP]); 5211 DP_PRINT_STATS("Rx Intrabss Drop Count: %llu", 5212 total_rx.fail_cnt[INTRABSS_DROP]); 5213 DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu", 5214 total_rx.fail_cnt[MSDU_DONE_FAILURE]); 5215 DP_PRINT_STATS("Rx Invalid Peer Count: %llu", 5216 total_rx.fail_cnt[INVALID_PEER_VDEV]); 5217 DP_PRINT_STATS("Rx Policy Check Drop Count: %llu", 5218 total_rx.fail_cnt[POLICY_CHECK_DROP]); 5219 DP_PRINT_STATS("Rx Mec Drop Count: %llu", 5220 total_rx.fail_cnt[MEC_DROP]); 5221 DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu", 5222 total_rx.fail_cnt[NAWDS_MCAST_DROP]); 5223 DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu", 5224 total_rx.fail_cnt[MESH_FILTER_DROP]); 5225 DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu", 5226 total_rx.intrabss_cnt); 5227 DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt); 5228 DP_PRINT_STATS("Rx Multicast MSDU Count: %llu", 5229 total_rx.mcast_msdu_cnt); 5230 DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n", 5231 total_rx.bcast_msdu_cnt); 5232 DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu", 5233 rx_wbm_stats->intrabss_cnt); 5234 DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu", 5235 rx_wbm_stats->fail_cnt[INTRABSS_DROP]); 5236 } 5237 } 5238 5239 void dp_pdev_print_delay_stats(struct dp_pdev *pdev) 5240 { 5241 struct dp_soc *soc = pdev->soc; 5242 struct cdp_tid_tx_stats total_tx; 5243 struct cdp_tid_rx_stats total_rx; 5244 5245 uint8_t tid, index; 5246 uint64_t count = 0; 5247 5248 if (!soc) 5249 return; 5250 5251 tid = 0; 5252 index = 0; 5253 5254 DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n"); 5255 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5256 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5257 TID_DELAY_STATS); 5258 DP_PRINT_STATS("----TID: %d----", tid); 5259 5260 DP_PRINT_STATS("Software Enqueue Delay:"); 5261 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5262 count = total_tx.swq_delay.delay_bucket[index]; 5263 if (count) { 5264 DP_PRINT_STATS("%s: Packets = %llu", 5265 dp_vow_str_sw_enq_delay(index), 5266 count); 5267 } 5268 } 5269 5270 DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay); 5271 DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay); 5272 DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay); 5273 5274 DP_PRINT_STATS("Hardware Transmission Delay:"); 5275 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5276 count = total_tx.hwtx_delay.delay_bucket[index]; 5277 if (count) { 5278 DP_PRINT_STATS("%s: Packets = %llu", 5279 dp_vow_str_fw_to_hw_delay(index), 5280 count); 5281 } 5282 } 5283 DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay); 5284 DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay); 5285 DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay); 5286 5287 DP_PRINT_STATS("Tx Interframe Delay:"); 5288 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5289 count = total_tx.intfrm_delay.delay_bucket[index]; 5290 if (count) { 5291 DP_PRINT_STATS("%s: Packets = %llu", 5292 dp_vow_str_intfrm_delay(index), 5293 count); 5294 } 5295 } 5296 DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay); 5297 DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay); 5298 DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay); 5299 5300 DP_PRINT_STATS("Rx Interframe Delay:"); 5301 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5302 count = total_rx.intfrm_delay.delay_bucket[index]; 5303 if (count) { 5304 DP_PRINT_STATS("%s: Packets = %llu", 5305 dp_vow_str_intfrm_delay(index), 5306 count); 5307 } 5308 } 5309 DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay); 5310 DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay); 5311 DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay); 5312 5313 DP_PRINT_STATS("Rx Reap to Stack Delay:"); 5314 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5315 count = total_rx.to_stack_delay.delay_bucket[index]; 5316 if (count) { 5317 DP_PRINT_STATS("%s: Packets = %llu", 5318 dp_vow_str_intfrm_delay(index), 5319 count); 5320 } 5321 } 5322 5323 DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay); 5324 DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay); 5325 DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay); 5326 } 5327 } 5328 5329 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev) 5330 { 5331 struct dp_soc *soc = pdev->soc; 5332 struct cdp_tid_rx_stats total_rx; 5333 struct cdp_tid_tx_stats total_tx; 5334 5335 uint8_t tid, index; 5336 5337 if (!soc) 5338 return; 5339 5340 5341 DP_PRINT_STATS("Per TID RX Error Stats:\n"); 5342 for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) { 5343 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5344 TID_RX_ERROR_STATS); 5345 DP_PRINT_STATS("----TID: %d----", tid + 4); 5346 5347 DP_PRINT_STATS("Rx REO Error stats:"); 5348 DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv); 5349 for (index = 0; index < CDP_REO_CODE_MAX; index++) { 5350 DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]); 5351 } 5352 5353 DP_PRINT_STATS("Rx Rxdma Error stats:"); 5354 DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv); 5355 for (index = 0; index < CDP_DMA_CODE_MAX; index++) { 5356 DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]); 5357 } 5358 } 5359 } 5360 5361 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 5362 struct cdp_tid_stats_intf *tid_stats) 5363 { 5364 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 5365 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 5366 struct cdp_tid_rx_stats rx; 5367 struct cdp_tid_tx_stats tx; 5368 uint8_t tid; 5369 uint32_t size; 5370 5371 if (!pdev) 5372 return QDF_STATUS_E_INVAL; 5373 5374 size = sizeof(struct cdp_delay_stats); 5375 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5376 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS); 5377 /* Copy specific accumulated Tx tid stats */ 5378 tid_stats->tx_total[tid].success_cnt = tx.success_cnt; 5379 tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt; 5380 qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0], 5381 &tx.tqm_status_cnt[0], 5382 CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t)); 5383 qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0], 5384 &tx.htt_status_cnt[0], 5385 CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t)); 5386 qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0], 5387 &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t)); 5388 5389 /* Copy specific accumulated Rx tid stats */ 5390 tid_stats->rx_total[tid].delivered_to_stack = 5391 rx.delivered_to_stack; 5392 tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt; 5393 tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt; 5394 tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt; 5395 tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt; 5396 qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0], 5397 &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t)); 5398 5399 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS); 5400 /* Copy specific accumulated Tx delay stats */ 5401 qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay, 5402 &tx.swq_delay, size); 5403 qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay, 5404 &tx.hwtx_delay, size); 5405 qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay, 5406 &tx.intfrm_delay, size); 5407 5408 /* Copy specific accumulated Rx delay stats */ 5409 qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay, 5410 &rx.intfrm_delay, size); 5411 qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay, 5412 &rx.to_stack_delay, size); 5413 } 5414 for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) { 5415 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, 5416 TID_RX_ERROR_STATS); 5417 /* Copy specific accumulated VOW Rx stats */ 5418 qdf_mem_copy(&tid_stats->rx_total[tid].reo_err, 5419 &rx.reo_err, sizeof(struct cdp_reo_error_stats)); 5420 qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err, 5421 sizeof(struct cdp_rxdma_error_stats)); 5422 } 5423 tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack; 5424 tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop; 5425 5426 return QDF_STATUS_SUCCESS; 5427 } 5428 #else 5429 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 5430 struct cdp_tid_stats_intf *tid_stats) 5431 { 5432 return QDF_STATUS_E_INVAL; 5433 } 5434 #endif 5435 5436 #ifdef HW_TX_DELAY_STATS_ENABLE 5437 #define DP_TX_DELAY_STATS_STR_LEN 512 5438 #define DP_SHORT_DELAY_BKT_COUNT 5 5439 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev) 5440 { 5441 struct cdp_delay_stats delay_stats; 5442 struct cdp_tid_tx_stats *per_ring; 5443 uint8_t tid, index; 5444 uint32_t count = 0; 5445 uint8_t ring_id; 5446 char *buf; 5447 size_t pos, buf_len; 5448 char hw_tx_delay_str[DP_TX_DELAY_STATS_STR_LEN] = {"\0"}; 5449 5450 buf_len = DP_TX_DELAY_STATS_STR_LEN; 5451 if (!vdev) 5452 return; 5453 5454 dp_info("vdev_id: %d Per TID HW Tx completion latency Stats:", 5455 vdev->vdev_id); 5456 buf = hw_tx_delay_str; 5457 dp_info(" Tid%32sPkts_per_delay_bucket%60s | Min | Max | Avg |", 5458 "", ""); 5459 pos = 0; 5460 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%6s", ""); 5461 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5462 if (index < DP_SHORT_DELAY_BKT_COUNT) 5463 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%7s", 5464 dp_str_fw_to_hw_delay_bkt(index)); 5465 else 5466 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%9s", 5467 dp_str_fw_to_hw_delay_bkt(index)); 5468 } 5469 dp_info("%s", hw_tx_delay_str); 5470 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5471 qdf_mem_zero(&delay_stats, sizeof(delay_stats)); 5472 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5473 per_ring = &vdev->stats.tid_tx_stats[ring_id][tid]; 5474 dp_accumulate_delay_stats(&delay_stats, 5475 &per_ring->hwtx_delay); 5476 } 5477 pos = 0; 5478 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%4u ", tid); 5479 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5480 count = delay_stats.delay_bucket[index]; 5481 if (index < DP_SHORT_DELAY_BKT_COUNT) 5482 pos += qdf_scnprintf(buf + pos, buf_len - pos, 5483 "%6u|", count); 5484 else 5485 pos += qdf_scnprintf(buf + pos, buf_len - pos, 5486 "%8u|", count); 5487 } 5488 pos += qdf_scnprintf(buf + pos, buf_len - pos, 5489 "%10u | %3u | %3u|", delay_stats.min_delay, 5490 delay_stats.max_delay, delay_stats.avg_delay); 5491 dp_info("%s", hw_tx_delay_str); 5492 } 5493 } 5494 5495 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc) 5496 { 5497 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0); 5498 struct dp_vdev *vdev; 5499 struct dp_vdev **vdev_array = NULL; 5500 int index = 0, num_vdev = 0; 5501 5502 if (!pdev) { 5503 dp_err("pdev is NULL"); 5504 return; 5505 } 5506 5507 vdev_array = 5508 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 5509 if (!vdev_array) 5510 return; 5511 5512 qdf_spin_lock_bh(&pdev->vdev_list_lock); 5513 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 5514 if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS)) 5515 continue; 5516 vdev_array[index] = vdev; 5517 index = index + 1; 5518 } 5519 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 5520 5521 num_vdev = index; 5522 5523 for (index = 0; index < num_vdev; index++) { 5524 vdev = vdev_array[index]; 5525 if (qdf_unlikely(dp_is_vdev_tx_delay_stats_enabled(vdev))) 5526 dp_vdev_print_tx_delay_stats(vdev); 5527 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 5528 } 5529 qdf_mem_free(vdev_array); 5530 } 5531 5532 /** 5533 * dp_reset_delay_stats() - reset delay stats 5534 * @per_ring: per ring structures from where stats need to be accumulated 5535 * 5536 * Return: void 5537 */ 5538 static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring) 5539 { 5540 qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats)); 5541 } 5542 5543 /** 5544 * dp_vdev_init_tx_delay_stats() - Clear tx delay stats 5545 * @vdev: vdev handle 5546 * 5547 * Return: None 5548 */ 5549 static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev) 5550 { 5551 struct cdp_tid_tx_stats *per_ring; 5552 uint8_t tid; 5553 uint8_t ring_id; 5554 5555 if (!vdev) 5556 return; 5557 5558 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5559 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5560 per_ring = &vdev->stats.tid_tx_stats[ring_id][tid]; 5561 dp_reset_delay_stats(&per_ring->hwtx_delay); 5562 } 5563 } 5564 } 5565 5566 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc) 5567 { 5568 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0); 5569 struct dp_vdev *vdev; 5570 struct dp_vdev **vdev_array = NULL; 5571 int index = 0, num_vdev = 0; 5572 5573 if (!pdev) { 5574 dp_err("pdev is NULL"); 5575 return; 5576 } 5577 5578 vdev_array = 5579 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 5580 if (!vdev_array) 5581 return; 5582 5583 qdf_spin_lock_bh(&pdev->vdev_list_lock); 5584 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 5585 if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) != 5586 QDF_STATUS_SUCCESS) 5587 continue; 5588 vdev_array[index] = vdev; 5589 index = index + 1; 5590 } 5591 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 5592 5593 num_vdev = index; 5594 5595 for (index = 0; index < num_vdev; index++) { 5596 vdev = vdev_array[index]; 5597 dp_vdev_init_tx_delay_stats(vdev); 5598 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 5599 } 5600 qdf_mem_free(vdev_array); 5601 } 5602 #endif 5603 5604 void dp_print_soc_cfg_params(struct dp_soc *soc) 5605 { 5606 struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; 5607 uint8_t index = 0, i = 0; 5608 char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH] = {'\0'}; 5609 int num_of_int_contexts; 5610 5611 if (!soc) { 5612 dp_err("Context is null"); 5613 return; 5614 } 5615 5616 soc_cfg_ctx = soc->wlan_cfg_ctx; 5617 5618 if (!soc_cfg_ctx) { 5619 dp_err("Context is null"); 5620 return; 5621 } 5622 5623 num_of_int_contexts = 5624 wlan_cfg_get_num_contexts(soc_cfg_ctx); 5625 5626 DP_PRINT_STATS("No. of interrupt contexts: %u", 5627 soc_cfg_ctx->num_int_ctxts); 5628 DP_PRINT_STATS("Max clients: %u", 5629 soc_cfg_ctx->max_clients); 5630 DP_PRINT_STATS("Max alloc size: %u ", 5631 soc_cfg_ctx->max_alloc_size); 5632 DP_PRINT_STATS("Per pdev tx ring: %u ", 5633 soc_cfg_ctx->per_pdev_tx_ring); 5634 DP_PRINT_STATS("Num tcl data rings: %u ", 5635 soc_cfg_ctx->num_tcl_data_rings); 5636 DP_PRINT_STATS("Per pdev rx ring: %u ", 5637 soc_cfg_ctx->per_pdev_rx_ring); 5638 DP_PRINT_STATS("Per pdev lmac ring: %u ", 5639 soc_cfg_ctx->per_pdev_lmac_ring); 5640 DP_PRINT_STATS("Num of reo dest rings: %u ", 5641 soc_cfg_ctx->num_reo_dest_rings); 5642 DP_PRINT_STATS("Num tx desc pool: %u ", 5643 soc_cfg_ctx->num_tx_desc_pool); 5644 DP_PRINT_STATS("Num tx ext desc pool: %u ", 5645 soc_cfg_ctx->num_tx_ext_desc_pool); 5646 DP_PRINT_STATS("Num tx desc: %u ", 5647 soc_cfg_ctx->num_tx_desc); 5648 DP_PRINT_STATS("Num tx ext desc: %u ", 5649 soc_cfg_ctx->num_tx_ext_desc); 5650 DP_PRINT_STATS("Htt packet type: %u ", 5651 soc_cfg_ctx->htt_packet_type); 5652 DP_PRINT_STATS("Max peer_ids: %u ", 5653 soc_cfg_ctx->max_peer_id); 5654 DP_PRINT_STATS("Tx ring size: %u ", 5655 soc_cfg_ctx->tx_ring_size); 5656 DP_PRINT_STATS("Tx comp ring size: %u ", 5657 soc_cfg_ctx->tx_comp_ring_size); 5658 DP_PRINT_STATS("Tx comp ring size nss: %u ", 5659 soc_cfg_ctx->tx_comp_ring_size_nss); 5660 DP_PRINT_STATS("Int batch threshold tx: %u ", 5661 soc_cfg_ctx->int_batch_threshold_tx); 5662 DP_PRINT_STATS("Int timer threshold tx: %u ", 5663 soc_cfg_ctx->int_timer_threshold_tx); 5664 DP_PRINT_STATS("Int batch threshold rx: %u ", 5665 soc_cfg_ctx->int_batch_threshold_rx); 5666 DP_PRINT_STATS("Int timer threshold rx: %u ", 5667 soc_cfg_ctx->int_timer_threshold_rx); 5668 DP_PRINT_STATS("Int batch threshold other: %u ", 5669 soc_cfg_ctx->int_batch_threshold_other); 5670 DP_PRINT_STATS("Int timer threshold other: %u ", 5671 soc_cfg_ctx->int_timer_threshold_other); 5672 DP_PRINT_STATS("Int batch threshold ppe2tcl: %u ", 5673 soc_cfg_ctx->int_batch_threshold_ppe2tcl); 5674 DP_PRINT_STATS("Int timer threshold ppe2tcl: %u ", 5675 soc_cfg_ctx->int_timer_threshold_ppe2tcl); 5676 5677 DP_PRINT_STATS("DP NAPI scale factor: %u ", 5678 soc_cfg_ctx->napi_scale_factor); 5679 5680 for (i = 0; i < num_of_int_contexts; i++) { 5681 index += qdf_snprint(&ring_mask[index], 5682 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5683 " %d", 5684 soc_cfg_ctx->int_tx_ring_mask[i]); 5685 } 5686 5687 DP_PRINT_STATS("Tx ring mask (0-%d):%s", 5688 num_of_int_contexts, ring_mask); 5689 5690 index = 0; 5691 for (i = 0; i < num_of_int_contexts; i++) { 5692 index += qdf_snprint(&ring_mask[index], 5693 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5694 " %d", 5695 soc_cfg_ctx->int_rx_ring_mask[i]); 5696 } 5697 5698 DP_PRINT_STATS("Rx ring mask (0-%d):%s", 5699 num_of_int_contexts, ring_mask); 5700 5701 index = 0; 5702 for (i = 0; i < num_of_int_contexts; i++) { 5703 index += qdf_snprint(&ring_mask[index], 5704 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5705 " %d", 5706 soc_cfg_ctx->int_rx_mon_ring_mask[i]); 5707 } 5708 5709 DP_PRINT_STATS("Rx mon ring mask (0-%d):%s", 5710 num_of_int_contexts, ring_mask); 5711 5712 index = 0; 5713 for (i = 0; i < num_of_int_contexts; i++) { 5714 index += qdf_snprint(&ring_mask[index], 5715 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5716 " %d", 5717 soc_cfg_ctx->int_rx_err_ring_mask[i]); 5718 } 5719 5720 DP_PRINT_STATS("Rx err ring mask (0-%d):%s", 5721 num_of_int_contexts, ring_mask); 5722 5723 index = 0; 5724 for (i = 0; i < num_of_int_contexts; i++) { 5725 index += qdf_snprint(&ring_mask[index], 5726 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5727 " %d", 5728 soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]); 5729 } 5730 5731 DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s", 5732 num_of_int_contexts, ring_mask); 5733 5734 index = 0; 5735 for (i = 0; i < num_of_int_contexts; i++) { 5736 index += qdf_snprint(&ring_mask[index], 5737 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5738 " %d", 5739 soc_cfg_ctx->int_reo_status_ring_mask[i]); 5740 } 5741 5742 DP_PRINT_STATS("Reo ring mask (0-%d):%s", 5743 num_of_int_contexts, ring_mask); 5744 5745 index = 0; 5746 for (i = 0; i < num_of_int_contexts; i++) { 5747 index += qdf_snprint(&ring_mask[index], 5748 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5749 " %d", 5750 soc_cfg_ctx->int_rxdma2host_ring_mask[i]); 5751 } 5752 5753 DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s", 5754 num_of_int_contexts, ring_mask); 5755 5756 index = 0; 5757 for (i = 0; i < num_of_int_contexts; i++) { 5758 index += qdf_snprint(&ring_mask[index], 5759 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5760 " %d", 5761 soc_cfg_ctx->int_host2rxdma_ring_mask[i]); 5762 } 5763 5764 DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s", 5765 num_of_int_contexts, ring_mask); 5766 5767 DP_PRINT_STATS("Rx hash: %u ", 5768 soc_cfg_ctx->rx_hash); 5769 DP_PRINT_STATS("Tso enabled: %u ", 5770 soc_cfg_ctx->tso_enabled); 5771 DP_PRINT_STATS("Lro enabled: %u ", 5772 soc_cfg_ctx->lro_enabled); 5773 DP_PRINT_STATS("Sg enabled: %u ", 5774 soc_cfg_ctx->sg_enabled); 5775 DP_PRINT_STATS("Gro enabled: %u ", 5776 soc_cfg_ctx->gro_enabled); 5777 DP_PRINT_STATS("TC based dynamic GRO: %u ", 5778 soc_cfg_ctx->tc_based_dynamic_gro); 5779 DP_PRINT_STATS("TC ingress prio: %u ", 5780 soc_cfg_ctx->tc_ingress_prio); 5781 DP_PRINT_STATS("rawmode enabled: %u ", 5782 soc_cfg_ctx->rawmode_enabled); 5783 DP_PRINT_STATS("peer flow ctrl enabled: %u ", 5784 soc_cfg_ctx->peer_flow_ctrl_enabled); 5785 DP_PRINT_STATS("napi enabled: %u ", 5786 soc_cfg_ctx->napi_enabled); 5787 DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ", 5788 soc_cfg_ctx->p2p_tcp_udp_checksumoffload); 5789 DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ", 5790 soc_cfg_ctx->nan_tcp_udp_checksumoffload); 5791 DP_PRINT_STATS("Tcp Udp checksum offload: %u ", 5792 soc_cfg_ctx->tcp_udp_checksumoffload); 5793 DP_PRINT_STATS("Defrag timeout check: %u ", 5794 soc_cfg_ctx->defrag_timeout_check); 5795 DP_PRINT_STATS("Rx defrag min timeout: %u ", 5796 soc_cfg_ctx->rx_defrag_min_timeout); 5797 DP_PRINT_STATS("WBM release ring: %u ", 5798 soc_cfg_ctx->wbm_release_ring); 5799 DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ", 5800 soc_cfg_ctx->tcl_cmd_credit_ring); 5801 DP_PRINT_STATS("TCL Status ring: %u ", 5802 soc_cfg_ctx->tcl_status_ring); 5803 DP_PRINT_STATS("REO Destination ring: %u ", 5804 soc_cfg_ctx->reo_dst_ring_size); 5805 DP_PRINT_STATS("REO Reinject ring: %u ", 5806 soc_cfg_ctx->reo_reinject_ring); 5807 DP_PRINT_STATS("RX release ring: %u ", 5808 soc_cfg_ctx->rx_release_ring); 5809 DP_PRINT_STATS("REO Exception ring: %u ", 5810 soc_cfg_ctx->reo_exception_ring); 5811 DP_PRINT_STATS("REO CMD ring: %u ", 5812 soc_cfg_ctx->reo_cmd_ring); 5813 DP_PRINT_STATS("REO STATUS ring: %u ", 5814 soc_cfg_ctx->reo_status_ring); 5815 DP_PRINT_STATS("RXDMA refill ring: %u ", 5816 soc_cfg_ctx->rxdma_refill_ring); 5817 DP_PRINT_STATS("TX_desc limit_0: %u ", 5818 soc_cfg_ctx->tx_desc_limit_0); 5819 DP_PRINT_STATS("TX_desc limit_1: %u ", 5820 soc_cfg_ctx->tx_desc_limit_1); 5821 DP_PRINT_STATS("TX_desc limit_2: %u ", 5822 soc_cfg_ctx->tx_desc_limit_2); 5823 DP_PRINT_STATS("TX device limit: %u ", 5824 soc_cfg_ctx->tx_device_limit); 5825 DP_PRINT_STATS("TX sw internode queue: %u ", 5826 soc_cfg_ctx->tx_sw_internode_queue); 5827 DP_PRINT_STATS("RXDMA err dst ring: %u ", 5828 soc_cfg_ctx->rxdma_err_dst_ring); 5829 DP_PRINT_STATS("RX Flow Tag Enabled: %u ", 5830 soc_cfg_ctx->is_rx_flow_tag_enabled); 5831 DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ", 5832 soc_cfg_ctx->rx_flow_search_table_size); 5833 DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ", 5834 soc_cfg_ctx->is_rx_flow_search_table_per_pdev); 5835 DP_PRINT_STATS("Rx desc pool size: %u ", 5836 soc_cfg_ctx->rx_sw_desc_num); 5837 } 5838 5839 void 5840 dp_print_pdev_cfg_params(struct dp_pdev *pdev) 5841 { 5842 struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx; 5843 5844 if (!pdev) { 5845 dp_err("Context is null"); 5846 return; 5847 } 5848 5849 pdev_cfg_ctx = pdev->wlan_cfg_ctx; 5850 5851 if (!pdev_cfg_ctx) { 5852 dp_err("Context is null"); 5853 return; 5854 } 5855 5856 DP_PRINT_STATS("Rx dma buf ring size: %d ", 5857 pdev_cfg_ctx->rx_dma_buf_ring_size); 5858 DP_PRINT_STATS("DMA Mon buf ring size: %d ", 5859 pdev_cfg_ctx->dma_mon_buf_ring_size); 5860 DP_PRINT_STATS("DMA Mon dest ring size: %d ", 5861 pdev_cfg_ctx->dma_rx_mon_dest_ring_size); 5862 DP_PRINT_STATS("DMA Mon status ring size: %d ", 5863 pdev_cfg_ctx->dma_mon_status_ring_size); 5864 DP_PRINT_STATS("Rxdma monitor desc ring: %d", 5865 pdev_cfg_ctx->rxdma_monitor_desc_ring); 5866 DP_PRINT_STATS("Num mac rings: %d ", 5867 pdev_cfg_ctx->num_mac_rings); 5868 } 5869 5870 void 5871 dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, 5872 enum hal_ring_type ring_type) 5873 { 5874 uint32_t tailp; 5875 uint32_t headp; 5876 int32_t hw_headp = -1; 5877 int32_t hw_tailp = -1; 5878 uint32_t ring_usage; 5879 const char *ring_name; 5880 5881 if (soc && srng && srng->hal_srng) { 5882 ring_name = dp_srng_get_str_from_hal_ring_type(ring_type); 5883 hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp); 5884 ring_usage = hal_get_ring_usage(srng->hal_srng, 5885 ring_type, &headp, &tailp); 5886 5887 DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u", 5888 ring_name, headp, tailp, ring_usage); 5889 5890 hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp, 5891 &hw_tailp, ring_type); 5892 ring_usage = 0; 5893 if (hw_headp >= 0 && tailp >= 0) 5894 ring_usage = 5895 hal_get_ring_usage( 5896 srng->hal_srng, ring_type, 5897 &hw_headp, &hw_tailp); 5898 DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u", 5899 ring_name, hw_headp, hw_tailp, ring_usage); 5900 } 5901 } 5902 5903 qdf_export_symbol(dp_print_ring_stat_from_hal); 5904 5905 #ifdef FEATURE_TSO_STATS 5906 /** 5907 * dp_print_tso_seg_stats - tso segment stats 5908 * @pdev: pdev handle 5909 * @id: tso packet id 5910 * 5911 * Return: None 5912 */ 5913 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5914 { 5915 uint8_t num_seg; 5916 uint32_t segid; 5917 5918 /* TSO LEVEL 2 - SEGMENT INFO */ 5919 num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg; 5920 for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) { 5921 DP_PRINT_STATS( 5922 "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u", 5923 segid, 5924 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5925 .tso_seg[segid].num_frags, 5926 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5927 .tso_seg[segid].total_len, 5928 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5929 .tso_seg[segid].tso_flags.tcp_seq_num, 5930 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5931 .tso_seg[segid].tso_flags.ip_id); 5932 DP_PRINT_STATS( 5933 "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u", 5934 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5935 .tso_seg[segid].tso_flags.fin, 5936 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5937 .tso_seg[segid].tso_flags.syn, 5938 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5939 .tso_seg[segid].tso_flags.rst, 5940 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5941 .tso_seg[segid].tso_flags.psh, 5942 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5943 .tso_seg[segid].tso_flags.ack, 5944 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5945 .tso_seg[segid].tso_flags.urg, 5946 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5947 .tso_seg[segid].tso_flags.ece, 5948 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5949 .tso_seg[segid].tso_flags.cwr, 5950 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5951 .tso_seg[segid].tso_flags.ns); 5952 } 5953 } 5954 #else 5955 static inline 5956 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5957 { 5958 } 5959 #endif /* FEATURE_TSO_STATS */ 5960 5961 /** 5962 * dp_print_mon_ring_stat_from_hal() - Print stat for monitor rings based 5963 * on target 5964 * @pdev: physical device handle 5965 * @mac_id: mac id 5966 * 5967 * Return: void 5968 */ 5969 static inline 5970 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) 5971 { 5972 if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { 5973 dp_print_ring_stat_from_hal(pdev->soc, 5974 &pdev->soc->rxdma_mon_buf_ring[mac_id], 5975 RXDMA_MONITOR_BUF); 5976 dp_print_ring_stat_from_hal(pdev->soc, 5977 &pdev->soc->rxdma_mon_dst_ring[mac_id], 5978 RXDMA_MONITOR_DST); 5979 dp_print_ring_stat_from_hal(pdev->soc, 5980 &pdev->soc->rxdma_mon_desc_ring[mac_id], 5981 RXDMA_MONITOR_DESC); 5982 } 5983 5984 dp_print_ring_stat_from_hal(pdev->soc, 5985 &pdev->soc->rxdma_mon_status_ring[mac_id], 5986 RXDMA_MONITOR_STATUS); 5987 } 5988 5989 #if defined(IPA_OFFLOAD) && defined(QCA_WIFI_QCN9224) 5990 /** 5991 * dp_print_wbm2sw_ring_stats_from_hal() - Print ring stats from hal for ipa 5992 * use case 5993 * @pdev : physical device handle 5994 * 5995 * Return: void 5996 */ 5997 static inline void 5998 dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev *pdev) 5999 { 6000 uint8_t i = 0; 6001 6002 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) { 6003 if (i != IPA_TX_COMP_RING_IDX) 6004 dp_print_ring_stat_from_hal(pdev->soc, 6005 &pdev->soc->tx_comp_ring[i], 6006 WBM2SW_RELEASE); 6007 } 6008 } 6009 #else 6010 static inline void 6011 dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev *pdev) 6012 { 6013 uint8_t i = 0; 6014 6015 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 6016 dp_print_ring_stat_from_hal(pdev->soc, 6017 &pdev->soc->tx_comp_ring[i], 6018 WBM2SW_RELEASE); 6019 } 6020 #endif 6021 6022 /* 6023 * Format is: 6024 * [0 18 1728, 1 15 1222, 2 24 1969,...] 6025 * 2 character space for [ and ] 6026 * 8 reo * 3 white space = 24 6027 * 8 char space for reo rings 6028 * 8 * 10 (uint32_t max value is 4294967295) = 80 6029 * 8 * 20 (uint64_t max value is 18446744073709551615) = 160 6030 * 8 commas 6031 * 1 for \0 6032 * Total of 283 6033 */ 6034 #define DP_STATS_STR_LEN 283 6035 #ifndef WLAN_SOFTUMAC_SUPPORT 6036 static int 6037 dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx, 6038 char *buf, int buf_len) 6039 { 6040 int i; 6041 int pos = 0; 6042 6043 if (buf_len <= 0 || !buf) { 6044 dp_err("incorrect buf or buf_len(%d)!", buf_len); 6045 return pos; 6046 } 6047 6048 for (i = 0; i < MAX_REO_DEST_RINGS; i++) { 6049 if (intr_ctx->intr_stats.num_rx_ring_masks[i]) 6050 pos += qdf_scnprintf(buf + pos, 6051 buf_len - pos, 6052 "reo[%u]:%u ", i, 6053 intr_ctx->intr_stats.num_rx_ring_masks[i]); 6054 } 6055 return pos; 6056 } 6057 6058 static int 6059 dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx, 6060 char *buf, int buf_len) 6061 { int i; 6062 int pos = 0; 6063 6064 if (buf_len <= 0 || !buf) { 6065 dp_err("incorrect buf or buf_len(%d)!", buf_len); 6066 return pos; 6067 } 6068 6069 for (i = 0; i < MAX_TCL_DATA_RINGS; i++) { 6070 if (intr_ctx->intr_stats.num_tx_ring_masks[i]) 6071 pos += qdf_scnprintf(buf + pos, 6072 buf_len - pos, 6073 "tx_comps[%u]:%u ", i, 6074 intr_ctx->intr_stats.num_tx_ring_masks[i]); 6075 } 6076 return pos; 6077 } 6078 6079 static inline void dp_print_umac_ring_stats(struct dp_pdev *pdev) 6080 { 6081 uint8_t i; 6082 6083 dp_print_ring_stat_from_hal(pdev->soc, 6084 &pdev->soc->wbm_idle_link_ring, 6085 WBM_IDLE_LINK); 6086 dp_print_ring_stat_from_hal(pdev->soc, 6087 &pdev->soc->reo_exception_ring, 6088 REO_EXCEPTION); 6089 dp_print_ring_stat_from_hal(pdev->soc, 6090 &pdev->soc->reo_reinject_ring, 6091 REO_REINJECT); 6092 dp_print_ring_stat_from_hal(pdev->soc, 6093 &pdev->soc->reo_cmd_ring, 6094 REO_CMD); 6095 dp_print_ring_stat_from_hal(pdev->soc, 6096 &pdev->soc->reo_status_ring, 6097 REO_STATUS); 6098 dp_print_ring_stat_from_hal(pdev->soc, 6099 &pdev->soc->rx_rel_ring, 6100 WBM2SW_RELEASE); 6101 dp_print_ring_stat_from_hal(pdev->soc, 6102 &pdev->soc->tcl_cmd_credit_ring, 6103 TCL_CMD_CREDIT); 6104 dp_print_ring_stat_from_hal(pdev->soc, 6105 &pdev->soc->tcl_status_ring, 6106 TCL_STATUS); 6107 dp_print_ring_stat_from_hal(pdev->soc, 6108 &pdev->soc->wbm_desc_rel_ring, 6109 SW2WBM_RELEASE); 6110 for (i = 0; i < MAX_REO_DEST_RINGS; i++) 6111 dp_print_ring_stat_from_hal(pdev->soc, 6112 &pdev->soc->reo_dest_ring[i], 6113 REO_DST); 6114 6115 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 6116 dp_print_ring_stat_from_hal(pdev->soc, 6117 &pdev->soc->tcl_data_ring[i], 6118 TCL_DATA); 6119 dp_print_wbm2sw_ring_stats_from_hal(pdev); 6120 } 6121 6122 static inline void dp_print_ce_ring_stats(struct dp_pdev *pdev) {} 6123 6124 static inline void dp_print_tx_ring_stats(struct dp_soc *soc) 6125 { 6126 uint8_t i; 6127 6128 for (i = 0; i < soc->num_tcl_data_rings; i++) { 6129 DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1, 6130 soc->stats.tx.tcl_enq[i]); 6131 DP_PRINT_STATS("TX completions reaped from ring %u: %u", 6132 i, soc->stats.tx.tx_comp[i]); 6133 } 6134 } 6135 6136 static inline void dp_print_rx_ring_stats(struct dp_pdev *pdev) 6137 { 6138 uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'}; 6139 uint8_t *buf = dp_stats_str; 6140 size_t pos = 0; 6141 size_t buf_len = DP_STATS_STR_LEN; 6142 uint8_t i; 6143 6144 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "REO/msdus/bytes ["); 6145 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 6146 if (!pdev->stats.rx.rcvd_reo[i].num) 6147 continue; 6148 6149 pos += qdf_scnprintf(buf + pos, buf_len - pos, 6150 "%d %llu %llu, ", 6151 i, pdev->stats.rx.rcvd_reo[i].num, 6152 pdev->stats.rx.rcvd_reo[i].bytes); 6153 } 6154 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]"); 6155 DP_PRINT_STATS("%s", dp_stats_str); 6156 } 6157 6158 static inline void 6159 dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev) 6160 { 6161 uint8_t error_code; 6162 6163 DP_PRINT_STATS("intra-bss EAPOL drops: %u", 6164 soc->stats.rx.err.intrabss_eapol_drop); 6165 DP_PRINT_STATS("mic errors %u", 6166 pdev->stats.rx.err.mic_err); 6167 DP_PRINT_STATS("Invalid peer on rx path: %llu", 6168 pdev->soc->stats.rx.err.rx_invalid_peer.num); 6169 DP_PRINT_STATS("sw_peer_id invalid %llu", 6170 pdev->soc->stats.rx.err.rx_invalid_peer_id.num); 6171 DP_PRINT_STATS("packet_len invalid %llu", 6172 pdev->soc->stats.rx.err.rx_invalid_pkt_len.num); 6173 DP_PRINT_STATS("sa or da idx invalid %u", 6174 pdev->soc->stats.rx.err.invalid_sa_da_idx); 6175 DP_PRINT_STATS("defrag peer uninit %u", 6176 pdev->soc->stats.rx.err.defrag_peer_uninit); 6177 DP_PRINT_STATS("pkts delivered no peer %u", 6178 pdev->soc->stats.rx.err.pkt_delivered_no_peer); 6179 DP_PRINT_STATS("RX invalid cookie: %d", 6180 soc->stats.rx.err.invalid_cookie); 6181 DP_PRINT_STATS("RX stale cookie: %d", 6182 soc->stats.rx.err.stale_cookie); 6183 DP_PRINT_STATS("2k jump delba sent: %u", 6184 pdev->soc->stats.rx.err.rx_2k_jump_delba_sent); 6185 DP_PRINT_STATS("2k jump msdu to stack: %u", 6186 pdev->soc->stats.rx.err.rx_2k_jump_to_stack); 6187 DP_PRINT_STATS("2k jump msdu drop: %u", 6188 pdev->soc->stats.rx.err.rx_2k_jump_drop); 6189 DP_PRINT_STATS("REO err oor msdu to stack %u", 6190 pdev->soc->stats.rx.err.reo_err_oor_to_stack); 6191 DP_PRINT_STATS("REO err oor msdu drop: %u", 6192 pdev->soc->stats.rx.err.reo_err_oor_drop); 6193 DP_PRINT_STATS("Rx err msdu rejected: %d", 6194 soc->stats.rx.err.rejected); 6195 DP_PRINT_STATS("Rx raw frame dropped: %d", 6196 soc->stats.rx.err.raw_frm_drop); 6197 DP_PRINT_STATS("Rx stale link desc cookie: %d", 6198 pdev->soc->stats.rx.err.invalid_link_cookie); 6199 DP_PRINT_STATS("Rx nbuf sanity fails: %d", 6200 pdev->soc->stats.rx.err.nbuf_sanity_fail); 6201 DP_PRINT_STATS("Rx refill duplicate link desc: %d", 6202 pdev->soc->stats.rx.err.dup_refill_link_desc); 6203 DP_PRINT_STATS("Rx ipa smmu map duplicate: %d", 6204 pdev->soc->stats.rx.err.ipa_smmu_map_dup); 6205 DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d", 6206 pdev->soc->stats.rx.err.ipa_smmu_unmap_dup); 6207 DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d", 6208 pdev->soc->stats.rx.err.ipa_unmap_no_pipe); 6209 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 6210 soc->stats.rx.err.pn_in_dest_check_fail); 6211 6212 DP_PRINT_STATS("Reo Statistics"); 6213 DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full); 6214 DP_PRINT_STATS("rbm error: %u msdus", 6215 pdev->soc->stats.rx.err.invalid_rbm); 6216 DP_PRINT_STATS("hal ring access fail: %u msdus", 6217 pdev->soc->stats.rx.err.hal_ring_access_fail); 6218 6219 DP_PRINT_STATS("hal ring access full fail: %u msdus", 6220 pdev->soc->stats.rx.err.hal_ring_access_full_fail); 6221 6222 for (error_code = 0; error_code < HAL_REO_ERR_MAX; 6223 error_code++) { 6224 if (!pdev->soc->stats.rx.err.reo_error[error_code]) 6225 continue; 6226 DP_PRINT_STATS("Reo error number (%u): %u msdus", 6227 error_code, 6228 pdev->soc->stats.rx.err.reo_error[error_code]); 6229 } 6230 } 6231 6232 void dp_print_soc_tx_stats(struct dp_soc *soc) 6233 { 6234 uint8_t desc_pool_id; 6235 6236 soc->stats.tx.desc_in_use = 0; 6237 6238 DP_PRINT_STATS("SOC Tx Stats:\n"); 6239 6240 for (desc_pool_id = 0; 6241 desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); 6242 desc_pool_id++) 6243 soc->stats.tx.desc_in_use += 6244 soc->tx_desc[desc_pool_id].num_allocated; 6245 6246 DP_PRINT_STATS("Tx Descriptors In Use = %u", 6247 soc->stats.tx.desc_in_use); 6248 DP_PRINT_STATS("Tx Invalid peer:"); 6249 DP_PRINT_STATS(" Packets = %llu", 6250 soc->stats.tx.tx_invalid_peer.num); 6251 DP_PRINT_STATS(" Bytes = %llu", 6252 soc->stats.tx.tx_invalid_peer.bytes); 6253 DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u", 6254 soc->stats.tx.tcl_ring_full[0], 6255 soc->stats.tx.tcl_ring_full[1], 6256 soc->stats.tx.tcl_ring_full[2], 6257 soc->stats.tx.tcl_ring_full[3]); 6258 DP_PRINT_STATS("Tx invalid completion release = %u", 6259 soc->stats.tx.invalid_release_source); 6260 DP_PRINT_STATS("TX invalid Desc from completion ring = %u", 6261 soc->stats.tx.invalid_tx_comp_desc); 6262 DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]", 6263 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL], 6264 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER], 6265 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC], 6266 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF], 6267 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]); 6268 DP_PRINT_STATS("Tx comp non wbm internal error = %d", 6269 soc->stats.tx.non_wbm_internal_err); 6270 DP_PRINT_STATS("Tx comp loop pkt limit hit = %d", 6271 soc->stats.tx.tx_comp_loop_pkt_limit_hit); 6272 DP_PRINT_STATS("Tx comp HP out of sync2 = %d", 6273 soc->stats.tx.hp_oos2); 6274 dp_print_tx_ppeds_stats(soc); 6275 } 6276 6277 #define DP_INT_CTX_STATS_STRING_LEN 512 6278 void dp_print_soc_interrupt_stats(struct dp_soc *soc) 6279 { 6280 char *buf; 6281 char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'}; 6282 int i, pos, buf_len; 6283 struct dp_intr_stats *intr_stats; 6284 6285 buf = int_ctx_str; 6286 buf_len = DP_INT_CTX_STATS_STRING_LEN; 6287 6288 for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { 6289 pos = 0; 6290 qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str)); 6291 intr_stats = &soc->intr_ctx[i].intr_stats; 6292 6293 if (!intr_stats->num_masks && !intr_stats->num_near_full_masks) 6294 continue; 6295 6296 pos += qdf_scnprintf(buf + pos, 6297 buf_len - pos, 6298 "%2u[%3d] - Total:%u ", 6299 i, 6300 hif_get_int_ctx_irq_num(soc->hif_handle, 6301 i), 6302 intr_stats->num_masks); 6303 6304 if (soc->intr_ctx[i].tx_ring_mask) 6305 pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i], 6306 buf + pos, 6307 buf_len - pos); 6308 6309 if (soc->intr_ctx[i].rx_ring_mask) 6310 pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i], 6311 buf + pos, 6312 buf_len - pos); 6313 if (soc->intr_ctx[i].rx_err_ring_mask) 6314 pos += qdf_scnprintf(buf + pos, 6315 buf_len - pos, 6316 "reo_err:%u ", 6317 intr_stats->num_rx_err_ring_masks); 6318 6319 if (soc->intr_ctx[i].rx_wbm_rel_ring_mask) 6320 pos += qdf_scnprintf(buf + pos, 6321 buf_len - pos, 6322 "wbm_rx_err:%u ", 6323 intr_stats->num_rx_wbm_rel_ring_masks); 6324 6325 if (soc->intr_ctx[i].rxdma2host_ring_mask) 6326 pos += qdf_scnprintf(buf + pos, 6327 buf_len - pos, 6328 "rxdma2_host_err:%u ", 6329 intr_stats->num_rxdma2host_ring_masks); 6330 6331 if (soc->intr_ctx[i].rx_near_full_grp_1_mask) 6332 pos += qdf_scnprintf(buf + pos, 6333 buf_len - pos, 6334 "rx_near_full_grp_1:%u ", 6335 intr_stats->num_near_full_masks); 6336 6337 if (soc->intr_ctx[i].rx_near_full_grp_2_mask) 6338 pos += qdf_scnprintf(buf + pos, 6339 buf_len - pos, 6340 "rx_near_full_grp_2:%u ", 6341 intr_stats->num_near_full_masks); 6342 if (soc->intr_ctx[i].tx_ring_near_full_mask) 6343 pos += qdf_scnprintf(buf + pos, 6344 buf_len - pos, 6345 "tx_near_full:%u ", 6346 intr_stats->num_near_full_masks); 6347 6348 dp_info("%s", int_ctx_str); 6349 } 6350 } 6351 #else 6352 static inline void dp_print_umac_ring_stats(struct dp_pdev *pdev) {} 6353 6354 static inline void dp_print_ce_ring_stats(struct dp_pdev *pdev) 6355 { 6356 hif_ce_print_ring_stats(pdev->soc->hif_handle); 6357 } 6358 6359 static inline void dp_print_tx_ring_stats(struct dp_soc *soc) 6360 { 6361 uint8_t i; 6362 6363 for (i = 0; i < MAX_TCL_DATA_RINGS; i++) { 6364 DP_PRINT_STATS("Enqueue to Tx ring %u: %u", i + 1, 6365 soc->stats.tx.tcl_enq[i]); 6366 DP_PRINT_STATS("TX completions reaped from ring %u: %u", 6367 i, soc->stats.tx.tx_comp[i]); 6368 } 6369 } 6370 6371 static inline void dp_print_rx_ring_stats(struct dp_pdev *pdev) 6372 { 6373 uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'}; 6374 uint8_t *buf = dp_stats_str; 6375 size_t pos = 0; 6376 size_t buf_len = DP_STATS_STR_LEN; 6377 uint8_t i; 6378 6379 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "RX/msdus/bytes ["); 6380 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 6381 if (!pdev->stats.rx.rcvd_reo[i].num) 6382 continue; 6383 6384 pos += qdf_scnprintf(buf + pos, buf_len - pos, 6385 "%d %llu %llu, ", 6386 i, pdev->stats.rx.rcvd_reo[i].num, 6387 pdev->stats.rx.rcvd_reo[i].bytes); 6388 } 6389 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]"); 6390 DP_PRINT_STATS("%s", dp_stats_str); 6391 } 6392 6393 static inline void 6394 dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev) 6395 { 6396 DP_PRINT_STATS("intra-bss EAPOL drops: %u", 6397 soc->stats.rx.err.intrabss_eapol_drop); 6398 DP_PRINT_STATS("mic errors %u", 6399 pdev->stats.rx.err.mic_err); 6400 DP_PRINT_STATS("2k jump msdu drop: %u", 6401 pdev->soc->stats.rx.err.rx_2k_jump_drop); 6402 DP_PRINT_STATS("REO err oor msdu drop: %u", 6403 pdev->soc->stats.rx.err.reo_err_oor_drop); 6404 DP_PRINT_STATS("Invalid peer on rx path: %llu", 6405 pdev->soc->stats.rx.err.rx_invalid_peer.num); 6406 DP_PRINT_STATS("sw_peer_id invalid %llu", 6407 pdev->soc->stats.rx.err.rx_invalid_peer_id.num); 6408 DP_PRINT_STATS("packet_len invalid %llu", 6409 pdev->soc->stats.rx.err.rx_invalid_pkt_len.num); 6410 DP_PRINT_STATS("sa or da idx invalid %u", 6411 pdev->soc->stats.rx.err.invalid_sa_da_idx); 6412 DP_PRINT_STATS("defrag peer uninit %u", 6413 pdev->soc->stats.rx.err.defrag_peer_uninit); 6414 DP_PRINT_STATS("pkts delivered no peer %u", 6415 pdev->soc->stats.rx.err.pkt_delivered_no_peer); 6416 DP_PRINT_STATS("RX invalid cookie: %d", 6417 soc->stats.rx.err.invalid_cookie); 6418 DP_PRINT_STATS("RX stale cookie: %d", 6419 soc->stats.rx.err.stale_cookie); 6420 DP_PRINT_STATS("Rx err msdu rejected: %d", 6421 soc->stats.rx.err.rejected); 6422 DP_PRINT_STATS("Rx raw frame dropped: %d", 6423 soc->stats.rx.err.raw_frm_drop); 6424 DP_PRINT_STATS("Rx nbuf sanity fails: %d", 6425 pdev->soc->stats.rx.err.nbuf_sanity_fail); 6426 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 6427 soc->stats.rx.err.pn_in_dest_check_fail); 6428 } 6429 6430 void dp_print_soc_tx_stats(struct dp_soc *soc) 6431 { 6432 uint8_t desc_pool_id; 6433 6434 soc->stats.tx.desc_in_use = 0; 6435 6436 DP_PRINT_STATS("SOC Tx Stats:\n"); 6437 6438 for (desc_pool_id = 0; 6439 desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); 6440 desc_pool_id++) 6441 soc->stats.tx.desc_in_use += 6442 soc->tx_desc[desc_pool_id].num_allocated; 6443 6444 DP_PRINT_STATS("Tx Descriptors In Use = %u", 6445 soc->stats.tx.desc_in_use); 6446 DP_PRINT_STATS("Tx Invalid peer:"); 6447 DP_PRINT_STATS(" Packets = %llu", 6448 soc->stats.tx.tx_invalid_peer.num); 6449 DP_PRINT_STATS(" Bytes = %llu", 6450 soc->stats.tx.tx_invalid_peer.bytes); 6451 DP_PRINT_STATS("Packets dropped due to Tx ring full = %u", 6452 soc->stats.tx.tcl_ring_full[0]); 6453 DP_PRINT_STATS("Tx invalid completion release = %u", 6454 soc->stats.tx.invalid_release_source); 6455 DP_PRINT_STATS("TX invalid Desc from completion ring = %u", 6456 soc->stats.tx.invalid_tx_comp_desc); 6457 dp_print_tx_ppeds_stats(soc); 6458 } 6459 6460 /* TODO: print CE intr stats? */ 6461 void dp_print_soc_interrupt_stats(struct dp_soc *soc) {} 6462 #endif 6463 6464 void 6465 dp_print_ring_stats(struct dp_pdev *pdev) 6466 { 6467 struct dp_soc *soc = pdev->soc; 6468 uint32_t i; 6469 int mac_id; 6470 int lmac_id; 6471 6472 if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS)) 6473 return; 6474 6475 dp_print_ce_ring_stats(pdev); 6476 dp_print_umac_ring_stats(pdev); 6477 6478 if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) { 6479 for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) { 6480 dp_print_ring_stat_from_hal 6481 (pdev->soc, &pdev->soc->rx_refill_buf_ring[i], 6482 RXDMA_BUF); 6483 } 6484 } else { 6485 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0, 6486 pdev->pdev_id); 6487 dp_print_ring_stat_from_hal 6488 (pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id], 6489 RXDMA_BUF); 6490 } 6491 6492 dp_print_ring_stat_from_hal(pdev->soc, 6493 &pdev->rx_refill_buf_ring2, 6494 RXDMA_BUF); 6495 6496 for (i = 0; i < MAX_RX_MAC_RINGS; i++) 6497 dp_print_ring_stat_from_hal(pdev->soc, 6498 &pdev->rx_mac_buf_ring[i], 6499 RXDMA_BUF); 6500 6501 for (mac_id = 0; 6502 mac_id < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev; 6503 mac_id++) { 6504 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 6505 mac_id, pdev->pdev_id); 6506 6507 dp_print_mon_ring_stat_from_hal(pdev, lmac_id); 6508 } 6509 6510 for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) { 6511 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 6512 i, pdev->pdev_id); 6513 6514 dp_print_ring_stat_from_hal(pdev->soc, 6515 &pdev->soc->rxdma_err_dst_ring 6516 [lmac_id], 6517 RXDMA_DST); 6518 } 6519 6520 dp_print_txmon_ring_stat_from_hal(pdev); 6521 6522 #ifdef WLAN_SUPPORT_PPEDS 6523 if (pdev->soc->arch_ops.dp_txrx_ppeds_rings_status) 6524 pdev->soc->arch_ops.dp_txrx_ppeds_rings_status(pdev->soc); 6525 #endif 6526 hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS); 6527 } 6528 6529 /** 6530 * dp_print_common_rates_info(): Print common rate for tx or rx 6531 * @pkt_type_array: rate type array contains rate info 6532 * 6533 * Return: void 6534 */ 6535 static inline void 6536 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array) 6537 { 6538 uint8_t mcs, pkt_type; 6539 6540 DP_PRINT_STATS("MSDU Count"); 6541 for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) { 6542 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6543 if (!cdp_rate_string[pkt_type][mcs].valid) 6544 continue; 6545 6546 DP_PRINT_STATS(" %s = %d", 6547 cdp_rate_string[pkt_type][mcs].mcs_type, 6548 pkt_type_array[pkt_type].mcs_count[mcs]); 6549 } 6550 6551 DP_PRINT_STATS("\n"); 6552 } 6553 } 6554 6555 /** 6556 * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx 6557 * @pkt_type_array: rate type array contains rate info 6558 * @pkt_type: packet type 6559 * 6560 * Return: void 6561 */ 6562 #ifdef WLAN_FEATURE_11BE 6563 static inline void 6564 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array, 6565 enum cdp_packet_type pkt_type) 6566 { 6567 uint8_t mcs; 6568 6569 DP_PRINT_STATS("PPDU Count"); 6570 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6571 if (pkt_type == DOT11_AX) { 6572 if (!dp_ppdu_rate_string[0][mcs].valid) 6573 continue; 6574 6575 DP_PRINT_STATS(" %s = %d", 6576 dp_ppdu_rate_string[0][mcs].mcs_type, 6577 pkt_type_array->mcs_count[mcs]); 6578 } else if (pkt_type == DOT11_BE) { 6579 if (!dp_ppdu_rate_string[1][mcs].valid) 6580 continue; 6581 6582 DP_PRINT_STATS(" %s = %d", 6583 dp_ppdu_rate_string[1][mcs].mcs_type, 6584 pkt_type_array->mcs_count[mcs]); 6585 } 6586 } 6587 6588 DP_PRINT_STATS("\n"); 6589 } 6590 #else 6591 static inline void 6592 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array, 6593 enum cdp_packet_type pkt_type) 6594 { 6595 uint8_t mcs; 6596 6597 DP_PRINT_STATS("PPDU Count"); 6598 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6599 if (!dp_ppdu_rate_string[0][mcs].valid) 6600 continue; 6601 6602 DP_PRINT_STATS(" %s = %d", 6603 dp_ppdu_rate_string[0][mcs].mcs_type, 6604 pkt_type_array->mcs_count[mcs]); 6605 } 6606 6607 DP_PRINT_STATS("\n"); 6608 } 6609 #endif 6610 6611 /** 6612 * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx 6613 * @pkt_type_array: rate type array contains rate info 6614 * 6615 * Return: void 6616 */ 6617 #ifdef WLAN_FEATURE_11BE 6618 static inline void 6619 dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array) 6620 { 6621 uint8_t mcs, pkt_type; 6622 6623 DP_PRINT_STATS("PPDU Count"); 6624 for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) { 6625 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6626 if (!dp_mu_be_rate_string[pkt_type][mcs].valid) 6627 continue; 6628 6629 DP_PRINT_STATS(" %s = %d", 6630 dp_mu_be_rate_string[pkt_type][mcs].mcs_type, 6631 pkt_type_array[pkt_type].mcs_count[mcs]); 6632 } 6633 6634 DP_PRINT_STATS("\n"); 6635 } 6636 } 6637 #endif 6638 6639 static inline void 6640 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu) 6641 { 6642 uint8_t mcs, pkt_type; 6643 6644 DP_PRINT_STATS("PPDU Count"); 6645 for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) { 6646 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6647 if (!dp_mu_rate_string[pkt_type][mcs].valid) 6648 continue; 6649 6650 DP_PRINT_STATS(" %s = %d", 6651 dp_mu_rate_string[pkt_type][mcs].mcs_type, 6652 rx_mu[pkt_type].ppdu.mcs_count[mcs]); 6653 } 6654 6655 DP_PRINT_STATS("\n"); 6656 } 6657 } 6658 6659 #ifdef WLAN_FEATURE_11BE 6660 static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev) 6661 { 6662 DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d", 6663 pdev->stats.rx.bw[0], pdev->stats.rx.bw[1], 6664 pdev->stats.rx.bw[2], pdev->stats.rx.bw[3], 6665 pdev->stats.rx.bw[4]); 6666 } 6667 6668 static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev) 6669 { 6670 DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d", 6671 pdev->stats.tx.bw[0], pdev->stats.tx.bw[1], 6672 pdev->stats.tx.bw[2], pdev->stats.tx.bw[3], 6673 pdev->stats.tx.bw[4]); 6674 } 6675 #else 6676 static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev) 6677 { 6678 DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d", 6679 pdev->stats.rx.bw[0], pdev->stats.rx.bw[1], 6680 pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]); 6681 } 6682 6683 static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev) 6684 { 6685 DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d", 6686 pdev->stats.tx.bw[0], pdev->stats.tx.bw[1], 6687 pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]); 6688 } 6689 #endif 6690 6691 void dp_print_rx_rates(struct dp_vdev *vdev) 6692 { 6693 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 6694 uint8_t i; 6695 uint8_t index = 0; 6696 char nss[DP_NSS_LENGTH]; 6697 6698 DP_PRINT_STATS("Rx Rate Info:\n"); 6699 dp_print_common_rates_info(pdev->stats.rx.pkt_type); 6700 6701 index = 0; 6702 for (i = 0; i < SS_COUNT; i++) { 6703 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 6704 " %d", pdev->stats.rx.nss[i]); 6705 } 6706 DP_PRINT_STATS("NSS(1-8) = %s", 6707 nss); 6708 6709 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6710 pdev->stats.rx.sgi_count[0], 6711 pdev->stats.rx.sgi_count[1], 6712 pdev->stats.rx.sgi_count[2], 6713 pdev->stats.rx.sgi_count[3]); 6714 6715 dp_print_rx_bw_stats(pdev); 6716 6717 DP_PRINT_STATS("Reception Type =" 6718 "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d", 6719 pdev->stats.rx.reception_type[0], 6720 pdev->stats.rx.reception_type[1], 6721 pdev->stats.rx.reception_type[2], 6722 pdev->stats.rx.reception_type[3]); 6723 DP_PRINT_STATS("Aggregation:\n"); 6724 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 6725 pdev->stats.rx.ampdu_cnt); 6726 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 6727 pdev->stats.rx.non_ampdu_cnt); 6728 DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d", 6729 pdev->stats.rx.amsdu_cnt); 6730 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d", 6731 pdev->stats.rx.non_amsdu_cnt); 6732 } 6733 6734 void dp_print_tx_rates(struct dp_vdev *vdev) 6735 { 6736 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 6737 6738 DP_PRINT_STATS("Tx Rate Info:\n"); 6739 dp_print_common_rates_info(pdev->stats.tx.pkt_type); 6740 6741 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6742 pdev->stats.tx.sgi_count[0], 6743 pdev->stats.tx.sgi_count[1], 6744 pdev->stats.tx.sgi_count[2], 6745 pdev->stats.tx.sgi_count[3]); 6746 6747 dp_print_tx_bw_stats(pdev); 6748 6749 DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma); 6750 DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc); 6751 DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc); 6752 DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries); 6753 DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi); 6754 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d", 6755 pdev->stats.tx.pream_punct_cnt); 6756 6757 DP_PRINT_STATS("Aggregation:\n"); 6758 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 6759 pdev->stats.tx.ampdu_cnt); 6760 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 6761 pdev->stats.tx.non_ampdu_cnt); 6762 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 6763 pdev->stats.tx.amsdu_cnt); 6764 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 6765 pdev->stats.tx.non_amsdu_cnt); 6766 } 6767 6768 /** 6769 * dp_print_nss(): Print nss count 6770 * @nss: printable nss count array 6771 * @pnss: nss count array 6772 * @ss_count: number of nss 6773 * 6774 * Return: void 6775 */ 6776 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count) 6777 { 6778 uint32_t index; 6779 uint8_t i; 6780 6781 index = 0; 6782 for (i = 0; i < ss_count; i++) { 6783 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 6784 " %d", *(pnss + i)); 6785 } 6786 } 6787 6788 /** 6789 * dp_print_jitter_stats(): Print per-tid jitter stats 6790 * @peer: DP peer object 6791 * @pdev: DP pdev object 6792 * 6793 * Return: void 6794 */ 6795 #ifdef WLAN_PEER_JITTER 6796 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 6797 { 6798 uint8_t tid = 0; 6799 6800 if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) 6801 return; 6802 6803 if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) 6804 return; 6805 6806 DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n"); 6807 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 6808 struct cdp_peer_tid_stats *rx_tid = 6809 &peer->txrx_peer->jitter_stats[tid]; 6810 6811 DP_PRINT_STATS("Node tid = %d\n" 6812 "Average Jiiter : %u (us)\n" 6813 "Average Delay : %u (us)\n" 6814 "Total Average error count : %llu\n" 6815 "Total Success Count : %llu\n" 6816 "Total Drop : %llu\n", 6817 tid, 6818 rx_tid->tx_avg_jitter, 6819 rx_tid->tx_avg_delay, 6820 rx_tid->tx_avg_err, 6821 rx_tid->tx_total_success, 6822 rx_tid->tx_drop); 6823 } 6824 } 6825 #else 6826 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 6827 { 6828 } 6829 #endif /* WLAN_PEER_JITTER */ 6830 6831 #ifdef QCA_PEER_EXT_STATS 6832 /** 6833 * dp_print_hist_stats() - Print delay histogram 6834 * @hstats: Histogram stats 6835 * @hist_type: histogram type 6836 * 6837 * Return: void 6838 */ 6839 static void dp_print_hist_stats(struct cdp_hist_stats *hstats, 6840 enum cdp_hist_types hist_type) 6841 { 6842 uint8_t index = 0; 6843 uint64_t count = 0; 6844 bool hist_delay_data = false; 6845 6846 for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) { 6847 count = hstats->hist.freq[index]; 6848 if (!count) 6849 continue; 6850 hist_delay_data = true; 6851 if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY) 6852 DP_PRINT_STATS("%s: Packets = %llu", 6853 dp_vow_str_sw_enq_delay(index), 6854 count); 6855 else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY) 6856 DP_PRINT_STATS("%s: Packets = %llu", 6857 dp_vow_str_fw_to_hw_delay(index), 6858 count); 6859 else if (hist_type == CDP_HIST_TYPE_REAP_STACK) 6860 DP_PRINT_STATS("%s: Packets = %llu", 6861 dp_vow_str_intfrm_delay(index), 6862 count); 6863 } 6864 6865 /* 6866 * If none of the buckets have any packets, 6867 * there is no need to display the stats. 6868 */ 6869 if (hist_delay_data) { 6870 DP_PRINT_STATS("Min = %u", hstats->min); 6871 DP_PRINT_STATS("Max = %u", hstats->max); 6872 DP_PRINT_STATS("Avg = %u\n", hstats->avg); 6873 } 6874 } 6875 6876 #ifdef CONFIG_SAWF 6877 /** 6878 * dp_accumulate_delay_avg_stats(): Accumulate the delay average stats 6879 * @stats: cdp_delay_tid stats 6880 * @dst_stats: Destination delay Tx stats 6881 * @tid: TID value 6882 * 6883 * Return: void 6884 */ 6885 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[] 6886 [CDP_MAX_TXRX_CTX], 6887 struct cdp_delay_tx_stats *dst_stats, 6888 uint8_t tid) 6889 { 6890 uint32_t num_rings = 0; 6891 uint8_t ring_id; 6892 6893 for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) { 6894 struct cdp_delay_tx_stats *dstats = 6895 &stats[tid][ring_id].tx_delay; 6896 6897 if (dstats->swdelay_avg || dstats->hwdelay_avg) { 6898 dst_stats->nwdelay_avg += dstats->nwdelay_avg; 6899 dst_stats->swdelay_avg += dstats->swdelay_avg; 6900 dst_stats->hwdelay_avg += dstats->hwdelay_avg; 6901 num_rings++; 6902 } 6903 } 6904 6905 if (!num_rings) 6906 return; 6907 6908 dst_stats->nwdelay_avg = qdf_do_div(dst_stats->nwdelay_avg, 6909 num_rings); 6910 dst_stats->swdelay_avg = qdf_do_div(dst_stats->swdelay_avg, 6911 num_rings); 6912 dst_stats->hwdelay_avg = qdf_do_div(dst_stats->hwdelay_avg, 6913 num_rings); 6914 } 6915 #else 6916 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[] 6917 [CDP_MAX_TXRX_CTX], 6918 struct cdp_delay_tx_stats *dst_stats, 6919 uint8_t tid) 6920 { 6921 } 6922 #endif 6923 6924 /** 6925 * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the 6926 * hist stats. 6927 * @soc: DP SoC handle 6928 * @stats: cdp_delay_tid stats 6929 * @dst_hstats: Destination histogram to copy tid stats 6930 * @tid: TID value 6931 * @mode: 6932 * 6933 * Return: void 6934 */ 6935 static void dp_accumulate_delay_tid_stats(struct dp_soc *soc, 6936 struct cdp_delay_tid_stats stats[] 6937 [CDP_MAX_TXRX_CTX], 6938 struct cdp_hist_stats *dst_hstats, 6939 uint8_t tid, uint32_t mode) 6940 { 6941 uint8_t ring_id; 6942 6943 if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) { 6944 struct cdp_delay_tid_stats *dstats = 6945 &stats[tid][0]; 6946 struct cdp_hist_stats *src_hstats = NULL; 6947 6948 switch (mode) { 6949 case CDP_HIST_TYPE_SW_ENQEUE_DELAY: 6950 src_hstats = &dstats->tx_delay.tx_swq_delay; 6951 break; 6952 case CDP_HIST_TYPE_HW_COMP_DELAY: 6953 src_hstats = &dstats->tx_delay.hwtx_delay; 6954 break; 6955 case CDP_HIST_TYPE_REAP_STACK: 6956 src_hstats = &dstats->rx_delay.to_stack_delay; 6957 break; 6958 default: 6959 break; 6960 } 6961 6962 if (src_hstats) 6963 dp_copy_hist_stats(src_hstats, dst_hstats); 6964 6965 return; 6966 } 6967 6968 for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) { 6969 struct cdp_delay_tid_stats *dstats = 6970 &stats[tid][ring_id]; 6971 struct cdp_hist_stats *src_hstats = NULL; 6972 6973 switch (mode) { 6974 case CDP_HIST_TYPE_SW_ENQEUE_DELAY: 6975 src_hstats = &dstats->tx_delay.tx_swq_delay; 6976 break; 6977 case CDP_HIST_TYPE_HW_COMP_DELAY: 6978 src_hstats = &dstats->tx_delay.hwtx_delay; 6979 break; 6980 case CDP_HIST_TYPE_REAP_STACK: 6981 src_hstats = &dstats->rx_delay.to_stack_delay; 6982 break; 6983 default: 6984 break; 6985 } 6986 6987 if (src_hstats) 6988 dp_accumulate_hist_stats(src_hstats, dst_hstats); 6989 } 6990 } 6991 6992 /** 6993 * dp_peer_print_tx_delay_stats() - Print peer delay stats 6994 * @pdev: DP pdev handle 6995 * @peer: DP peer handle 6996 * 6997 * Return: void 6998 */ 6999 static void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev, 7000 struct dp_peer *peer) 7001 { 7002 struct dp_peer_delay_stats *delay_stats; 7003 struct dp_soc *soc = NULL; 7004 struct cdp_hist_stats hist_stats; 7005 uint8_t tid; 7006 7007 if (!peer || !peer->txrx_peer) 7008 return; 7009 7010 if (!pdev || !pdev->soc) 7011 return; 7012 7013 soc = pdev->soc; 7014 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 7015 return; 7016 7017 delay_stats = peer->txrx_peer->delay_stats; 7018 if (!delay_stats) 7019 return; 7020 7021 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 7022 DP_PRINT_STATS("----TID: %d----", tid); 7023 DP_PRINT_STATS("Software Enqueue Delay:"); 7024 dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY); 7025 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 7026 &hist_stats, tid, 7027 CDP_HIST_TYPE_SW_ENQEUE_DELAY); 7028 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY); 7029 7030 DP_PRINT_STATS("Hardware Transmission Delay:"); 7031 dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY); 7032 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 7033 &hist_stats, tid, 7034 CDP_HIST_TYPE_HW_COMP_DELAY); 7035 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY); 7036 } 7037 } 7038 7039 /** 7040 * dp_peer_print_rx_delay_stats() - Print peer delay stats 7041 * @pdev: DP pdev handle 7042 * @peer: DP peer handle 7043 * 7044 * Return: void 7045 */ 7046 static void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev, 7047 struct dp_peer *peer) 7048 { 7049 struct dp_peer_delay_stats *delay_stats; 7050 struct dp_soc *soc = NULL; 7051 struct cdp_hist_stats hist_stats; 7052 uint8_t tid; 7053 7054 if (!peer || !peer->txrx_peer) 7055 return; 7056 7057 if (!pdev || !pdev->soc) 7058 return; 7059 7060 soc = pdev->soc; 7061 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 7062 return; 7063 7064 delay_stats = peer->txrx_peer->delay_stats; 7065 if (!delay_stats) 7066 return; 7067 7068 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 7069 DP_PRINT_STATS("----TID: %d----", tid); 7070 DP_PRINT_STATS("Rx Reap2stack Deliver Delay:"); 7071 dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK); 7072 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 7073 &hist_stats, tid, 7074 CDP_HIST_TYPE_REAP_STACK); 7075 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK); 7076 } 7077 } 7078 7079 #else 7080 static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev, 7081 struct dp_peer *peer) 7082 { 7083 } 7084 7085 static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev, 7086 struct dp_peer *peer) 7087 { 7088 } 7089 #endif 7090 7091 #ifdef WLAN_FEATURE_11BE 7092 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, 7093 enum peer_stats_type stats_type) 7094 { 7095 uint8_t i; 7096 7097 if (stats_type == PEER_TX_STATS) { 7098 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n", 7099 peer_stats->tx.bw[CMN_BW_20MHZ], 7100 peer_stats->tx.bw[CMN_BW_40MHZ], 7101 peer_stats->tx.bw[CMN_BW_80MHZ], 7102 peer_stats->tx.bw[CMN_BW_160MHZ], 7103 peer_stats->tx.bw[CMN_BW_320MHZ]); 7104 DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", 7105 peer_stats->tx.punc_bw[NO_PUNCTURE], 7106 peer_stats->tx.punc_bw[PUNCTURED_20MHZ], 7107 peer_stats->tx.punc_bw[PUNCTURED_40MHZ], 7108 peer_stats->tx.punc_bw[PUNCTURED_80MHZ], 7109 peer_stats->tx.punc_bw[PUNCTURED_120MHZ]); 7110 DP_PRINT_STATS("RU Locations"); 7111 for (i = 0; i < RU_INDEX_MAX; i++) 7112 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7113 cdp_ru_string[i].ru_type, 7114 peer_stats->tx.ru_loc[i].num_msdu, 7115 peer_stats->tx.ru_loc[i].num_mpdu, 7116 peer_stats->tx.ru_loc[i].mpdu_tried); 7117 dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt, 7118 DOT11_BE); 7119 dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]); 7120 7121 } else { 7122 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d", 7123 peer_stats->rx.bw[CMN_BW_20MHZ], 7124 peer_stats->rx.bw[CMN_BW_40MHZ], 7125 peer_stats->rx.bw[CMN_BW_80MHZ], 7126 peer_stats->rx.bw[CMN_BW_160MHZ], 7127 peer_stats->rx.bw[CMN_BW_320MHZ]); 7128 DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", 7129 peer_stats->rx.punc_bw[NO_PUNCTURE], 7130 peer_stats->rx.punc_bw[PUNCTURED_20MHZ], 7131 peer_stats->rx.punc_bw[PUNCTURED_40MHZ], 7132 peer_stats->rx.punc_bw[PUNCTURED_80MHZ], 7133 peer_stats->rx.punc_bw[PUNCTURED_120MHZ]); 7134 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt, 7135 DOT11_BE); 7136 dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]); 7137 } 7138 } 7139 #else 7140 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, 7141 enum peer_stats_type stats_type) 7142 { 7143 } 7144 #endif 7145 7146 void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats, 7147 enum peer_stats_type stats_type) 7148 { 7149 if (stats_type == PEER_TX_STATS) { 7150 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", 7151 peer_stats->tx.bw[CMN_BW_20MHZ], 7152 peer_stats->tx.bw[CMN_BW_40MHZ], 7153 peer_stats->tx.bw[CMN_BW_80MHZ], 7154 peer_stats->tx.bw[CMN_BW_160MHZ]); 7155 DP_PRINT_STATS("RU Locations"); 7156 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7157 cdp_ru_string[RU_26_INDEX].ru_type, 7158 peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu, 7159 peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu, 7160 peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried); 7161 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7162 cdp_ru_string[RU_52_INDEX].ru_type, 7163 peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu, 7164 peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu, 7165 peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried); 7166 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7167 cdp_ru_string[RU_106_INDEX].ru_type, 7168 peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu, 7169 peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu, 7170 peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried); 7171 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7172 cdp_ru_string[RU_242_INDEX].ru_type, 7173 peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu, 7174 peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu, 7175 peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried); 7176 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7177 cdp_ru_string[RU_484_INDEX].ru_type, 7178 peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu, 7179 peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu, 7180 peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried); 7181 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7182 cdp_ru_string[RU_996_INDEX].ru_type, 7183 peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu, 7184 peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu, 7185 peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried); 7186 } else { 7187 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", 7188 peer_stats->rx.bw[CMN_BW_20MHZ], 7189 peer_stats->rx.bw[CMN_BW_40MHZ], 7190 peer_stats->rx.bw[CMN_BW_80MHZ], 7191 peer_stats->rx.bw[CMN_BW_160MHZ]); 7192 } 7193 } 7194 7195 void dp_print_peer_txrx_stats_rh(struct cdp_peer_stats *peer_stats, 7196 enum peer_stats_type stats_type) 7197 { 7198 if (stats_type == PEER_TX_STATS) { 7199 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", 7200 peer_stats->tx.bw[CMN_BW_20MHZ], 7201 peer_stats->tx.bw[CMN_BW_40MHZ], 7202 peer_stats->tx.bw[CMN_BW_80MHZ], 7203 peer_stats->tx.bw[CMN_BW_160MHZ]); 7204 DP_PRINT_STATS("RU Locations"); 7205 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7206 cdp_ru_string[RU_26_INDEX].ru_type, 7207 peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu, 7208 peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu, 7209 peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried); 7210 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7211 cdp_ru_string[RU_52_INDEX].ru_type, 7212 peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu, 7213 peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu, 7214 peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried); 7215 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7216 cdp_ru_string[RU_106_INDEX].ru_type, 7217 peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu, 7218 peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu, 7219 peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried); 7220 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7221 cdp_ru_string[RU_242_INDEX].ru_type, 7222 peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu, 7223 peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu, 7224 peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried); 7225 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7226 cdp_ru_string[RU_484_INDEX].ru_type, 7227 peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu, 7228 peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu, 7229 peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried); 7230 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 7231 cdp_ru_string[RU_996_INDEX].ru_type, 7232 peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu, 7233 peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu, 7234 peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried); 7235 } else { 7236 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", 7237 peer_stats->rx.bw[CMN_BW_20MHZ], 7238 peer_stats->rx.bw[CMN_BW_40MHZ], 7239 peer_stats->rx.bw[CMN_BW_80MHZ], 7240 peer_stats->rx.bw[CMN_BW_160MHZ]); 7241 } 7242 } 7243 7244 #ifdef REO_SHARED_QREF_TABLE_EN 7245 static void dp_peer_print_reo_qref_table(struct dp_peer *peer) 7246 { 7247 struct hal_soc *hal; 7248 int i; 7249 uint64_t *reo_qref_addr; 7250 uint32_t peer_idx; 7251 7252 hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc; 7253 7254 if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal)) 7255 return; 7256 7257 if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) || 7258 (!hal->reo_qref.mlo_reo_qref_table_vaddr)) { 7259 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 7260 FL("REO shared table not allocated")); 7261 return; 7262 } 7263 7264 if (IS_MLO_DP_LINK_PEER(peer)) 7265 return; 7266 7267 if (IS_MLO_DP_MLD_PEER(peer)) { 7268 hal = (struct hal_soc *) 7269 peer->vdev->pdev->soc->hal_soc; 7270 peer_idx = (peer->peer_id - HAL_ML_PEER_ID_START) * 7271 DP_MAX_TIDS; 7272 reo_qref_addr = 7273 &hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx]; 7274 } else { 7275 peer_idx = (peer->peer_id * DP_MAX_TIDS); 7276 reo_qref_addr = 7277 &hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx]; 7278 } 7279 DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id); 7280 7281 for (i = 0; i < DP_MAX_TIDS; i++) 7282 DP_PRINT_STATS(" Tid [%d] :%llx", i, reo_qref_addr[i]); 7283 } 7284 #else 7285 static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer) 7286 { 7287 } 7288 #endif 7289 7290 void dp_print_peer_stats(struct dp_peer *peer, 7291 struct cdp_peer_stats *peer_stats) 7292 { 7293 uint8_t i; 7294 uint32_t index; 7295 uint32_t j; 7296 char nss[DP_NSS_LENGTH]; 7297 char mu_group_id[DP_MU_GROUP_LENGTH]; 7298 struct dp_pdev *pdev; 7299 uint32_t *pnss; 7300 enum cdp_mu_packet_type rx_mu_type; 7301 struct cdp_rx_mu *rx_mu; 7302 7303 pdev = peer->vdev->pdev; 7304 7305 DP_PRINT_STATS("Node Tx Stats:\n"); 7306 DP_PRINT_STATS("Total Packet Completions = %llu", 7307 peer_stats->tx.comp_pkt.num); 7308 DP_PRINT_STATS("Total Bytes Completions = %llu", 7309 peer_stats->tx.comp_pkt.bytes); 7310 DP_PRINT_STATS("Success Packets = %llu", 7311 peer_stats->tx.tx_success.num); 7312 DP_PRINT_STATS("Success Bytes = %llu", 7313 peer_stats->tx.tx_success.bytes); 7314 DP_PRINT_STATS("Success Packets in TWT Session = %llu", 7315 peer_stats->tx.tx_success_twt.num); 7316 DP_PRINT_STATS("Success Bytes in TWT Session = %llu", 7317 peer_stats->tx.tx_success_twt.bytes); 7318 DP_PRINT_STATS("Unicast Success Packets = %llu", 7319 peer_stats->tx.ucast.num); 7320 DP_PRINT_STATS("Unicast Success Bytes = %llu", 7321 peer_stats->tx.ucast.bytes); 7322 DP_PRINT_STATS("Multicast Success Packets = %llu", 7323 peer_stats->tx.mcast.num); 7324 DP_PRINT_STATS("Multicast Success Bytes = %llu", 7325 peer_stats->tx.mcast.bytes); 7326 DP_PRINT_STATS("Broadcast Success Packets = %llu", 7327 peer_stats->tx.bcast.num); 7328 DP_PRINT_STATS("Broadcast Success Bytes = %llu", 7329 peer_stats->tx.bcast.bytes); 7330 DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d", 7331 peer_stats->tx.retry_count); 7332 DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d", 7333 peer_stats->tx.multiple_retry_count); 7334 DP_PRINT_STATS("Packets Failed = %d", 7335 peer_stats->tx.tx_failed); 7336 DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d", 7337 peer_stats->tx.failed_retry_count); 7338 DP_PRINT_STATS("Packets In OFDMA = %d", 7339 peer_stats->tx.ofdma); 7340 DP_PRINT_STATS("Packets In STBC = %d", 7341 peer_stats->tx.stbc); 7342 DP_PRINT_STATS("Packets In LDPC = %d", 7343 peer_stats->tx.ldpc); 7344 DP_PRINT_STATS("Packet Retries = %d", 7345 peer_stats->tx.retries); 7346 DP_PRINT_STATS("MSDU's Part of AMSDU = %d", 7347 peer_stats->tx.amsdu_cnt); 7348 DP_PRINT_STATS("Msdu's As Part of Ampdu = %d", 7349 peer_stats->tx.non_ampdu_cnt); 7350 DP_PRINT_STATS("Msdu's As Ampdu = %d", 7351 peer_stats->tx.ampdu_cnt); 7352 DP_PRINT_STATS("Last Packet RSSI = %d", 7353 peer_stats->tx.last_ack_rssi); 7354 DP_PRINT_STATS("Dropped At FW: Removed Pkts = %llu", 7355 peer_stats->tx.dropped.fw_rem.num); 7356 DP_PRINT_STATS("Release source not TQM = %u", 7357 peer_stats->tx.release_src_not_tqm); 7358 if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { 7359 DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu", 7360 peer_stats->tx.dropped.fw_rem.bytes); 7361 } 7362 DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d", 7363 peer_stats->tx.dropped.fw_rem_tx); 7364 DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d", 7365 peer_stats->tx.dropped.fw_rem_notx); 7366 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u", 7367 peer_stats->tx.dropped.fw_reason1); 7368 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u", 7369 peer_stats->tx.dropped.fw_reason2); 7370 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u", 7371 peer_stats->tx.dropped.fw_reason3); 7372 DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u", 7373 peer_stats->tx.dropped.fw_rem_queue_disable); 7374 DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u", 7375 peer_stats->tx.dropped.fw_rem_no_match); 7376 DP_PRINT_STATS("Dropped due to HW threshold criteria = %u", 7377 peer_stats->tx.dropped.drop_threshold); 7378 DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u", 7379 peer_stats->tx.dropped.drop_link_desc_na); 7380 DP_PRINT_STATS("Drop bit set or invalid flow = %u", 7381 peer_stats->tx.dropped.invalid_drop); 7382 DP_PRINT_STATS("MCAST vdev drop in HW = %u", 7383 peer_stats->tx.dropped.mcast_vdev_drop); 7384 DP_PRINT_STATS("Dropped : Age Out = %d", 7385 peer_stats->tx.dropped.age_out); 7386 DP_PRINT_STATS("Dropped : Invalid Reason = %u", 7387 peer_stats->tx.dropped.invalid_rr); 7388 DP_PRINT_STATS("NAWDS : "); 7389 DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d", 7390 peer_stats->tx.nawds_mcast_drop); 7391 DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %llu", 7392 peer_stats->tx.nawds_mcast.num); 7393 DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu", 7394 peer_stats->tx.nawds_mcast.bytes); 7395 7396 DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus); 7397 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d", 7398 peer_stats->tx.pream_punct_cnt); 7399 DP_PRINT_STATS("MPDU's Successful = %d", 7400 peer_stats->tx.tx_mpdus_success); 7401 DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried); 7402 7403 DP_PRINT_STATS("Rate Info:"); 7404 dp_print_common_rates_info(peer_stats->tx.pkt_type); 7405 7406 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 7407 peer_stats->tx.sgi_count[0], 7408 peer_stats->tx.sgi_count[1], 7409 peer_stats->tx.sgi_count[2], 7410 peer_stats->tx.sgi_count[3]); 7411 7412 DP_PRINT_STATS("Wireless Mutlimedia "); 7413 DP_PRINT_STATS(" Best effort = %d", 7414 peer_stats->tx.wme_ac_type[0]); 7415 DP_PRINT_STATS(" Background= %d", 7416 peer_stats->tx.wme_ac_type[1]); 7417 DP_PRINT_STATS(" Video = %d", 7418 peer_stats->tx.wme_ac_type[2]); 7419 DP_PRINT_STATS(" Voice = %d", 7420 peer_stats->tx.wme_ac_type[3]); 7421 7422 DP_PRINT_STATS("Excess Retries per AC "); 7423 DP_PRINT_STATS(" Best effort = %d", 7424 peer_stats->tx.excess_retries_per_ac[0]); 7425 DP_PRINT_STATS(" Background= %d", 7426 peer_stats->tx.excess_retries_per_ac[1]); 7427 DP_PRINT_STATS(" Video = %d", 7428 peer_stats->tx.excess_retries_per_ac[2]); 7429 DP_PRINT_STATS(" Voice = %d", 7430 peer_stats->tx.excess_retries_per_ac[3]); 7431 7432 pnss = &peer_stats->tx.nss[0]; 7433 dp_print_nss(nss, pnss, SS_COUNT); 7434 7435 DP_PRINT_STATS("NSS(1-8) = %s", nss); 7436 7437 DP_PRINT_STATS("Transmit Type :"); 7438 DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 7439 peer_stats->tx.transmit_type[SU].num_msdu, 7440 peer_stats->tx.transmit_type[MU_MIMO].num_msdu, 7441 peer_stats->tx.transmit_type[MU_OFDMA].num_msdu, 7442 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu); 7443 7444 DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 7445 peer_stats->tx.transmit_type[SU].num_mpdu, 7446 peer_stats->tx.transmit_type[MU_MIMO].num_mpdu, 7447 peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu, 7448 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu); 7449 7450 DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 7451 peer_stats->tx.transmit_type[SU].mpdu_tried, 7452 peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried, 7453 peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried, 7454 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried); 7455 7456 for (i = 0; i < MAX_MU_GROUP_ID;) { 7457 index = 0; 7458 for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID; 7459 j++) { 7460 index += qdf_snprint(&mu_group_id[index], 7461 DP_MU_GROUP_LENGTH - index, 7462 " %d", 7463 peer_stats->tx.mu_group_id[i]); 7464 i++; 7465 } 7466 7467 DP_PRINT_STATS("User position list for GID %02d->%d: [%s]", 7468 i - DP_MU_GROUP_SHOW, i - 1, mu_group_id); 7469 } 7470 7471 DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]", 7472 peer_stats->tx.ru_start, peer_stats->tx.ru_tones); 7473 7474 DP_PRINT_STATS("Aggregation:"); 7475 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 7476 peer_stats->tx.amsdu_cnt); 7477 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 7478 peer_stats->tx.non_amsdu_cnt); 7479 7480 DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:"); 7481 DP_PRINT_STATS(" Bytes transmitted in last sec: %d", 7482 peer_stats->tx.tx_byte_rate); 7483 DP_PRINT_STATS(" Data transmitted in last sec: %d", 7484 peer_stats->tx.tx_data_rate); 7485 7486 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 7487 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 7488 PEER_TX_STATS); 7489 7490 if (!IS_MLO_DP_LINK_PEER(peer)) { 7491 dp_print_jitter_stats(peer, pdev); 7492 dp_peer_print_tx_delay_stats(pdev, peer); 7493 } 7494 7495 if (IS_MLO_DP_MLD_PEER(peer)) 7496 DP_PRINT_STATS("TX Invalid Link ID Packet Count = %u", 7497 peer_stats->tx.inval_link_id_pkt_cnt); 7498 7499 DP_PRINT_STATS("Node Rx Stats:"); 7500 DP_PRINT_STATS("Packets Sent To Stack = %llu", 7501 peer_stats->rx.to_stack.num); 7502 DP_PRINT_STATS("Bytes Sent To Stack = %llu", 7503 peer_stats->rx.to_stack.bytes); 7504 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 7505 DP_PRINT_STATS("Ring Id = %d", i); 7506 DP_PRINT_STATS(" Packets Received = %llu", 7507 peer_stats->rx.rcvd_reo[i].num); 7508 DP_PRINT_STATS(" Bytes Received = %llu", 7509 peer_stats->rx.rcvd_reo[i].bytes); 7510 } 7511 for (i = 0; i < CDP_MAX_LMACS; i++) 7512 DP_PRINT_STATS("Packets Received on lmac[%d] = %llu ( %llu )", 7513 i, peer_stats->rx.rx_lmac[i].num, 7514 peer_stats->rx.rx_lmac[i].bytes); 7515 7516 DP_PRINT_STATS("Unicast Packets Received = %llu", 7517 peer_stats->rx.unicast.num); 7518 DP_PRINT_STATS("Unicast Bytes Received = %llu", 7519 peer_stats->rx.unicast.bytes); 7520 DP_PRINT_STATS("Multicast Packets Received = %llu", 7521 peer_stats->rx.multicast.num); 7522 DP_PRINT_STATS("Multicast Bytes Received = %llu", 7523 peer_stats->rx.multicast.bytes); 7524 DP_PRINT_STATS("Broadcast Packets Received = %llu", 7525 peer_stats->rx.bcast.num); 7526 DP_PRINT_STATS("Broadcast Bytes Received = %llu", 7527 peer_stats->rx.bcast.bytes); 7528 DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %llu", 7529 peer_stats->rx.to_stack_twt.num); 7530 DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu", 7531 peer_stats->rx.to_stack_twt.bytes); 7532 DP_PRINT_STATS("Intra BSS Packets Received = %llu", 7533 peer_stats->rx.intra_bss.pkts.num); 7534 DP_PRINT_STATS("Intra BSS Bytes Received = %llu", 7535 peer_stats->rx.intra_bss.pkts.bytes); 7536 DP_PRINT_STATS("Intra BSS Packets Failed = %llu", 7537 peer_stats->rx.intra_bss.fail.num); 7538 DP_PRINT_STATS("Intra BSS Bytes Failed = %llu", 7539 peer_stats->rx.intra_bss.fail.bytes); 7540 DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded = %d", 7541 peer_stats->rx.intra_bss.mdns_no_fwd); 7542 DP_PRINT_STATS("Raw Packets Received = %llu", 7543 peer_stats->rx.raw.num); 7544 DP_PRINT_STATS("Raw Bytes Received = %llu", 7545 peer_stats->rx.raw.bytes); 7546 DP_PRINT_STATS("Errors: MIC Errors = %d", 7547 peer_stats->rx.err.mic_err); 7548 DP_PRINT_STATS("Errors: Decryption Errors = %d", 7549 peer_stats->rx.err.decrypt_err); 7550 DP_PRINT_STATS("Errors: PN Errors = %d", 7551 peer_stats->rx.err.pn_err); 7552 DP_PRINT_STATS("Errors: OOR Errors = %d", 7553 peer_stats->rx.err.oor_err); 7554 DP_PRINT_STATS("Errors: 2k Jump Errors = %d", 7555 peer_stats->rx.err.jump_2k_err); 7556 DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d", 7557 peer_stats->rx.err.rxdma_wifi_parse_err); 7558 DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d", 7559 peer_stats->rx.non_ampdu_cnt); 7560 DP_PRINT_STATS("Msdu's Received As Ampdu = %d", 7561 peer_stats->rx.ampdu_cnt); 7562 DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d", 7563 peer_stats->rx.non_amsdu_cnt); 7564 DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d", 7565 peer_stats->rx.amsdu_cnt); 7566 DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries); 7567 DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt); 7568 DP_PRINT_STATS("NAWDS : "); 7569 DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d", 7570 peer_stats->rx.nawds_mcast_drop); 7571 DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d", 7572 peer_stats->rx.mcast_3addr_drop); 7573 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 7574 peer_stats->rx.sgi_count[0], 7575 peer_stats->rx.sgi_count[1], 7576 peer_stats->rx.sgi_count[2], 7577 peer_stats->rx.sgi_count[3]); 7578 7579 DP_PRINT_STATS("Wireless Mutlimedia "); 7580 DP_PRINT_STATS(" Best effort = %d", 7581 peer_stats->rx.wme_ac_type[0]); 7582 DP_PRINT_STATS(" Background= %d", 7583 peer_stats->rx.wme_ac_type[1]); 7584 DP_PRINT_STATS(" Video = %d", 7585 peer_stats->rx.wme_ac_type[2]); 7586 DP_PRINT_STATS(" Voice = %d", 7587 peer_stats->rx.wme_ac_type[3]); 7588 7589 DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus); 7590 DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus); 7591 DP_PRINT_STATS("MSDU Reception Type"); 7592 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 7593 peer_stats->rx.reception_type[0], 7594 peer_stats->rx.reception_type[1], 7595 peer_stats->rx.reception_type[2], 7596 peer_stats->rx.reception_type[3]); 7597 DP_PRINT_STATS("PPDU Reception Type"); 7598 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 7599 peer_stats->rx.ppdu_cnt[0], 7600 peer_stats->rx.ppdu_cnt[1], 7601 peer_stats->rx.ppdu_cnt[2], 7602 peer_stats->rx.ppdu_cnt[3]); 7603 7604 dp_print_common_rates_info(peer_stats->rx.pkt_type); 7605 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt, 7606 DOT11_AX); 7607 dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]); 7608 7609 pnss = &peer_stats->rx.nss[0]; 7610 dp_print_nss(nss, pnss, SS_COUNT); 7611 DP_PRINT_STATS("MSDU Count"); 7612 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 7613 7614 DP_PRINT_STATS("reception mode SU"); 7615 pnss = &peer_stats->rx.ppdu_nss[0]; 7616 dp_print_nss(nss, pnss, SS_COUNT); 7617 7618 DP_PRINT_STATS(" PPDU Count"); 7619 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 7620 7621 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 7622 peer_stats->rx.mpdu_cnt_fcs_ok, 7623 peer_stats->rx.mpdu_cnt_fcs_err); 7624 7625 for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) { 7626 DP_PRINT_STATS("reception mode %s", 7627 mu_reception_mode[rx_mu_type]); 7628 rx_mu = &peer_stats->rx.rx_mu[rx_mu_type]; 7629 7630 pnss = &rx_mu->ppdu_nss[0]; 7631 dp_print_nss(nss, pnss, SS_COUNT); 7632 DP_PRINT_STATS(" PPDU Count"); 7633 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 7634 7635 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 7636 rx_mu->mpdu_cnt_fcs_ok, 7637 rx_mu->mpdu_cnt_fcs_err); 7638 } 7639 7640 DP_PRINT_STATS("Aggregation:"); 7641 DP_PRINT_STATS(" Msdu's Part of Ampdu = %d", 7642 peer_stats->rx.ampdu_cnt); 7643 DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %d", 7644 peer_stats->rx.non_ampdu_cnt); 7645 DP_PRINT_STATS(" Msdu's Part of Amsdu = %d", 7646 peer_stats->rx.amsdu_cnt); 7647 DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %d", 7648 peer_stats->rx.non_amsdu_cnt); 7649 7650 DP_PRINT_STATS("Bytes and Packets received in last one sec:"); 7651 DP_PRINT_STATS(" Bytes received in last sec: %d", 7652 peer_stats->rx.rx_byte_rate); 7653 DP_PRINT_STATS(" Data received in last sec: %d", 7654 peer_stats->rx.rx_data_rate); 7655 DP_PRINT_STATS("MEC Packet Drop = %llu", 7656 peer_stats->rx.mec_drop.num); 7657 DP_PRINT_STATS("MEC Byte Drop = %llu", 7658 peer_stats->rx.mec_drop.bytes); 7659 DP_PRINT_STATS("Multipass Rx Packet Drop = %d", 7660 peer_stats->rx.multipass_rx_pkt_drop); 7661 DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d", 7662 peer_stats->rx.peer_unauth_rx_pkt_drop); 7663 DP_PRINT_STATS("Policy Check Rx Packet Drop = %d", 7664 peer_stats->rx.policy_check_drop); 7665 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 7666 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 7667 PEER_RX_STATS); 7668 7669 if (!IS_MLO_DP_LINK_PEER(peer)) 7670 dp_peer_print_rx_delay_stats(pdev, peer); 7671 7672 if (IS_MLO_DP_MLD_PEER(peer)) 7673 DP_PRINT_STATS("RX Invalid Link ID Packet Count = %u", 7674 peer_stats->rx.inval_link_id_pkt_cnt); 7675 7676 dp_peer_print_reo_qref_table(peer); 7677 } 7678 7679 void dp_print_per_ring_stats(struct dp_soc *soc) 7680 { 7681 uint8_t ring; 7682 uint16_t core; 7683 uint64_t total_packets; 7684 7685 DP_PRINT_STATS("Rx packets per ring:"); 7686 for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) { 7687 total_packets = 0; 7688 DP_PRINT_STATS("Packets on ring %u:", ring); 7689 for (core = 0; core < num_possible_cpus(); core++) { 7690 if (!soc->stats.rx.ring_packets[core][ring]) 7691 continue; 7692 DP_PRINT_STATS("Packets arriving on core %u: %llu", 7693 core, 7694 soc->stats.rx.ring_packets[core][ring]); 7695 total_packets += soc->stats.rx.ring_packets[core][ring]; 7696 } 7697 DP_PRINT_STATS("Total packets on ring %u: %llu", 7698 ring, total_packets); 7699 } 7700 } 7701 7702 static void dp_pdev_print_tx_rx_rates(struct dp_pdev *pdev) 7703 { 7704 struct dp_vdev *vdev; 7705 struct dp_vdev **vdev_array = NULL; 7706 int index = 0, num_vdev = 0; 7707 7708 if (!pdev) { 7709 dp_err("pdev is NULL"); 7710 return; 7711 } 7712 7713 vdev_array = 7714 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 7715 if (!vdev_array) 7716 return; 7717 7718 qdf_spin_lock_bh(&pdev->vdev_list_lock); 7719 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 7720 if (dp_vdev_get_ref(pdev->soc, vdev, DP_MOD_ID_GENERIC_STATS)) 7721 continue; 7722 vdev_array[index] = vdev; 7723 index = index + 1; 7724 } 7725 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 7726 7727 num_vdev = index; 7728 7729 for (index = 0; index < num_vdev; index++) { 7730 vdev = vdev_array[index]; 7731 dp_print_rx_rates(vdev); 7732 dp_print_tx_rates(vdev); 7733 dp_vdev_unref_delete(pdev->soc, vdev, DP_MOD_ID_GENERIC_STATS); 7734 } 7735 qdf_mem_free(vdev_array); 7736 } 7737 7738 void dp_txrx_path_stats(struct dp_soc *soc) 7739 { 7740 uint8_t error_code; 7741 uint8_t loop_pdev; 7742 struct dp_pdev *pdev; 7743 uint8_t i; 7744 uint8_t *buf; 7745 size_t pos, buf_len; 7746 uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'}; 7747 7748 if (!soc) { 7749 dp_err("Invalid access"); 7750 return; 7751 } 7752 7753 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 7754 pdev = soc->pdev_list[loop_pdev]; 7755 dp_aggregate_pdev_stats(pdev); 7756 DP_PRINT_STATS("Tx path Statistics:"); 7757 DP_PRINT_STATS("from stack: %llu msdus (%llu bytes)", 7758 pdev->stats.tx_i.rcvd.num, 7759 pdev->stats.tx_i.rcvd.bytes); 7760 DP_PRINT_STATS("processed from host: %llu msdus (%llu bytes)", 7761 pdev->stats.tx_i.processed.num, 7762 pdev->stats.tx_i.processed.bytes); 7763 DP_PRINT_STATS("successfully transmitted: %llu msdus (%llu bytes)", 7764 pdev->stats.tx.tx_success.num, 7765 pdev->stats.tx.tx_success.bytes); 7766 7767 dp_print_tx_ring_stats(soc); 7768 7769 DP_PRINT_STATS("Invalid release source: %u", 7770 soc->stats.tx.invalid_release_source); 7771 DP_PRINT_STATS("Invalid TX desc from completion ring: %u", 7772 soc->stats.tx.invalid_tx_comp_desc); 7773 DP_PRINT_STATS("Dropped in host:"); 7774 DP_PRINT_STATS("Total packets dropped: %llu", 7775 pdev->stats.tx_i.dropped.dropped_pkt.num); 7776 DP_PRINT_STATS("Descriptor not available: %llu", 7777 pdev->stats.tx_i.dropped.desc_na.num); 7778 DP_PRINT_STATS("Ring full: %u", 7779 pdev->stats.tx_i.dropped.ring_full); 7780 DP_PRINT_STATS("Enqueue fail: %u", 7781 pdev->stats.tx_i.dropped.enqueue_fail); 7782 DP_PRINT_STATS("Pkt dropped in vdev-id check: %u", 7783 pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); 7784 DP_PRINT_STATS("DMA Error: %u", 7785 pdev->stats.tx_i.dropped.dma_error); 7786 DP_PRINT_STATS("Drop Ingress: %u", 7787 pdev->stats.tx_i.dropped.drop_ingress); 7788 DP_PRINT_STATS("Resources full: %u", 7789 pdev->stats.tx_i.dropped.res_full); 7790 DP_PRINT_STATS("Headroom insufficient: %u", 7791 pdev->stats.tx_i.dropped.headroom_insufficient); 7792 DP_PRINT_STATS("Invalid peer id in exception path: %u", 7793 pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path); 7794 DP_PRINT_STATS("Tx Mcast Drop: %u", 7795 pdev->stats.tx_i.dropped.tx_mcast_drop); 7796 DP_PRINT_STATS("FW2WBM Tx Drop: %u", 7797 pdev->stats.tx_i.dropped.fw2wbm_tx_drop); 7798 7799 DP_PRINT_STATS("Dropped in hardware:"); 7800 DP_PRINT_STATS("total packets dropped: %u", 7801 pdev->stats.tx.tx_failed); 7802 DP_PRINT_STATS("mpdu age out: %u", 7803 pdev->stats.tx.dropped.age_out); 7804 DP_PRINT_STATS("firmware removed packets: %llu (%llu bytes)", 7805 pdev->stats.tx.dropped.fw_rem.num, 7806 pdev->stats.tx.dropped.fw_rem.bytes); 7807 DP_PRINT_STATS("firmware removed tx: %u", 7808 pdev->stats.tx.dropped.fw_rem_tx); 7809 DP_PRINT_STATS("firmware removed notx %u", 7810 pdev->stats.tx.dropped.fw_rem_notx); 7811 DP_PRINT_STATS("Invalid peer on tx path: %llu", 7812 pdev->soc->stats.tx.tx_invalid_peer.num); 7813 DP_PRINT_STATS("Tx desc freed in non-completion path: %u", 7814 pdev->soc->stats.tx.tx_comp_exception); 7815 DP_PRINT_STATS("Tx desc force freed: %u", 7816 pdev->soc->stats.tx.tx_comp_force_freed); 7817 7818 buf = dp_stats_str; 7819 buf_len = DP_STATS_STR_LEN; 7820 pos = 0; 7821 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "Tx/IRQ [Range:Pkts] ["); 7822 7823 pos += qdf_scnprintf(buf + pos, buf_len - pos, "1: %u, ", 7824 pdev->stats.tx_comp_histogram.pkts_1); 7825 pos += qdf_scnprintf(buf + pos, buf_len - pos, "2-20: %u, ", 7826 pdev->stats.tx_comp_histogram.pkts_2_20); 7827 pos += qdf_scnprintf(buf + pos, buf_len - pos, "21-40: %u, ", 7828 pdev->stats.tx_comp_histogram.pkts_21_40); 7829 pos += qdf_scnprintf(buf + pos, buf_len - pos, "41-60: %u, ", 7830 pdev->stats.tx_comp_histogram.pkts_41_60); 7831 pos += qdf_scnprintf(buf + pos, buf_len - pos, "61-80: %u, ", 7832 pdev->stats.tx_comp_histogram.pkts_61_80); 7833 pos += qdf_scnprintf(buf + pos, buf_len - pos, "81-100: %u, ", 7834 pdev->stats.tx_comp_histogram.pkts_81_100); 7835 pos += qdf_scnprintf(buf + pos, buf_len - pos, "101-200: %u, ", 7836 pdev->stats.tx_comp_histogram.pkts_101_200); 7837 pos += qdf_scnprintf(buf + pos, buf_len - pos, "201+: %u", 7838 pdev->stats.tx_comp_histogram.pkts_201_plus); 7839 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]"); 7840 DP_PRINT_STATS("%s", dp_stats_str); 7841 7842 DP_PRINT_STATS("Rx path statistics:"); 7843 7844 DP_PRINT_STATS("delivered %llu msdus ( %llu bytes)", 7845 pdev->stats.rx.to_stack.num, 7846 pdev->stats.rx.to_stack.bytes); 7847 7848 dp_print_rx_ring_stats(pdev); 7849 7850 for (i = 0; i < CDP_MAX_LMACS; i++) 7851 DP_PRINT_STATS("received on lmac[%d] %llu msdus (%llu bytes)", 7852 i, pdev->stats.rx.rx_lmac[i].num, 7853 pdev->stats.rx.rx_lmac[i].bytes); 7854 DP_PRINT_STATS("intra-bss packets %llu msdus ( %llu bytes)", 7855 pdev->stats.rx.intra_bss.pkts.num, 7856 pdev->stats.rx.intra_bss.pkts.bytes); 7857 DP_PRINT_STATS("intra-bss fails %llu msdus ( %llu bytes)", 7858 pdev->stats.rx.intra_bss.fail.num, 7859 pdev->stats.rx.intra_bss.fail.bytes); 7860 DP_PRINT_STATS("intra-bss no mdns fwds %u msdus", 7861 pdev->stats.rx.intra_bss.mdns_no_fwd); 7862 7863 DP_PRINT_STATS("raw packets %llu msdus ( %llu bytes)", 7864 pdev->stats.rx.raw.num, 7865 pdev->stats.rx.raw.bytes); 7866 7867 DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame); 7868 7869 dp_print_rx_err_stats(soc, pdev); 7870 7871 for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX; 7872 error_code++) { 7873 if (!pdev->soc->stats.rx.err.rxdma_error[error_code]) 7874 continue; 7875 DP_PRINT_STATS("Rxdma error number (%u): %u msdus", 7876 error_code, 7877 pdev->soc->stats.rx.err 7878 .rxdma_error[error_code]); 7879 } 7880 7881 pos = 0; 7882 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "Rx/IRQ [Range:Pkts] ["); 7883 7884 pos += qdf_scnprintf(buf + pos, buf_len - pos, "1: %u, ", 7885 pdev->stats.rx_ind_histogram.pkts_1); 7886 pos += qdf_scnprintf(buf + pos, buf_len - pos, "2-20: %u, ", 7887 pdev->stats.rx_ind_histogram.pkts_2_20); 7888 pos += qdf_scnprintf(buf + pos, buf_len - pos, "21-40: %u, ", 7889 pdev->stats.rx_ind_histogram.pkts_21_40); 7890 pos += qdf_scnprintf(buf + pos, buf_len - pos, "41-60: %u, ", 7891 pdev->stats.rx_ind_histogram.pkts_41_60); 7892 pos += qdf_scnprintf(buf + pos, buf_len - pos, "61-80: %u, ", 7893 pdev->stats.rx_ind_histogram.pkts_61_80); 7894 pos += qdf_scnprintf(buf + pos, buf_len - pos, "81-100: %u, ", 7895 pdev->stats.rx_ind_histogram.pkts_81_100); 7896 pos += qdf_scnprintf(buf + pos, buf_len - pos, "101-200: %u, ", 7897 pdev->stats.rx_ind_histogram.pkts_101_200); 7898 pos += qdf_scnprintf(buf + pos, buf_len - pos, "201+: %u", 7899 pdev->stats.rx_ind_histogram.pkts_201_plus); 7900 pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]"); 7901 DP_PRINT_STATS("%s", dp_stats_str); 7902 7903 DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u", 7904 __func__, 7905 pdev->soc->wlan_cfg_ctx 7906 ->tso_enabled, 7907 pdev->soc->wlan_cfg_ctx 7908 ->lro_enabled, 7909 pdev->soc->wlan_cfg_ctx 7910 ->rx_hash, 7911 pdev->soc->wlan_cfg_ctx 7912 ->napi_enabled); 7913 #ifdef QCA_LL_TX_FLOW_CONTROL_V2 7914 DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u", 7915 __func__, 7916 pdev->soc->wlan_cfg_ctx 7917 ->tx_flow_stop_queue_threshold, 7918 pdev->soc->wlan_cfg_ctx 7919 ->tx_flow_start_queue_offset); 7920 #endif 7921 dp_pdev_print_tx_rx_rates(pdev); 7922 } 7923 } 7924 7925 #ifndef WLAN_SOFTUMAC_SUPPORT 7926 /** 7927 * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats 7928 * Current scope is bar received count 7929 * 7930 * @soc : Datapath SOC handle 7931 * @peer: Datapath peer handle 7932 * @arg : argument to iterate function 7933 * 7934 * Return: void 7935 */ 7936 static void 7937 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc, 7938 struct dp_peer *peer, 7939 void *arg) 7940 { 7941 uint32_t waitcnt; 7942 struct dp_peer *tgt_peer = dp_get_tgt_peer_from_peer(peer); 7943 struct dp_pdev *pdev = tgt_peer->vdev->pdev; 7944 7945 waitcnt = 0; 7946 dp_peer_rxtid_stats(tgt_peer, dp_rx_bar_stats_cb, pdev); 7947 while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) && 7948 waitcnt < 10) { 7949 schedule_timeout_interruptible( 7950 STATS_PROC_TIMEOUT); 7951 waitcnt++; 7952 } 7953 qdf_atomic_set(&pdev->stats_cmd_complete, 0); 7954 } 7955 7956 #else 7957 /** 7958 * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats 7959 * Current scope is bar received count 7960 * 7961 * @soc : Datapath SOC handle 7962 * @peer: Datapath peer handle 7963 * @arg : argument to iterate function 7964 * 7965 * Return: void 7966 */ 7967 static void 7968 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc, 7969 struct dp_peer *peer, 7970 void *arg) 7971 { 7972 } 7973 #endif /* WLAN_SOFTUMAC_SUPPORT */ 7974 7975 void 7976 dp_print_pdev_tx_stats(struct dp_pdev *pdev) 7977 { 7978 uint8_t i = 0, index = 0; 7979 7980 DP_PRINT_STATS("PDEV Tx Stats:\n"); 7981 DP_PRINT_STATS("Received From Stack:"); 7982 DP_PRINT_STATS(" Packets = %llu", 7983 pdev->stats.tx_i.rcvd.num); 7984 DP_PRINT_STATS(" Bytes = %llu", 7985 pdev->stats.tx_i.rcvd.bytes); 7986 DP_PRINT_STATS("Received from Stack in FP:"); 7987 DP_PRINT_STATS(" Packets = %llu", 7988 pdev->stats.tx_i.rcvd_in_fast_xmit_flow); 7989 DP_PRINT_STATS("Received from Stack per core:"); 7990 DP_PRINT_STATS(" Packets = %u %u %u %u", 7991 pdev->stats.tx_i.rcvd_per_core[0], 7992 pdev->stats.tx_i.rcvd_per_core[1], 7993 pdev->stats.tx_i.rcvd_per_core[2], 7994 pdev->stats.tx_i.rcvd_per_core[3]); 7995 DP_PRINT_STATS("Processed:"); 7996 DP_PRINT_STATS(" Packets = %llu", 7997 pdev->stats.tx_i.processed.num); 7998 DP_PRINT_STATS(" Bytes = %llu", 7999 pdev->stats.tx_i.processed.bytes); 8000 DP_PRINT_STATS("Total Completions:"); 8001 DP_PRINT_STATS(" Packets = %llu", 8002 pdev->stats.tx.comp_pkt.num); 8003 DP_PRINT_STATS(" Bytes = %llu", 8004 pdev->stats.tx.comp_pkt.bytes); 8005 DP_PRINT_STATS("Successful Completions:"); 8006 DP_PRINT_STATS(" Packets = %llu", 8007 pdev->stats.tx.tx_success.num); 8008 DP_PRINT_STATS(" Bytes = %llu", 8009 pdev->stats.tx.tx_success.bytes); 8010 DP_PRINT_STATS("Dropped:"); 8011 DP_PRINT_STATS(" Total = %llu", 8012 pdev->stats.tx_i.dropped.dropped_pkt.num); 8013 DP_PRINT_STATS(" Dma_map_error = %u", 8014 pdev->stats.tx_i.dropped.dma_error); 8015 DP_PRINT_STATS(" Ring Full = %u", 8016 pdev->stats.tx_i.dropped.ring_full); 8017 DP_PRINT_STATS(" Descriptor Not available = %llu", 8018 pdev->stats.tx_i.dropped.desc_na.num); 8019 DP_PRINT_STATS(" HW enqueue failed= %u", 8020 pdev->stats.tx_i.dropped.enqueue_fail); 8021 DP_PRINT_STATS(" Descriptor alloc fail = %llu", 8022 pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num); 8023 DP_PRINT_STATS(" Tx outstanding too many = %llu", 8024 pdev->stats.tx_i.dropped.desc_na_exc_outstand.num); 8025 DP_PRINT_STATS(" Pkt dropped in vdev-id check= %u", 8026 pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); 8027 DP_PRINT_STATS(" Resources Full = %u", 8028 pdev->stats.tx_i.dropped.res_full); 8029 DP_PRINT_STATS(" Drop Ingress = %u", 8030 pdev->stats.tx_i.dropped.drop_ingress); 8031 DP_PRINT_STATS(" invalid peer id in exception path = %u", 8032 pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path); 8033 DP_PRINT_STATS(" Tx Mcast Drop = %u", 8034 pdev->stats.tx_i.dropped.tx_mcast_drop); 8035 DP_PRINT_STATS(" PPE-DS FW2WBM Tx Drop = %u", 8036 pdev->stats.tx_i.dropped.fw2wbm_tx_drop); 8037 DP_PRINT_STATS("Tx failed = %u", 8038 pdev->stats.tx.tx_failed); 8039 DP_PRINT_STATS(" FW removed Pkts = %llu", 8040 pdev->stats.tx.dropped.fw_rem.num); 8041 DP_PRINT_STATS(" FW removed bytes= %llu", 8042 pdev->stats.tx.dropped.fw_rem.bytes); 8043 DP_PRINT_STATS(" FW removed transmitted = %u", 8044 pdev->stats.tx.dropped.fw_rem_tx); 8045 DP_PRINT_STATS(" FW removed untransmitted = %u", 8046 pdev->stats.tx.dropped.fw_rem_notx); 8047 DP_PRINT_STATS(" FW removed untransmitted fw_reason1 = %u", 8048 pdev->stats.tx.dropped.fw_reason1); 8049 DP_PRINT_STATS(" FW removed untransmitted fw_reason2 = %u", 8050 pdev->stats.tx.dropped.fw_reason2); 8051 DP_PRINT_STATS(" FW removed untransmitted fw_reason3 = %u", 8052 pdev->stats.tx.dropped.fw_reason3); 8053 DP_PRINT_STATS(" FW removed untransmitted disable queue = %u", 8054 pdev->stats.tx.dropped.fw_rem_queue_disable); 8055 DP_PRINT_STATS(" FW removed untransmitted no match = %u", 8056 pdev->stats.tx.dropped.fw_rem_no_match); 8057 DP_PRINT_STATS(" Dropped due to HW threshold criteria = %u", 8058 pdev->stats.tx.dropped.drop_threshold); 8059 DP_PRINT_STATS(" Link desc not available drop = %u", 8060 pdev->stats.tx.dropped.drop_link_desc_na); 8061 DP_PRINT_STATS(" Drop bit set or invalid flow = %u", 8062 pdev->stats.tx.dropped.invalid_drop); 8063 DP_PRINT_STATS(" MCAST vdev drop in HW = %u", 8064 pdev->stats.tx.dropped.mcast_vdev_drop); 8065 DP_PRINT_STATS(" Dropped with invalid reason = %u", 8066 pdev->stats.tx.dropped.invalid_rr); 8067 DP_PRINT_STATS(" Aged Out from msdu/mpdu queues = %u", 8068 pdev->stats.tx.dropped.age_out); 8069 DP_PRINT_STATS(" headroom insufficient = %u", 8070 pdev->stats.tx_i.dropped.headroom_insufficient); 8071 DP_PRINT_STATS("Multicast:"); 8072 DP_PRINT_STATS(" Packets: %llu", 8073 pdev->stats.tx.mcast.num); 8074 DP_PRINT_STATS(" Bytes: %llu", 8075 pdev->stats.tx.mcast.bytes); 8076 DP_PRINT_STATS("Scatter Gather:"); 8077 DP_PRINT_STATS(" Packets = %llu", 8078 pdev->stats.tx_i.sg.sg_pkt.num); 8079 DP_PRINT_STATS(" Bytes = %llu", 8080 pdev->stats.tx_i.sg.sg_pkt.bytes); 8081 DP_PRINT_STATS(" Dropped By Host = %llu", 8082 pdev->stats.tx_i.sg.dropped_host.num); 8083 DP_PRINT_STATS(" Dropped By Target = %u", 8084 pdev->stats.tx_i.sg.dropped_target); 8085 DP_PRINT_STATS("Mcast Enhancement:"); 8086 DP_PRINT_STATS(" Packets = %llu", 8087 pdev->stats.tx_i.mcast_en.mcast_pkt.num); 8088 DP_PRINT_STATS(" Bytes = %llu", 8089 pdev->stats.tx_i.mcast_en.mcast_pkt.bytes); 8090 DP_PRINT_STATS(" Dropped: Map Errors = %u", 8091 pdev->stats.tx_i.mcast_en.dropped_map_error); 8092 DP_PRINT_STATS(" Dropped: Self Mac = %u", 8093 pdev->stats.tx_i.mcast_en.dropped_self_mac); 8094 DP_PRINT_STATS(" Dropped: Send Fail = %u", 8095 pdev->stats.tx_i.mcast_en.dropped_send_fail); 8096 DP_PRINT_STATS(" Unicast sent = %u", 8097 pdev->stats.tx_i.mcast_en.ucast); 8098 8099 DP_PRINT_STATS("EAPOL Packets dropped:"); 8100 DP_PRINT_STATS(" Dropped: TX desc errors = %u", 8101 pdev->stats.eap_drop_stats.tx_desc_err); 8102 DP_PRINT_STATS(" Dropped: Tx HAL ring access errors = %u", 8103 pdev->stats.eap_drop_stats.tx_hal_ring_access_err); 8104 DP_PRINT_STATS(" Dropped: TX DMA map errors = %u", 8105 pdev->stats.eap_drop_stats.tx_dma_map_err); 8106 DP_PRINT_STATS(" Dropped: Tx HW enqueue errors = %u", 8107 pdev->stats.eap_drop_stats.tx_hw_enqueue); 8108 DP_PRINT_STATS(" Dropped: TX SW enqueue errors= %u", 8109 pdev->stats.eap_drop_stats.tx_sw_enqueue); 8110 8111 DP_PRINT_STATS("IGMP Mcast Enhancement:"); 8112 DP_PRINT_STATS(" IGMP packets received = %u", 8113 pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd); 8114 DP_PRINT_STATS(" Converted to uncast = %u", 8115 pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted); 8116 DP_PRINT_STATS("Raw:"); 8117 DP_PRINT_STATS(" Packets = %llu", 8118 pdev->stats.tx_i.raw.raw_pkt.num); 8119 DP_PRINT_STATS(" Bytes = %llu", 8120 pdev->stats.tx_i.raw.raw_pkt.bytes); 8121 DP_PRINT_STATS(" DMA map error = %u", 8122 pdev->stats.tx_i.raw.dma_map_error); 8123 DP_PRINT_STATS(" RAW pkt type[!data] error = %u", 8124 pdev->stats.tx_i.raw.invalid_raw_pkt_datatype); 8125 DP_PRINT_STATS(" Frags count overflow error = %u", 8126 pdev->stats.tx_i.raw.num_frags_overflow_err); 8127 DP_PRINT_STATS("Reinjected:"); 8128 DP_PRINT_STATS(" Packets = %llu", 8129 pdev->stats.tx_i.reinject_pkts.num); 8130 DP_PRINT_STATS(" Bytes = %llu\n", 8131 pdev->stats.tx_i.reinject_pkts.bytes); 8132 DP_PRINT_STATS("Inspected:"); 8133 DP_PRINT_STATS(" Packets = %llu", 8134 pdev->stats.tx_i.inspect_pkts.num); 8135 DP_PRINT_STATS(" Bytes = %llu", 8136 pdev->stats.tx_i.inspect_pkts.bytes); 8137 DP_PRINT_STATS("Nawds Multicast:"); 8138 DP_PRINT_STATS(" Packets = %llu", 8139 pdev->stats.tx_i.nawds_mcast.num); 8140 DP_PRINT_STATS(" Bytes = %llu", 8141 pdev->stats.tx_i.nawds_mcast.bytes); 8142 DP_PRINT_STATS("CCE Classified:"); 8143 DP_PRINT_STATS(" CCE Classified Packets: %u", 8144 pdev->stats.tx_i.cce_classified); 8145 DP_PRINT_STATS(" RAW CCE Classified Packets: %u", 8146 pdev->stats.tx_i.cce_classified_raw); 8147 DP_PRINT_STATS("Mesh stats:"); 8148 DP_PRINT_STATS(" frames to firmware: %u", 8149 pdev->stats.tx_i.mesh.exception_fw); 8150 DP_PRINT_STATS(" completions from fw: %u", 8151 pdev->stats.tx_i.mesh.completion_fw); 8152 DP_PRINT_STATS("PPDU stats counter"); 8153 for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) { 8154 DP_PRINT_STATS(" Tag[%d] = %llu", index, 8155 pdev->stats.ppdu_stats_counter[index]); 8156 } 8157 DP_PRINT_STATS("BA not received for delayed_ba: %u", 8158 pdev->stats.cdp_delayed_ba_not_recev); 8159 8160 dp_monitor_print_tx_stats(pdev); 8161 8162 DP_PRINT_STATS("tx_ppdu_proc: %llu", 8163 pdev->stats.tx_ppdu_proc); 8164 DP_PRINT_STATS("ack ba comes twice: %llu", 8165 pdev->stats.ack_ba_comes_twice); 8166 DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu", 8167 pdev->stats.ppdu_drop); 8168 DP_PRINT_STATS("ppdu dropped because of wrap around: %llu", 8169 pdev->stats.ppdu_wrap_drop); 8170 8171 for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) { 8172 if (pdev->stats.wdi_event[i]) 8173 DP_PRINT_STATS("Wdi msgs received for event ID[%d]:%d", 8174 i, pdev->stats.wdi_event[i]); 8175 } 8176 8177 dp_monitor_print_pdev_tx_capture_stats(pdev); 8178 } 8179 8180 #ifdef WLAN_SUPPORT_RX_FLOW_TAG 8181 static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev) 8182 { 8183 DP_PRINT_STATS("\tNo of IPv4 Flow entries inserted = %d", 8184 qdf_atomic_read(&pdev->soc->ipv4_fse_cnt)); 8185 DP_PRINT_STATS("\tNo of IPv6 Flow entries inserted = %d", 8186 qdf_atomic_read(&pdev->soc->ipv6_fse_cnt)); 8187 } 8188 #else 8189 static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev) 8190 { 8191 } 8192 #endif 8193 8194 void 8195 dp_print_pdev_rx_stats(struct dp_pdev *pdev) 8196 { 8197 uint8_t i; 8198 8199 DP_PRINT_STATS("PDEV Rx Stats:\n"); 8200 DP_PRINT_STATS("Received From HW (Per Rx Ring):"); 8201 DP_PRINT_STATS(" Packets = %llu %llu %llu %llu", 8202 pdev->stats.rx.rcvd_reo[0].num, 8203 pdev->stats.rx.rcvd_reo[1].num, 8204 pdev->stats.rx.rcvd_reo[2].num, 8205 pdev->stats.rx.rcvd_reo[3].num); 8206 DP_PRINT_STATS(" Bytes = %llu %llu %llu %llu", 8207 pdev->stats.rx.rcvd_reo[0].bytes, 8208 pdev->stats.rx.rcvd_reo[1].bytes, 8209 pdev->stats.rx.rcvd_reo[2].bytes, 8210 pdev->stats.rx.rcvd_reo[3].bytes); 8211 for (i = 0; i < CDP_MAX_LMACS; i++) 8212 DP_PRINT_STATS("Packets Received on lmac[%d] = %llu (%llu)", 8213 i, pdev->stats.rx.rx_lmac[i].num, 8214 pdev->stats.rx.rx_lmac[i].bytes); 8215 DP_PRINT_STATS("Replenished:"); 8216 DP_PRINT_STATS(" Packets = %llu", 8217 pdev->stats.replenish.pkts.num); 8218 DP_PRINT_STATS(" Buffers Added To Freelist = %u", 8219 pdev->stats.buf_freelist); 8220 DP_PRINT_STATS(" Low threshold intr = %d", 8221 pdev->stats.replenish.low_thresh_intrs); 8222 DP_PRINT_STATS("Dropped:"); 8223 DP_PRINT_STATS(" msdu_not_done = %u", 8224 pdev->stats.dropped.msdu_not_done); 8225 DP_PRINT_STATS(" wifi parse = %u", 8226 pdev->stats.dropped.wifi_parse); 8227 DP_PRINT_STATS(" mon_rx_drop = %u", 8228 pdev->stats.dropped.mon_rx_drop); 8229 DP_PRINT_STATS(" mon_radiotap_update_err = %u", 8230 pdev->stats.dropped.mon_radiotap_update_err); 8231 DP_PRINT_STATS(" mec_drop = %llu", 8232 pdev->stats.rx.mec_drop.num); 8233 DP_PRINT_STATS(" Bytes = %llu", 8234 pdev->stats.rx.mec_drop.bytes); 8235 DP_PRINT_STATS(" peer_unauth_drop = %u", 8236 pdev->stats.rx.peer_unauth_rx_pkt_drop); 8237 DP_PRINT_STATS(" policy_check_drop = %u", 8238 pdev->stats.rx.policy_check_drop); 8239 DP_PRINT_STATS("Sent To Stack:"); 8240 DP_PRINT_STATS(" Packets = %llu", 8241 pdev->stats.rx.to_stack.num); 8242 DP_PRINT_STATS(" Bytes = %llu", 8243 pdev->stats.rx.to_stack.bytes); 8244 DP_PRINT_STATS(" vlan_tag_stp_cnt = %u", 8245 pdev->stats.vlan_tag_stp_cnt); 8246 DP_PRINT_STATS("Multicast/Broadcast:"); 8247 DP_PRINT_STATS(" Packets = %llu", 8248 pdev->stats.rx.multicast.num); 8249 DP_PRINT_STATS(" Bytes = %llu", 8250 pdev->stats.rx.multicast.bytes); 8251 DP_PRINT_STATS("Errors:"); 8252 DP_PRINT_STATS(" Rxdma Ring Un-inititalized = %u", 8253 pdev->stats.replenish.rxdma_err); 8254 DP_PRINT_STATS(" Desc Alloc Failed: = %u", 8255 pdev->stats.err.desc_alloc_fail); 8256 DP_PRINT_STATS(" Low threshold Desc Alloc Failed: = %u", 8257 pdev->stats.err.desc_lt_alloc_fail); 8258 DP_PRINT_STATS(" IP checksum error = %u", 8259 pdev->stats.err.ip_csum_err); 8260 DP_PRINT_STATS(" TCP/UDP checksum error = %u", 8261 pdev->stats.err.tcp_udp_csum_err); 8262 DP_PRINT_STATS(" Failed frag alloc = %u", 8263 pdev->stats.replenish.frag_alloc_fail); 8264 8265 dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get, 8266 NULL, DP_MOD_ID_GENERIC_STATS); 8267 8268 /* Get bar_recv_cnt */ 8269 DP_PRINT_STATS("BAR Received Count: = %u", 8270 pdev->stats.rx.bar_recv_cnt); 8271 8272 DP_PRINT_STATS("RX Buffer Pool Stats:\n"); 8273 DP_PRINT_STATS("\tBuffers consumed during refill = %llu", 8274 pdev->stats.rx_buffer_pool.num_bufs_consumed); 8275 DP_PRINT_STATS("\tSuccessful allocations during refill = %llu", 8276 pdev->stats.rx_buffer_pool.num_bufs_alloc_success); 8277 DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu", 8278 pdev->stats.rx_buffer_pool.num_pool_bufs_replenish); 8279 8280 DP_PRINT_STATS("Invalid MSDU count = %u", 8281 pdev->stats.invalid_msdu_cnt); 8282 8283 dp_rx_basic_fst_stats(pdev); 8284 } 8285 8286 #ifdef WLAN_SUPPORT_PPEDS 8287 void dp_print_tx_ppeds_stats(struct dp_soc *soc) 8288 { 8289 if (soc->arch_ops.dp_tx_ppeds_inuse_desc) 8290 soc->arch_ops.dp_tx_ppeds_inuse_desc(soc); 8291 8292 DP_PRINT_STATS("PPE-DS Tx desc fw2wbm_tx_drop %u", 8293 soc->stats.tx.fw2wbm_tx_drop); 8294 8295 if (soc->arch_ops.dp_txrx_ppeds_rings_stats) 8296 soc->arch_ops.dp_txrx_ppeds_rings_stats(soc); 8297 } 8298 #else 8299 void dp_print_tx_ppeds_stats(struct dp_soc *soc) 8300 { 8301 } 8302 #endif 8303 8304 #ifdef QCA_SUPPORT_DP_GLOBAL_CTX 8305 void dp_print_global_desc_count(void) 8306 { 8307 struct dp_global_context *dp_global; 8308 8309 dp_global = wlan_objmgr_get_global_ctx(); 8310 8311 DP_PRINT_STATS("Global Tx Descriptors in use = %u", 8312 dp_tx_get_global_desc_in_use(dp_global)); 8313 } 8314 #endif 8315 8316 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING 8317 #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512 8318 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask) 8319 { 8320 char *buf; 8321 int ring, pos, buf_len; 8322 char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'}; 8323 8324 if (!srng_mask) 8325 return; 8326 8327 buf = srng_high_wm_str; 8328 buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN; 8329 8330 dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s", 8331 "ring_id", "high_wm", "time", "<50", "50-60", "60-70", 8332 "70-80", "80-90", "90-100"); 8333 8334 if (srng_mask & (1 << REO_DST)) { 8335 for (ring = 0; ring < soc->num_reo_dest_rings; ring++) { 8336 pos = 0; 8337 pos += hal_dump_srng_high_wm_stats(soc->hal_soc, 8338 soc->reo_dest_ring[ring].hal_srng, 8339 buf, buf_len, pos); 8340 dp_info("%s", srng_high_wm_str); 8341 } 8342 } 8343 } 8344 #endif 8345 8346 void 8347 dp_print_soc_rx_stats(struct dp_soc *soc) 8348 { 8349 uint32_t i; 8350 char reo_error[DP_REO_ERR_LENGTH]; 8351 char rxdma_error[DP_RXDMA_ERR_LENGTH]; 8352 uint8_t index = 0; 8353 8354 DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries); 8355 DP_PRINT_STATS("SOC Rx Stats:\n"); 8356 DP_PRINT_STATS("Fast recycled packets: %llu", 8357 soc->stats.rx.fast_recycled); 8358 DP_PRINT_STATS("Fragmented packets: %u", 8359 soc->stats.rx.rx_frags); 8360 DP_PRINT_STATS("Reo reinjected packets: %u", 8361 soc->stats.rx.reo_reinject); 8362 DP_PRINT_STATS("Errors:\n"); 8363 DP_PRINT_STATS("Rx Decrypt Errors = %d", 8364 (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] + 8365 soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC])); 8366 DP_PRINT_STATS("Invalid RBM = %d", 8367 soc->stats.rx.err.invalid_rbm); 8368 DP_PRINT_STATS("Invalid Vdev = %d", 8369 soc->stats.rx.err.invalid_vdev); 8370 DP_PRINT_STATS("Invalid sa_idx or da_idx = %d", 8371 soc->stats.rx.err.invalid_sa_da_idx); 8372 DP_PRINT_STATS("Defrag peer uninit = %d", 8373 soc->stats.rx.err.defrag_peer_uninit); 8374 DP_PRINT_STATS("Pkts delivered no peer = %d", 8375 soc->stats.rx.err.pkt_delivered_no_peer); 8376 DP_PRINT_STATS("Invalid Pdev = %d", 8377 soc->stats.rx.err.invalid_pdev); 8378 DP_PRINT_STATS("Invalid Peer = %llu", 8379 soc->stats.rx.err.rx_invalid_peer.num); 8380 DP_PRINT_STATS("HAL Ring Access Fail = %d", 8381 soc->stats.rx.err.hal_ring_access_fail); 8382 DP_PRINT_STATS("HAL Ring Access Full Fail = %d", 8383 soc->stats.rx.err.hal_ring_access_full_fail); 8384 DP_PRINT_STATS("MSDU Done failures = %d", 8385 soc->stats.rx.err.msdu_done_fail); 8386 DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags); 8387 DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait); 8388 DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err); 8389 DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor); 8390 8391 DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2); 8392 DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full); 8393 8394 DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d", 8395 soc->stats.rx.reap_loop_pkt_limit_hit); 8396 DP_PRINT_STATS("RX DESC invalid magic: %u", 8397 soc->stats.rx.err.rx_desc_invalid_magic); 8398 DP_PRINT_STATS("RX DUP DESC: %d", 8399 soc->stats.rx.err.hal_reo_dest_dup); 8400 DP_PRINT_STATS("RX REL DUP DESC: %d", 8401 soc->stats.rx.err.hal_wbm_rel_dup); 8402 8403 DP_PRINT_STATS("RXDMA ERR DUP DESC: %d", 8404 soc->stats.rx.err.hal_rxdma_err_dup); 8405 8406 DP_PRINT_STATS("RX scatter msdu: %d", 8407 soc->stats.rx.err.scatter_msdu); 8408 8409 DP_PRINT_STATS("RX invalid cookie: %d", 8410 soc->stats.rx.err.invalid_cookie); 8411 8412 DP_PRINT_STATS("RX stale cookie: %d", 8413 soc->stats.rx.err.stale_cookie); 8414 8415 DP_PRINT_STATS("RX wait completed msdu break: %d", 8416 soc->stats.rx.msdu_scatter_wait_break); 8417 8418 DP_PRINT_STATS("2k jump delba sent: %d", 8419 soc->stats.rx.err.rx_2k_jump_delba_sent); 8420 8421 DP_PRINT_STATS("2k jump msdu to stack: %d", 8422 soc->stats.rx.err.rx_2k_jump_to_stack); 8423 8424 DP_PRINT_STATS("2k jump msdu drop: %d", 8425 soc->stats.rx.err.rx_2k_jump_drop); 8426 8427 DP_PRINT_STATS("REO err oor msdu to stack %d", 8428 soc->stats.rx.err.reo_err_oor_to_stack); 8429 8430 DP_PRINT_STATS("REO err oor msdu drop: %d", 8431 soc->stats.rx.err.reo_err_oor_drop); 8432 8433 DP_PRINT_STATS("Rx err msdu rejected: %d", 8434 soc->stats.rx.err.rejected); 8435 8436 DP_PRINT_STATS("Rx stale link desc cookie: %d", 8437 soc->stats.rx.err.invalid_link_cookie); 8438 8439 DP_PRINT_STATS("Rx nbuf sanity fail: %d", 8440 soc->stats.rx.err.nbuf_sanity_fail); 8441 8442 DP_PRINT_STATS("Rx err msdu continuation err: %d", 8443 soc->stats.rx.err.msdu_continuation_err); 8444 8445 DP_PRINT_STATS("ssn update count: %d", 8446 soc->stats.rx.err.ssn_update_count); 8447 8448 DP_PRINT_STATS("bar handle update fail count: %d", 8449 soc->stats.rx.err.bar_handle_fail_count); 8450 8451 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 8452 soc->stats.rx.err.pn_in_dest_check_fail); 8453 8454 for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) { 8455 index += qdf_snprint(&rxdma_error[index], 8456 DP_RXDMA_ERR_LENGTH - index, 8457 " %d", soc->stats.rx.err.rxdma_error[i]); 8458 } 8459 DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error); 8460 8461 index = 0; 8462 for (i = 0; i < HAL_REO_ERR_MAX; i++) { 8463 index += qdf_snprint(&reo_error[index], 8464 DP_REO_ERR_LENGTH - index, 8465 " %d", soc->stats.rx.err.reo_error[i]); 8466 } 8467 DP_PRINT_STATS("REO Error(0-14):%s", reo_error); 8468 DP_PRINT_STATS("REO CMD SEND FAIL: %d", 8469 soc->stats.rx.err.reo_cmd_send_fail); 8470 8471 DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame); 8472 DP_PRINT_STATS("Rxdma2rel route drop:%d", 8473 soc->stats.rx.rxdma2rel_route_drop); 8474 DP_PRINT_STATS("Reo2rel route drop:%d", 8475 soc->stats.rx.reo2rel_route_drop); 8476 DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count); 8477 DP_PRINT_STATS("RX HW stats request count:%d", 8478 soc->stats.rx.rx_hw_stats_requested); 8479 DP_PRINT_STATS("RX HW stats request timeout:%d", 8480 soc->stats.rx.rx_hw_stats_timeout); 8481 DP_PRINT_STATS("Rx invalid TID count:%d", 8482 soc->stats.rx.err.rx_invalid_tid_err); 8483 DP_PRINT_STATS("Rx Defrag Address1 Invalid:%d", 8484 soc->stats.rx.err.defrag_ad1_invalid); 8485 DP_PRINT_STATS("Rx decrypt error frame for valid peer:%d", 8486 soc->stats.rx.err.decrypt_err_drop); 8487 } 8488 8489 #ifdef FEATURE_TSO_STATS 8490 void dp_print_tso_stats(struct dp_soc *soc, 8491 enum qdf_stats_verbosity_level level) 8492 { 8493 uint8_t loop_pdev; 8494 uint32_t id; 8495 struct dp_pdev *pdev; 8496 8497 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 8498 pdev = soc->pdev_list[loop_pdev]; 8499 DP_PRINT_STATS("TSO Statistics\n"); 8500 DP_PRINT_STATS( 8501 "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d", 8502 pdev->stats.tx_i.rcvd.num, 8503 pdev->stats.tx.tx_success.num, 8504 pdev->stats.tso_stats.num_tso_pkts.num, 8505 pdev->stats.tso_stats.tso_comp); 8506 8507 for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) { 8508 /* TSO LEVEL 1 - PACKET INFO */ 8509 DP_PRINT_STATS( 8510 "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u", 8511 id, 8512 pdev->stats.tso_stats.tso_info 8513 .tso_packet_info[id].tso_packet_len, 8514 pdev->stats.tso_stats.tso_info 8515 .tso_packet_info[id].num_seg); 8516 /* TSO LEVEL 2 */ 8517 if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH) 8518 dp_print_tso_seg_stats(pdev, id); 8519 } 8520 8521 DP_PRINT_STATS( 8522 "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu", 8523 pdev->stats.tso_stats.seg_histogram.segs_1, 8524 pdev->stats.tso_stats.seg_histogram.segs_2_5, 8525 pdev->stats.tso_stats.seg_histogram.segs_6_10, 8526 pdev->stats.tso_stats.seg_histogram.segs_11_15, 8527 pdev->stats.tso_stats.seg_histogram.segs_16_20, 8528 pdev->stats.tso_stats.seg_histogram.segs_20_plus); 8529 } 8530 } 8531 8532 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev, 8533 uint8_t _p_cntrs) 8534 { 8535 if (_p_cntrs == 1) { 8536 DP_STATS_INC(pdev, 8537 tso_stats.seg_histogram.segs_1, 1); 8538 } else if (_p_cntrs >= 2 && _p_cntrs <= 5) { 8539 DP_STATS_INC(pdev, 8540 tso_stats.seg_histogram.segs_2_5, 1); 8541 } else if (_p_cntrs > 5 && _p_cntrs <= 10) { 8542 DP_STATS_INC(pdev, 8543 tso_stats.seg_histogram.segs_6_10, 1); 8544 } else if (_p_cntrs > 10 && _p_cntrs <= 15) { 8545 DP_STATS_INC(pdev, 8546 tso_stats.seg_histogram.segs_11_15, 1); 8547 } else if (_p_cntrs > 15 && _p_cntrs <= 20) { 8548 DP_STATS_INC(pdev, 8549 tso_stats.seg_histogram.segs_16_20, 1); 8550 } else if (_p_cntrs > 20) { 8551 DP_STATS_INC(pdev, 8552 tso_stats.seg_histogram.segs_20_plus, 1); 8553 } 8554 } 8555 8556 void dp_tso_segment_update(struct dp_pdev *pdev, 8557 uint32_t stats_idx, 8558 uint8_t idx, 8559 struct qdf_tso_seg_t seg) 8560 { 8561 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8562 .tso_seg[idx].num_frags, 8563 seg.num_frags); 8564 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8565 .tso_seg[idx].total_len, 8566 seg.total_len); 8567 8568 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8569 .tso_seg[idx].tso_flags.tso_enable, 8570 seg.tso_flags.tso_enable); 8571 8572 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8573 .tso_seg[idx].tso_flags.fin, 8574 seg.tso_flags.fin); 8575 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8576 .tso_seg[idx].tso_flags.syn, 8577 seg.tso_flags.syn); 8578 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8579 .tso_seg[idx].tso_flags.rst, 8580 seg.tso_flags.rst); 8581 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8582 .tso_seg[idx].tso_flags.psh, 8583 seg.tso_flags.psh); 8584 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8585 .tso_seg[idx].tso_flags.ack, 8586 seg.tso_flags.ack); 8587 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8588 .tso_seg[idx].tso_flags.urg, 8589 seg.tso_flags.urg); 8590 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8591 .tso_seg[idx].tso_flags.ece, 8592 seg.tso_flags.ece); 8593 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8594 .tso_seg[idx].tso_flags.cwr, 8595 seg.tso_flags.cwr); 8596 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8597 .tso_seg[idx].tso_flags.ns, 8598 seg.tso_flags.ns); 8599 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8600 .tso_seg[idx].tso_flags.tcp_seq_num, 8601 seg.tso_flags.tcp_seq_num); 8602 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 8603 .tso_seg[idx].tso_flags.ip_id, 8604 seg.tso_flags.ip_id); 8605 } 8606 8607 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx, 8608 qdf_nbuf_t msdu, uint16_t num_segs) 8609 { 8610 DP_STATS_UPD(pdev, 8611 tso_stats.tso_info.tso_packet_info[stats_idx] 8612 .num_seg, 8613 num_segs); 8614 8615 DP_STATS_UPD(pdev, 8616 tso_stats.tso_info.tso_packet_info[stats_idx] 8617 .tso_packet_len, 8618 qdf_nbuf_get_tcp_payload_len(msdu)); 8619 } 8620 8621 void dp_tso_segment_stats_update(struct dp_pdev *pdev, 8622 struct qdf_tso_seg_elem_t *stats_seg, 8623 uint32_t stats_idx) 8624 { 8625 uint8_t tso_seg_idx = 0; 8626 8627 while (stats_seg && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) { 8628 dp_tso_segment_update(pdev, stats_idx, 8629 tso_seg_idx, 8630 stats_seg->seg); 8631 ++tso_seg_idx; 8632 stats_seg = stats_seg->next; 8633 } 8634 } 8635 8636 void dp_txrx_clear_tso_stats(struct dp_soc *soc) 8637 { 8638 uint8_t loop_pdev; 8639 struct dp_pdev *pdev; 8640 8641 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 8642 pdev = soc->pdev_list[loop_pdev]; 8643 dp_init_tso_stats(pdev); 8644 } 8645 } 8646 #endif /* FEATURE_TSO_STATS */ 8647 8648 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer, 8649 enum cdp_peer_stats_type type, 8650 cdp_peer_stats_param_t *buf) 8651 { 8652 QDF_STATUS ret = QDF_STATUS_SUCCESS; 8653 struct dp_peer *tgt_peer; 8654 struct dp_txrx_peer *txrx_peer; 8655 struct dp_peer_per_pkt_stats *peer_stats; 8656 uint8_t link_id = 0; 8657 uint8_t idx = 0; 8658 uint8_t stats_arr_size; 8659 struct cdp_pkt_info pkt_info = {0}; 8660 struct dp_soc *soc = peer->vdev->pdev->soc; 8661 struct dp_pdev *pdev = peer->vdev->pdev; 8662 8663 txrx_peer = dp_get_txrx_peer(peer); 8664 if (!txrx_peer) 8665 return QDF_STATUS_E_FAILURE; 8666 8667 stats_arr_size = txrx_peer->stats_arr_size; 8668 8669 if (IS_MLO_DP_LINK_PEER(peer)) 8670 link_id = dp_get_peer_hw_link_id(soc, pdev); 8671 8672 switch (type) { 8673 case cdp_peer_tx_ucast: 8674 if (link_id > 0) { 8675 peer_stats = &txrx_peer->stats[link_id].per_pkt_stats; 8676 buf->tx_ucast = peer_stats->tx.ucast; 8677 } else { 8678 for (idx = 0; idx < stats_arr_size; idx++) { 8679 peer_stats = 8680 &txrx_peer->stats[idx].per_pkt_stats; 8681 pkt_info.num += peer_stats->tx.ucast.num; 8682 pkt_info.bytes += peer_stats->tx.ucast.bytes; 8683 } 8684 8685 buf->tx_ucast = pkt_info; 8686 } 8687 8688 break; 8689 case cdp_peer_tx_mcast: 8690 if (link_id > 0) { 8691 peer_stats = &txrx_peer->stats[link_id].per_pkt_stats; 8692 buf->tx_mcast = peer_stats->tx.mcast; 8693 } else { 8694 for (idx = 0; idx < stats_arr_size; idx++) { 8695 peer_stats = 8696 &txrx_peer->stats[idx].per_pkt_stats; 8697 pkt_info.num += peer_stats->tx.mcast.num; 8698 pkt_info.bytes += peer_stats->tx.mcast.bytes; 8699 } 8700 8701 buf->tx_mcast = pkt_info; 8702 } 8703 8704 break; 8705 case cdp_peer_tx_inactive_time: 8706 tgt_peer = dp_get_tgt_peer_from_peer(peer); 8707 if (tgt_peer) 8708 buf->tx_inactive_time = 8709 tgt_peer->stats.tx.inactive_time; 8710 else 8711 ret = QDF_STATUS_E_FAILURE; 8712 break; 8713 case cdp_peer_rx_ucast: 8714 if (link_id > 0) { 8715 peer_stats = &txrx_peer->stats[link_id].per_pkt_stats; 8716 buf->rx_ucast = peer_stats->rx.unicast; 8717 } else { 8718 for (idx = 0; idx < stats_arr_size; idx++) { 8719 peer_stats = 8720 &txrx_peer->stats[idx].per_pkt_stats; 8721 pkt_info.num += peer_stats->rx.unicast.num; 8722 pkt_info.bytes += peer_stats->rx.unicast.bytes; 8723 } 8724 8725 buf->rx_ucast = pkt_info; 8726 } 8727 8728 break; 8729 default: 8730 ret = QDF_STATUS_E_FAILURE; 8731 break; 8732 } 8733 8734 return ret; 8735 } 8736 8737 #ifdef QCA_ENHANCED_STATS_SUPPORT 8738 #ifdef WLAN_FEATURE_11BE_MLO 8739 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8740 enum cdp_peer_stats_type type, 8741 cdp_peer_stats_param_t *buf) 8742 { 8743 QDF_STATUS ret = QDF_STATUS_E_FAILURE; 8744 struct dp_soc *soc = peer->vdev->pdev->soc; 8745 8746 if (IS_MLO_DP_MLD_PEER(peer)) { 8747 struct dp_peer *link_peer; 8748 struct dp_soc *link_peer_soc; 8749 8750 link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id, 8751 DP_MOD_ID_CDP); 8752 8753 if (link_peer) { 8754 link_peer_soc = link_peer->vdev->pdev->soc; 8755 ret = dp_monitor_peer_get_stats_param(link_peer_soc, 8756 link_peer, 8757 type, buf); 8758 dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP); 8759 } 8760 return ret; 8761 } else { 8762 return dp_monitor_peer_get_stats_param(soc, peer, type, buf); 8763 } 8764 } 8765 #else 8766 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8767 enum cdp_peer_stats_type type, 8768 cdp_peer_stats_param_t *buf) 8769 { 8770 struct dp_soc *soc = peer->vdev->pdev->soc; 8771 8772 return dp_monitor_peer_get_stats_param(soc, peer, type, buf); 8773 } 8774 #endif 8775 #else 8776 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8777 enum cdp_peer_stats_type type, 8778 cdp_peer_stats_param_t *buf) 8779 { 8780 QDF_STATUS ret = QDF_STATUS_SUCCESS; 8781 struct dp_txrx_peer *txrx_peer; 8782 struct dp_peer_extd_stats *peer_stats; 8783 8784 txrx_peer = dp_get_txrx_peer(peer); 8785 if (!txrx_peer) 8786 return QDF_STATUS_E_FAILURE; 8787 8788 peer_stats = &txrx_peer->stats[0].extd_stats; 8789 8790 switch (type) { 8791 case cdp_peer_tx_rate: 8792 buf->tx_rate = peer_stats->tx.tx_rate; 8793 break; 8794 case cdp_peer_tx_last_tx_rate: 8795 buf->last_tx_rate = peer_stats->tx.last_tx_rate; 8796 break; 8797 case cdp_peer_tx_ratecode: 8798 buf->tx_ratecode = peer_stats->tx.tx_ratecode; 8799 break; 8800 case cdp_peer_rx_rate: 8801 buf->rx_rate = peer_stats->rx.rx_rate; 8802 break; 8803 case cdp_peer_rx_last_rx_rate: 8804 buf->last_rx_rate = peer_stats->rx.last_rx_rate; 8805 break; 8806 case cdp_peer_rx_ratecode: 8807 buf->rx_ratecode = peer_stats->rx.rx_ratecode; 8808 break; 8809 case cdp_peer_rx_avg_snr: 8810 buf->rx_avg_snr = peer_stats->rx.avg_snr; 8811 break; 8812 case cdp_peer_rx_snr: 8813 buf->rx_snr = peer_stats->rx.snr; 8814 break; 8815 default: 8816 ret = QDF_STATUS_E_FAILURE; 8817 break; 8818 } 8819 8820 return ret; 8821 } 8822 #endif 8823 8824 /** 8825 * dp_is_wds_extended() - Check if wds ext is enabled 8826 * @txrx_peer: DP txrx_peer handle 8827 * 8828 * Return: true if enabled, false if not 8829 */ 8830 #ifdef QCA_SUPPORT_WDS_EXTENDED 8831 static inline 8832 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer) 8833 { 8834 if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT, 8835 &txrx_peer->wds_ext.init)) 8836 return true; 8837 8838 return false; 8839 } 8840 #else 8841 static inline 8842 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer) 8843 { 8844 return false; 8845 } 8846 #endif /* QCA_SUPPORT_WDS_EXTENDED */ 8847 8848 /** 8849 * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en 8850 * @txrx_peer: DP txrx_peer handle 8851 * 8852 * Return: true if enabled, false if not 8853 */ 8854 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT 8855 static inline 8856 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer) 8857 { 8858 return txrx_peer->hw_txrx_stats_en; 8859 } 8860 #else 8861 static inline 8862 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer) 8863 { 8864 return false; 8865 } 8866 #endif 8867 8868 #ifdef WLAN_FEATURE_11BE_MLO 8869 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer) 8870 { 8871 /* ML primary link peer return mld_peer */ 8872 if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link) 8873 return peer->mld_peer; 8874 8875 return peer; 8876 } 8877 #else 8878 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer) 8879 { 8880 return peer; 8881 } 8882 #endif 8883 8884 /** 8885 * dp_update_vdev_basic_stats() - Update vdev basic stats 8886 * @txrx_peer: DP txrx_peer handle 8887 * @tgtobj: Pointer to buffer for vdev stats 8888 * 8889 * Return: None 8890 */ 8891 static inline 8892 void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer, 8893 struct cdp_vdev_stats *tgtobj) 8894 { 8895 if (qdf_unlikely(!txrx_peer || !tgtobj)) 8896 return; 8897 8898 if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) { 8899 tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num; 8900 tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes; 8901 tgtobj->tx.tx_failed += txrx_peer->tx_failed; 8902 } 8903 tgtobj->rx.to_stack.num += txrx_peer->to_stack.num; 8904 tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes; 8905 } 8906 8907 #ifdef QCA_ENHANCED_STATS_SUPPORT 8908 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj, 8909 void *arg) 8910 { 8911 struct dp_txrx_peer *txrx_peer; 8912 struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg; 8913 struct dp_peer_per_pkt_stats *per_pkt_stats; 8914 uint8_t link_id = 0; 8915 struct dp_pdev *pdev = srcobj->vdev->pdev; 8916 8917 txrx_peer = dp_get_txrx_peer(srcobj); 8918 if (qdf_unlikely(!txrx_peer)) 8919 goto link_stats; 8920 8921 if (dp_peer_is_primary_link_peer(srcobj)) { 8922 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8923 per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats; 8924 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8925 } 8926 8927 if (IS_MLO_DP_LINK_PEER(srcobj)) { 8928 link_id = dp_get_peer_hw_link_id(soc, pdev); 8929 if (link_id > 0) { 8930 per_pkt_stats = &txrx_peer-> 8931 stats[link_id].per_pkt_stats; 8932 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8933 } 8934 } 8935 8936 link_stats: 8937 dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS); 8938 } 8939 8940 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 8941 struct dp_peer *peer) 8942 { 8943 struct dp_soc *soc = vdev->pdev->soc; 8944 struct dp_txrx_peer *txrx_peer; 8945 struct dp_peer_per_pkt_stats *per_pkt_stats; 8946 struct cdp_vdev_stats *vdev_stats = &vdev->stats; 8947 uint8_t link_id = 0; 8948 struct dp_pdev *pdev = vdev->pdev; 8949 8950 if (soc->arch_ops.dp_get_vdev_stats_for_unmap_peer) 8951 soc->arch_ops.dp_get_vdev_stats_for_unmap_peer(vdev, 8952 peer, 8953 &vdev_stats); 8954 8955 txrx_peer = dp_get_txrx_peer(peer); 8956 if (!txrx_peer) 8957 goto link_stats; 8958 8959 dp_peer_aggregate_tid_stats(peer); 8960 8961 if (!IS_MLO_DP_LINK_PEER(peer)) { 8962 per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats; 8963 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8964 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8965 } 8966 8967 if (IS_MLO_DP_LINK_PEER(peer)) { 8968 link_id = dp_get_peer_hw_link_id(soc, pdev); 8969 if (link_id > 0) { 8970 per_pkt_stats = 8971 &txrx_peer->stats[link_id].per_pkt_stats; 8972 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8973 } 8974 } 8975 8976 link_stats: 8977 dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS); 8978 } 8979 #else 8980 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj, 8981 void *arg) 8982 { 8983 struct dp_txrx_peer *txrx_peer; 8984 struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg; 8985 struct dp_peer_per_pkt_stats *per_pkt_stats; 8986 struct dp_peer_extd_stats *extd_stats; 8987 uint8_t inx = 0; 8988 uint8_t stats_arr_size = 0; 8989 8990 txrx_peer = dp_get_txrx_peer(srcobj); 8991 if (qdf_unlikely(!txrx_peer)) 8992 return; 8993 8994 if (qdf_unlikely(dp_is_wds_extended(txrx_peer))) 8995 return; 8996 8997 if (!dp_peer_is_primary_link_peer(srcobj)) 8998 return; 8999 9000 stats_arr_size = txrx_peer->stats_arr_size; 9001 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 9002 9003 for (inx = 0; inx < stats_arr_size; inx++) { 9004 per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats; 9005 extd_stats = &txrx_peer->stats[inx].extd_stats; 9006 DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats); 9007 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 9008 } 9009 } 9010 9011 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 9012 struct dp_peer *peer) 9013 { 9014 struct dp_txrx_peer *txrx_peer; 9015 struct dp_peer_per_pkt_stats *per_pkt_stats; 9016 struct dp_peer_extd_stats *extd_stats; 9017 struct cdp_vdev_stats *vdev_stats = &vdev->stats; 9018 uint8_t inx = 0; 9019 uint8_t stats_arr_size = 0; 9020 9021 txrx_peer = dp_get_txrx_peer(peer); 9022 if (!txrx_peer) 9023 return; 9024 9025 stats_arr_size = txrx_peer->stats_arr_size; 9026 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 9027 9028 for (inx = 0; inx < stats_arr_size; inx++) { 9029 per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats; 9030 extd_stats = &txrx_peer->stats[inx].extd_stats; 9031 DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats); 9032 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 9033 } 9034 } 9035 #endif 9036 9037 void dp_update_pdev_stats(struct dp_pdev *tgtobj, 9038 struct cdp_vdev_stats *srcobj) 9039 { 9040 uint8_t i; 9041 uint8_t pream_type; 9042 uint8_t mu_type; 9043 struct cdp_pdev_stats *pdev_stats = NULL; 9044 9045 pdev_stats = &tgtobj->stats; 9046 for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { 9047 for (i = 0; i < MAX_MCS; i++) { 9048 tgtobj->stats.tx.pkt_type[pream_type]. 9049 mcs_count[i] += 9050 srcobj->tx.pkt_type[pream_type]. 9051 mcs_count[i]; 9052 tgtobj->stats.rx.pkt_type[pream_type]. 9053 mcs_count[i] += 9054 srcobj->rx.pkt_type[pream_type]. 9055 mcs_count[i]; 9056 } 9057 } 9058 9059 for (i = 0; i < MAX_BW; i++) { 9060 tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i]; 9061 tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i]; 9062 } 9063 9064 for (i = 0; i < SS_COUNT; i++) { 9065 tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i]; 9066 tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i]; 9067 tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i]; 9068 } 9069 9070 for (i = 0; i < WME_AC_MAX; i++) { 9071 tgtobj->stats.tx.wme_ac_type[i] += 9072 srcobj->tx.wme_ac_type[i]; 9073 tgtobj->stats.tx.wme_ac_type_bytes[i] += 9074 srcobj->tx.wme_ac_type_bytes[i]; 9075 tgtobj->stats.rx.wme_ac_type[i] += 9076 srcobj->rx.wme_ac_type[i]; 9077 tgtobj->stats.rx.wme_ac_type_bytes[i] += 9078 srcobj->rx.wme_ac_type_bytes[i]; 9079 tgtobj->stats.tx.excess_retries_per_ac[i] += 9080 srcobj->tx.excess_retries_per_ac[i]; 9081 } 9082 9083 for (i = 0; i < MAX_GI; i++) { 9084 tgtobj->stats.tx.sgi_count[i] += 9085 srcobj->tx.sgi_count[i]; 9086 tgtobj->stats.rx.sgi_count[i] += 9087 srcobj->rx.sgi_count[i]; 9088 } 9089 9090 for (i = 0; i < MAX_RECEPTION_TYPES; i++) { 9091 tgtobj->stats.rx.reception_type[i] += 9092 srcobj->rx.reception_type[i]; 9093 tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i]; 9094 } 9095 9096 for (i = 0; i < MAX_TRANSMIT_TYPES; i++) { 9097 tgtobj->stats.tx.transmit_type[i].num_msdu += 9098 srcobj->tx.transmit_type[i].num_msdu; 9099 tgtobj->stats.tx.transmit_type[i].num_mpdu += 9100 srcobj->tx.transmit_type[i].num_mpdu; 9101 tgtobj->stats.tx.transmit_type[i].mpdu_tried += 9102 srcobj->tx.transmit_type[i].mpdu_tried; 9103 } 9104 9105 for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++) 9106 tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i]; 9107 9108 for (i = 0; i < MAX_MU_GROUP_ID; i++) 9109 tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i]; 9110 9111 for (i = 0; i < MAX_RU_LOCATIONS; i++) { 9112 tgtobj->stats.tx.ru_loc[i].num_msdu += 9113 srcobj->tx.ru_loc[i].num_msdu; 9114 tgtobj->stats.tx.ru_loc[i].num_mpdu += 9115 srcobj->tx.ru_loc[i].num_mpdu; 9116 tgtobj->stats.tx.ru_loc[i].mpdu_tried += 9117 srcobj->tx.ru_loc[i].mpdu_tried; 9118 } 9119 9120 tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus; 9121 tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success; 9122 tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried; 9123 tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu; 9124 tgtobj->stats.tx.mpdu_success_with_retries += 9125 srcobj->tx.mpdu_success_with_retries; 9126 tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts; 9127 tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate; 9128 tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate; 9129 tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs; 9130 tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate; 9131 tgtobj->stats.tx.mcast_last_tx_rate_mcs = 9132 srcobj->tx.mcast_last_tx_rate_mcs; 9133 tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate; 9134 tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate; 9135 tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode; 9136 tgtobj->stats.tx.ru_start = srcobj->tx.ru_start; 9137 tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones; 9138 tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi; 9139 tgtobj->stats.tx.nss_info = srcobj->tx.nss_info; 9140 tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info; 9141 tgtobj->stats.tx.bw_info = srcobj->tx.bw_info; 9142 tgtobj->stats.tx.gi_info = srcobj->tx.gi_info; 9143 tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info; 9144 tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes; 9145 tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num; 9146 tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num; 9147 tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes; 9148 tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num; 9149 tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes; 9150 tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num; 9151 tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes; 9152 tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num; 9153 tgtobj->stats.tx.tx_success.bytes += 9154 srcobj->tx.tx_success.bytes; 9155 tgtobj->stats.tx.nawds_mcast.num += 9156 srcobj->tx.nawds_mcast.num; 9157 tgtobj->stats.tx.nawds_mcast.bytes += 9158 srcobj->tx.nawds_mcast.bytes; 9159 tgtobj->stats.tx.nawds_mcast_drop += 9160 srcobj->tx.nawds_mcast_drop; 9161 tgtobj->stats.tx.num_ppdu_cookie_valid += 9162 srcobj->tx.num_ppdu_cookie_valid; 9163 tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed; 9164 tgtobj->stats.tx.ofdma += srcobj->tx.ofdma; 9165 tgtobj->stats.tx.stbc += srcobj->tx.stbc; 9166 tgtobj->stats.tx.ldpc += srcobj->tx.ldpc; 9167 tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt; 9168 tgtobj->stats.tx.retries += srcobj->tx.retries; 9169 tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt; 9170 tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt; 9171 tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt; 9172 tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt; 9173 tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num; 9174 tgtobj->stats.tx.dropped.fw_rem.bytes += 9175 srcobj->tx.dropped.fw_rem.bytes; 9176 tgtobj->stats.tx.dropped.fw_rem_tx += 9177 srcobj->tx.dropped.fw_rem_tx; 9178 tgtobj->stats.tx.dropped.fw_rem_notx += 9179 srcobj->tx.dropped.fw_rem_notx; 9180 tgtobj->stats.tx.dropped.fw_reason1 += 9181 srcobj->tx.dropped.fw_reason1; 9182 tgtobj->stats.tx.dropped.fw_reason2 += 9183 srcobj->tx.dropped.fw_reason2; 9184 tgtobj->stats.tx.dropped.fw_reason3 += 9185 srcobj->tx.dropped.fw_reason3; 9186 tgtobj->stats.tx.dropped.fw_rem_queue_disable += 9187 srcobj->tx.dropped.fw_rem_queue_disable; 9188 tgtobj->stats.tx.dropped.fw_rem_no_match += 9189 srcobj->tx.dropped.fw_rem_no_match; 9190 tgtobj->stats.tx.dropped.drop_threshold += 9191 srcobj->tx.dropped.drop_threshold; 9192 tgtobj->stats.tx.dropped.drop_link_desc_na += 9193 srcobj->tx.dropped.drop_link_desc_na; 9194 tgtobj->stats.tx.dropped.invalid_drop += 9195 srcobj->tx.dropped.invalid_drop; 9196 tgtobj->stats.tx.dropped.mcast_vdev_drop += 9197 srcobj->tx.dropped.mcast_vdev_drop; 9198 tgtobj->stats.tx.dropped.invalid_rr += 9199 srcobj->tx.dropped.invalid_rr; 9200 tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out; 9201 tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err; 9202 tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err; 9203 tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr; 9204 tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err; 9205 tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err; 9206 tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err; 9207 tgtobj->stats.rx.err.rxdma_wifi_parse_err += 9208 srcobj->rx.err.rxdma_wifi_parse_err; 9209 if (srcobj->rx.snr != 0) 9210 tgtobj->stats.rx.snr = srcobj->rx.snr; 9211 tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate; 9212 tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate; 9213 tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate; 9214 tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate; 9215 tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode; 9216 tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr; 9217 tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time; 9218 tgtobj->stats.rx.last_snr = srcobj->rx.last_snr; 9219 tgtobj->stats.rx.nss_info = srcobj->rx.nss_info; 9220 tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info; 9221 tgtobj->stats.rx.bw_info = srcobj->rx.bw_info; 9222 tgtobj->stats.rx.gi_info = srcobj->rx.gi_info; 9223 tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info; 9224 tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt; 9225 tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt; 9226 tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt; 9227 tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt; 9228 tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop; 9229 tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop; 9230 tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num; 9231 tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes; 9232 9233 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 9234 tgtobj->stats.rx.rcvd_reo[i].num += 9235 srcobj->rx.rcvd_reo[i].num; 9236 tgtobj->stats.rx.rcvd_reo[i].bytes += 9237 srcobj->rx.rcvd_reo[i].bytes; 9238 } 9239 9240 for (i = 0; i < CDP_MAX_LMACS; i++) { 9241 tgtobj->stats.rx.rx_lmac[i].num += 9242 srcobj->rx.rx_lmac[i].num; 9243 tgtobj->stats.rx.rx_lmac[i].bytes += 9244 srcobj->rx.rx_lmac[i].bytes; 9245 } 9246 9247 if (srcobj->rx.to_stack.num >= (srcobj->rx.multicast.num)) 9248 srcobj->rx.unicast.num = 9249 srcobj->rx.to_stack.num - 9250 (srcobj->rx.multicast.num); 9251 if (srcobj->rx.to_stack.bytes >= srcobj->rx.multicast.bytes) 9252 srcobj->rx.unicast.bytes = 9253 srcobj->rx.to_stack.bytes - 9254 (srcobj->rx.multicast.bytes); 9255 9256 tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num; 9257 tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes; 9258 tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num; 9259 tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes; 9260 tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num; 9261 tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes; 9262 tgtobj->stats.rx.raw.num += srcobj->rx.raw.num; 9263 tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes; 9264 tgtobj->stats.rx.intra_bss.pkts.num += 9265 srcobj->rx.intra_bss.pkts.num; 9266 tgtobj->stats.rx.intra_bss.pkts.bytes += 9267 srcobj->rx.intra_bss.pkts.bytes; 9268 tgtobj->stats.rx.intra_bss.fail.num += 9269 srcobj->rx.intra_bss.fail.num; 9270 tgtobj->stats.rx.intra_bss.fail.bytes += 9271 srcobj->rx.intra_bss.fail.bytes; 9272 9273 tgtobj->stats.tx.last_ack_rssi = 9274 srcobj->tx.last_ack_rssi; 9275 tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num; 9276 tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes; 9277 tgtobj->stats.rx.ppeds_drop.num += srcobj->rx.ppeds_drop.num; 9278 tgtobj->stats.rx.ppeds_drop.bytes += srcobj->rx.ppeds_drop.bytes; 9279 tgtobj->stats.rx.multipass_rx_pkt_drop += 9280 srcobj->rx.multipass_rx_pkt_drop; 9281 tgtobj->stats.rx.peer_unauth_rx_pkt_drop += 9282 srcobj->rx.peer_unauth_rx_pkt_drop; 9283 tgtobj->stats.rx.policy_check_drop += 9284 srcobj->rx.policy_check_drop; 9285 9286 for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { 9287 tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok += 9288 srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok; 9289 tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err += 9290 srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err; 9291 for (i = 0; i < SS_COUNT; i++) 9292 tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] += 9293 srcobj->rx.rx_mu[mu_type].ppdu_nss[i]; 9294 for (i = 0; i < MAX_MCS; i++) 9295 tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] += 9296 srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i]; 9297 } 9298 9299 for (i = 0; i < MAX_MCS; i++) { 9300 tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] += 9301 srcobj->rx.su_ax_ppdu_cnt.mcs_count[i]; 9302 tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i]; 9303 } 9304 9305 tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok; 9306 tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err; 9307 tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus; 9308 tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus; 9309 tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt; 9310 tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries; 9311 9312 DP_UPDATE_11BE_STATS(pdev_stats, srcobj); 9313 } 9314 9315 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj) 9316 { 9317 tgtobj->stats.tx_i.dropped.dropped_pkt.num = 9318 tgtobj->stats.tx_i.dropped.dma_error + 9319 tgtobj->stats.tx_i.dropped.ring_full + 9320 tgtobj->stats.tx_i.dropped.enqueue_fail + 9321 tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check + 9322 tgtobj->stats.tx_i.dropped.desc_na.num + 9323 tgtobj->stats.tx_i.dropped.res_full + 9324 tgtobj->stats.tx_i.dropped.drop_ingress + 9325 tgtobj->stats.tx_i.dropped.headroom_insufficient + 9326 tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path + 9327 tgtobj->stats.tx_i.dropped.tx_mcast_drop + 9328 tgtobj->stats.tx_i.dropped.fw2wbm_tx_drop; 9329 } 9330 9331 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj, 9332 struct cdp_vdev_stats *srcobj) 9333 { 9334 tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate; 9335 tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs; 9336 tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate; 9337 tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs; 9338 tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate; 9339 } 9340 9341 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, 9342 struct dp_vdev *srcobj) 9343 { 9344 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast); 9345 9346 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd); 9347 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_in_fast_xmit_flow); 9348 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[0]); 9349 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[1]); 9350 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[2]); 9351 DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[3]); 9352 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed); 9353 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts); 9354 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts); 9355 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt); 9356 DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error); 9357 DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err); 9358 DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num); 9359 DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target); 9360 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt); 9361 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt); 9362 DP_STATS_AGGR(tgtobj, srcobj, 9363 tx_i.mcast_en.dropped_map_error); 9364 DP_STATS_AGGR(tgtobj, srcobj, 9365 tx_i.mcast_en.dropped_self_mac); 9366 DP_STATS_AGGR(tgtobj, srcobj, 9367 tx_i.mcast_en.dropped_send_fail); 9368 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast); 9369 DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd); 9370 DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted); 9371 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error); 9372 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full); 9373 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail); 9374 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check); 9375 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num); 9376 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full); 9377 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress); 9378 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient); 9379 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path); 9380 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.tx_mcast_drop); 9381 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fw2wbm_tx_drop); 9382 DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified); 9383 DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw); 9384 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd); 9385 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw); 9386 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw); 9387 9388 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt); 9389 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt); 9390 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt); 9391 9392 tgtobj->stats.tx_i.dropped.dropped_pkt.num = 9393 tgtobj->stats.tx_i.dropped.dma_error + 9394 tgtobj->stats.tx_i.dropped.ring_full + 9395 tgtobj->stats.tx_i.dropped.enqueue_fail + 9396 tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check + 9397 tgtobj->stats.tx_i.dropped.desc_na.num + 9398 tgtobj->stats.tx_i.dropped.res_full + 9399 tgtobj->stats.tx_i.dropped.drop_ingress + 9400 tgtobj->stats.tx_i.dropped.headroom_insufficient + 9401 tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path + 9402 tgtobj->stats.tx_i.dropped.tx_mcast_drop; 9403 } 9404 9405 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl, 9406 struct cdp_soc_stats *soc_stats) 9407 { 9408 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9409 uint8_t inx; 9410 uint8_t cpus; 9411 9412 /* soc tx stats */ 9413 soc_stats->tx.egress = soc->stats.tx.egress[0]; 9414 soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer; 9415 for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) { 9416 soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx]; 9417 soc_stats->tx.tx_hw_ring_full[inx] = 9418 soc->stats.tx.tcl_ring_full[inx]; 9419 } 9420 soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use; 9421 soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed; 9422 soc_stats->tx.invalid_release_source = 9423 soc->stats.tx.invalid_release_source; 9424 soc_stats->tx.invalid_tx_comp_desc = 9425 soc->stats.tx.invalid_tx_comp_desc; 9426 for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++) 9427 soc_stats->tx.wifi_internal_error[inx] = 9428 soc->stats.tx.wbm_internal_error[inx]; 9429 soc_stats->tx.non_wifi_internal_err = 9430 soc->stats.tx.non_wbm_internal_err; 9431 soc_stats->tx.tx_comp_loop_pkt_limit_hit = 9432 soc->stats.tx.tx_comp_loop_pkt_limit_hit; 9433 soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2; 9434 soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception; 9435 /* soc rx stats */ 9436 soc_stats->rx.ingress = soc->stats.rx.ingress; 9437 soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts; 9438 soc_stats->rx.rx_frags = soc->stats.rx.rx_frags; 9439 soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject; 9440 soc_stats->rx.bar_frame = soc->stats.rx.bar_frame; 9441 soc_stats->rx.rx_frag_err_len_error = 9442 soc->stats.rx.rx_frag_err_len_error; 9443 soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer; 9444 soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait; 9445 soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err; 9446 soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor; 9447 soc_stats->rx.reap_loop_pkt_limit_hit = 9448 soc->stats.rx.reap_loop_pkt_limit_hit; 9449 soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2; 9450 soc_stats->rx.near_full = soc->stats.rx.near_full; 9451 soc_stats->rx.msdu_scatter_wait_break = 9452 soc->stats.rx.msdu_scatter_wait_break; 9453 soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop; 9454 soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop; 9455 soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS, 9456 num_possible_cpus()); 9457 for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) { 9458 for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++) 9459 soc_stats->rx.rx_packets.pkts[cpus][inx] = 9460 soc->stats.rx.ring_packets[cpus][inx]; 9461 } 9462 soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected; 9463 soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop; 9464 soc_stats->rx.err.phy_ring_access_fail = 9465 soc->stats.rx.err.hal_ring_access_fail; 9466 soc_stats->rx.err.phy_ring_access_full_fail = 9467 soc->stats.rx.err.hal_ring_access_full_fail; 9468 for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++) 9469 soc_stats->rx.err.phy_rx_hw_error[inx] = 9470 soc->stats.rx.err.hal_reo_error[inx]; 9471 soc_stats->rx.err.phy_rx_hw_dest_dup = 9472 soc->stats.rx.err.hal_reo_dest_dup; 9473 soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup; 9474 soc_stats->rx.err.phy_rx_sw_err_dup = 9475 soc->stats.rx.err.hal_rxdma_err_dup; 9476 soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm; 9477 soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev; 9478 soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev; 9479 soc_stats->rx.err.pkt_delivered_no_peer = 9480 soc->stats.rx.err.pkt_delivered_no_peer; 9481 soc_stats->rx.err.defrag_peer_uninit = 9482 soc->stats.rx.err.defrag_peer_uninit; 9483 soc_stats->rx.err.invalid_sa_da_idx = 9484 soc->stats.rx.err.invalid_sa_da_idx; 9485 soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail; 9486 soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer; 9487 soc_stats->rx.err.rx_invalid_peer_id = 9488 soc->stats.rx.err.rx_invalid_peer_id; 9489 soc_stats->rx.err.rx_invalid_pkt_len = 9490 soc->stats.rx.err.rx_invalid_pkt_len; 9491 for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX, 9492 (uint32_t)HAL_RXDMA_ERR_MAX); inx++) 9493 soc_stats->rx.err.rx_sw_error[inx] = 9494 soc->stats.rx.err.rxdma_error[inx]; 9495 for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX, 9496 (uint32_t)HAL_REO_ERR_MAX); inx++) 9497 soc_stats->rx.err.rx_hw_error[inx] = 9498 soc->stats.rx.err.reo_error[inx]; 9499 soc_stats->rx.err.rx_desc_invalid_magic = 9500 soc->stats.rx.err.rx_desc_invalid_magic; 9501 soc_stats->rx.err.rx_hw_cmd_send_fail = 9502 soc->stats.rx.err.reo_cmd_send_fail; 9503 soc_stats->rx.err.rx_hw_cmd_send_drain = 9504 soc->stats.rx.err.reo_cmd_send_drain; 9505 soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu; 9506 soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie; 9507 soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie; 9508 soc_stats->rx.err.rx_2k_jump_delba_sent = 9509 soc->stats.rx.err.rx_2k_jump_delba_sent; 9510 soc_stats->rx.err.rx_2k_jump_to_stack = 9511 soc->stats.rx.err.rx_2k_jump_to_stack; 9512 soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop; 9513 soc_stats->rx.err.rx_hw_err_msdu_buf_rcved = 9514 soc->stats.rx.err.reo_err_msdu_buf_rcved; 9515 soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie = 9516 soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie; 9517 soc_stats->rx.err.rx_hw_err_oor_drop = 9518 soc->stats.rx.err.reo_err_oor_drop; 9519 soc_stats->rx.err.rx_hw_err_oor_to_stack = 9520 soc->stats.rx.err.reo_err_oor_to_stack; 9521 soc_stats->rx.err.rx_hw_err_oor_sg_count = 9522 soc->stats.rx.err.reo_err_oor_sg_count; 9523 soc_stats->rx.err.msdu_count_mismatch = 9524 soc->stats.rx.err.msdu_count_mismatch; 9525 soc_stats->rx.err.invalid_link_cookie = 9526 soc->stats.rx.err.invalid_link_cookie; 9527 soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail; 9528 soc_stats->rx.err.dup_refill_link_desc = 9529 soc->stats.rx.err.dup_refill_link_desc; 9530 soc_stats->rx.err.msdu_continuation_err = 9531 soc->stats.rx.err.msdu_continuation_err; 9532 soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count; 9533 soc_stats->rx.err.bar_handle_fail_count = 9534 soc->stats.rx.err.bar_handle_fail_count; 9535 soc_stats->rx.err.intrabss_eapol_drop = 9536 soc->stats.rx.err.intrabss_eapol_drop; 9537 soc_stats->rx.err.pn_in_dest_check_fail = 9538 soc->stats.rx.err.pn_in_dest_check_fail; 9539 soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err; 9540 soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count; 9541 /* soc ast stats */ 9542 soc_stats->ast.added = soc->stats.ast.added; 9543 soc_stats->ast.deleted = soc->stats.ast.deleted; 9544 soc_stats->ast.aged_out = soc->stats.ast.aged_out; 9545 soc_stats->ast.map_err = soc->stats.ast.map_err; 9546 soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch; 9547 /* soc mec stats */ 9548 soc_stats->mec.added = soc->stats.mec.added; 9549 soc_stats->mec.deleted = soc->stats.mec.deleted; 9550 9551 return QDF_STATUS_SUCCESS; 9552 } 9553 9554 #ifdef QCA_PEER_EXT_STATS 9555 QDF_STATUS 9556 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 9557 uint8_t *peer_mac, 9558 struct cdp_delay_tid_stats *delay_stats) 9559 { 9560 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9561 struct dp_peer *peer = NULL; 9562 struct dp_peer_delay_stats *pext_stats; 9563 struct cdp_delay_rx_stats *rx_delay; 9564 struct cdp_delay_tx_stats *tx_delay; 9565 uint8_t tid; 9566 struct cdp_peer_info peer_info = { 0 }; 9567 9568 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 9569 return QDF_STATUS_E_FAILURE; 9570 9571 DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false, 9572 CDP_WILD_PEER_TYPE); 9573 9574 peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP); 9575 if (!peer) 9576 return QDF_STATUS_E_FAILURE; 9577 9578 if (!peer->txrx_peer) { 9579 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 9580 return QDF_STATUS_E_FAILURE; 9581 } 9582 9583 pext_stats = peer->txrx_peer->delay_stats; 9584 if (!pext_stats) { 9585 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 9586 return QDF_STATUS_E_FAILURE; 9587 } 9588 9589 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 9590 rx_delay = &delay_stats[tid].rx_delay; 9591 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 9592 &rx_delay->to_stack_delay, tid, 9593 CDP_HIST_TYPE_REAP_STACK); 9594 tx_delay = &delay_stats[tid].tx_delay; 9595 dp_accumulate_delay_avg_stats(pext_stats->delay_tid_stats, 9596 tx_delay, 9597 tid); 9598 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 9599 &tx_delay->tx_swq_delay, tid, 9600 CDP_HIST_TYPE_SW_ENQEUE_DELAY); 9601 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 9602 &tx_delay->hwtx_delay, tid, 9603 CDP_HIST_TYPE_HW_COMP_DELAY); 9604 } 9605 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 9606 9607 return QDF_STATUS_SUCCESS; 9608 } 9609 #else 9610 QDF_STATUS 9611 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 9612 uint8_t *peer_mac, 9613 struct cdp_delay_tid_stats *delay_stats) 9614 { 9615 return QDF_STATUS_E_FAILURE; 9616 } 9617 #endif /* QCA_PEER_EXT_STATS */ 9618 9619 #ifdef WLAN_PEER_JITTER 9620 QDF_STATUS 9621 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9622 uint8_t vdev_id, uint8_t *peer_mac, 9623 struct cdp_peer_tid_stats *tid_stats) 9624 { 9625 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9626 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9627 struct dp_peer *peer = NULL; 9628 uint8_t tid; 9629 struct cdp_peer_info peer_info = { 0 }; 9630 struct cdp_peer_tid_stats *jitter_stats; 9631 uint8_t ring_id; 9632 9633 if (!pdev) 9634 return QDF_STATUS_E_FAILURE; 9635 9636 if (!wlan_cfg_is_peer_jitter_stats_enabled(soc->wlan_cfg_ctx)) 9637 return QDF_STATUS_E_FAILURE; 9638 9639 DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false, 9640 CDP_WILD_PEER_TYPE); 9641 9642 peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP); 9643 if (!peer) 9644 return QDF_STATUS_E_FAILURE; 9645 9646 if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) { 9647 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 9648 return QDF_STATUS_E_FAILURE; 9649 } 9650 9651 if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { 9652 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 9653 struct cdp_peer_tid_stats *rx_tid = 9654 &peer->txrx_peer->jitter_stats[tid]; 9655 9656 tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter; 9657 tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay; 9658 tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err; 9659 tid_stats[tid].tx_total_success = rx_tid->tx_total_success; 9660 tid_stats[tid].tx_drop = rx_tid->tx_drop; 9661 } 9662 9663 } else { 9664 jitter_stats = peer->txrx_peer->jitter_stats; 9665 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 9666 for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) { 9667 struct cdp_peer_tid_stats *rx_tid = 9668 &jitter_stats[tid * 9669 CDP_MAX_TXRX_CTX + ring_id]; 9670 tid_stats[tid].tx_avg_jitter = 9671 (rx_tid->tx_avg_jitter + 9672 tid_stats[tid].tx_avg_jitter) >> 1; 9673 tid_stats[tid].tx_avg_delay = 9674 (rx_tid->tx_avg_delay + 9675 tid_stats[tid].tx_avg_delay) >> 1; 9676 tid_stats[tid].tx_avg_err = (rx_tid->tx_avg_err 9677 + tid_stats[tid].tx_avg_err) >> 1; 9678 tid_stats[tid].tx_total_success += 9679 rx_tid->tx_total_success; 9680 tid_stats[tid].tx_drop += rx_tid->tx_drop; 9681 } 9682 } 9683 } 9684 9685 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 9686 9687 return QDF_STATUS_SUCCESS; 9688 } 9689 #else 9690 QDF_STATUS 9691 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9692 uint8_t vdev_id, uint8_t *peer_mac, 9693 struct cdp_peer_tid_stats *tid_stats) 9694 { 9695 return QDF_STATUS_E_FAILURE; 9696 } 9697 #endif /* WLAN_PEER_JITTER */ 9698 9699 #ifdef WLAN_TX_PKT_CAPTURE_ENH 9700 QDF_STATUS 9701 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 9702 uint8_t vdev_id, uint8_t *peer_mac, 9703 struct cdp_peer_tx_capture_stats *stats) 9704 { 9705 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9706 struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, 9707 DP_MOD_ID_TX_CAPTURE); 9708 QDF_STATUS status; 9709 9710 if (!peer) 9711 return QDF_STATUS_E_FAILURE; 9712 9713 status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats); 9714 dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE); 9715 9716 return status; 9717 } 9718 9719 QDF_STATUS 9720 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9721 struct cdp_pdev_tx_capture_stats *stats) 9722 { 9723 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9724 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9725 9726 if (!pdev) 9727 return QDF_STATUS_E_FAILURE; 9728 9729 return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats); 9730 } 9731 #else /* WLAN_TX_PKT_CAPTURE_ENH */ 9732 QDF_STATUS 9733 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 9734 uint8_t vdev_id, uint8_t *peer_mac, 9735 struct cdp_peer_tx_capture_stats *stats) 9736 { 9737 return QDF_STATUS_E_FAILURE; 9738 } 9739 9740 QDF_STATUS 9741 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9742 struct cdp_pdev_tx_capture_stats *stats) 9743 { 9744 return QDF_STATUS_E_FAILURE; 9745 } 9746 #endif /* WLAN_TX_PKT_CAPTURE_ENH */ 9747 9748 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 9749 QDF_STATUS 9750 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9751 struct cdp_pdev_telemetry_stats *stats) 9752 { 9753 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9754 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9755 uint8_t ac = 0; 9756 9757 if (!pdev) 9758 return QDF_STATUS_E_FAILURE; 9759 9760 /* consumption is in micro seconds, convert it to seconds and 9761 * then calculate %age per sec 9762 */ 9763 for (ac = 0; ac < WME_AC_MAX; ac++) { 9764 stats->link_airtime[ac] = 9765 ((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000); 9766 stats->tx_mpdu_failed[ac] = pdev->stats.telemetry_stats.tx_mpdu_failed[ac]; 9767 stats->tx_mpdu_total[ac] = pdev->stats.telemetry_stats.tx_mpdu_total[ac]; 9768 } 9769 return QDF_STATUS_SUCCESS; 9770 } 9771 9772 QDF_STATUS 9773 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, 9774 struct cdp_peer_telemetry_stats *stats) 9775 { 9776 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9777 struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL, 9778 DP_MOD_ID_MISC); 9779 9780 if (!peer) 9781 return QDF_STATUS_E_FAILURE; 9782 9783 dp_monitor_peer_telemetry_stats(peer, stats); 9784 dp_peer_unref_delete(peer, DP_MOD_ID_MISC); 9785 9786 return QDF_STATUS_SUCCESS; 9787 } 9788 9789 QDF_STATUS 9790 dp_get_pdev_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9791 struct cdp_pdev_deter_stats *stats) 9792 { 9793 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9794 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9795 9796 if (!pdev) 9797 return QDF_STATUS_E_FAILURE; 9798 9799 qdf_mem_copy(stats->dl_ofdma_usr, pdev->stats.deter_stats.dl_ofdma_usr, 9800 sizeof(stats->dl_ofdma_usr[0]) * CDP_MU_MAX_USERS); 9801 qdf_mem_copy(stats->ul_ofdma_usr, pdev->stats.deter_stats.ul_ofdma_usr, 9802 sizeof(stats->ul_ofdma_usr[0]) * CDP_MU_MAX_USERS); 9803 qdf_mem_copy(stats->dl_mimo_usr, pdev->stats.deter_stats.dl_mimo_usr, 9804 sizeof(stats->dl_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS); 9805 qdf_mem_copy(stats->ul_mimo_usr, pdev->stats.deter_stats.ul_mimo_usr, 9806 sizeof(stats->ul_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS); 9807 9808 qdf_mem_copy(stats->ul_mode_cnt, pdev->stats.deter_stats.ul_mode_cnt, 9809 sizeof(stats->ul_mode_cnt[0]) * TX_MODE_UL_MAX); 9810 qdf_mem_copy(stats->dl_mode_cnt, pdev->stats.deter_stats.dl_mode_cnt, 9811 sizeof(stats->dl_mode_cnt[0]) * TX_MODE_DL_MAX); 9812 qdf_mem_copy(stats->ch_access_delay, 9813 pdev->stats.deter_stats.ch_access_delay, 9814 sizeof(stats->ch_access_delay[0]) * WME_AC_MAX); 9815 9816 qdf_mem_copy(stats->ts, 9817 pdev->stats.deter_stats.ts, 9818 sizeof(stats->ts[0]) * TX_MODE_UL_MAX); 9819 9820 stats->ch_util.ap_tx_util = pdev->stats.deter_stats.ch_util.ap_tx_util; 9821 stats->ch_util.ap_rx_util = pdev->stats.deter_stats.ch_util.ap_rx_util; 9822 stats->ch_util.ap_chan_util = 9823 pdev->stats.deter_stats.ch_util.ap_chan_util; 9824 stats->rx_su_cnt = pdev->stats.deter_stats.rx_su_cnt; 9825 9826 return QDF_STATUS_SUCCESS; 9827 } 9828 9829 QDF_STATUS 9830 dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl, 9831 uint8_t vdev_id, 9832 uint8_t *addr, 9833 struct cdp_peer_deter_stats *stats) 9834 { 9835 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9836 struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, vdev_id, 9837 DP_MOD_ID_MISC); 9838 9839 if (!peer) 9840 return QDF_STATUS_E_FAILURE; 9841 9842 dp_monitor_peer_deter_stats(peer, stats); 9843 dp_peer_unref_delete(peer, DP_MOD_ID_MISC); 9844 9845 return QDF_STATUS_SUCCESS; 9846 } 9847 9848 QDF_STATUS 9849 dp_update_pdev_chan_util_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9850 struct cdp_pdev_chan_util_stats *ch_util) 9851 { 9852 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9853 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9854 9855 if (!pdev) 9856 return QDF_STATUS_E_FAILURE; 9857 9858 pdev->stats.deter_stats.ch_util.ap_tx_util = ch_util->ap_tx_util; 9859 pdev->stats.deter_stats.ch_util.ap_rx_util = ch_util->ap_rx_util; 9860 pdev->stats.deter_stats.ch_util.ap_chan_util = ch_util->ap_chan_util; 9861 9862 return QDF_STATUS_SUCCESS; 9863 } 9864 #endif 9865 #ifndef CONFIG_AP_PLATFORM 9866 #if defined WLAN_FEATURE_11BE_MLO && defined DP_MLO_LINK_STATS_SUPPORT 9867 /** 9868 * dp_print_per_link_peer_txrx_stats() - print link peer stats 9869 * @peer_stats: buffer holding peer stats 9870 * @pdev: DP pdev handle 9871 * 9872 * return None 9873 */ 9874 static inline void 9875 dp_print_per_link_peer_txrx_stats(struct cdp_peer_stats *peer_stats, 9876 struct dp_pdev *pdev) 9877 { 9878 uint8_t i; 9879 uint32_t index; 9880 uint32_t j; 9881 char nss[DP_NSS_LENGTH]; 9882 char mu_group_id[DP_MU_GROUP_LENGTH]; 9883 uint32_t *pnss; 9884 enum cdp_mu_packet_type rx_mu_type; 9885 struct cdp_rx_mu *rx_mu; 9886 9887 DP_PRINT_STATS("peer_mac_addr = " QDF_MAC_ADDR_FMT, 9888 QDF_MAC_ADDR_REF(peer_stats->mac_addr.bytes)); 9889 DP_PRINT_STATS("Node Tx Stats:"); 9890 DP_PRINT_STATS("Success Packets = %llu", 9891 peer_stats->tx.tx_success.num); 9892 DP_PRINT_STATS("Success Bytes = %llu", 9893 peer_stats->tx.tx_success.bytes); 9894 DP_PRINT_STATS("Success Packets in TWT Session = %llu", 9895 peer_stats->tx.tx_success_twt.num); 9896 DP_PRINT_STATS("Success Bytes in TWT Session = %llu", 9897 peer_stats->tx.tx_success_twt.bytes); 9898 DP_PRINT_STATS("Unicast Success Packets = %llu", 9899 peer_stats->tx.ucast.num); 9900 DP_PRINT_STATS("Unicast Success Bytes = %llu", 9901 peer_stats->tx.ucast.bytes); 9902 DP_PRINT_STATS("Multicast Success Packets = %llu", 9903 peer_stats->tx.mcast.num); 9904 DP_PRINT_STATS("Multicast Success Bytes = %llu", 9905 peer_stats->tx.mcast.bytes); 9906 DP_PRINT_STATS("Broadcast Success Packets = %llu", 9907 peer_stats->tx.bcast.num); 9908 DP_PRINT_STATS("Broadcast Success Bytes = %llu", 9909 peer_stats->tx.bcast.bytes); 9910 DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %u", 9911 peer_stats->tx.retry_count); 9912 DP_PRINT_STATS("Packets Sent Success after more than one retry = %u", 9913 peer_stats->tx.multiple_retry_count); 9914 DP_PRINT_STATS("Packets Failed due to retry threshold breach = %u", 9915 peer_stats->tx.failed_retry_count); 9916 DP_PRINT_STATS("Packets In OFDMA = %u", 9917 peer_stats->tx.ofdma); 9918 DP_PRINT_STATS("Packets In STBC = %u", 9919 peer_stats->tx.stbc); 9920 DP_PRINT_STATS("Packets In LDPC = %u", 9921 peer_stats->tx.ldpc); 9922 DP_PRINT_STATS("Packet Retries = %u", 9923 peer_stats->tx.retries); 9924 DP_PRINT_STATS("MSDU's Part of AMSDU = %u", 9925 peer_stats->tx.amsdu_cnt); 9926 DP_PRINT_STATS("Msdu's As Part of Ampdu = %u", 9927 peer_stats->tx.non_ampdu_cnt); 9928 DP_PRINT_STATS("Msdu's As Ampdu = %u", 9929 peer_stats->tx.ampdu_cnt); 9930 DP_PRINT_STATS("Last Packet RSSI = %u", 9931 peer_stats->tx.last_ack_rssi); 9932 DP_PRINT_STATS("Dropped At FW: Removed Pkts = %llu", 9933 peer_stats->tx.dropped.fw_rem.num); 9934 DP_PRINT_STATS("Release source not TQM = %u", 9935 peer_stats->tx.release_src_not_tqm); 9936 if (pdev && 9937 !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { 9938 DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu", 9939 peer_stats->tx.dropped.fw_rem.bytes); 9940 } 9941 DP_PRINT_STATS("Dropped At FW: Removed transmitted = %u", 9942 peer_stats->tx.dropped.fw_rem_tx); 9943 DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %u", 9944 peer_stats->tx.dropped.fw_rem_notx); 9945 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u", 9946 peer_stats->tx.dropped.fw_reason1); 9947 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u", 9948 peer_stats->tx.dropped.fw_reason2); 9949 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u", 9950 peer_stats->tx.dropped.fw_reason3); 9951 DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u", 9952 peer_stats->tx.dropped.fw_rem_queue_disable); 9953 DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u", 9954 peer_stats->tx.dropped.fw_rem_no_match); 9955 DP_PRINT_STATS("Dropped due to HW threshold criteria = %u", 9956 peer_stats->tx.dropped.drop_threshold); 9957 DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u", 9958 peer_stats->tx.dropped.drop_link_desc_na); 9959 DP_PRINT_STATS("Drop bit set or invalid flow = %u", 9960 peer_stats->tx.dropped.invalid_drop); 9961 DP_PRINT_STATS("MCAST vdev drop in HW = %u", 9962 peer_stats->tx.dropped.mcast_vdev_drop); 9963 DP_PRINT_STATS("Dropped : Age Out = %u", 9964 peer_stats->tx.dropped.age_out); 9965 DP_PRINT_STATS("Dropped : Invalid Reason = %u", 9966 peer_stats->tx.dropped.invalid_rr); 9967 DP_PRINT_STATS("NAWDS : "); 9968 DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %u", 9969 peer_stats->tx.nawds_mcast_drop); 9970 DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %llu", 9971 peer_stats->tx.nawds_mcast.num); 9972 DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu", 9973 peer_stats->tx.nawds_mcast.bytes); 9974 9975 DP_PRINT_STATS("PPDU's = %u", peer_stats->tx.tx_ppdus); 9976 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %u", 9977 peer_stats->tx.pream_punct_cnt); 9978 DP_PRINT_STATS("MPDU's Successful = %u", 9979 peer_stats->tx.tx_mpdus_success); 9980 DP_PRINT_STATS("MPDU's Tried = %u", 9981 peer_stats->tx.tx_mpdus_tried); 9982 9983 DP_PRINT_STATS("Rate Info:"); 9984 dp_print_common_rates_info(peer_stats->tx.pkt_type); 9985 DP_PRINT_STATS("SGI = 0.8us %u 0.4us %u 1.6us %u 3.2us %u", 9986 peer_stats->tx.sgi_count[0], 9987 peer_stats->tx.sgi_count[1], 9988 peer_stats->tx.sgi_count[2], 9989 peer_stats->tx.sgi_count[3]); 9990 9991 DP_PRINT_STATS("Wireless Mutlimedia "); 9992 DP_PRINT_STATS(" Best effort = %u", 9993 peer_stats->tx.wme_ac_type[0]); 9994 DP_PRINT_STATS(" Background= %u", 9995 peer_stats->tx.wme_ac_type[1]); 9996 DP_PRINT_STATS(" Video = %u", 9997 peer_stats->tx.wme_ac_type[2]); 9998 DP_PRINT_STATS(" Voice = %u", 9999 peer_stats->tx.wme_ac_type[3]); 10000 10001 DP_PRINT_STATS("Excess Retries per AC "); 10002 DP_PRINT_STATS(" Best effort = %u", 10003 peer_stats->tx.excess_retries_per_ac[0]); 10004 DP_PRINT_STATS(" Background= %u", 10005 peer_stats->tx.excess_retries_per_ac[1]); 10006 DP_PRINT_STATS(" Video = %u", 10007 peer_stats->tx.excess_retries_per_ac[2]); 10008 DP_PRINT_STATS(" Voice = %u", 10009 peer_stats->tx.excess_retries_per_ac[3]); 10010 10011 pnss = &peer_stats->tx.nss[0]; 10012 dp_print_nss(nss, pnss, SS_COUNT); 10013 10014 DP_PRINT_STATS("NSS(1-8) = %s", nss); 10015 10016 DP_PRINT_STATS("Transmit Type :"); 10017 DP_PRINT_STATS("MSDUs Success: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u", 10018 peer_stats->tx.transmit_type[SU].num_msdu, 10019 peer_stats->tx.transmit_type[MU_MIMO].num_msdu, 10020 peer_stats->tx.transmit_type[MU_OFDMA].num_msdu, 10021 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu); 10022 10023 DP_PRINT_STATS("MPDUs Success: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u", 10024 peer_stats->tx.transmit_type[SU].num_mpdu, 10025 peer_stats->tx.transmit_type[MU_MIMO].num_mpdu, 10026 peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu, 10027 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu); 10028 10029 DP_PRINT_STATS("MPDUs Tried: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u", 10030 peer_stats->tx.transmit_type[SU].mpdu_tried, 10031 peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried, 10032 peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried, 10033 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried); 10034 10035 for (i = 0; i < MAX_MU_GROUP_ID;) { 10036 index = 0; 10037 for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID; 10038 j++) { 10039 index += qdf_snprint(&mu_group_id[index], 10040 DP_MU_GROUP_LENGTH - index, 10041 " %u", 10042 peer_stats->tx.mu_group_id[i]); 10043 i++; 10044 } 10045 10046 DP_PRINT_STATS("User position list for GID %02d->%u: [%s]", 10047 i - DP_MU_GROUP_SHOW, i - 1, 10048 mu_group_id); 10049 } 10050 10051 DP_PRINT_STATS("Last Packet RU index [%u], Size [%u]", 10052 peer_stats->tx.ru_start, 10053 peer_stats->tx.ru_tones); 10054 10055 DP_PRINT_STATS("Aggregation:"); 10056 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %u", 10057 peer_stats->tx.amsdu_cnt); 10058 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %u", 10059 peer_stats->tx.non_amsdu_cnt); 10060 10061 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 10062 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 10063 PEER_TX_STATS); 10064 10065 DP_PRINT_STATS("Node Rx Stats:"); 10066 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 10067 DP_PRINT_STATS("Ring Id = %u", i); 10068 DP_PRINT_STATS(" Packets Received = %llu", 10069 peer_stats->rx.rcvd_reo[i].num); 10070 DP_PRINT_STATS(" Bytes Received = %llu", 10071 peer_stats->rx.rcvd_reo[i].bytes); 10072 } 10073 for (i = 0; i < CDP_MAX_LMACS; i++) 10074 DP_PRINT_STATS("Packets Received on lmac[%u] = %llu ( %llu ),", 10075 i, peer_stats->rx.rx_lmac[i].num, 10076 peer_stats->rx.rx_lmac[i].bytes); 10077 10078 DP_PRINT_STATS("Unicast Packets Received = %llu", 10079 peer_stats->rx.unicast.num); 10080 DP_PRINT_STATS("Unicast Bytes Received = %llu", 10081 peer_stats->rx.unicast.bytes); 10082 DP_PRINT_STATS("Multicast Packets Received = %llu", 10083 peer_stats->rx.multicast.num); 10084 DP_PRINT_STATS("Multicast Bytes Received = %llu", 10085 peer_stats->rx.multicast.bytes); 10086 DP_PRINT_STATS("Broadcast Packets Received = %llu", 10087 peer_stats->rx.bcast.num); 10088 DP_PRINT_STATS("Broadcast Bytes Received = %llu", 10089 peer_stats->rx.bcast.bytes); 10090 DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %llu", 10091 peer_stats->rx.to_stack_twt.num); 10092 DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu", 10093 peer_stats->rx.to_stack_twt.bytes); 10094 DP_PRINT_STATS("Intra BSS Packets Received = %llu", 10095 peer_stats->rx.intra_bss.pkts.num); 10096 DP_PRINT_STATS("Intra BSS Bytes Received = %llu", 10097 peer_stats->rx.intra_bss.pkts.bytes); 10098 DP_PRINT_STATS("Intra BSS Packets Failed = %llu", 10099 peer_stats->rx.intra_bss.fail.num); 10100 DP_PRINT_STATS("Intra BSS Bytes Failed = %llu", 10101 peer_stats->rx.intra_bss.fail.bytes); 10102 DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded = %u", 10103 peer_stats->rx.intra_bss.mdns_no_fwd); 10104 DP_PRINT_STATS("Raw Packets Received = %llu", 10105 peer_stats->rx.raw.num); 10106 DP_PRINT_STATS("Raw Bytes Received = %llu", 10107 peer_stats->rx.raw.bytes); 10108 DP_PRINT_STATS("Errors: MIC Errors = %u", 10109 peer_stats->rx.err.mic_err); 10110 DP_PRINT_STATS("Errors: Decryption Errors = %u", 10111 peer_stats->rx.err.decrypt_err); 10112 DP_PRINT_STATS("Errors: PN Errors = %u", 10113 peer_stats->rx.err.pn_err); 10114 DP_PRINT_STATS("Errors: OOR Errors = %u", 10115 peer_stats->rx.err.oor_err); 10116 DP_PRINT_STATS("Errors: 2k Jump Errors = %u", 10117 peer_stats->rx.err.jump_2k_err); 10118 DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %u", 10119 peer_stats->rx.err.rxdma_wifi_parse_err); 10120 DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %u", 10121 peer_stats->rx.non_ampdu_cnt); 10122 DP_PRINT_STATS("Msdu's Received As Ampdu = %u", 10123 peer_stats->rx.ampdu_cnt); 10124 DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %u", 10125 peer_stats->rx.non_amsdu_cnt); 10126 DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %u", 10127 peer_stats->rx.amsdu_cnt); 10128 DP_PRINT_STATS("MSDU Rx Retries= %u", 10129 peer_stats->rx.rx_retries); 10130 DP_PRINT_STATS("MPDU Rx Retries= %u", 10131 peer_stats->rx.mpdu_retry_cnt); 10132 DP_PRINT_STATS("NAWDS : "); 10133 DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %u", 10134 peer_stats->rx.nawds_mcast_drop); 10135 DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %u", 10136 peer_stats->rx.mcast_3addr_drop); 10137 DP_PRINT_STATS("SGI = 0.8us %u 0.4us %u 1.6us %u 3.2us %u", 10138 peer_stats->rx.sgi_count[0], 10139 peer_stats->rx.sgi_count[1], 10140 peer_stats->rx.sgi_count[2], 10141 peer_stats->rx.sgi_count[3]); 10142 10143 DP_PRINT_STATS("Wireless Mutlimedia "); 10144 DP_PRINT_STATS(" Best effort = %u", 10145 peer_stats->rx.wme_ac_type[0]); 10146 DP_PRINT_STATS(" Background= %u", 10147 peer_stats->rx.wme_ac_type[1]); 10148 DP_PRINT_STATS(" Video = %u", 10149 peer_stats->rx.wme_ac_type[2]); 10150 DP_PRINT_STATS(" Voice = %u", 10151 peer_stats->rx.wme_ac_type[3]); 10152 10153 DP_PRINT_STATS(" Total Rx PPDU Count = %u", 10154 peer_stats->rx.rx_ppdus); 10155 DP_PRINT_STATS(" Total Rx MPDU Count = %u", 10156 peer_stats->rx.rx_mpdus); 10157 DP_PRINT_STATS("MSDU Reception Type"); 10158 DP_PRINT_STATS("SU %u MU_MIMO %u MU_OFDMA %u MU_OFDMA_MIMO %u", 10159 peer_stats->rx.reception_type[0], 10160 peer_stats->rx.reception_type[1], 10161 peer_stats->rx.reception_type[2], 10162 peer_stats->rx.reception_type[3]); 10163 DP_PRINT_STATS("PPDU Reception Type"); 10164 DP_PRINT_STATS("SU %u MU_MIMO %u MU_OFDMA %u MU_OFDMA_MIMO %u", 10165 peer_stats->rx.ppdu_cnt[0], 10166 peer_stats->rx.ppdu_cnt[1], 10167 peer_stats->rx.ppdu_cnt[2], 10168 peer_stats->rx.ppdu_cnt[3]); 10169 10170 dp_print_common_rates_info(peer_stats->rx.pkt_type); 10171 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt, 10172 DOT11_AX); 10173 dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]); 10174 10175 pnss = &peer_stats->rx.nss[0]; 10176 dp_print_nss(nss, pnss, SS_COUNT); 10177 DP_PRINT_STATS("MSDU Count"); 10178 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 10179 10180 DP_PRINT_STATS("reception mode SU"); 10181 pnss = &peer_stats->rx.ppdu_nss[0]; 10182 dp_print_nss(nss, pnss, SS_COUNT); 10183 10184 DP_PRINT_STATS(" PPDU Count"); 10185 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 10186 10187 DP_PRINT_STATS(" MPDU OK = %u, MPDU Fail = %u", 10188 peer_stats->rx.mpdu_cnt_fcs_ok, 10189 peer_stats->rx.mpdu_cnt_fcs_err); 10190 10191 for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; 10192 rx_mu_type++) { 10193 DP_PRINT_STATS("reception mode %s", 10194 mu_reception_mode[rx_mu_type]); 10195 rx_mu = &peer_stats->rx.rx_mu[rx_mu_type]; 10196 10197 pnss = &rx_mu->ppdu_nss[0]; 10198 dp_print_nss(nss, pnss, SS_COUNT); 10199 DP_PRINT_STATS(" PPDU Count"); 10200 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 10201 10202 DP_PRINT_STATS(" MPDU OK = %u, MPDU Fail = %u", 10203 rx_mu->mpdu_cnt_fcs_ok, 10204 rx_mu->mpdu_cnt_fcs_err); 10205 } 10206 10207 DP_PRINT_STATS("Aggregation:"); 10208 DP_PRINT_STATS(" Msdu's Part of Ampdu = %u", 10209 peer_stats->rx.ampdu_cnt); 10210 DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %u", 10211 peer_stats->rx.non_ampdu_cnt); 10212 DP_PRINT_STATS(" Msdu's Part of Amsdu = %u", 10213 peer_stats->rx.amsdu_cnt); 10214 DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %u", 10215 peer_stats->rx.non_amsdu_cnt); 10216 DP_PRINT_STATS("MEC Packet Drop = %llu", 10217 peer_stats->rx.mec_drop.num); 10218 DP_PRINT_STATS("MEC Byte Drop = %llu", 10219 peer_stats->rx.mec_drop.bytes); 10220 DP_PRINT_STATS("Multipass Rx Packet Drop = %u", 10221 peer_stats->rx.multipass_rx_pkt_drop); 10222 DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %u", 10223 peer_stats->rx.peer_unauth_rx_pkt_drop); 10224 DP_PRINT_STATS("Policy Check Rx Packet Drop = %u", 10225 peer_stats->rx.policy_check_drop); 10226 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 10227 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 10228 PEER_RX_STATS); 10229 } 10230 10231 /** 10232 * dp_print_per_link_peer_stats() - print per link peer stats of MLD peer 10233 * @peer: MLD DP_PEER handle 10234 * @peer_stats: buffer holding peer stats 10235 * @num_links: Number of Link peers. 10236 * 10237 * This API should only be called with MLD peer and peer_stats should 10238 * point to buffer of size = (sizeof(*peer_stats) * num_links). 10239 * 10240 * return None 10241 */ 10242 static 10243 void dp_print_per_link_peer_stats(struct dp_peer *peer, 10244 struct cdp_peer_stats *peer_stats, 10245 uint8_t num_links) 10246 { 10247 uint8_t index; 10248 struct dp_pdev *pdev = peer->vdev->pdev; 10249 10250 if (!IS_MLO_DP_MLD_PEER(peer)) 10251 return; 10252 10253 DP_PRINT_STATS("Node Tx ML peer Stats:\n"); 10254 DP_PRINT_STATS("Total Packet Completions = %llu", 10255 peer_stats->tx.comp_pkt.num); 10256 DP_PRINT_STATS("Total Bytes Completions = %llu", 10257 peer_stats->tx.comp_pkt.bytes); 10258 DP_PRINT_STATS("Packets Failed = %u", 10259 peer_stats->tx.tx_failed); 10260 DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:"); 10261 DP_PRINT_STATS(" Bytes transmitted in last sec: %u", 10262 peer_stats->tx.tx_byte_rate); 10263 DP_PRINT_STATS(" Data transmitted in last sec: %u", 10264 peer_stats->tx.tx_data_rate); 10265 10266 if (!IS_MLO_DP_LINK_PEER(peer)) { 10267 dp_print_jitter_stats(peer, pdev); 10268 dp_peer_print_tx_delay_stats(pdev, peer); 10269 } 10270 10271 DP_PRINT_STATS("Node Rx ML peer Stats:\n"); 10272 DP_PRINT_STATS("Packets Sent To Stack = %llu", 10273 peer_stats->rx.to_stack.num); 10274 DP_PRINT_STATS("Bytes Sent To Stack = %llu", 10275 peer_stats->rx.to_stack.bytes); 10276 DP_PRINT_STATS("Bytes and Packets received in last one sec:"); 10277 DP_PRINT_STATS(" Bytes received in last sec: %u", 10278 peer_stats->rx.rx_byte_rate); 10279 DP_PRINT_STATS(" Data received in last sec: %u", 10280 peer_stats->rx.rx_data_rate); 10281 if (!IS_MLO_DP_LINK_PEER(peer)) 10282 dp_peer_print_rx_delay_stats(pdev, peer); 10283 10284 dp_peer_print_reo_qref_table(peer); 10285 DP_PRINT_STATS("Per Link TxRx Stats:\n"); 10286 for (index = 0; index < num_links; index++) { 10287 DP_PRINT_STATS("Link %u TxRx Stats:\n", index); 10288 dp_print_per_link_peer_txrx_stats(&peer_stats[index], pdev); 10289 } 10290 } 10291 10292 void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) 10293 { 10294 struct dp_mld_link_peers link_peers_info; 10295 struct dp_peer *peer, *ml_peer = NULL; 10296 struct cdp_peer_stats *peer_stats = NULL; 10297 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 10298 struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, 10299 DP_MOD_ID_GENERIC_STATS); 10300 if (!vdev) { 10301 dp_err_rl("vdev is NULL, vdev_id: %u", vdev_id); 10302 return; 10303 } 10304 peer = dp_vdev_bss_peer_ref_n_get(soc, vdev, DP_MOD_ID_GENERIC_STATS); 10305 10306 if (!peer) { 10307 dp_err("Peer is NULL, vdev_id: %u", vdev_id); 10308 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 10309 return; 10310 } 10311 if (IS_MLO_DP_LINK_PEER(peer)) 10312 ml_peer = peer->mld_peer; 10313 if (ml_peer) { 10314 dp_get_link_peers_ref_from_mld_peer(soc, ml_peer, 10315 &link_peers_info, 10316 DP_MOD_ID_GENERIC_STATS); 10317 peer_stats = qdf_mem_malloc(sizeof(*peer_stats) * 10318 link_peers_info.num_links); 10319 if (!peer_stats) { 10320 dp_err("malloc failed, vdev_id: %u, ML peer_id: %u", 10321 vdev_id, ml_peer->peer_id); 10322 dp_release_link_peers_ref(&link_peers_info, 10323 DP_MOD_ID_GENERIC_STATS); 10324 goto fail; 10325 } 10326 10327 dp_get_per_link_peer_stats(ml_peer, peer_stats, 10328 ml_peer->peer_type, 10329 link_peers_info.num_links); 10330 dp_print_per_link_peer_stats(ml_peer, peer_stats, 10331 link_peers_info.num_links); 10332 dp_release_link_peers_ref(&link_peers_info, 10333 DP_MOD_ID_GENERIC_STATS); 10334 qdf_mem_free(peer_stats); 10335 } else { 10336 peer_stats = qdf_mem_malloc(sizeof(*peer_stats)); 10337 if (!peer_stats) { 10338 dp_err("malloc failed, vdev_id: %u, peer_id: %u", 10339 vdev_id, peer->peer_id); 10340 goto fail; 10341 } 10342 dp_get_peer_stats(peer, peer_stats); 10343 dp_print_peer_stats(peer, peer_stats); 10344 qdf_mem_free(peer_stats); 10345 } 10346 10347 fail: 10348 dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS); 10349 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 10350 } 10351 #else 10352 void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) 10353 { 10354 struct dp_peer *peer; 10355 struct cdp_peer_stats *peer_stats = NULL; 10356 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 10357 struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, 10358 DP_MOD_ID_GENERIC_STATS); 10359 if (!vdev) { 10360 dp_err_rl("vdev is null for vdev_id: %u", vdev_id); 10361 return; 10362 } 10363 peer = dp_vdev_bss_peer_ref_n_get(soc, vdev, DP_MOD_ID_GENERIC_STATS); 10364 10365 if (!peer) { 10366 dp_err_rl("Peer is NULL, vdev_id: %u", vdev_id); 10367 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 10368 return; 10369 } 10370 peer_stats = qdf_mem_malloc(sizeof(*peer_stats)); 10371 if (!peer_stats) { 10372 dp_err_rl("peer_stats malloc failed, vdev_id: %u, peer_id: %u", 10373 vdev_id, peer->peer_id); 10374 goto fail; 10375 } 10376 10377 dp_get_peer_stats(peer, peer_stats); 10378 dp_print_peer_stats(peer, peer_stats); 10379 qdf_mem_free(peer_stats); 10380 10381 fail: 10382 dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS); 10383 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 10384 } 10385 #endif /* DP_MLO_LINK_STATS_SUPPORT */ 10386 #else 10387 void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) 10388 { 10389 } 10390 #endif /* CONFIG_AP_PLATFORM */ 10391