xref: /aosp_15_r20/external/ethtool/realtek.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /* Copyright 2001 Sun Microsystems ([email protected]) */
2*1b481fc3SMaciej Żenczykowski #include <stdio.h>
3*1b481fc3SMaciej Żenczykowski #include <stdlib.h>
4*1b481fc3SMaciej Żenczykowski #include "internal.h"
5*1b481fc3SMaciej Żenczykowski 
6*1b481fc3SMaciej Żenczykowski #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
7*1b481fc3SMaciej Żenczykowski 
8*1b481fc3SMaciej Żenczykowski enum chip_type {
9*1b481fc3SMaciej Żenczykowski 	RTL8139 = 1,
10*1b481fc3SMaciej Żenczykowski 	RTL8139_K,
11*1b481fc3SMaciej Żenczykowski 	RTL8139A,
12*1b481fc3SMaciej Żenczykowski 	RTL8139A_G,
13*1b481fc3SMaciej Żenczykowski 	RTL8139B,
14*1b481fc3SMaciej Żenczykowski 	RTL8130,
15*1b481fc3SMaciej Żenczykowski 	RTL8139C,
16*1b481fc3SMaciej Żenczykowski 	RTL8100,
17*1b481fc3SMaciej Żenczykowski 	RTL8100B_8139D,
18*1b481fc3SMaciej Żenczykowski 	RTL8139Cp,
19*1b481fc3SMaciej Żenczykowski 	RTL8101,
20*1b481fc3SMaciej Żenczykowski 
21*1b481fc3SMaciej Żenczykowski 	/* chips not handled by 8139too/8139cp module */
22*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_01,
23*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_02,
24*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_03,
25*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_04,
26*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_05,
27*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_06,
28*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_07,
29*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_08,
30*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_09,
31*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_10,
32*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_11,
33*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_12,
34*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_13,
35*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_14,
36*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_15,
37*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_16,
38*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_17,
39*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_18,
40*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_19,
41*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_20,
42*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_21,
43*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_22,
44*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_23,
45*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_24,
46*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_25,
47*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_26,
48*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_27,
49*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_28,
50*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_29,
51*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_30,
52*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_31,
53*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_32,
54*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_33,
55*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_34,
56*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_35,
57*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_36,
58*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_37,
59*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_38,
60*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_39,
61*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_40,
62*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_41,
63*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_42,
64*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_43,
65*1b481fc3SMaciej Żenczykowski 	RTL_GIGA_MAC_VER_44,
66*1b481fc3SMaciej Żenczykowski };
67*1b481fc3SMaciej Żenczykowski 
68*1b481fc3SMaciej Żenczykowski static const char * const chip_names[] = {
69*1b481fc3SMaciej Żenczykowski 	[RTL8139] =		"8139",
70*1b481fc3SMaciej Żenczykowski 	[RTL8139_K] =		"8139-K",
71*1b481fc3SMaciej Żenczykowski 	[RTL8139A] =		"8139A",
72*1b481fc3SMaciej Żenczykowski 	[RTL8139A_G] =		"8139A-G",
73*1b481fc3SMaciej Żenczykowski 	[RTL8139B] =		"8139B",
74*1b481fc3SMaciej Żenczykowski 	[RTL8130] =		"8130",
75*1b481fc3SMaciej Żenczykowski 	[RTL8139C] =		"8139C",
76*1b481fc3SMaciej Żenczykowski 	[RTL8100] =		"8100",
77*1b481fc3SMaciej Żenczykowski 	[RTL8100B_8139D] =	"8100B/8139D",
78*1b481fc3SMaciej Żenczykowski 	[RTL8139Cp] =		"8139C+",
79*1b481fc3SMaciej Żenczykowski 	[RTL8101] =		"8101",
80*1b481fc3SMaciej Żenczykowski 
81*1b481fc3SMaciej Żenczykowski 	/* chips not handled by 8139too/8139cp module */
82*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_01] = "8169",
83*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_02] = "8169s",
84*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_03] = "8110s",
85*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_04] = "8169sb/8110sb",
86*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_05] = "8169sc/8110sc",
87*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_06] = "8169sc/8110sc",
88*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_07] = "8102e",
89*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_08] = "8102e",
90*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_09] = "8102e",
91*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_10] = "8101e",
92*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_11] = "8168b/8111b",
93*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_12] = "8168b/8111b",
94*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_13] = "8101e",
95*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_14] = "8100e",
96*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_15] = "8100e",
97*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_16] = "8101e",
98*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_17] = "8168b/8111b",
99*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_18] = "8168cp/8111cp",
100*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_19] = "8168c/8111c",
101*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_20] = "8168c/8111c",
102*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_21] = "8168c/8111c",
103*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_22] = "8168c/8111c",
104*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_23] = "8168cp/8111cp",
105*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_24] = "8168cp/8111cp",
106*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_25] = "8168d/8111d",
107*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_26] = "8168d/8111d",
108*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_27] = "8168dp/8111dp",
109*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_28] = "8168dp/8111dp",
110*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_29] = "8105e",
111*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_30] = "8105e",
112*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_31] = "8168dp/8111dp",
113*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_32] = "8168e/8111e",
114*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_33] = "8168e/8111e",
115*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_34] = "8168evl/8111evl",
116*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_35] = "8168f/8111f",
117*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_36] = "8168f/8111f",
118*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_37] = "8402",
119*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_38] = "8411",
120*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_39] = "8106e",
121*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_40] = "8168g/8111g",
122*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_41] = "8168g/8111g",
123*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_42] = "8168g/8111g",
124*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_43] = "8106e",
125*1b481fc3SMaciej Żenczykowski 	[RTL_GIGA_MAC_VER_44] = "8411",
126*1b481fc3SMaciej Żenczykowski };
127*1b481fc3SMaciej Żenczykowski 
128*1b481fc3SMaciej Żenczykowski static struct chip_info {
129*1b481fc3SMaciej Żenczykowski 	u32 id_mask;
130*1b481fc3SMaciej Żenczykowski 	u32 id_val;
131*1b481fc3SMaciej Żenczykowski 	int mac_version;
132*1b481fc3SMaciej Żenczykowski } rtl_info_tbl[] = {
133*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x40000000,	RTL8139 },
134*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x60000000,	RTL8139_K },
135*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x70000000,	RTL8139A },
136*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x70800000,	RTL8139A_G },
137*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x78000000,	RTL8139B },
138*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x7c000000,	RTL8130 },
139*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x74000000,	RTL8139C },
140*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x78800000,	RTL8100 },
141*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x74400000,	RTL8100B_8139D },
142*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x74800000,	RTL8139Cp },
143*1b481fc3SMaciej Żenczykowski 	{ 0xfcc00000, 0x74c00000,	RTL8101 },
144*1b481fc3SMaciej Żenczykowski 
145*1b481fc3SMaciej Żenczykowski 	/* chips not handled by 8139too/8139cp module */
146*1b481fc3SMaciej Żenczykowski 	/* 8168G family. */
147*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x5c800000,	RTL_GIGA_MAC_VER_44 },
148*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x50900000,	RTL_GIGA_MAC_VER_42 },
149*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x4c100000,	RTL_GIGA_MAC_VER_41 },
150*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x4c000000,	RTL_GIGA_MAC_VER_40 },
151*1b481fc3SMaciej Żenczykowski 
152*1b481fc3SMaciej Żenczykowski 	/* 8168F family. */
153*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x48800000,	RTL_GIGA_MAC_VER_38 },
154*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x48100000,	RTL_GIGA_MAC_VER_36 },
155*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x48000000,	RTL_GIGA_MAC_VER_35 },
156*1b481fc3SMaciej Żenczykowski 
157*1b481fc3SMaciej Żenczykowski 	/* 8168E family. */
158*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x2c800000,	RTL_GIGA_MAC_VER_34 },
159*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x2c200000,	RTL_GIGA_MAC_VER_33 },
160*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x2c100000,	RTL_GIGA_MAC_VER_32 },
161*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x2c000000,	RTL_GIGA_MAC_VER_33 },
162*1b481fc3SMaciej Żenczykowski 
163*1b481fc3SMaciej Żenczykowski 	/* 8168D family. */
164*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
165*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
166*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
167*1b481fc3SMaciej Żenczykowski 
168*1b481fc3SMaciej Żenczykowski 	/* 8168DP family. */
169*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
170*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x28a00000,	RTL_GIGA_MAC_VER_28 },
171*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x28b00000,	RTL_GIGA_MAC_VER_31 },
172*1b481fc3SMaciej Żenczykowski 
173*1b481fc3SMaciej Żenczykowski 	/* 8168C family. */
174*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
175*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
176*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
177*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
178*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
179*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
180*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
181*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
182*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
183*1b481fc3SMaciej Żenczykowski 
184*1b481fc3SMaciej Żenczykowski 	/* 8168B family. */
185*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
186*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
187*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
188*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
189*1b481fc3SMaciej Żenczykowski 
190*1b481fc3SMaciej Żenczykowski 	/* 8101 family. */
191*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x44900000,	RTL_GIGA_MAC_VER_39 },
192*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x44800000,	RTL_GIGA_MAC_VER_39 },
193*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x44000000,	RTL_GIGA_MAC_VER_37 },
194*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x40b00000,	RTL_GIGA_MAC_VER_30 },
195*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
196*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
197*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
198*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
199*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
200*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
201*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
202*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
203*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
204*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
205*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
206*1b481fc3SMaciej Żenczykowski 	{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
207*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
208*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
209*1b481fc3SMaciej Żenczykowski 	{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
210*1b481fc3SMaciej Żenczykowski 	/* FIXME: where did these entries come from ? -- FR */
211*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
212*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
213*1b481fc3SMaciej Żenczykowski 
214*1b481fc3SMaciej Żenczykowski 	/* 8110 family. */
215*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
216*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
217*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
218*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
219*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
220*1b481fc3SMaciej Żenczykowski 	{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
221*1b481fc3SMaciej Żenczykowski 
222*1b481fc3SMaciej Żenczykowski 	{ }
223*1b481fc3SMaciej Żenczykowski };
224*1b481fc3SMaciej Żenczykowski 
225*1b481fc3SMaciej Żenczykowski static void
print_intr_bits(u16 mask)226*1b481fc3SMaciej Żenczykowski print_intr_bits(u16 mask)
227*1b481fc3SMaciej Żenczykowski {
228*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
229*1b481fc3SMaciej Żenczykowski 		"      %s%s%s%s%s%s%s%s%s%s%s\n",
230*1b481fc3SMaciej Żenczykowski 		mask & (1 << 15)	? "SERR " : "",
231*1b481fc3SMaciej Żenczykowski 		mask & (1 << 14)	? "TimeOut " : "",
232*1b481fc3SMaciej Żenczykowski 		mask & (1 << 8)		? "SWInt " : "",
233*1b481fc3SMaciej Żenczykowski 		mask & (1 << 7)		? "TxNoBuf " : "",
234*1b481fc3SMaciej Żenczykowski 		mask & (1 << 6)		? "RxFIFO " : "",
235*1b481fc3SMaciej Żenczykowski 		mask & (1 << 5)		? "LinkChg " : "",
236*1b481fc3SMaciej Żenczykowski 		mask & (1 << 4)		? "RxNoBuf " : "",
237*1b481fc3SMaciej Żenczykowski 		mask & (1 << 3)		? "TxErr " : "",
238*1b481fc3SMaciej Żenczykowski 		mask & (1 << 2)		? "TxOK " : "",
239*1b481fc3SMaciej Żenczykowski 		mask & (1 << 1)		? "RxErr " : "",
240*1b481fc3SMaciej Żenczykowski 		mask & (1 << 0)		? "RxOK " : "");
241*1b481fc3SMaciej Żenczykowski }
242*1b481fc3SMaciej Żenczykowski 
243*1b481fc3SMaciej Żenczykowski int
realtek_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)244*1b481fc3SMaciej Żenczykowski realtek_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
245*1b481fc3SMaciej Żenczykowski 		  struct ethtool_regs *regs)
246*1b481fc3SMaciej Żenczykowski {
247*1b481fc3SMaciej Żenczykowski 	u32 *data = (u32 *) regs->data;
248*1b481fc3SMaciej Żenczykowski 	u8 *data8 = (u8 *) regs->data;
249*1b481fc3SMaciej Żenczykowski 	u32 v;
250*1b481fc3SMaciej Żenczykowski 	struct chip_info *ci;
251*1b481fc3SMaciej Żenczykowski 	unsigned int board_type;
252*1b481fc3SMaciej Żenczykowski 
253*1b481fc3SMaciej Żenczykowski 	v = data[0x40 >> 2]; /* TxConfig */
254*1b481fc3SMaciej Żenczykowski 
255*1b481fc3SMaciej Żenczykowski 	ci = &rtl_info_tbl[0];
256*1b481fc3SMaciej Żenczykowski 	while (ci->mac_version) {
257*1b481fc3SMaciej Żenczykowski 		if ((v & ci->id_mask) == ci->id_val)
258*1b481fc3SMaciej Żenczykowski 			break;
259*1b481fc3SMaciej Żenczykowski 		ci++;
260*1b481fc3SMaciej Żenczykowski 	}
261*1b481fc3SMaciej Żenczykowski 	board_type = ci->mac_version;
262*1b481fc3SMaciej Żenczykowski 	if (!board_type) {
263*1b481fc3SMaciej Żenczykowski 		fprintf(stderr, "Unknown RealTek chip (TxConfig: 0x%08x)\n", v);
264*1b481fc3SMaciej Żenczykowski 		return 91;
265*1b481fc3SMaciej Żenczykowski 	}
266*1b481fc3SMaciej Żenczykowski 
267*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
268*1b481fc3SMaciej Żenczykowski 		"RealTek RTL%s registers:\n"
269*1b481fc3SMaciej Żenczykowski 		"--------------------------------------------------------\n",
270*1b481fc3SMaciej Żenczykowski 		chip_names[board_type]);
271*1b481fc3SMaciej Żenczykowski 
272*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
273*1b481fc3SMaciej Żenczykowski 		"0x00: MAC Address                      %02x:%02x:%02x:%02x:%02x:%02x\n",
274*1b481fc3SMaciej Żenczykowski 		data8[0x00],
275*1b481fc3SMaciej Żenczykowski 		data8[0x01],
276*1b481fc3SMaciej Żenczykowski 		data8[0x02],
277*1b481fc3SMaciej Żenczykowski 		data8[0x03],
278*1b481fc3SMaciej Żenczykowski 		data8[0x04],
279*1b481fc3SMaciej Żenczykowski 		data8[0x05]);
280*1b481fc3SMaciej Żenczykowski 
281*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
282*1b481fc3SMaciej Żenczykowski 		"0x08: Multicast Address Filter     0x%08x 0x%08x\n",
283*1b481fc3SMaciej Żenczykowski 		data[0x08 >> 2],
284*1b481fc3SMaciej Żenczykowski 		data[0x0c >> 2]);
285*1b481fc3SMaciej Żenczykowski 
286*1b481fc3SMaciej Żenczykowski 	if (board_type == RTL8139Cp || board_type >= RTL_GIGA_MAC_VER_01) {
287*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
288*1b481fc3SMaciej Żenczykowski 		"0x10: Dump Tally Counter Command   0x%08x 0x%08x\n",
289*1b481fc3SMaciej Żenczykowski 		data[0x10 >> 2],
290*1b481fc3SMaciej Żenczykowski 		data[0x14 >> 2]);
291*1b481fc3SMaciej Żenczykowski 
292*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
293*1b481fc3SMaciej Żenczykowski 		"0x20: Tx Normal Priority Ring Addr 0x%08x 0x%08x\n",
294*1b481fc3SMaciej Żenczykowski 		data[0x20 >> 2],
295*1b481fc3SMaciej Żenczykowski 		data[0x24 >> 2]);
296*1b481fc3SMaciej Żenczykowski 
297*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
298*1b481fc3SMaciej Żenczykowski 		"0x28: Tx High Priority Ring Addr   0x%08x 0x%08x\n",
299*1b481fc3SMaciej Żenczykowski 		data[0x28 >> 2],
300*1b481fc3SMaciej Żenczykowski 		data[0x2C >> 2]);
301*1b481fc3SMaciej Żenczykowski 	} else {
302*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
303*1b481fc3SMaciej Żenczykowski 		"0x10: Transmit Status Desc 0                  0x%08x\n"
304*1b481fc3SMaciej Żenczykowski 		"0x14: Transmit Status Desc 1                  0x%08x\n"
305*1b481fc3SMaciej Żenczykowski 		"0x18: Transmit Status Desc 2                  0x%08x\n"
306*1b481fc3SMaciej Żenczykowski 		"0x1C: Transmit Status Desc 3                  0x%08x\n",
307*1b481fc3SMaciej Żenczykowski 		data[0x10 >> 2],
308*1b481fc3SMaciej Żenczykowski 		data[0x14 >> 2],
309*1b481fc3SMaciej Żenczykowski 		data[0x18 >> 2],
310*1b481fc3SMaciej Żenczykowski 		data[0x1C >> 2]);
311*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
312*1b481fc3SMaciej Żenczykowski 		"0x20: Transmit Start Addr  0                  0x%08x\n"
313*1b481fc3SMaciej Żenczykowski 		"0x24: Transmit Start Addr  1                  0x%08x\n"
314*1b481fc3SMaciej Żenczykowski 		"0x28: Transmit Start Addr  2                  0x%08x\n"
315*1b481fc3SMaciej Żenczykowski 		"0x2C: Transmit Start Addr  3                  0x%08x\n",
316*1b481fc3SMaciej Żenczykowski 		data[0x20 >> 2],
317*1b481fc3SMaciej Żenczykowski 		data[0x24 >> 2],
318*1b481fc3SMaciej Żenczykowski 		data[0x28 >> 2],
319*1b481fc3SMaciej Żenczykowski 		data[0x2C >> 2]);
320*1b481fc3SMaciej Żenczykowski 	}
321*1b481fc3SMaciej Żenczykowski 
322*1b481fc3SMaciej Żenczykowski 	if (board_type < RTL_GIGA_MAC_VER_11 ||
323*1b481fc3SMaciej Żenczykowski 		board_type > RTL_GIGA_MAC_VER_17) {
324*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL_GIGA_MAC_VER_01) {
325*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
326*1b481fc3SMaciej Żenczykowski 		"0x30: Flash memory read/write                 0x%08x\n",
327*1b481fc3SMaciej Żenczykowski 		data[0x30 >> 2]);
328*1b481fc3SMaciej Żenczykowski 	} else {
329*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
330*1b481fc3SMaciej Żenczykowski 		"0x30: Rx buffer addr (C mode)                 0x%08x\n",
331*1b481fc3SMaciej Żenczykowski 		data[0x30 >> 2]);
332*1b481fc3SMaciej Żenczykowski 	}
333*1b481fc3SMaciej Żenczykowski 	}
334*1b481fc3SMaciej Żenczykowski 
335*1b481fc3SMaciej Żenczykowski 	v = data8[0x36];
336*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
337*1b481fc3SMaciej Żenczykowski 		"0x34: Early Rx Byte Count                       %8u\n"
338*1b481fc3SMaciej Żenczykowski 		"0x36: Early Rx Status                               0x%02x\n",
339*1b481fc3SMaciej Żenczykowski 		data[0x34 >> 2] & 0xffff,
340*1b481fc3SMaciej Żenczykowski 		v);
341*1b481fc3SMaciej Żenczykowski 
342*1b481fc3SMaciej Żenczykowski 	if (v & 0xf) {
343*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
344*1b481fc3SMaciej Żenczykowski 		"      %s%s%s%s\n",
345*1b481fc3SMaciej Żenczykowski 		v & (1 << 3) ? "ERxGood " : "",
346*1b481fc3SMaciej Żenczykowski 		v & (1 << 2) ? "ERxBad " : "",
347*1b481fc3SMaciej Żenczykowski 		v & (1 << 1) ? "ERxOverWrite " : "",
348*1b481fc3SMaciej Żenczykowski 		v & (1 << 0) ? "ERxOK " : "");
349*1b481fc3SMaciej Żenczykowski 	}
350*1b481fc3SMaciej Żenczykowski 
351*1b481fc3SMaciej Żenczykowski 	v = data8[0x37];
352*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
353*1b481fc3SMaciej Żenczykowski 		"0x37: Command                                       0x%02x\n"
354*1b481fc3SMaciej Żenczykowski 		"      Rx %s, Tx %s%s\n",
355*1b481fc3SMaciej Żenczykowski 		data8[0x37],
356*1b481fc3SMaciej Żenczykowski 		v & (1 << 3) ? "on" : "off",
357*1b481fc3SMaciej Żenczykowski 		v & (1 << 2) ? "on" : "off",
358*1b481fc3SMaciej Żenczykowski 		v & (1 << 4) ? ", RESET" : "");
359*1b481fc3SMaciej Żenczykowski 
360*1b481fc3SMaciej Żenczykowski 	if (board_type < RTL_GIGA_MAC_VER_01) {
361*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
362*1b481fc3SMaciej Żenczykowski 		"0x38: Current Address of Packet Read (C mode)     0x%04x\n"
363*1b481fc3SMaciej Żenczykowski 		"0x3A: Current Rx buffer address (C mode)          0x%04x\n",
364*1b481fc3SMaciej Żenczykowski 		data[0x38 >> 2] & 0xffff,
365*1b481fc3SMaciej Żenczykowski 		data[0x38 >> 2] >> 16);
366*1b481fc3SMaciej Żenczykowski 	}
367*1b481fc3SMaciej Żenczykowski 
368*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
369*1b481fc3SMaciej Żenczykowski 		"0x3C: Interrupt Mask                              0x%04x\n",
370*1b481fc3SMaciej Żenczykowski 		data[0x3c >> 2] & 0xffff);
371*1b481fc3SMaciej Żenczykowski 	print_intr_bits(data[0x3c >> 2] & 0xffff);
372*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
373*1b481fc3SMaciej Żenczykowski 		"0x3E: Interrupt Status                            0x%04x\n",
374*1b481fc3SMaciej Żenczykowski 		data[0x3c >> 2] >> 16);
375*1b481fc3SMaciej Żenczykowski 	print_intr_bits(data[0x3c >> 2] >> 16);
376*1b481fc3SMaciej Żenczykowski 
377*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
378*1b481fc3SMaciej Żenczykowski 		"0x40: Tx Configuration                        0x%08x\n"
379*1b481fc3SMaciej Żenczykowski 		"0x44: Rx Configuration                        0x%08x\n"
380*1b481fc3SMaciej Żenczykowski 		"0x48: Timer count                             0x%08x\n"
381*1b481fc3SMaciej Żenczykowski 		"0x4C: Missed packet counter                     0x%06x\n",
382*1b481fc3SMaciej Żenczykowski 		data[0x40 >> 2],
383*1b481fc3SMaciej Żenczykowski 		data[0x44 >> 2],
384*1b481fc3SMaciej Żenczykowski 		data[0x48 >> 2],
385*1b481fc3SMaciej Żenczykowski 		data[0x4C >> 2] & 0xffffff);
386*1b481fc3SMaciej Żenczykowski 
387*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
388*1b481fc3SMaciej Żenczykowski 		"0x50: EEPROM Command                                0x%02x\n"
389*1b481fc3SMaciej Żenczykowski 		"0x51: Config 0                                      0x%02x\n"
390*1b481fc3SMaciej Żenczykowski 		"0x52: Config 1                                      0x%02x\n",
391*1b481fc3SMaciej Żenczykowski 		data8[0x50],
392*1b481fc3SMaciej Żenczykowski 		data8[0x51],
393*1b481fc3SMaciej Żenczykowski 		data8[0x52]);
394*1b481fc3SMaciej Żenczykowski 
395*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL_GIGA_MAC_VER_01) {
396*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
397*1b481fc3SMaciej Żenczykowski 		"0x53: Config 2                                      0x%02x\n"
398*1b481fc3SMaciej Żenczykowski 		"0x54: Config 3                                      0x%02x\n"
399*1b481fc3SMaciej Żenczykowski 		"0x55: Config 4                                      0x%02x\n"
400*1b481fc3SMaciej Żenczykowski 		"0x56: Config 5                                      0x%02x\n",
401*1b481fc3SMaciej Żenczykowski 		data8[0x53],
402*1b481fc3SMaciej Żenczykowski 		data8[0x54],
403*1b481fc3SMaciej Żenczykowski 		data8[0x55],
404*1b481fc3SMaciej Żenczykowski 		data8[0x56]);
405*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
406*1b481fc3SMaciej Żenczykowski 		"0x58: Timer interrupt                         0x%08x\n",
407*1b481fc3SMaciej Żenczykowski 		data[0x58 >> 2]);
408*1b481fc3SMaciej Żenczykowski 	}
409*1b481fc3SMaciej Żenczykowski 	else {
410*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139A) {
411*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
412*1b481fc3SMaciej Żenczykowski 		"0x54: Timer interrupt                         0x%08x\n",
413*1b481fc3SMaciej Żenczykowski 		data[0x54 >> 2]);
414*1b481fc3SMaciej Żenczykowski 	}
415*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
416*1b481fc3SMaciej Żenczykowski 		"0x58: Media status                                  0x%02x\n",
417*1b481fc3SMaciej Żenczykowski 		data8[0x58]);
418*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139A) {
419*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
420*1b481fc3SMaciej Żenczykowski 		"0x59: Config 3                                      0x%02x\n",
421*1b481fc3SMaciej Żenczykowski 		data8[0x59]);
422*1b481fc3SMaciej Żenczykowski 	}
423*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139B) {
424*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
425*1b481fc3SMaciej Żenczykowski 		"0x5A: Config 4                                      0x%02x\n",
426*1b481fc3SMaciej Żenczykowski 		data8[0x5A]);
427*1b481fc3SMaciej Żenczykowski 	}
428*1b481fc3SMaciej Żenczykowski 	}
429*1b481fc3SMaciej Żenczykowski 
430*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
431*1b481fc3SMaciej Żenczykowski 		"0x5C: Multiple Interrupt Select                   0x%04x\n",
432*1b481fc3SMaciej Żenczykowski 		data[0x5c >> 2] & 0xffff);
433*1b481fc3SMaciej Żenczykowski 
434*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL_GIGA_MAC_VER_01) {
435*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
436*1b481fc3SMaciej Żenczykowski 		"0x60: PHY access                              0x%08x\n",
437*1b481fc3SMaciej Żenczykowski 		data[0x60 >> 2]);
438*1b481fc3SMaciej Żenczykowski 
439*1b481fc3SMaciej Żenczykowski 	if (board_type < RTL_GIGA_MAC_VER_11 ||
440*1b481fc3SMaciej Żenczykowski 		board_type > RTL_GIGA_MAC_VER_17) {
441*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
442*1b481fc3SMaciej Żenczykowski 		"0x64: TBI control and status                  0x%08x\n",
443*1b481fc3SMaciej Żenczykowski 		data[0x64 >> 2]);
444*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
445*1b481fc3SMaciej Żenczykowski 		"0x68: TBI Autonegotiation advertisement (ANAR)    0x%04x\n"
446*1b481fc3SMaciej Żenczykowski 		"0x6A: TBI Link partner ability (LPAR)             0x%04x\n",
447*1b481fc3SMaciej Żenczykowski 		data[0x68 >> 2] & 0xffff,
448*1b481fc3SMaciej Żenczykowski 		data[0x68 >> 2] >> 16);
449*1b481fc3SMaciej Żenczykowski 	}
450*1b481fc3SMaciej Żenczykowski 
451*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
452*1b481fc3SMaciej Żenczykowski 		"0x6C: PHY status                                    0x%02x\n",
453*1b481fc3SMaciej Żenczykowski 		data8[0x6C]);
454*1b481fc3SMaciej Żenczykowski 
455*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
456*1b481fc3SMaciej Żenczykowski 		"0x84: PM wakeup frame 0            0x%08x 0x%08x\n"
457*1b481fc3SMaciej Żenczykowski 		"0x8C: PM wakeup frame 1            0x%08x 0x%08x\n",
458*1b481fc3SMaciej Żenczykowski 		data[0x84 >> 2],
459*1b481fc3SMaciej Żenczykowski 		data[0x88 >> 2],
460*1b481fc3SMaciej Żenczykowski 		data[0x8C >> 2],
461*1b481fc3SMaciej Żenczykowski 		data[0x90 >> 2]);
462*1b481fc3SMaciej Żenczykowski 
463*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
464*1b481fc3SMaciej Żenczykowski 		"0x94: PM wakeup frame 2 (low)      0x%08x 0x%08x\n"
465*1b481fc3SMaciej Żenczykowski 		"0x9C: PM wakeup frame 2 (high)     0x%08x 0x%08x\n",
466*1b481fc3SMaciej Żenczykowski 		data[0x94 >> 2],
467*1b481fc3SMaciej Żenczykowski 		data[0x98 >> 2],
468*1b481fc3SMaciej Żenczykowski 		data[0x9C >> 2],
469*1b481fc3SMaciej Żenczykowski 		data[0xA0 >> 2]);
470*1b481fc3SMaciej Żenczykowski 
471*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
472*1b481fc3SMaciej Żenczykowski 		"0xA4: PM wakeup frame 3 (low)      0x%08x 0x%08x\n"
473*1b481fc3SMaciej Żenczykowski 		"0xAC: PM wakeup frame 3 (high)     0x%08x 0x%08x\n",
474*1b481fc3SMaciej Żenczykowski 		data[0xA4 >> 2],
475*1b481fc3SMaciej Żenczykowski 		data[0xA8 >> 2],
476*1b481fc3SMaciej Żenczykowski 		data[0xAC >> 2],
477*1b481fc3SMaciej Żenczykowski 		data[0xB0 >> 2]);
478*1b481fc3SMaciej Żenczykowski 
479*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
480*1b481fc3SMaciej Żenczykowski 		"0xB4: PM wakeup frame 4 (low)      0x%08x 0x%08x\n"
481*1b481fc3SMaciej Żenczykowski 		"0xBC: PM wakeup frame 4 (high)     0x%08x 0x%08x\n",
482*1b481fc3SMaciej Żenczykowski 		data[0xB4 >> 2],
483*1b481fc3SMaciej Żenczykowski 		data[0xB8 >> 2],
484*1b481fc3SMaciej Żenczykowski 		data[0xBC >> 2],
485*1b481fc3SMaciej Żenczykowski 		data[0xC0 >> 2]);
486*1b481fc3SMaciej Żenczykowski 
487*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
488*1b481fc3SMaciej Żenczykowski 		"0xC4: Wakeup frame 0 CRC                          0x%04x\n"
489*1b481fc3SMaciej Żenczykowski 		"0xC6: Wakeup frame 1 CRC                          0x%04x\n"
490*1b481fc3SMaciej Żenczykowski 		"0xC8: Wakeup frame 2 CRC                          0x%04x\n"
491*1b481fc3SMaciej Żenczykowski 		"0xCA: Wakeup frame 3 CRC                          0x%04x\n"
492*1b481fc3SMaciej Żenczykowski 		"0xCC: Wakeup frame 4 CRC                          0x%04x\n",
493*1b481fc3SMaciej Żenczykowski 		data[0xC4 >> 2] & 0xffff,
494*1b481fc3SMaciej Żenczykowski 		data[0xC4 >> 2] >> 16,
495*1b481fc3SMaciej Żenczykowski 		data[0xC8 >> 2] & 0xffff,
496*1b481fc3SMaciej Żenczykowski 		data[0xC8 >> 2] >> 16,
497*1b481fc3SMaciej Żenczykowski 		data[0xCC >> 2] & 0xffff);
498*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
499*1b481fc3SMaciej Żenczykowski 		"0xDA: RX packet maximum size                      0x%04x\n",
500*1b481fc3SMaciej Żenczykowski 		data[0xD8 >> 2] >> 16);
501*1b481fc3SMaciej Żenczykowski 	}
502*1b481fc3SMaciej Żenczykowski 	else {
503*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
504*1b481fc3SMaciej Żenczykowski 		"0x5E: PCI revision id                               0x%02x\n",
505*1b481fc3SMaciej Żenczykowski 		data8[0x5e]);
506*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
507*1b481fc3SMaciej Żenczykowski 		"0x60: Transmit Status of All Desc (C mode)        0x%04x\n"
508*1b481fc3SMaciej Żenczykowski 		"0x62: MII Basic Mode Control Register             0x%04x\n",
509*1b481fc3SMaciej Żenczykowski 		data[0x60 >> 2] & 0xffff,
510*1b481fc3SMaciej Żenczykowski 		data[0x60 >> 2] >> 16);
511*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
512*1b481fc3SMaciej Żenczykowski 		"0x64: MII Basic Mode Status Register              0x%04x\n"
513*1b481fc3SMaciej Żenczykowski 		"0x66: MII Autonegotiation Advertising             0x%04x\n",
514*1b481fc3SMaciej Żenczykowski 		data[0x64 >> 2] & 0xffff,
515*1b481fc3SMaciej Żenczykowski 		data[0x64 >> 2] >> 16);
516*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
517*1b481fc3SMaciej Żenczykowski 		"0x68: MII Link Partner Ability                    0x%04x\n"
518*1b481fc3SMaciej Żenczykowski 		"0x6A: MII Expansion                               0x%04x\n",
519*1b481fc3SMaciej Żenczykowski 		data[0x68 >> 2] & 0xffff,
520*1b481fc3SMaciej Żenczykowski 		data[0x68 >> 2] >> 16);
521*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
522*1b481fc3SMaciej Żenczykowski 		"0x6C: MII Disconnect counter                      0x%04x\n"
523*1b481fc3SMaciej Żenczykowski 		"0x6E: MII False carrier sense counter             0x%04x\n",
524*1b481fc3SMaciej Żenczykowski 		data[0x6C >> 2] & 0xffff,
525*1b481fc3SMaciej Żenczykowski 		data[0x6C >> 2] >> 16);
526*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
527*1b481fc3SMaciej Żenczykowski 		"0x70: MII Nway test                               0x%04x\n"
528*1b481fc3SMaciej Żenczykowski 		"0x72: MII RX_ER counter                           0x%04x\n",
529*1b481fc3SMaciej Żenczykowski 		data[0x70 >> 2] & 0xffff,
530*1b481fc3SMaciej Żenczykowski 		data[0x70 >> 2] >> 16);
531*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
532*1b481fc3SMaciej Żenczykowski 		"0x74: MII CS configuration                        0x%04x\n",
533*1b481fc3SMaciej Żenczykowski 		data[0x74 >> 2] & 0xffff);
534*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139_K) {
535*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
536*1b481fc3SMaciej Żenczykowski 		"0x78: PHY parameter 1                         0x%08x\n"
537*1b481fc3SMaciej Żenczykowski 		"0x7C: Twister parameter                       0x%08x\n",
538*1b481fc3SMaciej Żenczykowski 		data[0x78 >> 2],
539*1b481fc3SMaciej Żenczykowski 		data[0x7C >> 2]);
540*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139A) {
541*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
542*1b481fc3SMaciej Żenczykowski 		"0x80: PHY parameter 2                               0x%02x\n",
543*1b481fc3SMaciej Żenczykowski 		data8[0x80]);
544*1b481fc3SMaciej Żenczykowski 	}
545*1b481fc3SMaciej Żenczykowski 	}
546*1b481fc3SMaciej Żenczykowski 	if (board_type == RTL8139Cp) {
547*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
548*1b481fc3SMaciej Żenczykowski 		"0x82: Low addr of a Tx Desc w/ Tx DMA OK          0x%04x\n",
549*1b481fc3SMaciej Żenczykowski 		data[0x80 >> 2] >> 16);
550*1b481fc3SMaciej Żenczykowski 	} else if (board_type == RTL8130) {
551*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
552*1b481fc3SMaciej Żenczykowski 		"0x82: MII register                                  0x%02x\n",
553*1b481fc3SMaciej Żenczykowski 		data8[0x82]);
554*1b481fc3SMaciej Żenczykowski 	}
555*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139A) {
556*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
557*1b481fc3SMaciej Żenczykowski 		"0x84: PM CRC for wakeup frame 0                     0x%02x\n"
558*1b481fc3SMaciej Żenczykowski 		"0x85: PM CRC for wakeup frame 1                     0x%02x\n"
559*1b481fc3SMaciej Żenczykowski 		"0x86: PM CRC for wakeup frame 2                     0x%02x\n"
560*1b481fc3SMaciej Żenczykowski 		"0x87: PM CRC for wakeup frame 3                     0x%02x\n"
561*1b481fc3SMaciej Żenczykowski 		"0x88: PM CRC for wakeup frame 4                     0x%02x\n"
562*1b481fc3SMaciej Żenczykowski 		"0x89: PM CRC for wakeup frame 5                     0x%02x\n"
563*1b481fc3SMaciej Żenczykowski 		"0x8A: PM CRC for wakeup frame 6                     0x%02x\n"
564*1b481fc3SMaciej Żenczykowski 		"0x8B: PM CRC for wakeup frame 7                     0x%02x\n",
565*1b481fc3SMaciej Żenczykowski 		data8[0x84],
566*1b481fc3SMaciej Żenczykowski 		data8[0x85],
567*1b481fc3SMaciej Żenczykowski 		data8[0x86],
568*1b481fc3SMaciej Żenczykowski 		data8[0x87],
569*1b481fc3SMaciej Żenczykowski 		data8[0x88],
570*1b481fc3SMaciej Żenczykowski 		data8[0x89],
571*1b481fc3SMaciej Żenczykowski 		data8[0x8A],
572*1b481fc3SMaciej Żenczykowski 		data8[0x8B]);
573*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
574*1b481fc3SMaciej Żenczykowski 		"0x8C: PM wakeup frame 0            0x%08x 0x%08x\n"
575*1b481fc3SMaciej Żenczykowski 		"0x94: PM wakeup frame 1            0x%08x 0x%08x\n"
576*1b481fc3SMaciej Żenczykowski 		"0x9C: PM wakeup frame 2            0x%08x 0x%08x\n"
577*1b481fc3SMaciej Żenczykowski 		"0xA4: PM wakeup frame 3            0x%08x 0x%08x\n"
578*1b481fc3SMaciej Żenczykowski 		"0xAC: PM wakeup frame 4            0x%08x 0x%08x\n"
579*1b481fc3SMaciej Żenczykowski 		"0xB4: PM wakeup frame 5            0x%08x 0x%08x\n"
580*1b481fc3SMaciej Żenczykowski 		"0xBC: PM wakeup frame 6            0x%08x 0x%08x\n"
581*1b481fc3SMaciej Żenczykowski 		"0xC4: PM wakeup frame 7            0x%08x 0x%08x\n",
582*1b481fc3SMaciej Żenczykowski 		data[0x8C >> 2],
583*1b481fc3SMaciej Żenczykowski 		data[0x90 >> 2],
584*1b481fc3SMaciej Żenczykowski 		data[0x94 >> 2],
585*1b481fc3SMaciej Żenczykowski 		data[0x98 >> 2],
586*1b481fc3SMaciej Żenczykowski 		data[0x9C >> 2],
587*1b481fc3SMaciej Żenczykowski 		data[0xA0 >> 2],
588*1b481fc3SMaciej Żenczykowski 		data[0xA4 >> 2],
589*1b481fc3SMaciej Żenczykowski 		data[0xA8 >> 2],
590*1b481fc3SMaciej Żenczykowski 		data[0xAC >> 2],
591*1b481fc3SMaciej Żenczykowski 		data[0xB0 >> 2],
592*1b481fc3SMaciej Żenczykowski 		data[0xB4 >> 2],
593*1b481fc3SMaciej Żenczykowski 		data[0xB8 >> 2],
594*1b481fc3SMaciej Żenczykowski 		data[0xBC >> 2],
595*1b481fc3SMaciej Żenczykowski 		data[0xC0 >> 2],
596*1b481fc3SMaciej Żenczykowski 		data[0xC4 >> 2],
597*1b481fc3SMaciej Żenczykowski 		data[0xC8 >> 2]);
598*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
599*1b481fc3SMaciej Żenczykowski 		"0xCC: PM LSB CRC for wakeup frame 0                 0x%02x\n"
600*1b481fc3SMaciej Żenczykowski 		"0xCD: PM LSB CRC for wakeup frame 1                 0x%02x\n"
601*1b481fc3SMaciej Żenczykowski 		"0xCE: PM LSB CRC for wakeup frame 2                 0x%02x\n"
602*1b481fc3SMaciej Żenczykowski 		"0xCF: PM LSB CRC for wakeup frame 3                 0x%02x\n"
603*1b481fc3SMaciej Żenczykowski 		"0xD0: PM LSB CRC for wakeup frame 4                 0x%02x\n"
604*1b481fc3SMaciej Żenczykowski 		"0xD1: PM LSB CRC for wakeup frame 5                 0x%02x\n"
605*1b481fc3SMaciej Żenczykowski 		"0xD2: PM LSB CRC for wakeup frame 6                 0x%02x\n"
606*1b481fc3SMaciej Żenczykowski 		"0xD3: PM LSB CRC for wakeup frame 7                 0x%02x\n",
607*1b481fc3SMaciej Żenczykowski 		data8[0xCC],
608*1b481fc3SMaciej Żenczykowski 		data8[0xCD],
609*1b481fc3SMaciej Żenczykowski 		data8[0xCE],
610*1b481fc3SMaciej Żenczykowski 		data8[0xCF],
611*1b481fc3SMaciej Żenczykowski 		data8[0xD0],
612*1b481fc3SMaciej Żenczykowski 		data8[0xD1],
613*1b481fc3SMaciej Żenczykowski 		data8[0xD2],
614*1b481fc3SMaciej Żenczykowski 		data8[0xD3]);
615*1b481fc3SMaciej Żenczykowski 	}
616*1b481fc3SMaciej Żenczykowski 	if (board_type >= RTL8139B) {
617*1b481fc3SMaciej Żenczykowski 	if (board_type != RTL8100 && board_type != RTL8100B_8139D &&
618*1b481fc3SMaciej Żenczykowski 	    board_type != RTL8101)
619*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
620*1b481fc3SMaciej Żenczykowski 		"0xD4: Flash memory read/write                 0x%08x\n",
621*1b481fc3SMaciej Żenczykowski 		data[0xD4 >> 2]);
622*1b481fc3SMaciej Żenczykowski 	if (board_type != RTL8130)
623*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
624*1b481fc3SMaciej Żenczykowski 		"0xD8: Config 5                                      0x%02x\n",
625*1b481fc3SMaciej Żenczykowski 		data8[0xD8]);
626*1b481fc3SMaciej Żenczykowski 	}
627*1b481fc3SMaciej Żenczykowski 	}
628*1b481fc3SMaciej Żenczykowski 
629*1b481fc3SMaciej Żenczykowski 	if (board_type == RTL8139Cp || board_type >= RTL_GIGA_MAC_VER_01) {
630*1b481fc3SMaciej Żenczykowski 	v = data[0xE0 >> 2] & 0xffff;
631*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
632*1b481fc3SMaciej Żenczykowski 		"0xE0: C+ Command                                  0x%04x\n",
633*1b481fc3SMaciej Żenczykowski 		v);
634*1b481fc3SMaciej Żenczykowski 	if (v & (1 << 9))
635*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "      Big-endian mode\n");
636*1b481fc3SMaciej Żenczykowski 	if (v & (1 << 8))
637*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "      Home LAN enable\n");
638*1b481fc3SMaciej Żenczykowski 	if (v & (1 << 6))
639*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "      VLAN de-tagging\n");
640*1b481fc3SMaciej Żenczykowski 	if (v & (1 << 5))
641*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "      RX checksumming\n");
642*1b481fc3SMaciej Żenczykowski 	if (v & (1 << 4))
643*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "      PCI 64-bit DAC\n");
644*1b481fc3SMaciej Żenczykowski 	if (v & (1 << 3))
645*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "      PCI Multiple RW\n");
646*1b481fc3SMaciej Żenczykowski 
647*1b481fc3SMaciej Żenczykowski 	v = data[0xe0 >> 2] >> 16;
648*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
649*1b481fc3SMaciej Żenczykowski 		"0xE2: Interrupt Mitigation                        0x%04x\n"
650*1b481fc3SMaciej Żenczykowski 		"      TxTimer:       %u\n"
651*1b481fc3SMaciej Żenczykowski 		"      TxPackets:     %u\n"
652*1b481fc3SMaciej Żenczykowski 		"      RxTimer:       %u\n"
653*1b481fc3SMaciej Żenczykowski 		"      RxPackets:     %u\n",
654*1b481fc3SMaciej Żenczykowski 		v,
655*1b481fc3SMaciej Żenczykowski 		v >> 12,
656*1b481fc3SMaciej Żenczykowski 		(v >> 8) & 0xf,
657*1b481fc3SMaciej Żenczykowski 		(v >> 4) & 0xf,
658*1b481fc3SMaciej Żenczykowski 		v & 0xf);
659*1b481fc3SMaciej Żenczykowski 
660*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
661*1b481fc3SMaciej Żenczykowski 		"0xE4: Rx Ring Addr                 0x%08x 0x%08x\n",
662*1b481fc3SMaciej Żenczykowski 		data[0xE4 >> 2],
663*1b481fc3SMaciej Żenczykowski 		data[0xE8 >> 2]);
664*1b481fc3SMaciej Żenczykowski 
665*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
666*1b481fc3SMaciej Żenczykowski 		"0xEC: Early Tx threshold                            0x%02x\n",
667*1b481fc3SMaciej Żenczykowski 		data8[0xEC]);
668*1b481fc3SMaciej Żenczykowski 
669*1b481fc3SMaciej Żenczykowski 	if (board_type == RTL8139Cp) {
670*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
671*1b481fc3SMaciej Żenczykowski 		"0xFC: External MII register                   0x%08x\n",
672*1b481fc3SMaciej Żenczykowski 		data[0xFC >> 2]);
673*1b481fc3SMaciej Żenczykowski 	} else if (board_type >= RTL_GIGA_MAC_VER_01 &&
674*1b481fc3SMaciej Żenczykowski 		(board_type < RTL_GIGA_MAC_VER_11 ||
675*1b481fc3SMaciej Żenczykowski 		board_type > RTL_GIGA_MAC_VER_17)) {
676*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
677*1b481fc3SMaciej Żenczykowski 		"0xF0: Func Event                              0x%08x\n"
678*1b481fc3SMaciej Żenczykowski 		"0xF4: Func Event Mask                         0x%08x\n"
679*1b481fc3SMaciej Żenczykowski 		"0xF8: Func Preset State                       0x%08x\n"
680*1b481fc3SMaciej Żenczykowski 		"0xFC: Func Force Event                        0x%08x\n",
681*1b481fc3SMaciej Żenczykowski 		data[0xF0 >> 2],
682*1b481fc3SMaciej Żenczykowski 		data[0xF4 >> 2],
683*1b481fc3SMaciej Żenczykowski 		data[0xF8 >> 2],
684*1b481fc3SMaciej Żenczykowski 		data[0xFC >> 2]);
685*1b481fc3SMaciej Żenczykowski 	}
686*1b481fc3SMaciej Żenczykowski 	}
687*1b481fc3SMaciej Żenczykowski 
688*1b481fc3SMaciej Żenczykowski 	return 0;
689*1b481fc3SMaciej Żenczykowski }
690