mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 13:27:57 +02:00
Merge branch 'dsa-mv88e6xxx-debugfs'
Andrew Lunn says:
====================
debugfs for mv88e6xxx
This patchset adds some debugfs files for seeing into a mv88e6xxx
family of switch chips.
DB T/P Vec State Addr
003 Port 008 7 00:22:02:00:18:44
003 Port 008 6 80:ee:73:83:60:27
005 Port 020 7 94:10:3e:80:bc:f3
0f8 Port 001 6 8e:25:13:53:44:de
This walks all possible entries, so is a bit slow, but is always
correct.
Target Port
0 15
1 15
2 15
3 15
4 15
5 15
6 15
7 15
8 15
9 15
-->snip<--
31 15
A rather boring example, since i only have one switch here. But this shows
the routing between multiple switches.
GLOBAL GLOBAL2 0 1 2 3 4 5 6
0: c804 0 1e4f 100f 100f 1e4f 1e0f e07 e07
1: fe 0 3 3 3 3 3 c03e c03f
2: 0 ffff 0 0 0 0 0 0 0
3: 0 ffff 1721 1721 1721 1721 1721 1721 1721
4: 6000 258 433 431 431 433 433 373f 433
5: 0 ff 0 0 0 0 0 0 0
6: c000 1f0f 2026 2025 2023 3020 4020 501f 6020
7: 0 707f 0 0 0 0 0 0 0
8: 0 7800 2080 2080 2080 2080 2080 2080 2080
9: 0 1600 1 1 1 1 1 1 1
a: 148 0 0 0 0 0 0 0 0
b: 4000 1000 1 2 4 8 10 20 40
c: 0 7f 0 0 0 0 0 0 0
d: ffff 5f3 0 0 0 0 0 0 0
e: ffff 6 0 0 0 0 0 0 0
f: ffff f00 dada dada dada dada dada dada dada
10: 0 0 0 0 0 0 0 0 0
11: 0 0 0 0 0 0 0 0 0
12: 5555 0 0 0 0 0 0 0 0
13: 5555 0 1a 0 0 1df0 0 1e07 0
14: aaaa 400 0 0 0 0 0 0 0
15: aaaa 0 0 0 0 0 0 0 0
16: ffff 0 6011 6011 6011 6011 33 33 0
17: ffff 0 0 0 0 0 0 0 0
18: fa41 1844 3210 3210 3210 3210 3210 3210 3210
19: 0 1e1 7654 7654 7654 7654 7654 7654 7654
1a: 5550 0 0 0 0 0 0 0 0
1b: 1fb f869 8000 8000 8000 8000 8000 8000 8000
1c: 0 0 0 0 0 0 0 0 0
1d: c00 0 0 0 0 0 0 0 0
1e: 0 0 0 0 0 0 0 0 0
1f: 0 0 0 0 0 0 0 0 0
All the switch registers which are directly accessible.
Statistic Port 0 Port 1 Port 2 Port 3 Port 4 Port 5 Port 6
in_good_octets: 2176 0 0 4263711 0 499540 0
in_bad_octets: 46050 0 0 50196 0 0 0
in_unicast: 0 0 0 7693 0 7691 0
in_broadcasts: 0 0 0 0 0 3 0
in_multicasts: 34 0 0 0 0 27 0
in_pause: 0 0 0 0 0 0 0
in_undersize: 0 0 0 0 0 0 0
in_fragments: 45 0 0 2 0 0 0
in_oversize: 0 0 0 0 0 0 0
in_jabber: 0 0 0 0 0 0 0
in_rx_error: 0 0 0 0 0 0 0
in_fcs_error: 159 0 0 37 0 0 0
out_octets: 808 0 0 496608 336 4267159 0
out_unicast: 0 0 0 7691 0 7693 0
out_broadcasts: 1 0 0 3 0 0 0
out_multicasts: 9 0 0 6 4 34 0
out_pause: 0 0 0 0 0 0 0
excessive: 0 0 0 0 0 0 0
collisions: 0 0 0 0 0 0 0
deferred: 0 0 0 0 0 0 0
single: 0 0 0 0 0 0 0
multiple: 0 0 0 0 0 0 0
out_fcs_error: 0 0 0 0 0 0 0
late: 0 0 0 0 0 0 0
hist_64bytes: 36 0 0 7577 0 7574 0
hist_65_127bytes: 53 0 0 241 4 298 0
hist_128_255bytes: 50 0 0 12 0 10 0
hist_256_511bytes: 43 0 0 8 0 2 0
hist_512_1023bytes: 18 0 0 7573 0 7564 0
hist_1024_max_bytes: 3 0 0 19 0 0 0
sw_in_discards: 0 0 0 0 0 0 0
sw_in_filtered: 0 0 0 0 0 0 0
sw_out_filtered: 34 0 0 7693 0 7721 0
Of particular interest here is that you get to see all ports,
including the CPU port and any DSA ports. You cannot get statistics
for these ports via ethtool.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
824831fadc
|
|
@ -8,6 +8,7 @@
|
|||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_bridge.h>
|
||||
|
|
@ -16,6 +17,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <net/dsa.h>
|
||||
#include "mv88e6xxx.h"
|
||||
|
||||
|
|
@ -679,6 +681,40 @@ static void _mv88e6xxx_get_strings(struct dsa_switch *ds,
|
|||
}
|
||||
}
|
||||
|
||||
static uint64_t _mv88e6xxx_get_ethtool_stat(struct dsa_switch *ds,
|
||||
int stat,
|
||||
struct mv88e6xxx_hw_stat *stats,
|
||||
int port)
|
||||
{
|
||||
struct mv88e6xxx_hw_stat *s = stats + stat;
|
||||
u32 low;
|
||||
u32 high = 0;
|
||||
int ret;
|
||||
u64 value;
|
||||
|
||||
if (s->reg >= 0x100) {
|
||||
ret = _mv88e6xxx_reg_read(ds, REG_PORT(port),
|
||||
s->reg - 0x100);
|
||||
if (ret < 0)
|
||||
return UINT64_MAX;
|
||||
|
||||
low = ret;
|
||||
if (s->sizeof_stat == 4) {
|
||||
ret = _mv88e6xxx_reg_read(ds, REG_PORT(port),
|
||||
s->reg - 0x100 + 1);
|
||||
if (ret < 0)
|
||||
return UINT64_MAX;
|
||||
high = ret;
|
||||
}
|
||||
} else {
|
||||
_mv88e6xxx_stats_read(ds, s->reg, &low);
|
||||
if (s->sizeof_stat == 8)
|
||||
_mv88e6xxx_stats_read(ds, s->reg + 1, &high);
|
||||
}
|
||||
value = (((u64)high) << 16) | low;
|
||||
return value;
|
||||
}
|
||||
|
||||
static void _mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
|
||||
int nr_stats,
|
||||
struct mv88e6xxx_hw_stat *stats,
|
||||
|
|
@ -697,34 +733,9 @@ static void _mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
|
|||
}
|
||||
|
||||
/* Read each of the counters. */
|
||||
for (i = 0; i < nr_stats; i++) {
|
||||
struct mv88e6xxx_hw_stat *s = stats + i;
|
||||
u32 low;
|
||||
u32 high = 0;
|
||||
for (i = 0; i < nr_stats; i++)
|
||||
data[i] = _mv88e6xxx_get_ethtool_stat(ds, i, stats, port);
|
||||
|
||||
if (s->reg >= 0x100) {
|
||||
ret = _mv88e6xxx_reg_read(ds, REG_PORT(port),
|
||||
s->reg - 0x100);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
low = ret;
|
||||
if (s->sizeof_stat == 4) {
|
||||
ret = _mv88e6xxx_reg_read(ds, REG_PORT(port),
|
||||
s->reg - 0x100 + 1);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
high = ret;
|
||||
}
|
||||
data[i] = (((u64)high) << 16) | low;
|
||||
continue;
|
||||
}
|
||||
_mv88e6xxx_stats_read(ds, s->reg, &low);
|
||||
if (s->sizeof_stat == 8)
|
||||
_mv88e6xxx_stats_read(ds, s->reg + 1, &high);
|
||||
|
||||
data[i] = (((u64)high) << 32) | low;
|
||||
}
|
||||
error:
|
||||
mutex_unlock(&ps->smi_mutex);
|
||||
}
|
||||
|
||||
|
|
@ -890,6 +901,13 @@ static int _mv88e6xxx_atu_wait(struct dsa_switch *ds)
|
|||
GLOBAL_ATU_OP_BUSY);
|
||||
}
|
||||
|
||||
/* Must be called with SMI lock held */
|
||||
static int _mv88e6xxx_scratch_wait(struct dsa_switch *ds)
|
||||
{
|
||||
return _mv88e6xxx_wait(ds, REG_GLOBAL2, GLOBAL2_SCRATCH_MISC,
|
||||
GLOBAL2_SCRATCH_BUSY);
|
||||
}
|
||||
|
||||
/* Must be called with SMI mutex held */
|
||||
static int _mv88e6xxx_phy_read_indirect(struct dsa_switch *ds, int addr,
|
||||
int regnum)
|
||||
|
|
@ -1601,9 +1619,267 @@ int mv88e6xxx_setup_ports(struct dsa_switch *ds)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_regs_show(struct seq_file *s, void *p)
|
||||
{
|
||||
struct dsa_switch *ds = s->private;
|
||||
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
int reg, port;
|
||||
|
||||
seq_puts(s, " GLOBAL GLOBAL2 ");
|
||||
for (port = 0 ; port < ps->num_ports; port++)
|
||||
seq_printf(s, " %2d ", port);
|
||||
seq_puts(s, "\n");
|
||||
|
||||
for (reg = 0; reg < 32; reg++) {
|
||||
seq_printf(s, "%2x: ", reg);
|
||||
seq_printf(s, " %4x %4x ",
|
||||
mv88e6xxx_reg_read(ds, REG_GLOBAL, reg),
|
||||
mv88e6xxx_reg_read(ds, REG_GLOBAL2, reg));
|
||||
|
||||
for (port = 0 ; port < ps->num_ports; port++)
|
||||
seq_printf(s, "%4x ",
|
||||
mv88e6xxx_reg_read(ds, REG_PORT(port), reg));
|
||||
seq_puts(s, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_regs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, mv88e6xxx_regs_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations mv88e6xxx_regs_fops = {
|
||||
.open = mv88e6xxx_regs_open,
|
||||
.read = seq_read,
|
||||
.llseek = no_llseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static void mv88e6xxx_atu_show_header(struct seq_file *s)
|
||||
{
|
||||
seq_puts(s, "DB T/P Vec State Addr\n");
|
||||
}
|
||||
|
||||
static void mv88e6xxx_atu_show_entry(struct seq_file *s, int dbnum,
|
||||
unsigned char *addr, int data)
|
||||
{
|
||||
bool trunk = !!(data & GLOBAL_ATU_DATA_TRUNK);
|
||||
int portvec = ((data & GLOBAL_ATU_DATA_PORT_VECTOR_MASK) >>
|
||||
GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT);
|
||||
int state = data & GLOBAL_ATU_DATA_STATE_MASK;
|
||||
|
||||
seq_printf(s, "%03x %5s %10pb %x %pM\n",
|
||||
dbnum, (trunk ? "Trunk" : "Port"), &portvec, state, addr);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_atu_show_db(struct seq_file *s, struct dsa_switch *ds,
|
||||
int dbnum)
|
||||
{
|
||||
unsigned char bcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
unsigned char addr[6];
|
||||
int ret, data, state;
|
||||
|
||||
ret = __mv88e6xxx_write_addr(ds, bcast);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
do {
|
||||
ret = _mv88e6xxx_atu_cmd(ds, dbnum, GLOBAL_ATU_OP_GET_NEXT_DB);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
data = _mv88e6xxx_reg_read(ds, REG_GLOBAL, GLOBAL_ATU_DATA);
|
||||
if (data < 0)
|
||||
return data;
|
||||
|
||||
state = data & GLOBAL_ATU_DATA_STATE_MASK;
|
||||
if (state == GLOBAL_ATU_DATA_STATE_UNUSED)
|
||||
break;
|
||||
ret = __mv88e6xxx_read_addr(ds, addr);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
mv88e6xxx_atu_show_entry(s, dbnum, addr, data);
|
||||
} while (state != GLOBAL_ATU_DATA_STATE_UNUSED);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_atu_show(struct seq_file *s, void *p)
|
||||
{
|
||||
struct dsa_switch *ds = s->private;
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
int dbnum;
|
||||
|
||||
mv88e6xxx_atu_show_header(s);
|
||||
|
||||
for (dbnum = 0; dbnum < 255; dbnum++) {
|
||||
mutex_lock(&ps->smi_mutex);
|
||||
mv88e6xxx_atu_show_db(s, ds, dbnum);
|
||||
mutex_unlock(&ps->smi_mutex);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_atu_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, mv88e6xxx_atu_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations mv88e6xxx_atu_fops = {
|
||||
.open = mv88e6xxx_atu_open,
|
||||
.read = seq_read,
|
||||
.llseek = no_llseek,
|
||||
.release = single_release,
|
||||
.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,
|
||||
};
|
||||
|
||||
static int mv88e6xxx_device_map_show(struct seq_file *s, void *p)
|
||||
{
|
||||
struct dsa_switch *ds = s->private;
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
int target, ret;
|
||||
|
||||
seq_puts(s, "Target Port\n");
|
||||
|
||||
mutex_lock(&ps->smi_mutex);
|
||||
for (target = 0; target < 32; target++) {
|
||||
ret = _mv88e6xxx_reg_write(
|
||||
ds, REG_GLOBAL2, GLOBAL2_DEVICE_MAPPING,
|
||||
target << GLOBAL2_DEVICE_MAPPING_TARGET_SHIFT);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = _mv88e6xxx_reg_read(ds, REG_GLOBAL2,
|
||||
GLOBAL2_DEVICE_MAPPING);
|
||||
seq_printf(s, " %2d %2d\n", target,
|
||||
ret & GLOBAL2_DEVICE_MAPPING_PORT_MASK);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&ps->smi_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_device_map_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, mv88e6xxx_device_map_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations mv88e6xxx_device_map_fops = {
|
||||
.open = mv88e6xxx_device_map_open,
|
||||
.read = seq_read,
|
||||
.llseek = no_llseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int mv88e6xxx_scratch_show(struct seq_file *s, void *p)
|
||||
{
|
||||
struct dsa_switch *ds = s->private;
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
int reg, ret;
|
||||
|
||||
seq_puts(s, "Register Value\n");
|
||||
|
||||
mutex_lock(&ps->smi_mutex);
|
||||
for (reg = 0; reg < 0x80; reg++) {
|
||||
ret = _mv88e6xxx_reg_write(
|
||||
ds, REG_GLOBAL2, GLOBAL2_SCRATCH_MISC,
|
||||
reg << GLOBAL2_SCRATCH_REGISTER_SHIFT);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = _mv88e6xxx_scratch_wait(ds);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = _mv88e6xxx_reg_read(ds, REG_GLOBAL2,
|
||||
GLOBAL2_SCRATCH_MISC);
|
||||
seq_printf(s, " %2x %2x\n", reg,
|
||||
ret & GLOBAL2_SCRATCH_VALUE_MASK);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&ps->smi_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_scratch_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, mv88e6xxx_scratch_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations mv88e6xxx_scratch_fops = {
|
||||
.open = mv88e6xxx_scratch_open,
|
||||
.read = seq_read,
|
||||
.llseek = no_llseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
int mv88e6xxx_setup_common(struct dsa_switch *ds)
|
||||
{
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
char *name;
|
||||
|
||||
mutex_init(&ps->smi_mutex);
|
||||
|
||||
|
|
@ -1613,6 +1889,24 @@ int mv88e6xxx_setup_common(struct dsa_switch *ds)
|
|||
|
||||
INIT_WORK(&ps->bridge_work, mv88e6xxx_bridge_work);
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "dsa%d", ds->index);
|
||||
ps->dbgfs = debugfs_create_dir(name, NULL);
|
||||
kfree(name);
|
||||
|
||||
debugfs_create_file("regs", S_IRUGO, ps->dbgfs, ds,
|
||||
&mv88e6xxx_regs_fops);
|
||||
|
||||
debugfs_create_file("atu", S_IRUGO, ps->dbgfs, ds,
|
||||
&mv88e6xxx_atu_fops);
|
||||
|
||||
debugfs_create_file("stats", S_IRUGO, ps->dbgfs, ds,
|
||||
&mv88e6xxx_stats_fops);
|
||||
|
||||
debugfs_create_file("device_map", S_IRUGO, ps->dbgfs, ds,
|
||||
&mv88e6xxx_device_map_fops);
|
||||
|
||||
debugfs_create_file("scratch", S_IRUGO, ps->dbgfs, ds,
|
||||
&mv88e6xxx_scratch_fops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@
|
|||
#ifndef __MV88E6XXX_H
|
||||
#define __MV88E6XXX_H
|
||||
|
||||
#ifndef UINT64_MAX
|
||||
#define UINT64_MAX (u64)(~((u64)0))
|
||||
#endif
|
||||
|
||||
#define SMI_CMD 0x00
|
||||
#define SMI_CMD_BUSY BIT(15)
|
||||
#define SMI_CMD_CLAUSE_22 BIT(12)
|
||||
|
|
@ -193,6 +197,9 @@
|
|||
#define GLOBAL_ATU_OP_FLUSH_NON_STATIC_DB ((6 << 12) | GLOBAL_ATU_OP_BUSY)
|
||||
#define GLOBAL_ATU_OP_GET_CLR_VIOLATION ((7 << 12) | GLOBAL_ATU_OP_BUSY)
|
||||
#define GLOBAL_ATU_DATA 0x0c
|
||||
#define GLOBAL_ATU_DATA_TRUNK BIT(15)
|
||||
#define GLOBAL_ATU_DATA_PORT_VECTOR_MASK 0x3ff0
|
||||
#define GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT 4
|
||||
#define GLOBAL_ATU_DATA_STATE_MASK 0x0f
|
||||
#define GLOBAL_ATU_DATA_STATE_UNUSED 0x00
|
||||
#define GLOBAL_ATU_DATA_STATE_UC_MGMT 0x0d
|
||||
|
|
@ -253,6 +260,7 @@
|
|||
#define GLOBAL2_DEVICE_MAPPING 0x06
|
||||
#define GLOBAL2_DEVICE_MAPPING_UPDATE BIT(15)
|
||||
#define GLOBAL2_DEVICE_MAPPING_TARGET_SHIFT 8
|
||||
#define GLOBAL2_DEVICE_MAPPING_PORT_MASK 0x0f
|
||||
#define GLOBAL2_TRUNK_MASK 0x07
|
||||
#define GLOBAL2_TRUNK_MASK_UPDATE BIT(15)
|
||||
#define GLOBAL2_TRUNK_MASK_NUM_SHIFT 12
|
||||
|
|
@ -289,6 +297,9 @@
|
|||
#define GLOBAL2_SMI_OP_45_READ_DATA ((2 << 10) | GLOBAL2_SMI_OP_BUSY)
|
||||
#define GLOBAL2_SMI_DATA 0x19
|
||||
#define GLOBAL2_SCRATCH_MISC 0x1a
|
||||
#define GLOBAL2_SCRATCH_BUSY BIT(15)
|
||||
#define GLOBAL2_SCRATCH_REGISTER_SHIFT 8
|
||||
#define GLOBAL2_SCRATCH_VALUE_MASK 0xff
|
||||
#define GLOBAL2_WDOG_CONTROL 0x1b
|
||||
#define GLOBAL2_QOS_WEIGHT 0x1c
|
||||
#define GLOBAL2_MISC 0x1d
|
||||
|
|
@ -339,6 +350,8 @@ struct mv88e6xxx_priv_state {
|
|||
u8 port_state[DSA_MAX_PORTS];
|
||||
|
||||
struct work_struct bridge_work;
|
||||
|
||||
struct dentry *dbgfs;
|
||||
};
|
||||
|
||||
struct mv88e6xxx_hw_stat {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user