1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
6 #include <linux/debugfs.h>
10 mt76x02_ampdu_stat_show(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
->mphy
.aggr_stats
[i
* 8 + j
]);
25 seq_puts(file
, "--------");
26 for (j
= 0; j
< 8; j
++)
27 seq_puts(file
, "-----------");
34 DEFINE_SHOW_ATTRIBUTE(mt76x02_ampdu_stat
);
36 static int read_txpower(struct seq_file
*file
, void *data
)
38 struct mt76x02_dev
*dev
= dev_get_drvdata(file
->private);
40 seq_printf(file
, "Target power: %d\n", dev
->target_power
);
42 mt76_seq_puts_array(file
, "Delta", dev
->target_power_delta
,
43 ARRAY_SIZE(dev
->target_power_delta
));
48 mt76x02_dfs_stat_show(struct seq_file
*file
, void *data
)
50 struct mt76x02_dev
*dev
= file
->private;
51 struct mt76x02_dfs_pattern_detector
*dfs_pd
= &dev
->dfs_pd
;
54 seq_printf(file
, "allocated sequences:\t%d\n",
55 dfs_pd
->seq_stats
.seq_pool_len
);
56 seq_printf(file
, "used sequences:\t\t%d\n",
57 dfs_pd
->seq_stats
.seq_len
);
60 for (i
= 0; i
< MT_DFS_NUM_ENGINES
; i
++) {
61 seq_printf(file
, "engine: %d\n", i
);
62 seq_printf(file
, " hw pattern detected:\t%d\n",
63 dfs_pd
->stats
[i
].hw_pattern
);
64 seq_printf(file
, " hw pulse discarded:\t%d\n",
65 dfs_pd
->stats
[i
].hw_pulse_discarded
);
66 seq_printf(file
, " sw pattern detected:\t%d\n",
67 dfs_pd
->stats
[i
].sw_pattern
);
73 DEFINE_SHOW_ATTRIBUTE(mt76x02_dfs_stat
);
75 static int read_agc(struct seq_file
*file
, void *data
)
77 struct mt76x02_dev
*dev
= dev_get_drvdata(file
->private);
79 seq_printf(file
, "avg_rssi: %d\n", dev
->cal
.avg_rssi_all
);
80 seq_printf(file
, "low_gain: %d\n", dev
->cal
.low_gain
);
81 seq_printf(file
, "false_cca: %d\n", dev
->cal
.false_cca
);
82 seq_printf(file
, "agc_gain_adjust: %d\n", dev
->cal
.agc_gain_adjust
);
88 mt76_edcca_set(void *data
, u64 val
)
90 struct mt76x02_dev
*dev
= data
;
91 enum nl80211_dfs_regions region
= dev
->mt76
.region
;
93 mutex_lock(&dev
->mt76
.mutex
);
95 dev
->ed_monitor_enabled
= !!val
;
96 dev
->ed_monitor
= dev
->ed_monitor_enabled
&&
97 region
== NL80211_DFS_ETSI
;
98 mt76x02_edcca_init(dev
);
100 mutex_unlock(&dev
->mt76
.mutex
);
106 mt76_edcca_get(void *data
, u64
*val
)
108 struct mt76x02_dev
*dev
= data
;
110 *val
= dev
->ed_monitor_enabled
;
114 DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca
, mt76_edcca_get
, mt76_edcca_set
,
117 static int mt76x02_read_rate_txpower(struct seq_file
*s
, void *data
)
119 struct mt76x02_dev
*dev
= dev_get_drvdata(s
->private);
121 mt76_seq_puts_array(s
, "CCK", dev
->rate_power
.cck
,
122 ARRAY_SIZE(dev
->rate_power
.cck
));
123 mt76_seq_puts_array(s
, "OFDM", dev
->rate_power
.ofdm
,
124 ARRAY_SIZE(dev
->rate_power
.ofdm
));
125 mt76_seq_puts_array(s
, "HT", dev
->rate_power
.ht
,
126 ARRAY_SIZE(dev
->rate_power
.ht
));
127 mt76_seq_puts_array(s
, "VHT", dev
->rate_power
.vht
,
128 ARRAY_SIZE(dev
->rate_power
.vht
));
132 void mt76x02_init_debugfs(struct mt76x02_dev
*dev
)
136 dir
= mt76_register_debugfs(&dev
->mt76
);
140 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "xmit-queues", dir
,
142 debugfs_create_u8("temperature", 0400, dir
, &dev
->cal
.temp
);
143 debugfs_create_bool("tpc", 0600, dir
, &dev
->enable_tpc
);
145 debugfs_create_file("edcca", 0600, dir
, dev
, &fops_edcca
);
146 debugfs_create_file("ampdu_stat", 0400, dir
, dev
, &mt76x02_ampdu_stat_fops
);
147 debugfs_create_file("dfs_stats", 0400, dir
, dev
, &mt76x02_dfs_stat_fops
);
148 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "txpower", dir
,
151 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "rate_txpower", dir
,
152 mt76x02_read_rate_txpower
);
153 debugfs_create_devm_seqfile(dev
->mt76
.dev
, "agc", dir
, read_agc
);
155 debugfs_create_u32("tx_hang_reset", 0400, dir
, &dev
->tx_hang_reset
);
157 EXPORT_SYMBOL_GPL(mt76x02_init_debugfs
);