16c92544dSBjoern A. Zeeb // SPDX-License-Identifier: ISC
26c92544dSBjoern A. Zeeb /*
36c92544dSBjoern A. Zeeb  * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
46c92544dSBjoern A. Zeeb  */
56c92544dSBjoern A. Zeeb 
66c92544dSBjoern A. Zeeb #include <linux/debugfs.h>
76c92544dSBjoern A. Zeeb #include "mt76x02.h"
86c92544dSBjoern A. Zeeb 
96c92544dSBjoern A. Zeeb static int
106c92544dSBjoern A. Zeeb mt76x02_ampdu_stat_show(struct seq_file *file, void *data)
116c92544dSBjoern A. Zeeb {
126c92544dSBjoern A. Zeeb 	struct mt76x02_dev *dev = file->private;
136c92544dSBjoern A. Zeeb 	int i, j;
146c92544dSBjoern A. Zeeb 
156c92544dSBjoern A. Zeeb 	for (i = 0; i < 4; i++) {
166c92544dSBjoern A. Zeeb 		seq_puts(file, "Length: ");
176c92544dSBjoern A. Zeeb 		for (j = 0; j < 8; j++)
186c92544dSBjoern A. Zeeb 			seq_printf(file, "%8d | ", i * 8 + j + 1);
196c92544dSBjoern A. Zeeb 		seq_puts(file, "\n");
206c92544dSBjoern A. Zeeb 		seq_puts(file, "Count:  ");
216c92544dSBjoern A. Zeeb 		for (j = 0; j < 8; j++)
226c92544dSBjoern A. Zeeb 			seq_printf(file, "%8d | ",
236c92544dSBjoern A. Zeeb 				   dev->mt76.aggr_stats[i * 8 + j]);
246c92544dSBjoern A. Zeeb 		seq_puts(file, "\n");
256c92544dSBjoern A. Zeeb 		seq_puts(file, "--------");
266c92544dSBjoern A. Zeeb 		for (j = 0; j < 8; j++)
276c92544dSBjoern A. Zeeb 			seq_puts(file, "-----------");
286c92544dSBjoern A. Zeeb 		seq_puts(file, "\n");
296c92544dSBjoern A. Zeeb 	}
306c92544dSBjoern A. Zeeb 
316c92544dSBjoern A. Zeeb 	return 0;
326c92544dSBjoern A. Zeeb }
336c92544dSBjoern A. Zeeb 
346c92544dSBjoern A. Zeeb DEFINE_SHOW_ATTRIBUTE(mt76x02_ampdu_stat);
356c92544dSBjoern A. Zeeb 
366c92544dSBjoern A. Zeeb static int read_txpower(struct seq_file *file, void *data)
376c92544dSBjoern A. Zeeb {
386c92544dSBjoern A. Zeeb 	struct mt76x02_dev *dev = dev_get_drvdata(file->private);
396c92544dSBjoern A. Zeeb 
406c92544dSBjoern A. Zeeb 	seq_printf(file, "Target power: %d\n", dev->target_power);
416c92544dSBjoern A. Zeeb 
426c92544dSBjoern A. Zeeb 	mt76_seq_puts_array(file, "Delta", dev->target_power_delta,
436c92544dSBjoern A. Zeeb 			    ARRAY_SIZE(dev->target_power_delta));
446c92544dSBjoern A. Zeeb 	return 0;
456c92544dSBjoern A. Zeeb }
466c92544dSBjoern A. Zeeb 
476c92544dSBjoern A. Zeeb static int
486c92544dSBjoern A. Zeeb mt76x02_dfs_stat_show(struct seq_file *file, void *data)
496c92544dSBjoern A. Zeeb {
506c92544dSBjoern A. Zeeb 	struct mt76x02_dev *dev = file->private;
516c92544dSBjoern A. Zeeb 	struct mt76x02_dfs_pattern_detector *dfs_pd = &dev->dfs_pd;
526c92544dSBjoern A. Zeeb 	int i;
536c92544dSBjoern A. Zeeb 
546c92544dSBjoern A. Zeeb 	seq_printf(file, "allocated sequences:\t%d\n",
556c92544dSBjoern A. Zeeb 		   dfs_pd->seq_stats.seq_pool_len);
566c92544dSBjoern A. Zeeb 	seq_printf(file, "used sequences:\t\t%d\n",
576c92544dSBjoern A. Zeeb 		   dfs_pd->seq_stats.seq_len);
586c92544dSBjoern A. Zeeb 	seq_puts(file, "\n");
596c92544dSBjoern A. Zeeb 
606c92544dSBjoern A. Zeeb 	for (i = 0; i < MT_DFS_NUM_ENGINES; i++) {
616c92544dSBjoern A. Zeeb 		seq_printf(file, "engine: %d\n", i);
626c92544dSBjoern A. Zeeb 		seq_printf(file, "  hw pattern detected:\t%d\n",
636c92544dSBjoern A. Zeeb 			   dfs_pd->stats[i].hw_pattern);
646c92544dSBjoern A. Zeeb 		seq_printf(file, "  hw pulse discarded:\t%d\n",
656c92544dSBjoern A. Zeeb 			   dfs_pd->stats[i].hw_pulse_discarded);
666c92544dSBjoern A. Zeeb 		seq_printf(file, "  sw pattern detected:\t%d\n",
676c92544dSBjoern A. Zeeb 			   dfs_pd->stats[i].sw_pattern);
686c92544dSBjoern A. Zeeb 	}
696c92544dSBjoern A. Zeeb 
706c92544dSBjoern A. Zeeb 	return 0;
716c92544dSBjoern A. Zeeb }
726c92544dSBjoern A. Zeeb 
736c92544dSBjoern A. Zeeb DEFINE_SHOW_ATTRIBUTE(mt76x02_dfs_stat);
746c92544dSBjoern A. Zeeb 
756c92544dSBjoern A. Zeeb static int read_agc(struct seq_file *file, void *data)
766c92544dSBjoern A. Zeeb {
776c92544dSBjoern A. Zeeb 	struct mt76x02_dev *dev = dev_get_drvdata(file->private);
786c92544dSBjoern A. Zeeb 
796c92544dSBjoern A. Zeeb 	seq_printf(file, "avg_rssi: %d\n", dev->cal.avg_rssi_all);
806c92544dSBjoern A. Zeeb 	seq_printf(file, "low_gain: %d\n", dev->cal.low_gain);
816c92544dSBjoern A. Zeeb 	seq_printf(file, "false_cca: %d\n", dev->cal.false_cca);
826c92544dSBjoern A. Zeeb 	seq_printf(file, "agc_gain_adjust: %d\n", dev->cal.agc_gain_adjust);
836c92544dSBjoern A. Zeeb 
846c92544dSBjoern A. Zeeb 	return 0;
856c92544dSBjoern A. Zeeb }
866c92544dSBjoern A. Zeeb 
876c92544dSBjoern A. Zeeb static int
886c92544dSBjoern A. Zeeb mt76_edcca_set(void *data, u64 val)
896c92544dSBjoern A. Zeeb {
906c92544dSBjoern A. Zeeb 	struct mt76x02_dev *dev = data;
916c92544dSBjoern A. Zeeb 	enum nl80211_dfs_regions region = dev->mt76.region;
926c92544dSBjoern A. Zeeb 
936c92544dSBjoern A. Zeeb 	mutex_lock(&dev->mt76.mutex);
946c92544dSBjoern A. Zeeb 
956c92544dSBjoern A. Zeeb 	dev->ed_monitor_enabled = !!val;
966c92544dSBjoern A. Zeeb 	dev->ed_monitor = dev->ed_monitor_enabled &&
976c92544dSBjoern A. Zeeb 			  region == NL80211_DFS_ETSI;
986c92544dSBjoern A. Zeeb 	mt76x02_edcca_init(dev);
996c92544dSBjoern A. Zeeb 
1006c92544dSBjoern A. Zeeb 	mutex_unlock(&dev->mt76.mutex);
1016c92544dSBjoern A. Zeeb 
1026c92544dSBjoern A. Zeeb 	return 0;
1036c92544dSBjoern A. Zeeb }
1046c92544dSBjoern A. Zeeb 
1056c92544dSBjoern A. Zeeb static int
1066c92544dSBjoern A. Zeeb mt76_edcca_get(void *data, u64 *val)
1076c92544dSBjoern A. Zeeb {
1086c92544dSBjoern A. Zeeb 	struct mt76x02_dev *dev = data;
1096c92544dSBjoern A. Zeeb 
1106c92544dSBjoern A. Zeeb 	*val = dev->ed_monitor_enabled;
1116c92544dSBjoern A. Zeeb 	return 0;
1126c92544dSBjoern A. Zeeb }
1136c92544dSBjoern A. Zeeb 
1146c92544dSBjoern A. Zeeb DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca, mt76_edcca_get, mt76_edcca_set,
1156c92544dSBjoern A. Zeeb 			 "%lld\n");
1166c92544dSBjoern A. Zeeb 
1176c92544dSBjoern A. Zeeb void mt76x02_init_debugfs(struct mt76x02_dev *dev)
1186c92544dSBjoern A. Zeeb {
1196c92544dSBjoern A. Zeeb 	struct dentry *dir;
1206c92544dSBjoern A. Zeeb 
1216c92544dSBjoern A. Zeeb 	dir = mt76_register_debugfs(&dev->mt76);
1226c92544dSBjoern A. Zeeb 	if (!dir)
1236c92544dSBjoern A. Zeeb 		return;
1246c92544dSBjoern A. Zeeb 
1256c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir,
1266c92544dSBjoern A. Zeeb 				    mt76_queues_read);
1276c92544dSBjoern A. Zeeb 	debugfs_create_u8("temperature", 0400, dir, &dev->cal.temp);
1286c92544dSBjoern A. Zeeb 	debugfs_create_bool("tpc", 0600, dir, &dev->enable_tpc);
1296c92544dSBjoern A. Zeeb 
1306c92544dSBjoern A. Zeeb 	debugfs_create_file("edcca", 0600, dir, dev, &fops_edcca);
1316c92544dSBjoern A. Zeeb 	debugfs_create_file("ampdu_stat", 0400, dir, dev, &mt76x02_ampdu_stat_fops);
1326c92544dSBjoern A. Zeeb 	debugfs_create_file("dfs_stats", 0400, dir, dev, &mt76x02_dfs_stat_fops);
1336c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "txpower", dir,
1346c92544dSBjoern A. Zeeb 				    read_txpower);
1356c92544dSBjoern A. Zeeb 
1366c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "agc", dir, read_agc);
1376c92544dSBjoern A. Zeeb 
1386c92544dSBjoern A. Zeeb 	debugfs_create_u32("tx_hang_reset", 0400, dir, &dev->tx_hang_reset);
1396c92544dSBjoern A. Zeeb }
1406c92544dSBjoern A. Zeeb EXPORT_SYMBOL_GPL(mt76x02_init_debugfs);
141