xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/intel/ixgb/ixgb_hw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright(c) 1999 - 2008 Intel Corporation. */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef _IXGB_HW_H_
5*4882a593Smuzhiyun #define _IXGB_HW_H_
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/mdio.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include "ixgb_osdep.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /* Enums */
12*4882a593Smuzhiyun typedef enum {
13*4882a593Smuzhiyun 	ixgb_mac_unknown = 0,
14*4882a593Smuzhiyun 	ixgb_82597,
15*4882a593Smuzhiyun 	ixgb_num_macs
16*4882a593Smuzhiyun } ixgb_mac_type;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* Types of physical layer modules */
19*4882a593Smuzhiyun typedef enum {
20*4882a593Smuzhiyun 	ixgb_phy_type_unknown = 0,
21*4882a593Smuzhiyun 	ixgb_phy_type_g6005,	/* 850nm, MM fiber, XPAK transceiver */
22*4882a593Smuzhiyun 	ixgb_phy_type_g6104,	/* 1310nm, SM fiber, XPAK transceiver */
23*4882a593Smuzhiyun 	ixgb_phy_type_txn17201,	/* 850nm, MM fiber, XPAK transceiver */
24*4882a593Smuzhiyun 	ixgb_phy_type_txn17401,	/* 1310nm, SM fiber, XENPAK transceiver */
25*4882a593Smuzhiyun 	ixgb_phy_type_bcm	/* SUN specific board */
26*4882a593Smuzhiyun } ixgb_phy_type;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* XPAK transceiver vendors, for the SR adapters */
29*4882a593Smuzhiyun typedef enum {
30*4882a593Smuzhiyun 	ixgb_xpak_vendor_intel,
31*4882a593Smuzhiyun 	ixgb_xpak_vendor_infineon
32*4882a593Smuzhiyun } ixgb_xpak_vendor;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* Media Types */
35*4882a593Smuzhiyun typedef enum {
36*4882a593Smuzhiyun 	ixgb_media_type_unknown = 0,
37*4882a593Smuzhiyun 	ixgb_media_type_fiber = 1,
38*4882a593Smuzhiyun 	ixgb_media_type_copper = 2,
39*4882a593Smuzhiyun 	ixgb_num_media_types
40*4882a593Smuzhiyun } ixgb_media_type;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* Flow Control Settings */
43*4882a593Smuzhiyun typedef enum {
44*4882a593Smuzhiyun 	ixgb_fc_none = 0,
45*4882a593Smuzhiyun 	ixgb_fc_rx_pause = 1,
46*4882a593Smuzhiyun 	ixgb_fc_tx_pause = 2,
47*4882a593Smuzhiyun 	ixgb_fc_full = 3,
48*4882a593Smuzhiyun 	ixgb_fc_default = 0xFF
49*4882a593Smuzhiyun } ixgb_fc_type;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* PCI bus types */
52*4882a593Smuzhiyun typedef enum {
53*4882a593Smuzhiyun 	ixgb_bus_type_unknown = 0,
54*4882a593Smuzhiyun 	ixgb_bus_type_pci,
55*4882a593Smuzhiyun 	ixgb_bus_type_pcix
56*4882a593Smuzhiyun } ixgb_bus_type;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* PCI bus speeds */
59*4882a593Smuzhiyun typedef enum {
60*4882a593Smuzhiyun 	ixgb_bus_speed_unknown = 0,
61*4882a593Smuzhiyun 	ixgb_bus_speed_33,
62*4882a593Smuzhiyun 	ixgb_bus_speed_66,
63*4882a593Smuzhiyun 	ixgb_bus_speed_100,
64*4882a593Smuzhiyun 	ixgb_bus_speed_133,
65*4882a593Smuzhiyun 	ixgb_bus_speed_reserved
66*4882a593Smuzhiyun } ixgb_bus_speed;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* PCI bus widths */
69*4882a593Smuzhiyun typedef enum {
70*4882a593Smuzhiyun 	ixgb_bus_width_unknown = 0,
71*4882a593Smuzhiyun 	ixgb_bus_width_32,
72*4882a593Smuzhiyun 	ixgb_bus_width_64
73*4882a593Smuzhiyun } ixgb_bus_width;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define IXGB_EEPROM_SIZE    64	/* Size in words */
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define SPEED_10000  10000
78*4882a593Smuzhiyun #define FULL_DUPLEX  2
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define MIN_NUMBER_OF_DESCRIPTORS       8
81*4882a593Smuzhiyun #define MAX_NUMBER_OF_DESCRIPTORS  0xFFF8	/* 13 bits in RDLEN/TDLEN, 128B aligned     */
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define IXGB_DELAY_BEFORE_RESET        10	/* allow 10ms after idling rx/tx units      */
84*4882a593Smuzhiyun #define IXGB_DELAY_AFTER_RESET          1	/* allow 1ms after the reset                */
85*4882a593Smuzhiyun #define IXGB_DELAY_AFTER_EE_RESET      10	/* allow 10ms after the EEPROM reset        */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define IXGB_DELAY_USECS_AFTER_LINK_RESET    13	/* allow 13 microseconds after the reset    */
88*4882a593Smuzhiyun 					   /* NOTE: this is MICROSECONDS               */
89*4882a593Smuzhiyun #define MAX_RESET_ITERATIONS            8	/* number of iterations to get things right */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* General Registers */
92*4882a593Smuzhiyun #define IXGB_CTRL0   0x00000	/* Device Control Register 0 - RW */
93*4882a593Smuzhiyun #define IXGB_CTRL1   0x00008	/* Device Control Register 1 - RW */
94*4882a593Smuzhiyun #define IXGB_STATUS  0x00010	/* Device Status Register - RO */
95*4882a593Smuzhiyun #define IXGB_EECD    0x00018	/* EEPROM/Flash Control/Data Register - RW */
96*4882a593Smuzhiyun #define IXGB_MFS     0x00020	/* Maximum Frame Size - RW */
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* Interrupt */
99*4882a593Smuzhiyun #define IXGB_ICR     0x00080	/* Interrupt Cause Read - R/clr */
100*4882a593Smuzhiyun #define IXGB_ICS     0x00088	/* Interrupt Cause Set - RW */
101*4882a593Smuzhiyun #define IXGB_IMS     0x00090	/* Interrupt Mask Set/Read - RW */
102*4882a593Smuzhiyun #define IXGB_IMC     0x00098	/* Interrupt Mask Clear - WO */
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* Receive */
105*4882a593Smuzhiyun #define IXGB_RCTL    0x00100	/* RX Control - RW */
106*4882a593Smuzhiyun #define IXGB_FCRTL   0x00108	/* Flow Control Receive Threshold Low - RW */
107*4882a593Smuzhiyun #define IXGB_FCRTH   0x00110	/* Flow Control Receive Threshold High - RW */
108*4882a593Smuzhiyun #define IXGB_RDBAL   0x00118	/* RX Descriptor Base Low - RW */
109*4882a593Smuzhiyun #define IXGB_RDBAH   0x0011C	/* RX Descriptor Base High - RW */
110*4882a593Smuzhiyun #define IXGB_RDLEN   0x00120	/* RX Descriptor Length - RW */
111*4882a593Smuzhiyun #define IXGB_RDH     0x00128	/* RX Descriptor Head - RW */
112*4882a593Smuzhiyun #define IXGB_RDT     0x00130	/* RX Descriptor Tail - RW */
113*4882a593Smuzhiyun #define IXGB_RDTR    0x00138	/* RX Delay Timer Ring - RW */
114*4882a593Smuzhiyun #define IXGB_RXDCTL  0x00140	/* Receive Descriptor Control - RW */
115*4882a593Smuzhiyun #define IXGB_RAIDC   0x00148	/* Receive Adaptive Interrupt Delay Control - RW */
116*4882a593Smuzhiyun #define IXGB_RXCSUM  0x00158	/* Receive Checksum Control - RW */
117*4882a593Smuzhiyun #define IXGB_RA      0x00180	/* Receive Address Array Base - RW */
118*4882a593Smuzhiyun #define IXGB_RAL     0x00180	/* Receive Address Low [0:15] - RW */
119*4882a593Smuzhiyun #define IXGB_RAH     0x00184	/* Receive Address High [0:15] - RW */
120*4882a593Smuzhiyun #define IXGB_MTA     0x00200	/* Multicast Table Array [0:127] - RW */
121*4882a593Smuzhiyun #define IXGB_VFTA    0x00400	/* VLAN Filter Table Array [0:127] - RW */
122*4882a593Smuzhiyun #define IXGB_REQ_RX_DESCRIPTOR_MULTIPLE 8
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /* Transmit */
125*4882a593Smuzhiyun #define IXGB_TCTL    0x00600	/* TX Control - RW */
126*4882a593Smuzhiyun #define IXGB_TDBAL   0x00608	/* TX Descriptor Base Low - RW */
127*4882a593Smuzhiyun #define IXGB_TDBAH   0x0060C	/* TX Descriptor Base High - RW */
128*4882a593Smuzhiyun #define IXGB_TDLEN   0x00610	/* TX Descriptor Length - RW */
129*4882a593Smuzhiyun #define IXGB_TDH     0x00618	/* TX Descriptor Head - RW */
130*4882a593Smuzhiyun #define IXGB_TDT     0x00620	/* TX Descriptor Tail - RW */
131*4882a593Smuzhiyun #define IXGB_TIDV    0x00628	/* TX Interrupt Delay Value - RW */
132*4882a593Smuzhiyun #define IXGB_TXDCTL  0x00630	/* Transmit Descriptor Control - RW */
133*4882a593Smuzhiyun #define IXGB_TSPMT   0x00638	/* TCP Segmentation PAD & Min Threshold - RW */
134*4882a593Smuzhiyun #define IXGB_PAP     0x00640	/* Pause and Pace - RW */
135*4882a593Smuzhiyun #define IXGB_REQ_TX_DESCRIPTOR_MULTIPLE 8
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* Physical */
138*4882a593Smuzhiyun #define IXGB_PCSC1   0x00700	/* PCS Control 1 - RW */
139*4882a593Smuzhiyun #define IXGB_PCSC2   0x00708	/* PCS Control 2 - RW */
140*4882a593Smuzhiyun #define IXGB_PCSS1   0x00710	/* PCS Status 1 - RO */
141*4882a593Smuzhiyun #define IXGB_PCSS2   0x00718	/* PCS Status 2 - RO */
142*4882a593Smuzhiyun #define IXGB_XPCSS   0x00720	/* 10GBASE-X PCS Status (or XGXS Lane Status) - RO */
143*4882a593Smuzhiyun #define IXGB_UCCR    0x00728	/* Unilink Circuit Control Register */
144*4882a593Smuzhiyun #define IXGB_XPCSTC  0x00730	/* 10GBASE-X PCS Test Control */
145*4882a593Smuzhiyun #define IXGB_MACA    0x00738	/* MDI Autoscan Command and Address - RW */
146*4882a593Smuzhiyun #define IXGB_APAE    0x00740	/* Autoscan PHY Address Enable - RW */
147*4882a593Smuzhiyun #define IXGB_ARD     0x00748	/* Autoscan Read Data - RO */
148*4882a593Smuzhiyun #define IXGB_AIS     0x00750	/* Autoscan Interrupt Status - RO */
149*4882a593Smuzhiyun #define IXGB_MSCA    0x00758	/* MDI Single Command and Address - RW */
150*4882a593Smuzhiyun #define IXGB_MSRWD   0x00760	/* MDI Single Read and Write Data - RW, RO */
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* Wake-up */
153*4882a593Smuzhiyun #define IXGB_WUFC    0x00808	/* Wake Up Filter Control - RW */
154*4882a593Smuzhiyun #define IXGB_WUS     0x00810	/* Wake Up Status - RO */
155*4882a593Smuzhiyun #define IXGB_FFLT    0x01000	/* Flexible Filter Length Table - RW */
156*4882a593Smuzhiyun #define IXGB_FFMT    0x01020	/* Flexible Filter Mask Table - RW */
157*4882a593Smuzhiyun #define IXGB_FTVT    0x01420	/* Flexible Filter Value Table - RW */
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* Statistics */
160*4882a593Smuzhiyun #define IXGB_TPRL    0x02000	/* Total Packets Received (Low) */
161*4882a593Smuzhiyun #define IXGB_TPRH    0x02004	/* Total Packets Received (High) */
162*4882a593Smuzhiyun #define IXGB_GPRCL   0x02008	/* Good Packets Received Count (Low) */
163*4882a593Smuzhiyun #define IXGB_GPRCH   0x0200C	/* Good Packets Received Count (High) */
164*4882a593Smuzhiyun #define IXGB_BPRCL   0x02010	/* Broadcast Packets Received Count (Low) */
165*4882a593Smuzhiyun #define IXGB_BPRCH   0x02014	/* Broadcast Packets Received Count (High) */
166*4882a593Smuzhiyun #define IXGB_MPRCL   0x02018	/* Multicast Packets Received Count (Low) */
167*4882a593Smuzhiyun #define IXGB_MPRCH   0x0201C	/* Multicast Packets Received Count (High) */
168*4882a593Smuzhiyun #define IXGB_UPRCL   0x02020	/* Unicast Packets Received Count (Low) */
169*4882a593Smuzhiyun #define IXGB_UPRCH   0x02024	/* Unicast Packets Received Count (High) */
170*4882a593Smuzhiyun #define IXGB_VPRCL   0x02028	/* VLAN Packets Received Count (Low) */
171*4882a593Smuzhiyun #define IXGB_VPRCH   0x0202C	/* VLAN Packets Received Count (High) */
172*4882a593Smuzhiyun #define IXGB_JPRCL   0x02030	/* Jumbo Packets Received Count (Low) */
173*4882a593Smuzhiyun #define IXGB_JPRCH   0x02034	/* Jumbo Packets Received Count (High) */
174*4882a593Smuzhiyun #define IXGB_GORCL   0x02038	/* Good Octets Received Count (Low) */
175*4882a593Smuzhiyun #define IXGB_GORCH   0x0203C	/* Good Octets Received Count (High) */
176*4882a593Smuzhiyun #define IXGB_TORL    0x02040	/* Total Octets Received (Low) */
177*4882a593Smuzhiyun #define IXGB_TORH    0x02044	/* Total Octets Received (High) */
178*4882a593Smuzhiyun #define IXGB_RNBC    0x02048	/* Receive No Buffers Count */
179*4882a593Smuzhiyun #define IXGB_RUC     0x02050	/* Receive Undersize Count */
180*4882a593Smuzhiyun #define IXGB_ROC     0x02058	/* Receive Oversize Count */
181*4882a593Smuzhiyun #define IXGB_RLEC    0x02060	/* Receive Length Error Count */
182*4882a593Smuzhiyun #define IXGB_CRCERRS 0x02068	/* CRC Error Count */
183*4882a593Smuzhiyun #define IXGB_ICBC    0x02070	/* Illegal control byte in mid-packet Count */
184*4882a593Smuzhiyun #define IXGB_ECBC    0x02078	/* Error Control byte in mid-packet Count */
185*4882a593Smuzhiyun #define IXGB_MPC     0x02080	/* Missed Packets Count */
186*4882a593Smuzhiyun #define IXGB_TPTL    0x02100	/* Total Packets Transmitted (Low) */
187*4882a593Smuzhiyun #define IXGB_TPTH    0x02104	/* Total Packets Transmitted (High) */
188*4882a593Smuzhiyun #define IXGB_GPTCL   0x02108	/* Good Packets Transmitted Count (Low) */
189*4882a593Smuzhiyun #define IXGB_GPTCH   0x0210C	/* Good Packets Transmitted Count (High) */
190*4882a593Smuzhiyun #define IXGB_BPTCL   0x02110	/* Broadcast Packets Transmitted Count (Low) */
191*4882a593Smuzhiyun #define IXGB_BPTCH   0x02114	/* Broadcast Packets Transmitted Count (High) */
192*4882a593Smuzhiyun #define IXGB_MPTCL   0x02118	/* Multicast Packets Transmitted Count (Low) */
193*4882a593Smuzhiyun #define IXGB_MPTCH   0x0211C	/* Multicast Packets Transmitted Count (High) */
194*4882a593Smuzhiyun #define IXGB_UPTCL   0x02120	/* Unicast Packets Transmitted Count (Low) */
195*4882a593Smuzhiyun #define IXGB_UPTCH   0x02124	/* Unicast Packets Transmitted Count (High) */
196*4882a593Smuzhiyun #define IXGB_VPTCL   0x02128	/* VLAN Packets Transmitted Count (Low) */
197*4882a593Smuzhiyun #define IXGB_VPTCH   0x0212C	/* VLAN Packets Transmitted Count (High) */
198*4882a593Smuzhiyun #define IXGB_JPTCL   0x02130	/* Jumbo Packets Transmitted Count (Low) */
199*4882a593Smuzhiyun #define IXGB_JPTCH   0x02134	/* Jumbo Packets Transmitted Count (High) */
200*4882a593Smuzhiyun #define IXGB_GOTCL   0x02138	/* Good Octets Transmitted Count (Low) */
201*4882a593Smuzhiyun #define IXGB_GOTCH   0x0213C	/* Good Octets Transmitted Count (High) */
202*4882a593Smuzhiyun #define IXGB_TOTL    0x02140	/* Total Octets Transmitted Count (Low) */
203*4882a593Smuzhiyun #define IXGB_TOTH    0x02144	/* Total Octets Transmitted Count (High) */
204*4882a593Smuzhiyun #define IXGB_DC      0x02148	/* Defer Count */
205*4882a593Smuzhiyun #define IXGB_PLT64C  0x02150	/* Packet Transmitted was less than 64 bytes Count */
206*4882a593Smuzhiyun #define IXGB_TSCTC   0x02170	/* TCP Segmentation Context Transmitted Count */
207*4882a593Smuzhiyun #define IXGB_TSCTFC  0x02178	/* TCP Segmentation Context Tx Fail Count */
208*4882a593Smuzhiyun #define IXGB_IBIC    0x02180	/* Illegal byte during Idle stream count */
209*4882a593Smuzhiyun #define IXGB_RFC     0x02188	/* Remote Fault Count */
210*4882a593Smuzhiyun #define IXGB_LFC     0x02190	/* Local Fault Count */
211*4882a593Smuzhiyun #define IXGB_PFRC    0x02198	/* Pause Frame Receive Count */
212*4882a593Smuzhiyun #define IXGB_PFTC    0x021A0	/* Pause Frame Transmit Count */
213*4882a593Smuzhiyun #define IXGB_MCFRC   0x021A8	/* MAC Control Frames (non-Pause) Received Count */
214*4882a593Smuzhiyun #define IXGB_MCFTC   0x021B0	/* MAC Control Frames (non-Pause) Transmitted Count */
215*4882a593Smuzhiyun #define IXGB_XONRXC  0x021B8	/* XON Received Count */
216*4882a593Smuzhiyun #define IXGB_XONTXC  0x021C0	/* XON Transmitted Count */
217*4882a593Smuzhiyun #define IXGB_XOFFRXC 0x021C8	/* XOFF Received Count */
218*4882a593Smuzhiyun #define IXGB_XOFFTXC 0x021D0	/* XOFF Transmitted Count */
219*4882a593Smuzhiyun #define IXGB_RJC     0x021D8	/* Receive Jabber Count */
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /* CTRL0 Bit Masks */
222*4882a593Smuzhiyun #define IXGB_CTRL0_LRST     0x00000008
223*4882a593Smuzhiyun #define IXGB_CTRL0_JFE      0x00000010
224*4882a593Smuzhiyun #define IXGB_CTRL0_XLE      0x00000020
225*4882a593Smuzhiyun #define IXGB_CTRL0_MDCS     0x00000040
226*4882a593Smuzhiyun #define IXGB_CTRL0_CMDC     0x00000080
227*4882a593Smuzhiyun #define IXGB_CTRL0_SDP0     0x00040000
228*4882a593Smuzhiyun #define IXGB_CTRL0_SDP1     0x00080000
229*4882a593Smuzhiyun #define IXGB_CTRL0_SDP2     0x00100000
230*4882a593Smuzhiyun #define IXGB_CTRL0_SDP3     0x00200000
231*4882a593Smuzhiyun #define IXGB_CTRL0_SDP0_DIR 0x00400000
232*4882a593Smuzhiyun #define IXGB_CTRL0_SDP1_DIR 0x00800000
233*4882a593Smuzhiyun #define IXGB_CTRL0_SDP2_DIR 0x01000000
234*4882a593Smuzhiyun #define IXGB_CTRL0_SDP3_DIR 0x02000000
235*4882a593Smuzhiyun #define IXGB_CTRL0_RST      0x04000000
236*4882a593Smuzhiyun #define IXGB_CTRL0_RPE      0x08000000
237*4882a593Smuzhiyun #define IXGB_CTRL0_TPE      0x10000000
238*4882a593Smuzhiyun #define IXGB_CTRL0_VME      0x40000000
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /* CTRL1 Bit Masks */
241*4882a593Smuzhiyun #define IXGB_CTRL1_GPI0_EN     0x00000001
242*4882a593Smuzhiyun #define IXGB_CTRL1_GPI1_EN     0x00000002
243*4882a593Smuzhiyun #define IXGB_CTRL1_GPI2_EN     0x00000004
244*4882a593Smuzhiyun #define IXGB_CTRL1_GPI3_EN     0x00000008
245*4882a593Smuzhiyun #define IXGB_CTRL1_SDP4        0x00000010
246*4882a593Smuzhiyun #define IXGB_CTRL1_SDP5        0x00000020
247*4882a593Smuzhiyun #define IXGB_CTRL1_SDP6        0x00000040
248*4882a593Smuzhiyun #define IXGB_CTRL1_SDP7        0x00000080
249*4882a593Smuzhiyun #define IXGB_CTRL1_SDP4_DIR    0x00000100
250*4882a593Smuzhiyun #define IXGB_CTRL1_SDP5_DIR    0x00000200
251*4882a593Smuzhiyun #define IXGB_CTRL1_SDP6_DIR    0x00000400
252*4882a593Smuzhiyun #define IXGB_CTRL1_SDP7_DIR    0x00000800
253*4882a593Smuzhiyun #define IXGB_CTRL1_EE_RST      0x00002000
254*4882a593Smuzhiyun #define IXGB_CTRL1_RO_DIS      0x00020000
255*4882a593Smuzhiyun #define IXGB_CTRL1_PCIXHM_MASK 0x00C00000
256*4882a593Smuzhiyun #define IXGB_CTRL1_PCIXHM_1_2  0x00000000
257*4882a593Smuzhiyun #define IXGB_CTRL1_PCIXHM_5_8  0x00400000
258*4882a593Smuzhiyun #define IXGB_CTRL1_PCIXHM_3_4  0x00800000
259*4882a593Smuzhiyun #define IXGB_CTRL1_PCIXHM_7_8  0x00C00000
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /* STATUS Bit Masks */
262*4882a593Smuzhiyun #define IXGB_STATUS_LU            0x00000002
263*4882a593Smuzhiyun #define IXGB_STATUS_AIP           0x00000004
264*4882a593Smuzhiyun #define IXGB_STATUS_TXOFF         0x00000010
265*4882a593Smuzhiyun #define IXGB_STATUS_XAUIME        0x00000020
266*4882a593Smuzhiyun #define IXGB_STATUS_RES           0x00000040
267*4882a593Smuzhiyun #define IXGB_STATUS_RIS           0x00000080
268*4882a593Smuzhiyun #define IXGB_STATUS_RIE           0x00000100
269*4882a593Smuzhiyun #define IXGB_STATUS_RLF           0x00000200
270*4882a593Smuzhiyun #define IXGB_STATUS_RRF           0x00000400
271*4882a593Smuzhiyun #define IXGB_STATUS_PCI_SPD       0x00000800
272*4882a593Smuzhiyun #define IXGB_STATUS_BUS64         0x00001000
273*4882a593Smuzhiyun #define IXGB_STATUS_PCIX_MODE     0x00002000
274*4882a593Smuzhiyun #define IXGB_STATUS_PCIX_SPD_MASK 0x0000C000
275*4882a593Smuzhiyun #define IXGB_STATUS_PCIX_SPD_66   0x00000000
276*4882a593Smuzhiyun #define IXGB_STATUS_PCIX_SPD_100  0x00004000
277*4882a593Smuzhiyun #define IXGB_STATUS_PCIX_SPD_133  0x00008000
278*4882a593Smuzhiyun #define IXGB_STATUS_REV_ID_MASK   0x000F0000
279*4882a593Smuzhiyun #define IXGB_STATUS_REV_ID_SHIFT  16
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /* EECD Bit Masks */
282*4882a593Smuzhiyun #define IXGB_EECD_SK       0x00000001
283*4882a593Smuzhiyun #define IXGB_EECD_CS       0x00000002
284*4882a593Smuzhiyun #define IXGB_EECD_DI       0x00000004
285*4882a593Smuzhiyun #define IXGB_EECD_DO       0x00000008
286*4882a593Smuzhiyun #define IXGB_EECD_FWE_MASK 0x00000030
287*4882a593Smuzhiyun #define IXGB_EECD_FWE_DIS  0x00000010
288*4882a593Smuzhiyun #define IXGB_EECD_FWE_EN   0x00000020
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /* MFS */
291*4882a593Smuzhiyun #define IXGB_MFS_SHIFT 16
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun /* Interrupt Register Bit Masks (used for ICR, ICS, IMS, and IMC) */
294*4882a593Smuzhiyun #define IXGB_INT_TXDW     0x00000001
295*4882a593Smuzhiyun #define IXGB_INT_TXQE     0x00000002
296*4882a593Smuzhiyun #define IXGB_INT_LSC      0x00000004
297*4882a593Smuzhiyun #define IXGB_INT_RXSEQ    0x00000008
298*4882a593Smuzhiyun #define IXGB_INT_RXDMT0   0x00000010
299*4882a593Smuzhiyun #define IXGB_INT_RXO      0x00000040
300*4882a593Smuzhiyun #define IXGB_INT_RXT0     0x00000080
301*4882a593Smuzhiyun #define IXGB_INT_AUTOSCAN 0x00000200
302*4882a593Smuzhiyun #define IXGB_INT_GPI0     0x00000800
303*4882a593Smuzhiyun #define IXGB_INT_GPI1     0x00001000
304*4882a593Smuzhiyun #define IXGB_INT_GPI2     0x00002000
305*4882a593Smuzhiyun #define IXGB_INT_GPI3     0x00004000
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /* RCTL Bit Masks */
308*4882a593Smuzhiyun #define IXGB_RCTL_RXEN        0x00000002
309*4882a593Smuzhiyun #define IXGB_RCTL_SBP         0x00000004
310*4882a593Smuzhiyun #define IXGB_RCTL_UPE         0x00000008
311*4882a593Smuzhiyun #define IXGB_RCTL_MPE         0x00000010
312*4882a593Smuzhiyun #define IXGB_RCTL_RDMTS_MASK  0x00000300
313*4882a593Smuzhiyun #define IXGB_RCTL_RDMTS_1_2   0x00000000
314*4882a593Smuzhiyun #define IXGB_RCTL_RDMTS_1_4   0x00000100
315*4882a593Smuzhiyun #define IXGB_RCTL_RDMTS_1_8   0x00000200
316*4882a593Smuzhiyun #define IXGB_RCTL_MO_MASK     0x00003000
317*4882a593Smuzhiyun #define IXGB_RCTL_MO_47_36    0x00000000
318*4882a593Smuzhiyun #define IXGB_RCTL_MO_46_35    0x00001000
319*4882a593Smuzhiyun #define IXGB_RCTL_MO_45_34    0x00002000
320*4882a593Smuzhiyun #define IXGB_RCTL_MO_43_32    0x00003000
321*4882a593Smuzhiyun #define IXGB_RCTL_MO_SHIFT    12
322*4882a593Smuzhiyun #define IXGB_RCTL_BAM         0x00008000
323*4882a593Smuzhiyun #define IXGB_RCTL_BSIZE_MASK  0x00030000
324*4882a593Smuzhiyun #define IXGB_RCTL_BSIZE_2048  0x00000000
325*4882a593Smuzhiyun #define IXGB_RCTL_BSIZE_4096  0x00010000
326*4882a593Smuzhiyun #define IXGB_RCTL_BSIZE_8192  0x00020000
327*4882a593Smuzhiyun #define IXGB_RCTL_BSIZE_16384 0x00030000
328*4882a593Smuzhiyun #define IXGB_RCTL_VFE         0x00040000
329*4882a593Smuzhiyun #define IXGB_RCTL_CFIEN       0x00080000
330*4882a593Smuzhiyun #define IXGB_RCTL_CFI         0x00100000
331*4882a593Smuzhiyun #define IXGB_RCTL_RPDA_MASK   0x00600000
332*4882a593Smuzhiyun #define IXGB_RCTL_RPDA_MC_MAC 0x00000000
333*4882a593Smuzhiyun #define IXGB_RCTL_MC_ONLY     0x00400000
334*4882a593Smuzhiyun #define IXGB_RCTL_CFF         0x00800000
335*4882a593Smuzhiyun #define IXGB_RCTL_SECRC       0x04000000
336*4882a593Smuzhiyun #define IXGB_RDT_FPDB         0x80000000
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun #define IXGB_RCTL_IDLE_RX_UNIT 0
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /* FCRTL Bit Masks */
341*4882a593Smuzhiyun #define IXGB_FCRTL_XONE       0x80000000
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun /* RXDCTL Bit Masks */
344*4882a593Smuzhiyun #define IXGB_RXDCTL_PTHRESH_MASK  0x000001FF
345*4882a593Smuzhiyun #define IXGB_RXDCTL_PTHRESH_SHIFT 0
346*4882a593Smuzhiyun #define IXGB_RXDCTL_HTHRESH_MASK  0x0003FE00
347*4882a593Smuzhiyun #define IXGB_RXDCTL_HTHRESH_SHIFT 9
348*4882a593Smuzhiyun #define IXGB_RXDCTL_WTHRESH_MASK  0x07FC0000
349*4882a593Smuzhiyun #define IXGB_RXDCTL_WTHRESH_SHIFT 18
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun /* RAIDC Bit Masks */
352*4882a593Smuzhiyun #define IXGB_RAIDC_HIGHTHRS_MASK 0x0000003F
353*4882a593Smuzhiyun #define IXGB_RAIDC_DELAY_MASK    0x000FF800
354*4882a593Smuzhiyun #define IXGB_RAIDC_DELAY_SHIFT   11
355*4882a593Smuzhiyun #define IXGB_RAIDC_POLL_MASK     0x1FF00000
356*4882a593Smuzhiyun #define IXGB_RAIDC_POLL_SHIFT    20
357*4882a593Smuzhiyun #define IXGB_RAIDC_RXT_GATE      0x40000000
358*4882a593Smuzhiyun #define IXGB_RAIDC_EN            0x80000000
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun #define IXGB_RAIDC_POLL_1000_INTERRUPTS_PER_SECOND      1220
361*4882a593Smuzhiyun #define IXGB_RAIDC_POLL_5000_INTERRUPTS_PER_SECOND      244
362*4882a593Smuzhiyun #define IXGB_RAIDC_POLL_10000_INTERRUPTS_PER_SECOND     122
363*4882a593Smuzhiyun #define IXGB_RAIDC_POLL_20000_INTERRUPTS_PER_SECOND     61
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun /* RXCSUM Bit Masks */
366*4882a593Smuzhiyun #define IXGB_RXCSUM_IPOFL 0x00000100
367*4882a593Smuzhiyun #define IXGB_RXCSUM_TUOFL 0x00000200
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun /* RAH Bit Masks */
370*4882a593Smuzhiyun #define IXGB_RAH_ASEL_MASK 0x00030000
371*4882a593Smuzhiyun #define IXGB_RAH_ASEL_DEST 0x00000000
372*4882a593Smuzhiyun #define IXGB_RAH_ASEL_SRC  0x00010000
373*4882a593Smuzhiyun #define IXGB_RAH_AV        0x80000000
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun /* TCTL Bit Masks */
376*4882a593Smuzhiyun #define IXGB_TCTL_TCE  0x00000001
377*4882a593Smuzhiyun #define IXGB_TCTL_TXEN 0x00000002
378*4882a593Smuzhiyun #define IXGB_TCTL_TPDE 0x00000004
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun #define IXGB_TCTL_IDLE_TX_UNIT  0
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun /* TXDCTL Bit Masks */
383*4882a593Smuzhiyun #define IXGB_TXDCTL_PTHRESH_MASK  0x0000007F
384*4882a593Smuzhiyun #define IXGB_TXDCTL_HTHRESH_MASK  0x00007F00
385*4882a593Smuzhiyun #define IXGB_TXDCTL_HTHRESH_SHIFT 8
386*4882a593Smuzhiyun #define IXGB_TXDCTL_WTHRESH_MASK  0x007F0000
387*4882a593Smuzhiyun #define IXGB_TXDCTL_WTHRESH_SHIFT 16
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun /* TSPMT Bit Masks */
390*4882a593Smuzhiyun #define IXGB_TSPMT_TSMT_MASK   0x0000FFFF
391*4882a593Smuzhiyun #define IXGB_TSPMT_TSPBP_MASK  0xFFFF0000
392*4882a593Smuzhiyun #define IXGB_TSPMT_TSPBP_SHIFT 16
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /* PAP Bit Masks */
395*4882a593Smuzhiyun #define IXGB_PAP_TXPC_MASK 0x0000FFFF
396*4882a593Smuzhiyun #define IXGB_PAP_TXPV_MASK 0x000F0000
397*4882a593Smuzhiyun #define IXGB_PAP_TXPV_10G  0x00000000
398*4882a593Smuzhiyun #define IXGB_PAP_TXPV_1G   0x00010000
399*4882a593Smuzhiyun #define IXGB_PAP_TXPV_2G   0x00020000
400*4882a593Smuzhiyun #define IXGB_PAP_TXPV_3G   0x00030000
401*4882a593Smuzhiyun #define IXGB_PAP_TXPV_4G   0x00040000
402*4882a593Smuzhiyun #define IXGB_PAP_TXPV_5G   0x00050000
403*4882a593Smuzhiyun #define IXGB_PAP_TXPV_6G   0x00060000
404*4882a593Smuzhiyun #define IXGB_PAP_TXPV_7G   0x00070000
405*4882a593Smuzhiyun #define IXGB_PAP_TXPV_8G   0x00080000
406*4882a593Smuzhiyun #define IXGB_PAP_TXPV_9G   0x00090000
407*4882a593Smuzhiyun #define IXGB_PAP_TXPV_WAN  0x000F0000
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun /* PCSC1 Bit Masks */
410*4882a593Smuzhiyun #define IXGB_PCSC1_LOOPBACK 0x00004000
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun /* PCSC2 Bit Masks */
413*4882a593Smuzhiyun #define IXGB_PCSC2_PCS_TYPE_MASK  0x00000003
414*4882a593Smuzhiyun #define IXGB_PCSC2_PCS_TYPE_10GBX 0x00000001
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun /* PCSS1 Bit Masks */
417*4882a593Smuzhiyun #define IXGB_PCSS1_LOCAL_FAULT    0x00000080
418*4882a593Smuzhiyun #define IXGB_PCSS1_RX_LINK_STATUS 0x00000004
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun /* PCSS2 Bit Masks */
421*4882a593Smuzhiyun #define IXGB_PCSS2_DEV_PRES_MASK 0x0000C000
422*4882a593Smuzhiyun #define IXGB_PCSS2_DEV_PRES      0x00004000
423*4882a593Smuzhiyun #define IXGB_PCSS2_TX_LF         0x00000800
424*4882a593Smuzhiyun #define IXGB_PCSS2_RX_LF         0x00000400
425*4882a593Smuzhiyun #define IXGB_PCSS2_10GBW         0x00000004
426*4882a593Smuzhiyun #define IXGB_PCSS2_10GBX         0x00000002
427*4882a593Smuzhiyun #define IXGB_PCSS2_10GBR         0x00000001
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun /* XPCSS Bit Masks */
430*4882a593Smuzhiyun #define IXGB_XPCSS_ALIGN_STATUS 0x00001000
431*4882a593Smuzhiyun #define IXGB_XPCSS_PATTERN_TEST 0x00000800
432*4882a593Smuzhiyun #define IXGB_XPCSS_LANE_3_SYNC  0x00000008
433*4882a593Smuzhiyun #define IXGB_XPCSS_LANE_2_SYNC  0x00000004
434*4882a593Smuzhiyun #define IXGB_XPCSS_LANE_1_SYNC  0x00000002
435*4882a593Smuzhiyun #define IXGB_XPCSS_LANE_0_SYNC  0x00000001
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun /* XPCSTC Bit Masks */
438*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_TRIG       0x00200000
439*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_SST        0x00100000
440*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_PSZ_MASK   0x000C0000
441*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_PSZ_SHIFT  17
442*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_PSZ_INF    0x00000003
443*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_PSZ_68     0x00000001
444*4882a593Smuzhiyun #define IXGB_XPCSTC_BERT_PSZ_1028   0x00000000
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun /* MSCA bit Masks */
447*4882a593Smuzhiyun /* New Protocol Address */
448*4882a593Smuzhiyun #define IXGB_MSCA_NP_ADDR_MASK      0x0000FFFF
449*4882a593Smuzhiyun #define IXGB_MSCA_NP_ADDR_SHIFT     0
450*4882a593Smuzhiyun /* Either Device Type or Register Address,depending on ST_CODE */
451*4882a593Smuzhiyun #define IXGB_MSCA_DEV_TYPE_MASK     0x001F0000
452*4882a593Smuzhiyun #define IXGB_MSCA_DEV_TYPE_SHIFT    16
453*4882a593Smuzhiyun #define IXGB_MSCA_PHY_ADDR_MASK     0x03E00000
454*4882a593Smuzhiyun #define IXGB_MSCA_PHY_ADDR_SHIFT    21
455*4882a593Smuzhiyun #define IXGB_MSCA_OP_CODE_MASK      0x0C000000
456*4882a593Smuzhiyun /* OP_CODE == 00, Address cycle, New Protocol           */
457*4882a593Smuzhiyun /* OP_CODE == 01, Write operation                       */
458*4882a593Smuzhiyun /* OP_CODE == 10, Read operation                        */
459*4882a593Smuzhiyun /* OP_CODE == 11, Read, auto increment, New Protocol    */
460*4882a593Smuzhiyun #define IXGB_MSCA_ADDR_CYCLE        0x00000000
461*4882a593Smuzhiyun #define IXGB_MSCA_WRITE             0x04000000
462*4882a593Smuzhiyun #define IXGB_MSCA_READ              0x08000000
463*4882a593Smuzhiyun #define IXGB_MSCA_READ_AUTOINC      0x0C000000
464*4882a593Smuzhiyun #define IXGB_MSCA_OP_CODE_SHIFT     26
465*4882a593Smuzhiyun #define IXGB_MSCA_ST_CODE_MASK      0x30000000
466*4882a593Smuzhiyun /* ST_CODE == 00, New Protocol  */
467*4882a593Smuzhiyun /* ST_CODE == 01, Old Protocol  */
468*4882a593Smuzhiyun #define IXGB_MSCA_NEW_PROTOCOL      0x00000000
469*4882a593Smuzhiyun #define IXGB_MSCA_OLD_PROTOCOL      0x10000000
470*4882a593Smuzhiyun #define IXGB_MSCA_ST_CODE_SHIFT     28
471*4882a593Smuzhiyun /* Initiate command, self-clearing when command completes */
472*4882a593Smuzhiyun #define IXGB_MSCA_MDI_COMMAND       0x40000000
473*4882a593Smuzhiyun /*MDI In Progress Enable. */
474*4882a593Smuzhiyun #define IXGB_MSCA_MDI_IN_PROG_EN    0x80000000
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun /* MSRWD bit masks */
477*4882a593Smuzhiyun #define IXGB_MSRWD_WRITE_DATA_MASK  0x0000FFFF
478*4882a593Smuzhiyun #define IXGB_MSRWD_WRITE_DATA_SHIFT 0
479*4882a593Smuzhiyun #define IXGB_MSRWD_READ_DATA_MASK   0xFFFF0000
480*4882a593Smuzhiyun #define IXGB_MSRWD_READ_DATA_SHIFT  16
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /* Definitions for the optics devices on the MDIO bus. */
483*4882a593Smuzhiyun #define IXGB_PHY_ADDRESS             0x0	/* Single PHY, multiple "Devices" */
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #define MDIO_PMA_PMD_XPAK_VENDOR_NAME       0x803A	/* XPAK/XENPAK devices only */
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun /* Vendor-specific MDIO registers */
488*4882a593Smuzhiyun #define G6XXX_PMA_PMD_VS1                   0xC001	/* Vendor-specific register */
489*4882a593Smuzhiyun #define G6XXX_XGXS_XAUI_VS2                 0x18	/* Vendor-specific register */
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun #define G6XXX_PMA_PMD_VS1_PLL_RESET         0x80
492*4882a593Smuzhiyun #define G6XXX_PMA_PMD_VS1_REMOVE_PLL_RESET  0x00
493*4882a593Smuzhiyun #define G6XXX_XGXS_XAUI_VS2_INPUT_MASK      0x0F	/* XAUI lanes synchronized */
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun /* Layout of a single receive descriptor.  The controller assumes that this
496*4882a593Smuzhiyun  * structure is packed into 16 bytes, which is a safe assumption with most
497*4882a593Smuzhiyun  * compilers.  However, some compilers may insert padding between the fields,
498*4882a593Smuzhiyun  * in which case the structure must be packed in some compiler-specific
499*4882a593Smuzhiyun  * manner. */
500*4882a593Smuzhiyun struct ixgb_rx_desc {
501*4882a593Smuzhiyun 	__le64 buff_addr;
502*4882a593Smuzhiyun 	__le16 length;
503*4882a593Smuzhiyun 	__le16 reserved;
504*4882a593Smuzhiyun 	u8 status;
505*4882a593Smuzhiyun 	u8 errors;
506*4882a593Smuzhiyun 	__le16 special;
507*4882a593Smuzhiyun };
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_DD    0x01
510*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_EOP   0x02
511*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_IXSM  0x04
512*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_VP    0x08
513*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_TCPCS 0x20
514*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_IPCS  0x40
515*4882a593Smuzhiyun #define IXGB_RX_DESC_STATUS_PIF   0x80
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun #define IXGB_RX_DESC_ERRORS_CE   0x01
518*4882a593Smuzhiyun #define IXGB_RX_DESC_ERRORS_SE   0x02
519*4882a593Smuzhiyun #define IXGB_RX_DESC_ERRORS_P    0x08
520*4882a593Smuzhiyun #define IXGB_RX_DESC_ERRORS_TCPE 0x20
521*4882a593Smuzhiyun #define IXGB_RX_DESC_ERRORS_IPE  0x40
522*4882a593Smuzhiyun #define IXGB_RX_DESC_ERRORS_RXE  0x80
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun #define IXGB_RX_DESC_SPECIAL_VLAN_MASK  0x0FFF	/* VLAN ID is in lower 12 bits */
525*4882a593Smuzhiyun #define IXGB_RX_DESC_SPECIAL_PRI_MASK   0xE000	/* Priority is in upper 3 bits */
526*4882a593Smuzhiyun #define IXGB_RX_DESC_SPECIAL_PRI_SHIFT  0x000D	/* Priority is in upper 3 of 16 */
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun /* Layout of a single transmit descriptor.  The controller assumes that this
529*4882a593Smuzhiyun  * structure is packed into 16 bytes, which is a safe assumption with most
530*4882a593Smuzhiyun  * compilers.  However, some compilers may insert padding between the fields,
531*4882a593Smuzhiyun  * in which case the structure must be packed in some compiler-specific
532*4882a593Smuzhiyun  * manner. */
533*4882a593Smuzhiyun struct ixgb_tx_desc {
534*4882a593Smuzhiyun 	__le64 buff_addr;
535*4882a593Smuzhiyun 	__le32 cmd_type_len;
536*4882a593Smuzhiyun 	u8 status;
537*4882a593Smuzhiyun 	u8 popts;
538*4882a593Smuzhiyun 	__le16 vlan;
539*4882a593Smuzhiyun };
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun #define IXGB_TX_DESC_LENGTH_MASK    0x000FFFFF
542*4882a593Smuzhiyun #define IXGB_TX_DESC_TYPE_MASK      0x00F00000
543*4882a593Smuzhiyun #define IXGB_TX_DESC_TYPE_SHIFT     20
544*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_MASK       0xFF000000
545*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_SHIFT      24
546*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_EOP        0x01000000
547*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_TSE        0x04000000
548*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_RS         0x08000000
549*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_VLE        0x40000000
550*4882a593Smuzhiyun #define IXGB_TX_DESC_CMD_IDE        0x80000000
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun #define IXGB_TX_DESC_TYPE           0x00100000
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun #define IXGB_TX_DESC_STATUS_DD  0x01
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun #define IXGB_TX_DESC_POPTS_IXSM 0x01
557*4882a593Smuzhiyun #define IXGB_TX_DESC_POPTS_TXSM 0x02
558*4882a593Smuzhiyun #define IXGB_TX_DESC_SPECIAL_PRI_SHIFT  IXGB_RX_DESC_SPECIAL_PRI_SHIFT	/* Priority is in upper 3 of 16 */
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun struct ixgb_context_desc {
561*4882a593Smuzhiyun 	u8 ipcss;
562*4882a593Smuzhiyun 	u8 ipcso;
563*4882a593Smuzhiyun 	__le16 ipcse;
564*4882a593Smuzhiyun 	u8 tucss;
565*4882a593Smuzhiyun 	u8 tucso;
566*4882a593Smuzhiyun 	__le16 tucse;
567*4882a593Smuzhiyun 	__le32 cmd_type_len;
568*4882a593Smuzhiyun 	u8 status;
569*4882a593Smuzhiyun 	u8 hdr_len;
570*4882a593Smuzhiyun 	__le16 mss;
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_CMD_TCP 0x01000000
574*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_CMD_IP  0x02000000
575*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_CMD_TSE 0x04000000
576*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_CMD_RS  0x08000000
577*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_CMD_IDE 0x80000000
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_TYPE 0x00000000
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun #define IXGB_CONTEXT_DESC_STATUS_DD 0x01
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun /* Filters */
584*4882a593Smuzhiyun #define IXGB_MC_TBL_SIZE          128	/* Multicast Filter Table (4096 bits) */
585*4882a593Smuzhiyun #define IXGB_VLAN_FILTER_TBL_SIZE 128	/* VLAN Filter Table (4096 bits) */
586*4882a593Smuzhiyun #define IXGB_RAR_ENTRIES		  3	/* Number of entries in Rx Address array */
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun #define IXGB_MEMORY_REGISTER_BASE_ADDRESS   0
589*4882a593Smuzhiyun #define ENET_HEADER_SIZE			14
590*4882a593Smuzhiyun #define ENET_FCS_LENGTH			 4
591*4882a593Smuzhiyun #define IXGB_MAX_NUM_MULTICAST_ADDRESSES	128
592*4882a593Smuzhiyun #define IXGB_MIN_ENET_FRAME_SIZE_WITHOUT_FCS	60
593*4882a593Smuzhiyun #define IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS	1514
594*4882a593Smuzhiyun #define IXGB_MAX_JUMBO_FRAME_SIZE		0x3F00
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun /* Phy Addresses */
597*4882a593Smuzhiyun #define IXGB_OPTICAL_PHY_ADDR 0x0	/* Optical Module phy address */
598*4882a593Smuzhiyun #define IXGB_XAUII_PHY_ADDR   0x1	/* Xauii transceiver phy address */
599*4882a593Smuzhiyun #define IXGB_DIAG_PHY_ADDR    0x1F	/* Diagnostic Device phy address */
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun /* This structure takes a 64k flash and maps it for identification commands */
602*4882a593Smuzhiyun struct ixgb_flash_buffer {
603*4882a593Smuzhiyun 	u8 manufacturer_id;
604*4882a593Smuzhiyun 	u8 device_id;
605*4882a593Smuzhiyun 	u8 filler1[0x2AA8];
606*4882a593Smuzhiyun 	u8 cmd2;
607*4882a593Smuzhiyun 	u8 filler2[0x2AAA];
608*4882a593Smuzhiyun 	u8 cmd1;
609*4882a593Smuzhiyun 	u8 filler3[0xAAAA];
610*4882a593Smuzhiyun };
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun /* Flow control parameters */
613*4882a593Smuzhiyun struct ixgb_fc {
614*4882a593Smuzhiyun 	u32 high_water;	/* Flow Control High-water          */
615*4882a593Smuzhiyun 	u32 low_water;	/* Flow Control Low-water           */
616*4882a593Smuzhiyun 	u16 pause_time;	/* Flow Control Pause timer         */
617*4882a593Smuzhiyun 	bool send_xon;		/* Flow control send XON            */
618*4882a593Smuzhiyun 	ixgb_fc_type type;	/* Type of flow control             */
619*4882a593Smuzhiyun };
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun /* The historical defaults for the flow control values are given below. */
622*4882a593Smuzhiyun #define FC_DEFAULT_HI_THRESH        (0x8000)	/* 32KB */
623*4882a593Smuzhiyun #define FC_DEFAULT_LO_THRESH        (0x4000)	/* 16KB */
624*4882a593Smuzhiyun #define FC_DEFAULT_TX_TIMER         (0x100)	/* ~130 us */
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun /* Phy definitions */
627*4882a593Smuzhiyun #define IXGB_MAX_PHY_REG_ADDRESS    0xFFFF
628*4882a593Smuzhiyun #define IXGB_MAX_PHY_ADDRESS        31
629*4882a593Smuzhiyun #define IXGB_MAX_PHY_DEV_TYPE       31
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun /* Bus parameters */
632*4882a593Smuzhiyun struct ixgb_bus {
633*4882a593Smuzhiyun 	ixgb_bus_speed speed;
634*4882a593Smuzhiyun 	ixgb_bus_width width;
635*4882a593Smuzhiyun 	ixgb_bus_type type;
636*4882a593Smuzhiyun };
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun struct ixgb_hw {
639*4882a593Smuzhiyun 	u8 __iomem *hw_addr;/* Base Address of the hardware     */
640*4882a593Smuzhiyun 	void *back;		/* Pointer to OS-dependent struct   */
641*4882a593Smuzhiyun 	struct ixgb_fc fc;	/* Flow control parameters          */
642*4882a593Smuzhiyun 	struct ixgb_bus bus;	/* Bus parameters                   */
643*4882a593Smuzhiyun 	u32 phy_id;	/* Phy Identifier                   */
644*4882a593Smuzhiyun 	u32 phy_addr;	/* XGMII address of Phy             */
645*4882a593Smuzhiyun 	ixgb_mac_type mac_type;	/* Identifier for MAC controller    */
646*4882a593Smuzhiyun 	ixgb_phy_type phy_type;	/* Transceiver/phy identifier       */
647*4882a593Smuzhiyun 	u32 max_frame_size;	/* Maximum frame size supported     */
648*4882a593Smuzhiyun 	u32 mc_filter_type;	/* Multicast filter hash type       */
649*4882a593Smuzhiyun 	u32 num_mc_addrs;	/* Number of current Multicast addrs */
650*4882a593Smuzhiyun 	u8 curr_mac_addr[ETH_ALEN];	/* Individual address currently programmed in MAC */
651*4882a593Smuzhiyun 	u32 num_tx_desc;	/* Number of Transmit descriptors   */
652*4882a593Smuzhiyun 	u32 num_rx_desc;	/* Number of Receive descriptors    */
653*4882a593Smuzhiyun 	u32 rx_buffer_size;	/* Size of Receive buffer           */
654*4882a593Smuzhiyun 	bool link_up;		/* true if link is valid            */
655*4882a593Smuzhiyun 	bool adapter_stopped;	/* State of adapter                 */
656*4882a593Smuzhiyun 	u16 device_id;	/* device id from PCI configuration space */
657*4882a593Smuzhiyun 	u16 vendor_id;	/* vendor id from PCI configuration space */
658*4882a593Smuzhiyun 	u8 revision_id;	/* revision id from PCI configuration space */
659*4882a593Smuzhiyun 	u16 subsystem_vendor_id;	/* subsystem vendor id from PCI configuration space */
660*4882a593Smuzhiyun 	u16 subsystem_id;	/* subsystem id from PCI configuration space */
661*4882a593Smuzhiyun 	u32 bar0;		/* Base Address registers           */
662*4882a593Smuzhiyun 	u32 bar1;
663*4882a593Smuzhiyun 	u32 bar2;
664*4882a593Smuzhiyun 	u32 bar3;
665*4882a593Smuzhiyun 	u16 pci_cmd_word;	/* PCI command register id from PCI configuration space */
666*4882a593Smuzhiyun 	__le16 eeprom[IXGB_EEPROM_SIZE];	/* EEPROM contents read at init time  */
667*4882a593Smuzhiyun 	unsigned long io_base;	/* Our I/O mapped location */
668*4882a593Smuzhiyun 	u32 lastLFC;
669*4882a593Smuzhiyun 	u32 lastRFC;
670*4882a593Smuzhiyun };
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun /* Statistics reported by the hardware */
673*4882a593Smuzhiyun struct ixgb_hw_stats {
674*4882a593Smuzhiyun 	u64 tprl;
675*4882a593Smuzhiyun 	u64 tprh;
676*4882a593Smuzhiyun 	u64 gprcl;
677*4882a593Smuzhiyun 	u64 gprch;
678*4882a593Smuzhiyun 	u64 bprcl;
679*4882a593Smuzhiyun 	u64 bprch;
680*4882a593Smuzhiyun 	u64 mprcl;
681*4882a593Smuzhiyun 	u64 mprch;
682*4882a593Smuzhiyun 	u64 uprcl;
683*4882a593Smuzhiyun 	u64 uprch;
684*4882a593Smuzhiyun 	u64 vprcl;
685*4882a593Smuzhiyun 	u64 vprch;
686*4882a593Smuzhiyun 	u64 jprcl;
687*4882a593Smuzhiyun 	u64 jprch;
688*4882a593Smuzhiyun 	u64 gorcl;
689*4882a593Smuzhiyun 	u64 gorch;
690*4882a593Smuzhiyun 	u64 torl;
691*4882a593Smuzhiyun 	u64 torh;
692*4882a593Smuzhiyun 	u64 rnbc;
693*4882a593Smuzhiyun 	u64 ruc;
694*4882a593Smuzhiyun 	u64 roc;
695*4882a593Smuzhiyun 	u64 rlec;
696*4882a593Smuzhiyun 	u64 crcerrs;
697*4882a593Smuzhiyun 	u64 icbc;
698*4882a593Smuzhiyun 	u64 ecbc;
699*4882a593Smuzhiyun 	u64 mpc;
700*4882a593Smuzhiyun 	u64 tptl;
701*4882a593Smuzhiyun 	u64 tpth;
702*4882a593Smuzhiyun 	u64 gptcl;
703*4882a593Smuzhiyun 	u64 gptch;
704*4882a593Smuzhiyun 	u64 bptcl;
705*4882a593Smuzhiyun 	u64 bptch;
706*4882a593Smuzhiyun 	u64 mptcl;
707*4882a593Smuzhiyun 	u64 mptch;
708*4882a593Smuzhiyun 	u64 uptcl;
709*4882a593Smuzhiyun 	u64 uptch;
710*4882a593Smuzhiyun 	u64 vptcl;
711*4882a593Smuzhiyun 	u64 vptch;
712*4882a593Smuzhiyun 	u64 jptcl;
713*4882a593Smuzhiyun 	u64 jptch;
714*4882a593Smuzhiyun 	u64 gotcl;
715*4882a593Smuzhiyun 	u64 gotch;
716*4882a593Smuzhiyun 	u64 totl;
717*4882a593Smuzhiyun 	u64 toth;
718*4882a593Smuzhiyun 	u64 dc;
719*4882a593Smuzhiyun 	u64 plt64c;
720*4882a593Smuzhiyun 	u64 tsctc;
721*4882a593Smuzhiyun 	u64 tsctfc;
722*4882a593Smuzhiyun 	u64 ibic;
723*4882a593Smuzhiyun 	u64 rfc;
724*4882a593Smuzhiyun 	u64 lfc;
725*4882a593Smuzhiyun 	u64 pfrc;
726*4882a593Smuzhiyun 	u64 pftc;
727*4882a593Smuzhiyun 	u64 mcfrc;
728*4882a593Smuzhiyun 	u64 mcftc;
729*4882a593Smuzhiyun 	u64 xonrxc;
730*4882a593Smuzhiyun 	u64 xontxc;
731*4882a593Smuzhiyun 	u64 xoffrxc;
732*4882a593Smuzhiyun 	u64 xofftxc;
733*4882a593Smuzhiyun 	u64 rjc;
734*4882a593Smuzhiyun };
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun /* Function Prototypes */
737*4882a593Smuzhiyun bool ixgb_adapter_stop(struct ixgb_hw *hw);
738*4882a593Smuzhiyun bool ixgb_init_hw(struct ixgb_hw *hw);
739*4882a593Smuzhiyun bool ixgb_adapter_start(struct ixgb_hw *hw);
740*4882a593Smuzhiyun void ixgb_check_for_link(struct ixgb_hw *hw);
741*4882a593Smuzhiyun bool ixgb_check_for_bad_link(struct ixgb_hw *hw);
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun void ixgb_rar_set(struct ixgb_hw *hw, u8 *addr, u32 index);
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun /* Filters (multicast, vlan, receive) */
746*4882a593Smuzhiyun void ixgb_mc_addr_list_update(struct ixgb_hw *hw, u8 *mc_addr_list,
747*4882a593Smuzhiyun 			      u32 mc_addr_count, u32 pad);
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun /* Vfta functions */
750*4882a593Smuzhiyun void ixgb_write_vfta(struct ixgb_hw *hw, u32 offset, u32 value);
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun /* Access functions to eeprom data */
753*4882a593Smuzhiyun void ixgb_get_ee_mac_addr(struct ixgb_hw *hw, u8 *mac_addr);
754*4882a593Smuzhiyun u32 ixgb_get_ee_pba_number(struct ixgb_hw *hw);
755*4882a593Smuzhiyun u16 ixgb_get_ee_device_id(struct ixgb_hw *hw);
756*4882a593Smuzhiyun bool ixgb_get_eeprom_data(struct ixgb_hw *hw);
757*4882a593Smuzhiyun __le16 ixgb_get_eeprom_word(struct ixgb_hw *hw, u16 index);
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun /* Everything else */
760*4882a593Smuzhiyun void ixgb_led_on(struct ixgb_hw *hw);
761*4882a593Smuzhiyun void ixgb_led_off(struct ixgb_hw *hw);
762*4882a593Smuzhiyun void ixgb_write_pci_cfg(struct ixgb_hw *hw,
763*4882a593Smuzhiyun 			 u32 reg,
764*4882a593Smuzhiyun 			 u16 * value);
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun #endif /* _IXGB_HW_H_ */
768