xref: /aosp_15_r20/external/ethtool/e1000.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 /* Register Bit Masks */
6*1b481fc3SMaciej Żenczykowski /* Device Control */
7*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_FD       0x00000001  /* Full duplex.0=half; 1=full */
8*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_BEM      0x00000002  /* Endian Mode.0=little,1=big */
9*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_PRIOR    0x00000004  /* Priority on PCI. 0=rx,1=fair */
10*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_LRST     0x00000008  /* Link reset. 0=normal,1=reset */
11*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_TME      0x00000010  /* Test mode. 0=normal,1=test */
12*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SLE      0x00000020  /* Serial Link on 0=dis,1=en */
13*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_ASDE     0x00000020  /* Auto-speed detect enable */
14*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SLU      0x00000040  /* Set link up (Force Link) */
15*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_ILOS     0x00000080  /* Invert Loss-Of Signal */
16*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SPD_SEL  0x00000300  /* Speed Select Mask */
17*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SPD_10   0x00000000  /* Force 10Mb */
18*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SPD_100  0x00000100  /* Force 100Mb */
19*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SPD_1000 0x00000200  /* Force 1Gb */
20*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_BEM32    0x00000400  /* Big Endian 32 mode */
21*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_FRCSPD   0x00000800  /* Force Speed */
22*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_FRCDPX   0x00001000  /* Force Duplex */
23*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIN0  0x00040000  /* SWDPIN 0 value */
24*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIN1  0x00080000  /* SWDPIN 1 value */
25*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIN2  0x00100000  /* SWDPIN 2 value */
26*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIN3  0x00200000  /* SWDPIN 3 value */
27*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIO0  0x00400000  /* SWDPIN 0 Input or output */
28*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIO1  0x00800000  /* SWDPIN 1 input or output */
29*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIO2  0x01000000  /* SWDPIN 2 input or output */
30*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_SWDPIO3  0x02000000  /* SWDPIN 3 input or output */
31*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_RST      0x04000000  /* Global reset */
32*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_RFCE     0x08000000  /* Receive Flow Control enable */
33*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_TFCE     0x10000000  /* Transmit flow control enable */
34*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_RTE      0x20000000  /* Routing tag enable */
35*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_VME      0x40000000  /* IEEE VLAN mode enable */
36*1b481fc3SMaciej Żenczykowski #define E1000_CTRL_PHY_RST  0x80000000  /* PHY Reset */
37*1b481fc3SMaciej Żenczykowski 
38*1b481fc3SMaciej Żenczykowski /* Device Status */
39*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_FD         0x00000001      /* Full duplex.0=half,1=full */
40*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_LU         0x00000002      /* Link up.0=no,1=link */
41*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_FUNC_MASK  0x0000000C      /* PCI Function Mask */
42*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_FUNC_0     0x00000000      /* Function 0 */
43*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_FUNC_1     0x00000004      /* Function 1 */
44*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_TXOFF      0x00000010      /* transmission paused */
45*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_TBIMODE    0x00000020      /* TBI mode */
46*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_SPEED_MASK 0x000000C0
47*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_SPEED_10   0x00000000      /* Speed 10Mb/s */
48*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_SPEED_100  0x00000040      /* Speed 100Mb/s */
49*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_SPEED_1000 0x00000080      /* Speed 1000Mb/s */
50*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_ASDV       0x00000300      /* Auto speed detect value */
51*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_MTXCKOK    0x00000400      /* MTX clock running OK */
52*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_PCI66      0x00000800      /* In 66Mhz slot */
53*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_BUS64      0x00001000      /* In 64 bit slot */
54*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_PCIX_MODE  0x00002000      /* PCI-X mode */
55*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_PCIX_SPEED 0x0000C000      /* PCI-X bus speed */
56*1b481fc3SMaciej Żenczykowski 
57*1b481fc3SMaciej Żenczykowski /* Constants used to intrepret the masked PCI-X bus speed. */
58*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_PCIX_SPEED_66  0x00000000 /* PCI-X bus speed  50-66 MHz */
59*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_PCIX_SPEED_100 0x00004000 /* PCI-X bus speed  66-100 MHz */
60*1b481fc3SMaciej Żenczykowski #define E1000_STATUS_PCIX_SPEED_133 0x00008000 /* PCI-X bus speed 100-133 MHz */
61*1b481fc3SMaciej Żenczykowski 
62*1b481fc3SMaciej Żenczykowski /* Receive Control */
63*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_RST          0x00000001      /* Software reset */
64*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_EN           0x00000002      /* enable */
65*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SBP          0x00000004      /* store bad packet */
66*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_UPE          0x00000008      /* unicast promiscuous enable */
67*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MPE          0x00000010      /* multicast promiscuous enab */
68*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_LPE          0x00000020      /* long packet enable */
69*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_LBM_NO       0x00000000      /* no loopback mode */
70*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_LBM_MAC      0x00000040      /* MAC loopback mode */
71*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_LBM_SLP      0x00000080      /* serial link loopback mode */
72*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_LBM_TCVR     0x000000C0      /* tcvr loopback mode */
73*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_RDMTS        0x00000300      /* rx desc min threshold size */
74*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_RDMTS_HALF   0x00000000      /* rx desc min threshold size */
75*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_RDMTS_QUAT   0x00000100      /* rx desc min threshold size */
76*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_RDMTS_EIGTH  0x00000200      /* rx desc min threshold size */
77*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MO_SHIFT     12              /* multicast offset shift */
78*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MO_0         0x00000000      /* multicast offset 11:0 */
79*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MO_1         0x00001000      /* multicast offset 12:1 */
80*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MO_2         0x00002000      /* multicast offset 13:2 */
81*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MO_3         0x00003000      /* multicast offset 15:4 */
82*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_MDR          0x00004000      /* multicast desc ring 0 */
83*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_BAM          0x00008000      /* broadcast enable */
84*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ           0x00030000      /* rx buffer size */
85*1b481fc3SMaciej Żenczykowski /* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */
86*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_2048      0x00000000      /* rx buffer size 2048 */
87*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_1024      0x00010000      /* rx buffer size 1024 */
88*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_512       0x00020000      /* rx buffer size 512 */
89*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_256       0x00030000      /* rx buffer size 256 */
90*1b481fc3SMaciej Żenczykowski /* these buffer sizes are valid if E1000_RCTL_BSEX is 1 */
91*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_16384     0x00010000      /* rx buffer size 16384 */
92*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_8192      0x00020000      /* rx buffer size 8192 */
93*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_SZ_4096      0x00030000      /* rx buffer size 4096 */
94*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_VFE          0x00040000      /* vlan filter enable */
95*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_CFIEN        0x00080000      /* canonical form enable */
96*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_CFI          0x00100000      /* canonical form indicator */
97*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_DPF          0x00400000      /* discard pause frames */
98*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_PMCF         0x00800000      /* pass MAC control frames */
99*1b481fc3SMaciej Żenczykowski #define E1000_RCTL_BSEX         0x02000000      /* Buffer size extension */
100*1b481fc3SMaciej Żenczykowski 
101*1b481fc3SMaciej Żenczykowski /* Transmit Control */
102*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_RST    0x00000001    /* software reset */
103*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_EN     0x00000002    /* enable tx */
104*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_BCE    0x00000004    /* busy check enable */
105*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_PSP    0x00000008    /* pad short packets */
106*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_CT     0x00000ff0    /* collision threshold */
107*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_COLD   0x003ff000    /* collision distance */
108*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_SWXOFF 0x00400000    /* SW Xoff transmission */
109*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_PBE    0x00800000    /* Packet Burst Enable */
110*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_RTLC   0x01000000    /* Re-transmit on late collision */
111*1b481fc3SMaciej Żenczykowski #define E1000_TCTL_NRTU   0x02000000    /* No Re-transmit on underrun */
112*1b481fc3SMaciej Żenczykowski 
113*1b481fc3SMaciej Żenczykowski /* M88E1000 PHY Specific Status Register */
114*1b481fc3SMaciej Żenczykowski #define M88_PSSR_JABBER             0x0001 /* 1=Jabber */
115*1b481fc3SMaciej Żenczykowski #define M88_PSSR_REV_POLARITY       0x0002 /* 1=Polarity reversed */
116*1b481fc3SMaciej Żenczykowski #define M88_PSSR_DOWNSHIFT          0x0020 /* 1=Downshifted */
117*1b481fc3SMaciej Żenczykowski #define M88_PSSR_MDIX               0x0040 /* 1=MDIX; 0=MDI */
118*1b481fc3SMaciej Żenczykowski #define M88_PSSR_CABLE_LENGTH       0x0380 /* 0=<50M;1=50-80M;2=80-110M;
119*1b481fc3SMaciej Żenczykowski                                             * 3=110-140M;4=>140M */
120*1b481fc3SMaciej Żenczykowski #define M88_PSSR_LINK               0x0400 /* 1=Link up, 0=Link down */
121*1b481fc3SMaciej Żenczykowski #define M88_PSSR_SPD_DPLX_RESOLVED  0x0800 /* 1=Speed & Duplex resolved */
122*1b481fc3SMaciej Żenczykowski #define M88_PSSR_PAGE_RCVD          0x1000 /* 1=Page received */
123*1b481fc3SMaciej Żenczykowski #define M88_PSSR_DPLX               0x2000 /* 1=Duplex 0=Half Duplex */
124*1b481fc3SMaciej Żenczykowski #define M88_PSSR_SPEED              0xC000 /* Speed, bits 14:15 */
125*1b481fc3SMaciej Żenczykowski #define M88_PSSR_10MBS              0x0000 /* 00=10Mbs */
126*1b481fc3SMaciej Żenczykowski #define M88_PSSR_100MBS             0x4000 /* 01=100Mbs */
127*1b481fc3SMaciej Żenczykowski #define M88_PSSR_1000MBS            0x8000 /* 10=1000Mbs */
128*1b481fc3SMaciej Żenczykowski 
129*1b481fc3SMaciej Żenczykowski #define M88_PSSR_CL_0_50     (0<<7)
130*1b481fc3SMaciej Żenczykowski #define M88_PSSR_CL_50_80    (1<<7)
131*1b481fc3SMaciej Żenczykowski #define M88_PSSR_CL_80_110   (2<<7)
132*1b481fc3SMaciej Żenczykowski #define M88_PSSR_CL_110_140  (3<<7)
133*1b481fc3SMaciej Żenczykowski #define M88_PSSR_CL_140_PLUS (4<<7)
134*1b481fc3SMaciej Żenczykowski 
135*1b481fc3SMaciej Żenczykowski /* M88E1000 PHY Specific Control Register */
136*1b481fc3SMaciej Żenczykowski #define M88_PSCR_JABBER_DISABLE    0x0001  /* 1=Jabber Function disabled */
137*1b481fc3SMaciej Żenczykowski #define M88_PSCR_POLARITY_REVERSAL 0x0002  /* 1=Polarity Reversal enabled */
138*1b481fc3SMaciej Żenczykowski #define M88_PSCR_SQE_TEST          0x0004  /* 1=SQE Test enabled */
139*1b481fc3SMaciej Żenczykowski #define M88_PSCR_CLK125_DISABLE    0x0010  /* 1=CLK125 low,
140*1b481fc3SMaciej Żenczykowski                                             * 0=CLK125 toggling
141*1b481fc3SMaciej Żenczykowski                                             */
142*1b481fc3SMaciej Żenczykowski #define M88_PSCR_MDI_MASK         0x0060
143*1b481fc3SMaciej Żenczykowski #define M88_PSCR_MDI_MANUAL_MODE  0x0000   /* MDI Crossover Mode bits 6:5 */
144*1b481fc3SMaciej Żenczykowski                                           /* Manual MDI configuration */
145*1b481fc3SMaciej Żenczykowski #define M88_PSCR_MDIX_MANUAL_MODE 0x0020   /* Manual MDIX configuration */
146*1b481fc3SMaciej Żenczykowski #define M88_PSCR_AUTO_X_1000T     0x0040   /* 1000BASE-T: Auto crossover,
147*1b481fc3SMaciej Żenczykowski                                             *  100BASE-TX/10BASE-T:
148*1b481fc3SMaciej Żenczykowski                                             *  MDI Mode
149*1b481fc3SMaciej Żenczykowski                                             */
150*1b481fc3SMaciej Żenczykowski #define M88_PSCR_AUTO_X_MODE      0x0060   /* Auto crossover enabled
151*1b481fc3SMaciej Żenczykowski                                             * all speeds.
152*1b481fc3SMaciej Żenczykowski                                             */
153*1b481fc3SMaciej Żenczykowski #define M88_PSCR_10BT_EXT_DIST_ENABLE 0x0080
154*1b481fc3SMaciej Żenczykowski                                    /* 1=Enable Extended 10BASE-T distance
155*1b481fc3SMaciej Żenczykowski                                     * (Lower 10BASE-T RX Threshold)
156*1b481fc3SMaciej Żenczykowski                                     * 0=Normal 10BASE-T RX Threshold */
157*1b481fc3SMaciej Żenczykowski #define M88_PSCR_MII_5BIT_ENABLE      0x0100
158*1b481fc3SMaciej Żenczykowski                                    /* 1=5-Bit interface in 100BASE-TX
159*1b481fc3SMaciej Żenczykowski                                     * 0=MII interface in 100BASE-TX */
160*1b481fc3SMaciej Żenczykowski #define M88_PSCR_SCRAMBLER_DISABLE    0x0200       /* 1=Scrambler disable */
161*1b481fc3SMaciej Żenczykowski #define M88_PSCR_FORCE_LINK_GOOD      0x0400       /* 1=Force link good */
162*1b481fc3SMaciej Żenczykowski #define M88_PSCR_ASSERT_CRS_ON_TX     0x0800       /* 1=Assert CRS on Transmit */
163*1b481fc3SMaciej Żenczykowski 
164*1b481fc3SMaciej Żenczykowski #define M88_PSCR_POLARITY_REVERSAL_SHIFT    1
165*1b481fc3SMaciej Żenczykowski #define M88_PSCR_AUTO_X_MODE_SHIFT          5
166*1b481fc3SMaciej Żenczykowski #define M88_PSCR_10BT_EXT_DIST_ENABLE_SHIFT 7
167*1b481fc3SMaciej Żenczykowski 
168*1b481fc3SMaciej Żenczykowski /* PCI Device IDs */
169*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82542                    0x1000
170*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82543GC_FIBER            0x1001
171*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82543GC_COPPER           0x1004
172*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82544EI_COPPER           0x1008
173*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82544EI_FIBER            0x1009
174*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82544GC_COPPER           0x100C
175*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82544GC_LOM              0x100D
176*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82540EM                  0x100E
177*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82540EM_LOM              0x1015
178*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82540EP_LOM              0x1016
179*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82540EP                  0x1017
180*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82540EP_LP               0x101E
181*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82545EM_COPPER           0x100F
182*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82545EM_FIBER            0x1011
183*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82545GM_COPPER           0x1026
184*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82545GM_FIBER            0x1027
185*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82545GM_SERDES           0x1028
186*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546EB_COPPER           0x1010
187*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546EB_FIBER            0x1012
188*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546EB_QUAD_COPPER      0x101D
189*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546GB_COPPER           0x1079
190*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546GB_FIBER            0x107A
191*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546GB_SERDES           0x107B
192*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546GB_PCIE             0x108A
193*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546GB_QUAD_COPPER      0x1099
194*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
195*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541EI                  0x1013
196*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541EI_MOBILE           0x1018
197*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541ER_LOM              0x1014
198*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541ER                  0x1078
199*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541GI                  0x1076
200*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541GI_LF               0x107C
201*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82541GI_MOBILE           0x1077
202*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82547EI                  0x1019
203*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82547EI_MOBILE           0x101A
204*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82547GI                  0x1075
205*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82571EB_COPPER           0x105E
206*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82571EB_FIBER            0x105F
207*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82571EB_SERDES           0x1060
208*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82571EB_QUAD_COPPER      0x10A4
209*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82571EB_QUAD_FIBER       0x10A5
210*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82571EB_QUAD_COPPER_LP   0x10BC
211*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82572EI_COPPER           0x107D
212*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82572EI_FIBER            0x107E
213*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82572EI_SERDES           0x107F
214*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82572EI                  0x10B9
215*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82573E                   0x108B
216*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82573E_IAMT              0x108C
217*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_82573L                   0x109A
218*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_80003ES2LAN_COPPER_DPT   0x1096
219*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT   0x1098
220*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_80003ES2LAN_COPPER_SPT   0x10BA
221*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_80003ES2LAN_SERDES_SPT   0x10BB
222*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IGP_M_AMT           0x1049
223*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IGP_AMT             0x104A
224*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IGP_C               0x104B
225*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IFE                 0x104C
226*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IFE_GT              0x10C4
227*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IFE_G               0x10C5
228*1b481fc3SMaciej Żenczykowski #define E1000_DEV_ID_ICH8_IGP_M               0x104D
229*1b481fc3SMaciej Żenczykowski 
230*1b481fc3SMaciej Żenczykowski #define E1000_82542_2_0_REV_ID 2
231*1b481fc3SMaciej Żenczykowski #define E1000_82542_2_1_REV_ID 3
232*1b481fc3SMaciej Żenczykowski 
233*1b481fc3SMaciej Żenczykowski /* Enumerated types specific to the e1000 hardware */
234*1b481fc3SMaciej Żenczykowski /* Media Access Controlers */
235*1b481fc3SMaciej Żenczykowski enum e1000_mac_type {
236*1b481fc3SMaciej Żenczykowski 	e1000_undefined = 0,
237*1b481fc3SMaciej Żenczykowski 	e1000_82542,
238*1b481fc3SMaciej Żenczykowski 	e1000_82543,
239*1b481fc3SMaciej Żenczykowski 	e1000_82544,
240*1b481fc3SMaciej Żenczykowski 	e1000_82540,
241*1b481fc3SMaciej Żenczykowski 	e1000_82545,
242*1b481fc3SMaciej Żenczykowski 	e1000_82545_rev_3,
243*1b481fc3SMaciej Żenczykowski 	e1000_82546,
244*1b481fc3SMaciej Żenczykowski 	e1000_82546_rev_3,
245*1b481fc3SMaciej Żenczykowski 	e1000_82541,
246*1b481fc3SMaciej Żenczykowski 	e1000_82541_rev_2,
247*1b481fc3SMaciej Żenczykowski 	e1000_82547,
248*1b481fc3SMaciej Żenczykowski 	e1000_82547_rev_2,
249*1b481fc3SMaciej Żenczykowski 	e1000_82571,
250*1b481fc3SMaciej Żenczykowski 	e1000_82572,
251*1b481fc3SMaciej Żenczykowski 	e1000_82573,
252*1b481fc3SMaciej Żenczykowski 	e1000_80003es2lan,
253*1b481fc3SMaciej Żenczykowski 	e1000_ich8lan,
254*1b481fc3SMaciej Żenczykowski 	e1000_num_macs
255*1b481fc3SMaciej Żenczykowski };
256*1b481fc3SMaciej Żenczykowski 
e1000_get_mac_type(u16 device_id)257*1b481fc3SMaciej Żenczykowski static enum e1000_mac_type e1000_get_mac_type(u16 device_id)
258*1b481fc3SMaciej Żenczykowski {
259*1b481fc3SMaciej Żenczykowski 	enum e1000_mac_type mac_type = e1000_undefined;
260*1b481fc3SMaciej Żenczykowski 
261*1b481fc3SMaciej Żenczykowski 	switch (device_id) {
262*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82542:
263*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82542;
264*1b481fc3SMaciej Żenczykowski 		break;
265*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82543GC_FIBER:
266*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82543GC_COPPER:
267*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82543;
268*1b481fc3SMaciej Żenczykowski 		break;
269*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82544EI_COPPER:
270*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82544EI_FIBER:
271*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82544GC_COPPER:
272*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82544GC_LOM:
273*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82544;
274*1b481fc3SMaciej Żenczykowski 		break;
275*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82540EM:
276*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82540EM_LOM:
277*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82540EP:
278*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82540EP_LOM:
279*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82540EP_LP:
280*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82540;
281*1b481fc3SMaciej Żenczykowski 		break;
282*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82545EM_COPPER:
283*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82545EM_FIBER:
284*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82545;
285*1b481fc3SMaciej Żenczykowski 		break;
286*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82545GM_COPPER:
287*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82545GM_FIBER:
288*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82545GM_SERDES:
289*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82545_rev_3;
290*1b481fc3SMaciej Żenczykowski 		break;
291*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546EB_COPPER:
292*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546EB_FIBER:
293*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546EB_QUAD_COPPER:
294*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82546;
295*1b481fc3SMaciej Żenczykowski 		break;
296*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546GB_COPPER:
297*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546GB_FIBER:
298*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546GB_SERDES:
299*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546GB_PCIE:
300*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546GB_QUAD_COPPER:
301*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
302*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82546_rev_3;
303*1b481fc3SMaciej Żenczykowski 		break;
304*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541EI:
305*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541EI_MOBILE:
306*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541ER_LOM:
307*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82541;
308*1b481fc3SMaciej Żenczykowski 		break;
309*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541ER:
310*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541GI:
311*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541GI_LF:
312*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82541GI_MOBILE:
313*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82541_rev_2;
314*1b481fc3SMaciej Żenczykowski 		break;
315*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82547EI:
316*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82547EI_MOBILE:
317*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82547;
318*1b481fc3SMaciej Żenczykowski 		break;
319*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82547GI:
320*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82547_rev_2;
321*1b481fc3SMaciej Żenczykowski 		break;
322*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82571EB_COPPER:
323*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82571EB_FIBER:
324*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82571EB_SERDES:
325*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82571EB_QUAD_COPPER:
326*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82571EB_QUAD_FIBER:
327*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82571EB_QUAD_COPPER_LP:
328*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82571;
329*1b481fc3SMaciej Żenczykowski 		break;
330*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82572EI:
331*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82572EI_COPPER:
332*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82572EI_FIBER:
333*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82572EI_SERDES:
334*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82572;
335*1b481fc3SMaciej Żenczykowski 		break;
336*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82573E:
337*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82573E_IAMT:
338*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_82573L:
339*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82573;
340*1b481fc3SMaciej Żenczykowski 		break;
341*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
342*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
343*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
344*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
345*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_80003es2lan;
346*1b481fc3SMaciej Żenczykowski 		break;
347*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IFE:
348*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IFE_GT:
349*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IFE_G:
350*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IGP_M:
351*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IGP_M_AMT:
352*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IGP_AMT:
353*1b481fc3SMaciej Żenczykowski 	case E1000_DEV_ID_ICH8_IGP_C:
354*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_ich8lan;
355*1b481fc3SMaciej Żenczykowski 		break;
356*1b481fc3SMaciej Żenczykowski 	default:
357*1b481fc3SMaciej Żenczykowski 		/* assume old nic and attempt so user can get limited
358*1b481fc3SMaciej Żenczykowski 		 * functionality */
359*1b481fc3SMaciej Żenczykowski 		mac_type = e1000_82543;
360*1b481fc3SMaciej Żenczykowski 		break;
361*1b481fc3SMaciej Żenczykowski 	}
362*1b481fc3SMaciej Żenczykowski 
363*1b481fc3SMaciej Żenczykowski 	return mac_type;
364*1b481fc3SMaciej Żenczykowski }
365*1b481fc3SMaciej Żenczykowski 
e1000_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)366*1b481fc3SMaciej Żenczykowski int e1000_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
367*1b481fc3SMaciej Żenczykowski 		    struct ethtool_regs *regs)
368*1b481fc3SMaciej Żenczykowski {
369*1b481fc3SMaciej Żenczykowski 	u32 *regs_buff = (u32 *)regs->data;
370*1b481fc3SMaciej Żenczykowski 	u16 hw_device_id = (u16)regs->version;
371*1b481fc3SMaciej Żenczykowski 	/* u8 hw_revision_id = (u8)(regs->version >> 16); */
372*1b481fc3SMaciej Żenczykowski 	u8 version = (u8)(regs->version >> 24);
373*1b481fc3SMaciej Żenczykowski 	enum e1000_mac_type mac_type;
374*1b481fc3SMaciej Żenczykowski 	u32 reg;
375*1b481fc3SMaciej Żenczykowski 
376*1b481fc3SMaciej Żenczykowski 	if (version != 1)
377*1b481fc3SMaciej Żenczykowski 		return -1;
378*1b481fc3SMaciej Żenczykowski 
379*1b481fc3SMaciej Żenczykowski 	mac_type = e1000_get_mac_type(hw_device_id);
380*1b481fc3SMaciej Żenczykowski 
381*1b481fc3SMaciej Żenczykowski 	if(mac_type == e1000_undefined)
382*1b481fc3SMaciej Żenczykowski 		return -1;
383*1b481fc3SMaciej Żenczykowski 
384*1b481fc3SMaciej Żenczykowski 	fprintf(stdout, "MAC Registers\n");
385*1b481fc3SMaciej Żenczykowski 	fprintf(stdout, "-------------\n");
386*1b481fc3SMaciej Żenczykowski 
387*1b481fc3SMaciej Żenczykowski 	/* Device control register */
388*1b481fc3SMaciej Żenczykowski 	reg = regs_buff[0];
389*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
390*1b481fc3SMaciej Żenczykowski 		"0x00000: CTRL (Device control register)  0x%08X\n"
391*1b481fc3SMaciej Żenczykowski 		"      Endian mode (buffers):             %s\n"
392*1b481fc3SMaciej Żenczykowski 		"      Link reset:                        %s\n"
393*1b481fc3SMaciej Żenczykowski 		"      Set link up:                       %s\n"
394*1b481fc3SMaciej Żenczykowski 		"      Invert Loss-Of-Signal:             %s\n"
395*1b481fc3SMaciej Żenczykowski 		"      Receive flow control:              %s\n"
396*1b481fc3SMaciej Żenczykowski 		"      Transmit flow control:             %s\n"
397*1b481fc3SMaciej Żenczykowski 		"      VLAN mode:                         %s\n",
398*1b481fc3SMaciej Żenczykowski 		reg,
399*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_BEM    ? "big"      : "little",
400*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_LRST   ? "reset"    : "normal",
401*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_SLU    ? "1"        : "0",
402*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_ILOS   ? "yes"      : "no",
403*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_RFCE   ? "enabled"  : "disabled",
404*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_TFCE   ? "enabled"  : "disabled",
405*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_VME    ? "enabled"  : "disabled");
406*1b481fc3SMaciej Żenczykowski 	if(mac_type >= e1000_82543) {
407*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
408*1b481fc3SMaciej Żenczykowski 		"      Auto speed detect:                 %s\n"
409*1b481fc3SMaciej Żenczykowski 		"      Speed select:                      %s\n"
410*1b481fc3SMaciej Żenczykowski 		"      Force speed:                       %s\n"
411*1b481fc3SMaciej Żenczykowski 		"      Force duplex:                      %s\n",
412*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_ASDE   ? "enabled"  : "disabled",
413*1b481fc3SMaciej Żenczykowski 		(reg & E1000_CTRL_SPD_SEL) == E1000_CTRL_SPD_10   ? "10Mb/s"   :
414*1b481fc3SMaciej Żenczykowski 		(reg & E1000_CTRL_SPD_SEL) == E1000_CTRL_SPD_100  ? "100Mb/s"  :
415*1b481fc3SMaciej Żenczykowski 		(reg & E1000_CTRL_SPD_SEL) == E1000_CTRL_SPD_1000 ? "1000Mb/s" :
416*1b481fc3SMaciej Żenczykowski 		"not used",
417*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_FRCSPD ? "yes"      : "no",
418*1b481fc3SMaciej Żenczykowski 		reg & E1000_CTRL_FRCDPX ? "yes"      : "no");
419*1b481fc3SMaciej Żenczykowski 	}
420*1b481fc3SMaciej Żenczykowski 
421*1b481fc3SMaciej Żenczykowski 	/* Device status register */
422*1b481fc3SMaciej Żenczykowski 	reg = regs_buff[1];
423*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
424*1b481fc3SMaciej Żenczykowski 		"0x00008: STATUS (Device status register) 0x%08X\n"
425*1b481fc3SMaciej Żenczykowski 		"      Duplex:                            %s\n"
426*1b481fc3SMaciej Żenczykowski 		"      Link up:                           %s\n",
427*1b481fc3SMaciej Żenczykowski 		reg,
428*1b481fc3SMaciej Żenczykowski 		reg & E1000_STATUS_FD      ? "full"        : "half",
429*1b481fc3SMaciej Żenczykowski 		reg & E1000_STATUS_LU      ? "link config" : "no link config");
430*1b481fc3SMaciej Żenczykowski 	if (mac_type >= e1000_82571) {
431*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
432*1b481fc3SMaciej Żenczykowski 		"      TBI mode:                          %s\n"
433*1b481fc3SMaciej Żenczykowski 		"      Link speed:                        %s\n"
434*1b481fc3SMaciej Żenczykowski 		"      Bus type:                          %s\n"
435*1b481fc3SMaciej Żenczykowski 		"      Port number:                       %s\n",
436*1b481fc3SMaciej Żenczykowski 		reg & E1000_STATUS_TBIMODE ? "enabled"     : "disabled",
437*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_SPEED_MASK) == E1000_STATUS_SPEED_10   ?
438*1b481fc3SMaciej Żenczykowski 		"10Mb/s" :
439*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_SPEED_MASK) == E1000_STATUS_SPEED_100  ?
440*1b481fc3SMaciej Żenczykowski 		"100Mb/s" :
441*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_SPEED_MASK) == E1000_STATUS_SPEED_1000 ?
442*1b481fc3SMaciej Żenczykowski 		"1000Mb/s" : "not used",
443*1b481fc3SMaciej Żenczykowski 		"PCI Express",
444*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_FUNC_MASK) == 0 ? "0" : "1");
445*1b481fc3SMaciej Żenczykowski 	}
446*1b481fc3SMaciej Żenczykowski 	else if (mac_type >= e1000_82543) {
447*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
448*1b481fc3SMaciej Żenczykowski 		"      TBI mode:                          %s\n"
449*1b481fc3SMaciej Żenczykowski 		"      Link speed:                        %s\n"
450*1b481fc3SMaciej Żenczykowski 		"      Bus type:                          %s\n"
451*1b481fc3SMaciej Żenczykowski 		"      Bus speed:                         %s\n"
452*1b481fc3SMaciej Żenczykowski 		"      Bus width:                         %s\n",
453*1b481fc3SMaciej Żenczykowski 		reg & E1000_STATUS_TBIMODE ? "enabled"     : "disabled",
454*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_SPEED_MASK) == E1000_STATUS_SPEED_10   ?
455*1b481fc3SMaciej Żenczykowski 		"10Mb/s" :
456*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_SPEED_MASK) == E1000_STATUS_SPEED_100  ?
457*1b481fc3SMaciej Żenczykowski 		"100Mb/s" :
458*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_SPEED_MASK) == E1000_STATUS_SPEED_1000 ?
459*1b481fc3SMaciej Żenczykowski 		"1000Mb/s" : "not used",
460*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_PCIX_MODE) ? "PCI-X" : "PCI",
461*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_PCIX_MODE) ?
462*1b481fc3SMaciej Żenczykowski 			((reg & E1000_STATUS_PCIX_SPEED_133) ? "133MHz" :
463*1b481fc3SMaciej Żenczykowski 			(reg & E1000_STATUS_PCIX_SPEED_100) ? "100MHz" :
464*1b481fc3SMaciej Żenczykowski 			"66MHz")	       :
465*1b481fc3SMaciej Żenczykowski 			((reg & E1000_STATUS_PCI66) ? "66MHz" : "33MHz"),
466*1b481fc3SMaciej Żenczykowski 		(reg & E1000_STATUS_BUS64) ? "64-bit" : "32-bit");
467*1b481fc3SMaciej Żenczykowski 	}
468*1b481fc3SMaciej Żenczykowski 
469*1b481fc3SMaciej Żenczykowski 	/* Receive control register */
470*1b481fc3SMaciej Żenczykowski 	reg = regs_buff[2];
471*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
472*1b481fc3SMaciej Żenczykowski 		"0x00100: RCTL (Receive control register) 0x%08X\n"
473*1b481fc3SMaciej Żenczykowski 		"      Receiver:                          %s\n"
474*1b481fc3SMaciej Żenczykowski 		"      Store bad packets:                 %s\n"
475*1b481fc3SMaciej Żenczykowski 		"      Unicast promiscuous:               %s\n"
476*1b481fc3SMaciej Żenczykowski 		"      Multicast promiscuous:             %s\n"
477*1b481fc3SMaciej Żenczykowski 		"      Long packet:                       %s\n"
478*1b481fc3SMaciej Żenczykowski 		"      Descriptor minimum threshold size: %s\n"
479*1b481fc3SMaciej Żenczykowski 		"      Broadcast accept mode:             %s\n"
480*1b481fc3SMaciej Żenczykowski 		"      VLAN filter:                       %s\n"
481*1b481fc3SMaciej Żenczykowski 		"      Canonical form indicator:          %s\n"
482*1b481fc3SMaciej Żenczykowski 		"      Discard pause frames:              %s\n"
483*1b481fc3SMaciej Żenczykowski 		"      Pass MAC control frames:           %s\n",
484*1b481fc3SMaciej Żenczykowski 		reg,
485*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_EN      ? "enabled"  : "disabled",
486*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_SBP     ? "enabled"  : "disabled",
487*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_UPE     ? "enabled"  : "disabled",
488*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_MPE     ? "enabled"  : "disabled",
489*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_LPE     ? "enabled"  : "disabled",
490*1b481fc3SMaciej Żenczykowski 		(reg & E1000_RCTL_RDMTS) == E1000_RCTL_RDMTS_HALF  ? "1/2" :
491*1b481fc3SMaciej Żenczykowski 		(reg & E1000_RCTL_RDMTS) == E1000_RCTL_RDMTS_QUAT  ? "1/4" :
492*1b481fc3SMaciej Żenczykowski 		(reg & E1000_RCTL_RDMTS) == E1000_RCTL_RDMTS_EIGTH ? "1/8" :
493*1b481fc3SMaciej Żenczykowski 		"reserved",
494*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_BAM     ? "accept"   : "ignore",
495*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_VFE     ? "enabled"  : "disabled",
496*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_CFIEN   ? "enabled"  : "disabled",
497*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_DPF     ? "ignored"  : "filtered",
498*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_PMCF    ? "pass"     : "don't pass");
499*1b481fc3SMaciej Żenczykowski 	if(mac_type >= e1000_82543) {
500*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
501*1b481fc3SMaciej Żenczykowski 		"      Receive buffer size:               %s\n",
502*1b481fc3SMaciej Żenczykowski 		reg & E1000_RCTL_BSEX    ?
503*1b481fc3SMaciej Żenczykowski 			((reg & E1000_RCTL_SZ)==E1000_RCTL_SZ_16384 ? "16384" :
504*1b481fc3SMaciej Żenczykowski 			 (reg & E1000_RCTL_SZ)==E1000_RCTL_SZ_8192  ? "8192"  :
505*1b481fc3SMaciej Żenczykowski 			 (reg & E1000_RCTL_SZ)==E1000_RCTL_SZ_4096  ? "4096"  :
506*1b481fc3SMaciej Żenczykowski 			 "reserved")     :
507*1b481fc3SMaciej Żenczykowski 			((reg & E1000_RCTL_SZ)==E1000_RCTL_SZ_2048  ? "2048"  :
508*1b481fc3SMaciej Żenczykowski 			 (reg & E1000_RCTL_SZ)==E1000_RCTL_SZ_1024  ? "1024"  :
509*1b481fc3SMaciej Żenczykowski 			 (reg & E1000_RCTL_SZ)==E1000_RCTL_SZ_512   ? "512"   :
510*1b481fc3SMaciej Żenczykowski 			 "256"));
511*1b481fc3SMaciej Żenczykowski 	} else {
512*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
513*1b481fc3SMaciej Żenczykowski 		"      Receive buffer size:               %s\n",
514*1b481fc3SMaciej Żenczykowski 		(reg & E1000_RCTL_SZ) == E1000_RCTL_SZ_2048  ? "2048"  :
515*1b481fc3SMaciej Żenczykowski 		(reg & E1000_RCTL_SZ) == E1000_RCTL_SZ_1024  ? "1024"  :
516*1b481fc3SMaciej Żenczykowski 		(reg & E1000_RCTL_SZ) == E1000_RCTL_SZ_512   ? "512"   :
517*1b481fc3SMaciej Żenczykowski 		"256");
518*1b481fc3SMaciej Żenczykowski 	}
519*1b481fc3SMaciej Żenczykowski 
520*1b481fc3SMaciej Żenczykowski 	/* Receive descriptor registers */
521*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
522*1b481fc3SMaciej Żenczykowski 		"0x02808: RDLEN (Receive desc length)     0x%08X\n",
523*1b481fc3SMaciej Żenczykowski 		regs_buff[3]);
524*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
525*1b481fc3SMaciej Żenczykowski 		"0x02810: RDH   (Receive desc head)       0x%08X\n",
526*1b481fc3SMaciej Żenczykowski 		regs_buff[4]);
527*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
528*1b481fc3SMaciej Żenczykowski 		"0x02818: RDT   (Receive desc tail)       0x%08X\n",
529*1b481fc3SMaciej Żenczykowski 		regs_buff[5]);
530*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
531*1b481fc3SMaciej Żenczykowski 		"0x02820: RDTR  (Receive delay timer)     0x%08X\n",
532*1b481fc3SMaciej Żenczykowski 		regs_buff[6]);
533*1b481fc3SMaciej Żenczykowski 
534*1b481fc3SMaciej Żenczykowski 	/* Transmit control register */
535*1b481fc3SMaciej Żenczykowski 	reg = regs_buff[7];
536*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
537*1b481fc3SMaciej Żenczykowski 		"0x00400: TCTL (Transmit ctrl register)   0x%08X\n"
538*1b481fc3SMaciej Żenczykowski 		"      Transmitter:                       %s\n"
539*1b481fc3SMaciej Żenczykowski 		"      Pad short packets:                 %s\n"
540*1b481fc3SMaciej Żenczykowski 		"      Software XOFF Transmission:        %s\n",
541*1b481fc3SMaciej Żenczykowski 		reg,
542*1b481fc3SMaciej Żenczykowski 		reg & E1000_TCTL_EN      ? "enabled"  : "disabled",
543*1b481fc3SMaciej Żenczykowski 		reg & E1000_TCTL_PSP     ? "enabled"  : "disabled",
544*1b481fc3SMaciej Żenczykowski 		reg & E1000_TCTL_SWXOFF  ? "enabled"  : "disabled");
545*1b481fc3SMaciej Żenczykowski 	if(mac_type >= e1000_82543) {
546*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
547*1b481fc3SMaciej Żenczykowski 		"      Re-transmit on late collision:     %s\n",
548*1b481fc3SMaciej Żenczykowski 		reg & E1000_TCTL_RTLC    ? "enabled"  : "disabled");
549*1b481fc3SMaciej Żenczykowski 	}
550*1b481fc3SMaciej Żenczykowski 
551*1b481fc3SMaciej Żenczykowski 	/* Transmit descriptor registers */
552*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
553*1b481fc3SMaciej Żenczykowski 		"0x03808: TDLEN (Transmit desc length)    0x%08X\n",
554*1b481fc3SMaciej Żenczykowski 		regs_buff[8]);
555*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
556*1b481fc3SMaciej Żenczykowski 		"0x03810: TDH   (Transmit desc head)      0x%08X\n",
557*1b481fc3SMaciej Żenczykowski 		regs_buff[9]);
558*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
559*1b481fc3SMaciej Żenczykowski 		"0x03818: TDT   (Transmit desc tail)      0x%08X\n",
560*1b481fc3SMaciej Żenczykowski 		regs_buff[10]);
561*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
562*1b481fc3SMaciej Żenczykowski 		"0x03820: TIDV  (Transmit delay timer)    0x%08X\n",
563*1b481fc3SMaciej Żenczykowski 		regs_buff[11]);
564*1b481fc3SMaciej Żenczykowski 
565*1b481fc3SMaciej Żenczykowski 	/* PHY type */
566*1b481fc3SMaciej Żenczykowski 	fprintf(stdout,
567*1b481fc3SMaciej Żenczykowski 		"PHY type:                                %s\n",
568*1b481fc3SMaciej Żenczykowski 		regs_buff[12] == 0 ? "M88" :
569*1b481fc3SMaciej Żenczykowski 		regs_buff[12] == 1 ? "IGP" :
570*1b481fc3SMaciej Żenczykowski 		regs_buff[12] == 2 ? "IGP2" : "unknown" );
571*1b481fc3SMaciej Żenczykowski 
572*1b481fc3SMaciej Żenczykowski 	if (0 == regs_buff[12]) {
573*1b481fc3SMaciej Żenczykowski 		reg = regs_buff[13];
574*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
575*1b481fc3SMaciej Żenczykowski 			"M88 PHY STATUS REGISTER:                 0x%08X\n"
576*1b481fc3SMaciej Żenczykowski 			"      Jabber:                            %s\n"
577*1b481fc3SMaciej Żenczykowski 			"      Polarity:                          %s\n"
578*1b481fc3SMaciej Żenczykowski 			"      Downshifted:                       %s\n"
579*1b481fc3SMaciej Żenczykowski 			"      MDI/MDIX:                          %s\n"
580*1b481fc3SMaciej Żenczykowski 			"      Cable Length Estimate:             %s meters\n"
581*1b481fc3SMaciej Żenczykowski 			"      Link State:                        %s\n"
582*1b481fc3SMaciej Żenczykowski 			"      Speed & Duplex Resolved:           %s\n"
583*1b481fc3SMaciej Żenczykowski 			"      Page Received:                     %s\n"
584*1b481fc3SMaciej Żenczykowski 			"      Duplex:                            %s\n"
585*1b481fc3SMaciej Żenczykowski 			"      Speed:                             %s mbps\n",
586*1b481fc3SMaciej Żenczykowski 			reg,
587*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_JABBER       ? "yes"     : "no",
588*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_REV_POLARITY ? "reverse" : "normal",
589*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_DOWNSHIFT    ? "yes"     : "no",
590*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_MDIX         ? "MDIX"    : "MDI",
591*1b481fc3SMaciej Żenczykowski 			((reg & M88_PSSR_CABLE_LENGTH)==M88_PSSR_CL_0_50 ? "0-50"
592*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSSR_CABLE_LENGTH)==M88_PSSR_CL_50_80 ? "50-80"
593*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSSR_CABLE_LENGTH)==M88_PSSR_CL_80_110 ? "80-110"
594*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSSR_CABLE_LENGTH)==M88_PSSR_CL_110_140? "110-140"
595*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSSR_CABLE_LENGTH)==M88_PSSR_CL_140_PLUS ? "140+"
596*1b481fc3SMaciej Żenczykowski 				: "unknown"),
597*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_LINK              ? "Up"      : "Down",
598*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_SPD_DPLX_RESOLVED ? "Yes"     : "No",
599*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_PAGE_RCVD         ? "Yes"     : "No",
600*1b481fc3SMaciej Żenczykowski 			reg & M88_PSSR_DPLX              ? "Full"    : "Half",
601*1b481fc3SMaciej Żenczykowski 			((reg & M88_PSSR_SPEED)==M88_PSSR_10MBS        ? "10"
602*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSSR_SPEED)==M88_PSSR_100MBS  ? "100"
603*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSSR_SPEED)==M88_PSSR_1000MBS ? "1000"
604*1b481fc3SMaciej Żenczykowski 				: "unknown")
605*1b481fc3SMaciej Żenczykowski 		);
606*1b481fc3SMaciej Żenczykowski 
607*1b481fc3SMaciej Żenczykowski 		reg = regs_buff[17];
608*1b481fc3SMaciej Żenczykowski 		fprintf(stdout,
609*1b481fc3SMaciej Żenczykowski 			"M88 PHY CONTROL REGISTER:                0x%08X\n"
610*1b481fc3SMaciej Żenczykowski 			"      Jabber function:                   %s\n"
611*1b481fc3SMaciej Żenczykowski 			"      Auto-polarity:                     %s\n"
612*1b481fc3SMaciej Żenczykowski 			"      SQE Test:                          %s\n"
613*1b481fc3SMaciej Żenczykowski 			"      CLK125:                            %s\n"
614*1b481fc3SMaciej Żenczykowski 			"      Auto-MDIX:                         %s\n"
615*1b481fc3SMaciej Żenczykowski 			"      Extended 10Base-T Distance:        %s\n"
616*1b481fc3SMaciej Żenczykowski 			"      100Base-TX Interface:              %s\n"
617*1b481fc3SMaciej Żenczykowski 			"      Scrambler:                         %s\n"
618*1b481fc3SMaciej Żenczykowski 			"      Force Link Good:                   %s\n"
619*1b481fc3SMaciej Żenczykowski 			"      Assert CRS on Transmit:            %s\n",
620*1b481fc3SMaciej Żenczykowski 			reg,
621*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_JABBER_DISABLE    ? "disabled" : "enabled",
622*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_POLARITY_REVERSAL ? "enabled"  : "disabled",
623*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_SQE_TEST          ? "enabled"  : "disabled",
624*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_CLK125_DISABLE    ? "disabled" : "enabled",
625*1b481fc3SMaciej Żenczykowski 			((reg & M88_PSCR_MDI_MASK)==M88_PSCR_MDI_MANUAL_MODE ? "force MDI"
626*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSCR_MDI_MASK)==M88_PSCR_MDIX_MANUAL_MODE ? "force MDIX"
627*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSCR_MDI_MASK)==M88_PSCR_AUTO_X_1000T ? "1000 auto, 10/100 MDI"
628*1b481fc3SMaciej Żenczykowski 				: (reg & M88_PSCR_MDI_MASK)==M88_PSCR_AUTO_X_MODE ? "auto"
629*1b481fc3SMaciej Żenczykowski 				: "wtf"),
630*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_10BT_EXT_DIST_ENABLE ? "enabled" : "disabled",
631*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_MII_5BIT_ENABLE ? "5-bit" : "MII",
632*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_SCRAMBLER_DISABLE ? "disabled" : "enabled",
633*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_FORCE_LINK_GOOD ? "forced" : "disabled",
634*1b481fc3SMaciej Żenczykowski 			reg & M88_PSCR_ASSERT_CRS_ON_TX ? "enabled" : "disabled"
635*1b481fc3SMaciej Żenczykowski 		);
636*1b481fc3SMaciej Żenczykowski 	}
637*1b481fc3SMaciej Żenczykowski 
638*1b481fc3SMaciej Żenczykowski 	return 0;
639*1b481fc3SMaciej Żenczykowski }
640*1b481fc3SMaciej Żenczykowski 
641