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 | ", dev
->aggr_stats
[i
* 8 + j
]);
24 seq_puts(file
, "--------");
25 for (j
= 0; j
< 8; j
++)
26 seq_puts(file
, "-----------");
34 mt76x02_ampdu_stat_open(struct inode
*inode
, struct file
*f
)
36 return single_open(f
, mt76x02_ampdu_stat_read
, inode
->i_private
);
39 static int read_txpower(struct seq_file
*file
, void *data
)
41 struct mt76x02_dev
*dev
= dev_get_drvdata(file
->private);
43 seq_printf(file
, "Target power: %d\n", dev
->target_power
);
45 mt76_seq_puts_array(file
, "Delta", dev
->target_power_delta
,
46 ARRAY_SIZE(dev
->target_power_delta
));
50 static const struct file_operations fops_ampdu_stat
= {
51 .open
= mt76x02_ampdu_stat_open
,
54 .release
= single_release
,
58 mt76x02_dfs_stat_read(struct seq_file
*file
, void *data
)
60 struct mt76x02_dev
*dev
= file
->private;
61 struct mt76x02_dfs_pattern_detector
*dfs_pd
= &dev
->dfs_pd
;
64 seq_printf(file
, "allocated sequences:\t%d\n",
65 dfs_pd
->seq_stats
.seq_pool_len
);
66 seq_printf(file
, "used sequences:\t\t%d\n",
67 dfs_pd
->seq_stats
.seq_len
);
70 for (i
= 0; i
< MT_DFS_NUM_ENGINES
; i
++) {
71 seq_printf(file
, "engine: %d\n", i
);
72 seq_printf(file
, " hw pattern detected:\t%d\n",
73 dfs_pd
->stats
[i
].hw_pattern
);
74 seq_printf(file
, " hw pulse discarded:\t%d\n",
75 dfs_pd
->stats
[i
].hw_pulse_discarded
);
76 seq_printf(file
, " sw pattern detected:\t%d\n",
77 dfs_pd
->stats
[i
].sw_pattern
);
84 mt76x02_dfs_stat_open(struct inode
*inode
, struct file
*f
)
86 return single_open(f
, mt76x02_dfs_stat_read
, inode
->i_private
);
89 static const struct file_operations fops_dfs_stat
= {
90 .open
= mt76x02_dfs_stat_open
,
93 .release
= single_release
,
96 static int read_agc(struct seq_file
*file
, void *data
)
98 struct mt76x02_dev
*dev
= dev_get_drvdata(file
->private);
100 seq_printf(file
, "avg_rssi: %d\n", dev
->cal
.avg_rssi_all
);
101 seq_printf(file
, "low_gain: %d\n", dev
->cal
.low_gain
);
102 seq_printf(file
, "false_cca: %d\n", dev
->cal
.false_cca
);
103 seq_printf(file
, "agc_gain_adjust: %d\n", dev
->cal
.agc_gain_adjust
);
109 mt76_edcca_set(void *data
, u64 val
)
111 struct mt76x02_dev
*dev
= data
;
112 enum nl80211_dfs_regions region
= dev
->mt76
.region
;
114 mutex_lock(&dev
->mt76
.mutex
);
116 dev
->ed_monitor_enabled
= !!val
;
117 dev
->ed_monitor
= dev
->ed_monitor_enabled
&&
118 region
== NL80211_DFS_ETSI
;
119 mt76x02_edcca_init(dev
);
121 mutex_unlock(&dev
->mt76
.mutex
);
127 mt76_edcca_get(void *data
, u64
*val
)
129 struct mt76x02_dev
*dev
= data
;
131 *val
= dev
->ed_monitor_enabled
;
135 DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca
, mt76_edcca_get
, mt76_edcca_set
,
138 void mt76x02_init_debugfs(struct mt76x02_dev
*dev
)
142 dir
= mt76_register_debugfs(&dev
->mt76
);
146 debugfs_create_u8("temperature", 0400, dir
, &dev
->cal
.temp
);
147 debugfs_create_bool("tpc", 0600, dir
, &dev
->enable_tpc
);
149 debugfs_create_file("edcca", 0600, dir
, dev
, &fops_edcca
);
150 debugfs_create_file("ampdu_stat", 0400, dir
, dev
, &fops_ampdu_stat
);
151 debugfs_create_file("dfs_stats", 0400, dir
, dev
, &fops_dfs_stat
);
152 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "txpower", dir
,
155 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "agc", dir
, read_agc
);
157 debugfs_create_u32("tx_hang_reset", 0400, dir
, &dev
->tx_hang_reset
);
159 EXPORT_SYMBOL_GPL(mt76x02_init_debugfs
);