0001
0002
0003
0004
0005
0006 #include <linux/debugfs.h>
0007 #include "mt76x02.h"
0008
0009 static int
0010 mt76x02_ampdu_stat_show(struct seq_file *file, void *data)
0011 {
0012 struct mt76x02_dev *dev = file->private;
0013 int i, j;
0014
0015 for (i = 0; i < 4; i++) {
0016 seq_puts(file, "Length: ");
0017 for (j = 0; j < 8; j++)
0018 seq_printf(file, "%8d | ", i * 8 + j + 1);
0019 seq_puts(file, "\n");
0020 seq_puts(file, "Count: ");
0021 for (j = 0; j < 8; j++)
0022 seq_printf(file, "%8d | ",
0023 dev->mt76.aggr_stats[i * 8 + j]);
0024 seq_puts(file, "\n");
0025 seq_puts(file, "--------");
0026 for (j = 0; j < 8; j++)
0027 seq_puts(file, "-----------");
0028 seq_puts(file, "\n");
0029 }
0030
0031 return 0;
0032 }
0033
0034 DEFINE_SHOW_ATTRIBUTE(mt76x02_ampdu_stat);
0035
0036 static int read_txpower(struct seq_file *file, void *data)
0037 {
0038 struct mt76x02_dev *dev = dev_get_drvdata(file->private);
0039
0040 seq_printf(file, "Target power: %d\n", dev->target_power);
0041
0042 mt76_seq_puts_array(file, "Delta", dev->target_power_delta,
0043 ARRAY_SIZE(dev->target_power_delta));
0044 return 0;
0045 }
0046
0047 static int
0048 mt76x02_dfs_stat_show(struct seq_file *file, void *data)
0049 {
0050 struct mt76x02_dev *dev = file->private;
0051 struct mt76x02_dfs_pattern_detector *dfs_pd = &dev->dfs_pd;
0052 int i;
0053
0054 seq_printf(file, "allocated sequences:\t%d\n",
0055 dfs_pd->seq_stats.seq_pool_len);
0056 seq_printf(file, "used sequences:\t\t%d\n",
0057 dfs_pd->seq_stats.seq_len);
0058 seq_puts(file, "\n");
0059
0060 for (i = 0; i < MT_DFS_NUM_ENGINES; i++) {
0061 seq_printf(file, "engine: %d\n", i);
0062 seq_printf(file, " hw pattern detected:\t%d\n",
0063 dfs_pd->stats[i].hw_pattern);
0064 seq_printf(file, " hw pulse discarded:\t%d\n",
0065 dfs_pd->stats[i].hw_pulse_discarded);
0066 seq_printf(file, " sw pattern detected:\t%d\n",
0067 dfs_pd->stats[i].sw_pattern);
0068 }
0069
0070 return 0;
0071 }
0072
0073 DEFINE_SHOW_ATTRIBUTE(mt76x02_dfs_stat);
0074
0075 static int read_agc(struct seq_file *file, void *data)
0076 {
0077 struct mt76x02_dev *dev = dev_get_drvdata(file->private);
0078
0079 seq_printf(file, "avg_rssi: %d\n", dev->cal.avg_rssi_all);
0080 seq_printf(file, "low_gain: %d\n", dev->cal.low_gain);
0081 seq_printf(file, "false_cca: %d\n", dev->cal.false_cca);
0082 seq_printf(file, "agc_gain_adjust: %d\n", dev->cal.agc_gain_adjust);
0083
0084 return 0;
0085 }
0086
0087 static int
0088 mt76_edcca_set(void *data, u64 val)
0089 {
0090 struct mt76x02_dev *dev = data;
0091 enum nl80211_dfs_regions region = dev->mt76.region;
0092
0093 mutex_lock(&dev->mt76.mutex);
0094
0095 dev->ed_monitor_enabled = !!val;
0096 dev->ed_monitor = dev->ed_monitor_enabled &&
0097 region == NL80211_DFS_ETSI;
0098 mt76x02_edcca_init(dev);
0099
0100 mutex_unlock(&dev->mt76.mutex);
0101
0102 return 0;
0103 }
0104
0105 static int
0106 mt76_edcca_get(void *data, u64 *val)
0107 {
0108 struct mt76x02_dev *dev = data;
0109
0110 *val = dev->ed_monitor_enabled;
0111 return 0;
0112 }
0113
0114 DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca, mt76_edcca_get, mt76_edcca_set,
0115 "%lld\n");
0116
0117 void mt76x02_init_debugfs(struct mt76x02_dev *dev)
0118 {
0119 struct dentry *dir;
0120
0121 dir = mt76_register_debugfs(&dev->mt76);
0122 if (!dir)
0123 return;
0124
0125 debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir,
0126 mt76_queues_read);
0127 debugfs_create_u8("temperature", 0400, dir, &dev->cal.temp);
0128 debugfs_create_bool("tpc", 0600, dir, &dev->enable_tpc);
0129
0130 debugfs_create_file("edcca", 0600, dir, dev, &fops_edcca);
0131 debugfs_create_file("ampdu_stat", 0400, dir, dev, &mt76x02_ampdu_stat_fops);
0132 debugfs_create_file("dfs_stats", 0400, dir, dev, &mt76x02_dfs_stat_fops);
0133 debugfs_create_devm_seqfile(dev->mt76.dev, "txpower", dir,
0134 read_txpower);
0135
0136 debugfs_create_devm_seqfile(dev->mt76.dev, "agc", dir, read_agc);
0137
0138 debugfs_create_u32("tx_hang_reset", 0400, dir, &dev->tx_hang_reset);
0139 }
0140 EXPORT_SYMBOL_GPL(mt76x02_init_debugfs);