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