1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
4  */
5 
6 #include <linux/vmalloc.h>
7 
8 #include "debugfs.h"
9 
10 #include "core.h"
11 #include "debug.h"
12 #include "wmi.h"
13 #include "hal_rx.h"
14 #include "dp_tx.h"
15 #include "debugfs_htt_stats.h"
16 #include "peer.h"
17 #include "hif.h"
18 
19 static const char *htt_bp_umac_ring[HTT_SW_UMAC_RING_IDX_MAX] = {
20 	"REO2SW1_RING",
21 	"REO2SW2_RING",
22 	"REO2SW3_RING",
23 	"REO2SW4_RING",
24 	"WBM2REO_LINK_RING",
25 	"REO2TCL_RING",
26 	"REO2FW_RING",
27 	"RELEASE_RING",
28 	"PPE_RELEASE_RING",
29 	"TCL2TQM_RING",
30 	"TQM_RELEASE_RING",
31 	"REO_RELEASE_RING",
32 	"WBM2SW0_RELEASE_RING",
33 	"WBM2SW1_RELEASE_RING",
34 	"WBM2SW2_RELEASE_RING",
35 	"WBM2SW3_RELEASE_RING",
36 	"REO_CMD_RING",
37 	"REO_STATUS_RING",
38 };
39 
40 static const char *htt_bp_lmac_ring[HTT_SW_LMAC_RING_IDX_MAX] = {
41 	"FW2RXDMA_BUF_RING",
42 	"FW2RXDMA_STATUS_RING",
43 	"FW2RXDMA_LINK_RING",
44 	"SW2RXDMA_BUF_RING",
45 	"WBM2RXDMA_LINK_RING",
46 	"RXDMA2FW_RING",
47 	"RXDMA2SW_RING",
48 	"RXDMA2RELEASE_RING",
49 	"RXDMA2REO_RING",
50 	"MONITOR_STATUS_RING",
51 	"MONITOR_BUF_RING",
52 	"MONITOR_DESC_RING",
53 	"MONITOR_DEST_RING",
54 };
55 
56 void ath11k_debugfs_add_dbring_entry(struct ath11k *ar,
57 				     enum wmi_direct_buffer_module id,
58 				     enum ath11k_dbg_dbr_event event,
59 				     struct hal_srng *srng)
60 {
61 	struct ath11k_debug_dbr *dbr_debug;
62 	struct ath11k_dbg_dbr_data *dbr_data;
63 	struct ath11k_dbg_dbr_entry *entry;
64 
65 	if (id >= WMI_DIRECT_BUF_MAX || event >= ATH11K_DBG_DBR_EVENT_MAX)
66 		return;
67 
68 	dbr_debug = ar->debug.dbr_debug[id];
69 	if (!dbr_debug)
70 		return;
71 
72 	if (!dbr_debug->dbr_debug_enabled)
73 		return;
74 
75 	dbr_data = &dbr_debug->dbr_dbg_data;
76 
77 	spin_lock_bh(&dbr_data->lock);
78 
79 	if (dbr_data->entries) {
80 		entry = &dbr_data->entries[dbr_data->dbr_debug_idx];
81 		entry->hp = srng->u.src_ring.hp;
82 		entry->tp = *srng->u.src_ring.tp_addr;
83 		entry->timestamp = jiffies;
84 		entry->event = event;
85 
86 		dbr_data->dbr_debug_idx++;
87 		if (dbr_data->dbr_debug_idx ==
88 		    dbr_data->num_ring_debug_entries)
89 			dbr_data->dbr_debug_idx = 0;
90 	}
91 
92 	spin_unlock_bh(&dbr_data->lock);
93 }
94 
95 static void ath11k_debugfs_fw_stats_reset(struct ath11k *ar)
96 {
97 	spin_lock_bh(&ar->data_lock);
98 	ar->fw_stats_done = false;
99 	ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
100 	ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs);
101 	spin_unlock_bh(&ar->data_lock);
102 }
103 
104 void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *stats)
105 {
106 	struct ath11k_base *ab = ar->ab;
107 	struct ath11k_pdev *pdev;
108 	bool is_end;
109 	static unsigned int num_vdev, num_bcn;
110 	size_t total_vdevs_started = 0;
111 	int i;
112 
113 	/* WMI_REQUEST_PDEV_STAT request has been already processed */
114 
115 	if (stats->stats_id == WMI_REQUEST_RSSI_PER_CHAIN_STAT) {
116 		ar->fw_stats_done = true;
117 		return;
118 	}
119 
120 	if (stats->stats_id == WMI_REQUEST_VDEV_STAT) {
121 		if (list_empty(&stats->vdevs)) {
122 			ath11k_warn(ab, "empty vdev stats");
123 			return;
124 		}
125 		/* FW sends all the active VDEV stats irrespective of PDEV,
126 		 * hence limit until the count of all VDEVs started
127 		 */
128 		for (i = 0; i < ab->num_radios; i++) {
129 			pdev = rcu_dereference(ab->pdevs_active[i]);
130 			if (pdev && pdev->ar)
131 				total_vdevs_started += ar->num_started_vdevs;
132 		}
133 
134 		is_end = ((++num_vdev) == total_vdevs_started);
135 
136 		list_splice_tail_init(&stats->vdevs,
137 				      &ar->fw_stats.vdevs);
138 
139 		if (is_end) {
140 			ar->fw_stats_done = true;
141 			num_vdev = 0;
142 		}
143 		return;
144 	}
145 
146 	if (stats->stats_id == WMI_REQUEST_BCN_STAT) {
147 		if (list_empty(&stats->bcn)) {
148 			ath11k_warn(ab, "empty bcn stats");
149 			return;
150 		}
151 		/* Mark end until we reached the count of all started VDEVs
152 		 * within the PDEV
153 		 */
154 		is_end = ((++num_bcn) == ar->num_started_vdevs);
155 
156 		list_splice_tail_init(&stats->bcn,
157 				      &ar->fw_stats.bcn);
158 
159 		if (is_end) {
160 			ar->fw_stats_done = true;
161 			num_bcn = 0;
162 		}
163 	}
164 }
165 
166 static int ath11k_debugfs_fw_stats_request(struct ath11k *ar,
167 					   struct stats_request_params *req_param)
168 {
169 	struct ath11k_base *ab = ar->ab;
170 	unsigned long timeout, time_left;
171 	int ret;
172 
173 	lockdep_assert_held(&ar->conf_mutex);
174 
175 	/* FW stats can get split when exceeding the stats data buffer limit.
176 	 * In that case, since there is no end marking for the back-to-back
177 	 * received 'update stats' event, we keep a 3 seconds timeout in case,
178 	 * fw_stats_done is not marked yet
179 	 */
180 	timeout = jiffies + msecs_to_jiffies(3 * 1000);
181 
182 	ath11k_debugfs_fw_stats_reset(ar);
183 
184 	reinit_completion(&ar->fw_stats_complete);
185 
186 	ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
187 
188 	if (ret) {
189 		ath11k_warn(ab, "could not request fw stats (%d)\n",
190 			    ret);
191 		return ret;
192 	}
193 
194 	time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
195 
196 	if (!time_left)
197 		return -ETIMEDOUT;
198 
199 	for (;;) {
200 		if (time_after(jiffies, timeout))
201 			break;
202 
203 		spin_lock_bh(&ar->data_lock);
204 		if (ar->fw_stats_done) {
205 			spin_unlock_bh(&ar->data_lock);
206 			break;
207 		}
208 		spin_unlock_bh(&ar->data_lock);
209 	}
210 	return 0;
211 }
212 
213 int ath11k_debugfs_get_fw_stats(struct ath11k *ar, u32 pdev_id,
214 				u32 vdev_id, u32 stats_id)
215 {
216 	struct ath11k_base *ab = ar->ab;
217 	struct stats_request_params req_param;
218 	int ret;
219 
220 	mutex_lock(&ar->conf_mutex);
221 
222 	if (ar->state != ATH11K_STATE_ON) {
223 		ret = -ENETDOWN;
224 		goto err_unlock;
225 	}
226 
227 	req_param.pdev_id = pdev_id;
228 	req_param.vdev_id = vdev_id;
229 	req_param.stats_id = stats_id;
230 
231 	ret = ath11k_debugfs_fw_stats_request(ar, &req_param);
232 	if (ret)
233 		ath11k_warn(ab, "failed to request fw stats: %d\n", ret);
234 
235 	ath11k_dbg(ab, ATH11K_DBG_WMI,
236 		   "debug get fw stat pdev id %d vdev id %d stats id 0x%x\n",
237 		   pdev_id, vdev_id, stats_id);
238 
239 err_unlock:
240 	mutex_unlock(&ar->conf_mutex);
241 
242 	return ret;
243 }
244 
245 static int ath11k_open_pdev_stats(struct inode *inode, struct file *file)
246 {
247 	struct ath11k *ar = inode->i_private;
248 	struct ath11k_base *ab = ar->ab;
249 	struct stats_request_params req_param;
250 	void *buf = NULL;
251 	int ret;
252 
253 	mutex_lock(&ar->conf_mutex);
254 
255 	if (ar->state != ATH11K_STATE_ON) {
256 		ret = -ENETDOWN;
257 		goto err_unlock;
258 	}
259 
260 	buf = vmalloc(ATH11K_FW_STATS_BUF_SIZE);
261 	if (!buf) {
262 		ret = -ENOMEM;
263 		goto err_unlock;
264 	}
265 
266 	req_param.pdev_id = ar->pdev->pdev_id;
267 	req_param.vdev_id = 0;
268 	req_param.stats_id = WMI_REQUEST_PDEV_STAT;
269 
270 	ret = ath11k_debugfs_fw_stats_request(ar, &req_param);
271 	if (ret) {
272 		ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
273 		goto err_free;
274 	}
275 
276 	ath11k_wmi_fw_stats_fill(ar, &ar->fw_stats, req_param.stats_id, buf);
277 
278 	file->private_data = buf;
279 
280 	mutex_unlock(&ar->conf_mutex);
281 	return 0;
282 
283 err_free:
284 	vfree(buf);
285 
286 err_unlock:
287 	mutex_unlock(&ar->conf_mutex);
288 	return ret;
289 }
290 
291 static int ath11k_release_pdev_stats(struct inode *inode, struct file *file)
292 {
293 	vfree(file->private_data);
294 
295 	return 0;
296 }
297 
298 static ssize_t ath11k_read_pdev_stats(struct file *file,
299 				      char __user *user_buf,
300 				      size_t count, loff_t *ppos)
301 {
302 	const char *buf = file->private_data;
303 	size_t len = strlen(buf);
304 
305 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
306 }
307 
308 static const struct file_operations fops_pdev_stats = {
309 	.open = ath11k_open_pdev_stats,
310 	.release = ath11k_release_pdev_stats,
311 	.read = ath11k_read_pdev_stats,
312 	.owner = THIS_MODULE,
313 	.llseek = default_llseek,
314 };
315 
316 static int ath11k_open_vdev_stats(struct inode *inode, struct file *file)
317 {
318 	struct ath11k *ar = inode->i_private;
319 	struct stats_request_params req_param;
320 	void *buf = NULL;
321 	int ret;
322 
323 	mutex_lock(&ar->conf_mutex);
324 
325 	if (ar->state != ATH11K_STATE_ON) {
326 		ret = -ENETDOWN;
327 		goto err_unlock;
328 	}
329 
330 	buf = vmalloc(ATH11K_FW_STATS_BUF_SIZE);
331 	if (!buf) {
332 		ret = -ENOMEM;
333 		goto err_unlock;
334 	}
335 
336 	req_param.pdev_id = ar->pdev->pdev_id;
337 	/* VDEV stats is always sent for all active VDEVs from FW */
338 	req_param.vdev_id = 0;
339 	req_param.stats_id = WMI_REQUEST_VDEV_STAT;
340 
341 	ret = ath11k_debugfs_fw_stats_request(ar, &req_param);
342 	if (ret) {
343 		ath11k_warn(ar->ab, "failed to request fw vdev stats: %d\n", ret);
344 		goto err_free;
345 	}
346 
347 	ath11k_wmi_fw_stats_fill(ar, &ar->fw_stats, req_param.stats_id, buf);
348 
349 	file->private_data = buf;
350 
351 	mutex_unlock(&ar->conf_mutex);
352 	return 0;
353 
354 err_free:
355 	vfree(buf);
356 
357 err_unlock:
358 	mutex_unlock(&ar->conf_mutex);
359 	return ret;
360 }
361 
362 static int ath11k_release_vdev_stats(struct inode *inode, struct file *file)
363 {
364 	vfree(file->private_data);
365 
366 	return 0;
367 }
368 
369 static ssize_t ath11k_read_vdev_stats(struct file *file,
370 				      char __user *user_buf,
371 				      size_t count, loff_t *ppos)
372 {
373 	const char *buf = file->private_data;
374 	size_t len = strlen(buf);
375 
376 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
377 }
378 
379 static const struct file_operations fops_vdev_stats = {
380 	.open = ath11k_open_vdev_stats,
381 	.release = ath11k_release_vdev_stats,
382 	.read = ath11k_read_vdev_stats,
383 	.owner = THIS_MODULE,
384 	.llseek = default_llseek,
385 };
386 
387 static int ath11k_open_bcn_stats(struct inode *inode, struct file *file)
388 {
389 	struct ath11k *ar = inode->i_private;
390 	struct ath11k_vif *arvif;
391 	struct stats_request_params req_param;
392 	void *buf = NULL;
393 	int ret;
394 
395 	mutex_lock(&ar->conf_mutex);
396 
397 	if (ar->state != ATH11K_STATE_ON) {
398 		ret = -ENETDOWN;
399 		goto err_unlock;
400 	}
401 
402 	buf = vmalloc(ATH11K_FW_STATS_BUF_SIZE);
403 	if (!buf) {
404 		ret = -ENOMEM;
405 		goto err_unlock;
406 	}
407 
408 	req_param.stats_id = WMI_REQUEST_BCN_STAT;
409 	req_param.pdev_id = ar->pdev->pdev_id;
410 
411 	/* loop all active VDEVs for bcn stats */
412 	list_for_each_entry(arvif, &ar->arvifs, list) {
413 		if (!arvif->is_up)
414 			continue;
415 
416 		req_param.vdev_id = arvif->vdev_id;
417 		ret = ath11k_debugfs_fw_stats_request(ar, &req_param);
418 		if (ret) {
419 			ath11k_warn(ar->ab, "failed to request fw bcn stats: %d\n", ret);
420 			goto err_free;
421 		}
422 	}
423 
424 	ath11k_wmi_fw_stats_fill(ar, &ar->fw_stats, req_param.stats_id, buf);
425 
426 	/* since beacon stats request is looped for all active VDEVs, saved fw
427 	 * stats is not freed for each request until done for all active VDEVs
428 	 */
429 	spin_lock_bh(&ar->data_lock);
430 	ath11k_fw_stats_bcn_free(&ar->fw_stats.bcn);
431 	spin_unlock_bh(&ar->data_lock);
432 
433 	file->private_data = buf;
434 
435 	mutex_unlock(&ar->conf_mutex);
436 	return 0;
437 
438 err_free:
439 	vfree(buf);
440 
441 err_unlock:
442 	mutex_unlock(&ar->conf_mutex);
443 	return ret;
444 }
445 
446 static int ath11k_release_bcn_stats(struct inode *inode, struct file *file)
447 {
448 	vfree(file->private_data);
449 
450 	return 0;
451 }
452 
453 static ssize_t ath11k_read_bcn_stats(struct file *file,
454 				     char __user *user_buf,
455 				     size_t count, loff_t *ppos)
456 {
457 	const char *buf = file->private_data;
458 	size_t len = strlen(buf);
459 
460 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
461 }
462 
463 static const struct file_operations fops_bcn_stats = {
464 	.open = ath11k_open_bcn_stats,
465 	.release = ath11k_release_bcn_stats,
466 	.read = ath11k_read_bcn_stats,
467 	.owner = THIS_MODULE,
468 	.llseek = default_llseek,
469 };
470 
471 static ssize_t ath11k_read_simulate_fw_crash(struct file *file,
472 					     char __user *user_buf,
473 					     size_t count, loff_t *ppos)
474 {
475 	const char buf[] =
476 		"To simulate firmware crash write one of the keywords to this file:\n"
477 		"`assert` - this will send WMI_FORCE_FW_HANG_CMDID to firmware to cause assert.\n"
478 		"`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n";
479 
480 	return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
481 }
482 
483 /* Simulate firmware crash:
484  * 'soft': Call wmi command causing firmware hang. This firmware hang is
485  * recoverable by warm firmware reset.
486  * 'hard': Force firmware crash by setting any vdev parameter for not allowed
487  * vdev id. This is hard firmware crash because it is recoverable only by cold
488  * firmware reset.
489  */
490 static ssize_t ath11k_write_simulate_fw_crash(struct file *file,
491 					      const char __user *user_buf,
492 					      size_t count, loff_t *ppos)
493 {
494 	struct ath11k_base *ab = file->private_data;
495 	struct ath11k_pdev *pdev;
496 	struct ath11k *ar = ab->pdevs[0].ar;
497 	char buf[32] = {0};
498 	ssize_t rc;
499 	int i, ret, radioup = 0;
500 
501 	for (i = 0; i < ab->num_radios; i++) {
502 		pdev = &ab->pdevs[i];
503 		ar = pdev->ar;
504 		if (ar && ar->state == ATH11K_STATE_ON) {
505 			radioup = 1;
506 			break;
507 		}
508 	}
509 	/* filter partial writes and invalid commands */
510 	if (*ppos != 0 || count >= sizeof(buf) || count == 0)
511 		return -EINVAL;
512 
513 	rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
514 	if (rc < 0)
515 		return rc;
516 
517 	/* drop the possible '\n' from the end */
518 	if (buf[*ppos - 1] == '\n')
519 		buf[*ppos - 1] = '\0';
520 
521 	if (radioup == 0) {
522 		ret = -ENETDOWN;
523 		goto exit;
524 	}
525 
526 	if (!strcmp(buf, "assert")) {
527 		ath11k_info(ab, "simulating firmware assert crash\n");
528 		ret = ath11k_wmi_force_fw_hang_cmd(ar,
529 						   ATH11K_WMI_FW_HANG_ASSERT_TYPE,
530 						   ATH11K_WMI_FW_HANG_DELAY);
531 	} else if (!strcmp(buf, "hw-restart")) {
532 		ath11k_info(ab, "user requested hw restart\n");
533 		queue_work(ab->workqueue_aux, &ab->reset_work);
534 		ret = 0;
535 	} else {
536 		ret = -EINVAL;
537 		goto exit;
538 	}
539 
540 	if (ret) {
541 		ath11k_warn(ab, "failed to simulate firmware crash: %d\n", ret);
542 		goto exit;
543 	}
544 
545 	ret = count;
546 
547 exit:
548 	return ret;
549 }
550 
551 static const struct file_operations fops_simulate_fw_crash = {
552 	.read = ath11k_read_simulate_fw_crash,
553 	.write = ath11k_write_simulate_fw_crash,
554 	.open = simple_open,
555 	.owner = THIS_MODULE,
556 	.llseek = default_llseek,
557 };
558 
559 static ssize_t ath11k_write_enable_extd_tx_stats(struct file *file,
560 						 const char __user *ubuf,
561 						 size_t count, loff_t *ppos)
562 {
563 	struct ath11k *ar = file->private_data;
564 	u32 filter;
565 	int ret;
566 
567 	if (kstrtouint_from_user(ubuf, count, 0, &filter))
568 		return -EINVAL;
569 
570 	mutex_lock(&ar->conf_mutex);
571 
572 	if (ar->state != ATH11K_STATE_ON) {
573 		ret = -ENETDOWN;
574 		goto out;
575 	}
576 
577 	if (filter == ar->debug.extd_tx_stats) {
578 		ret = count;
579 		goto out;
580 	}
581 
582 	ar->debug.extd_tx_stats = filter;
583 	ret = count;
584 
585 out:
586 	mutex_unlock(&ar->conf_mutex);
587 	return ret;
588 }
589 
590 static ssize_t ath11k_read_enable_extd_tx_stats(struct file *file,
591 						char __user *ubuf,
592 						size_t count, loff_t *ppos)
593 
594 {
595 	char buf[32] = {0};
596 	struct ath11k *ar = file->private_data;
597 	int len = 0;
598 
599 	mutex_lock(&ar->conf_mutex);
600 	len = scnprintf(buf, sizeof(buf) - len, "%08x\n",
601 			ar->debug.extd_tx_stats);
602 	mutex_unlock(&ar->conf_mutex);
603 
604 	return simple_read_from_buffer(ubuf, count, ppos, buf, len);
605 }
606 
607 static const struct file_operations fops_extd_tx_stats = {
608 	.read = ath11k_read_enable_extd_tx_stats,
609 	.write = ath11k_write_enable_extd_tx_stats,
610 	.open = simple_open
611 };
612 
613 static ssize_t ath11k_write_extd_rx_stats(struct file *file,
614 					  const char __user *ubuf,
615 					  size_t count, loff_t *ppos)
616 {
617 	struct ath11k *ar = file->private_data;
618 	struct ath11k_base *ab = ar->ab;
619 	struct htt_rx_ring_tlv_filter tlv_filter = {0};
620 	u32 enable, rx_filter = 0, ring_id;
621 	int i;
622 	int ret;
623 
624 	if (kstrtouint_from_user(ubuf, count, 0, &enable))
625 		return -EINVAL;
626 
627 	mutex_lock(&ar->conf_mutex);
628 
629 	if (ar->state != ATH11K_STATE_ON) {
630 		ret = -ENETDOWN;
631 		goto exit;
632 	}
633 
634 	if (enable > 1) {
635 		ret = -EINVAL;
636 		goto exit;
637 	}
638 
639 	if (enable == ar->debug.extd_rx_stats) {
640 		ret = count;
641 		goto exit;
642 	}
643 
644 	if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
645 		ar->debug.extd_rx_stats = enable;
646 		ret = count;
647 		goto exit;
648 	}
649 
650 	if (enable) {
651 		rx_filter =  HTT_RX_FILTER_TLV_FLAGS_MPDU_START;
652 		rx_filter |= HTT_RX_FILTER_TLV_FLAGS_PPDU_START;
653 		rx_filter |= HTT_RX_FILTER_TLV_FLAGS_PPDU_END;
654 		rx_filter |= HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS;
655 		rx_filter |= HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS_EXT;
656 		rx_filter |= HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE;
657 
658 		tlv_filter.rx_filter = rx_filter;
659 		tlv_filter.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0;
660 		tlv_filter.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1;
661 		tlv_filter.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2;
662 		tlv_filter.pkt_filter_flags3 = HTT_RX_FP_CTRL_FILTER_FLASG3 |
663 			HTT_RX_FP_DATA_FILTER_FLASG3;
664 	} else {
665 		tlv_filter = ath11k_mac_mon_status_filter_default;
666 	}
667 
668 	ar->debug.rx_filter = tlv_filter.rx_filter;
669 
670 	for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
671 		ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
672 		ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, ar->dp.mac_id,
673 						       HAL_RXDMA_MONITOR_STATUS,
674 						       DP_RX_BUFFER_SIZE, &tlv_filter);
675 
676 		if (ret) {
677 			ath11k_warn(ar->ab, "failed to set rx filter for monitor status ring\n");
678 			goto exit;
679 		}
680 	}
681 
682 	ar->debug.extd_rx_stats = enable;
683 	ret = count;
684 exit:
685 	mutex_unlock(&ar->conf_mutex);
686 	return ret;
687 }
688 
689 static ssize_t ath11k_read_extd_rx_stats(struct file *file,
690 					 char __user *ubuf,
691 					 size_t count, loff_t *ppos)
692 {
693 	struct ath11k *ar = file->private_data;
694 	char buf[32];
695 	int len = 0;
696 
697 	mutex_lock(&ar->conf_mutex);
698 	len = scnprintf(buf, sizeof(buf) - len, "%d\n",
699 			ar->debug.extd_rx_stats);
700 	mutex_unlock(&ar->conf_mutex);
701 
702 	return simple_read_from_buffer(ubuf, count, ppos, buf, len);
703 }
704 
705 static const struct file_operations fops_extd_rx_stats = {
706 	.read = ath11k_read_extd_rx_stats,
707 	.write = ath11k_write_extd_rx_stats,
708 	.open = simple_open,
709 };
710 
711 static int ath11k_fill_bp_stats(struct ath11k_base *ab,
712 				struct ath11k_bp_stats *bp_stats,
713 				char *buf, int len, int size)
714 {
715 	lockdep_assert_held(&ab->base_lock);
716 
717 	len += scnprintf(buf + len, size - len, "count: %u\n",
718 			 bp_stats->count);
719 	len += scnprintf(buf + len, size - len, "hp: %u\n",
720 			 bp_stats->hp);
721 	len += scnprintf(buf + len, size - len, "tp: %u\n",
722 			 bp_stats->tp);
723 	len += scnprintf(buf + len, size - len, "seen before: %ums\n\n",
724 			 jiffies_to_msecs(jiffies - bp_stats->jiffies));
725 	return len;
726 }
727 
728 static ssize_t ath11k_debugfs_dump_soc_ring_bp_stats(struct ath11k_base *ab,
729 						     char *buf, int size)
730 {
731 	struct ath11k_bp_stats *bp_stats;
732 	bool stats_rxd = false;
733 	u8 i, pdev_idx;
734 	int len = 0;
735 
736 	len += scnprintf(buf + len, size - len, "\nBackpressure Stats\n");
737 	len += scnprintf(buf + len, size - len, "==================\n");
738 
739 	spin_lock_bh(&ab->base_lock);
740 	for (i = 0; i < HTT_SW_UMAC_RING_IDX_MAX; i++) {
741 		bp_stats = &ab->soc_stats.bp_stats.umac_ring_bp_stats[i];
742 
743 		if (!bp_stats->count)
744 			continue;
745 
746 		len += scnprintf(buf + len, size - len, "Ring: %s\n",
747 				 htt_bp_umac_ring[i]);
748 		len = ath11k_fill_bp_stats(ab, bp_stats, buf, len, size);
749 		stats_rxd = true;
750 	}
751 
752 	for (i = 0; i < HTT_SW_LMAC_RING_IDX_MAX; i++) {
753 		for (pdev_idx = 0; pdev_idx < MAX_RADIOS; pdev_idx++) {
754 			bp_stats =
755 				&ab->soc_stats.bp_stats.lmac_ring_bp_stats[i][pdev_idx];
756 
757 			if (!bp_stats->count)
758 				continue;
759 
760 			len += scnprintf(buf + len, size - len, "Ring: %s\n",
761 					 htt_bp_lmac_ring[i]);
762 			len += scnprintf(buf + len, size - len, "pdev: %d\n",
763 					 pdev_idx);
764 			len = ath11k_fill_bp_stats(ab, bp_stats, buf, len, size);
765 			stats_rxd = true;
766 		}
767 	}
768 	spin_unlock_bh(&ab->base_lock);
769 
770 	if (!stats_rxd)
771 		len += scnprintf(buf + len, size - len,
772 				 "No Ring Backpressure stats received\n\n");
773 
774 	return len;
775 }
776 
777 static ssize_t ath11k_debugfs_dump_soc_dp_stats(struct file *file,
778 						char __user *user_buf,
779 						size_t count, loff_t *ppos)
780 {
781 	struct ath11k_base *ab = file->private_data;
782 	struct ath11k_soc_dp_stats *soc_stats = &ab->soc_stats;
783 	int len = 0, i, retval;
784 	const int size = 4096;
785 	static const char *rxdma_err[HAL_REO_ENTR_RING_RXDMA_ECODE_MAX] = {
786 			"Overflow", "MPDU len", "FCS", "Decrypt", "TKIP MIC",
787 			"Unencrypt", "MSDU len", "MSDU limit", "WiFi parse",
788 			"AMSDU parse", "SA timeout", "DA timeout",
789 			"Flow timeout", "Flush req"};
790 	static const char *reo_err[HAL_REO_DEST_RING_ERROR_CODE_MAX] = {
791 			"Desc addr zero", "Desc inval", "AMPDU in non BA",
792 			"Non BA dup", "BA dup", "Frame 2k jump", "BAR 2k jump",
793 			"Frame OOR", "BAR OOR", "No BA session",
794 			"Frame SN equal SSN", "PN check fail", "2k err",
795 			"PN err", "Desc blocked"};
796 
797 	char *buf;
798 
799 	buf = kzalloc(size, GFP_KERNEL);
800 	if (!buf)
801 		return -ENOMEM;
802 
803 	len += scnprintf(buf + len, size - len, "SOC RX STATS:\n\n");
804 	len += scnprintf(buf + len, size - len, "err ring pkts: %u\n",
805 			 soc_stats->err_ring_pkts);
806 	len += scnprintf(buf + len, size - len, "Invalid RBM: %u\n\n",
807 			 soc_stats->invalid_rbm);
808 	len += scnprintf(buf + len, size - len, "RXDMA errors:\n");
809 	for (i = 0; i < HAL_REO_ENTR_RING_RXDMA_ECODE_MAX; i++)
810 		len += scnprintf(buf + len, size - len, "%s: %u\n",
811 				 rxdma_err[i], soc_stats->rxdma_error[i]);
812 
813 	len += scnprintf(buf + len, size - len, "\nREO errors:\n");
814 	for (i = 0; i < HAL_REO_DEST_RING_ERROR_CODE_MAX; i++)
815 		len += scnprintf(buf + len, size - len, "%s: %u\n",
816 				 reo_err[i], soc_stats->reo_error[i]);
817 
818 	len += scnprintf(buf + len, size - len, "\nHAL REO errors:\n");
819 	len += scnprintf(buf + len, size - len,
820 			 "ring0: %u\nring1: %u\nring2: %u\nring3: %u\n",
821 			 soc_stats->hal_reo_error[0],
822 			 soc_stats->hal_reo_error[1],
823 			 soc_stats->hal_reo_error[2],
824 			 soc_stats->hal_reo_error[3]);
825 
826 	len += scnprintf(buf + len, size - len, "\nSOC TX STATS:\n");
827 	len += scnprintf(buf + len, size - len, "\nTCL Ring Full Failures:\n");
828 
829 	for (i = 0; i < ab->hw_params.max_tx_ring; i++)
830 		len += scnprintf(buf + len, size - len, "ring%d: %u\n",
831 				 i, soc_stats->tx_err.desc_na[i]);
832 
833 	len += scnprintf(buf + len, size - len,
834 			 "\nMisc Transmit Failures: %d\n",
835 			 atomic_read(&soc_stats->tx_err.misc_fail));
836 
837 	len += ath11k_debugfs_dump_soc_ring_bp_stats(ab, buf + len, size - len);
838 
839 	if (len > size)
840 		len = size;
841 	retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
842 	kfree(buf);
843 
844 	return retval;
845 }
846 
847 static const struct file_operations fops_soc_dp_stats = {
848 	.read = ath11k_debugfs_dump_soc_dp_stats,
849 	.open = simple_open,
850 	.owner = THIS_MODULE,
851 	.llseek = default_llseek,
852 };
853 
854 static ssize_t ath11k_write_fw_dbglog(struct file *file,
855 				      const char __user *user_buf,
856 				      size_t count, loff_t *ppos)
857 {
858 	struct ath11k *ar = file->private_data;
859 	char buf[128] = {0};
860 	struct ath11k_fw_dbglog dbglog;
861 	unsigned int param, mod_id_index, is_end;
862 	u64 value;
863 	int ret, num;
864 
865 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos,
866 				     user_buf, count);
867 	if (ret <= 0)
868 		return ret;
869 
870 	num = sscanf(buf, "%u %llx %u %u", &param, &value, &mod_id_index, &is_end);
871 
872 	if (num < 2)
873 		return -EINVAL;
874 
875 	mutex_lock(&ar->conf_mutex);
876 	if (param == WMI_DEBUG_LOG_PARAM_MOD_ENABLE_BITMAP ||
877 	    param == WMI_DEBUG_LOG_PARAM_WOW_MOD_ENABLE_BITMAP) {
878 		if (num != 4 || mod_id_index > (MAX_MODULE_ID_BITMAP_WORDS - 1)) {
879 			ret = -EINVAL;
880 			goto out;
881 		}
882 		ar->debug.module_id_bitmap[mod_id_index] = upper_32_bits(value);
883 		if (!is_end) {
884 			ret = count;
885 			goto out;
886 		}
887 	} else {
888 		if (num != 2) {
889 			ret = -EINVAL;
890 			goto out;
891 		}
892 	}
893 
894 	dbglog.param = param;
895 	dbglog.value = lower_32_bits(value);
896 	ret = ath11k_wmi_fw_dbglog_cfg(ar, ar->debug.module_id_bitmap, &dbglog);
897 	if (ret) {
898 		ath11k_warn(ar->ab, "fw dbglog config failed from debugfs: %d\n",
899 			    ret);
900 		goto out;
901 	}
902 
903 	ret = count;
904 
905 out:
906 	mutex_unlock(&ar->conf_mutex);
907 	return ret;
908 }
909 
910 static const struct file_operations fops_fw_dbglog = {
911 	.write = ath11k_write_fw_dbglog,
912 	.open = simple_open,
913 	.owner = THIS_MODULE,
914 	.llseek = default_llseek,
915 };
916 
917 static int ath11k_open_sram_dump(struct inode *inode, struct file *file)
918 {
919 	struct ath11k_base *ab = inode->i_private;
920 	u8 *buf;
921 	u32 start, end;
922 	int ret;
923 
924 	start = ab->hw_params.sram_dump.start;
925 	end = ab->hw_params.sram_dump.end;
926 
927 	buf = vmalloc(end - start + 1);
928 	if (!buf)
929 		return -ENOMEM;
930 
931 	ret = ath11k_hif_read(ab, buf, start, end);
932 	if (ret) {
933 		ath11k_warn(ab, "failed to dump sram: %d\n", ret);
934 		vfree(buf);
935 		return ret;
936 	}
937 
938 	file->private_data = buf;
939 	return 0;
940 }
941 
942 static ssize_t ath11k_read_sram_dump(struct file *file,
943 				     char __user *user_buf,
944 				     size_t count, loff_t *ppos)
945 {
946 	struct ath11k_base *ab = file->f_inode->i_private;
947 	const char *buf = file->private_data;
948 	int len;
949 	u32 start, end;
950 
951 	start = ab->hw_params.sram_dump.start;
952 	end = ab->hw_params.sram_dump.end;
953 	len = end - start + 1;
954 
955 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
956 }
957 
958 static int ath11k_release_sram_dump(struct inode *inode, struct file *file)
959 {
960 	vfree(file->private_data);
961 	file->private_data = NULL;
962 
963 	return 0;
964 }
965 
966 static const struct file_operations fops_sram_dump = {
967 	.open = ath11k_open_sram_dump,
968 	.read = ath11k_read_sram_dump,
969 	.release = ath11k_release_sram_dump,
970 	.owner = THIS_MODULE,
971 	.llseek = default_llseek,
972 };
973 
974 int ath11k_debugfs_pdev_create(struct ath11k_base *ab)
975 {
976 	if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
977 		return 0;
978 
979 	ab->debugfs_soc = debugfs_create_dir(ab->hw_params.name, ab->debugfs_ath11k);
980 	if (IS_ERR(ab->debugfs_soc))
981 		return PTR_ERR(ab->debugfs_soc);
982 
983 	debugfs_create_file("simulate_fw_crash", 0600, ab->debugfs_soc, ab,
984 			    &fops_simulate_fw_crash);
985 
986 	debugfs_create_file("soc_dp_stats", 0600, ab->debugfs_soc, ab,
987 			    &fops_soc_dp_stats);
988 
989 	if (ab->hw_params.sram_dump.start != 0)
990 		debugfs_create_file("sram", 0400, ab->debugfs_soc, ab,
991 				    &fops_sram_dump);
992 
993 	return 0;
994 }
995 
996 void ath11k_debugfs_pdev_destroy(struct ath11k_base *ab)
997 {
998 	debugfs_remove_recursive(ab->debugfs_soc);
999 	ab->debugfs_soc = NULL;
1000 }
1001 
1002 int ath11k_debugfs_soc_create(struct ath11k_base *ab)
1003 {
1004 	ab->debugfs_ath11k = debugfs_create_dir("ath11k", NULL);
1005 
1006 	return PTR_ERR_OR_ZERO(ab->debugfs_ath11k);
1007 }
1008 
1009 void ath11k_debugfs_soc_destroy(struct ath11k_base *ab)
1010 {
1011 	debugfs_remove_recursive(ab->debugfs_ath11k);
1012 	ab->debugfs_ath11k = NULL;
1013 }
1014 EXPORT_SYMBOL(ath11k_debugfs_soc_destroy);
1015 
1016 void ath11k_debugfs_fw_stats_init(struct ath11k *ar)
1017 {
1018 	struct dentry *fwstats_dir = debugfs_create_dir("fw_stats",
1019 							ar->debug.debugfs_pdev);
1020 
1021 	ar->fw_stats.debugfs_fwstats = fwstats_dir;
1022 
1023 	/* all stats debugfs files created are under "fw_stats" directory
1024 	 * created per PDEV
1025 	 */
1026 	debugfs_create_file("pdev_stats", 0600, fwstats_dir, ar,
1027 			    &fops_pdev_stats);
1028 	debugfs_create_file("vdev_stats", 0600, fwstats_dir, ar,
1029 			    &fops_vdev_stats);
1030 	debugfs_create_file("beacon_stats", 0600, fwstats_dir, ar,
1031 			    &fops_bcn_stats);
1032 }
1033 
1034 static ssize_t ath11k_write_pktlog_filter(struct file *file,
1035 					  const char __user *ubuf,
1036 					  size_t count, loff_t *ppos)
1037 {
1038 	struct ath11k *ar = file->private_data;
1039 	struct ath11k_base *ab = ar->ab;
1040 	struct htt_rx_ring_tlv_filter tlv_filter = {0};
1041 	u32 rx_filter = 0, ring_id, filter, mode;
1042 	u8 buf[128] = {0};
1043 	int i, ret, rx_buf_sz = 0;
1044 	ssize_t rc;
1045 
1046 	mutex_lock(&ar->conf_mutex);
1047 	if (ar->state != ATH11K_STATE_ON) {
1048 		ret = -ENETDOWN;
1049 		goto out;
1050 	}
1051 
1052 	rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
1053 	if (rc < 0) {
1054 		ret = rc;
1055 		goto out;
1056 	}
1057 	buf[rc] = '\0';
1058 
1059 	ret = sscanf(buf, "0x%x %u", &filter, &mode);
1060 	if (ret != 2) {
1061 		ret = -EINVAL;
1062 		goto out;
1063 	}
1064 
1065 	if (filter) {
1066 		ret = ath11k_wmi_pdev_pktlog_enable(ar, filter);
1067 		if (ret) {
1068 			ath11k_warn(ar->ab,
1069 				    "failed to enable pktlog filter %x: %d\n",
1070 				    ar->debug.pktlog_filter, ret);
1071 			goto out;
1072 		}
1073 	} else {
1074 		ret = ath11k_wmi_pdev_pktlog_disable(ar);
1075 		if (ret) {
1076 			ath11k_warn(ar->ab, "failed to disable pktlog: %d\n", ret);
1077 			goto out;
1078 		}
1079 	}
1080 
1081 	/* Clear rx filter set for monitor mode and rx status */
1082 	for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
1083 		ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
1084 		ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, ar->dp.mac_id,
1085 						       HAL_RXDMA_MONITOR_STATUS,
1086 						       rx_buf_sz, &tlv_filter);
1087 		if (ret) {
1088 			ath11k_warn(ar->ab, "failed to set rx filter for monitor status ring\n");
1089 			goto out;
1090 		}
1091 	}
1092 #define HTT_RX_FILTER_TLV_LITE_MODE \
1093 			(HTT_RX_FILTER_TLV_FLAGS_PPDU_START | \
1094 			HTT_RX_FILTER_TLV_FLAGS_PPDU_END | \
1095 			HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS | \
1096 			HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS_EXT | \
1097 			HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE | \
1098 			HTT_RX_FILTER_TLV_FLAGS_MPDU_START)
1099 
1100 	if (mode == ATH11K_PKTLOG_MODE_FULL) {
1101 		rx_filter = HTT_RX_FILTER_TLV_LITE_MODE |
1102 			    HTT_RX_FILTER_TLV_FLAGS_MSDU_START |
1103 			    HTT_RX_FILTER_TLV_FLAGS_MSDU_END |
1104 			    HTT_RX_FILTER_TLV_FLAGS_MPDU_END |
1105 			    HTT_RX_FILTER_TLV_FLAGS_PACKET_HEADER |
1106 			    HTT_RX_FILTER_TLV_FLAGS_ATTENTION;
1107 		rx_buf_sz = DP_RX_BUFFER_SIZE;
1108 	} else if (mode == ATH11K_PKTLOG_MODE_LITE) {
1109 		ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
1110 							  HTT_PPDU_STATS_TAG_PKTLOG);
1111 		if (ret) {
1112 			ath11k_err(ar->ab, "failed to enable pktlog lite: %d\n", ret);
1113 			goto out;
1114 		}
1115 
1116 		rx_filter = HTT_RX_FILTER_TLV_LITE_MODE;
1117 		rx_buf_sz = DP_RX_BUFFER_SIZE_LITE;
1118 	} else {
1119 		rx_buf_sz = DP_RX_BUFFER_SIZE;
1120 		tlv_filter = ath11k_mac_mon_status_filter_default;
1121 		rx_filter = tlv_filter.rx_filter;
1122 
1123 		ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
1124 							  HTT_PPDU_STATS_TAG_DEFAULT);
1125 		if (ret) {
1126 			ath11k_err(ar->ab, "failed to send htt ppdu stats req: %d\n",
1127 				   ret);
1128 			goto out;
1129 		}
1130 	}
1131 
1132 	tlv_filter.rx_filter = rx_filter;
1133 	if (rx_filter) {
1134 		tlv_filter.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0;
1135 		tlv_filter.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1;
1136 		tlv_filter.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2;
1137 		tlv_filter.pkt_filter_flags3 = HTT_RX_FP_CTRL_FILTER_FLASG3 |
1138 					       HTT_RX_FP_DATA_FILTER_FLASG3;
1139 	}
1140 
1141 	for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
1142 		ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
1143 		ret = ath11k_dp_tx_htt_rx_filter_setup(ab, ring_id,
1144 						       ar->dp.mac_id + i,
1145 						       HAL_RXDMA_MONITOR_STATUS,
1146 						       rx_buf_sz, &tlv_filter);
1147 
1148 		if (ret) {
1149 			ath11k_warn(ab, "failed to set rx filter for monitor status ring\n");
1150 			goto out;
1151 		}
1152 	}
1153 
1154 	ath11k_info(ab, "pktlog mode %s\n",
1155 		    ((mode == ATH11K_PKTLOG_MODE_FULL) ? "full" : "lite"));
1156 
1157 	ar->debug.pktlog_filter = filter;
1158 	ar->debug.pktlog_mode = mode;
1159 	ret = count;
1160 
1161 out:
1162 	mutex_unlock(&ar->conf_mutex);
1163 	return ret;
1164 }
1165 
1166 static ssize_t ath11k_read_pktlog_filter(struct file *file,
1167 					 char __user *ubuf,
1168 					 size_t count, loff_t *ppos)
1169 
1170 {
1171 	char buf[32] = {0};
1172 	struct ath11k *ar = file->private_data;
1173 	int len = 0;
1174 
1175 	mutex_lock(&ar->conf_mutex);
1176 	len = scnprintf(buf, sizeof(buf) - len, "%08x %08x\n",
1177 			ar->debug.pktlog_filter,
1178 			ar->debug.pktlog_mode);
1179 	mutex_unlock(&ar->conf_mutex);
1180 
1181 	return simple_read_from_buffer(ubuf, count, ppos, buf, len);
1182 }
1183 
1184 static const struct file_operations fops_pktlog_filter = {
1185 	.read = ath11k_read_pktlog_filter,
1186 	.write = ath11k_write_pktlog_filter,
1187 	.open = simple_open
1188 };
1189 
1190 static ssize_t ath11k_write_simulate_radar(struct file *file,
1191 					   const char __user *user_buf,
1192 					   size_t count, loff_t *ppos)
1193 {
1194 	struct ath11k *ar = file->private_data;
1195 	int ret;
1196 
1197 	ret = ath11k_wmi_simulate_radar(ar);
1198 	if (ret)
1199 		return ret;
1200 
1201 	return count;
1202 }
1203 
1204 static const struct file_operations fops_simulate_radar = {
1205 	.write = ath11k_write_simulate_radar,
1206 	.open = simple_open
1207 };
1208 
1209 static ssize_t ath11k_debug_dump_dbr_entries(struct file *file,
1210 					     char __user *user_buf,
1211 					     size_t count, loff_t *ppos)
1212 {
1213 	struct ath11k_dbg_dbr_data *dbr_dbg_data = file->private_data;
1214 	static const char * const event_id_to_string[] = {"empty", "Rx", "Replenish"};
1215 	int size = ATH11K_DEBUG_DBR_ENTRIES_MAX * 100;
1216 	char *buf;
1217 	int i, ret;
1218 	int len = 0;
1219 
1220 	buf = kzalloc(size, GFP_KERNEL);
1221 	if (!buf)
1222 		return -ENOMEM;
1223 
1224 	len += scnprintf(buf + len, size - len,
1225 			 "-----------------------------------------\n");
1226 	len += scnprintf(buf + len, size - len,
1227 			 "| idx |  hp  |  tp  | timestamp |  event |\n");
1228 	len += scnprintf(buf + len, size - len,
1229 			 "-----------------------------------------\n");
1230 
1231 	spin_lock_bh(&dbr_dbg_data->lock);
1232 
1233 	for (i = 0; i < dbr_dbg_data->num_ring_debug_entries; i++) {
1234 		len += scnprintf(buf + len, size - len,
1235 				 "|%4u|%8u|%8u|%11llu|%8s|\n", i,
1236 				 dbr_dbg_data->entries[i].hp,
1237 				 dbr_dbg_data->entries[i].tp,
1238 				 dbr_dbg_data->entries[i].timestamp,
1239 				 event_id_to_string[dbr_dbg_data->entries[i].event]);
1240 	}
1241 
1242 	spin_unlock_bh(&dbr_dbg_data->lock);
1243 
1244 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
1245 	kfree(buf);
1246 
1247 	return ret;
1248 }
1249 
1250 static const struct file_operations fops_debug_dump_dbr_entries = {
1251 	.read = ath11k_debug_dump_dbr_entries,
1252 	.open = simple_open,
1253 	.owner = THIS_MODULE,
1254 	.llseek = default_llseek,
1255 };
1256 
1257 static void ath11k_debugfs_dbr_dbg_destroy(struct ath11k *ar, int dbr_id)
1258 {
1259 	struct ath11k_debug_dbr *dbr_debug;
1260 	struct ath11k_dbg_dbr_data *dbr_dbg_data;
1261 
1262 	if (!ar->debug.dbr_debug[dbr_id])
1263 		return;
1264 
1265 	dbr_debug = ar->debug.dbr_debug[dbr_id];
1266 	dbr_dbg_data = &dbr_debug->dbr_dbg_data;
1267 
1268 	debugfs_remove_recursive(dbr_debug->dbr_debugfs);
1269 	kfree(dbr_dbg_data->entries);
1270 	kfree(dbr_debug);
1271 	ar->debug.dbr_debug[dbr_id] = NULL;
1272 }
1273 
1274 static int ath11k_debugfs_dbr_dbg_init(struct ath11k *ar, int dbr_id)
1275 {
1276 	struct ath11k_debug_dbr *dbr_debug;
1277 	struct ath11k_dbg_dbr_data *dbr_dbg_data;
1278 	static const char * const dbr_id_to_str[] = {"spectral", "CFR"};
1279 
1280 	if (ar->debug.dbr_debug[dbr_id])
1281 		return 0;
1282 
1283 	ar->debug.dbr_debug[dbr_id] = kzalloc(sizeof(*dbr_debug),
1284 					      GFP_KERNEL);
1285 
1286 	if (!ar->debug.dbr_debug[dbr_id])
1287 		return -ENOMEM;
1288 
1289 	dbr_debug = ar->debug.dbr_debug[dbr_id];
1290 	dbr_dbg_data = &dbr_debug->dbr_dbg_data;
1291 
1292 	if (dbr_debug->dbr_debugfs)
1293 		return 0;
1294 
1295 	dbr_debug->dbr_debugfs = debugfs_create_dir(dbr_id_to_str[dbr_id],
1296 						    ar->debug.debugfs_pdev);
1297 	if (IS_ERR_OR_NULL(dbr_debug->dbr_debugfs)) {
1298 		if (IS_ERR(dbr_debug->dbr_debugfs))
1299 			return PTR_ERR(dbr_debug->dbr_debugfs);
1300 		return -ENOMEM;
1301 	}
1302 
1303 	dbr_debug->dbr_debug_enabled = true;
1304 	dbr_dbg_data->num_ring_debug_entries = ATH11K_DEBUG_DBR_ENTRIES_MAX;
1305 	dbr_dbg_data->dbr_debug_idx = 0;
1306 	dbr_dbg_data->entries = kcalloc(ATH11K_DEBUG_DBR_ENTRIES_MAX,
1307 					sizeof(struct ath11k_dbg_dbr_entry),
1308 					GFP_KERNEL);
1309 	if (!dbr_dbg_data->entries)
1310 		return -ENOMEM;
1311 
1312 	spin_lock_init(&dbr_dbg_data->lock);
1313 
1314 	debugfs_create_file("dump_dbr_debug", 0444, dbr_debug->dbr_debugfs,
1315 			    dbr_dbg_data, &fops_debug_dump_dbr_entries);
1316 
1317 	return 0;
1318 }
1319 
1320 static ssize_t ath11k_debugfs_write_enable_dbr_dbg(struct file *file,
1321 						   const char __user *ubuf,
1322 						   size_t count, loff_t *ppos)
1323 {
1324 	struct ath11k *ar = file->private_data;
1325 	char buf[32] = {0};
1326 	u32 dbr_id, enable;
1327 	int ret;
1328 
1329 	mutex_lock(&ar->conf_mutex);
1330 
1331 	if (ar->state != ATH11K_STATE_ON) {
1332 		ret = -ENETDOWN;
1333 		goto out;
1334 	}
1335 
1336 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
1337 	if (ret < 0)
1338 		goto out;
1339 
1340 	buf[ret] = '\0';
1341 	ret = sscanf(buf, "%u %u", &dbr_id, &enable);
1342 	if (ret != 2 || dbr_id > 1 || enable > 1) {
1343 		ret = -EINVAL;
1344 		ath11k_warn(ar->ab, "usage: echo <dbr_id> <val> dbr_id:0-Spectral 1-CFR val:0-disable 1-enable\n");
1345 		goto out;
1346 	}
1347 
1348 	if (enable) {
1349 		ret = ath11k_debugfs_dbr_dbg_init(ar, dbr_id);
1350 		if (ret) {
1351 			ath11k_warn(ar->ab, "db ring module debugfs init failed: %d\n",
1352 				    ret);
1353 			goto out;
1354 		}
1355 	} else {
1356 		ath11k_debugfs_dbr_dbg_destroy(ar, dbr_id);
1357 	}
1358 
1359 	ret = count;
1360 out:
1361 	mutex_unlock(&ar->conf_mutex);
1362 	return ret;
1363 }
1364 
1365 static const struct file_operations fops_dbr_debug = {
1366 	.write = ath11k_debugfs_write_enable_dbr_dbg,
1367 	.open = simple_open,
1368 	.owner = THIS_MODULE,
1369 	.llseek = default_llseek,
1370 };
1371 
1372 static ssize_t ath11k_write_ps_timekeeper_enable(struct file *file,
1373 						 const char __user *user_buf,
1374 						 size_t count, loff_t *ppos)
1375 {
1376 	struct ath11k *ar = file->private_data;
1377 	ssize_t ret;
1378 	u8 ps_timekeeper_enable;
1379 
1380 	if (kstrtou8_from_user(user_buf, count, 0, &ps_timekeeper_enable))
1381 		return -EINVAL;
1382 
1383 	mutex_lock(&ar->conf_mutex);
1384 
1385 	if (ar->state != ATH11K_STATE_ON) {
1386 		ret = -ENETDOWN;
1387 		goto exit;
1388 	}
1389 
1390 	if (!ar->ps_state_enable) {
1391 		ret = -EINVAL;
1392 		goto exit;
1393 	}
1394 
1395 	ar->ps_timekeeper_enable = !!ps_timekeeper_enable;
1396 	ret = count;
1397 exit:
1398 	mutex_unlock(&ar->conf_mutex);
1399 
1400 	return ret;
1401 }
1402 
1403 static ssize_t ath11k_read_ps_timekeeper_enable(struct file *file,
1404 						char __user *user_buf,
1405 						size_t count, loff_t *ppos)
1406 {
1407 	struct ath11k *ar = file->private_data;
1408 	char buf[32];
1409 	int len;
1410 
1411 	mutex_lock(&ar->conf_mutex);
1412 	len = scnprintf(buf, sizeof(buf), "%d\n", ar->ps_timekeeper_enable);
1413 	mutex_unlock(&ar->conf_mutex);
1414 
1415 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1416 }
1417 
1418 static const struct file_operations fops_ps_timekeeper_enable = {
1419 	.read = ath11k_read_ps_timekeeper_enable,
1420 	.write = ath11k_write_ps_timekeeper_enable,
1421 	.open = simple_open,
1422 	.owner = THIS_MODULE,
1423 	.llseek = default_llseek,
1424 };
1425 
1426 static void ath11k_reset_peer_ps_duration(void *data,
1427 					  struct ieee80211_sta *sta)
1428 {
1429 	struct ath11k *ar = data;
1430 	struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
1431 
1432 	spin_lock_bh(&ar->data_lock);
1433 	arsta->ps_total_duration = 0;
1434 	spin_unlock_bh(&ar->data_lock);
1435 }
1436 
1437 static ssize_t ath11k_write_reset_ps_duration(struct file *file,
1438 					      const  char __user *user_buf,
1439 					      size_t count, loff_t *ppos)
1440 {
1441 	struct ath11k *ar = file->private_data;
1442 	int ret;
1443 	u8 reset_ps_duration;
1444 
1445 	if (kstrtou8_from_user(user_buf, count, 0, &reset_ps_duration))
1446 		return -EINVAL;
1447 
1448 	mutex_lock(&ar->conf_mutex);
1449 
1450 	if (ar->state != ATH11K_STATE_ON) {
1451 		ret = -ENETDOWN;
1452 		goto exit;
1453 	}
1454 
1455 	if (!ar->ps_state_enable) {
1456 		ret = -EINVAL;
1457 		goto exit;
1458 	}
1459 
1460 	ieee80211_iterate_stations_atomic(ar->hw,
1461 					  ath11k_reset_peer_ps_duration,
1462 					  ar);
1463 
1464 	ret = count;
1465 exit:
1466 	mutex_unlock(&ar->conf_mutex);
1467 	return ret;
1468 }
1469 
1470 static const struct file_operations fops_reset_ps_duration = {
1471 	.write = ath11k_write_reset_ps_duration,
1472 	.open = simple_open,
1473 	.owner = THIS_MODULE,
1474 	.llseek = default_llseek,
1475 };
1476 
1477 static void ath11k_peer_ps_state_disable(void *data,
1478 					 struct ieee80211_sta *sta)
1479 {
1480 	struct ath11k *ar = data;
1481 	struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
1482 
1483 	spin_lock_bh(&ar->data_lock);
1484 	arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
1485 	arsta->ps_start_time = 0;
1486 	arsta->ps_total_duration = 0;
1487 	spin_unlock_bh(&ar->data_lock);
1488 }
1489 
1490 static ssize_t ath11k_write_ps_state_enable(struct file *file,
1491 					    const char __user *user_buf,
1492 					    size_t count, loff_t *ppos)
1493 {
1494 	struct ath11k *ar = file->private_data;
1495 	struct ath11k_pdev *pdev = ar->pdev;
1496 	int ret;
1497 	u32 param;
1498 	u8 ps_state_enable;
1499 
1500 	if (kstrtou8_from_user(user_buf, count, 0, &ps_state_enable))
1501 		return -EINVAL;
1502 
1503 	mutex_lock(&ar->conf_mutex);
1504 
1505 	ps_state_enable = !!ps_state_enable;
1506 
1507 	if (ar->ps_state_enable == ps_state_enable) {
1508 		ret = count;
1509 		goto exit;
1510 	}
1511 
1512 	param = WMI_PDEV_PEER_STA_PS_STATECHG_ENABLE;
1513 	ret = ath11k_wmi_pdev_set_param(ar, param, ps_state_enable, pdev->pdev_id);
1514 	if (ret) {
1515 		ath11k_warn(ar->ab, "failed to enable ps_state_enable: %d\n",
1516 			    ret);
1517 		goto exit;
1518 	}
1519 	ar->ps_state_enable = ps_state_enable;
1520 
1521 	if (!ar->ps_state_enable) {
1522 		ar->ps_timekeeper_enable = false;
1523 		ieee80211_iterate_stations_atomic(ar->hw,
1524 						  ath11k_peer_ps_state_disable,
1525 						  ar);
1526 	}
1527 
1528 	ret = count;
1529 
1530 exit:
1531 	mutex_unlock(&ar->conf_mutex);
1532 
1533 	return ret;
1534 }
1535 
1536 static ssize_t ath11k_read_ps_state_enable(struct file *file,
1537 					   char __user *user_buf,
1538 					   size_t count, loff_t *ppos)
1539 {
1540 	struct ath11k *ar = file->private_data;
1541 	char buf[32];
1542 	int len;
1543 
1544 	mutex_lock(&ar->conf_mutex);
1545 	len = scnprintf(buf, sizeof(buf), "%d\n", ar->ps_state_enable);
1546 	mutex_unlock(&ar->conf_mutex);
1547 
1548 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1549 }
1550 
1551 static const struct file_operations fops_ps_state_enable = {
1552 	.read = ath11k_read_ps_state_enable,
1553 	.write = ath11k_write_ps_state_enable,
1554 	.open = simple_open,
1555 	.owner = THIS_MODULE,
1556 	.llseek = default_llseek,
1557 };
1558 
1559 int ath11k_debugfs_register(struct ath11k *ar)
1560 {
1561 	struct ath11k_base *ab = ar->ab;
1562 	char pdev_name[5];
1563 	char buf[100] = {0};
1564 
1565 	snprintf(pdev_name, sizeof(pdev_name), "%s%d", "mac", ar->pdev_idx);
1566 
1567 	ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc);
1568 	if (IS_ERR(ar->debug.debugfs_pdev))
1569 		return PTR_ERR(ar->debug.debugfs_pdev);
1570 
1571 	/* Create a symlink under ieee80211/phy* */
1572 	snprintf(buf, 100, "../../ath11k/%pd2", ar->debug.debugfs_pdev);
1573 	debugfs_create_symlink("ath11k", ar->hw->wiphy->debugfsdir, buf);
1574 
1575 	ath11k_debugfs_htt_stats_init(ar);
1576 
1577 	ath11k_debugfs_fw_stats_init(ar);
1578 
1579 	debugfs_create_file("ext_tx_stats", 0644,
1580 			    ar->debug.debugfs_pdev, ar,
1581 			    &fops_extd_tx_stats);
1582 	debugfs_create_file("ext_rx_stats", 0644,
1583 			    ar->debug.debugfs_pdev, ar,
1584 			    &fops_extd_rx_stats);
1585 	debugfs_create_file("pktlog_filter", 0644,
1586 			    ar->debug.debugfs_pdev, ar,
1587 			    &fops_pktlog_filter);
1588 	debugfs_create_file("fw_dbglog_config", 0600,
1589 			    ar->debug.debugfs_pdev, ar,
1590 			    &fops_fw_dbglog);
1591 
1592 	if (ar->hw->wiphy->bands[NL80211_BAND_5GHZ]) {
1593 		debugfs_create_file("dfs_simulate_radar", 0200,
1594 				    ar->debug.debugfs_pdev, ar,
1595 				    &fops_simulate_radar);
1596 		debugfs_create_bool("dfs_block_radar_events", 0200,
1597 				    ar->debug.debugfs_pdev,
1598 				    &ar->dfs_block_radar_events);
1599 	}
1600 
1601 	if (ab->hw_params.dbr_debug_support)
1602 		debugfs_create_file("enable_dbr_debug", 0200, ar->debug.debugfs_pdev,
1603 				    ar, &fops_dbr_debug);
1604 
1605 	debugfs_create_file("ps_state_enable", 0600, ar->debug.debugfs_pdev, ar,
1606 			    &fops_ps_state_enable);
1607 
1608 	if (test_bit(WMI_TLV_SERVICE_PEER_POWER_SAVE_DURATION_SUPPORT,
1609 		     ar->ab->wmi_ab.svc_map)) {
1610 		debugfs_create_file("ps_timekeeper_enable", 0600,
1611 				    ar->debug.debugfs_pdev, ar,
1612 				    &fops_ps_timekeeper_enable);
1613 
1614 		debugfs_create_file("reset_ps_duration", 0200,
1615 				    ar->debug.debugfs_pdev, ar,
1616 				    &fops_reset_ps_duration);
1617 	}
1618 
1619 	return 0;
1620 }
1621 
1622 void ath11k_debugfs_unregister(struct ath11k *ar)
1623 {
1624 	struct ath11k_debug_dbr *dbr_debug;
1625 	struct ath11k_dbg_dbr_data *dbr_dbg_data;
1626 	int i;
1627 
1628 	for (i = 0; i < WMI_DIRECT_BUF_MAX; i++) {
1629 		dbr_debug = ar->debug.dbr_debug[i];
1630 		if (!dbr_debug)
1631 			continue;
1632 
1633 		dbr_dbg_data = &dbr_debug->dbr_dbg_data;
1634 		kfree(dbr_dbg_data->entries);
1635 		debugfs_remove_recursive(dbr_debug->dbr_debugfs);
1636 		kfree(dbr_debug);
1637 		ar->debug.dbr_debug[i] = NULL;
1638 	}
1639 }
1640 
1641 static ssize_t ath11k_write_twt_add_dialog(struct file *file,
1642 					   const char __user *ubuf,
1643 					   size_t count, loff_t *ppos)
1644 {
1645 	struct ath11k_vif *arvif = file->private_data;
1646 	struct wmi_twt_add_dialog_params params = { 0 };
1647 	struct wmi_twt_enable_params twt_params = {0};
1648 	struct ath11k *ar = arvif->ar;
1649 	u8 buf[128] = {0};
1650 	int ret;
1651 
1652 	if (ar->twt_enabled == 0) {
1653 		ath11k_err(ar->ab, "twt support is not enabled\n");
1654 		return -EOPNOTSUPP;
1655 	}
1656 
1657 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
1658 	if (ret < 0)
1659 		return ret;
1660 
1661 	buf[ret] = '\0';
1662 	ret = sscanf(buf,
1663 		     "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx %u %u %u %u %u %hhu %hhu %hhu %hhu %hhu",
1664 		     &params.peer_macaddr[0],
1665 		     &params.peer_macaddr[1],
1666 		     &params.peer_macaddr[2],
1667 		     &params.peer_macaddr[3],
1668 		     &params.peer_macaddr[4],
1669 		     &params.peer_macaddr[5],
1670 		     &params.dialog_id,
1671 		     &params.wake_intvl_us,
1672 		     &params.wake_intvl_mantis,
1673 		     &params.wake_dura_us,
1674 		     &params.sp_offset_us,
1675 		     &params.twt_cmd,
1676 		     &params.flag_bcast,
1677 		     &params.flag_trigger,
1678 		     &params.flag_flow_type,
1679 		     &params.flag_protection);
1680 	if (ret != 16)
1681 		return -EINVAL;
1682 
1683 	/* In the case of station vif, TWT is entirely handled by
1684 	 * the firmware based on the input parameters in the TWT enable
1685 	 * WMI command that is sent to the target during assoc.
1686 	 * For manually testing the TWT feature, we need to first disable
1687 	 * TWT and send enable command again with TWT input parameter
1688 	 * sta_cong_timer_ms set to 0.
1689 	 */
1690 	if (arvif->vif->type == NL80211_IFTYPE_STATION) {
1691 		ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
1692 
1693 		ath11k_wmi_fill_default_twt_params(&twt_params);
1694 		twt_params.sta_cong_timer_ms = 0;
1695 
1696 		ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, &twt_params);
1697 	}
1698 
1699 	params.vdev_id = arvif->vdev_id;
1700 
1701 	ret = ath11k_wmi_send_twt_add_dialog_cmd(arvif->ar, &params);
1702 	if (ret)
1703 		goto err_twt_add_dialog;
1704 
1705 	return count;
1706 
1707 err_twt_add_dialog:
1708 	if (arvif->vif->type == NL80211_IFTYPE_STATION) {
1709 		ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
1710 		ath11k_wmi_fill_default_twt_params(&twt_params);
1711 		ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, &twt_params);
1712 	}
1713 
1714 	return ret;
1715 }
1716 
1717 static ssize_t ath11k_write_twt_del_dialog(struct file *file,
1718 					   const char __user *ubuf,
1719 					   size_t count, loff_t *ppos)
1720 {
1721 	struct ath11k_vif *arvif = file->private_data;
1722 	struct wmi_twt_del_dialog_params params = { 0 };
1723 	struct wmi_twt_enable_params twt_params = {0};
1724 	struct ath11k *ar = arvif->ar;
1725 	u8 buf[64] = {0};
1726 	int ret;
1727 
1728 	if (ar->twt_enabled == 0) {
1729 		ath11k_err(ar->ab, "twt support is not enabled\n");
1730 		return -EOPNOTSUPP;
1731 	}
1732 
1733 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
1734 	if (ret < 0)
1735 		return ret;
1736 
1737 	buf[ret] = '\0';
1738 	ret = sscanf(buf, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx %u",
1739 		     &params.peer_macaddr[0],
1740 		     &params.peer_macaddr[1],
1741 		     &params.peer_macaddr[2],
1742 		     &params.peer_macaddr[3],
1743 		     &params.peer_macaddr[4],
1744 		     &params.peer_macaddr[5],
1745 		     &params.dialog_id);
1746 	if (ret != 7)
1747 		return -EINVAL;
1748 
1749 	params.vdev_id = arvif->vdev_id;
1750 
1751 	ret = ath11k_wmi_send_twt_del_dialog_cmd(arvif->ar, &params);
1752 	if (ret)
1753 		return ret;
1754 
1755 	if (arvif->vif->type == NL80211_IFTYPE_STATION) {
1756 		ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
1757 		ath11k_wmi_fill_default_twt_params(&twt_params);
1758 		ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, &twt_params);
1759 	}
1760 
1761 	return count;
1762 }
1763 
1764 static ssize_t ath11k_write_twt_pause_dialog(struct file *file,
1765 					     const char __user *ubuf,
1766 					     size_t count, loff_t *ppos)
1767 {
1768 	struct ath11k_vif *arvif = file->private_data;
1769 	struct wmi_twt_pause_dialog_params params = { 0 };
1770 	u8 buf[64] = {0};
1771 	int ret;
1772 
1773 	if (arvif->ar->twt_enabled == 0) {
1774 		ath11k_err(arvif->ar->ab, "twt support is not enabled\n");
1775 		return -EOPNOTSUPP;
1776 	}
1777 
1778 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
1779 	if (ret < 0)
1780 		return ret;
1781 
1782 	buf[ret] = '\0';
1783 	ret = sscanf(buf, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx %u",
1784 		     &params.peer_macaddr[0],
1785 		     &params.peer_macaddr[1],
1786 		     &params.peer_macaddr[2],
1787 		     &params.peer_macaddr[3],
1788 		     &params.peer_macaddr[4],
1789 		     &params.peer_macaddr[5],
1790 		     &params.dialog_id);
1791 	if (ret != 7)
1792 		return -EINVAL;
1793 
1794 	params.vdev_id = arvif->vdev_id;
1795 
1796 	ret = ath11k_wmi_send_twt_pause_dialog_cmd(arvif->ar, &params);
1797 	if (ret)
1798 		return ret;
1799 
1800 	return count;
1801 }
1802 
1803 static ssize_t ath11k_write_twt_resume_dialog(struct file *file,
1804 					      const char __user *ubuf,
1805 					      size_t count, loff_t *ppos)
1806 {
1807 	struct ath11k_vif *arvif = file->private_data;
1808 	struct wmi_twt_resume_dialog_params params = { 0 };
1809 	u8 buf[64] = {0};
1810 	int ret;
1811 
1812 	if (arvif->ar->twt_enabled == 0) {
1813 		ath11k_err(arvif->ar->ab, "twt support is not enabled\n");
1814 		return -EOPNOTSUPP;
1815 	}
1816 
1817 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
1818 	if (ret < 0)
1819 		return ret;
1820 
1821 	buf[ret] = '\0';
1822 	ret = sscanf(buf, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx %u %u %u",
1823 		     &params.peer_macaddr[0],
1824 		     &params.peer_macaddr[1],
1825 		     &params.peer_macaddr[2],
1826 		     &params.peer_macaddr[3],
1827 		     &params.peer_macaddr[4],
1828 		     &params.peer_macaddr[5],
1829 		     &params.dialog_id,
1830 		     &params.sp_offset_us,
1831 		     &params.next_twt_size);
1832 	if (ret != 9)
1833 		return -EINVAL;
1834 
1835 	params.vdev_id = arvif->vdev_id;
1836 
1837 	ret = ath11k_wmi_send_twt_resume_dialog_cmd(arvif->ar, &params);
1838 	if (ret)
1839 		return ret;
1840 
1841 	return count;
1842 }
1843 
1844 static const struct file_operations ath11k_fops_twt_add_dialog = {
1845 	.write = ath11k_write_twt_add_dialog,
1846 	.open = simple_open
1847 };
1848 
1849 static const struct file_operations ath11k_fops_twt_del_dialog = {
1850 	.write = ath11k_write_twt_del_dialog,
1851 	.open = simple_open
1852 };
1853 
1854 static const struct file_operations ath11k_fops_twt_pause_dialog = {
1855 	.write = ath11k_write_twt_pause_dialog,
1856 	.open = simple_open
1857 };
1858 
1859 static const struct file_operations ath11k_fops_twt_resume_dialog = {
1860 	.write = ath11k_write_twt_resume_dialog,
1861 	.open = simple_open
1862 };
1863 
1864 void ath11k_debugfs_add_interface(struct ath11k_vif *arvif)
1865 {
1866 	struct ath11k_base *ab = arvif->ar->ab;
1867 
1868 	if (arvif->vif->type != NL80211_IFTYPE_AP &&
1869 	    !(arvif->vif->type == NL80211_IFTYPE_STATION &&
1870 	      test_bit(WMI_TLV_SERVICE_STA_TWT, ab->wmi_ab.svc_map)))
1871 		return;
1872 
1873 	arvif->debugfs_twt = debugfs_create_dir("twt",
1874 						arvif->vif->debugfs_dir);
1875 	debugfs_create_file("add_dialog", 0200, arvif->debugfs_twt,
1876 			    arvif, &ath11k_fops_twt_add_dialog);
1877 
1878 	debugfs_create_file("del_dialog", 0200, arvif->debugfs_twt,
1879 			    arvif, &ath11k_fops_twt_del_dialog);
1880 
1881 	debugfs_create_file("pause_dialog", 0200, arvif->debugfs_twt,
1882 			    arvif, &ath11k_fops_twt_pause_dialog);
1883 
1884 	debugfs_create_file("resume_dialog", 0200, arvif->debugfs_twt,
1885 			    arvif, &ath11k_fops_twt_resume_dialog);
1886 }
1887 
1888 void ath11k_debugfs_remove_interface(struct ath11k_vif *arvif)
1889 {
1890 	if (!arvif->debugfs_twt)
1891 		return;
1892 
1893 	debugfs_remove_recursive(arvif->debugfs_twt);
1894 	arvif->debugfs_twt = NULL;
1895 }
1896