1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
6 #include <linux/debugfs.h>
10 mt76x02_ampdu_stat_read(struct seq_file
*file
, void *data
)
12 struct mt76x02_dev
*dev
= file
->private;
15 for (i
= 0; i
< 4; i
++) {
16 seq_puts(file
, "Length: ");
17 for (j
= 0; j
< 8; j
++)
18 seq_printf(file
, "%8d | ", i
* 8 + j
+ 1);
20 seq_puts(file
, "Count: ");
21 for (j
= 0; j
< 8; j
++)
22 seq_printf(file
, "%8d | ",
23 dev
->mt76
.aggr_stats
[i
* 8 + j
]);
25 seq_puts(file
, "--------");
26 for (j
= 0; j
< 8; j
++)
27 seq_puts(file
, "-----------");
35 mt76x02_ampdu_stat_open(struct inode
*inode
, struct file
*f
)
37 return single_open(f
, mt76x02_ampdu_stat_read
, inode
->i_private
);
40 static int read_txpower(struct seq_file
*file
, void *data
)
42 struct mt76x02_dev
*dev
= dev_get_drvdata(file
->private);
44 seq_printf(file
, "Target power: %d\n", dev
->target_power
);
46 mt76_seq_puts_array(file
, "Delta", dev
->target_power_delta
,
47 ARRAY_SIZE(dev
->target_power_delta
));
51 static const struct file_operations fops_ampdu_stat
= {
52 .open
= mt76x02_ampdu_stat_open
,
55 .release
= single_release
,
59 mt76x02_dfs_stat_read(struct seq_file
*file
, void *data
)
61 struct mt76x02_dev
*dev
= file
->private;
62 struct mt76x02_dfs_pattern_detector
*dfs_pd
= &dev
->dfs_pd
;
65 seq_printf(file
, "allocated sequences:\t%d\n",
66 dfs_pd
->seq_stats
.seq_pool_len
);
67 seq_printf(file
, "used sequences:\t\t%d\n",
68 dfs_pd
->seq_stats
.seq_len
);
71 for (i
= 0; i
< MT_DFS_NUM_ENGINES
; i
++) {
72 seq_printf(file
, "engine: %d\n", i
);
73 seq_printf(file
, " hw pattern detected:\t%d\n",
74 dfs_pd
->stats
[i
].hw_pattern
);
75 seq_printf(file
, " hw pulse discarded:\t%d\n",
76 dfs_pd
->stats
[i
].hw_pulse_discarded
);
77 seq_printf(file
, " sw pattern detected:\t%d\n",
78 dfs_pd
->stats
[i
].sw_pattern
);
85 mt76x02_dfs_stat_open(struct inode
*inode
, struct file
*f
)
87 return single_open(f
, mt76x02_dfs_stat_read
, inode
->i_private
);
90 static const struct file_operations fops_dfs_stat
= {
91 .open
= mt76x02_dfs_stat_open
,
94 .release
= single_release
,
97 static int read_agc(struct seq_file
*file
, void *data
)
99 struct mt76x02_dev
*dev
= dev_get_drvdata(file
->private);
101 seq_printf(file
, "avg_rssi: %d\n", dev
->cal
.avg_rssi_all
);
102 seq_printf(file
, "low_gain: %d\n", dev
->cal
.low_gain
);
103 seq_printf(file
, "false_cca: %d\n", dev
->cal
.false_cca
);
104 seq_printf(file
, "agc_gain_adjust: %d\n", dev
->cal
.agc_gain_adjust
);
110 mt76_edcca_set(void *data
, u64 val
)
112 struct mt76x02_dev
*dev
= data
;
113 enum nl80211_dfs_regions region
= dev
->mt76
.region
;
115 mutex_lock(&dev
->mt76
.mutex
);
117 dev
->ed_monitor_enabled
= !!val
;
118 dev
->ed_monitor
= dev
->ed_monitor_enabled
&&
119 region
== NL80211_DFS_ETSI
;
120 mt76x02_edcca_init(dev
);
122 mutex_unlock(&dev
->mt76
.mutex
);
128 mt76_edcca_get(void *data
, u64
*val
)
130 struct mt76x02_dev
*dev
= data
;
132 *val
= dev
->ed_monitor_enabled
;
136 DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca
, mt76_edcca_get
, mt76_edcca_set
,
139 void mt76x02_init_debugfs(struct mt76x02_dev
*dev
)
143 dir
= mt76_register_debugfs(&dev
->mt76
);
147 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "queues", dir
,
149 debugfs_create_u8("temperature", 0400, dir
, &dev
->cal
.temp
);
150 debugfs_create_bool("tpc", 0600, dir
, &dev
->enable_tpc
);
152 debugfs_create_file("edcca", 0600, dir
, dev
, &fops_edcca
);
153 debugfs_create_file("ampdu_stat", 0400, dir
, dev
, &fops_ampdu_stat
);
154 debugfs_create_file("dfs_stats", 0400, dir
, dev
, &fops_dfs_stat
);
155 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "txpower", dir
,
158 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "agc", dir
, read_agc
);
160 debugfs_create_u32("tx_hang_reset", 0400, dir
, &dev
->tx_hang_reset
);
162 EXPORT_SYMBOL_GPL(mt76x02_init_debugfs
);