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