linux/drivers/net/wireless/mediatek/mt76/debugfs.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16#include "mt76.h"
  17
  18static int
  19mt76_reg_set(void *data, u64 val)
  20{
  21        struct mt76_dev *dev = data;
  22
  23        dev->bus->wr(dev, dev->debugfs_reg, val);
  24        return 0;
  25}
  26
  27static int
  28mt76_reg_get(void *data, u64 *val)
  29{
  30        struct mt76_dev *dev = data;
  31
  32        *val = dev->bus->rr(dev, dev->debugfs_reg);
  33        return 0;
  34}
  35
  36DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt76_reg_get, mt76_reg_set,
  37                         "0x%08llx\n");
  38
  39static int
  40mt76_queues_read(struct seq_file *s, void *data)
  41{
  42        struct mt76_dev *dev = dev_get_drvdata(s->private);
  43        int i;
  44
  45        for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++) {
  46                struct mt76_sw_queue *q = &dev->q_tx[i];
  47
  48                if (!q->q)
  49                        continue;
  50
  51                seq_printf(s,
  52                           "%d: queued=%d head=%d tail=%d swq_queued=%d\n",
  53                           i, q->q->queued, q->q->head, q->q->tail,
  54                           q->swq_queued);
  55        }
  56
  57        return 0;
  58}
  59
  60void mt76_seq_puts_array(struct seq_file *file, const char *str,
  61                         s8 *val, int len)
  62{
  63        int i;
  64
  65        seq_printf(file, "%10s:", str);
  66        for (i = 0; i < len; i++)
  67                seq_printf(file, " %2d", val[i]);
  68        seq_puts(file, "\n");
  69}
  70EXPORT_SYMBOL_GPL(mt76_seq_puts_array);
  71
  72static int mt76_read_rate_txpower(struct seq_file *s, void *data)
  73{
  74        struct mt76_dev *dev = dev_get_drvdata(s->private);
  75
  76        mt76_seq_puts_array(s, "CCK", dev->rate_power.cck,
  77                            ARRAY_SIZE(dev->rate_power.cck));
  78        mt76_seq_puts_array(s, "OFDM", dev->rate_power.ofdm,
  79                            ARRAY_SIZE(dev->rate_power.ofdm));
  80        mt76_seq_puts_array(s, "STBC", dev->rate_power.stbc,
  81                            ARRAY_SIZE(dev->rate_power.stbc));
  82        mt76_seq_puts_array(s, "HT", dev->rate_power.ht,
  83                            ARRAY_SIZE(dev->rate_power.ht));
  84        mt76_seq_puts_array(s, "VHT", dev->rate_power.vht,
  85                            ARRAY_SIZE(dev->rate_power.vht));
  86        return 0;
  87}
  88
  89struct dentry *mt76_register_debugfs(struct mt76_dev *dev)
  90{
  91        struct dentry *dir;
  92
  93        dir = debugfs_create_dir("mt76", dev->hw->wiphy->debugfsdir);
  94        if (!dir)
  95                return NULL;
  96
  97        debugfs_create_u8("led_pin", 0600, dir, &dev->led_pin);
  98        debugfs_create_u32("regidx", 0600, dir, &dev->debugfs_reg);
  99        debugfs_create_file_unsafe("regval", 0600, dir, dev,
 100                                   &fops_regval);
 101        debugfs_create_blob("eeprom", 0400, dir, &dev->eeprom);
 102        if (dev->otp.data)
 103                debugfs_create_blob("otp", 0400, dir, &dev->otp);
 104        debugfs_create_devm_seqfile(dev->dev, "queues", dir, mt76_queues_read);
 105        debugfs_create_devm_seqfile(dev->dev, "rate_txpower", dir,
 106                                    mt76_read_rate_txpower);
 107
 108        return dir;
 109}
 110EXPORT_SYMBOL_GPL(mt76_register_debugfs);
 111