ath10k: else is not generally useful after a break or return
[cascardo/linux.git] / drivers / net / wireless / ath / ath10k / debug.c
1 /*
2  * Copyright (c) 2005-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #include <linux/module.h>
19 #include <linux/debugfs.h>
20 #include <linux/version.h>
21 #include <linux/vermagic.h>
22 #include <linux/vmalloc.h>
23
24 #include "core.h"
25 #include "debug.h"
26
27 /* ms */
28 #define ATH10K_DEBUG_HTT_STATS_INTERVAL 1000
29
30 #define ATH10K_FW_CRASH_DUMP_VERSION 1
31
32 /**
33  * enum ath10k_fw_crash_dump_type - types of data in the dump file
34  * @ATH10K_FW_CRASH_DUMP_REGDUMP: Register crash dump in binary format
35  */
36 enum ath10k_fw_crash_dump_type {
37         ATH10K_FW_CRASH_DUMP_REGISTERS = 0,
38
39         ATH10K_FW_CRASH_DUMP_MAX,
40 };
41
42 struct ath10k_tlv_dump_data {
43         /* see ath10k_fw_crash_dump_type above */
44         __le32 type;
45
46         /* in bytes */
47         __le32 tlv_len;
48
49         /* pad to 32-bit boundaries as needed */
50         u8 tlv_data[];
51 } __packed;
52
53 struct ath10k_dump_file_data {
54         /* dump file information */
55
56         /* "ATH10K-FW-DUMP" */
57         char df_magic[16];
58
59         __le32 len;
60
61         /* file dump version */
62         __le32 version;
63
64         /* some info we can get from ath10k struct that might help */
65
66         u8 uuid[16];
67
68         __le32 chip_id;
69
70         /* 0 for now, in place for later hardware */
71         __le32 bus_type;
72
73         __le32 target_version;
74         __le32 fw_version_major;
75         __le32 fw_version_minor;
76         __le32 fw_version_release;
77         __le32 fw_version_build;
78         __le32 phy_capability;
79         __le32 hw_min_tx_power;
80         __le32 hw_max_tx_power;
81         __le32 ht_cap_info;
82         __le32 vht_cap_info;
83         __le32 num_rf_chains;
84
85         /* firmware version string */
86         char fw_ver[ETHTOOL_FWVERS_LEN];
87
88         /* Kernel related information */
89
90         /* time-of-day stamp */
91         __le64 tv_sec;
92
93         /* time-of-day stamp, nano-seconds */
94         __le64 tv_nsec;
95
96         /* LINUX_VERSION_CODE */
97         __le32 kernel_ver_code;
98
99         /* VERMAGIC_STRING */
100         char kernel_ver[64];
101
102         /* room for growth w/out changing binary format */
103         u8 unused[128];
104
105         /* struct ath10k_tlv_dump_data + more */
106         u8 data[0];
107 } __packed;
108
109 int ath10k_info(struct ath10k *ar, const char *fmt, ...)
110 {
111         struct va_format vaf = {
112                 .fmt = fmt,
113         };
114         va_list args;
115         int ret;
116
117         va_start(args, fmt);
118         vaf.va = &args;
119         ret = dev_info(ar->dev, "%pV", &vaf);
120         trace_ath10k_log_info(ar, &vaf);
121         va_end(args);
122
123         return ret;
124 }
125 EXPORT_SYMBOL(ath10k_info);
126
127 void ath10k_print_driver_info(struct ath10k *ar)
128 {
129         ath10k_info(ar, "%s (0x%08x, 0x%08x) fw %s api %d htt %d.%d\n",
130                     ar->hw_params.name,
131                     ar->target_version,
132                     ar->chip_id,
133                     ar->hw->wiphy->fw_version,
134                     ar->fw_api,
135                     ar->htt.target_version_major,
136                     ar->htt.target_version_minor);
137         ath10k_info(ar, "debug %d debugfs %d tracing %d dfs %d testmode %d\n",
138                     config_enabled(CONFIG_ATH10K_DEBUG),
139                     config_enabled(CONFIG_ATH10K_DEBUGFS),
140                     config_enabled(CONFIG_ATH10K_TRACING),
141                     config_enabled(CONFIG_ATH10K_DFS_CERTIFIED),
142                     config_enabled(CONFIG_NL80211_TESTMODE));
143 }
144 EXPORT_SYMBOL(ath10k_print_driver_info);
145
146 int ath10k_err(struct ath10k *ar, const char *fmt, ...)
147 {
148         struct va_format vaf = {
149                 .fmt = fmt,
150         };
151         va_list args;
152         int ret;
153
154         va_start(args, fmt);
155         vaf.va = &args;
156         ret = dev_err(ar->dev, "%pV", &vaf);
157         trace_ath10k_log_err(ar, &vaf);
158         va_end(args);
159
160         return ret;
161 }
162 EXPORT_SYMBOL(ath10k_err);
163
164 int ath10k_warn(struct ath10k *ar, const char *fmt, ...)
165 {
166         struct va_format vaf = {
167                 .fmt = fmt,
168         };
169         va_list args;
170
171         va_start(args, fmt);
172         vaf.va = &args;
173         dev_warn_ratelimited(ar->dev, "%pV", &vaf);
174         trace_ath10k_log_warn(ar, &vaf);
175
176         va_end(args);
177
178         return 0;
179 }
180 EXPORT_SYMBOL(ath10k_warn);
181
182 #ifdef CONFIG_ATH10K_DEBUGFS
183
184 void ath10k_debug_read_service_map(struct ath10k *ar,
185                                    void *service_map,
186                                    size_t map_size)
187 {
188         memcpy(ar->debug.wmi_service_bitmap, service_map, map_size);
189 }
190
191 static ssize_t ath10k_read_wmi_services(struct file *file,
192                                         char __user *user_buf,
193                                         size_t count, loff_t *ppos)
194 {
195         struct ath10k *ar = file->private_data;
196         char *buf;
197         unsigned int len = 0, buf_len = 4096;
198         const char *name;
199         ssize_t ret_cnt;
200         bool enabled;
201         int i;
202
203         buf = kzalloc(buf_len, GFP_KERNEL);
204         if (!buf)
205                 return -ENOMEM;
206
207         mutex_lock(&ar->conf_mutex);
208
209         if (len > buf_len)
210                 len = buf_len;
211
212         for (i = 0; i < WMI_SERVICE_MAX; i++) {
213                 enabled = test_bit(i, ar->debug.wmi_service_bitmap);
214                 name = wmi_service_name(i);
215
216                 if (!name) {
217                         if (enabled)
218                                 len += scnprintf(buf + len, buf_len - len,
219                                                  "%-40s %s (bit %d)\n",
220                                                  "unknown", "enabled", i);
221
222                         continue;
223                 }
224
225                 len += scnprintf(buf + len, buf_len - len,
226                                  "%-40s %s\n",
227                                  name, enabled ? "enabled" : "-");
228         }
229
230         ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
231
232         mutex_unlock(&ar->conf_mutex);
233
234         kfree(buf);
235         return ret_cnt;
236 }
237
238 static const struct file_operations fops_wmi_services = {
239         .read = ath10k_read_wmi_services,
240         .open = simple_open,
241         .owner = THIS_MODULE,
242         .llseek = default_llseek,
243 };
244
245 void ath10k_debug_read_target_stats(struct ath10k *ar,
246                                     struct wmi_stats_event *ev)
247 {
248         u8 *tmp = ev->data;
249         struct ath10k_target_stats *stats;
250         int num_pdev_stats, num_vdev_stats, num_peer_stats;
251         struct wmi_pdev_stats_10x *ps;
252         int i;
253
254         spin_lock_bh(&ar->data_lock);
255
256         stats = &ar->debug.target_stats;
257
258         num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); /* 0 or 1 */
259         num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); /* 0 or max vdevs */
260         num_peer_stats = __le32_to_cpu(ev->num_peer_stats); /* 0 or max peers */
261
262         if (num_pdev_stats) {
263                 ps = (struct wmi_pdev_stats_10x *)tmp;
264
265                 stats->ch_noise_floor = __le32_to_cpu(ps->chan_nf);
266                 stats->tx_frame_count = __le32_to_cpu(ps->tx_frame_count);
267                 stats->rx_frame_count = __le32_to_cpu(ps->rx_frame_count);
268                 stats->rx_clear_count = __le32_to_cpu(ps->rx_clear_count);
269                 stats->cycle_count = __le32_to_cpu(ps->cycle_count);
270                 stats->phy_err_count = __le32_to_cpu(ps->phy_err_count);
271                 stats->chan_tx_power = __le32_to_cpu(ps->chan_tx_pwr);
272
273                 stats->comp_queued = __le32_to_cpu(ps->wal.tx.comp_queued);
274                 stats->comp_delivered =
275                         __le32_to_cpu(ps->wal.tx.comp_delivered);
276                 stats->msdu_enqued = __le32_to_cpu(ps->wal.tx.msdu_enqued);
277                 stats->mpdu_enqued = __le32_to_cpu(ps->wal.tx.mpdu_enqued);
278                 stats->wmm_drop = __le32_to_cpu(ps->wal.tx.wmm_drop);
279                 stats->local_enqued = __le32_to_cpu(ps->wal.tx.local_enqued);
280                 stats->local_freed = __le32_to_cpu(ps->wal.tx.local_freed);
281                 stats->hw_queued = __le32_to_cpu(ps->wal.tx.hw_queued);
282                 stats->hw_reaped = __le32_to_cpu(ps->wal.tx.hw_reaped);
283                 stats->underrun = __le32_to_cpu(ps->wal.tx.underrun);
284                 stats->tx_abort = __le32_to_cpu(ps->wal.tx.tx_abort);
285                 stats->mpdus_requed = __le32_to_cpu(ps->wal.tx.mpdus_requed);
286                 stats->tx_ko = __le32_to_cpu(ps->wal.tx.tx_ko);
287                 stats->data_rc = __le32_to_cpu(ps->wal.tx.data_rc);
288                 stats->self_triggers = __le32_to_cpu(ps->wal.tx.self_triggers);
289                 stats->sw_retry_failure =
290                         __le32_to_cpu(ps->wal.tx.sw_retry_failure);
291                 stats->illgl_rate_phy_err =
292                         __le32_to_cpu(ps->wal.tx.illgl_rate_phy_err);
293                 stats->pdev_cont_xretry =
294                         __le32_to_cpu(ps->wal.tx.pdev_cont_xretry);
295                 stats->pdev_tx_timeout =
296                         __le32_to_cpu(ps->wal.tx.pdev_tx_timeout);
297                 stats->pdev_resets = __le32_to_cpu(ps->wal.tx.pdev_resets);
298                 stats->phy_underrun = __le32_to_cpu(ps->wal.tx.phy_underrun);
299                 stats->txop_ovf = __le32_to_cpu(ps->wal.tx.txop_ovf);
300
301                 stats->mid_ppdu_route_change =
302                         __le32_to_cpu(ps->wal.rx.mid_ppdu_route_change);
303                 stats->status_rcvd = __le32_to_cpu(ps->wal.rx.status_rcvd);
304                 stats->r0_frags = __le32_to_cpu(ps->wal.rx.r0_frags);
305                 stats->r1_frags = __le32_to_cpu(ps->wal.rx.r1_frags);
306                 stats->r2_frags = __le32_to_cpu(ps->wal.rx.r2_frags);
307                 stats->r3_frags = __le32_to_cpu(ps->wal.rx.r3_frags);
308                 stats->htt_msdus = __le32_to_cpu(ps->wal.rx.htt_msdus);
309                 stats->htt_mpdus = __le32_to_cpu(ps->wal.rx.htt_mpdus);
310                 stats->loc_msdus = __le32_to_cpu(ps->wal.rx.loc_msdus);
311                 stats->loc_mpdus = __le32_to_cpu(ps->wal.rx.loc_mpdus);
312                 stats->oversize_amsdu =
313                         __le32_to_cpu(ps->wal.rx.oversize_amsdu);
314                 stats->phy_errs = __le32_to_cpu(ps->wal.rx.phy_errs);
315                 stats->phy_err_drop = __le32_to_cpu(ps->wal.rx.phy_err_drop);
316                 stats->mpdu_errs = __le32_to_cpu(ps->wal.rx.mpdu_errs);
317
318                 if (test_bit(ATH10K_FW_FEATURE_WMI_10X,
319                              ar->fw_features)) {
320                         stats->ack_rx_bad = __le32_to_cpu(ps->ack_rx_bad);
321                         stats->rts_bad = __le32_to_cpu(ps->rts_bad);
322                         stats->rts_good = __le32_to_cpu(ps->rts_good);
323                         stats->fcs_bad = __le32_to_cpu(ps->fcs_bad);
324                         stats->no_beacons = __le32_to_cpu(ps->no_beacons);
325                         stats->mib_int_count = __le32_to_cpu(ps->mib_int_count);
326                         tmp += sizeof(struct wmi_pdev_stats_10x);
327                 } else {
328                         tmp += sizeof(struct wmi_pdev_stats_old);
329                 }
330         }
331
332         /* 0 or max vdevs */
333         /* Currently firmware does not support VDEV stats */
334         if (num_vdev_stats) {
335                 struct wmi_vdev_stats *vdev_stats;
336
337                 for (i = 0; i < num_vdev_stats; i++) {
338                         vdev_stats = (struct wmi_vdev_stats *)tmp;
339                         tmp += sizeof(struct wmi_vdev_stats);
340                 }
341         }
342
343         if (num_peer_stats) {
344                 struct wmi_peer_stats_10x *peer_stats;
345                 struct ath10k_peer_stat *s;
346
347                 stats->peers = num_peer_stats;
348
349                 for (i = 0; i < num_peer_stats; i++) {
350                         peer_stats = (struct wmi_peer_stats_10x *)tmp;
351                         s = &stats->peer_stat[i];
352
353                         memcpy(s->peer_macaddr, &peer_stats->peer_macaddr.addr,
354                                ETH_ALEN);
355                         s->peer_rssi = __le32_to_cpu(peer_stats->peer_rssi);
356                         s->peer_tx_rate =
357                                 __le32_to_cpu(peer_stats->peer_tx_rate);
358                         if (test_bit(ATH10K_FW_FEATURE_WMI_10X,
359                                      ar->fw_features)) {
360                                 s->peer_rx_rate =
361                                         __le32_to_cpu(peer_stats->peer_rx_rate);
362                                 tmp += sizeof(struct wmi_peer_stats_10x);
363
364                         } else {
365                                 tmp += sizeof(struct wmi_peer_stats_old);
366                         }
367                 }
368         }
369
370         spin_unlock_bh(&ar->data_lock);
371         complete(&ar->debug.event_stats_compl);
372 }
373
374 static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
375                                     size_t count, loff_t *ppos)
376 {
377         struct ath10k *ar = file->private_data;
378         struct ath10k_target_stats *fw_stats;
379         char *buf = NULL;
380         unsigned int len = 0, buf_len = 8000;
381         ssize_t ret_cnt = 0;
382         long left;
383         int i;
384         int ret;
385
386         fw_stats = &ar->debug.target_stats;
387
388         mutex_lock(&ar->conf_mutex);
389
390         if (ar->state != ATH10K_STATE_ON)
391                 goto exit;
392
393         buf = kzalloc(buf_len, GFP_KERNEL);
394         if (!buf)
395                 goto exit;
396
397         ret = ath10k_wmi_request_stats(ar, WMI_REQUEST_PEER_STAT);
398         if (ret) {
399                 ath10k_warn(ar, "could not request stats (%d)\n", ret);
400                 goto exit;
401         }
402
403         left = wait_for_completion_timeout(&ar->debug.event_stats_compl, 1*HZ);
404         if (left <= 0)
405                 goto exit;
406
407         spin_lock_bh(&ar->data_lock);
408         len += scnprintf(buf + len, buf_len - len, "\n");
409         len += scnprintf(buf + len, buf_len - len, "%30s\n",
410                          "ath10k PDEV stats");
411         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
412                                  "=================");
413
414         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
415                          "Channel noise floor", fw_stats->ch_noise_floor);
416         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
417                          "Channel TX power", fw_stats->chan_tx_power);
418         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
419                          "TX frame count", fw_stats->tx_frame_count);
420         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
421                          "RX frame count", fw_stats->rx_frame_count);
422         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
423                          "RX clear count", fw_stats->rx_clear_count);
424         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
425                          "Cycle count", fw_stats->cycle_count);
426         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
427                          "PHY error count", fw_stats->phy_err_count);
428         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
429                          "RTS bad count", fw_stats->rts_bad);
430         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
431                          "RTS good count", fw_stats->rts_good);
432         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
433                          "FCS bad count", fw_stats->fcs_bad);
434         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
435                          "No beacon count", fw_stats->no_beacons);
436         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
437                          "MIB int count", fw_stats->mib_int_count);
438
439         len += scnprintf(buf + len, buf_len - len, "\n");
440         len += scnprintf(buf + len, buf_len - len, "%30s\n",
441                          "ath10k PDEV TX stats");
442         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
443                                  "=================");
444
445         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
446                          "HTT cookies queued", fw_stats->comp_queued);
447         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
448                          "HTT cookies disp.", fw_stats->comp_delivered);
449         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
450                          "MSDU queued", fw_stats->msdu_enqued);
451         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
452                          "MPDU queued", fw_stats->mpdu_enqued);
453         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
454                          "MSDUs dropped", fw_stats->wmm_drop);
455         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
456                          "Local enqued", fw_stats->local_enqued);
457         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
458                          "Local freed", fw_stats->local_freed);
459         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
460                          "HW queued", fw_stats->hw_queued);
461         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
462                          "PPDUs reaped", fw_stats->hw_reaped);
463         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
464                          "Num underruns", fw_stats->underrun);
465         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
466                          "PPDUs cleaned", fw_stats->tx_abort);
467         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
468                          "MPDUs requed", fw_stats->mpdus_requed);
469         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
470                          "Excessive retries", fw_stats->tx_ko);
471         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
472                          "HW rate", fw_stats->data_rc);
473         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
474                          "Sched self tiggers", fw_stats->self_triggers);
475         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
476                          "Dropped due to SW retries",
477                          fw_stats->sw_retry_failure);
478         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
479                          "Illegal rate phy errors",
480                          fw_stats->illgl_rate_phy_err);
481         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
482                          "Pdev continous xretry", fw_stats->pdev_cont_xretry);
483         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
484                          "TX timeout", fw_stats->pdev_tx_timeout);
485         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
486                          "PDEV resets", fw_stats->pdev_resets);
487         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
488                          "PHY underrun", fw_stats->phy_underrun);
489         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
490                          "MPDU is more than txop limit", fw_stats->txop_ovf);
491
492         len += scnprintf(buf + len, buf_len - len, "\n");
493         len += scnprintf(buf + len, buf_len - len, "%30s\n",
494                          "ath10k PDEV RX stats");
495         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
496                                  "=================");
497
498         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
499                          "Mid PPDU route change",
500                          fw_stats->mid_ppdu_route_change);
501         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
502                          "Tot. number of statuses", fw_stats->status_rcvd);
503         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
504                          "Extra frags on rings 0", fw_stats->r0_frags);
505         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
506                          "Extra frags on rings 1", fw_stats->r1_frags);
507         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
508                          "Extra frags on rings 2", fw_stats->r2_frags);
509         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
510                          "Extra frags on rings 3", fw_stats->r3_frags);
511         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
512                          "MSDUs delivered to HTT", fw_stats->htt_msdus);
513         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
514                          "MPDUs delivered to HTT", fw_stats->htt_mpdus);
515         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
516                          "MSDUs delivered to stack", fw_stats->loc_msdus);
517         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
518                          "MPDUs delivered to stack", fw_stats->loc_mpdus);
519         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
520                          "Oversized AMSUs", fw_stats->oversize_amsdu);
521         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
522                          "PHY errors", fw_stats->phy_errs);
523         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
524                          "PHY errors drops", fw_stats->phy_err_drop);
525         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
526                          "MPDU errors (FCS, MIC, ENC)", fw_stats->mpdu_errs);
527
528         len += scnprintf(buf + len, buf_len - len, "\n");
529         len += scnprintf(buf + len, buf_len - len, "%30s (%d)\n",
530                          "ath10k PEER stats", fw_stats->peers);
531         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
532                                  "=================");
533
534         for (i = 0; i < fw_stats->peers; i++) {
535                 len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
536                                  "Peer MAC address",
537                                  fw_stats->peer_stat[i].peer_macaddr);
538                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
539                                  "Peer RSSI", fw_stats->peer_stat[i].peer_rssi);
540                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
541                                  "Peer TX rate",
542                                  fw_stats->peer_stat[i].peer_tx_rate);
543                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
544                                  "Peer RX rate",
545                                  fw_stats->peer_stat[i].peer_rx_rate);
546                 len += scnprintf(buf + len, buf_len - len, "\n");
547         }
548         spin_unlock_bh(&ar->data_lock);
549
550         if (len > buf_len)
551                 len = buf_len;
552
553         ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
554
555 exit:
556         mutex_unlock(&ar->conf_mutex);
557         kfree(buf);
558         return ret_cnt;
559 }
560
561 static const struct file_operations fops_fw_stats = {
562         .read = ath10k_read_fw_stats,
563         .open = simple_open,
564         .owner = THIS_MODULE,
565         .llseek = default_llseek,
566 };
567
568 /* This is a clean assert crash in firmware. */
569 static int ath10k_debug_fw_assert(struct ath10k *ar)
570 {
571         struct wmi_vdev_install_key_cmd *cmd;
572         struct sk_buff *skb;
573
574         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + 16);
575         if (!skb)
576                 return -ENOMEM;
577
578         cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
579         memset(cmd, 0, sizeof(*cmd));
580
581         /* big enough number so that firmware asserts */
582         cmd->vdev_id = __cpu_to_le32(0x7ffe);
583
584         return ath10k_wmi_cmd_send(ar, skb,
585                                    ar->wmi.cmd->vdev_install_key_cmdid);
586 }
587
588 static ssize_t ath10k_read_simulate_fw_crash(struct file *file,
589                                              char __user *user_buf,
590                                              size_t count, loff_t *ppos)
591 {
592         const char buf[] = "To simulate firmware crash write one of the"
593                            " keywords to this file:\n `soft` - this will send"
594                            " WMI_FORCE_FW_HANG_ASSERT to firmware if FW"
595                            " supports that command.\n `hard` - this will send"
596                            " to firmware command with illegal parameters"
597                            " causing firmware crash.\n"
598                            "`assert` - this will send special illegal parameter"
599                            " to firmware to cause assert failure"
600                            " and crash.\n";
601
602         return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
603 }
604
605 /* Simulate firmware crash:
606  * 'soft': Call wmi command causing firmware hang. This firmware hang is
607  * recoverable by warm firmware reset.
608  * 'hard': Force firmware crash by setting any vdev parameter for not allowed
609  * vdev id. This is hard firmware crash because it is recoverable only by cold
610  * firmware reset.
611  */
612 static ssize_t ath10k_write_simulate_fw_crash(struct file *file,
613                                               const char __user *user_buf,
614                                               size_t count, loff_t *ppos)
615 {
616         struct ath10k *ar = file->private_data;
617         char buf[32];
618         int ret;
619
620         mutex_lock(&ar->conf_mutex);
621
622         simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
623
624         /* make sure that buf is null terminated */
625         buf[sizeof(buf) - 1] = 0;
626
627         if (ar->state != ATH10K_STATE_ON &&
628             ar->state != ATH10K_STATE_RESTARTED) {
629                 ret = -ENETDOWN;
630                 goto exit;
631         }
632
633         /* drop the possible '\n' from the end */
634         if (buf[count - 1] == '\n') {
635                 buf[count - 1] = 0;
636                 count--;
637         }
638
639         if (!strcmp(buf, "soft")) {
640                 ath10k_info(ar, "simulating soft firmware crash\n");
641                 ret = ath10k_wmi_force_fw_hang(ar, WMI_FORCE_FW_HANG_ASSERT, 0);
642         } else if (!strcmp(buf, "hard")) {
643                 ath10k_info(ar, "simulating hard firmware crash\n");
644                 /* 0x7fff is vdev id, and it is always out of range for all
645                  * firmware variants in order to force a firmware crash.
646                  */
647                 ret = ath10k_wmi_vdev_set_param(ar, 0x7fff,
648                                                 ar->wmi.vdev_param->rts_threshold,
649                                                 0);
650         } else if (!strcmp(buf, "assert")) {
651                 ath10k_info(ar, "simulating firmware assert crash\n");
652                 ret = ath10k_debug_fw_assert(ar);
653         } else {
654                 ret = -EINVAL;
655                 goto exit;
656         }
657
658         if (ret) {
659                 ath10k_warn(ar, "failed to simulate firmware crash: %d\n", ret);
660                 goto exit;
661         }
662
663         ret = count;
664
665 exit:
666         mutex_unlock(&ar->conf_mutex);
667         return ret;
668 }
669
670 static const struct file_operations fops_simulate_fw_crash = {
671         .read = ath10k_read_simulate_fw_crash,
672         .write = ath10k_write_simulate_fw_crash,
673         .open = simple_open,
674         .owner = THIS_MODULE,
675         .llseek = default_llseek,
676 };
677
678 static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf,
679                                    size_t count, loff_t *ppos)
680 {
681         struct ath10k *ar = file->private_data;
682         unsigned int len;
683         char buf[50];
684
685         len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->chip_id);
686
687         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
688 }
689
690 static const struct file_operations fops_chip_id = {
691         .read = ath10k_read_chip_id,
692         .open = simple_open,
693         .owner = THIS_MODULE,
694         .llseek = default_llseek,
695 };
696
697 struct ath10k_fw_crash_data *
698 ath10k_debug_get_new_fw_crash_data(struct ath10k *ar)
699 {
700         struct ath10k_fw_crash_data *crash_data = ar->debug.fw_crash_data;
701
702         lockdep_assert_held(&ar->data_lock);
703
704         crash_data->crashed_since_read = true;
705         uuid_le_gen(&crash_data->uuid);
706         getnstimeofday(&crash_data->timestamp);
707
708         return crash_data;
709 }
710 EXPORT_SYMBOL(ath10k_debug_get_new_fw_crash_data);
711
712 static struct ath10k_dump_file_data *ath10k_build_dump_file(struct ath10k *ar)
713 {
714         struct ath10k_fw_crash_data *crash_data = ar->debug.fw_crash_data;
715         struct ath10k_dump_file_data *dump_data;
716         struct ath10k_tlv_dump_data *dump_tlv;
717         int hdr_len = sizeof(*dump_data);
718         unsigned int len, sofar = 0;
719         unsigned char *buf;
720
721         len = hdr_len;
722         len += sizeof(*dump_tlv) + sizeof(crash_data->registers);
723
724         sofar += hdr_len;
725
726         /* This is going to get big when we start dumping FW RAM and such,
727          * so go ahead and use vmalloc.
728          */
729         buf = vzalloc(len);
730         if (!buf)
731                 return NULL;
732
733         spin_lock_bh(&ar->data_lock);
734
735         if (!crash_data->crashed_since_read) {
736                 spin_unlock_bh(&ar->data_lock);
737                 vfree(buf);
738                 return NULL;
739         }
740
741         dump_data = (struct ath10k_dump_file_data *)(buf);
742         strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP",
743                 sizeof(dump_data->df_magic));
744         dump_data->len = cpu_to_le32(len);
745
746         dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION);
747
748         memcpy(dump_data->uuid, &crash_data->uuid, sizeof(dump_data->uuid));
749         dump_data->chip_id = cpu_to_le32(ar->chip_id);
750         dump_data->bus_type = cpu_to_le32(0);
751         dump_data->target_version = cpu_to_le32(ar->target_version);
752         dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major);
753         dump_data->fw_version_minor = cpu_to_le32(ar->fw_version_minor);
754         dump_data->fw_version_release = cpu_to_le32(ar->fw_version_release);
755         dump_data->fw_version_build = cpu_to_le32(ar->fw_version_build);
756         dump_data->phy_capability = cpu_to_le32(ar->phy_capability);
757         dump_data->hw_min_tx_power = cpu_to_le32(ar->hw_min_tx_power);
758         dump_data->hw_max_tx_power = cpu_to_le32(ar->hw_max_tx_power);
759         dump_data->ht_cap_info = cpu_to_le32(ar->ht_cap_info);
760         dump_data->vht_cap_info = cpu_to_le32(ar->vht_cap_info);
761         dump_data->num_rf_chains = cpu_to_le32(ar->num_rf_chains);
762
763         strlcpy(dump_data->fw_ver, ar->hw->wiphy->fw_version,
764                 sizeof(dump_data->fw_ver));
765
766         dump_data->kernel_ver_code = cpu_to_le32(LINUX_VERSION_CODE);
767         strlcpy(dump_data->kernel_ver, VERMAGIC_STRING,
768                 sizeof(dump_data->kernel_ver));
769
770         dump_data->tv_sec = cpu_to_le64(crash_data->timestamp.tv_sec);
771         dump_data->tv_nsec = cpu_to_le64(crash_data->timestamp.tv_nsec);
772
773         /* Gather crash-dump */
774         dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
775         dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS);
776         dump_tlv->tlv_len = cpu_to_le32(sizeof(crash_data->registers));
777         memcpy(dump_tlv->tlv_data, &crash_data->registers,
778                sizeof(crash_data->registers));
779         sofar += sizeof(*dump_tlv) + sizeof(crash_data->registers);
780
781         ar->debug.fw_crash_data->crashed_since_read = false;
782
783         spin_unlock_bh(&ar->data_lock);
784
785         return dump_data;
786 }
787
788 static int ath10k_fw_crash_dump_open(struct inode *inode, struct file *file)
789 {
790         struct ath10k *ar = inode->i_private;
791         struct ath10k_dump_file_data *dump;
792
793         dump = ath10k_build_dump_file(ar);
794         if (!dump)
795                 return -ENODATA;
796
797         file->private_data = dump;
798
799         return 0;
800 }
801
802 static ssize_t ath10k_fw_crash_dump_read(struct file *file,
803                                          char __user *user_buf,
804                                          size_t count, loff_t *ppos)
805 {
806         struct ath10k_dump_file_data *dump_file = file->private_data;
807
808         return simple_read_from_buffer(user_buf, count, ppos,
809                                        dump_file,
810                                        le32_to_cpu(dump_file->len));
811 }
812
813 static int ath10k_fw_crash_dump_release(struct inode *inode,
814                                         struct file *file)
815 {
816         vfree(file->private_data);
817
818         return 0;
819 }
820
821 static const struct file_operations fops_fw_crash_dump = {
822         .open = ath10k_fw_crash_dump_open,
823         .read = ath10k_fw_crash_dump_read,
824         .release = ath10k_fw_crash_dump_release,
825         .owner = THIS_MODULE,
826         .llseek = default_llseek,
827 };
828
829 static int ath10k_debug_htt_stats_req(struct ath10k *ar)
830 {
831         u64 cookie;
832         int ret;
833
834         lockdep_assert_held(&ar->conf_mutex);
835
836         if (ar->debug.htt_stats_mask == 0)
837                 /* htt stats are disabled */
838                 return 0;
839
840         if (ar->state != ATH10K_STATE_ON)
841                 return 0;
842
843         cookie = get_jiffies_64();
844
845         ret = ath10k_htt_h2t_stats_req(&ar->htt, ar->debug.htt_stats_mask,
846                                        cookie);
847         if (ret) {
848                 ath10k_warn(ar, "failed to send htt stats request: %d\n", ret);
849                 return ret;
850         }
851
852         queue_delayed_work(ar->workqueue, &ar->debug.htt_stats_dwork,
853                            msecs_to_jiffies(ATH10K_DEBUG_HTT_STATS_INTERVAL));
854
855         return 0;
856 }
857
858 static void ath10k_debug_htt_stats_dwork(struct work_struct *work)
859 {
860         struct ath10k *ar = container_of(work, struct ath10k,
861                                          debug.htt_stats_dwork.work);
862
863         mutex_lock(&ar->conf_mutex);
864
865         ath10k_debug_htt_stats_req(ar);
866
867         mutex_unlock(&ar->conf_mutex);
868 }
869
870 static ssize_t ath10k_read_htt_stats_mask(struct file *file,
871                                           char __user *user_buf,
872                                           size_t count, loff_t *ppos)
873 {
874         struct ath10k *ar = file->private_data;
875         char buf[32];
876         unsigned int len;
877
878         len = scnprintf(buf, sizeof(buf), "%lu\n", ar->debug.htt_stats_mask);
879
880         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
881 }
882
883 static ssize_t ath10k_write_htt_stats_mask(struct file *file,
884                                            const char __user *user_buf,
885                                            size_t count, loff_t *ppos)
886 {
887         struct ath10k *ar = file->private_data;
888         unsigned long mask;
889         int ret;
890
891         ret = kstrtoul_from_user(user_buf, count, 0, &mask);
892         if (ret)
893                 return ret;
894
895         /* max 8 bit masks (for now) */
896         if (mask > 0xff)
897                 return -E2BIG;
898
899         mutex_lock(&ar->conf_mutex);
900
901         ar->debug.htt_stats_mask = mask;
902
903         ret = ath10k_debug_htt_stats_req(ar);
904         if (ret)
905                 goto out;
906
907         ret = count;
908
909 out:
910         mutex_unlock(&ar->conf_mutex);
911
912         return ret;
913 }
914
915 static const struct file_operations fops_htt_stats_mask = {
916         .read = ath10k_read_htt_stats_mask,
917         .write = ath10k_write_htt_stats_mask,
918         .open = simple_open,
919         .owner = THIS_MODULE,
920         .llseek = default_llseek,
921 };
922
923 static ssize_t ath10k_read_htt_max_amsdu_ampdu(struct file *file,
924                                                char __user *user_buf,
925                                                size_t count, loff_t *ppos)
926 {
927         struct ath10k *ar = file->private_data;
928         char buf[64];
929         u8 amsdu = 3, ampdu = 64;
930         unsigned int len;
931
932         mutex_lock(&ar->conf_mutex);
933
934         if (ar->debug.htt_max_amsdu)
935                 amsdu = ar->debug.htt_max_amsdu;
936
937         if (ar->debug.htt_max_ampdu)
938                 ampdu = ar->debug.htt_max_ampdu;
939
940         mutex_unlock(&ar->conf_mutex);
941
942         len = scnprintf(buf, sizeof(buf), "%u %u\n", amsdu, ampdu);
943
944         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
945 }
946
947 static ssize_t ath10k_write_htt_max_amsdu_ampdu(struct file *file,
948                                                 const char __user *user_buf,
949                                                 size_t count, loff_t *ppos)
950 {
951         struct ath10k *ar = file->private_data;
952         int res;
953         char buf[64];
954         unsigned int amsdu, ampdu;
955
956         simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
957
958         /* make sure that buf is null terminated */
959         buf[sizeof(buf) - 1] = 0;
960
961         res = sscanf(buf, "%u %u", &amsdu, &ampdu);
962
963         if (res != 2)
964                 return -EINVAL;
965
966         mutex_lock(&ar->conf_mutex);
967
968         res = ath10k_htt_h2t_aggr_cfg_msg(&ar->htt, ampdu, amsdu);
969         if (res)
970                 goto out;
971
972         res = count;
973         ar->debug.htt_max_amsdu = amsdu;
974         ar->debug.htt_max_ampdu = ampdu;
975
976 out:
977         mutex_unlock(&ar->conf_mutex);
978         return res;
979 }
980
981 static const struct file_operations fops_htt_max_amsdu_ampdu = {
982         .read = ath10k_read_htt_max_amsdu_ampdu,
983         .write = ath10k_write_htt_max_amsdu_ampdu,
984         .open = simple_open,
985         .owner = THIS_MODULE,
986         .llseek = default_llseek,
987 };
988
989 static ssize_t ath10k_read_fw_dbglog(struct file *file,
990                                      char __user *user_buf,
991                                      size_t count, loff_t *ppos)
992 {
993         struct ath10k *ar = file->private_data;
994         unsigned int len;
995         char buf[32];
996
997         len = scnprintf(buf, sizeof(buf), "0x%08x\n",
998                         ar->debug.fw_dbglog_mask);
999
1000         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1001 }
1002
1003 static ssize_t ath10k_write_fw_dbglog(struct file *file,
1004                                       const char __user *user_buf,
1005                                       size_t count, loff_t *ppos)
1006 {
1007         struct ath10k *ar = file->private_data;
1008         unsigned long mask;
1009         int ret;
1010
1011         ret = kstrtoul_from_user(user_buf, count, 0, &mask);
1012         if (ret)
1013                 return ret;
1014
1015         mutex_lock(&ar->conf_mutex);
1016
1017         ar->debug.fw_dbglog_mask = mask;
1018
1019         if (ar->state == ATH10K_STATE_ON) {
1020                 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask);
1021                 if (ret) {
1022                         ath10k_warn(ar, "dbglog cfg failed from debugfs: %d\n",
1023                                     ret);
1024                         goto exit;
1025                 }
1026         }
1027
1028         ret = count;
1029
1030 exit:
1031         mutex_unlock(&ar->conf_mutex);
1032
1033         return ret;
1034 }
1035
1036 static const struct file_operations fops_fw_dbglog = {
1037         .read = ath10k_read_fw_dbglog,
1038         .write = ath10k_write_fw_dbglog,
1039         .open = simple_open,
1040         .owner = THIS_MODULE,
1041         .llseek = default_llseek,
1042 };
1043
1044 int ath10k_debug_start(struct ath10k *ar)
1045 {
1046         int ret;
1047
1048         lockdep_assert_held(&ar->conf_mutex);
1049
1050         ret = ath10k_debug_htt_stats_req(ar);
1051         if (ret)
1052                 /* continue normally anyway, this isn't serious */
1053                 ath10k_warn(ar, "failed to start htt stats workqueue: %d\n",
1054                             ret);
1055
1056         if (ar->debug.fw_dbglog_mask) {
1057                 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask);
1058                 if (ret)
1059                         /* not serious */
1060                         ath10k_warn(ar, "failed to enable dbglog during start: %d",
1061                                     ret);
1062         }
1063
1064         return 0;
1065 }
1066
1067 void ath10k_debug_stop(struct ath10k *ar)
1068 {
1069         lockdep_assert_held(&ar->conf_mutex);
1070
1071         /* Must not use _sync to avoid deadlock, we do that in
1072          * ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
1073          * warning from del_timer(). */
1074         if (ar->debug.htt_stats_mask != 0)
1075                 cancel_delayed_work(&ar->debug.htt_stats_dwork);
1076
1077         ar->debug.htt_max_amsdu = 0;
1078         ar->debug.htt_max_ampdu = 0;
1079 }
1080
1081 static ssize_t ath10k_write_simulate_radar(struct file *file,
1082                                            const char __user *user_buf,
1083                                            size_t count, loff_t *ppos)
1084 {
1085         struct ath10k *ar = file->private_data;
1086
1087         ieee80211_radar_detected(ar->hw);
1088
1089         return count;
1090 }
1091
1092 static const struct file_operations fops_simulate_radar = {
1093         .write = ath10k_write_simulate_radar,
1094         .open = simple_open,
1095         .owner = THIS_MODULE,
1096         .llseek = default_llseek,
1097 };
1098
1099 #define ATH10K_DFS_STAT(s, p) (\
1100         len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1101                          ar->debug.dfs_stats.p))
1102
1103 #define ATH10K_DFS_POOL_STAT(s, p) (\
1104         len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1105                          ar->debug.dfs_pool_stats.p))
1106
1107 static ssize_t ath10k_read_dfs_stats(struct file *file, char __user *user_buf,
1108                                      size_t count, loff_t *ppos)
1109 {
1110         int retval = 0, len = 0;
1111         const int size = 8000;
1112         struct ath10k *ar = file->private_data;
1113         char *buf;
1114
1115         buf = kzalloc(size, GFP_KERNEL);
1116         if (buf == NULL)
1117                 return -ENOMEM;
1118
1119         if (!ar->dfs_detector) {
1120                 len += scnprintf(buf + len, size - len, "DFS not enabled\n");
1121                 goto exit;
1122         }
1123
1124         ar->debug.dfs_pool_stats =
1125                         ar->dfs_detector->get_stats(ar->dfs_detector);
1126
1127         len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n");
1128
1129         ATH10K_DFS_STAT("reported phy errors", phy_errors);
1130         ATH10K_DFS_STAT("pulse events reported", pulses_total);
1131         ATH10K_DFS_STAT("DFS pulses detected", pulses_detected);
1132         ATH10K_DFS_STAT("DFS pulses discarded", pulses_discarded);
1133         ATH10K_DFS_STAT("Radars detected", radar_detected);
1134
1135         len += scnprintf(buf + len, size - len, "Global Pool statistics:\n");
1136         ATH10K_DFS_POOL_STAT("Pool references", pool_reference);
1137         ATH10K_DFS_POOL_STAT("Pulses allocated", pulse_allocated);
1138         ATH10K_DFS_POOL_STAT("Pulses alloc error", pulse_alloc_error);
1139         ATH10K_DFS_POOL_STAT("Pulses in use", pulse_used);
1140         ATH10K_DFS_POOL_STAT("Seqs. allocated", pseq_allocated);
1141         ATH10K_DFS_POOL_STAT("Seqs. alloc error", pseq_alloc_error);
1142         ATH10K_DFS_POOL_STAT("Seqs. in use", pseq_used);
1143
1144 exit:
1145         if (len > size)
1146                 len = size;
1147
1148         retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
1149         kfree(buf);
1150
1151         return retval;
1152 }
1153
1154 static const struct file_operations fops_dfs_stats = {
1155         .read = ath10k_read_dfs_stats,
1156         .open = simple_open,
1157         .owner = THIS_MODULE,
1158         .llseek = default_llseek,
1159 };
1160
1161 int ath10k_debug_create(struct ath10k *ar)
1162 {
1163         ar->debug.fw_crash_data = vzalloc(sizeof(*ar->debug.fw_crash_data));
1164         if (!ar->debug.fw_crash_data)
1165                 return -ENOMEM;
1166
1167         return 0;
1168 }
1169
1170 void ath10k_debug_destroy(struct ath10k *ar)
1171 {
1172         vfree(ar->debug.fw_crash_data);
1173         ar->debug.fw_crash_data = NULL;
1174 }
1175
1176 int ath10k_debug_register(struct ath10k *ar)
1177 {
1178         ar->debug.debugfs_phy = debugfs_create_dir("ath10k",
1179                                                    ar->hw->wiphy->debugfsdir);
1180         if (IS_ERR_OR_NULL(ar->debug.debugfs_phy)) {
1181                 if (IS_ERR(ar->debug.debugfs_phy))
1182                         return PTR_ERR(ar->debug.debugfs_phy);
1183
1184                 return -ENOMEM;
1185         }
1186
1187         INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork,
1188                           ath10k_debug_htt_stats_dwork);
1189
1190         init_completion(&ar->debug.event_stats_compl);
1191
1192         debugfs_create_file("fw_stats", S_IRUSR, ar->debug.debugfs_phy, ar,
1193                             &fops_fw_stats);
1194
1195         debugfs_create_file("wmi_services", S_IRUSR, ar->debug.debugfs_phy, ar,
1196                             &fops_wmi_services);
1197
1198         debugfs_create_file("simulate_fw_crash", S_IRUSR, ar->debug.debugfs_phy,
1199                             ar, &fops_simulate_fw_crash);
1200
1201         debugfs_create_file("fw_crash_dump", S_IRUSR, ar->debug.debugfs_phy,
1202                             ar, &fops_fw_crash_dump);
1203
1204         debugfs_create_file("chip_id", S_IRUSR, ar->debug.debugfs_phy,
1205                             ar, &fops_chip_id);
1206
1207         debugfs_create_file("htt_stats_mask", S_IRUSR, ar->debug.debugfs_phy,
1208                             ar, &fops_htt_stats_mask);
1209
1210         debugfs_create_file("htt_max_amsdu_ampdu", S_IRUSR | S_IWUSR,
1211                             ar->debug.debugfs_phy, ar,
1212                             &fops_htt_max_amsdu_ampdu);
1213
1214         debugfs_create_file("fw_dbglog", S_IRUSR, ar->debug.debugfs_phy,
1215                             ar, &fops_fw_dbglog);
1216
1217         if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
1218                 debugfs_create_file("dfs_simulate_radar", S_IWUSR,
1219                                     ar->debug.debugfs_phy, ar,
1220                                     &fops_simulate_radar);
1221
1222                 debugfs_create_bool("dfs_block_radar_events", S_IWUSR,
1223                                     ar->debug.debugfs_phy,
1224                                     &ar->dfs_block_radar_events);
1225
1226                 debugfs_create_file("dfs_stats", S_IRUSR,
1227                                     ar->debug.debugfs_phy, ar,
1228                                     &fops_dfs_stats);
1229         }
1230
1231         return 0;
1232 }
1233
1234 void ath10k_debug_unregister(struct ath10k *ar)
1235 {
1236         cancel_delayed_work_sync(&ar->debug.htt_stats_dwork);
1237 }
1238
1239 #endif /* CONFIG_ATH10K_DEBUGFS */
1240
1241 #ifdef CONFIG_ATH10K_DEBUG
1242 void ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask,
1243                 const char *fmt, ...)
1244 {
1245         struct va_format vaf;
1246         va_list args;
1247
1248         va_start(args, fmt);
1249
1250         vaf.fmt = fmt;
1251         vaf.va = &args;
1252
1253         if (ath10k_debug_mask & mask)
1254                 dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf);
1255
1256         trace_ath10k_log_dbg(ar, mask, &vaf);
1257
1258         va_end(args);
1259 }
1260 EXPORT_SYMBOL(ath10k_dbg);
1261
1262 void ath10k_dbg_dump(struct ath10k *ar,
1263                      enum ath10k_debug_mask mask,
1264                      const char *msg, const char *prefix,
1265                      const void *buf, size_t len)
1266 {
1267         if (ath10k_debug_mask & mask) {
1268                 if (msg)
1269                         ath10k_dbg(ar, mask, "%s\n", msg);
1270
1271                 print_hex_dump_bytes(prefix, DUMP_PREFIX_OFFSET, buf, len);
1272         }
1273
1274         /* tracing code doesn't like null strings :/ */
1275         trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : "",
1276                                   buf, len);
1277 }
1278 EXPORT_SYMBOL(ath10k_dbg_dump);
1279
1280 #endif /* CONFIG_ATH10K_DEBUG */