xref: /aosp_15_r20/external/ethtool/marvell.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski  * Code to dump Marvell SysKonnect registers for skge and sky2 drivers.
3*1b481fc3SMaciej Żenczykowski  *
4*1b481fc3SMaciej Żenczykowski  * Copyright (C) 2004, 2006
5*1b481fc3SMaciej Żenczykowski  *  Stephen Hemminger <[email protected]>
6*1b481fc3SMaciej Żenczykowski  */
7*1b481fc3SMaciej Żenczykowski 
8*1b481fc3SMaciej Żenczykowski #include <stdio.h>
9*1b481fc3SMaciej Żenczykowski 
10*1b481fc3SMaciej Żenczykowski #include "internal.h"
11*1b481fc3SMaciej Żenczykowski 
dump_addr(int n,const u8 * a)12*1b481fc3SMaciej Żenczykowski static void dump_addr(int n, const u8 *a)
13*1b481fc3SMaciej Żenczykowski {
14*1b481fc3SMaciej Żenczykowski 	int i;
15*1b481fc3SMaciej Żenczykowski 
16*1b481fc3SMaciej Żenczykowski 	printf("Addr %d            ", n);
17*1b481fc3SMaciej Żenczykowski 	for (i = 0; i < 6; i++)
18*1b481fc3SMaciej Żenczykowski 		printf("%02X%c", a[i], i == 5 ? '\n' : ' ');
19*1b481fc3SMaciej Żenczykowski }
20*1b481fc3SMaciej Żenczykowski 
dump_timer(const char * name,const void * p)21*1b481fc3SMaciej Żenczykowski static void dump_timer(const char *name, const void *p)
22*1b481fc3SMaciej Żenczykowski {
23*1b481fc3SMaciej Żenczykowski 	const u8 *a = p;
24*1b481fc3SMaciej Żenczykowski 	const u32 *r = p;
25*1b481fc3SMaciej Żenczykowski 
26*1b481fc3SMaciej Żenczykowski 	printf("%s\n", name);
27*1b481fc3SMaciej Żenczykowski 	printf("\tInit 0x%08X Value 0x%08X\n", r[0], r[1]);
28*1b481fc3SMaciej Żenczykowski 	printf("\tTest 0x%02X       Control 0x%02X\n", a[8], a[9]);
29*1b481fc3SMaciej Żenczykowski }
30*1b481fc3SMaciej Żenczykowski 
dump_queue(const char * name,const void * a,int rx)31*1b481fc3SMaciej Żenczykowski static void dump_queue(const char *name, const void *a, int rx)
32*1b481fc3SMaciej Żenczykowski {
33*1b481fc3SMaciej Żenczykowski 	struct desc {
34*1b481fc3SMaciej Żenczykowski 		uint32_t		ctl;
35*1b481fc3SMaciej Żenczykowski 		uint32_t		next;
36*1b481fc3SMaciej Żenczykowski 		uint32_t		data_lo;
37*1b481fc3SMaciej Żenczykowski 		uint32_t		data_hi;
38*1b481fc3SMaciej Żenczykowski 		uint32_t		status;
39*1b481fc3SMaciej Żenczykowski 		uint32_t		timestamp;
40*1b481fc3SMaciej Żenczykowski 		uint16_t		csum2;
41*1b481fc3SMaciej Żenczykowski 		uint16_t		csum1;
42*1b481fc3SMaciej Żenczykowski 		uint16_t		csum2_start;
43*1b481fc3SMaciej Żenczykowski 		uint16_t		csum1_start;
44*1b481fc3SMaciej Żenczykowski 		uint32_t		addr_lo;
45*1b481fc3SMaciej Żenczykowski 		uint32_t		addr_hi;
46*1b481fc3SMaciej Żenczykowski 		uint32_t		count_lo;
47*1b481fc3SMaciej Żenczykowski 		uint32_t		count_hi;
48*1b481fc3SMaciej Żenczykowski 		uint32_t		byte_count;
49*1b481fc3SMaciej Żenczykowski 		uint32_t		csr;
50*1b481fc3SMaciej Żenczykowski 		uint32_t		flag;
51*1b481fc3SMaciej Żenczykowski 	};
52*1b481fc3SMaciej Żenczykowski 	const struct desc *d = a;
53*1b481fc3SMaciej Żenczykowski 
54*1b481fc3SMaciej Żenczykowski 	/* is reset bit set? */
55*1b481fc3SMaciej Żenczykowski 	if (!(d->ctl & 2)) {
56*1b481fc3SMaciej Żenczykowski 		printf("\n%s (disabled)\n", name);
57*1b481fc3SMaciej Żenczykowski 		return;
58*1b481fc3SMaciej Żenczykowski 	}
59*1b481fc3SMaciej Żenczykowski 
60*1b481fc3SMaciej Żenczykowski 	printf("\n%s\n", name);
61*1b481fc3SMaciej Żenczykowski 	printf("---------------\n");
62*1b481fc3SMaciej Żenczykowski 	printf("Descriptor Address       0x%08X%08X\n",
63*1b481fc3SMaciej Żenczykowski 	       d->addr_hi, d->addr_lo);
64*1b481fc3SMaciej Żenczykowski 	printf("Address Counter          0x%08X%08X\n",
65*1b481fc3SMaciej Żenczykowski 	       d->count_hi, d->count_lo);
66*1b481fc3SMaciej Żenczykowski 	printf("Current Byte Counter             %d\n", d->byte_count);
67*1b481fc3SMaciej Żenczykowski 	printf("BMU Control/Status               0x%08X\n", d->csr);
68*1b481fc3SMaciej Żenczykowski 	printf("Flag & FIFO Address              0x%08X\n", d->flag);
69*1b481fc3SMaciej Żenczykowski 	printf("\n");
70*1b481fc3SMaciej Żenczykowski 	printf("Control                          0x%08X\n", d->ctl);
71*1b481fc3SMaciej Żenczykowski 	printf("Next                             0x%08X\n", d->next);
72*1b481fc3SMaciej Żenczykowski 	printf("Data                     0x%08X%08X\n",
73*1b481fc3SMaciej Żenczykowski 	       d->data_hi, d->data_lo);
74*1b481fc3SMaciej Żenczykowski 	printf("Status                           0x%08X\n", d->status);
75*1b481fc3SMaciej Żenczykowski 	printf("Timestamp                        0x%08X\n", d->timestamp);
76*1b481fc3SMaciej Żenczykowski 	if (rx) {
77*1b481fc3SMaciej Żenczykowski 		printf("Csum1      Offset %4d Position  %d\n",
78*1b481fc3SMaciej Żenczykowski 		       d->csum1, d->csum1_start);
79*1b481fc3SMaciej Żenczykowski 		printf("Csum2      Offset %4d Position  %d\n",
80*1b481fc3SMaciej Żenczykowski 		       d->csum2, d->csum2_start);
81*1b481fc3SMaciej Żenczykowski 	} else
82*1b481fc3SMaciej Żenczykowski 		printf("Csum Start 0x%04X Pos %4d Write %d\n",
83*1b481fc3SMaciej Żenczykowski 		       d->csum1, d->csum2_start, d->csum1_start);
84*1b481fc3SMaciej Żenczykowski 
85*1b481fc3SMaciej Żenczykowski }
86*1b481fc3SMaciej Żenczykowski 
dump_ram(const char * name,const void * p)87*1b481fc3SMaciej Żenczykowski static void dump_ram(const char *name, const void *p)
88*1b481fc3SMaciej Żenczykowski {
89*1b481fc3SMaciej Żenczykowski 	const u32 *r = p;
90*1b481fc3SMaciej Żenczykowski 
91*1b481fc3SMaciej Żenczykowski 	if (!(r[10] & 2)) {
92*1b481fc3SMaciej Żenczykowski 		printf("\n%s (disabled)\n", name);
93*1b481fc3SMaciej Żenczykowski 		return;
94*1b481fc3SMaciej Żenczykowski 	}
95*1b481fc3SMaciej Żenczykowski 
96*1b481fc3SMaciej Żenczykowski 	printf("\n%s\n", name);
97*1b481fc3SMaciej Żenczykowski 	printf("---------------\n");
98*1b481fc3SMaciej Żenczykowski 	printf("Start Address                    0x%08X\n", r[0]);
99*1b481fc3SMaciej Żenczykowski 	printf("End Address                      0x%08X\n", r[1]);
100*1b481fc3SMaciej Żenczykowski 	printf("Write Pointer                    0x%08X\n", r[2]);
101*1b481fc3SMaciej Żenczykowski 	printf("Read Pointer                     0x%08X\n", r[3]);
102*1b481fc3SMaciej Żenczykowski 
103*1b481fc3SMaciej Żenczykowski 	if (*name == 'R') { /* Receive only */
104*1b481fc3SMaciej Żenczykowski 		printf("Upper Threshold/Pause Packets    0x%08X\n", r[4]);
105*1b481fc3SMaciej Żenczykowski 		printf("Lower Threshold/Pause Packets    0x%08X\n", r[5]);
106*1b481fc3SMaciej Żenczykowski 		printf("Upper Threshold/High Priority    0x%08X\n", r[6]);
107*1b481fc3SMaciej Żenczykowski 		printf("Lower Threshold/High Priority    0x%08X\n", r[7]);
108*1b481fc3SMaciej Żenczykowski 	}
109*1b481fc3SMaciej Żenczykowski 	printf("Packet Counter                   0x%08X\n", r[8]);
110*1b481fc3SMaciej Żenczykowski 	printf("Level                            0x%08X\n", r[9]);
111*1b481fc3SMaciej Żenczykowski 	printf("Control                          0x%08X\n", r[10]);
112*1b481fc3SMaciej Żenczykowski }
113*1b481fc3SMaciej Żenczykowski 
dump_fifo(const char * name,const void * p)114*1b481fc3SMaciej Żenczykowski static void dump_fifo(const char *name, const void *p)
115*1b481fc3SMaciej Żenczykowski {
116*1b481fc3SMaciej Żenczykowski 	const u32 *r = p;
117*1b481fc3SMaciej Żenczykowski 
118*1b481fc3SMaciej Żenczykowski 	printf("\n%s\n", name);
119*1b481fc3SMaciej Żenczykowski 	printf("---------------\n");
120*1b481fc3SMaciej Żenczykowski 	printf("End Address                      0x%08X\n", r[0]);
121*1b481fc3SMaciej Żenczykowski 	printf("Write Pointer                    0x%08X\n", r[1]);
122*1b481fc3SMaciej Żenczykowski 	printf("Read Pointer                     0x%08X\n", r[2]);
123*1b481fc3SMaciej Żenczykowski 	printf("Packet Counter                   0x%08X\n", r[3]);
124*1b481fc3SMaciej Żenczykowski 	printf("Level                            0x%08X\n", r[4]);
125*1b481fc3SMaciej Żenczykowski 	printf("Control                          0x%08X\n", r[5]);
126*1b481fc3SMaciej Żenczykowski 	printf("Control/Test                     0x%08X\n", r[6]);
127*1b481fc3SMaciej Żenczykowski 	dump_timer("LED", r + 8);
128*1b481fc3SMaciej Żenczykowski }
129*1b481fc3SMaciej Żenczykowski 
dump_gmac_fifo(const char * name,const void * p)130*1b481fc3SMaciej Żenczykowski static void dump_gmac_fifo(const char *name, const void *p)
131*1b481fc3SMaciej Żenczykowski {
132*1b481fc3SMaciej Żenczykowski 	const u32 *r = p;
133*1b481fc3SMaciej Żenczykowski 	unsigned int i;
134*1b481fc3SMaciej Żenczykowski 	static const char *regs[] = {
135*1b481fc3SMaciej Żenczykowski 		"End Address",
136*1b481fc3SMaciej Żenczykowski 		"Almost Full Thresh",
137*1b481fc3SMaciej Żenczykowski 		"Control/Test",
138*1b481fc3SMaciej Żenczykowski 		"FIFO Flush Mask",
139*1b481fc3SMaciej Żenczykowski 		"FIFO Flush Threshold",
140*1b481fc3SMaciej Żenczykowski 		"Truncation Threshold",
141*1b481fc3SMaciej Żenczykowski 		"Upper Pause Threshold",
142*1b481fc3SMaciej Żenczykowski 		"Lower Pause Threshold",
143*1b481fc3SMaciej Żenczykowski 		"VLAN Tag",
144*1b481fc3SMaciej Żenczykowski 		"FIFO Write Pointer",
145*1b481fc3SMaciej Żenczykowski 		"FIFO Write Level",
146*1b481fc3SMaciej Żenczykowski 		"FIFO Read Pointer",
147*1b481fc3SMaciej Żenczykowski 		"FIFO Read Level",
148*1b481fc3SMaciej Żenczykowski 	};
149*1b481fc3SMaciej Żenczykowski 
150*1b481fc3SMaciej Żenczykowski 	printf("\n%s\n", name);
151*1b481fc3SMaciej Żenczykowski 	for (i = 0; i < sizeof(regs)/sizeof(regs[0]); ++i)
152*1b481fc3SMaciej Żenczykowski 		printf("%-32s 0x%08X\n", regs[i], r[i]);
153*1b481fc3SMaciej Żenczykowski 
154*1b481fc3SMaciej Żenczykowski }
155*1b481fc3SMaciej Żenczykowski 
dump_mac(const u8 * r)156*1b481fc3SMaciej Żenczykowski static void dump_mac(const u8 *r)
157*1b481fc3SMaciej Żenczykowski {
158*1b481fc3SMaciej Żenczykowski 	u8 id;
159*1b481fc3SMaciej Żenczykowski 
160*1b481fc3SMaciej Żenczykowski 	printf("\nMAC Addresses\n");
161*1b481fc3SMaciej Żenczykowski 	printf("---------------\n");
162*1b481fc3SMaciej Żenczykowski 	dump_addr(1, r + 0x100);
163*1b481fc3SMaciej Żenczykowski 	dump_addr(2, r + 0x108);
164*1b481fc3SMaciej Żenczykowski 	dump_addr(3, r + 0x110);
165*1b481fc3SMaciej Żenczykowski 	printf("\n");
166*1b481fc3SMaciej Żenczykowski 
167*1b481fc3SMaciej Żenczykowski 	printf("Connector type               0x%02X (%c)\n",
168*1b481fc3SMaciej Żenczykowski 	       r[0x118], (char)r[0x118]);
169*1b481fc3SMaciej Żenczykowski 	printf("PMD type                     0x%02X (%c)\n",
170*1b481fc3SMaciej Żenczykowski 	       r[0x119], (char)r[0x119]);
171*1b481fc3SMaciej Żenczykowski 	printf("PHY type                     0x%02X\n", r[0x11d]);
172*1b481fc3SMaciej Żenczykowski 
173*1b481fc3SMaciej Żenczykowski 	id = r[0x11b];
174*1b481fc3SMaciej Żenczykowski 	printf("Chip Id                      0x%02X ", id);
175*1b481fc3SMaciej Żenczykowski 
176*1b481fc3SMaciej Żenczykowski 	switch (id) {
177*1b481fc3SMaciej Żenczykowski 	case 0x0a:	printf("Genesis");	break;
178*1b481fc3SMaciej Żenczykowski 	case 0xb0:	printf("Yukon");	break;
179*1b481fc3SMaciej Żenczykowski 	case 0xb1:	printf("Yukon-Lite");	break;
180*1b481fc3SMaciej Żenczykowski 	case 0xb2:	printf("Yukon-LP");	break;
181*1b481fc3SMaciej Żenczykowski 	case 0xb3:	printf("Yukon-2 XL");	break;
182*1b481fc3SMaciej Żenczykowski 	case 0xb5:	printf("Yukon Extreme"); break;
183*1b481fc3SMaciej Żenczykowski 	case 0xb4:	printf("Yukon-2 EC Ultra");	break;
184*1b481fc3SMaciej Żenczykowski 	case 0xb6:	printf("Yukon-2 EC");	break;
185*1b481fc3SMaciej Żenczykowski  	case 0xb7:	printf("Yukon-2 FE");	break;
186*1b481fc3SMaciej Żenczykowski 	case 0xb8:	printf("Yukon-2 FE Plus"); break;
187*1b481fc3SMaciej Żenczykowski 	case 0xb9:	printf("Yukon Supreme"); break;
188*1b481fc3SMaciej Żenczykowski 	case 0xba:	printf("Yukon Ultra 2"); break;
189*1b481fc3SMaciej Żenczykowski 	case 0xbc:	printf("Yukon Optima"); break;
190*1b481fc3SMaciej Żenczykowski 	default:	printf("(Unknown)");	break;
191*1b481fc3SMaciej Żenczykowski 	}
192*1b481fc3SMaciej Żenczykowski 
193*1b481fc3SMaciej Żenczykowski 	printf(" (rev %d)\n", (r[0x11a] & 0xf0) >> 4);
194*1b481fc3SMaciej Żenczykowski 
195*1b481fc3SMaciej Żenczykowski 	printf("Ram Buffer                   0x%02X\n", r[0x11c]);
196*1b481fc3SMaciej Żenczykowski 
197*1b481fc3SMaciej Żenczykowski }
198*1b481fc3SMaciej Żenczykowski 
dump_gma(const char * name,const u8 * r)199*1b481fc3SMaciej Żenczykowski static void dump_gma(const char *name, const u8 *r)
200*1b481fc3SMaciej Żenczykowski {
201*1b481fc3SMaciej Żenczykowski 	int i;
202*1b481fc3SMaciej Żenczykowski 
203*1b481fc3SMaciej Żenczykowski 	printf("%12s address: ", name);
204*1b481fc3SMaciej Żenczykowski 	for (i = 0; i < 3; i++) {
205*1b481fc3SMaciej Żenczykowski 		u16 a = *(u16 *)(r + i * 4);
206*1b481fc3SMaciej Żenczykowski 		printf(" %02X %02X", a & 0xff, (a >> 8) & 0xff);
207*1b481fc3SMaciej Żenczykowski 	}
208*1b481fc3SMaciej Żenczykowski 	printf("\n");
209*1b481fc3SMaciej Żenczykowski }
210*1b481fc3SMaciej Żenczykowski 
dump_gmac(const char * name,const u8 * data)211*1b481fc3SMaciej Żenczykowski static void dump_gmac(const char *name, const u8 *data)
212*1b481fc3SMaciej Żenczykowski {
213*1b481fc3SMaciej Żenczykowski 	printf("\n%s\n", name);
214*1b481fc3SMaciej Żenczykowski 
215*1b481fc3SMaciej Żenczykowski 	printf("Status                       0x%04X\n", *(u16 *) data);
216*1b481fc3SMaciej Żenczykowski 	printf("Control                      0x%04X\n", *(u16 *) (data + 4));
217*1b481fc3SMaciej Żenczykowski 	printf("Transmit                     0x%04X\n", *(u16 *) (data + 8));
218*1b481fc3SMaciej Żenczykowski 	printf("Receive                      0x%04X\n", *(u16 *) (data + 0xc));
219*1b481fc3SMaciej Żenczykowski 	printf("Transmit flow control        0x%04X\n", *(u16 *) (data + 0x10));
220*1b481fc3SMaciej Żenczykowski 	printf("Transmit parameter           0x%04X\n", *(u16 *) (data + 0x14));
221*1b481fc3SMaciej Żenczykowski 	printf("Serial mode                  0x%04X\n", *(u16 *) (data + 0x18));
222*1b481fc3SMaciej Żenczykowski 
223*1b481fc3SMaciej Żenczykowski 	dump_gma("Source", data + 0x1c);
224*1b481fc3SMaciej Żenczykowski 	dump_gma("Physical", data + 0x28);
225*1b481fc3SMaciej Żenczykowski }
226*1b481fc3SMaciej Żenczykowski 
dump_pci(const u8 * cfg)227*1b481fc3SMaciej Żenczykowski static void dump_pci(const u8 *cfg)
228*1b481fc3SMaciej Żenczykowski {
229*1b481fc3SMaciej Żenczykowski 	int i;
230*1b481fc3SMaciej Żenczykowski 
231*1b481fc3SMaciej Żenczykowski 	printf("\nPCI config\n----------\n");
232*1b481fc3SMaciej Żenczykowski 	for(i = 0; i < 0x80; i++) {
233*1b481fc3SMaciej Żenczykowski 		if (!(i & 15))
234*1b481fc3SMaciej Żenczykowski 			printf("%02x:", i);
235*1b481fc3SMaciej Żenczykowski 		printf(" %02x", cfg[i]);
236*1b481fc3SMaciej Żenczykowski 		if ((i & 15) == 15)
237*1b481fc3SMaciej Żenczykowski 			putchar('\n');
238*1b481fc3SMaciej Żenczykowski 	}
239*1b481fc3SMaciej Żenczykowski 	putchar('\n');
240*1b481fc3SMaciej Żenczykowski }
241*1b481fc3SMaciej Żenczykowski 
dump_control(u8 * r)242*1b481fc3SMaciej Żenczykowski static void dump_control(u8 *r)
243*1b481fc3SMaciej Żenczykowski {
244*1b481fc3SMaciej Żenczykowski 	printf("Control Registers\n");
245*1b481fc3SMaciej Żenczykowski 	printf("-----------------\n");
246*1b481fc3SMaciej Żenczykowski 
247*1b481fc3SMaciej Żenczykowski 	printf("Register Access Port             0x%02X\n", *r);
248*1b481fc3SMaciej Żenczykowski 	printf("LED Control/Status               0x%08X\n", *(u32 *) (r + 4));
249*1b481fc3SMaciej Żenczykowski 
250*1b481fc3SMaciej Żenczykowski 	printf("Interrupt Source                 0x%08X\n", *(u32 *) (r + 8));
251*1b481fc3SMaciej Żenczykowski 	printf("Interrupt Mask                   0x%08X\n", *(u32 *) (r + 0xc));
252*1b481fc3SMaciej Żenczykowski 	printf("Interrupt Hardware Error Source  0x%08X\n", *(u32 *) (r + 0x10));
253*1b481fc3SMaciej Żenczykowski 	printf("Interrupt Hardware Error Mask    0x%08X\n", *(u32 *) (r + 0x14));
254*1b481fc3SMaciej Żenczykowski 	printf("Interrupt Control                0x%08X\n", *(u32 *) (r + 0x2c));
255*1b481fc3SMaciej Żenczykowski 	printf("Interrupt Moderation Mask        0x%08X\n", *(u32 *) (r + 0x14c));
256*1b481fc3SMaciej Żenczykowski 	printf("Hardware Moderation Mask         0x%08X\n", *(u32 *) (r + 0x150));
257*1b481fc3SMaciej Żenczykowski 	dump_timer("Moderation Timer", r + 0x140);
258*1b481fc3SMaciej Żenczykowski 
259*1b481fc3SMaciej Żenczykowski 	printf("General Purpose  I/O             0x%08X\n", *(u32 *) (r + 0x15c));
260*1b481fc3SMaciej Żenczykowski }
261*1b481fc3SMaciej Żenczykowski 
skge_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)262*1b481fc3SMaciej Żenczykowski int skge_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
263*1b481fc3SMaciej Żenczykowski 		   struct ethtool_regs *regs)
264*1b481fc3SMaciej Żenczykowski {
265*1b481fc3SMaciej Żenczykowski 	const u32 *r = (const u32 *) regs->data;
266*1b481fc3SMaciej Żenczykowski 	int dual = !(regs->data[0x11a] & 1);
267*1b481fc3SMaciej Żenczykowski 
268*1b481fc3SMaciej Żenczykowski 	dump_pci(regs->data + 0x380);
269*1b481fc3SMaciej Żenczykowski 
270*1b481fc3SMaciej Żenczykowski 	dump_control(regs->data);
271*1b481fc3SMaciej Żenczykowski 
272*1b481fc3SMaciej Żenczykowski 	printf("\nBus Management Unit\n");
273*1b481fc3SMaciej Żenczykowski 	printf("-------------------\n");
274*1b481fc3SMaciej Żenczykowski 	printf("CSR Receive Queue 1              0x%08X\n", r[24]);
275*1b481fc3SMaciej Żenczykowski 	printf("CSR Sync Queue 1                 0x%08X\n", r[26]);
276*1b481fc3SMaciej Żenczykowski 	printf("CSR Async Queue 1                0x%08X\n", r[27]);
277*1b481fc3SMaciej Żenczykowski 	if (dual) {
278*1b481fc3SMaciej Żenczykowski 		printf("CSR Receive Queue 2              0x%08X\n", r[25]);
279*1b481fc3SMaciej Żenczykowski 		printf("CSR Async Queue 2                0x%08X\n", r[29]);
280*1b481fc3SMaciej Żenczykowski 		printf("CSR Sync Queue 2                 0x%08X\n", r[28]);
281*1b481fc3SMaciej Żenczykowski 	}
282*1b481fc3SMaciej Żenczykowski 
283*1b481fc3SMaciej Żenczykowski 	dump_mac(regs->data);
284*1b481fc3SMaciej Żenczykowski 	dump_gmac("GMAC 1", regs->data + 0x2800);
285*1b481fc3SMaciej Żenczykowski 
286*1b481fc3SMaciej Żenczykowski 	dump_timer("Timer", regs->data + 0x130);
287*1b481fc3SMaciej Żenczykowski 	dump_timer("Blink Source", regs->data +0x170);
288*1b481fc3SMaciej Żenczykowski 
289*1b481fc3SMaciej Żenczykowski 	dump_queue("Receive Queue 1", regs->data +0x400, 1);
290*1b481fc3SMaciej Żenczykowski 	dump_queue("Sync Transmit Queue 1", regs->data +0x600, 0);
291*1b481fc3SMaciej Żenczykowski 	dump_queue("Async Transmit Queue 1", regs->data +0x680, 0);
292*1b481fc3SMaciej Żenczykowski 
293*1b481fc3SMaciej Żenczykowski 	dump_ram("Receive RAMbuffer 1", regs->data+0x800);
294*1b481fc3SMaciej Żenczykowski 	dump_ram("Sync Transmit RAMbuffer 1", regs->data+0xa00);
295*1b481fc3SMaciej Żenczykowski 	dump_ram("Async Transmit RAMbuffer 1", regs->data+0xa80);
296*1b481fc3SMaciej Żenczykowski 
297*1b481fc3SMaciej Żenczykowski 	dump_fifo("Receive MAC FIFO 1", regs->data+0xc00);
298*1b481fc3SMaciej Żenczykowski 	dump_fifo("Transmit MAC FIFO 1", regs->data+0xd00);
299*1b481fc3SMaciej Żenczykowski 	if (dual) {
300*1b481fc3SMaciej Żenczykowski 		dump_gmac("GMAC 1", regs->data + 0x2800);
301*1b481fc3SMaciej Żenczykowski 
302*1b481fc3SMaciej Żenczykowski 		dump_queue("Receive Queue 2", regs->data +0x480, 1);
303*1b481fc3SMaciej Żenczykowski 		dump_queue("Async Transmit Queue 2", regs->data +0x780, 0);
304*1b481fc3SMaciej Żenczykowski 		dump_queue("Sync Transmit Queue 2", regs->data +0x700, 0);
305*1b481fc3SMaciej Żenczykowski 
306*1b481fc3SMaciej Żenczykowski 		dump_ram("Receive RAMbuffer 2", regs->data+0x880);
307*1b481fc3SMaciej Żenczykowski 		dump_ram("Sync Transmit RAMbuffer 2", regs->data+0xb00);
308*1b481fc3SMaciej Żenczykowski 		dump_ram("Async Transmit RAMbuffer 21", regs->data+0xb80);
309*1b481fc3SMaciej Żenczykowski 
310*1b481fc3SMaciej Żenczykowski 		dump_fifo("Receive MAC FIFO 2", regs->data+0xc80);
311*1b481fc3SMaciej Żenczykowski 		dump_fifo("Transmit MAC FIFO 2", regs->data+0xd80);
312*1b481fc3SMaciej Żenczykowski 	}
313*1b481fc3SMaciej Żenczykowski 
314*1b481fc3SMaciej Żenczykowski 	dump_timer("Descriptor Poll", regs->data+0xe00);
315*1b481fc3SMaciej Żenczykowski 	return 0;
316*1b481fc3SMaciej Żenczykowski 
317*1b481fc3SMaciej Żenczykowski }
318*1b481fc3SMaciej Żenczykowski 
dump_queue2(const char * name,void * a,int rx)319*1b481fc3SMaciej Żenczykowski static void dump_queue2(const char *name, void *a, int rx)
320*1b481fc3SMaciej Żenczykowski {
321*1b481fc3SMaciej Żenczykowski 	struct sky2_queue {
322*1b481fc3SMaciej Żenczykowski 		u16	buf_control;
323*1b481fc3SMaciej Żenczykowski 		u16	byte_count;
324*1b481fc3SMaciej Żenczykowski 		u32	rss;
325*1b481fc3SMaciej Żenczykowski 		u32	addr_lo, addr_hi;
326*1b481fc3SMaciej Żenczykowski 		u32	status;
327*1b481fc3SMaciej Żenczykowski 		u32	timestamp;
328*1b481fc3SMaciej Żenczykowski 		u16	csum1, csum2;
329*1b481fc3SMaciej Żenczykowski 		u16	csum1_start, csum2_start;
330*1b481fc3SMaciej Żenczykowski 		u16	length;
331*1b481fc3SMaciej Żenczykowski 		u16	vlan;
332*1b481fc3SMaciej Żenczykowski 		u16	rsvd1;
333*1b481fc3SMaciej Żenczykowski 		u16	done;
334*1b481fc3SMaciej Żenczykowski 		u32	req_lo, req_hi;
335*1b481fc3SMaciej Żenczykowski 		u16	rsvd2;
336*1b481fc3SMaciej Żenczykowski 		u16	req_count;
337*1b481fc3SMaciej Żenczykowski 		u32	csr;
338*1b481fc3SMaciej Żenczykowski 	} *d = a;
339*1b481fc3SMaciej Żenczykowski 
340*1b481fc3SMaciej Żenczykowski 	printf("\n%s\n", name);
341*1b481fc3SMaciej Żenczykowski 	printf("---------------\n");
342*1b481fc3SMaciej Żenczykowski 
343*1b481fc3SMaciej Żenczykowski 	printf("Buffer control                   0x%04X\n", d->buf_control);
344*1b481fc3SMaciej Żenczykowski 
345*1b481fc3SMaciej Żenczykowski 	printf("Byte Counter                     %d\n", d->byte_count);
346*1b481fc3SMaciej Żenczykowski 	printf("Descriptor Address               0x%08X%08X\n",
347*1b481fc3SMaciej Żenczykowski 	       d->addr_hi, d->addr_lo);
348*1b481fc3SMaciej Żenczykowski 	printf("Status                           0x%08X\n", d->status);
349*1b481fc3SMaciej Żenczykowski 	printf("Timestamp                        0x%08X\n", d->timestamp);
350*1b481fc3SMaciej Żenczykowski 	printf("BMU Control/Status               0x%08X\n", d->csr);
351*1b481fc3SMaciej Żenczykowski 	printf("Done                             0x%04X\n", d->done);
352*1b481fc3SMaciej Żenczykowski 	printf("Request                          0x%08X%08X\n",
353*1b481fc3SMaciej Żenczykowski 	       d->req_hi, d->req_lo);
354*1b481fc3SMaciej Żenczykowski 	if (rx) {
355*1b481fc3SMaciej Żenczykowski 		printf("Csum1      Offset %4d Position  %d\n",
356*1b481fc3SMaciej Żenczykowski 		       d->csum1, d->csum1_start);
357*1b481fc3SMaciej Żenczykowski 		printf("Csum2      Offset %4d Position  %d\n",
358*1b481fc3SMaciej Żenczykowski 		       d->csum2, d->csum2_start);
359*1b481fc3SMaciej Żenczykowski 	} else
360*1b481fc3SMaciej Żenczykowski 		printf("Csum Start 0x%04X Pos %4d Write %d\n",
361*1b481fc3SMaciej Żenczykowski 		       d->csum1, d->csum2_start, d->csum1_start);
362*1b481fc3SMaciej Żenczykowski }
363*1b481fc3SMaciej Żenczykowski 
dump_prefetch(const char * name,const void * r)364*1b481fc3SMaciej Żenczykowski static void dump_prefetch(const char *name, const void *r)
365*1b481fc3SMaciej Żenczykowski {
366*1b481fc3SMaciej Żenczykowski 	const u32 *reg = r;
367*1b481fc3SMaciej Żenczykowski 
368*1b481fc3SMaciej Żenczykowski 	printf("\n%s Prefetch\n", name);
369*1b481fc3SMaciej Żenczykowski 	printf("Control               0x%08X\n", reg[0]);
370*1b481fc3SMaciej Żenczykowski 	printf("Last Index            %u\n", reg[1]);
371*1b481fc3SMaciej Żenczykowski 	printf("Start Address         0x%08x%08x\n", reg[3], reg[2]);
372*1b481fc3SMaciej Żenczykowski 	if (*name == 'S') { /* Status unit */
373*1b481fc3SMaciej Żenczykowski 		printf("TX1 report            %u\n", reg[4]);
374*1b481fc3SMaciej Żenczykowski 		printf("TX2 report            %u\n", reg[5]);
375*1b481fc3SMaciej Żenczykowski 		printf("TX threshold          %u\n", reg[6]);
376*1b481fc3SMaciej Żenczykowski 		printf("Put Index             %u\n", reg[7]);
377*1b481fc3SMaciej Żenczykowski 	} else {
378*1b481fc3SMaciej Żenczykowski 		printf("Get Index             %u\n", reg[4]);
379*1b481fc3SMaciej Żenczykowski 		printf("Put Index             %u\n", reg[5]);
380*1b481fc3SMaciej Żenczykowski 	}
381*1b481fc3SMaciej Żenczykowski }
382*1b481fc3SMaciej Żenczykowski 
sky2_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)383*1b481fc3SMaciej Żenczykowski int sky2_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
384*1b481fc3SMaciej Żenczykowski 		   struct ethtool_regs *regs)
385*1b481fc3SMaciej Żenczykowski {
386*1b481fc3SMaciej Żenczykowski 	const u16 *r16 = (const u16 *) regs->data;
387*1b481fc3SMaciej Żenczykowski 	const u32 *r32 = (const u32 *) regs->data;
388*1b481fc3SMaciej Żenczykowski 	int dual;
389*1b481fc3SMaciej Żenczykowski 
390*1b481fc3SMaciej Żenczykowski 	dump_pci(regs->data + 0x1c00);
391*1b481fc3SMaciej Żenczykowski 
392*1b481fc3SMaciej Żenczykowski 	dump_control(regs->data);
393*1b481fc3SMaciej Żenczykowski 
394*1b481fc3SMaciej Żenczykowski 	printf("\nBus Management Unit\n");
395*1b481fc3SMaciej Żenczykowski 	printf("-------------------\n");
396*1b481fc3SMaciej Żenczykowski 	printf("CSR Receive Queue 1              0x%08X\n", r32[24]);
397*1b481fc3SMaciej Żenczykowski 	printf("CSR Sync Queue 1                 0x%08X\n", r32[26]);
398*1b481fc3SMaciej Żenczykowski 	printf("CSR Async Queue 1                0x%08X\n", r32[27]);
399*1b481fc3SMaciej Żenczykowski 
400*1b481fc3SMaciej Żenczykowski 	dual = (regs->data[0x11e] & 2) != 0;
401*1b481fc3SMaciej Żenczykowski 	if (dual) {
402*1b481fc3SMaciej Żenczykowski 		printf("CSR Receive Queue 2              0x%08X\n", r32[25]);
403*1b481fc3SMaciej Żenczykowski 		printf("CSR Async Queue 2                0x%08X\n", r32[29]);
404*1b481fc3SMaciej Żenczykowski 		printf("CSR Sync Queue 2                 0x%08X\n", r32[28]);
405*1b481fc3SMaciej Żenczykowski 	}
406*1b481fc3SMaciej Żenczykowski 
407*1b481fc3SMaciej Żenczykowski 	dump_mac(regs->data);
408*1b481fc3SMaciej Żenczykowski 
409*1b481fc3SMaciej Żenczykowski 	dump_prefetch("Status", regs->data + 0xe80);
410*1b481fc3SMaciej Żenczykowski 	dump_prefetch("Receive 1", regs->data + 0x450);
411*1b481fc3SMaciej Żenczykowski 	dump_prefetch("Transmit 1", regs->data + 0x450 + 0x280);
412*1b481fc3SMaciej Żenczykowski 
413*1b481fc3SMaciej Żenczykowski 	if (dual) {
414*1b481fc3SMaciej Żenczykowski 		dump_prefetch("Receive 2", regs->data + 0x450 + 0x80);
415*1b481fc3SMaciej Żenczykowski 		dump_prefetch("Transmit 2", regs->data + 0x450 + 0x380);
416*1b481fc3SMaciej Żenczykowski 	}
417*1b481fc3SMaciej Żenczykowski 
418*1b481fc3SMaciej Żenczykowski 	printf("\nStatus FIFO\n");
419*1b481fc3SMaciej Żenczykowski   	printf("\tWrite Pointer            0x%02X\n", regs->data[0xea0]);
420*1b481fc3SMaciej Żenczykowski   	printf("\tRead Pointer             0x%02X\n", regs->data[0xea4]);
421*1b481fc3SMaciej Żenczykowski   	printf("\tLevel                    0x%02X\n", regs->data[0xea8]);
422*1b481fc3SMaciej Żenczykowski   	printf("\tWatermark                0x%02X\n", regs->data[0xeac]);
423*1b481fc3SMaciej Żenczykowski   	printf("\tISR Watermark            0x%02X\n", regs->data[0xead]);
424*1b481fc3SMaciej Żenczykowski 
425*1b481fc3SMaciej Żenczykowski 	dump_timer("Status level", regs->data + 0xeb0);
426*1b481fc3SMaciej Żenczykowski 	dump_timer("TX status", regs->data + 0xec0);
427*1b481fc3SMaciej Żenczykowski 	dump_timer("ISR", regs->data + 0xed0);
428*1b481fc3SMaciej Żenczykowski 
429*1b481fc3SMaciej Żenczykowski 	printf("\nGMAC control             0x%04X\n", r32[0xf00 >> 2]);
430*1b481fc3SMaciej Żenczykowski 	printf("GPHY control             0x%04X\n", r32[0xf04 >> 2]);
431*1b481fc3SMaciej Żenczykowski 	printf("LINK control             0x%02hX\n", r16[0xf10 >> 1]);
432*1b481fc3SMaciej Żenczykowski 
433*1b481fc3SMaciej Żenczykowski 	dump_gmac("GMAC 1", regs->data + 0x2800);
434*1b481fc3SMaciej Żenczykowski 	dump_gmac_fifo("Rx GMAC 1", regs->data + 0xc40);
435*1b481fc3SMaciej Żenczykowski 	dump_gmac_fifo("Tx GMAC 1", regs->data + 0xd40);
436*1b481fc3SMaciej Żenczykowski 
437*1b481fc3SMaciej Żenczykowski 	dump_queue2("Receive Queue 1", regs->data +0x400, 1);
438*1b481fc3SMaciej Żenczykowski 	dump_queue("Sync Transmit Queue 1", regs->data +0x600, 0);
439*1b481fc3SMaciej Żenczykowski 	dump_queue2("Async Transmit Queue 1", regs->data +0x680, 0);
440*1b481fc3SMaciej Żenczykowski 
441*1b481fc3SMaciej Żenczykowski 	dump_ram("Receive RAMbuffer 1", regs->data+0x800);
442*1b481fc3SMaciej Żenczykowski 	dump_ram("Sync Transmit RAMbuffer 1", regs->data+0xa00);
443*1b481fc3SMaciej Żenczykowski 	dump_ram("Async Transmit RAMbuffer 1", regs->data+0xa80);
444*1b481fc3SMaciej Żenczykowski 
445*1b481fc3SMaciej Żenczykowski 	if (dual) {
446*1b481fc3SMaciej Żenczykowski 		dump_ram("Receive RAMbuffer 2", regs->data+0x880);
447*1b481fc3SMaciej Żenczykowski 		dump_ram("Sync Transmit RAMbuffer 2", regs->data+0xb00);
448*1b481fc3SMaciej Żenczykowski 		dump_ram("Async Transmit RAMbuffer 21", regs->data+0xb80);
449*1b481fc3SMaciej Żenczykowski 		dump_gmac("GMAC 2", regs->data + 0x3800);
450*1b481fc3SMaciej Żenczykowski 		dump_gmac_fifo("Rx GMAC 2", regs->data + 0xc40 + 128);
451*1b481fc3SMaciej Żenczykowski 		dump_gmac_fifo("Tx GMAC 2", regs->data + 0xd40 + 128);
452*1b481fc3SMaciej Żenczykowski 	}
453*1b481fc3SMaciej Żenczykowski 
454*1b481fc3SMaciej Żenczykowski 	return 0;
455*1b481fc3SMaciej Żenczykowski }
456