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
mt76x02_ampdu_stat_show(struct seq_file * file,void * data)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 | ",
23cbb3ec25SBjoern A. Zeeb 				   dev->mphy.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 
read_txpower(struct seq_file * file,void * data)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
mt76x02_dfs_stat_show(struct seq_file * file,void * data)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 
read_agc(struct seq_file * file,void * data)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
mt76_edcca_set(void * data,u64 val)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
mt76_edcca_get(void * data,u64 * val)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 
mt76x02_read_rate_txpower(struct seq_file * s,void * data)117cbb3ec25SBjoern A. Zeeb static int mt76x02_read_rate_txpower(struct seq_file *s, void *data)
118cbb3ec25SBjoern A. Zeeb {
119cbb3ec25SBjoern A. Zeeb 	struct mt76x02_dev *dev = dev_get_drvdata(s->private);
120cbb3ec25SBjoern A. Zeeb 
121cbb3ec25SBjoern A. Zeeb 	mt76_seq_puts_array(s, "CCK", dev->rate_power.cck,
122cbb3ec25SBjoern A. Zeeb 			    ARRAY_SIZE(dev->rate_power.cck));
123cbb3ec25SBjoern A. Zeeb 	mt76_seq_puts_array(s, "OFDM", dev->rate_power.ofdm,
124cbb3ec25SBjoern A. Zeeb 			    ARRAY_SIZE(dev->rate_power.ofdm));
125cbb3ec25SBjoern A. Zeeb 	mt76_seq_puts_array(s, "HT", dev->rate_power.ht,
126cbb3ec25SBjoern A. Zeeb 			    ARRAY_SIZE(dev->rate_power.ht));
127cbb3ec25SBjoern A. Zeeb 	mt76_seq_puts_array(s, "VHT", dev->rate_power.vht,
128cbb3ec25SBjoern A. Zeeb 			    ARRAY_SIZE(dev->rate_power.vht));
129cbb3ec25SBjoern A. Zeeb 	return 0;
130cbb3ec25SBjoern A. Zeeb }
131cbb3ec25SBjoern A. Zeeb 
mt76x02_init_debugfs(struct mt76x02_dev * dev)1326c92544dSBjoern A. Zeeb void mt76x02_init_debugfs(struct mt76x02_dev *dev)
1336c92544dSBjoern A. Zeeb {
1346c92544dSBjoern A. Zeeb 	struct dentry *dir;
1356c92544dSBjoern A. Zeeb 
1366c92544dSBjoern A. Zeeb 	dir = mt76_register_debugfs(&dev->mt76);
1376c92544dSBjoern A. Zeeb 	if (!dir)
1386c92544dSBjoern A. Zeeb 		return;
1396c92544dSBjoern A. Zeeb 
1406c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir,
1416c92544dSBjoern A. Zeeb 				    mt76_queues_read);
1426c92544dSBjoern A. Zeeb 	debugfs_create_u8("temperature", 0400, dir, &dev->cal.temp);
1436c92544dSBjoern A. Zeeb 	debugfs_create_bool("tpc", 0600, dir, &dev->enable_tpc);
1446c92544dSBjoern A. Zeeb 
1456c92544dSBjoern A. Zeeb 	debugfs_create_file("edcca", 0600, dir, dev, &fops_edcca);
1466c92544dSBjoern A. Zeeb 	debugfs_create_file("ampdu_stat", 0400, dir, dev, &mt76x02_ampdu_stat_fops);
1476c92544dSBjoern A. Zeeb 	debugfs_create_file("dfs_stats", 0400, dir, dev, &mt76x02_dfs_stat_fops);
1486c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "txpower", dir,
1496c92544dSBjoern A. Zeeb 				    read_txpower);
1506c92544dSBjoern A. Zeeb 
151cbb3ec25SBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "rate_txpower", dir,
152cbb3ec25SBjoern A. Zeeb 				    mt76x02_read_rate_txpower);
1536c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->mt76.dev, "agc", dir, read_agc);
1546c92544dSBjoern A. Zeeb 
1556c92544dSBjoern A. Zeeb 	debugfs_create_u32("tx_hang_reset", 0400, dir, &dev->tx_hang_reset);
1566c92544dSBjoern A. Zeeb }
1576c92544dSBjoern A. Zeeb EXPORT_SYMBOL_GPL(mt76x02_init_debugfs);
158