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