]> Git Repo - J-linux.git/blob - drivers/net/wireless/ath/ath10k/debug.c
Merge tag 'amd-drm-next-6.5-2023-06-09' of https://gitlab.freedesktop.org/agd5f/linux...
[J-linux.git] / drivers / net / wireless / ath / ath10k / debug.c
1 // SPDX-License-Identifier: ISC
2 /*
3  * Copyright (c) 2005-2011 Atheros Communications Inc.
4  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
5  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
6  */
7
8 #include <linux/module.h>
9 #include <linux/debugfs.h>
10 #include <linux/vmalloc.h>
11 #include <linux/crc32.h>
12 #include <linux/firmware.h>
13 #include <linux/kstrtox.h>
14
15 #include "core.h"
16 #include "debug.h"
17 #include "hif.h"
18 #include "wmi-ops.h"
19
20 /* ms */
21 #define ATH10K_DEBUG_HTT_STATS_INTERVAL 1000
22
23 #define ATH10K_DEBUG_CAL_DATA_LEN 12064
24
25 void ath10k_info(struct ath10k *ar, const char *fmt, ...)
26 {
27         struct va_format vaf = {
28                 .fmt = fmt,
29         };
30         va_list args;
31
32         va_start(args, fmt);
33         vaf.va = &args;
34         dev_info(ar->dev, "%pV", &vaf);
35         trace_ath10k_log_info(ar, &vaf);
36         va_end(args);
37 }
38 EXPORT_SYMBOL(ath10k_info);
39
40 void ath10k_debug_print_hwfw_info(struct ath10k *ar)
41 {
42         const struct firmware *firmware;
43         char fw_features[128] = {};
44         u32 crc = 0;
45
46         ath10k_core_get_fw_features_str(ar, fw_features, sizeof(fw_features));
47
48         ath10k_info(ar, "%s target 0x%08x chip_id 0x%08x sub %04x:%04x",
49                     ar->hw_params.name,
50                     ar->target_version,
51                     ar->bus_param.chip_id,
52                     ar->id.subsystem_vendor, ar->id.subsystem_device);
53
54         ath10k_info(ar, "kconfig debug %d debugfs %d tracing %d dfs %d testmode %d\n",
55                     IS_ENABLED(CONFIG_ATH10K_DEBUG),
56                     IS_ENABLED(CONFIG_ATH10K_DEBUGFS),
57                     IS_ENABLED(CONFIG_ATH10K_TRACING),
58                     IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED),
59                     IS_ENABLED(CONFIG_NL80211_TESTMODE));
60
61         firmware = ar->normal_mode_fw.fw_file.firmware;
62         if (firmware)
63                 crc = crc32_le(0, firmware->data, firmware->size);
64
65         ath10k_info(ar, "firmware ver %s api %d features %s crc32 %08x\n",
66                     ar->hw->wiphy->fw_version,
67                     ar->fw_api,
68                     fw_features,
69                     crc);
70 }
71
72 void ath10k_debug_print_board_info(struct ath10k *ar)
73 {
74         char boardinfo[100];
75         const struct firmware *board;
76         u32 crc;
77
78         if (ar->id.bmi_ids_valid)
79                 scnprintf(boardinfo, sizeof(boardinfo), "%d:%d",
80                           ar->id.bmi_chip_id, ar->id.bmi_board_id);
81         else
82                 scnprintf(boardinfo, sizeof(boardinfo), "N/A");
83
84         board = ar->normal_mode_fw.board;
85         if (!IS_ERR_OR_NULL(board))
86                 crc = crc32_le(0, board->data, board->size);
87         else
88                 crc = 0;
89
90         ath10k_info(ar, "board_file api %d bmi_id %s crc32 %08x",
91                     ar->bd_api,
92                     boardinfo,
93                     crc);
94 }
95
96 void ath10k_debug_print_boot_info(struct ath10k *ar)
97 {
98         ath10k_info(ar, "htt-ver %d.%d wmi-op %d htt-op %d cal %s max-sta %d raw %d hwcrypto %d\n",
99                     ar->htt.target_version_major,
100                     ar->htt.target_version_minor,
101                     ar->normal_mode_fw.fw_file.wmi_op_version,
102                     ar->normal_mode_fw.fw_file.htt_op_version,
103                     ath10k_cal_mode_str(ar->cal_mode),
104                     ar->max_num_stations,
105                     test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags),
106                     !test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags));
107 }
108
109 void ath10k_print_driver_info(struct ath10k *ar)
110 {
111         ath10k_debug_print_hwfw_info(ar);
112         ath10k_debug_print_board_info(ar);
113         ath10k_debug_print_boot_info(ar);
114 }
115 EXPORT_SYMBOL(ath10k_print_driver_info);
116
117 void ath10k_err(struct ath10k *ar, const char *fmt, ...)
118 {
119         struct va_format vaf = {
120                 .fmt = fmt,
121         };
122         va_list args;
123
124         va_start(args, fmt);
125         vaf.va = &args;
126         dev_err(ar->dev, "%pV", &vaf);
127         trace_ath10k_log_err(ar, &vaf);
128         va_end(args);
129 }
130 EXPORT_SYMBOL(ath10k_err);
131
132 void ath10k_warn(struct ath10k *ar, const char *fmt, ...)
133 {
134         struct va_format vaf = {
135                 .fmt = fmt,
136         };
137         va_list args;
138
139         va_start(args, fmt);
140         vaf.va = &args;
141         dev_warn_ratelimited(ar->dev, "%pV", &vaf);
142         trace_ath10k_log_warn(ar, &vaf);
143
144         va_end(args);
145 }
146 EXPORT_SYMBOL(ath10k_warn);
147
148 #ifdef CONFIG_ATH10K_DEBUGFS
149
150 static ssize_t ath10k_read_wmi_services(struct file *file,
151                                         char __user *user_buf,
152                                         size_t count, loff_t *ppos)
153 {
154         struct ath10k *ar = file->private_data;
155         char *buf;
156         size_t len = 0, buf_len = 8192;
157         const char *name;
158         ssize_t ret_cnt;
159         bool enabled;
160         int i;
161
162         buf = kzalloc(buf_len, GFP_KERNEL);
163         if (!buf)
164                 return -ENOMEM;
165
166         mutex_lock(&ar->conf_mutex);
167
168         spin_lock_bh(&ar->data_lock);
169         for (i = 0; i < WMI_SERVICE_MAX; i++) {
170                 enabled = test_bit(i, ar->wmi.svc_map);
171                 name = wmi_service_name(i);
172
173                 if (!name) {
174                         if (enabled)
175                                 len += scnprintf(buf + len, buf_len - len,
176                                                  "%-40s %s (bit %d)\n",
177                                                  "unknown", "enabled", i);
178
179                         continue;
180                 }
181
182                 len += scnprintf(buf + len, buf_len - len,
183                                  "%-40s %s\n",
184                                  name, enabled ? "enabled" : "-");
185         }
186         spin_unlock_bh(&ar->data_lock);
187
188         ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
189
190         mutex_unlock(&ar->conf_mutex);
191
192         kfree(buf);
193         return ret_cnt;
194 }
195
196 static const struct file_operations fops_wmi_services = {
197         .read = ath10k_read_wmi_services,
198         .open = simple_open,
199         .owner = THIS_MODULE,
200         .llseek = default_llseek,
201 };
202
203 static void ath10k_fw_stats_pdevs_free(struct list_head *head)
204 {
205         struct ath10k_fw_stats_pdev *i, *tmp;
206
207         list_for_each_entry_safe(i, tmp, head, list) {
208                 list_del(&i->list);
209                 kfree(i);
210         }
211 }
212
213 static void ath10k_fw_stats_vdevs_free(struct list_head *head)
214 {
215         struct ath10k_fw_stats_vdev *i, *tmp;
216
217         list_for_each_entry_safe(i, tmp, head, list) {
218                 list_del(&i->list);
219                 kfree(i);
220         }
221 }
222
223 static void ath10k_fw_stats_peers_free(struct list_head *head)
224 {
225         struct ath10k_fw_stats_peer *i, *tmp;
226
227         list_for_each_entry_safe(i, tmp, head, list) {
228                 list_del(&i->list);
229                 kfree(i);
230         }
231 }
232
233 static void ath10k_fw_extd_stats_peers_free(struct list_head *head)
234 {
235         struct ath10k_fw_extd_stats_peer *i, *tmp;
236
237         list_for_each_entry_safe(i, tmp, head, list) {
238                 list_del(&i->list);
239                 kfree(i);
240         }
241 }
242
243 static void ath10k_debug_fw_stats_reset(struct ath10k *ar)
244 {
245         spin_lock_bh(&ar->data_lock);
246         ar->debug.fw_stats_done = false;
247         ar->debug.fw_stats.extended = false;
248         ath10k_fw_stats_pdevs_free(&ar->debug.fw_stats.pdevs);
249         ath10k_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs);
250         ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers);
251         ath10k_fw_extd_stats_peers_free(&ar->debug.fw_stats.peers_extd);
252         spin_unlock_bh(&ar->data_lock);
253 }
254
255 void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
256 {
257         struct ath10k_fw_stats stats = {};
258         bool is_start, is_started, is_end;
259         size_t num_peers;
260         size_t num_vdevs;
261         int ret;
262
263         INIT_LIST_HEAD(&stats.pdevs);
264         INIT_LIST_HEAD(&stats.vdevs);
265         INIT_LIST_HEAD(&stats.peers);
266         INIT_LIST_HEAD(&stats.peers_extd);
267
268         spin_lock_bh(&ar->data_lock);
269         ret = ath10k_wmi_pull_fw_stats(ar, skb, &stats);
270         if (ret) {
271                 ath10k_warn(ar, "failed to pull fw stats: %d\n", ret);
272                 goto free;
273         }
274
275         /* Stat data may exceed htc-wmi buffer limit. In such case firmware
276          * splits the stats data and delivers it in a ping-pong fashion of
277          * request cmd-update event.
278          *
279          * However there is no explicit end-of-data. Instead start-of-data is
280          * used as an implicit one. This works as follows:
281          *  a) discard stat update events until one with pdev stats is
282          *     delivered - this skips session started at end of (b)
283          *  b) consume stat update events until another one with pdev stats is
284          *     delivered which is treated as end-of-data and is itself discarded
285          */
286         if (ath10k_peer_stats_enabled(ar))
287                 ath10k_sta_update_rx_duration(ar, &stats);
288
289         if (ar->debug.fw_stats_done) {
290                 if (!ath10k_peer_stats_enabled(ar))
291                         ath10k_warn(ar, "received unsolicited stats update event\n");
292
293                 goto free;
294         }
295
296         num_peers = ath10k_wmi_fw_stats_num_peers(&ar->debug.fw_stats.peers);
297         num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&ar->debug.fw_stats.vdevs);
298         is_start = (list_empty(&ar->debug.fw_stats.pdevs) &&
299                     !list_empty(&stats.pdevs));
300         is_end = (!list_empty(&ar->debug.fw_stats.pdevs) &&
301                   !list_empty(&stats.pdevs));
302
303         if (is_start)
304                 list_splice_tail_init(&stats.pdevs, &ar->debug.fw_stats.pdevs);
305
306         if (is_end)
307                 ar->debug.fw_stats_done = true;
308
309         if (stats.extended)
310                 ar->debug.fw_stats.extended = true;
311
312         is_started = !list_empty(&ar->debug.fw_stats.pdevs);
313
314         if (is_started && !is_end) {
315                 if (num_peers >= ATH10K_MAX_NUM_PEER_IDS) {
316                         /* Although this is unlikely impose a sane limit to
317                          * prevent firmware from DoS-ing the host.
318                          */
319                         ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers);
320                         ath10k_fw_extd_stats_peers_free(&ar->debug.fw_stats.peers_extd);
321                         ath10k_warn(ar, "dropping fw peer stats\n");
322                         goto free;
323                 }
324
325                 if (num_vdevs >= BITS_PER_LONG) {
326                         ath10k_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs);
327                         ath10k_warn(ar, "dropping fw vdev stats\n");
328                         goto free;
329                 }
330
331                 if (!list_empty(&stats.peers))
332                         list_splice_tail_init(&stats.peers_extd,
333                                               &ar->debug.fw_stats.peers_extd);
334
335                 list_splice_tail_init(&stats.peers, &ar->debug.fw_stats.peers);
336                 list_splice_tail_init(&stats.vdevs, &ar->debug.fw_stats.vdevs);
337         }
338
339         complete(&ar->debug.fw_stats_complete);
340
341 free:
342         /* In some cases lists have been spliced and cleared. Free up
343          * resources if that is not the case.
344          */
345         ath10k_fw_stats_pdevs_free(&stats.pdevs);
346         ath10k_fw_stats_vdevs_free(&stats.vdevs);
347         ath10k_fw_stats_peers_free(&stats.peers);
348         ath10k_fw_extd_stats_peers_free(&stats.peers_extd);
349
350         spin_unlock_bh(&ar->data_lock);
351 }
352
353 int ath10k_debug_fw_stats_request(struct ath10k *ar)
354 {
355         unsigned long timeout, time_left;
356         int ret;
357
358         lockdep_assert_held(&ar->conf_mutex);
359
360         timeout = jiffies + msecs_to_jiffies(1 * HZ);
361
362         ath10k_debug_fw_stats_reset(ar);
363
364         for (;;) {
365                 if (time_after(jiffies, timeout))
366                         return -ETIMEDOUT;
367
368                 reinit_completion(&ar->debug.fw_stats_complete);
369
370                 ret = ath10k_wmi_request_stats(ar, ar->fw_stats_req_mask);
371                 if (ret) {
372                         ath10k_warn(ar, "could not request stats (%d)\n", ret);
373                         return ret;
374                 }
375
376                 time_left =
377                 wait_for_completion_timeout(&ar->debug.fw_stats_complete,
378                                             1 * HZ);
379                 if (!time_left)
380                         return -ETIMEDOUT;
381
382                 spin_lock_bh(&ar->data_lock);
383                 if (ar->debug.fw_stats_done) {
384                         spin_unlock_bh(&ar->data_lock);
385                         break;
386                 }
387                 spin_unlock_bh(&ar->data_lock);
388         }
389
390         return 0;
391 }
392
393 static int ath10k_fw_stats_open(struct inode *inode, struct file *file)
394 {
395         struct ath10k *ar = inode->i_private;
396         void *buf = NULL;
397         int ret;
398
399         mutex_lock(&ar->conf_mutex);
400
401         if (ar->state != ATH10K_STATE_ON) {
402                 ret = -ENETDOWN;
403                 goto err_unlock;
404         }
405
406         buf = vmalloc(ATH10K_FW_STATS_BUF_SIZE);
407         if (!buf) {
408                 ret = -ENOMEM;
409                 goto err_unlock;
410         }
411
412         ret = ath10k_debug_fw_stats_request(ar);
413         if (ret) {
414                 ath10k_warn(ar, "failed to request fw stats: %d\n", ret);
415                 goto err_free;
416         }
417
418         ret = ath10k_wmi_fw_stats_fill(ar, &ar->debug.fw_stats, buf);
419         if (ret) {
420                 ath10k_warn(ar, "failed to fill fw stats: %d\n", ret);
421                 goto err_free;
422         }
423
424         file->private_data = buf;
425
426         mutex_unlock(&ar->conf_mutex);
427         return 0;
428
429 err_free:
430         vfree(buf);
431
432 err_unlock:
433         mutex_unlock(&ar->conf_mutex);
434         return ret;
435 }
436
437 static int ath10k_fw_stats_release(struct inode *inode, struct file *file)
438 {
439         vfree(file->private_data);
440
441         return 0;
442 }
443
444 static ssize_t ath10k_fw_stats_read(struct file *file, char __user *user_buf,
445                                     size_t count, loff_t *ppos)
446 {
447         const char *buf = file->private_data;
448         size_t len = strlen(buf);
449
450         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
451 }
452
453 static const struct file_operations fops_fw_stats = {
454         .open = ath10k_fw_stats_open,
455         .release = ath10k_fw_stats_release,
456         .read = ath10k_fw_stats_read,
457         .owner = THIS_MODULE,
458         .llseek = default_llseek,
459 };
460
461 static ssize_t ath10k_debug_fw_reset_stats_read(struct file *file,
462                                                 char __user *user_buf,
463                                                 size_t count, loff_t *ppos)
464 {
465         struct ath10k *ar = file->private_data;
466         int ret;
467         size_t len = 0, buf_len = 500;
468         char *buf;
469
470         buf = kmalloc(buf_len, GFP_KERNEL);
471         if (!buf)
472                 return -ENOMEM;
473
474         spin_lock_bh(&ar->data_lock);
475
476         len += scnprintf(buf + len, buf_len - len,
477                          "fw_crash_counter\t\t%d\n", ar->stats.fw_crash_counter);
478         len += scnprintf(buf + len, buf_len - len,
479                          "fw_warm_reset_counter\t\t%d\n",
480                          ar->stats.fw_warm_reset_counter);
481         len += scnprintf(buf + len, buf_len - len,
482                          "fw_cold_reset_counter\t\t%d\n",
483                          ar->stats.fw_cold_reset_counter);
484
485         spin_unlock_bh(&ar->data_lock);
486
487         ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
488
489         kfree(buf);
490
491         return ret;
492 }
493
494 static const struct file_operations fops_fw_reset_stats = {
495         .open = simple_open,
496         .read = ath10k_debug_fw_reset_stats_read,
497         .owner = THIS_MODULE,
498         .llseek = default_llseek,
499 };
500
501 /* This is a clean assert crash in firmware. */
502 static int ath10k_debug_fw_assert(struct ath10k *ar)
503 {
504         struct wmi_vdev_install_key_cmd *cmd;
505         struct sk_buff *skb;
506
507         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + 16);
508         if (!skb)
509                 return -ENOMEM;
510
511         cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
512         memset(cmd, 0, sizeof(*cmd));
513
514         /* big enough number so that firmware asserts */
515         cmd->vdev_id = __cpu_to_le32(0x7ffe);
516
517         return ath10k_wmi_cmd_send(ar, skb,
518                                    ar->wmi.cmd->vdev_install_key_cmdid);
519 }
520
521 static ssize_t ath10k_read_simulate_fw_crash(struct file *file,
522                                              char __user *user_buf,
523                                              size_t count, loff_t *ppos)
524 {
525         const char buf[] =
526                 "To simulate firmware crash write one of the keywords to this file:\n"
527                 "`soft` - this will send WMI_FORCE_FW_HANG_ASSERT to firmware if FW supports that command.\n"
528                 "`hard` - this will send to firmware command with illegal parameters causing firmware crash.\n"
529                 "`assert` - this will send special illegal parameter to firmware to cause assert failure and crash.\n"
530                 "`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n";
531
532         return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
533 }
534
535 /* Simulate firmware crash:
536  * 'soft': Call wmi command causing firmware hang. This firmware hang is
537  * recoverable by warm firmware reset.
538  * 'hard': Force firmware crash by setting any vdev parameter for not allowed
539  * vdev id. This is hard firmware crash because it is recoverable only by cold
540  * firmware reset.
541  */
542 static ssize_t ath10k_write_simulate_fw_crash(struct file *file,
543                                               const char __user *user_buf,
544                                               size_t count, loff_t *ppos)
545 {
546         struct ath10k *ar = file->private_data;
547         char buf[32] = {0};
548         ssize_t rc;
549         int ret;
550
551         /* filter partial writes and invalid commands */
552         if (*ppos != 0 || count >= sizeof(buf) || count == 0)
553                 return -EINVAL;
554
555         rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
556         if (rc < 0)
557                 return rc;
558
559         /* drop the possible '\n' from the end */
560         if (buf[*ppos - 1] == '\n')
561                 buf[*ppos - 1] = '\0';
562
563         mutex_lock(&ar->conf_mutex);
564
565         if (ar->state != ATH10K_STATE_ON &&
566             ar->state != ATH10K_STATE_RESTARTED) {
567                 ret = -ENETDOWN;
568                 goto exit;
569         }
570
571         if (!strcmp(buf, "soft")) {
572                 ath10k_info(ar, "simulating soft firmware crash\n");
573                 ret = ath10k_wmi_force_fw_hang(ar, WMI_FORCE_FW_HANG_ASSERT, 0);
574         } else if (!strcmp(buf, "hard")) {
575                 ath10k_info(ar, "simulating hard firmware crash\n");
576                 /* 0x7fff is vdev id, and it is always out of range for all
577                  * firmware variants in order to force a firmware crash.
578                  */
579                 ret = ath10k_wmi_vdev_set_param(ar, 0x7fff,
580                                                 ar->wmi.vdev_param->rts_threshold,
581                                                 0);
582         } else if (!strcmp(buf, "assert")) {
583                 ath10k_info(ar, "simulating firmware assert crash\n");
584                 ret = ath10k_debug_fw_assert(ar);
585         } else if (!strcmp(buf, "hw-restart")) {
586                 ath10k_info(ar, "user requested hw restart\n");
587                 ath10k_core_start_recovery(ar);
588                 ret = 0;
589         } else {
590                 ret = -EINVAL;
591                 goto exit;
592         }
593
594         if (ret) {
595                 ath10k_warn(ar, "failed to simulate firmware crash: %d\n", ret);
596                 goto exit;
597         }
598
599         ret = count;
600
601 exit:
602         mutex_unlock(&ar->conf_mutex);
603         return ret;
604 }
605
606 static const struct file_operations fops_simulate_fw_crash = {
607         .read = ath10k_read_simulate_fw_crash,
608         .write = ath10k_write_simulate_fw_crash,
609         .open = simple_open,
610         .owner = THIS_MODULE,
611         .llseek = default_llseek,
612 };
613
614 static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf,
615                                    size_t count, loff_t *ppos)
616 {
617         struct ath10k *ar = file->private_data;
618         size_t len;
619         char buf[50];
620
621         len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->bus_param.chip_id);
622
623         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
624 }
625
626 static const struct file_operations fops_chip_id = {
627         .read = ath10k_read_chip_id,
628         .open = simple_open,
629         .owner = THIS_MODULE,
630         .llseek = default_llseek,
631 };
632
633 static ssize_t ath10k_reg_addr_read(struct file *file,
634                                     char __user *user_buf,
635                                     size_t count, loff_t *ppos)
636 {
637         struct ath10k *ar = file->private_data;
638         u8 buf[32];
639         size_t len = 0;
640         u32 reg_addr;
641
642         mutex_lock(&ar->conf_mutex);
643         reg_addr = ar->debug.reg_addr;
644         mutex_unlock(&ar->conf_mutex);
645
646         len += scnprintf(buf + len, sizeof(buf) - len, "0x%x\n", reg_addr);
647
648         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
649 }
650
651 static ssize_t ath10k_reg_addr_write(struct file *file,
652                                      const char __user *user_buf,
653                                      size_t count, loff_t *ppos)
654 {
655         struct ath10k *ar = file->private_data;
656         u32 reg_addr;
657         int ret;
658
659         ret = kstrtou32_from_user(user_buf, count, 0, &reg_addr);
660         if (ret)
661                 return ret;
662
663         if (!IS_ALIGNED(reg_addr, 4))
664                 return -EFAULT;
665
666         mutex_lock(&ar->conf_mutex);
667         ar->debug.reg_addr = reg_addr;
668         mutex_unlock(&ar->conf_mutex);
669
670         return count;
671 }
672
673 static const struct file_operations fops_reg_addr = {
674         .read = ath10k_reg_addr_read,
675         .write = ath10k_reg_addr_write,
676         .open = simple_open,
677         .owner = THIS_MODULE,
678         .llseek = default_llseek,
679 };
680
681 static ssize_t ath10k_reg_value_read(struct file *file,
682                                      char __user *user_buf,
683                                      size_t count, loff_t *ppos)
684 {
685         struct ath10k *ar = file->private_data;
686         u8 buf[48];
687         size_t len;
688         u32 reg_addr, reg_val;
689         int ret;
690
691         mutex_lock(&ar->conf_mutex);
692
693         if (ar->state != ATH10K_STATE_ON &&
694             ar->state != ATH10K_STATE_UTF) {
695                 ret = -ENETDOWN;
696                 goto exit;
697         }
698
699         reg_addr = ar->debug.reg_addr;
700
701         reg_val = ath10k_hif_read32(ar, reg_addr);
702         len = scnprintf(buf, sizeof(buf), "0x%08x:0x%08x\n", reg_addr, reg_val);
703
704         ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
705
706 exit:
707         mutex_unlock(&ar->conf_mutex);
708
709         return ret;
710 }
711
712 static ssize_t ath10k_reg_value_write(struct file *file,
713                                       const char __user *user_buf,
714                                       size_t count, loff_t *ppos)
715 {
716         struct ath10k *ar = file->private_data;
717         u32 reg_addr, reg_val;
718         int ret;
719
720         mutex_lock(&ar->conf_mutex);
721
722         if (ar->state != ATH10K_STATE_ON &&
723             ar->state != ATH10K_STATE_UTF) {
724                 ret = -ENETDOWN;
725                 goto exit;
726         }
727
728         reg_addr = ar->debug.reg_addr;
729
730         ret = kstrtou32_from_user(user_buf, count, 0, &reg_val);
731         if (ret)
732                 goto exit;
733
734         ath10k_hif_write32(ar, reg_addr, reg_val);
735
736         ret = count;
737
738 exit:
739         mutex_unlock(&ar->conf_mutex);
740
741         return ret;
742 }
743
744 static const struct file_operations fops_reg_value = {
745         .read = ath10k_reg_value_read,
746         .write = ath10k_reg_value_write,
747         .open = simple_open,
748         .owner = THIS_MODULE,
749         .llseek = default_llseek,
750 };
751
752 static ssize_t ath10k_mem_value_read(struct file *file,
753                                      char __user *user_buf,
754                                      size_t count, loff_t *ppos)
755 {
756         struct ath10k *ar = file->private_data;
757         u8 *buf;
758         int ret;
759
760         if (*ppos < 0)
761                 return -EINVAL;
762
763         if (!count)
764                 return 0;
765
766         mutex_lock(&ar->conf_mutex);
767
768         buf = vmalloc(count);
769         if (!buf) {
770                 ret = -ENOMEM;
771                 goto exit;
772         }
773
774         if (ar->state != ATH10K_STATE_ON &&
775             ar->state != ATH10K_STATE_UTF) {
776                 ret = -ENETDOWN;
777                 goto exit;
778         }
779
780         ret = ath10k_hif_diag_read(ar, *ppos, buf, count);
781         if (ret) {
782                 ath10k_warn(ar, "failed to read address 0x%08x via diagnose window from debugfs: %d\n",
783                             (u32)(*ppos), ret);
784                 goto exit;
785         }
786
787         ret = copy_to_user(user_buf, buf, count);
788         if (ret) {
789                 ret = -EFAULT;
790                 goto exit;
791         }
792
793         count -= ret;
794         *ppos += count;
795         ret = count;
796
797 exit:
798         vfree(buf);
799         mutex_unlock(&ar->conf_mutex);
800
801         return ret;
802 }
803
804 static ssize_t ath10k_mem_value_write(struct file *file,
805                                       const char __user *user_buf,
806                                       size_t count, loff_t *ppos)
807 {
808         struct ath10k *ar = file->private_data;
809         u8 *buf;
810         int ret;
811
812         if (*ppos < 0)
813                 return -EINVAL;
814
815         if (!count)
816                 return 0;
817
818         mutex_lock(&ar->conf_mutex);
819
820         buf = vmalloc(count);
821         if (!buf) {
822                 ret = -ENOMEM;
823                 goto exit;
824         }
825
826         if (ar->state != ATH10K_STATE_ON &&
827             ar->state != ATH10K_STATE_UTF) {
828                 ret = -ENETDOWN;
829                 goto exit;
830         }
831
832         ret = copy_from_user(buf, user_buf, count);
833         if (ret) {
834                 ret = -EFAULT;
835                 goto exit;
836         }
837
838         ret = ath10k_hif_diag_write(ar, *ppos, buf, count);
839         if (ret) {
840                 ath10k_warn(ar, "failed to write address 0x%08x via diagnose window from debugfs: %d\n",
841                             (u32)(*ppos), ret);
842                 goto exit;
843         }
844
845         *ppos += count;
846         ret = count;
847
848 exit:
849         vfree(buf);
850         mutex_unlock(&ar->conf_mutex);
851
852         return ret;
853 }
854
855 static const struct file_operations fops_mem_value = {
856         .read = ath10k_mem_value_read,
857         .write = ath10k_mem_value_write,
858         .open = simple_open,
859         .owner = THIS_MODULE,
860         .llseek = default_llseek,
861 };
862
863 static int ath10k_debug_htt_stats_req(struct ath10k *ar)
864 {
865         u64 cookie;
866         int ret;
867
868         lockdep_assert_held(&ar->conf_mutex);
869
870         if (ar->debug.htt_stats_mask == 0)
871                 /* htt stats are disabled */
872                 return 0;
873
874         if (ar->state != ATH10K_STATE_ON)
875                 return 0;
876
877         cookie = get_jiffies_64();
878
879         ret = ath10k_htt_h2t_stats_req(&ar->htt, ar->debug.htt_stats_mask,
880                                        ar->debug.reset_htt_stats, cookie);
881         if (ret) {
882                 ath10k_warn(ar, "failed to send htt stats request: %d\n", ret);
883                 return ret;
884         }
885
886         queue_delayed_work(ar->workqueue, &ar->debug.htt_stats_dwork,
887                            msecs_to_jiffies(ATH10K_DEBUG_HTT_STATS_INTERVAL));
888
889         return 0;
890 }
891
892 static void ath10k_debug_htt_stats_dwork(struct work_struct *work)
893 {
894         struct ath10k *ar = container_of(work, struct ath10k,
895                                          debug.htt_stats_dwork.work);
896
897         mutex_lock(&ar->conf_mutex);
898
899         ath10k_debug_htt_stats_req(ar);
900
901         mutex_unlock(&ar->conf_mutex);
902 }
903
904 static ssize_t ath10k_read_htt_stats_mask(struct file *file,
905                                           char __user *user_buf,
906                                           size_t count, loff_t *ppos)
907 {
908         struct ath10k *ar = file->private_data;
909         char buf[32];
910         size_t len;
911
912         len = scnprintf(buf, sizeof(buf), "%lu\n", ar->debug.htt_stats_mask);
913
914         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
915 }
916
917 static ssize_t ath10k_write_htt_stats_mask(struct file *file,
918                                            const char __user *user_buf,
919                                            size_t count, loff_t *ppos)
920 {
921         struct ath10k *ar = file->private_data;
922         unsigned long mask;
923         int ret;
924
925         ret = kstrtoul_from_user(user_buf, count, 0, &mask);
926         if (ret)
927                 return ret;
928
929         /* max 17 bit masks (for now) */
930         if (mask > HTT_STATS_BIT_MASK)
931                 return -E2BIG;
932
933         mutex_lock(&ar->conf_mutex);
934
935         ar->debug.htt_stats_mask = mask;
936
937         ret = ath10k_debug_htt_stats_req(ar);
938         if (ret)
939                 goto out;
940
941         ret = count;
942
943 out:
944         mutex_unlock(&ar->conf_mutex);
945
946         return ret;
947 }
948
949 static const struct file_operations fops_htt_stats_mask = {
950         .read = ath10k_read_htt_stats_mask,
951         .write = ath10k_write_htt_stats_mask,
952         .open = simple_open,
953         .owner = THIS_MODULE,
954         .llseek = default_llseek,
955 };
956
957 static ssize_t ath10k_read_htt_max_amsdu_ampdu(struct file *file,
958                                                char __user *user_buf,
959                                                size_t count, loff_t *ppos)
960 {
961         struct ath10k *ar = file->private_data;
962         char buf[64];
963         u8 amsdu, ampdu;
964         size_t len;
965
966         mutex_lock(&ar->conf_mutex);
967
968         amsdu = ar->htt.max_num_amsdu;
969         ampdu = ar->htt.max_num_ampdu;
970         mutex_unlock(&ar->conf_mutex);
971
972         len = scnprintf(buf, sizeof(buf), "%u %u\n", amsdu, ampdu);
973
974         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
975 }
976
977 static ssize_t ath10k_write_htt_max_amsdu_ampdu(struct file *file,
978                                                 const char __user *user_buf,
979                                                 size_t count, loff_t *ppos)
980 {
981         struct ath10k *ar = file->private_data;
982         int res;
983         char buf[64] = {0};
984         unsigned int amsdu, ampdu;
985
986         res = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos,
987                                      user_buf, count);
988         if (res <= 0)
989                 return res;
990
991         res = sscanf(buf, "%u %u", &amsdu, &ampdu);
992
993         if (res != 2)
994                 return -EINVAL;
995
996         mutex_lock(&ar->conf_mutex);
997
998         res = ath10k_htt_h2t_aggr_cfg_msg(&ar->htt, ampdu, amsdu);
999         if (res)
1000                 goto out;
1001
1002         res = count;
1003         ar->htt.max_num_amsdu = amsdu;
1004         ar->htt.max_num_ampdu = ampdu;
1005
1006 out:
1007         mutex_unlock(&ar->conf_mutex);
1008         return res;
1009 }
1010
1011 static const struct file_operations fops_htt_max_amsdu_ampdu = {
1012         .read = ath10k_read_htt_max_amsdu_ampdu,
1013         .write = ath10k_write_htt_max_amsdu_ampdu,
1014         .open = simple_open,
1015         .owner = THIS_MODULE,
1016         .llseek = default_llseek,
1017 };
1018
1019 static ssize_t ath10k_read_fw_dbglog(struct file *file,
1020                                      char __user *user_buf,
1021                                      size_t count, loff_t *ppos)
1022 {
1023         struct ath10k *ar = file->private_data;
1024         size_t len;
1025         char buf[96];
1026
1027         len = scnprintf(buf, sizeof(buf), "0x%16llx %u\n",
1028                         ar->debug.fw_dbglog_mask, ar->debug.fw_dbglog_level);
1029
1030         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1031 }
1032
1033 static ssize_t ath10k_write_fw_dbglog(struct file *file,
1034                                       const char __user *user_buf,
1035                                       size_t count, loff_t *ppos)
1036 {
1037         struct ath10k *ar = file->private_data;
1038         int ret;
1039         char buf[96] = {0};
1040         unsigned int log_level;
1041         u64 mask;
1042
1043         ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos,
1044                                      user_buf, count);
1045         if (ret <= 0)
1046                 return ret;
1047
1048         ret = sscanf(buf, "%llx %u", &mask, &log_level);
1049
1050         if (!ret)
1051                 return -EINVAL;
1052
1053         if (ret == 1)
1054                 /* default if user did not specify */
1055                 log_level = ATH10K_DBGLOG_LEVEL_WARN;
1056
1057         mutex_lock(&ar->conf_mutex);
1058
1059         ar->debug.fw_dbglog_mask = mask;
1060         ar->debug.fw_dbglog_level = log_level;
1061
1062         if (ar->state == ATH10K_STATE_ON) {
1063                 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask,
1064                                             ar->debug.fw_dbglog_level);
1065                 if (ret) {
1066                         ath10k_warn(ar, "dbglog cfg failed from debugfs: %d\n",
1067                                     ret);
1068                         goto exit;
1069                 }
1070         }
1071
1072         ret = count;
1073
1074 exit:
1075         mutex_unlock(&ar->conf_mutex);
1076
1077         return ret;
1078 }
1079
1080 /* TODO:  Would be nice to always support ethtool stats, would need to
1081  * move the stats storage out of ath10k_debug, or always have ath10k_debug
1082  * struct available..
1083  */
1084
1085 /* This generally corresponds to the debugfs fw_stats file */
1086 static const char ath10k_gstrings_stats[][ETH_GSTRING_LEN] = {
1087         "tx_pkts_nic",
1088         "tx_bytes_nic",
1089         "rx_pkts_nic",
1090         "rx_bytes_nic",
1091         "d_noise_floor",
1092         "d_cycle_count",
1093         "d_phy_error",
1094         "d_rts_bad",
1095         "d_rts_good",
1096         "d_tx_power", /* in .5 dbM I think */
1097         "d_rx_crc_err", /* fcs_bad */
1098         "d_rx_crc_err_drop", /* frame with FCS error, dropped late in kernel */
1099         "d_no_beacon",
1100         "d_tx_mpdus_queued",
1101         "d_tx_msdu_queued",
1102         "d_tx_msdu_dropped",
1103         "d_local_enqued",
1104         "d_local_freed",
1105         "d_tx_ppdu_hw_queued",
1106         "d_tx_ppdu_reaped",
1107         "d_tx_fifo_underrun",
1108         "d_tx_ppdu_abort",
1109         "d_tx_mpdu_requeued",
1110         "d_tx_excessive_retries",
1111         "d_tx_hw_rate",
1112         "d_tx_dropped_sw_retries",
1113         "d_tx_illegal_rate",
1114         "d_tx_continuous_xretries",
1115         "d_tx_timeout",
1116         "d_tx_mpdu_txop_limit",
1117         "d_pdev_resets",
1118         "d_rx_mid_ppdu_route_change",
1119         "d_rx_status",
1120         "d_rx_extra_frags_ring0",
1121         "d_rx_extra_frags_ring1",
1122         "d_rx_extra_frags_ring2",
1123         "d_rx_extra_frags_ring3",
1124         "d_rx_msdu_htt",
1125         "d_rx_mpdu_htt",
1126         "d_rx_msdu_stack",
1127         "d_rx_mpdu_stack",
1128         "d_rx_phy_err",
1129         "d_rx_phy_err_drops",
1130         "d_rx_mpdu_errors", /* FCS, MIC, ENC */
1131         "d_fw_crash_count",
1132         "d_fw_warm_reset_count",
1133         "d_fw_cold_reset_count",
1134 };
1135
1136 #define ATH10K_SSTATS_LEN ARRAY_SIZE(ath10k_gstrings_stats)
1137
1138 void ath10k_debug_get_et_strings(struct ieee80211_hw *hw,
1139                                  struct ieee80211_vif *vif,
1140                                  u32 sset, u8 *data)
1141 {
1142         if (sset == ETH_SS_STATS)
1143                 memcpy(data, *ath10k_gstrings_stats,
1144                        sizeof(ath10k_gstrings_stats));
1145 }
1146
1147 int ath10k_debug_get_et_sset_count(struct ieee80211_hw *hw,
1148                                    struct ieee80211_vif *vif, int sset)
1149 {
1150         if (sset == ETH_SS_STATS)
1151                 return ATH10K_SSTATS_LEN;
1152
1153         return 0;
1154 }
1155
1156 void ath10k_debug_get_et_stats(struct ieee80211_hw *hw,
1157                                struct ieee80211_vif *vif,
1158                                struct ethtool_stats *stats, u64 *data)
1159 {
1160         struct ath10k *ar = hw->priv;
1161         static const struct ath10k_fw_stats_pdev zero_stats = {};
1162         const struct ath10k_fw_stats_pdev *pdev_stats;
1163         int i = 0, ret;
1164
1165         mutex_lock(&ar->conf_mutex);
1166
1167         if (ar->state == ATH10K_STATE_ON) {
1168                 ret = ath10k_debug_fw_stats_request(ar);
1169                 if (ret) {
1170                         /* just print a warning and try to use older results */
1171                         ath10k_warn(ar,
1172                                     "failed to get fw stats for ethtool: %d\n",
1173                                     ret);
1174                 }
1175         }
1176
1177         pdev_stats = list_first_entry_or_null(&ar->debug.fw_stats.pdevs,
1178                                               struct ath10k_fw_stats_pdev,
1179                                               list);
1180         if (!pdev_stats) {
1181                 /* no results available so just return zeroes */
1182                 pdev_stats = &zero_stats;
1183         }
1184
1185         spin_lock_bh(&ar->data_lock);
1186
1187         data[i++] = pdev_stats->hw_reaped; /* ppdu reaped */
1188         data[i++] = 0; /* tx bytes */
1189         data[i++] = pdev_stats->htt_mpdus;
1190         data[i++] = 0; /* rx bytes */
1191         data[i++] = pdev_stats->ch_noise_floor;
1192         data[i++] = pdev_stats->cycle_count;
1193         data[i++] = pdev_stats->phy_err_count;
1194         data[i++] = pdev_stats->rts_bad;
1195         data[i++] = pdev_stats->rts_good;
1196         data[i++] = pdev_stats->chan_tx_power;
1197         data[i++] = pdev_stats->fcs_bad;
1198         data[i++] = ar->stats.rx_crc_err_drop;
1199         data[i++] = pdev_stats->no_beacons;
1200         data[i++] = pdev_stats->mpdu_enqued;
1201         data[i++] = pdev_stats->msdu_enqued;
1202         data[i++] = pdev_stats->wmm_drop;
1203         data[i++] = pdev_stats->local_enqued;
1204         data[i++] = pdev_stats->local_freed;
1205         data[i++] = pdev_stats->hw_queued;
1206         data[i++] = pdev_stats->hw_reaped;
1207         data[i++] = pdev_stats->underrun;
1208         data[i++] = pdev_stats->tx_abort;
1209         data[i++] = pdev_stats->mpdus_requeued;
1210         data[i++] = pdev_stats->tx_ko;
1211         data[i++] = pdev_stats->data_rc;
1212         data[i++] = pdev_stats->sw_retry_failure;
1213         data[i++] = pdev_stats->illgl_rate_phy_err;
1214         data[i++] = pdev_stats->pdev_cont_xretry;
1215         data[i++] = pdev_stats->pdev_tx_timeout;
1216         data[i++] = pdev_stats->txop_ovf;
1217         data[i++] = pdev_stats->pdev_resets;
1218         data[i++] = pdev_stats->mid_ppdu_route_change;
1219         data[i++] = pdev_stats->status_rcvd;
1220         data[i++] = pdev_stats->r0_frags;
1221         data[i++] = pdev_stats->r1_frags;
1222         data[i++] = pdev_stats->r2_frags;
1223         data[i++] = pdev_stats->r3_frags;
1224         data[i++] = pdev_stats->htt_msdus;
1225         data[i++] = pdev_stats->htt_mpdus;
1226         data[i++] = pdev_stats->loc_msdus;
1227         data[i++] = pdev_stats->loc_mpdus;
1228         data[i++] = pdev_stats->phy_errs;
1229         data[i++] = pdev_stats->phy_err_drop;
1230         data[i++] = pdev_stats->mpdu_errs;
1231         data[i++] = ar->stats.fw_crash_counter;
1232         data[i++] = ar->stats.fw_warm_reset_counter;
1233         data[i++] = ar->stats.fw_cold_reset_counter;
1234
1235         spin_unlock_bh(&ar->data_lock);
1236
1237         mutex_unlock(&ar->conf_mutex);
1238
1239         WARN_ON(i != ATH10K_SSTATS_LEN);
1240 }
1241
1242 static const struct file_operations fops_fw_dbglog = {
1243         .read = ath10k_read_fw_dbglog,
1244         .write = ath10k_write_fw_dbglog,
1245         .open = simple_open,
1246         .owner = THIS_MODULE,
1247         .llseek = default_llseek,
1248 };
1249
1250 static int ath10k_debug_cal_data_fetch(struct ath10k *ar)
1251 {
1252         u32 hi_addr;
1253         __le32 addr;
1254         int ret;
1255
1256         lockdep_assert_held(&ar->conf_mutex);
1257
1258         if (WARN_ON(ar->hw_params.cal_data_len > ATH10K_DEBUG_CAL_DATA_LEN))
1259                 return -EINVAL;
1260
1261         if (ar->hw_params.cal_data_len == 0)
1262                 return -EOPNOTSUPP;
1263
1264         hi_addr = host_interest_item_address(HI_ITEM(hi_board_data));
1265
1266         ret = ath10k_hif_diag_read(ar, hi_addr, &addr, sizeof(addr));
1267         if (ret) {
1268                 ath10k_warn(ar, "failed to read hi_board_data address: %d\n",
1269                             ret);
1270                 return ret;
1271         }
1272
1273         ret = ath10k_hif_diag_read(ar, le32_to_cpu(addr), ar->debug.cal_data,
1274                                    ar->hw_params.cal_data_len);
1275         if (ret) {
1276                 ath10k_warn(ar, "failed to read calibration data: %d\n", ret);
1277                 return ret;
1278         }
1279
1280         return 0;
1281 }
1282
1283 static int ath10k_debug_cal_data_open(struct inode *inode, struct file *file)
1284 {
1285         struct ath10k *ar = inode->i_private;
1286
1287         mutex_lock(&ar->conf_mutex);
1288
1289         if (ar->state == ATH10K_STATE_ON ||
1290             ar->state == ATH10K_STATE_UTF) {
1291                 ath10k_debug_cal_data_fetch(ar);
1292         }
1293
1294         file->private_data = ar;
1295         mutex_unlock(&ar->conf_mutex);
1296
1297         return 0;
1298 }
1299
1300 static ssize_t ath10k_debug_cal_data_read(struct file *file,
1301                                           char __user *user_buf,
1302                                           size_t count, loff_t *ppos)
1303 {
1304         struct ath10k *ar = file->private_data;
1305
1306         mutex_lock(&ar->conf_mutex);
1307
1308         count = simple_read_from_buffer(user_buf, count, ppos,
1309                                         ar->debug.cal_data,
1310                                         ar->hw_params.cal_data_len);
1311
1312         mutex_unlock(&ar->conf_mutex);
1313
1314         return count;
1315 }
1316
1317 static ssize_t ath10k_write_ani_enable(struct file *file,
1318                                        const char __user *user_buf,
1319                                        size_t count, loff_t *ppos)
1320 {
1321         struct ath10k *ar = file->private_data;
1322         int ret;
1323         u8 enable;
1324
1325         if (kstrtou8_from_user(user_buf, count, 0, &enable))
1326                 return -EINVAL;
1327
1328         mutex_lock(&ar->conf_mutex);
1329
1330         if (ar->ani_enabled == enable) {
1331                 ret = count;
1332                 goto exit;
1333         }
1334
1335         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->ani_enable,
1336                                         enable);
1337         if (ret) {
1338                 ath10k_warn(ar, "ani_enable failed from debugfs: %d\n", ret);
1339                 goto exit;
1340         }
1341         ar->ani_enabled = enable;
1342
1343         ret = count;
1344
1345 exit:
1346         mutex_unlock(&ar->conf_mutex);
1347
1348         return ret;
1349 }
1350
1351 static ssize_t ath10k_read_ani_enable(struct file *file, char __user *user_buf,
1352                                       size_t count, loff_t *ppos)
1353 {
1354         struct ath10k *ar = file->private_data;
1355         size_t len;
1356         char buf[32];
1357
1358         len = scnprintf(buf, sizeof(buf), "%d\n", ar->ani_enabled);
1359
1360         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1361 }
1362
1363 static const struct file_operations fops_ani_enable = {
1364         .read = ath10k_read_ani_enable,
1365         .write = ath10k_write_ani_enable,
1366         .open = simple_open,
1367         .owner = THIS_MODULE,
1368         .llseek = default_llseek,
1369 };
1370
1371 static const struct file_operations fops_cal_data = {
1372         .open = ath10k_debug_cal_data_open,
1373         .read = ath10k_debug_cal_data_read,
1374         .owner = THIS_MODULE,
1375         .llseek = default_llseek,
1376 };
1377
1378 static ssize_t ath10k_read_nf_cal_period(struct file *file,
1379                                          char __user *user_buf,
1380                                          size_t count, loff_t *ppos)
1381 {
1382         struct ath10k *ar = file->private_data;
1383         size_t len;
1384         char buf[32];
1385
1386         len = scnprintf(buf, sizeof(buf), "%d\n", ar->debug.nf_cal_period);
1387
1388         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1389 }
1390
1391 static ssize_t ath10k_write_nf_cal_period(struct file *file,
1392                                           const char __user *user_buf,
1393                                           size_t count, loff_t *ppos)
1394 {
1395         struct ath10k *ar = file->private_data;
1396         unsigned long period;
1397         int ret;
1398
1399         ret = kstrtoul_from_user(user_buf, count, 0, &period);
1400         if (ret)
1401                 return ret;
1402
1403         if (period > WMI_PDEV_PARAM_CAL_PERIOD_MAX)
1404                 return -EINVAL;
1405
1406         /* there's no way to switch back to the firmware default */
1407         if (period == 0)
1408                 return -EINVAL;
1409
1410         mutex_lock(&ar->conf_mutex);
1411
1412         ar->debug.nf_cal_period = period;
1413
1414         if (ar->state != ATH10K_STATE_ON) {
1415                 /* firmware is not running, nothing else to do */
1416                 ret = count;
1417                 goto exit;
1418         }
1419
1420         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->cal_period,
1421                                         ar->debug.nf_cal_period);
1422         if (ret) {
1423                 ath10k_warn(ar, "cal period cfg failed from debugfs: %d\n",
1424                             ret);
1425                 goto exit;
1426         }
1427
1428         ret = count;
1429
1430 exit:
1431         mutex_unlock(&ar->conf_mutex);
1432
1433         return ret;
1434 }
1435
1436 static const struct file_operations fops_nf_cal_period = {
1437         .read = ath10k_read_nf_cal_period,
1438         .write = ath10k_write_nf_cal_period,
1439         .open = simple_open,
1440         .owner = THIS_MODULE,
1441         .llseek = default_llseek,
1442 };
1443
1444 #define ATH10K_TPC_CONFIG_BUF_SIZE      (1024 * 1024)
1445
1446 static int ath10k_debug_tpc_stats_request(struct ath10k *ar)
1447 {
1448         int ret;
1449         unsigned long time_left;
1450
1451         lockdep_assert_held(&ar->conf_mutex);
1452
1453         reinit_completion(&ar->debug.tpc_complete);
1454
1455         ret = ath10k_wmi_pdev_get_tpc_config(ar, WMI_TPC_CONFIG_PARAM);
1456         if (ret) {
1457                 ath10k_warn(ar, "failed to request tpc config: %d\n", ret);
1458                 return ret;
1459         }
1460
1461         time_left = wait_for_completion_timeout(&ar->debug.tpc_complete,
1462                                                 1 * HZ);
1463         if (time_left == 0)
1464                 return -ETIMEDOUT;
1465
1466         return 0;
1467 }
1468
1469 void ath10k_debug_tpc_stats_process(struct ath10k *ar,
1470                                     struct ath10k_tpc_stats *tpc_stats)
1471 {
1472         spin_lock_bh(&ar->data_lock);
1473
1474         kfree(ar->debug.tpc_stats);
1475         ar->debug.tpc_stats = tpc_stats;
1476         complete(&ar->debug.tpc_complete);
1477
1478         spin_unlock_bh(&ar->data_lock);
1479 }
1480
1481 void
1482 ath10k_debug_tpc_stats_final_process(struct ath10k *ar,
1483                                      struct ath10k_tpc_stats_final *tpc_stats)
1484 {
1485         spin_lock_bh(&ar->data_lock);
1486
1487         kfree(ar->debug.tpc_stats_final);
1488         ar->debug.tpc_stats_final = tpc_stats;
1489         complete(&ar->debug.tpc_complete);
1490
1491         spin_unlock_bh(&ar->data_lock);
1492 }
1493
1494 static void ath10k_tpc_stats_print(struct ath10k_tpc_stats *tpc_stats,
1495                                    unsigned int j, char *buf, size_t *len)
1496 {
1497         int i;
1498         size_t buf_len;
1499         static const char table_str[][5] = { "CDD",
1500                                              "STBC",
1501                                              "TXBF" };
1502         static const char pream_str[][6] = { "CCK",
1503                                              "OFDM",
1504                                              "HT20",
1505                                              "HT40",
1506                                              "VHT20",
1507                                              "VHT40",
1508                                              "VHT80",
1509                                              "HTCUP" };
1510
1511         buf_len = ATH10K_TPC_CONFIG_BUF_SIZE;
1512         *len += scnprintf(buf + *len, buf_len - *len,
1513                           "********************************\n");
1514         *len += scnprintf(buf + *len, buf_len - *len,
1515                           "******************* %s POWER TABLE ****************\n",
1516                           table_str[j]);
1517         *len += scnprintf(buf + *len, buf_len - *len,
1518                           "********************************\n");
1519         *len += scnprintf(buf + *len, buf_len - *len,
1520                           "No.  Preamble Rate_code ");
1521
1522         for (i = 0; i < tpc_stats->num_tx_chain; i++)
1523                 *len += scnprintf(buf + *len, buf_len - *len,
1524                                   "tpc_value%d ", i);
1525
1526         *len += scnprintf(buf + *len, buf_len - *len, "\n");
1527
1528         for (i = 0; i < tpc_stats->rate_max; i++) {
1529                 *len += scnprintf(buf + *len, buf_len - *len,
1530                                   "%8d %s 0x%2x %s\n", i,
1531                                   pream_str[tpc_stats->tpc_table[j].pream_idx[i]],
1532                                   tpc_stats->tpc_table[j].rate_code[i],
1533                                   tpc_stats->tpc_table[j].tpc_value[i]);
1534         }
1535
1536         *len += scnprintf(buf + *len, buf_len - *len,
1537                           "***********************************\n");
1538 }
1539
1540 static void ath10k_tpc_stats_fill(struct ath10k *ar,
1541                                   struct ath10k_tpc_stats *tpc_stats,
1542                                   char *buf)
1543 {
1544         int j;
1545         size_t len, buf_len;
1546
1547         len = 0;
1548         buf_len = ATH10K_TPC_CONFIG_BUF_SIZE;
1549
1550         spin_lock_bh(&ar->data_lock);
1551
1552         if (!tpc_stats) {
1553                 ath10k_warn(ar, "failed to get tpc stats\n");
1554                 goto unlock;
1555         }
1556
1557         len += scnprintf(buf + len, buf_len - len, "\n");
1558         len += scnprintf(buf + len, buf_len - len,
1559                          "*************************************\n");
1560         len += scnprintf(buf + len, buf_len - len,
1561                          "TPC config for channel %4d mode %d\n",
1562                          tpc_stats->chan_freq,
1563                          tpc_stats->phy_mode);
1564         len += scnprintf(buf + len, buf_len - len,
1565                          "*************************************\n");
1566         len += scnprintf(buf + len, buf_len - len,
1567                          "CTL           =  0x%2x Reg. Domain            = %2d\n",
1568                          tpc_stats->ctl,
1569                          tpc_stats->reg_domain);
1570         len += scnprintf(buf + len, buf_len - len,
1571                          "Antenna Gain  = %2d Reg. Max Antenna Gain     =  %2d\n",
1572                          tpc_stats->twice_antenna_gain,
1573                          tpc_stats->twice_antenna_reduction);
1574         len += scnprintf(buf + len, buf_len - len,
1575                          "Power Limit   = %2d Reg. Max Power            = %2d\n",
1576                          tpc_stats->power_limit,
1577                          tpc_stats->twice_max_rd_power / 2);
1578         len += scnprintf(buf + len, buf_len - len,
1579                          "Num tx chains = %2d Num supported rates       = %2d\n",
1580                          tpc_stats->num_tx_chain,
1581                          tpc_stats->rate_max);
1582
1583         for (j = 0; j < WMI_TPC_FLAG; j++) {
1584                 switch (j) {
1585                 case WMI_TPC_TABLE_TYPE_CDD:
1586                         if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
1587                                 len += scnprintf(buf + len, buf_len - len,
1588                                                  "CDD not supported\n");
1589                                 break;
1590                         }
1591
1592                         ath10k_tpc_stats_print(tpc_stats, j, buf, &len);
1593                         break;
1594                 case WMI_TPC_TABLE_TYPE_STBC:
1595                         if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
1596                                 len += scnprintf(buf + len, buf_len - len,
1597                                                  "STBC not supported\n");
1598                                 break;
1599                         }
1600
1601                         ath10k_tpc_stats_print(tpc_stats, j, buf, &len);
1602                         break;
1603                 case WMI_TPC_TABLE_TYPE_TXBF:
1604                         if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
1605                                 len += scnprintf(buf + len, buf_len - len,
1606                                                  "TXBF not supported\n***************************\n");
1607                                 break;
1608                         }
1609
1610                         ath10k_tpc_stats_print(tpc_stats, j, buf, &len);
1611                         break;
1612                 default:
1613                         len += scnprintf(buf + len, buf_len - len,
1614                                          "Invalid Type\n");
1615                         break;
1616                 }
1617         }
1618
1619 unlock:
1620         spin_unlock_bh(&ar->data_lock);
1621
1622         if (len >= buf_len)
1623                 buf[len - 1] = 0;
1624         else
1625                 buf[len] = 0;
1626 }
1627
1628 static int ath10k_tpc_stats_open(struct inode *inode, struct file *file)
1629 {
1630         struct ath10k *ar = inode->i_private;
1631         void *buf = NULL;
1632         int ret;
1633
1634         mutex_lock(&ar->conf_mutex);
1635
1636         if (ar->state != ATH10K_STATE_ON) {
1637                 ret = -ENETDOWN;
1638                 goto err_unlock;
1639         }
1640
1641         buf = vmalloc(ATH10K_TPC_CONFIG_BUF_SIZE);
1642         if (!buf) {
1643                 ret = -ENOMEM;
1644                 goto err_unlock;
1645         }
1646
1647         ret = ath10k_debug_tpc_stats_request(ar);
1648         if (ret) {
1649                 ath10k_warn(ar, "failed to request tpc config stats: %d\n",
1650                             ret);
1651                 goto err_free;
1652         }
1653
1654         ath10k_tpc_stats_fill(ar, ar->debug.tpc_stats, buf);
1655         file->private_data = buf;
1656
1657         mutex_unlock(&ar->conf_mutex);
1658         return 0;
1659
1660 err_free:
1661         vfree(buf);
1662
1663 err_unlock:
1664         mutex_unlock(&ar->conf_mutex);
1665         return ret;
1666 }
1667
1668 static int ath10k_tpc_stats_release(struct inode *inode, struct file *file)
1669 {
1670         vfree(file->private_data);
1671
1672         return 0;
1673 }
1674
1675 static ssize_t ath10k_tpc_stats_read(struct file *file, char __user *user_buf,
1676                                      size_t count, loff_t *ppos)
1677 {
1678         const char *buf = file->private_data;
1679         size_t len = strlen(buf);
1680
1681         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1682 }
1683
1684 static const struct file_operations fops_tpc_stats = {
1685         .open = ath10k_tpc_stats_open,
1686         .release = ath10k_tpc_stats_release,
1687         .read = ath10k_tpc_stats_read,
1688         .owner = THIS_MODULE,
1689         .llseek = default_llseek,
1690 };
1691
1692 int ath10k_debug_start(struct ath10k *ar)
1693 {
1694         int ret;
1695
1696         lockdep_assert_held(&ar->conf_mutex);
1697
1698         ret = ath10k_debug_htt_stats_req(ar);
1699         if (ret)
1700                 /* continue normally anyway, this isn't serious */
1701                 ath10k_warn(ar, "failed to start htt stats workqueue: %d\n",
1702                             ret);
1703
1704         if (ar->debug.fw_dbglog_mask) {
1705                 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask,
1706                                             ATH10K_DBGLOG_LEVEL_WARN);
1707                 if (ret)
1708                         /* not serious */
1709                         ath10k_warn(ar, "failed to enable dbglog during start: %d",
1710                                     ret);
1711         }
1712
1713         if (ar->pktlog_filter) {
1714                 ret = ath10k_wmi_pdev_pktlog_enable(ar,
1715                                                     ar->pktlog_filter);
1716                 if (ret)
1717                         /* not serious */
1718                         ath10k_warn(ar,
1719                                     "failed to enable pktlog filter %x: %d\n",
1720                                     ar->pktlog_filter, ret);
1721         } else {
1722                 ret = ath10k_wmi_pdev_pktlog_disable(ar);
1723                 if (ret)
1724                         /* not serious */
1725                         ath10k_warn(ar, "failed to disable pktlog: %d\n", ret);
1726         }
1727
1728         if (ar->debug.nf_cal_period &&
1729             !test_bit(ATH10K_FW_FEATURE_NON_BMI,
1730                       ar->normal_mode_fw.fw_file.fw_features)) {
1731                 ret = ath10k_wmi_pdev_set_param(ar,
1732                                                 ar->wmi.pdev_param->cal_period,
1733                                                 ar->debug.nf_cal_period);
1734                 if (ret)
1735                         /* not serious */
1736                         ath10k_warn(ar, "cal period cfg failed from debug start: %d\n",
1737                                     ret);
1738         }
1739
1740         return ret;
1741 }
1742
1743 void ath10k_debug_stop(struct ath10k *ar)
1744 {
1745         lockdep_assert_held(&ar->conf_mutex);
1746
1747         if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
1748                       ar->normal_mode_fw.fw_file.fw_features))
1749                 ath10k_debug_cal_data_fetch(ar);
1750
1751         /* Must not use _sync to avoid deadlock, we do that in
1752          * ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
1753          * warning from del_timer().
1754          */
1755         if (ar->debug.htt_stats_mask != 0)
1756                 cancel_delayed_work(&ar->debug.htt_stats_dwork);
1757
1758         ath10k_wmi_pdev_pktlog_disable(ar);
1759 }
1760
1761 static ssize_t ath10k_write_simulate_radar(struct file *file,
1762                                            const char __user *user_buf,
1763                                            size_t count, loff_t *ppos)
1764 {
1765         struct ath10k *ar = file->private_data;
1766         struct ath10k_vif *arvif;
1767
1768         /* Just check for the first vif alone, as all the vifs will be
1769          * sharing the same channel and if the channel is disabled, all the
1770          * vifs will share the same 'is_started' state.
1771          */
1772         arvif = list_first_entry(&ar->arvifs, typeof(*arvif), list);
1773         if (!arvif->is_started)
1774                 return -EINVAL;
1775
1776         ieee80211_radar_detected(ar->hw);
1777
1778         return count;
1779 }
1780
1781 static const struct file_operations fops_simulate_radar = {
1782         .write = ath10k_write_simulate_radar,
1783         .open = simple_open,
1784         .owner = THIS_MODULE,
1785         .llseek = default_llseek,
1786 };
1787
1788 #define ATH10K_DFS_STAT(s, p) (\
1789         len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1790                          ar->debug.dfs_stats.p))
1791
1792 #define ATH10K_DFS_POOL_STAT(s, p) (\
1793         len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1794                          ar->debug.dfs_pool_stats.p))
1795
1796 static ssize_t ath10k_read_dfs_stats(struct file *file, char __user *user_buf,
1797                                      size_t count, loff_t *ppos)
1798 {
1799         int retval = 0, len = 0;
1800         const int size = 8000;
1801         struct ath10k *ar = file->private_data;
1802         char *buf;
1803
1804         buf = kzalloc(size, GFP_KERNEL);
1805         if (buf == NULL)
1806                 return -ENOMEM;
1807
1808         if (!ar->dfs_detector) {
1809                 len += scnprintf(buf + len, size - len, "DFS not enabled\n");
1810                 goto exit;
1811         }
1812
1813         ar->debug.dfs_pool_stats =
1814                         ar->dfs_detector->get_stats(ar->dfs_detector);
1815
1816         len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n");
1817
1818         ATH10K_DFS_STAT("reported phy errors", phy_errors);
1819         ATH10K_DFS_STAT("pulse events reported", pulses_total);
1820         ATH10K_DFS_STAT("DFS pulses detected", pulses_detected);
1821         ATH10K_DFS_STAT("DFS pulses discarded", pulses_discarded);
1822         ATH10K_DFS_STAT("Radars detected", radar_detected);
1823
1824         len += scnprintf(buf + len, size - len, "Global Pool statistics:\n");
1825         ATH10K_DFS_POOL_STAT("Pool references", pool_reference);
1826         ATH10K_DFS_POOL_STAT("Pulses allocated", pulse_allocated);
1827         ATH10K_DFS_POOL_STAT("Pulses alloc error", pulse_alloc_error);
1828         ATH10K_DFS_POOL_STAT("Pulses in use", pulse_used);
1829         ATH10K_DFS_POOL_STAT("Seqs. allocated", pseq_allocated);
1830         ATH10K_DFS_POOL_STAT("Seqs. alloc error", pseq_alloc_error);
1831         ATH10K_DFS_POOL_STAT("Seqs. in use", pseq_used);
1832
1833 exit:
1834         if (len > size)
1835                 len = size;
1836
1837         retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
1838         kfree(buf);
1839
1840         return retval;
1841 }
1842
1843 static const struct file_operations fops_dfs_stats = {
1844         .read = ath10k_read_dfs_stats,
1845         .open = simple_open,
1846         .owner = THIS_MODULE,
1847         .llseek = default_llseek,
1848 };
1849
1850 static ssize_t ath10k_write_pktlog_filter(struct file *file,
1851                                           const char __user *ubuf,
1852                                           size_t count, loff_t *ppos)
1853 {
1854         struct ath10k *ar = file->private_data;
1855         u32 filter;
1856         int ret;
1857
1858         if (kstrtouint_from_user(ubuf, count, 0, &filter))
1859                 return -EINVAL;
1860
1861         mutex_lock(&ar->conf_mutex);
1862
1863         if (ar->state != ATH10K_STATE_ON) {
1864                 ar->pktlog_filter = filter;
1865                 ret = count;
1866                 goto out;
1867         }
1868
1869         if (filter == ar->pktlog_filter) {
1870                 ret = count;
1871                 goto out;
1872         }
1873
1874         if (filter) {
1875                 ret = ath10k_wmi_pdev_pktlog_enable(ar, filter);
1876                 if (ret) {
1877                         ath10k_warn(ar, "failed to enable pktlog filter %x: %d\n",
1878                                     ar->pktlog_filter, ret);
1879                         goto out;
1880                 }
1881         } else {
1882                 ret = ath10k_wmi_pdev_pktlog_disable(ar);
1883                 if (ret) {
1884                         ath10k_warn(ar, "failed to disable pktlog: %d\n", ret);
1885                         goto out;
1886                 }
1887         }
1888
1889         ar->pktlog_filter = filter;
1890         ret = count;
1891
1892 out:
1893         mutex_unlock(&ar->conf_mutex);
1894         return ret;
1895 }
1896
1897 static ssize_t ath10k_read_pktlog_filter(struct file *file, char __user *ubuf,
1898                                          size_t count, loff_t *ppos)
1899 {
1900         char buf[32];
1901         struct ath10k *ar = file->private_data;
1902         int len = 0;
1903
1904         mutex_lock(&ar->conf_mutex);
1905         len = scnprintf(buf, sizeof(buf) - len, "%08x\n",
1906                         ar->pktlog_filter);
1907         mutex_unlock(&ar->conf_mutex);
1908
1909         return simple_read_from_buffer(ubuf, count, ppos, buf, len);
1910 }
1911
1912 static const struct file_operations fops_pktlog_filter = {
1913         .read = ath10k_read_pktlog_filter,
1914         .write = ath10k_write_pktlog_filter,
1915         .open = simple_open
1916 };
1917
1918 static ssize_t ath10k_write_quiet_period(struct file *file,
1919                                          const char __user *ubuf,
1920                                          size_t count, loff_t *ppos)
1921 {
1922         struct ath10k *ar = file->private_data;
1923         u32 period;
1924
1925         if (kstrtouint_from_user(ubuf, count, 0, &period))
1926                 return -EINVAL;
1927
1928         if (period < ATH10K_QUIET_PERIOD_MIN) {
1929                 ath10k_warn(ar, "Quiet period %u can not be lesser than 25ms\n",
1930                             period);
1931                 return -EINVAL;
1932         }
1933         mutex_lock(&ar->conf_mutex);
1934         ar->thermal.quiet_period = period;
1935         ath10k_thermal_set_throttling(ar);
1936         mutex_unlock(&ar->conf_mutex);
1937
1938         return count;
1939 }
1940
1941 static ssize_t ath10k_read_quiet_period(struct file *file, char __user *ubuf,
1942                                         size_t count, loff_t *ppos)
1943 {
1944         char buf[32];
1945         struct ath10k *ar = file->private_data;
1946         int len = 0;
1947
1948         mutex_lock(&ar->conf_mutex);
1949         len = scnprintf(buf, sizeof(buf) - len, "%d\n",
1950                         ar->thermal.quiet_period);
1951         mutex_unlock(&ar->conf_mutex);
1952
1953         return simple_read_from_buffer(ubuf, count, ppos, buf, len);
1954 }
1955
1956 static const struct file_operations fops_quiet_period = {
1957         .read = ath10k_read_quiet_period,
1958         .write = ath10k_write_quiet_period,
1959         .open = simple_open
1960 };
1961
1962 static ssize_t ath10k_write_btcoex(struct file *file,
1963                                    const char __user *ubuf,
1964                                    size_t count, loff_t *ppos)
1965 {
1966         struct ath10k *ar = file->private_data;
1967         char buf[32];
1968         size_t buf_size;
1969         int ret;
1970         bool val;
1971         u32 pdev_param;
1972
1973         buf_size = min(count, (sizeof(buf) - 1));
1974         if (copy_from_user(buf, ubuf, buf_size))
1975                 return -EFAULT;
1976
1977         buf[buf_size] = '\0';
1978
1979         if (kstrtobool(buf, &val) != 0)
1980                 return -EINVAL;
1981
1982         if (!ar->coex_support)
1983                 return -EOPNOTSUPP;
1984
1985         mutex_lock(&ar->conf_mutex);
1986
1987         if (ar->state != ATH10K_STATE_ON &&
1988             ar->state != ATH10K_STATE_RESTARTED) {
1989                 ret = -ENETDOWN;
1990                 goto exit;
1991         }
1992
1993         if (!(test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) ^ val)) {
1994                 ret = count;
1995                 goto exit;
1996         }
1997
1998         pdev_param = ar->wmi.pdev_param->enable_btcoex;
1999         if (test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
2000                      ar->running_fw->fw_file.fw_features)) {
2001                 ret = ath10k_wmi_pdev_set_param(ar, pdev_param, val);
2002                 if (ret) {
2003                         ath10k_warn(ar, "failed to enable btcoex: %d\n", ret);
2004                         ret = count;
2005                         goto exit;
2006                 }
2007         } else {
2008                 ath10k_info(ar, "restarting firmware due to btcoex change");
2009                 ath10k_core_start_recovery(ar);
2010         }
2011
2012         if (val)
2013                 set_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
2014         else
2015                 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
2016
2017         ret = count;
2018
2019 exit:
2020         mutex_unlock(&ar->conf_mutex);
2021
2022         return ret;
2023 }
2024
2025 static ssize_t ath10k_read_btcoex(struct file *file, char __user *ubuf,
2026                                   size_t count, loff_t *ppos)
2027 {
2028         char buf[32];
2029         struct ath10k *ar = file->private_data;
2030         int len = 0;
2031
2032         mutex_lock(&ar->conf_mutex);
2033         len = scnprintf(buf, sizeof(buf) - len, "%d\n",
2034                         test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags));
2035         mutex_unlock(&ar->conf_mutex);
2036
2037         return simple_read_from_buffer(ubuf, count, ppos, buf, len);
2038 }
2039
2040 static const struct file_operations fops_btcoex = {
2041         .read = ath10k_read_btcoex,
2042         .write = ath10k_write_btcoex,
2043         .open = simple_open
2044 };
2045
2046 static ssize_t ath10k_write_enable_extd_tx_stats(struct file *file,
2047                                                  const char __user *ubuf,
2048                                                  size_t count, loff_t *ppos)
2049 {
2050         struct ath10k *ar = file->private_data;
2051         u32 filter;
2052         int ret;
2053
2054         if (kstrtouint_from_user(ubuf, count, 0, &filter))
2055                 return -EINVAL;
2056
2057         mutex_lock(&ar->conf_mutex);
2058
2059         if (ar->state != ATH10K_STATE_ON) {
2060                 ar->debug.enable_extd_tx_stats = filter;
2061                 ret = count;
2062                 goto out;
2063         }
2064
2065         if (filter == ar->debug.enable_extd_tx_stats) {
2066                 ret = count;
2067                 goto out;
2068         }
2069
2070         ar->debug.enable_extd_tx_stats = filter;
2071         ret = count;
2072
2073 out:
2074         mutex_unlock(&ar->conf_mutex);
2075         return ret;
2076 }
2077
2078 static ssize_t ath10k_read_enable_extd_tx_stats(struct file *file,
2079                                                 char __user *ubuf,
2080                                                 size_t count, loff_t *ppos)
2081
2082 {
2083         char buf[32];
2084         struct ath10k *ar = file->private_data;
2085         int len = 0;
2086
2087         mutex_lock(&ar->conf_mutex);
2088         len = scnprintf(buf, sizeof(buf) - len, "%08x\n",
2089                         ar->debug.enable_extd_tx_stats);
2090         mutex_unlock(&ar->conf_mutex);
2091
2092         return simple_read_from_buffer(ubuf, count, ppos, buf, len);
2093 }
2094
2095 static const struct file_operations fops_enable_extd_tx_stats = {
2096         .read = ath10k_read_enable_extd_tx_stats,
2097         .write = ath10k_write_enable_extd_tx_stats,
2098         .open = simple_open
2099 };
2100
2101 static ssize_t ath10k_write_peer_stats(struct file *file,
2102                                        const char __user *ubuf,
2103                                        size_t count, loff_t *ppos)
2104 {
2105         struct ath10k *ar = file->private_data;
2106         char buf[32];
2107         size_t buf_size;
2108         int ret;
2109         bool val;
2110
2111         buf_size = min(count, (sizeof(buf) - 1));
2112         if (copy_from_user(buf, ubuf, buf_size))
2113                 return -EFAULT;
2114
2115         buf[buf_size] = '\0';
2116
2117         if (kstrtobool(buf, &val) != 0)
2118                 return -EINVAL;
2119
2120         mutex_lock(&ar->conf_mutex);
2121
2122         if (ar->state != ATH10K_STATE_ON &&
2123             ar->state != ATH10K_STATE_RESTARTED) {
2124                 ret = -ENETDOWN;
2125                 goto exit;
2126         }
2127
2128         if (!(test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags) ^ val)) {
2129                 ret = count;
2130                 goto exit;
2131         }
2132
2133         if (val)
2134                 set_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
2135         else
2136                 clear_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
2137
2138         ath10k_info(ar, "restarting firmware due to Peer stats change");
2139
2140         ath10k_core_start_recovery(ar);
2141         ret = count;
2142
2143 exit:
2144         mutex_unlock(&ar->conf_mutex);
2145         return ret;
2146 }
2147
2148 static ssize_t ath10k_read_peer_stats(struct file *file, char __user *ubuf,
2149                                       size_t count, loff_t *ppos)
2150
2151 {
2152         char buf[32];
2153         struct ath10k *ar = file->private_data;
2154         int len = 0;
2155
2156         mutex_lock(&ar->conf_mutex);
2157         len = scnprintf(buf, sizeof(buf) - len, "%d\n",
2158                         test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags));
2159         mutex_unlock(&ar->conf_mutex);
2160
2161         return simple_read_from_buffer(ubuf, count, ppos, buf, len);
2162 }
2163
2164 static const struct file_operations fops_peer_stats = {
2165         .read = ath10k_read_peer_stats,
2166         .write = ath10k_write_peer_stats,
2167         .open = simple_open
2168 };
2169
2170 static ssize_t ath10k_debug_fw_checksums_read(struct file *file,
2171                                               char __user *user_buf,
2172                                               size_t count, loff_t *ppos)
2173 {
2174         struct ath10k *ar = file->private_data;
2175         size_t len = 0, buf_len = 4096;
2176         ssize_t ret_cnt;
2177         char *buf;
2178
2179         buf = kzalloc(buf_len, GFP_KERNEL);
2180         if (!buf)
2181                 return -ENOMEM;
2182
2183         mutex_lock(&ar->conf_mutex);
2184
2185         len += scnprintf(buf + len, buf_len - len,
2186                          "firmware-N.bin\t\t%08x\n",
2187                          crc32_le(0, ar->normal_mode_fw.fw_file.firmware->data,
2188                                   ar->normal_mode_fw.fw_file.firmware->size));
2189         len += scnprintf(buf + len, buf_len - len,
2190                          "athwlan\t\t\t%08x\n",
2191                          crc32_le(0, ar->normal_mode_fw.fw_file.firmware_data,
2192                                   ar->normal_mode_fw.fw_file.firmware_len));
2193         len += scnprintf(buf + len, buf_len - len,
2194                          "otp\t\t\t%08x\n",
2195                          crc32_le(0, ar->normal_mode_fw.fw_file.otp_data,
2196                                   ar->normal_mode_fw.fw_file.otp_len));
2197         len += scnprintf(buf + len, buf_len - len,
2198                          "codeswap\t\t%08x\n",
2199                          crc32_le(0, ar->normal_mode_fw.fw_file.codeswap_data,
2200                                   ar->normal_mode_fw.fw_file.codeswap_len));
2201         len += scnprintf(buf + len, buf_len - len,
2202                          "board-N.bin\t\t%08x\n",
2203                          crc32_le(0, ar->normal_mode_fw.board->data,
2204                                   ar->normal_mode_fw.board->size));
2205         len += scnprintf(buf + len, buf_len - len,
2206                          "board\t\t\t%08x\n",
2207                          crc32_le(0, ar->normal_mode_fw.board_data,
2208                                   ar->normal_mode_fw.board_len));
2209
2210         ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
2211
2212         mutex_unlock(&ar->conf_mutex);
2213
2214         kfree(buf);
2215         return ret_cnt;
2216 }
2217
2218 static const struct file_operations fops_fw_checksums = {
2219         .read = ath10k_debug_fw_checksums_read,
2220         .open = simple_open,
2221         .owner = THIS_MODULE,
2222         .llseek = default_llseek,
2223 };
2224
2225 static ssize_t ath10k_sta_tid_stats_mask_read(struct file *file,
2226                                               char __user *user_buf,
2227                                               size_t count, loff_t *ppos)
2228 {
2229         struct ath10k *ar = file->private_data;
2230         char buf[32];
2231         size_t len;
2232
2233         len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->sta_tid_stats_mask);
2234         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
2235 }
2236
2237 static ssize_t ath10k_sta_tid_stats_mask_write(struct file *file,
2238                                                const char __user *user_buf,
2239                                                size_t count, loff_t *ppos)
2240 {
2241         struct ath10k *ar = file->private_data;
2242         char buf[32];
2243         ssize_t len;
2244         u32 mask;
2245
2246         len = min(count, sizeof(buf) - 1);
2247         if (copy_from_user(buf, user_buf, len))
2248                 return -EFAULT;
2249
2250         buf[len] = '\0';
2251         if (kstrtoint(buf, 0, &mask))
2252                 return -EINVAL;
2253
2254         ar->sta_tid_stats_mask = mask;
2255
2256         return len;
2257 }
2258
2259 static const struct file_operations fops_sta_tid_stats_mask = {
2260         .read = ath10k_sta_tid_stats_mask_read,
2261         .write = ath10k_sta_tid_stats_mask_write,
2262         .open = simple_open,
2263         .owner = THIS_MODULE,
2264         .llseek = default_llseek,
2265 };
2266
2267 static int ath10k_debug_tpc_stats_final_request(struct ath10k *ar)
2268 {
2269         int ret;
2270         unsigned long time_left;
2271
2272         lockdep_assert_held(&ar->conf_mutex);
2273
2274         reinit_completion(&ar->debug.tpc_complete);
2275
2276         ret = ath10k_wmi_pdev_get_tpc_table_cmdid(ar, WMI_TPC_CONFIG_PARAM);
2277         if (ret) {
2278                 ath10k_warn(ar, "failed to request tpc table cmdid: %d\n", ret);
2279                 return ret;
2280         }
2281
2282         time_left = wait_for_completion_timeout(&ar->debug.tpc_complete,
2283                                                 1 * HZ);
2284         if (time_left == 0)
2285                 return -ETIMEDOUT;
2286
2287         return 0;
2288 }
2289
2290 static int ath10k_tpc_stats_final_open(struct inode *inode, struct file *file)
2291 {
2292         struct ath10k *ar = inode->i_private;
2293         void *buf;
2294         int ret;
2295
2296         mutex_lock(&ar->conf_mutex);
2297
2298         if (ar->state != ATH10K_STATE_ON) {
2299                 ret = -ENETDOWN;
2300                 goto err_unlock;
2301         }
2302
2303         buf = vmalloc(ATH10K_TPC_CONFIG_BUF_SIZE);
2304         if (!buf) {
2305                 ret = -ENOMEM;
2306                 goto err_unlock;
2307         }
2308
2309         ret = ath10k_debug_tpc_stats_final_request(ar);
2310         if (ret) {
2311                 ath10k_warn(ar, "failed to request tpc stats final: %d\n",
2312                             ret);
2313                 goto err_free;
2314         }
2315
2316         ath10k_tpc_stats_fill(ar, ar->debug.tpc_stats, buf);
2317         file->private_data = buf;
2318
2319         mutex_unlock(&ar->conf_mutex);
2320         return 0;
2321
2322 err_free:
2323         vfree(buf);
2324
2325 err_unlock:
2326         mutex_unlock(&ar->conf_mutex);
2327         return ret;
2328 }
2329
2330 static int ath10k_tpc_stats_final_release(struct inode *inode,
2331                                           struct file *file)
2332 {
2333         vfree(file->private_data);
2334
2335         return 0;
2336 }
2337
2338 static ssize_t ath10k_tpc_stats_final_read(struct file *file,
2339                                            char __user *user_buf,
2340                                            size_t count, loff_t *ppos)
2341 {
2342         const char *buf = file->private_data;
2343         unsigned int len = strlen(buf);
2344
2345         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
2346 }
2347
2348 static const struct file_operations fops_tpc_stats_final = {
2349         .open = ath10k_tpc_stats_final_open,
2350         .release = ath10k_tpc_stats_final_release,
2351         .read = ath10k_tpc_stats_final_read,
2352         .owner = THIS_MODULE,
2353         .llseek = default_llseek,
2354 };
2355
2356 static ssize_t ath10k_write_warm_hw_reset(struct file *file,
2357                                           const char __user *user_buf,
2358                                           size_t count, loff_t *ppos)
2359 {
2360         struct ath10k *ar = file->private_data;
2361         int ret;
2362         bool val;
2363
2364         if (kstrtobool_from_user(user_buf, count, &val))
2365                 return -EFAULT;
2366
2367         if (!val)
2368                 return -EINVAL;
2369
2370         mutex_lock(&ar->conf_mutex);
2371
2372         if (ar->state != ATH10K_STATE_ON) {
2373                 ret = -ENETDOWN;
2374                 goto exit;
2375         }
2376
2377         ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pdev_reset,
2378                                         WMI_RST_MODE_WARM_RESET);
2379
2380         if (ret) {
2381                 ath10k_warn(ar, "failed to enable warm hw reset: %d\n", ret);
2382                 goto exit;
2383         }
2384
2385         ret = count;
2386
2387 exit:
2388         mutex_unlock(&ar->conf_mutex);
2389         return ret;
2390 }
2391
2392 static const struct file_operations fops_warm_hw_reset = {
2393         .write = ath10k_write_warm_hw_reset,
2394         .open = simple_open,
2395         .owner = THIS_MODULE,
2396         .llseek = default_llseek,
2397 };
2398
2399 static void ath10k_peer_ps_state_disable(void *data,
2400                                          struct ieee80211_sta *sta)
2401 {
2402         struct ath10k *ar = data;
2403         struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
2404
2405         spin_lock_bh(&ar->data_lock);
2406         arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
2407         spin_unlock_bh(&ar->data_lock);
2408 }
2409
2410 static ssize_t ath10k_write_ps_state_enable(struct file *file,
2411                                             const char __user *user_buf,
2412                                             size_t count, loff_t *ppos)
2413 {
2414         struct ath10k *ar = file->private_data;
2415         int ret;
2416         u32 param;
2417         u8 ps_state_enable;
2418
2419         if (kstrtou8_from_user(user_buf, count, 0, &ps_state_enable))
2420                 return -EINVAL;
2421
2422         if (ps_state_enable > 1)
2423                 return -EINVAL;
2424
2425         mutex_lock(&ar->conf_mutex);
2426
2427         if (ar->ps_state_enable == ps_state_enable) {
2428                 ret = count;
2429                 goto exit;
2430         }
2431
2432         param = ar->wmi.pdev_param->peer_sta_ps_statechg_enable;
2433         ret = ath10k_wmi_pdev_set_param(ar, param, ps_state_enable);
2434         if (ret) {
2435                 ath10k_warn(ar, "failed to enable ps_state_enable: %d\n",
2436                             ret);
2437                 goto exit;
2438         }
2439         ar->ps_state_enable = ps_state_enable;
2440
2441         if (!ar->ps_state_enable)
2442                 ieee80211_iterate_stations_atomic(ar->hw,
2443                                                   ath10k_peer_ps_state_disable,
2444                                                   ar);
2445
2446         ret = count;
2447
2448 exit:
2449         mutex_unlock(&ar->conf_mutex);
2450
2451         return ret;
2452 }
2453
2454 static ssize_t ath10k_read_ps_state_enable(struct file *file,
2455                                            char __user *user_buf,
2456                                            size_t count, loff_t *ppos)
2457 {
2458         struct ath10k *ar = file->private_data;
2459         int len = 0;
2460         char buf[32];
2461
2462         mutex_lock(&ar->conf_mutex);
2463         len = scnprintf(buf, sizeof(buf) - len, "%d\n",
2464                         ar->ps_state_enable);
2465         mutex_unlock(&ar->conf_mutex);
2466
2467         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
2468 }
2469
2470 static const struct file_operations fops_ps_state_enable = {
2471         .read = ath10k_read_ps_state_enable,
2472         .write = ath10k_write_ps_state_enable,
2473         .open = simple_open,
2474         .owner = THIS_MODULE,
2475         .llseek = default_llseek,
2476 };
2477
2478 static ssize_t ath10k_write_reset_htt_stats(struct file *file,
2479                                             const char __user *user_buf,
2480                                             size_t count, loff_t *ppos)
2481 {
2482         struct ath10k *ar = file->private_data;
2483         unsigned long reset;
2484         int ret;
2485
2486         ret = kstrtoul_from_user(user_buf, count, 0, &reset);
2487         if (ret)
2488                 return ret;
2489
2490         if (reset == 0 || reset > 0x1ffff)
2491                 return -EINVAL;
2492
2493         mutex_lock(&ar->conf_mutex);
2494
2495         ar->debug.reset_htt_stats = reset;
2496
2497         ret = ath10k_debug_htt_stats_req(ar);
2498         if (ret)
2499                 goto out;
2500
2501         ar->debug.reset_htt_stats = 0;
2502         ret = count;
2503
2504 out:
2505         mutex_unlock(&ar->conf_mutex);
2506         return ret;
2507 }
2508
2509 static const struct file_operations fops_reset_htt_stats = {
2510         .write = ath10k_write_reset_htt_stats,
2511         .owner = THIS_MODULE,
2512         .open = simple_open,
2513         .llseek = default_llseek,
2514 };
2515
2516 int ath10k_debug_create(struct ath10k *ar)
2517 {
2518         ar->debug.cal_data = vzalloc(ATH10K_DEBUG_CAL_DATA_LEN);
2519         if (!ar->debug.cal_data)
2520                 return -ENOMEM;
2521
2522         INIT_LIST_HEAD(&ar->debug.fw_stats.pdevs);
2523         INIT_LIST_HEAD(&ar->debug.fw_stats.vdevs);
2524         INIT_LIST_HEAD(&ar->debug.fw_stats.peers);
2525         INIT_LIST_HEAD(&ar->debug.fw_stats.peers_extd);
2526
2527         return 0;
2528 }
2529
2530 void ath10k_debug_destroy(struct ath10k *ar)
2531 {
2532         vfree(ar->debug.cal_data);
2533         ar->debug.cal_data = NULL;
2534
2535         ath10k_debug_fw_stats_reset(ar);
2536
2537         kfree(ar->debug.tpc_stats);
2538         kfree(ar->debug.tpc_stats_final);
2539 }
2540
2541 int ath10k_debug_register(struct ath10k *ar)
2542 {
2543         ar->debug.debugfs_phy = debugfs_create_dir("ath10k",
2544                                                    ar->hw->wiphy->debugfsdir);
2545         if (IS_ERR_OR_NULL(ar->debug.debugfs_phy)) {
2546                 if (IS_ERR(ar->debug.debugfs_phy))
2547                         return PTR_ERR(ar->debug.debugfs_phy);
2548
2549                 return -ENOMEM;
2550         }
2551
2552         INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork,
2553                           ath10k_debug_htt_stats_dwork);
2554
2555         init_completion(&ar->debug.tpc_complete);
2556         init_completion(&ar->debug.fw_stats_complete);
2557
2558         debugfs_create_file("fw_stats", 0400, ar->debug.debugfs_phy, ar,
2559                             &fops_fw_stats);
2560
2561         debugfs_create_file("fw_reset_stats", 0400, ar->debug.debugfs_phy, ar,
2562                             &fops_fw_reset_stats);
2563
2564         debugfs_create_file("wmi_services", 0400, ar->debug.debugfs_phy, ar,
2565                             &fops_wmi_services);
2566
2567         debugfs_create_file("simulate_fw_crash", 0600, ar->debug.debugfs_phy, ar,
2568                             &fops_simulate_fw_crash);
2569
2570         debugfs_create_file("reg_addr", 0600, ar->debug.debugfs_phy, ar,
2571                             &fops_reg_addr);
2572
2573         debugfs_create_file("reg_value", 0600, ar->debug.debugfs_phy, ar,
2574                             &fops_reg_value);
2575
2576         debugfs_create_file("mem_value", 0600, ar->debug.debugfs_phy, ar,
2577                             &fops_mem_value);
2578
2579         debugfs_create_file("chip_id", 0400, ar->debug.debugfs_phy, ar,
2580                             &fops_chip_id);
2581
2582         debugfs_create_file("htt_stats_mask", 0600, ar->debug.debugfs_phy, ar,
2583                             &fops_htt_stats_mask);
2584
2585         debugfs_create_file("htt_max_amsdu_ampdu", 0600, ar->debug.debugfs_phy, ar,
2586                             &fops_htt_max_amsdu_ampdu);
2587
2588         debugfs_create_file("fw_dbglog", 0600, ar->debug.debugfs_phy, ar,
2589                             &fops_fw_dbglog);
2590
2591         if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
2592                       ar->normal_mode_fw.fw_file.fw_features)) {
2593                 debugfs_create_file("cal_data", 0400, ar->debug.debugfs_phy, ar,
2594                                     &fops_cal_data);
2595
2596                 debugfs_create_file("nf_cal_period", 0600, ar->debug.debugfs_phy, ar,
2597                                     &fops_nf_cal_period);
2598         }
2599
2600         debugfs_create_file("ani_enable", 0600, ar->debug.debugfs_phy, ar,
2601                             &fops_ani_enable);
2602
2603         if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
2604                 debugfs_create_file("dfs_simulate_radar", 0200, ar->debug.debugfs_phy,
2605                                     ar, &fops_simulate_radar);
2606
2607                 debugfs_create_bool("dfs_block_radar_events", 0200,
2608                                     ar->debug.debugfs_phy,
2609                                     &ar->dfs_block_radar_events);
2610
2611                 debugfs_create_file("dfs_stats", 0400, ar->debug.debugfs_phy, ar,
2612                                     &fops_dfs_stats);
2613         }
2614
2615         debugfs_create_file("pktlog_filter", 0644, ar->debug.debugfs_phy, ar,
2616                             &fops_pktlog_filter);
2617
2618         if (test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map))
2619                 debugfs_create_file("quiet_period", 0644, ar->debug.debugfs_phy, ar,
2620                                     &fops_quiet_period);
2621
2622         debugfs_create_file("tpc_stats", 0400, ar->debug.debugfs_phy, ar,
2623                             &fops_tpc_stats);
2624
2625         if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
2626                 debugfs_create_file("btcoex", 0644, ar->debug.debugfs_phy, ar,
2627                                     &fops_btcoex);
2628
2629         if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map)) {
2630                 debugfs_create_file("peer_stats", 0644, ar->debug.debugfs_phy, ar,
2631                                     &fops_peer_stats);
2632
2633                 debugfs_create_file("enable_extd_tx_stats", 0644,
2634                                     ar->debug.debugfs_phy, ar,
2635                                     &fops_enable_extd_tx_stats);
2636         }
2637
2638         debugfs_create_file("fw_checksums", 0400, ar->debug.debugfs_phy, ar,
2639                             &fops_fw_checksums);
2640
2641         if (IS_ENABLED(CONFIG_MAC80211_DEBUGFS))
2642                 debugfs_create_file("sta_tid_stats_mask", 0600,
2643                                     ar->debug.debugfs_phy,
2644                                     ar, &fops_sta_tid_stats_mask);
2645
2646         if (test_bit(WMI_SERVICE_TPC_STATS_FINAL, ar->wmi.svc_map))
2647                 debugfs_create_file("tpc_stats_final", 0400,
2648                                     ar->debug.debugfs_phy, ar,
2649                                     &fops_tpc_stats_final);
2650
2651         if (test_bit(WMI_SERVICE_RESET_CHIP, ar->wmi.svc_map))
2652                 debugfs_create_file("warm_hw_reset", 0600,
2653                                     ar->debug.debugfs_phy, ar,
2654                                     &fops_warm_hw_reset);
2655
2656         debugfs_create_file("ps_state_enable", 0600, ar->debug.debugfs_phy, ar,
2657                             &fops_ps_state_enable);
2658
2659         debugfs_create_file("reset_htt_stats", 0200, ar->debug.debugfs_phy, ar,
2660                             &fops_reset_htt_stats);
2661
2662         return 0;
2663 }
2664
2665 void ath10k_debug_unregister(struct ath10k *ar)
2666 {
2667         cancel_delayed_work_sync(&ar->debug.htt_stats_dwork);
2668 }
2669
2670 #endif /* CONFIG_ATH10K_DEBUGFS */
2671
2672 #ifdef CONFIG_ATH10K_DEBUG
2673 void __ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask,
2674                   const char *fmt, ...)
2675 {
2676         struct va_format vaf;
2677         va_list args;
2678
2679         va_start(args, fmt);
2680
2681         vaf.fmt = fmt;
2682         vaf.va = &args;
2683
2684         if (ath10k_debug_mask & mask)
2685                 dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf);
2686
2687         trace_ath10k_log_dbg(ar, mask, &vaf);
2688
2689         va_end(args);
2690 }
2691 EXPORT_SYMBOL(__ath10k_dbg);
2692
2693 void ath10k_dbg_dump(struct ath10k *ar,
2694                      enum ath10k_debug_mask mask,
2695                      const char *msg, const char *prefix,
2696                      const void *buf, size_t len)
2697 {
2698         char linebuf[256];
2699         size_t linebuflen;
2700         const void *ptr;
2701
2702         if (ath10k_debug_mask & mask) {
2703                 if (msg)
2704                         __ath10k_dbg(ar, mask, "%s\n", msg);
2705
2706                 for (ptr = buf; (ptr - buf) < len; ptr += 16) {
2707                         linebuflen = 0;
2708                         linebuflen += scnprintf(linebuf + linebuflen,
2709                                                 sizeof(linebuf) - linebuflen,
2710                                                 "%s%08x: ",
2711                                                 (prefix ? prefix : ""),
2712                                                 (unsigned int)(ptr - buf));
2713                         hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1,
2714                                            linebuf + linebuflen,
2715                                            sizeof(linebuf) - linebuflen, true);
2716                         dev_printk(KERN_DEBUG, ar->dev, "%s\n", linebuf);
2717                 }
2718         }
2719
2720         /* tracing code doesn't like null strings :/ */
2721         trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : "",
2722                                   buf, len);
2723 }
2724 EXPORT_SYMBOL(ath10k_dbg_dump);
2725
2726 #endif /* CONFIG_ATH10K_DEBUG */
This page took 0.198483 seconds and 4 git commands to generate.