Path: blob/main/sys/contrib/dev/mediatek/mt76/debugfs.c
48375 views
// SPDX-License-Identifier: ISC1/*2* Copyright (C) 2016 Felix Fietkau <[email protected]>3*/4#include "mt76.h"56static int7mt76_reg_set(void *data, u64 val)8{9struct mt76_dev *dev = data;1011__mt76_wr(dev, dev->debugfs_reg, val);12return 0;13}1415static int16mt76_reg_get(void *data, u64 *val)17{18struct mt76_dev *dev = data;1920*val = __mt76_rr(dev, dev->debugfs_reg);21return 0;22}2324DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt76_reg_get, mt76_reg_set,25"0x%08llx\n");2627static int28mt76_napi_threaded_set(void *data, u64 val)29{30struct mt76_dev *dev = data;3132if (!mt76_is_mmio(dev))33return -EOPNOTSUPP;3435if (dev->napi_dev->threaded != val)36return dev_set_threaded(dev->napi_dev, val);3738return 0;39}4041static int42mt76_napi_threaded_get(void *data, u64 *val)43{44struct mt76_dev *dev = data;4546*val = dev->napi_dev->threaded;47return 0;48}4950DEFINE_DEBUGFS_ATTRIBUTE(fops_napi_threaded, mt76_napi_threaded_get,51mt76_napi_threaded_set, "%llu\n");5253int mt76_queues_read(struct seq_file *s, void *data)54{55struct mt76_dev *dev = dev_get_drvdata(s->private);56int i;5758seq_puts(s, " queue | hw-queued | head | tail |\n");59for (i = 0; i < ARRAY_SIZE(dev->phy.q_tx); i++) {60struct mt76_queue *q = dev->phy.q_tx[i];6162if (!q)63continue;6465seq_printf(s, " %9d | %9d | %9d | %9d |\n",66i, q->queued, q->head, q->tail);67}6869return 0;70}71EXPORT_SYMBOL_GPL(mt76_queues_read);7273static int mt76_rx_queues_read(struct seq_file *s, void *data)74{75struct mt76_dev *dev = dev_get_drvdata(s->private);76int i, queued;7778seq_puts(s, " queue | hw-queued | head | tail |\n");79mt76_for_each_q_rx(dev, i) {80struct mt76_queue *q = &dev->q_rx[i];8182queued = mt76_is_usb(dev) ? q->ndesc - q->queued : q->queued;83seq_printf(s, " %9d | %9d | %9d | %9d |\n",84i, queued, q->head, q->tail);85}8687return 0;88}8990void mt76_seq_puts_array(struct seq_file *file, const char *str,91s8 *val, int len)92{93int i;9495seq_printf(file, "%10s:", str);96for (i = 0; i < len; i++)97seq_printf(file, " %2d", val[i]);98seq_puts(file, "\n");99}100EXPORT_SYMBOL_GPL(mt76_seq_puts_array);101102struct dentry *103mt76_register_debugfs_fops(struct mt76_phy *phy,104const struct file_operations *ops)105{106const struct file_operations *fops = ops ? ops : &fops_regval;107struct mt76_dev *dev = phy->dev;108struct dentry *dir;109110dir = debugfs_create_dir("mt76", phy->hw->wiphy->debugfsdir);111112debugfs_create_u8("led_pin", 0600, dir, &phy->leds.pin);113debugfs_create_u32("regidx", 0600, dir, &dev->debugfs_reg);114debugfs_create_file_unsafe("regval", 0600, dir, dev, fops);115debugfs_create_file_unsafe("napi_threaded", 0600, dir, dev,116&fops_napi_threaded);117debugfs_create_blob("eeprom", 0400, dir, &dev->eeprom);118if (dev->otp.data)119debugfs_create_blob("otp", 0400, dir, &dev->otp);120debugfs_create_devm_seqfile(dev->dev, "rx-queues", dir,121mt76_rx_queues_read);122123return dir;124}125EXPORT_SYMBOL_GPL(mt76_register_debugfs_fops);126127128