Path: blob/main/sys/contrib/dev/mediatek/mt76/mt7925/debugfs.c
48525 views
// SPDX-License-Identifier: ISC1/* Copyright (C) 2023 MediaTek Inc. */23#include "mt7925.h"4#include "mcu.h"56static int7mt7925_reg_set(void *data, u64 val)8{9struct mt792x_dev *dev = data;10u32 regval = val;1112mt792x_mutex_acquire(dev);13mt7925_mcu_regval(dev, dev->mt76.debugfs_reg, ®val, true);14mt792x_mutex_release(dev);1516return 0;17}1819static int20mt7925_reg_get(void *data, u64 *val)21{22struct mt792x_dev *dev = data;23u32 regval;24int ret;2526mt792x_mutex_acquire(dev);27ret = mt7925_mcu_regval(dev, dev->mt76.debugfs_reg, ®val, false);28mt792x_mutex_release(dev);29if (!ret)30*val = regval;3132return 0;33}3435DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt7925_reg_get, mt7925_reg_set,36"0x%08llx\n");37static int38mt7925_fw_debug_set(void *data, u64 val)39{40struct mt792x_dev *dev = data;4142mt792x_mutex_acquire(dev);4344dev->fw_debug = (u8)val;45mt7925_mcu_fw_log_2_host(dev, dev->fw_debug);4647mt792x_mutex_release(dev);4849return 0;50}5152static int53mt7925_fw_debug_get(void *data, u64 *val)54{55struct mt792x_dev *dev = data;5657*val = dev->fw_debug;5859return 0;60}6162DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug, mt7925_fw_debug_get,63mt7925_fw_debug_set, "%lld\n");6465DEFINE_SHOW_ATTRIBUTE(mt792x_tx_stats);6667static void68mt7925_seq_puts_array(struct seq_file *file, const char *str,69s8 val[][2], int len, u8 band_idx)70{71int i;7273seq_printf(file, "%-22s:", str);74for (i = 0; i < len; i++)75if (val[i][band_idx] == 127)76seq_printf(file, " %6s", "N.A");77else78seq_printf(file, " %6d", val[i][band_idx]);79seq_puts(file, "\n");80}8182#define mt7925_print_txpwr_entry(prefix, rate, idx) \83({ \84mt7925_seq_puts_array(s, #prefix " (tmac)", \85txpwr->rate, \86ARRAY_SIZE(txpwr->rate), \87idx); \88})8990static inline void91mt7925_eht_txpwr(struct seq_file *s, struct mt7925_txpwr *txpwr, u8 band_idx)92{93seq_printf(s, "%-22s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",94" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",95"mcs6", "mcs7", "mcs8", "mcs9", "mcs10", "mcs11",96"mcs12", "mcs13", "mcs14", "mcs15");97mt7925_print_txpwr_entry(EHT26, eht26, band_idx);98mt7925_print_txpwr_entry(EHT52, eht52, band_idx);99mt7925_print_txpwr_entry(EHT106, eht106, band_idx);100mt7925_print_txpwr_entry(EHT242, eht242, band_idx);101mt7925_print_txpwr_entry(EHT484, eht484, band_idx);102103mt7925_print_txpwr_entry(EHT996, eht996, band_idx);104mt7925_print_txpwr_entry(EHT996x2, eht996x2, band_idx);105mt7925_print_txpwr_entry(EHT996x4, eht996x4, band_idx);106mt7925_print_txpwr_entry(EHT26_52, eht26_52, band_idx);107mt7925_print_txpwr_entry(EHT26_106, eht26_106, band_idx);108mt7925_print_txpwr_entry(EHT484_242, eht484_242, band_idx);109mt7925_print_txpwr_entry(EHT996_484, eht996_484, band_idx);110mt7925_print_txpwr_entry(EHT996_484_242, eht996_484_242, band_idx);111mt7925_print_txpwr_entry(EHT996x2_484, eht996x2_484, band_idx);112mt7925_print_txpwr_entry(EHT996x3, eht996x3, band_idx);113mt7925_print_txpwr_entry(EHT996x3_484, eht996x3_484, band_idx);114}115116static int117mt7925_txpwr(struct seq_file *s, void *data)118{119struct mt792x_dev *dev = dev_get_drvdata(s->private);120struct mt7925_txpwr *txpwr = NULL;121u8 band_idx = dev->mphy.band_idx;122int ret = 0;123124txpwr = devm_kmalloc(dev->mt76.dev, sizeof(*txpwr), GFP_KERNEL);125126if (!txpwr)127return -ENOMEM;128129mt792x_mutex_acquire(dev);130ret = mt7925_get_txpwr_info(dev, band_idx, txpwr);131mt792x_mutex_release(dev);132133if (ret)134goto out;135136seq_printf(s, "%-22s %6s %6s %6s %6s\n",137" ", "1m", "2m", "5m", "11m");138mt7925_print_txpwr_entry(CCK, cck, band_idx);139140seq_printf(s, "%-22s %6s %6s %6s %6s %6s %6s %6s %6s\n",141" ", "6m", "9m", "12m", "18m", "24m", "36m",142"48m", "54m");143mt7925_print_txpwr_entry(OFDM, ofdm, band_idx);144145seq_printf(s, "%-22s %6s %6s %6s %6s %6s %6s %6s %6s\n",146" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",147"mcs6", "mcs7");148mt7925_print_txpwr_entry(HT20, ht20, band_idx);149150seq_printf(s, "%-22s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",151" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",152"mcs6", "mcs7", "mcs32");153mt7925_print_txpwr_entry(HT40, ht40, band_idx);154155seq_printf(s, "%-22s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",156" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",157"mcs6", "mcs7", "mcs8", "mcs9", "mcs10", "mcs11");158mt7925_print_txpwr_entry(VHT20, vht20, band_idx);159mt7925_print_txpwr_entry(VHT40, vht40, band_idx);160161mt7925_print_txpwr_entry(VHT80, vht80, band_idx);162mt7925_print_txpwr_entry(VHT160, vht160, band_idx);163164mt7925_print_txpwr_entry(HE26, he26, band_idx);165mt7925_print_txpwr_entry(HE52, he52, band_idx);166mt7925_print_txpwr_entry(HE106, he106, band_idx);167mt7925_print_txpwr_entry(HE242, he242, band_idx);168mt7925_print_txpwr_entry(HE484, he484, band_idx);169170mt7925_print_txpwr_entry(HE996, he996, band_idx);171mt7925_print_txpwr_entry(HE996x2, he996x2, band_idx);172173mt7925_eht_txpwr(s, txpwr, band_idx);174175out:176devm_kfree(dev->mt76.dev, txpwr);177return ret;178}179180static int181mt7925_pm_set(void *data, u64 val)182{183struct mt792x_dev *dev = data;184struct mt76_connac_pm *pm = &dev->pm;185186if (mt76_is_usb(&dev->mt76))187return -EOPNOTSUPP;188189mutex_lock(&dev->mt76.mutex);190191if (val == pm->enable_user)192goto out;193194if (!pm->enable_user) {195pm->stats.last_wake_event = jiffies;196pm->stats.last_doze_event = jiffies;197}198/* make sure the chip is awake here and ps_work is scheduled199* just at end of the this routine.200*/201pm->enable = false;202mt76_connac_pm_wake(&dev->mphy, pm);203204pm->enable_user = val;205mt7925_set_runtime_pm(dev);206mt76_connac_power_save_sched(&dev->mphy, pm);207out:208mutex_unlock(&dev->mt76.mutex);209210return 0;211}212213static int214mt7925_pm_get(void *data, u64 *val)215{216struct mt792x_dev *dev = data;217218*val = dev->pm.enable_user;219220return 0;221}222223DEFINE_DEBUGFS_ATTRIBUTE(fops_pm, mt7925_pm_get, mt7925_pm_set, "%lld\n");224225static int226mt7925_deep_sleep_set(void *data, u64 val)227{228struct mt792x_dev *dev = data;229struct mt76_connac_pm *pm = &dev->pm;230bool monitor = !!(dev->mphy.hw->conf.flags & IEEE80211_CONF_MONITOR);231bool enable = !!val;232233if (mt76_is_usb(&dev->mt76))234return -EOPNOTSUPP;235236mt792x_mutex_acquire(dev);237if (pm->ds_enable_user == enable)238goto out;239240pm->ds_enable_user = enable;241pm->ds_enable = enable && !monitor;242mt7925_mcu_set_deep_sleep(dev, pm->ds_enable);243out:244mt792x_mutex_release(dev);245246return 0;247}248249static int250mt7925_deep_sleep_get(void *data, u64 *val)251{252struct mt792x_dev *dev = data;253254*val = dev->pm.ds_enable_user;255256return 0;257}258259DEFINE_DEBUGFS_ATTRIBUTE(fops_ds, mt7925_deep_sleep_get,260mt7925_deep_sleep_set, "%lld\n");261262DEFINE_DEBUGFS_ATTRIBUTE(fops_pm_idle_timeout, mt792x_pm_idle_timeout_get,263mt792x_pm_idle_timeout_set, "%lld\n");264265static int mt7925_chip_reset(void *data, u64 val)266{267struct mt792x_dev *dev = data;268int ret = 0;269270switch (val) {271case 1:272/* Reset wifisys directly. */273mt792x_reset(&dev->mt76);274break;275default:276/* Collect the core dump before reset wifisys. */277mt792x_mutex_acquire(dev);278ret = mt7925_mcu_chip_config(dev, "assert");279mt792x_mutex_release(dev);280break;281}282283return ret;284}285286DEFINE_DEBUGFS_ATTRIBUTE(fops_reset, NULL, mt7925_chip_reset, "%lld\n");287288int mt7925_init_debugfs(struct mt792x_dev *dev)289{290struct dentry *dir;291292dir = mt76_register_debugfs_fops(&dev->mphy, &fops_regval);293if (!dir)294return -ENOMEM;295296if (mt76_is_mmio(&dev->mt76))297debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues",298dir, mt792x_queues_read);299else300debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues",301dir, mt76_queues_read);302303debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir,304mt792x_queues_acq);305debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir,306mt7925_txpwr);307debugfs_create_file("tx_stats", 0400, dir, dev, &mt792x_tx_stats_fops);308debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug);309debugfs_create_file("runtime-pm", 0600, dir, dev, &fops_pm);310debugfs_create_file("idle-timeout", 0600, dir, dev,311&fops_pm_idle_timeout);312debugfs_create_file("chip_reset", 0600, dir, dev, &fops_reset);313debugfs_create_devm_seqfile(dev->mt76.dev, "runtime_pm_stats", dir,314mt792x_pm_stats);315debugfs_create_file("deep-sleep", 0600, dir, dev, &fops_ds);316317return 0;318}319320321