hw.h 17.4 KB
Newer Older
1
/* Intel PRO/1000 Linux driver
2
 * Copyright(c) 1999 - 2015 Intel Corporation.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * The full GNU General Public License is included in this distribution in
 * the file called "COPYING".
 *
 * Contact Information:
 * Linux NICS <linux.nics@intel.com>
 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 */
21 22 23 24

#ifndef _E1000_HW_H_
#define _E1000_HW_H_

25
#include "regs.h"
B
Bruce Allan 已提交
26
#include "defines.h"
27 28 29 30 31 32 33

struct e1000_hw;

#define E1000_DEV_ID_82571EB_COPPER		0x105E
#define E1000_DEV_ID_82571EB_FIBER		0x105F
#define E1000_DEV_ID_82571EB_SERDES		0x1060
#define E1000_DEV_ID_82571EB_QUAD_COPPER	0x10A4
34
#define E1000_DEV_ID_82571PT_QUAD_COPPER	0x10D5
35 36
#define E1000_DEV_ID_82571EB_QUAD_FIBER		0x10A5
#define E1000_DEV_ID_82571EB_QUAD_COPPER_LP	0x10BC
37 38
#define E1000_DEV_ID_82571EB_SERDES_DUAL	0x10D9
#define E1000_DEV_ID_82571EB_SERDES_QUAD	0x10DA
39 40 41 42 43 44 45
#define E1000_DEV_ID_82572EI_COPPER		0x107D
#define E1000_DEV_ID_82572EI_FIBER		0x107E
#define E1000_DEV_ID_82572EI_SERDES		0x107F
#define E1000_DEV_ID_82572EI			0x10B9
#define E1000_DEV_ID_82573E			0x108B
#define E1000_DEV_ID_82573E_IAMT		0x108C
#define E1000_DEV_ID_82573L			0x109A
46
#define E1000_DEV_ID_82574L			0x10D3
47
#define E1000_DEV_ID_82574LA			0x10F6
B
Bruce Allan 已提交
48
#define E1000_DEV_ID_82583V			0x150C
49 50 51 52
#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT	0x1096
#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT	0x1098
#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT	0x10BA
#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT	0x10BB
B
Bruce Allan 已提交
53
#define E1000_DEV_ID_ICH8_82567V_3		0x1501
54 55 56 57 58 59 60 61
#define E1000_DEV_ID_ICH8_IGP_M_AMT		0x1049
#define E1000_DEV_ID_ICH8_IGP_AMT		0x104A
#define E1000_DEV_ID_ICH8_IGP_C			0x104B
#define E1000_DEV_ID_ICH8_IFE			0x104C
#define E1000_DEV_ID_ICH8_IFE_GT		0x10C4
#define E1000_DEV_ID_ICH8_IFE_G			0x10C5
#define E1000_DEV_ID_ICH8_IGP_M			0x104D
#define E1000_DEV_ID_ICH9_IGP_AMT		0x10BD
62
#define E1000_DEV_ID_ICH9_BM			0x10E5
63 64 65
#define E1000_DEV_ID_ICH9_IGP_M_AMT		0x10F5
#define E1000_DEV_ID_ICH9_IGP_M			0x10BF
#define E1000_DEV_ID_ICH9_IGP_M_V		0x10CB
66 67 68 69
#define E1000_DEV_ID_ICH9_IGP_C			0x294C
#define E1000_DEV_ID_ICH9_IFE			0x10C0
#define E1000_DEV_ID_ICH9_IFE_GT		0x10C3
#define E1000_DEV_ID_ICH9_IFE_G			0x10C2
70 71 72
#define E1000_DEV_ID_ICH10_R_BM_LM		0x10CC
#define E1000_DEV_ID_ICH10_R_BM_LF		0x10CD
#define E1000_DEV_ID_ICH10_R_BM_V		0x10CE
73 74
#define E1000_DEV_ID_ICH10_D_BM_LM		0x10DE
#define E1000_DEV_ID_ICH10_D_BM_LF		0x10DF
75
#define E1000_DEV_ID_ICH10_D_BM_V		0x1525
76 77 78 79
#define E1000_DEV_ID_PCH_M_HV_LM		0x10EA
#define E1000_DEV_ID_PCH_M_HV_LC		0x10EB
#define E1000_DEV_ID_PCH_D_HV_DM		0x10EF
#define E1000_DEV_ID_PCH_D_HV_DC		0x10F0
80 81
#define E1000_DEV_ID_PCH2_LV_LM			0x1502
#define E1000_DEV_ID_PCH2_LV_V			0x1503
B
Bruce Allan 已提交
82 83
#define E1000_DEV_ID_PCH_LPT_I217_LM		0x153A
#define E1000_DEV_ID_PCH_LPT_I217_V		0x153B
B
Bruce Allan 已提交
84 85
#define E1000_DEV_ID_PCH_LPTLP_I218_LM		0x155A
#define E1000_DEV_ID_PCH_LPTLP_I218_V		0x1559
86 87 88 89
#define E1000_DEV_ID_PCH_I218_LM2		0x15A0
#define E1000_DEV_ID_PCH_I218_V2		0x15A1
#define E1000_DEV_ID_PCH_I218_LM3		0x15A2	/* Wildcat Point PCH */
#define E1000_DEV_ID_PCH_I218_V3		0x15A3	/* Wildcat Point PCH */
D
David Ertman 已提交
90 91 92 93
#define E1000_DEV_ID_PCH_SPT_I219_LM		0x156F	/* SPT PCH */
#define E1000_DEV_ID_PCH_SPT_I219_V		0x1570	/* SPT PCH */
#define E1000_DEV_ID_PCH_SPT_I219_LM2		0x15B7	/* SPT-H PCH */
#define E1000_DEV_ID_PCH_SPT_I219_V2		0x15B8	/* SPT-H PCH */
94
#define E1000_DEV_ID_PCH_LBG_I219_LM3		0x15B9	/* LBG PCH */
95 96 97 98
#define E1000_DEV_ID_PCH_SPT_I219_LM4		0x15D7
#define E1000_DEV_ID_PCH_SPT_I219_V4		0x15D8
#define E1000_DEV_ID_PCH_SPT_I219_LM5		0x15E3
#define E1000_DEV_ID_PCH_SPT_I219_V5		0x15D6
99 100 101 102
#define E1000_DEV_ID_PCH_CNP_I219_LM6		0x15BD
#define E1000_DEV_ID_PCH_CNP_I219_V6		0x15BE
#define E1000_DEV_ID_PCH_CNP_I219_LM7		0x15BB
#define E1000_DEV_ID_PCH_CNP_I219_V7		0x15BC
103 104 105 106
#define E1000_DEV_ID_PCH_ICP_I219_LM8		0x15DF
#define E1000_DEV_ID_PCH_ICP_I219_V8		0x15E0
#define E1000_DEV_ID_PCH_ICP_I219_LM9		0x15E1
#define E1000_DEV_ID_PCH_ICP_I219_V9		0x15E2
107

B
Bruce Allan 已提交
108
#define E1000_REVISION_4	4
109

B
Bruce Allan 已提交
110
#define E1000_FUNC_1		1
111

B
Bruce Allan 已提交
112 113
#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0	0
#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1	3
114

115 116 117 118
enum e1000_mac_type {
	e1000_82571,
	e1000_82572,
	e1000_82573,
119
	e1000_82574,
120
	e1000_82583,
121 122 123
	e1000_80003es2lan,
	e1000_ich8lan,
	e1000_ich9lan,
124
	e1000_ich10lan,
125
	e1000_pchlan,
126
	e1000_pch2lan,
B
Bruce Allan 已提交
127
	e1000_pch_lpt,
D
David Ertman 已提交
128
	e1000_pch_spt,
129
	e1000_pch_cnp,
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
};

enum e1000_media_type {
	e1000_media_type_unknown = 0,
	e1000_media_type_copper = 1,
	e1000_media_type_fiber = 2,
	e1000_media_type_internal_serdes = 3,
	e1000_num_media_types
};

enum e1000_nvm_type {
	e1000_nvm_unknown = 0,
	e1000_nvm_none,
	e1000_nvm_eeprom_spi,
	e1000_nvm_flash_hw,
	e1000_nvm_flash_sw
};

enum e1000_nvm_override {
	e1000_nvm_override_none = 0,
	e1000_nvm_override_spi_small,
	e1000_nvm_override_spi_large
};

enum e1000_phy_type {
	e1000_phy_unknown = 0,
	e1000_phy_none,
	e1000_phy_m88,
	e1000_phy_igp,
	e1000_phy_igp_2,
	e1000_phy_gg82563,
	e1000_phy_igp_3,
	e1000_phy_ife,
163
	e1000_phy_bm,
164 165
	e1000_phy_82578,
	e1000_phy_82577,
166
	e1000_phy_82579,
B
Bruce Allan 已提交
167
	e1000_phy_i217,
168 169 170 171 172 173 174
};

enum e1000_bus_width {
	e1000_bus_width_unknown = 0,
	e1000_bus_width_pcie_x1,
	e1000_bus_width_pcie_x2,
	e1000_bus_width_pcie_x4 = 4,
D
David Ertman 已提交
175
	e1000_bus_width_pcie_x8 = 8,
176 177 178 179 180 181 182 183 184 185 186
	e1000_bus_width_32,
	e1000_bus_width_64,
	e1000_bus_width_reserved
};

enum e1000_1000t_rx_status {
	e1000_1000t_rx_status_not_ok = 0,
	e1000_1000t_rx_status_ok,
	e1000_1000t_rx_status_undefined = 0xFF
};

187
enum e1000_rev_polarity {
188 189 190 191 192
	e1000_rev_polarity_normal = 0,
	e1000_rev_polarity_reversed,
	e1000_rev_polarity_undefined = 0xFF
};

193
enum e1000_fc_mode {
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
	e1000_fc_none = 0,
	e1000_fc_rx_pause,
	e1000_fc_tx_pause,
	e1000_fc_full,
	e1000_fc_default = 0xFF
};

enum e1000_ms_type {
	e1000_ms_hw_default = 0,
	e1000_ms_force_master,
	e1000_ms_force_slave,
	e1000_ms_auto
};

enum e1000_smart_speed {
	e1000_smart_speed_default = 0,
	e1000_smart_speed_on,
	e1000_smart_speed_off
};

214 215 216 217 218 219 220
enum e1000_serdes_link_state {
	e1000_serdes_link_down = 0,
	e1000_serdes_link_autoneg_progress,
	e1000_serdes_link_autoneg_complete,
	e1000_serdes_link_forced_up
};

221 222 223
/* Receive Descriptor - Extended */
union e1000_rx_desc_extended {
	struct {
A
Al Viro 已提交
224 225
		__le64 buffer_addr;
		__le64 reserved;
226 227 228
	} read;
	struct {
		struct {
A
Al Viro 已提交
229
			__le32 mrq;	      /* Multiple Rx Queues */
230
			union {
A
Al Viro 已提交
231
				__le32 rss;	    /* RSS Hash */
232
				struct {
A
Al Viro 已提交
233 234
					__le16 ip_id;  /* IP id */
					__le16 csum;   /* Packet Checksum */
235 236 237 238
				} csum_ip;
			} hi_dword;
		} lower;
		struct {
A
Al Viro 已提交
239 240 241
			__le32 status_error;     /* ext status/error */
			__le16 length;
			__le16 vlan;	     /* VLAN tag */
242 243 244 245 246
		} upper;
	} wb;  /* writeback */
};

#define MAX_PS_BUFFERS 4
247 248

/* Number of packet split data buffers (not including the header buffer) */
249 250
#define PS_PAGE_BUFFERS	(MAX_PS_BUFFERS - 1)

251 252 253 254
/* Receive Descriptor - Packet Split */
union e1000_rx_desc_packet_split {
	struct {
		/* one buffer for protocol header(s), three data buffers */
A
Al Viro 已提交
255
		__le64 buffer_addr[MAX_PS_BUFFERS];
256 257 258
	} read;
	struct {
		struct {
A
Al Viro 已提交
259
			__le32 mrq;	      /* Multiple Rx Queues */
260
			union {
A
Al Viro 已提交
261
				__le32 rss;	      /* RSS Hash */
262
				struct {
A
Al Viro 已提交
263 264
					__le16 ip_id;    /* IP id */
					__le16 csum;     /* Packet Checksum */
265 266 267 268
				} csum_ip;
			} hi_dword;
		} lower;
		struct {
A
Al Viro 已提交
269 270 271
			__le32 status_error;     /* ext status/error */
			__le16 length0;	  /* length of buffer 0 */
			__le16 vlan;	     /* VLAN tag */
272 273
		} middle;
		struct {
A
Al Viro 已提交
274
			__le16 header_status;
275 276
			/* length of buffers 1-3 */
			__le16 length[PS_PAGE_BUFFERS];
277
		} upper;
A
Al Viro 已提交
278
		__le64 reserved;
279 280 281 282 283
	} wb; /* writeback */
};

/* Transmit Descriptor */
struct e1000_tx_desc {
A
Al Viro 已提交
284
	__le64 buffer_addr;      /* Address of the descriptor's data buffer */
285
	union {
A
Al Viro 已提交
286
		__le32 data;
287
		struct {
A
Al Viro 已提交
288
			__le16 length;    /* Data buffer length */
289 290 291 292 293
			u8 cso;	/* Checksum offset */
			u8 cmd;	/* Descriptor control */
		} flags;
	} lower;
	union {
A
Al Viro 已提交
294
		__le32 data;
295 296 297
		struct {
			u8 status;     /* Descriptor status */
			u8 css;	/* Checksum start */
A
Al Viro 已提交
298
			__le16 special;
299 300 301 302 303 304 305
		} fields;
	} upper;
};

/* Offload Context Descriptor */
struct e1000_context_desc {
	union {
A
Al Viro 已提交
306
		__le32 ip_config;
307 308 309
		struct {
			u8 ipcss;      /* IP checksum start */
			u8 ipcso;      /* IP checksum offset */
A
Al Viro 已提交
310
			__le16 ipcse;     /* IP checksum end */
311 312 313
		} ip_fields;
	} lower_setup;
	union {
A
Al Viro 已提交
314
		__le32 tcp_config;
315 316 317
		struct {
			u8 tucss;      /* TCP checksum start */
			u8 tucso;      /* TCP checksum offset */
A
Al Viro 已提交
318
			__le16 tucse;     /* TCP checksum end */
319 320
		} tcp_fields;
	} upper_setup;
A
Al Viro 已提交
321
	__le32 cmd_and_length;
322
	union {
A
Al Viro 已提交
323
		__le32 data;
324 325 326
		struct {
			u8 status;     /* Descriptor status */
			u8 hdr_len;    /* Header length */
A
Al Viro 已提交
327
			__le16 mss;       /* Maximum segment size */
328 329 330 331 332 333
		} fields;
	} tcp_seg_setup;
};

/* Offload data descriptor */
struct e1000_data_desc {
A
Al Viro 已提交
334
	__le64 buffer_addr;   /* Address of the descriptor's buffer address */
335
	union {
A
Al Viro 已提交
336
		__le32 data;
337
		struct {
A
Al Viro 已提交
338
			__le16 length;    /* Data buffer length */
339 340 341 342 343
			u8 typ_len_ext;
			u8 cmd;
		} flags;
	} lower;
	union {
A
Al Viro 已提交
344
		__le32 data;
345 346 347
		struct {
			u8 status;     /* Descriptor status */
			u8 popts;      /* Packet Options */
B
Bruce Allan 已提交
348
			__le16 special;
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
		} fields;
	} upper;
};

/* Statistics counters collected by the MAC */
struct e1000_hw_stats {
	u64 crcerrs;
	u64 algnerrc;
	u64 symerrs;
	u64 rxerrc;
	u64 mpc;
	u64 scc;
	u64 ecol;
	u64 mcc;
	u64 latecol;
	u64 colc;
	u64 dc;
	u64 tncrs;
	u64 sec;
	u64 cexterr;
	u64 rlec;
	u64 xonrxc;
	u64 xontxc;
	u64 xoffrxc;
	u64 xofftxc;
	u64 fcruc;
	u64 prc64;
	u64 prc127;
	u64 prc255;
	u64 prc511;
	u64 prc1023;
	u64 prc1522;
	u64 gprc;
	u64 bprc;
	u64 mprc;
	u64 gptc;
385 386
	u64 gorc;
	u64 gotc;
387 388 389 390 391 392 393 394
	u64 rnbc;
	u64 ruc;
	u64 rfc;
	u64 roc;
	u64 rjc;
	u64 mgprc;
	u64 mgpdc;
	u64 mgptc;
395 396
	u64 tor;
	u64 tot;
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
	u64 tpr;
	u64 tpt;
	u64 ptc64;
	u64 ptc127;
	u64 ptc255;
	u64 ptc511;
	u64 ptc1023;
	u64 ptc1522;
	u64 mptc;
	u64 bptc;
	u64 tsctc;
	u64 tsctfc;
	u64 iac;
	u64 icrxptc;
	u64 icrxatc;
	u64 ictxptc;
	u64 ictxatc;
	u64 ictxqec;
	u64 ictxqmtc;
	u64 icrxdmtc;
	u64 icrxoc;
};

struct e1000_phy_stats {
	u32 idle_errors;
	u32 receive_errors;
};

struct e1000_host_mng_dhcp_cookie {
	u32 signature;
B
Bruce Allan 已提交
427 428
	u8 status;
	u8 reserved0;
429 430 431
	u16 vlan_id;
	u32 reserved1;
	u16 reserved2;
B
Bruce Allan 已提交
432 433
	u8 reserved3;
	u8 checksum;
434 435 436 437 438 439 440 441 442 443
};

/* Host Interface "Rev 1" */
struct e1000_host_command_header {
	u8 command_id;
	u8 command_length;
	u8 command_options;
	u8 checksum;
};

B
Bruce Allan 已提交
444
#define E1000_HI_MAX_DATA_LENGTH	252
445 446 447 448 449 450 451
struct e1000_host_command_info {
	struct e1000_host_command_header command_header;
	u8 command_data[E1000_HI_MAX_DATA_LENGTH];
};

/* Host Interface "Rev 2" */
struct e1000_host_mng_command_header {
B
Bruce Allan 已提交
452 453
	u8 command_id;
	u8 checksum;
454 455 456 457 458
	u16 reserved1;
	u16 reserved2;
	u16 command_length;
};

B
Bruce Allan 已提交
459
#define E1000_HI_MAX_MNG_DATA_LENGTH	0x6F8
460 461 462 463 464
struct e1000_host_mng_command_info {
	struct e1000_host_mng_command_header command_header;
	u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH];
};

465
#include "mac.h"
466
#include "phy.h"
467
#include "nvm.h"
468
#include "manage.h"
469

B
Bruce Allan 已提交
470
/* Function pointers for the MAC. */
471
struct e1000_mac_operations {
472
	s32  (*id_led_init)(struct e1000_hw *);
473
	s32  (*blink_led)(struct e1000_hw *);
474
	bool (*check_mng_mode)(struct e1000_hw *);
475 476 477
	s32  (*check_for_link)(struct e1000_hw *);
	s32  (*cleanup_led)(struct e1000_hw *);
	void (*clear_hw_cntrs)(struct e1000_hw *);
478
	void (*clear_vfta)(struct e1000_hw *);
479
	s32  (*get_bus_info)(struct e1000_hw *);
480
	void (*set_lan_id)(struct e1000_hw *);
481 482 483
	s32  (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *);
	s32  (*led_on)(struct e1000_hw *);
	s32  (*led_off)(struct e1000_hw *);
484
	void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32);
485 486 487 488
	s32  (*reset_hw)(struct e1000_hw *);
	s32  (*init_hw)(struct e1000_hw *);
	s32  (*setup_link)(struct e1000_hw *);
	s32  (*setup_physical_interface)(struct e1000_hw *);
489
	s32  (*setup_led)(struct e1000_hw *);
490
	void (*write_vfta)(struct e1000_hw *, u32, u32);
491
	void (*config_collision_dist)(struct e1000_hw *);
492
	int  (*rar_set)(struct e1000_hw *, u8 *, u32);
493
	s32  (*read_mac_addr)(struct e1000_hw *);
494
	u32  (*rar_get_count)(struct e1000_hw *);
495 496
};

B
Bruce Allan 已提交
497
/* When to use various PHY register access functions:
498 499 500 501 502 503 504 505 506 507 508 509 510
 *
 *                 Func   Caller
 *   Function      Does   Does    When to use
 *   ~~~~~~~~~~~~  ~~~~~  ~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *   X_reg         L,P,A  n/a     for simple PHY reg accesses
 *   X_reg_locked  P,A    L       for multiple accesses of different regs
 *                                on different pages
 *   X_reg_page    A      L,P     for multiple accesses of different regs
 *                                on the same page
 *
 * Where X=[read|write], L=locking, P=sets page, A=register access
 *
 */
511
struct e1000_phy_operations {
512 513
	s32  (*acquire)(struct e1000_hw *);
	s32  (*cfg_on_link_up)(struct e1000_hw *);
514
	s32  (*check_polarity)(struct e1000_hw *);
515
	s32  (*check_reset_block)(struct e1000_hw *);
516
	s32  (*commit)(struct e1000_hw *);
517 518 519
	s32  (*force_speed_duplex)(struct e1000_hw *);
	s32  (*get_cfg_done)(struct e1000_hw *hw);
	s32  (*get_cable_length)(struct e1000_hw *);
520
	s32  (*get_info)(struct e1000_hw *);
521
	s32  (*set_page)(struct e1000_hw *, u16);
522 523
	s32  (*read_reg)(struct e1000_hw *, u32, u16 *);
	s32  (*read_reg_locked)(struct e1000_hw *, u32, u16 *);
524
	s32  (*read_reg_page)(struct e1000_hw *, u32, u16 *);
525 526
	void (*release)(struct e1000_hw *);
	s32  (*reset)(struct e1000_hw *);
527 528
	s32  (*set_d0_lplu_state)(struct e1000_hw *, bool);
	s32  (*set_d3_lplu_state)(struct e1000_hw *, bool);
529 530
	s32  (*write_reg)(struct e1000_hw *, u32, u16);
	s32  (*write_reg_locked)(struct e1000_hw *, u32, u16);
531
	s32  (*write_reg_page)(struct e1000_hw *, u32, u16);
532 533
	void (*power_up)(struct e1000_hw *);
	void (*power_down)(struct e1000_hw *);
534 535 536 537
};

/* Function pointers for the NVM. */
struct e1000_nvm_operations {
538 539 540
	s32  (*acquire)(struct e1000_hw *);
	s32  (*read)(struct e1000_hw *, u16, u16, u16 *);
	void (*release)(struct e1000_hw *);
541
	void (*reload)(struct e1000_hw *);
542
	s32  (*update)(struct e1000_hw *);
543
	s32  (*valid_led_default)(struct e1000_hw *, u16 *);
544 545
	s32  (*validate)(struct e1000_hw *);
	s32  (*write)(struct e1000_hw *, u16, u16, u16 *);
546 547 548 549
};

struct e1000_mac_info {
	struct e1000_mac_operations ops;
550 551
	u8 addr[ETH_ALEN];
	u8 perm_addr[ETH_ALEN];
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568

	enum e1000_mac_type type;

	u32 collision_delta;
	u32 ledctl_default;
	u32 ledctl_mode1;
	u32 ledctl_mode2;
	u32 mc_filter_type;
	u32 tx_packet_delta;
	u32 txcw;

	u16 current_ifs_val;
	u16 ifs_max_val;
	u16 ifs_min_val;
	u16 ifs_ratio;
	u16 ifs_step_size;
	u16 mta_reg_count;
569 570

	/* Maximum size of the MTA register table in all supported adapters */
571
#define MAX_MTA_REG 128
572
	u32 mta_shadow[MAX_MTA_REG];
573 574
	u16 rar_entry_count;

B
Bruce Allan 已提交
575
	u8 forced_speed_duplex;
576

577
	bool adaptive_ifs;
578
	bool has_fwsm;
579 580 581 582 583 584 585
	bool arc_subsystem_valid;
	bool autoneg;
	bool autoneg_failed;
	bool get_link_status;
	bool in_ifs_mode;
	bool serdes_has_link;
	bool tx_pkt_filtering;
586
	enum e1000_serdes_link_state serdes_link_state;
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
};

struct e1000_phy_info {
	struct e1000_phy_operations ops;

	enum e1000_phy_type type;

	enum e1000_1000t_rx_status local_rx;
	enum e1000_1000t_rx_status remote_rx;
	enum e1000_ms_type ms_type;
	enum e1000_ms_type original_ms_type;
	enum e1000_rev_polarity cable_polarity;
	enum e1000_smart_speed smart_speed;

	u32 addr;
	u32 id;
B
Bruce Allan 已提交
603
	u32 reset_delay_us;	/* in usec */
604 605
	u32 revision;

606 607
	enum e1000_media_type media_type;

608 609 610 611 612 613 614 615 616 617 618 619
	u16 autoneg_advertised;
	u16 autoneg_mask;
	u16 cable_length;
	u16 max_cable_length;
	u16 min_cable_length;

	u8 mdix;

	bool disable_polarity_correction;
	bool is_mdix;
	bool polarity_correction;
	bool speed_downgraded;
620
	bool autoneg_wait_to_complete;
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
};

struct e1000_nvm_info {
	struct e1000_nvm_operations ops;

	enum e1000_nvm_type type;
	enum e1000_nvm_override override;

	u32 flash_bank_size;
	u32 flash_base_addr;

	u16 word_size;
	u16 delay_usec;
	u16 address_bits;
	u16 opcode_bits;
	u16 page_size;
};

struct e1000_bus_info {
	enum e1000_bus_width width;

	u16 func;
};

645 646 647 648
struct e1000_fc_info {
	u32 high_water;          /* Flow control high-water mark */
	u32 low_water;           /* Flow control low-water mark */
	u16 pause_time;          /* Flow control pause timer */
649
	u16 refresh_time;        /* Flow control refresh timer */
650 651
	bool send_xon;           /* Flow control send XON */
	bool strict_ieee;        /* Strict IEEE mode */
652 653
	enum e1000_fc_mode current_mode; /* FC mode in effect */
	enum e1000_fc_mode requested_mode; /* FC mode requested by caller */
654 655
};

656 657
struct e1000_dev_spec_82571 {
	bool laa_is_present;
658
	u32 smb_counter;
659 660
};

661
struct e1000_dev_spec_80003es2lan {
B
Bruce Allan 已提交
662
	bool mdic_wa_enable;
663 664
};

665
struct e1000_shadow_ram {
B
Bruce Allan 已提交
666
	u16 value;
667 668 669 670 671
	bool modified;
};

#define E1000_ICH8_SHADOW_RAM_WORDS		2048

672 673 674 675 676 677 678
/* I218 PHY Ultra Low Power (ULP) states */
enum e1000_ulp_state {
	e1000_ulp_state_unknown,
	e1000_ulp_state_off,
	e1000_ulp_state_on,
};

679 680 681
struct e1000_dev_spec_ich8lan {
	bool kmrn_lock_loss_workaround_enabled;
	struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];
682
	bool nvm_k1_enabled;
683
	bool eee_disable;
B
Bruce Allan 已提交
684
	u16 eee_lp_ability;
685
	enum e1000_ulp_state ulp_state;
686 687 688 689 690
};

struct e1000_hw {
	struct e1000_adapter *adapter;

691 692
	void __iomem *hw_addr;
	void __iomem *flash_address;
693

B
Bruce Allan 已提交
694 695 696 697 698
	struct e1000_mac_info mac;
	struct e1000_fc_info fc;
	struct e1000_phy_info phy;
	struct e1000_nvm_info nvm;
	struct e1000_bus_info bus;
699 700 701
	struct e1000_host_mng_dhcp_cookie mng_cookie;

	union {
B
Bruce Allan 已提交
702
		struct e1000_dev_spec_82571 e82571;
703
		struct e1000_dev_spec_80003es2lan e80003es2lan;
B
Bruce Allan 已提交
704
		struct e1000_dev_spec_ich8lan ich8lan;
705 706 707
	} dev_spec;
};

708
#include "82571.h"
709
#include "80003es2lan.h"
710
#include "ich8lan.h"
711

712
#endif