1*1b481fc3SMaciej Żenczykowski
2*1b481fc3SMaciej Żenczykowski /* Copyright (C) 2003 Advanced Micro Devices Inc. */
3*1b481fc3SMaciej Żenczykowski #include <stdio.h>
4*1b481fc3SMaciej Żenczykowski #include "internal.h"
5*1b481fc3SMaciej Żenczykowski
6*1b481fc3SMaciej Żenczykowski typedef enum {
7*1b481fc3SMaciej Żenczykowski /* VAL2 */
8*1b481fc3SMaciej Żenczykowski RDMD0 = (1 << 16),
9*1b481fc3SMaciej Żenczykowski /* VAL1 */
10*1b481fc3SMaciej Żenczykowski TDMD3 = (1 << 11),
11*1b481fc3SMaciej Żenczykowski TDMD2 = (1 << 10),
12*1b481fc3SMaciej Żenczykowski TDMD1 = (1 << 9),
13*1b481fc3SMaciej Żenczykowski TDMD0 = (1 << 8),
14*1b481fc3SMaciej Żenczykowski /* VAL0 */
15*1b481fc3SMaciej Żenczykowski UINTCMD = (1 << 6),
16*1b481fc3SMaciej Żenczykowski RX_FAST_SPND = (1 << 5),
17*1b481fc3SMaciej Żenczykowski TX_FAST_SPND = (1 << 4),
18*1b481fc3SMaciej Żenczykowski RX_SPND = (1 << 3),
19*1b481fc3SMaciej Żenczykowski TX_SPND = (1 << 2),
20*1b481fc3SMaciej Żenczykowski INTREN = (1 << 1),
21*1b481fc3SMaciej Żenczykowski RUN = (1 << 0),
22*1b481fc3SMaciej Żenczykowski
23*1b481fc3SMaciej Żenczykowski CMD0_CLEAR = 0x000F0F7F, /* Command style register */
24*1b481fc3SMaciej Żenczykowski
25*1b481fc3SMaciej Żenczykowski }CMD0_BITS;
26*1b481fc3SMaciej Żenczykowski typedef enum {
27*1b481fc3SMaciej Żenczykowski
28*1b481fc3SMaciej Żenczykowski /* VAL3 */
29*1b481fc3SMaciej Żenczykowski CONDUIT_MODE = (1 << 29),
30*1b481fc3SMaciej Żenczykowski /* VAL2 */
31*1b481fc3SMaciej Żenczykowski RPA = (1 << 19),
32*1b481fc3SMaciej Żenczykowski DRCVPA = (1 << 18),
33*1b481fc3SMaciej Żenczykowski DRCVBC = (1 << 17),
34*1b481fc3SMaciej Żenczykowski PROM = (1 << 16),
35*1b481fc3SMaciej Żenczykowski /* VAL1 */
36*1b481fc3SMaciej Żenczykowski ASTRP_RCV = (1 << 13),
37*1b481fc3SMaciej Żenczykowski RCV_DROP0 = (1 << 12),
38*1b481fc3SMaciej Żenczykowski EMBA = (1 << 11),
39*1b481fc3SMaciej Żenczykowski DXMT2PD = (1 << 10),
40*1b481fc3SMaciej Żenczykowski LTINTEN = (1 << 9),
41*1b481fc3SMaciej Żenczykowski DXMTFCS = (1 << 8),
42*1b481fc3SMaciej Żenczykowski /* VAL0 */
43*1b481fc3SMaciej Żenczykowski APAD_XMT = (1 << 6),
44*1b481fc3SMaciej Żenczykowski DRTY = (1 << 5),
45*1b481fc3SMaciej Żenczykowski INLOOP = (1 << 4),
46*1b481fc3SMaciej Żenczykowski EXLOOP = (1 << 3),
47*1b481fc3SMaciej Żenczykowski REX_RTRY = (1 << 2),
48*1b481fc3SMaciej Żenczykowski REX_UFLO = (1 << 1),
49*1b481fc3SMaciej Żenczykowski REX_LCOL = (1 << 0),
50*1b481fc3SMaciej Żenczykowski
51*1b481fc3SMaciej Żenczykowski CMD2_CLEAR = 0x3F7F3F7F, /* Command style register */
52*1b481fc3SMaciej Żenczykowski
53*1b481fc3SMaciej Żenczykowski }CMD2_BITS;
54*1b481fc3SMaciej Żenczykowski typedef enum {
55*1b481fc3SMaciej Żenczykowski
56*1b481fc3SMaciej Żenczykowski /* VAL3 */
57*1b481fc3SMaciej Żenczykowski ASF_INIT_DONE_ALIAS = (1 << 29),
58*1b481fc3SMaciej Żenczykowski /* VAL2 */
59*1b481fc3SMaciej Żenczykowski JUMBO = (1 << 21),
60*1b481fc3SMaciej Żenczykowski VSIZE = (1 << 20),
61*1b481fc3SMaciej Żenczykowski VLONLY = (1 << 19),
62*1b481fc3SMaciej Żenczykowski VL_TAG_DEL = (1 << 18),
63*1b481fc3SMaciej Żenczykowski /* VAL1 */
64*1b481fc3SMaciej Żenczykowski EN_PMGR = (1 << 14),
65*1b481fc3SMaciej Żenczykowski INTLEVEL = (1 << 13),
66*1b481fc3SMaciej Żenczykowski FORCE_FULL_DUPLEX = (1 << 12),
67*1b481fc3SMaciej Żenczykowski FORCE_LINK_STATUS = (1 << 11),
68*1b481fc3SMaciej Żenczykowski APEP = (1 << 10),
69*1b481fc3SMaciej Żenczykowski MPPLBA = (1 << 9),
70*1b481fc3SMaciej Żenczykowski /* VAL0 */
71*1b481fc3SMaciej Żenczykowski RESET_PHY_PULSE = (1 << 2),
72*1b481fc3SMaciej Żenczykowski RESET_PHY = (1 << 1),
73*1b481fc3SMaciej Żenczykowski PHY_RST_POL = (1 << 0),
74*1b481fc3SMaciej Żenczykowski
75*1b481fc3SMaciej Żenczykowski }CMD3_BITS;
76*1b481fc3SMaciej Żenczykowski typedef enum {
77*1b481fc3SMaciej Żenczykowski
78*1b481fc3SMaciej Żenczykowski INTR = (1 << 31),
79*1b481fc3SMaciej Żenczykowski PCSINT = (1 << 28),
80*1b481fc3SMaciej Żenczykowski LCINT = (1 << 27),
81*1b481fc3SMaciej Żenczykowski APINT5 = (1 << 26),
82*1b481fc3SMaciej Żenczykowski APINT4 = (1 << 25),
83*1b481fc3SMaciej Żenczykowski APINT3 = (1 << 24),
84*1b481fc3SMaciej Żenczykowski TINT_SUM = (1 << 23),
85*1b481fc3SMaciej Żenczykowski APINT2 = (1 << 22),
86*1b481fc3SMaciej Żenczykowski APINT1 = (1 << 21),
87*1b481fc3SMaciej Żenczykowski APINT0 = (1 << 20),
88*1b481fc3SMaciej Żenczykowski MIIPDTINT = (1 << 19),
89*1b481fc3SMaciej Żenczykowski MCCINT = (1 << 17),
90*1b481fc3SMaciej Żenczykowski MREINT = (1 << 16),
91*1b481fc3SMaciej Żenczykowski RINT_SUM = (1 << 15),
92*1b481fc3SMaciej Żenczykowski SPNDINT = (1 << 14),
93*1b481fc3SMaciej Żenczykowski MPINT = (1 << 13),
94*1b481fc3SMaciej Żenczykowski SINT = (1 << 12),
95*1b481fc3SMaciej Żenczykowski TINT3 = (1 << 11),
96*1b481fc3SMaciej Żenczykowski TINT2 = (1 << 10),
97*1b481fc3SMaciej Żenczykowski TINT1 = (1 << 9),
98*1b481fc3SMaciej Żenczykowski TINT0 = (1 << 8),
99*1b481fc3SMaciej Żenczykowski UINT = (1 << 7),
100*1b481fc3SMaciej Żenczykowski STINT = (1 << 4),
101*1b481fc3SMaciej Żenczykowski RINT0 = (1 << 0),
102*1b481fc3SMaciej Żenczykowski
103*1b481fc3SMaciej Żenczykowski }INT0_BITS;
104*1b481fc3SMaciej Żenczykowski typedef enum {
105*1b481fc3SMaciej Żenczykowski
106*1b481fc3SMaciej Żenczykowski /* VAL3 */
107*1b481fc3SMaciej Żenczykowski LCINTEN = (1 << 27),
108*1b481fc3SMaciej Żenczykowski APINT5EN = (1 << 26),
109*1b481fc3SMaciej Żenczykowski APINT4EN = (1 << 25),
110*1b481fc3SMaciej Żenczykowski APINT3EN = (1 << 24),
111*1b481fc3SMaciej Żenczykowski /* VAL2 */
112*1b481fc3SMaciej Żenczykowski APINT2EN = (1 << 22),
113*1b481fc3SMaciej Żenczykowski APINT1EN = (1 << 21),
114*1b481fc3SMaciej Żenczykowski APINT0EN = (1 << 20),
115*1b481fc3SMaciej Żenczykowski MIIPDTINTEN = (1 << 19),
116*1b481fc3SMaciej Żenczykowski MCCIINTEN = (1 << 18),
117*1b481fc3SMaciej Żenczykowski MCCINTEN = (1 << 17),
118*1b481fc3SMaciej Żenczykowski MREINTEN = (1 << 16),
119*1b481fc3SMaciej Żenczykowski /* VAL1 */
120*1b481fc3SMaciej Żenczykowski SPNDINTEN = (1 << 14),
121*1b481fc3SMaciej Żenczykowski MPINTEN = (1 << 13),
122*1b481fc3SMaciej Żenczykowski TINTEN3 = (1 << 11),
123*1b481fc3SMaciej Żenczykowski SINTEN = (1 << 12),
124*1b481fc3SMaciej Żenczykowski TINTEN2 = (1 << 10),
125*1b481fc3SMaciej Żenczykowski TINTEN1 = (1 << 9),
126*1b481fc3SMaciej Żenczykowski TINTEN0 = (1 << 8),
127*1b481fc3SMaciej Żenczykowski /* VAL0 */
128*1b481fc3SMaciej Żenczykowski STINTEN = (1 << 4),
129*1b481fc3SMaciej Żenczykowski RINTEN0 = (1 << 0),
130*1b481fc3SMaciej Żenczykowski
131*1b481fc3SMaciej Żenczykowski INTEN0_CLEAR = 0x1F7F7F1F, /* Command style register */
132*1b481fc3SMaciej Żenczykowski
133*1b481fc3SMaciej Żenczykowski }INTEN0_BITS;
134*1b481fc3SMaciej Żenczykowski
135*1b481fc3SMaciej Żenczykowski typedef enum {
136*1b481fc3SMaciej Żenczykowski
137*1b481fc3SMaciej Żenczykowski PMAT_DET = (1 << 12),
138*1b481fc3SMaciej Żenczykowski MP_DET = (1 << 11),
139*1b481fc3SMaciej Żenczykowski LC_DET = (1 << 10),
140*1b481fc3SMaciej Żenczykowski SPEED_MASK = (1 << 9)|(1 << 8)|(1 << 7),
141*1b481fc3SMaciej Żenczykowski FULL_DPLX = (1 << 6),
142*1b481fc3SMaciej Żenczykowski LINK_STATS = (1 << 5),
143*1b481fc3SMaciej Żenczykowski AUTONEG_COMPLETE = (1 << 4),
144*1b481fc3SMaciej Żenczykowski MIIPD = (1 << 3),
145*1b481fc3SMaciej Żenczykowski RX_SUSPENDED = (1 << 2),
146*1b481fc3SMaciej Żenczykowski TX_SUSPENDED = (1 << 1),
147*1b481fc3SMaciej Żenczykowski RUNNING = (1 << 0),
148*1b481fc3SMaciej Żenczykowski
149*1b481fc3SMaciej Żenczykowski }STAT0_BITS;
150*1b481fc3SMaciej Żenczykowski
151*1b481fc3SMaciej Żenczykowski #define PHY_SPEED_10 0x2
152*1b481fc3SMaciej Żenczykowski #define PHY_SPEED_100 0x3
153*1b481fc3SMaciej Żenczykowski
154*1b481fc3SMaciej Żenczykowski
amd8111e_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)155*1b481fc3SMaciej Żenczykowski int amd8111e_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
156*1b481fc3SMaciej Żenczykowski struct ethtool_regs *regs)
157*1b481fc3SMaciej Żenczykowski {
158*1b481fc3SMaciej Żenczykowski
159*1b481fc3SMaciej Żenczykowski u32 *reg_buff = (u32 *)regs->data;
160*1b481fc3SMaciej Żenczykowski u32 reg;
161*1b481fc3SMaciej Żenczykowski
162*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Descriptor Registers\n");
163*1b481fc3SMaciej Żenczykowski fprintf(stdout, "---------------------\n");
164*1b481fc3SMaciej Żenczykowski
165*1b481fc3SMaciej Żenczykowski /* Transmit descriptor base address register */
166*1b481fc3SMaciej Żenczykowski reg = reg_buff[0];
167*1b481fc3SMaciej Żenczykowski fprintf(stdout,
168*1b481fc3SMaciej Żenczykowski "0x00100: Transmit descriptor base address register %08X\n",reg);
169*1b481fc3SMaciej Żenczykowski
170*1b481fc3SMaciej Żenczykowski /* Transmit descriptor length register */
171*1b481fc3SMaciej Żenczykowski reg = reg_buff[1];
172*1b481fc3SMaciej Żenczykowski fprintf(stdout,
173*1b481fc3SMaciej Żenczykowski "0x00140: Transmit descriptor length register 0x%08X\n",reg);
174*1b481fc3SMaciej Żenczykowski
175*1b481fc3SMaciej Żenczykowski /* Receive descriptor base address register */
176*1b481fc3SMaciej Żenczykowski reg = reg_buff[2];
177*1b481fc3SMaciej Żenczykowski fprintf(stdout,
178*1b481fc3SMaciej Żenczykowski "0x00120: Receive descriptor base address register %08X\n",reg);
179*1b481fc3SMaciej Żenczykowski
180*1b481fc3SMaciej Żenczykowski /* Receive descriptor length register */
181*1b481fc3SMaciej Żenczykowski reg = reg_buff[3];
182*1b481fc3SMaciej Żenczykowski fprintf(stdout,
183*1b481fc3SMaciej Żenczykowski "0x00150: Receive descriptor length register 0x%08X\n",reg);
184*1b481fc3SMaciej Żenczykowski
185*1b481fc3SMaciej Żenczykowski fprintf(stdout, "\n");
186*1b481fc3SMaciej Żenczykowski
187*1b481fc3SMaciej Żenczykowski
188*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Command Registers\n");
189*1b481fc3SMaciej Żenczykowski fprintf(stdout, "-------------------\n");
190*1b481fc3SMaciej Żenczykowski
191*1b481fc3SMaciej Żenczykowski /* Command 0 Register */
192*1b481fc3SMaciej Żenczykowski reg = reg_buff[4];
193*1b481fc3SMaciej Żenczykowski fprintf(stdout,
194*1b481fc3SMaciej Żenczykowski "0x00048: Command 0 register 0x%08X\n"
195*1b481fc3SMaciej Żenczykowski " Interrupts: %s\n"
196*1b481fc3SMaciej Żenczykowski " Device: %s\n",
197*1b481fc3SMaciej Żenczykowski reg,
198*1b481fc3SMaciej Żenczykowski reg & INTREN ? "Enabled" : "Disabled",
199*1b481fc3SMaciej Żenczykowski reg & RUN ? "Running" : "Stopped");
200*1b481fc3SMaciej Żenczykowski
201*1b481fc3SMaciej Żenczykowski /* Command 2 Register */
202*1b481fc3SMaciej Żenczykowski reg = reg_buff[5];
203*1b481fc3SMaciej Żenczykowski fprintf(stdout,
204*1b481fc3SMaciej Żenczykowski "0x00050: Command 2 register 0x%08X\n"
205*1b481fc3SMaciej Żenczykowski " Promiscuous mode: %s\n"
206*1b481fc3SMaciej Żenczykowski " Retransmit on underflow: %s\n",
207*1b481fc3SMaciej Żenczykowski reg,
208*1b481fc3SMaciej Żenczykowski reg & PROM ? "Enabled" : "Disabled",
209*1b481fc3SMaciej Żenczykowski reg & REX_UFLO ? "Enabled" : "Disabled");
210*1b481fc3SMaciej Żenczykowski /* Command 3 Register */
211*1b481fc3SMaciej Żenczykowski reg = reg_buff[6];
212*1b481fc3SMaciej Żenczykowski fprintf(stdout,
213*1b481fc3SMaciej Żenczykowski "0x00054: Command 3 register 0x%08X\n"
214*1b481fc3SMaciej Żenczykowski " Jumbo frame: %s\n"
215*1b481fc3SMaciej Żenczykowski " Admit only VLAN frame: %s\n"
216*1b481fc3SMaciej Żenczykowski " Delete VLAN tag: %s\n",
217*1b481fc3SMaciej Żenczykowski reg,
218*1b481fc3SMaciej Żenczykowski reg & JUMBO ? "Enabled" : "Disabled",
219*1b481fc3SMaciej Żenczykowski reg & VLONLY ? "Yes" : "No",
220*1b481fc3SMaciej Żenczykowski reg & VL_TAG_DEL ? "Yes" : "No");
221*1b481fc3SMaciej Żenczykowski
222*1b481fc3SMaciej Żenczykowski /* Command 7 Register */
223*1b481fc3SMaciej Żenczykowski reg = reg_buff[7];
224*1b481fc3SMaciej Żenczykowski fprintf(stdout,
225*1b481fc3SMaciej Żenczykowski "0x00064: Command 7 register 0x%08X\n",
226*1b481fc3SMaciej Żenczykowski reg);
227*1b481fc3SMaciej Żenczykowski
228*1b481fc3SMaciej Żenczykowski fprintf(stdout, "\n");
229*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Interrupt Registers\n");
230*1b481fc3SMaciej Żenczykowski fprintf(stdout, "-------------------\n");
231*1b481fc3SMaciej Żenczykowski
232*1b481fc3SMaciej Żenczykowski /* Interrupt 0 Register */
233*1b481fc3SMaciej Żenczykowski reg = reg_buff[8];
234*1b481fc3SMaciej Żenczykowski fprintf(stdout,
235*1b481fc3SMaciej Żenczykowski "0x00038: Interrupt register 0x%08X\n"
236*1b481fc3SMaciej Żenczykowski " Any interrupt is set: %s\n"
237*1b481fc3SMaciej Żenczykowski " Link change interrupt: %s\n"
238*1b481fc3SMaciej Żenczykowski " Register 0 auto-poll interrupt: %s\n"
239*1b481fc3SMaciej Żenczykowski " Transmit interrupt: %s\n"
240*1b481fc3SMaciej Żenczykowski " Software timer interrupt: %s\n"
241*1b481fc3SMaciej Żenczykowski " Receive interrupt: %s\n",
242*1b481fc3SMaciej Żenczykowski reg,
243*1b481fc3SMaciej Żenczykowski reg & INTR ? "Yes" : "No",
244*1b481fc3SMaciej Żenczykowski reg & LCINT ? "Yes" : "No",
245*1b481fc3SMaciej Żenczykowski reg & APINT0 ? "Yes" : "No",
246*1b481fc3SMaciej Żenczykowski reg & TINT0 ? "Yes" : "No",
247*1b481fc3SMaciej Żenczykowski reg & STINT ? "Yes" : "No",
248*1b481fc3SMaciej Żenczykowski reg & RINT0 ? "Yes" : "No"
249*1b481fc3SMaciej Żenczykowski );
250*1b481fc3SMaciej Żenczykowski /* Interrupt 0 enable Register */
251*1b481fc3SMaciej Żenczykowski reg = reg_buff[9];
252*1b481fc3SMaciej Żenczykowski fprintf(stdout,
253*1b481fc3SMaciej Żenczykowski "0x00040: Interrupt enable register 0x%08X\n"
254*1b481fc3SMaciej Żenczykowski " Link change interrupt: %s\n"
255*1b481fc3SMaciej Żenczykowski " Register 0 auto-poll interrupt: %s\n"
256*1b481fc3SMaciej Żenczykowski " Transmit interrupt: %s\n"
257*1b481fc3SMaciej Żenczykowski " Software timer interrupt: %s\n"
258*1b481fc3SMaciej Żenczykowski " Receive interrupt: %s\n",
259*1b481fc3SMaciej Żenczykowski reg,
260*1b481fc3SMaciej Żenczykowski reg & LCINTEN ? "Enabled" : "Disabled",
261*1b481fc3SMaciej Żenczykowski reg & APINT0EN ? "Enabled" : "Disabled",
262*1b481fc3SMaciej Żenczykowski reg & TINTEN0 ? "Enabled" : "Disabled",
263*1b481fc3SMaciej Żenczykowski reg & STINTEN ? "Enabled" : "Disabled",
264*1b481fc3SMaciej Żenczykowski reg & RINTEN0 ? "Enabled" : "Disabled"
265*1b481fc3SMaciej Żenczykowski );
266*1b481fc3SMaciej Żenczykowski
267*1b481fc3SMaciej Żenczykowski fprintf(stdout, "\n");
268*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Logical Address Filter Register\n");
269*1b481fc3SMaciej Żenczykowski fprintf(stdout, "-------------------\n");
270*1b481fc3SMaciej Żenczykowski
271*1b481fc3SMaciej Żenczykowski /* Logical Address Filter Register */
272*1b481fc3SMaciej Żenczykowski fprintf(stdout,
273*1b481fc3SMaciej Żenczykowski "0x00168: Logical address filter register 0x%08X%08X\n",
274*1b481fc3SMaciej Żenczykowski reg_buff[11],reg_buff[10]);
275*1b481fc3SMaciej Żenczykowski
276*1b481fc3SMaciej Żenczykowski fprintf(stdout, "\n");
277*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Link status Register\n");
278*1b481fc3SMaciej Żenczykowski fprintf(stdout, "-------------------\n");
279*1b481fc3SMaciej Żenczykowski
280*1b481fc3SMaciej Żenczykowski /* Status 0 Register */
281*1b481fc3SMaciej Żenczykowski reg = reg_buff[12];
282*1b481fc3SMaciej Żenczykowski if(reg & LINK_STATS){
283*1b481fc3SMaciej Żenczykowski fprintf(stdout,
284*1b481fc3SMaciej Żenczykowski "0x00030: Link status register 0x%08X\n"
285*1b481fc3SMaciej Żenczykowski " Link status: %s\n"
286*1b481fc3SMaciej Żenczykowski " Auto negotiation complete %s\n"
287*1b481fc3SMaciej Żenczykowski " Duplex %s\n"
288*1b481fc3SMaciej Żenczykowski " Speed %s\n",
289*1b481fc3SMaciej Żenczykowski reg,
290*1b481fc3SMaciej Żenczykowski reg & LINK_STATS ? "Valid" : "Invalid",
291*1b481fc3SMaciej Żenczykowski reg & AUTONEG_COMPLETE ? "Yes" : "No",
292*1b481fc3SMaciej Żenczykowski reg & FULL_DPLX ? "Full" : "Half",
293*1b481fc3SMaciej Żenczykowski ((reg & SPEED_MASK) >> 7 == PHY_SPEED_10) ? "10Mbits/ Sec":
294*1b481fc3SMaciej Żenczykowski "100Mbits/Sec");
295*1b481fc3SMaciej Żenczykowski
296*1b481fc3SMaciej Żenczykowski }
297*1b481fc3SMaciej Żenczykowski else{
298*1b481fc3SMaciej Żenczykowski fprintf(stdout,
299*1b481fc3SMaciej Żenczykowski "0x00030: Link status register 0x%08X\n"
300*1b481fc3SMaciej Żenczykowski " Link status: %s\n",
301*1b481fc3SMaciej Żenczykowski reg,
302*1b481fc3SMaciej Żenczykowski reg & LINK_STATS ? "Valid" : "Invalid");
303*1b481fc3SMaciej Żenczykowski }
304*1b481fc3SMaciej Żenczykowski return 0;
305*1b481fc3SMaciej Żenczykowski
306*1b481fc3SMaciej Żenczykowski }
307