xref: /aosp_15_r20/external/ethtool/e100.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /* Copyright (c) 2002 Intel Corporation */
2*1b481fc3SMaciej Żenczykowski #include <stdio.h>
3*1b481fc3SMaciej Żenczykowski #include "internal.h"
4*1b481fc3SMaciej Żenczykowski 
5*1b481fc3SMaciej Żenczykowski #define D102_REV_ID		12
6*1b481fc3SMaciej Żenczykowski 
7*1b481fc3SMaciej Żenczykowski #define MDI_MDIX_CONFIG_IS_OK	0x0010
8*1b481fc3SMaciej Żenczykowski #define MDI_MDIX_STATUS		0x0020
9*1b481fc3SMaciej Żenczykowski 
10*1b481fc3SMaciej Żenczykowski #define SOFT_INT            	0x0200		/* Generate a S/W interrupt */
11*1b481fc3SMaciej Żenczykowski 
12*1b481fc3SMaciej Żenczykowski /* Interrupt masks */
13*1b481fc3SMaciej Żenczykowski #define ALL_INT_MASK        	0x0100		/* Mask interrupts */
14*1b481fc3SMaciej Żenczykowski #define FCP_INT_MASK        	0x0400		/* Flow Control Pause */
15*1b481fc3SMaciej Żenczykowski #define ER_INT_MASK         	0x0800		/* Early Receive */
16*1b481fc3SMaciej Żenczykowski #define RNR_INT_MASK        	0x1000		/* RU Not Ready */
17*1b481fc3SMaciej Żenczykowski #define CNA_INT_MASK        	0x2000		/* CU Not Active */
18*1b481fc3SMaciej Żenczykowski #define FR_INT_MASK         	0x4000		/* Frame Received */
19*1b481fc3SMaciej Żenczykowski #define CX_INT_MASK         	0x8000		/* CU eXecution w/ I-bit done */
20*1b481fc3SMaciej Żenczykowski 
21*1b481fc3SMaciej Żenczykowski /* Interrupts pending */
22*1b481fc3SMaciej Żenczykowski #define FCP_INT_PENDING         0x0100		/* Flow Control Pause */
23*1b481fc3SMaciej Żenczykowski #define ER_INT_PENDING          0x0200		/* Early Receive */
24*1b481fc3SMaciej Żenczykowski #define SWI_INT_PENDING         0x0400		/* S/W generated interrupt */
25*1b481fc3SMaciej Żenczykowski #define MDI_INT_PENDING         0x0800		/* MDI read or write done */
26*1b481fc3SMaciej Żenczykowski #define RNR_INT_PENDING         0x1000		/* RU Became Not Ready */
27*1b481fc3SMaciej Żenczykowski #define CNA_INT_PENDING         0x2000		/* CU Became Inactive (IDLE) */
28*1b481fc3SMaciej Żenczykowski #define FR_INT_PENDING          0x4000		/* RU Received A Frame */
29*1b481fc3SMaciej Żenczykowski #define CX_INT_PENDING          0x8000		/* CU Completed Action Cmd */
30*1b481fc3SMaciej Żenczykowski 
31*1b481fc3SMaciej Żenczykowski /* Status */
32*1b481fc3SMaciej Żenczykowski #define CU_STATUS		0x00C0
33*1b481fc3SMaciej Żenczykowski #define RU_STATUS		0x003C
34*1b481fc3SMaciej Żenczykowski 
35*1b481fc3SMaciej Żenczykowski /* Commands */
36*1b481fc3SMaciej Żenczykowski #define CU_CMD			0x00F0
37*1b481fc3SMaciej Żenczykowski #define RU_CMD			0x0007
38*1b481fc3SMaciej Żenczykowski 
e100_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)39*1b481fc3SMaciej Żenczykowski int e100_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
40*1b481fc3SMaciej Żenczykowski 		   struct ethtool_regs *regs)
41*1b481fc3SMaciej Żenczykowski {
42*1b481fc3SMaciej Żenczykowski 	u32 *regs_buff = (u32 *)regs->data;
43*1b481fc3SMaciej Żenczykowski 	u8 version = (u8)(regs->version >> 24);
44*1b481fc3SMaciej Żenczykowski 	u8 rev_id = (u8)(regs->version);
45*1b481fc3SMaciej Żenczykowski 	u8 regs_len = regs->len / sizeof(u32);
46*1b481fc3SMaciej Żenczykowski 	u32 reg;
47*1b481fc3SMaciej Żenczykowski 	u16 scb_status, scb_cmd;
48*1b481fc3SMaciej Żenczykowski 
49*1b481fc3SMaciej Żenczykowski 	if (version != 1)
50*1b481fc3SMaciej Żenczykowski 		return -1;
51*1b481fc3SMaciej Żenczykowski 
52*1b481fc3SMaciej Żenczykowski 	reg = regs_buff[0];
53*1b481fc3SMaciej Żenczykowski 	scb_status = reg & 0x0000ffff;
54*1b481fc3SMaciej Żenczykowski 	scb_cmd = reg >> 16;
55*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
56*1b481fc3SMaciej Żenczykowski 		"SCB Status Word (Lower Word)             0x%04X\n",
57*1b481fc3SMaciej Żenczykowski 		scb_status);
58*1b481fc3SMaciej Żenczykowski 
59*1b481fc3SMaciej Żenczykowski 	switch ((scb_status & RU_STATUS) >> 2) {
60*1b481fc3SMaciej Żenczykowski 	case 0:
61*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
62*1b481fc3SMaciej Żenczykowski 		"      RU Status:               Idle\n");
63*1b481fc3SMaciej Żenczykowski 		break;
64*1b481fc3SMaciej Żenczykowski 	case 1:
65*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
66*1b481fc3SMaciej Żenczykowski 		"      RU Status:               Suspended\n");
67*1b481fc3SMaciej Żenczykowski 		break;
68*1b481fc3SMaciej Żenczykowski 	case 2:
69*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
70*1b481fc3SMaciej Żenczykowski 		"      RU Status:               No Resources\n");
71*1b481fc3SMaciej Żenczykowski 		break;
72*1b481fc3SMaciej Żenczykowski 	case 4:
73*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
74*1b481fc3SMaciej Żenczykowski 		"      RU Status:               Ready\n");
75*1b481fc3SMaciej Żenczykowski 		break;
76*1b481fc3SMaciej Żenczykowski 	case 9:
77*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
78*1b481fc3SMaciej Żenczykowski 		"      RU Status:               Suspended with no more RBDs\n");
79*1b481fc3SMaciej Żenczykowski 		break;
80*1b481fc3SMaciej Żenczykowski 	case 10:
81*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
82*1b481fc3SMaciej Żenczykowski 		"      RU Status:               No Resources due to no more RBDs\n");
83*1b481fc3SMaciej Żenczykowski 		break;
84*1b481fc3SMaciej Żenczykowski 	case 12:
85*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
86*1b481fc3SMaciej Żenczykowski 		"      RU Status:               Ready with no RBDs present\n");
87*1b481fc3SMaciej Żenczykowski 		break;
88*1b481fc3SMaciej Żenczykowski 	default:
89*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
90*1b481fc3SMaciej Żenczykowski 		"      RU Status:               Unknown State\n");
91*1b481fc3SMaciej Żenczykowski 		break;
92*1b481fc3SMaciej Żenczykowski 	}
93*1b481fc3SMaciej Żenczykowski 
94*1b481fc3SMaciej Żenczykowski 	switch ((scb_status & CU_STATUS) >> 6) {
95*1b481fc3SMaciej Żenczykowski 	case 0:
96*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
97*1b481fc3SMaciej Żenczykowski 		"      CU Status:               Idle\n");
98*1b481fc3SMaciej Żenczykowski 		break;
99*1b481fc3SMaciej Żenczykowski 	case 1:
100*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
101*1b481fc3SMaciej Żenczykowski 		"      CU Status:               Suspended\n");
102*1b481fc3SMaciej Żenczykowski 		break;
103*1b481fc3SMaciej Żenczykowski         case 2:
104*1b481fc3SMaciej Żenczykowski                 fprintf(stdout,
105*1b481fc3SMaciej Żenczykowski                 "      CU Status:              Active\n");
106*1b481fc3SMaciej Żenczykowski                 break;
107*1b481fc3SMaciej Żenczykowski 	default:
108*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
109*1b481fc3SMaciej Żenczykowski 		"      CU Status:               Unknown State\n");
110*1b481fc3SMaciej Żenczykowski 		break;
111*1b481fc3SMaciej Żenczykowski 	}
112*1b481fc3SMaciej Żenczykowski 
113*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
114*1b481fc3SMaciej Żenczykowski 	        "      ---- Interrupts Pending ----\n"
115*1b481fc3SMaciej Żenczykowski 		"      Flow Control Pause:                %s\n"
116*1b481fc3SMaciej Żenczykowski 		"      Early Receive:                     %s\n"
117*1b481fc3SMaciej Żenczykowski 		"      Software Generated Interrupt:      %s\n"
118*1b481fc3SMaciej Żenczykowski 		"      MDI Done:                          %s\n"
119*1b481fc3SMaciej Żenczykowski 		"      RU Not In Ready State:             %s\n"
120*1b481fc3SMaciej Żenczykowski 		"      CU Not in Active State:            %s\n"
121*1b481fc3SMaciej Żenczykowski 		"      RU Received Frame:                 %s\n"
122*1b481fc3SMaciej Żenczykowski 		"      CU Completed Command:              %s\n",
123*1b481fc3SMaciej Żenczykowski 		scb_status & FCP_INT_PENDING     ? "yes"     : "no",
124*1b481fc3SMaciej Żenczykowski 		scb_status & ER_INT_PENDING      ? "yes"     : "no",
125*1b481fc3SMaciej Żenczykowski 		scb_status & SWI_INT_PENDING     ? "yes"     : "no",
126*1b481fc3SMaciej Żenczykowski 		scb_status & MDI_INT_PENDING     ? "yes"     : "no",
127*1b481fc3SMaciej Żenczykowski 		scb_status & RNR_INT_PENDING     ? "yes"     : "no",
128*1b481fc3SMaciej Żenczykowski 		scb_status & CNA_INT_PENDING     ? "yes"     : "no",
129*1b481fc3SMaciej Żenczykowski 		scb_status & FR_INT_PENDING      ? "yes"     : "no",
130*1b481fc3SMaciej Żenczykowski 		scb_status & CX_INT_PENDING      ? "yes"     : "no");
131*1b481fc3SMaciej Żenczykowski 
132*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
133*1b481fc3SMaciej Żenczykowski 		"SCB Command Word (Upper Word)            0x%04X\n",
134*1b481fc3SMaciej Żenczykowski 		scb_cmd);
135*1b481fc3SMaciej Żenczykowski 
136*1b481fc3SMaciej Żenczykowski 	switch (scb_cmd & RU_CMD) {
137*1b481fc3SMaciej Żenczykowski 	case 0:
138*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
139*1b481fc3SMaciej Żenczykowski 		"      RU Command:              No Command\n");
140*1b481fc3SMaciej Żenczykowski 		break;
141*1b481fc3SMaciej Żenczykowski 	case 1:
142*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
143*1b481fc3SMaciej Żenczykowski 		"      RU Command:              RU Start\n");
144*1b481fc3SMaciej Żenczykowski 		break;
145*1b481fc3SMaciej Żenczykowski 	case 2:
146*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
147*1b481fc3SMaciej Żenczykowski 		"      RU Command:              RU Resume\n");
148*1b481fc3SMaciej Żenczykowski 		break;
149*1b481fc3SMaciej Żenczykowski 	case 4:
150*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
151*1b481fc3SMaciej Żenczykowski 		"      RU Command:              RU Abort\n");
152*1b481fc3SMaciej Żenczykowski 		break;
153*1b481fc3SMaciej Żenczykowski 	case 6:
154*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
155*1b481fc3SMaciej Żenczykowski 		"      RU Command:              Load RU Base\n");
156*1b481fc3SMaciej Żenczykowski 		break;
157*1b481fc3SMaciej Żenczykowski 	default:
158*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
159*1b481fc3SMaciej Żenczykowski 		"      RU Command:              Unknown\n");
160*1b481fc3SMaciej Żenczykowski 		break;
161*1b481fc3SMaciej Żenczykowski 	}
162*1b481fc3SMaciej Żenczykowski 
163*1b481fc3SMaciej Żenczykowski 	switch ((scb_cmd & CU_CMD) >> 4) {
164*1b481fc3SMaciej Żenczykowski 	case 0:
165*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
166*1b481fc3SMaciej Żenczykowski 		"      CU Command:              No Command\n");
167*1b481fc3SMaciej Żenczykowski 		break;
168*1b481fc3SMaciej Żenczykowski 	case 1:
169*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
170*1b481fc3SMaciej Żenczykowski 		"      CU Command:              CU Start\n");
171*1b481fc3SMaciej Żenczykowski 		break;
172*1b481fc3SMaciej Żenczykowski 	case 2:
173*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
174*1b481fc3SMaciej Żenczykowski 		"      CU Command:              CU Resume\n");
175*1b481fc3SMaciej Żenczykowski 		break;
176*1b481fc3SMaciej Żenczykowski 	case 4:
177*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
178*1b481fc3SMaciej Żenczykowski 		"      CU Command:              Load Dump Counters Address\n");
179*1b481fc3SMaciej Żenczykowski 		break;
180*1b481fc3SMaciej Żenczykowski 	case 5:
181*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
182*1b481fc3SMaciej Żenczykowski 		"      CU Command:              Dump Counters\n");
183*1b481fc3SMaciej Żenczykowski 		break;
184*1b481fc3SMaciej Żenczykowski 	case 6:
185*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
186*1b481fc3SMaciej Żenczykowski 		"      CU Command:              Load CU Base\n");
187*1b481fc3SMaciej Żenczykowski 		break;
188*1b481fc3SMaciej Żenczykowski 	case 7:
189*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
190*1b481fc3SMaciej Żenczykowski 		"      CU Command:              Dump & Reset Counters\n");
191*1b481fc3SMaciej Żenczykowski 		break;
192*1b481fc3SMaciej Żenczykowski 	default:
193*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
194*1b481fc3SMaciej Żenczykowski 		"      CU Command:              Unknown\n");
195*1b481fc3SMaciej Żenczykowski 		break;
196*1b481fc3SMaciej Żenczykowski 	}
197*1b481fc3SMaciej Żenczykowski 
198*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
199*1b481fc3SMaciej Żenczykowski 		"      Software Generated Interrupt:      %s\n",
200*1b481fc3SMaciej Żenczykowski 		scb_cmd & SOFT_INT     ? "yes"     : "no");
201*1b481fc3SMaciej Żenczykowski 
202*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
203*1b481fc3SMaciej Żenczykowski 	        "      ---- Interrupts Masked ----\n"
204*1b481fc3SMaciej Żenczykowski 		"      ALL Interrupts:                    %s\n"
205*1b481fc3SMaciej Żenczykowski 		"      Flow Control Pause:                %s\n"
206*1b481fc3SMaciej Żenczykowski 		"      Early Receive:                     %s\n"
207*1b481fc3SMaciej Żenczykowski 		"      RU Not In Ready State:             %s\n"
208*1b481fc3SMaciej Żenczykowski 		"      CU Not in Active State:            %s\n"
209*1b481fc3SMaciej Żenczykowski 		"      RU Received Frame:                 %s\n"
210*1b481fc3SMaciej Żenczykowski 		"      CU Completed Command:              %s\n",
211*1b481fc3SMaciej Żenczykowski 		scb_cmd & ALL_INT_MASK     ? "yes"     : "no",
212*1b481fc3SMaciej Żenczykowski 		scb_cmd & FCP_INT_MASK     ? "yes"     : "no",
213*1b481fc3SMaciej Żenczykowski 		scb_cmd & ER_INT_MASK      ? "yes"     : "no",
214*1b481fc3SMaciej Żenczykowski 		scb_cmd & RNR_INT_MASK     ? "yes"     : "no",
215*1b481fc3SMaciej Żenczykowski 		scb_cmd & CNA_INT_MASK     ? "yes"     : "no",
216*1b481fc3SMaciej Żenczykowski 		scb_cmd & FR_INT_MASK      ? "yes"     : "no",
217*1b481fc3SMaciej Żenczykowski 		scb_cmd & CX_INT_MASK      ? "yes"     : "no");
218*1b481fc3SMaciej Żenczykowski 
219*1b481fc3SMaciej Żenczykowski 	if(regs_len > 1) {
220*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "MDI/MDI-X Status:                        ");
221*1b481fc3SMaciej Żenczykowski 		if(rev_id < D102_REV_ID)
222*1b481fc3SMaciej Żenczykowski 			fprintf(stdout, "MDI\n");
223*1b481fc3SMaciej Żenczykowski 		else {
224*1b481fc3SMaciej Żenczykowski 			u16 ctrl_reg = regs_buff[1];
225*1b481fc3SMaciej Żenczykowski 
226*1b481fc3SMaciej Żenczykowski 			if(ctrl_reg & MDI_MDIX_CONFIG_IS_OK) {
227*1b481fc3SMaciej Żenczykowski 				if(ctrl_reg & MDI_MDIX_STATUS)
228*1b481fc3SMaciej Żenczykowski 					fprintf(stdout, "MDI-X\n");
229*1b481fc3SMaciej Żenczykowski 				else
230*1b481fc3SMaciej Żenczykowski 					fprintf(stdout, "MDI\n");
231*1b481fc3SMaciej Żenczykowski 			} else
232*1b481fc3SMaciej Żenczykowski 				fprintf(stdout, "Unknown\n");
233*1b481fc3SMaciej Żenczykowski 		}
234*1b481fc3SMaciej Żenczykowski 	}
235*1b481fc3SMaciej Żenczykowski 
236*1b481fc3SMaciej Żenczykowski 	return 0;
237*1b481fc3SMaciej Żenczykowski }
238*1b481fc3SMaciej Żenczykowski 
239