18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: ISC
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/debugfs.h>
78c2ecf20Sopenharmony_ci#include "mt76x02.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cistatic int
108c2ecf20Sopenharmony_cimt76x02_ampdu_stat_show(struct seq_file *file, void *data)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	struct mt76x02_dev *dev = file->private;
138c2ecf20Sopenharmony_ci	int i, j;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci	for (i = 0; i < 4; i++) {
168c2ecf20Sopenharmony_ci		seq_puts(file, "Length: ");
178c2ecf20Sopenharmony_ci		for (j = 0; j < 8; j++)
188c2ecf20Sopenharmony_ci			seq_printf(file, "%8d | ", i * 8 + j + 1);
198c2ecf20Sopenharmony_ci		seq_puts(file, "\n");
208c2ecf20Sopenharmony_ci		seq_puts(file, "Count:  ");
218c2ecf20Sopenharmony_ci		for (j = 0; j < 8; j++)
228c2ecf20Sopenharmony_ci			seq_printf(file, "%8d | ",
238c2ecf20Sopenharmony_ci				   dev->mt76.aggr_stats[i * 8 + j]);
248c2ecf20Sopenharmony_ci		seq_puts(file, "\n");
258c2ecf20Sopenharmony_ci		seq_puts(file, "--------");
268c2ecf20Sopenharmony_ci		for (j = 0; j < 8; j++)
278c2ecf20Sopenharmony_ci			seq_puts(file, "-----------");
288c2ecf20Sopenharmony_ci		seq_puts(file, "\n");
298c2ecf20Sopenharmony_ci	}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	return 0;
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(mt76x02_ampdu_stat);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistatic int read_txpower(struct seq_file *file, void *data)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	struct mt76x02_dev *dev = dev_get_drvdata(file->private);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	seq_printf(file, "Target power: %d\n", dev->target_power);
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	mt76_seq_puts_array(file, "Delta", dev->target_power_delta,
438c2ecf20Sopenharmony_ci			    ARRAY_SIZE(dev->target_power_delta));
448c2ecf20Sopenharmony_ci	return 0;
458c2ecf20Sopenharmony_ci}
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cistatic int
488c2ecf20Sopenharmony_cimt76x02_dfs_stat_show(struct seq_file *file, void *data)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	struct mt76x02_dev *dev = file->private;
518c2ecf20Sopenharmony_ci	struct mt76x02_dfs_pattern_detector *dfs_pd = &dev->dfs_pd;
528c2ecf20Sopenharmony_ci	int i;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	seq_printf(file, "allocated sequences:\t%d\n",
558c2ecf20Sopenharmony_ci		   dfs_pd->seq_stats.seq_pool_len);
568c2ecf20Sopenharmony_ci	seq_printf(file, "used sequences:\t\t%d\n",
578c2ecf20Sopenharmony_ci		   dfs_pd->seq_stats.seq_len);
588c2ecf20Sopenharmony_ci	seq_puts(file, "\n");
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	for (i = 0; i < MT_DFS_NUM_ENGINES; i++) {
618c2ecf20Sopenharmony_ci		seq_printf(file, "engine: %d\n", i);
628c2ecf20Sopenharmony_ci		seq_printf(file, "  hw pattern detected:\t%d\n",
638c2ecf20Sopenharmony_ci			   dfs_pd->stats[i].hw_pattern);
648c2ecf20Sopenharmony_ci		seq_printf(file, "  hw pulse discarded:\t%d\n",
658c2ecf20Sopenharmony_ci			   dfs_pd->stats[i].hw_pulse_discarded);
668c2ecf20Sopenharmony_ci		seq_printf(file, "  sw pattern detected:\t%d\n",
678c2ecf20Sopenharmony_ci			   dfs_pd->stats[i].sw_pattern);
688c2ecf20Sopenharmony_ci	}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	return 0;
718c2ecf20Sopenharmony_ci}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(mt76x02_dfs_stat);
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistatic int read_agc(struct seq_file *file, void *data)
768c2ecf20Sopenharmony_ci{
778c2ecf20Sopenharmony_ci	struct mt76x02_dev *dev = dev_get_drvdata(file->private);
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	seq_printf(file, "avg_rssi: %d\n", dev->cal.avg_rssi_all);
808c2ecf20Sopenharmony_ci	seq_printf(file, "low_gain: %d\n", dev->cal.low_gain);
818c2ecf20Sopenharmony_ci	seq_printf(file, "false_cca: %d\n", dev->cal.false_cca);
828c2ecf20Sopenharmony_ci	seq_printf(file, "agc_gain_adjust: %d\n", dev->cal.agc_gain_adjust);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	return 0;
858c2ecf20Sopenharmony_ci}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_cistatic int
888c2ecf20Sopenharmony_cimt76_edcca_set(void *data, u64 val)
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	struct mt76x02_dev *dev = data;
918c2ecf20Sopenharmony_ci	enum nl80211_dfs_regions region = dev->mt76.region;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	mutex_lock(&dev->mt76.mutex);
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	dev->ed_monitor_enabled = !!val;
968c2ecf20Sopenharmony_ci	dev->ed_monitor = dev->ed_monitor_enabled &&
978c2ecf20Sopenharmony_ci			  region == NL80211_DFS_ETSI;
988c2ecf20Sopenharmony_ci	mt76x02_edcca_init(dev);
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	mutex_unlock(&dev->mt76.mutex);
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	return 0;
1038c2ecf20Sopenharmony_ci}
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistatic int
1068c2ecf20Sopenharmony_cimt76_edcca_get(void *data, u64 *val)
1078c2ecf20Sopenharmony_ci{
1088c2ecf20Sopenharmony_ci	struct mt76x02_dev *dev = data;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	*val = dev->ed_monitor_enabled;
1118c2ecf20Sopenharmony_ci	return 0;
1128c2ecf20Sopenharmony_ci}
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_edcca, mt76_edcca_get, mt76_edcca_set,
1158c2ecf20Sopenharmony_ci			 "%lld\n");
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_civoid mt76x02_init_debugfs(struct mt76x02_dev *dev)
1188c2ecf20Sopenharmony_ci{
1198c2ecf20Sopenharmony_ci	struct dentry *dir;
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	dir = mt76_register_debugfs(&dev->mt76);
1228c2ecf20Sopenharmony_ci	if (!dir)
1238c2ecf20Sopenharmony_ci		return;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir,
1268c2ecf20Sopenharmony_ci				    mt76_queues_read);
1278c2ecf20Sopenharmony_ci	debugfs_create_u8("temperature", 0400, dir, &dev->cal.temp);
1288c2ecf20Sopenharmony_ci	debugfs_create_bool("tpc", 0600, dir, &dev->enable_tpc);
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci	debugfs_create_file("edcca", 0600, dir, dev, &fops_edcca);
1318c2ecf20Sopenharmony_ci	debugfs_create_file("ampdu_stat", 0400, dir, dev, &mt76x02_ampdu_stat_fops);
1328c2ecf20Sopenharmony_ci	debugfs_create_file("dfs_stats", 0400, dir, dev, &mt76x02_dfs_stat_fops);
1338c2ecf20Sopenharmony_ci	debugfs_create_devm_seqfile(dev->mt76.dev, "txpower", dir,
1348c2ecf20Sopenharmony_ci				    read_txpower);
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	debugfs_create_devm_seqfile(dev->mt76.dev, "agc", dir, read_agc);
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	debugfs_create_u32("tx_hang_reset", 0400, dir, &dev->tx_hang_reset);
1398c2ecf20Sopenharmony_ci}
1408c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mt76x02_init_debugfs);
141