16c92544dSBjoern A. Zeeb // SPDX-License-Identifier: ISC 26c92544dSBjoern A. Zeeb /* 36c92544dSBjoern A. Zeeb * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name> 46c92544dSBjoern A. Zeeb */ 56c92544dSBjoern A. Zeeb 66c92544dSBjoern A. Zeeb #include <linux/debugfs.h> 76c92544dSBjoern A. Zeeb #include "mt76x02.h" 86c92544dSBjoern A. Zeeb 96c92544dSBjoern A. Zeeb static int 106c92544dSBjoern A. Zeeb mt76x02_ampdu_stat_show(struct seq_file *file, void *data) 116c92544dSBjoern A. Zeeb { 126c92544dSBjoern A. Zeeb struct mt76x02_dev *dev = file->private; 136c92544dSBjoern A. Zeeb int i, j; 146c92544dSBjoern A. Zeeb 156c92544dSBjoern A. Zeeb for (i = 0; i < 4; i++) { 166c92544dSBjoern A. Zeeb seq_puts(file, "Length: "); 176c92544dSBjoern A. Zeeb for (j = 0; j < 8; j++) 186c92544dSBjoern A. Zeeb seq_printf(file, "%8d | ", i * 8 + j + 1); 196c92544dSBjoern A. Zeeb seq_puts(file, "\n"); 206c92544dSBjoern A. Zeeb seq_puts(file, "Count: "); 216c92544dSBjoern A. Zeeb for (j = 0; j < 8; j++) 226c92544dSBjoern A. Zeeb seq_printf(file, "%8d | ", 236c92544dSBjoern A. Zeeb dev->mt76.aggr_stats[i * 8 + j]); 246c92544dSBjoern A. Zeeb seq_puts(file, "\n"); 256c92544dSBjoern A. Zeeb seq_puts(file, "--------"); 266c92544dSBjoern A. Zeeb for (j = 0; j < 8; j++) 276c92544dSBjoern A. Zeeb seq_puts(file, "-----------"); 286c92544dSBjoern A. Zeeb seq_puts(file, "\n"); 296c92544dSBjoern A. Zeeb } 306c92544dSBjoern A. Zeeb 316c92544dSBjoern A. Zeeb return 0; 326c92544dSBjoern A. Zeeb } 336c92544dSBjoern A. Zeeb 346c92544dSBjoern A. Zeeb DEFINE_SHOW_ATTRIBUTE(mt76x02_ampdu_stat); 356c92544dSBjoern A. Zeeb 366c92544dSBjoern A. Zeeb static int read_txpower(struct seq_file *file, void *data) 376c92544dSBjoern A. Zeeb { 386c92544dSBjoern A. Zeeb struct mt76x02_dev *dev = dev_get_drvdata(file->private); 396c92544dSBjoern A. Zeeb 406c92544dSBjoern A. Zeeb seq_printf(file, "Target power: %d\n", dev->target_power); 416c92544dSBjoern A. Zeeb 426c92544dSBjoern A. Zeeb mt76_seq_puts_array(file, "Delta", dev->target_power_delta, 436c92544dSBjoern A. Zeeb ARRAY_SIZE(dev->target_power_delta)); 446c92544dSBjoern A. Zeeb return 0; 456c92544dSBjoern A. Zeeb } 466c92544dSBjoern A. Zeeb 476c92544dSBjoern A. Zeeb static int 486c92544dSBjoern A. Zeeb mt76x02_dfs_stat_show(struct seq_file *file, void *data) 496c92544dSBjoern A. Zeeb { 506c92544dSBjoern A. Zeeb struct mt76x02_dev *dev = file->private; 516c92544dSBjoern A. Zeeb struct mt76x02_dfs_pattern_detector *dfs_pd = &dev->dfs_pd; 526c92544dSBjoern A. Zeeb int i; 536c92544dSBjoern A. Zeeb 546c92544dSBjoern A. Zeeb seq_printf(file, "allocated sequences:\t%d\n", 556c92544dSBjoern A. Zeeb dfs_pd->seq_stats.seq_pool_len); 566c92544dSBjoern A. Zeeb seq_printf(file, "used sequences:\t\t%d\n", 576c92544dSBjoern A. Zeeb dfs_pd->seq_stats.seq_len); 586c92544dSBjoern A. Zeeb seq_puts(file, "\n"); 596c92544dSBjoern A. Zeeb 606c92544dSBjoern A. Zeeb for (i = 0; i < MT_DFS_NUM_ENGINES; i++) { 616c92544dSBjoern A. Zeeb seq_printf(file, "engine: %d\n", i); 626c92544dSBjoern A. Zeeb seq_printf(file, " hw pattern detected:\t%d\n", 636c92544dSBjoern A. Zeeb dfs_pd->stats[i].hw_pattern); 646c92544dSBjoern A. Zeeb seq_printf(file, " hw pulse discarded:\t%d\n", 656c92544dSBjoern A. Zeeb dfs_pd->stats[i].hw_pulse_discarded); 666c92544dSBjoern A. Zeeb seq_printf(file, " sw pattern detected:\t%d\n", 676c92544dSBjoern A. Zeeb dfs_pd->stats[i].sw_pattern); 686c92544dSBjoern A. Zeeb } 696c92544dSBjoern A. Zeeb 706c92544dSBjoern A. Zeeb return 0; 716c92544dSBjoern A. Zeeb } 726c92544dSBjoern A. Zeeb 736c92544dSBjoern A. Zeeb DEFINE_SHOW_ATTRIBUTE(mt76x02_dfs_stat); 746c92544dSBjoern A. Zeeb 756c92544dSBjoern A. Zeeb static int read_agc(struct seq_file *file, void *data) 766c92544dSBjoern A. Zeeb { 776c92544dSBjoern A. Zeeb struct mt76x02_dev *dev = dev_get_drvdata(file->private); 786c92544dSBjoern A. Zeeb 796c92544dSBjoern A. Zeeb seq_printf(file, "avg_rssi: %d\n", dev->cal.avg_rssi_all); 806c92544dSBjoern A. Zeeb seq_printf(file, "low_gain: %d\n", dev->cal.low_gain); 816c92544dSBjoern A. Zeeb seq_printf(file, "false_cca: %d\n", dev->cal.false_cca); 826c92544dSBjoern A. Zeeb seq_printf(file, "agc_gain_adjust: %d\n", dev->cal.agc_gain_adjust); 836c92544dSBjoern A. Zeeb 846c92544dSBjoern A. Zeeb return 0; 856c92544dSBjoern A. Zeeb } 866c92544dSBjoern A. Zeeb 876c92544dSBjoern A. Zeeb static int 886c92544dSBjoern A. Zeeb mt76_edcca_set(void *data, u64 val) 896c92544dSBjoern A. Zeeb { 906c92544dSBjoern A. Zeeb struct mt76x02_dev *dev = data; 916c92544dSBjoern A. Zeeb enum nl80211_dfs_regions region = dev->mt76.region; 926c92544dSBjoern A. Zeeb 936c92544dSBjoern A. Zeeb mutex_lock(&dev->mt76.mutex); 946c92544dSBjoern A. Zeeb 956c92544dSBjoern A. Zeeb dev->ed_monitor_enabled = !!val; 966c92544dSBjoern A. Zeeb dev->ed_monitor = dev->ed_monitor_enabled && 976c92544dSBjoern A. Zeeb region == NL80211_DFS_ETSI; 986c92544dSBjoern A. Zeeb mt76x02_edcca_init(dev); 996c92544dSBjoern A. Zeeb 1006c92544dSBjoern A. Zeeb mutex_unlock(&dev->mt76.mutex); 1016c92544dSBjoern A. Zeeb 1026c92544dSBjoern A. Zeeb return 0; 1036c92544dSBjoern A. Zeeb } 1046c92544dSBjoern A. Zeeb 1056c92544dSBjoern A. Zeeb static int 1066c92544dSBjoern A. Zeeb mt76_edcca_get(void *data, u64 *val) 1076c92544dSBjoern A. Zeeb { 1086c92544dSBjoern A. Zeeb struct mt76x02_dev *dev = data; 1096c92544dSBjoern A. Zeeb 1106c92544dSBjoern A. Zeeb *val = dev->ed_monitor_enabled; 1116c92544dSBjoern A. Zeeb return 0; 1126c92544dSBjoern A. Zeeb } 1136c92544dSBjoern A. Zeeb 1146c92544dSBjoern A. Zeeb DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca, mt76_edcca_get, mt76_edcca_set, 1156c92544dSBjoern A. Zeeb "%lld\n"); 1166c92544dSBjoern A. Zeeb 1176c92544dSBjoern A. Zeeb void mt76x02_init_debugfs(struct mt76x02_dev *dev) 1186c92544dSBjoern A. Zeeb { 1196c92544dSBjoern A. Zeeb struct dentry *dir; 1206c92544dSBjoern A. Zeeb 1216c92544dSBjoern A. Zeeb dir = mt76_register_debugfs(&dev->mt76); 1226c92544dSBjoern A. Zeeb if (!dir) 1236c92544dSBjoern A. Zeeb return; 1246c92544dSBjoern A. Zeeb 1256c92544dSBjoern A. Zeeb debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir, 1266c92544dSBjoern A. Zeeb mt76_queues_read); 1276c92544dSBjoern A. Zeeb debugfs_create_u8("temperature", 0400, dir, &dev->cal.temp); 1286c92544dSBjoern A. Zeeb debugfs_create_bool("tpc", 0600, dir, &dev->enable_tpc); 1296c92544dSBjoern A. Zeeb 1306c92544dSBjoern A. Zeeb debugfs_create_file("edcca", 0600, dir, dev, &fops_edcca); 1316c92544dSBjoern A. Zeeb debugfs_create_file("ampdu_stat", 0400, dir, dev, &mt76x02_ampdu_stat_fops); 1326c92544dSBjoern A. Zeeb debugfs_create_file("dfs_stats", 0400, dir, dev, &mt76x02_dfs_stat_fops); 1336c92544dSBjoern A. Zeeb debugfs_create_devm_seqfile(dev->mt76.dev, "txpower", dir, 1346c92544dSBjoern A. Zeeb read_txpower); 1356c92544dSBjoern A. Zeeb 1366c92544dSBjoern A. Zeeb debugfs_create_devm_seqfile(dev->mt76.dev, "agc", dir, read_agc); 1376c92544dSBjoern A. Zeeb 1386c92544dSBjoern A. Zeeb debugfs_create_u32("tx_hang_reset", 0400, dir, &dev->tx_hang_reset); 1396c92544dSBjoern A. Zeeb } 1406c92544dSBjoern A. Zeeb EXPORT_SYMBOL_GPL(mt76x02_init_debugfs); 141