1*1b481fc3SMaciej Żenczykowski #include <stdio.h>
2*1b481fc3SMaciej Żenczykowski #include <string.h>
3*1b481fc3SMaciej Żenczykowski
4*1b481fc3SMaciej Żenczykowski #include "internal.h"
5*1b481fc3SMaciej Żenczykowski
6*1b481fc3SMaciej Żenczykowski #define SERDES_OFFSET 32
7*1b481fc3SMaciej Żenczykowski
8*1b481fc3SMaciej Żenczykowski /* Macros and dump functions for the 16-bit mv88e6xxx per-port registers */
9*1b481fc3SMaciej Żenczykowski
10*1b481fc3SMaciej Żenczykowski #define REG(_reg, _name, _val) \
11*1b481fc3SMaciej Żenczykowski printf("%.02u: %-38.38s 0x%.4x\n", _reg, _name, _val)
12*1b481fc3SMaciej Żenczykowski
13*1b481fc3SMaciej Żenczykowski #define FIELD(_name, _fmt, ...) \
14*1b481fc3SMaciej Żenczykowski printf(" %-36.36s " _fmt "\n", _name, ##__VA_ARGS__)
15*1b481fc3SMaciej Żenczykowski
16*1b481fc3SMaciej Żenczykowski #define FIELD_BITMAP(_name, _val) \
17*1b481fc3SMaciej Żenczykowski FIELD(_name, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", \
18*1b481fc3SMaciej Żenczykowski ((_val) & 0x0001) ? "0 " : "", \
19*1b481fc3SMaciej Żenczykowski ((_val) & 0x0002) ? "1 " : "", \
20*1b481fc3SMaciej Żenczykowski ((_val) & 0x0004) ? "2 " : "", \
21*1b481fc3SMaciej Żenczykowski ((_val) & 0x0008) ? "3 " : "", \
22*1b481fc3SMaciej Żenczykowski ((_val) & 0x0010) ? "4 " : "", \
23*1b481fc3SMaciej Żenczykowski ((_val) & 0x0020) ? "5 " : "", \
24*1b481fc3SMaciej Żenczykowski ((_val) & 0x0040) ? "6 " : "", \
25*1b481fc3SMaciej Żenczykowski ((_val) & 0x0080) ? "7 " : "", \
26*1b481fc3SMaciej Żenczykowski ((_val) & 0x0100) ? "8 " : "", \
27*1b481fc3SMaciej Żenczykowski ((_val) & 0x0200) ? "9 " : "", \
28*1b481fc3SMaciej Żenczykowski ((_val) & 0x0400) ? "10 " : "", \
29*1b481fc3SMaciej Żenczykowski ((_val) & 0x0800) ? "11 " : "", \
30*1b481fc3SMaciej Żenczykowski ((_val) & 0x1000) ? "12 " : "", \
31*1b481fc3SMaciej Żenczykowski ((_val) & 0x2000) ? "13 " : "", \
32*1b481fc3SMaciej Żenczykowski ((_val) & 0x4000) ? "14 " : "", \
33*1b481fc3SMaciej Żenczykowski ((_val) & 0x8000) ? "15 " : "")
34*1b481fc3SMaciej Żenczykowski
dsa_mv88e6161(int reg,u16 val)35*1b481fc3SMaciej Żenczykowski static void dsa_mv88e6161(int reg, u16 val)
36*1b481fc3SMaciej Żenczykowski {
37*1b481fc3SMaciej Żenczykowski switch (reg) {
38*1b481fc3SMaciej Żenczykowski case 0:
39*1b481fc3SMaciej Żenczykowski REG(reg, "Port Status", val);
40*1b481fc3SMaciej Żenczykowski FIELD("Pause Enabled", "%u", !!(val & 0x8000));
41*1b481fc3SMaciej Żenczykowski FIELD("My Pause", "%u", !!(val & 0x4000));
42*1b481fc3SMaciej Żenczykowski FIELD("Half-duplex Flow Control", "%u", !!(val & 0x2000));
43*1b481fc3SMaciej Żenczykowski FIELD("802.3 PHY Detected", "%u", !!(val & 0x1000));
44*1b481fc3SMaciej Żenczykowski FIELD("Link Status", "%s", val & 0x0800 ? "Up" : "Down");
45*1b481fc3SMaciej Żenczykowski FIELD("Duplex", "%s", val & 0x0400 ? "Full" : "Half");
46*1b481fc3SMaciej Żenczykowski FIELD("Speed", "%s",
47*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0000 ? "10 Mbps" :
48*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0100 ? "100 Mbps" :
49*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0200 ? "1000 Mbps" :
50*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0300 ? "Reserved" : "?");
51*1b481fc3SMaciej Żenczykowski FIELD("Auto-Media Detect Disable", "%u", !!(val & 0x0040));
52*1b481fc3SMaciej Żenczykowski FIELD("Transmitter Paused", "%u", !!(val & 0x0020));
53*1b481fc3SMaciej Żenczykowski FIELD("Flow Control", "%u", !!(val & 0x0010));
54*1b481fc3SMaciej Żenczykowski FIELD("Config Duplex", "%s", val & 0x0008 ? "Full" : "Half");
55*1b481fc3SMaciej Żenczykowski FIELD("Config Mode", "0x%x", val & 0x0007);
56*1b481fc3SMaciej Żenczykowski break;
57*1b481fc3SMaciej Żenczykowski case 1:
58*1b481fc3SMaciej Żenczykowski REG(reg, "PCS Control", val);
59*1b481fc3SMaciej Żenczykowski FIELD("Flow Control's Forced value", "%u", !!(val & 0x0080));
60*1b481fc3SMaciej Żenczykowski FIELD("Force Flow Control", "%u", !!(val & 0x0040));
61*1b481fc3SMaciej Żenczykowski FIELD("Link's Forced value", "%s", val & 0x0020 ? "Up" : "Down");
62*1b481fc3SMaciej Żenczykowski FIELD("Force Link", "%u", !!(val & 0x0010));
63*1b481fc3SMaciej Żenczykowski FIELD("Duplex's Forced value", "%s", val & 0x0008 ? "Full" : "Half");
64*1b481fc3SMaciej Żenczykowski FIELD("Force Duplex", "%u", !!(val & 0x0004));
65*1b481fc3SMaciej Żenczykowski FIELD("Force Speed", "%s",
66*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "10 Mbps" :
67*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "100 Mbps" :
68*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "1000 Mbps" :
69*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "Not forced" : "?");
70*1b481fc3SMaciej Żenczykowski break;
71*1b481fc3SMaciej Żenczykowski case 2:
72*1b481fc3SMaciej Żenczykowski REG(reg, "Jamming Control", val);
73*1b481fc3SMaciej Żenczykowski break;
74*1b481fc3SMaciej Żenczykowski case 3:
75*1b481fc3SMaciej Żenczykowski REG(reg, "Switch Identifier", val);
76*1b481fc3SMaciej Żenczykowski break;
77*1b481fc3SMaciej Żenczykowski case 4:
78*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control", val);
79*1b481fc3SMaciej Żenczykowski FIELD("Source Address Filtering controls", "%s",
80*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x0000 ? "Disabled" :
81*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x4000 ? "Drop On Lock" :
82*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x8000 ? "Drop On Unlock" :
83*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0xc000 ? "Drop to CPU" : "?");
84*1b481fc3SMaciej Żenczykowski FIELD("Egress Mode", "%s",
85*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "Unmodified" :
86*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "Untagged" :
87*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "Tagged" :
88*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Reserved" : "?");
89*1b481fc3SMaciej Żenczykowski FIELD("Ingress & Egress Header Mode", "%u", !!(val & 0x0800));
90*1b481fc3SMaciej Żenczykowski FIELD("IGMP and MLD Snooping", "%u", !!(val & 0x0400));
91*1b481fc3SMaciej Żenczykowski FIELD("Frame Mode", "%s",
92*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0000 ? "Normal" :
93*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0100 ? "DSA" :
94*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0200 ? "Provider" :
95*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0300 ? "Ether Type DSA" : "?");
96*1b481fc3SMaciej Żenczykowski FIELD("VLAN Tunnel", "%u", !!(val & 0x0080));
97*1b481fc3SMaciej Żenczykowski FIELD("TagIfBoth", "%u", !!(val & 0x0040));
98*1b481fc3SMaciej Żenczykowski FIELD("Initial Priority assignment", "%s",
99*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0000 ? "Defaults" :
100*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0010 ? "Tag Priority" :
101*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0020 ? "IP Priority" :
102*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0030 ? "Tag & IP Priority" : "?");
103*1b481fc3SMaciej Żenczykowski FIELD("Egress Flooding mode", "%s",
104*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0000 ? "No unknown DA" :
105*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0004 ? "No unknown multicast DA" :
106*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0008 ? "No unknown unicast DA" :
107*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x000c ? "Allow unknown DA" : "?");
108*1b481fc3SMaciej Żenczykowski FIELD("Port State", "%s",
109*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "Disabled" :
110*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "Blocking/Listening" :
111*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "Learning" :
112*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "Forwarding" : "?");
113*1b481fc3SMaciej Żenczykowski break;
114*1b481fc3SMaciej Żenczykowski case 5:
115*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 1", val);
116*1b481fc3SMaciej Żenczykowski FIELD("Message Port", "%u", !!(val & 0x8000));
117*1b481fc3SMaciej Żenczykowski FIELD("Trunk Port", "%u", !!(val & 0x4000));
118*1b481fc3SMaciej Żenczykowski FIELD("Trunk ID", "%u", (val & 0x0f00) >> 8);
119*1b481fc3SMaciej Żenczykowski FIELD("FID[5:4]", "0x%.2x", (val & 0x0003) << 4);
120*1b481fc3SMaciej Żenczykowski break;
121*1b481fc3SMaciej Żenczykowski case 6:
122*1b481fc3SMaciej Żenczykowski REG(reg, "Port Base VLAN Map (Header)", val);
123*1b481fc3SMaciej Żenczykowski FIELD("FID[3:0]", "0x%.2x", (val & 0xf000) >> 12);
124*1b481fc3SMaciej Żenczykowski FIELD_BITMAP("VLANTable", val & 0x003f);
125*1b481fc3SMaciej Żenczykowski break;
126*1b481fc3SMaciej Żenczykowski case 7:
127*1b481fc3SMaciej Żenczykowski REG(reg, "Default VLAN ID & Priority", val);
128*1b481fc3SMaciej Żenczykowski FIELD("Default Priority", "0x%x", (val & 0xe000) >> 13);
129*1b481fc3SMaciej Żenczykowski FIELD("Force to use Default VID", "%u", !!(val & 0x1000));
130*1b481fc3SMaciej Żenczykowski FIELD("Default VLAN Identifier", "%u", val & 0x0fff);
131*1b481fc3SMaciej Żenczykowski break;
132*1b481fc3SMaciej Żenczykowski case 8:
133*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 2", val);
134*1b481fc3SMaciej Żenczykowski FIELD("Force good FCS in the frame", "%u", !!(val & 0x8000));
135*1b481fc3SMaciej Żenczykowski FIELD("Jumbo Mode", "%s",
136*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "1522" :
137*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "2048" :
138*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "10240" :
139*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Reserved" : "?");
140*1b481fc3SMaciej Żenczykowski FIELD("802.1QMode", "%s",
141*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0000 ? "Disabled" :
142*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0400 ? "Fallback" :
143*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0800 ? "Check" :
144*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0c00 ? "Secure" : "?");
145*1b481fc3SMaciej Żenczykowski FIELD("Discard Tagged Frames", "%u", !!(val & 0x0200));
146*1b481fc3SMaciej Żenczykowski FIELD("Discard Untagged Frames", "%u", !!(val & 0x0100));
147*1b481fc3SMaciej Żenczykowski FIELD("Map using DA hits", "%u", !!(val & 0x0080));
148*1b481fc3SMaciej Żenczykowski FIELD("ARP Mirror enable", "%u", !!(val & 0x0040));
149*1b481fc3SMaciej Żenczykowski FIELD("Egress Monitor Source Port", "%u", !!(val & 0x0020));
150*1b481fc3SMaciej Żenczykowski FIELD("Ingress Monitor Source Port", "%u", !!(val & 0x0010));
151*1b481fc3SMaciej Żenczykowski break;
152*1b481fc3SMaciej Żenczykowski case 9:
153*1b481fc3SMaciej Żenczykowski REG(reg, "Egress Rate Control", val);
154*1b481fc3SMaciej Żenczykowski break;
155*1b481fc3SMaciej Żenczykowski case 10:
156*1b481fc3SMaciej Żenczykowski REG(reg, "Egress Rate Control 2", val);
157*1b481fc3SMaciej Żenczykowski break;
158*1b481fc3SMaciej Żenczykowski case 11:
159*1b481fc3SMaciej Żenczykowski REG(reg, "Port Association Vector", val);
160*1b481fc3SMaciej Żenczykowski break;
161*1b481fc3SMaciej Żenczykowski case 12:
162*1b481fc3SMaciej Żenczykowski REG(reg, "Port ATU Control", val);
163*1b481fc3SMaciej Żenczykowski break;
164*1b481fc3SMaciej Żenczykowski case 13:
165*1b481fc3SMaciej Żenczykowski REG(reg, "Priority Override", val);
166*1b481fc3SMaciej Żenczykowski break;
167*1b481fc3SMaciej Żenczykowski case 15:
168*1b481fc3SMaciej Żenczykowski REG(reg, "PortEType", val);
169*1b481fc3SMaciej Żenczykowski break;
170*1b481fc3SMaciej Żenczykowski case 16:
171*1b481fc3SMaciej Żenczykowski REG(reg, "InDiscardsLo Frame Counter", val);
172*1b481fc3SMaciej Żenczykowski break;
173*1b481fc3SMaciej Żenczykowski case 17:
174*1b481fc3SMaciej Żenczykowski REG(reg, "InDiscardsHi Frame Counter", val);
175*1b481fc3SMaciej Żenczykowski break;
176*1b481fc3SMaciej Żenczykowski case 18:
177*1b481fc3SMaciej Żenczykowski REG(reg, "InFiltered Frame Counter", val);
178*1b481fc3SMaciej Żenczykowski break;
179*1b481fc3SMaciej Żenczykowski case 19:
180*1b481fc3SMaciej Żenczykowski REG(reg, "OutFiltered Frame Counter", val);
181*1b481fc3SMaciej Żenczykowski break;
182*1b481fc3SMaciej Żenczykowski case 24:
183*1b481fc3SMaciej Żenczykowski REG(reg, "Tag Remap 0-3", val);
184*1b481fc3SMaciej Żenczykowski break;
185*1b481fc3SMaciej Żenczykowski case 25:
186*1b481fc3SMaciej Żenczykowski REG(reg, "Tag Remap 4-7", val);
187*1b481fc3SMaciej Żenczykowski break;
188*1b481fc3SMaciej Żenczykowski case 27:
189*1b481fc3SMaciej Żenczykowski REG(reg, "Queue Counters", val);
190*1b481fc3SMaciej Żenczykowski break;
191*1b481fc3SMaciej Żenczykowski default:
192*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
193*1b481fc3SMaciej Żenczykowski break;
194*1b481fc3SMaciej Żenczykowski }
195*1b481fc3SMaciej Żenczykowski }
196*1b481fc3SMaciej Żenczykowski
dsa_mv88e6185(int reg,u16 val)197*1b481fc3SMaciej Żenczykowski static void dsa_mv88e6185(int reg, u16 val)
198*1b481fc3SMaciej Żenczykowski {
199*1b481fc3SMaciej Żenczykowski switch (reg) {
200*1b481fc3SMaciej Żenczykowski case 0:
201*1b481fc3SMaciej Żenczykowski REG(reg, "Port Status", val);
202*1b481fc3SMaciej Żenczykowski break;
203*1b481fc3SMaciej Żenczykowski case 1:
204*1b481fc3SMaciej Żenczykowski REG(reg, "PCS Control", val);
205*1b481fc3SMaciej Żenczykowski break;
206*1b481fc3SMaciej Żenczykowski case 3:
207*1b481fc3SMaciej Żenczykowski REG(reg, "Switch Identifier", val);
208*1b481fc3SMaciej Żenczykowski break;
209*1b481fc3SMaciej Żenczykowski case 4:
210*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control", val);
211*1b481fc3SMaciej Żenczykowski break;
212*1b481fc3SMaciej Żenczykowski case 5:
213*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 1", val);
214*1b481fc3SMaciej Żenczykowski break;
215*1b481fc3SMaciej Żenczykowski case 6:
216*1b481fc3SMaciej Żenczykowski REG(reg, "Port Base VLAN Map (Header)", val);
217*1b481fc3SMaciej Żenczykowski break;
218*1b481fc3SMaciej Żenczykowski case 7:
219*1b481fc3SMaciej Żenczykowski REG(reg, "Default VLAN ID & Priority", val);
220*1b481fc3SMaciej Żenczykowski break;
221*1b481fc3SMaciej Żenczykowski case 8:
222*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 2", val);
223*1b481fc3SMaciej Żenczykowski break;
224*1b481fc3SMaciej Żenczykowski case 9:
225*1b481fc3SMaciej Żenczykowski REG(reg, "Rate Control", val);
226*1b481fc3SMaciej Żenczykowski break;
227*1b481fc3SMaciej Żenczykowski case 10:
228*1b481fc3SMaciej Żenczykowski REG(reg, "Rate Control 2", val);
229*1b481fc3SMaciej Żenczykowski break;
230*1b481fc3SMaciej Żenczykowski case 11:
231*1b481fc3SMaciej Żenczykowski REG(reg, "Port Association Vector", val);
232*1b481fc3SMaciej Żenczykowski break;
233*1b481fc3SMaciej Żenczykowski case 16:
234*1b481fc3SMaciej Żenczykowski REG(reg, "InDiscardsLo Frame Counter", val);
235*1b481fc3SMaciej Żenczykowski break;
236*1b481fc3SMaciej Żenczykowski case 17:
237*1b481fc3SMaciej Żenczykowski REG(reg, "InDiscardsHi Frame Counter", val);
238*1b481fc3SMaciej Żenczykowski break;
239*1b481fc3SMaciej Żenczykowski case 18:
240*1b481fc3SMaciej Żenczykowski REG(reg, "InFiltered Frame Counter", val);
241*1b481fc3SMaciej Żenczykowski break;
242*1b481fc3SMaciej Żenczykowski case 19:
243*1b481fc3SMaciej Żenczykowski REG(reg, "OutFiltered Frame Counter", val);
244*1b481fc3SMaciej Żenczykowski break;
245*1b481fc3SMaciej Żenczykowski case 24:
246*1b481fc3SMaciej Żenczykowski REG(reg, "Tag Remap 0-3", val);
247*1b481fc3SMaciej Żenczykowski break;
248*1b481fc3SMaciej Żenczykowski case 25:
249*1b481fc3SMaciej Żenczykowski REG(reg, "Tag Remap 4-7", val);
250*1b481fc3SMaciej Żenczykowski break;
251*1b481fc3SMaciej Żenczykowski default:
252*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
253*1b481fc3SMaciej Żenczykowski break;
254*1b481fc3SMaciej Żenczykowski }
255*1b481fc3SMaciej Żenczykowski };
256*1b481fc3SMaciej Żenczykowski
dsa_mv88e6352(int reg,u16 val)257*1b481fc3SMaciej Żenczykowski static void dsa_mv88e6352(int reg, u16 val)
258*1b481fc3SMaciej Żenczykowski {
259*1b481fc3SMaciej Żenczykowski switch (reg) {
260*1b481fc3SMaciej Żenczykowski case 0:
261*1b481fc3SMaciej Żenczykowski REG(reg, "Port Status", val);
262*1b481fc3SMaciej Żenczykowski FIELD("Pause Enabled", "%u", !!(val & 0x8000));
263*1b481fc3SMaciej Żenczykowski FIELD("My Pause", "%u", !!(val & 0x4000));
264*1b481fc3SMaciej Żenczykowski FIELD("802.3 PHY Detected", "%u", !!(val & 0x1000));
265*1b481fc3SMaciej Żenczykowski FIELD("Link Status", "%s", val & 0x0800 ? "Up" : "Down");
266*1b481fc3SMaciej Żenczykowski FIELD("Duplex", "%s", val & 0x0400 ? "Full" : "Half");
267*1b481fc3SMaciej Żenczykowski FIELD("Speed", "%s",
268*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0000 ? "10 Mbps" :
269*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0100 ? "100 or 200 Mbps" :
270*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0200 ? "1000 Mbps" :
271*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0300 ? "Reserved" : "?");
272*1b481fc3SMaciej Żenczykowski FIELD("EEE Enabled", "%u", !!(val & 0x0040));
273*1b481fc3SMaciej Żenczykowski FIELD("Transmitter Paused", "%u", !!(val & 0x0020));
274*1b481fc3SMaciej Żenczykowski FIELD("Flow Control", "%u", !!(val & 0x0010));
275*1b481fc3SMaciej Żenczykowski FIELD("Config Mode", "0x%x", val & 0x000f);
276*1b481fc3SMaciej Żenczykowski break;
277*1b481fc3SMaciej Żenczykowski case 1:
278*1b481fc3SMaciej Żenczykowski REG(reg, "Physical Control", val);
279*1b481fc3SMaciej Żenczykowski FIELD("RGMII Receive Timing Control", "%s", val & 0x8000 ? "Delay" : "Default");
280*1b481fc3SMaciej Żenczykowski FIELD("RGMII Transmit Timing Control", "%s", val & 0x4000 ? "Delay" : "Default");
281*1b481fc3SMaciej Żenczykowski FIELD("200 BASE Mode", "%s", val & 0x1000 ? "200" : "100");
282*1b481fc3SMaciej Żenczykowski FIELD("Flow Control's Forced value", "%u", !!(val & 0x0080));
283*1b481fc3SMaciej Żenczykowski FIELD("Force Flow Control", "%u", !!(val & 0x0040));
284*1b481fc3SMaciej Żenczykowski FIELD("Link's Forced value", "%s", val & 0x0020 ? "Up" : "Down");
285*1b481fc3SMaciej Żenczykowski FIELD("Force Link", "%u", !!(val & 0x0010));
286*1b481fc3SMaciej Żenczykowski FIELD("Duplex's Forced value", "%s", val & 0x0008 ? "Full" : "Half");
287*1b481fc3SMaciej Żenczykowski FIELD("Force Duplex", "%u", !!(val & 0x0004));
288*1b481fc3SMaciej Żenczykowski FIELD("Force Speed", "%s",
289*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "10 Mbps" :
290*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "100 or 200 Mbps" :
291*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "1000 Mbps" :
292*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "Not forced" : "?");
293*1b481fc3SMaciej Żenczykowski break;
294*1b481fc3SMaciej Żenczykowski case 2:
295*1b481fc3SMaciej Żenczykowski REG(reg, "Jamming Control", val);
296*1b481fc3SMaciej Żenczykowski break;
297*1b481fc3SMaciej Żenczykowski case 3:
298*1b481fc3SMaciej Żenczykowski REG(reg, "Switch Identifier", val);
299*1b481fc3SMaciej Żenczykowski break;
300*1b481fc3SMaciej Żenczykowski case 4:
301*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control", val);
302*1b481fc3SMaciej Żenczykowski FIELD("Source Address Filtering controls", "%s",
303*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x0000 ? "Disabled" :
304*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x4000 ? "Drop On Lock" :
305*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x8000 ? "Drop On Unlock" :
306*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0xc000 ? "Drop to CPU" : "?");
307*1b481fc3SMaciej Żenczykowski FIELD("Egress Mode", "%s",
308*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "Unmodified" :
309*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "Untagged" :
310*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "Tagged" :
311*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Reserved" : "?");
312*1b481fc3SMaciej Żenczykowski FIELD("Ingress & Egress Header Mode", "%u", !!(val & 0x0800));
313*1b481fc3SMaciej Żenczykowski FIELD("IGMP and MLD Snooping", "%u", !!(val & 0x0400));
314*1b481fc3SMaciej Żenczykowski FIELD("Frame Mode", "%s",
315*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0000 ? "Normal" :
316*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0100 ? "DSA" :
317*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0200 ? "Provider" :
318*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0300 ? "Ether Type DSA" : "?");
319*1b481fc3SMaciej Żenczykowski FIELD("VLAN Tunnel", "%u", !!(val & 0x0080));
320*1b481fc3SMaciej Żenczykowski FIELD("TagIfBoth", "%u", !!(val & 0x0040));
321*1b481fc3SMaciej Żenczykowski FIELD("Initial Priority assignment", "%s",
322*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0000 ? "Defaults" :
323*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0010 ? "Tag Priority" :
324*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0020 ? "IP Priority" :
325*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0030 ? "Tag & IP Priority" : "?");
326*1b481fc3SMaciej Żenczykowski FIELD("Egress Flooding mode", "%s",
327*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0000 ? "No unknown DA" :
328*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0004 ? "No unknown multicast DA" :
329*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0008 ? "No unknown unicast DA" :
330*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x000c ? "Allow unknown DA" : "?");
331*1b481fc3SMaciej Żenczykowski FIELD("Port State", "%s",
332*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "Disabled" :
333*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "Blocking/Listening" :
334*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "Learning" :
335*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "Forwarding" : "?");
336*1b481fc3SMaciej Żenczykowski break;
337*1b481fc3SMaciej Żenczykowski case 5:
338*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 1", val);
339*1b481fc3SMaciej Żenczykowski FIELD("Message Port", "%u", !!(val & 0x8000));
340*1b481fc3SMaciej Żenczykowski FIELD("Trunk Port", "%u", !!(val & 0x4000));
341*1b481fc3SMaciej Żenczykowski FIELD("Trunk ID", "%u", (val & 0x0f00) >> 8);
342*1b481fc3SMaciej Żenczykowski FIELD("FID[11:4]", "0x%.3x", (val & 0x00ff) << 4);
343*1b481fc3SMaciej Żenczykowski break;
344*1b481fc3SMaciej Żenczykowski case 6:
345*1b481fc3SMaciej Żenczykowski REG(reg, "Port Base VLAN Map (Header)", val);
346*1b481fc3SMaciej Żenczykowski FIELD("FID[3:0]", "0x%.3x", (val & 0xf000) >> 12);
347*1b481fc3SMaciej Żenczykowski FIELD_BITMAP("VLANTable", val & 0x007f);
348*1b481fc3SMaciej Żenczykowski break;
349*1b481fc3SMaciej Żenczykowski case 7:
350*1b481fc3SMaciej Żenczykowski REG(reg, "Default VLAN ID & Priority", val);
351*1b481fc3SMaciej Żenczykowski FIELD("Default Priority", "0x%x", (val & 0xe000) >> 13);
352*1b481fc3SMaciej Żenczykowski FIELD("Force to use Default VID", "%u", !!(val & 0x1000));
353*1b481fc3SMaciej Żenczykowski FIELD("Default VLAN Identifier", "%u", val & 0x0fff);
354*1b481fc3SMaciej Żenczykowski break;
355*1b481fc3SMaciej Żenczykowski case 8:
356*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 2", val);
357*1b481fc3SMaciej Żenczykowski FIELD("Force good FCS in the frame", "%u", !!(val & 0x8000));
358*1b481fc3SMaciej Żenczykowski FIELD("Jumbo Mode", "%s",
359*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "1522" :
360*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "2048" :
361*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "10240" :
362*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Reserved" : "?");
363*1b481fc3SMaciej Żenczykowski FIELD("802.1QMode", "%s",
364*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0000 ? "Disabled" :
365*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0400 ? "Fallback" :
366*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0800 ? "Check" :
367*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0c00 ? "Secure" : "?");
368*1b481fc3SMaciej Żenczykowski FIELD("Discard Tagged Frames", "%u", !!(val & 0x0200));
369*1b481fc3SMaciej Żenczykowski FIELD("Discard Untagged Frames", "%u", !!(val & 0x0100));
370*1b481fc3SMaciej Żenczykowski FIELD("Map using DA hits", "%u", !!(val & 0x0080));
371*1b481fc3SMaciej Żenczykowski FIELD("ARP Mirror enable", "%u", !!(val & 0x0040));
372*1b481fc3SMaciej Żenczykowski FIELD("Egress Monitor Source Port", "%u", !!(val & 0x0020));
373*1b481fc3SMaciej Żenczykowski FIELD("Ingress Monitor Source Port", "%u", !!(val & 0x0010));
374*1b481fc3SMaciej Żenczykowski FIELD("Use Default Queue Priority", "%u", !!(val & 0x0008));
375*1b481fc3SMaciej Żenczykowski FIELD("Default Queue Priority", "0x%x", (val & 0x0006) >> 1);
376*1b481fc3SMaciej Żenczykowski break;
377*1b481fc3SMaciej Żenczykowski case 9:
378*1b481fc3SMaciej Żenczykowski REG(reg, "Egress Rate Control", val);
379*1b481fc3SMaciej Żenczykowski break;
380*1b481fc3SMaciej Żenczykowski case 10:
381*1b481fc3SMaciej Żenczykowski REG(reg, "Egress Rate Control 2", val);
382*1b481fc3SMaciej Żenczykowski break;
383*1b481fc3SMaciej Żenczykowski case 11:
384*1b481fc3SMaciej Żenczykowski REG(reg, "Port Association Vector", val);
385*1b481fc3SMaciej Żenczykowski break;
386*1b481fc3SMaciej Żenczykowski case 12:
387*1b481fc3SMaciej Żenczykowski REG(reg, "Port ATU Control", val);
388*1b481fc3SMaciej Żenczykowski break;
389*1b481fc3SMaciej Żenczykowski case 13:
390*1b481fc3SMaciej Żenczykowski REG(reg, "Override", val);
391*1b481fc3SMaciej Żenczykowski break;
392*1b481fc3SMaciej Żenczykowski case 14:
393*1b481fc3SMaciej Żenczykowski REG(reg, "Policy Control", val);
394*1b481fc3SMaciej Żenczykowski break;
395*1b481fc3SMaciej Żenczykowski case 15:
396*1b481fc3SMaciej Żenczykowski REG(reg, "Port Ether Type", val);
397*1b481fc3SMaciej Żenczykowski break;
398*1b481fc3SMaciej Żenczykowski case 16:
399*1b481fc3SMaciej Żenczykowski REG(reg, "InDiscardsLo Frame Counter", val);
400*1b481fc3SMaciej Żenczykowski break;
401*1b481fc3SMaciej Żenczykowski case 17:
402*1b481fc3SMaciej Żenczykowski REG(reg, "InDiscardsHi Frame Counter", val);
403*1b481fc3SMaciej Żenczykowski break;
404*1b481fc3SMaciej Żenczykowski case 18:
405*1b481fc3SMaciej Żenczykowski REG(reg, "InFiltered/TcamCtr Frame Counter", val);
406*1b481fc3SMaciej Żenczykowski break;
407*1b481fc3SMaciej Żenczykowski case 19:
408*1b481fc3SMaciej Żenczykowski REG(reg, "Rx Frame Counter", val);
409*1b481fc3SMaciej Żenczykowski break;
410*1b481fc3SMaciej Żenczykowski case 20 ... 21:
411*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
412*1b481fc3SMaciej Żenczykowski break;
413*1b481fc3SMaciej Żenczykowski case 22:
414*1b481fc3SMaciej Żenczykowski REG(reg, "LED Control", val);
415*1b481fc3SMaciej Żenczykowski break;
416*1b481fc3SMaciej Żenczykowski case 23:
417*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
418*1b481fc3SMaciej Żenczykowski break;
419*1b481fc3SMaciej Żenczykowski case 24:
420*1b481fc3SMaciej Żenczykowski REG(reg, "Tag Remap 0-3", val);
421*1b481fc3SMaciej Żenczykowski break;
422*1b481fc3SMaciej Żenczykowski case 25:
423*1b481fc3SMaciej Żenczykowski REG(reg, "Tag Remap 4-7", val);
424*1b481fc3SMaciej Żenczykowski break;
425*1b481fc3SMaciej Żenczykowski case 26:
426*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
427*1b481fc3SMaciej Żenczykowski break;
428*1b481fc3SMaciej Żenczykowski case 27:
429*1b481fc3SMaciej Żenczykowski REG(reg, "Queue Counters", val);
430*1b481fc3SMaciej Żenczykowski break;
431*1b481fc3SMaciej Żenczykowski case 28 ... 31:
432*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
433*1b481fc3SMaciej Żenczykowski break;
434*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 0:
435*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Control", val);
436*1b481fc3SMaciej Żenczykowski FIELD("Fiber Reset", "%u", !!(val & 0x8000));
437*1b481fc3SMaciej Żenczykowski FIELD("Loopback", "%u", !!(val & 0x4000));
438*1b481fc3SMaciej Żenczykowski FIELD("Speed", "%s",
439*1b481fc3SMaciej Żenczykowski (val & (0x2000 | 0x0040)) == 0x0000 ? "10 Mbps" :
440*1b481fc3SMaciej Żenczykowski (val & (0x2000 | 0x0040)) == 0x2000 ? "100 Mbps" :
441*1b481fc3SMaciej Żenczykowski (val & (0x2000 | 0x0040)) == 0x0040 ? "1000 Mbps" :
442*1b481fc3SMaciej Żenczykowski (val & (0x2000 | 0x0040)) == (0x2000 | 0x0040) ?
443*1b481fc3SMaciej Żenczykowski "Reserved" : "?");
444*1b481fc3SMaciej Żenczykowski FIELD("Autoneg Enable", "%u", !!(val & 0x1000));
445*1b481fc3SMaciej Żenczykowski FIELD("Power down", "%u", !!(val & 0x0800));
446*1b481fc3SMaciej Żenczykowski FIELD("Isolate", "%u", !!(val & 0x0400));
447*1b481fc3SMaciej Żenczykowski FIELD("Restart Autoneg", "%u", !!(val & 0x0200));
448*1b481fc3SMaciej Żenczykowski FIELD("Duplex", "%s", val & 0x0100 ? "Full" : "Half");
449*1b481fc3SMaciej Żenczykowski break;
450*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 1:
451*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Status", val);
452*1b481fc3SMaciej Żenczykowski FIELD("100Base-X FD", "%u", !!(val & 0x4000));
453*1b481fc3SMaciej Żenczykowski FIELD("100Base-X HD", "%u", !!(val & 0x2000));
454*1b481fc3SMaciej Żenczykowski FIELD("Autoneg Complete", "%u", !!(val & 0x0020));
455*1b481fc3SMaciej Żenczykowski FIELD("Remote Fault", "%u", !!(val & 0x0010));
456*1b481fc3SMaciej Żenczykowski FIELD("Autoneg Ability", "%u", !!(val & 0x0008));
457*1b481fc3SMaciej Żenczykowski FIELD("Link Status", "%s", val & 0x0004 ? "Up" : "Down");
458*1b481fc3SMaciej Żenczykowski break;
459*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 2:
460*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "PHY ID 1", val);
461*1b481fc3SMaciej Żenczykowski break;
462*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 3:
463*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "PHY ID 2", val);
464*1b481fc3SMaciej Żenczykowski break;
465*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 4:
466*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Autoneg Advertisement", val);
467*1b481fc3SMaciej Żenczykowski FIELD("Remote Fault", "%s",
468*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "No error, link OK" :
469*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "Link failure" :
470*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "Offline" :
471*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Autoneg Error" : "?");
472*1b481fc3SMaciej Żenczykowski FIELD("Pause", "%s",
473*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0000 ? "No Pause" :
474*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0080 ? "Symmetric Pause" :
475*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0100 ? "Asymmetric Pause" :
476*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0180 ? "Symmetric & Asymmetric Pause" :
477*1b481fc3SMaciej Żenczykowski "?");
478*1b481fc3SMaciej Żenczykowski FIELD("1000BaseX HD", "%u", !!(val & 0x0040));
479*1b481fc3SMaciej Żenczykowski FIELD("1000BaseX FD", "%u", !!(val & 0x0020));
480*1b481fc3SMaciej Żenczykowski break;
481*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 5:
482*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Link Autoneg Ability", val);
483*1b481fc3SMaciej Żenczykowski FIELD("Acknowledge", "%u", !!(val & 0x4000));
484*1b481fc3SMaciej Żenczykowski FIELD("Remote Fault", "%s",
485*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "No error, link OK" :
486*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "Link failure" :
487*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "Offline" :
488*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Autoneg Error" : "?");
489*1b481fc3SMaciej Żenczykowski FIELD("Pause", "%s",
490*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0000 ? "No Pause" :
491*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0080 ? "Symmetric Pause" :
492*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0100 ? "Asymmetric Pause" :
493*1b481fc3SMaciej Żenczykowski (val & 0x0180) == 0x0180 ? "Symmetric & Asymmetric Pause" :
494*1b481fc3SMaciej Żenczykowski "?");
495*1b481fc3SMaciej Żenczykowski FIELD("1000BaseX HD", "%u", !!(val & 0x0040));
496*1b481fc3SMaciej Żenczykowski FIELD("1000BaseX FD", "%u", !!(val & 0x0020));
497*1b481fc3SMaciej Żenczykowski break;
498*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 6:
499*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Autoneg Expansion", val);
500*1b481fc3SMaciej Żenczykowski FIELD("Link Partner Next Page Ability", "%u", !!(val & 0x0008));
501*1b481fc3SMaciej Żenczykowski FIELD("Page Received", "%u", !!(val & 0x0002));
502*1b481fc3SMaciej Żenczykowski FIELD("Link Partner Autoneg Ability", "%u", !!(val & 0x0001));
503*1b481fc3SMaciej Żenczykowski break;
504*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 7:
505*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Next Page Transmit", val);
506*1b481fc3SMaciej Żenczykowski break;
507*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 8:
508*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Link Partner Next Page", val);
509*1b481fc3SMaciej Żenczykowski break;
510*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 9 ... SERDES_OFFSET + 14:
511*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Reserved", val);
512*1b481fc3SMaciej Żenczykowski break;
513*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 15:
514*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Extended Status", val);
515*1b481fc3SMaciej Żenczykowski break;
516*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 16:
517*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Specific Control", val);
518*1b481fc3SMaciej Żenczykowski FIELD("Fiber Transmit FIFO Depth", "%s",
519*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x0000 ? "16 Bits" :
520*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x4000 ? "24 Bits" :
521*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x8000 ? "32 Bits" :
522*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0xc000 ? "40 Bits" : "?");
523*1b481fc3SMaciej Żenczykowski FIELD("SERDES Loopback", "%u", !!(val & 0x1000));
524*1b481fc3SMaciej Żenczykowski FIELD("Force Link Good", "%u", !!(val & 0x0400));
525*1b481fc3SMaciej Żenczykowski FIELD("MAC Interface Power Down", "%u", !!(val & 0x0008));
526*1b481fc3SMaciej Żenczykowski FIELD("Mode", "%s",
527*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "100BaseFX" :
528*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "1000BaseX" :
529*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "SGMII System" :
530*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "SGMII Media" : "?");
531*1b481fc3SMaciej Żenczykowski break;
532*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 17:
533*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Specific Status", val);
534*1b481fc3SMaciej Żenczykowski FIELD("Speed", "%s",
535*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x0000 ? "10 Mbps" :
536*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x4000 ? "100 Mbps" :
537*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x8000 ? "1000 Mbps" :
538*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0xc000 ? "Reserved" : "?");
539*1b481fc3SMaciej Żenczykowski FIELD("Duplex", "%s", val & 0x2000 ? "Full" : "Half");
540*1b481fc3SMaciej Żenczykowski FIELD("Page Received", "%u", !!(val & 0x1000));
541*1b481fc3SMaciej Żenczykowski FIELD("Speed/Duplex Resolved", "%u", !!(val & 0x0800));
542*1b481fc3SMaciej Żenczykowski FIELD("Link", "%s", val & 0x0400 ? "Up" : "Down");
543*1b481fc3SMaciej Żenczykowski FIELD("Sync", "%u", !!(val & 0x0020));
544*1b481fc3SMaciej Żenczykowski FIELD("Energy Detect", "%s", val & 0x010 ? "False" : "True");
545*1b481fc3SMaciej Żenczykowski FIELD("Transmit Pause", "%u", !!(val & 0x0008));
546*1b481fc3SMaciej Żenczykowski FIELD("Receive Pause", "%u", !!(val & 0x00004));
547*1b481fc3SMaciej Żenczykowski break;
548*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 18:
549*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Interrupt Enable", val);
550*1b481fc3SMaciej Żenczykowski FIELD("Speed Changed", "%u", !!(val & 0x4000));
551*1b481fc3SMaciej Żenczykowski FIELD("Duplex Changed", "%u", !!(val & 0x2000));
552*1b481fc3SMaciej Żenczykowski FIELD("Page Received", "%u", !!(val & 0x1000));
553*1b481fc3SMaciej Żenczykowski FIELD("Autoneg Complete", "%u", !!(val & 0x0800));
554*1b481fc3SMaciej Żenczykowski FIELD("Link Status Change", "%u", !!(val & 0x0400));
555*1b481fc3SMaciej Żenczykowski FIELD("Symbol Error", "%u", !!(val & 0x0200));
556*1b481fc3SMaciej Żenczykowski FIELD("False Carrier", "%u", !!(val & 0x0100));
557*1b481fc3SMaciej Żenczykowski FIELD("Energy Detect", "%u", !!(val & 0x0010));
558*1b481fc3SMaciej Żenczykowski break;
559*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 19:
560*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Interrupt Status", val);
561*1b481fc3SMaciej Żenczykowski FIELD("Speed Changed", "%u", !!(val & 0x4000));
562*1b481fc3SMaciej Żenczykowski FIELD("Duplex Changed", "%u", !!(val & 0x2000));
563*1b481fc3SMaciej Żenczykowski FIELD("Page Received", "%u", !!(val & 0x1000));
564*1b481fc3SMaciej Żenczykowski FIELD("Autoneg Complete", "%u", !!(val & 0x0800));
565*1b481fc3SMaciej Żenczykowski FIELD("Link Status Change", "%u", !!(val & 0x0400));
566*1b481fc3SMaciej Żenczykowski FIELD("Symbol Error", "%u", !!(val & 0x0200));
567*1b481fc3SMaciej Żenczykowski FIELD("False Carrier", "%u", !!(val & 0x0100));
568*1b481fc3SMaciej Żenczykowski FIELD("Energy Detect", "%u", !!(val & 0x0010));
569*1b481fc3SMaciej Żenczykowski break;
570*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 20:
571*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Reserved", val);
572*1b481fc3SMaciej Żenczykowski break;
573*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 21:
574*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Receive Error Counter", val);
575*1b481fc3SMaciej Żenczykowski break;
576*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 22:
577*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Reserved", val);
578*1b481fc3SMaciej Żenczykowski break;
579*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 23:
580*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "PRBS Control", val);
581*1b481fc3SMaciej Żenczykowski break;
582*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 24:
583*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "PRBS Error Counter LSB", val);
584*1b481fc3SMaciej Żenczykowski break;
585*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 25:
586*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "PRBS Error Counter MSB", val);
587*1b481fc3SMaciej Żenczykowski break;
588*1b481fc3SMaciej Żenczykowski case SERDES_OFFSET + 26:
589*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Fiber Specific Control 2", val);
590*1b481fc3SMaciej Żenczykowski FIELD("1000BaseX Noise Filtering", "%u", !!(val & 0x4000));
591*1b481fc3SMaciej Żenczykowski FIELD("1000BaseFX Noise Filtering", "%u", !!(val & 0x2000));
592*1b481fc3SMaciej Żenczykowski FIELD("SERDES Autoneg Bypass Enable", "%u", !!(val & 0x0040));
593*1b481fc3SMaciej Żenczykowski FIELD("SERDES Autoneg Bypass Status", "%u", !!(val & 0x0020));
594*1b481fc3SMaciej Żenczykowski FIELD("Fiber Transmitter Disable", "%u", !!(val & 0x0008));
595*1b481fc3SMaciej Żenczykowski FIELD("SGMII/Fiber Output Amplitude", "%s",
596*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0000 ? "14mV" :
597*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0001 ? "112mV" :
598*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0002 ? "210mV" :
599*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0003 ? "308mV" :
600*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0004 ? "406mV" :
601*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0005 ? "504mV" :
602*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0006 ? "602mV" :
603*1b481fc3SMaciej Żenczykowski (val & 0x0007) == 0x0007 ? "700mV" : "?");
604*1b481fc3SMaciej Żenczykowski break;
605*1b481fc3SMaciej Żenczykowski default:
606*1b481fc3SMaciej Żenczykowski REG(reg - SERDES_OFFSET, "Reserved", val);
607*1b481fc3SMaciej Żenczykowski break;
608*1b481fc3SMaciej Żenczykowski }
609*1b481fc3SMaciej Żenczykowski };
610*1b481fc3SMaciej Żenczykowski
dsa_mv88e6390(int reg,u16 val)611*1b481fc3SMaciej Żenczykowski static void dsa_mv88e6390(int reg, u16 val)
612*1b481fc3SMaciej Żenczykowski {
613*1b481fc3SMaciej Żenczykowski switch (reg) {
614*1b481fc3SMaciej Żenczykowski case 0:
615*1b481fc3SMaciej Żenczykowski REG(reg, "Port Status", val);
616*1b481fc3SMaciej Żenczykowski FIELD("Transmit Pause Enable bit", "%u", !!(val & 0x8000));
617*1b481fc3SMaciej Żenczykowski FIELD("Receive Pause Enable bit", "%u", !!(val & 0x4000));
618*1b481fc3SMaciej Żenczykowski FIELD("802.3 PHY Detected", "%u", !!(val & 0x1000));
619*1b481fc3SMaciej Żenczykowski FIELD("Link Status", "%s", val & 0x0800 ? "Up" : "Down");
620*1b481fc3SMaciej Żenczykowski FIELD("Duplex", "%s", val & 0x0400 ? "Full" : "Half");
621*1b481fc3SMaciej Żenczykowski FIELD("Speed", "%s",
622*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0000 ? "10 Mbps" :
623*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0100 ? "100 or 200 Mbps" :
624*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0200 ? "1000 Mbps" :
625*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0300 ? "10 Gb or 2500 Mbps" : "?");
626*1b481fc3SMaciej Żenczykowski FIELD("Duplex Fixed", "%u", !!(val & 0x0080));
627*1b481fc3SMaciej Żenczykowski FIELD("EEE Enabled", "%u", !!(val & 0x0040));
628*1b481fc3SMaciej Żenczykowski FIELD("Transmitter Paused", "%u", !!(val & 0x0020));
629*1b481fc3SMaciej Żenczykowski FIELD("Flow Control", "%u", !!(val & 0x0010));
630*1b481fc3SMaciej Żenczykowski FIELD("Config Mode", "0x%x", val & 0x000f);
631*1b481fc3SMaciej Żenczykowski break;
632*1b481fc3SMaciej Żenczykowski case 1:
633*1b481fc3SMaciej Żenczykowski REG(reg, "Physical Control", val);
634*1b481fc3SMaciej Żenczykowski FIELD("RGMII Receive Timing Control", "%s", val & 0x8000 ? "Delay" : "Default");
635*1b481fc3SMaciej Żenczykowski FIELD("RGMII Transmit Timing Control", "%s", val & 0x4000 ? "Delay" : "Default");
636*1b481fc3SMaciej Żenczykowski FIELD("Force Speed", "%u", !!(val & 0x2000));
637*1b481fc3SMaciej Żenczykowski FIELD("Alternate Speed Mode", "%s", val & 0x1000 ? "Alternate" : "Normal");
638*1b481fc3SMaciej Żenczykowski FIELD("MII PHY Mode", "%s", val & 0x0800 ? "PHY" : "MAC");
639*1b481fc3SMaciej Żenczykowski FIELD("EEE force value", "%u", !!(val & 0x0200));
640*1b481fc3SMaciej Żenczykowski FIELD("Force EEE", "%u", !!(val & 0x0100));
641*1b481fc3SMaciej Żenczykowski FIELD("Link's Forced value", "%s", val & 0x0020 ? "Up" : "Down");
642*1b481fc3SMaciej Żenczykowski FIELD("Force Link", "%u", !!(val & 0x0010));
643*1b481fc3SMaciej Żenczykowski FIELD("Duplex's Forced value", "%s", val & 0x0008 ? "Full" : "Half");
644*1b481fc3SMaciej Żenczykowski FIELD("Force Duplex", "%u", !!(val & 0x0004));
645*1b481fc3SMaciej Żenczykowski FIELD("Force Speed", "%s",
646*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "10 Mbps" :
647*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "100 or 200 Mbps" :
648*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "1000 Mbps" :
649*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "10 Gb or 2500 Mbps" : "?");
650*1b481fc3SMaciej Żenczykowski break;
651*1b481fc3SMaciej Żenczykowski case 2:
652*1b481fc3SMaciej Żenczykowski REG(reg, "Flow Control", val);
653*1b481fc3SMaciej Żenczykowski break;
654*1b481fc3SMaciej Żenczykowski case 3:
655*1b481fc3SMaciej Żenczykowski REG(reg, "Switch Identifier", val);
656*1b481fc3SMaciej Żenczykowski break;
657*1b481fc3SMaciej Żenczykowski case 4:
658*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control", val);
659*1b481fc3SMaciej Żenczykowski FIELD("Source Address Filtering controls", "%s",
660*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x0000 ? "Disabled" :
661*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x4000 ? "Drop On Lock" :
662*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0x8000 ? "Drop On Unlock" :
663*1b481fc3SMaciej Żenczykowski (val & 0xc000) == 0xc000 ? "Drop to CPU" : "?");
664*1b481fc3SMaciej Żenczykowski FIELD("Egress Mode", "%s",
665*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "Unmodified" :
666*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "Untagged" :
667*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "Tagged" :
668*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Reserved" : "?");
669*1b481fc3SMaciej Żenczykowski FIELD("Ingress & Egress Header Mode", "%u", !!(val & 0x0800));
670*1b481fc3SMaciej Żenczykowski FIELD("IGMP and MLD Snooping", "%u", !!(val & 0x0400));
671*1b481fc3SMaciej Żenczykowski FIELD("Frame Mode", "%s",
672*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0000 ? "Normal" :
673*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0100 ? "DSA" :
674*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0200 ? "Provider" :
675*1b481fc3SMaciej Żenczykowski (val & 0x0300) == 0x0300 ? "Ether Type DSA" : "?");
676*1b481fc3SMaciej Żenczykowski FIELD("VLAN Tunnel", "%u", !!(val & 0x0080));
677*1b481fc3SMaciej Żenczykowski FIELD("TagIfBoth", "%u", !!(val & 0x0040));
678*1b481fc3SMaciej Żenczykowski FIELD("Initial Priority assignment", "%s",
679*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0000 ? "Defaults" :
680*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0010 ? "Tag Priority" :
681*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0020 ? "IP Priority" :
682*1b481fc3SMaciej Żenczykowski (val & 0x0030) == 0x0030 ? "Tag & IP Priority" : "?");
683*1b481fc3SMaciej Żenczykowski FIELD("Egress Flooding mode", "%s",
684*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0000 ? "No unknown DA" :
685*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0004 ? "No unknown multicast DA" :
686*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x0008 ? "No unknown unicast DA" :
687*1b481fc3SMaciej Żenczykowski (val & 0x000c) == 0x000c ? "Allow unknown DA" : "?");
688*1b481fc3SMaciej Żenczykowski FIELD("Port State", "%s",
689*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0000 ? "Disabled" :
690*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0001 ? "Blocking/Listening" :
691*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0002 ? "Learning" :
692*1b481fc3SMaciej Żenczykowski (val & 0x0003) == 0x0003 ? "Forwarding" : "?");
693*1b481fc3SMaciej Żenczykowski break;
694*1b481fc3SMaciej Żenczykowski case 5:
695*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 1", val);
696*1b481fc3SMaciej Żenczykowski FIELD("Message Port", "%u", !!(val & 0x8000));
697*1b481fc3SMaciej Żenczykowski FIELD("LAG Port", "%u", !!(val & 0x4000));
698*1b481fc3SMaciej Żenczykowski FIELD("VTU Page", "%u", !!(val & 0x2000));
699*1b481fc3SMaciej Żenczykowski FIELD("LAG ID", "%u", (val & 0x0f00) >> 8);
700*1b481fc3SMaciej Żenczykowski FIELD("FID[11:4]", "0x%.3x", (val & 0x00ff) << 4);
701*1b481fc3SMaciej Żenczykowski break;
702*1b481fc3SMaciej Żenczykowski case 6:
703*1b481fc3SMaciej Żenczykowski REG(reg, "Port Base VLAN Map (Header)", val);
704*1b481fc3SMaciej Żenczykowski FIELD("FID[3:0]", "0x%.3x", (val & 0xf000) >> 12);
705*1b481fc3SMaciej Żenczykowski FIELD("Force Mapping", "%u", !!(val & 0x0800));
706*1b481fc3SMaciej Żenczykowski FIELD_BITMAP("VLANTable", val & 0x007ff);
707*1b481fc3SMaciej Żenczykowski break;
708*1b481fc3SMaciej Żenczykowski case 7:
709*1b481fc3SMaciej Żenczykowski REG(reg, "Default VLAN ID & Priority", val);
710*1b481fc3SMaciej Żenczykowski FIELD("Default Priority", "0x%x", (val & 0xe000) >> 13);
711*1b481fc3SMaciej Żenczykowski FIELD("Force to use Default VID", "%u", !!(val & 0x1000));
712*1b481fc3SMaciej Żenczykowski FIELD("Default VLAN Identifier", "%u", val & 0x0fff);
713*1b481fc3SMaciej Żenczykowski break;
714*1b481fc3SMaciej Żenczykowski case 8:
715*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 2", val);
716*1b481fc3SMaciej Żenczykowski FIELD("Force good FCS in the frame", "%u", !!(val & 0x8000));
717*1b481fc3SMaciej Żenczykowski FIELD("Allow bad FCS", "%u", !!(val & 0x4000));
718*1b481fc3SMaciej Żenczykowski FIELD("Jumbo Mode", "%s",
719*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x0000 ? "1522" :
720*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x1000 ? "2048" :
721*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x2000 ? "10240" :
722*1b481fc3SMaciej Żenczykowski (val & 0x3000) == 0x3000 ? "Reserved" : "?");
723*1b481fc3SMaciej Żenczykowski FIELD("802.1QMode", "%s",
724*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0000 ? "Disabled" :
725*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0400 ? "Fallback" :
726*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0800 ? "Check" :
727*1b481fc3SMaciej Żenczykowski (val & 0x0c00) == 0x0c00 ? "Secure" : "?");
728*1b481fc3SMaciej Żenczykowski FIELD("Discard Tagged Frames", "%u", !!(val & 0x0200));
729*1b481fc3SMaciej Żenczykowski FIELD("Discard Untagged Frames", "%u", !!(val & 0x0100));
730*1b481fc3SMaciej Żenczykowski FIELD("Map using DA hits", "%u", !!(val & 0x0080));
731*1b481fc3SMaciej Żenczykowski FIELD("ARP Mirror enable", "%u", !!(val & 0x0040));
732*1b481fc3SMaciej Żenczykowski FIELD("Egress Monitor Source Port", "%u", !!(val & 0x0020));
733*1b481fc3SMaciej Żenczykowski FIELD("Ingress Monitor Source Port", "%u", !!(val & 0x0010));
734*1b481fc3SMaciej Żenczykowski FIELD("Allow VID of Zero", "%u", !!(val & 0x0008));
735*1b481fc3SMaciej Żenczykowski FIELD("Default Queue Priority", "0x%x", val & 0x0007);
736*1b481fc3SMaciej Żenczykowski break;
737*1b481fc3SMaciej Żenczykowski case 9:
738*1b481fc3SMaciej Żenczykowski REG(reg, "Egress Rate Control", val);
739*1b481fc3SMaciej Żenczykowski break;
740*1b481fc3SMaciej Żenczykowski case 10:
741*1b481fc3SMaciej Żenczykowski REG(reg, "Egress Rate Control 2", val);
742*1b481fc3SMaciej Żenczykowski break;
743*1b481fc3SMaciej Żenczykowski case 11:
744*1b481fc3SMaciej Żenczykowski REG(reg, "Port Association Vector", val);
745*1b481fc3SMaciej Żenczykowski break;
746*1b481fc3SMaciej Żenczykowski case 12:
747*1b481fc3SMaciej Żenczykowski REG(reg, "Port ATU Control", val);
748*1b481fc3SMaciej Żenczykowski break;
749*1b481fc3SMaciej Żenczykowski case 13:
750*1b481fc3SMaciej Żenczykowski REG(reg, "Override", val);
751*1b481fc3SMaciej Żenczykowski break;
752*1b481fc3SMaciej Żenczykowski case 14:
753*1b481fc3SMaciej Żenczykowski REG(reg, "Policy Control", val);
754*1b481fc3SMaciej Żenczykowski break;
755*1b481fc3SMaciej Żenczykowski case 15:
756*1b481fc3SMaciej Żenczykowski REG(reg, "Port Ether Type", val);
757*1b481fc3SMaciej Żenczykowski break;
758*1b481fc3SMaciej Żenczykowski case 22:
759*1b481fc3SMaciej Żenczykowski REG(reg, "LED Control", val);
760*1b481fc3SMaciej Żenczykowski break;
761*1b481fc3SMaciej Żenczykowski case 23:
762*1b481fc3SMaciej Żenczykowski REG(reg, "IP Priority Mapping Table", val);
763*1b481fc3SMaciej Żenczykowski break;
764*1b481fc3SMaciej Żenczykowski case 24:
765*1b481fc3SMaciej Żenczykowski REG(reg, "IEEE Priority Mapping Table", val);
766*1b481fc3SMaciej Żenczykowski break;
767*1b481fc3SMaciej Żenczykowski case 25:
768*1b481fc3SMaciej Żenczykowski REG(reg, "Port Control 3", val);
769*1b481fc3SMaciej Żenczykowski break;
770*1b481fc3SMaciej Żenczykowski case 27:
771*1b481fc3SMaciej Żenczykowski REG(reg, "Queue Counters", val);
772*1b481fc3SMaciej Żenczykowski break;
773*1b481fc3SMaciej Żenczykowski case 28:
774*1b481fc3SMaciej Żenczykowski REG(reg, "Queue Control", val);
775*1b481fc3SMaciej Żenczykowski break;
776*1b481fc3SMaciej Żenczykowski case 30:
777*1b481fc3SMaciej Żenczykowski REG(reg, "Cut Through Control", val);
778*1b481fc3SMaciej Żenczykowski break;
779*1b481fc3SMaciej Żenczykowski case 31:
780*1b481fc3SMaciej Żenczykowski REG(reg, "Debug Counters", val);
781*1b481fc3SMaciej Żenczykowski break;
782*1b481fc3SMaciej Żenczykowski default:
783*1b481fc3SMaciej Żenczykowski REG(reg, "Reserved", val);
784*1b481fc3SMaciej Żenczykowski break;
785*1b481fc3SMaciej Żenczykowski }
786*1b481fc3SMaciej Żenczykowski };
787*1b481fc3SMaciej Żenczykowski
788*1b481fc3SMaciej Żenczykowski struct dsa_mv88e6xxx_switch {
789*1b481fc3SMaciej Żenczykowski void (*dump)(int reg, u16 val);
790*1b481fc3SMaciej Żenczykowski const char *name;
791*1b481fc3SMaciej Żenczykowski u16 id;
792*1b481fc3SMaciej Żenczykowski };
793*1b481fc3SMaciej Żenczykowski
794*1b481fc3SMaciej Żenczykowski static const struct dsa_mv88e6xxx_switch dsa_mv88e6xxx_switches[] = {
795*1b481fc3SMaciej Żenczykowski { .id = 0x04a0, .name = "88E6085 ", .dump = NULL },
796*1b481fc3SMaciej Żenczykowski { .id = 0x0950, .name = "88E6095 ", .dump = NULL },
797*1b481fc3SMaciej Żenczykowski { .id = 0x0990, .name = "88E6097 ", .dump = NULL },
798*1b481fc3SMaciej Żenczykowski { .id = 0x0a00, .name = "88E6190X", .dump = dsa_mv88e6390 },
799*1b481fc3SMaciej Żenczykowski { .id = 0x0a10, .name = "88E6390X", .dump = dsa_mv88e6390 },
800*1b481fc3SMaciej Żenczykowski { .id = 0x1060, .name = "88E6131 ", .dump = NULL },
801*1b481fc3SMaciej Żenczykowski { .id = 0x1150, .name = "88E6320 ", .dump = NULL },
802*1b481fc3SMaciej Żenczykowski { .id = 0x1210, .name = "88E6123 ", .dump = dsa_mv88e6161 },
803*1b481fc3SMaciej Żenczykowski { .id = 0x1610, .name = "88E6161 ", .dump = dsa_mv88e6161 },
804*1b481fc3SMaciej Żenczykowski { .id = 0x1650, .name = "88E6165 ", .dump = NULL },
805*1b481fc3SMaciej Żenczykowski { .id = 0x1710, .name = "88E6171 ", .dump = NULL },
806*1b481fc3SMaciej Żenczykowski { .id = 0x1720, .name = "88E6172 ", .dump = dsa_mv88e6352 },
807*1b481fc3SMaciej Żenczykowski { .id = 0x1750, .name = "88E6175 ", .dump = NULL },
808*1b481fc3SMaciej Żenczykowski { .id = 0x1760, .name = "88E6176 ", .dump = dsa_mv88e6352 },
809*1b481fc3SMaciej Żenczykowski { .id = 0x1900, .name = "88E6190 ", .dump = dsa_mv88e6390 },
810*1b481fc3SMaciej Żenczykowski { .id = 0x1910, .name = "88E6191 ", .dump = NULL },
811*1b481fc3SMaciej Żenczykowski { .id = 0x1a70, .name = "88E6185 ", .dump = dsa_mv88e6185 },
812*1b481fc3SMaciej Żenczykowski { .id = 0x2400, .name = "88E6240 ", .dump = dsa_mv88e6352 },
813*1b481fc3SMaciej Żenczykowski { .id = 0x2900, .name = "88E6290 ", .dump = dsa_mv88e6390 },
814*1b481fc3SMaciej Żenczykowski { .id = 0x3100, .name = "88E6321 ", .dump = NULL },
815*1b481fc3SMaciej Żenczykowski { .id = 0x3400, .name = "88E6141 ", .dump = NULL },
816*1b481fc3SMaciej Żenczykowski { .id = 0x3410, .name = "88E6341 ", .dump = NULL },
817*1b481fc3SMaciej Żenczykowski { .id = 0x3520, .name = "88E6352 ", .dump = dsa_mv88e6352 },
818*1b481fc3SMaciej Żenczykowski { .id = 0x3710, .name = "88E6350 ", .dump = NULL },
819*1b481fc3SMaciej Żenczykowski { .id = 0x3750, .name = "88E6351 ", .dump = NULL },
820*1b481fc3SMaciej Żenczykowski { .id = 0x3900, .name = "88E6390 ", .dump = dsa_mv88e6390 },
821*1b481fc3SMaciej Żenczykowski };
822*1b481fc3SMaciej Żenczykowski
dsa_mv88e6xxx_dump_regs(struct ethtool_regs * regs)823*1b481fc3SMaciej Żenczykowski static int dsa_mv88e6xxx_dump_regs(struct ethtool_regs *regs)
824*1b481fc3SMaciej Żenczykowski {
825*1b481fc3SMaciej Żenczykowski const struct dsa_mv88e6xxx_switch *sw = NULL;
826*1b481fc3SMaciej Żenczykowski const u16 *data = (u16 *)regs->data;
827*1b481fc3SMaciej Żenczykowski unsigned int i;
828*1b481fc3SMaciej Żenczykowski u16 id;
829*1b481fc3SMaciej Żenczykowski
830*1b481fc3SMaciej Żenczykowski /* Marvell chips have 32 per-port 16-bit registers */
831*1b481fc3SMaciej Żenczykowski if (regs->len < 32 * sizeof(u16))
832*1b481fc3SMaciej Żenczykowski return 1;
833*1b481fc3SMaciej Żenczykowski
834*1b481fc3SMaciej Żenczykowski id = regs->version & 0xfff0;
835*1b481fc3SMaciej Żenczykowski
836*1b481fc3SMaciej Żenczykowski for (i = 0; i < ARRAY_SIZE(dsa_mv88e6xxx_switches); i++) {
837*1b481fc3SMaciej Żenczykowski if (id == dsa_mv88e6xxx_switches[i].id) {
838*1b481fc3SMaciej Żenczykowski sw = &dsa_mv88e6xxx_switches[i];
839*1b481fc3SMaciej Żenczykowski break;
840*1b481fc3SMaciej Żenczykowski }
841*1b481fc3SMaciej Żenczykowski }
842*1b481fc3SMaciej Żenczykowski
843*1b481fc3SMaciej Żenczykowski if (!sw)
844*1b481fc3SMaciej Żenczykowski return 1;
845*1b481fc3SMaciej Żenczykowski
846*1b481fc3SMaciej Żenczykowski printf("%s Switch Port Registers\n", sw->name);
847*1b481fc3SMaciej Żenczykowski printf("------------------------------\n");
848*1b481fc3SMaciej Żenczykowski
849*1b481fc3SMaciej Żenczykowski for (i = 0; i < 32; i++)
850*1b481fc3SMaciej Żenczykowski if (sw->dump)
851*1b481fc3SMaciej Żenczykowski sw->dump(i, data[i]);
852*1b481fc3SMaciej Żenczykowski else
853*1b481fc3SMaciej Żenczykowski REG(i, "", data[i]);
854*1b481fc3SMaciej Żenczykowski
855*1b481fc3SMaciej Żenczykowski /* Dump the SERDES registers, if provided */
856*1b481fc3SMaciej Żenczykowski if (regs->len > SERDES_OFFSET * sizeof(u16)) {
857*1b481fc3SMaciej Żenczykowski printf("\n%s Switch Port SERDES Registers\n", sw->name);
858*1b481fc3SMaciej Żenczykowski printf("-------------------------------------\n");
859*1b481fc3SMaciej Żenczykowski for (i = SERDES_OFFSET; i < regs->len / 2; i++)
860*1b481fc3SMaciej Żenczykowski if (sw->dump)
861*1b481fc3SMaciej Żenczykowski sw->dump(i, data[i]);
862*1b481fc3SMaciej Żenczykowski else
863*1b481fc3SMaciej Żenczykowski REG(i - SERDES_OFFSET, "", data[i]);
864*1b481fc3SMaciej Żenczykowski }
865*1b481fc3SMaciej Żenczykowski
866*1b481fc3SMaciej Żenczykowski return 0;
867*1b481fc3SMaciej Żenczykowski }
868*1b481fc3SMaciej Żenczykowski
869*1b481fc3SMaciej Żenczykowski #undef FIELD_BITMAP
870*1b481fc3SMaciej Żenczykowski #undef FIELD
871*1b481fc3SMaciej Żenczykowski #undef REG
872*1b481fc3SMaciej Żenczykowski
dsa_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)873*1b481fc3SMaciej Żenczykowski int dsa_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
874*1b481fc3SMaciej Żenczykowski struct ethtool_regs *regs)
875*1b481fc3SMaciej Żenczykowski {
876*1b481fc3SMaciej Żenczykowski /* DSA per-driver register dump */
877*1b481fc3SMaciej Żenczykowski if (!dsa_mv88e6xxx_dump_regs(regs))
878*1b481fc3SMaciej Żenczykowski return 0;
879*1b481fc3SMaciej Żenczykowski
880*1b481fc3SMaciej Żenczykowski /* Fallback to hexdump */
881*1b481fc3SMaciej Żenczykowski return 1;
882*1b481fc3SMaciej Żenczykowski }
883