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>
28 #define ATH10K_DEBUG_HTT_STATS_INTERVAL 1000
30 #define ATH10K_FW_CRASH_DUMP_VERSION 1
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
36 enum ath10k_fw_crash_dump_type
{
37 ATH10K_FW_CRASH_DUMP_REGISTERS
= 0,
39 ATH10K_FW_CRASH_DUMP_MAX
,
42 struct ath10k_tlv_dump_data
{
43 /* see ath10k_fw_crash_dump_type above */
49 /* pad to 32-bit boundaries as needed */
53 struct ath10k_dump_file_data
{
54 /* dump file information */
56 /* "ATH10K-FW-DUMP" */
61 /* file dump version */
64 /* some info we can get from ath10k struct that might help */
70 /* 0 for now, in place for later hardware */
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
;
85 /* firmware version string */
86 char fw_ver
[ETHTOOL_FWVERS_LEN
];
88 /* Kernel related information */
90 /* time-of-day stamp */
93 /* time-of-day stamp, nano-seconds */
96 /* LINUX_VERSION_CODE */
97 __le32 kernel_ver_code
;
102 /* room for growth w/out changing binary format */
105 /* struct ath10k_tlv_dump_data + more */
109 void ath10k_info(struct ath10k
*ar
, const char *fmt
, ...)
111 struct va_format vaf
= {
118 dev_info(ar
->dev
, "%pV", &vaf
);
119 trace_ath10k_log_info(ar
, &vaf
);
122 EXPORT_SYMBOL(ath10k_info
);
124 void ath10k_print_driver_info(struct ath10k
*ar
)
126 ath10k_info(ar
, "%s (0x%08x, 0x%08x) fw %s api %d htt %d.%d wmi %d.%d.%d.%d cal %s max_sta %d\n",
130 ar
->hw
->wiphy
->fw_version
,
132 ar
->htt
.target_version_major
,
133 ar
->htt
.target_version_minor
,
134 ar
->fw_version_major
,
135 ar
->fw_version_minor
,
136 ar
->fw_version_release
,
137 ar
->fw_version_build
,
138 ath10k_cal_mode_str(ar
->cal_mode
),
139 ar
->max_num_stations
);
140 ath10k_info(ar
, "debug %d debugfs %d tracing %d dfs %d testmode %d\n",
141 config_enabled(CONFIG_ATH10K_DEBUG
),
142 config_enabled(CONFIG_ATH10K_DEBUGFS
),
143 config_enabled(CONFIG_ATH10K_TRACING
),
144 config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
),
145 config_enabled(CONFIG_NL80211_TESTMODE
));
147 EXPORT_SYMBOL(ath10k_print_driver_info
);
149 void ath10k_err(struct ath10k
*ar
, const char *fmt
, ...)
151 struct va_format vaf
= {
158 dev_err(ar
->dev
, "%pV", &vaf
);
159 trace_ath10k_log_err(ar
, &vaf
);
162 EXPORT_SYMBOL(ath10k_err
);
164 void ath10k_warn(struct ath10k
*ar
, const char *fmt
, ...)
166 struct va_format vaf
= {
173 dev_warn_ratelimited(ar
->dev
, "%pV", &vaf
);
174 trace_ath10k_log_warn(ar
, &vaf
);
178 EXPORT_SYMBOL(ath10k_warn
);
180 #ifdef CONFIG_ATH10K_DEBUGFS
182 static ssize_t
ath10k_read_wmi_services(struct file
*file
,
183 char __user
*user_buf
,
184 size_t count
, loff_t
*ppos
)
186 struct ath10k
*ar
= file
->private_data
;
188 unsigned int len
= 0, buf_len
= 4096;
194 buf
= kzalloc(buf_len
, GFP_KERNEL
);
198 mutex_lock(&ar
->conf_mutex
);
203 spin_lock_bh(&ar
->data_lock
);
204 for (i
= 0; i
< WMI_SERVICE_MAX
; i
++) {
205 enabled
= test_bit(i
, ar
->wmi
.svc_map
);
206 name
= wmi_service_name(i
);
210 len
+= scnprintf(buf
+ len
, buf_len
- len
,
211 "%-40s %s (bit %d)\n",
212 "unknown", "enabled", i
);
217 len
+= scnprintf(buf
+ len
, buf_len
- len
,
219 name
, enabled
? "enabled" : "-");
221 spin_unlock_bh(&ar
->data_lock
);
223 ret_cnt
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
225 mutex_unlock(&ar
->conf_mutex
);
231 static const struct file_operations fops_wmi_services
= {
232 .read
= ath10k_read_wmi_services
,
234 .owner
= THIS_MODULE
,
235 .llseek
= default_llseek
,
238 static void ath10k_debug_fw_stats_pdevs_free(struct list_head
*head
)
240 struct ath10k_fw_stats_pdev
*i
, *tmp
;
242 list_for_each_entry_safe(i
, tmp
, head
, list
) {
248 static void ath10k_debug_fw_stats_peers_free(struct list_head
*head
)
250 struct ath10k_fw_stats_peer
*i
, *tmp
;
252 list_for_each_entry_safe(i
, tmp
, head
, list
) {
258 static void ath10k_debug_fw_stats_reset(struct ath10k
*ar
)
260 spin_lock_bh(&ar
->data_lock
);
261 ar
->debug
.fw_stats_done
= false;
262 ath10k_debug_fw_stats_pdevs_free(&ar
->debug
.fw_stats
.pdevs
);
263 ath10k_debug_fw_stats_peers_free(&ar
->debug
.fw_stats
.peers
);
264 spin_unlock_bh(&ar
->data_lock
);
267 static size_t ath10k_debug_fw_stats_num_peers(struct list_head
*head
)
269 struct ath10k_fw_stats_peer
*i
;
272 list_for_each_entry(i
, head
, list
)
278 void ath10k_debug_fw_stats_process(struct ath10k
*ar
, struct sk_buff
*skb
)
280 struct ath10k_fw_stats stats
= {};
281 bool is_start
, is_started
, is_end
;
285 INIT_LIST_HEAD(&stats
.pdevs
);
286 INIT_LIST_HEAD(&stats
.peers
);
288 spin_lock_bh(&ar
->data_lock
);
289 ret
= ath10k_wmi_pull_fw_stats(ar
, skb
, &stats
);
291 ath10k_warn(ar
, "failed to pull fw stats: %d\n", ret
);
295 /* Stat data may exceed htc-wmi buffer limit. In such case firmware
296 * splits the stats data and delivers it in a ping-pong fashion of
297 * request cmd-update event.
299 * However there is no explicit end-of-data. Instead start-of-data is
300 * used as an implicit one. This works as follows:
301 * a) discard stat update events until one with pdev stats is
302 * delivered - this skips session started at end of (b)
303 * b) consume stat update events until another one with pdev stats is
304 * delivered which is treated as end-of-data and is itself discarded
307 if (ar
->debug
.fw_stats_done
) {
308 ath10k_warn(ar
, "received unsolicited stats update event\n");
312 num_peers
= ath10k_debug_fw_stats_num_peers(&ar
->debug
.fw_stats
.peers
);
313 is_start
= (list_empty(&ar
->debug
.fw_stats
.pdevs
) &&
314 !list_empty(&stats
.pdevs
));
315 is_end
= (!list_empty(&ar
->debug
.fw_stats
.pdevs
) &&
316 !list_empty(&stats
.pdevs
));
319 list_splice_tail_init(&stats
.pdevs
, &ar
->debug
.fw_stats
.pdevs
);
322 ar
->debug
.fw_stats_done
= true;
324 is_started
= !list_empty(&ar
->debug
.fw_stats
.pdevs
);
326 if (is_started
&& !is_end
) {
327 if (num_peers
>= ATH10K_MAX_NUM_PEER_IDS
) {
328 /* Although this is unlikely impose a sane limit to
329 * prevent firmware from DoS-ing the host.
331 ath10k_warn(ar
, "dropping fw peer stats\n");
335 list_splice_tail_init(&stats
.peers
, &ar
->debug
.fw_stats
.peers
);
338 complete(&ar
->debug
.fw_stats_complete
);
341 /* In some cases lists have been spliced and cleared. Free up
342 * resources if that is not the case.
344 ath10k_debug_fw_stats_pdevs_free(&stats
.pdevs
);
345 ath10k_debug_fw_stats_peers_free(&stats
.peers
);
348 spin_unlock_bh(&ar
->data_lock
);
351 static int ath10k_debug_fw_stats_request(struct ath10k
*ar
)
353 unsigned long timeout
;
356 lockdep_assert_held(&ar
->conf_mutex
);
358 timeout
= jiffies
+ msecs_to_jiffies(1*HZ
);
360 ath10k_debug_fw_stats_reset(ar
);
363 if (time_after(jiffies
, timeout
))
366 reinit_completion(&ar
->debug
.fw_stats_complete
);
368 ret
= ath10k_wmi_request_stats(ar
, WMI_REQUEST_PEER_STAT
);
370 ath10k_warn(ar
, "could not request stats (%d)\n", ret
);
374 ret
= wait_for_completion_timeout(&ar
->debug
.fw_stats_complete
,
379 spin_lock_bh(&ar
->data_lock
);
380 if (ar
->debug
.fw_stats_done
) {
381 spin_unlock_bh(&ar
->data_lock
);
384 spin_unlock_bh(&ar
->data_lock
);
390 /* FIXME: How to calculate the buffer size sanely? */
391 #define ATH10K_FW_STATS_BUF_SIZE (1024*1024)
393 static void ath10k_fw_stats_fill(struct ath10k
*ar
,
394 struct ath10k_fw_stats
*fw_stats
,
397 unsigned int len
= 0;
398 unsigned int buf_len
= ATH10K_FW_STATS_BUF_SIZE
;
399 const struct ath10k_fw_stats_pdev
*pdev
;
400 const struct ath10k_fw_stats_peer
*peer
;
403 spin_lock_bh(&ar
->data_lock
);
405 pdev
= list_first_entry_or_null(&fw_stats
->pdevs
,
406 struct ath10k_fw_stats_pdev
, list
);
408 ath10k_warn(ar
, "failed to get pdev stats\n");
412 num_peers
= ath10k_debug_fw_stats_num_peers(&fw_stats
->peers
);
414 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
415 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n",
416 "ath10k PDEV stats");
417 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
418 "=================");
420 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
421 "Channel noise floor", pdev
->ch_noise_floor
);
422 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
423 "Channel TX power", pdev
->chan_tx_power
);
424 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
425 "TX frame count", pdev
->tx_frame_count
);
426 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
427 "RX frame count", pdev
->rx_frame_count
);
428 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
429 "RX clear count", pdev
->rx_clear_count
);
430 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
431 "Cycle count", pdev
->cycle_count
);
432 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
433 "PHY error count", pdev
->phy_err_count
);
434 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
435 "RTS bad count", pdev
->rts_bad
);
436 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
437 "RTS good count", pdev
->rts_good
);
438 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
439 "FCS bad count", pdev
->fcs_bad
);
440 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
441 "No beacon count", pdev
->no_beacons
);
442 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10u\n",
443 "MIB int count", pdev
->mib_int_count
);
445 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
446 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n",
447 "ath10k PDEV TX stats");
448 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
449 "=================");
451 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
452 "HTT cookies queued", pdev
->comp_queued
);
453 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
454 "HTT cookies disp.", pdev
->comp_delivered
);
455 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
456 "MSDU queued", pdev
->msdu_enqued
);
457 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
458 "MPDU queued", pdev
->mpdu_enqued
);
459 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
460 "MSDUs dropped", pdev
->wmm_drop
);
461 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
462 "Local enqued", pdev
->local_enqued
);
463 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
464 "Local freed", pdev
->local_freed
);
465 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
466 "HW queued", pdev
->hw_queued
);
467 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
468 "PPDUs reaped", pdev
->hw_reaped
);
469 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
470 "Num underruns", pdev
->underrun
);
471 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
472 "PPDUs cleaned", pdev
->tx_abort
);
473 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
474 "MPDUs requed", pdev
->mpdus_requed
);
475 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
476 "Excessive retries", pdev
->tx_ko
);
477 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
478 "HW rate", pdev
->data_rc
);
479 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
480 "Sched self tiggers", pdev
->self_triggers
);
481 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
482 "Dropped due to SW retries",
483 pdev
->sw_retry_failure
);
484 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
485 "Illegal rate phy errors",
486 pdev
->illgl_rate_phy_err
);
487 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
488 "Pdev continous xretry", pdev
->pdev_cont_xretry
);
489 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
490 "TX timeout", pdev
->pdev_tx_timeout
);
491 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
492 "PDEV resets", pdev
->pdev_resets
);
493 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
494 "PHY underrun", pdev
->phy_underrun
);
495 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
496 "MPDU is more than txop limit", pdev
->txop_ovf
);
498 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
499 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n",
500 "ath10k PDEV RX stats");
501 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
502 "=================");
504 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
505 "Mid PPDU route change",
506 pdev
->mid_ppdu_route_change
);
507 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
508 "Tot. number of statuses", pdev
->status_rcvd
);
509 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
510 "Extra frags on rings 0", pdev
->r0_frags
);
511 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
512 "Extra frags on rings 1", pdev
->r1_frags
);
513 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
514 "Extra frags on rings 2", pdev
->r2_frags
);
515 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
516 "Extra frags on rings 3", pdev
->r3_frags
);
517 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
518 "MSDUs delivered to HTT", pdev
->htt_msdus
);
519 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
520 "MPDUs delivered to HTT", pdev
->htt_mpdus
);
521 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
522 "MSDUs delivered to stack", pdev
->loc_msdus
);
523 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
524 "MPDUs delivered to stack", pdev
->loc_mpdus
);
525 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
526 "Oversized AMSUs", pdev
->oversize_amsdu
);
527 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
528 "PHY errors", pdev
->phy_errs
);
529 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
530 "PHY errors drops", pdev
->phy_err_drop
);
531 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %10d\n",
532 "MPDU errors (FCS, MIC, ENC)", pdev
->mpdu_errs
);
534 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
535 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s (%zu)\n",
536 "ath10k PEER stats", num_peers
);
537 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s\n\n",
538 "=================");
540 list_for_each_entry(peer
, &fw_stats
->peers
, list
) {
541 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %pM\n",
542 "Peer MAC address", peer
->peer_macaddr
);
543 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
544 "Peer RSSI", peer
->peer_rssi
);
545 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
546 "Peer TX rate", peer
->peer_tx_rate
);
547 len
+= scnprintf(buf
+ len
, buf_len
- len
, "%30s %u\n",
548 "Peer RX rate", peer
->peer_rx_rate
);
549 len
+= scnprintf(buf
+ len
, buf_len
- len
, "\n");
553 spin_unlock_bh(&ar
->data_lock
);
561 static int ath10k_fw_stats_open(struct inode
*inode
, struct file
*file
)
563 struct ath10k
*ar
= inode
->i_private
;
567 mutex_lock(&ar
->conf_mutex
);
569 if (ar
->state
!= ATH10K_STATE_ON
) {
574 buf
= vmalloc(ATH10K_FW_STATS_BUF_SIZE
);
580 ret
= ath10k_debug_fw_stats_request(ar
);
582 ath10k_warn(ar
, "failed to request fw stats: %d\n", ret
);
586 ath10k_fw_stats_fill(ar
, &ar
->debug
.fw_stats
, buf
);
587 file
->private_data
= buf
;
589 mutex_unlock(&ar
->conf_mutex
);
596 mutex_unlock(&ar
->conf_mutex
);
600 static int ath10k_fw_stats_release(struct inode
*inode
, struct file
*file
)
602 vfree(file
->private_data
);
607 static ssize_t
ath10k_fw_stats_read(struct file
*file
, char __user
*user_buf
,
608 size_t count
, loff_t
*ppos
)
610 const char *buf
= file
->private_data
;
611 unsigned int len
= strlen(buf
);
613 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
616 static const struct file_operations fops_fw_stats
= {
617 .open
= ath10k_fw_stats_open
,
618 .release
= ath10k_fw_stats_release
,
619 .read
= ath10k_fw_stats_read
,
620 .owner
= THIS_MODULE
,
621 .llseek
= default_llseek
,
624 static ssize_t
ath10k_debug_fw_reset_stats_read(struct file
*file
,
625 char __user
*user_buf
,
626 size_t count
, loff_t
*ppos
)
628 struct ath10k
*ar
= file
->private_data
;
629 int ret
, len
, buf_len
;
633 buf
= kmalloc(buf_len
, GFP_KERNEL
);
637 spin_lock_bh(&ar
->data_lock
);
640 len
+= scnprintf(buf
+ len
, buf_len
- len
,
641 "fw_crash_counter\t\t%d\n", ar
->stats
.fw_crash_counter
);
642 len
+= scnprintf(buf
+ len
, buf_len
- len
,
643 "fw_warm_reset_counter\t\t%d\n",
644 ar
->stats
.fw_warm_reset_counter
);
645 len
+= scnprintf(buf
+ len
, buf_len
- len
,
646 "fw_cold_reset_counter\t\t%d\n",
647 ar
->stats
.fw_cold_reset_counter
);
649 spin_unlock_bh(&ar
->data_lock
);
651 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
658 static const struct file_operations fops_fw_reset_stats
= {
660 .read
= ath10k_debug_fw_reset_stats_read
,
661 .owner
= THIS_MODULE
,
662 .llseek
= default_llseek
,
665 /* This is a clean assert crash in firmware. */
666 static int ath10k_debug_fw_assert(struct ath10k
*ar
)
668 struct wmi_vdev_install_key_cmd
*cmd
;
671 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*cmd
) + 16);
675 cmd
= (struct wmi_vdev_install_key_cmd
*)skb
->data
;
676 memset(cmd
, 0, sizeof(*cmd
));
678 /* big enough number so that firmware asserts */
679 cmd
->vdev_id
= __cpu_to_le32(0x7ffe);
681 return ath10k_wmi_cmd_send(ar
, skb
,
682 ar
->wmi
.cmd
->vdev_install_key_cmdid
);
685 static ssize_t
ath10k_read_simulate_fw_crash(struct file
*file
,
686 char __user
*user_buf
,
687 size_t count
, loff_t
*ppos
)
690 "To simulate firmware crash write one of the keywords to this file:\n"
691 "`soft` - this will send WMI_FORCE_FW_HANG_ASSERT to firmware if FW supports that command.\n"
692 "`hard` - this will send to firmware command with illegal parameters causing firmware crash.\n"
693 "`assert` - this will send special illegal parameter to firmware to cause assert failure and crash.\n"
694 "`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n";
696 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, strlen(buf
));
699 /* Simulate firmware crash:
700 * 'soft': Call wmi command causing firmware hang. This firmware hang is
701 * recoverable by warm firmware reset.
702 * 'hard': Force firmware crash by setting any vdev parameter for not allowed
703 * vdev id. This is hard firmware crash because it is recoverable only by cold
706 static ssize_t
ath10k_write_simulate_fw_crash(struct file
*file
,
707 const char __user
*user_buf
,
708 size_t count
, loff_t
*ppos
)
710 struct ath10k
*ar
= file
->private_data
;
714 mutex_lock(&ar
->conf_mutex
);
716 simple_write_to_buffer(buf
, sizeof(buf
) - 1, ppos
, user_buf
, count
);
718 /* make sure that buf is null terminated */
719 buf
[sizeof(buf
) - 1] = 0;
721 if (ar
->state
!= ATH10K_STATE_ON
&&
722 ar
->state
!= ATH10K_STATE_RESTARTED
) {
727 /* drop the possible '\n' from the end */
728 if (buf
[count
- 1] == '\n') {
733 if (!strcmp(buf
, "soft")) {
734 ath10k_info(ar
, "simulating soft firmware crash\n");
735 ret
= ath10k_wmi_force_fw_hang(ar
, WMI_FORCE_FW_HANG_ASSERT
, 0);
736 } else if (!strcmp(buf
, "hard")) {
737 ath10k_info(ar
, "simulating hard firmware crash\n");
738 /* 0x7fff is vdev id, and it is always out of range for all
739 * firmware variants in order to force a firmware crash.
741 ret
= ath10k_wmi_vdev_set_param(ar
, 0x7fff,
742 ar
->wmi
.vdev_param
->rts_threshold
,
744 } else if (!strcmp(buf
, "assert")) {
745 ath10k_info(ar
, "simulating firmware assert crash\n");
746 ret
= ath10k_debug_fw_assert(ar
);
747 } else if (!strcmp(buf
, "hw-restart")) {
748 ath10k_info(ar
, "user requested hw restart\n");
749 queue_work(ar
->workqueue
, &ar
->restart_work
);
757 ath10k_warn(ar
, "failed to simulate firmware crash: %d\n", ret
);
764 mutex_unlock(&ar
->conf_mutex
);
768 static const struct file_operations fops_simulate_fw_crash
= {
769 .read
= ath10k_read_simulate_fw_crash
,
770 .write
= ath10k_write_simulate_fw_crash
,
772 .owner
= THIS_MODULE
,
773 .llseek
= default_llseek
,
776 static ssize_t
ath10k_read_chip_id(struct file
*file
, char __user
*user_buf
,
777 size_t count
, loff_t
*ppos
)
779 struct ath10k
*ar
= file
->private_data
;
783 len
= scnprintf(buf
, sizeof(buf
), "0x%08x\n", ar
->chip_id
);
785 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
788 static const struct file_operations fops_chip_id
= {
789 .read
= ath10k_read_chip_id
,
791 .owner
= THIS_MODULE
,
792 .llseek
= default_llseek
,
795 struct ath10k_fw_crash_data
*
796 ath10k_debug_get_new_fw_crash_data(struct ath10k
*ar
)
798 struct ath10k_fw_crash_data
*crash_data
= ar
->debug
.fw_crash_data
;
800 lockdep_assert_held(&ar
->data_lock
);
802 crash_data
->crashed_since_read
= true;
803 uuid_le_gen(&crash_data
->uuid
);
804 getnstimeofday(&crash_data
->timestamp
);
808 EXPORT_SYMBOL(ath10k_debug_get_new_fw_crash_data
);
810 static struct ath10k_dump_file_data
*ath10k_build_dump_file(struct ath10k
*ar
)
812 struct ath10k_fw_crash_data
*crash_data
= ar
->debug
.fw_crash_data
;
813 struct ath10k_dump_file_data
*dump_data
;
814 struct ath10k_tlv_dump_data
*dump_tlv
;
815 int hdr_len
= sizeof(*dump_data
);
816 unsigned int len
, sofar
= 0;
820 len
+= sizeof(*dump_tlv
) + sizeof(crash_data
->registers
);
824 /* This is going to get big when we start dumping FW RAM and such,
825 * so go ahead and use vmalloc.
831 spin_lock_bh(&ar
->data_lock
);
833 if (!crash_data
->crashed_since_read
) {
834 spin_unlock_bh(&ar
->data_lock
);
839 dump_data
= (struct ath10k_dump_file_data
*)(buf
);
840 strlcpy(dump_data
->df_magic
, "ATH10K-FW-DUMP",
841 sizeof(dump_data
->df_magic
));
842 dump_data
->len
= cpu_to_le32(len
);
844 dump_data
->version
= cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION
);
846 memcpy(dump_data
->uuid
, &crash_data
->uuid
, sizeof(dump_data
->uuid
));
847 dump_data
->chip_id
= cpu_to_le32(ar
->chip_id
);
848 dump_data
->bus_type
= cpu_to_le32(0);
849 dump_data
->target_version
= cpu_to_le32(ar
->target_version
);
850 dump_data
->fw_version_major
= cpu_to_le32(ar
->fw_version_major
);
851 dump_data
->fw_version_minor
= cpu_to_le32(ar
->fw_version_minor
);
852 dump_data
->fw_version_release
= cpu_to_le32(ar
->fw_version_release
);
853 dump_data
->fw_version_build
= cpu_to_le32(ar
->fw_version_build
);
854 dump_data
->phy_capability
= cpu_to_le32(ar
->phy_capability
);
855 dump_data
->hw_min_tx_power
= cpu_to_le32(ar
->hw_min_tx_power
);
856 dump_data
->hw_max_tx_power
= cpu_to_le32(ar
->hw_max_tx_power
);
857 dump_data
->ht_cap_info
= cpu_to_le32(ar
->ht_cap_info
);
858 dump_data
->vht_cap_info
= cpu_to_le32(ar
->vht_cap_info
);
859 dump_data
->num_rf_chains
= cpu_to_le32(ar
->num_rf_chains
);
861 strlcpy(dump_data
->fw_ver
, ar
->hw
->wiphy
->fw_version
,
862 sizeof(dump_data
->fw_ver
));
864 dump_data
->kernel_ver_code
= 0;
865 strlcpy(dump_data
->kernel_ver
, init_utsname()->release
,
866 sizeof(dump_data
->kernel_ver
));
868 dump_data
->tv_sec
= cpu_to_le64(crash_data
->timestamp
.tv_sec
);
869 dump_data
->tv_nsec
= cpu_to_le64(crash_data
->timestamp
.tv_nsec
);
871 /* Gather crash-dump */
872 dump_tlv
= (struct ath10k_tlv_dump_data
*)(buf
+ sofar
);
873 dump_tlv
->type
= cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS
);
874 dump_tlv
->tlv_len
= cpu_to_le32(sizeof(crash_data
->registers
));
875 memcpy(dump_tlv
->tlv_data
, &crash_data
->registers
,
876 sizeof(crash_data
->registers
));
877 sofar
+= sizeof(*dump_tlv
) + sizeof(crash_data
->registers
);
879 ar
->debug
.fw_crash_data
->crashed_since_read
= false;
881 spin_unlock_bh(&ar
->data_lock
);
886 static int ath10k_fw_crash_dump_open(struct inode
*inode
, struct file
*file
)
888 struct ath10k
*ar
= inode
->i_private
;
889 struct ath10k_dump_file_data
*dump
;
891 dump
= ath10k_build_dump_file(ar
);
895 file
->private_data
= dump
;
900 static ssize_t
ath10k_fw_crash_dump_read(struct file
*file
,
901 char __user
*user_buf
,
902 size_t count
, loff_t
*ppos
)
904 struct ath10k_dump_file_data
*dump_file
= file
->private_data
;
906 return simple_read_from_buffer(user_buf
, count
, ppos
,
908 le32_to_cpu(dump_file
->len
));
911 static int ath10k_fw_crash_dump_release(struct inode
*inode
,
914 vfree(file
->private_data
);
919 static const struct file_operations fops_fw_crash_dump
= {
920 .open
= ath10k_fw_crash_dump_open
,
921 .read
= ath10k_fw_crash_dump_read
,
922 .release
= ath10k_fw_crash_dump_release
,
923 .owner
= THIS_MODULE
,
924 .llseek
= default_llseek
,
927 static ssize_t
ath10k_reg_addr_read(struct file
*file
,
928 char __user
*user_buf
,
929 size_t count
, loff_t
*ppos
)
931 struct ath10k
*ar
= file
->private_data
;
933 unsigned int len
= 0;
936 mutex_lock(&ar
->conf_mutex
);
937 reg_addr
= ar
->debug
.reg_addr
;
938 mutex_unlock(&ar
->conf_mutex
);
940 len
+= scnprintf(buf
+ len
, sizeof(buf
) - len
, "0x%x\n", reg_addr
);
942 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
945 static ssize_t
ath10k_reg_addr_write(struct file
*file
,
946 const char __user
*user_buf
,
947 size_t count
, loff_t
*ppos
)
949 struct ath10k
*ar
= file
->private_data
;
953 ret
= kstrtou32_from_user(user_buf
, count
, 0, ®_addr
);
957 if (!IS_ALIGNED(reg_addr
, 4))
960 mutex_lock(&ar
->conf_mutex
);
961 ar
->debug
.reg_addr
= reg_addr
;
962 mutex_unlock(&ar
->conf_mutex
);
967 static const struct file_operations fops_reg_addr
= {
968 .read
= ath10k_reg_addr_read
,
969 .write
= ath10k_reg_addr_write
,
971 .owner
= THIS_MODULE
,
972 .llseek
= default_llseek
,
975 static ssize_t
ath10k_reg_value_read(struct file
*file
,
976 char __user
*user_buf
,
977 size_t count
, loff_t
*ppos
)
979 struct ath10k
*ar
= file
->private_data
;
982 u32 reg_addr
, reg_val
;
985 mutex_lock(&ar
->conf_mutex
);
987 if (ar
->state
!= ATH10K_STATE_ON
&&
988 ar
->state
!= ATH10K_STATE_UTF
) {
993 reg_addr
= ar
->debug
.reg_addr
;
995 reg_val
= ath10k_hif_read32(ar
, reg_addr
);
996 len
= scnprintf(buf
, sizeof(buf
), "0x%08x:0x%08x\n", reg_addr
, reg_val
);
998 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1001 mutex_unlock(&ar
->conf_mutex
);
1006 static ssize_t
ath10k_reg_value_write(struct file
*file
,
1007 const char __user
*user_buf
,
1008 size_t count
, loff_t
*ppos
)
1010 struct ath10k
*ar
= file
->private_data
;
1011 u32 reg_addr
, reg_val
;
1014 mutex_lock(&ar
->conf_mutex
);
1016 if (ar
->state
!= ATH10K_STATE_ON
&&
1017 ar
->state
!= ATH10K_STATE_UTF
) {
1022 reg_addr
= ar
->debug
.reg_addr
;
1024 ret
= kstrtou32_from_user(user_buf
, count
, 0, ®_val
);
1028 ath10k_hif_write32(ar
, reg_addr
, reg_val
);
1033 mutex_unlock(&ar
->conf_mutex
);
1038 static const struct file_operations fops_reg_value
= {
1039 .read
= ath10k_reg_value_read
,
1040 .write
= ath10k_reg_value_write
,
1041 .open
= simple_open
,
1042 .owner
= THIS_MODULE
,
1043 .llseek
= default_llseek
,
1046 static ssize_t
ath10k_mem_value_read(struct file
*file
,
1047 char __user
*user_buf
,
1048 size_t count
, loff_t
*ppos
)
1050 struct ath10k
*ar
= file
->private_data
;
1060 mutex_lock(&ar
->conf_mutex
);
1062 buf
= vmalloc(count
);
1068 if (ar
->state
!= ATH10K_STATE_ON
&&
1069 ar
->state
!= ATH10K_STATE_UTF
) {
1074 ret
= ath10k_hif_diag_read(ar
, *ppos
, buf
, count
);
1076 ath10k_warn(ar
, "failed to read address 0x%08x via diagnose window fnrom debugfs: %d\n",
1081 ret
= copy_to_user(user_buf
, buf
, count
);
1093 mutex_unlock(&ar
->conf_mutex
);
1098 static ssize_t
ath10k_mem_value_write(struct file
*file
,
1099 const char __user
*user_buf
,
1100 size_t count
, loff_t
*ppos
)
1102 struct ath10k
*ar
= file
->private_data
;
1112 mutex_lock(&ar
->conf_mutex
);
1114 buf
= vmalloc(count
);
1120 if (ar
->state
!= ATH10K_STATE_ON
&&
1121 ar
->state
!= ATH10K_STATE_UTF
) {
1126 ret
= copy_from_user(buf
, user_buf
, count
);
1132 ret
= ath10k_hif_diag_write(ar
, *ppos
, buf
, count
);
1134 ath10k_warn(ar
, "failed to write address 0x%08x via diagnose window from debugfs: %d\n",
1144 mutex_unlock(&ar
->conf_mutex
);
1149 static const struct file_operations fops_mem_value
= {
1150 .read
= ath10k_mem_value_read
,
1151 .write
= ath10k_mem_value_write
,
1152 .open
= simple_open
,
1153 .owner
= THIS_MODULE
,
1154 .llseek
= default_llseek
,
1157 static int ath10k_debug_htt_stats_req(struct ath10k
*ar
)
1162 lockdep_assert_held(&ar
->conf_mutex
);
1164 if (ar
->debug
.htt_stats_mask
== 0)
1165 /* htt stats are disabled */
1168 if (ar
->state
!= ATH10K_STATE_ON
)
1171 cookie
= get_jiffies_64();
1173 ret
= ath10k_htt_h2t_stats_req(&ar
->htt
, ar
->debug
.htt_stats_mask
,
1176 ath10k_warn(ar
, "failed to send htt stats request: %d\n", ret
);
1180 queue_delayed_work(ar
->workqueue
, &ar
->debug
.htt_stats_dwork
,
1181 msecs_to_jiffies(ATH10K_DEBUG_HTT_STATS_INTERVAL
));
1186 static void ath10k_debug_htt_stats_dwork(struct work_struct
*work
)
1188 struct ath10k
*ar
= container_of(work
, struct ath10k
,
1189 debug
.htt_stats_dwork
.work
);
1191 mutex_lock(&ar
->conf_mutex
);
1193 ath10k_debug_htt_stats_req(ar
);
1195 mutex_unlock(&ar
->conf_mutex
);
1198 static ssize_t
ath10k_read_htt_stats_mask(struct file
*file
,
1199 char __user
*user_buf
,
1200 size_t count
, loff_t
*ppos
)
1202 struct ath10k
*ar
= file
->private_data
;
1206 len
= scnprintf(buf
, sizeof(buf
), "%lu\n", ar
->debug
.htt_stats_mask
);
1208 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1211 static ssize_t
ath10k_write_htt_stats_mask(struct file
*file
,
1212 const char __user
*user_buf
,
1213 size_t count
, loff_t
*ppos
)
1215 struct ath10k
*ar
= file
->private_data
;
1219 ret
= kstrtoul_from_user(user_buf
, count
, 0, &mask
);
1223 /* max 8 bit masks (for now) */
1227 mutex_lock(&ar
->conf_mutex
);
1229 ar
->debug
.htt_stats_mask
= mask
;
1231 ret
= ath10k_debug_htt_stats_req(ar
);
1238 mutex_unlock(&ar
->conf_mutex
);
1243 static const struct file_operations fops_htt_stats_mask
= {
1244 .read
= ath10k_read_htt_stats_mask
,
1245 .write
= ath10k_write_htt_stats_mask
,
1246 .open
= simple_open
,
1247 .owner
= THIS_MODULE
,
1248 .llseek
= default_llseek
,
1251 static ssize_t
ath10k_read_htt_max_amsdu_ampdu(struct file
*file
,
1252 char __user
*user_buf
,
1253 size_t count
, loff_t
*ppos
)
1255 struct ath10k
*ar
= file
->private_data
;
1257 u8 amsdu
= 3, ampdu
= 64;
1260 mutex_lock(&ar
->conf_mutex
);
1262 if (ar
->debug
.htt_max_amsdu
)
1263 amsdu
= ar
->debug
.htt_max_amsdu
;
1265 if (ar
->debug
.htt_max_ampdu
)
1266 ampdu
= ar
->debug
.htt_max_ampdu
;
1268 mutex_unlock(&ar
->conf_mutex
);
1270 len
= scnprintf(buf
, sizeof(buf
), "%u %u\n", amsdu
, ampdu
);
1272 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1275 static ssize_t
ath10k_write_htt_max_amsdu_ampdu(struct file
*file
,
1276 const char __user
*user_buf
,
1277 size_t count
, loff_t
*ppos
)
1279 struct ath10k
*ar
= file
->private_data
;
1282 unsigned int amsdu
, ampdu
;
1284 simple_write_to_buffer(buf
, sizeof(buf
) - 1, ppos
, user_buf
, count
);
1286 /* make sure that buf is null terminated */
1287 buf
[sizeof(buf
) - 1] = 0;
1289 res
= sscanf(buf
, "%u %u", &amsdu
, &du
);
1294 mutex_lock(&ar
->conf_mutex
);
1296 res
= ath10k_htt_h2t_aggr_cfg_msg(&ar
->htt
, ampdu
, amsdu
);
1301 ar
->debug
.htt_max_amsdu
= amsdu
;
1302 ar
->debug
.htt_max_ampdu
= ampdu
;
1305 mutex_unlock(&ar
->conf_mutex
);
1309 static const struct file_operations fops_htt_max_amsdu_ampdu
= {
1310 .read
= ath10k_read_htt_max_amsdu_ampdu
,
1311 .write
= ath10k_write_htt_max_amsdu_ampdu
,
1312 .open
= simple_open
,
1313 .owner
= THIS_MODULE
,
1314 .llseek
= default_llseek
,
1317 static ssize_t
ath10k_read_fw_dbglog(struct file
*file
,
1318 char __user
*user_buf
,
1319 size_t count
, loff_t
*ppos
)
1321 struct ath10k
*ar
= file
->private_data
;
1325 len
= scnprintf(buf
, sizeof(buf
), "0x%08x\n",
1326 ar
->debug
.fw_dbglog_mask
);
1328 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1331 static ssize_t
ath10k_write_fw_dbglog(struct file
*file
,
1332 const char __user
*user_buf
,
1333 size_t count
, loff_t
*ppos
)
1335 struct ath10k
*ar
= file
->private_data
;
1339 ret
= kstrtoul_from_user(user_buf
, count
, 0, &mask
);
1343 mutex_lock(&ar
->conf_mutex
);
1345 ar
->debug
.fw_dbglog_mask
= mask
;
1347 if (ar
->state
== ATH10K_STATE_ON
) {
1348 ret
= ath10k_wmi_dbglog_cfg(ar
, ar
->debug
.fw_dbglog_mask
);
1350 ath10k_warn(ar
, "dbglog cfg failed from debugfs: %d\n",
1359 mutex_unlock(&ar
->conf_mutex
);
1364 /* TODO: Would be nice to always support ethtool stats, would need to
1365 * move the stats storage out of ath10k_debug, or always have ath10k_debug
1366 * struct available..
1369 /* This generally cooresponds to the debugfs fw_stats file */
1370 static const char ath10k_gstrings_stats
[][ETH_GSTRING_LEN
] = {
1380 "d_tx_power", /* in .5 dbM I think */
1381 "d_rx_crc_err", /* fcs_bad */
1383 "d_tx_mpdus_queued",
1385 "d_tx_msdu_dropped",
1388 "d_tx_ppdu_hw_queued",
1390 "d_tx_fifo_underrun",
1393 "d_tx_excessive_retries",
1395 "d_tx_dropped_sw_retries",
1396 "d_tx_illegal_rate",
1397 "d_tx_continuous_xretries",
1399 "d_tx_mpdu_txop_limit",
1401 "d_rx_mid_ppdu_route_change",
1403 "d_rx_extra_frags_ring0",
1404 "d_rx_extra_frags_ring1",
1405 "d_rx_extra_frags_ring2",
1406 "d_rx_extra_frags_ring3",
1412 "d_rx_phy_err_drops",
1413 "d_rx_mpdu_errors", /* FCS, MIC, ENC */
1415 "d_fw_warm_reset_count",
1416 "d_fw_cold_reset_count",
1419 #define ATH10K_SSTATS_LEN ARRAY_SIZE(ath10k_gstrings_stats)
1421 void ath10k_debug_get_et_strings(struct ieee80211_hw
*hw
,
1422 struct ieee80211_vif
*vif
,
1425 if (sset
== ETH_SS_STATS
)
1426 memcpy(data
, *ath10k_gstrings_stats
,
1427 sizeof(ath10k_gstrings_stats
));
1430 int ath10k_debug_get_et_sset_count(struct ieee80211_hw
*hw
,
1431 struct ieee80211_vif
*vif
, int sset
)
1433 if (sset
== ETH_SS_STATS
)
1434 return ATH10K_SSTATS_LEN
;
1439 void ath10k_debug_get_et_stats(struct ieee80211_hw
*hw
,
1440 struct ieee80211_vif
*vif
,
1441 struct ethtool_stats
*stats
, u64
*data
)
1443 struct ath10k
*ar
= hw
->priv
;
1444 static const struct ath10k_fw_stats_pdev zero_stats
= {};
1445 const struct ath10k_fw_stats_pdev
*pdev_stats
;
1448 mutex_lock(&ar
->conf_mutex
);
1450 if (ar
->state
== ATH10K_STATE_ON
) {
1451 ret
= ath10k_debug_fw_stats_request(ar
);
1453 /* just print a warning and try to use older results */
1455 "failed to get fw stats for ethtool: %d\n",
1460 pdev_stats
= list_first_entry_or_null(&ar
->debug
.fw_stats
.pdevs
,
1461 struct ath10k_fw_stats_pdev
,
1464 /* no results available so just return zeroes */
1465 pdev_stats
= &zero_stats
;
1468 spin_lock_bh(&ar
->data_lock
);
1470 data
[i
++] = pdev_stats
->hw_reaped
; /* ppdu reaped */
1471 data
[i
++] = 0; /* tx bytes */
1472 data
[i
++] = pdev_stats
->htt_mpdus
;
1473 data
[i
++] = 0; /* rx bytes */
1474 data
[i
++] = pdev_stats
->ch_noise_floor
;
1475 data
[i
++] = pdev_stats
->cycle_count
;
1476 data
[i
++] = pdev_stats
->phy_err_count
;
1477 data
[i
++] = pdev_stats
->rts_bad
;
1478 data
[i
++] = pdev_stats
->rts_good
;
1479 data
[i
++] = pdev_stats
->chan_tx_power
;
1480 data
[i
++] = pdev_stats
->fcs_bad
;
1481 data
[i
++] = pdev_stats
->no_beacons
;
1482 data
[i
++] = pdev_stats
->mpdu_enqued
;
1483 data
[i
++] = pdev_stats
->msdu_enqued
;
1484 data
[i
++] = pdev_stats
->wmm_drop
;
1485 data
[i
++] = pdev_stats
->local_enqued
;
1486 data
[i
++] = pdev_stats
->local_freed
;
1487 data
[i
++] = pdev_stats
->hw_queued
;
1488 data
[i
++] = pdev_stats
->hw_reaped
;
1489 data
[i
++] = pdev_stats
->underrun
;
1490 data
[i
++] = pdev_stats
->tx_abort
;
1491 data
[i
++] = pdev_stats
->mpdus_requed
;
1492 data
[i
++] = pdev_stats
->tx_ko
;
1493 data
[i
++] = pdev_stats
->data_rc
;
1494 data
[i
++] = pdev_stats
->sw_retry_failure
;
1495 data
[i
++] = pdev_stats
->illgl_rate_phy_err
;
1496 data
[i
++] = pdev_stats
->pdev_cont_xretry
;
1497 data
[i
++] = pdev_stats
->pdev_tx_timeout
;
1498 data
[i
++] = pdev_stats
->txop_ovf
;
1499 data
[i
++] = pdev_stats
->pdev_resets
;
1500 data
[i
++] = pdev_stats
->mid_ppdu_route_change
;
1501 data
[i
++] = pdev_stats
->status_rcvd
;
1502 data
[i
++] = pdev_stats
->r0_frags
;
1503 data
[i
++] = pdev_stats
->r1_frags
;
1504 data
[i
++] = pdev_stats
->r2_frags
;
1505 data
[i
++] = pdev_stats
->r3_frags
;
1506 data
[i
++] = pdev_stats
->htt_msdus
;
1507 data
[i
++] = pdev_stats
->htt_mpdus
;
1508 data
[i
++] = pdev_stats
->loc_msdus
;
1509 data
[i
++] = pdev_stats
->loc_mpdus
;
1510 data
[i
++] = pdev_stats
->phy_errs
;
1511 data
[i
++] = pdev_stats
->phy_err_drop
;
1512 data
[i
++] = pdev_stats
->mpdu_errs
;
1513 data
[i
++] = ar
->stats
.fw_crash_counter
;
1514 data
[i
++] = ar
->stats
.fw_warm_reset_counter
;
1515 data
[i
++] = ar
->stats
.fw_cold_reset_counter
;
1517 spin_unlock_bh(&ar
->data_lock
);
1519 mutex_unlock(&ar
->conf_mutex
);
1521 WARN_ON(i
!= ATH10K_SSTATS_LEN
);
1524 static const struct file_operations fops_fw_dbglog
= {
1525 .read
= ath10k_read_fw_dbglog
,
1526 .write
= ath10k_write_fw_dbglog
,
1527 .open
= simple_open
,
1528 .owner
= THIS_MODULE
,
1529 .llseek
= default_llseek
,
1532 static int ath10k_debug_cal_data_open(struct inode
*inode
, struct file
*file
)
1534 struct ath10k
*ar
= inode
->i_private
;
1540 mutex_lock(&ar
->conf_mutex
);
1542 if (ar
->state
!= ATH10K_STATE_ON
&&
1543 ar
->state
!= ATH10K_STATE_UTF
) {
1548 buf
= vmalloc(QCA988X_CAL_DATA_LEN
);
1554 hi_addr
= host_interest_item_address(HI_ITEM(hi_board_data
));
1556 ret
= ath10k_hif_diag_read(ar
, hi_addr
, &addr
, sizeof(addr
));
1558 ath10k_warn(ar
, "failed to read hi_board_data address: %d\n", ret
);
1562 ret
= ath10k_hif_diag_read(ar
, le32_to_cpu(addr
), buf
,
1563 QCA988X_CAL_DATA_LEN
);
1565 ath10k_warn(ar
, "failed to read calibration data: %d\n", ret
);
1569 file
->private_data
= buf
;
1571 mutex_unlock(&ar
->conf_mutex
);
1579 mutex_unlock(&ar
->conf_mutex
);
1584 static ssize_t
ath10k_debug_cal_data_read(struct file
*file
,
1585 char __user
*user_buf
,
1586 size_t count
, loff_t
*ppos
)
1588 void *buf
= file
->private_data
;
1590 return simple_read_from_buffer(user_buf
, count
, ppos
,
1591 buf
, QCA988X_CAL_DATA_LEN
);
1594 static int ath10k_debug_cal_data_release(struct inode
*inode
,
1597 vfree(file
->private_data
);
1602 static const struct file_operations fops_cal_data
= {
1603 .open
= ath10k_debug_cal_data_open
,
1604 .read
= ath10k_debug_cal_data_read
,
1605 .release
= ath10k_debug_cal_data_release
,
1606 .owner
= THIS_MODULE
,
1607 .llseek
= default_llseek
,
1610 int ath10k_debug_start(struct ath10k
*ar
)
1614 lockdep_assert_held(&ar
->conf_mutex
);
1616 ret
= ath10k_debug_htt_stats_req(ar
);
1618 /* continue normally anyway, this isn't serious */
1619 ath10k_warn(ar
, "failed to start htt stats workqueue: %d\n",
1622 if (ar
->debug
.fw_dbglog_mask
) {
1623 ret
= ath10k_wmi_dbglog_cfg(ar
, ar
->debug
.fw_dbglog_mask
);
1626 ath10k_warn(ar
, "failed to enable dbglog during start: %d",
1630 if (ar
->debug
.pktlog_filter
) {
1631 ret
= ath10k_wmi_pdev_pktlog_enable(ar
,
1632 ar
->debug
.pktlog_filter
);
1636 "failed to enable pktlog filter %x: %d\n",
1637 ar
->debug
.pktlog_filter
, ret
);
1639 ret
= ath10k_wmi_pdev_pktlog_disable(ar
);
1642 ath10k_warn(ar
, "failed to disable pktlog: %d\n", ret
);
1648 void ath10k_debug_stop(struct ath10k
*ar
)
1650 lockdep_assert_held(&ar
->conf_mutex
);
1652 /* Must not use _sync to avoid deadlock, we do that in
1653 * ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
1654 * warning from del_timer(). */
1655 if (ar
->debug
.htt_stats_mask
!= 0)
1656 cancel_delayed_work(&ar
->debug
.htt_stats_dwork
);
1658 ar
->debug
.htt_max_amsdu
= 0;
1659 ar
->debug
.htt_max_ampdu
= 0;
1661 ath10k_wmi_pdev_pktlog_disable(ar
);
1664 static ssize_t
ath10k_write_simulate_radar(struct file
*file
,
1665 const char __user
*user_buf
,
1666 size_t count
, loff_t
*ppos
)
1668 struct ath10k
*ar
= file
->private_data
;
1670 ieee80211_radar_detected(ar
->hw
);
1675 static const struct file_operations fops_simulate_radar
= {
1676 .write
= ath10k_write_simulate_radar
,
1677 .open
= simple_open
,
1678 .owner
= THIS_MODULE
,
1679 .llseek
= default_llseek
,
1682 #define ATH10K_DFS_STAT(s, p) (\
1683 len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1684 ar->debug.dfs_stats.p))
1686 #define ATH10K_DFS_POOL_STAT(s, p) (\
1687 len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
1688 ar->debug.dfs_pool_stats.p))
1690 static ssize_t
ath10k_read_dfs_stats(struct file
*file
, char __user
*user_buf
,
1691 size_t count
, loff_t
*ppos
)
1693 int retval
= 0, len
= 0;
1694 const int size
= 8000;
1695 struct ath10k
*ar
= file
->private_data
;
1698 buf
= kzalloc(size
, GFP_KERNEL
);
1702 if (!ar
->dfs_detector
) {
1703 len
+= scnprintf(buf
+ len
, size
- len
, "DFS not enabled\n");
1707 ar
->debug
.dfs_pool_stats
=
1708 ar
->dfs_detector
->get_stats(ar
->dfs_detector
);
1710 len
+= scnprintf(buf
+ len
, size
- len
, "Pulse detector statistics:\n");
1712 ATH10K_DFS_STAT("reported phy errors", phy_errors
);
1713 ATH10K_DFS_STAT("pulse events reported", pulses_total
);
1714 ATH10K_DFS_STAT("DFS pulses detected", pulses_detected
);
1715 ATH10K_DFS_STAT("DFS pulses discarded", pulses_discarded
);
1716 ATH10K_DFS_STAT("Radars detected", radar_detected
);
1718 len
+= scnprintf(buf
+ len
, size
- len
, "Global Pool statistics:\n");
1719 ATH10K_DFS_POOL_STAT("Pool references", pool_reference
);
1720 ATH10K_DFS_POOL_STAT("Pulses allocated", pulse_allocated
);
1721 ATH10K_DFS_POOL_STAT("Pulses alloc error", pulse_alloc_error
);
1722 ATH10K_DFS_POOL_STAT("Pulses in use", pulse_used
);
1723 ATH10K_DFS_POOL_STAT("Seqs. allocated", pseq_allocated
);
1724 ATH10K_DFS_POOL_STAT("Seqs. alloc error", pseq_alloc_error
);
1725 ATH10K_DFS_POOL_STAT("Seqs. in use", pseq_used
);
1731 retval
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1737 static const struct file_operations fops_dfs_stats
= {
1738 .read
= ath10k_read_dfs_stats
,
1739 .open
= simple_open
,
1740 .owner
= THIS_MODULE
,
1741 .llseek
= default_llseek
,
1744 static ssize_t
ath10k_write_pktlog_filter(struct file
*file
,
1745 const char __user
*ubuf
,
1746 size_t count
, loff_t
*ppos
)
1748 struct ath10k
*ar
= file
->private_data
;
1752 if (kstrtouint_from_user(ubuf
, count
, 0, &filter
))
1755 mutex_lock(&ar
->conf_mutex
);
1757 if (ar
->state
!= ATH10K_STATE_ON
) {
1758 ar
->debug
.pktlog_filter
= filter
;
1763 if (filter
&& (filter
!= ar
->debug
.pktlog_filter
)) {
1764 ret
= ath10k_wmi_pdev_pktlog_enable(ar
, filter
);
1766 ath10k_warn(ar
, "failed to enable pktlog filter %x: %d\n",
1767 ar
->debug
.pktlog_filter
, ret
);
1771 ret
= ath10k_wmi_pdev_pktlog_disable(ar
);
1773 ath10k_warn(ar
, "failed to disable pktlog: %d\n", ret
);
1778 ar
->debug
.pktlog_filter
= filter
;
1782 mutex_unlock(&ar
->conf_mutex
);
1786 static ssize_t
ath10k_read_pktlog_filter(struct file
*file
, char __user
*ubuf
,
1787 size_t count
, loff_t
*ppos
)
1790 struct ath10k
*ar
= file
->private_data
;
1793 mutex_lock(&ar
->conf_mutex
);
1794 len
= scnprintf(buf
, sizeof(buf
) - len
, "%08x\n",
1795 ar
->debug
.pktlog_filter
);
1796 mutex_unlock(&ar
->conf_mutex
);
1798 return simple_read_from_buffer(ubuf
, count
, ppos
, buf
, len
);
1801 static const struct file_operations fops_pktlog_filter
= {
1802 .read
= ath10k_read_pktlog_filter
,
1803 .write
= ath10k_write_pktlog_filter
,
1807 int ath10k_debug_create(struct ath10k
*ar
)
1809 ar
->debug
.fw_crash_data
= vzalloc(sizeof(*ar
->debug
.fw_crash_data
));
1810 if (!ar
->debug
.fw_crash_data
)
1813 INIT_LIST_HEAD(&ar
->debug
.fw_stats
.pdevs
);
1814 INIT_LIST_HEAD(&ar
->debug
.fw_stats
.peers
);
1819 void ath10k_debug_destroy(struct ath10k
*ar
)
1821 vfree(ar
->debug
.fw_crash_data
);
1822 ar
->debug
.fw_crash_data
= NULL
;
1824 ath10k_debug_fw_stats_reset(ar
);
1827 int ath10k_debug_register(struct ath10k
*ar
)
1829 ar
->debug
.debugfs_phy
= debugfs_create_dir("ath10k",
1830 ar
->hw
->wiphy
->debugfsdir
);
1831 if (IS_ERR_OR_NULL(ar
->debug
.debugfs_phy
)) {
1832 if (IS_ERR(ar
->debug
.debugfs_phy
))
1833 return PTR_ERR(ar
->debug
.debugfs_phy
);
1838 INIT_DELAYED_WORK(&ar
->debug
.htt_stats_dwork
,
1839 ath10k_debug_htt_stats_dwork
);
1841 init_completion(&ar
->debug
.fw_stats_complete
);
1843 debugfs_create_file("fw_stats", S_IRUSR
, ar
->debug
.debugfs_phy
, ar
,
1846 debugfs_create_file("fw_reset_stats", S_IRUSR
, ar
->debug
.debugfs_phy
,
1847 ar
, &fops_fw_reset_stats
);
1849 debugfs_create_file("wmi_services", S_IRUSR
, ar
->debug
.debugfs_phy
, ar
,
1850 &fops_wmi_services
);
1852 debugfs_create_file("simulate_fw_crash", S_IRUSR
, ar
->debug
.debugfs_phy
,
1853 ar
, &fops_simulate_fw_crash
);
1855 debugfs_create_file("fw_crash_dump", S_IRUSR
, ar
->debug
.debugfs_phy
,
1856 ar
, &fops_fw_crash_dump
);
1858 debugfs_create_file("reg_addr", S_IRUSR
| S_IWUSR
,
1859 ar
->debug
.debugfs_phy
, ar
, &fops_reg_addr
);
1861 debugfs_create_file("reg_value", S_IRUSR
| S_IWUSR
,
1862 ar
->debug
.debugfs_phy
, ar
, &fops_reg_value
);
1864 debugfs_create_file("mem_value", S_IRUSR
| S_IWUSR
,
1865 ar
->debug
.debugfs_phy
, ar
, &fops_mem_value
);
1867 debugfs_create_file("chip_id", S_IRUSR
, ar
->debug
.debugfs_phy
,
1870 debugfs_create_file("htt_stats_mask", S_IRUSR
, ar
->debug
.debugfs_phy
,
1871 ar
, &fops_htt_stats_mask
);
1873 debugfs_create_file("htt_max_amsdu_ampdu", S_IRUSR
| S_IWUSR
,
1874 ar
->debug
.debugfs_phy
, ar
,
1875 &fops_htt_max_amsdu_ampdu
);
1877 debugfs_create_file("fw_dbglog", S_IRUSR
, ar
->debug
.debugfs_phy
,
1878 ar
, &fops_fw_dbglog
);
1880 debugfs_create_file("cal_data", S_IRUSR
, ar
->debug
.debugfs_phy
,
1881 ar
, &fops_cal_data
);
1883 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
)) {
1884 debugfs_create_file("dfs_simulate_radar", S_IWUSR
,
1885 ar
->debug
.debugfs_phy
, ar
,
1886 &fops_simulate_radar
);
1888 debugfs_create_bool("dfs_block_radar_events", S_IWUSR
,
1889 ar
->debug
.debugfs_phy
,
1890 &ar
->dfs_block_radar_events
);
1892 debugfs_create_file("dfs_stats", S_IRUSR
,
1893 ar
->debug
.debugfs_phy
, ar
,
1897 debugfs_create_file("pktlog_filter", S_IRUGO
| S_IWUSR
,
1898 ar
->debug
.debugfs_phy
, ar
, &fops_pktlog_filter
);
1903 void ath10k_debug_unregister(struct ath10k
*ar
)
1905 cancel_delayed_work_sync(&ar
->debug
.htt_stats_dwork
);
1908 #endif /* CONFIG_ATH10K_DEBUGFS */
1910 #ifdef CONFIG_ATH10K_DEBUG
1911 void ath10k_dbg(struct ath10k
*ar
, enum ath10k_debug_mask mask
,
1912 const char *fmt
, ...)
1914 struct va_format vaf
;
1917 va_start(args
, fmt
);
1922 if (ath10k_debug_mask
& mask
)
1923 dev_printk(KERN_DEBUG
, ar
->dev
, "%pV", &vaf
);
1925 trace_ath10k_log_dbg(ar
, mask
, &vaf
);
1929 EXPORT_SYMBOL(ath10k_dbg
);
1931 void ath10k_dbg_dump(struct ath10k
*ar
,
1932 enum ath10k_debug_mask mask
,
1933 const char *msg
, const char *prefix
,
1934 const void *buf
, size_t len
)
1937 unsigned int linebuflen
;
1940 if (ath10k_debug_mask
& mask
) {
1942 ath10k_dbg(ar
, mask
, "%s\n", msg
);
1944 for (ptr
= buf
; (ptr
- buf
) < len
; ptr
+= 16) {
1946 linebuflen
+= scnprintf(linebuf
+ linebuflen
,
1947 sizeof(linebuf
) - linebuflen
,
1949 (prefix
? prefix
: ""),
1950 (unsigned int)(ptr
- buf
));
1951 hex_dump_to_buffer(ptr
, len
- (ptr
- buf
), 16, 1,
1952 linebuf
+ linebuflen
,
1953 sizeof(linebuf
) - linebuflen
, true);
1954 dev_printk(KERN_DEBUG
, ar
->dev
, "%s\n", linebuf
);
1958 /* tracing code doesn't like null strings :/ */
1959 trace_ath10k_log_dbg_dump(ar
, msg
? msg
: "", prefix
? prefix
: "",
1962 EXPORT_SYMBOL(ath10k_dbg_dump
);
1964 #endif /* CONFIG_ATH10K_DEBUG */