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