Skip to content

Commit 48e2331

Browse files
viviendavem330
authored andcommitted
net: dsa: dump CPU port regs through master
Merge the CPU port registers dump into the master interface registers dump through ethtool, by nesting the ethtool_drvinfo and ethtool_regs structures of the CPU port into the dump. drvinfo->regdump_len will contain the full data length, while regs->len will contain only the master interface registers dump length. This allows for example to dump the CPU port registers on a ZII Dev C board like this: # ethtool -d eth1 0x004: 0x00000000 0x008: 0x0a8000aa 0x010: 0x01000000 0x014: 0x00000000 0x024: 0xf0000102 0x040: 0x6d82c800 0x044: 0x00000020 0x064: 0x40000000 0x084: RCR (Receive Control Register) 0x47c00104 MAX_FL (Maximum frame length) 1984 FCE (Flow control enable) 0 BC_REJ (Broadcast frame reject) 0 PROM (Promiscuous mode) 0 DRT (Disable receive on transmit) 0 LOOP (Internal loopback) 0 0x0c4: TCR (Transmit Control Register) 0x00000004 RFC_PAUSE (Receive frame control pause) 0 TFC_PAUSE (Transmit frame control pause) 0 FDEN (Full duplex enable) 1 HBC (Heartbeat control) 0 GTS (Graceful transmit stop) 0 0x0e4: 0x76735d6d 0x0e8: 0x7e9e8808 0x0ec: 0x00010000 . . . 88E6352 Switch Port Registers ------------------------------ 00: Port Status 0x4d04 Pause Enabled 0 My Pause 1 802.3 PHY Detected 0 Link Status Up Duplex Full Speed 100 or 200 Mbps EEE Enabled 0 Transmitter Paused 0 Flow Control 0 Config Mode 0x4 01: Physical Control 0x003d RGMII Receive Timing Control Default RGMII Transmit Timing Control Default 200 BASE Mode 100 Flow Control's Forced value 0 Force Flow Control 0 Link's Forced value Up Force Link 1 Duplex's Forced value Full Force Duplex 1 Force Speed 100 or 200 Mbps . . . Signed-off-by: Vivien Didelot <vivien.didelot@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c4ed525 commit 48e2331

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

net/dsa/master.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,70 @@
88

99
#include "dsa_priv.h"
1010

11+
static int dsa_master_get_regs_len(struct net_device *dev)
12+
{
13+
struct dsa_port *cpu_dp = dev->dsa_ptr;
14+
const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
15+
struct dsa_switch *ds = cpu_dp->ds;
16+
int port = cpu_dp->index;
17+
int ret = 0;
18+
int len;
19+
20+
if (ops->get_regs_len) {
21+
len = ops->get_regs_len(dev);
22+
if (len < 0)
23+
return len;
24+
ret += len;
25+
}
26+
27+
ret += sizeof(struct ethtool_drvinfo);
28+
ret += sizeof(struct ethtool_regs);
29+
30+
if (ds->ops->get_regs_len) {
31+
len = ds->ops->get_regs_len(ds, port);
32+
if (len < 0)
33+
return len;
34+
ret += len;
35+
}
36+
37+
return ret;
38+
}
39+
40+
static void dsa_master_get_regs(struct net_device *dev,
41+
struct ethtool_regs *regs, void *data)
42+
{
43+
struct dsa_port *cpu_dp = dev->dsa_ptr;
44+
const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
45+
struct dsa_switch *ds = cpu_dp->ds;
46+
struct ethtool_drvinfo *cpu_info;
47+
struct ethtool_regs *cpu_regs;
48+
int port = cpu_dp->index;
49+
int len;
50+
51+
if (ops->get_regs_len && ops->get_regs) {
52+
len = ops->get_regs_len(dev);
53+
if (len < 0)
54+
return;
55+
regs->len = len;
56+
ops->get_regs(dev, regs, data);
57+
data += regs->len;
58+
}
59+
60+
cpu_info = (struct ethtool_drvinfo *)data;
61+
strlcpy(cpu_info->driver, "dsa", sizeof(cpu_info->driver));
62+
data += sizeof(*cpu_info);
63+
cpu_regs = (struct ethtool_regs *)data;
64+
data += sizeof(*cpu_regs);
65+
66+
if (ds->ops->get_regs_len && ds->ops->get_regs) {
67+
len = ds->ops->get_regs_len(ds, port);
68+
if (len < 0)
69+
return;
70+
cpu_regs->len = len;
71+
ds->ops->get_regs(ds, port, cpu_regs, data);
72+
}
73+
}
74+
1175
static void dsa_master_get_ethtool_stats(struct net_device *dev,
1276
struct ethtool_stats *stats,
1377
uint64_t *data)
@@ -147,6 +211,8 @@ static int dsa_master_ethtool_setup(struct net_device *dev)
147211
if (cpu_dp->orig_ethtool_ops)
148212
memcpy(ops, cpu_dp->orig_ethtool_ops, sizeof(*ops));
149213

214+
ops->get_regs_len = dsa_master_get_regs_len;
215+
ops->get_regs = dsa_master_get_regs;
150216
ops->get_sset_count = dsa_master_get_sset_count;
151217
ops->get_ethtool_stats = dsa_master_get_ethtool_stats;
152218
ops->get_strings = dsa_master_get_strings;

0 commit comments

Comments
 (0)