10e3d6777SRyder Lee // SPDX-License-Identifier: ISC 276055413SLorenzo Bianconi /* 376055413SLorenzo Bianconi * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name> 476055413SLorenzo Bianconi */ 576055413SLorenzo Bianconi 676055413SLorenzo Bianconi #include <linux/debugfs.h> 776055413SLorenzo Bianconi #include "mt76x02.h" 876055413SLorenzo Bianconi 976055413SLorenzo Bianconi static int 1076055413SLorenzo Bianconi mt76x02_ampdu_stat_read(struct seq_file *file, void *data) 1176055413SLorenzo Bianconi { 1276055413SLorenzo Bianconi struct mt76x02_dev *dev = file->private; 1376055413SLorenzo Bianconi int i, j; 1476055413SLorenzo Bianconi 1576055413SLorenzo Bianconi for (i = 0; i < 4; i++) { 1676055413SLorenzo Bianconi seq_puts(file, "Length: "); 1776055413SLorenzo Bianconi for (j = 0; j < 8; j++) 1876055413SLorenzo Bianconi seq_printf(file, "%8d | ", i * 8 + j + 1); 1976055413SLorenzo Bianconi seq_puts(file, "\n"); 2076055413SLorenzo Bianconi seq_puts(file, "Count: "); 2176055413SLorenzo Bianconi for (j = 0; j < 8; j++) 22d7b47bbdSLorenzo Bianconi seq_printf(file, "%8d | ", 23d7b47bbdSLorenzo Bianconi dev->mt76.aggr_stats[i * 8 + j]); 2476055413SLorenzo Bianconi seq_puts(file, "\n"); 2576055413SLorenzo Bianconi seq_puts(file, "--------"); 2676055413SLorenzo Bianconi for (j = 0; j < 8; j++) 2776055413SLorenzo Bianconi seq_puts(file, "-----------"); 2876055413SLorenzo Bianconi seq_puts(file, "\n"); 2976055413SLorenzo Bianconi } 3076055413SLorenzo Bianconi 3176055413SLorenzo Bianconi return 0; 3276055413SLorenzo Bianconi } 3376055413SLorenzo Bianconi 3476055413SLorenzo Bianconi static int 3576055413SLorenzo Bianconi mt76x02_ampdu_stat_open(struct inode *inode, struct file *f) 3676055413SLorenzo Bianconi { 3776055413SLorenzo Bianconi return single_open(f, mt76x02_ampdu_stat_read, inode->i_private); 3876055413SLorenzo Bianconi } 3976055413SLorenzo Bianconi 4076055413SLorenzo Bianconi static int read_txpower(struct seq_file *file, void *data) 4176055413SLorenzo Bianconi { 4276055413SLorenzo Bianconi struct mt76x02_dev *dev = dev_get_drvdata(file->private); 4376055413SLorenzo Bianconi 4476055413SLorenzo Bianconi seq_printf(file, "Target power: %d\n", dev->target_power); 4576055413SLorenzo Bianconi 4676055413SLorenzo Bianconi mt76_seq_puts_array(file, "Delta", dev->target_power_delta, 4776055413SLorenzo Bianconi ARRAY_SIZE(dev->target_power_delta)); 4876055413SLorenzo Bianconi return 0; 4976055413SLorenzo Bianconi } 5076055413SLorenzo Bianconi 5176055413SLorenzo Bianconi static const struct file_operations fops_ampdu_stat = { 5276055413SLorenzo Bianconi .open = mt76x02_ampdu_stat_open, 5376055413SLorenzo Bianconi .read = seq_read, 5476055413SLorenzo Bianconi .llseek = seq_lseek, 5576055413SLorenzo Bianconi .release = single_release, 5676055413SLorenzo Bianconi }; 5776055413SLorenzo Bianconi 5876055413SLorenzo Bianconi static int 5976055413SLorenzo Bianconi mt76x02_dfs_stat_read(struct seq_file *file, void *data) 6076055413SLorenzo Bianconi { 6176055413SLorenzo Bianconi struct mt76x02_dev *dev = file->private; 6276055413SLorenzo Bianconi struct mt76x02_dfs_pattern_detector *dfs_pd = &dev->dfs_pd; 6376055413SLorenzo Bianconi int i; 6476055413SLorenzo Bianconi 6576055413SLorenzo Bianconi seq_printf(file, "allocated sequences:\t%d\n", 6676055413SLorenzo Bianconi dfs_pd->seq_stats.seq_pool_len); 6776055413SLorenzo Bianconi seq_printf(file, "used sequences:\t\t%d\n", 6876055413SLorenzo Bianconi dfs_pd->seq_stats.seq_len); 6976055413SLorenzo Bianconi seq_puts(file, "\n"); 7076055413SLorenzo Bianconi 7176055413SLorenzo Bianconi for (i = 0; i < MT_DFS_NUM_ENGINES; i++) { 7276055413SLorenzo Bianconi seq_printf(file, "engine: %d\n", i); 7376055413SLorenzo Bianconi seq_printf(file, " hw pattern detected:\t%d\n", 7476055413SLorenzo Bianconi dfs_pd->stats[i].hw_pattern); 7576055413SLorenzo Bianconi seq_printf(file, " hw pulse discarded:\t%d\n", 7676055413SLorenzo Bianconi dfs_pd->stats[i].hw_pulse_discarded); 7776055413SLorenzo Bianconi seq_printf(file, " sw pattern detected:\t%d\n", 7876055413SLorenzo Bianconi dfs_pd->stats[i].sw_pattern); 7976055413SLorenzo Bianconi } 8076055413SLorenzo Bianconi 8176055413SLorenzo Bianconi return 0; 8276055413SLorenzo Bianconi } 8376055413SLorenzo Bianconi 8476055413SLorenzo Bianconi static int 8576055413SLorenzo Bianconi mt76x02_dfs_stat_open(struct inode *inode, struct file *f) 8676055413SLorenzo Bianconi { 8776055413SLorenzo Bianconi return single_open(f, mt76x02_dfs_stat_read, inode->i_private); 8876055413SLorenzo Bianconi } 8976055413SLorenzo Bianconi 9076055413SLorenzo Bianconi static const struct file_operations fops_dfs_stat = { 9176055413SLorenzo Bianconi .open = mt76x02_dfs_stat_open, 9276055413SLorenzo Bianconi .read = seq_read, 9376055413SLorenzo Bianconi .llseek = seq_lseek, 9476055413SLorenzo Bianconi .release = single_release, 9576055413SLorenzo Bianconi }; 9676055413SLorenzo Bianconi 9776055413SLorenzo Bianconi static int read_agc(struct seq_file *file, void *data) 9876055413SLorenzo Bianconi { 9976055413SLorenzo Bianconi struct mt76x02_dev *dev = dev_get_drvdata(file->private); 10076055413SLorenzo Bianconi 10176055413SLorenzo Bianconi seq_printf(file, "avg_rssi: %d\n", dev->cal.avg_rssi_all); 10276055413SLorenzo Bianconi seq_printf(file, "low_gain: %d\n", dev->cal.low_gain); 10376055413SLorenzo Bianconi seq_printf(file, "false_cca: %d\n", dev->cal.false_cca); 10476055413SLorenzo Bianconi seq_printf(file, "agc_gain_adjust: %d\n", dev->cal.agc_gain_adjust); 10576055413SLorenzo Bianconi 10676055413SLorenzo Bianconi return 0; 10776055413SLorenzo Bianconi } 10876055413SLorenzo Bianconi 109643749d4SFelix Fietkau static int 110643749d4SFelix Fietkau mt76_edcca_set(void *data, u64 val) 111643749d4SFelix Fietkau { 112643749d4SFelix Fietkau struct mt76x02_dev *dev = data; 113d8b8890dSLorenzo Bianconi enum nl80211_dfs_regions region = dev->mt76.region; 114643749d4SFelix Fietkau 1158aac454dSLorenzo Bianconi mutex_lock(&dev->mt76.mutex); 1168aac454dSLorenzo Bianconi 117643749d4SFelix Fietkau dev->ed_monitor_enabled = !!val; 118643749d4SFelix Fietkau dev->ed_monitor = dev->ed_monitor_enabled && 119643749d4SFelix Fietkau region == NL80211_DFS_ETSI; 120a78f1547SLorenzo Bianconi mt76x02_edcca_init(dev); 121643749d4SFelix Fietkau 1228aac454dSLorenzo Bianconi mutex_unlock(&dev->mt76.mutex); 1238aac454dSLorenzo Bianconi 124643749d4SFelix Fietkau return 0; 125643749d4SFelix Fietkau } 126643749d4SFelix Fietkau 127643749d4SFelix Fietkau static int 128643749d4SFelix Fietkau mt76_edcca_get(void *data, u64 *val) 129643749d4SFelix Fietkau { 130643749d4SFelix Fietkau struct mt76x02_dev *dev = data; 131643749d4SFelix Fietkau 132643749d4SFelix Fietkau *val = dev->ed_monitor_enabled; 133643749d4SFelix Fietkau return 0; 134643749d4SFelix Fietkau } 135643749d4SFelix Fietkau 136643749d4SFelix Fietkau DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca, mt76_edcca_get, mt76_edcca_set, 137643749d4SFelix Fietkau "%lld\n"); 138643749d4SFelix Fietkau 13976055413SLorenzo Bianconi void mt76x02_init_debugfs(struct mt76x02_dev *dev) 14076055413SLorenzo Bianconi { 14176055413SLorenzo Bianconi struct dentry *dir; 14276055413SLorenzo Bianconi 14376055413SLorenzo Bianconi dir = mt76_register_debugfs(&dev->mt76); 14476055413SLorenzo Bianconi if (!dir) 14576055413SLorenzo Bianconi return; 14676055413SLorenzo Bianconi 1470b82a8e8SLorenzo Bianconi debugfs_create_devm_seqfile(dev->mt76.dev, "queues", dir, 1480b82a8e8SLorenzo Bianconi mt76_queues_read); 14976055413SLorenzo Bianconi debugfs_create_u8("temperature", 0400, dir, &dev->cal.temp); 15076055413SLorenzo Bianconi debugfs_create_bool("tpc", 0600, dir, &dev->enable_tpc); 15176055413SLorenzo Bianconi 1524a8c99c7SLorenzo Bianconi debugfs_create_file("edcca", 0600, dir, dev, &fops_edcca); 15376055413SLorenzo Bianconi debugfs_create_file("ampdu_stat", 0400, dir, dev, &fops_ampdu_stat); 15476055413SLorenzo Bianconi debugfs_create_file("dfs_stats", 0400, dir, dev, &fops_dfs_stat); 15576055413SLorenzo Bianconi debugfs_create_devm_seqfile(dev->mt76.dev, "txpower", dir, 15676055413SLorenzo Bianconi read_txpower); 15776055413SLorenzo Bianconi 15876055413SLorenzo Bianconi debugfs_create_devm_seqfile(dev->mt76.dev, "agc", dir, read_agc); 159c1e0d2beSLorenzo Bianconi 160c1e0d2beSLorenzo Bianconi debugfs_create_u32("tx_hang_reset", 0400, dir, &dev->tx_hang_reset); 16176055413SLorenzo Bianconi } 16276055413SLorenzo Bianconi EXPORT_SYMBOL_GPL(mt76x02_init_debugfs); 163