2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
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.
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.
18 #include <linux/module.h>
19 #include <linux/debugfs.h>
20 #include <linux/vmalloc.h>
21 #include <linux/utsname.h>
29 #define ATH10K_DEBUG_HTT_STATS_INTERVAL 1000
31 #define ATH10K_FW_CRASH_DUMP_VERSION 1
34 * enum ath10k_fw_crash_dump_type - types of data in the dump file
35 * @ATH10K_FW_CRASH_DUMP_REGDUMP: Register crash dump in binary format
37 enum ath10k_fw_crash_dump_type
{
38 ATH10K_FW_CRASH_DUMP_REGISTERS
= 0,
40 ATH10K_FW_CRASH_DUMP_MAX
,
43 struct ath10k_tlv_dump_data
{
44 /* see ath10k_fw_crash_dump_type above */
50 /* pad to 32-bit boundaries as needed */
54 struct ath10k_dump_file_data
{
55 /* dump file information */
57 /* "ATH10K-FW-DUMP" */
62 /* file dump version */
65 /* some info we can get from ath10k struct that might help */
71 /* 0 for now, in place for later hardware */
74 __le32 target_version
;
75 __le32 fw_version_major
;
76 __le32 fw_version_minor
;
77 __le32 fw_version_release
;
78 __le32 fw_version_build
;
79 __le32 phy_capability
;
80 __le32 hw_min_tx_power
;
81 __le32 hw_max_tx_power
;
86 /* firmware version string */
87 char fw_ver
[ETHTOOL_FWVERS_LEN
];
89 /* Kernel related information */
91 /* time-of-day stamp */
94 /* time-of-day stamp, nano-seconds */
97 /* LINUX_VERSION_CODE */
98 __le32 kernel_ver_code
;
100 /* VERMAGIC_STRING */
103 /* room for growth w/out changing binary format */
106 /* struct ath10k_tlv_dump_data + more */
110 void ath10k_info(struct ath10k
*ar
, const char *fmt
, ...)
112 struct va_format vaf
= {
119 dev_info(ar
->dev
, "%pV", &vaf
);
120 trace_ath10k_log_info(ar
, &vaf
);
123 EXPORT_SYMBOL(ath10k_info
);
125 void ath10k_print_driver_info(struct ath10k
*ar
)
127 ath10k_info(ar
, "%s (0x%08x, 0x%08x) fw %s api %d htt %d.%d wmi %d cal %s max_sta %d\n",
131 ar
->hw
->wiphy
->fw_version
,
133 ar
->htt
.target_version_major
,
134 ar
->htt
.target_version_minor
,
136 ath10k_cal_mode_str(ar
->cal_mode
),
137 ar
->max_num_stations
);
138 ath10k_info(ar
, "debug %d debugfs %d tracing %d dfs %d testmode %d\n",
139 config_enabled(CONFIG_ATH10K_DEBUG
),
140 config_enabled(CONFIG_ATH10K_DEBUGFS
),
141 config_enabled(CONFIG_ATH10K_TRACING
),
142 config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
),
143 config_enabled(CONFIG_NL80211_TESTMODE
));
145 EXPORT_SYMBOL(ath10k_print_driver_info
);
147 void ath10k_err(struct ath10k
*ar
, const char *fmt
, ...)
149 struct va_format vaf
= {
156 dev_err(ar
->dev
, "%pV", &vaf
);
157 trace_ath10k_log_err(ar
, &vaf
);
160 EXPORT_SYMBOL(ath10k_err
);
162 void ath10k_warn(struct ath10k
*ar
, const char *fmt
, ...)
164 struct va_format vaf
= {
171 dev_warn_ratelimited(ar
->dev
, "%pV", &vaf
);
172 trace_ath10k_log_warn(ar
, &vaf
);
176 EXPORT_SYMBOL(ath10k_warn
);
178 #ifdef CONFIG_ATH10K_DEBUGFS
180 static ssize_t
ath10k_read_wmi_services(struct file
*file
,
181 char __user
*user_buf
,
182 size_t count
, loff_t
*ppos
)
184 struct ath10k
*ar
= file
->private_data
;
186 unsigned int len
= 0, buf_len
= 4096;
192 buf
= kzalloc(buf_len
, GFP_KERNEL
);
196 mutex_lock(&ar
->conf_mutex
);
201 spin_lock_bh(&ar
->data_lock
);
202 for (i
= 0; i
< WMI_SERVICE_MAX
; i
++) {
203 enabled
= test_bit(i
, ar
->wmi
.svc_map
);
204 name
= wmi_service_name(i
);
208 len
+= scnprintf(buf
+ len
, buf_len
- len
,
209 "%-40s %s (bit %d)\n",
210 "unknown", "enabled", i
);
215 len
+= scnprintf(buf
+ len
, buf_len
- len
,
217 name
, enabled
? "enabled" : "-");
219 spin_unlock_bh(&ar
->data_lock
);
221 ret_cnt
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
223 mutex_unlock(&ar
->conf_mutex
);
229 static const struct file_operations fops_wmi_services
= {
230 .read
= ath10k_read_wmi_services
,
232 .owner
= THIS_MODULE
,
233 .llseek
= default_llseek
,
236 static void ath10k_debug_fw_stats_pdevs_free(struct list_head
*head
)
238 struct ath10k_fw_stats_pdev
*i
, *tmp
;
240 list_for_each_entry_safe(i
, tmp
, head
, list
) {
246 static void ath10k_debug_fw_stats_vdevs_free(struct list_head
*head
)
248 struct ath10k_fw_stats_vdev
*i
, *tmp
;
250 list_for_each_entry_safe(i
, tmp
, head
, list
) {
256 static void ath10k_debug_fw_stats_peers_free(struct list_head
*head
)
258 struct ath10k_fw_stats_peer
*i
, *tmp
;
260 list_for_each_entry_safe(i
, tmp
, head
, list
) {
266 static void ath10k_debug_fw_stats_reset(struct ath10k
*ar
)
268 spin_lock_bh(&ar
->data_lock
);
269 ar
->debug
.fw_stats_done
= false;
270 ath10k_debug_fw_stats_pdevs_free(&ar
->debug
.fw_stats
.pdevs
);
271 ath10k_debug_fw_stats_vdevs_free(&ar
->debug
.fw_stats
.vdevs
);
272 ath10k_debug_fw_stats_peers_free(&ar
->debug
.fw_stats
.peers
);
273 spin_unlock_bh(&ar
->data_lock
);
276 static size_t ath10k_debug_fw_stats_num_peers(struct list_head
*head
)
278 struct ath10k_fw_stats_peer
*i
;
281 list_for_each_entry(i
, head
, list
)
287 static size_t ath10k_debug_fw_stats_num_vdevs(struct list_head
*head
)
289 struct ath10k_fw_stats_vdev
*i
;
292 list_for_each_entry(i
, head
, list
)
298 void ath10k_debug_fw_stats_process(struct ath10k
*ar
, struct sk_buff
*skb
)
300 struct ath10k_fw_stats stats
= {};
301 bool is_start
, is_started
, is_end
;
306 INIT_LIST_HEAD(&stats
.pdevs
);
307 INIT_LIST_HEAD(&stats
.vdevs
);
308 INIT_LIST_HEAD(&stats
.peers
);
310 spin_lock_bh(&ar
->data_lock
);
311 ret
= ath10k_wmi_pull_fw_stats(ar
, skb
, &stats
);
313 ath10k_warn(ar
, "failed to pull fw stats: %d\n", ret
);
317 /* Stat data may exceed htc-wmi buffer limit. In such case firmware
318 * splits the stats data and delivers it in a ping-pong fashion of
319 * request cmd-update event.
321 * However there is no explicit end-of-data. Instead start-of-data is
322 * used as an implicit one. This works as follows:
323 * a) discard stat update events until one with pdev stats is
324 * delivered - this skips session started at end of (b)
325 * b) consume stat update events until another one with pdev stats is
326 * delivered which is treated as end-of-data and is itself discarded
329 if (ar
->debug
.fw_stats_done
) {
330 ath10k_warn(ar
, "received unsolicited stats update event\n");
334 num_peers
= ath10k_debug_fw_stats_num_peers(&ar
->debug
.fw_stats
.peers
);
335 num_vdevs
= ath10k_debug_fw_stats_num_vdevs(&ar
->debug
.fw_stats
.vdevs
);
336 is_start
= (list_empty(&ar
->debug
.fw_stats
.pdevs
) &&
337 !list_empty(&stats
.pdevs
));
338 is_end
= (!list_empty(&ar
->debug
.fw_stats
.pdevs
) &&
339 !list_empty(&stats
.pdevs
));
342 list_splice_tail_init(&stats
.pdevs
, &ar
->debug
.fw_stats
.pdevs
);
345 ar
->debug
.fw_stats_done
= true;
347 is_started
= !list_empty(&ar
->debug
.fw_stats
.pdevs
);
349 if (is_started
&& !is_end
) {
350 if (num_peers
>= ATH10K_MAX_NUM_PEER_IDS
) {
351 /* Although this is unlikely impose a sane limit to
352 * prevent firmware from DoS-ing the host.
354 ath10k_warn(ar
, "dropping fw peer stats\n");
358 if (num_vdevs
>= BITS_PER_LONG
) {
359 ath10k_warn(ar
, "dropping fw vdev stats\n");
363 list_splice_tail_init(&stats
.peers
, &ar
->debug
.fw_stats
.peers
);
364 list_splice_tail_init(&stats
.vdevs
, &ar
->debug
.fw_stats
.vdevs
);
367 complete(&ar
->debug
.fw_stats_complete
);
370 /* In some cases lists have been spliced and cleared. Free up
371 * resources if that is not the case.
373 ath10k_debug_fw_stats_pdevs_free(&stats
.pdevs
);
374 ath10k_debug_fw_stats_vdevs_free(&stats
.vdevs
);
375 ath10k_debug_fw_stats_peers_free(&stats
.peers
);
378 spin_unlock_bh(&ar
->data_lock
);
381 static int ath10k_debug_fw_stats_request(struct ath10k
*ar
)
383 unsigned long timeout
;
386 lockdep_assert_held(&ar
->conf_mutex
);
388 timeout
= jiffies
+ msecs_to_jiffies(1*HZ
);
390 ath10k_debug_fw_stats_reset(ar
);
393 if (time_after(jiffies
, timeout
))
396 reinit_completion(&ar
->debug
.fw_stats_complete
);
398 ret
= ath10k_wmi_request_stats(ar
, WMI_STAT_PEER
);
400 ath10k_warn(ar
, "could not request stats (%d)\n", ret
);
404 ret
= wait_for_completion_timeout(&ar
->debug
.fw_stats_complete
,
409 spin_lock_bh(&ar
->data_lock
);
410 if (ar
->debug
.fw_stats_done
) {
411 spin_unlock_bh(&ar
->data_lock
);
414 spin_unlock_bh(&ar
->data_lock
);
420 /* FIXME: How to calculate the buffer size sanely? */
421 #define ATH10K_FW_STATS_BUF_SIZE (1024*1024)
423 static void ath10k_fw_stats_fill(struct ath10k
*ar
,
424 struct ath10k_fw_stats
*fw_stats
,
427 unsigned int len
= 0;
428 unsigned int buf_len
= ATH10K_FW_STATS_BUF_SIZE
;
429 const struct ath10k_fw_stats_pdev
*pdev
;
430 const struct ath10k_fw_stats_vdev
*vdev
;
431 const struct ath10k_fw_stats_peer
*peer
;
436 spin_lock_bh(&ar
->data_lock
);
438 pdev
= list_first_entry_or_null(&fw_stats
->pdevs
,
439 struct ath10k_fw_stats_pdev
, list
);
441 ath10k_warn(ar
, "failed to get pdev stats\n");
445 num_peers
= ath10k_debug_fw_stats_num_peers(&fw_stats
->peers
);
446 num_vdevs
= ath10k_debug_fw_stats_num_vdevs(&fw_stats
->vdevs
);
448 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
449 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n",
450 "ath10k PDEV stats");
451 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
452 "=================");
454 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
455 "Channel noise floor", pdev
->ch_noise_floor
);
456 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
457 "Channel TX power", pdev
->chan_tx_power
);
458 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
459 "TX frame count", pdev
->tx_frame_count
);
460 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
461 "RX frame count", pdev
->rx_frame_count
);
462 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
463 "RX clear count", pdev
->rx_clear_count
);
464 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
465 "Cycle count", pdev
->cycle_count
);
466 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
467 "PHY error count", pdev
->phy_err_count
);
468 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
469 "RTS bad count", pdev
->rts_bad
);
470 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
471 "RTS good count", pdev
->rts_good
);
472 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
473 "FCS bad count", pdev
->fcs_bad
);
474 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
475 "No beacon count", pdev
->no_beacons
);
476 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
477 "MIB int count", pdev
->mib_int_count
);
479 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
480 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n",
481 "ath10k PDEV TX stats");
482 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
483 "=================");
485 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
486 "HTT cookies queued", pdev
->comp_queued
);
487 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
488 "HTT cookies disp.", pdev
->comp_delivered
);
489 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
490 "MSDU queued", pdev
->msdu_enqued
);
491 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
492 "MPDU queued", pdev
->mpdu_enqued
);
493 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
494 "MSDUs dropped", pdev
->wmm_drop
);
495 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
496 "Local enqued", pdev
->local_enqued
);
497 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
498 "Local freed", pdev
->local_freed
);
499 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
500 "HW queued", pdev
->hw_queued
);
501 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
502 "PPDUs reaped", pdev
->hw_reaped
);
503 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
504 "Num underruns", pdev
->underrun
);
505 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
506 "PPDUs cleaned", pdev
->tx_abort
);
507 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
508 "MPDUs requed", pdev
->mpdus_requed
);
509 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
510 "Excessive retries", pdev
->tx_ko
);
511 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
512 "HW rate", pdev
->data_rc
);
513 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
514 "Sched self tiggers", pdev
->self_triggers
);
515 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
516 "Dropped due to SW retries",
517 pdev
->sw_retry_failure
);
518 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
519 "Illegal rate phy errors",
520 pdev
->illgl_rate_phy_err
);
521 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
522 "Pdev continous xretry", pdev
->pdev_cont_xretry
);
523 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
524 "TX timeout", pdev
->pdev_tx_timeout
);
525 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
526 "PDEV resets", pdev
->pdev_resets
);
527 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
528 "PHY underrun", pdev
->phy_underrun
);
529 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
530 "MPDU is more than txop limit", pdev
->txop_ovf
);
532 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
533 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n",
534 "ath10k PDEV RX stats");
535 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
536 "=================");
538 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
539 "Mid PPDU route change",
540 pdev
->mid_ppdu_route_change
);
541 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
542 "Tot. number of statuses", pdev
->status_rcvd
);
543 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
544 "Extra frags on rings 0", pdev
->r0_frags
);
545 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
546 "Extra frags on rings 1", pdev
->r1_frags
);
547 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
548 "Extra frags on rings 2", pdev
->r2_frags
);
549 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
550 "Extra frags on rings 3", pdev
->r3_frags
);
551 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
552 "MSDUs delivered to HTT", pdev
->htt_msdus
);
553 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
554 "MPDUs delivered to HTT", pdev
->htt_mpdus
);
555 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
556 "MSDUs delivered to stack", pdev
->loc_msdus
);
557 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
558 "MPDUs delivered to stack", pdev
->loc_mpdus
);
559 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
560 "Oversized AMSUs", pdev
->oversize_amsdu
);
561 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
562 "PHY errors", pdev
->phy_errs
);
563 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
564 "PHY errors drops", pdev
->phy_err_drop
);
565 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
566 "MPDU errors (FCS, MIC, ENC)", pdev
->mpdu_errs
);
568 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
569 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s (%zu)\n",
570 "ath10k VDEV stats", num_vdevs
);
571 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
572 "=================");
574 list_for_each_entry(vdev
, &fw_stats
->vdevs
, list
) {
575 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
576 "vdev id", vdev
->vdev_id
);
577 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
578 "beacon snr", vdev
->beacon_snr
);
579 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
580 "data snr", vdev
->data_snr
);
581 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
582 "num rx frames", vdev
->num_rx_frames
);
583 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
584 "num rts fail", vdev
->num_rts_fail
);
585 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
586 "num rts success", vdev
->num_rts_success
);
587 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
588 "num rx err", vdev
->num_rx_err
);
589 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
590 "num rx discard", vdev
->num_rx_discard
);
591 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
592 "num tx not acked", vdev
->num_tx_not_acked
);
594 for (i
= 0 ; i
< ARRAY_SIZE(vdev
->num_tx_frames
); i
++)
595 len
+= scnprintf(buf
+ len
, buf_len
- len
,
598 vdev
->num_tx_frames
[i
]);
600 for (i
= 0 ; i
< ARRAY_SIZE(vdev
->num_tx_frames_retries
); i
++)
601 len
+= scnprintf(buf
+ len
, buf_len
- len
,
603 "num tx frames retries", i
,
604 vdev
->num_tx_frames_retries
[i
]);
606 for (i
= 0 ; i
< ARRAY_SIZE(vdev
->num_tx_frames_failures
); i
++)
607 len
+= scnprintf(buf
+ len
, buf_len
- len
,
609 "num tx frames failures", i
,
610 vdev
->num_tx_frames_failures
[i
]);
612 for (i
= 0 ; i
< ARRAY_SIZE(vdev
->tx_rate_history
); i
++)
613 len
+= scnprintf(buf
+ len
, buf_len
- len
,
614 "%25s [%02d] 0x%08x\n",
615 "tx rate history", i
,
616 vdev
->tx_rate_history
[i
]);
618 for (i
= 0 ; i
< ARRAY_SIZE(vdev
->beacon_rssi_history
); i
++)
619 len
+= scnprintf(buf
+ len
, buf_len
- len
,
621 "beacon rssi history", i
,
622 vdev
->beacon_rssi_history
[i
]);
624 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
627 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
628 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s (%zu)\n",
629 "ath10k PEER stats", num_peers
);
630 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
631 "=================");
633 list_for_each_entry(peer
, &fw_stats
->peers
, list
) {
634 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %pM\n",
635 "Peer MAC address", peer
->peer_macaddr
);
636 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
637 "Peer RSSI", peer
->peer_rssi
);
638 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
639 "Peer TX rate", peer
->peer_tx_rate
);
640 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
641 "Peer RX rate", peer
->peer_rx_rate
);
642 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
646 spin_unlock_bh(&ar
->data_lock
);
654 static int ath10k_fw_stats_open(struct inode
*inode
, struct file
*file
)
656 struct ath10k
*ar
= inode
->i_private
;
660 mutex_lock(&ar
->conf_mutex
);
662 if (ar
->state
!= ATH10K_STATE_ON
) {
667 buf
= vmalloc(ATH10K_FW_STATS_BUF_SIZE
);
673 ret
= ath10k_debug_fw_stats_request(ar
);
675 ath10k_warn(ar
, "failed to request fw stats: %d\n", ret
);
679 ath10k_fw_stats_fill(ar
, &ar
->debug
.fw_stats
, buf
);
680 file
->private_data
= buf
;
682 mutex_unlock(&ar
->conf_mutex
);
689 mutex_unlock(&ar
->conf_mutex
);
693 static int ath10k_fw_stats_release(struct inode
*inode
, struct file
*file
)
695 vfree(file
->private_data
);
700 static ssize_t
ath10k_fw_stats_read(struct file
*file
, char __user
*user_buf
,
701 size_t count
, loff_t
*ppos
)
703 const char *buf
= file
->private_data
;
704 unsigned int len
= strlen(buf
);
706 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
709 static const struct file_operations fops_fw_stats
= {
710 .open
= ath10k_fw_stats_open
,
711 .release
= ath10k_fw_stats_release
,
712 .read
= ath10k_fw_stats_read
,
713 .owner
= THIS_MODULE
,
714 .llseek
= default_llseek
,
717 static ssize_t
ath10k_debug_fw_reset_stats_read(struct file
*file
,
718 char __user
*user_buf
,
719 size_t count
, loff_t
*ppos
)
721 struct ath10k
*ar
= file
->private_data
;
722 int ret
, len
, buf_len
;
726 buf
= kmalloc(buf_len
, GFP_KERNEL
);
730 spin_lock_bh(&ar
->data_lock
);
733 len
+= scnprintf(buf
+ len
, buf_len
- len
,
734 "fw_crash_counter\t\t%d\n", ar
->stats
.fw_crash_counter
);
735 len
+= scnprintf(buf
+ len
, buf_len
- len
,
736 "fw_warm_reset_counter\t\t%d\n",
737 ar
->stats
.fw_warm_reset_counter
);
738 len
+= scnprintf(buf
+ len
, buf_len
- len
,
739 "fw_cold_reset_counter\t\t%d\n",
740 ar
->stats
.fw_cold_reset_counter
);
742 spin_unlock_bh(&ar
->data_lock
);
744 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
751 static const struct file_operations fops_fw_reset_stats
= {
753 .read
= ath10k_debug_fw_reset_stats_read
,
754 .owner
= THIS_MODULE
,
755 .llseek
= default_llseek
,
758 /* This is a clean assert crash in firmware. */
759 static int ath10k_debug_fw_assert(struct ath10k
*ar
)
761 struct wmi_vdev_install_key_cmd
*cmd
;
764 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*cmd
) + 16);
768 cmd
= (struct wmi_vdev_install_key_cmd
*)skb
->data
;
769 memset(cmd
, 0, sizeof(*cmd
));
771 /* big enough number so that firmware asserts */
772 cmd
->vdev_id
= __cpu_to_le32(0x7ffe);
774 return ath10k_wmi_cmd_send(ar
, skb
,
775 ar
->wmi
.cmd
->vdev_install_key_cmdid
);
778 static ssize_t
ath10k_read_simulate_fw_crash(struct file
*file
,
779 char __user
*user_buf
,
780 size_t count
, loff_t
*ppos
)
783 "To simulate firmware crash write one of the keywords to this file:\n"
784 "`soft` - this will send WMI_FORCE_FW_HANG_ASSERT to firmware if FW supports that command.\n"
785 "`hard` - this will send to firmware command with illegal parameters causing firmware crash.\n"
786 "`assert` - this will send special illegal parameter to firmware to cause assert failure and crash.\n"
787 "`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n";
789 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, strlen(buf
));
792 /* Simulate firmware crash:
793 * 'soft': Call wmi command causing firmware hang. This firmware hang is
794 * recoverable by warm firmware reset.
795 * 'hard': Force firmware crash by setting any vdev parameter for not allowed
796 * vdev id. This is hard firmware crash because it is recoverable only by cold
799 static ssize_t
ath10k_write_simulate_fw_crash(struct file
*file
,
800 const char __user
*user_buf
,
801 size_t count
, loff_t
*ppos
)
803 struct ath10k
*ar
= file
->private_data
;
807 mutex_lock(&ar
->conf_mutex
);
809 simple_write_to_buffer(buf
, sizeof(buf
) - 1, ppos
, user_buf
, count
);
811 /* make sure that buf is null terminated */
812 buf
[sizeof(buf
) - 1] = 0;
814 if (ar
->state
!= ATH10K_STATE_ON
&&
815 ar
->state
!= ATH10K_STATE_RESTARTED
) {
820 /* drop the possible '\n' from the end */
821 if (buf
[count
- 1] == '\n') {
826 if (!strcmp(buf
, "soft")) {
827 ath10k_info(ar
, "simulating soft firmware crash\n");
828 ret
= ath10k_wmi_force_fw_hang(ar
, WMI_FORCE_FW_HANG_ASSERT
, 0);
829 } else if (!strcmp(buf
, "hard")) {
830 ath10k_info(ar
, "simulating hard firmware crash\n");
831 /* 0x7fff is vdev id, and it is always out of range for all
832 * firmware variants in order to force a firmware crash.
834 ret
= ath10k_wmi_vdev_set_param(ar
, 0x7fff,
835 ar
->wmi
.vdev_param
->rts_threshold
,
837 } else if (!strcmp(buf
, "assert")) {
838 ath10k_info(ar
, "simulating firmware assert crash\n");
839 ret
= ath10k_debug_fw_assert(ar
);
840 } else if (!strcmp(buf
, "hw-restart")) {
841 ath10k_info(ar
, "user requested hw restart\n");
842 queue_work(ar
->workqueue
, &ar
->restart_work
);
850 ath10k_warn(ar
, "failed to simulate firmware crash: %d\n", ret
);
857 mutex_unlock(&ar
->conf_mutex
);
861 static const struct file_operations fops_simulate_fw_crash
= {
862 .read
= ath10k_read_simulate_fw_crash
,
863 .write
= ath10k_write_simulate_fw_crash
,
865 .owner
= THIS_MODULE
,
866 .llseek
= default_llseek
,
869 static ssize_t
ath10k_read_chip_id(struct file
*file
, char __user
*user_buf
,
870 size_t count
, loff_t
*ppos
)
872 struct ath10k
*ar
= file
->private_data
;
876 len
= scnprintf(buf
, sizeof(buf
), "0x%08x\n", ar
->chip_id
);
878 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
881 static const struct file_operations fops_chip_id
= {
882 .read
= ath10k_read_chip_id
,
884 .owner
= THIS_MODULE
,
885 .llseek
= default_llseek
,
888 struct ath10k_fw_crash_data
*
889 ath10k_debug_get_new_fw_crash_data(struct ath10k
*ar
)
891 struct ath10k_fw_crash_data
*crash_data
= ar
->debug
.fw_crash_data
;
893 lockdep_assert_held(&ar
->data_lock
);
895 crash_data
->crashed_since_read
= true;
896 uuid_le_gen(&crash_data
->uuid
);
897 getnstimeofday(&crash_data
->timestamp
);
901 EXPORT_SYMBOL(ath10k_debug_get_new_fw_crash_data
);
903 static struct ath10k_dump_file_data
*ath10k_build_dump_file(struct ath10k
*ar
)
905 struct ath10k_fw_crash_data
*crash_data
= ar
->debug
.fw_crash_data
;
906 struct ath10k_dump_file_data
*dump_data
;
907 struct ath10k_tlv_dump_data
*dump_tlv
;
908 int hdr_len
= sizeof(*dump_data
);
909 unsigned int len
, sofar
= 0;
913 len
+= sizeof(*dump_tlv
) + sizeof(crash_data
->registers
);
917 /* This is going to get big when we start dumping FW RAM and such,
918 * so go ahead and use vmalloc.
924 spin_lock_bh(&ar
->data_lock
);
926 if (!crash_data
->crashed_since_read
) {
927 spin_unlock_bh(&ar
->data_lock
);
932 dump_data
= (struct ath10k_dump_file_data
*)(buf
);
933 strlcpy(dump_data
->df_magic
, "ATH10K-FW-DUMP",
934 sizeof(dump_data
->df_magic
));
935 dump_data
->len
= cpu_to_le32(len
);
937 dump_data
->version
= cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION
);
939 memcpy(dump_data
->uuid
, &crash_data
->uuid
, sizeof(dump_data
->uuid
));
940 dump_data
->chip_id
= cpu_to_le32(ar
->chip_id
);
941 dump_data
->bus_type
= cpu_to_le32(0);
942 dump_data
->target_version
= cpu_to_le32(ar
->target_version
);
943 dump_data
->fw_version_major
= cpu_to_le32(ar
->fw_version_major
);
944 dump_data
->fw_version_minor
= cpu_to_le32(ar
->fw_version_minor
);
945 dump_data
->fw_version_release
= cpu_to_le32(ar
->fw_version_release
);
946 dump_data
->fw_version_build
= cpu_to_le32(ar
->fw_version_build
);
947 dump_data
->phy_capability
= cpu_to_le32(ar
->phy_capability
);
948 dump_data
->hw_min_tx_power
= cpu_to_le32(ar
->hw_min_tx_power
);
949 dump_data
->hw_max_tx_power
= cpu_to_le32(ar
->hw_max_tx_power
);
950 dump_data
->ht_cap_info
= cpu_to_le32(ar
->ht_cap_info
);
951 dump_data
->vht_cap_info
= cpu_to_le32(ar
->vht_cap_info
);
952 dump_data
->num_rf_chains
= cpu_to_le32(ar
->num_rf_chains
);
954 strlcpy(dump_data
->fw_ver
, ar
->hw
->wiphy
->fw_version
,
955 sizeof(dump_data
->fw_ver
));
957 dump_data
->kernel_ver_code
= 0;
958 strlcpy(dump_data
->kernel_ver
, init_utsname()->release
,
959 sizeof(dump_data
->kernel_ver
));
961 dump_data
->tv_sec
= cpu_to_le64(crash_data
->timestamp
.tv_sec
);
962 dump_data
->tv_nsec
= cpu_to_le64(crash_data
->timestamp
.tv_nsec
);
964 /* Gather crash-dump */
965 dump_tlv
= (struct ath10k_tlv_dump_data
*)(buf
+ sofar
);
966 dump_tlv
->type
= cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS
);
967 dump_tlv
->tlv_len
= cpu_to_le32(sizeof(crash_data
->registers
));
968 memcpy(dump_tlv
->tlv_data
, &crash_data
->registers
,
969 sizeof(crash_data
->registers
));
970 sofar
+= sizeof(*dump_tlv
) + sizeof(crash_data
->registers
);
972 ar
->debug
.fw_crash_data
->crashed_since_read
= false;
974 spin_unlock_bh(&ar
->data_lock
);
979 static int ath10k_fw_crash_dump_open(struct inode
*inode
, struct file
*file
)
981 struct ath10k
*ar
= inode
->i_private
;
982 struct ath10k_dump_file_data
*dump
;
984 dump
= ath10k_build_dump_file(ar
);
988 file
->private_data
= dump
;
993 static ssize_t
ath10k_fw_crash_dump_read(struct file
*file
,
994 char __user
*user_buf
,
995 size_t count
, loff_t
*ppos
)
997 struct ath10k_dump_file_data
*dump_file
= file
->private_data
;
999 return simple_read_from_buffer(user_buf
, count
, ppos
,
1001 le32_to_cpu(dump_file
->len
));
1004 static int ath10k_fw_crash_dump_release(struct inode
*inode
,
1007 vfree(file
->private_data
);
1012 static const struct file_operations fops_fw_crash_dump
= {
1013 .open
= ath10k_fw_crash_dump_open
,
1014 .read
= ath10k_fw_crash_dump_read
,
1015 .release
= ath10k_fw_crash_dump_release
,
1016 .owner
= THIS_MODULE
,
1017 .llseek
= default_llseek
,
1020 static ssize_t
ath10k_reg_addr_read(struct file
*file
,
1021 char __user
*user_buf
,
1022 size_t count
, loff_t
*ppos
)
1024 struct ath10k
*ar
= file
->private_data
;
1026 unsigned int len
= 0;
1029 mutex_lock(&ar
->conf_mutex
);
1030 reg_addr
= ar
->debug
.reg_addr
;
1031 mutex_unlock(&ar
->conf_mutex
);
1033 len
+= scnprintf(buf
+ len
, sizeof(buf
) - len
, "0x%x\n", reg_addr
);
1035 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1038 static ssize_t
ath10k_reg_addr_write(struct file
*file
,
1039 const char __user
*user_buf
,
1040 size_t count
, loff_t
*ppos
)
1042 struct ath10k
*ar
= file
->private_data
;
1046 ret
= kstrtou32_from_user(user_buf
, count
, 0, ®_addr
);
1050 if (!IS_ALIGNED(reg_addr
, 4))
1053 mutex_lock(&ar
->conf_mutex
);
1054 ar
->debug
.reg_addr
= reg_addr
;
1055 mutex_unlock(&ar
->conf_mutex
);
1060 static const struct file_operations fops_reg_addr
= {
1061 .read
= ath10k_reg_addr_read
,
1062 .write
= ath10k_reg_addr_write
,
1063 .open
= simple_open
,
1064 .owner
= THIS_MODULE
,
1065 .llseek
= default_llseek
,
1068 static ssize_t
ath10k_reg_value_read(struct file
*file
,
1069 char __user
*user_buf
,
1070 size_t count
, loff_t
*ppos
)
1072 struct ath10k
*ar
= file
->private_data
;
1075 u32 reg_addr
, reg_val
;
1078 mutex_lock(&ar
->conf_mutex
);
1080 if (ar
->state
!= ATH10K_STATE_ON
&&
1081 ar
->state
!= ATH10K_STATE_UTF
) {
1086 reg_addr
= ar
->debug
.reg_addr
;
1088 reg_val
= ath10k_hif_read32(ar
, reg_addr
);
1089 len
= scnprintf(buf
, sizeof(buf
), "0x%08x:0x%08x\n", reg_addr
, reg_val
);
1091 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1094 mutex_unlock(&ar
->conf_mutex
);
1099 static ssize_t
ath10k_reg_value_write(struct file
*file
,
1100 const char __user
*user_buf
,
1101 size_t count
, loff_t
*ppos
)
1103 struct ath10k
*ar
= file
->private_data
;
1104 u32 reg_addr
, reg_val
;
1107 mutex_lock(&ar
->conf_mutex
);
1109 if (ar
->state
!= ATH10K_STATE_ON
&&
1110 ar
->state
!= ATH10K_STATE_UTF
) {
1115 reg_addr
= ar
->debug
.reg_addr
;
1117 ret
= kstrtou32_from_user(user_buf
, count
, 0, ®_val
);
1121 ath10k_hif_write32(ar
, reg_addr
, reg_val
);
1126 mutex_unlock(&ar
->conf_mutex
);
1131 static const struct file_operations fops_reg_value
= {
1132 .read
= ath10k_reg_value_read
,
1133 .write
= ath10k_reg_value_write
,
1134 .open
= simple_open
,
1135 .owner
= THIS_MODULE
,
1136 .llseek
= default_llseek
,
1139 static ssize_t
ath10k_mem_value_read(struct file
*file
,
1140 char __user
*user_buf
,
1141 size_t count
, loff_t
*ppos
)
1143 struct ath10k
*ar
= file
->private_data
;
1153 mutex_lock(&ar
->conf_mutex
);
1155 buf
= vmalloc(count
);
1161 if (ar
->state
!= ATH10K_STATE_ON
&&
1162 ar
->state
!= ATH10K_STATE_UTF
) {
1167 ret
= ath10k_hif_diag_read(ar
, *ppos
, buf
, count
);
1169 ath10k_warn(ar
, "failed to read address 0x%08x via diagnose window fnrom debugfs: %d\n",
1174 ret
= copy_to_user(user_buf
, buf
, count
);
1186 mutex_unlock(&ar
->conf_mutex
);
1191 static ssize_t
ath10k_mem_value_write(struct file
*file
,
1192 const char __user
*user_buf
,
1193 size_t count
, loff_t
*ppos
)
1195 struct ath10k
*ar
= file
->private_data
;
1205 mutex_lock(&ar
->conf_mutex
);
1207 buf
= vmalloc(count
);
1213 if (ar
->state
!= ATH10K_STATE_ON
&&
1214 ar
->state
!= ATH10K_STATE_UTF
) {
1219 ret
= copy_from_user(buf
, user_buf
, count
);
1225 ret
= ath10k_hif_diag_write(ar
, *ppos
, buf
, count
);
1227 ath10k_warn(ar
, "failed to write address 0x%08x via diagnose window from debugfs: %d\n",
1237 mutex_unlock(&ar
->conf_mutex
);
1242 static const struct file_operations fops_mem_value
= {
1243 .read
= ath10k_mem_value_read
,
1244 .write
= ath10k_mem_value_write
,
1245 .open
= simple_open
,
1246 .owner
= THIS_MODULE
,
1247 .llseek
= default_llseek
,
1250 static int ath10k_debug_htt_stats_req(struct ath10k
*ar
)
1255 lockdep_assert_held(&ar
->conf_mutex
);
1257 if (ar
->debug
.htt_stats_mask
== 0)
1258 /* htt stats are disabled */
1261 if (ar
->state
!= ATH10K_STATE_ON
)
1264 cookie
= get_jiffies_64();
1266 ret
= ath10k_htt_h2t_stats_req(&ar
->htt
, ar
->debug
.htt_stats_mask
,
1269 ath10k_warn(ar
, "failed to send htt stats request: %d\n", ret
);
1273 queue_delayed_work(ar
->workqueue
, &ar
->debug
.htt_stats_dwork
,
1274 msecs_to_jiffies(ATH10K_DEBUG_HTT_STATS_INTERVAL
));
1279 static void ath10k_debug_htt_stats_dwork(struct work_struct
*work
)
1281 struct ath10k
*ar
= container_of(work
, struct ath10k
,
1282 debug
.htt_stats_dwork
.work
);
1284 mutex_lock(&ar
->conf_mutex
);
1286 ath10k_debug_htt_stats_req(ar
);
1288 mutex_unlock(&ar
->conf_mutex
);
1291 static ssize_t
ath10k_read_htt_stats_mask(struct file
*file
,
1292 char __user
*user_buf
,
1293 size_t count
, loff_t
*ppos
)
1295 struct ath10k
*ar
= file
->private_data
;
1299 len
= scnprintf(buf
, sizeof(buf
), "%lu\n", ar
->debug
.htt_stats_mask
);
1301 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1304 static ssize_t
ath10k_write_htt_stats_mask(struct file
*file
,
1305 const char __user
*user_buf
,
1306 size_t count
, loff_t
*ppos
)
1308 struct ath10k
*ar
= file
->private_data
;
1312 ret
= kstrtoul_from_user(user_buf
, count
, 0, &mask
);
1316 /* max 8 bit masks (for now) */
1320 mutex_lock(&ar
->conf_mutex
);
1322 ar
->debug
.htt_stats_mask
= mask
;
1324 ret
= ath10k_debug_htt_stats_req(ar
);
1331 mutex_unlock(&ar
->conf_mutex
);
1336 static const struct file_operations fops_htt_stats_mask
= {
1337 .read
= ath10k_read_htt_stats_mask
,
1338 .write
= ath10k_write_htt_stats_mask
,
1339 .open
= simple_open
,
1340 .owner
= THIS_MODULE
,
1341 .llseek
= default_llseek
,
1344 static ssize_t
ath10k_read_htt_max_amsdu_ampdu(struct file
*file
,
1345 char __user
*user_buf
,
1346 size_t count
, loff_t
*ppos
)
1348 struct ath10k
*ar
= file
->private_data
;
1350 u8 amsdu
= 3, ampdu
= 64;
1353 mutex_lock(&ar
->conf_mutex
);
1355 if (ar
->debug
.htt_max_amsdu
)
1356 amsdu
= ar
->debug
.htt_max_amsdu
;
1358 if (ar
->debug
.htt_max_ampdu
)
1359 ampdu
= ar
->debug
.htt_max_ampdu
;
1361 mutex_unlock(&ar
->conf_mutex
);
1363 len
= scnprintf(buf
, sizeof(buf
), "%u %u\n", amsdu
, ampdu
);
1365 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1368 static ssize_t
ath10k_write_htt_max_amsdu_ampdu(struct file
*file
,
1369 const char __user
*user_buf
,
1370 size_t count
, loff_t
*ppos
)
1372 struct ath10k
*ar
= file
->private_data
;
1375 unsigned int amsdu
, ampdu
;
1377 simple_write_to_buffer(buf
, sizeof(buf
) - 1, ppos
, user_buf
, count
);
1379 /* make sure that buf is null terminated */
1380 buf
[sizeof(buf
) - 1] = 0;
1382 res
= sscanf(buf
, "%u %u", &amsdu
, &du
);
1387 mutex_lock(&ar
->conf_mutex
);
1389 res
= ath10k_htt_h2t_aggr_cfg_msg(&ar
->htt
, ampdu
, amsdu
);
1394 ar
->debug
.htt_max_amsdu
= amsdu
;
1395 ar
->debug
.htt_max_ampdu
= ampdu
;
1398 mutex_unlock(&ar
->conf_mutex
);
1402 static const struct file_operations fops_htt_max_amsdu_ampdu
= {
1403 .read
= ath10k_read_htt_max_amsdu_ampdu
,
1404 .write
= ath10k_write_htt_max_amsdu_ampdu
,
1405 .open
= simple_open
,
1406 .owner
= THIS_MODULE
,
1407 .llseek
= default_llseek
,
1410 static ssize_t
ath10k_read_fw_dbglog(struct file
*file
,
1411 char __user
*user_buf
,
1412 size_t count
, loff_t
*ppos
)
1414 struct ath10k
*ar
= file
->private_data
;
1418 len
= scnprintf(buf
, sizeof(buf
), "0x%08x %u\n",
1419 ar
->debug
.fw_dbglog_mask
, ar
->debug
.fw_dbglog_level
);
1421 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1424 static ssize_t
ath10k_write_fw_dbglog(struct file
*file
,
1425 const char __user
*user_buf
,
1426 size_t count
, loff_t
*ppos
)
1428 struct ath10k
*ar
= file
->private_data
;
1431 unsigned int log_level
, mask
;
1433 simple_write_to_buffer(buf
, sizeof(buf
) - 1, ppos
, user_buf
, count
);
1435 /* make sure that buf is null terminated */
1436 buf
[sizeof(buf
) - 1] = 0;
1438 ret
= sscanf(buf
, "%x %u", &mask
, &log_level
);
1444 /* default if user did not specify */
1445 log_level
= ATH10K_DBGLOG_LEVEL_WARN
;
1447 mutex_lock(&ar
->conf_mutex
);
1449 ar
->debug
.fw_dbglog_mask
= mask
;
1450 ar
->debug
.fw_dbglog_level
= log_level
;
1452 if (ar
->state
== ATH10K_STATE_ON
) {
1453 ret
= ath10k_wmi_dbglog_cfg(ar
, ar
->debug
.fw_dbglog_mask
,
1454 ar
->debug
.fw_dbglog_level
);
1456 ath10k_warn(ar
, "dbglog cfg failed from debugfs: %d\n",
1465 mutex_unlock(&ar
->conf_mutex
);
1470 /* TODO: Would be nice to always support ethtool stats, would need to
1471 * move the stats storage out of ath10k_debug, or always have ath10k_debug
1472 * struct available..
1475 /* This generally cooresponds to the debugfs fw_stats file */
1476 static const char ath10k_gstrings_stats
[][ETH_GSTRING_LEN
] = {
1486 "d_tx_power", /* in .5 dbM I think */
1487 "d_rx_crc_err", /* fcs_bad */
1489 "d_tx_mpdus_queued",
1491 "d_tx_msdu_dropped",
1494 "d_tx_ppdu_hw_queued",
1496 "d_tx_fifo_underrun",
1499 "d_tx_excessive_retries",
1501 "d_tx_dropped_sw_retries",
1502 "d_tx_illegal_rate",
1503 "d_tx_continuous_xretries",
1505 "d_tx_mpdu_txop_limit",
1507 "d_rx_mid_ppdu_route_change",
1509 "d_rx_extra_frags_ring0",
1510 "d_rx_extra_frags_ring1",
1511 "d_rx_extra_frags_ring2",
1512 "d_rx_extra_frags_ring3",
1518 "d_rx_phy_err_drops",
1519 "d_rx_mpdu_errors", /* FCS, MIC, ENC */
1521 "d_fw_warm_reset_count",
1522 "d_fw_cold_reset_count",
1525 #define ATH10K_SSTATS_LEN ARRAY_SIZE(ath10k_gstrings_stats)
1527 void ath10k_debug_get_et_strings(struct ieee80211_hw
*hw
,
1528 struct ieee80211_vif
*vif
,
1531 if (sset
== ETH_SS_STATS
)
1532 memcpy(data
, *ath10k_gstrings_stats
,
1533 sizeof(ath10k_gstrings_stats
));
1536 int ath10k_debug_get_et_sset_count(struct ieee80211_hw
*hw
,
1537 struct ieee80211_vif
*vif
, int sset
)
1539 if (sset
== ETH_SS_STATS
)
1540 return ATH10K_SSTATS_LEN
;
1545 void ath10k_debug_get_et_stats(struct ieee80211_hw
*hw
,
1546 struct ieee80211_vif
*vif
,
1547 struct ethtool_stats
*stats
, u64
*data
)
1549 struct ath10k
*ar
= hw
->priv
;
1550 static const struct ath10k_fw_stats_pdev zero_stats
= {};
1551 const struct ath10k_fw_stats_pdev
*pdev_stats
;
1554 mutex_lock(&ar
->conf_mutex
);
1556 if (ar
->state
== ATH10K_STATE_ON
) {
1557 ret
= ath10k_debug_fw_stats_request(ar
);
1559 /* just print a warning and try to use older results */
1561 "failed to get fw stats for ethtool: %d\n",
1566 pdev_stats
= list_first_entry_or_null(&ar
->debug
.fw_stats
.pdevs
,
1567 struct ath10k_fw_stats_pdev
,
1570 /* no results available so just return zeroes */
1571 pdev_stats
= &zero_stats
;
1574 spin_lock_bh(&ar
->data_lock
);
1576 data
[i
++] = pdev_stats
->hw_reaped
; /* ppdu reaped */
1577 data
[i
++] = 0; /* tx bytes */
1578 data
[i
++] = pdev_stats
->htt_mpdus
;
1579 data
[i
++] = 0; /* rx bytes */
1580 data
[i
++] = pdev_stats
->ch_noise_floor
;
1581 data
[i
++] = pdev_stats
->cycle_count
;
1582 data
[i
++] = pdev_stats
->phy_err_count
;
1583 data
[i
++] = pdev_stats
->rts_bad
;
1584 data
[i
++] = pdev_stats
->rts_good
;
1585 data
[i
++] = pdev_stats
->chan_tx_power
;
1586 data
[i
++] = pdev_stats
->fcs_bad
;
1587 data
[i
++] = pdev_stats
->no_beacons
;
1588 data
[i
++] = pdev_stats
->mpdu_enqued
;
1589 data
[i
++] = pdev_stats
->msdu_enqued
;
1590 data
[i
++] = pdev_stats
->wmm_drop
;
1591 data
[i
++] = pdev_stats
->local_enqued
;
1592 data
[i
++] = pdev_stats
->local_freed
;
1593 data
[i
++] = pdev_stats
->hw_queued
;
1594 data
[i
++] = pdev_stats
->hw_reaped
;
1595 data
[i
++] = pdev_stats
->underrun
;
1596 data
[i
++] = pdev_stats
->tx_abort
;
1597 data
[i
++] = pdev_stats
->mpdus_requed
;
1598 data
[i
++] = pdev_stats
->tx_ko
;
1599 data
[i
++] = pdev_stats
->data_rc
;
1600 data
[i
++] = pdev_stats
->sw_retry_failure
;
1601 data
[i
++] = pdev_stats
->illgl_rate_phy_err
;
1602 data
[i
++] = pdev_stats
->pdev_cont_xretry
;
1603 data
[i
++] = pdev_stats
->pdev_tx_timeout
;
1604 data
[i
++] = pdev_stats
->txop_ovf
;
1605 data
[i
++] = pdev_stats
->pdev_resets
;
1606 data
[i
++] = pdev_stats
->mid_ppdu_route_change
;
1607 data
[i
++] = pdev_stats
->status_rcvd
;
1608 data
[i
++] = pdev_stats
->r0_frags
;
1609 data
[i
++] = pdev_stats
->r1_frags
;
1610 data
[i
++] = pdev_stats
->r2_frags
;
1611 data
[i
++] = pdev_stats
->r3_frags
;
1612 data
[i
++] = pdev_stats
->htt_msdus
;
1613 data
[i
++] = pdev_stats
->htt_mpdus
;
1614 data
[i
++] = pdev_stats
->loc_msdus
;
1615 data
[i
++] = pdev_stats
->loc_mpdus
;
1616 data
[i
++] = pdev_stats
->phy_errs
;
1617 data
[i
++] = pdev_stats
->phy_err_drop
;
1618 data
[i
++] = pdev_stats
->mpdu_errs
;
1619 data
[i
++] = ar
->stats
.fw_crash_counter
;
1620 data
[i
++] = ar
->stats
.fw_warm_reset_counter
;
1621 data
[i
++] = ar
->stats
.fw_cold_reset_counter
;
1623 spin_unlock_bh(&ar
->data_lock
);
1625 mutex_unlock(&ar
->conf_mutex
);
1627 WARN_ON(i
!= ATH10K_SSTATS_LEN
);
1630 static const struct file_operations fops_fw_dbglog
= {
1631 .read
= ath10k_read_fw_dbglog
,
1632 .write
= ath10k_write_fw_dbglog
,
1633 .open
= simple_open
,
1634 .owner
= THIS_MODULE
,
1635 .llseek
= default_llseek
,
1638 static int ath10k_debug_cal_data_open(struct inode
*inode
, struct file
*file
)
1640 struct ath10k
*ar
= inode
->i_private
;
1646 mutex_lock(&ar
->conf_mutex
);
1648 if (ar
->state
!= ATH10K_STATE_ON
&&
1649 ar
->state
!= ATH10K_STATE_UTF
) {
1654 buf
= vmalloc(QCA988X_CAL_DATA_LEN
);
1660 hi_addr
= host_interest_item_address(HI_ITEM(hi_board_data
));
1662 ret
= ath10k_hif_diag_read(ar
, hi_addr
, &addr
, sizeof(addr
));
1664 ath10k_warn(ar
, "failed to read hi_board_data address: %d\n", ret
);
1668 ret
= ath10k_hif_diag_read(ar
, le32_to_cpu(addr
), buf
,
1669 QCA988X_CAL_DATA_LEN
);
1671 ath10k_warn(ar
, "failed to read calibration data: %d\n", ret
);
1675 file
->private_data
= buf
;
1677 mutex_unlock(&ar
->conf_mutex
);
1685 mutex_unlock(&ar
->conf_mutex
);
1690 static ssize_t
ath10k_debug_cal_data_read(struct file
*file
,
1691 char __user
*user_buf
,
1692 size_t count
, loff_t
*ppos
)
1694 void *buf
= file
->private_data
;
1696 return simple_read_from_buffer(user_buf
, count
, ppos
,
1697 buf
, QCA988X_CAL_DATA_LEN
);
1700 static int ath10k_debug_cal_data_release(struct inode
*inode
,
1703 vfree(file
->private_data
);
1708 static const struct file_operations fops_cal_data
= {
1709 .open
= ath10k_debug_cal_data_open
,
1710 .read
= ath10k_debug_cal_data_read
,
1711 .release
= ath10k_debug_cal_data_release
,
1712 .owner
= THIS_MODULE
,
1713 .llseek
= default_llseek
,
1716 static ssize_t
ath10k_read_nf_cal_period(struct file
*file
,
1717 char __user
*user_buf
,
1718 size_t count
, loff_t
*ppos
)
1720 struct ath10k
*ar
= file
->private_data
;
1724 len
= scnprintf(buf
, sizeof(buf
), "%d\n",
1725 ar
->debug
.nf_cal_period
);
1727 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1730 static ssize_t
ath10k_write_nf_cal_period(struct file
*file
,
1731 const char __user
*user_buf
,
1732 size_t count
, loff_t
*ppos
)
1734 struct ath10k
*ar
= file
->private_data
;
1735 unsigned long period
;
1738 ret
= kstrtoul_from_user(user_buf
, count
, 0, &period
);
1742 if (period
> WMI_PDEV_PARAM_CAL_PERIOD_MAX
)
1745 /* there's no way to switch back to the firmware default */
1749 mutex_lock(&ar
->conf_mutex
);
1751 ar
->debug
.nf_cal_period
= period
;
1753 if (ar
->state
!= ATH10K_STATE_ON
) {
1754 /* firmware is not running, nothing else to do */
1759 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->cal_period
,
1760 ar
->debug
.nf_cal_period
);
1762 ath10k_warn(ar
, "cal period cfg failed from debugfs: %d\n",
1770 mutex_unlock(&ar
->conf_mutex
);
1775 static const struct file_operations fops_nf_cal_period
= {
1776 .read
= ath10k_read_nf_cal_period
,
1777 .write
= ath10k_write_nf_cal_period
,
1778 .open
= simple_open
,
1779 .owner
= THIS_MODULE
,
1780 .llseek
= default_llseek
,
1783 int ath10k_debug_start(struct ath10k
*ar
)
1787 lockdep_assert_held(&ar
->conf_mutex
);
1789 ret
= ath10k_debug_htt_stats_req(ar
);
1791 /* continue normally anyway, this isn't serious */
1792 ath10k_warn(ar
, "failed to start htt stats workqueue: %d\n",
1795 if (ar
->debug
.fw_dbglog_mask
) {
1796 ret
= ath10k_wmi_dbglog_cfg(ar
, ar
->debug
.fw_dbglog_mask
,
1797 ATH10K_DBGLOG_LEVEL_WARN
);
1800 ath10k_warn(ar
, "failed to enable dbglog during start: %d",
1804 if (ar
->debug
.pktlog_filter
) {
1805 ret
= ath10k_wmi_pdev_pktlog_enable(ar
,
1806 ar
->debug
.pktlog_filter
);
1810 "failed to enable pktlog filter %x: %d\n",
1811 ar
->debug
.pktlog_filter
, ret
);
1813 ret
= ath10k_wmi_pdev_pktlog_disable(ar
);
1816 ath10k_warn(ar
, "failed to disable pktlog: %d\n", ret
);
1819 if (ar
->debug
.nf_cal_period
) {
1820 ret
= ath10k_wmi_pdev_set_param(ar
,
1821 ar
->wmi
.pdev_param
->cal_period
,
1822 ar
->debug
.nf_cal_period
);
1825 ath10k_warn(ar
, "cal period cfg failed from debug start: %d\n",
1832 void ath10k_debug_stop(struct ath10k
*ar
)
1834 lockdep_assert_held(&ar
->conf_mutex
);
1836 /* Must not use _sync to avoid deadlock, we do that in
1837 * ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
1838 * warning from del_timer(). */
1839 if (ar
->debug
.htt_stats_mask
!= 0)
1840 cancel_delayed_work(&ar
->debug
.htt_stats_dwork
);
1842 ar
->debug
.htt_max_amsdu
= 0;
1843 ar
->debug
.htt_max_ampdu
= 0;
1845 ath10k_wmi_pdev_pktlog_disable(ar
);
1848 static ssize_t
ath10k_write_simulate_radar(struct file
*file
,
1849 const char __user
*user_buf
,
1850 size_t count
, loff_t
*ppos
)
1852 struct ath10k
*ar
= file
->private_data
;
1854 ieee80211_radar_detected(ar
->hw
);
1859 static const struct file_operations fops_simulate_radar
= {
1860 .write
= ath10k_write_simulate_radar
,
1861 .open
= simple_open
,
1862 .owner
= THIS_MODULE
,
1863 .llseek
= default_llseek
,
1866 #define ATH10K_DFS_STAT(s, p) (\
1867 len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1868 ar->debug.dfs_stats.p))
1870 #define ATH10K_DFS_POOL_STAT(s, p) (\
1871 len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1872 ar->debug.dfs_pool_stats.p))
1874 static ssize_t
ath10k_read_dfs_stats(struct file
*file
, char __user
*user_buf
,
1875 size_t count
, loff_t
*ppos
)
1877 int retval
= 0, len
= 0;
1878 const int size
= 8000;
1879 struct ath10k
*ar
= file
->private_data
;
1882 buf
= kzalloc(size
, GFP_KERNEL
);
1886 if (!ar
->dfs_detector
) {
1887 len
+= scnprintf(buf
+ len
, size
- len
, "DFS not enabled\n");
1891 ar
->debug
.dfs_pool_stats
=
1892 ar
->dfs_detector
->get_stats(ar
->dfs_detector
);
1894 len
+= scnprintf(buf
+ len
, size
- len
, "Pulse detector statistics:\n");
1896 ATH10K_DFS_STAT("reported phy errors", phy_errors
);
1897 ATH10K_DFS_STAT("pulse events reported", pulses_total
);
1898 ATH10K_DFS_STAT("DFS pulses detected", pulses_detected
);
1899 ATH10K_DFS_STAT("DFS pulses discarded", pulses_discarded
);
1900 ATH10K_DFS_STAT("Radars detected", radar_detected
);
1902 len
+= scnprintf(buf
+ len
, size
- len
, "Global Pool statistics:\n");
1903 ATH10K_DFS_POOL_STAT("Pool references", pool_reference
);
1904 ATH10K_DFS_POOL_STAT("Pulses allocated", pulse_allocated
);
1905 ATH10K_DFS_POOL_STAT("Pulses alloc error", pulse_alloc_error
);
1906 ATH10K_DFS_POOL_STAT("Pulses in use", pulse_used
);
1907 ATH10K_DFS_POOL_STAT("Seqs. allocated", pseq_allocated
);
1908 ATH10K_DFS_POOL_STAT("Seqs. alloc error", pseq_alloc_error
);
1909 ATH10K_DFS_POOL_STAT("Seqs. in use", pseq_used
);
1915 retval
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1921 static const struct file_operations fops_dfs_stats
= {
1922 .read
= ath10k_read_dfs_stats
,
1923 .open
= simple_open
,
1924 .owner
= THIS_MODULE
,
1925 .llseek
= default_llseek
,
1928 static ssize_t
ath10k_write_pktlog_filter(struct file
*file
,
1929 const char __user
*ubuf
,
1930 size_t count
, loff_t
*ppos
)
1932 struct ath10k
*ar
= file
->private_data
;
1936 if (kstrtouint_from_user(ubuf
, count
, 0, &filter
))
1939 mutex_lock(&ar
->conf_mutex
);
1941 if (ar
->state
!= ATH10K_STATE_ON
) {
1942 ar
->debug
.pktlog_filter
= filter
;
1947 if (filter
&& (filter
!= ar
->debug
.pktlog_filter
)) {
1948 ret
= ath10k_wmi_pdev_pktlog_enable(ar
, filter
);
1950 ath10k_warn(ar
, "failed to enable pktlog filter %x: %d\n",
1951 ar
->debug
.pktlog_filter
, ret
);
1955 ret
= ath10k_wmi_pdev_pktlog_disable(ar
);
1957 ath10k_warn(ar
, "failed to disable pktlog: %d\n", ret
);
1962 ar
->debug
.pktlog_filter
= filter
;
1966 mutex_unlock(&ar
->conf_mutex
);
1970 static ssize_t
ath10k_read_pktlog_filter(struct file
*file
, char __user
*ubuf
,
1971 size_t count
, loff_t
*ppos
)
1974 struct ath10k
*ar
= file
->private_data
;
1977 mutex_lock(&ar
->conf_mutex
);
1978 len
= scnprintf(buf
, sizeof(buf
) - len
, "%08x\n",
1979 ar
->debug
.pktlog_filter
);
1980 mutex_unlock(&ar
->conf_mutex
);
1982 return simple_read_from_buffer(ubuf
, count
, ppos
, buf
, len
);
1985 static const struct file_operations fops_pktlog_filter
= {
1986 .read
= ath10k_read_pktlog_filter
,
1987 .write
= ath10k_write_pktlog_filter
,
1991 int ath10k_debug_create(struct ath10k
*ar
)
1993 ar
->debug
.fw_crash_data
= vzalloc(sizeof(*ar
->debug
.fw_crash_data
));
1994 if (!ar
->debug
.fw_crash_data
)
1997 INIT_LIST_HEAD(&ar
->debug
.fw_stats
.pdevs
);
1998 INIT_LIST_HEAD(&ar
->debug
.fw_stats
.vdevs
);
1999 INIT_LIST_HEAD(&ar
->debug
.fw_stats
.peers
);
2004 void ath10k_debug_destroy(struct ath10k
*ar
)
2006 vfree(ar
->debug
.fw_crash_data
);
2007 ar
->debug
.fw_crash_data
= NULL
;
2009 ath10k_debug_fw_stats_reset(ar
);
2012 int ath10k_debug_register(struct ath10k
*ar
)
2014 ar
->debug
.debugfs_phy
= debugfs_create_dir("ath10k",
2015 ar
->hw
->wiphy
->debugfsdir
);
2016 if (IS_ERR_OR_NULL(ar
->debug
.debugfs_phy
)) {
2017 if (IS_ERR(ar
->debug
.debugfs_phy
))
2018 return PTR_ERR(ar
->debug
.debugfs_phy
);
2023 INIT_DELAYED_WORK(&ar
->debug
.htt_stats_dwork
,
2024 ath10k_debug_htt_stats_dwork
);
2026 init_completion(&ar
->debug
.fw_stats_complete
);
2028 debugfs_create_file("fw_stats", S_IRUSR
, ar
->debug
.debugfs_phy
, ar
,
2031 debugfs_create_file("fw_reset_stats", S_IRUSR
, ar
->debug
.debugfs_phy
,
2032 ar
, &fops_fw_reset_stats
);
2034 debugfs_create_file("wmi_services", S_IRUSR
, ar
->debug
.debugfs_phy
, ar
,
2035 &fops_wmi_services
);
2037 debugfs_create_file("simulate_fw_crash", S_IRUSR
, ar
->debug
.debugfs_phy
,
2038 ar
, &fops_simulate_fw_crash
);
2040 debugfs_create_file("fw_crash_dump", S_IRUSR
, ar
->debug
.debugfs_phy
,
2041 ar
, &fops_fw_crash_dump
);
2043 debugfs_create_file("reg_addr", S_IRUSR
| S_IWUSR
,
2044 ar
->debug
.debugfs_phy
, ar
, &fops_reg_addr
);
2046 debugfs_create_file("reg_value", S_IRUSR
| S_IWUSR
,
2047 ar
->debug
.debugfs_phy
, ar
, &fops_reg_value
);
2049 debugfs_create_file("mem_value", S_IRUSR
| S_IWUSR
,
2050 ar
->debug
.debugfs_phy
, ar
, &fops_mem_value
);
2052 debugfs_create_file("chip_id", S_IRUSR
, ar
->debug
.debugfs_phy
,
2055 debugfs_create_file("htt_stats_mask", S_IRUSR
, ar
->debug
.debugfs_phy
,
2056 ar
, &fops_htt_stats_mask
);
2058 debugfs_create_file("htt_max_amsdu_ampdu", S_IRUSR
| S_IWUSR
,
2059 ar
->debug
.debugfs_phy
, ar
,
2060 &fops_htt_max_amsdu_ampdu
);
2062 debugfs_create_file("fw_dbglog", S_IRUSR
, ar
->debug
.debugfs_phy
,
2063 ar
, &fops_fw_dbglog
);
2065 debugfs_create_file("cal_data", S_IRUSR
, ar
->debug
.debugfs_phy
,
2066 ar
, &fops_cal_data
);
2068 debugfs_create_file("nf_cal_period", S_IRUSR
| S_IWUSR
,
2069 ar
->debug
.debugfs_phy
, ar
, &fops_nf_cal_period
);
2071 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
)) {
2072 debugfs_create_file("dfs_simulate_radar", S_IWUSR
,
2073 ar
->debug
.debugfs_phy
, ar
,
2074 &fops_simulate_radar
);
2076 debugfs_create_bool("dfs_block_radar_events", S_IWUSR
,
2077 ar
->debug
.debugfs_phy
,
2078 &ar
->dfs_block_radar_events
);
2080 debugfs_create_file("dfs_stats", S_IRUSR
,
2081 ar
->debug
.debugfs_phy
, ar
,
2085 debugfs_create_file("pktlog_filter", S_IRUGO
| S_IWUSR
,
2086 ar
->debug
.debugfs_phy
, ar
, &fops_pktlog_filter
);
2091 void ath10k_debug_unregister(struct ath10k
*ar
)
2093 cancel_delayed_work_sync(&ar
->debug
.htt_stats_dwork
);
2096 #endif /* CONFIG_ATH10K_DEBUGFS */
2098 #ifdef CONFIG_ATH10K_DEBUG
2099 void ath10k_dbg(struct ath10k
*ar
, enum ath10k_debug_mask mask
,
2100 const char *fmt
, ...)
2102 struct va_format vaf
;
2105 va_start(args
, fmt
);
2110 if (ath10k_debug_mask
& mask
)
2111 dev_printk(KERN_DEBUG
, ar
->dev
, "%pV", &vaf
);
2113 trace_ath10k_log_dbg(ar
, mask
, &vaf
);
2117 EXPORT_SYMBOL(ath10k_dbg
);
2119 void ath10k_dbg_dump(struct ath10k
*ar
,
2120 enum ath10k_debug_mask mask
,
2121 const char *msg
, const char *prefix
,
2122 const void *buf
, size_t len
)
2125 unsigned int linebuflen
;
2128 if (ath10k_debug_mask
& mask
) {
2130 ath10k_dbg(ar
, mask
, "%s\n", msg
);
2132 for (ptr
= buf
; (ptr
- buf
) < len
; ptr
+= 16) {
2134 linebuflen
+= scnprintf(linebuf
+ linebuflen
,
2135 sizeof(linebuf
) - linebuflen
,
2137 (prefix
? prefix
: ""),
2138 (unsigned int)(ptr
- buf
));
2139 hex_dump_to_buffer(ptr
, len
- (ptr
- buf
), 16, 1,
2140 linebuf
+ linebuflen
,
2141 sizeof(linebuf
) - linebuflen
, true);
2142 dev_printk(KERN_DEBUG
, ar
->dev
, "%s\n", linebuf
);
2146 /* tracing code doesn't like null strings :/ */
2147 trace_ath10k_log_dbg_dump(ar
, msg
? msg
: "", prefix
? prefix
: "",
2150 EXPORT_SYMBOL(ath10k_dbg_dump
);
2152 #endif /* CONFIG_ATH10K_DEBUG */