Lines Matching +full:open +full:- +full:firmware
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
71 dbr_debug = ar->debug.dbr_debug[id]; in ath11k_debugfs_add_dbring_entry()
75 if (!dbr_debug->dbr_debug_enabled) in ath11k_debugfs_add_dbring_entry()
78 dbr_data = &dbr_debug->dbr_dbg_data; in ath11k_debugfs_add_dbring_entry()
80 spin_lock_bh(&dbr_data->lock); in ath11k_debugfs_add_dbring_entry()
82 if (dbr_data->entries) { in ath11k_debugfs_add_dbring_entry()
83 entry = &dbr_data->entries[dbr_data->dbr_debug_idx]; in ath11k_debugfs_add_dbring_entry()
84 entry->hp = srng->u.src_ring.hp; in ath11k_debugfs_add_dbring_entry()
85 entry->tp = *srng->u.src_ring.tp_addr; in ath11k_debugfs_add_dbring_entry()
86 entry->timestamp = jiffies; in ath11k_debugfs_add_dbring_entry()
87 entry->event = event; in ath11k_debugfs_add_dbring_entry()
89 dbr_data->dbr_debug_idx++; in ath11k_debugfs_add_dbring_entry()
90 if (dbr_data->dbr_debug_idx == in ath11k_debugfs_add_dbring_entry()
91 dbr_data->num_ring_debug_entries) in ath11k_debugfs_add_dbring_entry()
92 dbr_data->dbr_debug_idx = 0; in ath11k_debugfs_add_dbring_entry()
95 spin_unlock_bh(&dbr_data->lock); in ath11k_debugfs_add_dbring_entry()
100 struct ath11k_base *ab = ar->ab; in ath11k_debugfs_fw_stats_process()
106 if (stats->stats_id == WMI_REQUEST_BCN_STAT) { in ath11k_debugfs_fw_stats_process()
107 if (list_empty(&stats->bcn)) { in ath11k_debugfs_fw_stats_process()
114 if (ar->num_started_vdevs) in ath11k_debugfs_fw_stats_process()
115 is_end = ((++ar->fw_stats.num_bcn_recvd) == in ath11k_debugfs_fw_stats_process()
116 ar->num_started_vdevs); in ath11k_debugfs_fw_stats_process()
118 list_splice_tail_init(&stats->bcn, in ath11k_debugfs_fw_stats_process()
119 &ar->fw_stats.bcn); in ath11k_debugfs_fw_stats_process()
122 complete(&ar->fw_stats_done); in ath11k_debugfs_fw_stats_process()
128 struct ath11k *ar = inode->i_private; in ath11k_open_pdev_stats()
129 struct ath11k_base *ab = ar->ab; in ath11k_open_pdev_stats()
134 mutex_lock(&ar->conf_mutex); in ath11k_open_pdev_stats()
136 if (ar->state != ATH11K_STATE_ON) { in ath11k_open_pdev_stats()
137 ret = -ENETDOWN; in ath11k_open_pdev_stats()
143 ret = -ENOMEM; in ath11k_open_pdev_stats()
147 req_param.pdev_id = ar->pdev->pdev_id; in ath11k_open_pdev_stats()
157 ath11k_wmi_fw_stats_fill(ar, &ar->fw_stats, req_param.stats_id, buf); in ath11k_open_pdev_stats()
159 file->private_data = buf; in ath11k_open_pdev_stats()
161 mutex_unlock(&ar->conf_mutex); in ath11k_open_pdev_stats()
168 mutex_unlock(&ar->conf_mutex); in ath11k_open_pdev_stats()
174 vfree(file->private_data); in ath11k_release_pdev_stats()
183 const char *buf = file->private_data; in ath11k_read_pdev_stats()
190 .open = ath11k_open_pdev_stats,
199 struct ath11k *ar = inode->i_private; in ath11k_open_vdev_stats()
204 mutex_lock(&ar->conf_mutex); in ath11k_open_vdev_stats()
206 if (ar->state != ATH11K_STATE_ON) { in ath11k_open_vdev_stats()
207 ret = -ENETDOWN; in ath11k_open_vdev_stats()
213 ret = -ENOMEM; in ath11k_open_vdev_stats()
217 req_param.pdev_id = ar->pdev->pdev_id; in ath11k_open_vdev_stats()
224 ath11k_warn(ar->ab, "failed to request fw vdev stats: %d\n", ret); in ath11k_open_vdev_stats()
228 ath11k_wmi_fw_stats_fill(ar, &ar->fw_stats, req_param.stats_id, buf); in ath11k_open_vdev_stats()
230 file->private_data = buf; in ath11k_open_vdev_stats()
232 mutex_unlock(&ar->conf_mutex); in ath11k_open_vdev_stats()
239 mutex_unlock(&ar->conf_mutex); in ath11k_open_vdev_stats()
245 vfree(file->private_data); in ath11k_release_vdev_stats()
254 const char *buf = file->private_data; in ath11k_read_vdev_stats()
261 .open = ath11k_open_vdev_stats,
270 struct ath11k *ar = inode->i_private; in ath11k_open_bcn_stats()
276 mutex_lock(&ar->conf_mutex); in ath11k_open_bcn_stats()
278 if (ar->state != ATH11K_STATE_ON) { in ath11k_open_bcn_stats()
279 ret = -ENETDOWN; in ath11k_open_bcn_stats()
285 ret = -ENOMEM; in ath11k_open_bcn_stats()
290 req_param.pdev_id = ar->pdev->pdev_id; in ath11k_open_bcn_stats()
293 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_open_bcn_stats()
294 if (!arvif->is_up) in ath11k_open_bcn_stats()
297 req_param.vdev_id = arvif->vdev_id; in ath11k_open_bcn_stats()
300 ath11k_warn(ar->ab, "failed to request fw bcn stats: %d\n", ret); in ath11k_open_bcn_stats()
305 ath11k_wmi_fw_stats_fill(ar, &ar->fw_stats, req_param.stats_id, buf); in ath11k_open_bcn_stats()
310 spin_lock_bh(&ar->data_lock); in ath11k_open_bcn_stats()
311 ath11k_fw_stats_bcn_free(&ar->fw_stats.bcn); in ath11k_open_bcn_stats()
312 spin_unlock_bh(&ar->data_lock); in ath11k_open_bcn_stats()
314 file->private_data = buf; in ath11k_open_bcn_stats()
316 mutex_unlock(&ar->conf_mutex); in ath11k_open_bcn_stats()
323 mutex_unlock(&ar->conf_mutex); in ath11k_open_bcn_stats()
329 vfree(file->private_data); in ath11k_release_bcn_stats()
338 const char *buf = file->private_data; in ath11k_read_bcn_stats()
345 .open = ath11k_open_bcn_stats,
357 "To simulate firmware crash write one of the keywords to this file:\n" in ath11k_read_simulate_fw_crash()
358 "`assert` - this will send WMI_FORCE_FW_HANG_CMDID to firmware to cause assert.\n" in ath11k_read_simulate_fw_crash()
359 "`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n"; in ath11k_read_simulate_fw_crash()
364 /* Simulate firmware crash:
365 * 'soft': Call wmi command causing firmware hang. This firmware hang is
366 * recoverable by warm firmware reset.
367 * 'hard': Force firmware crash by setting any vdev parameter for not allowed
368 * vdev id. This is hard firmware crash because it is recoverable only by cold
369 * firmware reset.
375 struct ath11k_base *ab = file->private_data; in ath11k_write_simulate_fw_crash()
377 struct ath11k *ar = ab->pdevs[0].ar; in ath11k_write_simulate_fw_crash()
382 for (i = 0; i < ab->num_radios; i++) { in ath11k_write_simulate_fw_crash()
383 pdev = &ab->pdevs[i]; in ath11k_write_simulate_fw_crash()
384 ar = pdev->ar; in ath11k_write_simulate_fw_crash()
385 if (ar && ar->state == ATH11K_STATE_ON) { in ath11k_write_simulate_fw_crash()
392 return -EINVAL; in ath11k_write_simulate_fw_crash()
394 rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count); in ath11k_write_simulate_fw_crash()
399 if (buf[*ppos - 1] == '\n') in ath11k_write_simulate_fw_crash()
400 buf[*ppos - 1] = '\0'; in ath11k_write_simulate_fw_crash()
403 ret = -ENETDOWN; in ath11k_write_simulate_fw_crash()
408 ath11k_info(ab, "simulating firmware assert crash\n"); in ath11k_write_simulate_fw_crash()
412 } else if (!strcmp(buf, "hw-restart")) { in ath11k_write_simulate_fw_crash()
414 queue_work(ab->workqueue_aux, &ab->reset_work); in ath11k_write_simulate_fw_crash()
417 ret = -EINVAL; in ath11k_write_simulate_fw_crash()
422 ath11k_warn(ab, "failed to simulate firmware crash: %d\n", ret); in ath11k_write_simulate_fw_crash()
435 .open = simple_open,
444 struct ath11k *ar = file->private_data; in ath11k_write_enable_extd_tx_stats()
449 return -EINVAL; in ath11k_write_enable_extd_tx_stats()
451 mutex_lock(&ar->conf_mutex); in ath11k_write_enable_extd_tx_stats()
453 if (ar->state != ATH11K_STATE_ON) { in ath11k_write_enable_extd_tx_stats()
454 ret = -ENETDOWN; in ath11k_write_enable_extd_tx_stats()
458 if (filter == ar->debug.extd_tx_stats) { in ath11k_write_enable_extd_tx_stats()
463 ar->debug.extd_tx_stats = filter; in ath11k_write_enable_extd_tx_stats()
467 mutex_unlock(&ar->conf_mutex); in ath11k_write_enable_extd_tx_stats()
477 struct ath11k *ar = file->private_data; in ath11k_read_enable_extd_tx_stats()
480 mutex_lock(&ar->conf_mutex); in ath11k_read_enable_extd_tx_stats()
481 len = scnprintf(buf, sizeof(buf) - len, "%08x\n", in ath11k_read_enable_extd_tx_stats()
482 ar->debug.extd_tx_stats); in ath11k_read_enable_extd_tx_stats()
483 mutex_unlock(&ar->conf_mutex); in ath11k_read_enable_extd_tx_stats()
491 .open = simple_open
498 struct ath11k *ar = file->private_data; in ath11k_write_extd_rx_stats()
499 struct ath11k_base *ab = ar->ab; in ath11k_write_extd_rx_stats()
506 return -EINVAL; in ath11k_write_extd_rx_stats()
508 mutex_lock(&ar->conf_mutex); in ath11k_write_extd_rx_stats()
510 if (ar->state != ATH11K_STATE_ON) { in ath11k_write_extd_rx_stats()
511 ret = -ENETDOWN; in ath11k_write_extd_rx_stats()
516 ret = -EINVAL; in ath11k_write_extd_rx_stats()
520 if (enable == ar->debug.extd_rx_stats) { in ath11k_write_extd_rx_stats()
525 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) { in ath11k_write_extd_rx_stats()
526 ar->debug.extd_rx_stats = enable; in ath11k_write_extd_rx_stats()
549 ar->debug.rx_filter = tlv_filter.rx_filter; in ath11k_write_extd_rx_stats()
551 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_write_extd_rx_stats()
552 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_write_extd_rx_stats()
553 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, ar->dp.mac_id, in ath11k_write_extd_rx_stats()
558 ath11k_warn(ar->ab, "failed to set rx filter for monitor status ring\n"); in ath11k_write_extd_rx_stats()
563 ar->debug.extd_rx_stats = enable; in ath11k_write_extd_rx_stats()
566 mutex_unlock(&ar->conf_mutex); in ath11k_write_extd_rx_stats()
574 struct ath11k *ar = file->private_data; in ath11k_read_extd_rx_stats()
578 mutex_lock(&ar->conf_mutex); in ath11k_read_extd_rx_stats()
579 len = scnprintf(buf, sizeof(buf) - len, "%d\n", in ath11k_read_extd_rx_stats()
580 ar->debug.extd_rx_stats); in ath11k_read_extd_rx_stats()
581 mutex_unlock(&ar->conf_mutex); in ath11k_read_extd_rx_stats()
589 .open = simple_open,
596 lockdep_assert_held(&ab->base_lock); in ath11k_fill_bp_stats()
598 len += scnprintf(buf + len, size - len, "count: %u\n", in ath11k_fill_bp_stats()
599 bp_stats->count); in ath11k_fill_bp_stats()
600 len += scnprintf(buf + len, size - len, "hp: %u\n", in ath11k_fill_bp_stats()
601 bp_stats->hp); in ath11k_fill_bp_stats()
602 len += scnprintf(buf + len, size - len, "tp: %u\n", in ath11k_fill_bp_stats()
603 bp_stats->tp); in ath11k_fill_bp_stats()
604 len += scnprintf(buf + len, size - len, "seen before: %ums\n\n", in ath11k_fill_bp_stats()
605 jiffies_to_msecs(jiffies - bp_stats->jiffies)); in ath11k_fill_bp_stats()
617 len += scnprintf(buf + len, size - len, "\nBackpressure Stats\n"); in ath11k_debugfs_dump_soc_ring_bp_stats()
618 len += scnprintf(buf + len, size - len, "==================\n"); in ath11k_debugfs_dump_soc_ring_bp_stats()
620 spin_lock_bh(&ab->base_lock); in ath11k_debugfs_dump_soc_ring_bp_stats()
622 bp_stats = &ab->soc_stats.bp_stats.umac_ring_bp_stats[i]; in ath11k_debugfs_dump_soc_ring_bp_stats()
624 if (!bp_stats->count) in ath11k_debugfs_dump_soc_ring_bp_stats()
627 len += scnprintf(buf + len, size - len, "Ring: %s\n", in ath11k_debugfs_dump_soc_ring_bp_stats()
636 &ab->soc_stats.bp_stats.lmac_ring_bp_stats[i][pdev_idx]; in ath11k_debugfs_dump_soc_ring_bp_stats()
638 if (!bp_stats->count) in ath11k_debugfs_dump_soc_ring_bp_stats()
641 len += scnprintf(buf + len, size - len, "Ring: %s\n", in ath11k_debugfs_dump_soc_ring_bp_stats()
643 len += scnprintf(buf + len, size - len, "pdev: %d\n", in ath11k_debugfs_dump_soc_ring_bp_stats()
649 spin_unlock_bh(&ab->base_lock); in ath11k_debugfs_dump_soc_ring_bp_stats()
652 len += scnprintf(buf + len, size - len, in ath11k_debugfs_dump_soc_ring_bp_stats()
662 struct ath11k_base *ab = file->private_data; in ath11k_debugfs_dump_soc_dp_stats()
663 struct ath11k_soc_dp_stats *soc_stats = &ab->soc_stats; in ath11k_debugfs_dump_soc_dp_stats()
682 return -ENOMEM; in ath11k_debugfs_dump_soc_dp_stats()
684 len += scnprintf(buf + len, size - len, "SOC RX STATS:\n\n"); in ath11k_debugfs_dump_soc_dp_stats()
685 len += scnprintf(buf + len, size - len, "err ring pkts: %u\n", in ath11k_debugfs_dump_soc_dp_stats()
686 soc_stats->err_ring_pkts); in ath11k_debugfs_dump_soc_dp_stats()
687 len += scnprintf(buf + len, size - len, "Invalid RBM: %u\n\n", in ath11k_debugfs_dump_soc_dp_stats()
688 soc_stats->invalid_rbm); in ath11k_debugfs_dump_soc_dp_stats()
689 len += scnprintf(buf + len, size - len, "RXDMA errors:\n"); in ath11k_debugfs_dump_soc_dp_stats()
691 len += scnprintf(buf + len, size - len, "%s: %u\n", in ath11k_debugfs_dump_soc_dp_stats()
692 rxdma_err[i], soc_stats->rxdma_error[i]); in ath11k_debugfs_dump_soc_dp_stats()
694 len += scnprintf(buf + len, size - len, "\nREO errors:\n"); in ath11k_debugfs_dump_soc_dp_stats()
696 len += scnprintf(buf + len, size - len, "%s: %u\n", in ath11k_debugfs_dump_soc_dp_stats()
697 reo_err[i], soc_stats->reo_error[i]); in ath11k_debugfs_dump_soc_dp_stats()
699 len += scnprintf(buf + len, size - len, "\nHAL REO errors:\n"); in ath11k_debugfs_dump_soc_dp_stats()
700 len += scnprintf(buf + len, size - len, in ath11k_debugfs_dump_soc_dp_stats()
702 soc_stats->hal_reo_error[0], in ath11k_debugfs_dump_soc_dp_stats()
703 soc_stats->hal_reo_error[1], in ath11k_debugfs_dump_soc_dp_stats()
704 soc_stats->hal_reo_error[2], in ath11k_debugfs_dump_soc_dp_stats()
705 soc_stats->hal_reo_error[3]); in ath11k_debugfs_dump_soc_dp_stats()
707 len += scnprintf(buf + len, size - len, "\nSOC TX STATS:\n"); in ath11k_debugfs_dump_soc_dp_stats()
708 len += scnprintf(buf + len, size - len, "\nTCL Ring Full Failures:\n"); in ath11k_debugfs_dump_soc_dp_stats()
710 for (i = 0; i < ab->hw_params.max_tx_ring; i++) in ath11k_debugfs_dump_soc_dp_stats()
711 len += scnprintf(buf + len, size - len, "ring%d: %u\n", in ath11k_debugfs_dump_soc_dp_stats()
712 i, soc_stats->tx_err.desc_na[i]); in ath11k_debugfs_dump_soc_dp_stats()
714 len += scnprintf(buf + len, size - len, in ath11k_debugfs_dump_soc_dp_stats()
716 atomic_read(&soc_stats->tx_err.misc_fail)); in ath11k_debugfs_dump_soc_dp_stats()
718 len += ath11k_debugfs_dump_soc_ring_bp_stats(ab, buf + len, size - len); in ath11k_debugfs_dump_soc_dp_stats()
730 .open = simple_open,
739 struct ath11k *ar = file->private_data; in ath11k_write_fw_dbglog()
746 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, in ath11k_write_fw_dbglog()
754 return -EINVAL; in ath11k_write_fw_dbglog()
756 mutex_lock(&ar->conf_mutex); in ath11k_write_fw_dbglog()
759 if (num != 4 || mod_id_index > (MAX_MODULE_ID_BITMAP_WORDS - 1)) { in ath11k_write_fw_dbglog()
760 ret = -EINVAL; in ath11k_write_fw_dbglog()
763 ar->debug.module_id_bitmap[mod_id_index] = upper_32_bits(value); in ath11k_write_fw_dbglog()
770 ret = -EINVAL; in ath11k_write_fw_dbglog()
777 ret = ath11k_wmi_fw_dbglog_cfg(ar, ar->debug.module_id_bitmap, &dbglog); in ath11k_write_fw_dbglog()
779 ath11k_warn(ar->ab, "fw dbglog config failed from debugfs: %d\n", in ath11k_write_fw_dbglog()
787 mutex_unlock(&ar->conf_mutex); in ath11k_write_fw_dbglog()
793 .open = simple_open,
800 struct ath11k_base *ab = inode->i_private; in ath11k_open_sram_dump()
805 start = ab->hw_params.sram_dump.start; in ath11k_open_sram_dump()
806 end = ab->hw_params.sram_dump.end; in ath11k_open_sram_dump()
808 buf = vmalloc(end - start + 1); in ath11k_open_sram_dump()
810 return -ENOMEM; in ath11k_open_sram_dump()
819 file->private_data = buf; in ath11k_open_sram_dump()
827 struct ath11k_base *ab = file->f_inode->i_private; in ath11k_read_sram_dump()
828 const char *buf = file->private_data; in ath11k_read_sram_dump()
832 start = ab->hw_params.sram_dump.start; in ath11k_read_sram_dump()
833 end = ab->hw_params.sram_dump.end; in ath11k_read_sram_dump()
834 len = end - start + 1; in ath11k_read_sram_dump()
841 vfree(file->private_data); in ath11k_release_sram_dump()
842 file->private_data = NULL; in ath11k_release_sram_dump()
848 .open = ath11k_open_sram_dump,
857 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) in ath11k_debugfs_pdev_create()
860 debugfs_create_file("simulate_fw_crash", 0600, ab->debugfs_soc, ab, in ath11k_debugfs_pdev_create()
863 debugfs_create_file("soc_dp_stats", 0400, ab->debugfs_soc, ab, in ath11k_debugfs_pdev_create()
866 if (ab->hw_params.sram_dump.start != 0) in ath11k_debugfs_pdev_create()
867 debugfs_create_file("sram", 0400, ab->debugfs_soc, ab, in ath11k_debugfs_pdev_create()
875 debugfs_remove_recursive(ab->debugfs_soc); in ath11k_debugfs_pdev_destroy()
876 ab->debugfs_soc = NULL; in ath11k_debugfs_pdev_destroy()
898 scnprintf(name, sizeof(name), "%s-%s", ath11k_bus_str(ab->hif.bus), in ath11k_debugfs_soc_create()
899 dev_name(ab->dev)); in ath11k_debugfs_soc_create()
901 ab->debugfs_soc = debugfs_create_dir(name, root); in ath11k_debugfs_soc_create()
902 if (IS_ERR_OR_NULL(ab->debugfs_soc)) { in ath11k_debugfs_soc_create()
903 ret = PTR_ERR(ab->debugfs_soc); in ath11k_debugfs_soc_create()
918 debugfs_remove_recursive(ab->debugfs_soc); in ath11k_debugfs_soc_destroy()
919 ab->debugfs_soc = NULL; in ath11k_debugfs_soc_destroy()
932 ar->debug.debugfs_pdev); in ath11k_debugfs_fw_stats_init()
934 ar->fw_stats.debugfs_fwstats = fwstats_dir; in ath11k_debugfs_fw_stats_init()
951 struct ath11k *ar = file->private_data; in ath11k_write_pktlog_filter()
952 struct ath11k_base *ab = ar->ab; in ath11k_write_pktlog_filter()
959 mutex_lock(&ar->conf_mutex); in ath11k_write_pktlog_filter()
960 if (ar->state != ATH11K_STATE_ON) { in ath11k_write_pktlog_filter()
961 ret = -ENETDOWN; in ath11k_write_pktlog_filter()
965 rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); in ath11k_write_pktlog_filter()
974 ret = -EINVAL; in ath11k_write_pktlog_filter()
981 ath11k_warn(ar->ab, in ath11k_write_pktlog_filter()
983 ar->debug.pktlog_filter, ret); in ath11k_write_pktlog_filter()
989 ath11k_warn(ar->ab, "failed to disable pktlog: %d\n", ret); in ath11k_write_pktlog_filter()
995 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_write_pktlog_filter()
996 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_write_pktlog_filter()
997 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, ar->dp.mac_id, in ath11k_write_pktlog_filter()
1001 ath11k_warn(ar->ab, "failed to set rx filter for monitor status ring\n"); in ath11k_write_pktlog_filter()
1025 ath11k_err(ar->ab, "failed to enable pktlog lite: %d\n", ret); in ath11k_write_pktlog_filter()
1039 ath11k_err(ar->ab, "failed to send htt ppdu stats req: %d\n", in ath11k_write_pktlog_filter()
1054 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_write_pktlog_filter()
1055 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_write_pktlog_filter()
1057 ar->dp.mac_id + i, in ath11k_write_pktlog_filter()
1070 ar->debug.pktlog_filter = filter; in ath11k_write_pktlog_filter()
1071 ar->debug.pktlog_mode = mode; in ath11k_write_pktlog_filter()
1075 mutex_unlock(&ar->conf_mutex); in ath11k_write_pktlog_filter()
1085 struct ath11k *ar = file->private_data; in ath11k_read_pktlog_filter()
1088 mutex_lock(&ar->conf_mutex); in ath11k_read_pktlog_filter()
1089 len = scnprintf(buf, sizeof(buf) - len, "%08x %08x\n", in ath11k_read_pktlog_filter()
1090 ar->debug.pktlog_filter, in ath11k_read_pktlog_filter()
1091 ar->debug.pktlog_mode); in ath11k_read_pktlog_filter()
1092 mutex_unlock(&ar->conf_mutex); in ath11k_read_pktlog_filter()
1100 .open = simple_open
1107 struct ath11k *ar = file->private_data; in ath11k_write_simulate_radar()
1119 .open = simple_open
1126 struct ath11k_dbg_dbr_data *dbr_dbg_data = file->private_data; in ath11k_debug_dump_dbr_entries()
1135 return -ENOMEM; in ath11k_debug_dump_dbr_entries()
1137 len += scnprintf(buf + len, size - len, in ath11k_debug_dump_dbr_entries()
1138 "-----------------------------------------\n"); in ath11k_debug_dump_dbr_entries()
1139 len += scnprintf(buf + len, size - len, in ath11k_debug_dump_dbr_entries()
1141 len += scnprintf(buf + len, size - len, in ath11k_debug_dump_dbr_entries()
1142 "-----------------------------------------\n"); in ath11k_debug_dump_dbr_entries()
1144 spin_lock_bh(&dbr_dbg_data->lock); in ath11k_debug_dump_dbr_entries()
1146 for (i = 0; i < dbr_dbg_data->num_ring_debug_entries; i++) { in ath11k_debug_dump_dbr_entries()
1147 len += scnprintf(buf + len, size - len, in ath11k_debug_dump_dbr_entries()
1149 dbr_dbg_data->entries[i].hp, in ath11k_debug_dump_dbr_entries()
1150 dbr_dbg_data->entries[i].tp, in ath11k_debug_dump_dbr_entries()
1151 dbr_dbg_data->entries[i].timestamp, in ath11k_debug_dump_dbr_entries()
1152 event_id_to_string[dbr_dbg_data->entries[i].event]); in ath11k_debug_dump_dbr_entries()
1155 spin_unlock_bh(&dbr_dbg_data->lock); in ath11k_debug_dump_dbr_entries()
1165 .open = simple_open,
1175 if (!ar->debug.dbr_debug[dbr_id]) in ath11k_debugfs_dbr_dbg_destroy()
1178 dbr_debug = ar->debug.dbr_debug[dbr_id]; in ath11k_debugfs_dbr_dbg_destroy()
1179 dbr_dbg_data = &dbr_debug->dbr_dbg_data; in ath11k_debugfs_dbr_dbg_destroy()
1181 debugfs_remove_recursive(dbr_debug->dbr_debugfs); in ath11k_debugfs_dbr_dbg_destroy()
1182 kfree(dbr_dbg_data->entries); in ath11k_debugfs_dbr_dbg_destroy()
1184 ar->debug.dbr_debug[dbr_id] = NULL; in ath11k_debugfs_dbr_dbg_destroy()
1193 if (ar->debug.dbr_debug[dbr_id]) in ath11k_debugfs_dbr_dbg_init()
1196 ar->debug.dbr_debug[dbr_id] = kzalloc(sizeof(*dbr_debug), in ath11k_debugfs_dbr_dbg_init()
1199 if (!ar->debug.dbr_debug[dbr_id]) in ath11k_debugfs_dbr_dbg_init()
1200 return -ENOMEM; in ath11k_debugfs_dbr_dbg_init()
1202 dbr_debug = ar->debug.dbr_debug[dbr_id]; in ath11k_debugfs_dbr_dbg_init()
1203 dbr_dbg_data = &dbr_debug->dbr_dbg_data; in ath11k_debugfs_dbr_dbg_init()
1205 if (dbr_debug->dbr_debugfs) in ath11k_debugfs_dbr_dbg_init()
1208 dbr_debug->dbr_debugfs = debugfs_create_dir(dbr_id_to_str[dbr_id], in ath11k_debugfs_dbr_dbg_init()
1209 ar->debug.debugfs_pdev); in ath11k_debugfs_dbr_dbg_init()
1210 if (IS_ERR_OR_NULL(dbr_debug->dbr_debugfs)) { in ath11k_debugfs_dbr_dbg_init()
1211 if (IS_ERR(dbr_debug->dbr_debugfs)) in ath11k_debugfs_dbr_dbg_init()
1212 return PTR_ERR(dbr_debug->dbr_debugfs); in ath11k_debugfs_dbr_dbg_init()
1213 return -ENOMEM; in ath11k_debugfs_dbr_dbg_init()
1216 dbr_debug->dbr_debug_enabled = true; in ath11k_debugfs_dbr_dbg_init()
1217 dbr_dbg_data->num_ring_debug_entries = ATH11K_DEBUG_DBR_ENTRIES_MAX; in ath11k_debugfs_dbr_dbg_init()
1218 dbr_dbg_data->dbr_debug_idx = 0; in ath11k_debugfs_dbr_dbg_init()
1219 dbr_dbg_data->entries = kcalloc(ATH11K_DEBUG_DBR_ENTRIES_MAX, in ath11k_debugfs_dbr_dbg_init()
1222 if (!dbr_dbg_data->entries) in ath11k_debugfs_dbr_dbg_init()
1223 return -ENOMEM; in ath11k_debugfs_dbr_dbg_init()
1225 spin_lock_init(&dbr_dbg_data->lock); in ath11k_debugfs_dbr_dbg_init()
1227 debugfs_create_file("dump_dbr_debug", 0444, dbr_debug->dbr_debugfs, in ath11k_debugfs_dbr_dbg_init()
1237 struct ath11k *ar = file->private_data; in ath11k_debugfs_write_enable_dbr_dbg()
1242 mutex_lock(&ar->conf_mutex); in ath11k_debugfs_write_enable_dbr_dbg()
1244 if (ar->state != ATH11K_STATE_ON) { in ath11k_debugfs_write_enable_dbr_dbg()
1245 ret = -ENETDOWN; in ath11k_debugfs_write_enable_dbr_dbg()
1249 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); in ath11k_debugfs_write_enable_dbr_dbg()
1256 ret = -EINVAL; in ath11k_debugfs_write_enable_dbr_dbg()
1257 …ath11k_warn(ar->ab, "usage: echo <dbr_id> <val> dbr_id:0-Spectral 1-CFR val:0-disable 1-enable\n"); in ath11k_debugfs_write_enable_dbr_dbg()
1264 ath11k_warn(ar->ab, "db ring module debugfs init failed: %d\n", in ath11k_debugfs_write_enable_dbr_dbg()
1274 mutex_unlock(&ar->conf_mutex); in ath11k_debugfs_write_enable_dbr_dbg()
1280 .open = simple_open,
1289 struct ath11k *ar = file->private_data; in ath11k_write_ps_timekeeper_enable()
1294 return -EINVAL; in ath11k_write_ps_timekeeper_enable()
1296 mutex_lock(&ar->conf_mutex); in ath11k_write_ps_timekeeper_enable()
1298 if (ar->state != ATH11K_STATE_ON) { in ath11k_write_ps_timekeeper_enable()
1299 ret = -ENETDOWN; in ath11k_write_ps_timekeeper_enable()
1303 if (!ar->ps_state_enable) { in ath11k_write_ps_timekeeper_enable()
1304 ret = -EINVAL; in ath11k_write_ps_timekeeper_enable()
1308 ar->ps_timekeeper_enable = !!ps_timekeeper_enable; in ath11k_write_ps_timekeeper_enable()
1311 mutex_unlock(&ar->conf_mutex); in ath11k_write_ps_timekeeper_enable()
1320 struct ath11k *ar = file->private_data; in ath11k_read_ps_timekeeper_enable()
1324 mutex_lock(&ar->conf_mutex); in ath11k_read_ps_timekeeper_enable()
1325 len = scnprintf(buf, sizeof(buf), "%d\n", ar->ps_timekeeper_enable); in ath11k_read_ps_timekeeper_enable()
1326 mutex_unlock(&ar->conf_mutex); in ath11k_read_ps_timekeeper_enable()
1334 .open = simple_open,
1345 spin_lock_bh(&ar->data_lock); in ath11k_reset_peer_ps_duration()
1346 arsta->ps_total_duration = 0; in ath11k_reset_peer_ps_duration()
1347 spin_unlock_bh(&ar->data_lock); in ath11k_reset_peer_ps_duration()
1354 struct ath11k *ar = file->private_data; in ath11k_write_reset_ps_duration()
1359 return -EINVAL; in ath11k_write_reset_ps_duration()
1361 mutex_lock(&ar->conf_mutex); in ath11k_write_reset_ps_duration()
1363 if (ar->state != ATH11K_STATE_ON) { in ath11k_write_reset_ps_duration()
1364 ret = -ENETDOWN; in ath11k_write_reset_ps_duration()
1368 if (!ar->ps_state_enable) { in ath11k_write_reset_ps_duration()
1369 ret = -EINVAL; in ath11k_write_reset_ps_duration()
1373 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_write_reset_ps_duration()
1379 mutex_unlock(&ar->conf_mutex); in ath11k_write_reset_ps_duration()
1385 .open = simple_open,
1396 spin_lock_bh(&ar->data_lock); in ath11k_peer_ps_state_disable()
1397 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED; in ath11k_peer_ps_state_disable()
1398 arsta->ps_start_time = 0; in ath11k_peer_ps_state_disable()
1399 arsta->ps_total_duration = 0; in ath11k_peer_ps_state_disable()
1400 spin_unlock_bh(&ar->data_lock); in ath11k_peer_ps_state_disable()
1407 struct ath11k *ar = file->private_data; in ath11k_write_ps_state_enable()
1408 struct ath11k_pdev *pdev = ar->pdev; in ath11k_write_ps_state_enable()
1414 return -EINVAL; in ath11k_write_ps_state_enable()
1416 mutex_lock(&ar->conf_mutex); in ath11k_write_ps_state_enable()
1420 if (ar->ps_state_enable == ps_state_enable) { in ath11k_write_ps_state_enable()
1426 ret = ath11k_wmi_pdev_set_param(ar, param, ps_state_enable, pdev->pdev_id); in ath11k_write_ps_state_enable()
1428 ath11k_warn(ar->ab, "failed to enable ps_state_enable: %d\n", in ath11k_write_ps_state_enable()
1432 ar->ps_state_enable = ps_state_enable; in ath11k_write_ps_state_enable()
1434 if (!ar->ps_state_enable) { in ath11k_write_ps_state_enable()
1435 ar->ps_timekeeper_enable = false; in ath11k_write_ps_state_enable()
1436 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_write_ps_state_enable()
1444 mutex_unlock(&ar->conf_mutex); in ath11k_write_ps_state_enable()
1453 struct ath11k *ar = file->private_data; in ath11k_read_ps_state_enable()
1457 mutex_lock(&ar->conf_mutex); in ath11k_read_ps_state_enable()
1458 len = scnprintf(buf, sizeof(buf), "%d\n", ar->ps_state_enable); in ath11k_read_ps_state_enable()
1459 mutex_unlock(&ar->conf_mutex); in ath11k_read_ps_state_enable()
1467 .open = simple_open,
1474 struct ath11k_base *ab = ar->ab; in ath11k_debugfs_register()
1478 snprintf(pdev_name, sizeof(pdev_name), "%s%u", "mac", ar->pdev_idx); in ath11k_debugfs_register()
1480 ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc); in ath11k_debugfs_register()
1481 if (IS_ERR(ar->debug.debugfs_pdev)) in ath11k_debugfs_register()
1482 return PTR_ERR(ar->debug.debugfs_pdev); in ath11k_debugfs_register()
1485 snprintf(buf, 100, "../../ath11k/%pd2", ar->debug.debugfs_pdev); in ath11k_debugfs_register()
1486 debugfs_create_symlink("ath11k", ar->hw->wiphy->debugfsdir, buf); in ath11k_debugfs_register()
1493 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1496 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1499 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1502 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1505 if (ar->hw->wiphy->bands[NL80211_BAND_5GHZ]) { in ath11k_debugfs_register()
1507 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1510 ar->debug.debugfs_pdev, in ath11k_debugfs_register()
1511 &ar->dfs_block_radar_events); in ath11k_debugfs_register()
1514 if (ab->hw_params.dbr_debug_support) in ath11k_debugfs_register()
1515 debugfs_create_file("enable_dbr_debug", 0200, ar->debug.debugfs_pdev, in ath11k_debugfs_register()
1518 debugfs_create_file("ps_state_enable", 0600, ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1522 ar->ab->wmi_ab.svc_map)) { in ath11k_debugfs_register()
1524 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1528 ar->debug.debugfs_pdev, ar, in ath11k_debugfs_register()
1542 dbr_debug = ar->debug.dbr_debug[i]; in ath11k_debugfs_unregister()
1546 dbr_dbg_data = &dbr_debug->dbr_dbg_data; in ath11k_debugfs_unregister()
1547 kfree(dbr_dbg_data->entries); in ath11k_debugfs_unregister()
1548 debugfs_remove_recursive(dbr_debug->dbr_debugfs); in ath11k_debugfs_unregister()
1550 ar->debug.dbr_debug[i] = NULL; in ath11k_debugfs_unregister()
1558 struct ath11k_vif *arvif = file->private_data; in ath11k_write_twt_add_dialog()
1561 struct ath11k *ar = arvif->ar; in ath11k_write_twt_add_dialog()
1565 if (ar->twt_enabled == 0) { in ath11k_write_twt_add_dialog()
1566 ath11k_err(ar->ab, "twt support is not enabled\n"); in ath11k_write_twt_add_dialog()
1567 return -EOPNOTSUPP; in ath11k_write_twt_add_dialog()
1570 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); in ath11k_write_twt_add_dialog()
1594 return -EINVAL; in ath11k_write_twt_add_dialog()
1597 * the firmware based on the input parameters in the TWT enable in ath11k_write_twt_add_dialog()
1603 if (arvif->vif->type == NL80211_IFTYPE_STATION) { in ath11k_write_twt_add_dialog()
1604 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath11k_write_twt_add_dialog()
1609 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, &twt_params); in ath11k_write_twt_add_dialog()
1612 params.vdev_id = arvif->vdev_id; in ath11k_write_twt_add_dialog()
1614 ret = ath11k_wmi_send_twt_add_dialog_cmd(arvif->ar, ¶ms); in ath11k_write_twt_add_dialog()
1621 if (arvif->vif->type == NL80211_IFTYPE_STATION) { in ath11k_write_twt_add_dialog()
1622 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath11k_write_twt_add_dialog()
1624 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, &twt_params); in ath11k_write_twt_add_dialog()
1634 struct ath11k_vif *arvif = file->private_data; in ath11k_write_twt_del_dialog()
1637 struct ath11k *ar = arvif->ar; in ath11k_write_twt_del_dialog()
1641 if (ar->twt_enabled == 0) { in ath11k_write_twt_del_dialog()
1642 ath11k_err(ar->ab, "twt support is not enabled\n"); in ath11k_write_twt_del_dialog()
1643 return -EOPNOTSUPP; in ath11k_write_twt_del_dialog()
1646 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); in ath11k_write_twt_del_dialog()
1660 return -EINVAL; in ath11k_write_twt_del_dialog()
1662 params.vdev_id = arvif->vdev_id; in ath11k_write_twt_del_dialog()
1664 ret = ath11k_wmi_send_twt_del_dialog_cmd(arvif->ar, ¶ms); in ath11k_write_twt_del_dialog()
1668 if (arvif->vif->type == NL80211_IFTYPE_STATION) { in ath11k_write_twt_del_dialog()
1669 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath11k_write_twt_del_dialog()
1671 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, &twt_params); in ath11k_write_twt_del_dialog()
1681 struct ath11k_vif *arvif = file->private_data; in ath11k_write_twt_pause_dialog()
1686 if (arvif->ar->twt_enabled == 0) { in ath11k_write_twt_pause_dialog()
1687 ath11k_err(arvif->ar->ab, "twt support is not enabled\n"); in ath11k_write_twt_pause_dialog()
1688 return -EOPNOTSUPP; in ath11k_write_twt_pause_dialog()
1691 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); in ath11k_write_twt_pause_dialog()
1705 return -EINVAL; in ath11k_write_twt_pause_dialog()
1707 params.vdev_id = arvif->vdev_id; in ath11k_write_twt_pause_dialog()
1709 ret = ath11k_wmi_send_twt_pause_dialog_cmd(arvif->ar, ¶ms); in ath11k_write_twt_pause_dialog()
1720 struct ath11k_vif *arvif = file->private_data; in ath11k_write_twt_resume_dialog()
1725 if (arvif->ar->twt_enabled == 0) { in ath11k_write_twt_resume_dialog()
1726 ath11k_err(arvif->ar->ab, "twt support is not enabled\n"); in ath11k_write_twt_resume_dialog()
1727 return -EOPNOTSUPP; in ath11k_write_twt_resume_dialog()
1730 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); in ath11k_write_twt_resume_dialog()
1746 return -EINVAL; in ath11k_write_twt_resume_dialog()
1748 params.vdev_id = arvif->vdev_id; in ath11k_write_twt_resume_dialog()
1750 ret = ath11k_wmi_send_twt_resume_dialog_cmd(arvif->ar, ¶ms); in ath11k_write_twt_resume_dialog()
1759 .open = simple_open
1764 .open = simple_open
1769 .open = simple_open
1774 .open = simple_open
1781 struct ath11k_base *ab = arvif->ar->ab; in ath11k_debugfs_op_vif_add()
1784 if (arvif->vif->type != NL80211_IFTYPE_AP && in ath11k_debugfs_op_vif_add()
1785 !(arvif->vif->type == NL80211_IFTYPE_STATION && in ath11k_debugfs_op_vif_add()
1786 test_bit(WMI_TLV_SERVICE_STA_TWT, ab->wmi_ab.svc_map))) in ath11k_debugfs_op_vif_add()
1790 arvif->vif->debugfs_dir); in ath11k_debugfs_op_vif_add()