Commit 532c7a35 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

dsa: mv88x6xxx: Add debugfs interface for statistics

Allow the contents of the statistics counters to be shown in debugfs.
This is particularly useful for the cpu and dsa ports, which cannot be
seen using ethtools -S.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 80c4627b
...@@ -1730,6 +1730,62 @@ static const struct file_operations mv88e6xxx_atu_fops = { ...@@ -1730,6 +1730,62 @@ static const struct file_operations mv88e6xxx_atu_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
static void mv88e6xxx_stats_show_header(struct seq_file *s,
struct mv88e6xxx_priv_state *ps)
{
int port;
seq_puts(s, " Statistic ");
for (port = 0 ; port < ps->num_ports; port++)
seq_printf(s, "Port %2d ", port);
seq_puts(s, "\n");
}
static int mv88e6xxx_stats_show(struct seq_file *s, void *p)
{
struct dsa_switch *ds = s->private;
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
struct mv88e6xxx_hw_stat *stats = mv88e6xxx_hw_stats;
int port, stat, max_stats;
uint64_t value;
if (have_sw_in_discards(ds))
max_stats = ARRAY_SIZE(mv88e6xxx_hw_stats);
else
max_stats = ARRAY_SIZE(mv88e6xxx_hw_stats) - 3;
mv88e6xxx_stats_show_header(s, ps);
mutex_lock(&ps->smi_mutex);
for (stat = 0; stat < max_stats; stat++) {
seq_printf(s, "%19s: ", stats[stat].string);
for (port = 0 ; port < ps->num_ports; port++) {
_mv88e6xxx_stats_snapshot(ds, port);
value = _mv88e6xxx_get_ethtool_stat(ds, stat, stats,
port);
seq_printf(s, "%8llu ", value);
}
seq_puts(s, "\n");
}
mutex_unlock(&ps->smi_mutex);
return 0;
}
static int mv88e6xxx_stats_open(struct inode *inode, struct file *file)
{
return single_open(file, mv88e6xxx_stats_show, inode->i_private);
}
static const struct file_operations mv88e6xxx_stats_fops = {
.open = mv88e6xxx_stats_open,
.read = seq_read,
.llseek = no_llseek,
.release = single_release,
.owner = THIS_MODULE,
};
int mv88e6xxx_setup_common(struct dsa_switch *ds) int mv88e6xxx_setup_common(struct dsa_switch *ds)
{ {
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
...@@ -1753,6 +1809,9 @@ int mv88e6xxx_setup_common(struct dsa_switch *ds) ...@@ -1753,6 +1809,9 @@ int mv88e6xxx_setup_common(struct dsa_switch *ds)
debugfs_create_file("atu", S_IRUGO, ps->dbgfs, ds, debugfs_create_file("atu", S_IRUGO, ps->dbgfs, ds,
&mv88e6xxx_atu_fops); &mv88e6xxx_atu_fops);
debugfs_create_file("stats", S_IRUGO, ps->dbgfs, ds,
&mv88e6xxx_stats_fops);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment