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