xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/intel/igb/e1000_hw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright(c) 2007 - 2018 Intel Corporation. */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef _E1000_HW_H_
5*4882a593Smuzhiyun #define _E1000_HW_H_
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/types.h>
8*4882a593Smuzhiyun #include <linux/delay.h>
9*4882a593Smuzhiyun #include <linux/io.h>
10*4882a593Smuzhiyun #include <linux/netdevice.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include "e1000_regs.h"
13*4882a593Smuzhiyun #include "e1000_defines.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct e1000_hw;
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define E1000_DEV_ID_82576			0x10C9
18*4882a593Smuzhiyun #define E1000_DEV_ID_82576_FIBER		0x10E6
19*4882a593Smuzhiyun #define E1000_DEV_ID_82576_SERDES		0x10E7
20*4882a593Smuzhiyun #define E1000_DEV_ID_82576_QUAD_COPPER		0x10E8
21*4882a593Smuzhiyun #define E1000_DEV_ID_82576_QUAD_COPPER_ET2	0x1526
22*4882a593Smuzhiyun #define E1000_DEV_ID_82576_NS			0x150A
23*4882a593Smuzhiyun #define E1000_DEV_ID_82576_NS_SERDES		0x1518
24*4882a593Smuzhiyun #define E1000_DEV_ID_82576_SERDES_QUAD		0x150D
25*4882a593Smuzhiyun #define E1000_DEV_ID_82575EB_COPPER		0x10A7
26*4882a593Smuzhiyun #define E1000_DEV_ID_82575EB_FIBER_SERDES	0x10A9
27*4882a593Smuzhiyun #define E1000_DEV_ID_82575GB_QUAD_COPPER	0x10D6
28*4882a593Smuzhiyun #define E1000_DEV_ID_82580_COPPER		0x150E
29*4882a593Smuzhiyun #define E1000_DEV_ID_82580_FIBER		0x150F
30*4882a593Smuzhiyun #define E1000_DEV_ID_82580_SERDES		0x1510
31*4882a593Smuzhiyun #define E1000_DEV_ID_82580_SGMII		0x1511
32*4882a593Smuzhiyun #define E1000_DEV_ID_82580_COPPER_DUAL		0x1516
33*4882a593Smuzhiyun #define E1000_DEV_ID_82580_QUAD_FIBER		0x1527
34*4882a593Smuzhiyun #define E1000_DEV_ID_DH89XXCC_SGMII		0x0438
35*4882a593Smuzhiyun #define E1000_DEV_ID_DH89XXCC_SERDES		0x043A
36*4882a593Smuzhiyun #define E1000_DEV_ID_DH89XXCC_BACKPLANE		0x043C
37*4882a593Smuzhiyun #define E1000_DEV_ID_DH89XXCC_SFP		0x0440
38*4882a593Smuzhiyun #define E1000_DEV_ID_I350_COPPER		0x1521
39*4882a593Smuzhiyun #define E1000_DEV_ID_I350_FIBER			0x1522
40*4882a593Smuzhiyun #define E1000_DEV_ID_I350_SERDES		0x1523
41*4882a593Smuzhiyun #define E1000_DEV_ID_I350_SGMII			0x1524
42*4882a593Smuzhiyun #define E1000_DEV_ID_I210_COPPER		0x1533
43*4882a593Smuzhiyun #define E1000_DEV_ID_I210_FIBER			0x1536
44*4882a593Smuzhiyun #define E1000_DEV_ID_I210_SERDES		0x1537
45*4882a593Smuzhiyun #define E1000_DEV_ID_I210_SGMII			0x1538
46*4882a593Smuzhiyun #define E1000_DEV_ID_I210_COPPER_FLASHLESS	0x157B
47*4882a593Smuzhiyun #define E1000_DEV_ID_I210_SERDES_FLASHLESS	0x157C
48*4882a593Smuzhiyun #define E1000_DEV_ID_I211_COPPER		0x1539
49*4882a593Smuzhiyun #define E1000_DEV_ID_I354_BACKPLANE_1GBPS	0x1F40
50*4882a593Smuzhiyun #define E1000_DEV_ID_I354_SGMII			0x1F41
51*4882a593Smuzhiyun #define E1000_DEV_ID_I354_BACKPLANE_2_5GBPS	0x1F45
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define E1000_REVISION_2 2
54*4882a593Smuzhiyun #define E1000_REVISION_4 4
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define E1000_FUNC_0     0
57*4882a593Smuzhiyun #define E1000_FUNC_1     1
58*4882a593Smuzhiyun #define E1000_FUNC_2     2
59*4882a593Smuzhiyun #define E1000_FUNC_3     3
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0   0
62*4882a593Smuzhiyun #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1   3
63*4882a593Smuzhiyun #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN2   6
64*4882a593Smuzhiyun #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN3   9
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun enum e1000_mac_type {
67*4882a593Smuzhiyun 	e1000_undefined = 0,
68*4882a593Smuzhiyun 	e1000_82575,
69*4882a593Smuzhiyun 	e1000_82576,
70*4882a593Smuzhiyun 	e1000_82580,
71*4882a593Smuzhiyun 	e1000_i350,
72*4882a593Smuzhiyun 	e1000_i354,
73*4882a593Smuzhiyun 	e1000_i210,
74*4882a593Smuzhiyun 	e1000_i211,
75*4882a593Smuzhiyun 	e1000_num_macs  /* List is 1-based, so subtract 1 for true count. */
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun enum e1000_media_type {
79*4882a593Smuzhiyun 	e1000_media_type_unknown = 0,
80*4882a593Smuzhiyun 	e1000_media_type_copper = 1,
81*4882a593Smuzhiyun 	e1000_media_type_fiber = 2,
82*4882a593Smuzhiyun 	e1000_media_type_internal_serdes = 3,
83*4882a593Smuzhiyun 	e1000_num_media_types
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun enum e1000_nvm_type {
87*4882a593Smuzhiyun 	e1000_nvm_unknown = 0,
88*4882a593Smuzhiyun 	e1000_nvm_none,
89*4882a593Smuzhiyun 	e1000_nvm_eeprom_spi,
90*4882a593Smuzhiyun 	e1000_nvm_flash_hw,
91*4882a593Smuzhiyun 	e1000_nvm_invm,
92*4882a593Smuzhiyun 	e1000_nvm_flash_sw
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun enum e1000_nvm_override {
96*4882a593Smuzhiyun 	e1000_nvm_override_none = 0,
97*4882a593Smuzhiyun 	e1000_nvm_override_spi_small,
98*4882a593Smuzhiyun 	e1000_nvm_override_spi_large,
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun enum e1000_phy_type {
102*4882a593Smuzhiyun 	e1000_phy_unknown = 0,
103*4882a593Smuzhiyun 	e1000_phy_none,
104*4882a593Smuzhiyun 	e1000_phy_m88,
105*4882a593Smuzhiyun 	e1000_phy_igp,
106*4882a593Smuzhiyun 	e1000_phy_igp_2,
107*4882a593Smuzhiyun 	e1000_phy_gg82563,
108*4882a593Smuzhiyun 	e1000_phy_igp_3,
109*4882a593Smuzhiyun 	e1000_phy_ife,
110*4882a593Smuzhiyun 	e1000_phy_82580,
111*4882a593Smuzhiyun 	e1000_phy_i210,
112*4882a593Smuzhiyun 	e1000_phy_bcm54616,
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun enum e1000_bus_type {
116*4882a593Smuzhiyun 	e1000_bus_type_unknown = 0,
117*4882a593Smuzhiyun 	e1000_bus_type_pci,
118*4882a593Smuzhiyun 	e1000_bus_type_pcix,
119*4882a593Smuzhiyun 	e1000_bus_type_pci_express,
120*4882a593Smuzhiyun 	e1000_bus_type_reserved
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun enum e1000_bus_speed {
124*4882a593Smuzhiyun 	e1000_bus_speed_unknown = 0,
125*4882a593Smuzhiyun 	e1000_bus_speed_33,
126*4882a593Smuzhiyun 	e1000_bus_speed_66,
127*4882a593Smuzhiyun 	e1000_bus_speed_100,
128*4882a593Smuzhiyun 	e1000_bus_speed_120,
129*4882a593Smuzhiyun 	e1000_bus_speed_133,
130*4882a593Smuzhiyun 	e1000_bus_speed_2500,
131*4882a593Smuzhiyun 	e1000_bus_speed_5000,
132*4882a593Smuzhiyun 	e1000_bus_speed_reserved
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun enum e1000_bus_width {
136*4882a593Smuzhiyun 	e1000_bus_width_unknown = 0,
137*4882a593Smuzhiyun 	e1000_bus_width_pcie_x1,
138*4882a593Smuzhiyun 	e1000_bus_width_pcie_x2,
139*4882a593Smuzhiyun 	e1000_bus_width_pcie_x4 = 4,
140*4882a593Smuzhiyun 	e1000_bus_width_pcie_x8 = 8,
141*4882a593Smuzhiyun 	e1000_bus_width_32,
142*4882a593Smuzhiyun 	e1000_bus_width_64,
143*4882a593Smuzhiyun 	e1000_bus_width_reserved
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun enum e1000_1000t_rx_status {
147*4882a593Smuzhiyun 	e1000_1000t_rx_status_not_ok = 0,
148*4882a593Smuzhiyun 	e1000_1000t_rx_status_ok,
149*4882a593Smuzhiyun 	e1000_1000t_rx_status_undefined = 0xFF
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun enum e1000_rev_polarity {
153*4882a593Smuzhiyun 	e1000_rev_polarity_normal = 0,
154*4882a593Smuzhiyun 	e1000_rev_polarity_reversed,
155*4882a593Smuzhiyun 	e1000_rev_polarity_undefined = 0xFF
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun enum e1000_fc_mode {
159*4882a593Smuzhiyun 	e1000_fc_none = 0,
160*4882a593Smuzhiyun 	e1000_fc_rx_pause,
161*4882a593Smuzhiyun 	e1000_fc_tx_pause,
162*4882a593Smuzhiyun 	e1000_fc_full,
163*4882a593Smuzhiyun 	e1000_fc_default = 0xFF
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* Statistics counters collected by the MAC */
167*4882a593Smuzhiyun struct e1000_hw_stats {
168*4882a593Smuzhiyun 	u64 crcerrs;
169*4882a593Smuzhiyun 	u64 algnerrc;
170*4882a593Smuzhiyun 	u64 symerrs;
171*4882a593Smuzhiyun 	u64 rxerrc;
172*4882a593Smuzhiyun 	u64 mpc;
173*4882a593Smuzhiyun 	u64 scc;
174*4882a593Smuzhiyun 	u64 ecol;
175*4882a593Smuzhiyun 	u64 mcc;
176*4882a593Smuzhiyun 	u64 latecol;
177*4882a593Smuzhiyun 	u64 colc;
178*4882a593Smuzhiyun 	u64 dc;
179*4882a593Smuzhiyun 	u64 tncrs;
180*4882a593Smuzhiyun 	u64 sec;
181*4882a593Smuzhiyun 	u64 cexterr;
182*4882a593Smuzhiyun 	u64 rlec;
183*4882a593Smuzhiyun 	u64 xonrxc;
184*4882a593Smuzhiyun 	u64 xontxc;
185*4882a593Smuzhiyun 	u64 xoffrxc;
186*4882a593Smuzhiyun 	u64 xofftxc;
187*4882a593Smuzhiyun 	u64 fcruc;
188*4882a593Smuzhiyun 	u64 prc64;
189*4882a593Smuzhiyun 	u64 prc127;
190*4882a593Smuzhiyun 	u64 prc255;
191*4882a593Smuzhiyun 	u64 prc511;
192*4882a593Smuzhiyun 	u64 prc1023;
193*4882a593Smuzhiyun 	u64 prc1522;
194*4882a593Smuzhiyun 	u64 gprc;
195*4882a593Smuzhiyun 	u64 bprc;
196*4882a593Smuzhiyun 	u64 mprc;
197*4882a593Smuzhiyun 	u64 gptc;
198*4882a593Smuzhiyun 	u64 gorc;
199*4882a593Smuzhiyun 	u64 gotc;
200*4882a593Smuzhiyun 	u64 rnbc;
201*4882a593Smuzhiyun 	u64 ruc;
202*4882a593Smuzhiyun 	u64 rfc;
203*4882a593Smuzhiyun 	u64 roc;
204*4882a593Smuzhiyun 	u64 rjc;
205*4882a593Smuzhiyun 	u64 mgprc;
206*4882a593Smuzhiyun 	u64 mgpdc;
207*4882a593Smuzhiyun 	u64 mgptc;
208*4882a593Smuzhiyun 	u64 tor;
209*4882a593Smuzhiyun 	u64 tot;
210*4882a593Smuzhiyun 	u64 tpr;
211*4882a593Smuzhiyun 	u64 tpt;
212*4882a593Smuzhiyun 	u64 ptc64;
213*4882a593Smuzhiyun 	u64 ptc127;
214*4882a593Smuzhiyun 	u64 ptc255;
215*4882a593Smuzhiyun 	u64 ptc511;
216*4882a593Smuzhiyun 	u64 ptc1023;
217*4882a593Smuzhiyun 	u64 ptc1522;
218*4882a593Smuzhiyun 	u64 mptc;
219*4882a593Smuzhiyun 	u64 bptc;
220*4882a593Smuzhiyun 	u64 tsctc;
221*4882a593Smuzhiyun 	u64 tsctfc;
222*4882a593Smuzhiyun 	u64 iac;
223*4882a593Smuzhiyun 	u64 icrxptc;
224*4882a593Smuzhiyun 	u64 icrxatc;
225*4882a593Smuzhiyun 	u64 ictxptc;
226*4882a593Smuzhiyun 	u64 ictxatc;
227*4882a593Smuzhiyun 	u64 ictxqec;
228*4882a593Smuzhiyun 	u64 ictxqmtc;
229*4882a593Smuzhiyun 	u64 icrxdmtc;
230*4882a593Smuzhiyun 	u64 icrxoc;
231*4882a593Smuzhiyun 	u64 cbtmpc;
232*4882a593Smuzhiyun 	u64 htdpmc;
233*4882a593Smuzhiyun 	u64 cbrdpc;
234*4882a593Smuzhiyun 	u64 cbrmpc;
235*4882a593Smuzhiyun 	u64 rpthc;
236*4882a593Smuzhiyun 	u64 hgptc;
237*4882a593Smuzhiyun 	u64 htcbdpc;
238*4882a593Smuzhiyun 	u64 hgorc;
239*4882a593Smuzhiyun 	u64 hgotc;
240*4882a593Smuzhiyun 	u64 lenerrs;
241*4882a593Smuzhiyun 	u64 scvpc;
242*4882a593Smuzhiyun 	u64 hrmpc;
243*4882a593Smuzhiyun 	u64 doosync;
244*4882a593Smuzhiyun 	u64 o2bgptc;
245*4882a593Smuzhiyun 	u64 o2bspc;
246*4882a593Smuzhiyun 	u64 b2ospc;
247*4882a593Smuzhiyun 	u64 b2ogprc;
248*4882a593Smuzhiyun };
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun struct e1000_host_mng_dhcp_cookie {
251*4882a593Smuzhiyun 	u32 signature;
252*4882a593Smuzhiyun 	u8  status;
253*4882a593Smuzhiyun 	u8  reserved0;
254*4882a593Smuzhiyun 	u16 vlan_id;
255*4882a593Smuzhiyun 	u32 reserved1;
256*4882a593Smuzhiyun 	u16 reserved2;
257*4882a593Smuzhiyun 	u8  reserved3;
258*4882a593Smuzhiyun 	u8  checksum;
259*4882a593Smuzhiyun };
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /* Host Interface "Rev 1" */
262*4882a593Smuzhiyun struct e1000_host_command_header {
263*4882a593Smuzhiyun 	u8 command_id;
264*4882a593Smuzhiyun 	u8 command_length;
265*4882a593Smuzhiyun 	u8 command_options;
266*4882a593Smuzhiyun 	u8 checksum;
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun #define E1000_HI_MAX_DATA_LENGTH     252
270*4882a593Smuzhiyun struct e1000_host_command_info {
271*4882a593Smuzhiyun 	struct e1000_host_command_header command_header;
272*4882a593Smuzhiyun 	u8 command_data[E1000_HI_MAX_DATA_LENGTH];
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun /* Host Interface "Rev 2" */
276*4882a593Smuzhiyun struct e1000_host_mng_command_header {
277*4882a593Smuzhiyun 	u8  command_id;
278*4882a593Smuzhiyun 	u8  checksum;
279*4882a593Smuzhiyun 	u16 reserved1;
280*4882a593Smuzhiyun 	u16 reserved2;
281*4882a593Smuzhiyun 	u16 command_length;
282*4882a593Smuzhiyun };
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8
285*4882a593Smuzhiyun struct e1000_host_mng_command_info {
286*4882a593Smuzhiyun 	struct e1000_host_mng_command_header command_header;
287*4882a593Smuzhiyun 	u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH];
288*4882a593Smuzhiyun };
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #include "e1000_mac.h"
291*4882a593Smuzhiyun #include "e1000_phy.h"
292*4882a593Smuzhiyun #include "e1000_nvm.h"
293*4882a593Smuzhiyun #include "e1000_mbx.h"
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun struct e1000_mac_operations {
296*4882a593Smuzhiyun 	s32 (*check_for_link)(struct e1000_hw *);
297*4882a593Smuzhiyun 	s32 (*reset_hw)(struct e1000_hw *);
298*4882a593Smuzhiyun 	s32 (*init_hw)(struct e1000_hw *);
299*4882a593Smuzhiyun 	bool (*check_mng_mode)(struct e1000_hw *);
300*4882a593Smuzhiyun 	s32 (*setup_physical_interface)(struct e1000_hw *);
301*4882a593Smuzhiyun 	void (*rar_set)(struct e1000_hw *, u8 *, u32);
302*4882a593Smuzhiyun 	s32 (*read_mac_addr)(struct e1000_hw *);
303*4882a593Smuzhiyun 	s32 (*get_speed_and_duplex)(struct e1000_hw *, u16 *, u16 *);
304*4882a593Smuzhiyun 	s32 (*acquire_swfw_sync)(struct e1000_hw *, u16);
305*4882a593Smuzhiyun 	void (*release_swfw_sync)(struct e1000_hw *, u16);
306*4882a593Smuzhiyun #ifdef CONFIG_IGB_HWMON
307*4882a593Smuzhiyun 	s32 (*get_thermal_sensor_data)(struct e1000_hw *);
308*4882a593Smuzhiyun 	s32 (*init_thermal_sensor_thresh)(struct e1000_hw *);
309*4882a593Smuzhiyun #endif
310*4882a593Smuzhiyun 	void (*write_vfta)(struct e1000_hw *, u32, u32);
311*4882a593Smuzhiyun };
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun struct e1000_phy_operations {
314*4882a593Smuzhiyun 	s32 (*acquire)(struct e1000_hw *);
315*4882a593Smuzhiyun 	s32 (*check_polarity)(struct e1000_hw *);
316*4882a593Smuzhiyun 	s32 (*check_reset_block)(struct e1000_hw *);
317*4882a593Smuzhiyun 	s32 (*force_speed_duplex)(struct e1000_hw *);
318*4882a593Smuzhiyun 	s32 (*get_cfg_done)(struct e1000_hw *hw);
319*4882a593Smuzhiyun 	s32 (*get_cable_length)(struct e1000_hw *);
320*4882a593Smuzhiyun 	s32 (*get_phy_info)(struct e1000_hw *);
321*4882a593Smuzhiyun 	s32 (*read_reg)(struct e1000_hw *, u32, u16 *);
322*4882a593Smuzhiyun 	void (*release)(struct e1000_hw *);
323*4882a593Smuzhiyun 	s32 (*reset)(struct e1000_hw *);
324*4882a593Smuzhiyun 	s32 (*set_d0_lplu_state)(struct e1000_hw *, bool);
325*4882a593Smuzhiyun 	s32 (*set_d3_lplu_state)(struct e1000_hw *, bool);
326*4882a593Smuzhiyun 	s32 (*write_reg)(struct e1000_hw *, u32, u16);
327*4882a593Smuzhiyun 	s32 (*read_i2c_byte)(struct e1000_hw *, u8, u8, u8 *);
328*4882a593Smuzhiyun 	s32 (*write_i2c_byte)(struct e1000_hw *, u8, u8, u8);
329*4882a593Smuzhiyun };
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun struct e1000_nvm_operations {
332*4882a593Smuzhiyun 	s32 (*acquire)(struct e1000_hw *);
333*4882a593Smuzhiyun 	s32 (*read)(struct e1000_hw *, u16, u16, u16 *);
334*4882a593Smuzhiyun 	void (*release)(struct e1000_hw *);
335*4882a593Smuzhiyun 	s32 (*write)(struct e1000_hw *, u16, u16, u16 *);
336*4882a593Smuzhiyun 	s32 (*update)(struct e1000_hw *);
337*4882a593Smuzhiyun 	s32 (*validate)(struct e1000_hw *);
338*4882a593Smuzhiyun 	s32 (*valid_led_default)(struct e1000_hw *, u16 *);
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun #define E1000_MAX_SENSORS		3
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun struct e1000_thermal_diode_data {
344*4882a593Smuzhiyun 	u8 location;
345*4882a593Smuzhiyun 	u8 temp;
346*4882a593Smuzhiyun 	u8 caution_thresh;
347*4882a593Smuzhiyun 	u8 max_op_thresh;
348*4882a593Smuzhiyun };
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun struct e1000_thermal_sensor_data {
351*4882a593Smuzhiyun 	struct e1000_thermal_diode_data sensor[E1000_MAX_SENSORS];
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun struct e1000_info {
355*4882a593Smuzhiyun 	s32 (*get_invariants)(struct e1000_hw *);
356*4882a593Smuzhiyun 	struct e1000_mac_operations *mac_ops;
357*4882a593Smuzhiyun 	const struct e1000_phy_operations *phy_ops;
358*4882a593Smuzhiyun 	struct e1000_nvm_operations *nvm_ops;
359*4882a593Smuzhiyun };
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun extern const struct e1000_info e1000_82575_info;
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun struct e1000_mac_info {
364*4882a593Smuzhiyun 	struct e1000_mac_operations ops;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	u8 addr[6];
367*4882a593Smuzhiyun 	u8 perm_addr[6];
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	enum e1000_mac_type type;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	u32 ledctl_default;
372*4882a593Smuzhiyun 	u32 ledctl_mode1;
373*4882a593Smuzhiyun 	u32 ledctl_mode2;
374*4882a593Smuzhiyun 	u32 mc_filter_type;
375*4882a593Smuzhiyun 	u32 txcw;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	u16 mta_reg_count;
378*4882a593Smuzhiyun 	u16 uta_reg_count;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	/* Maximum size of the MTA register table in all supported adapters */
381*4882a593Smuzhiyun 	#define MAX_MTA_REG 128
382*4882a593Smuzhiyun 	u32 mta_shadow[MAX_MTA_REG];
383*4882a593Smuzhiyun 	u16 rar_entry_count;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	u8  forced_speed_duplex;
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	bool adaptive_ifs;
388*4882a593Smuzhiyun 	bool arc_subsystem_valid;
389*4882a593Smuzhiyun 	bool asf_firmware_present;
390*4882a593Smuzhiyun 	bool autoneg;
391*4882a593Smuzhiyun 	bool autoneg_failed;
392*4882a593Smuzhiyun 	bool disable_hw_init_bits;
393*4882a593Smuzhiyun 	bool get_link_status;
394*4882a593Smuzhiyun 	bool ifs_params_forced;
395*4882a593Smuzhiyun 	bool in_ifs_mode;
396*4882a593Smuzhiyun 	bool report_tx_early;
397*4882a593Smuzhiyun 	bool serdes_has_link;
398*4882a593Smuzhiyun 	bool tx_pkt_filtering;
399*4882a593Smuzhiyun 	struct e1000_thermal_sensor_data thermal_sensor_data;
400*4882a593Smuzhiyun };
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun struct e1000_phy_info {
403*4882a593Smuzhiyun 	struct e1000_phy_operations ops;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	enum e1000_phy_type type;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	enum e1000_1000t_rx_status local_rx;
408*4882a593Smuzhiyun 	enum e1000_1000t_rx_status remote_rx;
409*4882a593Smuzhiyun 	enum e1000_ms_type ms_type;
410*4882a593Smuzhiyun 	enum e1000_ms_type original_ms_type;
411*4882a593Smuzhiyun 	enum e1000_rev_polarity cable_polarity;
412*4882a593Smuzhiyun 	enum e1000_smart_speed smart_speed;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	u32 addr;
415*4882a593Smuzhiyun 	u32 id;
416*4882a593Smuzhiyun 	u32 reset_delay_us; /* in usec */
417*4882a593Smuzhiyun 	u32 revision;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	enum e1000_media_type media_type;
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun 	u16 autoneg_advertised;
422*4882a593Smuzhiyun 	u16 autoneg_mask;
423*4882a593Smuzhiyun 	u16 cable_length;
424*4882a593Smuzhiyun 	u16 max_cable_length;
425*4882a593Smuzhiyun 	u16 min_cable_length;
426*4882a593Smuzhiyun 	u16 pair_length[4];
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	u8 mdix;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	bool disable_polarity_correction;
431*4882a593Smuzhiyun 	bool is_mdix;
432*4882a593Smuzhiyun 	bool polarity_correction;
433*4882a593Smuzhiyun 	bool reset_disable;
434*4882a593Smuzhiyun 	bool speed_downgraded;
435*4882a593Smuzhiyun 	bool autoneg_wait_to_complete;
436*4882a593Smuzhiyun };
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun struct e1000_nvm_info {
439*4882a593Smuzhiyun 	struct e1000_nvm_operations ops;
440*4882a593Smuzhiyun 	enum e1000_nvm_type type;
441*4882a593Smuzhiyun 	enum e1000_nvm_override override;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	u32 flash_bank_size;
444*4882a593Smuzhiyun 	u32 flash_base_addr;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	u16 word_size;
447*4882a593Smuzhiyun 	u16 delay_usec;
448*4882a593Smuzhiyun 	u16 address_bits;
449*4882a593Smuzhiyun 	u16 opcode_bits;
450*4882a593Smuzhiyun 	u16 page_size;
451*4882a593Smuzhiyun };
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun struct e1000_bus_info {
454*4882a593Smuzhiyun 	enum e1000_bus_type type;
455*4882a593Smuzhiyun 	enum e1000_bus_speed speed;
456*4882a593Smuzhiyun 	enum e1000_bus_width width;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	u32 snoop;
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	u16 func;
461*4882a593Smuzhiyun 	u16 pci_cmd_word;
462*4882a593Smuzhiyun };
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun struct e1000_fc_info {
465*4882a593Smuzhiyun 	u32 high_water;     /* Flow control high-water mark */
466*4882a593Smuzhiyun 	u32 low_water;      /* Flow control low-water mark */
467*4882a593Smuzhiyun 	u16 pause_time;     /* Flow control pause timer */
468*4882a593Smuzhiyun 	bool send_xon;      /* Flow control send XON */
469*4882a593Smuzhiyun 	bool strict_ieee;   /* Strict IEEE mode */
470*4882a593Smuzhiyun 	enum e1000_fc_mode current_mode; /* Type of flow control */
471*4882a593Smuzhiyun 	enum e1000_fc_mode requested_mode;
472*4882a593Smuzhiyun };
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun struct e1000_mbx_operations {
475*4882a593Smuzhiyun 	s32 (*init_params)(struct e1000_hw *hw);
476*4882a593Smuzhiyun 	s32 (*read)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id,
477*4882a593Smuzhiyun 		    bool unlock);
478*4882a593Smuzhiyun 	s32 (*write)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
479*4882a593Smuzhiyun 	s32 (*read_posted)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
480*4882a593Smuzhiyun 	s32 (*write_posted)(struct e1000_hw *hw, u32 *msg, u16 size,
481*4882a593Smuzhiyun 			    u16 mbx_id);
482*4882a593Smuzhiyun 	s32 (*check_for_msg)(struct e1000_hw *hw, u16 mbx_id);
483*4882a593Smuzhiyun 	s32 (*check_for_ack)(struct e1000_hw *hw, u16 mbx_id);
484*4882a593Smuzhiyun 	s32 (*check_for_rst)(struct e1000_hw *hw, u16 mbx_id);
485*4882a593Smuzhiyun 	s32 (*unlock)(struct e1000_hw *hw, u16 mbx_id);
486*4882a593Smuzhiyun };
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun struct e1000_mbx_stats {
489*4882a593Smuzhiyun 	u32 msgs_tx;
490*4882a593Smuzhiyun 	u32 msgs_rx;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	u32 acks;
493*4882a593Smuzhiyun 	u32 reqs;
494*4882a593Smuzhiyun 	u32 rsts;
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun struct e1000_mbx_info {
498*4882a593Smuzhiyun 	struct e1000_mbx_operations ops;
499*4882a593Smuzhiyun 	struct e1000_mbx_stats stats;
500*4882a593Smuzhiyun 	u32 timeout;
501*4882a593Smuzhiyun 	u32 usec_delay;
502*4882a593Smuzhiyun 	u16 size;
503*4882a593Smuzhiyun };
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun struct e1000_dev_spec_82575 {
506*4882a593Smuzhiyun 	bool sgmii_active;
507*4882a593Smuzhiyun 	bool global_device_reset;
508*4882a593Smuzhiyun 	bool eee_disable;
509*4882a593Smuzhiyun 	bool clear_semaphore_once;
510*4882a593Smuzhiyun 	struct e1000_sfp_flags eth_flags;
511*4882a593Smuzhiyun 	bool module_plugged;
512*4882a593Smuzhiyun 	u8 media_port;
513*4882a593Smuzhiyun 	bool media_changed;
514*4882a593Smuzhiyun 	bool mas_capable;
515*4882a593Smuzhiyun };
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun struct e1000_hw {
518*4882a593Smuzhiyun 	void *back;
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	u8 __iomem *hw_addr;
521*4882a593Smuzhiyun 	u8 __iomem *flash_address;
522*4882a593Smuzhiyun 	unsigned long io_base;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	struct e1000_mac_info  mac;
525*4882a593Smuzhiyun 	struct e1000_fc_info   fc;
526*4882a593Smuzhiyun 	struct e1000_phy_info  phy;
527*4882a593Smuzhiyun 	struct e1000_nvm_info  nvm;
528*4882a593Smuzhiyun 	struct e1000_bus_info  bus;
529*4882a593Smuzhiyun 	struct e1000_mbx_info mbx;
530*4882a593Smuzhiyun 	struct e1000_host_mng_dhcp_cookie mng_cookie;
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 	union {
533*4882a593Smuzhiyun 		struct e1000_dev_spec_82575	_82575;
534*4882a593Smuzhiyun 	} dev_spec;
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	u16 device_id;
537*4882a593Smuzhiyun 	u16 subsystem_vendor_id;
538*4882a593Smuzhiyun 	u16 subsystem_device_id;
539*4882a593Smuzhiyun 	u16 vendor_id;
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 	u8  revision_id;
542*4882a593Smuzhiyun };
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun struct net_device *igb_get_hw_dev(struct e1000_hw *hw);
545*4882a593Smuzhiyun #define hw_dbg(format, arg...) \
546*4882a593Smuzhiyun 	netdev_dbg(igb_get_hw_dev(hw), format, ##arg)
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun /* These functions must be implemented by drivers */
549*4882a593Smuzhiyun s32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
550*4882a593Smuzhiyun s32 igb_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun void igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
553*4882a593Smuzhiyun void igb_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
554*4882a593Smuzhiyun #endif /* _E1000_HW_H_ */
555