cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

debug.c (8133B)


      1/*
      2 * Copyright (c) 2012 Broadcom Corporation
      3 * Copyright (c) 2012 Canonical Ltd.
      4 *
      5 * Permission to use, copy, modify, and/or distribute this software for any
      6 * purpose with or without fee is hereby granted, provided that the above
      7 * copyright notice and this permission notice appear in all copies.
      8 *
      9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     12 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     14 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     15 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     16 */
     17#include <linux/debugfs.h>
     18#include <linux/if_ether.h>
     19#include <linux/if.h>
     20#include <linux/net.h>
     21#include <linux/netdevice.h>
     22#include <linux/ieee80211.h>
     23#include <linux/module.h>
     24#include <net/mac80211.h>
     25
     26#include <defs.h>
     27#include <brcmu_wifi.h>
     28#include <brcmu_utils.h>
     29#include "types.h"
     30#include "main.h"
     31#include "debug.h"
     32#include "brcms_trace_events.h"
     33#include "phy/phy_int.h"
     34
     35static struct dentry *root_folder;
     36
     37void brcms_debugfs_init(void)
     38{
     39	root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
     40}
     41
     42void brcms_debugfs_exit(void)
     43{
     44	debugfs_remove_recursive(root_folder);
     45	root_folder = NULL;
     46}
     47
     48void brcms_debugfs_attach(struct brcms_pub *drvr)
     49{
     50	drvr->dbgfs_dir = debugfs_create_dir(
     51		 dev_name(&drvr->wlc->hw->d11core->dev), root_folder);
     52}
     53
     54void brcms_debugfs_detach(struct brcms_pub *drvr)
     55{
     56	debugfs_remove_recursive(drvr->dbgfs_dir);
     57}
     58
     59struct dentry *brcms_debugfs_get_devdir(struct brcms_pub *drvr)
     60{
     61	return drvr->dbgfs_dir;
     62}
     63
     64static
     65int brcms_debugfs_hardware_read(struct seq_file *s, void *data)
     66{
     67	struct brcms_pub *drvr = s->private;
     68	struct brcms_hardware *hw = drvr->wlc->hw;
     69	struct bcma_device *core = hw->d11core;
     70	struct bcma_bus *bus = core->bus;
     71	char boardrev[BRCMU_BOARDREV_LEN];
     72
     73	seq_printf(s, "chipnum 0x%x\n"
     74		   "chiprev 0x%x\n"
     75		   "chippackage 0x%x\n"
     76		   "corerev 0x%x\n"
     77		   "boardid 0x%x\n"
     78		   "boardvendor 0x%x\n"
     79		   "boardrev %s\n"
     80		   "boardflags 0x%x\n"
     81		   "boardflags2 0x%x\n"
     82		   "ucoderev 0x%x\n"
     83		   "radiorev 0x%x\n"
     84		   "phytype 0x%x\n"
     85		   "phyrev 0x%x\n"
     86		   "anarev 0x%x\n"
     87		   "nvramrev %d\n",
     88		   bus->chipinfo.id, bus->chipinfo.rev, bus->chipinfo.pkg,
     89		   core->id.rev, bus->boardinfo.type, bus->boardinfo.vendor,
     90		   brcmu_boardrev_str(hw->boardrev, boardrev),
     91		   drvr->wlc->hw->boardflags, drvr->wlc->hw->boardflags2,
     92		   drvr->wlc->ucode_rev, hw->band->radiorev,
     93		   hw->band->phytype, hw->band->phyrev, hw->band->pi->ana_rev,
     94		   hw->sromrev);
     95	return 0;
     96}
     97
     98static int brcms_debugfs_macstat_read(struct seq_file *s, void *data)
     99{
    100	struct brcms_pub *drvr = s->private;
    101	struct brcms_info *wl = drvr->ieee_hw->priv;
    102	struct macstat stats;
    103	int i;
    104
    105	spin_lock_bh(&wl->lock);
    106	stats = *(drvr->wlc->core->macstat_snapshot);
    107	spin_unlock_bh(&wl->lock);
    108
    109	seq_printf(s, "txallfrm: %d\n", stats.txallfrm);
    110	seq_printf(s, "txrtsfrm: %d\n", stats.txrtsfrm);
    111	seq_printf(s, "txctsfrm: %d\n", stats.txctsfrm);
    112	seq_printf(s, "txackfrm: %d\n", stats.txackfrm);
    113	seq_printf(s, "txdnlfrm: %d\n", stats.txdnlfrm);
    114	seq_printf(s, "txbcnfrm: %d\n", stats.txbcnfrm);
    115	seq_printf(s, "txfunfl[8]:");
    116	for (i = 0; i < ARRAY_SIZE(stats.txfunfl); i++)
    117		seq_printf(s, " %d", stats.txfunfl[i]);
    118	seq_printf(s, "\ntxtplunfl: %d\n", stats.txtplunfl);
    119	seq_printf(s, "txphyerr: %d\n", stats.txphyerr);
    120	seq_printf(s, "pktengrxducast: %d\n", stats.pktengrxducast);
    121	seq_printf(s, "pktengrxdmcast: %d\n", stats.pktengrxdmcast);
    122	seq_printf(s, "rxfrmtoolong: %d\n", stats.rxfrmtoolong);
    123	seq_printf(s, "rxfrmtooshrt: %d\n", stats.rxfrmtooshrt);
    124	seq_printf(s, "rxinvmachdr: %d\n", stats.rxinvmachdr);
    125	seq_printf(s, "rxbadfcs: %d\n", stats.rxbadfcs);
    126	seq_printf(s, "rxbadplcp: %d\n", stats.rxbadplcp);
    127	seq_printf(s, "rxcrsglitch: %d\n", stats.rxcrsglitch);
    128	seq_printf(s, "rxstrt: %d\n", stats.rxstrt);
    129	seq_printf(s, "rxdfrmucastmbss: %d\n", stats.rxdfrmucastmbss);
    130	seq_printf(s, "rxmfrmucastmbss: %d\n", stats.rxmfrmucastmbss);
    131	seq_printf(s, "rxcfrmucast: %d\n", stats.rxcfrmucast);
    132	seq_printf(s, "rxrtsucast: %d\n", stats.rxrtsucast);
    133	seq_printf(s, "rxctsucast: %d\n", stats.rxctsucast);
    134	seq_printf(s, "rxackucast: %d\n", stats.rxackucast);
    135	seq_printf(s, "rxdfrmocast: %d\n", stats.rxdfrmocast);
    136	seq_printf(s, "rxmfrmocast: %d\n", stats.rxmfrmocast);
    137	seq_printf(s, "rxcfrmocast: %d\n", stats.rxcfrmocast);
    138	seq_printf(s, "rxrtsocast: %d\n", stats.rxrtsocast);
    139	seq_printf(s, "rxctsocast: %d\n", stats.rxctsocast);
    140	seq_printf(s, "rxdfrmmcast: %d\n", stats.rxdfrmmcast);
    141	seq_printf(s, "rxmfrmmcast: %d\n", stats.rxmfrmmcast);
    142	seq_printf(s, "rxcfrmmcast: %d\n", stats.rxcfrmmcast);
    143	seq_printf(s, "rxbeaconmbss: %d\n", stats.rxbeaconmbss);
    144	seq_printf(s, "rxdfrmucastobss: %d\n", stats.rxdfrmucastobss);
    145	seq_printf(s, "rxbeaconobss: %d\n", stats.rxbeaconobss);
    146	seq_printf(s, "rxrsptmout: %d\n", stats.rxrsptmout);
    147	seq_printf(s, "bcntxcancl: %d\n", stats.bcntxcancl);
    148	seq_printf(s, "rxf0ovfl: %d\n", stats.rxf0ovfl);
    149	seq_printf(s, "rxf1ovfl: %d\n", stats.rxf1ovfl);
    150	seq_printf(s, "rxf2ovfl: %d\n", stats.rxf2ovfl);
    151	seq_printf(s, "txsfovfl: %d\n", stats.txsfovfl);
    152	seq_printf(s, "pmqovfl: %d\n", stats.pmqovfl);
    153	seq_printf(s, "rxcgprqfrm: %d\n", stats.rxcgprqfrm);
    154	seq_printf(s, "rxcgprsqovfl: %d\n", stats.rxcgprsqovfl);
    155	seq_printf(s, "txcgprsfail: %d\n", stats.txcgprsfail);
    156	seq_printf(s, "txcgprssuc: %d\n", stats.txcgprssuc);
    157	seq_printf(s, "prs_timeout: %d\n", stats.prs_timeout);
    158	seq_printf(s, "rxnack: %d\n", stats.rxnack);
    159	seq_printf(s, "frmscons: %d\n", stats.frmscons);
    160	seq_printf(s, "txnack: %d\n", stats.txnack);
    161	seq_printf(s, "txglitch_nack: %d\n", stats.txglitch_nack);
    162	seq_printf(s, "txburst: %d\n", stats.txburst);
    163	seq_printf(s, "bphy_rxcrsglitch: %d\n", stats.bphy_rxcrsglitch);
    164	seq_printf(s, "phywatchdog: %d\n", stats.phywatchdog);
    165	seq_printf(s, "bphy_badplcp: %d\n", stats.bphy_badplcp);
    166	return 0;
    167}
    168
    169struct brcms_debugfs_entry {
    170	int (*read)(struct seq_file *seq, void *data);
    171	struct brcms_pub *drvr;
    172};
    173
    174static int brcms_debugfs_entry_open(struct inode *inode, struct file *f)
    175{
    176	struct brcms_debugfs_entry *entry = inode->i_private;
    177
    178	return single_open(f, entry->read, entry->drvr);
    179}
    180
    181static const struct file_operations brcms_debugfs_def_ops = {
    182	.owner = THIS_MODULE,
    183	.open = brcms_debugfs_entry_open,
    184	.release = single_release,
    185	.read = seq_read,
    186	.llseek = seq_lseek
    187};
    188
    189static void
    190brcms_debugfs_add_entry(struct brcms_pub *drvr, const char *fn,
    191			int (*read_fn)(struct seq_file *seq, void *data))
    192{
    193	struct device *dev = &drvr->wlc->hw->d11core->dev;
    194	struct dentry *dentry =  drvr->dbgfs_dir;
    195	struct brcms_debugfs_entry *entry;
    196
    197	entry = devm_kzalloc(dev, sizeof(*entry), GFP_KERNEL);
    198	if (!entry)
    199		return;
    200
    201	entry->read = read_fn;
    202	entry->drvr = drvr;
    203
    204	debugfs_create_file(fn, 0444, dentry, entry, &brcms_debugfs_def_ops);
    205}
    206
    207void brcms_debugfs_create_files(struct brcms_pub *drvr)
    208{
    209	brcms_debugfs_add_entry(drvr, "hardware", brcms_debugfs_hardware_read);
    210	brcms_debugfs_add_entry(drvr, "macstat", brcms_debugfs_macstat_read);
    211}
    212
    213#define __brcms_fn(fn)						\
    214void __brcms_ ##fn(struct device *dev, const char *fmt, ...)	\
    215{								\
    216	struct va_format vaf = {				\
    217		.fmt = fmt,					\
    218	};							\
    219	va_list args;						\
    220								\
    221	va_start(args, fmt);					\
    222	vaf.va = &args;						\
    223	dev_ ##fn(dev, "%pV", &vaf);				\
    224	trace_brcms_ ##fn(&vaf);				\
    225	va_end(args);						\
    226}
    227
    228__brcms_fn(info)
    229__brcms_fn(warn)
    230__brcms_fn(err)
    231__brcms_fn(crit)
    232
    233#if defined(CONFIG_BRCMDBG) || defined(CONFIG_BRCM_TRACING)
    234void __brcms_dbg(struct device *dev, u32 level, const char *func,
    235		 const char *fmt, ...)
    236{
    237	struct va_format vaf = {
    238		.fmt = fmt,
    239	};
    240	va_list args;
    241
    242	va_start(args, fmt);
    243	vaf.va = &args;
    244#ifdef CONFIG_BRCMDBG
    245	if ((brcm_msg_level & level) && net_ratelimit())
    246		dev_err(dev, "%s %pV", func, &vaf);
    247#endif
    248	trace_brcms_dbg(level, func, &vaf);
    249	va_end(args);
    250}
    251#endif