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