xref: /aosp_15_r20/external/ethtool/ibm_emac.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
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