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