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