1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski * Copyright (c) 2004, 2005 Zultys Technologies
3*1b481fc3SMaciej Żenczykowski * Eugene Surovegin <[email protected]> or <[email protected]>
4*1b481fc3SMaciej Żenczykowski */
5*1b481fc3SMaciej Żenczykowski #include <stdio.h>
6*1b481fc3SMaciej Żenczykowski #include <stdint.h>
7*1b481fc3SMaciej Żenczykowski #include <stddef.h>
8*1b481fc3SMaciej Żenczykowski
9*1b481fc3SMaciej Żenczykowski #include "internal.h"
10*1b481fc3SMaciej Żenczykowski
11*1b481fc3SMaciej Żenczykowski /* Ethtool get_regs complex data.
12*1b481fc3SMaciej Żenczykowski * we want to get not just EMAC registers, but also MAL, ZMII, RGMII, TAH
13*1b481fc3SMaciej Żenczykowski * when available.
14*1b481fc3SMaciej Żenczykowski *
15*1b481fc3SMaciej Żenczykowski * Returned BLOB consists of the ibm_emac_ethtool_regs_hdr,
16*1b481fc3SMaciej Żenczykowski * MAL registers, EMAC registers and optional ZMII, RGMII, TAH registers.
17*1b481fc3SMaciej Żenczykowski * Each register component is preceded with emac_ethtool_regs_subhdr.
18*1b481fc3SMaciej Żenczykowski * Order of the optional headers follows their relative bit posititions
19*1b481fc3SMaciej Żenczykowski * in emac_ethtool_regs_hdr.components
20*1b481fc3SMaciej Żenczykowski */
21*1b481fc3SMaciej Żenczykowski #define EMAC_ETHTOOL_REGS_ZMII 0x00000001
22*1b481fc3SMaciej Żenczykowski #define EMAC_ETHTOOL_REGS_RGMII 0x00000002
23*1b481fc3SMaciej Żenczykowski #define EMAC_ETHTOOL_REGS_TAH 0x00000004
24*1b481fc3SMaciej Żenczykowski
25*1b481fc3SMaciej Żenczykowski #define EMAC_VERSION 3
26*1b481fc3SMaciej Żenczykowski #define EMAC4_VERSION 4
27*1b481fc3SMaciej Żenczykowski #define EMAC4SYNC_VERSION 5
28*1b481fc3SMaciej Żenczykowski
29*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_hdr {
30*1b481fc3SMaciej Żenczykowski u32 components;
31*1b481fc3SMaciej Żenczykowski };
32*1b481fc3SMaciej Żenczykowski
33*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_subhdr {
34*1b481fc3SMaciej Żenczykowski u32 version;
35*1b481fc3SMaciej Żenczykowski u32 index;
36*1b481fc3SMaciej Żenczykowski };
37*1b481fc3SMaciej Żenczykowski
38*1b481fc3SMaciej Żenczykowski struct emac_regs {
39*1b481fc3SMaciej Żenczykowski /* Common registers across all EMAC implementations. */
40*1b481fc3SMaciej Żenczykowski u32 mr0; /* Special */
41*1b481fc3SMaciej Żenczykowski u32 mr1; /* Reset */
42*1b481fc3SMaciej Żenczykowski u32 tmr0; /* Special */
43*1b481fc3SMaciej Żenczykowski u32 tmr1; /* Special */
44*1b481fc3SMaciej Żenczykowski u32 rmr; /* Reset */
45*1b481fc3SMaciej Żenczykowski u32 isr; /* Always */
46*1b481fc3SMaciej Żenczykowski u32 iser; /* Reset */
47*1b481fc3SMaciej Żenczykowski u32 iahr; /* Reset, R, T */
48*1b481fc3SMaciej Żenczykowski u32 ialr; /* Reset, R, T */
49*1b481fc3SMaciej Żenczykowski u32 vtpid; /* Reset, R, T */
50*1b481fc3SMaciej Żenczykowski u32 vtci; /* Reset, R, T */
51*1b481fc3SMaciej Żenczykowski u32 ptr; /* Reset, T */
52*1b481fc3SMaciej Żenczykowski union {
53*1b481fc3SMaciej Żenczykowski /* Registers unique to EMAC4 implementations */
54*1b481fc3SMaciej Żenczykowski struct {
55*1b481fc3SMaciej Żenczykowski u32 iaht1; /* Reset, R */
56*1b481fc3SMaciej Żenczykowski u32 iaht2; /* Reset, R */
57*1b481fc3SMaciej Żenczykowski u32 iaht3; /* Reset, R */
58*1b481fc3SMaciej Żenczykowski u32 iaht4; /* Reset, R */
59*1b481fc3SMaciej Żenczykowski u32 gaht1; /* Reset, R */
60*1b481fc3SMaciej Żenczykowski u32 gaht2; /* Reset, R */
61*1b481fc3SMaciej Żenczykowski u32 gaht3; /* Reset, R */
62*1b481fc3SMaciej Żenczykowski u32 gaht4; /* Reset, R */
63*1b481fc3SMaciej Żenczykowski } emac4;
64*1b481fc3SMaciej Żenczykowski /* Registers unique to EMAC4SYNC implementations */
65*1b481fc3SMaciej Żenczykowski struct {
66*1b481fc3SMaciej Żenczykowski u32 mahr; /* Reset, R, T */
67*1b481fc3SMaciej Żenczykowski u32 malr; /* Reset, R, T */
68*1b481fc3SMaciej Żenczykowski u32 mmahr; /* Reset, R, T */
69*1b481fc3SMaciej Żenczykowski u32 mmalr; /* Reset, R, T */
70*1b481fc3SMaciej Żenczykowski u32 rsvd0[4];
71*1b481fc3SMaciej Żenczykowski } emac4sync;
72*1b481fc3SMaciej Żenczykowski } u0;
73*1b481fc3SMaciej Żenczykowski /* Common registers across all EMAC implementations. */
74*1b481fc3SMaciej Żenczykowski u32 lsah;
75*1b481fc3SMaciej Żenczykowski u32 lsal;
76*1b481fc3SMaciej Żenczykowski u32 ipgvr; /* Reset, T */
77*1b481fc3SMaciej Żenczykowski u32 stacr; /* Special */
78*1b481fc3SMaciej Żenczykowski u32 trtr; /* Special */
79*1b481fc3SMaciej Żenczykowski u32 rwmr; /* Reset */
80*1b481fc3SMaciej Żenczykowski u32 octx;
81*1b481fc3SMaciej Żenczykowski u32 ocrx;
82*1b481fc3SMaciej Żenczykowski union {
83*1b481fc3SMaciej Żenczykowski /* Registers unique to EMAC4 implementations */
84*1b481fc3SMaciej Żenczykowski struct {
85*1b481fc3SMaciej Żenczykowski u32 ipcr;
86*1b481fc3SMaciej Żenczykowski } emac4;
87*1b481fc3SMaciej Żenczykowski /* Registers unique to EMAC4SYNC implementations */
88*1b481fc3SMaciej Żenczykowski struct {
89*1b481fc3SMaciej Żenczykowski u32 rsvd1;
90*1b481fc3SMaciej Żenczykowski u32 revid;
91*1b481fc3SMaciej Żenczykowski u32 rsvd2[2];
92*1b481fc3SMaciej Żenczykowski u32 iaht1; /* Reset, R */
93*1b481fc3SMaciej Żenczykowski u32 iaht2; /* Reset, R */
94*1b481fc3SMaciej Żenczykowski u32 iaht3; /* Reset, R */
95*1b481fc3SMaciej Żenczykowski u32 iaht4; /* Reset, R */
96*1b481fc3SMaciej Żenczykowski u32 iaht5; /* Reset, R */
97*1b481fc3SMaciej Żenczykowski u32 iaht6; /* Reset, R */
98*1b481fc3SMaciej Żenczykowski u32 iaht7; /* Reset, R */
99*1b481fc3SMaciej Żenczykowski u32 iaht8; /* Reset, R */
100*1b481fc3SMaciej Żenczykowski u32 gaht1; /* Reset, R */
101*1b481fc3SMaciej Żenczykowski u32 gaht2; /* Reset, R */
102*1b481fc3SMaciej Żenczykowski u32 gaht3; /* Reset, R */
103*1b481fc3SMaciej Żenczykowski u32 gaht4; /* Reset, R */
104*1b481fc3SMaciej Żenczykowski u32 gaht5; /* Reset, R */
105*1b481fc3SMaciej Żenczykowski u32 gaht6; /* Reset, R */
106*1b481fc3SMaciej Żenczykowski u32 gaht7; /* Reset, R */
107*1b481fc3SMaciej Żenczykowski u32 gaht8; /* Reset, R */
108*1b481fc3SMaciej Żenczykowski u32 tpc; /* Reset, T */
109*1b481fc3SMaciej Żenczykowski } emac4sync;
110*1b481fc3SMaciej Żenczykowski } u1;
111*1b481fc3SMaciej Żenczykowski };
112*1b481fc3SMaciej Żenczykowski
113*1b481fc3SMaciej Żenczykowski struct mal_regs {
114*1b481fc3SMaciej Żenczykowski u32 tx_count;
115*1b481fc3SMaciej Żenczykowski u32 rx_count;
116*1b481fc3SMaciej Żenczykowski
117*1b481fc3SMaciej Żenczykowski u32 cfg;
118*1b481fc3SMaciej Żenczykowski u32 esr;
119*1b481fc3SMaciej Żenczykowski u32 ier;
120*1b481fc3SMaciej Żenczykowski u32 tx_casr;
121*1b481fc3SMaciej Żenczykowski u32 tx_carr;
122*1b481fc3SMaciej Żenczykowski u32 tx_eobisr;
123*1b481fc3SMaciej Żenczykowski u32 tx_deir;
124*1b481fc3SMaciej Żenczykowski u32 rx_casr;
125*1b481fc3SMaciej Żenczykowski u32 rx_carr;
126*1b481fc3SMaciej Żenczykowski u32 rx_eobisr;
127*1b481fc3SMaciej Żenczykowski u32 rx_deir;
128*1b481fc3SMaciej Żenczykowski u32 tx_ctpr[32];
129*1b481fc3SMaciej Żenczykowski u32 rx_ctpr[32];
130*1b481fc3SMaciej Żenczykowski u32 rcbs[32];
131*1b481fc3SMaciej Żenczykowski };
132*1b481fc3SMaciej Żenczykowski
133*1b481fc3SMaciej Żenczykowski struct zmii_regs {
134*1b481fc3SMaciej Żenczykowski u32 fer;
135*1b481fc3SMaciej Żenczykowski u32 ssr;
136*1b481fc3SMaciej Żenczykowski u32 smiisr;
137*1b481fc3SMaciej Żenczykowski };
138*1b481fc3SMaciej Żenczykowski
139*1b481fc3SMaciej Żenczykowski struct rgmii_regs {
140*1b481fc3SMaciej Żenczykowski u32 fer;
141*1b481fc3SMaciej Żenczykowski u32 ssr;
142*1b481fc3SMaciej Żenczykowski };
143*1b481fc3SMaciej Żenczykowski
144*1b481fc3SMaciej Żenczykowski struct tah_regs {
145*1b481fc3SMaciej Żenczykowski u32 revid;
146*1b481fc3SMaciej Żenczykowski u32 pad[3];
147*1b481fc3SMaciej Żenczykowski u32 mr;
148*1b481fc3SMaciej Żenczykowski u32 ssr0;
149*1b481fc3SMaciej Żenczykowski u32 ssr1;
150*1b481fc3SMaciej Żenczykowski u32 ssr2;
151*1b481fc3SMaciej Żenczykowski u32 ssr3;
152*1b481fc3SMaciej Żenczykowski u32 ssr4;
153*1b481fc3SMaciej Żenczykowski u32 ssr5;
154*1b481fc3SMaciej Żenczykowski u32 tsr;
155*1b481fc3SMaciej Żenczykowski };
156*1b481fc3SMaciej Żenczykowski
print_emac_regs(void * buf)157*1b481fc3SMaciej Żenczykowski static void *print_emac_regs(void *buf)
158*1b481fc3SMaciej Żenczykowski {
159*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_subhdr *hdr = buf;
160*1b481fc3SMaciej Żenczykowski struct emac_regs *p = (struct emac_regs *)(hdr + 1);
161*1b481fc3SMaciej Żenczykowski void *res = p + 1;
162*1b481fc3SMaciej Żenczykowski
163*1b481fc3SMaciej Żenczykowski if (!((hdr->version == EMAC_VERSION) ||
164*1b481fc3SMaciej Żenczykowski (hdr->version == EMAC4_VERSION) ||
165*1b481fc3SMaciej Żenczykowski (hdr->version == EMAC4SYNC_VERSION)))
166*1b481fc3SMaciej Żenczykowski {
167*1b481fc3SMaciej Żenczykowski printf("This driver version doesn't support information\n"
168*1b481fc3SMaciej Żenczykowski " output for EMAC area, please update it or use older\n"
169*1b481fc3SMaciej Żenczykowski " ethtool version\n");
170*1b481fc3SMaciej Żenczykowski return res;
171*1b481fc3SMaciej Żenczykowski }
172*1b481fc3SMaciej Żenczykowski
173*1b481fc3SMaciej Żenczykowski printf("EMAC%d Registers\n", hdr->index);
174*1b481fc3SMaciej Żenczykowski printf("-----------------\n");
175*1b481fc3SMaciej Żenczykowski printf("MR0 = 0x%08x MR1 = 0x%08x RMR = 0x%08x\n"
176*1b481fc3SMaciej Żenczykowski "ISR = 0x%08x ISER = 0x%08x\n"
177*1b481fc3SMaciej Żenczykowski "TMR0 = 0x%08x TMR1 = 0x%08x\n"
178*1b481fc3SMaciej Żenczykowski "TRTR = 0x%08x RWMR = 0x%08x\n"
179*1b481fc3SMaciej Żenczykowski "IAR = %04x%08x\n"
180*1b481fc3SMaciej Żenczykowski "LSA = %04x%08x\n"
181*1b481fc3SMaciej Żenczykowski "VTPID = 0x%04x VTCI = 0x%04x\n"
182*1b481fc3SMaciej Żenczykowski "IPGVR = 0x%04x STACR = 0x%08x\n"
183*1b481fc3SMaciej Żenczykowski "OCTX = 0x%08x OCRX = 0x%08x\n",
184*1b481fc3SMaciej Żenczykowski p->mr0, p->mr1, p->rmr,
185*1b481fc3SMaciej Żenczykowski p->isr, p->iser,
186*1b481fc3SMaciej Żenczykowski p->tmr0, p->tmr1,
187*1b481fc3SMaciej Żenczykowski p->trtr, p->rwmr,
188*1b481fc3SMaciej Żenczykowski p->iahr, p->ialr,
189*1b481fc3SMaciej Żenczykowski p->lsah, p->lsal,
190*1b481fc3SMaciej Żenczykowski p->vtpid, p->vtci,
191*1b481fc3SMaciej Żenczykowski p->ipgvr, p->stacr, p->octx, p->ocrx);
192*1b481fc3SMaciej Żenczykowski
193*1b481fc3SMaciej Żenczykowski if (hdr->version == EMAC4SYNC_VERSION) {
194*1b481fc3SMaciej Żenczykowski printf("MAHR = 0x%08x MALR = 0x%08x MMAHR = 0x%08x\n"
195*1b481fc3SMaciej Żenczykowski "MMALR = 0x%08x REVID = 0x%08x\n",
196*1b481fc3SMaciej Żenczykowski p->u0.emac4sync.mahr, p->u0.emac4sync.malr,
197*1b481fc3SMaciej Żenczykowski p->u0.emac4sync.mmahr, p->u0.emac4sync.mmalr,
198*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.revid);
199*1b481fc3SMaciej Żenczykowski
200*1b481fc3SMaciej Żenczykowski printf("IAHT = 0x%04x 0x%04x 0x%04x 0x%04x\n",
201*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.iaht1, p->u1.emac4sync.iaht2,
202*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.iaht3, p->u1.emac4sync.iaht4);
203*1b481fc3SMaciej Żenczykowski printf(" 0x%04x 0x%04x 0x%04x 0x%04x\n",
204*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.iaht5, p->u1.emac4sync.iaht6,
205*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.iaht7, p->u1.emac4sync.iaht8);
206*1b481fc3SMaciej Żenczykowski
207*1b481fc3SMaciej Żenczykowski
208*1b481fc3SMaciej Żenczykowski printf("GAHT = 0x%04x 0x%04x 0x%04x 0x%04x\n",
209*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.gaht1, p->u1.emac4sync.gaht2,
210*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.gaht3, p->u1.emac4sync.gaht4);
211*1b481fc3SMaciej Żenczykowski printf(" 0x%04x 0x%04x 0x%04x 0x%04x\n\n",
212*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.gaht5, p->u1.emac4sync.gaht6,
213*1b481fc3SMaciej Żenczykowski p->u1.emac4sync.gaht7, p->u1.emac4sync.gaht8);
214*1b481fc3SMaciej Żenczykowski
215*1b481fc3SMaciej Żenczykowski } else if (hdr->version == EMAC4_VERSION) {
216*1b481fc3SMaciej Żenczykowski printf("IAHT = 0x%04x 0x%04x 0x%04x 0x%04x\n",
217*1b481fc3SMaciej Żenczykowski p->u0.emac4.iaht1, p->u0.emac4.iaht2,
218*1b481fc3SMaciej Żenczykowski p->u0.emac4.iaht3, p->u0.emac4.iaht4);
219*1b481fc3SMaciej Żenczykowski
220*1b481fc3SMaciej Żenczykowski printf("GAHT = 0x%04x 0x%04x 0x%04x 0x%04x\n",
221*1b481fc3SMaciej Żenczykowski p->u0.emac4.gaht1, p->u0.emac4.gaht2,
222*1b481fc3SMaciej Żenczykowski p->u0.emac4.gaht3, p->u0.emac4.gaht4);
223*1b481fc3SMaciej Żenczykowski
224*1b481fc3SMaciej Żenczykowski printf(" IPCR = 0x%08x\n\n", p->u1.emac4.ipcr);
225*1b481fc3SMaciej Żenczykowski } else if (hdr->version == EMAC_VERSION) {
226*1b481fc3SMaciej Żenczykowski printf("IAHT = 0x%04x 0x%04x 0x%04x 0x%04x\n",
227*1b481fc3SMaciej Żenczykowski p->u0.emac4.iaht1, p->u0.emac4.iaht2,
228*1b481fc3SMaciej Żenczykowski p->u0.emac4.iaht3, p->u0.emac4.iaht4);
229*1b481fc3SMaciej Żenczykowski
230*1b481fc3SMaciej Żenczykowski printf("GAHT = 0x%04x 0x%04x 0x%04x 0x%04x\n",
231*1b481fc3SMaciej Żenczykowski p->u0.emac4.gaht1, p->u0.emac4.gaht2,
232*1b481fc3SMaciej Żenczykowski p->u0.emac4.gaht3, p->u0.emac4.gaht4);
233*1b481fc3SMaciej Żenczykowski }
234*1b481fc3SMaciej Żenczykowski return res;
235*1b481fc3SMaciej Żenczykowski }
236*1b481fc3SMaciej Żenczykowski
print_mal_regs(void * buf)237*1b481fc3SMaciej Żenczykowski static void *print_mal_regs(void *buf)
238*1b481fc3SMaciej Żenczykowski {
239*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_subhdr *hdr = buf;
240*1b481fc3SMaciej Żenczykowski struct mal_regs *p = (struct mal_regs *)(hdr + 1);
241*1b481fc3SMaciej Żenczykowski unsigned int i;
242*1b481fc3SMaciej Żenczykowski
243*1b481fc3SMaciej Żenczykowski printf("MAL%d Registers\n", hdr->index);
244*1b481fc3SMaciej Żenczykowski printf("-----------------\n");
245*1b481fc3SMaciej Żenczykowski printf("CFG = 0x%08x ESR = 0x%08x IER = 0x%08x\n"
246*1b481fc3SMaciej Żenczykowski "TX|CASR = 0x%08x CARR = 0x%08x EOBISR = 0x%08x DEIR = 0x%08x\n"
247*1b481fc3SMaciej Żenczykowski "RX|CASR = 0x%08x CARR = 0x%08x EOBISR = 0x%08x DEIR = 0x%08x\n",
248*1b481fc3SMaciej Żenczykowski p->cfg, p->esr, p->ier,
249*1b481fc3SMaciej Żenczykowski p->tx_casr, p->tx_carr, p->tx_eobisr, p->tx_deir,
250*1b481fc3SMaciej Żenczykowski p->rx_casr, p->rx_carr, p->rx_eobisr, p->rx_deir);
251*1b481fc3SMaciej Żenczykowski
252*1b481fc3SMaciej Żenczykowski printf("TX|");
253*1b481fc3SMaciej Żenczykowski for (i = 0; i < p->tx_count; ++i) {
254*1b481fc3SMaciej Żenczykowski if (i && !(i % 4))
255*1b481fc3SMaciej Żenczykowski printf("\n ");
256*1b481fc3SMaciej Żenczykowski printf("CTP%d = 0x%08x ", i, p->tx_ctpr[i]);
257*1b481fc3SMaciej Żenczykowski }
258*1b481fc3SMaciej Żenczykowski printf("\nRX|");
259*1b481fc3SMaciej Żenczykowski for (i = 0; i < p->rx_count; ++i) {
260*1b481fc3SMaciej Żenczykowski if (i && !(i % 4))
261*1b481fc3SMaciej Żenczykowski printf("\n ");
262*1b481fc3SMaciej Żenczykowski printf("CTP%d = 0x%08x ", i, p->rx_ctpr[i]);
263*1b481fc3SMaciej Żenczykowski }
264*1b481fc3SMaciej Żenczykowski printf("\n ");
265*1b481fc3SMaciej Żenczykowski for (i = 0; i < p->rx_count; ++i) {
266*1b481fc3SMaciej Żenczykowski u32 r = p->rcbs[i];
267*1b481fc3SMaciej Żenczykowski if (i && !(i % 3))
268*1b481fc3SMaciej Żenczykowski printf("\n ");
269*1b481fc3SMaciej Żenczykowski printf("RCBS%d = 0x%08x (%d) ", i, r, r * 16);
270*1b481fc3SMaciej Żenczykowski }
271*1b481fc3SMaciej Żenczykowski printf("\n\n");
272*1b481fc3SMaciej Żenczykowski return p + 1;
273*1b481fc3SMaciej Żenczykowski }
274*1b481fc3SMaciej Żenczykowski
print_zmii_regs(void * buf)275*1b481fc3SMaciej Żenczykowski static void *print_zmii_regs(void *buf)
276*1b481fc3SMaciej Żenczykowski {
277*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_subhdr *hdr = buf;
278*1b481fc3SMaciej Żenczykowski struct zmii_regs *p = (struct zmii_regs *)(hdr + 1);
279*1b481fc3SMaciej Żenczykowski
280*1b481fc3SMaciej Żenczykowski printf("ZMII%d Registers\n", hdr->index);
281*1b481fc3SMaciej Żenczykowski printf("-----------------\n");
282*1b481fc3SMaciej Żenczykowski printf("FER = %08x SSR = %08x\n"
283*1b481fc3SMaciej Żenczykowski "SMIISR = %08x\n\n", p->fer, p->ssr, p->smiisr);
284*1b481fc3SMaciej Żenczykowski
285*1b481fc3SMaciej Żenczykowski return p + 1;
286*1b481fc3SMaciej Żenczykowski }
287*1b481fc3SMaciej Żenczykowski
print_rgmii_regs(void * buf)288*1b481fc3SMaciej Żenczykowski static void *print_rgmii_regs(void *buf)
289*1b481fc3SMaciej Żenczykowski {
290*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_subhdr *hdr = buf;
291*1b481fc3SMaciej Żenczykowski struct rgmii_regs *p = (struct rgmii_regs *)(hdr + 1);
292*1b481fc3SMaciej Żenczykowski
293*1b481fc3SMaciej Żenczykowski printf("RGMII%d Registers\n", hdr->index);
294*1b481fc3SMaciej Żenczykowski printf("-----------------\n");
295*1b481fc3SMaciej Żenczykowski printf("FER = %08x SSR = %08x\n\n", p->fer, p->ssr);
296*1b481fc3SMaciej Żenczykowski
297*1b481fc3SMaciej Żenczykowski return p + 1;
298*1b481fc3SMaciej Żenczykowski }
299*1b481fc3SMaciej Żenczykowski
print_tah_regs(void * buf)300*1b481fc3SMaciej Żenczykowski static void *print_tah_regs(void *buf)
301*1b481fc3SMaciej Żenczykowski {
302*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_subhdr *hdr = buf;
303*1b481fc3SMaciej Żenczykowski struct tah_regs *p = (struct tah_regs *)(hdr + 1);
304*1b481fc3SMaciej Żenczykowski
305*1b481fc3SMaciej Żenczykowski printf("TAH%d Registers\n", hdr->index);
306*1b481fc3SMaciej Żenczykowski printf("-----------------\n");
307*1b481fc3SMaciej Żenczykowski
308*1b481fc3SMaciej Żenczykowski printf("REVID = %08x MR = %08x TSR = %08x\n"
309*1b481fc3SMaciej Żenczykowski "SSR0 = %08x SSR1 = %08x SSR2 = %08x\n"
310*1b481fc3SMaciej Żenczykowski "SSR3 = %08x SSR4 = %08x SSR5 = %08x\n\n",
311*1b481fc3SMaciej Żenczykowski p->revid, p->mr, p->tsr,
312*1b481fc3SMaciej Żenczykowski p->ssr0, p->ssr1, p->ssr2, p->ssr3, p->ssr4, p->ssr5);
313*1b481fc3SMaciej Żenczykowski
314*1b481fc3SMaciej Żenczykowski return p + 1;
315*1b481fc3SMaciej Żenczykowski }
316*1b481fc3SMaciej Żenczykowski
ibm_emac_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)317*1b481fc3SMaciej Żenczykowski int ibm_emac_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
318*1b481fc3SMaciej Żenczykowski struct ethtool_regs *regs)
319*1b481fc3SMaciej Żenczykowski {
320*1b481fc3SMaciej Żenczykowski struct emac_ethtool_regs_hdr *hdr =
321*1b481fc3SMaciej Żenczykowski (struct emac_ethtool_regs_hdr *)regs->data;
322*1b481fc3SMaciej Żenczykowski void *buf = hdr + 1;
323*1b481fc3SMaciej Żenczykowski
324*1b481fc3SMaciej Żenczykowski buf = print_mal_regs(buf);
325*1b481fc3SMaciej Żenczykowski buf = print_emac_regs(buf);
326*1b481fc3SMaciej Żenczykowski if (hdr->components & EMAC_ETHTOOL_REGS_ZMII)
327*1b481fc3SMaciej Żenczykowski buf = print_zmii_regs(buf);
328*1b481fc3SMaciej Żenczykowski if (hdr->components & EMAC_ETHTOOL_REGS_RGMII)
329*1b481fc3SMaciej Żenczykowski buf = print_rgmii_regs(buf);
330*1b481fc3SMaciej Żenczykowski if (hdr->components & EMAC_ETHTOOL_REGS_TAH)
331*1b481fc3SMaciej Żenczykowski print_tah_regs(buf);
332*1b481fc3SMaciej Żenczykowski
333*1b481fc3SMaciej Żenczykowski return 0;
334*1b481fc3SMaciej Żenczykowski }
335