18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: ISC 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci#include "mt7615.h" 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_cistatic int 68c2ecf20Sopenharmony_cimt7615_radar_pattern_set(void *data, u64 val) 78c2ecf20Sopenharmony_ci{ 88c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 98c2ecf20Sopenharmony_ci int err; 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 128c2ecf20Sopenharmony_ci return 0; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci mt7615_mutex_acquire(dev); 158c2ecf20Sopenharmony_ci err = mt7615_mcu_rdd_send_pattern(dev); 168c2ecf20Sopenharmony_ci mt7615_mutex_release(dev); 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci return err; 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_radar_pattern, NULL, 228c2ecf20Sopenharmony_ci mt7615_radar_pattern_set, "%lld\n"); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic int 258c2ecf20Sopenharmony_cimt7615_scs_set(void *data, u64 val) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 288c2ecf20Sopenharmony_ci struct mt7615_phy *ext_phy; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 318c2ecf20Sopenharmony_ci return 0; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci mt7615_mac_set_scs(&dev->phy, val); 348c2ecf20Sopenharmony_ci ext_phy = mt7615_ext_phy(dev); 358c2ecf20Sopenharmony_ci if (ext_phy) 368c2ecf20Sopenharmony_ci mt7615_mac_set_scs(ext_phy, val); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci return 0; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistatic int 428c2ecf20Sopenharmony_cimt7615_scs_get(void *data, u64 *val) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci *val = dev->phy.scs_en; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci return 0; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_scs, mt7615_scs_get, 528c2ecf20Sopenharmony_ci mt7615_scs_set, "%lld\n"); 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic int 558c2ecf20Sopenharmony_cimt7615_pm_set(void *data, u64 val) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 608c2ecf20Sopenharmony_ci return 0; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci return mt7615_pm_set_enable(dev, val); 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic int 668c2ecf20Sopenharmony_cimt7615_pm_get(void *data, u64 *val) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci *val = dev->pm.enable; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci return 0; 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_pm, mt7615_pm_get, mt7615_pm_set, "%lld\n"); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cistatic int 788c2ecf20Sopenharmony_cimt7615_pm_idle_timeout_set(void *data, u64 val) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci dev->pm.idle_timeout = msecs_to_jiffies(val); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci return 0; 858c2ecf20Sopenharmony_ci} 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistatic int 888c2ecf20Sopenharmony_cimt7615_pm_idle_timeout_get(void *data, u64 *val) 898c2ecf20Sopenharmony_ci{ 908c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci *val = jiffies_to_msecs(dev->pm.idle_timeout); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci return 0; 958c2ecf20Sopenharmony_ci} 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_pm_idle_timeout, mt7615_pm_idle_timeout_get, 988c2ecf20Sopenharmony_ci mt7615_pm_idle_timeout_set, "%lld\n"); 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistatic int 1018c2ecf20Sopenharmony_cimt7615_dbdc_set(void *data, u64 val) 1028c2ecf20Sopenharmony_ci{ 1038c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 1068c2ecf20Sopenharmony_ci return 0; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci if (val) 1098c2ecf20Sopenharmony_ci mt7615_register_ext_phy(dev); 1108c2ecf20Sopenharmony_ci else 1118c2ecf20Sopenharmony_ci mt7615_unregister_ext_phy(dev); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci return 0; 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistatic int 1178c2ecf20Sopenharmony_cimt7615_dbdc_get(void *data, u64 *val) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci *val = !!mt7615_ext_phy(dev); 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci return 0; 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_dbdc, mt7615_dbdc_get, 1278c2ecf20Sopenharmony_ci mt7615_dbdc_set, "%lld\n"); 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cistatic int 1308c2ecf20Sopenharmony_cimt7615_fw_debug_set(void *data, u64 val) 1318c2ecf20Sopenharmony_ci{ 1328c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 1358c2ecf20Sopenharmony_ci return 0; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci dev->fw_debug = val; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci mt7615_mutex_acquire(dev); 1408c2ecf20Sopenharmony_ci mt7615_mcu_fw_log_2_host(dev, dev->fw_debug ? 2 : 0); 1418c2ecf20Sopenharmony_ci mt7615_mutex_release(dev); 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci return 0; 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistatic int 1478c2ecf20Sopenharmony_cimt7615_fw_debug_get(void *data, u64 *val) 1488c2ecf20Sopenharmony_ci{ 1498c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci *val = dev->fw_debug; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci return 0; 1548c2ecf20Sopenharmony_ci} 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug, mt7615_fw_debug_get, 1578c2ecf20Sopenharmony_ci mt7615_fw_debug_set, "%lld\n"); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cistatic int 1608c2ecf20Sopenharmony_cimt7615_reset_test_set(void *data, u64 val) 1618c2ecf20Sopenharmony_ci{ 1628c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 1638c2ecf20Sopenharmony_ci struct sk_buff *skb; 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 1668c2ecf20Sopenharmony_ci return 0; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci skb = alloc_skb(1, GFP_KERNEL); 1698c2ecf20Sopenharmony_ci if (!skb) 1708c2ecf20Sopenharmony_ci return -ENOMEM; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci skb_put(skb, 1); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci mt7615_mutex_acquire(dev); 1758c2ecf20Sopenharmony_ci mt76_tx_queue_skb_raw(dev, 0, skb, 0); 1768c2ecf20Sopenharmony_ci mt7615_mutex_release(dev); 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci return 0; 1798c2ecf20Sopenharmony_ci} 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_reset_test, NULL, 1828c2ecf20Sopenharmony_ci mt7615_reset_test_set, "%lld\n"); 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_cistatic void 1858c2ecf20Sopenharmony_cimt7615_ampdu_stat_read_phy(struct mt7615_phy *phy, 1868c2ecf20Sopenharmony_ci struct seq_file *file) 1878c2ecf20Sopenharmony_ci{ 1888c2ecf20Sopenharmony_ci struct mt7615_dev *dev = file->private; 1898c2ecf20Sopenharmony_ci u32 reg = is_mt7663(&dev->mt76) ? MT_MIB_ARNG(0) : MT_AGG_ASRCR0; 1908c2ecf20Sopenharmony_ci bool ext_phy = phy != &dev->phy; 1918c2ecf20Sopenharmony_ci int bound[7], i, range; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci if (!phy) 1948c2ecf20Sopenharmony_ci return; 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci range = mt76_rr(dev, reg); 1978c2ecf20Sopenharmony_ci for (i = 0; i < 4; i++) 1988c2ecf20Sopenharmony_ci bound[i] = MT_AGG_ASRCR_RANGE(range, i) + 1; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci range = mt76_rr(dev, reg + 4); 2018c2ecf20Sopenharmony_ci for (i = 0; i < 3; i++) 2028c2ecf20Sopenharmony_ci bound[i + 4] = MT_AGG_ASRCR_RANGE(range, i) + 1; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci seq_printf(file, "\nPhy %d\n", ext_phy); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci seq_printf(file, "Length: %8d | ", bound[0]); 2078c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(bound) - 1; i++) 2088c2ecf20Sopenharmony_ci seq_printf(file, "%3d -%3d | ", 2098c2ecf20Sopenharmony_ci bound[i], bound[i + 1]); 2108c2ecf20Sopenharmony_ci seq_puts(file, "\nCount: "); 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci range = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0; 2138c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(bound); i++) 2148c2ecf20Sopenharmony_ci seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i + range]); 2158c2ecf20Sopenharmony_ci seq_puts(file, "\n"); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt); 2188c2ecf20Sopenharmony_ci seq_printf(file, "PER: %ld.%1ld%%\n", 2198c2ecf20Sopenharmony_ci phy->mib.aggr_per / 10, phy->mib.aggr_per % 10); 2208c2ecf20Sopenharmony_ci} 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_cistatic int 2238c2ecf20Sopenharmony_cimt7615_ampdu_stat_show(struct seq_file *file, void *data) 2248c2ecf20Sopenharmony_ci{ 2258c2ecf20Sopenharmony_ci struct mt7615_dev *dev = file->private; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci mt7615_mutex_acquire(dev); 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci mt7615_ampdu_stat_read_phy(&dev->phy, file); 2308c2ecf20Sopenharmony_ci mt7615_ampdu_stat_read_phy(mt7615_ext_phy(dev), file); 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci mt7615_mutex_release(dev); 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci return 0; 2358c2ecf20Sopenharmony_ci} 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(mt7615_ampdu_stat); 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistatic void 2408c2ecf20Sopenharmony_cimt7615_radio_read_phy(struct mt7615_phy *phy, struct seq_file *s) 2418c2ecf20Sopenharmony_ci{ 2428c2ecf20Sopenharmony_ci struct mt7615_dev *dev = dev_get_drvdata(s->private); 2438c2ecf20Sopenharmony_ci bool ext_phy = phy != &dev->phy; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci if (!phy) 2468c2ecf20Sopenharmony_ci return; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci seq_printf(s, "Radio %d sensitivity: ofdm=%d cck=%d\n", ext_phy, 2498c2ecf20Sopenharmony_ci phy->ofdm_sensitivity, phy->cck_sensitivity); 2508c2ecf20Sopenharmony_ci seq_printf(s, "Radio %d false CCA: ofdm=%d cck=%d\n", ext_phy, 2518c2ecf20Sopenharmony_ci phy->false_cca_ofdm, phy->false_cca_cck); 2528c2ecf20Sopenharmony_ci} 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_cistatic int 2558c2ecf20Sopenharmony_cimt7615_radio_read(struct seq_file *s, void *data) 2568c2ecf20Sopenharmony_ci{ 2578c2ecf20Sopenharmony_ci struct mt7615_dev *dev = dev_get_drvdata(s->private); 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci mt7615_radio_read_phy(&dev->phy, s); 2608c2ecf20Sopenharmony_ci mt7615_radio_read_phy(mt7615_ext_phy(dev), s); 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci return 0; 2638c2ecf20Sopenharmony_ci} 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_cistatic int mt7615_read_temperature(struct seq_file *s, void *data) 2668c2ecf20Sopenharmony_ci{ 2678c2ecf20Sopenharmony_ci struct mt7615_dev *dev = dev_get_drvdata(s->private); 2688c2ecf20Sopenharmony_ci int temp; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci if (!mt7615_wait_for_mcu_init(dev)) 2718c2ecf20Sopenharmony_ci return 0; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci /* cpu */ 2748c2ecf20Sopenharmony_ci mt7615_mutex_acquire(dev); 2758c2ecf20Sopenharmony_ci temp = mt7615_mcu_get_temperature(dev, 0); 2768c2ecf20Sopenharmony_ci mt7615_mutex_release(dev); 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci seq_printf(s, "Temperature: %d\n", temp); 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci return 0; 2818c2ecf20Sopenharmony_ci} 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_cistatic int 2848c2ecf20Sopenharmony_cimt7615_queues_acq(struct seq_file *s, void *data) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci struct mt7615_dev *dev = dev_get_drvdata(s->private); 2878c2ecf20Sopenharmony_ci int i; 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci mt7615_mutex_acquire(dev); 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci for (i = 0; i < 16; i++) { 2928c2ecf20Sopenharmony_ci int j, wmm_idx = i % MT7615_MAX_WMM_SETS; 2938c2ecf20Sopenharmony_ci int acs = i / MT7615_MAX_WMM_SETS; 2948c2ecf20Sopenharmony_ci u32 ctrl, val, qlen = 0; 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, wmm_idx)); 2978c2ecf20Sopenharmony_ci ctrl = BIT(31) | BIT(15) | (acs << 8); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci for (j = 0; j < 32; j++) { 3008c2ecf20Sopenharmony_ci if (val & BIT(j)) 3018c2ecf20Sopenharmony_ci continue; 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci mt76_wr(dev, MT_PLE_FL_Q0_CTRL, 3048c2ecf20Sopenharmony_ci ctrl | (j + (wmm_idx << 5))); 3058c2ecf20Sopenharmony_ci qlen += mt76_get_field(dev, MT_PLE_FL_Q3_CTRL, 3068c2ecf20Sopenharmony_ci GENMASK(11, 0)); 3078c2ecf20Sopenharmony_ci } 3088c2ecf20Sopenharmony_ci seq_printf(s, "AC%d%d: queued=%d\n", wmm_idx, acs, qlen); 3098c2ecf20Sopenharmony_ci } 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci mt7615_mutex_release(dev); 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci return 0; 3148c2ecf20Sopenharmony_ci} 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_cistatic int 3178c2ecf20Sopenharmony_cimt7615_queues_read(struct seq_file *s, void *data) 3188c2ecf20Sopenharmony_ci{ 3198c2ecf20Sopenharmony_ci struct mt7615_dev *dev = dev_get_drvdata(s->private); 3208c2ecf20Sopenharmony_ci static const struct { 3218c2ecf20Sopenharmony_ci char *queue; 3228c2ecf20Sopenharmony_ci int id; 3238c2ecf20Sopenharmony_ci } queue_map[] = { 3248c2ecf20Sopenharmony_ci { "PDMA0", MT_TXQ_BE }, 3258c2ecf20Sopenharmony_ci { "MCUQ", MT_TXQ_MCU }, 3268c2ecf20Sopenharmony_ci { "MCUFWQ", MT_TXQ_FWDL }, 3278c2ecf20Sopenharmony_ci }; 3288c2ecf20Sopenharmony_ci int i; 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(queue_map); i++) { 3318c2ecf20Sopenharmony_ci struct mt76_queue *q = dev->mt76.q_tx[queue_map[i].id]; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci if (!q) 3348c2ecf20Sopenharmony_ci continue; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci seq_printf(s, 3378c2ecf20Sopenharmony_ci "%s: queued=%d head=%d tail=%d\n", 3388c2ecf20Sopenharmony_ci queue_map[i].queue, q->queued, q->head, 3398c2ecf20Sopenharmony_ci q->tail); 3408c2ecf20Sopenharmony_ci } 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci return 0; 3438c2ecf20Sopenharmony_ci} 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cistatic int 3468c2ecf20Sopenharmony_cimt7615_rf_reg_set(void *data, u64 val) 3478c2ecf20Sopenharmony_ci{ 3488c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci mt7615_rf_wr(dev, dev->debugfs_rf_wf, dev->debugfs_rf_reg, val); 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci return 0; 3538c2ecf20Sopenharmony_ci} 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_cistatic int 3568c2ecf20Sopenharmony_cimt7615_rf_reg_get(void *data, u64 *val) 3578c2ecf20Sopenharmony_ci{ 3588c2ecf20Sopenharmony_ci struct mt7615_dev *dev = data; 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci *val = mt7615_rf_rr(dev, dev->debugfs_rf_wf, dev->debugfs_rf_reg); 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci return 0; 3638c2ecf20Sopenharmony_ci} 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_rf_reg, mt7615_rf_reg_get, mt7615_rf_reg_set, 3668c2ecf20Sopenharmony_ci "0x%08llx\n"); 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ciint mt7615_init_debugfs(struct mt7615_dev *dev) 3698c2ecf20Sopenharmony_ci{ 3708c2ecf20Sopenharmony_ci struct dentry *dir; 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci dir = mt76_register_debugfs(&dev->mt76); 3738c2ecf20Sopenharmony_ci if (!dir) 3748c2ecf20Sopenharmony_ci return -ENOMEM; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci if (is_mt7615(&dev->mt76)) 3778c2ecf20Sopenharmony_ci debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir, 3788c2ecf20Sopenharmony_ci mt7615_queues_read); 3798c2ecf20Sopenharmony_ci else 3808c2ecf20Sopenharmony_ci debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir, 3818c2ecf20Sopenharmony_ci mt76_queues_read); 3828c2ecf20Sopenharmony_ci debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir, 3838c2ecf20Sopenharmony_ci mt7615_queues_acq); 3848c2ecf20Sopenharmony_ci debugfs_create_file("ampdu_stat", 0400, dir, dev, &mt7615_ampdu_stat_fops); 3858c2ecf20Sopenharmony_ci debugfs_create_file("scs", 0600, dir, dev, &fops_scs); 3868c2ecf20Sopenharmony_ci debugfs_create_file("dbdc", 0600, dir, dev, &fops_dbdc); 3878c2ecf20Sopenharmony_ci debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug); 3888c2ecf20Sopenharmony_ci debugfs_create_file("runtime-pm", 0600, dir, dev, &fops_pm); 3898c2ecf20Sopenharmony_ci debugfs_create_file("idle-timeout", 0600, dir, dev, 3908c2ecf20Sopenharmony_ci &fops_pm_idle_timeout); 3918c2ecf20Sopenharmony_ci debugfs_create_devm_seqfile(dev->mt76.dev, "radio", dir, 3928c2ecf20Sopenharmony_ci mt7615_radio_read); 3938c2ecf20Sopenharmony_ci debugfs_create_u32("dfs_hw_pattern", 0400, dir, &dev->hw_pattern); 3948c2ecf20Sopenharmony_ci /* test pattern knobs */ 3958c2ecf20Sopenharmony_ci debugfs_create_u8("pattern_len", 0600, dir, 3968c2ecf20Sopenharmony_ci &dev->radar_pattern.n_pulses); 3978c2ecf20Sopenharmony_ci debugfs_create_u32("pulse_period", 0600, dir, 3988c2ecf20Sopenharmony_ci &dev->radar_pattern.period); 3998c2ecf20Sopenharmony_ci debugfs_create_u16("pulse_width", 0600, dir, 4008c2ecf20Sopenharmony_ci &dev->radar_pattern.width); 4018c2ecf20Sopenharmony_ci debugfs_create_u16("pulse_power", 0600, dir, 4028c2ecf20Sopenharmony_ci &dev->radar_pattern.power); 4038c2ecf20Sopenharmony_ci debugfs_create_file("radar_trigger", 0200, dir, dev, 4048c2ecf20Sopenharmony_ci &fops_radar_pattern); 4058c2ecf20Sopenharmony_ci debugfs_create_file("reset_test", 0200, dir, dev, 4068c2ecf20Sopenharmony_ci &fops_reset_test); 4078c2ecf20Sopenharmony_ci debugfs_create_devm_seqfile(dev->mt76.dev, "temperature", dir, 4088c2ecf20Sopenharmony_ci mt7615_read_temperature); 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ci debugfs_create_u32("rf_wfidx", 0600, dir, &dev->debugfs_rf_wf); 4118c2ecf20Sopenharmony_ci debugfs_create_u32("rf_regidx", 0600, dir, &dev->debugfs_rf_reg); 4128c2ecf20Sopenharmony_ci debugfs_create_file_unsafe("rf_regval", 0600, dir, dev, 4138c2ecf20Sopenharmony_ci &fops_rf_reg); 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci return 0; 4168c2ecf20Sopenharmony_ci} 4178c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mt7615_init_debugfs); 418