1*1b481fc3SMaciej Żenczykowski /* Copyright 2001 Sun Microsystems ([email protected]) */
2*1b481fc3SMaciej Żenczykowski #include <stdio.h>
3*1b481fc3SMaciej Żenczykowski #include "internal.h"
4*1b481fc3SMaciej Żenczykowski
5*1b481fc3SMaciej Żenczykowski #define PCI_VENDOR_NATSEMI 0x100b
6*1b481fc3SMaciej Żenczykowski #define PCI_DEVICE_DP83815 0x0020
7*1b481fc3SMaciej Żenczykowski #define NATSEMI_MAGIC (PCI_VENDOR_NATSEMI | \
8*1b481fc3SMaciej Żenczykowski (PCI_DEVICE_DP83815<<16))
9*1b481fc3SMaciej Żenczykowski
10*1b481fc3SMaciej Żenczykowski /* register indices in the ethtool_regs->data */
11*1b481fc3SMaciej Żenczykowski #define REG_CR 0
12*1b481fc3SMaciej Żenczykowski #define BIT_CR_TXE (1<<0)
13*1b481fc3SMaciej Żenczykowski #define BIT_CR_RXE (1<<2)
14*1b481fc3SMaciej Żenczykowski #define BIT_CR_RST (1<<8)
15*1b481fc3SMaciej Żenczykowski #define REG_CFG 1
16*1b481fc3SMaciej Żenczykowski #define BIT_CFG_BEM (1<<0)
17*1b481fc3SMaciej Żenczykowski #define BIT_CFG_BROM_DIS (1<<2)
18*1b481fc3SMaciej Żenczykowski #define BIT_CFG_PHY_DIS (1<<9)
19*1b481fc3SMaciej Żenczykowski #define BIT_CFG_PHY_RST (1<<10)
20*1b481fc3SMaciej Żenczykowski #define BIT_CFG_EXT_PHY (1<<12)
21*1b481fc3SMaciej Żenczykowski #define BIT_CFG_ANEG_EN (1<<13)
22*1b481fc3SMaciej Żenczykowski #define BIT_CFG_ANEG_100 (1<<14)
23*1b481fc3SMaciej Żenczykowski #define BIT_CFG_ANEG_FDUP (1<<15)
24*1b481fc3SMaciej Żenczykowski #define BIT_CFG_PINT_ACEN (1<<17)
25*1b481fc3SMaciej Żenczykowski #define BIT_CFG_PHY_CFG (0x3f<<18)
26*1b481fc3SMaciej Żenczykowski #define BIT_CFG_ANEG_DN (1<<27)
27*1b481fc3SMaciej Żenczykowski #define BIT_CFG_POL (1<<28)
28*1b481fc3SMaciej Żenczykowski #define BIT_CFG_FDUP (1<<29)
29*1b481fc3SMaciej Żenczykowski #define BIT_CFG_SPEED100 (1<<30)
30*1b481fc3SMaciej Żenczykowski #define BIT_CFG_LNKSTS (1<<31)
31*1b481fc3SMaciej Żenczykowski
32*1b481fc3SMaciej Żenczykowski #define REG_MEAR 2
33*1b481fc3SMaciej Żenczykowski #define REG_PTSCR 3
34*1b481fc3SMaciej Żenczykowski #define BIT_PTSCR_EEBIST_FAIL (1<<0)
35*1b481fc3SMaciej Żenczykowski #define BIT_PTSCR_EELOAD_EN (1<<2)
36*1b481fc3SMaciej Żenczykowski #define BIT_PTSCR_RBIST_RXFFAIL (1<<3)
37*1b481fc3SMaciej Żenczykowski #define BIT_PTSCR_RBIST_TXFAIL (1<<4)
38*1b481fc3SMaciej Żenczykowski #define BIT_PTSCR_RBIST_RXFAIL (1<<5)
39*1b481fc3SMaciej Żenczykowski #define REG_ISR 4
40*1b481fc3SMaciej Żenczykowski #define REG_IMR 5
41*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXOK (1<<0)
42*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXOK "Rx Complete"
43*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXDESC (1<<1)
44*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXDESC "Rx Descriptor"
45*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXERR (1<<2)
46*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXERR "Rx Packet Error"
47*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXEARLY (1<<3)
48*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXEARLY "Rx Early Threshold"
49*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXIDLE (1<<4)
50*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXIDLE "Rx Idle"
51*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXORN (1<<5)
52*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXORN "Rx Overrun"
53*1b481fc3SMaciej Żenczykowski #define BIT_INTR_TXOK (1<<6)
54*1b481fc3SMaciej Żenczykowski #define NAME_INTR_TXOK "Tx Packet OK"
55*1b481fc3SMaciej Żenczykowski #define BIT_INTR_TXDESC (1<<7)
56*1b481fc3SMaciej Żenczykowski #define NAME_INTR_TXDESC "Tx Descriptor"
57*1b481fc3SMaciej Żenczykowski #define BIT_INTR_TXERR (1<<8)
58*1b481fc3SMaciej Żenczykowski #define NAME_INTR_TXERR "Tx Packet Error"
59*1b481fc3SMaciej Żenczykowski #define BIT_INTR_TXIDLE (1<<9)
60*1b481fc3SMaciej Żenczykowski #define NAME_INTR_TXIDLE "Tx Idle"
61*1b481fc3SMaciej Żenczykowski #define BIT_INTR_TXURN (1<<10)
62*1b481fc3SMaciej Żenczykowski #define NAME_INTR_TXURN "Tx Underrun"
63*1b481fc3SMaciej Żenczykowski #define BIT_INTR_MIB (1<<11)
64*1b481fc3SMaciej Żenczykowski #define NAME_INTR_MIB "MIB Service"
65*1b481fc3SMaciej Żenczykowski #define BIT_INTR_SWI (1<<12)
66*1b481fc3SMaciej Żenczykowski #define NAME_INTR_SWI "Software"
67*1b481fc3SMaciej Żenczykowski #define BIT_INTR_PME (1<<13)
68*1b481fc3SMaciej Żenczykowski #define NAME_INTR_PME "Power Management Event"
69*1b481fc3SMaciej Żenczykowski #define BIT_INTR_PHY (1<<14)
70*1b481fc3SMaciej Żenczykowski #define NAME_INTR_PHY "Phy"
71*1b481fc3SMaciej Żenczykowski #define BIT_INTR_HIBERR (1<<15)
72*1b481fc3SMaciej Żenczykowski #define NAME_INTR_HIBERR "High Bits Error"
73*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXSOVR (1<<16)
74*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXSOVR "Rx Status FIFO Overrun"
75*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RTABT (1<<20)
76*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RTABT "Received Target Abort"
77*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RMABT (1<<20)
78*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RMABT "Received Master Abort"
79*1b481fc3SMaciej Żenczykowski #define BIT_INTR_SSERR (1<<20)
80*1b481fc3SMaciej Żenczykowski #define NAME_INTR_SSERR "Signaled System Error"
81*1b481fc3SMaciej Żenczykowski #define BIT_INTR_DPERR (1<<20)
82*1b481fc3SMaciej Żenczykowski #define NAME_INTR_DPERR "Detected Parity Error"
83*1b481fc3SMaciej Żenczykowski #define BIT_INTR_RXRCMP (1<<20)
84*1b481fc3SMaciej Żenczykowski #define NAME_INTR_RXRCMP "Rx Reset Complete"
85*1b481fc3SMaciej Żenczykowski #define BIT_INTR_TXRCMP (1<<20)
86*1b481fc3SMaciej Żenczykowski #define NAME_INTR_TXRCMP "Tx Reset Complete"
87*1b481fc3SMaciej Żenczykowski #define REG_IER 6
88*1b481fc3SMaciej Żenczykowski #define BIT_IER_IE (1<<0)
89*1b481fc3SMaciej Żenczykowski #define REG_TXDP 8
90*1b481fc3SMaciej Żenczykowski #define REG_TXCFG 9
91*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_DRTH (0x3f<<0)
92*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_FLTH (0x3f<<8)
93*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_MXDMA (0x7<<20)
94*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_ATP (1<<28)
95*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_MLB (1<<29)
96*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_HBI (1<<30)
97*1b481fc3SMaciej Żenczykowski #define BIT_TXCFG_CSI (1<<31)
98*1b481fc3SMaciej Żenczykowski #define REG_RXDP 12
99*1b481fc3SMaciej Żenczykowski #define REG_RXCFG 13
100*1b481fc3SMaciej Żenczykowski #define BIT_RXCFG_DRTH (0x1f<<1)
101*1b481fc3SMaciej Żenczykowski #define BIT_RXCFG_MXDMA (0x7<<20)
102*1b481fc3SMaciej Żenczykowski #define BIT_RXCFG_ALP (1<<27)
103*1b481fc3SMaciej Żenczykowski #define BIT_RXCFG_ATX (1<<28)
104*1b481fc3SMaciej Żenczykowski #define BIT_RXCFG_ARP (1<<30)
105*1b481fc3SMaciej Żenczykowski #define BIT_RXCFG_AEP (1<<31)
106*1b481fc3SMaciej Żenczykowski #define REG_CCSR 15
107*1b481fc3SMaciej Żenczykowski #define BIT_CCSR_CLKRUN_EN (1<<0)
108*1b481fc3SMaciej Żenczykowski #define BIT_CCSR_PMEEN (1<<8)
109*1b481fc3SMaciej Żenczykowski #define BIT_CCSR_PMESTS (1<<15)
110*1b481fc3SMaciej Żenczykowski #define REG_WCSR 16
111*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKPHY (1<<0)
112*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKUCP (1<<1)
113*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKMCP (1<<2)
114*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKBCP (1<<3)
115*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKARP (1<<4)
116*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKPAT0 (1<<5)
117*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKPAT1 (1<<6)
118*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKPAT2 (1<<7)
119*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKPAT3 (1<<8)
120*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_WKMAG (1<<9)
121*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_MPSOE (1<<10)
122*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_SOHACK (1<<20)
123*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_PHYINT (1<<22)
124*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_UCASTR (1<<23)
125*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_MCASTR (1<<24)
126*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_BCASTR (1<<25)
127*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_ARPR (1<<26)
128*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_PATM0 (1<<27)
129*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_PATM1 (1<<28)
130*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_PATM2 (1<<29)
131*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_PATM3 (1<<30)
132*1b481fc3SMaciej Żenczykowski #define BIT_WCSR_MPR (1<<31)
133*1b481fc3SMaciej Żenczykowski #define REG_PCR 17
134*1b481fc3SMaciej Żenczykowski #define BIT_PCR_PAUSE_CNT (0xffff<<0)
135*1b481fc3SMaciej Żenczykowski #define BIT_PCR_PSNEG (1<<21)
136*1b481fc3SMaciej Żenczykowski #define BIT_PCR_PS_RCVD (1<<22)
137*1b481fc3SMaciej Żenczykowski #define BIT_PCR_PS_DA (1<<29)
138*1b481fc3SMaciej Żenczykowski #define BIT_PCR_PSMCAST (1<<30)
139*1b481fc3SMaciej Żenczykowski #define BIT_PCR_PSEN (1<<31)
140*1b481fc3SMaciej Żenczykowski #define REG_RFCR 18
141*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_UHEN (1<<20)
142*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_MHEN (1<<21)
143*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_AARP (1<<22)
144*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_APAT0 (1<<23)
145*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_APAT1 (1<<24)
146*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_APAT2 (1<<25)
147*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_APAT3 (1<<26)
148*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_APM (1<<27)
149*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_AAU (1<<28)
150*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_AAM (1<<29)
151*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_AAB (1<<30)
152*1b481fc3SMaciej Żenczykowski #define BIT_RFCR_RFEN (1<<31)
153*1b481fc3SMaciej Żenczykowski #define REG_RFDR 19
154*1b481fc3SMaciej Żenczykowski #define REG_BRAR 20
155*1b481fc3SMaciej Żenczykowski #define BIT_BRAR_AUTOINC (1<<31)
156*1b481fc3SMaciej Żenczykowski #define REG_BRDR 21
157*1b481fc3SMaciej Żenczykowski #define REG_SRR 22
158*1b481fc3SMaciej Żenczykowski #define REG_MIBC 23
159*1b481fc3SMaciej Żenczykowski #define BIT_MIBC_WRN (1<<0)
160*1b481fc3SMaciej Żenczykowski #define BIT_MIBC_FRZ (1<<1)
161*1b481fc3SMaciej Żenczykowski #define REG_MIB0 24
162*1b481fc3SMaciej Żenczykowski #define REG_MIB1 25
163*1b481fc3SMaciej Żenczykowski #define REG_MIB2 26
164*1b481fc3SMaciej Żenczykowski #define REG_MIB3 27
165*1b481fc3SMaciej Żenczykowski #define REG_MIB4 28
166*1b481fc3SMaciej Żenczykowski #define REG_MIB5 29
167*1b481fc3SMaciej Żenczykowski #define REG_MIB6 30
168*1b481fc3SMaciej Żenczykowski #define REG_BMCR 32
169*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_FDUP (1<<8)
170*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_ANRST (1<<9)
171*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_ISOL (1<<10)
172*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_PDOWN (1<<11)
173*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_ANEN (1<<12)
174*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_SPEED (1<<13)
175*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_LOOP (1<<14)
176*1b481fc3SMaciej Żenczykowski #define BIT_BMCR_RST (1<<15)
177*1b481fc3SMaciej Żenczykowski #define REG_BMSR 33
178*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_JABBER (1<<1)
179*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_LNK (1<<2)
180*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_ANCAP (1<<3)
181*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_RFAULT (1<<4)
182*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_ANDONE (1<<5)
183*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_PREAMBLE (1<<6)
184*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_10HCAP (1<<11)
185*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_10FCAP (1<<12)
186*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_100HCAP (1<<13)
187*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_100FCAP (1<<14)
188*1b481fc3SMaciej Żenczykowski #define BIT_BMSR_100T4CAP (1<<15)
189*1b481fc3SMaciej Żenczykowski #define REG_PHYIDR1 34
190*1b481fc3SMaciej Żenczykowski #define REG_PHYIDR2 35
191*1b481fc3SMaciej Żenczykowski #define BIT_PHYIDR2_OUILSB (0x3f<<10)
192*1b481fc3SMaciej Żenczykowski #define BIT_PHYIDR2_MODEL (0x3f<<4)
193*1b481fc3SMaciej Żenczykowski #define BIT_PHYIDR2_REV (0xf)
194*1b481fc3SMaciej Żenczykowski #define REG_ANAR 36
195*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_PROTO (0x1f<<0)
196*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_10 (1<<5)
197*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_10_FD (1<<6)
198*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_TX (1<<7)
199*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_TXFD (1<<8)
200*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_T4 (1<<9)
201*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_PAUSE (1<<10)
202*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_RF (1<<13)
203*1b481fc3SMaciej Żenczykowski #define BIT_ANAR_NP (1<<15)
204*1b481fc3SMaciej Żenczykowski #define REG_ANLPAR 37
205*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_PROTO (0x1f<<0)
206*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_10 (1<<5)
207*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_10_FD (1<<6)
208*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_TX (1<<7)
209*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_TXFD (1<<8)
210*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_T4 (1<<9)
211*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_PAUSE (1<<10)
212*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_RF (1<<13)
213*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_ACK (1<<14)
214*1b481fc3SMaciej Żenczykowski #define BIT_ANLPAR_NP (1<<15)
215*1b481fc3SMaciej Żenczykowski #define REG_ANER 38
216*1b481fc3SMaciej Żenczykowski #define BIT_ANER_LP_AN_ENABLE (1<<0)
217*1b481fc3SMaciej Żenczykowski #define BIT_ANER_PAGE_RX (1<<1)
218*1b481fc3SMaciej Żenczykowski #define BIT_ANER_NP_ABLE (1<<2)
219*1b481fc3SMaciej Żenczykowski #define BIT_ANER_LP_NP_ABLE (1<<3)
220*1b481fc3SMaciej Żenczykowski #define BIT_ANER_PDF (1<<4)
221*1b481fc3SMaciej Żenczykowski #define REG_ANNPTR 39
222*1b481fc3SMaciej Żenczykowski #define REG_PHYSTS 48
223*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_LNK (1<<0)
224*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_SPD10 (1<<1)
225*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_FDUP (1<<2)
226*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_LOOP (1<<3)
227*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_ANDONE (1<<4)
228*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_JABBER (1<<5)
229*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_RF (1<<6)
230*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_MINT (1<<7)
231*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_FC (1<<11)
232*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_POL (1<<12)
233*1b481fc3SMaciej Żenczykowski #define BIT_PHYSTS_RXERR (1<<13)
234*1b481fc3SMaciej Żenczykowski #define REG_MICR 49
235*1b481fc3SMaciej Żenczykowski #define BIT_MICR_INTEN (1<<1)
236*1b481fc3SMaciej Żenczykowski #define REG_MISR 50
237*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MSK_RHF (1<<9)
238*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MSK_FHF (1<<10)
239*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MSK_ANC (1<<11)
240*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MSK_RF (1<<12)
241*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MSK_JAB (1<<13)
242*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MSK_LNK (1<<14)
243*1b481fc3SMaciej Żenczykowski #define BIT_MISR_MINT (1<<15)
244*1b481fc3SMaciej Żenczykowski #define REG_PGSEL 51
245*1b481fc3SMaciej Żenczykowski #define REG_FCSCR 52
246*1b481fc3SMaciej Żenczykowski #define REG_RECR 53
247*1b481fc3SMaciej Żenczykowski #define REG_PCSR 54
248*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_NRZI (1<<2)
249*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_FORCE_100 (1<<5)
250*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_SDOPT (1<<8)
251*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_SDFORCE (1<<9)
252*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_TQM (1<<10)
253*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_CLK (1<<11)
254*1b481fc3SMaciej Żenczykowski #define BIT_PCSR_4B5B (1<<12)
255*1b481fc3SMaciej Żenczykowski #define REG_PHYCR 57
256*1b481fc3SMaciej Żenczykowski #define BIT_PHYCR_PHYADDR (0x1f<<0)
257*1b481fc3SMaciej Żenczykowski #define BIT_PHYCR_PAUSE_STS (1<<7)
258*1b481fc3SMaciej Żenczykowski #define BIT_PHYCR_STRETCH (1<<8)
259*1b481fc3SMaciej Żenczykowski #define BIT_PHYCR_BIST (1<<9)
260*1b481fc3SMaciej Żenczykowski #define BIT_PHYCR_BIST_STAT (1<<10)
261*1b481fc3SMaciej Żenczykowski #define BIT_PHYCR_PSR15 (1<<11)
262*1b481fc3SMaciej Żenczykowski #define REG_TBTSCR 58
263*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_JAB (1<<0)
264*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_BEAT (1<<1)
265*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_AUTOPOL (1<<3)
266*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_POL (1<<4)
267*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_FPOL (1<<5)
268*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_FORCE_10 (1<<6)
269*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_PULSE (1<<7)
270*1b481fc3SMaciej Żenczykowski #define BIT_TBTSCR_LOOP (1<<8)
271*1b481fc3SMaciej Żenczykowski #define REG_PMDCSR 64
272*1b481fc3SMaciej Żenczykowski #define REG_TSTDAT 65
273*1b481fc3SMaciej Żenczykowski #define REG_DSPCFG 66
274*1b481fc3SMaciej Żenczykowski #define REG_SDCFG 67
275*1b481fc3SMaciej Żenczykowski #define REG_PMATCH0 68
276*1b481fc3SMaciej Żenczykowski #define REG_PMATCH1 69
277*1b481fc3SMaciej Żenczykowski #define REG_PMATCH2 70
278*1b481fc3SMaciej Żenczykowski #define REG_PCOUNT0 71
279*1b481fc3SMaciej Żenczykowski #define REG_PCOUNT1 72
280*1b481fc3SMaciej Żenczykowski #define REG_SOPASS0 73
281*1b481fc3SMaciej Żenczykowski #define REG_SOPASS1 74
282*1b481fc3SMaciej Żenczykowski #define REG_SOPASS2 75
283*1b481fc3SMaciej Żenczykowski
__print_intr(int d,int intr,const char * name,const char * s1,const char * s2)284*1b481fc3SMaciej Żenczykowski static void __print_intr(int d, int intr, const char *name,
285*1b481fc3SMaciej Żenczykowski const char *s1, const char *s2)
286*1b481fc3SMaciej Żenczykowski {
287*1b481fc3SMaciej Żenczykowski if ((d) & intr)
288*1b481fc3SMaciej Żenczykowski fprintf(stdout, " %s Interrupt: %s\n", name, s1);
289*1b481fc3SMaciej Żenczykowski else if (s2)
290*1b481fc3SMaciej Żenczykowski fprintf(stdout, " %s Interrupt: %s\n", name, s2);
291*1b481fc3SMaciej Żenczykowski }
292*1b481fc3SMaciej Żenczykowski
293*1b481fc3SMaciej Żenczykowski #define PRINT_INTR(d, i, s1, s2) do { \
294*1b481fc3SMaciej Żenczykowski int intr = BIT_INTR_ ## i; \
295*1b481fc3SMaciej Żenczykowski const char *name = NAME_INTR_ ## i; \
296*1b481fc3SMaciej Żenczykowski __print_intr(d, intr, name, s1, s2); \
297*1b481fc3SMaciej Żenczykowski } while (0)
298*1b481fc3SMaciej Żenczykowski
299*1b481fc3SMaciej Żenczykowski #define PRINT_INTRS(d, s1, s2) do { \
300*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXOK, s1, s2); \
301*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXDESC, s1, s2); \
302*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXERR, s1, s2); \
303*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXEARLY, s1, s2); \
304*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXIDLE, s1, s2); \
305*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXORN, s1, s2); \
306*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), TXOK, s1, s2); \
307*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), TXDESC, s1, s2); \
308*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), TXERR, s1, s2); \
309*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), TXIDLE, s1, s2); \
310*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), TXURN, s1, s2); \
311*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), MIB, s1, s2); \
312*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), SWI, s1, s2); \
313*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), PME, s1, s2); \
314*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), PHY, s1, s2); \
315*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), HIBERR, s1, s2); \
316*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXSOVR, s1, s2); \
317*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RTABT, s1, s2); \
318*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RMABT, s1, s2); \
319*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), SSERR, s1, s2); \
320*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), DPERR, s1, s2); \
321*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), RXRCMP, s1, s2); \
322*1b481fc3SMaciej Żenczykowski PRINT_INTR((d), TXRCMP, s1, s2); \
323*1b481fc3SMaciej Żenczykowski } while (0)
324*1b481fc3SMaciej Żenczykowski
325*1b481fc3SMaciej Żenczykowski int
natsemi_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)326*1b481fc3SMaciej Żenczykowski natsemi_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
327*1b481fc3SMaciej Żenczykowski struct ethtool_regs *regs)
328*1b481fc3SMaciej Żenczykowski {
329*1b481fc3SMaciej Żenczykowski u32 *data = (u32 *)regs->data;
330*1b481fc3SMaciej Żenczykowski u32 tmp;
331*1b481fc3SMaciej Żenczykowski
332*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Mac/BIU Registers\n");
333*1b481fc3SMaciej Żenczykowski fprintf(stdout, "-----------------\n");
334*1b481fc3SMaciej Żenczykowski
335*1b481fc3SMaciej Żenczykowski /* command register */
336*1b481fc3SMaciej Żenczykowski fprintf(stdout,
337*1b481fc3SMaciej Żenczykowski "0x00: CR (Command): 0x%08x\n",
338*1b481fc3SMaciej Żenczykowski data[REG_CR]);
339*1b481fc3SMaciej Żenczykowski fprintf(stdout,
340*1b481fc3SMaciej Żenczykowski " Transmit %s\n"
341*1b481fc3SMaciej Żenczykowski " Receive %s\n",
342*1b481fc3SMaciej Żenczykowski data[REG_CR] & BIT_CR_TXE ? "Active" : "Idle",
343*1b481fc3SMaciej Żenczykowski data[REG_CR] & BIT_CR_RXE ? "Active" : "Idle");
344*1b481fc3SMaciej Żenczykowski if (data[REG_CR] & BIT_CR_RST) fprintf(stdout,
345*1b481fc3SMaciej Żenczykowski " Reset In Progress\n");
346*1b481fc3SMaciej Żenczykowski
347*1b481fc3SMaciej Żenczykowski /* configuration register */
348*1b481fc3SMaciej Żenczykowski fprintf(stdout,
349*1b481fc3SMaciej Żenczykowski "0x04: CFG (Configuration): 0x%08x\n",
350*1b481fc3SMaciej Żenczykowski data[REG_CFG]);
351*1b481fc3SMaciej Żenczykowski fprintf(stdout,
352*1b481fc3SMaciej Żenczykowski " %s Endian\n"
353*1b481fc3SMaciej Żenczykowski " Boot ROM %s\n"
354*1b481fc3SMaciej Żenczykowski " Internal Phy %s\n"
355*1b481fc3SMaciej Żenczykowski " Phy Reset %s\n"
356*1b481fc3SMaciej Żenczykowski " External Phy %s\n"
357*1b481fc3SMaciej Żenczykowski " Default Auto-Negotiation %s, %s %s Mb %s Duplex\n"
358*1b481fc3SMaciej Żenczykowski " Phy Interrupt %sAuto-Cleared\n"
359*1b481fc3SMaciej Żenczykowski " Phy Configuration = 0x%02x\n"
360*1b481fc3SMaciej Żenczykowski " Auto-Negotiation %s\n"
361*1b481fc3SMaciej Żenczykowski " %s Polarity\n"
362*1b481fc3SMaciej Żenczykowski " %s Duplex\n"
363*1b481fc3SMaciej Żenczykowski " %d Mb/s\n"
364*1b481fc3SMaciej Żenczykowski " Link %s\n",
365*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_BEM ? "Big" : "Little",
366*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_BROM_DIS ? "Disabled" : "Enabled",
367*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_PHY_DIS ? "Disabled" : "Enabled",
368*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_PHY_RST ? "In Progress" : "Idle",
369*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_EXT_PHY ? "Enabled" : "Disabled",
370*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_ANEG_EN ? "Enabled" : "Disabled",
371*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_ANEG_EN ? "Advertise" : "Force",
372*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_ANEG_100 ?
373*1b481fc3SMaciej Żenczykowski (data[REG_CFG] & BIT_CFG_ANEG_EN ? "10/100" : "100")
374*1b481fc3SMaciej Żenczykowski : "10",
375*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_ANEG_FDUP ?
376*1b481fc3SMaciej Żenczykowski (data[REG_CFG] & BIT_CFG_ANEG_EN ? "Half/Full" : "Full")
377*1b481fc3SMaciej Żenczykowski : "Half",
378*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_PINT_ACEN ? "" : "Not ",
379*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_PHY_CFG >> 18,
380*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_ANEG_DN ? "Done" : "Not Done",
381*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_POL ? "Reversed" : "Normal",
382*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_FDUP ? "Full" : "Half",
383*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_SPEED100 ? 100 : 10,
384*1b481fc3SMaciej Żenczykowski data[REG_CFG] & BIT_CFG_LNKSTS ? "Up" : "Down");
385*1b481fc3SMaciej Żenczykowski
386*1b481fc3SMaciej Żenczykowski /* EEPROM access register */
387*1b481fc3SMaciej Żenczykowski fprintf(stdout,
388*1b481fc3SMaciej Żenczykowski "0x08: MEAR (EEPROM Access): 0x%08x\n",
389*1b481fc3SMaciej Żenczykowski data[REG_MEAR]);
390*1b481fc3SMaciej Żenczykowski
391*1b481fc3SMaciej Żenczykowski /* PCI test control register */
392*1b481fc3SMaciej Żenczykowski fprintf(stdout,
393*1b481fc3SMaciej Żenczykowski "0x0c: PTSCR (PCI Test Control): 0x%08x\n",
394*1b481fc3SMaciej Żenczykowski data[REG_PTSCR]);
395*1b481fc3SMaciej Żenczykowski fprintf(stdout,
396*1b481fc3SMaciej Żenczykowski " EEPROM Self Test %s\n"
397*1b481fc3SMaciej Żenczykowski " Rx Filter Self Test %s\n"
398*1b481fc3SMaciej Żenczykowski " Tx FIFO Self Test %s\n"
399*1b481fc3SMaciej Żenczykowski " Rx FIFO Self Test %s\n",
400*1b481fc3SMaciej Żenczykowski data[REG_PTSCR] & BIT_PTSCR_EEBIST_FAIL ? "Failed" : "Passed",
401*1b481fc3SMaciej Żenczykowski data[REG_PTSCR] & BIT_PTSCR_RBIST_RXFFAIL ? "Failed" : "Passed",
402*1b481fc3SMaciej Żenczykowski data[REG_PTSCR] & BIT_PTSCR_RBIST_TXFAIL ? "Failed" : "Passed",
403*1b481fc3SMaciej Żenczykowski data[REG_PTSCR] & BIT_PTSCR_RBIST_RXFAIL ? "Failed" : "Passed");
404*1b481fc3SMaciej Żenczykowski if (data[REG_PTSCR] & BIT_PTSCR_EELOAD_EN) fprintf(stdout,
405*1b481fc3SMaciej Żenczykowski " EEPROM Reload In Progress\n");
406*1b481fc3SMaciej Żenczykowski
407*1b481fc3SMaciej Żenczykowski /* Interrupt status register */
408*1b481fc3SMaciej Żenczykowski fprintf(stdout,
409*1b481fc3SMaciej Żenczykowski "0x10: ISR (Interrupt Status): 0x%08x\n",
410*1b481fc3SMaciej Żenczykowski data[REG_ISR]);
411*1b481fc3SMaciej Żenczykowski if (data[REG_ISR])
412*1b481fc3SMaciej Żenczykowski PRINT_INTRS(data[REG_ISR], "Active", (char *)NULL);
413*1b481fc3SMaciej Żenczykowski else
414*1b481fc3SMaciej Żenczykowski fprintf(stdout, " No Interrupts Active\n");
415*1b481fc3SMaciej Żenczykowski
416*1b481fc3SMaciej Żenczykowski /* Interrupt mask register */
417*1b481fc3SMaciej Żenczykowski fprintf(stdout,
418*1b481fc3SMaciej Żenczykowski "0x14: IMR (Interrupt Mask): 0x%08x\n",
419*1b481fc3SMaciej Żenczykowski data[REG_IMR]);
420*1b481fc3SMaciej Żenczykowski PRINT_INTRS(data[REG_IMR], "Enabled", "Masked");
421*1b481fc3SMaciej Żenczykowski
422*1b481fc3SMaciej Żenczykowski /* Interrupt enable register */
423*1b481fc3SMaciej Żenczykowski fprintf(stdout,
424*1b481fc3SMaciej Żenczykowski "0x18: IER (Interrupt Enable): 0x%08x\n",
425*1b481fc3SMaciej Żenczykowski data[REG_IER]);
426*1b481fc3SMaciej Żenczykowski fprintf(stdout,
427*1b481fc3SMaciej Żenczykowski " Interrupts %s\n",
428*1b481fc3SMaciej Żenczykowski data[REG_IER] & BIT_IER_IE ? "Enabled" : "Disabled");
429*1b481fc3SMaciej Żenczykowski
430*1b481fc3SMaciej Żenczykowski /* Tx descriptor pointer register */
431*1b481fc3SMaciej Żenczykowski fprintf(stdout,
432*1b481fc3SMaciej Żenczykowski "0x20: TXDP (Tx Descriptor Pointer): 0x%08x\n",
433*1b481fc3SMaciej Żenczykowski data[REG_TXDP]);
434*1b481fc3SMaciej Żenczykowski
435*1b481fc3SMaciej Żenczykowski /* Tx configuration register */
436*1b481fc3SMaciej Żenczykowski fprintf(stdout,
437*1b481fc3SMaciej Żenczykowski "0x24: TXCFG (Tx Config): 0x%08x\n",
438*1b481fc3SMaciej Żenczykowski data[REG_TXCFG]);
439*1b481fc3SMaciej Żenczykowski tmp = (data[REG_TXCFG] & BIT_TXCFG_MXDMA)>>20;
440*1b481fc3SMaciej Żenczykowski fprintf(stdout,
441*1b481fc3SMaciej Żenczykowski " Drain Threshold = %d bytes (%d)\n"
442*1b481fc3SMaciej Żenczykowski " Fill Threshold = %d bytes (%d)\n"
443*1b481fc3SMaciej Żenczykowski " Max DMA Burst per Tx = %d bytes\n"
444*1b481fc3SMaciej Żenczykowski " Automatic Tx Padding %s\n"
445*1b481fc3SMaciej Żenczykowski " Mac Loopback %s\n"
446*1b481fc3SMaciej Żenczykowski " Heartbeat Ignore %s\n"
447*1b481fc3SMaciej Żenczykowski " Carrier Sense Ignore %s\n",
448*1b481fc3SMaciej Żenczykowski (data[REG_TXCFG] & BIT_TXCFG_DRTH) * 32,
449*1b481fc3SMaciej Żenczykowski data[REG_TXCFG] & BIT_TXCFG_DRTH,
450*1b481fc3SMaciej Żenczykowski ((data[REG_TXCFG] & BIT_TXCFG_FLTH)>>8) * 32,
451*1b481fc3SMaciej Żenczykowski data[REG_TXCFG] & BIT_TXCFG_FLTH,
452*1b481fc3SMaciej Żenczykowski tmp ? (1<<(tmp-1))*4 : 512,
453*1b481fc3SMaciej Żenczykowski data[REG_TXCFG] & BIT_TXCFG_ATP ? "Enabled" : "Disabled",
454*1b481fc3SMaciej Żenczykowski data[REG_TXCFG] & BIT_TXCFG_MLB ? "Enabled" : "Disabled",
455*1b481fc3SMaciej Żenczykowski data[REG_TXCFG] & BIT_TXCFG_HBI ? "Enabled" : "Disabled",
456*1b481fc3SMaciej Żenczykowski data[REG_TXCFG] & BIT_TXCFG_CSI ? "Enabled" : "Disabled");
457*1b481fc3SMaciej Żenczykowski
458*1b481fc3SMaciej Żenczykowski
459*1b481fc3SMaciej Żenczykowski /* Rx descriptor pointer register */
460*1b481fc3SMaciej Żenczykowski fprintf(stdout,
461*1b481fc3SMaciej Żenczykowski "0x30: RXDP (Rx Descriptor Pointer): 0x%08x\n",
462*1b481fc3SMaciej Żenczykowski data[REG_RXDP]);
463*1b481fc3SMaciej Żenczykowski
464*1b481fc3SMaciej Żenczykowski /* Rx configuration register */
465*1b481fc3SMaciej Żenczykowski fprintf(stdout,
466*1b481fc3SMaciej Żenczykowski "0x34: RXCFG (Rx Config): 0x%08x\n",
467*1b481fc3SMaciej Żenczykowski data[REG_RXCFG]);
468*1b481fc3SMaciej Żenczykowski tmp = (data[REG_RXCFG] & BIT_RXCFG_MXDMA)>>20;
469*1b481fc3SMaciej Żenczykowski fprintf(stdout,
470*1b481fc3SMaciej Żenczykowski " Drain Threshold = %d bytes (%d)\n"
471*1b481fc3SMaciej Żenczykowski " Max DMA Burst per Rx = %d bytes\n"
472*1b481fc3SMaciej Żenczykowski " Long Packets %s\n"
473*1b481fc3SMaciej Żenczykowski " Tx Packets %s\n"
474*1b481fc3SMaciej Żenczykowski " Runt Packets %s\n"
475*1b481fc3SMaciej Żenczykowski " Error Packets %s\n",
476*1b481fc3SMaciej Żenczykowski ((data[REG_RXCFG] & BIT_RXCFG_DRTH) >> 1) * 8,
477*1b481fc3SMaciej Żenczykowski (data[REG_RXCFG] & BIT_RXCFG_DRTH) >> 1,
478*1b481fc3SMaciej Żenczykowski tmp ? (1<<(tmp-1))*4 : 512,
479*1b481fc3SMaciej Żenczykowski data[REG_RXCFG] & BIT_RXCFG_ALP ? "Accepted" : "Rejected",
480*1b481fc3SMaciej Żenczykowski data[REG_RXCFG] & BIT_RXCFG_ATX ? "Accepted" : "Rejected",
481*1b481fc3SMaciej Żenczykowski data[REG_RXCFG] & BIT_RXCFG_ARP ? "Accepted" : "Rejected",
482*1b481fc3SMaciej Żenczykowski data[REG_RXCFG] & BIT_RXCFG_AEP ? "Accepted" : "Rejected");
483*1b481fc3SMaciej Żenczykowski
484*1b481fc3SMaciej Żenczykowski /* CLKRUN control/status register */
485*1b481fc3SMaciej Żenczykowski fprintf(stdout,
486*1b481fc3SMaciej Żenczykowski "0x3c: CCSR (CLKRUN Control/Status): 0x%08x\n",
487*1b481fc3SMaciej Żenczykowski data[REG_CCSR]);
488*1b481fc3SMaciej Żenczykowski fprintf(stdout,
489*1b481fc3SMaciej Żenczykowski " CLKRUNN %s\n"
490*1b481fc3SMaciej Żenczykowski " Power Management %s\n",
491*1b481fc3SMaciej Żenczykowski data[REG_CCSR] & BIT_CCSR_CLKRUN_EN ? "Enabled" : "Disabled",
492*1b481fc3SMaciej Żenczykowski data[REG_CCSR] & BIT_CCSR_PMEEN ? "Enabled" : "Disabled");
493*1b481fc3SMaciej Żenczykowski if (data[REG_CCSR] & BIT_CCSR_PMESTS) fprintf(stdout,
494*1b481fc3SMaciej Żenczykowski " Power Management Event Pending\n");
495*1b481fc3SMaciej Żenczykowski
496*1b481fc3SMaciej Żenczykowski /* WoL control/status register */
497*1b481fc3SMaciej Żenczykowski fprintf(stdout,
498*1b481fc3SMaciej Żenczykowski "0x40: WCSR (Wake-on-LAN Control/Status): 0x%08x\n",
499*1b481fc3SMaciej Żenczykowski data[REG_WCSR]);
500*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKPHY) fprintf(stdout,
501*1b481fc3SMaciej Żenczykowski " Wake on Phy Interrupt Enabled\n");
502*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKUCP) fprintf(stdout,
503*1b481fc3SMaciej Żenczykowski " Wake on Unicast Packet Enabled\n");
504*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKMCP) fprintf(stdout,
505*1b481fc3SMaciej Żenczykowski " Wake on Multicast Packet Enabled\n");
506*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKBCP) fprintf(stdout,
507*1b481fc3SMaciej Żenczykowski " Wake on Broadcast Packet Enabled\n");
508*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKARP) fprintf(stdout,
509*1b481fc3SMaciej Żenczykowski " Wake on Arp Enabled\n");
510*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKPAT0) fprintf(stdout,
511*1b481fc3SMaciej Żenczykowski " Wake on Pattern 0 Match Enabled\n");
512*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKPAT1) fprintf(stdout,
513*1b481fc3SMaciej Żenczykowski " Wake on Pattern 1 Match Enabled\n");
514*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKPAT2) fprintf(stdout,
515*1b481fc3SMaciej Żenczykowski " Wake on Pattern 2 Match Enabled\n");
516*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKPAT3) fprintf(stdout,
517*1b481fc3SMaciej Żenczykowski " Wake on Pattern 3 Match Enabled\n");
518*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_WKMAG) fprintf(stdout,
519*1b481fc3SMaciej Żenczykowski " Wake on Magic Packet Enabled\n");
520*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_MPSOE) fprintf(stdout,
521*1b481fc3SMaciej Żenczykowski " Magic Packet SecureOn Enabled\n");
522*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_SOHACK) fprintf(stdout,
523*1b481fc3SMaciej Żenczykowski " SecureOn Hack Detected\n");
524*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_PHYINT) fprintf(stdout,
525*1b481fc3SMaciej Żenczykowski " Phy Interrupt Received\n");
526*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_UCASTR) fprintf(stdout,
527*1b481fc3SMaciej Żenczykowski " Unicast Packet Received\n");
528*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_MCASTR) fprintf(stdout,
529*1b481fc3SMaciej Żenczykowski " Multicast Packet Received\n");
530*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_BCASTR) fprintf(stdout,
531*1b481fc3SMaciej Żenczykowski " Broadcast Packet Received\n");
532*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_ARPR) fprintf(stdout,
533*1b481fc3SMaciej Żenczykowski " Arp Received\n");
534*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_PATM0) fprintf(stdout,
535*1b481fc3SMaciej Żenczykowski " Pattern 0 Received\n");
536*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_PATM1) fprintf(stdout,
537*1b481fc3SMaciej Żenczykowski " Pattern 1 Received\n");
538*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_PATM2) fprintf(stdout,
539*1b481fc3SMaciej Żenczykowski " Pattern 2 Received\n");
540*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_PATM3) fprintf(stdout,
541*1b481fc3SMaciej Żenczykowski " Pattern 3 Received\n");
542*1b481fc3SMaciej Żenczykowski if (data[REG_WCSR] & BIT_WCSR_MPR) fprintf(stdout,
543*1b481fc3SMaciej Żenczykowski " Magic Packet Received\n");
544*1b481fc3SMaciej Żenczykowski
545*1b481fc3SMaciej Żenczykowski /* Pause control/status register */
546*1b481fc3SMaciej Żenczykowski fprintf(stdout,
547*1b481fc3SMaciej Żenczykowski "0x44: PCR (Pause Control/Status): 0x%08x\n",
548*1b481fc3SMaciej Żenczykowski data[REG_PCR]);
549*1b481fc3SMaciej Żenczykowski fprintf(stdout,
550*1b481fc3SMaciej Żenczykowski " Pause Counter = %d\n"
551*1b481fc3SMaciej Żenczykowski " Pause %sNegotiated\n"
552*1b481fc3SMaciej Żenczykowski " Pause on DA %s\n"
553*1b481fc3SMaciej Żenczykowski " Pause on Mulitcast %s\n"
554*1b481fc3SMaciej Żenczykowski " Pause %s\n",
555*1b481fc3SMaciej Żenczykowski data[REG_PCR] & BIT_PCR_PAUSE_CNT,
556*1b481fc3SMaciej Żenczykowski data[REG_PCR] & BIT_PCR_PSNEG ? "" : "Not ",
557*1b481fc3SMaciej Żenczykowski data[REG_PCR] & BIT_PCR_PS_DA ? "Enabled" : "Disabled",
558*1b481fc3SMaciej Żenczykowski data[REG_PCR] & BIT_PCR_PSMCAST ? "Enabled" : "Disabled",
559*1b481fc3SMaciej Żenczykowski data[REG_PCR] & BIT_PCR_PSEN ? "Enabled" : "Disabled");
560*1b481fc3SMaciej Żenczykowski if (data[REG_PCR] & BIT_PCR_PS_RCVD) fprintf(stdout,
561*1b481fc3SMaciej Żenczykowski " PS_RCVD: Pause Frame Received\n");
562*1b481fc3SMaciej Żenczykowski
563*1b481fc3SMaciej Żenczykowski /* Rx Filter Control */
564*1b481fc3SMaciej Żenczykowski fprintf(stdout,
565*1b481fc3SMaciej Żenczykowski "0x48: RFCR (Rx Filter Control): 0x%08x\n",
566*1b481fc3SMaciej Żenczykowski data[REG_RFCR]);
567*1b481fc3SMaciej Żenczykowski fprintf(stdout,
568*1b481fc3SMaciej Żenczykowski " Unicast Hash %s\n"
569*1b481fc3SMaciej Żenczykowski " Multicast Hash %s\n"
570*1b481fc3SMaciej Żenczykowski " Arp %s\n"
571*1b481fc3SMaciej Żenczykowski " Pattern 0 Match %s\n"
572*1b481fc3SMaciej Żenczykowski " Pattern 1 Match %s\n"
573*1b481fc3SMaciej Żenczykowski " Pattern 2 Match %s\n"
574*1b481fc3SMaciej Żenczykowski " Pattern 3 Match %s\n"
575*1b481fc3SMaciej Żenczykowski " Perfect Match %s\n"
576*1b481fc3SMaciej Żenczykowski " All Unicast %s\n"
577*1b481fc3SMaciej Żenczykowski " All Multicast %s\n"
578*1b481fc3SMaciej Żenczykowski " All Broadcast %s\n"
579*1b481fc3SMaciej Żenczykowski " Rx Filter %s\n",
580*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_UHEN ? "Enabled" : "Disabled",
581*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_MHEN ? "Enabled" : "Disabled",
582*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_AARP ? "Accepted" : "Rejected",
583*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_APAT0 ? "Accepted" : "Rejected",
584*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_APAT1 ? "Accepted" : "Rejected",
585*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_APAT2 ? "Accepted" : "Rejected",
586*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_APAT3 ? "Accepted" : "Rejected",
587*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_APM ? "Accepted" : "Rejected",
588*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_AAU ? "Accepted" : "Rejected",
589*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_AAM ? "Accepted" : "Rejected",
590*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_AAB ? "Accepted" : "Rejected",
591*1b481fc3SMaciej Żenczykowski data[REG_RFCR] & BIT_RFCR_RFEN ? "Enabled" : "Disabled");
592*1b481fc3SMaciej Żenczykowski
593*1b481fc3SMaciej Żenczykowski /* Rx filter data register */
594*1b481fc3SMaciej Żenczykowski fprintf(stdout,
595*1b481fc3SMaciej Żenczykowski "0x4c: RFDR (Rx Filter Data): 0x%08x\n",
596*1b481fc3SMaciej Żenczykowski data[REG_RFDR]);
597*1b481fc3SMaciej Żenczykowski if (regs->version >= 1) fprintf(stdout,
598*1b481fc3SMaciej Żenczykowski " PMATCH 1-0 = 0x%08x\n"
599*1b481fc3SMaciej Żenczykowski " PMATCH 3-2 = 0x%08x\n"
600*1b481fc3SMaciej Żenczykowski " PMATCH 5-4 = 0x%08x\n"
601*1b481fc3SMaciej Żenczykowski " PCOUNT 1-0 = 0x%08x\n"
602*1b481fc3SMaciej Żenczykowski " PCOUNT 3-2 = 0x%08x\n"
603*1b481fc3SMaciej Żenczykowski " SOPASS 1-0 = 0x%08x\n"
604*1b481fc3SMaciej Żenczykowski " SOPASS 3-2 = 0x%08x\n"
605*1b481fc3SMaciej Żenczykowski " SOPASS 5-4 = 0x%08x\n",
606*1b481fc3SMaciej Żenczykowski data[REG_PMATCH0], data[REG_PMATCH1], data[REG_PMATCH2],
607*1b481fc3SMaciej Żenczykowski data[REG_PCOUNT0], data[REG_PCOUNT1],
608*1b481fc3SMaciej Żenczykowski data[REG_SOPASS0], data[REG_SOPASS1], data[REG_SOPASS2]);
609*1b481fc3SMaciej Żenczykowski
610*1b481fc3SMaciej Żenczykowski
611*1b481fc3SMaciej Żenczykowski /* Boot ROM address register */
612*1b481fc3SMaciej Żenczykowski fprintf(stdout,
613*1b481fc3SMaciej Żenczykowski "0x50: BRAR (Boot ROM Address): 0x%08x\n",
614*1b481fc3SMaciej Żenczykowski data[REG_BRAR]);
615*1b481fc3SMaciej Żenczykowski if (data[REG_BRAR] & BIT_BRAR_AUTOINC) fprintf(stdout,
616*1b481fc3SMaciej Żenczykowski " Automatically Increment Address\n");
617*1b481fc3SMaciej Żenczykowski
618*1b481fc3SMaciej Żenczykowski /* Boot ROM data register */
619*1b481fc3SMaciej Żenczykowski fprintf(stdout,
620*1b481fc3SMaciej Żenczykowski "0x54: BRDR (Boot ROM Data): 0x%08x\n",
621*1b481fc3SMaciej Żenczykowski data[REG_BRDR]);
622*1b481fc3SMaciej Żenczykowski
623*1b481fc3SMaciej Żenczykowski /* Silicon revison register */
624*1b481fc3SMaciej Żenczykowski fprintf(stdout,
625*1b481fc3SMaciej Żenczykowski "0x58: SRR (Silicon Revision): 0x%08x\n",
626*1b481fc3SMaciej Żenczykowski data[REG_SRR]);
627*1b481fc3SMaciej Żenczykowski
628*1b481fc3SMaciej Żenczykowski /* Management information base control register */
629*1b481fc3SMaciej Żenczykowski fprintf(stdout,
630*1b481fc3SMaciej Żenczykowski "0x5c: MIBC (Mgmt Info Base Control): 0x%08x\n",
631*1b481fc3SMaciej Żenczykowski data[REG_MIBC]);
632*1b481fc3SMaciej Żenczykowski if (data[REG_MIBC] & BIT_MIBC_WRN) fprintf(stdout,
633*1b481fc3SMaciej Żenczykowski " Counter Overflow Warning\n");
634*1b481fc3SMaciej Żenczykowski if (data[REG_MIBC] & BIT_MIBC_FRZ) fprintf(stdout,
635*1b481fc3SMaciej Żenczykowski " Counters Frozen\n");
636*1b481fc3SMaciej Żenczykowski
637*1b481fc3SMaciej Żenczykowski /* MIB registers */
638*1b481fc3SMaciej Żenczykowski fprintf(stdout,
639*1b481fc3SMaciej Żenczykowski "0x60: MIB[0] (Rx Errored Packets): 0x%04x\n",
640*1b481fc3SMaciej Żenczykowski data[REG_MIB0]);
641*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB0]);
642*1b481fc3SMaciej Żenczykowski fprintf(stdout,
643*1b481fc3SMaciej Żenczykowski "0x64: MIB[1] (Rx Frame Sequence Errors): 0x%02x\n",
644*1b481fc3SMaciej Żenczykowski data[REG_MIB1]);
645*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB1]);
646*1b481fc3SMaciej Żenczykowski fprintf(stdout,
647*1b481fc3SMaciej Żenczykowski "0x68: MIB[2] (Rx Missed Packets): 0x%02x\n",
648*1b481fc3SMaciej Żenczykowski data[REG_MIB2]);
649*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB2]);
650*1b481fc3SMaciej Żenczykowski fprintf(stdout,
651*1b481fc3SMaciej Żenczykowski "0x6c: MIB[3] (Rx Alignment Errors): 0x%02x\n",
652*1b481fc3SMaciej Żenczykowski data[REG_MIB3]);
653*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB3]);
654*1b481fc3SMaciej Żenczykowski fprintf(stdout,
655*1b481fc3SMaciej Żenczykowski "0x70: MIB[4] (Rx Symbol Errors): 0x%02x\n",
656*1b481fc3SMaciej Żenczykowski data[REG_MIB4]);
657*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB4]);
658*1b481fc3SMaciej Żenczykowski fprintf(stdout,
659*1b481fc3SMaciej Żenczykowski "0x74: MIB[5] (Rx Long Frame Errors): 0x%02x\n",
660*1b481fc3SMaciej Żenczykowski data[REG_MIB5]);
661*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB5]);
662*1b481fc3SMaciej Żenczykowski fprintf(stdout,
663*1b481fc3SMaciej Żenczykowski "0x78: MIB[6] (Tx Heartbeat Errors): 0x%02x\n",
664*1b481fc3SMaciej Żenczykowski data[REG_MIB6]);
665*1b481fc3SMaciej Żenczykowski fprintf(stdout, " Value = %d\n", data[REG_MIB6]);
666*1b481fc3SMaciej Żenczykowski
667*1b481fc3SMaciej Żenczykowski fprintf(stdout, "\n");
668*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Internal Phy Registers\n");
669*1b481fc3SMaciej Żenczykowski fprintf(stdout, "----------------------\n");
670*1b481fc3SMaciej Żenczykowski
671*1b481fc3SMaciej Żenczykowski /* Basic mode control register */
672*1b481fc3SMaciej Żenczykowski fprintf(stdout,
673*1b481fc3SMaciej Żenczykowski "0x80: BMCR (Basic Mode Control): 0x%04x\n",
674*1b481fc3SMaciej Żenczykowski data[REG_BMCR]);
675*1b481fc3SMaciej Żenczykowski fprintf(stdout,
676*1b481fc3SMaciej Żenczykowski " %s Duplex\n"
677*1b481fc3SMaciej Żenczykowski " Port is Powered %s\n"
678*1b481fc3SMaciej Żenczykowski " Auto-Negotiation %s\n"
679*1b481fc3SMaciej Żenczykowski " %d Mb/s\n",
680*1b481fc3SMaciej Żenczykowski data[REG_BMCR] & BIT_BMCR_FDUP ? "Full" : "Half",
681*1b481fc3SMaciej Żenczykowski data[REG_BMCR] & BIT_BMCR_PDOWN ? "Down" : "Up",
682*1b481fc3SMaciej Żenczykowski data[REG_BMCR] & BIT_BMCR_ANEN ? "Enabled" : "Disabled",
683*1b481fc3SMaciej Żenczykowski data[REG_BMCR] & BIT_BMCR_SPEED ? 100 : 10);
684*1b481fc3SMaciej Żenczykowski if (data[REG_BMCR] & BIT_BMCR_ANRST) fprintf(stdout,
685*1b481fc3SMaciej Żenczykowski " Auto-Negotiation Restarting\n");
686*1b481fc3SMaciej Żenczykowski if (data[REG_BMCR] & BIT_BMCR_ISOL) fprintf(stdout,
687*1b481fc3SMaciej Żenczykowski " Port Isolated\n");
688*1b481fc3SMaciej Żenczykowski if (data[REG_BMCR] & BIT_BMCR_LOOP) fprintf(stdout,
689*1b481fc3SMaciej Żenczykowski " Loopback Enabled\n");
690*1b481fc3SMaciej Żenczykowski if (data[REG_BMCR] & BIT_BMCR_RST) fprintf(stdout,
691*1b481fc3SMaciej Żenczykowski " Reset In Progress\n");
692*1b481fc3SMaciej Żenczykowski
693*1b481fc3SMaciej Żenczykowski /* Basic mode status register */
694*1b481fc3SMaciej Żenczykowski fprintf(stdout,
695*1b481fc3SMaciej Żenczykowski "0x84: BMSR (Basic Mode Status): 0x%04x\n",
696*1b481fc3SMaciej Żenczykowski data[REG_BMSR]);
697*1b481fc3SMaciej Żenczykowski fprintf(stdout,
698*1b481fc3SMaciej Żenczykowski " Link %s\n"
699*1b481fc3SMaciej Żenczykowski " %sCapable of Auto-Negotiation\n"
700*1b481fc3SMaciej Żenczykowski " Auto-Negotiation %sComplete\n"
701*1b481fc3SMaciej Żenczykowski " %sCapable of Preamble Suppression\n"
702*1b481fc3SMaciej Żenczykowski " %sCapable of 10Base-T Half Duplex\n"
703*1b481fc3SMaciej Żenczykowski " %sCapable of 10Base-T Full Duplex\n"
704*1b481fc3SMaciej Żenczykowski " %sCapable of 100Base-TX Half Duplex\n"
705*1b481fc3SMaciej Żenczykowski " %sCapable of 100Base-TX Full Duplex\n"
706*1b481fc3SMaciej Żenczykowski " %sCapable of 100Base-T4\n",
707*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_LNK ? "Up" : "Down",
708*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_ANCAP ? "" : "Not ",
709*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_ANDONE ? "" : "Not ",
710*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_PREAMBLE ? "" : "Not ",
711*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_10HCAP ? "" : "Not ",
712*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_10FCAP ? "" : "Not ",
713*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_100HCAP ? "" : "Not ",
714*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_100FCAP ? "" : "Not ",
715*1b481fc3SMaciej Żenczykowski data[REG_BMSR] & BIT_BMSR_100T4CAP ? "" : "Not ");
716*1b481fc3SMaciej Żenczykowski if (data[REG_BMSR] & BIT_BMSR_JABBER) fprintf(stdout,
717*1b481fc3SMaciej Żenczykowski " Jabber Condition Detected\n");
718*1b481fc3SMaciej Żenczykowski if (data[REG_BMSR] & BIT_BMSR_RFAULT) fprintf(stdout,
719*1b481fc3SMaciej Żenczykowski " Remote Fault Detected\n");
720*1b481fc3SMaciej Żenczykowski
721*1b481fc3SMaciej Żenczykowski /* PHY identification registers */
722*1b481fc3SMaciej Żenczykowski fprintf(stdout,
723*1b481fc3SMaciej Żenczykowski "0x88: PHYIDR1 (PHY ID #1): 0x%04x\n",
724*1b481fc3SMaciej Żenczykowski data[REG_PHYIDR1]);
725*1b481fc3SMaciej Żenczykowski fprintf(stdout,
726*1b481fc3SMaciej Żenczykowski "0x8c: PHYIDR2 (PHY ID #2): 0x%04x\n",
727*1b481fc3SMaciej Żenczykowski data[REG_PHYIDR2]);
728*1b481fc3SMaciej Żenczykowski fprintf(stdout,
729*1b481fc3SMaciej Żenczykowski " OUI = 0x%06x\n"
730*1b481fc3SMaciej Żenczykowski " Model = 0x%02x (%d)\n"
731*1b481fc3SMaciej Żenczykowski " Revision = 0x%01x (%d)\n",
732*1b481fc3SMaciej Żenczykowski (data[REG_PHYIDR1] << 6) | (data[REG_PHYIDR2] >> 10),
733*1b481fc3SMaciej Żenczykowski (data[REG_PHYIDR2] & BIT_PHYIDR2_MODEL) >> 4 & 0x3f,
734*1b481fc3SMaciej Żenczykowski (data[REG_PHYIDR2] & BIT_PHYIDR2_MODEL) >> 4 & 0x3f,
735*1b481fc3SMaciej Żenczykowski data[REG_PHYIDR2] & BIT_PHYIDR2_REV,
736*1b481fc3SMaciej Żenczykowski data[REG_PHYIDR2] & BIT_PHYIDR2_REV);
737*1b481fc3SMaciej Żenczykowski
738*1b481fc3SMaciej Żenczykowski /* autonegotiation advertising register */
739*1b481fc3SMaciej Żenczykowski fprintf(stdout,
740*1b481fc3SMaciej Żenczykowski "0x90: ANAR (Autoneg Advertising): 0x%04x\n",
741*1b481fc3SMaciej Żenczykowski data[REG_ANAR]);
742*1b481fc3SMaciej Żenczykowski fprintf(stdout,
743*1b481fc3SMaciej Żenczykowski " Protocol Selector = 0x%02x (%d)\n",
744*1b481fc3SMaciej Żenczykowski data[REG_ANAR] & BIT_ANAR_PROTO,
745*1b481fc3SMaciej Żenczykowski data[REG_ANAR] & BIT_ANAR_PROTO);
746*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_10) fprintf(stdout,
747*1b481fc3SMaciej Żenczykowski " Advertising 10Base-T Half Duplex\n");
748*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_10_FD) fprintf(stdout,
749*1b481fc3SMaciej Żenczykowski " Advertising 10Base-T Full Duplex\n");
750*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_TX) fprintf(stdout,
751*1b481fc3SMaciej Żenczykowski " Advertising 100Base-TX Half Duplex\n");
752*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_TXFD) fprintf(stdout,
753*1b481fc3SMaciej Żenczykowski " Advertising 100Base-TX Full Duplex\n");
754*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_T4) fprintf(stdout,
755*1b481fc3SMaciej Żenczykowski " Advertising 100Base-T4\n");
756*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_PAUSE) fprintf(stdout,
757*1b481fc3SMaciej Żenczykowski " Advertising Pause\n");
758*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_RF) fprintf(stdout,
759*1b481fc3SMaciej Żenczykowski " Indicating Remote Fault\n");
760*1b481fc3SMaciej Żenczykowski if (data[REG_ANAR] & BIT_ANAR_NP) fprintf(stdout,
761*1b481fc3SMaciej Żenczykowski " Next Page Desired\n");
762*1b481fc3SMaciej Żenczykowski
763*1b481fc3SMaciej Żenczykowski /* Autonegotiation link partner ability register */
764*1b481fc3SMaciej Żenczykowski fprintf(stdout,
765*1b481fc3SMaciej Żenczykowski "0x94: ANLPAR (Autoneg Partner): 0x%04x\n",
766*1b481fc3SMaciej Żenczykowski data[REG_ANLPAR]);
767*1b481fc3SMaciej Żenczykowski fprintf(stdout,
768*1b481fc3SMaciej Żenczykowski " Protocol Selector = 0x%02x (%d)\n",
769*1b481fc3SMaciej Żenczykowski data[REG_ANLPAR] & BIT_ANLPAR_PROTO,
770*1b481fc3SMaciej Żenczykowski data[REG_ANLPAR] & BIT_ANLPAR_PROTO);
771*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_10) fprintf(stdout,
772*1b481fc3SMaciej Żenczykowski " Supports 10Base-T Half Duplex\n");
773*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_10_FD) fprintf(stdout,
774*1b481fc3SMaciej Żenczykowski " Supports 10Base-T Full Duplex\n");
775*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_TX) fprintf(stdout,
776*1b481fc3SMaciej Żenczykowski " Supports 100Base-TX Half Duplex\n");
777*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_TXFD) fprintf(stdout,
778*1b481fc3SMaciej Żenczykowski " Supports 100Base-TX Full Duplex\n");
779*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_T4) fprintf(stdout,
780*1b481fc3SMaciej Żenczykowski " Supports 100Base-T4\n");
781*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_PAUSE) fprintf(stdout,
782*1b481fc3SMaciej Żenczykowski " Supports Pause\n");
783*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_RF) fprintf(stdout,
784*1b481fc3SMaciej Żenczykowski " Indicates Remote Fault\n");
785*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_ACK) fprintf(stdout,
786*1b481fc3SMaciej Żenczykowski " Indicates Acknowledgement\n");
787*1b481fc3SMaciej Żenczykowski if (data[REG_ANLPAR] & BIT_ANLPAR_NP) fprintf(stdout,
788*1b481fc3SMaciej Żenczykowski " Next Page Desired\n");
789*1b481fc3SMaciej Żenczykowski
790*1b481fc3SMaciej Żenczykowski /* Autonegotiation expansion register */
791*1b481fc3SMaciej Żenczykowski fprintf(stdout,
792*1b481fc3SMaciej Żenczykowski "0x98: ANER (Autoneg Expansion): 0x%04x\n",
793*1b481fc3SMaciej Żenczykowski data[REG_ANER]);
794*1b481fc3SMaciej Żenczykowski fprintf(stdout,
795*1b481fc3SMaciej Żenczykowski " Link Partner Can %sAuto-Negotiate\n"
796*1b481fc3SMaciej Żenczykowski " Link Code Word %sReceived\n"
797*1b481fc3SMaciej Żenczykowski " Next Page %sSupported\n"
798*1b481fc3SMaciej Żenczykowski " Link Partner Next Page %sSupported\n",
799*1b481fc3SMaciej Żenczykowski data[REG_ANER] & BIT_ANER_LP_AN_ENABLE ? "" : "Not ",
800*1b481fc3SMaciej Żenczykowski data[REG_ANER] & BIT_ANER_PAGE_RX ? "" : "Not ",
801*1b481fc3SMaciej Żenczykowski data[REG_ANER] & BIT_ANER_NP_ABLE ? "" : "Not ",
802*1b481fc3SMaciej Żenczykowski data[REG_ANER] & BIT_ANER_LP_NP_ABLE ? "" : "Not ");
803*1b481fc3SMaciej Żenczykowski if (data[REG_ANER] & BIT_ANER_PDF) fprintf(stdout,
804*1b481fc3SMaciej Żenczykowski " Parallel Detection Fault\n");
805*1b481fc3SMaciej Żenczykowski
806*1b481fc3SMaciej Żenczykowski /* Autonegotiation next-page tx register */
807*1b481fc3SMaciej Żenczykowski fprintf(stdout,
808*1b481fc3SMaciej Żenczykowski "0x9c: ANNPTR (Autoneg Next Page Tx): 0x%04x\n",
809*1b481fc3SMaciej Żenczykowski data[REG_ANNPTR]);
810*1b481fc3SMaciej Żenczykowski
811*1b481fc3SMaciej Żenczykowski /* Phy status register */
812*1b481fc3SMaciej Żenczykowski fprintf(stdout,
813*1b481fc3SMaciej Żenczykowski "0xc0: PHYSTS (Phy Status): 0x%04x\n",
814*1b481fc3SMaciej Żenczykowski data[REG_PHYSTS]);
815*1b481fc3SMaciej Żenczykowski fprintf(stdout,
816*1b481fc3SMaciej Żenczykowski " Link %s\n"
817*1b481fc3SMaciej Żenczykowski " %d Mb/s\n"
818*1b481fc3SMaciej Żenczykowski " %s Duplex\n"
819*1b481fc3SMaciej Żenczykowski " Auto-Negotiation %sComplete\n"
820*1b481fc3SMaciej Żenczykowski " %s Polarity\n",
821*1b481fc3SMaciej Żenczykowski data[REG_PHYSTS] & BIT_PHYSTS_LNK ? "Up" : "Down",
822*1b481fc3SMaciej Żenczykowski data[REG_PHYSTS] & BIT_PHYSTS_SPD10 ? 10 : 100,
823*1b481fc3SMaciej Żenczykowski data[REG_PHYSTS] & BIT_PHYSTS_FDUP ? "Full" : "Half",
824*1b481fc3SMaciej Żenczykowski data[REG_PHYSTS] & BIT_PHYSTS_ANDONE ? "" : "Not ",
825*1b481fc3SMaciej Żenczykowski data[REG_PHYSTS] & BIT_PHYSTS_POL ? "Reverse" : "Normal");
826*1b481fc3SMaciej Żenczykowski if (data[REG_PHYSTS] & BIT_PHYSTS_LOOP) fprintf(stdout,
827*1b481fc3SMaciej Żenczykowski " Loopback Enabled\n");
828*1b481fc3SMaciej Żenczykowski if (data[REG_PHYSTS] & BIT_PHYSTS_JABBER) fprintf(stdout,
829*1b481fc3SMaciej Żenczykowski " Jabber Condition Detected\n");
830*1b481fc3SMaciej Żenczykowski if (data[REG_PHYSTS] & BIT_PHYSTS_RF) fprintf(stdout,
831*1b481fc3SMaciej Żenczykowski " Remote Fault Detected\n");
832*1b481fc3SMaciej Żenczykowski if (data[REG_PHYSTS] & BIT_PHYSTS_MINT) fprintf(stdout,
833*1b481fc3SMaciej Żenczykowski " MII Interrupt Detected\n");
834*1b481fc3SMaciej Żenczykowski if (data[REG_PHYSTS] & BIT_PHYSTS_FC) fprintf(stdout,
835*1b481fc3SMaciej Żenczykowski " False Carrier Detected\n");
836*1b481fc3SMaciej Żenczykowski if (data[REG_PHYSTS] & BIT_PHYSTS_RXERR) fprintf(stdout,
837*1b481fc3SMaciej Żenczykowski " Rx Error Detected\n");
838*1b481fc3SMaciej Żenczykowski
839*1b481fc3SMaciej Żenczykowski fprintf(stdout,
840*1b481fc3SMaciej Żenczykowski "0xc4: MICR (MII Interrupt Control): 0x%04x\n",
841*1b481fc3SMaciej Żenczykowski data[REG_MICR]);
842*1b481fc3SMaciej Żenczykowski fprintf(stdout,
843*1b481fc3SMaciej Żenczykowski " MII Interrupts %s\n",
844*1b481fc3SMaciej Żenczykowski data[REG_MICR] & BIT_MICR_INTEN ? "Enabled" : "Disabled");
845*1b481fc3SMaciej Żenczykowski
846*1b481fc3SMaciej Żenczykowski fprintf(stdout,
847*1b481fc3SMaciej Żenczykowski "0xc8: MISR (MII Interrupt Status): 0x%04x\n",
848*1b481fc3SMaciej Żenczykowski data[REG_MISR]);
849*1b481fc3SMaciej Żenczykowski fprintf(stdout,
850*1b481fc3SMaciej Żenczykowski " Rx Error Counter Half-Full Interrupt %s\n"
851*1b481fc3SMaciej Żenczykowski " False Carrier Counter Half-Full Interrupt %s\n"
852*1b481fc3SMaciej Żenczykowski " Auto-Negotiation Complete Interrupt %s\n"
853*1b481fc3SMaciej Żenczykowski " Remote Fault Interrupt %s\n"
854*1b481fc3SMaciej Żenczykowski " Jabber Interrupt %s\n"
855*1b481fc3SMaciej Żenczykowski " Link Change Interrupt %s\n",
856*1b481fc3SMaciej Żenczykowski data[REG_MISR] & BIT_MISR_MSK_RHF ? "Masked" : "Enabled",
857*1b481fc3SMaciej Żenczykowski data[REG_MISR] & BIT_MISR_MSK_FHF ? "Masked" : "Enabled",
858*1b481fc3SMaciej Żenczykowski data[REG_MISR] & BIT_MISR_MSK_ANC ? "Masked" : "Enabled",
859*1b481fc3SMaciej Żenczykowski data[REG_MISR] & BIT_MISR_MSK_RF ? "Masked" : "Enabled",
860*1b481fc3SMaciej Żenczykowski data[REG_MISR] & BIT_MISR_MSK_JAB ? "Masked" : "Enabled",
861*1b481fc3SMaciej Żenczykowski data[REG_MISR] & BIT_MISR_MSK_LNK ? "Masked" : "Enabled");
862*1b481fc3SMaciej Żenczykowski if (data[REG_MISR] & BIT_MISR_MINT) fprintf(stdout,
863*1b481fc3SMaciej Żenczykowski " MII Interrupt Pending\n");
864*1b481fc3SMaciej Żenczykowski
865*1b481fc3SMaciej Żenczykowski /* Page select register (from section of spec on 'suggested values') */
866*1b481fc3SMaciej Żenczykowski fprintf(stdout,
867*1b481fc3SMaciej Żenczykowski "0xcc: PGSEL (Phy Register Page Select): 0x%04x\n",
868*1b481fc3SMaciej Żenczykowski data[REG_PGSEL]);
869*1b481fc3SMaciej Żenczykowski
870*1b481fc3SMaciej Żenczykowski /* counters */
871*1b481fc3SMaciej Żenczykowski fprintf(stdout,
872*1b481fc3SMaciej Żenczykowski "0xd0: FCSCR (False Carrier Counter): 0x%04x\n",
873*1b481fc3SMaciej Żenczykowski data[REG_FCSCR]);
874*1b481fc3SMaciej Żenczykowski fprintf(stdout,
875*1b481fc3SMaciej Żenczykowski " Value = %d\n", data[REG_FCSCR] & 0xff);
876*1b481fc3SMaciej Żenczykowski fprintf(stdout,
877*1b481fc3SMaciej Żenczykowski "0xd4: RECR (Rx Error Counter): 0x%04x\n",
878*1b481fc3SMaciej Żenczykowski data[REG_RECR]);
879*1b481fc3SMaciej Żenczykowski fprintf(stdout,
880*1b481fc3SMaciej Żenczykowski " Value = %d\n", data[REG_RECR] & 0xff);
881*1b481fc3SMaciej Żenczykowski
882*1b481fc3SMaciej Żenczykowski /* 100 Mbit configuration register */
883*1b481fc3SMaciej Żenczykowski fprintf(stdout,
884*1b481fc3SMaciej Żenczykowski "0xd8: PCSR (100Mb/s PCS Config/Status): 0x%04x\n",
885*1b481fc3SMaciej Żenczykowski data[REG_PCSR]);
886*1b481fc3SMaciej Żenczykowski fprintf(stdout,
887*1b481fc3SMaciej Żenczykowski " NRZI Bypass %s\n"
888*1b481fc3SMaciej Żenczykowski " %s Signal Detect Algorithm\n"
889*1b481fc3SMaciej Żenczykowski " %s Signal Detect Operation\n"
890*1b481fc3SMaciej Żenczykowski " True Quiet Mode %s\n"
891*1b481fc3SMaciej Żenczykowski " Rx Clock is %s\n"
892*1b481fc3SMaciej Żenczykowski " 4B/5B Operation %s\n",
893*1b481fc3SMaciej Żenczykowski data[REG_PCSR] & BIT_PCSR_NRZI ? "Enabled" : "Disabled",
894*1b481fc3SMaciej Żenczykowski data[REG_PCSR] & BIT_PCSR_SDOPT ? "Enhanced" : "Reduced",
895*1b481fc3SMaciej Żenczykowski data[REG_PCSR] & BIT_PCSR_SDFORCE ? "Forced" : "Normal",
896*1b481fc3SMaciej Żenczykowski data[REG_PCSR] & BIT_PCSR_TQM ? "Enabled" : "Disabled",
897*1b481fc3SMaciej Żenczykowski data[REG_PCSR] & BIT_PCSR_CLK ?
898*1b481fc3SMaciej Żenczykowski "Free-Running" : "Phase-Adjusted",
899*1b481fc3SMaciej Żenczykowski data[REG_PCSR] & BIT_PCSR_4B5B ? "Bypassed" : "Normal");
900*1b481fc3SMaciej Żenczykowski if (data[REG_PCSR] & BIT_PCSR_FORCE_100) fprintf(stdout,
901*1b481fc3SMaciej Żenczykowski " Forced 100 Mb/s Good Link\n");
902*1b481fc3SMaciej Żenczykowski
903*1b481fc3SMaciej Żenczykowski /* Phy control register */
904*1b481fc3SMaciej Żenczykowski fprintf(stdout,
905*1b481fc3SMaciej Żenczykowski "0xe4: PHYCR (Phy Control): 0x%04x\n",
906*1b481fc3SMaciej Żenczykowski data[REG_PHYCR]);
907*1b481fc3SMaciej Żenczykowski fprintf(stdout,
908*1b481fc3SMaciej Żenczykowski " Phy Address = 0x%x (%d)\n"
909*1b481fc3SMaciej Żenczykowski " %sPause Compatible with Link Partner\n"
910*1b481fc3SMaciej Żenczykowski " LED Stretching %s\n"
911*1b481fc3SMaciej Żenczykowski " Phy Self Test %s\n"
912*1b481fc3SMaciej Żenczykowski " Self Test Sequence = PSR%d\n",
913*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_PHYADDR,
914*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_PHYADDR,
915*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_PAUSE_STS ? "" : "Not ",
916*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_STRETCH ? "Bypassed" : "Enabled",
917*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_BIST ? "In Progress" :
918*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_BIST_STAT ?
919*1b481fc3SMaciej Żenczykowski "Passed" : "Failed or Not Run",
920*1b481fc3SMaciej Żenczykowski data[REG_PHYCR] & BIT_PHYCR_PSR15 ? 15 : 9);
921*1b481fc3SMaciej Żenczykowski
922*1b481fc3SMaciej Żenczykowski
923*1b481fc3SMaciej Żenczykowski /* 10 Mbit control and status register */
924*1b481fc3SMaciej Żenczykowski fprintf(stdout,
925*1b481fc3SMaciej Żenczykowski "0xe8: TBTSCR (10Base-T Status/Control): 0x%04x\n",
926*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR]);
927*1b481fc3SMaciej Żenczykowski fprintf(stdout,
928*1b481fc3SMaciej Żenczykowski " Jabber %s\n"
929*1b481fc3SMaciej Żenczykowski " Heartbeat %s\n"
930*1b481fc3SMaciej Żenczykowski " Polarity Auto-Sense/Correct %s\n"
931*1b481fc3SMaciej Żenczykowski " %s Polarity %s\n"
932*1b481fc3SMaciej Żenczykowski " Normal Link Pulse %s\n"
933*1b481fc3SMaciej Żenczykowski " 10 Mb/s Loopback %s\n",
934*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_JAB ? "Disabled" : "Enabled",
935*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_BEAT ? "Disabled" : "Enabled",
936*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_AUTOPOL ? "Disabled" : "Enabled",
937*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_AUTOPOL ?
938*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR]&BIT_TBTSCR_FPOL ? "Reverse":"Normal" :
939*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR]&BIT_TBTSCR_POL ? "Reverse":"Normal",
940*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_AUTOPOL ? "Forced" : "Detected",
941*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_PULSE ? "Disabled" : "Enabled",
942*1b481fc3SMaciej Żenczykowski data[REG_TBTSCR] & BIT_TBTSCR_LOOP ? "Enabled" : "Disabled");
943*1b481fc3SMaciej Żenczykowski if (data[REG_TBTSCR] & BIT_TBTSCR_FORCE_10) fprintf(stdout,
944*1b481fc3SMaciej Żenczykowski " Forced 10 Mb/s Good Link\n");
945*1b481fc3SMaciej Żenczykowski
946*1b481fc3SMaciej Żenczykowski /* the spec says to set these */
947*1b481fc3SMaciej Żenczykowski fprintf(stdout, "\n");
948*1b481fc3SMaciej Żenczykowski fprintf(stdout, "'Magic' Phy Registers\n");
949*1b481fc3SMaciej Żenczykowski fprintf(stdout, "---------------------\n");
950*1b481fc3SMaciej Żenczykowski fprintf(stdout,
951*1b481fc3SMaciej Żenczykowski "0xe4: PMDCSR: 0x%04x\n",
952*1b481fc3SMaciej Żenczykowski data[REG_PMDCSR]);
953*1b481fc3SMaciej Żenczykowski fprintf(stdout,
954*1b481fc3SMaciej Żenczykowski "0xf4: DSPCFG: 0x%04x\n",
955*1b481fc3SMaciej Żenczykowski data[REG_DSPCFG]);
956*1b481fc3SMaciej Żenczykowski fprintf(stdout,
957*1b481fc3SMaciej Żenczykowski "0xf8: SDCFG: 0x%04x\n",
958*1b481fc3SMaciej Żenczykowski data[REG_SDCFG]);
959*1b481fc3SMaciej Żenczykowski fprintf(stdout,
960*1b481fc3SMaciej Żenczykowski "0xfc: TSTDAT: 0x%04x\n",
961*1b481fc3SMaciej Żenczykowski data[REG_TSTDAT]);
962*1b481fc3SMaciej Żenczykowski
963*1b481fc3SMaciej Żenczykowski return 0;
964*1b481fc3SMaciej Żenczykowski }
965*1b481fc3SMaciej Żenczykowski
966*1b481fc3SMaciej Żenczykowski int
natsemi_dump_eeprom(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_eeprom * ee)967*1b481fc3SMaciej Żenczykowski natsemi_dump_eeprom(struct ethtool_drvinfo *info __maybe_unused,
968*1b481fc3SMaciej Żenczykowski struct ethtool_eeprom *ee)
969*1b481fc3SMaciej Żenczykowski {
970*1b481fc3SMaciej Żenczykowski u16 *eebuf = (u16 *)ee->data;
971*1b481fc3SMaciej Żenczykowski unsigned int i;
972*1b481fc3SMaciej Żenczykowski
973*1b481fc3SMaciej Żenczykowski if (ee->magic != NATSEMI_MAGIC) {
974*1b481fc3SMaciej Żenczykowski fprintf(stderr, "Magic number 0x%08x does not match 0x%08x\n",
975*1b481fc3SMaciej Żenczykowski ee->magic, NATSEMI_MAGIC);
976*1b481fc3SMaciej Żenczykowski return -1;
977*1b481fc3SMaciej Żenczykowski }
978*1b481fc3SMaciej Żenczykowski
979*1b481fc3SMaciej Żenczykowski fprintf(stdout, "Address\tData\n");
980*1b481fc3SMaciej Żenczykowski fprintf(stdout, "-------\t------\n");
981*1b481fc3SMaciej Żenczykowski for (i = 0; i < ee->len/2; i++) {
982*1b481fc3SMaciej Żenczykowski fprintf(stdout, "0x%02x \t0x%04x\n", i + ee->offset, eebuf[i]);
983*1b481fc3SMaciej Żenczykowski }
984*1b481fc3SMaciej Żenczykowski
985*1b481fc3SMaciej Żenczykowski return 0;
986*1b481fc3SMaciej Żenczykowski }
987*1b481fc3SMaciej Żenczykowski
988