Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/athk/ath11k/debugfs_htt_stats.c
104874 views
1
// SPDX-License-Identifier: BSD-3-Clause-Clear
2
/*
3
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
5
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
6
*/
7
8
#include <linux/vmalloc.h>
9
#include "core.h"
10
#include "dp_tx.h"
11
#include "dp_rx.h"
12
#include "debug.h"
13
#include "debugfs_htt_stats.h"
14
15
#define HTT_MAX_PRINT_CHAR_PER_ELEM 15
16
17
#define HTT_TLV_HDR_LEN 4
18
19
#define PRINT_ARRAY_TO_BUF(out, buflen, arr, str, len, newline) \
20
do { \
21
int index = 0; u8 i; const char *str_val = str; \
22
const char *new_line = newline; \
23
if (str_val) { \
24
index += scnprintf((out + buflen), \
25
(ATH11K_HTT_STATS_BUF_SIZE - buflen), \
26
"%s = ", str_val); \
27
} \
28
for (i = 0; i < len; i++) { \
29
index += scnprintf((out + buflen) + index, \
30
(ATH11K_HTT_STATS_BUF_SIZE - buflen) - index, \
31
" %u:%u,", i, arr[i]); \
32
} \
33
index += scnprintf((out + buflen) + index, \
34
(ATH11K_HTT_STATS_BUF_SIZE - buflen) - index, \
35
"%s", new_line); \
36
buflen += index; \
37
} while (0)
38
39
static inline void htt_print_stats_string_tlv(const void *tag_buf,
40
u16 tag_len,
41
struct debug_htt_stats_req *stats_req)
42
{
43
const struct htt_stats_string_tlv *htt_stats_buf = tag_buf;
44
u8 *buf = stats_req->buf;
45
u32 len = stats_req->buf_len;
46
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
47
u8 i;
48
49
tag_len = tag_len >> 2;
50
51
len += scnprintf(buf + len, buf_len - len, "HTT_STATS_STRING_TLV:\n");
52
53
len += scnprintf(buf + len, buf_len - len,
54
"data = ");
55
for (i = 0; i < tag_len; i++) {
56
len += scnprintf(buf + len,
57
buf_len - len,
58
"%.*s", 4, (char *)&(htt_stats_buf->data[i]));
59
}
60
/* New lines are added for better display */
61
len += scnprintf(buf + len, buf_len - len, "\n\n");
62
63
if (len >= buf_len)
64
buf[buf_len - 1] = 0;
65
else
66
buf[len] = 0;
67
68
stats_req->buf_len = len;
69
}
70
71
static inline void htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf,
72
struct debug_htt_stats_req *stats_req)
73
{
74
const struct htt_tx_pdev_stats_cmn_tlv *htt_stats_buf = tag_buf;
75
u8 *buf = stats_req->buf;
76
u32 len = stats_req->buf_len;
77
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
78
79
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_CMN_TLV:\n");
80
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
81
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
82
len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",
83
htt_stats_buf->hw_queued);
84
len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",
85
htt_stats_buf->hw_reaped);
86
len += scnprintf(buf + len, buf_len - len, "underrun = %u\n",
87
htt_stats_buf->underrun);
88
len += scnprintf(buf + len, buf_len - len, "hw_paused = %u\n",
89
htt_stats_buf->hw_paused);
90
len += scnprintf(buf + len, buf_len - len, "hw_flush = %u\n",
91
htt_stats_buf->hw_flush);
92
len += scnprintf(buf + len, buf_len - len, "hw_filt = %u\n",
93
htt_stats_buf->hw_filt);
94
len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",
95
htt_stats_buf->tx_abort);
96
len += scnprintf(buf + len, buf_len - len, "mpdu_requeued = %u\n",
97
htt_stats_buf->mpdu_requeued);
98
len += scnprintf(buf + len, buf_len - len, "tx_xretry = %u\n",
99
htt_stats_buf->tx_xretry);
100
len += scnprintf(buf + len, buf_len - len, "data_rc = %u\n",
101
htt_stats_buf->data_rc);
102
len += scnprintf(buf + len, buf_len - len, "mpdu_dropped_xretry = %u\n",
103
htt_stats_buf->mpdu_dropped_xretry);
104
len += scnprintf(buf + len, buf_len - len, "illegal_rate_phy_err = %u\n",
105
htt_stats_buf->illgl_rate_phy_err);
106
len += scnprintf(buf + len, buf_len - len, "cont_xretry = %u\n",
107
htt_stats_buf->cont_xretry);
108
len += scnprintf(buf + len, buf_len - len, "tx_timeout = %u\n",
109
htt_stats_buf->tx_timeout);
110
len += scnprintf(buf + len, buf_len - len, "pdev_resets = %u\n",
111
htt_stats_buf->pdev_resets);
112
len += scnprintf(buf + len, buf_len - len, "phy_underrun = %u\n",
113
htt_stats_buf->phy_underrun);
114
len += scnprintf(buf + len, buf_len - len, "txop_ovf = %u\n",
115
htt_stats_buf->txop_ovf);
116
len += scnprintf(buf + len, buf_len - len, "seq_posted = %u\n",
117
htt_stats_buf->seq_posted);
118
len += scnprintf(buf + len, buf_len - len, "seq_failed_queueing = %u\n",
119
htt_stats_buf->seq_failed_queueing);
120
len += scnprintf(buf + len, buf_len - len, "seq_completed = %u\n",
121
htt_stats_buf->seq_completed);
122
len += scnprintf(buf + len, buf_len - len, "seq_restarted = %u\n",
123
htt_stats_buf->seq_restarted);
124
len += scnprintf(buf + len, buf_len - len, "mu_seq_posted = %u\n",
125
htt_stats_buf->mu_seq_posted);
126
len += scnprintf(buf + len, buf_len - len, "seq_switch_hw_paused = %u\n",
127
htt_stats_buf->seq_switch_hw_paused);
128
len += scnprintf(buf + len, buf_len - len, "next_seq_posted_dsr = %u\n",
129
htt_stats_buf->next_seq_posted_dsr);
130
len += scnprintf(buf + len, buf_len - len, "seq_posted_isr = %u\n",
131
htt_stats_buf->seq_posted_isr);
132
len += scnprintf(buf + len, buf_len - len, "seq_ctrl_cached = %u\n",
133
htt_stats_buf->seq_ctrl_cached);
134
len += scnprintf(buf + len, buf_len - len, "mpdu_count_tqm = %u\n",
135
htt_stats_buf->mpdu_count_tqm);
136
len += scnprintf(buf + len, buf_len - len, "msdu_count_tqm = %u\n",
137
htt_stats_buf->msdu_count_tqm);
138
len += scnprintf(buf + len, buf_len - len, "mpdu_removed_tqm = %u\n",
139
htt_stats_buf->mpdu_removed_tqm);
140
len += scnprintf(buf + len, buf_len - len, "msdu_removed_tqm = %u\n",
141
htt_stats_buf->msdu_removed_tqm);
142
len += scnprintf(buf + len, buf_len - len, "mpdus_sw_flush = %u\n",
143
htt_stats_buf->mpdus_sw_flush);
144
len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",
145
htt_stats_buf->mpdus_hw_filter);
146
len += scnprintf(buf + len, buf_len - len, "mpdus_truncated = %u\n",
147
htt_stats_buf->mpdus_truncated);
148
len += scnprintf(buf + len, buf_len - len, "mpdus_ack_failed = %u\n",
149
htt_stats_buf->mpdus_ack_failed);
150
len += scnprintf(buf + len, buf_len - len, "mpdus_expired = %u\n",
151
htt_stats_buf->mpdus_expired);
152
len += scnprintf(buf + len, buf_len - len, "mpdus_seq_hw_retry = %u\n",
153
htt_stats_buf->mpdus_seq_hw_retry);
154
len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",
155
htt_stats_buf->ack_tlv_proc);
156
len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt_valid = %u\n",
157
htt_stats_buf->coex_abort_mpdu_cnt_valid);
158
len += scnprintf(buf + len, buf_len - len, "coex_abort_mpdu_cnt = %u\n",
159
htt_stats_buf->coex_abort_mpdu_cnt);
160
len += scnprintf(buf + len, buf_len - len, "num_total_ppdus_tried_ota = %u\n",
161
htt_stats_buf->num_total_ppdus_tried_ota);
162
len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_tried_ota = %u\n",
163
htt_stats_buf->num_data_ppdus_tried_ota);
164
len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_enqued = %u\n",
165
htt_stats_buf->local_ctrl_mgmt_enqued);
166
len += scnprintf(buf + len, buf_len - len, "local_ctrl_mgmt_freed = %u\n",
167
htt_stats_buf->local_ctrl_mgmt_freed);
168
len += scnprintf(buf + len, buf_len - len, "local_data_enqued = %u\n",
169
htt_stats_buf->local_data_enqued);
170
len += scnprintf(buf + len, buf_len - len, "local_data_freed = %u\n",
171
htt_stats_buf->local_data_freed);
172
len += scnprintf(buf + len, buf_len - len, "mpdu_tried = %u\n",
173
htt_stats_buf->mpdu_tried);
174
len += scnprintf(buf + len, buf_len - len, "isr_wait_seq_posted = %u\n",
175
htt_stats_buf->isr_wait_seq_posted);
176
len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_low = %u\n",
177
htt_stats_buf->tx_active_dur_us_low);
178
len += scnprintf(buf + len, buf_len - len, "tx_active_dur_us_high = %u\n\n",
179
htt_stats_buf->tx_active_dur_us_high);
180
181
if (len >= buf_len)
182
buf[buf_len - 1] = 0;
183
else
184
buf[len] = 0;
185
186
stats_req->buf_len = len;
187
}
188
189
static inline void
190
htt_print_tx_pdev_stats_urrn_tlv_v(const void *tag_buf,
191
u16 tag_len,
192
struct debug_htt_stats_req *stats_req)
193
{
194
const struct htt_tx_pdev_stats_urrn_tlv_v *htt_stats_buf = tag_buf;
195
u8 *buf = stats_req->buf;
196
u32 len = stats_req->buf_len;
197
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
198
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_URRN_STATS);
199
200
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_URRN_TLV_V:\n");
201
202
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->urrn_stats, "urrn_stats",
203
num_elems, "\n\n");
204
205
if (len >= buf_len)
206
buf[buf_len - 1] = 0;
207
else
208
buf[len] = 0;
209
210
stats_req->buf_len = len;
211
}
212
213
static inline void
214
htt_print_tx_pdev_stats_flush_tlv_v(const void *tag_buf,
215
u16 tag_len,
216
struct debug_htt_stats_req *stats_req)
217
{
218
const struct htt_tx_pdev_stats_flush_tlv_v *htt_stats_buf = tag_buf;
219
u8 *buf = stats_req->buf;
220
u32 len = stats_req->buf_len;
221
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
222
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
223
224
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_FLUSH_TLV_V:\n");
225
226
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->flush_errs, "flush_errs",
227
num_elems, "\n\n");
228
229
if (len >= buf_len)
230
buf[buf_len - 1] = 0;
231
else
232
buf[len] = 0;
233
234
stats_req->buf_len = len;
235
}
236
237
static inline void
238
htt_print_tx_pdev_stats_sifs_tlv_v(const void *tag_buf,
239
u16 tag_len,
240
struct debug_htt_stats_req *stats_req)
241
{
242
const struct htt_tx_pdev_stats_sifs_tlv_v *htt_stats_buf = tag_buf;
243
u8 *buf = stats_req->buf;
244
u32 len = stats_req->buf_len;
245
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
246
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
247
248
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_SIFS_TLV_V:\n");
249
250
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sifs_status, "sifs_status",
251
num_elems, "\n\n");
252
253
if (len >= buf_len)
254
buf[buf_len - 1] = 0;
255
else
256
buf[len] = 0;
257
258
stats_req->buf_len = len;
259
}
260
261
static inline void
262
htt_print_tx_pdev_stats_phy_err_tlv_v(const void *tag_buf,
263
u16 tag_len,
264
struct debug_htt_stats_req *stats_req)
265
{
266
const struct htt_tx_pdev_stats_phy_err_tlv_v *htt_stats_buf = tag_buf;
267
u8 *buf = stats_req->buf;
268
u32 len = stats_req->buf_len;
269
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
270
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_PHY_ERR_STATS);
271
272
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:\n");
273
274
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->phy_errs, "phy_errs",
275
num_elems, "\n\n");
276
277
if (len >= buf_len)
278
buf[buf_len - 1] = 0;
279
else
280
buf[len] = 0;
281
282
stats_req->buf_len = len;
283
}
284
285
static inline void
286
htt_print_tx_pdev_stats_sifs_hist_tlv_v(const void *tag_buf,
287
u16 tag_len,
288
struct debug_htt_stats_req *stats_req)
289
{
290
const struct htt_tx_pdev_stats_sifs_hist_tlv_v *htt_stats_buf = tag_buf;
291
u8 *buf = stats_req->buf;
292
u32 len = stats_req->buf_len;
293
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
294
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS);
295
296
len += scnprintf(buf + len, buf_len - len,
297
"HTT_TX_PDEV_STATS_SIFS_HIST_TLV_V:\n");
298
299
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sifs_hist_status,
300
"sifs_hist_status", num_elems, "\n\n");
301
302
if (len >= buf_len)
303
buf[buf_len - 1] = 0;
304
else
305
buf[len] = 0;
306
307
stats_req->buf_len = len;
308
}
309
310
static inline void
311
htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(const void *tag_buf,
312
struct debug_htt_stats_req *stats_req)
313
{
314
const struct htt_tx_pdev_stats_tx_ppdu_stats_tlv_v *htt_stats_buf = tag_buf;
315
u8 *buf = stats_req->buf;
316
u32 len = stats_req->buf_len;
317
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
318
319
len += scnprintf(buf + len, buf_len - len,
320
"HTT_TX_PDEV_STATS_TX_PPDU_STATS_TLV_V:\n");
321
322
len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_legacy_su = %u\n",
323
htt_stats_buf->num_data_ppdus_legacy_su);
324
325
len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ac_su = %u\n",
326
htt_stats_buf->num_data_ppdus_ac_su);
327
328
len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ax_su = %u\n",
329
htt_stats_buf->num_data_ppdus_ax_su);
330
331
len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ac_su_txbf = %u\n",
332
htt_stats_buf->num_data_ppdus_ac_su_txbf);
333
334
len += scnprintf(buf + len, buf_len - len, "num_data_ppdus_ax_su_txbf = %u\n\n",
335
htt_stats_buf->num_data_ppdus_ax_su_txbf);
336
337
if (len >= buf_len)
338
buf[buf_len - 1] = 0;
339
else
340
buf[len] = 0;
341
342
stats_req->buf_len = len;
343
}
344
345
static inline void
346
htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(const void *tag_buf,
347
u16 tag_len,
348
struct debug_htt_stats_req *stats_req)
349
{
350
const struct htt_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v *htt_stats_buf = tag_buf;
351
u8 *buf = stats_req->buf;
352
u32 len = stats_req->buf_len;
353
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
354
u32 num_elements = ((tag_len - sizeof(htt_stats_buf->hist_bin_size)) >> 2);
355
356
len += scnprintf(buf + len, buf_len - len,
357
"HTT_TX_PDEV_STATS_TRIED_MPDU_CNT_HIST_TLV_V:\n");
358
len += scnprintf(buf + len, buf_len - len, "TRIED_MPDU_CNT_HIST_BIN_SIZE : %u\n",
359
htt_stats_buf->hist_bin_size);
360
361
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tried_mpdu_cnt_hist,
362
"tried_mpdu_cnt_hist", num_elements, "\n\n");
363
364
if (len >= buf_len)
365
buf[buf_len - 1] = 0;
366
else
367
buf[len] = 0;
368
369
stats_req->buf_len = len;
370
}
371
372
static inline void htt_print_hw_stats_intr_misc_tlv(const void *tag_buf,
373
struct debug_htt_stats_req *stats_req)
374
{
375
const struct htt_hw_stats_intr_misc_tlv *htt_stats_buf = tag_buf;
376
u8 *buf = stats_req->buf;
377
u32 len = stats_req->buf_len;
378
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
379
char hw_intr_name[HTT_STATS_MAX_HW_INTR_NAME_LEN + 1] = {};
380
381
len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_INTR_MISC_TLV:\n");
382
memcpy(hw_intr_name, &(htt_stats_buf->hw_intr_name[0]),
383
HTT_STATS_MAX_HW_INTR_NAME_LEN);
384
len += scnprintf(buf + len, buf_len - len, "hw_intr_name = %s\n", hw_intr_name);
385
len += scnprintf(buf + len, buf_len - len, "mask = %u\n",
386
htt_stats_buf->mask);
387
len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",
388
htt_stats_buf->count);
389
390
if (len >= buf_len)
391
buf[buf_len - 1] = 0;
392
else
393
buf[len] = 0;
394
395
stats_req->buf_len = len;
396
}
397
398
static inline void
399
htt_print_hw_stats_wd_timeout_tlv(const void *tag_buf,
400
struct debug_htt_stats_req *stats_req)
401
{
402
const struct htt_hw_stats_wd_timeout_tlv *htt_stats_buf = tag_buf;
403
u8 *buf = stats_req->buf;
404
u32 len = stats_req->buf_len;
405
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
406
char hw_module_name[HTT_STATS_MAX_HW_MODULE_NAME_LEN + 1] = {};
407
408
len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WD_TIMEOUT_TLV:\n");
409
memcpy(hw_module_name, &(htt_stats_buf->hw_module_name[0]),
410
HTT_STATS_MAX_HW_MODULE_NAME_LEN);
411
len += scnprintf(buf + len, buf_len - len, "hw_module_name = %s\n",
412
hw_module_name);
413
len += scnprintf(buf + len, buf_len - len, "count = %u\n",
414
htt_stats_buf->count);
415
416
if (len >= buf_len)
417
buf[buf_len - 1] = 0;
418
else
419
buf[len] = 0;
420
421
stats_req->buf_len = len;
422
}
423
424
static inline void htt_print_hw_stats_pdev_errs_tlv(const void *tag_buf,
425
struct debug_htt_stats_req *stats_req)
426
{
427
const struct htt_hw_stats_pdev_errs_tlv *htt_stats_buf = tag_buf;
428
u8 *buf = stats_req->buf;
429
u32 len = stats_req->buf_len;
430
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
431
432
len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_PDEV_ERRS_TLV:\n");
433
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
434
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
435
len += scnprintf(buf + len, buf_len - len, "tx_abort = %u\n",
436
htt_stats_buf->tx_abort);
437
len += scnprintf(buf + len, buf_len - len, "tx_abort_fail_count = %u\n",
438
htt_stats_buf->tx_abort_fail_count);
439
len += scnprintf(buf + len, buf_len - len, "rx_abort = %u\n",
440
htt_stats_buf->rx_abort);
441
len += scnprintf(buf + len, buf_len - len, "rx_abort_fail_count = %u\n",
442
htt_stats_buf->rx_abort_fail_count);
443
len += scnprintf(buf + len, buf_len - len, "warm_reset = %u\n",
444
htt_stats_buf->warm_reset);
445
len += scnprintf(buf + len, buf_len - len, "cold_reset = %u\n",
446
htt_stats_buf->cold_reset);
447
len += scnprintf(buf + len, buf_len - len, "tx_flush = %u\n",
448
htt_stats_buf->tx_flush);
449
len += scnprintf(buf + len, buf_len - len, "tx_glb_reset = %u\n",
450
htt_stats_buf->tx_glb_reset);
451
len += scnprintf(buf + len, buf_len - len, "tx_txq_reset = %u\n",
452
htt_stats_buf->tx_txq_reset);
453
len += scnprintf(buf + len, buf_len - len, "rx_timeout_reset = %u\n\n",
454
htt_stats_buf->rx_timeout_reset);
455
456
if (len >= buf_len)
457
buf[buf_len - 1] = 0;
458
else
459
buf[len] = 0;
460
461
stats_req->buf_len = len;
462
}
463
464
static inline void htt_print_msdu_flow_stats_tlv(const void *tag_buf,
465
struct debug_htt_stats_req *stats_req)
466
{
467
const struct htt_msdu_flow_stats_tlv *htt_stats_buf = tag_buf;
468
u8 *buf = stats_req->buf;
469
u32 len = stats_req->buf_len;
470
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
471
472
len += scnprintf(buf + len, buf_len - len, "HTT_MSDU_FLOW_STATS_TLV:\n");
473
len += scnprintf(buf + len, buf_len - len, "last_update_timestamp = %u\n",
474
htt_stats_buf->last_update_timestamp);
475
len += scnprintf(buf + len, buf_len - len, "last_add_timestamp = %u\n",
476
htt_stats_buf->last_add_timestamp);
477
len += scnprintf(buf + len, buf_len - len, "last_remove_timestamp = %u\n",
478
htt_stats_buf->last_remove_timestamp);
479
len += scnprintf(buf + len, buf_len - len, "total_processed_msdu_count = %u\n",
480
htt_stats_buf->total_processed_msdu_count);
481
len += scnprintf(buf + len, buf_len - len, "cur_msdu_count_in_flowq = %u\n",
482
htt_stats_buf->cur_msdu_count_in_flowq);
483
len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",
484
htt_stats_buf->sw_peer_id);
485
len += scnprintf(buf + len, buf_len - len, "tx_flow_no = %lu\n",
486
FIELD_GET(HTT_MSDU_FLOW_STATS_TX_FLOW_NO,
487
htt_stats_buf->tx_flow_no__tid_num__drop_rule));
488
len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",
489
FIELD_GET(HTT_MSDU_FLOW_STATS_TID_NUM,
490
htt_stats_buf->tx_flow_no__tid_num__drop_rule));
491
len += scnprintf(buf + len, buf_len - len, "drop_rule = %lu\n",
492
FIELD_GET(HTT_MSDU_FLOW_STATS_DROP_RULE,
493
htt_stats_buf->tx_flow_no__tid_num__drop_rule));
494
len += scnprintf(buf + len, buf_len - len, "last_cycle_enqueue_count = %u\n",
495
htt_stats_buf->last_cycle_enqueue_count);
496
len += scnprintf(buf + len, buf_len - len, "last_cycle_dequeue_count = %u\n",
497
htt_stats_buf->last_cycle_dequeue_count);
498
len += scnprintf(buf + len, buf_len - len, "last_cycle_drop_count = %u\n",
499
htt_stats_buf->last_cycle_drop_count);
500
len += scnprintf(buf + len, buf_len - len, "current_drop_th = %u\n\n",
501
htt_stats_buf->current_drop_th);
502
503
if (len >= buf_len)
504
buf[buf_len - 1] = 0;
505
else
506
buf[len] = 0;
507
508
stats_req->buf_len = len;
509
}
510
511
static inline void htt_print_tx_tid_stats_tlv(const void *tag_buf,
512
struct debug_htt_stats_req *stats_req)
513
{
514
const struct htt_tx_tid_stats_tlv *htt_stats_buf = tag_buf;
515
u8 *buf = stats_req->buf;
516
u32 len = stats_req->buf_len;
517
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
518
char tid_name[MAX_HTT_TID_NAME + 1] = {};
519
520
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TID_STATS_TLV:\n");
521
memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);
522
len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);
523
len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",
524
FIELD_GET(HTT_TX_TID_STATS_SW_PEER_ID,
525
htt_stats_buf->sw_peer_id__tid_num));
526
len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",
527
FIELD_GET(HTT_TX_TID_STATS_TID_NUM,
528
htt_stats_buf->sw_peer_id__tid_num));
529
len += scnprintf(buf + len, buf_len - len, "num_sched_pending = %lu\n",
530
FIELD_GET(HTT_TX_TID_STATS_NUM_SCHED_PENDING,
531
htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));
532
len += scnprintf(buf + len, buf_len - len, "num_ppdu_in_hwq = %lu\n",
533
FIELD_GET(HTT_TX_TID_STATS_NUM_PPDU_IN_HWQ,
534
htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));
535
len += scnprintf(buf + len, buf_len - len, "tid_flags = 0x%x\n",
536
htt_stats_buf->tid_flags);
537
len += scnprintf(buf + len, buf_len - len, "hw_queued = %u\n",
538
htt_stats_buf->hw_queued);
539
len += scnprintf(buf + len, buf_len - len, "hw_reaped = %u\n",
540
htt_stats_buf->hw_reaped);
541
len += scnprintf(buf + len, buf_len - len, "mpdus_hw_filter = %u\n",
542
htt_stats_buf->mpdus_hw_filter);
543
len += scnprintf(buf + len, buf_len - len, "qdepth_bytes = %u\n",
544
htt_stats_buf->qdepth_bytes);
545
len += scnprintf(buf + len, buf_len - len, "qdepth_num_msdu = %u\n",
546
htt_stats_buf->qdepth_num_msdu);
547
len += scnprintf(buf + len, buf_len - len, "qdepth_num_mpdu = %u\n",
548
htt_stats_buf->qdepth_num_mpdu);
549
len += scnprintf(buf + len, buf_len - len, "last_scheduled_tsmp = %u\n",
550
htt_stats_buf->last_scheduled_tsmp);
551
len += scnprintf(buf + len, buf_len - len, "pause_module_id = %u\n",
552
htt_stats_buf->pause_module_id);
553
len += scnprintf(buf + len, buf_len - len, "block_module_id = %u\n\n",
554
htt_stats_buf->block_module_id);
555
556
if (len >= buf_len)
557
buf[buf_len - 1] = 0;
558
else
559
buf[len] = 0;
560
561
stats_req->buf_len = len;
562
}
563
564
static inline void htt_print_tx_tid_stats_v1_tlv(const void *tag_buf,
565
struct debug_htt_stats_req *stats_req)
566
{
567
const struct htt_tx_tid_stats_v1_tlv *htt_stats_buf = tag_buf;
568
u8 *buf = stats_req->buf;
569
u32 len = stats_req->buf_len;
570
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
571
char tid_name[MAX_HTT_TID_NAME + 1] = {};
572
573
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TID_STATS_V1_TLV:\n");
574
memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);
575
len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);
576
len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",
577
FIELD_GET(HTT_TX_TID_STATS_V1_SW_PEER_ID,
578
htt_stats_buf->sw_peer_id__tid_num));
579
len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",
580
FIELD_GET(HTT_TX_TID_STATS_V1_TID_NUM,
581
htt_stats_buf->sw_peer_id__tid_num));
582
len += scnprintf(buf + len, buf_len - len, "num_sched_pending = %lu\n",
583
FIELD_GET(HTT_TX_TID_STATS_V1_NUM_SCHED_PENDING,
584
htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));
585
len += scnprintf(buf + len, buf_len - len, "num_ppdu_in_hwq = %lu\n",
586
FIELD_GET(HTT_TX_TID_STATS_V1_NUM_PPDU_IN_HWQ,
587
htt_stats_buf->num_sched_pending__num_ppdu_in_hwq));
588
len += scnprintf(buf + len, buf_len - len, "tid_flags = 0x%x\n",
589
htt_stats_buf->tid_flags);
590
len += scnprintf(buf + len, buf_len - len, "max_qdepth_bytes = %u\n",
591
htt_stats_buf->max_qdepth_bytes);
592
len += scnprintf(buf + len, buf_len - len, "max_qdepth_n_msdus = %u\n",
593
htt_stats_buf->max_qdepth_n_msdus);
594
len += scnprintf(buf + len, buf_len - len, "rsvd = %u\n",
595
htt_stats_buf->rsvd);
596
len += scnprintf(buf + len, buf_len - len, "qdepth_bytes = %u\n",
597
htt_stats_buf->qdepth_bytes);
598
len += scnprintf(buf + len, buf_len - len, "qdepth_num_msdu = %u\n",
599
htt_stats_buf->qdepth_num_msdu);
600
len += scnprintf(buf + len, buf_len - len, "qdepth_num_mpdu = %u\n",
601
htt_stats_buf->qdepth_num_mpdu);
602
len += scnprintf(buf + len, buf_len - len, "last_scheduled_tsmp = %u\n",
603
htt_stats_buf->last_scheduled_tsmp);
604
len += scnprintf(buf + len, buf_len - len, "pause_module_id = %u\n",
605
htt_stats_buf->pause_module_id);
606
len += scnprintf(buf + len, buf_len - len, "block_module_id = %u\n",
607
htt_stats_buf->block_module_id);
608
len += scnprintf(buf + len, buf_len - len, "allow_n_flags = 0x%x\n",
609
htt_stats_buf->allow_n_flags);
610
len += scnprintf(buf + len, buf_len - len, "sendn_frms_allowed = %u\n\n",
611
htt_stats_buf->sendn_frms_allowed);
612
613
if (len >= buf_len)
614
buf[buf_len - 1] = 0;
615
else
616
buf[len] = 0;
617
618
stats_req->buf_len = len;
619
}
620
621
static inline void htt_print_rx_tid_stats_tlv(const void *tag_buf,
622
struct debug_htt_stats_req *stats_req)
623
{
624
const struct htt_rx_tid_stats_tlv *htt_stats_buf = tag_buf;
625
u8 *buf = stats_req->buf;
626
u32 len = stats_req->buf_len;
627
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
628
char tid_name[MAX_HTT_TID_NAME + 1] = {};
629
630
len += scnprintf(buf + len, buf_len - len, "HTT_RX_TID_STATS_TLV:\n");
631
len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %lu\n",
632
FIELD_GET(HTT_RX_TID_STATS_SW_PEER_ID,
633
htt_stats_buf->sw_peer_id__tid_num));
634
len += scnprintf(buf + len, buf_len - len, "tid_num = %lu\n",
635
FIELD_GET(HTT_RX_TID_STATS_TID_NUM,
636
htt_stats_buf->sw_peer_id__tid_num));
637
memcpy(tid_name, &(htt_stats_buf->tid_name[0]), MAX_HTT_TID_NAME);
638
len += scnprintf(buf + len, buf_len - len, "tid_name = %s\n", tid_name);
639
len += scnprintf(buf + len, buf_len - len, "dup_in_reorder = %u\n",
640
htt_stats_buf->dup_in_reorder);
641
len += scnprintf(buf + len, buf_len - len, "dup_past_outside_window = %u\n",
642
htt_stats_buf->dup_past_outside_window);
643
len += scnprintf(buf + len, buf_len - len, "dup_past_within_window = %u\n",
644
htt_stats_buf->dup_past_within_window);
645
len += scnprintf(buf + len, buf_len - len, "rxdesc_err_decrypt = %u\n\n",
646
htt_stats_buf->rxdesc_err_decrypt);
647
648
if (len >= buf_len)
649
buf[buf_len - 1] = 0;
650
else
651
buf[len] = 0;
652
653
stats_req->buf_len = len;
654
}
655
656
static inline void htt_print_counter_tlv(const void *tag_buf,
657
struct debug_htt_stats_req *stats_req)
658
{
659
const struct htt_counter_tlv *htt_stats_buf = tag_buf;
660
u8 *buf = stats_req->buf;
661
u32 len = stats_req->buf_len;
662
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
663
664
len += scnprintf(buf + len, buf_len - len, "HTT_COUNTER_TLV:\n");
665
666
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->counter_name,
667
"counter_name",
668
HTT_MAX_COUNTER_NAME, "\n");
669
len += scnprintf(buf + len, buf_len - len, "count = %u\n\n",
670
htt_stats_buf->count);
671
672
if (len >= buf_len)
673
buf[buf_len - 1] = 0;
674
else
675
buf[len] = 0;
676
677
stats_req->buf_len = len;
678
}
679
680
static inline void htt_print_peer_stats_cmn_tlv(const void *tag_buf,
681
struct debug_htt_stats_req *stats_req)
682
{
683
const struct htt_peer_stats_cmn_tlv *htt_stats_buf = tag_buf;
684
u8 *buf = stats_req->buf;
685
u32 len = stats_req->buf_len;
686
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
687
688
len += scnprintf(buf + len, buf_len - len, "HTT_PEER_STATS_CMN_TLV:\n");
689
len += scnprintf(buf + len, buf_len - len, "ppdu_cnt = %u\n",
690
htt_stats_buf->ppdu_cnt);
691
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt = %u\n",
692
htt_stats_buf->mpdu_cnt);
693
len += scnprintf(buf + len, buf_len - len, "msdu_cnt = %u\n",
694
htt_stats_buf->msdu_cnt);
695
len += scnprintf(buf + len, buf_len - len, "pause_bitmap = %u\n",
696
htt_stats_buf->pause_bitmap);
697
len += scnprintf(buf + len, buf_len - len, "block_bitmap = %u\n",
698
htt_stats_buf->block_bitmap);
699
len += scnprintf(buf + len, buf_len - len, "last_rssi = %d\n",
700
htt_stats_buf->rssi);
701
len += scnprintf(buf + len, buf_len - len, "enqueued_count = %llu\n",
702
htt_stats_buf->peer_enqueued_count_low |
703
((u64)htt_stats_buf->peer_enqueued_count_high << 32));
704
len += scnprintf(buf + len, buf_len - len, "dequeued_count = %llu\n",
705
htt_stats_buf->peer_dequeued_count_low |
706
((u64)htt_stats_buf->peer_dequeued_count_high << 32));
707
len += scnprintf(buf + len, buf_len - len, "dropped_count = %llu\n",
708
htt_stats_buf->peer_dropped_count_low |
709
((u64)htt_stats_buf->peer_dropped_count_high << 32));
710
len += scnprintf(buf + len, buf_len - len, "transmitted_ppdu_bytes = %llu\n",
711
htt_stats_buf->ppdu_transmitted_bytes_low |
712
((u64)htt_stats_buf->ppdu_transmitted_bytes_high << 32));
713
len += scnprintf(buf + len, buf_len - len, "ttl_removed_count = %u\n",
714
htt_stats_buf->peer_ttl_removed_count);
715
len += scnprintf(buf + len, buf_len - len, "inactive_time = %u\n\n",
716
htt_stats_buf->inactive_time);
717
718
if (len >= buf_len)
719
buf[buf_len - 1] = 0;
720
else
721
buf[len] = 0;
722
723
stats_req->buf_len = len;
724
}
725
726
static inline void htt_print_peer_details_tlv(const void *tag_buf,
727
struct debug_htt_stats_req *stats_req)
728
{
729
const struct htt_peer_details_tlv *htt_stats_buf = tag_buf;
730
u8 *buf = stats_req->buf;
731
u32 len = stats_req->buf_len;
732
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
733
734
len += scnprintf(buf + len, buf_len - len, "HTT_PEER_DETAILS_TLV:\n");
735
len += scnprintf(buf + len, buf_len - len, "peer_type = %u\n",
736
htt_stats_buf->peer_type);
737
len += scnprintf(buf + len, buf_len - len, "sw_peer_id = %u\n",
738
htt_stats_buf->sw_peer_id);
739
len += scnprintf(buf + len, buf_len - len, "vdev_id = %lu\n",
740
FIELD_GET(HTT_PEER_DETAILS_VDEV_ID,
741
htt_stats_buf->vdev_pdev_ast_idx));
742
len += scnprintf(buf + len, buf_len - len, "pdev_id = %lu\n",
743
FIELD_GET(HTT_PEER_DETAILS_PDEV_ID,
744
htt_stats_buf->vdev_pdev_ast_idx));
745
len += scnprintf(buf + len, buf_len - len, "ast_idx = %lu\n",
746
FIELD_GET(HTT_PEER_DETAILS_AST_IDX,
747
htt_stats_buf->vdev_pdev_ast_idx));
748
len += scnprintf(buf + len, buf_len - len,
749
"mac_addr = %02lx:%02lx:%02lx:%02lx:%02lx:%02lx\n",
750
FIELD_GET(HTT_MAC_ADDR_L32_0,
751
htt_stats_buf->mac_addr.mac_addr_l32),
752
FIELD_GET(HTT_MAC_ADDR_L32_1,
753
htt_stats_buf->mac_addr.mac_addr_l32),
754
FIELD_GET(HTT_MAC_ADDR_L32_2,
755
htt_stats_buf->mac_addr.mac_addr_l32),
756
FIELD_GET(HTT_MAC_ADDR_L32_3,
757
htt_stats_buf->mac_addr.mac_addr_l32),
758
FIELD_GET(HTT_MAC_ADDR_H16_0,
759
htt_stats_buf->mac_addr.mac_addr_h16),
760
FIELD_GET(HTT_MAC_ADDR_H16_1,
761
htt_stats_buf->mac_addr.mac_addr_h16));
762
len += scnprintf(buf + len, buf_len - len, "peer_flags = 0x%x\n",
763
htt_stats_buf->peer_flags);
764
len += scnprintf(buf + len, buf_len - len, "qpeer_flags = 0x%x\n\n",
765
htt_stats_buf->qpeer_flags);
766
767
if (len >= buf_len)
768
buf[buf_len - 1] = 0;
769
else
770
buf[len] = 0;
771
772
stats_req->buf_len = len;
773
}
774
775
static inline void htt_print_tx_peer_rate_stats_tlv(const void *tag_buf,
776
struct debug_htt_stats_req *stats_req)
777
{
778
const struct htt_tx_peer_rate_stats_tlv *htt_stats_buf = tag_buf;
779
u8 *buf = stats_req->buf;
780
u32 len = stats_req->buf_len;
781
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
782
u8 j;
783
784
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PEER_RATE_STATS_TLV:\n");
785
len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",
786
htt_stats_buf->tx_ldpc);
787
len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",
788
htt_stats_buf->rts_cnt);
789
len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",
790
htt_stats_buf->ack_rssi);
791
792
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mcs, "tx_mcs",
793
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
794
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_su_mcs, "tx_su_mcs",
795
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
796
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mu_mcs, "tx_mu_mcs",
797
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
798
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_nss, "tx_nss",
799
HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
800
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_bw, "tx_bw",
801
HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
802
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_stbc, "tx_stbc",
803
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
804
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_pream, "tx_pream",
805
HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");
806
807
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
808
len += scnprintf(buf + len, buf_len - len,
809
"tx_gi[%u] = ", j);
810
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_gi[j], NULL,
811
HTT_TX_PEER_STATS_NUM_MCS_COUNTERS, "\n");
812
}
813
814
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_dcm, "tx_dcm",
815
HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");
816
817
if (len >= buf_len)
818
buf[buf_len - 1] = 0;
819
else
820
buf[len] = 0;
821
822
stats_req->buf_len = len;
823
}
824
825
static inline void htt_print_rx_peer_rate_stats_tlv(const void *tag_buf,
826
struct debug_htt_stats_req *stats_req)
827
{
828
const struct htt_rx_peer_rate_stats_tlv *htt_stats_buf = tag_buf;
829
u8 *buf = stats_req->buf;
830
u32 len = stats_req->buf_len;
831
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
832
u8 j;
833
834
len += scnprintf(buf + len, buf_len - len, "HTT_RX_PEER_RATE_STATS_TLV:\n");
835
len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",
836
htt_stats_buf->nsts);
837
len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",
838
htt_stats_buf->rx_ldpc);
839
len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",
840
htt_stats_buf->rts_cnt);
841
len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",
842
htt_stats_buf->rssi_mgmt);
843
len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",
844
htt_stats_buf->rssi_data);
845
len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",
846
htt_stats_buf->rssi_comb);
847
848
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs, "rx_mcs",
849
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
850
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_nss, "rx_nss",
851
HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
852
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_dcm, "rx_dcm",
853
HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");
854
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc, "rx_stbc",
855
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
856
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_bw, "rx_bw",
857
HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
858
859
for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++) {
860
len += scnprintf(buf + len, (buf_len - len),
861
"rssi_chain[%u] = ", j);
862
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain[j], NULL,
863
HTT_RX_PEER_STATS_NUM_BW_COUNTERS, "\n");
864
}
865
866
for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
867
len += scnprintf(buf + len, (buf_len - len),
868
"rx_gi[%u] = ", j);
869
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi[j], NULL,
870
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
871
}
872
873
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_pream, "rx_pream",
874
HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");
875
876
if (len >= buf_len)
877
buf[buf_len - 1] = 0;
878
else
879
buf[len] = 0;
880
881
stats_req->buf_len = len;
882
}
883
884
static inline void
885
htt_print_tx_hwq_mu_mimo_sch_stats_tlv(const void *tag_buf,
886
struct debug_htt_stats_req *stats_req)
887
{
888
const struct htt_tx_hwq_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;
889
u8 *buf = stats_req->buf;
890
u32 len = stats_req->buf_len;
891
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
892
893
len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:\n");
894
len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",
895
htt_stats_buf->mu_mimo_sch_posted);
896
len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",
897
htt_stats_buf->mu_mimo_sch_failed);
898
len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n\n",
899
htt_stats_buf->mu_mimo_ppdu_posted);
900
901
if (len >= buf_len)
902
buf[buf_len - 1] = 0;
903
else
904
buf[len] = 0;
905
906
stats_req->buf_len = len;
907
}
908
909
static inline void
910
htt_print_tx_hwq_mu_mimo_mpdu_stats_tlv(const void *tag_buf,
911
struct debug_htt_stats_req *stats_req)
912
{
913
const struct htt_tx_hwq_mu_mimo_mpdu_stats_tlv *htt_stats_buf = tag_buf;
914
u8 *buf = stats_req->buf;
915
u32 len = stats_req->buf_len;
916
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
917
918
len += scnprintf(buf + len, buf_len - len,
919
"HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:\n");
920
len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_queued_usr = %u\n",
921
htt_stats_buf->mu_mimo_mpdus_queued_usr);
922
len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_tried_usr = %u\n",
923
htt_stats_buf->mu_mimo_mpdus_tried_usr);
924
len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_failed_usr = %u\n",
925
htt_stats_buf->mu_mimo_mpdus_failed_usr);
926
len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdus_requeued_usr = %u\n",
927
htt_stats_buf->mu_mimo_mpdus_requeued_usr);
928
len += scnprintf(buf + len, buf_len - len, "mu_mimo_err_no_ba_usr = %u\n",
929
htt_stats_buf->mu_mimo_err_no_ba_usr);
930
len += scnprintf(buf + len, buf_len - len, "mu_mimo_mpdu_underrun_usr = %u\n",
931
htt_stats_buf->mu_mimo_mpdu_underrun_usr);
932
len += scnprintf(buf + len, buf_len - len, "mu_mimo_ampdu_underrun_usr = %u\n\n",
933
htt_stats_buf->mu_mimo_ampdu_underrun_usr);
934
935
if (len >= buf_len)
936
buf[buf_len - 1] = 0;
937
else
938
buf[len] = 0;
939
940
stats_req->buf_len = len;
941
}
942
943
static inline void
944
htt_print_tx_hwq_mu_mimo_cmn_stats_tlv(const void *tag_buf,
945
struct debug_htt_stats_req *stats_req)
946
{
947
const struct htt_tx_hwq_mu_mimo_cmn_stats_tlv *htt_stats_buf = tag_buf;
948
u8 *buf = stats_req->buf;
949
u32 len = stats_req->buf_len;
950
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
951
952
len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:\n");
953
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
954
FIELD_GET(HTT_TX_HWQ_STATS_MAC_ID,
955
htt_stats_buf->mac_id__hwq_id__word));
956
len += scnprintf(buf + len, buf_len - len, "hwq_id = %lu\n\n",
957
FIELD_GET(HTT_TX_HWQ_STATS_HWQ_ID,
958
htt_stats_buf->mac_id__hwq_id__word));
959
960
if (len >= buf_len)
961
buf[buf_len - 1] = 0;
962
else
963
buf[len] = 0;
964
965
stats_req->buf_len = len;
966
}
967
968
static inline void
969
htt_print_tx_hwq_stats_cmn_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req)
970
{
971
const struct htt_tx_hwq_stats_cmn_tlv *htt_stats_buf = tag_buf;
972
u8 *buf = stats_req->buf;
973
u32 len = stats_req->buf_len;
974
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
975
976
/* TODO: HKDBG */
977
len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_STATS_CMN_TLV:\n");
978
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
979
FIELD_GET(HTT_TX_HWQ_STATS_MAC_ID,
980
htt_stats_buf->mac_id__hwq_id__word));
981
len += scnprintf(buf + len, buf_len - len, "hwq_id = %lu\n",
982
FIELD_GET(HTT_TX_HWQ_STATS_HWQ_ID,
983
htt_stats_buf->mac_id__hwq_id__word));
984
len += scnprintf(buf + len, buf_len - len, "xretry = %u\n",
985
htt_stats_buf->xretry);
986
len += scnprintf(buf + len, buf_len - len, "underrun_cnt = %u\n",
987
htt_stats_buf->underrun_cnt);
988
len += scnprintf(buf + len, buf_len - len, "flush_cnt = %u\n",
989
htt_stats_buf->flush_cnt);
990
len += scnprintf(buf + len, buf_len - len, "filt_cnt = %u\n",
991
htt_stats_buf->filt_cnt);
992
len += scnprintf(buf + len, buf_len - len, "null_mpdu_bmap = %u\n",
993
htt_stats_buf->null_mpdu_bmap);
994
len += scnprintf(buf + len, buf_len - len, "user_ack_failure = %u\n",
995
htt_stats_buf->user_ack_failure);
996
len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",
997
htt_stats_buf->ack_tlv_proc);
998
len += scnprintf(buf + len, buf_len - len, "sched_id_proc = %u\n",
999
htt_stats_buf->sched_id_proc);
1000
len += scnprintf(buf + len, buf_len - len, "null_mpdu_tx_count = %u\n",
1001
htt_stats_buf->null_mpdu_tx_count);
1002
len += scnprintf(buf + len, buf_len - len, "mpdu_bmap_not_recvd = %u\n",
1003
htt_stats_buf->mpdu_bmap_not_recvd);
1004
len += scnprintf(buf + len, buf_len - len, "num_bar = %u\n",
1005
htt_stats_buf->num_bar);
1006
len += scnprintf(buf + len, buf_len - len, "rts = %u\n",
1007
htt_stats_buf->rts);
1008
len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",
1009
htt_stats_buf->cts2self);
1010
len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",
1011
htt_stats_buf->qos_null);
1012
len += scnprintf(buf + len, buf_len - len, "mpdu_tried_cnt = %u\n",
1013
htt_stats_buf->mpdu_tried_cnt);
1014
len += scnprintf(buf + len, buf_len - len, "mpdu_queued_cnt = %u\n",
1015
htt_stats_buf->mpdu_queued_cnt);
1016
len += scnprintf(buf + len, buf_len - len, "mpdu_ack_fail_cnt = %u\n",
1017
htt_stats_buf->mpdu_ack_fail_cnt);
1018
len += scnprintf(buf + len, buf_len - len, "mpdu_filt_cnt = %u\n",
1019
htt_stats_buf->mpdu_filt_cnt);
1020
len += scnprintf(buf + len, buf_len - len, "false_mpdu_ack_count = %u\n",
1021
htt_stats_buf->false_mpdu_ack_count);
1022
len += scnprintf(buf + len, buf_len - len, "txq_timeout = %u\n\n",
1023
htt_stats_buf->txq_timeout);
1024
1025
if (len >= buf_len)
1026
buf[buf_len - 1] = 0;
1027
else
1028
buf[len] = 0;
1029
1030
stats_req->buf_len = len;
1031
}
1032
1033
static inline void
1034
htt_print_tx_hwq_difs_latency_stats_tlv_v(const void *tag_buf,
1035
u16 tag_len,
1036
struct debug_htt_stats_req *stats_req)
1037
{
1038
const struct htt_tx_hwq_difs_latency_stats_tlv_v *htt_stats_buf = tag_buf;
1039
u8 *buf = stats_req->buf;
1040
u32 len = stats_req->buf_len;
1041
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1042
u16 data_len = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
1043
1044
len += scnprintf(buf + len, buf_len - len,
1045
"HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:\n");
1046
len += scnprintf(buf + len, buf_len - len, "hist_intvl = %u\n",
1047
htt_stats_buf->hist_intvl);
1048
1049
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->difs_latency_hist,
1050
"difs_latency_hist", data_len, "\n\n");
1051
1052
if (len >= buf_len)
1053
buf[buf_len - 1] = 0;
1054
else
1055
buf[len] = 0;
1056
1057
stats_req->buf_len = len;
1058
}
1059
1060
static inline void
1061
htt_print_tx_hwq_cmd_result_stats_tlv_v(const void *tag_buf,
1062
u16 tag_len,
1063
struct debug_htt_stats_req *stats_req)
1064
{
1065
const struct htt_tx_hwq_cmd_result_stats_tlv_v *htt_stats_buf = tag_buf;
1066
u8 *buf = stats_req->buf;
1067
u32 len = stats_req->buf_len;
1068
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1069
u16 data_len;
1070
1071
data_len = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
1072
1073
len += scnprintf(buf + len, buf_len - len,
1074
"HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:\n");
1075
1076
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->cmd_result, "cmd_result",
1077
data_len, "\n\n");
1078
1079
if (len >= buf_len)
1080
buf[buf_len - 1] = 0;
1081
else
1082
buf[len] = 0;
1083
1084
stats_req->buf_len = len;
1085
}
1086
1087
static inline void
1088
htt_print_tx_hwq_cmd_stall_stats_tlv_v(const void *tag_buf,
1089
u16 tag_len,
1090
struct debug_htt_stats_req *stats_req)
1091
{
1092
const struct htt_tx_hwq_cmd_stall_stats_tlv_v *htt_stats_buf = tag_buf;
1093
u8 *buf = stats_req->buf;
1094
u32 len = stats_req->buf_len;
1095
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1096
u16 num_elems;
1097
1098
num_elems = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_CMD_STALL_STATS);
1099
1100
len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:\n");
1101
1102
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->cmd_stall_status,
1103
"cmd_stall_status", num_elems, "\n\n");
1104
1105
if (len >= buf_len)
1106
buf[buf_len - 1] = 0;
1107
else
1108
buf[len] = 0;
1109
1110
stats_req->buf_len = len;
1111
}
1112
1113
static inline void
1114
htt_print_tx_hwq_fes_result_stats_tlv_v(const void *tag_buf,
1115
u16 tag_len,
1116
struct debug_htt_stats_req *stats_req)
1117
{
1118
const struct htt_tx_hwq_fes_result_stats_tlv_v *htt_stats_buf = tag_buf;
1119
u8 *buf = stats_req->buf;
1120
u32 len = stats_req->buf_len;
1121
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1122
u16 num_elems;
1123
1124
num_elems = min_t(u16, (tag_len >> 2), HTT_TX_HWQ_MAX_FES_RESULT_STATS);
1125
1126
len += scnprintf(buf + len, buf_len - len,
1127
"HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:\n");
1128
1129
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fes_result, "fes_result",
1130
num_elems, "\n\n");
1131
1132
if (len >= buf_len)
1133
buf[buf_len - 1] = 0;
1134
else
1135
buf[len] = 0;
1136
1137
stats_req->buf_len = len;
1138
}
1139
1140
static inline void
1141
htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(const void *tag_buf,
1142
u16 tag_len,
1143
struct debug_htt_stats_req *stats_req)
1144
{
1145
const struct htt_tx_hwq_tried_mpdu_cnt_hist_tlv_v *htt_stats_buf = tag_buf;
1146
u8 *buf = stats_req->buf;
1147
u32 len = stats_req->buf_len;
1148
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1149
u32 num_elements = ((tag_len -
1150
sizeof(htt_stats_buf->hist_bin_size)) >> 2);
1151
1152
len += scnprintf(buf + len, buf_len - len,
1153
"HTT_TX_HWQ_TRIED_MPDU_CNT_HIST_TLV_V:\n");
1154
len += scnprintf(buf + len, buf_len - len, "TRIED_MPDU_CNT_HIST_BIN_SIZE : %u\n",
1155
htt_stats_buf->hist_bin_size);
1156
1157
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tried_mpdu_cnt_hist,
1158
"tried_mpdu_cnt_hist", num_elements, "\n\n");
1159
1160
if (len >= buf_len)
1161
buf[buf_len - 1] = 0;
1162
else
1163
buf[len] = 0;
1164
1165
stats_req->buf_len = len;
1166
}
1167
1168
static inline void
1169
htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(const void *tag_buf,
1170
u16 tag_len,
1171
struct debug_htt_stats_req *stats_req)
1172
{
1173
const struct htt_tx_hwq_txop_used_cnt_hist_tlv_v *htt_stats_buf = tag_buf;
1174
u8 *buf = stats_req->buf;
1175
u32 len = stats_req->buf_len;
1176
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1177
u32 num_elements = tag_len >> 2;
1178
1179
len += scnprintf(buf + len, buf_len - len,
1180
"HTT_TX_HWQ_TXOP_USED_CNT_HIST_TLV_V:\n");
1181
1182
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->txop_used_cnt_hist,
1183
"txop_used_cnt_hist", num_elements, "\n\n");
1184
1185
if (len >= buf_len)
1186
buf[buf_len - 1] = 0;
1187
else
1188
buf[len] = 0;
1189
1190
stats_req->buf_len = len;
1191
}
1192
1193
static inline void htt_print_tx_sounding_stats_tlv(const void *tag_buf,
1194
struct debug_htt_stats_req *stats_req)
1195
{
1196
s32 i;
1197
const struct htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf;
1198
u8 *buf = stats_req->buf;
1199
u32 len = stats_req->buf_len;
1200
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1201
const u32 *cbf_20 = htt_stats_buf->cbf_20;
1202
const u32 *cbf_40 = htt_stats_buf->cbf_40;
1203
const u32 *cbf_80 = htt_stats_buf->cbf_80;
1204
const u32 *cbf_160 = htt_stats_buf->cbf_160;
1205
1206
if (htt_stats_buf->tx_sounding_mode == HTT_TX_AC_SOUNDING_MODE) {
1207
len += scnprintf(buf + len, buf_len - len,
1208
"\nHTT_TX_AC_SOUNDING_STATS_TLV:\n\n");
1209
len += scnprintf(buf + len, buf_len - len,
1210
"ac_cbf_20 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1211
cbf_20[HTT_IMPLICIT_TXBF_STEER_STATS],
1212
cbf_20[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1213
cbf_20[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1214
cbf_20[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1215
cbf_20[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1216
len += scnprintf(buf + len, buf_len - len,
1217
"ac_cbf_40 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1218
cbf_40[HTT_IMPLICIT_TXBF_STEER_STATS],
1219
cbf_40[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1220
cbf_40[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1221
cbf_40[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1222
cbf_40[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1223
len += scnprintf(buf + len, buf_len - len,
1224
"ac_cbf_80 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1225
cbf_80[HTT_IMPLICIT_TXBF_STEER_STATS],
1226
cbf_80[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1227
cbf_80[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1228
cbf_80[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1229
cbf_80[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1230
len += scnprintf(buf + len, buf_len - len,
1231
"ac_cbf_160 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1232
cbf_160[HTT_IMPLICIT_TXBF_STEER_STATS],
1233
cbf_160[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1234
cbf_160[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1235
cbf_160[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1236
cbf_160[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1237
1238
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
1239
len += scnprintf(buf + len, buf_len - len,
1240
"Sounding User %u = 20MHz: %u, 40MHz : %u, 80MHz: %u, 160MHz: %u\n",
1241
i,
1242
htt_stats_buf->sounding[0],
1243
htt_stats_buf->sounding[1],
1244
htt_stats_buf->sounding[2],
1245
htt_stats_buf->sounding[3]);
1246
}
1247
} else if (htt_stats_buf->tx_sounding_mode == HTT_TX_AX_SOUNDING_MODE) {
1248
len += scnprintf(buf + len, buf_len - len,
1249
"\nHTT_TX_AX_SOUNDING_STATS_TLV:\n");
1250
len += scnprintf(buf + len, buf_len - len,
1251
"ax_cbf_20 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1252
cbf_20[HTT_IMPLICIT_TXBF_STEER_STATS],
1253
cbf_20[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1254
cbf_20[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1255
cbf_20[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1256
cbf_20[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1257
len += scnprintf(buf + len, buf_len - len,
1258
"ax_cbf_40 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1259
cbf_40[HTT_IMPLICIT_TXBF_STEER_STATS],
1260
cbf_40[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1261
cbf_40[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1262
cbf_40[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1263
cbf_40[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1264
len += scnprintf(buf + len, buf_len - len,
1265
"ax_cbf_80 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1266
cbf_80[HTT_IMPLICIT_TXBF_STEER_STATS],
1267
cbf_80[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1268
cbf_80[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1269
cbf_80[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1270
cbf_80[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1271
len += scnprintf(buf + len, buf_len - len,
1272
"ax_cbf_160 = IBF : %u, SU_SIFS : %u, SU_RBO : %u, MU_SIFS : %u, MU_RBO : %u\n",
1273
cbf_160[HTT_IMPLICIT_TXBF_STEER_STATS],
1274
cbf_160[HTT_EXPLICIT_TXBF_SU_SIFS_STEER_STATS],
1275
cbf_160[HTT_EXPLICIT_TXBF_SU_RBO_STEER_STATS],
1276
cbf_160[HTT_EXPLICIT_TXBF_MU_SIFS_STEER_STATS],
1277
cbf_160[HTT_EXPLICIT_TXBF_MU_RBO_STEER_STATS]);
1278
1279
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
1280
len += scnprintf(buf + len, buf_len - len,
1281
"Sounding User %u = 20MHz: %u, 40MHz : %u, 80MHz: %u, 160MHz: %u\n",
1282
i,
1283
htt_stats_buf->sounding[0],
1284
htt_stats_buf->sounding[1],
1285
htt_stats_buf->sounding[2],
1286
htt_stats_buf->sounding[3]);
1287
}
1288
}
1289
1290
if (len >= buf_len)
1291
buf[buf_len - 1] = 0;
1292
else
1293
buf[len] = 0;
1294
1295
stats_req->buf_len = len;
1296
}
1297
1298
static inline void
1299
htt_print_tx_selfgen_cmn_stats_tlv(const void *tag_buf,
1300
struct debug_htt_stats_req *stats_req)
1301
{
1302
const struct htt_tx_selfgen_cmn_stats_tlv *htt_stats_buf = tag_buf;
1303
u8 *buf = stats_req->buf;
1304
u32 len = stats_req->buf_len;
1305
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1306
1307
len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_CMN_STATS_TLV:\n");
1308
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
1309
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
1310
len += scnprintf(buf + len, buf_len - len, "su_bar = %u\n",
1311
htt_stats_buf->su_bar);
1312
len += scnprintf(buf + len, buf_len - len, "rts = %u\n",
1313
htt_stats_buf->rts);
1314
len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",
1315
htt_stats_buf->cts2self);
1316
len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",
1317
htt_stats_buf->qos_null);
1318
len += scnprintf(buf + len, buf_len - len, "delayed_bar_1 = %u\n",
1319
htt_stats_buf->delayed_bar_1);
1320
len += scnprintf(buf + len, buf_len - len, "delayed_bar_2 = %u\n",
1321
htt_stats_buf->delayed_bar_2);
1322
len += scnprintf(buf + len, buf_len - len, "delayed_bar_3 = %u\n",
1323
htt_stats_buf->delayed_bar_3);
1324
len += scnprintf(buf + len, buf_len - len, "delayed_bar_4 = %u\n",
1325
htt_stats_buf->delayed_bar_4);
1326
len += scnprintf(buf + len, buf_len - len, "delayed_bar_5 = %u\n",
1327
htt_stats_buf->delayed_bar_5);
1328
len += scnprintf(buf + len, buf_len - len, "delayed_bar_6 = %u\n",
1329
htt_stats_buf->delayed_bar_6);
1330
len += scnprintf(buf + len, buf_len - len, "delayed_bar_7 = %u\n\n",
1331
htt_stats_buf->delayed_bar_7);
1332
1333
if (len >= buf_len)
1334
buf[buf_len - 1] = 0;
1335
else
1336
buf[len] = 0;
1337
1338
stats_req->buf_len = len;
1339
}
1340
1341
static inline void
1342
htt_print_tx_selfgen_ac_stats_tlv(const void *tag_buf,
1343
struct debug_htt_stats_req *stats_req)
1344
{
1345
const struct htt_tx_selfgen_ac_stats_tlv *htt_stats_buf = tag_buf;
1346
u8 *buf = stats_req->buf;
1347
u32 len = stats_req->buf_len;
1348
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1349
1350
len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_STATS_TLV:\n");
1351
len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa = %u\n",
1352
htt_stats_buf->ac_su_ndpa);
1353
len += scnprintf(buf + len, buf_len - len, "ac_su_ndp = %u\n",
1354
htt_stats_buf->ac_su_ndp);
1355
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa = %u\n",
1356
htt_stats_buf->ac_mu_mimo_ndpa);
1357
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp = %u\n",
1358
htt_stats_buf->ac_mu_mimo_ndp);
1359
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_1 = %u\n",
1360
htt_stats_buf->ac_mu_mimo_brpoll_1);
1361
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_2 = %u\n",
1362
htt_stats_buf->ac_mu_mimo_brpoll_2);
1363
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brpoll_3 = %u\n\n",
1364
htt_stats_buf->ac_mu_mimo_brpoll_3);
1365
1366
if (len >= buf_len)
1367
buf[buf_len - 1] = 0;
1368
else
1369
buf[len] = 0;
1370
1371
stats_req->buf_len = len;
1372
}
1373
1374
static inline void
1375
htt_print_tx_selfgen_ax_stats_tlv(const void *tag_buf,
1376
struct debug_htt_stats_req *stats_req)
1377
{
1378
const struct htt_tx_selfgen_ax_stats_tlv *htt_stats_buf = tag_buf;
1379
u8 *buf = stats_req->buf;
1380
u32 len = stats_req->buf_len;
1381
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1382
1383
len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_STATS_TLV:\n");
1384
len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa = %u\n",
1385
htt_stats_buf->ax_su_ndpa);
1386
len += scnprintf(buf + len, buf_len - len, "ax_su_ndp = %u\n",
1387
htt_stats_buf->ax_su_ndp);
1388
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa = %u\n",
1389
htt_stats_buf->ax_mu_mimo_ndpa);
1390
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp = %u\n",
1391
htt_stats_buf->ax_mu_mimo_ndp);
1392
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_1 = %u\n",
1393
htt_stats_buf->ax_mu_mimo_brpoll_1);
1394
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_2 = %u\n",
1395
htt_stats_buf->ax_mu_mimo_brpoll_2);
1396
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_3 = %u\n",
1397
htt_stats_buf->ax_mu_mimo_brpoll_3);
1398
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_4 = %u\n",
1399
htt_stats_buf->ax_mu_mimo_brpoll_4);
1400
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_5 = %u\n",
1401
htt_stats_buf->ax_mu_mimo_brpoll_5);
1402
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_6 = %u\n",
1403
htt_stats_buf->ax_mu_mimo_brpoll_6);
1404
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brpoll_7 = %u\n",
1405
htt_stats_buf->ax_mu_mimo_brpoll_7);
1406
len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger = %u\n",
1407
htt_stats_buf->ax_basic_trigger);
1408
len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_trigger = %u\n",
1409
htt_stats_buf->ax_ulmumimo_trigger);
1410
len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger = %u\n",
1411
htt_stats_buf->ax_bsr_trigger);
1412
len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger = %u\n",
1413
htt_stats_buf->ax_mu_bar_trigger);
1414
len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger = %u\n\n",
1415
htt_stats_buf->ax_mu_rts_trigger);
1416
1417
if (len >= buf_len)
1418
buf[buf_len - 1] = 0;
1419
else
1420
buf[len] = 0;
1421
1422
stats_req->buf_len = len;
1423
}
1424
1425
static inline void
1426
htt_print_tx_selfgen_ac_err_stats_tlv(const void *tag_buf,
1427
struct debug_htt_stats_req *stats_req)
1428
{
1429
const struct htt_tx_selfgen_ac_err_stats_tlv *htt_stats_buf = tag_buf;
1430
u8 *buf = stats_req->buf;
1431
u32 len = stats_req->buf_len;
1432
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1433
1434
len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:\n");
1435
len += scnprintf(buf + len, buf_len - len, "ac_su_ndp_err = %u\n",
1436
htt_stats_buf->ac_su_ndp_err);
1437
len += scnprintf(buf + len, buf_len - len, "ac_su_ndpa_err = %u\n",
1438
htt_stats_buf->ac_su_ndpa_err);
1439
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndpa_err = %u\n",
1440
htt_stats_buf->ac_mu_mimo_ndpa_err);
1441
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_ndp_err = %u\n",
1442
htt_stats_buf->ac_mu_mimo_ndp_err);
1443
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp1_err = %u\n",
1444
htt_stats_buf->ac_mu_mimo_brp1_err);
1445
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp2_err = %u\n",
1446
htt_stats_buf->ac_mu_mimo_brp2_err);
1447
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_brp3_err = %u\n\n",
1448
htt_stats_buf->ac_mu_mimo_brp3_err);
1449
1450
if (len >= buf_len)
1451
buf[buf_len - 1] = 0;
1452
else
1453
buf[len] = 0;
1454
1455
stats_req->buf_len = len;
1456
}
1457
1458
static inline void
1459
htt_print_tx_selfgen_ax_err_stats_tlv(const void *tag_buf,
1460
struct debug_htt_stats_req *stats_req)
1461
{
1462
const struct htt_tx_selfgen_ax_err_stats_tlv *htt_stats_buf = tag_buf;
1463
u8 *buf = stats_req->buf;
1464
u32 len = stats_req->buf_len;
1465
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1466
1467
len += scnprintf(buf + len, buf_len - len, "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:\n");
1468
len += scnprintf(buf + len, buf_len - len, "ax_su_ndp_err = %u\n",
1469
htt_stats_buf->ax_su_ndp_err);
1470
len += scnprintf(buf + len, buf_len - len, "ax_su_ndpa_err = %u\n",
1471
htt_stats_buf->ax_su_ndpa_err);
1472
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndpa_err = %u\n",
1473
htt_stats_buf->ax_mu_mimo_ndpa_err);
1474
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_ndp_err = %u\n",
1475
htt_stats_buf->ax_mu_mimo_ndp_err);
1476
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp1_err = %u\n",
1477
htt_stats_buf->ax_mu_mimo_brp1_err);
1478
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp2_err = %u\n",
1479
htt_stats_buf->ax_mu_mimo_brp2_err);
1480
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp3_err = %u\n",
1481
htt_stats_buf->ax_mu_mimo_brp3_err);
1482
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp4_err = %u\n",
1483
htt_stats_buf->ax_mu_mimo_brp4_err);
1484
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp5_err = %u\n",
1485
htt_stats_buf->ax_mu_mimo_brp5_err);
1486
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp6_err = %u\n",
1487
htt_stats_buf->ax_mu_mimo_brp6_err);
1488
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_brp7_err = %u\n",
1489
htt_stats_buf->ax_mu_mimo_brp7_err);
1490
len += scnprintf(buf + len, buf_len - len, "ax_basic_trigger_err = %u\n",
1491
htt_stats_buf->ax_basic_trigger_err);
1492
len += scnprintf(buf + len, buf_len - len, "ax_ulmumimo_trigger_err = %u\n",
1493
htt_stats_buf->ax_ulmumimo_trigger_err);
1494
len += scnprintf(buf + len, buf_len - len, "ax_bsr_trigger_err = %u\n",
1495
htt_stats_buf->ax_bsr_trigger_err);
1496
len += scnprintf(buf + len, buf_len - len, "ax_mu_bar_trigger_err = %u\n",
1497
htt_stats_buf->ax_mu_bar_trigger_err);
1498
len += scnprintf(buf + len, buf_len - len, "ax_mu_rts_trigger_err = %u\n\n",
1499
htt_stats_buf->ax_mu_rts_trigger_err);
1500
1501
if (len >= buf_len)
1502
buf[buf_len - 1] = 0;
1503
else
1504
buf[len] = 0;
1505
1506
stats_req->buf_len = len;
1507
}
1508
1509
static inline void
1510
htt_print_tx_pdev_mu_mimo_sch_stats_tlv(const void *tag_buf,
1511
struct debug_htt_stats_req *stats_req)
1512
{
1513
const struct htt_tx_pdev_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;
1514
u8 *buf = stats_req->buf;
1515
u32 len = stats_req->buf_len;
1516
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1517
u8 i;
1518
1519
len += scnprintf(buf + len, buf_len - len,
1520
"HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:\n");
1521
len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_posted = %u\n",
1522
htt_stats_buf->mu_mimo_sch_posted);
1523
len += scnprintf(buf + len, buf_len - len, "mu_mimo_sch_failed = %u\n",
1524
htt_stats_buf->mu_mimo_sch_failed);
1525
len += scnprintf(buf + len, buf_len - len, "mu_mimo_ppdu_posted = %u\n\n",
1526
htt_stats_buf->mu_mimo_ppdu_posted);
1527
1528
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++)
1529
len += scnprintf(buf + len, buf_len - len,
1530
"ac_mu_mimo_sch_posted_per_group_index %u = %u\n",
1531
i, htt_stats_buf->ac_mu_mimo_sch_posted_per_grp_sz[i]);
1532
1533
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++)
1534
len += scnprintf(buf + len, buf_len - len,
1535
"ax_mu_mimo_sch_posted_per_group_index %u = %u\n",
1536
i, htt_stats_buf->ax_mu_mimo_sch_posted_per_grp_sz[i]);
1537
1538
len += scnprintf(buf + len, buf_len - len, "11ac MU_MIMO SCH STATS:\n");
1539
1540
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++)
1541
len += scnprintf(buf + len, buf_len - len,
1542
"ac_mu_mimo_sch_nusers_%u = %u\n",
1543
i, htt_stats_buf->ac_mu_mimo_sch_nusers[i]);
1544
1545
len += scnprintf(buf + len, buf_len - len, "\n11ax MU_MIMO SCH STATS:\n");
1546
1547
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++)
1548
len += scnprintf(buf + len, buf_len - len,
1549
"ax_mu_mimo_sch_nusers_%u = %u\n",
1550
i, htt_stats_buf->ax_mu_mimo_sch_nusers[i]);
1551
1552
len += scnprintf(buf + len, buf_len - len, "\n11ax OFDMA SCH STATS:\n");
1553
1554
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
1555
len += scnprintf(buf + len, buf_len - len,
1556
"ax_ofdma_sch_nusers_%u = %u\n",
1557
i, htt_stats_buf->ax_ofdma_sch_nusers[i]);
1558
len += scnprintf(buf + len, buf_len - len,
1559
"ax_ul_ofdma_basic_sch_nusers_%u = %u\n",
1560
i, htt_stats_buf->ax_ul_ofdma_basic_sch_nusers[i]);
1561
len += scnprintf(buf + len, buf_len - len,
1562
"ax_ul_ofdma_bsr_sch_nusers_%u = %u\n",
1563
i, htt_stats_buf->ax_ul_ofdma_bsr_sch_nusers[i]);
1564
len += scnprintf(buf + len, buf_len - len,
1565
"ax_ul_ofdma_sch_bar_nusers_%u = %u\n",
1566
i, htt_stats_buf->ax_ul_ofdma_bar_sch_nusers[i]);
1567
len += scnprintf(buf + len, buf_len - len,
1568
"ax_ul_ofdma_brp_sch_nusers_%u = %u\n",
1569
i, htt_stats_buf->ax_ul_ofdma_brp_sch_nusers[i]);
1570
}
1571
1572
len += scnprintf(buf + len, buf_len - len, "\n11ax UL MUMIO SCH STATS:\n");
1573
1574
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS; i++) {
1575
len += scnprintf(buf + len, buf_len - len,
1576
"ax_ul_mumimo_basic_sch_nusers_%u = %u\n",
1577
i, htt_stats_buf->ax_ul_mumimo_basic_sch_nusers[i]);
1578
len += scnprintf(buf + len, buf_len - len,
1579
"ax_ul_mumimo_brp_sch_nusers_%u = %u\n",
1580
i, htt_stats_buf->ax_ul_mumimo_brp_sch_nusers[i]);
1581
}
1582
1583
if (len >= buf_len)
1584
buf[buf_len - 1] = 0;
1585
else
1586
buf[len] = 0;
1587
1588
stats_req->buf_len = len;
1589
}
1590
1591
static inline void
1592
htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf,
1593
struct debug_htt_stats_req *stats_req)
1594
{
1595
const struct htt_tx_pdev_mpdu_stats_tlv *htt_stats_buf = tag_buf;
1596
u8 *buf = stats_req->buf;
1597
u32 len = stats_req->buf_len;
1598
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1599
1600
if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
1601
if (!htt_stats_buf->user_index)
1602
len += scnprintf(buf + len, buf_len - len,
1603
"HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
1604
1605
if (htt_stats_buf->user_index <
1606
HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
1607
len += scnprintf(buf + len, buf_len - len,
1608
"ac_mu_mimo_mpdus_queued_usr_%u = %u\n",
1609
htt_stats_buf->user_index,
1610
htt_stats_buf->mpdus_queued_usr);
1611
len += scnprintf(buf + len, buf_len - len,
1612
"ac_mu_mimo_mpdus_tried_usr_%u = %u\n",
1613
htt_stats_buf->user_index,
1614
htt_stats_buf->mpdus_tried_usr);
1615
len += scnprintf(buf + len, buf_len - len,
1616
"ac_mu_mimo_mpdus_failed_usr_%u = %u\n",
1617
htt_stats_buf->user_index,
1618
htt_stats_buf->mpdus_failed_usr);
1619
len += scnprintf(buf + len, buf_len - len,
1620
"ac_mu_mimo_mpdus_requeued_usr_%u = %u\n",
1621
htt_stats_buf->user_index,
1622
htt_stats_buf->mpdus_requeued_usr);
1623
len += scnprintf(buf + len, buf_len - len,
1624
"ac_mu_mimo_err_no_ba_usr_%u = %u\n",
1625
htt_stats_buf->user_index,
1626
htt_stats_buf->err_no_ba_usr);
1627
len += scnprintf(buf + len, buf_len - len,
1628
"ac_mu_mimo_mpdu_underrun_usr_%u = %u\n",
1629
htt_stats_buf->user_index,
1630
htt_stats_buf->mpdu_underrun_usr);
1631
len += scnprintf(buf + len, buf_len - len,
1632
"ac_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",
1633
htt_stats_buf->user_index,
1634
htt_stats_buf->ampdu_underrun_usr);
1635
}
1636
}
1637
1638
if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
1639
if (!htt_stats_buf->user_index)
1640
len += scnprintf(buf + len, buf_len - len,
1641
"HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
1642
1643
if (htt_stats_buf->user_index <
1644
HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
1645
len += scnprintf(buf + len, buf_len - len,
1646
"ax_mu_mimo_mpdus_queued_usr_%u = %u\n",
1647
htt_stats_buf->user_index,
1648
htt_stats_buf->mpdus_queued_usr);
1649
len += scnprintf(buf + len, buf_len - len,
1650
"ax_mu_mimo_mpdus_tried_usr_%u = %u\n",
1651
htt_stats_buf->user_index,
1652
htt_stats_buf->mpdus_tried_usr);
1653
len += scnprintf(buf + len, buf_len - len,
1654
"ax_mu_mimo_mpdus_failed_usr_%u = %u\n",
1655
htt_stats_buf->user_index,
1656
htt_stats_buf->mpdus_failed_usr);
1657
len += scnprintf(buf + len, buf_len - len,
1658
"ax_mu_mimo_mpdus_requeued_usr_%u = %u\n",
1659
htt_stats_buf->user_index,
1660
htt_stats_buf->mpdus_requeued_usr);
1661
len += scnprintf(buf + len, buf_len - len,
1662
"ax_mu_mimo_err_no_ba_usr_%u = %u\n",
1663
htt_stats_buf->user_index,
1664
htt_stats_buf->err_no_ba_usr);
1665
len += scnprintf(buf + len, buf_len - len,
1666
"ax_mu_mimo_mpdu_underrun_usr_%u = %u\n",
1667
htt_stats_buf->user_index,
1668
htt_stats_buf->mpdu_underrun_usr);
1669
len += scnprintf(buf + len, buf_len - len,
1670
"ax_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",
1671
htt_stats_buf->user_index,
1672
htt_stats_buf->ampdu_underrun_usr);
1673
}
1674
}
1675
1676
if (htt_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
1677
if (!htt_stats_buf->user_index)
1678
len += scnprintf(buf + len, buf_len - len,
1679
"HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
1680
1681
if (htt_stats_buf->user_index < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
1682
len += scnprintf(buf + len, buf_len - len,
1683
"ax_mu_ofdma_mpdus_queued_usr_%u = %u\n",
1684
htt_stats_buf->user_index,
1685
htt_stats_buf->mpdus_queued_usr);
1686
len += scnprintf(buf + len, buf_len - len,
1687
"ax_mu_ofdma_mpdus_tried_usr_%u = %u\n",
1688
htt_stats_buf->user_index,
1689
htt_stats_buf->mpdus_tried_usr);
1690
len += scnprintf(buf + len, buf_len - len,
1691
"ax_mu_ofdma_mpdus_failed_usr_%u = %u\n",
1692
htt_stats_buf->user_index,
1693
htt_stats_buf->mpdus_failed_usr);
1694
len += scnprintf(buf + len, buf_len - len,
1695
"ax_mu_ofdma_mpdus_requeued_usr_%u = %u\n",
1696
htt_stats_buf->user_index,
1697
htt_stats_buf->mpdus_requeued_usr);
1698
len += scnprintf(buf + len, buf_len - len,
1699
"ax_mu_ofdma_err_no_ba_usr_%u = %u\n",
1700
htt_stats_buf->user_index,
1701
htt_stats_buf->err_no_ba_usr);
1702
len += scnprintf(buf + len, buf_len - len,
1703
"ax_mu_ofdma_mpdu_underrun_usr_%u = %u\n",
1704
htt_stats_buf->user_index,
1705
htt_stats_buf->mpdu_underrun_usr);
1706
len += scnprintf(buf + len, buf_len - len,
1707
"ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n\n",
1708
htt_stats_buf->user_index,
1709
htt_stats_buf->ampdu_underrun_usr);
1710
}
1711
}
1712
1713
if (len >= buf_len)
1714
buf[buf_len - 1] = 0;
1715
else
1716
buf[len] = 0;
1717
1718
stats_req->buf_len = len;
1719
}
1720
1721
static inline void
1722
htt_print_sched_txq_cmd_posted_tlv_v(const void *tag_buf,
1723
u16 tag_len,
1724
struct debug_htt_stats_req *stats_req)
1725
{
1726
const struct htt_sched_txq_cmd_posted_tlv_v *htt_stats_buf = tag_buf;
1727
u8 *buf = stats_req->buf;
1728
u32 len = stats_req->buf_len;
1729
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1730
u16 num_elements = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_SCHED_TX_MODE_MAX);
1731
1732
len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_POSTED_TLV_V:\n");
1733
1734
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_cmd_posted,
1735
"sched_cmd_posted", num_elements, "\n\n");
1736
1737
if (len >= buf_len)
1738
buf[buf_len - 1] = 0;
1739
else
1740
buf[len] = 0;
1741
1742
stats_req->buf_len = len;
1743
}
1744
1745
static inline void
1746
htt_print_sched_txq_cmd_reaped_tlv_v(const void *tag_buf,
1747
u16 tag_len,
1748
struct debug_htt_stats_req *stats_req)
1749
{
1750
const struct htt_sched_txq_cmd_reaped_tlv_v *htt_stats_buf = tag_buf;
1751
u8 *buf = stats_req->buf;
1752
u32 len = stats_req->buf_len;
1753
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1754
u16 num_elements = min_t(u16, (tag_len >> 2), HTT_TX_PDEV_SCHED_TX_MODE_MAX);
1755
1756
len += scnprintf(buf + len, buf_len - len, "HTT_SCHED_TXQ_CMD_REAPED_TLV_V:\n");
1757
1758
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_cmd_reaped,
1759
"sched_cmd_reaped", num_elements, "\n\n");
1760
1761
if (len >= buf_len)
1762
buf[buf_len - 1] = 0;
1763
else
1764
buf[len] = 0;
1765
1766
stats_req->buf_len = len;
1767
}
1768
1769
static inline void
1770
htt_print_sched_txq_sched_order_su_tlv_v(const void *tag_buf,
1771
u16 tag_len,
1772
struct debug_htt_stats_req *stats_req)
1773
{
1774
const struct htt_sched_txq_sched_order_su_tlv_v *htt_stats_buf = tag_buf;
1775
u8 *buf = stats_req->buf;
1776
u32 len = stats_req->buf_len;
1777
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1778
/* each entry is u32, i.e. 4 bytes */
1779
u32 sched_order_su_num_entries =
1780
min_t(u32, (tag_len >> 2), HTT_TX_PDEV_NUM_SCHED_ORDER_LOG);
1781
1782
len += scnprintf(buf + len, buf_len - len,
1783
"HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV_V:\n");
1784
1785
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_order_su, "sched_order_su",
1786
sched_order_su_num_entries, "\n\n");
1787
1788
if (len >= buf_len)
1789
buf[buf_len - 1] = 0;
1790
else
1791
buf[len] = 0;
1792
1793
stats_req->buf_len = len;
1794
}
1795
1796
static inline void
1797
htt_print_sched_txq_sched_ineligibility_tlv_v(const void *tag_buf,
1798
u16 tag_len,
1799
struct debug_htt_stats_req *stats_req)
1800
{
1801
const struct htt_sched_txq_sched_ineligibility_tlv_v *htt_stats_buf = tag_buf;
1802
u8 *buf = stats_req->buf;
1803
u32 len = stats_req->buf_len;
1804
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1805
/* each entry is u32, i.e. 4 bytes */
1806
u32 sched_ineligibility_num_entries = tag_len >> 2;
1807
1808
len += scnprintf(buf + len, buf_len - len,
1809
"HTT_SCHED_TXQ_SCHED_INELIGIBILITY_V:\n");
1810
1811
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->sched_ineligibility,
1812
"sched_ineligibility", sched_ineligibility_num_entries,
1813
"\n\n");
1814
1815
if (len >= buf_len)
1816
buf[buf_len - 1] = 0;
1817
else
1818
buf[len] = 0;
1819
1820
stats_req->buf_len = len;
1821
}
1822
1823
static inline void
1824
htt_print_tx_pdev_stats_sched_per_txq_tlv(const void *tag_buf,
1825
struct debug_htt_stats_req *stats_req)
1826
{
1827
const struct htt_tx_pdev_stats_sched_per_txq_tlv *htt_stats_buf = tag_buf;
1828
u8 *buf = stats_req->buf;
1829
u32 len = stats_req->buf_len;
1830
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1831
1832
len += scnprintf(buf + len, buf_len - len,
1833
"HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:\n");
1834
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
1835
FIELD_GET(HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID,
1836
htt_stats_buf->mac_id__txq_id__word));
1837
len += scnprintf(buf + len, buf_len - len, "txq_id = %lu\n",
1838
FIELD_GET(HTT_TX_PDEV_STATS_SCHED_PER_TXQ_ID,
1839
htt_stats_buf->mac_id__txq_id__word));
1840
len += scnprintf(buf + len, buf_len - len, "sched_policy = %u\n",
1841
htt_stats_buf->sched_policy);
1842
len += scnprintf(buf + len, buf_len - len,
1843
"last_sched_cmd_posted_timestamp = %u\n",
1844
htt_stats_buf->last_sched_cmd_posted_timestamp);
1845
len += scnprintf(buf + len, buf_len - len,
1846
"last_sched_cmd_compl_timestamp = %u\n",
1847
htt_stats_buf->last_sched_cmd_compl_timestamp);
1848
len += scnprintf(buf + len, buf_len - len, "sched_2_tac_lwm_count = %u\n",
1849
htt_stats_buf->sched_2_tac_lwm_count);
1850
len += scnprintf(buf + len, buf_len - len, "sched_2_tac_ring_full = %u\n",
1851
htt_stats_buf->sched_2_tac_ring_full);
1852
len += scnprintf(buf + len, buf_len - len, "sched_cmd_post_failure = %u\n",
1853
htt_stats_buf->sched_cmd_post_failure);
1854
len += scnprintf(buf + len, buf_len - len, "num_active_tids = %u\n",
1855
htt_stats_buf->num_active_tids);
1856
len += scnprintf(buf + len, buf_len - len, "num_ps_schedules = %u\n",
1857
htt_stats_buf->num_ps_schedules);
1858
len += scnprintf(buf + len, buf_len - len, "sched_cmds_pending = %u\n",
1859
htt_stats_buf->sched_cmds_pending);
1860
len += scnprintf(buf + len, buf_len - len, "num_tid_register = %u\n",
1861
htt_stats_buf->num_tid_register);
1862
len += scnprintf(buf + len, buf_len - len, "num_tid_unregister = %u\n",
1863
htt_stats_buf->num_tid_unregister);
1864
len += scnprintf(buf + len, buf_len - len, "num_qstats_queried = %u\n",
1865
htt_stats_buf->num_qstats_queried);
1866
len += scnprintf(buf + len, buf_len - len, "qstats_update_pending = %u\n",
1867
htt_stats_buf->qstats_update_pending);
1868
len += scnprintf(buf + len, buf_len - len, "last_qstats_query_timestamp = %u\n",
1869
htt_stats_buf->last_qstats_query_timestamp);
1870
len += scnprintf(buf + len, buf_len - len, "num_tqm_cmdq_full = %u\n",
1871
htt_stats_buf->num_tqm_cmdq_full);
1872
len += scnprintf(buf + len, buf_len - len, "num_de_sched_algo_trigger = %u\n",
1873
htt_stats_buf->num_de_sched_algo_trigger);
1874
len += scnprintf(buf + len, buf_len - len, "num_rt_sched_algo_trigger = %u\n",
1875
htt_stats_buf->num_rt_sched_algo_trigger);
1876
len += scnprintf(buf + len, buf_len - len, "num_tqm_sched_algo_trigger = %u\n",
1877
htt_stats_buf->num_tqm_sched_algo_trigger);
1878
len += scnprintf(buf + len, buf_len - len, "notify_sched = %u\n\n",
1879
htt_stats_buf->notify_sched);
1880
len += scnprintf(buf + len, buf_len - len, "dur_based_sendn_term = %u\n\n",
1881
htt_stats_buf->dur_based_sendn_term);
1882
1883
if (len >= buf_len)
1884
buf[buf_len - 1] = 0;
1885
else
1886
buf[len] = 0;
1887
1888
stats_req->buf_len = len;
1889
}
1890
1891
static inline void htt_print_stats_tx_sched_cmn_tlv(const void *tag_buf,
1892
struct debug_htt_stats_req *stats_req)
1893
{
1894
const struct htt_stats_tx_sched_cmn_tlv *htt_stats_buf = tag_buf;
1895
u8 *buf = stats_req->buf;
1896
u32 len = stats_req->buf_len;
1897
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1898
1899
len += scnprintf(buf + len, buf_len - len, "HTT_STATS_TX_SCHED_CMN_TLV:\n");
1900
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
1901
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
1902
len += scnprintf(buf + len, buf_len - len, "current_timestamp = %u\n\n",
1903
htt_stats_buf->current_timestamp);
1904
1905
if (len >= buf_len)
1906
buf[buf_len - 1] = 0;
1907
else
1908
buf[len] = 0;
1909
1910
stats_req->buf_len = len;
1911
}
1912
1913
static inline void
1914
htt_print_tx_tqm_gen_mpdu_stats_tlv_v(const void *tag_buf,
1915
u16 tag_len,
1916
struct debug_htt_stats_req *stats_req)
1917
{
1918
const struct htt_tx_tqm_gen_mpdu_stats_tlv_v *htt_stats_buf = tag_buf;
1919
u8 *buf = stats_req->buf;
1920
u32 len = stats_req->buf_len;
1921
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1922
u16 num_elements = min_t(u16, (tag_len >> 2),
1923
HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
1924
1925
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:\n");
1926
1927
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->gen_mpdu_end_reason,
1928
"gen_mpdu_end_reason", num_elements, "\n\n");
1929
1930
if (len >= buf_len)
1931
buf[buf_len - 1] = 0;
1932
else
1933
buf[len] = 0;
1934
1935
stats_req->buf_len = len;
1936
}
1937
1938
static inline void
1939
htt_print_tx_tqm_list_mpdu_stats_tlv_v(const void *tag_buf,
1940
u16 tag_len,
1941
struct debug_htt_stats_req *stats_req)
1942
{
1943
const struct htt_tx_tqm_list_mpdu_stats_tlv_v *htt_stats_buf = tag_buf;
1944
u8 *buf = stats_req->buf;
1945
u32 len = stats_req->buf_len;
1946
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1947
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
1948
1949
len += scnprintf(buf + len, buf_len - len,
1950
"HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:\n");
1951
1952
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->list_mpdu_end_reason,
1953
"list_mpdu_end_reason", num_elems, "\n\n");
1954
1955
if (len >= buf_len)
1956
buf[buf_len - 1] = 0;
1957
else
1958
buf[len] = 0;
1959
1960
stats_req->buf_len = len;
1961
}
1962
1963
static inline void
1964
htt_print_tx_tqm_list_mpdu_cnt_tlv_v(const void *tag_buf,
1965
u16 tag_len,
1966
struct debug_htt_stats_req *stats_req)
1967
{
1968
const struct htt_tx_tqm_list_mpdu_cnt_tlv_v *htt_stats_buf = tag_buf;
1969
u8 *buf = stats_req->buf;
1970
u32 len = stats_req->buf_len;
1971
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1972
u16 num_elems = min_t(u16, (tag_len >> 2),
1973
HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
1974
1975
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:\n");
1976
1977
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->list_mpdu_cnt_hist,
1978
"list_mpdu_cnt_hist", num_elems, "\n\n");
1979
1980
if (len >= buf_len)
1981
buf[buf_len - 1] = 0;
1982
else
1983
buf[len] = 0;
1984
1985
stats_req->buf_len = len;
1986
}
1987
1988
static inline void
1989
htt_print_tx_tqm_pdev_stats_tlv_v(const void *tag_buf,
1990
struct debug_htt_stats_req *stats_req)
1991
{
1992
const struct htt_tx_tqm_pdev_stats_tlv_v *htt_stats_buf = tag_buf;
1993
u8 *buf = stats_req->buf;
1994
u32 len = stats_req->buf_len;
1995
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
1996
1997
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_PDEV_STATS_TLV_V:\n");
1998
len += scnprintf(buf + len, buf_len - len, "msdu_count = %u\n",
1999
htt_stats_buf->msdu_count);
2000
len += scnprintf(buf + len, buf_len - len, "mpdu_count = %u\n",
2001
htt_stats_buf->mpdu_count);
2002
len += scnprintf(buf + len, buf_len - len, "remove_msdu = %u\n",
2003
htt_stats_buf->remove_msdu);
2004
len += scnprintf(buf + len, buf_len - len, "remove_mpdu = %u\n",
2005
htt_stats_buf->remove_mpdu);
2006
len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl = %u\n",
2007
htt_stats_buf->remove_msdu_ttl);
2008
len += scnprintf(buf + len, buf_len - len, "send_bar = %u\n",
2009
htt_stats_buf->send_bar);
2010
len += scnprintf(buf + len, buf_len - len, "bar_sync = %u\n",
2011
htt_stats_buf->bar_sync);
2012
len += scnprintf(buf + len, buf_len - len, "notify_mpdu = %u\n",
2013
htt_stats_buf->notify_mpdu);
2014
len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",
2015
htt_stats_buf->sync_cmd);
2016
len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",
2017
htt_stats_buf->write_cmd);
2018
len += scnprintf(buf + len, buf_len - len, "hwsch_trigger = %u\n",
2019
htt_stats_buf->hwsch_trigger);
2020
len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",
2021
htt_stats_buf->ack_tlv_proc);
2022
len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",
2023
htt_stats_buf->gen_mpdu_cmd);
2024
len += scnprintf(buf + len, buf_len - len, "gen_list_cmd = %u\n",
2025
htt_stats_buf->gen_list_cmd);
2026
len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",
2027
htt_stats_buf->remove_mpdu_cmd);
2028
len += scnprintf(buf + len, buf_len - len, "remove_mpdu_tried_cmd = %u\n",
2029
htt_stats_buf->remove_mpdu_tried_cmd);
2030
len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",
2031
htt_stats_buf->mpdu_queue_stats_cmd);
2032
len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",
2033
htt_stats_buf->mpdu_head_info_cmd);
2034
len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",
2035
htt_stats_buf->msdu_flow_stats_cmd);
2036
len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",
2037
htt_stats_buf->remove_msdu_cmd);
2038
len += scnprintf(buf + len, buf_len - len, "remove_msdu_ttl_cmd = %u\n",
2039
htt_stats_buf->remove_msdu_ttl_cmd);
2040
len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",
2041
htt_stats_buf->flush_cache_cmd);
2042
len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",
2043
htt_stats_buf->update_mpduq_cmd);
2044
len += scnprintf(buf + len, buf_len - len, "enqueue = %u\n",
2045
htt_stats_buf->enqueue);
2046
len += scnprintf(buf + len, buf_len - len, "enqueue_notify = %u\n",
2047
htt_stats_buf->enqueue_notify);
2048
len += scnprintf(buf + len, buf_len - len, "notify_mpdu_at_head = %u\n",
2049
htt_stats_buf->notify_mpdu_at_head);
2050
len += scnprintf(buf + len, buf_len - len, "notify_mpdu_state_valid = %u\n",
2051
htt_stats_buf->notify_mpdu_state_valid);
2052
len += scnprintf(buf + len, buf_len - len, "sched_udp_notify1 = %u\n",
2053
htt_stats_buf->sched_udp_notify1);
2054
len += scnprintf(buf + len, buf_len - len, "sched_udp_notify2 = %u\n",
2055
htt_stats_buf->sched_udp_notify2);
2056
len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify1 = %u\n",
2057
htt_stats_buf->sched_nonudp_notify1);
2058
len += scnprintf(buf + len, buf_len - len, "sched_nonudp_notify2 = %u\n\n",
2059
htt_stats_buf->sched_nonudp_notify2);
2060
2061
if (len >= buf_len)
2062
buf[buf_len - 1] = 0;
2063
else
2064
buf[len] = 0;
2065
2066
stats_req->buf_len = len;
2067
}
2068
2069
static inline void htt_print_tx_tqm_cmn_stats_tlv(const void *tag_buf,
2070
struct debug_htt_stats_req *stats_req)
2071
{
2072
const struct htt_tx_tqm_cmn_stats_tlv *htt_stats_buf = tag_buf;
2073
u8 *buf = stats_req->buf;
2074
u32 len = stats_req->buf_len;
2075
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2076
2077
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMN_STATS_TLV:\n");
2078
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2079
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
2080
len += scnprintf(buf + len, buf_len - len, "max_cmdq_id = %u\n",
2081
htt_stats_buf->max_cmdq_id);
2082
len += scnprintf(buf + len, buf_len - len, "list_mpdu_cnt_hist_intvl = %u\n",
2083
htt_stats_buf->list_mpdu_cnt_hist_intvl);
2084
len += scnprintf(buf + len, buf_len - len, "add_msdu = %u\n",
2085
htt_stats_buf->add_msdu);
2086
len += scnprintf(buf + len, buf_len - len, "q_empty = %u\n",
2087
htt_stats_buf->q_empty);
2088
len += scnprintf(buf + len, buf_len - len, "q_not_empty = %u\n",
2089
htt_stats_buf->q_not_empty);
2090
len += scnprintf(buf + len, buf_len - len, "drop_notification = %u\n",
2091
htt_stats_buf->drop_notification);
2092
len += scnprintf(buf + len, buf_len - len, "desc_threshold = %u\n\n",
2093
htt_stats_buf->desc_threshold);
2094
2095
if (len >= buf_len)
2096
buf[buf_len - 1] = 0;
2097
else
2098
buf[len] = 0;
2099
2100
stats_req->buf_len = len;
2101
}
2102
2103
static inline void htt_print_tx_tqm_error_stats_tlv(const void *tag_buf,
2104
struct debug_htt_stats_req *stats_req)
2105
{
2106
const struct htt_tx_tqm_error_stats_tlv *htt_stats_buf = tag_buf;
2107
u8 *buf = stats_req->buf;
2108
u32 len = stats_req->buf_len;
2109
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2110
2111
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_ERROR_STATS_TLV:\n");
2112
len += scnprintf(buf + len, buf_len - len, "q_empty_failure = %u\n",
2113
htt_stats_buf->q_empty_failure);
2114
len += scnprintf(buf + len, buf_len - len, "q_not_empty_failure = %u\n",
2115
htt_stats_buf->q_not_empty_failure);
2116
len += scnprintf(buf + len, buf_len - len, "add_msdu_failure = %u\n\n",
2117
htt_stats_buf->add_msdu_failure);
2118
2119
if (len >= buf_len)
2120
buf[buf_len - 1] = 0;
2121
else
2122
buf[len] = 0;
2123
2124
stats_req->buf_len = len;
2125
}
2126
2127
static inline void htt_print_tx_tqm_cmdq_status_tlv(const void *tag_buf,
2128
struct debug_htt_stats_req *stats_req)
2129
{
2130
const struct htt_tx_tqm_cmdq_status_tlv *htt_stats_buf = tag_buf;
2131
u8 *buf = stats_req->buf;
2132
u32 len = stats_req->buf_len;
2133
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2134
2135
len += scnprintf(buf + len, buf_len - len, "HTT_TX_TQM_CMDQ_STATUS_TLV:\n");
2136
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2137
FIELD_GET(HTT_TX_TQM_CMDQ_STATUS_MAC_ID,
2138
htt_stats_buf->mac_id__cmdq_id__word));
2139
len += scnprintf(buf + len, buf_len - len, "cmdq_id = %lu\n\n",
2140
FIELD_GET(HTT_TX_TQM_CMDQ_STATUS_CMDQ_ID,
2141
htt_stats_buf->mac_id__cmdq_id__word));
2142
len += scnprintf(buf + len, buf_len - len, "sync_cmd = %u\n",
2143
htt_stats_buf->sync_cmd);
2144
len += scnprintf(buf + len, buf_len - len, "write_cmd = %u\n",
2145
htt_stats_buf->write_cmd);
2146
len += scnprintf(buf + len, buf_len - len, "gen_mpdu_cmd = %u\n",
2147
htt_stats_buf->gen_mpdu_cmd);
2148
len += scnprintf(buf + len, buf_len - len, "mpdu_queue_stats_cmd = %u\n",
2149
htt_stats_buf->mpdu_queue_stats_cmd);
2150
len += scnprintf(buf + len, buf_len - len, "mpdu_head_info_cmd = %u\n",
2151
htt_stats_buf->mpdu_head_info_cmd);
2152
len += scnprintf(buf + len, buf_len - len, "msdu_flow_stats_cmd = %u\n",
2153
htt_stats_buf->msdu_flow_stats_cmd);
2154
len += scnprintf(buf + len, buf_len - len, "remove_mpdu_cmd = %u\n",
2155
htt_stats_buf->remove_mpdu_cmd);
2156
len += scnprintf(buf + len, buf_len - len, "remove_msdu_cmd = %u\n",
2157
htt_stats_buf->remove_msdu_cmd);
2158
len += scnprintf(buf + len, buf_len - len, "flush_cache_cmd = %u\n",
2159
htt_stats_buf->flush_cache_cmd);
2160
len += scnprintf(buf + len, buf_len - len, "update_mpduq_cmd = %u\n",
2161
htt_stats_buf->update_mpduq_cmd);
2162
len += scnprintf(buf + len, buf_len - len, "update_msduq_cmd = %u\n\n",
2163
htt_stats_buf->update_msduq_cmd);
2164
2165
if (len >= buf_len)
2166
buf[buf_len - 1] = 0;
2167
else
2168
buf[len] = 0;
2169
2170
stats_req->buf_len = len;
2171
}
2172
2173
static inline void
2174
htt_print_tx_de_eapol_packets_stats_tlv(const void *tag_buf,
2175
struct debug_htt_stats_req *stats_req)
2176
{
2177
const struct htt_tx_de_eapol_packets_stats_tlv *htt_stats_buf = tag_buf;
2178
u8 *buf = stats_req->buf;
2179
u32 len = stats_req->buf_len;
2180
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2181
2182
len += scnprintf(buf + len, buf_len - len,
2183
"HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:\n");
2184
len += scnprintf(buf + len, buf_len - len, "m1_packets = %u\n",
2185
htt_stats_buf->m1_packets);
2186
len += scnprintf(buf + len, buf_len - len, "m2_packets = %u\n",
2187
htt_stats_buf->m2_packets);
2188
len += scnprintf(buf + len, buf_len - len, "m3_packets = %u\n",
2189
htt_stats_buf->m3_packets);
2190
len += scnprintf(buf + len, buf_len - len, "m4_packets = %u\n",
2191
htt_stats_buf->m4_packets);
2192
len += scnprintf(buf + len, buf_len - len, "g1_packets = %u\n",
2193
htt_stats_buf->g1_packets);
2194
len += scnprintf(buf + len, buf_len - len, "g2_packets = %u\n\n",
2195
htt_stats_buf->g2_packets);
2196
2197
if (len >= buf_len)
2198
buf[buf_len - 1] = 0;
2199
else
2200
buf[len] = 0;
2201
2202
stats_req->buf_len = len;
2203
}
2204
2205
static inline void
2206
htt_print_tx_de_classify_failed_stats_tlv(const void *tag_buf,
2207
struct debug_htt_stats_req *stats_req)
2208
{
2209
const struct htt_tx_de_classify_failed_stats_tlv *htt_stats_buf = tag_buf;
2210
u8 *buf = stats_req->buf;
2211
u32 len = stats_req->buf_len;
2212
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2213
2214
len += scnprintf(buf + len, buf_len - len,
2215
"HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:\n");
2216
len += scnprintf(buf + len, buf_len - len, "ap_bss_peer_not_found = %u\n",
2217
htt_stats_buf->ap_bss_peer_not_found);
2218
len += scnprintf(buf + len, buf_len - len, "ap_bcast_mcast_no_peer = %u\n",
2219
htt_stats_buf->ap_bcast_mcast_no_peer);
2220
len += scnprintf(buf + len, buf_len - len, "sta_delete_in_progress = %u\n",
2221
htt_stats_buf->sta_delete_in_progress);
2222
len += scnprintf(buf + len, buf_len - len, "ibss_no_bss_peer = %u\n",
2223
htt_stats_buf->ibss_no_bss_peer);
2224
len += scnprintf(buf + len, buf_len - len, "invalid_vdev_type = %u\n",
2225
htt_stats_buf->invalid_vdev_type);
2226
len += scnprintf(buf + len, buf_len - len, "invalid_ast_peer_entry = %u\n",
2227
htt_stats_buf->invalid_ast_peer_entry);
2228
len += scnprintf(buf + len, buf_len - len, "peer_entry_invalid = %u\n",
2229
htt_stats_buf->peer_entry_invalid);
2230
len += scnprintf(buf + len, buf_len - len, "ethertype_not_ip = %u\n",
2231
htt_stats_buf->ethertype_not_ip);
2232
len += scnprintf(buf + len, buf_len - len, "eapol_lookup_failed = %u\n",
2233
htt_stats_buf->eapol_lookup_failed);
2234
len += scnprintf(buf + len, buf_len - len, "qpeer_not_allow_data = %u\n",
2235
htt_stats_buf->qpeer_not_allow_data);
2236
len += scnprintf(buf + len, buf_len - len, "fse_tid_override = %u\n",
2237
htt_stats_buf->fse_tid_override);
2238
len += scnprintf(buf + len, buf_len - len, "ipv6_jumbogram_zero_length = %u\n",
2239
htt_stats_buf->ipv6_jumbogram_zero_length);
2240
len += scnprintf(buf + len, buf_len - len, "qos_to_non_qos_in_prog = %u\n\n",
2241
htt_stats_buf->qos_to_non_qos_in_prog);
2242
2243
if (len >= buf_len)
2244
buf[buf_len - 1] = 0;
2245
else
2246
buf[len] = 0;
2247
2248
stats_req->buf_len = len;
2249
}
2250
2251
static inline void
2252
htt_print_tx_de_classify_stats_tlv(const void *tag_buf,
2253
struct debug_htt_stats_req *stats_req)
2254
{
2255
const struct htt_tx_de_classify_stats_tlv *htt_stats_buf = tag_buf;
2256
u8 *buf = stats_req->buf;
2257
u32 len = stats_req->buf_len;
2258
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2259
2260
len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CLASSIFY_STATS_TLV:\n");
2261
len += scnprintf(buf + len, buf_len - len, "arp_packets = %u\n",
2262
htt_stats_buf->arp_packets);
2263
len += scnprintf(buf + len, buf_len - len, "igmp_packets = %u\n",
2264
htt_stats_buf->igmp_packets);
2265
len += scnprintf(buf + len, buf_len - len, "dhcp_packets = %u\n",
2266
htt_stats_buf->dhcp_packets);
2267
len += scnprintf(buf + len, buf_len - len, "host_inspected = %u\n",
2268
htt_stats_buf->host_inspected);
2269
len += scnprintf(buf + len, buf_len - len, "htt_included = %u\n",
2270
htt_stats_buf->htt_included);
2271
len += scnprintf(buf + len, buf_len - len, "htt_valid_mcs = %u\n",
2272
htt_stats_buf->htt_valid_mcs);
2273
len += scnprintf(buf + len, buf_len - len, "htt_valid_nss = %u\n",
2274
htt_stats_buf->htt_valid_nss);
2275
len += scnprintf(buf + len, buf_len - len, "htt_valid_preamble_type = %u\n",
2276
htt_stats_buf->htt_valid_preamble_type);
2277
len += scnprintf(buf + len, buf_len - len, "htt_valid_chainmask = %u\n",
2278
htt_stats_buf->htt_valid_chainmask);
2279
len += scnprintf(buf + len, buf_len - len, "htt_valid_guard_interval = %u\n",
2280
htt_stats_buf->htt_valid_guard_interval);
2281
len += scnprintf(buf + len, buf_len - len, "htt_valid_retries = %u\n",
2282
htt_stats_buf->htt_valid_retries);
2283
len += scnprintf(buf + len, buf_len - len, "htt_valid_bw_info = %u\n",
2284
htt_stats_buf->htt_valid_bw_info);
2285
len += scnprintf(buf + len, buf_len - len, "htt_valid_power = %u\n",
2286
htt_stats_buf->htt_valid_power);
2287
len += scnprintf(buf + len, buf_len - len, "htt_valid_key_flags = 0x%x\n",
2288
htt_stats_buf->htt_valid_key_flags);
2289
len += scnprintf(buf + len, buf_len - len, "htt_valid_no_encryption = %u\n",
2290
htt_stats_buf->htt_valid_no_encryption);
2291
len += scnprintf(buf + len, buf_len - len, "fse_entry_count = %u\n",
2292
htt_stats_buf->fse_entry_count);
2293
len += scnprintf(buf + len, buf_len - len, "fse_priority_be = %u\n",
2294
htt_stats_buf->fse_priority_be);
2295
len += scnprintf(buf + len, buf_len - len, "fse_priority_high = %u\n",
2296
htt_stats_buf->fse_priority_high);
2297
len += scnprintf(buf + len, buf_len - len, "fse_priority_low = %u\n",
2298
htt_stats_buf->fse_priority_low);
2299
len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_be = %u\n",
2300
htt_stats_buf->fse_traffic_ptrn_be);
2301
len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_over_sub = %u\n",
2302
htt_stats_buf->fse_traffic_ptrn_over_sub);
2303
len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_bursty = %u\n",
2304
htt_stats_buf->fse_traffic_ptrn_bursty);
2305
len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_interactive = %u\n",
2306
htt_stats_buf->fse_traffic_ptrn_interactive);
2307
len += scnprintf(buf + len, buf_len - len, "fse_traffic_ptrn_periodic = %u\n",
2308
htt_stats_buf->fse_traffic_ptrn_periodic);
2309
len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_alloc = %u\n",
2310
htt_stats_buf->fse_hwqueue_alloc);
2311
len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_created = %u\n",
2312
htt_stats_buf->fse_hwqueue_created);
2313
len += scnprintf(buf + len, buf_len - len, "fse_hwqueue_send_to_host = %u\n",
2314
htt_stats_buf->fse_hwqueue_send_to_host);
2315
len += scnprintf(buf + len, buf_len - len, "mcast_entry = %u\n",
2316
htt_stats_buf->mcast_entry);
2317
len += scnprintf(buf + len, buf_len - len, "bcast_entry = %u\n",
2318
htt_stats_buf->bcast_entry);
2319
len += scnprintf(buf + len, buf_len - len, "htt_update_peer_cache = %u\n",
2320
htt_stats_buf->htt_update_peer_cache);
2321
len += scnprintf(buf + len, buf_len - len, "htt_learning_frame = %u\n",
2322
htt_stats_buf->htt_learning_frame);
2323
len += scnprintf(buf + len, buf_len - len, "fse_invalid_peer = %u\n",
2324
htt_stats_buf->fse_invalid_peer);
2325
len += scnprintf(buf + len, buf_len - len, "mec_notify = %u\n\n",
2326
htt_stats_buf->mec_notify);
2327
2328
if (len >= buf_len)
2329
buf[buf_len - 1] = 0;
2330
else
2331
buf[len] = 0;
2332
2333
stats_req->buf_len = len;
2334
}
2335
2336
static inline void
2337
htt_print_tx_de_classify_status_stats_tlv(const void *tag_buf,
2338
struct debug_htt_stats_req *stats_req)
2339
{
2340
const struct htt_tx_de_classify_status_stats_tlv *htt_stats_buf = tag_buf;
2341
u8 *buf = stats_req->buf;
2342
u32 len = stats_req->buf_len;
2343
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2344
2345
len += scnprintf(buf + len, buf_len - len,
2346
"HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:\n");
2347
len += scnprintf(buf + len, buf_len - len, "eok = %u\n",
2348
htt_stats_buf->eok);
2349
len += scnprintf(buf + len, buf_len - len, "classify_done = %u\n",
2350
htt_stats_buf->classify_done);
2351
len += scnprintf(buf + len, buf_len - len, "lookup_failed = %u\n",
2352
htt_stats_buf->lookup_failed);
2353
len += scnprintf(buf + len, buf_len - len, "send_host_dhcp = %u\n",
2354
htt_stats_buf->send_host_dhcp);
2355
len += scnprintf(buf + len, buf_len - len, "send_host_mcast = %u\n",
2356
htt_stats_buf->send_host_mcast);
2357
len += scnprintf(buf + len, buf_len - len, "send_host_unknown_dest = %u\n",
2358
htt_stats_buf->send_host_unknown_dest);
2359
len += scnprintf(buf + len, buf_len - len, "send_host = %u\n",
2360
htt_stats_buf->send_host);
2361
len += scnprintf(buf + len, buf_len - len, "status_invalid = %u\n\n",
2362
htt_stats_buf->status_invalid);
2363
2364
if (len >= buf_len)
2365
buf[buf_len - 1] = 0;
2366
else
2367
buf[len] = 0;
2368
2369
stats_req->buf_len = len;
2370
}
2371
2372
static inline void
2373
htt_print_tx_de_enqueue_packets_stats_tlv(const void *tag_buf,
2374
struct debug_htt_stats_req *stats_req)
2375
{
2376
const struct htt_tx_de_enqueue_packets_stats_tlv *htt_stats_buf = tag_buf;
2377
u8 *buf = stats_req->buf;
2378
u32 len = stats_req->buf_len;
2379
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2380
2381
len += scnprintf(buf + len, buf_len - len,
2382
"HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:\n");
2383
len += scnprintf(buf + len, buf_len - len, "enqueued_pkts = %u\n",
2384
htt_stats_buf->enqueued_pkts);
2385
len += scnprintf(buf + len, buf_len - len, "to_tqm = %u\n",
2386
htt_stats_buf->to_tqm);
2387
len += scnprintf(buf + len, buf_len - len, "to_tqm_bypass = %u\n\n",
2388
htt_stats_buf->to_tqm_bypass);
2389
2390
if (len >= buf_len)
2391
buf[buf_len - 1] = 0;
2392
else
2393
buf[len] = 0;
2394
2395
stats_req->buf_len = len;
2396
}
2397
2398
static inline void
2399
htt_print_tx_de_enqueue_discard_stats_tlv(const void *tag_buf,
2400
struct debug_htt_stats_req *stats_req)
2401
{
2402
const struct htt_tx_de_enqueue_discard_stats_tlv *htt_stats_buf = tag_buf;
2403
u8 *buf = stats_req->buf;
2404
u32 len = stats_req->buf_len;
2405
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2406
2407
len += scnprintf(buf + len, buf_len - len,
2408
"HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:\n");
2409
len += scnprintf(buf + len, buf_len - len, "discarded_pkts = %u\n",
2410
htt_stats_buf->discarded_pkts);
2411
len += scnprintf(buf + len, buf_len - len, "local_frames = %u\n",
2412
htt_stats_buf->local_frames);
2413
len += scnprintf(buf + len, buf_len - len, "is_ext_msdu = %u\n\n",
2414
htt_stats_buf->is_ext_msdu);
2415
2416
if (len >= buf_len)
2417
buf[buf_len - 1] = 0;
2418
else
2419
buf[len] = 0;
2420
2421
stats_req->buf_len = len;
2422
}
2423
2424
static inline void htt_print_tx_de_compl_stats_tlv(const void *tag_buf,
2425
struct debug_htt_stats_req *stats_req)
2426
{
2427
const struct htt_tx_de_compl_stats_tlv *htt_stats_buf = tag_buf;
2428
u8 *buf = stats_req->buf;
2429
u32 len = stats_req->buf_len;
2430
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2431
2432
len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_COMPL_STATS_TLV:\n");
2433
len += scnprintf(buf + len, buf_len - len, "tcl_dummy_frame = %u\n",
2434
htt_stats_buf->tcl_dummy_frame);
2435
len += scnprintf(buf + len, buf_len - len, "tqm_dummy_frame = %u\n",
2436
htt_stats_buf->tqm_dummy_frame);
2437
len += scnprintf(buf + len, buf_len - len, "tqm_notify_frame = %u\n",
2438
htt_stats_buf->tqm_notify_frame);
2439
len += scnprintf(buf + len, buf_len - len, "fw2wbm_enq = %u\n",
2440
htt_stats_buf->fw2wbm_enq);
2441
len += scnprintf(buf + len, buf_len - len, "tqm_bypass_frame = %u\n\n",
2442
htt_stats_buf->tqm_bypass_frame);
2443
2444
if (len >= buf_len)
2445
buf[buf_len - 1] = 0;
2446
else
2447
buf[len] = 0;
2448
2449
stats_req->buf_len = len;
2450
}
2451
2452
static inline void
2453
htt_print_tx_de_fw2wbm_ring_full_hist_tlv(const void *tag_buf,
2454
u16 tag_len,
2455
struct debug_htt_stats_req *stats_req)
2456
{
2457
const struct htt_tx_de_fw2wbm_ring_full_hist_tlv *htt_stats_buf = tag_buf;
2458
u8 *buf = stats_req->buf;
2459
u32 len = stats_req->buf_len;
2460
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2461
u16 num_elements = tag_len >> 2;
2462
2463
len += scnprintf(buf + len, buf_len - len,
2464
"HTT_TX_DE_FW2WBM_RING_FULL_HIST_TLV");
2465
2466
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw2wbm_ring_full_hist,
2467
"fw2wbm_ring_full_hist", num_elements, "\n\n");
2468
2469
if (len >= buf_len)
2470
buf[buf_len - 1] = 0;
2471
else
2472
buf[len] = 0;
2473
2474
stats_req->buf_len = len;
2475
}
2476
2477
static inline void
2478
htt_print_tx_de_cmn_stats_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req)
2479
{
2480
const struct htt_tx_de_cmn_stats_tlv *htt_stats_buf = tag_buf;
2481
u8 *buf = stats_req->buf;
2482
u32 len = stats_req->buf_len;
2483
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2484
2485
len += scnprintf(buf + len, buf_len - len, "HTT_TX_DE_CMN_STATS_TLV:\n");
2486
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2487
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
2488
len += scnprintf(buf + len, buf_len - len, "tcl2fw_entry_count = %u\n",
2489
htt_stats_buf->tcl2fw_entry_count);
2490
len += scnprintf(buf + len, buf_len - len, "not_to_fw = %u\n",
2491
htt_stats_buf->not_to_fw);
2492
len += scnprintf(buf + len, buf_len - len, "invalid_pdev_vdev_peer = %u\n",
2493
htt_stats_buf->invalid_pdev_vdev_peer);
2494
len += scnprintf(buf + len, buf_len - len, "tcl_res_invalid_addrx = %u\n",
2495
htt_stats_buf->tcl_res_invalid_addrx);
2496
len += scnprintf(buf + len, buf_len - len, "wbm2fw_entry_count = %u\n",
2497
htt_stats_buf->wbm2fw_entry_count);
2498
len += scnprintf(buf + len, buf_len - len, "invalid_pdev = %u\n\n",
2499
htt_stats_buf->invalid_pdev);
2500
2501
if (len >= buf_len)
2502
buf[buf_len - 1] = 0;
2503
else
2504
buf[len] = 0;
2505
2506
stats_req->buf_len = len;
2507
}
2508
2509
static inline void htt_print_ring_if_stats_tlv(const void *tag_buf,
2510
struct debug_htt_stats_req *stats_req)
2511
{
2512
const struct htt_ring_if_stats_tlv *htt_stats_buf = tag_buf;
2513
u8 *buf = stats_req->buf;
2514
u32 len = stats_req->buf_len;
2515
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2516
2517
len += scnprintf(buf + len, buf_len - len, "HTT_RING_IF_STATS_TLV:\n");
2518
len += scnprintf(buf + len, buf_len - len, "base_addr = %u\n",
2519
htt_stats_buf->base_addr);
2520
len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",
2521
htt_stats_buf->elem_size);
2522
len += scnprintf(buf + len, buf_len - len, "num_elems = %lu\n",
2523
FIELD_GET(HTT_RING_IF_STATS_NUM_ELEMS,
2524
htt_stats_buf->num_elems__prefetch_tail_idx));
2525
len += scnprintf(buf + len, buf_len - len, "prefetch_tail_idx = %lu\n",
2526
FIELD_GET(HTT_RING_IF_STATS_PREFETCH_TAIL_INDEX,
2527
htt_stats_buf->num_elems__prefetch_tail_idx));
2528
len += scnprintf(buf + len, buf_len - len, "head_idx = %lu\n",
2529
FIELD_GET(HTT_RING_IF_STATS_HEAD_IDX,
2530
htt_stats_buf->head_idx__tail_idx));
2531
len += scnprintf(buf + len, buf_len - len, "tail_idx = %lu\n",
2532
FIELD_GET(HTT_RING_IF_STATS_TAIL_IDX,
2533
htt_stats_buf->head_idx__tail_idx));
2534
len += scnprintf(buf + len, buf_len - len, "shadow_head_idx = %lu\n",
2535
FIELD_GET(HTT_RING_IF_STATS_SHADOW_HEAD_IDX,
2536
htt_stats_buf->shadow_head_idx__shadow_tail_idx));
2537
len += scnprintf(buf + len, buf_len - len, "shadow_tail_idx = %lu\n",
2538
FIELD_GET(HTT_RING_IF_STATS_SHADOW_TAIL_IDX,
2539
htt_stats_buf->shadow_head_idx__shadow_tail_idx));
2540
len += scnprintf(buf + len, buf_len - len, "num_tail_incr = %u\n",
2541
htt_stats_buf->num_tail_incr);
2542
len += scnprintf(buf + len, buf_len - len, "lwm_thresh = %lu\n",
2543
FIELD_GET(HTT_RING_IF_STATS_LWM_THRESH,
2544
htt_stats_buf->lwm_thresh__hwm_thresh));
2545
len += scnprintf(buf + len, buf_len - len, "hwm_thresh = %lu\n",
2546
FIELD_GET(HTT_RING_IF_STATS_HWM_THRESH,
2547
htt_stats_buf->lwm_thresh__hwm_thresh));
2548
len += scnprintf(buf + len, buf_len - len, "overrun_hit_count = %u\n",
2549
htt_stats_buf->overrun_hit_count);
2550
len += scnprintf(buf + len, buf_len - len, "underrun_hit_count = %u\n",
2551
htt_stats_buf->underrun_hit_count);
2552
len += scnprintf(buf + len, buf_len - len, "prod_blockwait_count = %u\n",
2553
htt_stats_buf->prod_blockwait_count);
2554
len += scnprintf(buf + len, buf_len - len, "cons_blockwait_count = %u\n",
2555
htt_stats_buf->cons_blockwait_count);
2556
2557
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->low_wm_hit_count,
2558
"low_wm_hit_count", HTT_STATS_LOW_WM_BINS, "\n");
2559
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->high_wm_hit_count,
2560
"high_wm_hit_count", HTT_STATS_HIGH_WM_BINS, "\n\n");
2561
2562
if (len >= buf_len)
2563
buf[buf_len - 1] = 0;
2564
else
2565
buf[len] = 0;
2566
2567
stats_req->buf_len = len;
2568
}
2569
2570
static inline void htt_print_ring_if_cmn_tlv(const void *tag_buf,
2571
struct debug_htt_stats_req *stats_req)
2572
{
2573
const struct htt_ring_if_cmn_tlv *htt_stats_buf = tag_buf;
2574
u8 *buf = stats_req->buf;
2575
u32 len = stats_req->buf_len;
2576
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2577
2578
len += scnprintf(buf + len, buf_len - len, "HTT_RING_IF_CMN_TLV:\n");
2579
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2580
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
2581
len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",
2582
htt_stats_buf->num_records);
2583
2584
if (len >= buf_len)
2585
buf[buf_len - 1] = 0;
2586
else
2587
buf[len] = 0;
2588
2589
stats_req->buf_len = len;
2590
}
2591
2592
static inline void htt_print_sfm_client_user_tlv_v(const void *tag_buf,
2593
u16 tag_len,
2594
struct debug_htt_stats_req *stats_req)
2595
{
2596
const struct htt_sfm_client_user_tlv_v *htt_stats_buf = tag_buf;
2597
u8 *buf = stats_req->buf;
2598
u32 len = stats_req->buf_len;
2599
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2600
u16 num_elems = tag_len >> 2;
2601
2602
len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_USER_TLV_V:\n");
2603
2604
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->dwords_used_by_user_n,
2605
"dwords_used_by_user_n", num_elems, "\n\n");
2606
2607
if (len >= buf_len)
2608
buf[buf_len - 1] = 0;
2609
else
2610
buf[len] = 0;
2611
2612
stats_req->buf_len = len;
2613
}
2614
2615
static inline void htt_print_sfm_client_tlv(const void *tag_buf,
2616
struct debug_htt_stats_req *stats_req)
2617
{
2618
const struct htt_sfm_client_tlv *htt_stats_buf = tag_buf;
2619
u8 *buf = stats_req->buf;
2620
u32 len = stats_req->buf_len;
2621
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2622
2623
len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_TLV:\n");
2624
len += scnprintf(buf + len, buf_len - len, "client_id = %u\n",
2625
htt_stats_buf->client_id);
2626
len += scnprintf(buf + len, buf_len - len, "buf_min = %u\n",
2627
htt_stats_buf->buf_min);
2628
len += scnprintf(buf + len, buf_len - len, "buf_max = %u\n",
2629
htt_stats_buf->buf_max);
2630
len += scnprintf(buf + len, buf_len - len, "buf_busy = %u\n",
2631
htt_stats_buf->buf_busy);
2632
len += scnprintf(buf + len, buf_len - len, "buf_alloc = %u\n",
2633
htt_stats_buf->buf_alloc);
2634
len += scnprintf(buf + len, buf_len - len, "buf_avail = %u\n",
2635
htt_stats_buf->buf_avail);
2636
len += scnprintf(buf + len, buf_len - len, "num_users = %u\n\n",
2637
htt_stats_buf->num_users);
2638
2639
if (len >= buf_len)
2640
buf[buf_len - 1] = 0;
2641
else
2642
buf[len] = 0;
2643
2644
stats_req->buf_len = len;
2645
}
2646
2647
static inline void htt_print_sfm_cmn_tlv(const void *tag_buf,
2648
struct debug_htt_stats_req *stats_req)
2649
{
2650
const struct htt_sfm_cmn_tlv *htt_stats_buf = tag_buf;
2651
u8 *buf = stats_req->buf;
2652
u32 len = stats_req->buf_len;
2653
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2654
2655
len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CMN_TLV:\n");
2656
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2657
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
2658
len += scnprintf(buf + len, buf_len - len, "buf_total = %u\n",
2659
htt_stats_buf->buf_total);
2660
len += scnprintf(buf + len, buf_len - len, "mem_empty = %u\n",
2661
htt_stats_buf->mem_empty);
2662
len += scnprintf(buf + len, buf_len - len, "deallocate_bufs = %u\n",
2663
htt_stats_buf->deallocate_bufs);
2664
len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",
2665
htt_stats_buf->num_records);
2666
2667
if (len >= buf_len)
2668
buf[buf_len - 1] = 0;
2669
else
2670
buf[len] = 0;
2671
2672
stats_req->buf_len = len;
2673
}
2674
2675
static inline void htt_print_sring_stats_tlv(const void *tag_buf,
2676
struct debug_htt_stats_req *stats_req)
2677
{
2678
const struct htt_sring_stats_tlv *htt_stats_buf = tag_buf;
2679
u8 *buf = stats_req->buf;
2680
u32 len = stats_req->buf_len;
2681
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2682
2683
len += scnprintf(buf + len, buf_len - len, "HTT_SRING_STATS_TLV:\n");
2684
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2685
FIELD_GET(HTT_SRING_STATS_MAC_ID,
2686
htt_stats_buf->mac_id__ring_id__arena__ep));
2687
len += scnprintf(buf + len, buf_len - len, "ring_id = %lu\n",
2688
FIELD_GET(HTT_SRING_STATS_RING_ID,
2689
htt_stats_buf->mac_id__ring_id__arena__ep));
2690
len += scnprintf(buf + len, buf_len - len, "arena = %lu\n",
2691
FIELD_GET(HTT_SRING_STATS_ARENA,
2692
htt_stats_buf->mac_id__ring_id__arena__ep));
2693
len += scnprintf(buf + len, buf_len - len, "ep = %lu\n",
2694
FIELD_GET(HTT_SRING_STATS_EP,
2695
htt_stats_buf->mac_id__ring_id__arena__ep));
2696
len += scnprintf(buf + len, buf_len - len, "base_addr_lsb = 0x%x\n",
2697
htt_stats_buf->base_addr_lsb);
2698
len += scnprintf(buf + len, buf_len - len, "base_addr_msb = 0x%x\n",
2699
htt_stats_buf->base_addr_msb);
2700
len += scnprintf(buf + len, buf_len - len, "ring_size = %u\n",
2701
htt_stats_buf->ring_size);
2702
len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",
2703
htt_stats_buf->elem_size);
2704
len += scnprintf(buf + len, buf_len - len, "num_avail_words = %lu\n",
2705
FIELD_GET(HTT_SRING_STATS_NUM_AVAIL_WORDS,
2706
htt_stats_buf->num_avail_words__num_valid_words));
2707
len += scnprintf(buf + len, buf_len - len, "num_valid_words = %lu\n",
2708
FIELD_GET(HTT_SRING_STATS_NUM_VALID_WORDS,
2709
htt_stats_buf->num_avail_words__num_valid_words));
2710
len += scnprintf(buf + len, buf_len - len, "head_ptr = %lu\n",
2711
FIELD_GET(HTT_SRING_STATS_HEAD_PTR,
2712
htt_stats_buf->head_ptr__tail_ptr));
2713
len += scnprintf(buf + len, buf_len - len, "tail_ptr = %lu\n",
2714
FIELD_GET(HTT_SRING_STATS_TAIL_PTR,
2715
htt_stats_buf->head_ptr__tail_ptr));
2716
len += scnprintf(buf + len, buf_len - len, "consumer_empty = %lu\n",
2717
FIELD_GET(HTT_SRING_STATS_CONSUMER_EMPTY,
2718
htt_stats_buf->consumer_empty__producer_full));
2719
len += scnprintf(buf + len, buf_len - len, "producer_full = %lu\n",
2720
FIELD_GET(HTT_SRING_STATS_PRODUCER_FULL,
2721
htt_stats_buf->consumer_empty__producer_full));
2722
len += scnprintf(buf + len, buf_len - len, "prefetch_count = %lu\n",
2723
FIELD_GET(HTT_SRING_STATS_PREFETCH_COUNT,
2724
htt_stats_buf->prefetch_count__internal_tail_ptr));
2725
len += scnprintf(buf + len, buf_len - len, "internal_tail_ptr = %lu\n\n",
2726
FIELD_GET(HTT_SRING_STATS_INTERNAL_TAIL_PTR,
2727
htt_stats_buf->prefetch_count__internal_tail_ptr));
2728
2729
if (len >= buf_len)
2730
buf[buf_len - 1] = 0;
2731
else
2732
buf[len] = 0;
2733
2734
stats_req->buf_len = len;
2735
}
2736
2737
static inline void htt_print_sring_cmn_tlv(const void *tag_buf,
2738
struct debug_htt_stats_req *stats_req)
2739
{
2740
const struct htt_sring_cmn_tlv *htt_stats_buf = tag_buf;
2741
u8 *buf = stats_req->buf;
2742
u32 len = stats_req->buf_len;
2743
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2744
2745
len += scnprintf(buf + len, buf_len - len, "HTT_SRING_CMN_TLV:\n");
2746
len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",
2747
htt_stats_buf->num_records);
2748
2749
if (len >= buf_len)
2750
buf[buf_len - 1] = 0;
2751
else
2752
buf[len] = 0;
2753
2754
stats_req->buf_len = len;
2755
}
2756
2757
static inline void htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf,
2758
struct debug_htt_stats_req *stats_req)
2759
{
2760
const struct htt_tx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;
2761
u8 *buf = stats_req->buf;
2762
u32 len = stats_req->buf_len;
2763
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2764
u8 j;
2765
2766
len += scnprintf(buf + len, buf_len - len, "HTT_TX_PDEV_RATE_STATS_TLV:\n");
2767
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2768
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
2769
len += scnprintf(buf + len, buf_len - len, "tx_ldpc = %u\n",
2770
htt_stats_buf->tx_ldpc);
2771
len += scnprintf(buf + len, buf_len - len, "ac_mu_mimo_tx_ldpc = %u\n",
2772
htt_stats_buf->ac_mu_mimo_tx_ldpc);
2773
len += scnprintf(buf + len, buf_len - len, "ax_mu_mimo_tx_ldpc = %u\n",
2774
htt_stats_buf->ax_mu_mimo_tx_ldpc);
2775
len += scnprintf(buf + len, buf_len - len, "ofdma_tx_ldpc = %u\n",
2776
htt_stats_buf->ofdma_tx_ldpc);
2777
len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",
2778
htt_stats_buf->rts_cnt);
2779
len += scnprintf(buf + len, buf_len - len, "rts_success = %u\n",
2780
htt_stats_buf->rts_success);
2781
len += scnprintf(buf + len, buf_len - len, "ack_rssi = %u\n",
2782
htt_stats_buf->ack_rssi);
2783
2784
len += scnprintf(buf + len, buf_len - len,
2785
"Legacy CCK Rates: 1 Mbps: %u, 2 Mbps: %u, 5.5 Mbps: %u, 11 Mbps: %u\n",
2786
htt_stats_buf->tx_legacy_cck_rate[0],
2787
htt_stats_buf->tx_legacy_cck_rate[1],
2788
htt_stats_buf->tx_legacy_cck_rate[2],
2789
htt_stats_buf->tx_legacy_cck_rate[3]);
2790
2791
len += scnprintf(buf + len, buf_len - len,
2792
"Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n"
2793
" 24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n",
2794
htt_stats_buf->tx_legacy_ofdm_rate[0],
2795
htt_stats_buf->tx_legacy_ofdm_rate[1],
2796
htt_stats_buf->tx_legacy_ofdm_rate[2],
2797
htt_stats_buf->tx_legacy_ofdm_rate[3],
2798
htt_stats_buf->tx_legacy_ofdm_rate[4],
2799
htt_stats_buf->tx_legacy_ofdm_rate[5],
2800
htt_stats_buf->tx_legacy_ofdm_rate[6],
2801
htt_stats_buf->tx_legacy_ofdm_rate[7]);
2802
2803
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_mcs, "tx_mcs",
2804
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2805
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_mcs,
2806
"ac_mu_mimo_tx_mcs", HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2807
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_mcs,
2808
"ax_mu_mimo_tx_mcs", HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2809
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_mcs, "ofdma_tx_mcs",
2810
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2811
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_nss, "tx_nss",
2812
HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
2813
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_nss,
2814
"ac_mu_mimo_tx_nss",
2815
HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
2816
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_nss,
2817
"ax_mu_mimo_tx_nss",
2818
HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
2819
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_nss, "ofdma_tx_nss",
2820
HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
2821
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_bw, "tx_bw",
2822
HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
2823
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_bw,
2824
"ac_mu_mimo_tx_bw", HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
2825
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_bw,
2826
"ax_mu_mimo_tx_bw",
2827
HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
2828
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_bw, "ofdma_tx_bw",
2829
HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
2830
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_stbc, "tx_stbc",
2831
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2832
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_pream, "tx_pream",
2833
HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");
2834
2835
len += scnprintf(buf + len, buf_len - len, "HE LTF: 1x: %u, 2x: %u, 4x: %u\n",
2836
htt_stats_buf->tx_he_ltf[1],
2837
htt_stats_buf->tx_he_ltf[2],
2838
htt_stats_buf->tx_he_ltf[3]);
2839
2840
/* SU GI Stats */
2841
for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2842
len += scnprintf(buf + len, (buf_len - len),
2843
"tx_gi[%u] = ", j);
2844
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_gi[j], NULL,
2845
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2846
}
2847
2848
/* AC MU-MIMO GI Stats */
2849
for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2850
len += scnprintf(buf + len, (buf_len - len),
2851
"ac_mu_mimo_tx_gi[%u] = ", j);
2852
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ac_mu_mimo_tx_gi[j],
2853
NULL, HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2854
}
2855
2856
/* AX MU-MIMO GI Stats */
2857
for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2858
len += scnprintf(buf + len, (buf_len - len),
2859
"ax_mu_mimo_tx_gi[%u] = ", j);
2860
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ax_mu_mimo_tx_gi[j],
2861
NULL, HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2862
}
2863
2864
/* DL OFDMA GI Stats */
2865
for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2866
len += scnprintf(buf + len, (buf_len - len),
2867
"ofdma_tx_gi[%u] = ", j);
2868
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ofdma_tx_gi[j], NULL,
2869
HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2870
}
2871
2872
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->tx_dcm, "tx_dcm",
2873
HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, "\n\n");
2874
2875
if (len >= buf_len)
2876
buf[buf_len - 1] = 0;
2877
else
2878
buf[len] = 0;
2879
2880
stats_req->buf_len = len;
2881
}
2882
2883
static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
2884
struct debug_htt_stats_req *stats_req)
2885
{
2886
const struct htt_rx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;
2887
u8 *buf = stats_req->buf;
2888
u32 len = stats_req->buf_len;
2889
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
2890
u8 i, j;
2891
2892
len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_STATS_TLV:\n");
2893
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
2894
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
2895
len += scnprintf(buf + len, buf_len - len, "nsts = %u\n",
2896
htt_stats_buf->nsts);
2897
len += scnprintf(buf + len, buf_len - len, "rx_ldpc = %u\n",
2898
htt_stats_buf->rx_ldpc);
2899
len += scnprintf(buf + len, buf_len - len, "rts_cnt = %u\n",
2900
htt_stats_buf->rts_cnt);
2901
len += scnprintf(buf + len, buf_len - len, "rssi_mgmt = %u\n",
2902
htt_stats_buf->rssi_mgmt);
2903
len += scnprintf(buf + len, buf_len - len, "rssi_data = %u\n",
2904
htt_stats_buf->rssi_data);
2905
len += scnprintf(buf + len, buf_len - len, "rssi_comb = %u\n",
2906
htt_stats_buf->rssi_comb);
2907
len += scnprintf(buf + len, buf_len - len, "rssi_in_dbm = %d\n",
2908
htt_stats_buf->rssi_in_dbm);
2909
2910
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs, "rx_mcs",
2911
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2912
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_nss, "rx_nss",
2913
HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
2914
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_dcm, "rx_dcm",
2915
HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, "\n");
2916
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc, "rx_stbc",
2917
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2918
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_bw, "rx_bw",
2919
HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
2920
2921
len += scnprintf(buf + len, buf_len - len, "rx_evm_nss_count = %u\n",
2922
htt_stats_buf->nss_count);
2923
2924
len += scnprintf(buf + len, buf_len - len, "rx_evm_pilot_count = %u\n",
2925
htt_stats_buf->pilot_count);
2926
2927
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
2928
len += scnprintf(buf + len, buf_len - len,
2929
"pilot_evm_db[%u] = ", j);
2930
for (i = 0; i < HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS; i++)
2931
len += scnprintf(buf + len,
2932
buf_len - len,
2933
" %u:%d,",
2934
i,
2935
htt_stats_buf->rx_pilot_evm_db[j][i]);
2936
len += scnprintf(buf + len, buf_len - len, "\n");
2937
}
2938
2939
len += scnprintf(buf + len, buf_len - len,
2940
"pilot_evm_db_mean = ");
2941
for (i = 0; i < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
2942
len += scnprintf(buf + len,
2943
buf_len - len,
2944
" %u:%d,", i,
2945
htt_stats_buf->rx_pilot_evm_db_mean[i]);
2946
len += scnprintf(buf + len, buf_len - len, "\n");
2947
2948
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
2949
len += scnprintf(buf + len, buf_len - len,
2950
"rssi_chain[%u] = ", j);
2951
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain[j], NULL,
2952
HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
2953
}
2954
2955
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2956
len += scnprintf(buf + len, buf_len - len,
2957
"rx_gi[%u] = ", j);
2958
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi[j], NULL,
2959
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
2960
}
2961
2962
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_pream, "rx_pream",
2963
HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, "\n");
2964
2965
len += scnprintf(buf + len, buf_len - len, "rx_11ax_su_ext = %u\n",
2966
htt_stats_buf->rx_11ax_su_ext);
2967
len += scnprintf(buf + len, buf_len - len, "rx_11ac_mumimo = %u\n",
2968
htt_stats_buf->rx_11ac_mumimo);
2969
len += scnprintf(buf + len, buf_len - len, "rx_11ax_mumimo = %u\n",
2970
htt_stats_buf->rx_11ax_mumimo);
2971
len += scnprintf(buf + len, buf_len - len, "rx_11ax_ofdma = %u\n",
2972
htt_stats_buf->rx_11ax_ofdma);
2973
len += scnprintf(buf + len, buf_len - len, "txbf = %u\n",
2974
htt_stats_buf->txbf);
2975
2976
len += scnprintf(buf + len, buf_len - len, "\nrx_su_ndpa = %u",
2977
htt_stats_buf->rx_su_ndpa);
2978
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_su_txbf_mcs,
2979
"rx_11ax_su_txbf_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
2980
"\n");
2981
2982
len += scnprintf(buf + len, buf_len - len, "\nrx_mu_ndpa = %u",
2983
htt_stats_buf->rx_mu_ndpa);
2984
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_mu_txbf_mcs,
2985
"rx_11ax_mu_txbf_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
2986
"\n");
2987
2988
len += scnprintf(buf + len, buf_len - len, "\nrx_br_poll = %u",
2989
htt_stats_buf->rx_br_poll);
2990
2991
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_legacy_cck_rate,
2992
"rx_legacy_cck_rate",
2993
HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS, "\n");
2994
2995
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_legacy_ofdm_rate,
2996
"rx_legacy_ofdm_rate",
2997
HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS, "\n");
2998
2999
len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_low = %u\n",
3000
htt_stats_buf->rx_active_dur_us_low);
3001
len += scnprintf(buf + len, buf_len - len, "rx_active_dur_us_high = %u\n",
3002
htt_stats_buf->rx_active_dur_us_high);
3003
len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n",
3004
htt_stats_buf->rx_11ax_ul_ofdma);
3005
3006
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_mcs,
3007
"ul_ofdma_rx_mcs",
3008
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
3009
3010
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3011
len += scnprintf(buf + len, buf_len - len,
3012
"ul_ofdma_rx_gi[%u] = ", j);
3013
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_gi[j], NULL,
3014
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n");
3015
}
3016
3017
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_nss,
3018
"ul_ofdma_rx_nss",
3019
HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n");
3020
3021
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_bw, "ul_ofdma_rx_bw",
3022
HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
3023
3024
len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n",
3025
htt_stats_buf->ul_ofdma_rx_stbc);
3026
len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n",
3027
htt_stats_buf->ul_ofdma_rx_ldpc);
3028
3029
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_non_data_ppdu,
3030
"rx_ulofdma_non_data_ppdu",
3031
HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");
3032
3033
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_data_ppdu,
3034
"rx_ulofdma_data_ppdu", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");
3035
3036
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_mpdu_ok,
3037
"rx_ulofdma_mpdu_ok", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");
3038
3039
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_mpdu_fail,
3040
"rx_ulofdma_mpdu_fail", HTT_RX_PDEV_MAX_OFDMA_NUM_USER, "\n");
3041
3042
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
3043
len += scnprintf(buf + len, buf_len - len,
3044
"rx_ul_fd_rssi: nss[%u] = ", j);
3045
for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++)
3046
len += scnprintf(buf + len,
3047
buf_len - len,
3048
" %u:%d,",
3049
i, htt_stats_buf->rx_ul_fd_rssi[j][i]);
3050
len += scnprintf(buf + len, buf_len - len, "\n");
3051
}
3052
3053
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_non_data_nusers,
3054
"rx_ulofdma_non_data_nusers", HTT_RX_PDEV_MAX_OFDMA_NUM_USER,
3055
"\n");
3056
3057
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulofdma_data_nusers,
3058
"rx_ulofdma_data_nusers", HTT_RX_PDEV_MAX_OFDMA_NUM_USER,
3059
"\n");
3060
3061
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_mcs,
3062
"rx_11ax_dl_ofdma_mcs", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
3063
"\n");
3064
3065
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_ru,
3066
"rx_11ax_dl_ofdma_ru", HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS,
3067
"\n");
3068
3069
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_non_data_ppdu,
3070
"rx_ulmumimo_non_data_ppdu", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,
3071
"\n");
3072
3073
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_data_ppdu,
3074
"rx_ulmumimo_data_ppdu", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,
3075
"\n");
3076
3077
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_mpdu_ok,
3078
"rx_ulmumimo_mpdu_ok", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,
3079
"\n");
3080
3081
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_ulmumimo_mpdu_fail,
3082
"rx_ulmumimo_mpdu_fail", HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER,
3083
"\n");
3084
3085
len += scnprintf(buf + len, buf_len - len, "per_chain_rssi_pkt_type = %#x\n",
3086
htt_stats_buf->per_chain_rssi_pkt_type);
3087
3088
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
3089
len += scnprintf(buf + len, buf_len - len,
3090
"rx_per_chain_rssi_in_dbm[%u] = ", j);
3091
for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)
3092
len += scnprintf(buf + len,
3093
buf_len - len,
3094
" %u:%d,",
3095
i,
3096
htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]);
3097
len += scnprintf(buf + len, buf_len - len, "\n");
3098
}
3099
len += scnprintf(buf + len, buf_len - len, "\n");
3100
3101
if (len >= buf_len)
3102
buf[buf_len - 1] = 0;
3103
else
3104
buf[len] = 0;
3105
3106
stats_req->buf_len = len;
3107
}
3108
3109
static inline void htt_print_rx_soc_fw_stats_tlv(const void *tag_buf,
3110
struct debug_htt_stats_req *stats_req)
3111
{
3112
const struct htt_rx_soc_fw_stats_tlv *htt_stats_buf = tag_buf;
3113
u8 *buf = stats_req->buf;
3114
u32 len = stats_req->buf_len;
3115
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3116
3117
len += scnprintf(buf + len, buf_len - len, "HTT_RX_SOC_FW_STATS_TLV:\n");
3118
len += scnprintf(buf + len, buf_len - len, "fw_reo_ring_data_msdu = %u\n",
3119
htt_stats_buf->fw_reo_ring_data_msdu);
3120
len += scnprintf(buf + len, buf_len - len, "fw_to_host_data_msdu_bcmc = %u\n",
3121
htt_stats_buf->fw_to_host_data_msdu_bcmc);
3122
len += scnprintf(buf + len, buf_len - len, "fw_to_host_data_msdu_uc = %u\n",
3123
htt_stats_buf->fw_to_host_data_msdu_uc);
3124
len += scnprintf(buf + len, buf_len - len,
3125
"ofld_remote_data_buf_recycle_cnt = %u\n",
3126
htt_stats_buf->ofld_remote_data_buf_recycle_cnt);
3127
len += scnprintf(buf + len, buf_len - len,
3128
"ofld_remote_free_buf_indication_cnt = %u\n",
3129
htt_stats_buf->ofld_remote_free_buf_indication_cnt);
3130
len += scnprintf(buf + len, buf_len - len,
3131
"ofld_buf_to_host_data_msdu_uc = %u\n",
3132
htt_stats_buf->ofld_buf_to_host_data_msdu_uc);
3133
len += scnprintf(buf + len, buf_len - len,
3134
"reo_fw_ring_to_host_data_msdu_uc = %u\n",
3135
htt_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
3136
len += scnprintf(buf + len, buf_len - len, "wbm_sw_ring_reap = %u\n",
3137
htt_stats_buf->wbm_sw_ring_reap);
3138
len += scnprintf(buf + len, buf_len - len, "wbm_forward_to_host_cnt = %u\n",
3139
htt_stats_buf->wbm_forward_to_host_cnt);
3140
len += scnprintf(buf + len, buf_len - len, "wbm_target_recycle_cnt = %u\n",
3141
htt_stats_buf->wbm_target_recycle_cnt);
3142
len += scnprintf(buf + len, buf_len - len,
3143
"target_refill_ring_recycle_cnt = %u\n",
3144
htt_stats_buf->target_refill_ring_recycle_cnt);
3145
3146
if (len >= buf_len)
3147
buf[buf_len - 1] = 0;
3148
else
3149
buf[len] = 0;
3150
3151
stats_req->buf_len = len;
3152
}
3153
3154
static inline void
3155
htt_print_rx_soc_fw_refill_ring_empty_tlv_v(const void *tag_buf,
3156
u16 tag_len,
3157
struct debug_htt_stats_req *stats_req)
3158
{
3159
const struct htt_rx_soc_fw_refill_ring_empty_tlv_v *htt_stats_buf = tag_buf;
3160
u8 *buf = stats_req->buf;
3161
u32 len = stats_req->buf_len;
3162
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3163
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_REFILL_MAX_RING);
3164
3165
len += scnprintf(buf + len, buf_len - len,
3166
"HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:\n");
3167
3168
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->refill_ring_empty_cnt,
3169
"refill_ring_empty_cnt", num_elems, "\n\n");
3170
3171
if (len >= buf_len)
3172
buf[buf_len - 1] = 0;
3173
else
3174
buf[len] = 0;
3175
3176
stats_req->buf_len = len;
3177
}
3178
3179
static inline void
3180
htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(const void *tag_buf,
3181
u16 tag_len,
3182
struct debug_htt_stats_req *stats_req)
3183
{
3184
const struct htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *htt_stats_buf =
3185
tag_buf;
3186
u8 *buf = stats_req->buf;
3187
u32 len = stats_req->buf_len;
3188
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3189
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_RXDMA_MAX_ERR_CODE);
3190
3191
len += scnprintf(buf + len, buf_len - len,
3192
"HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V:\n");
3193
3194
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rxdma_err, "rxdma_err",
3195
num_elems, "\n\n");
3196
3197
if (len >= buf_len)
3198
buf[buf_len - 1] = 0;
3199
else
3200
buf[len] = 0;
3201
3202
stats_req->buf_len = len;
3203
}
3204
3205
static inline void
3206
htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(const void *tag_buf,
3207
u16 tag_len,
3208
struct debug_htt_stats_req *stats_req)
3209
{
3210
const struct htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *htt_stats_buf = tag_buf;
3211
u8 *buf = stats_req->buf;
3212
u32 len = stats_req->buf_len;
3213
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3214
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_REO_MAX_ERR_CODE);
3215
3216
len += scnprintf(buf + len, buf_len - len,
3217
"HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V:\n");
3218
3219
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->reo_err, "reo_err",
3220
num_elems, "\n\n");
3221
3222
if (len >= buf_len)
3223
buf[buf_len - 1] = 0;
3224
else
3225
buf[len] = 0;
3226
3227
stats_req->buf_len = len;
3228
}
3229
3230
static inline void
3231
htt_print_rx_reo_debug_stats_tlv_v(const void *tag_buf,
3232
struct debug_htt_stats_req *stats_req)
3233
{
3234
const struct htt_rx_reo_resource_stats_tlv_v *htt_stats_buf = tag_buf;
3235
u8 *buf = stats_req->buf;
3236
u32 len = stats_req->buf_len;
3237
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3238
3239
len += scnprintf(buf + len, buf_len - len, "HTT_RX_REO_RESOURCE_STATS_TLV:\n");
3240
len += scnprintf(buf + len, buf_len - len, "sample_id = %u\n",
3241
htt_stats_buf->sample_id);
3242
len += scnprintf(buf + len, buf_len - len, "total_max = %u\n",
3243
htt_stats_buf->total_max);
3244
len += scnprintf(buf + len, buf_len - len, "total_avg = %u\n",
3245
htt_stats_buf->total_avg);
3246
len += scnprintf(buf + len, buf_len - len, "total_sample = %u\n",
3247
htt_stats_buf->total_sample);
3248
len += scnprintf(buf + len, buf_len - len, "non_zeros_avg = %u\n",
3249
htt_stats_buf->non_zeros_avg);
3250
len += scnprintf(buf + len, buf_len - len, "non_zeros_sample = %u\n",
3251
htt_stats_buf->non_zeros_sample);
3252
len += scnprintf(buf + len, buf_len - len, "last_non_zeros_max = %u\n",
3253
htt_stats_buf->last_non_zeros_max);
3254
len += scnprintf(buf + len, buf_len - len, "last_non_zeros_min %u\n",
3255
htt_stats_buf->last_non_zeros_min);
3256
len += scnprintf(buf + len, buf_len - len, "last_non_zeros_avg %u\n",
3257
htt_stats_buf->last_non_zeros_avg);
3258
len += scnprintf(buf + len, buf_len - len, "last_non_zeros_sample %u\n\n",
3259
htt_stats_buf->last_non_zeros_sample);
3260
3261
if (len >= buf_len)
3262
buf[buf_len - 1] = 0;
3263
else
3264
buf[len] = 0;
3265
3266
stats_req->buf_len = len;
3267
}
3268
3269
static inline void
3270
htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(const void *tag_buf,
3271
u16 tag_len,
3272
struct debug_htt_stats_req *stats_req)
3273
{
3274
const struct htt_rx_soc_fw_refill_ring_num_refill_tlv_v *htt_stats_buf = tag_buf;
3275
u8 *buf = stats_req->buf;
3276
u32 len = stats_req->buf_len;
3277
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3278
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_REFILL_MAX_RING);
3279
3280
len += scnprintf(buf + len, buf_len - len,
3281
"HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:\n");
3282
3283
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->refill_ring_num_refill,
3284
"refill_ring_num_refill", num_elems, "\n\n");
3285
3286
if (len >= buf_len)
3287
buf[buf_len - 1] = 0;
3288
else
3289
buf[len] = 0;
3290
3291
stats_req->buf_len = len;
3292
}
3293
3294
static inline void htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf,
3295
struct debug_htt_stats_req *stats_req)
3296
{
3297
const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf;
3298
u8 *buf = stats_req->buf;
3299
u32 len = stats_req->buf_len;
3300
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3301
3302
len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n");
3303
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
3304
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
3305
len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n",
3306
htt_stats_buf->ppdu_recvd);
3307
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n",
3308
htt_stats_buf->mpdu_cnt_fcs_ok);
3309
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n",
3310
htt_stats_buf->mpdu_cnt_fcs_err);
3311
len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n",
3312
htt_stats_buf->tcp_msdu_cnt);
3313
len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n",
3314
htt_stats_buf->tcp_ack_msdu_cnt);
3315
len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n",
3316
htt_stats_buf->udp_msdu_cnt);
3317
len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n",
3318
htt_stats_buf->other_msdu_cnt);
3319
len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n",
3320
htt_stats_buf->fw_ring_mpdu_ind);
3321
3322
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_mgmt_subtype,
3323
"fw_ring_mgmt_subtype", HTT_STATS_SUBTYPE_MAX, "\n");
3324
3325
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_ctrl_subtype,
3326
"fw_ring_ctrl_subtype", HTT_STATS_SUBTYPE_MAX, "\n");
3327
3328
len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n",
3329
htt_stats_buf->fw_ring_mcast_data_msdu);
3330
len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n",
3331
htt_stats_buf->fw_ring_bcast_data_msdu);
3332
len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n",
3333
htt_stats_buf->fw_ring_ucast_data_msdu);
3334
len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n",
3335
htt_stats_buf->fw_ring_null_data_msdu);
3336
len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n",
3337
htt_stats_buf->fw_ring_mpdu_drop);
3338
len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n",
3339
htt_stats_buf->ofld_local_data_ind_cnt);
3340
len += scnprintf(buf + len, buf_len - len,
3341
"ofld_local_data_buf_recycle_cnt = %u\n",
3342
htt_stats_buf->ofld_local_data_buf_recycle_cnt);
3343
len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n",
3344
htt_stats_buf->drx_local_data_ind_cnt);
3345
len += scnprintf(buf + len, buf_len - len,
3346
"drx_local_data_buf_recycle_cnt = %u\n",
3347
htt_stats_buf->drx_local_data_buf_recycle_cnt);
3348
len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n",
3349
htt_stats_buf->local_nondata_ind_cnt);
3350
len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n",
3351
htt_stats_buf->local_nondata_buf_recycle_cnt);
3352
len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n",
3353
htt_stats_buf->fw_status_buf_ring_refill_cnt);
3354
len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n",
3355
htt_stats_buf->fw_status_buf_ring_empty_cnt);
3356
len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n",
3357
htt_stats_buf->fw_pkt_buf_ring_refill_cnt);
3358
len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n",
3359
htt_stats_buf->fw_pkt_buf_ring_empty_cnt);
3360
len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n",
3361
htt_stats_buf->fw_link_buf_ring_refill_cnt);
3362
len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n",
3363
htt_stats_buf->fw_link_buf_ring_empty_cnt);
3364
len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n",
3365
htt_stats_buf->host_pkt_buf_ring_refill_cnt);
3366
len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n",
3367
htt_stats_buf->host_pkt_buf_ring_empty_cnt);
3368
len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n",
3369
htt_stats_buf->mon_pkt_buf_ring_refill_cnt);
3370
len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n",
3371
htt_stats_buf->mon_pkt_buf_ring_empty_cnt);
3372
len += scnprintf(buf + len, buf_len - len,
3373
"mon_status_buf_ring_refill_cnt = %u\n",
3374
htt_stats_buf->mon_status_buf_ring_refill_cnt);
3375
len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n",
3376
htt_stats_buf->mon_status_buf_ring_empty_cnt);
3377
len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n",
3378
htt_stats_buf->mon_desc_buf_ring_refill_cnt);
3379
len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n",
3380
htt_stats_buf->mon_desc_buf_ring_empty_cnt);
3381
len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n",
3382
htt_stats_buf->mon_dest_ring_update_cnt);
3383
len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n",
3384
htt_stats_buf->mon_dest_ring_full_cnt);
3385
len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n",
3386
htt_stats_buf->rx_suspend_cnt);
3387
len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n",
3388
htt_stats_buf->rx_suspend_fail_cnt);
3389
len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n",
3390
htt_stats_buf->rx_resume_cnt);
3391
len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n",
3392
htt_stats_buf->rx_resume_fail_cnt);
3393
len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n",
3394
htt_stats_buf->rx_ring_switch_cnt);
3395
len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n",
3396
htt_stats_buf->rx_ring_restore_cnt);
3397
len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",
3398
htt_stats_buf->rx_flush_cnt);
3399
len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n\n",
3400
htt_stats_buf->rx_recovery_reset_cnt);
3401
3402
if (len >= buf_len)
3403
buf[buf_len - 1] = 0;
3404
else
3405
buf[len] = 0;
3406
3407
stats_req->buf_len = len;
3408
}
3409
3410
static inline void
3411
htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(const void *tag_buf,
3412
struct debug_htt_stats_req *stats_req)
3413
{
3414
const struct htt_rx_pdev_fw_ring_mpdu_err_tlv_v *htt_stats_buf = tag_buf;
3415
u8 *buf = stats_req->buf;
3416
u32 len = stats_req->buf_len;
3417
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3418
3419
len += scnprintf(buf + len, buf_len - len,
3420
"HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:\n");
3421
3422
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_ring_mpdu_err,
3423
"fw_ring_mpdu_err", HTT_RX_STATS_RXDMA_MAX_ERR, "\n");
3424
3425
if (len >= buf_len)
3426
buf[buf_len - 1] = 0;
3427
else
3428
buf[len] = 0;
3429
3430
stats_req->buf_len = len;
3431
}
3432
3433
static inline void
3434
htt_print_rx_pdev_fw_mpdu_drop_tlv_v(const void *tag_buf,
3435
u16 tag_len,
3436
struct debug_htt_stats_req *stats_req)
3437
{
3438
const struct htt_rx_pdev_fw_mpdu_drop_tlv_v *htt_stats_buf = tag_buf;
3439
u8 *buf = stats_req->buf;
3440
u32 len = stats_req->buf_len;
3441
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3442
u16 num_elems = min_t(u16, (tag_len >> 2), HTT_RX_STATS_FW_DROP_REASON_MAX);
3443
3444
len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:\n");
3445
3446
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_mpdu_drop, "fw_mpdu_drop",
3447
num_elems, "\n\n");
3448
3449
if (len >= buf_len)
3450
buf[buf_len - 1] = 0;
3451
else
3452
buf[len] = 0;
3453
3454
stats_req->buf_len = len;
3455
}
3456
3457
static inline void
3458
htt_print_rx_pdev_fw_stats_phy_err_tlv(const void *tag_buf,
3459
struct debug_htt_stats_req *stats_req)
3460
{
3461
const struct htt_rx_pdev_fw_stats_phy_err_tlv *htt_stats_buf = tag_buf;
3462
u8 *buf = stats_req->buf;
3463
u32 len = stats_req->buf_len;
3464
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3465
3466
len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV:\n");
3467
len += scnprintf(buf + len, buf_len - len, "mac_id__word = %u\n",
3468
htt_stats_buf->mac_id__word);
3469
len += scnprintf(buf + len, buf_len - len, "total_phy_err_nct = %u\n",
3470
htt_stats_buf->total_phy_err_cnt);
3471
3472
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->phy_err, "phy_errs",
3473
HTT_STATS_PHY_ERR_MAX, "\n\n");
3474
3475
if (len >= buf_len)
3476
buf[buf_len - 1] = 0;
3477
else
3478
buf[len] = 0;
3479
3480
stats_req->buf_len = len;
3481
}
3482
3483
static inline void
3484
htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf,
3485
struct debug_htt_stats_req *stats_req)
3486
{
3487
const struct htt_pdev_cca_stats_hist_v1_tlv *htt_stats_buf = tag_buf;
3488
u8 *buf = stats_req->buf;
3489
u32 len = stats_req->buf_len;
3490
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3491
3492
len += scnprintf(buf + len, buf_len - len, "\nHTT_PDEV_CCA_STATS_HIST_TLV:\n");
3493
len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",
3494
htt_stats_buf->chan_num);
3495
len += scnprintf(buf + len, buf_len - len, "num_records = %u\n",
3496
htt_stats_buf->num_records);
3497
len += scnprintf(buf + len, buf_len - len, "valid_cca_counters_bitmap = 0x%x\n",
3498
htt_stats_buf->valid_cca_counters_bitmap);
3499
len += scnprintf(buf + len, buf_len - len, "collection_interval = %u\n\n",
3500
htt_stats_buf->collection_interval);
3501
3502
len += scnprintf(buf + len, buf_len - len,
3503
"HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n");
3504
len += scnprintf(buf + len, buf_len - len,
3505
"| tx_frame| rx_frame| rx_clear| my_rx_frame| cnt| med_rx_idle| med_tx_idle_global| cca_obss|\n");
3506
3507
if (len >= buf_len)
3508
buf[buf_len - 1] = 0;
3509
else
3510
buf[len] = 0;
3511
3512
stats_req->buf_len = len;
3513
}
3514
3515
static inline void
3516
htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf,
3517
struct debug_htt_stats_req *stats_req)
3518
{
3519
const struct htt_pdev_stats_cca_counters_tlv *htt_stats_buf = tag_buf;
3520
u8 *buf = stats_req->buf;
3521
u32 len = stats_req->buf_len;
3522
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3523
3524
len += scnprintf(buf + len, buf_len - len,
3525
"|%10u| %10u| %10u| %11u| %10u| %11u| %18u| %10u|\n",
3526
htt_stats_buf->tx_frame_usec,
3527
htt_stats_buf->rx_frame_usec,
3528
htt_stats_buf->rx_clear_usec,
3529
htt_stats_buf->my_rx_frame_usec,
3530
htt_stats_buf->usec_cnt,
3531
htt_stats_buf->med_rx_idle_usec,
3532
htt_stats_buf->med_tx_idle_global_usec,
3533
htt_stats_buf->cca_obss_usec);
3534
3535
if (len >= buf_len)
3536
buf[buf_len - 1] = 0;
3537
else
3538
buf[len] = 0;
3539
3540
stats_req->buf_len = len;
3541
}
3542
3543
static inline void htt_print_hw_stats_whal_tx_tlv(const void *tag_buf,
3544
struct debug_htt_stats_req *stats_req)
3545
{
3546
const struct htt_hw_stats_whal_tx_tlv *htt_stats_buf = tag_buf;
3547
u8 *buf = stats_req->buf;
3548
u32 len = stats_req->buf_len;
3549
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3550
3551
len += scnprintf(buf + len, buf_len - len, "HTT_HW_STATS_WHAL_TX_TLV:\n");
3552
len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n",
3553
FIELD_GET(HTT_STATS_MAC_ID, htt_stats_buf->mac_id__word));
3554
len += scnprintf(buf + len, buf_len - len, "last_unpause_ppdu_id = %u\n",
3555
htt_stats_buf->last_unpause_ppdu_id);
3556
len += scnprintf(buf + len, buf_len - len, "hwsch_unpause_wait_tqm_write = %u\n",
3557
htt_stats_buf->hwsch_unpause_wait_tqm_write);
3558
len += scnprintf(buf + len, buf_len - len, "hwsch_dummy_tlv_skipped = %u\n",
3559
htt_stats_buf->hwsch_dummy_tlv_skipped);
3560
len += scnprintf(buf + len, buf_len - len,
3561
"hwsch_misaligned_offset_received = %u\n",
3562
htt_stats_buf->hwsch_misaligned_offset_received);
3563
len += scnprintf(buf + len, buf_len - len, "hwsch_reset_count = %u\n",
3564
htt_stats_buf->hwsch_reset_count);
3565
len += scnprintf(buf + len, buf_len - len, "hwsch_dev_reset_war = %u\n",
3566
htt_stats_buf->hwsch_dev_reset_war);
3567
len += scnprintf(buf + len, buf_len - len, "hwsch_delayed_pause = %u\n",
3568
htt_stats_buf->hwsch_delayed_pause);
3569
len += scnprintf(buf + len, buf_len - len, "hwsch_long_delayed_pause = %u\n",
3570
htt_stats_buf->hwsch_long_delayed_pause);
3571
len += scnprintf(buf + len, buf_len - len, "sch_rx_ppdu_no_response = %u\n",
3572
htt_stats_buf->sch_rx_ppdu_no_response);
3573
len += scnprintf(buf + len, buf_len - len, "sch_selfgen_response = %u\n",
3574
htt_stats_buf->sch_selfgen_response);
3575
len += scnprintf(buf + len, buf_len - len, "sch_rx_sifs_resp_trigger= %u\n\n",
3576
htt_stats_buf->sch_rx_sifs_resp_trigger);
3577
3578
if (len >= buf_len)
3579
buf[buf_len - 1] = 0;
3580
else
3581
buf[len] = 0;
3582
3583
stats_req->buf_len = len;
3584
}
3585
3586
static inline void
3587
htt_print_pdev_stats_twt_sessions_tlv(const void *tag_buf,
3588
struct debug_htt_stats_req *stats_req)
3589
{
3590
const struct htt_pdev_stats_twt_sessions_tlv *htt_stats_buf = tag_buf;
3591
u8 *buf = stats_req->buf;
3592
u32 len = stats_req->buf_len;
3593
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3594
3595
len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_STATS_TWT_SESSIONS_TLV:\n");
3596
len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",
3597
htt_stats_buf->pdev_id);
3598
len += scnprintf(buf + len, buf_len - len, "num_sessions = %u\n\n",
3599
htt_stats_buf->num_sessions);
3600
3601
if (len >= buf_len)
3602
buf[buf_len - 1] = 0;
3603
else
3604
buf[len] = 0;
3605
3606
stats_req->buf_len = len;
3607
}
3608
3609
static inline void
3610
htt_print_pdev_stats_twt_session_tlv(const void *tag_buf,
3611
struct debug_htt_stats_req *stats_req)
3612
{
3613
const struct htt_pdev_stats_twt_session_tlv *htt_stats_buf = tag_buf;
3614
u8 *buf = stats_req->buf;
3615
u32 len = stats_req->buf_len;
3616
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3617
3618
len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_STATS_TWT_SESSION_TLV:\n");
3619
len += scnprintf(buf + len, buf_len - len, "vdev_id = %u\n",
3620
htt_stats_buf->vdev_id);
3621
len += scnprintf(buf + len, buf_len - len,
3622
"peer_mac = %02lx:%02lx:%02lx:%02lx:%02lx:%02lx\n",
3623
FIELD_GET(HTT_MAC_ADDR_L32_0,
3624
htt_stats_buf->peer_mac.mac_addr_l32),
3625
FIELD_GET(HTT_MAC_ADDR_L32_1,
3626
htt_stats_buf->peer_mac.mac_addr_l32),
3627
FIELD_GET(HTT_MAC_ADDR_L32_2,
3628
htt_stats_buf->peer_mac.mac_addr_l32),
3629
FIELD_GET(HTT_MAC_ADDR_L32_3,
3630
htt_stats_buf->peer_mac.mac_addr_l32),
3631
FIELD_GET(HTT_MAC_ADDR_H16_0,
3632
htt_stats_buf->peer_mac.mac_addr_h16),
3633
FIELD_GET(HTT_MAC_ADDR_H16_1,
3634
htt_stats_buf->peer_mac.mac_addr_h16));
3635
len += scnprintf(buf + len, buf_len - len, "flow_id_flags = %u\n",
3636
htt_stats_buf->flow_id_flags);
3637
len += scnprintf(buf + len, buf_len - len, "dialog_id = %u\n",
3638
htt_stats_buf->dialog_id);
3639
len += scnprintf(buf + len, buf_len - len, "wake_dura_us = %u\n",
3640
htt_stats_buf->wake_dura_us);
3641
len += scnprintf(buf + len, buf_len - len, "wake_intvl_us = %u\n",
3642
htt_stats_buf->wake_intvl_us);
3643
len += scnprintf(buf + len, buf_len - len, "sp_offset_us = %u\n\n",
3644
htt_stats_buf->sp_offset_us);
3645
3646
if (len >= buf_len)
3647
buf[buf_len - 1] = 0;
3648
else
3649
buf[len] = 0;
3650
3651
stats_req->buf_len = len;
3652
}
3653
3654
static inline void
3655
htt_print_pdev_obss_pd_stats_tlv_v(const void *tag_buf,
3656
struct debug_htt_stats_req *stats_req)
3657
{
3658
const struct htt_pdev_obss_pd_stats_tlv *htt_stats_buf = tag_buf;
3659
u8 *buf = stats_req->buf;
3660
u32 len = stats_req->buf_len;
3661
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3662
3663
len += scnprintf(buf + len, buf_len - len, "OBSS Tx success PPDU = %u\n",
3664
htt_stats_buf->num_obss_tx_ppdu_success);
3665
len += scnprintf(buf + len, buf_len - len, "OBSS Tx failures PPDU = %u\n",
3666
htt_stats_buf->num_obss_tx_ppdu_failure);
3667
len += scnprintf(buf + len, buf_len - len, "Non-SRG Opportunities = %u\n",
3668
htt_stats_buf->num_non_srg_opportunities);
3669
len += scnprintf(buf + len, buf_len - len, "Non-SRG tried PPDU = %u\n",
3670
htt_stats_buf->num_non_srg_ppdu_tried);
3671
len += scnprintf(buf + len, buf_len - len, "Non-SRG success PPDU = %u\n",
3672
htt_stats_buf->num_non_srg_ppdu_success);
3673
len += scnprintf(buf + len, buf_len - len, "SRG Opportunities = %u\n",
3674
htt_stats_buf->num_srg_opportunities);
3675
len += scnprintf(buf + len, buf_len - len, "SRG tried PPDU = %u\n",
3676
htt_stats_buf->num_srg_ppdu_tried);
3677
len += scnprintf(buf + len, buf_len - len, "SRG success PPDU = %u\n\n",
3678
htt_stats_buf->num_srg_ppdu_success);
3679
3680
if (len >= buf_len)
3681
buf[buf_len - 1] = 0;
3682
else
3683
buf[len] = 0;
3684
3685
stats_req->buf_len = len;
3686
}
3687
3688
static inline void htt_print_backpressure_stats_tlv_v(const u32 *tag_buf,
3689
u8 *data)
3690
{
3691
struct debug_htt_stats_req *stats_req =
3692
(struct debug_htt_stats_req *)data;
3693
struct htt_ring_backpressure_stats_tlv *htt_stats_buf =
3694
(struct htt_ring_backpressure_stats_tlv *)tag_buf;
3695
int i;
3696
u8 *buf = stats_req->buf;
3697
u32 len = stats_req->buf_len;
3698
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3699
3700
len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",
3701
htt_stats_buf->pdev_id);
3702
len += scnprintf(buf + len, buf_len - len, "current_head_idx = %u\n",
3703
htt_stats_buf->current_head_idx);
3704
len += scnprintf(buf + len, buf_len - len, "current_tail_idx = %u\n",
3705
htt_stats_buf->current_tail_idx);
3706
len += scnprintf(buf + len, buf_len - len, "num_htt_msgs_sent = %u\n",
3707
htt_stats_buf->num_htt_msgs_sent);
3708
len += scnprintf(buf + len, buf_len - len,
3709
"backpressure_time_ms = %u\n",
3710
htt_stats_buf->backpressure_time_ms);
3711
3712
for (i = 0; i < 5; i++)
3713
len += scnprintf(buf + len, buf_len - len,
3714
"backpressure_hist_%u = %u\n",
3715
i + 1, htt_stats_buf->backpressure_hist[i]);
3716
3717
len += scnprintf(buf + len, buf_len - len,
3718
"============================\n");
3719
3720
if (len >= buf_len) {
3721
buf[buf_len - 1] = 0;
3722
stats_req->buf_len = buf_len - 1;
3723
} else {
3724
buf[len] = 0;
3725
stats_req->buf_len = len;
3726
}
3727
}
3728
3729
static inline
3730
void htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf,
3731
struct debug_htt_stats_req *stats_req)
3732
{
3733
const struct htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf;
3734
u8 *buf = stats_req->buf;
3735
u32 len = stats_req->buf_len;
3736
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3737
int i;
3738
3739
len += scnprintf(buf + len, buf_len - len,
3740
"HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n");
3741
3742
len += scnprintf(buf + len, buf_len - len, "tx_ol_mcs = ");
3743
for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)
3744
len += scnprintf(buf + len, buf_len - len,
3745
"%d:%u,", i, htt_stats_buf->tx_su_ol_mcs[i]);
3746
len--;
3747
3748
len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_mcs = ");
3749
for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)
3750
len += scnprintf(buf + len, buf_len - len,
3751
"%d:%u,", i, htt_stats_buf->tx_su_ibf_mcs[i]);
3752
len--;
3753
3754
len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_mcs =");
3755
for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)
3756
len += scnprintf(buf + len, buf_len - len,
3757
"%d:%u,", i, htt_stats_buf->tx_su_txbf_mcs[i]);
3758
len--;
3759
3760
len += scnprintf(buf + len, buf_len - len, "\ntx_ol_nss = ");
3761
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
3762
len += scnprintf(buf + len, buf_len - len,
3763
"%d:%u,", i, htt_stats_buf->tx_su_ol_nss[i]);
3764
len--;
3765
3766
len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_nss = ");
3767
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
3768
len += scnprintf(buf + len, buf_len - len,
3769
"%d:%u,", i, htt_stats_buf->tx_su_ibf_nss[i]);
3770
len--;
3771
3772
len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_nss = ");
3773
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
3774
len += scnprintf(buf + len, buf_len - len,
3775
"%d:%u,", i, htt_stats_buf->tx_su_txbf_nss[i]);
3776
len--;
3777
3778
len += scnprintf(buf + len, buf_len - len, "\ntx_ol_bw = ");
3779
for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)
3780
len += scnprintf(buf + len, buf_len - len,
3781
"%d:%u,", i, htt_stats_buf->tx_su_ol_bw[i]);
3782
len--;
3783
3784
len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_bw = ");
3785
for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)
3786
len += scnprintf(buf + len, buf_len - len,
3787
"%d:%u,", i, htt_stats_buf->tx_su_ibf_bw[i]);
3788
len--;
3789
3790
len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_bw = ");
3791
for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)
3792
len += scnprintf(buf + len, buf_len - len,
3793
"%d:%u,", i, htt_stats_buf->tx_su_txbf_bw[i]);
3794
len--;
3795
3796
len += scnprintf(buf + len, buf_len - len, "\n");
3797
3798
stats_req->buf_len = len;
3799
}
3800
3801
static inline
3802
void htt_print_txbf_ofdma_ndpa_stats_tlv(const void *tag_buf,
3803
struct debug_htt_stats_req *stats_req)
3804
{
3805
const struct htt_txbf_ofdma_ndpa_stats_tlv *htt_stats_buf = tag_buf;
3806
u8 *buf = stats_req->buf;
3807
u32 len = stats_req->buf_len;
3808
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3809
int i;
3810
3811
len += scnprintf(buf + len, buf_len - len,
3812
"HTT_TXBF_OFDMA_NDPA_STATS_TLV:\n");
3813
3814
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
3815
len += scnprintf(buf + len, buf_len - len,
3816
"ax_ofdma_ndpa_queued_user%d = %u\n",
3817
i, htt_stats_buf->ax_ofdma_ndpa_queued[i]);
3818
len += scnprintf(buf + len, buf_len - len,
3819
"ax_ofdma_ndpa_tried_user%d = %u\n",
3820
i, htt_stats_buf->ax_ofdma_ndpa_tried[i]);
3821
len += scnprintf(buf + len, buf_len - len,
3822
"ax_ofdma_ndpa_flushed_user%d = %u\n",
3823
i, htt_stats_buf->ax_ofdma_ndpa_flushed[i]);
3824
len += scnprintf(buf + len, buf_len - len,
3825
"ax_ofdma_ndpa_err_user%d = %u\n",
3826
i, htt_stats_buf->ax_ofdma_ndpa_err[i]);
3827
len += scnprintf(buf + len, buf_len - len, "\n");
3828
}
3829
3830
stats_req->buf_len = len;
3831
}
3832
3833
static inline
3834
void htt_print_txbf_ofdma_ndp_stats_tlv(const void *tag_buf,
3835
struct debug_htt_stats_req *stats_req)
3836
{
3837
const struct htt_txbf_ofdma_ndp_stats_tlv *htt_stats_buf = tag_buf;
3838
u8 *buf = stats_req->buf;
3839
u32 len = stats_req->buf_len;
3840
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3841
int i;
3842
3843
len += scnprintf(buf + len, buf_len - len,
3844
"HTT_TXBF_OFDMA_NDP_STATS_TLV:\n");
3845
3846
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
3847
len += scnprintf(buf + len, buf_len - len,
3848
"ax_ofdma_ndp_queued_user%d = %u\n",
3849
i, htt_stats_buf->ax_ofdma_ndp_queued[i]);
3850
len += scnprintf(buf + len, buf_len - len,
3851
"ax_ofdma_ndp_tried_user%d = %u\n",
3852
i, htt_stats_buf->ax_ofdma_ndp_tried[i]);
3853
len += scnprintf(buf + len, buf_len - len,
3854
"ax_ofdma_ndp_flushed_user%d = %u\n",
3855
i, htt_stats_buf->ax_ofdma_ndp_flushed[i]);
3856
len += scnprintf(buf + len, buf_len - len,
3857
"ax_ofdma_ndp_err_user%d = %u\n",
3858
i, htt_stats_buf->ax_ofdma_ndp_err[i]);
3859
len += scnprintf(buf + len, buf_len - len, "\n");
3860
}
3861
3862
stats_req->buf_len = len;
3863
}
3864
3865
static inline
3866
void htt_print_txbf_ofdma_brp_stats_tlv(const void *tag_buf,
3867
struct debug_htt_stats_req *stats_req)
3868
{
3869
const struct htt_txbf_ofdma_brp_stats_tlv *htt_stats_buf = tag_buf;
3870
u8 *buf = stats_req->buf;
3871
u32 len = stats_req->buf_len;
3872
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3873
int i;
3874
3875
len += scnprintf(buf + len, buf_len - len,
3876
"HTT_TXBF_OFDMA_BRP_STATS_TLV:\n");
3877
3878
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
3879
len += scnprintf(buf + len, buf_len - len,
3880
"ax_ofdma_brpoll_queued_user%d = %u\n",
3881
i, htt_stats_buf->ax_ofdma_brpoll_queued[i]);
3882
len += scnprintf(buf + len, buf_len - len,
3883
"ax_ofdma_brpoll_tried_user%d = %u\n",
3884
i, htt_stats_buf->ax_ofdma_brpoll_tried[i]);
3885
len += scnprintf(buf + len, buf_len - len,
3886
"ax_ofdma_brpoll_flushed_user%d = %u\n",
3887
i, htt_stats_buf->ax_ofdma_brpoll_flushed[i]);
3888
len += scnprintf(buf + len, buf_len - len,
3889
"ax_ofdma_brp_err_user%d = %u\n",
3890
i, htt_stats_buf->ax_ofdma_brp_err[i]);
3891
len += scnprintf(buf + len, buf_len - len,
3892
"ax_ofdma_brp_err_num_cbf_rcvd_user%d = %u\n",
3893
i, htt_stats_buf->ax_ofdma_brp_err_num_cbf_rcvd[i]);
3894
len += scnprintf(buf + len, buf_len - len, "\n");
3895
}
3896
3897
stats_req->buf_len = len;
3898
}
3899
3900
static inline
3901
void htt_print_txbf_ofdma_steer_stats_tlv(const void *tag_buf,
3902
struct debug_htt_stats_req *stats_req)
3903
{
3904
const struct htt_txbf_ofdma_steer_stats_tlv *htt_stats_buf = tag_buf;
3905
u8 *buf = stats_req->buf;
3906
u32 len = stats_req->buf_len;
3907
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3908
int i;
3909
3910
len += scnprintf(buf + len, buf_len - len,
3911
"HTT_TXBF_OFDMA_STEER_STATS_TLV:\n");
3912
3913
for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
3914
len += scnprintf(buf + len, buf_len - len,
3915
"ax_ofdma_num_ppdu_steer_user%d = %u\n",
3916
i, htt_stats_buf->ax_ofdma_num_ppdu_steer[i]);
3917
len += scnprintf(buf + len, buf_len - len,
3918
"ax_ofdma_num_ppdu_ol_user%d = %u\n",
3919
i, htt_stats_buf->ax_ofdma_num_ppdu_ol[i]);
3920
len += scnprintf(buf + len, buf_len - len,
3921
"ax_ofdma_num_usrs_prefetch_user%d = %u\n",
3922
i, htt_stats_buf->ax_ofdma_num_usrs_prefetch[i]);
3923
len += scnprintf(buf + len, buf_len - len,
3924
"ax_ofdma_num_usrs_sound_user%d = %u\n",
3925
i, htt_stats_buf->ax_ofdma_num_usrs_sound[i]);
3926
len += scnprintf(buf + len, buf_len - len,
3927
"ax_ofdma_num_usrs_force_sound_user%d = %u\n",
3928
i, htt_stats_buf->ax_ofdma_num_usrs_force_sound[i]);
3929
len += scnprintf(buf + len, buf_len - len, "\n");
3930
}
3931
3932
stats_req->buf_len = len;
3933
}
3934
3935
static inline
3936
void htt_print_phy_counters_tlv(const void *tag_buf,
3937
struct debug_htt_stats_req *stats_req)
3938
{
3939
const struct htt_phy_counters_tlv *htt_stats_buf = tag_buf;
3940
u8 *buf = stats_req->buf;
3941
u32 len = stats_req->buf_len;
3942
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3943
int i;
3944
3945
len += scnprintf(buf + len, buf_len - len, "HTT_PHY_COUNTERS_TLV:\n");
3946
len += scnprintf(buf + len, buf_len - len, "rx_ofdma_timing_err_cnt = %u\n",
3947
htt_stats_buf->rx_ofdma_timing_err_cnt);
3948
len += scnprintf(buf + len, buf_len - len, "rx_cck_fail_cnt = %u\n",
3949
htt_stats_buf->rx_cck_fail_cnt);
3950
len += scnprintf(buf + len, buf_len - len, "mactx_abort_cnt = %u\n",
3951
htt_stats_buf->mactx_abort_cnt);
3952
len += scnprintf(buf + len, buf_len - len, "macrx_abort_cnt = %u\n",
3953
htt_stats_buf->macrx_abort_cnt);
3954
len += scnprintf(buf + len, buf_len - len, "phytx_abort_cnt = %u\n",
3955
htt_stats_buf->phytx_abort_cnt);
3956
len += scnprintf(buf + len, buf_len - len, "phyrx_abort_cnt = %u\n",
3957
htt_stats_buf->phyrx_abort_cnt);
3958
len += scnprintf(buf + len, buf_len - len, "phyrx_defer_abort_cnt = %u\n",
3959
htt_stats_buf->phyrx_defer_abort_cnt);
3960
len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_lstf_event_cnt = %u\n",
3961
htt_stats_buf->rx_gain_adj_lstf_event_cnt);
3962
len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_non_legacy_cnt = %u\n",
3963
htt_stats_buf->rx_gain_adj_non_legacy_cnt);
3964
3965
for (i = 0; i < HTT_MAX_RX_PKT_CNT; i++)
3966
len += scnprintf(buf + len, buf_len - len, "rx_pkt_cnt[%d] = %u\n",
3967
i, htt_stats_buf->rx_pkt_cnt[i]);
3968
3969
for (i = 0; i < HTT_MAX_RX_PKT_CRC_PASS_CNT; i++)
3970
len += scnprintf(buf + len, buf_len - len,
3971
"rx_pkt_crc_pass_cnt[%d] = %u\n",
3972
i, htt_stats_buf->rx_pkt_crc_pass_cnt[i]);
3973
3974
for (i = 0; i < HTT_MAX_PER_BLK_ERR_CNT; i++)
3975
len += scnprintf(buf + len, buf_len - len,
3976
"per_blk_err_cnt[%d] = %u\n",
3977
i, htt_stats_buf->per_blk_err_cnt[i]);
3978
3979
for (i = 0; i < HTT_MAX_RX_OTA_ERR_CNT; i++)
3980
len += scnprintf(buf + len, buf_len - len,
3981
"rx_ota_err_cnt[%d] = %u\n",
3982
i, htt_stats_buf->rx_ota_err_cnt[i]);
3983
3984
stats_req->buf_len = len;
3985
}
3986
3987
static inline
3988
void htt_print_phy_stats_tlv(const void *tag_buf,
3989
struct debug_htt_stats_req *stats_req)
3990
{
3991
const struct htt_phy_stats_tlv *htt_stats_buf = tag_buf;
3992
u8 *buf = stats_req->buf;
3993
u32 len = stats_req->buf_len;
3994
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
3995
int i;
3996
3997
len += scnprintf(buf + len, buf_len - len, "HTT_PHY_STATS_TLV:\n");
3998
3999
for (i = 0; i < HTT_STATS_MAX_CHAINS; i++)
4000
len += scnprintf(buf + len, buf_len - len, "nf_chain[%d] = %d\n",
4001
i, htt_stats_buf->nf_chain[i]);
4002
4003
len += scnprintf(buf + len, buf_len - len, "false_radar_cnt = %u\n",
4004
htt_stats_buf->false_radar_cnt);
4005
len += scnprintf(buf + len, buf_len - len, "radar_cs_cnt = %u\n",
4006
htt_stats_buf->radar_cs_cnt);
4007
len += scnprintf(buf + len, buf_len - len, "ani_level = %d\n",
4008
htt_stats_buf->ani_level);
4009
len += scnprintf(buf + len, buf_len - len, "fw_run_time = %u\n",
4010
htt_stats_buf->fw_run_time);
4011
4012
stats_req->buf_len = len;
4013
}
4014
4015
static inline void
4016
htt_print_phy_reset_counters_tlv(const void *tag_buf,
4017
u16 tag_len,
4018
struct debug_htt_stats_req *stats_req)
4019
{
4020
const struct htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf;
4021
u8 *buf = stats_req->buf;
4022
u32 len = stats_req->buf_len;
4023
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
4024
4025
if (tag_len < sizeof(*htt_stats_buf))
4026
return;
4027
4028
len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n");
4029
4030
len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",
4031
htt_stats_buf->pdev_id);
4032
len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n",
4033
htt_stats_buf->cf_active_low_fail_cnt);
4034
len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n",
4035
htt_stats_buf->cf_active_low_pass_cnt);
4036
len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n",
4037
htt_stats_buf->phy_off_through_vreg_cnt);
4038
len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n",
4039
htt_stats_buf->force_calibration_cnt);
4040
len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n",
4041
htt_stats_buf->rf_mode_switch_phy_off_cnt);
4042
4043
stats_req->buf_len = len;
4044
}
4045
4046
static inline void
4047
htt_print_phy_reset_stats_tlv(const void *tag_buf,
4048
u16 tag_len,
4049
struct debug_htt_stats_req *stats_req)
4050
{
4051
const struct htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf;
4052
u8 *buf = stats_req->buf;
4053
u32 len = stats_req->buf_len;
4054
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
4055
4056
if (tag_len < sizeof(*htt_stats_buf))
4057
return;
4058
4059
len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n");
4060
4061
len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n",
4062
htt_stats_buf->pdev_id);
4063
len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n",
4064
htt_stats_buf->chan_mhz);
4065
len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n",
4066
htt_stats_buf->chan_band_center_freq1);
4067
len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n",
4068
htt_stats_buf->chan_band_center_freq2);
4069
len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n",
4070
htt_stats_buf->chan_phy_mode);
4071
len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n",
4072
htt_stats_buf->chan_flags);
4073
len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",
4074
htt_stats_buf->chan_num);
4075
len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n",
4076
htt_stats_buf->reset_cause);
4077
len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n",
4078
htt_stats_buf->prev_reset_cause);
4079
len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n",
4080
htt_stats_buf->phy_warm_reset_src);
4081
len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n",
4082
htt_stats_buf->rx_gain_tbl_mode);
4083
len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n",
4084
htt_stats_buf->xbar_val);
4085
len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n",
4086
htt_stats_buf->force_calibration);
4087
len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n",
4088
htt_stats_buf->phyrf_mode);
4089
len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n",
4090
htt_stats_buf->phy_homechan);
4091
len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n",
4092
htt_stats_buf->phy_tx_ch_mask);
4093
len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n",
4094
htt_stats_buf->phy_rx_ch_mask);
4095
len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n",
4096
htt_stats_buf->phybb_ini_mask);
4097
len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n",
4098
htt_stats_buf->phyrf_ini_mask);
4099
len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n",
4100
htt_stats_buf->phy_dfs_en_mask);
4101
len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n",
4102
htt_stats_buf->phy_sscan_en_mask);
4103
len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n",
4104
htt_stats_buf->phy_synth_sel_mask);
4105
len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n",
4106
htt_stats_buf->phy_adfs_freq);
4107
len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n",
4108
htt_stats_buf->cck_fir_settings);
4109
len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n",
4110
htt_stats_buf->phy_dyn_pri_chan);
4111
len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n",
4112
htt_stats_buf->cca_thresh);
4113
len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n",
4114
htt_stats_buf->dyn_cca_status);
4115
len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n",
4116
htt_stats_buf->rxdesense_thresh_hw);
4117
len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n",
4118
htt_stats_buf->rxdesense_thresh_sw);
4119
4120
stats_req->buf_len = len;
4121
}
4122
4123
static inline
4124
void htt_print_peer_ctrl_path_txrx_stats_tlv(const void *tag_buf,
4125
struct debug_htt_stats_req *stats_req)
4126
{
4127
const struct htt_peer_ctrl_path_txrx_stats_tlv *htt_stat_buf = tag_buf;
4128
u8 *buf = stats_req->buf;
4129
u32 len = stats_req->buf_len;
4130
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
4131
int i;
4132
const char *mgmt_frm_type[ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1] = {
4133
"assoc_req", "assoc_resp",
4134
"reassoc_req", "reassoc_resp",
4135
"probe_req", "probe_resp",
4136
"timing_advertisement", "reserved",
4137
"beacon", "atim", "disassoc",
4138
"auth", "deauth", "action", "action_no_ack"};
4139
4140
len += scnprintf(buf + len, buf_len - len,
4141
"HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:\n");
4142
len += scnprintf(buf + len, buf_len - len,
4143
"peer_mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
4144
htt_stat_buf->peer_mac_addr[0], htt_stat_buf->peer_mac_addr[1],
4145
htt_stat_buf->peer_mac_addr[2], htt_stat_buf->peer_mac_addr[3],
4146
htt_stat_buf->peer_mac_addr[4], htt_stat_buf->peer_mac_addr[5]);
4147
4148
len += scnprintf(buf + len, buf_len - len, "peer_tx_mgmt_subtype:\n");
4149
for (i = 0; i < ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1; i++)
4150
len += scnprintf(buf + len, buf_len - len, "%s:%u\n",
4151
mgmt_frm_type[i],
4152
htt_stat_buf->peer_rx_mgmt_subtype[i]);
4153
4154
len += scnprintf(buf + len, buf_len - len, "peer_rx_mgmt_subtype:\n");
4155
for (i = 0; i < ATH11K_STATS_MGMT_FRM_TYPE_MAX - 1; i++)
4156
len += scnprintf(buf + len, buf_len - len, "%s:%u\n",
4157
mgmt_frm_type[i],
4158
htt_stat_buf->peer_rx_mgmt_subtype[i]);
4159
4160
len += scnprintf(buf + len, buf_len - len, "\n");
4161
4162
stats_req->buf_len = len;
4163
}
4164
4165
static int ath11k_dbg_htt_ext_stats_parse(struct ath11k_base *ab,
4166
u16 tag, u16 len, const void *tag_buf,
4167
void *user_data)
4168
{
4169
struct debug_htt_stats_req *stats_req = user_data;
4170
4171
switch (tag) {
4172
case HTT_STATS_TX_PDEV_CMN_TAG:
4173
htt_print_tx_pdev_stats_cmn_tlv(tag_buf, stats_req);
4174
break;
4175
case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4176
htt_print_tx_pdev_stats_urrn_tlv_v(tag_buf, len, stats_req);
4177
break;
4178
case HTT_STATS_TX_PDEV_SIFS_TAG:
4179
htt_print_tx_pdev_stats_sifs_tlv_v(tag_buf, len, stats_req);
4180
break;
4181
case HTT_STATS_TX_PDEV_FLUSH_TAG:
4182
htt_print_tx_pdev_stats_flush_tlv_v(tag_buf, len, stats_req);
4183
break;
4184
case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4185
htt_print_tx_pdev_stats_phy_err_tlv_v(tag_buf, len, stats_req);
4186
break;
4187
case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:
4188
htt_print_tx_pdev_stats_sifs_hist_tlv_v(tag_buf, len, stats_req);
4189
break;
4190
4191
case HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG:
4192
htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(tag_buf, stats_req);
4193
break;
4194
4195
case HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG:
4196
htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(tag_buf, len,
4197
stats_req);
4198
break;
4199
4200
case HTT_STATS_STRING_TAG:
4201
htt_print_stats_string_tlv(tag_buf, len, stats_req);
4202
break;
4203
4204
case HTT_STATS_TX_HWQ_CMN_TAG:
4205
htt_print_tx_hwq_stats_cmn_tlv(tag_buf, stats_req);
4206
break;
4207
4208
case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
4209
htt_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf, len, stats_req);
4210
break;
4211
4212
case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
4213
htt_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf, len, stats_req);
4214
break;
4215
4216
case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
4217
htt_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf, len, stats_req);
4218
break;
4219
4220
case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
4221
htt_print_tx_hwq_fes_result_stats_tlv_v(tag_buf, len, stats_req);
4222
break;
4223
4224
case HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG:
4225
htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(tag_buf, len, stats_req);
4226
break;
4227
4228
case HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG:
4229
htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(tag_buf, len, stats_req);
4230
break;
4231
case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
4232
htt_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf, len, stats_req);
4233
break;
4234
4235
case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
4236
htt_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf, len, stats_req);
4237
break;
4238
4239
case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
4240
htt_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf, len, stats_req);
4241
break;
4242
4243
case HTT_STATS_TX_TQM_CMN_TAG:
4244
htt_print_tx_tqm_cmn_stats_tlv(tag_buf, stats_req);
4245
break;
4246
4247
case HTT_STATS_TX_TQM_PDEV_TAG:
4248
htt_print_tx_tqm_pdev_stats_tlv_v(tag_buf, stats_req);
4249
break;
4250
4251
case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
4252
htt_print_tx_tqm_cmdq_status_tlv(tag_buf, stats_req);
4253
break;
4254
4255
case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
4256
htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, stats_req);
4257
break;
4258
4259
case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
4260
htt_print_tx_de_classify_failed_stats_tlv(tag_buf, stats_req);
4261
break;
4262
4263
case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
4264
htt_print_tx_de_classify_stats_tlv(tag_buf, stats_req);
4265
break;
4266
4267
case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
4268
htt_print_tx_de_classify_status_stats_tlv(tag_buf, stats_req);
4269
break;
4270
4271
case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
4272
htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, stats_req);
4273
break;
4274
4275
case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
4276
htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, stats_req);
4277
break;
4278
4279
case HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG:
4280
htt_print_tx_de_fw2wbm_ring_full_hist_tlv(tag_buf, len, stats_req);
4281
break;
4282
4283
case HTT_STATS_TX_DE_CMN_TAG:
4284
htt_print_tx_de_cmn_stats_tlv(tag_buf, stats_req);
4285
break;
4286
4287
case HTT_STATS_RING_IF_TAG:
4288
htt_print_ring_if_stats_tlv(tag_buf, stats_req);
4289
break;
4290
4291
case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
4292
htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, stats_req);
4293
break;
4294
4295
case HTT_STATS_SFM_CMN_TAG:
4296
htt_print_sfm_cmn_tlv(tag_buf, stats_req);
4297
break;
4298
4299
case HTT_STATS_SRING_STATS_TAG:
4300
htt_print_sring_stats_tlv(tag_buf, stats_req);
4301
break;
4302
4303
case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4304
htt_print_rx_pdev_fw_stats_tlv(tag_buf, stats_req);
4305
break;
4306
4307
case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4308
htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf, stats_req);
4309
break;
4310
4311
case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4312
htt_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf, len, stats_req);
4313
break;
4314
4315
case HTT_STATS_RX_SOC_FW_STATS_TAG:
4316
htt_print_rx_soc_fw_stats_tlv(tag_buf, stats_req);
4317
break;
4318
4319
case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4320
htt_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf, len, stats_req);
4321
break;
4322
4323
case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4324
htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4325
tag_buf, len, stats_req);
4326
break;
4327
case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
4328
htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(
4329
tag_buf, len, stats_req);
4330
break;
4331
4332
case HTT_STATS_RX_REFILL_REO_ERR_TAG:
4333
htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(
4334
tag_buf, len, stats_req);
4335
break;
4336
4337
case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
4338
htt_print_rx_reo_debug_stats_tlv_v(
4339
tag_buf, stats_req);
4340
break;
4341
case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
4342
htt_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf, stats_req);
4343
break;
4344
4345
case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
4346
htt_print_tx_pdev_rate_stats_tlv(tag_buf, stats_req);
4347
break;
4348
4349
case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
4350
htt_print_rx_pdev_rate_stats_tlv(tag_buf, stats_req);
4351
break;
4352
4353
case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
4354
htt_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf, stats_req);
4355
break;
4356
case HTT_STATS_TX_SCHED_CMN_TAG:
4357
htt_print_stats_tx_sched_cmn_tlv(tag_buf, stats_req);
4358
break;
4359
4360
case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
4361
htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, stats_req);
4362
break;
4363
4364
case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
4365
htt_print_sched_txq_cmd_posted_tlv_v(tag_buf, len, stats_req);
4366
break;
4367
4368
case HTT_STATS_RING_IF_CMN_TAG:
4369
htt_print_ring_if_cmn_tlv(tag_buf, stats_req);
4370
break;
4371
4372
case HTT_STATS_SFM_CLIENT_USER_TAG:
4373
htt_print_sfm_client_user_tlv_v(tag_buf, len, stats_req);
4374
break;
4375
4376
case HTT_STATS_SFM_CLIENT_TAG:
4377
htt_print_sfm_client_tlv(tag_buf, stats_req);
4378
break;
4379
4380
case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
4381
htt_print_tx_tqm_error_stats_tlv(tag_buf, stats_req);
4382
break;
4383
4384
case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
4385
htt_print_sched_txq_cmd_reaped_tlv_v(tag_buf, len, stats_req);
4386
break;
4387
4388
case HTT_STATS_SRING_CMN_TAG:
4389
htt_print_sring_cmn_tlv(tag_buf, stats_req);
4390
break;
4391
4392
case HTT_STATS_TX_SOUNDING_STATS_TAG:
4393
htt_print_tx_sounding_stats_tlv(tag_buf, stats_req);
4394
break;
4395
4396
case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
4397
htt_print_tx_selfgen_ac_err_stats_tlv(tag_buf, stats_req);
4398
break;
4399
4400
case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
4401
htt_print_tx_selfgen_cmn_stats_tlv(tag_buf, stats_req);
4402
break;
4403
4404
case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
4405
htt_print_tx_selfgen_ac_stats_tlv(tag_buf, stats_req);
4406
break;
4407
4408
case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
4409
htt_print_tx_selfgen_ax_stats_tlv(tag_buf, stats_req);
4410
break;
4411
4412
case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
4413
htt_print_tx_selfgen_ax_err_stats_tlv(tag_buf, stats_req);
4414
break;
4415
4416
case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
4417
htt_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf, stats_req);
4418
break;
4419
4420
case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
4421
htt_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf, stats_req);
4422
break;
4423
4424
case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
4425
htt_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf, stats_req);
4426
break;
4427
4428
case HTT_STATS_HW_INTR_MISC_TAG:
4429
htt_print_hw_stats_intr_misc_tlv(tag_buf, stats_req);
4430
break;
4431
4432
case HTT_STATS_HW_WD_TIMEOUT_TAG:
4433
htt_print_hw_stats_wd_timeout_tlv(tag_buf, stats_req);
4434
break;
4435
4436
case HTT_STATS_HW_PDEV_ERRS_TAG:
4437
htt_print_hw_stats_pdev_errs_tlv(tag_buf, stats_req);
4438
break;
4439
4440
case HTT_STATS_COUNTER_NAME_TAG:
4441
htt_print_counter_tlv(tag_buf, stats_req);
4442
break;
4443
4444
case HTT_STATS_TX_TID_DETAILS_TAG:
4445
htt_print_tx_tid_stats_tlv(tag_buf, stats_req);
4446
break;
4447
4448
case HTT_STATS_TX_TID_DETAILS_V1_TAG:
4449
htt_print_tx_tid_stats_v1_tlv(tag_buf, stats_req);
4450
break;
4451
4452
case HTT_STATS_RX_TID_DETAILS_TAG:
4453
htt_print_rx_tid_stats_tlv(tag_buf, stats_req);
4454
break;
4455
4456
case HTT_STATS_PEER_STATS_CMN_TAG:
4457
htt_print_peer_stats_cmn_tlv(tag_buf, stats_req);
4458
break;
4459
4460
case HTT_STATS_PEER_DETAILS_TAG:
4461
htt_print_peer_details_tlv(tag_buf, stats_req);
4462
break;
4463
4464
case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
4465
htt_print_msdu_flow_stats_tlv(tag_buf, stats_req);
4466
break;
4467
4468
case HTT_STATS_PEER_TX_RATE_STATS_TAG:
4469
htt_print_tx_peer_rate_stats_tlv(tag_buf, stats_req);
4470
break;
4471
4472
case HTT_STATS_PEER_RX_RATE_STATS_TAG:
4473
htt_print_rx_peer_rate_stats_tlv(tag_buf, stats_req);
4474
break;
4475
4476
case HTT_STATS_TX_DE_COMPL_STATS_TAG:
4477
htt_print_tx_de_compl_stats_tlv(tag_buf, stats_req);
4478
break;
4479
4480
case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG:
4481
case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG:
4482
case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG:
4483
htt_print_pdev_cca_stats_hist_tlv(tag_buf, stats_req);
4484
break;
4485
4486
case HTT_STATS_PDEV_CCA_COUNTERS_TAG:
4487
htt_print_pdev_stats_cca_counters_tlv(tag_buf, stats_req);
4488
break;
4489
4490
case HTT_STATS_WHAL_TX_TAG:
4491
htt_print_hw_stats_whal_tx_tlv(tag_buf, stats_req);
4492
break;
4493
4494
case HTT_STATS_PDEV_TWT_SESSIONS_TAG:
4495
htt_print_pdev_stats_twt_sessions_tlv(tag_buf, stats_req);
4496
break;
4497
4498
case HTT_STATS_PDEV_TWT_SESSION_TAG:
4499
htt_print_pdev_stats_twt_session_tlv(tag_buf, stats_req);
4500
break;
4501
4502
case HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG:
4503
htt_print_sched_txq_sched_order_su_tlv_v(tag_buf, len, stats_req);
4504
break;
4505
4506
case HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG:
4507
htt_print_sched_txq_sched_ineligibility_tlv_v(tag_buf, len, stats_req);
4508
break;
4509
4510
case HTT_STATS_PDEV_OBSS_PD_TAG:
4511
htt_print_pdev_obss_pd_stats_tlv_v(tag_buf, stats_req);
4512
break;
4513
case HTT_STATS_RING_BACKPRESSURE_STATS_TAG:
4514
htt_print_backpressure_stats_tlv_v(tag_buf, user_data);
4515
break;
4516
case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG:
4517
htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, stats_req);
4518
break;
4519
case HTT_STATS_TXBF_OFDMA_NDPA_STATS_TAG:
4520
htt_print_txbf_ofdma_ndpa_stats_tlv(tag_buf, stats_req);
4521
break;
4522
case HTT_STATS_TXBF_OFDMA_NDP_STATS_TAG:
4523
htt_print_txbf_ofdma_ndp_stats_tlv(tag_buf, stats_req);
4524
break;
4525
case HTT_STATS_TXBF_OFDMA_BRP_STATS_TAG:
4526
htt_print_txbf_ofdma_brp_stats_tlv(tag_buf, stats_req);
4527
break;
4528
case HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG:
4529
htt_print_txbf_ofdma_steer_stats_tlv(tag_buf, stats_req);
4530
break;
4531
case HTT_STATS_PHY_COUNTERS_TAG:
4532
htt_print_phy_counters_tlv(tag_buf, stats_req);
4533
break;
4534
case HTT_STATS_PHY_STATS_TAG:
4535
htt_print_phy_stats_tlv(tag_buf, stats_req);
4536
break;
4537
case HTT_STATS_PHY_RESET_COUNTERS_TAG:
4538
htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req);
4539
break;
4540
case HTT_STATS_PHY_RESET_STATS_TAG:
4541
htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req);
4542
break;
4543
case HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:
4544
htt_print_peer_ctrl_path_txrx_stats_tlv(tag_buf, stats_req);
4545
break;
4546
default:
4547
break;
4548
}
4549
4550
return 0;
4551
}
4552
4553
void ath11k_debugfs_htt_ext_stats_handler(struct ath11k_base *ab,
4554
struct sk_buff *skb)
4555
{
4556
struct ath11k_htt_extd_stats_msg *msg;
4557
struct debug_htt_stats_req *stats_req;
4558
struct ath11k *ar;
4559
u32 len;
4560
u64 cookie;
4561
int ret;
4562
bool send_completion = false;
4563
u8 pdev_id;
4564
4565
msg = (struct ath11k_htt_extd_stats_msg *)skb->data;
4566
cookie = msg->cookie;
4567
4568
if (FIELD_GET(HTT_STATS_COOKIE_MSB, cookie) != HTT_STATS_MAGIC_VALUE) {
4569
ath11k_warn(ab, "received invalid htt ext stats event\n");
4570
return;
4571
}
4572
4573
pdev_id = FIELD_GET(HTT_STATS_COOKIE_LSB, cookie);
4574
rcu_read_lock();
4575
ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id);
4576
rcu_read_unlock();
4577
if (!ar) {
4578
ath11k_warn(ab, "failed to get ar for pdev_id %d\n", pdev_id);
4579
return;
4580
}
4581
4582
stats_req = ar->debug.htt_stats.stats_req;
4583
if (!stats_req)
4584
return;
4585
4586
spin_lock_bh(&ar->debug.htt_stats.lock);
4587
4588
stats_req->done = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_DONE, msg->info1);
4589
if (stats_req->done)
4590
send_completion = true;
4591
4592
spin_unlock_bh(&ar->debug.htt_stats.lock);
4593
4594
len = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_LENGTH, msg->info1);
4595
ret = ath11k_dp_htt_tlv_iter(ab, msg->data, len,
4596
ath11k_dbg_htt_ext_stats_parse,
4597
stats_req);
4598
if (ret)
4599
ath11k_warn(ab, "Failed to parse tlv %d\n", ret);
4600
4601
if (send_completion)
4602
complete(&stats_req->cmpln);
4603
}
4604
4605
static ssize_t ath11k_read_htt_stats_type(struct file *file,
4606
char __user *user_buf,
4607
size_t count, loff_t *ppos)
4608
{
4609
struct ath11k *ar = file->private_data;
4610
char buf[32];
4611
size_t len;
4612
4613
len = scnprintf(buf, sizeof(buf), "%u\n", ar->debug.htt_stats.type);
4614
4615
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
4616
}
4617
4618
static ssize_t ath11k_write_htt_stats_type(struct file *file,
4619
const char __user *user_buf,
4620
size_t count, loff_t *ppos)
4621
{
4622
struct ath11k *ar = file->private_data;
4623
u8 type;
4624
int ret;
4625
4626
ret = kstrtou8_from_user(user_buf, count, 0, &type);
4627
if (ret)
4628
return ret;
4629
4630
if (type >= ATH11K_DBG_HTT_NUM_EXT_STATS)
4631
return -E2BIG;
4632
4633
if (type == ATH11K_DBG_HTT_EXT_STATS_RESET)
4634
return -EPERM;
4635
4636
ar->debug.htt_stats.type = type;
4637
4638
ret = count;
4639
4640
return ret;
4641
}
4642
4643
static const struct file_operations fops_htt_stats_type = {
4644
.read = ath11k_read_htt_stats_type,
4645
.write = ath11k_write_htt_stats_type,
4646
.open = simple_open,
4647
.owner = THIS_MODULE,
4648
.llseek = default_llseek,
4649
};
4650
4651
static int ath11k_prep_htt_stats_cfg_params(struct ath11k *ar, u8 type,
4652
const u8 *mac_addr,
4653
struct htt_ext_stats_cfg_params *cfg_params)
4654
{
4655
if (!cfg_params)
4656
return -EINVAL;
4657
4658
switch (type) {
4659
case ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_HWQ:
4660
case ATH11K_DBG_HTT_EXT_STATS_TX_MU_HWQ:
4661
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_HWQS;
4662
break;
4663
case ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED:
4664
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_TXQS;
4665
break;
4666
case ATH11K_DBG_HTT_EXT_STATS_TQM_CMDQ:
4667
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_CMDQS;
4668
break;
4669
case ATH11K_DBG_HTT_EXT_STATS_PEER_INFO:
4670
cfg_params->cfg0 = HTT_STAT_PEER_INFO_MAC_ADDR;
4671
cfg_params->cfg0 |= FIELD_PREP(GENMASK(15, 1),
4672
HTT_PEER_STATS_REQ_MODE_FLUSH_TQM);
4673
cfg_params->cfg1 = HTT_STAT_DEFAULT_PEER_REQ_TYPE;
4674
cfg_params->cfg2 |= FIELD_PREP(GENMASK(7, 0), mac_addr[0]);
4675
cfg_params->cfg2 |= FIELD_PREP(GENMASK(15, 8), mac_addr[1]);
4676
cfg_params->cfg2 |= FIELD_PREP(GENMASK(23, 16), mac_addr[2]);
4677
cfg_params->cfg2 |= FIELD_PREP(GENMASK(31, 24), mac_addr[3]);
4678
cfg_params->cfg3 |= FIELD_PREP(GENMASK(7, 0), mac_addr[4]);
4679
cfg_params->cfg3 |= FIELD_PREP(GENMASK(15, 8), mac_addr[5]);
4680
break;
4681
case ATH11K_DBG_HTT_EXT_STATS_RING_IF_INFO:
4682
case ATH11K_DBG_HTT_EXT_STATS_SRNG_INFO:
4683
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ALL_RINGS;
4684
break;
4685
case ATH11K_DBG_HTT_EXT_STATS_ACTIVE_PEERS_LIST:
4686
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ACTIVE_PEERS;
4687
break;
4688
case ATH11K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS:
4689
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_CCA_CUMULATIVE;
4690
break;
4691
case ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO:
4692
cfg_params->cfg0 = HTT_STAT_DEFAULT_CFG0_ACTIVE_VDEVS;
4693
break;
4694
case ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS:
4695
cfg_params->cfg0 = HTT_STAT_PEER_INFO_MAC_ADDR;
4696
cfg_params->cfg1 |= FIELD_PREP(GENMASK(7, 0), mac_addr[0]);
4697
cfg_params->cfg1 |= FIELD_PREP(GENMASK(15, 8), mac_addr[1]);
4698
cfg_params->cfg1 |= FIELD_PREP(GENMASK(23, 16), mac_addr[2]);
4699
cfg_params->cfg1 |= FIELD_PREP(GENMASK(31, 24), mac_addr[3]);
4700
cfg_params->cfg2 |= FIELD_PREP(GENMASK(7, 0), mac_addr[4]);
4701
cfg_params->cfg2 |= FIELD_PREP(GENMASK(15, 8), mac_addr[5]);
4702
break;
4703
default:
4704
break;
4705
}
4706
4707
return 0;
4708
}
4709
4710
int ath11k_debugfs_htt_stats_req(struct ath11k *ar)
4711
{
4712
struct debug_htt_stats_req *stats_req = ar->debug.htt_stats.stats_req;
4713
u8 type = stats_req->type;
4714
u64 cookie = 0;
4715
int ret, pdev_id = ar->pdev->pdev_id;
4716
struct htt_ext_stats_cfg_params cfg_params = {};
4717
4718
init_completion(&stats_req->cmpln);
4719
4720
stats_req->done = false;
4721
stats_req->pdev_id = pdev_id;
4722
4723
cookie = FIELD_PREP(HTT_STATS_COOKIE_MSB, HTT_STATS_MAGIC_VALUE) |
4724
FIELD_PREP(HTT_STATS_COOKIE_LSB, pdev_id);
4725
4726
ret = ath11k_prep_htt_stats_cfg_params(ar, type, stats_req->peer_addr,
4727
&cfg_params);
4728
if (ret) {
4729
ath11k_warn(ar->ab, "failed to set htt stats cfg params: %d\n", ret);
4730
return ret;
4731
}
4732
4733
ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar, type, &cfg_params, cookie);
4734
if (ret) {
4735
ath11k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);
4736
return ret;
4737
}
4738
4739
while (!wait_for_completion_timeout(&stats_req->cmpln, 3 * HZ)) {
4740
spin_lock_bh(&ar->debug.htt_stats.lock);
4741
if (!stats_req->done) {
4742
stats_req->done = true;
4743
spin_unlock_bh(&ar->debug.htt_stats.lock);
4744
ath11k_warn(ar->ab, "stats request timed out\n");
4745
return -ETIMEDOUT;
4746
}
4747
spin_unlock_bh(&ar->debug.htt_stats.lock);
4748
}
4749
4750
return 0;
4751
}
4752
4753
static int ath11k_open_htt_stats(struct inode *inode, struct file *file)
4754
{
4755
struct ath11k *ar = inode->i_private;
4756
struct debug_htt_stats_req *stats_req;
4757
u8 type = ar->debug.htt_stats.type;
4758
int ret;
4759
4760
if (type == ATH11K_DBG_HTT_EXT_STATS_RESET ||
4761
type == ATH11K_DBG_HTT_EXT_STATS_PEER_INFO ||
4762
type == ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS)
4763
return -EPERM;
4764
4765
mutex_lock(&ar->conf_mutex);
4766
4767
if (ar->state != ATH11K_STATE_ON) {
4768
ret = -ENETDOWN;
4769
goto err_unlock;
4770
}
4771
4772
if (ar->debug.htt_stats.stats_req) {
4773
ret = -EAGAIN;
4774
goto err_unlock;
4775
}
4776
4777
stats_req = vzalloc(sizeof(*stats_req) + ATH11K_HTT_STATS_BUF_SIZE);
4778
if (!stats_req) {
4779
ret = -ENOMEM;
4780
goto err_unlock;
4781
}
4782
4783
ar->debug.htt_stats.stats_req = stats_req;
4784
stats_req->type = type;
4785
4786
ret = ath11k_debugfs_htt_stats_req(ar);
4787
if (ret < 0)
4788
goto out;
4789
4790
file->private_data = stats_req;
4791
4792
mutex_unlock(&ar->conf_mutex);
4793
4794
return 0;
4795
out:
4796
vfree(stats_req);
4797
ar->debug.htt_stats.stats_req = NULL;
4798
err_unlock:
4799
mutex_unlock(&ar->conf_mutex);
4800
4801
return ret;
4802
}
4803
4804
static int ath11k_release_htt_stats(struct inode *inode, struct file *file)
4805
{
4806
struct ath11k *ar = inode->i_private;
4807
4808
mutex_lock(&ar->conf_mutex);
4809
vfree(file->private_data);
4810
ar->debug.htt_stats.stats_req = NULL;
4811
mutex_unlock(&ar->conf_mutex);
4812
4813
return 0;
4814
}
4815
4816
static ssize_t ath11k_read_htt_stats(struct file *file,
4817
char __user *user_buf,
4818
size_t count, loff_t *ppos)
4819
{
4820
struct debug_htt_stats_req *stats_req = file->private_data;
4821
char *buf;
4822
u32 length = 0;
4823
4824
buf = stats_req->buf;
4825
length = min_t(u32, stats_req->buf_len, ATH11K_HTT_STATS_BUF_SIZE);
4826
return simple_read_from_buffer(user_buf, count, ppos, buf, length);
4827
}
4828
4829
static const struct file_operations fops_dump_htt_stats = {
4830
.open = ath11k_open_htt_stats,
4831
.release = ath11k_release_htt_stats,
4832
.read = ath11k_read_htt_stats,
4833
.owner = THIS_MODULE,
4834
.llseek = default_llseek,
4835
};
4836
4837
static ssize_t ath11k_read_htt_stats_reset(struct file *file,
4838
char __user *user_buf,
4839
size_t count, loff_t *ppos)
4840
{
4841
struct ath11k *ar = file->private_data;
4842
char buf[32];
4843
size_t len;
4844
4845
len = scnprintf(buf, sizeof(buf), "%u\n", ar->debug.htt_stats.reset);
4846
4847
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
4848
}
4849
4850
static ssize_t ath11k_write_htt_stats_reset(struct file *file,
4851
const char __user *user_buf,
4852
size_t count, loff_t *ppos)
4853
{
4854
struct ath11k *ar = file->private_data;
4855
u8 type;
4856
struct htt_ext_stats_cfg_params cfg_params = {};
4857
int ret;
4858
4859
ret = kstrtou8_from_user(user_buf, count, 0, &type);
4860
if (ret)
4861
return ret;
4862
4863
if (type >= ATH11K_DBG_HTT_NUM_EXT_STATS ||
4864
type == ATH11K_DBG_HTT_EXT_STATS_RESET)
4865
return -E2BIG;
4866
4867
mutex_lock(&ar->conf_mutex);
4868
cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET;
4869
cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type);
4870
ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar,
4871
ATH11K_DBG_HTT_EXT_STATS_RESET,
4872
&cfg_params,
4873
0ULL);
4874
if (ret) {
4875
ath11k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);
4876
mutex_unlock(&ar->conf_mutex);
4877
return ret;
4878
}
4879
4880
ar->debug.htt_stats.reset = type;
4881
mutex_unlock(&ar->conf_mutex);
4882
4883
ret = count;
4884
4885
return ret;
4886
}
4887
4888
static const struct file_operations fops_htt_stats_reset = {
4889
.read = ath11k_read_htt_stats_reset,
4890
.write = ath11k_write_htt_stats_reset,
4891
.open = simple_open,
4892
.owner = THIS_MODULE,
4893
.llseek = default_llseek,
4894
};
4895
4896
void ath11k_debugfs_htt_stats_init(struct ath11k *ar)
4897
{
4898
spin_lock_init(&ar->debug.htt_stats.lock);
4899
debugfs_create_file("htt_stats_type", 0600, ar->debug.debugfs_pdev,
4900
ar, &fops_htt_stats_type);
4901
debugfs_create_file("htt_stats", 0400, ar->debug.debugfs_pdev,
4902
ar, &fops_dump_htt_stats);
4903
debugfs_create_file("htt_stats_reset", 0600, ar->debug.debugfs_pdev,
4904
ar, &fops_htt_stats_reset);
4905
}
4906
4907