162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright(c) 2007 - 2018 Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _E1000_IGB_HW_H_
562306a36Sopenharmony_ci#define _E1000_IGB_HW_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/types.h>
862306a36Sopenharmony_ci#include <linux/delay.h>
962306a36Sopenharmony_ci#include <linux/io.h>
1062306a36Sopenharmony_ci#include <linux/netdevice.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "e1000_regs.h"
1362306a36Sopenharmony_ci#include "e1000_defines.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct e1000_hw;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define E1000_DEV_ID_82576			0x10C9
1862306a36Sopenharmony_ci#define E1000_DEV_ID_82576_FIBER		0x10E6
1962306a36Sopenharmony_ci#define E1000_DEV_ID_82576_SERDES		0x10E7
2062306a36Sopenharmony_ci#define E1000_DEV_ID_82576_QUAD_COPPER		0x10E8
2162306a36Sopenharmony_ci#define E1000_DEV_ID_82576_QUAD_COPPER_ET2	0x1526
2262306a36Sopenharmony_ci#define E1000_DEV_ID_82576_NS			0x150A
2362306a36Sopenharmony_ci#define E1000_DEV_ID_82576_NS_SERDES		0x1518
2462306a36Sopenharmony_ci#define E1000_DEV_ID_82576_SERDES_QUAD		0x150D
2562306a36Sopenharmony_ci#define E1000_DEV_ID_82575EB_COPPER		0x10A7
2662306a36Sopenharmony_ci#define E1000_DEV_ID_82575EB_FIBER_SERDES	0x10A9
2762306a36Sopenharmony_ci#define E1000_DEV_ID_82575GB_QUAD_COPPER	0x10D6
2862306a36Sopenharmony_ci#define E1000_DEV_ID_82580_COPPER		0x150E
2962306a36Sopenharmony_ci#define E1000_DEV_ID_82580_FIBER		0x150F
3062306a36Sopenharmony_ci#define E1000_DEV_ID_82580_SERDES		0x1510
3162306a36Sopenharmony_ci#define E1000_DEV_ID_82580_SGMII		0x1511
3262306a36Sopenharmony_ci#define E1000_DEV_ID_82580_COPPER_DUAL		0x1516
3362306a36Sopenharmony_ci#define E1000_DEV_ID_82580_QUAD_FIBER		0x1527
3462306a36Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_SGMII		0x0438
3562306a36Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_SERDES		0x043A
3662306a36Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_BACKPLANE		0x043C
3762306a36Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_SFP		0x0440
3862306a36Sopenharmony_ci#define E1000_DEV_ID_I350_COPPER		0x1521
3962306a36Sopenharmony_ci#define E1000_DEV_ID_I350_FIBER			0x1522
4062306a36Sopenharmony_ci#define E1000_DEV_ID_I350_SERDES		0x1523
4162306a36Sopenharmony_ci#define E1000_DEV_ID_I350_SGMII			0x1524
4262306a36Sopenharmony_ci#define E1000_DEV_ID_I210_COPPER		0x1533
4362306a36Sopenharmony_ci#define E1000_DEV_ID_I210_FIBER			0x1536
4462306a36Sopenharmony_ci#define E1000_DEV_ID_I210_SERDES		0x1537
4562306a36Sopenharmony_ci#define E1000_DEV_ID_I210_SGMII			0x1538
4662306a36Sopenharmony_ci#define E1000_DEV_ID_I210_COPPER_FLASHLESS	0x157B
4762306a36Sopenharmony_ci#define E1000_DEV_ID_I210_SERDES_FLASHLESS	0x157C
4862306a36Sopenharmony_ci#define E1000_DEV_ID_I211_COPPER		0x1539
4962306a36Sopenharmony_ci#define E1000_DEV_ID_I354_BACKPLANE_1GBPS	0x1F40
5062306a36Sopenharmony_ci#define E1000_DEV_ID_I354_SGMII			0x1F41
5162306a36Sopenharmony_ci#define E1000_DEV_ID_I354_BACKPLANE_2_5GBPS	0x1F45
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define E1000_REVISION_2 2
5462306a36Sopenharmony_ci#define E1000_REVISION_4 4
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define E1000_FUNC_0     0
5762306a36Sopenharmony_ci#define E1000_FUNC_1     1
5862306a36Sopenharmony_ci#define E1000_FUNC_2     2
5962306a36Sopenharmony_ci#define E1000_FUNC_3     3
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0   0
6262306a36Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1   3
6362306a36Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN2   6
6462306a36Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN3   9
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cienum e1000_mac_type {
6762306a36Sopenharmony_ci	e1000_undefined = 0,
6862306a36Sopenharmony_ci	e1000_82575,
6962306a36Sopenharmony_ci	e1000_82576,
7062306a36Sopenharmony_ci	e1000_82580,
7162306a36Sopenharmony_ci	e1000_i350,
7262306a36Sopenharmony_ci	e1000_i354,
7362306a36Sopenharmony_ci	e1000_i210,
7462306a36Sopenharmony_ci	e1000_i211,
7562306a36Sopenharmony_ci	e1000_num_macs  /* List is 1-based, so subtract 1 for true count. */
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cienum e1000_media_type {
7962306a36Sopenharmony_ci	e1000_media_type_unknown = 0,
8062306a36Sopenharmony_ci	e1000_media_type_copper = 1,
8162306a36Sopenharmony_ci	e1000_media_type_fiber = 2,
8262306a36Sopenharmony_ci	e1000_media_type_internal_serdes = 3,
8362306a36Sopenharmony_ci	e1000_num_media_types
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cienum e1000_nvm_type {
8762306a36Sopenharmony_ci	e1000_nvm_unknown = 0,
8862306a36Sopenharmony_ci	e1000_nvm_none,
8962306a36Sopenharmony_ci	e1000_nvm_eeprom_spi,
9062306a36Sopenharmony_ci	e1000_nvm_flash_hw,
9162306a36Sopenharmony_ci	e1000_nvm_invm,
9262306a36Sopenharmony_ci	e1000_nvm_flash_sw
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cienum e1000_nvm_override {
9662306a36Sopenharmony_ci	e1000_nvm_override_none = 0,
9762306a36Sopenharmony_ci	e1000_nvm_override_spi_small,
9862306a36Sopenharmony_ci	e1000_nvm_override_spi_large,
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cienum e1000_phy_type {
10262306a36Sopenharmony_ci	e1000_phy_unknown = 0,
10362306a36Sopenharmony_ci	e1000_phy_none,
10462306a36Sopenharmony_ci	e1000_phy_m88,
10562306a36Sopenharmony_ci	e1000_phy_igp,
10662306a36Sopenharmony_ci	e1000_phy_igp_2,
10762306a36Sopenharmony_ci	e1000_phy_gg82563,
10862306a36Sopenharmony_ci	e1000_phy_igp_3,
10962306a36Sopenharmony_ci	e1000_phy_ife,
11062306a36Sopenharmony_ci	e1000_phy_82580,
11162306a36Sopenharmony_ci	e1000_phy_i210,
11262306a36Sopenharmony_ci	e1000_phy_bcm54616,
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cienum e1000_bus_type {
11662306a36Sopenharmony_ci	e1000_bus_type_unknown = 0,
11762306a36Sopenharmony_ci	e1000_bus_type_pci,
11862306a36Sopenharmony_ci	e1000_bus_type_pcix,
11962306a36Sopenharmony_ci	e1000_bus_type_pci_express,
12062306a36Sopenharmony_ci	e1000_bus_type_reserved
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cienum e1000_bus_speed {
12462306a36Sopenharmony_ci	e1000_bus_speed_unknown = 0,
12562306a36Sopenharmony_ci	e1000_bus_speed_33,
12662306a36Sopenharmony_ci	e1000_bus_speed_66,
12762306a36Sopenharmony_ci	e1000_bus_speed_100,
12862306a36Sopenharmony_ci	e1000_bus_speed_120,
12962306a36Sopenharmony_ci	e1000_bus_speed_133,
13062306a36Sopenharmony_ci	e1000_bus_speed_2500,
13162306a36Sopenharmony_ci	e1000_bus_speed_5000,
13262306a36Sopenharmony_ci	e1000_bus_speed_reserved
13362306a36Sopenharmony_ci};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cienum e1000_bus_width {
13662306a36Sopenharmony_ci	e1000_bus_width_unknown = 0,
13762306a36Sopenharmony_ci	e1000_bus_width_pcie_x1,
13862306a36Sopenharmony_ci	e1000_bus_width_pcie_x2,
13962306a36Sopenharmony_ci	e1000_bus_width_pcie_x4 = 4,
14062306a36Sopenharmony_ci	e1000_bus_width_pcie_x8 = 8,
14162306a36Sopenharmony_ci	e1000_bus_width_32,
14262306a36Sopenharmony_ci	e1000_bus_width_64,
14362306a36Sopenharmony_ci	e1000_bus_width_reserved
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cienum e1000_1000t_rx_status {
14762306a36Sopenharmony_ci	e1000_1000t_rx_status_not_ok = 0,
14862306a36Sopenharmony_ci	e1000_1000t_rx_status_ok,
14962306a36Sopenharmony_ci	e1000_1000t_rx_status_undefined = 0xFF
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cienum e1000_rev_polarity {
15362306a36Sopenharmony_ci	e1000_rev_polarity_normal = 0,
15462306a36Sopenharmony_ci	e1000_rev_polarity_reversed,
15562306a36Sopenharmony_ci	e1000_rev_polarity_undefined = 0xFF
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cienum e1000_fc_mode {
15962306a36Sopenharmony_ci	e1000_fc_none = 0,
16062306a36Sopenharmony_ci	e1000_fc_rx_pause,
16162306a36Sopenharmony_ci	e1000_fc_tx_pause,
16262306a36Sopenharmony_ci	e1000_fc_full,
16362306a36Sopenharmony_ci	e1000_fc_default = 0xFF
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci/* Statistics counters collected by the MAC */
16762306a36Sopenharmony_cistruct e1000_hw_stats {
16862306a36Sopenharmony_ci	u64 crcerrs;
16962306a36Sopenharmony_ci	u64 algnerrc;
17062306a36Sopenharmony_ci	u64 symerrs;
17162306a36Sopenharmony_ci	u64 rxerrc;
17262306a36Sopenharmony_ci	u64 mpc;
17362306a36Sopenharmony_ci	u64 scc;
17462306a36Sopenharmony_ci	u64 ecol;
17562306a36Sopenharmony_ci	u64 mcc;
17662306a36Sopenharmony_ci	u64 latecol;
17762306a36Sopenharmony_ci	u64 colc;
17862306a36Sopenharmony_ci	u64 dc;
17962306a36Sopenharmony_ci	u64 tncrs;
18062306a36Sopenharmony_ci	u64 sec;
18162306a36Sopenharmony_ci	u64 cexterr;
18262306a36Sopenharmony_ci	u64 rlec;
18362306a36Sopenharmony_ci	u64 xonrxc;
18462306a36Sopenharmony_ci	u64 xontxc;
18562306a36Sopenharmony_ci	u64 xoffrxc;
18662306a36Sopenharmony_ci	u64 xofftxc;
18762306a36Sopenharmony_ci	u64 fcruc;
18862306a36Sopenharmony_ci	u64 prc64;
18962306a36Sopenharmony_ci	u64 prc127;
19062306a36Sopenharmony_ci	u64 prc255;
19162306a36Sopenharmony_ci	u64 prc511;
19262306a36Sopenharmony_ci	u64 prc1023;
19362306a36Sopenharmony_ci	u64 prc1522;
19462306a36Sopenharmony_ci	u64 gprc;
19562306a36Sopenharmony_ci	u64 bprc;
19662306a36Sopenharmony_ci	u64 mprc;
19762306a36Sopenharmony_ci	u64 gptc;
19862306a36Sopenharmony_ci	u64 gorc;
19962306a36Sopenharmony_ci	u64 gotc;
20062306a36Sopenharmony_ci	u64 rnbc;
20162306a36Sopenharmony_ci	u64 ruc;
20262306a36Sopenharmony_ci	u64 rfc;
20362306a36Sopenharmony_ci	u64 roc;
20462306a36Sopenharmony_ci	u64 rjc;
20562306a36Sopenharmony_ci	u64 mgprc;
20662306a36Sopenharmony_ci	u64 mgpdc;
20762306a36Sopenharmony_ci	u64 mgptc;
20862306a36Sopenharmony_ci	u64 tor;
20962306a36Sopenharmony_ci	u64 tot;
21062306a36Sopenharmony_ci	u64 tpr;
21162306a36Sopenharmony_ci	u64 tpt;
21262306a36Sopenharmony_ci	u64 ptc64;
21362306a36Sopenharmony_ci	u64 ptc127;
21462306a36Sopenharmony_ci	u64 ptc255;
21562306a36Sopenharmony_ci	u64 ptc511;
21662306a36Sopenharmony_ci	u64 ptc1023;
21762306a36Sopenharmony_ci	u64 ptc1522;
21862306a36Sopenharmony_ci	u64 mptc;
21962306a36Sopenharmony_ci	u64 bptc;
22062306a36Sopenharmony_ci	u64 tsctc;
22162306a36Sopenharmony_ci	u64 tsctfc;
22262306a36Sopenharmony_ci	u64 iac;
22362306a36Sopenharmony_ci	u64 icrxptc;
22462306a36Sopenharmony_ci	u64 icrxatc;
22562306a36Sopenharmony_ci	u64 ictxptc;
22662306a36Sopenharmony_ci	u64 ictxatc;
22762306a36Sopenharmony_ci	u64 ictxqec;
22862306a36Sopenharmony_ci	u64 ictxqmtc;
22962306a36Sopenharmony_ci	u64 icrxdmtc;
23062306a36Sopenharmony_ci	u64 icrxoc;
23162306a36Sopenharmony_ci	u64 cbtmpc;
23262306a36Sopenharmony_ci	u64 htdpmc;
23362306a36Sopenharmony_ci	u64 cbrdpc;
23462306a36Sopenharmony_ci	u64 cbrmpc;
23562306a36Sopenharmony_ci	u64 rpthc;
23662306a36Sopenharmony_ci	u64 hgptc;
23762306a36Sopenharmony_ci	u64 htcbdpc;
23862306a36Sopenharmony_ci	u64 hgorc;
23962306a36Sopenharmony_ci	u64 hgotc;
24062306a36Sopenharmony_ci	u64 lenerrs;
24162306a36Sopenharmony_ci	u64 scvpc;
24262306a36Sopenharmony_ci	u64 hrmpc;
24362306a36Sopenharmony_ci	u64 doosync;
24462306a36Sopenharmony_ci	u64 o2bgptc;
24562306a36Sopenharmony_ci	u64 o2bspc;
24662306a36Sopenharmony_ci	u64 b2ospc;
24762306a36Sopenharmony_ci	u64 b2ogprc;
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cistruct e1000_host_mng_dhcp_cookie {
25162306a36Sopenharmony_ci	u32 signature;
25262306a36Sopenharmony_ci	u8  status;
25362306a36Sopenharmony_ci	u8  reserved0;
25462306a36Sopenharmony_ci	u16 vlan_id;
25562306a36Sopenharmony_ci	u32 reserved1;
25662306a36Sopenharmony_ci	u16 reserved2;
25762306a36Sopenharmony_ci	u8  reserved3;
25862306a36Sopenharmony_ci	u8  checksum;
25962306a36Sopenharmony_ci};
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci/* Host Interface "Rev 1" */
26262306a36Sopenharmony_cistruct e1000_host_command_header {
26362306a36Sopenharmony_ci	u8 command_id;
26462306a36Sopenharmony_ci	u8 command_length;
26562306a36Sopenharmony_ci	u8 command_options;
26662306a36Sopenharmony_ci	u8 checksum;
26762306a36Sopenharmony_ci};
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci#define E1000_HI_MAX_DATA_LENGTH     252
27062306a36Sopenharmony_cistruct e1000_host_command_info {
27162306a36Sopenharmony_ci	struct e1000_host_command_header command_header;
27262306a36Sopenharmony_ci	u8 command_data[E1000_HI_MAX_DATA_LENGTH];
27362306a36Sopenharmony_ci};
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci/* Host Interface "Rev 2" */
27662306a36Sopenharmony_cistruct e1000_host_mng_command_header {
27762306a36Sopenharmony_ci	u8  command_id;
27862306a36Sopenharmony_ci	u8  checksum;
27962306a36Sopenharmony_ci	u16 reserved1;
28062306a36Sopenharmony_ci	u16 reserved2;
28162306a36Sopenharmony_ci	u16 command_length;
28262306a36Sopenharmony_ci};
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8
28562306a36Sopenharmony_cistruct e1000_host_mng_command_info {
28662306a36Sopenharmony_ci	struct e1000_host_mng_command_header command_header;
28762306a36Sopenharmony_ci	u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH];
28862306a36Sopenharmony_ci};
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci#include "e1000_mac.h"
29162306a36Sopenharmony_ci#include "e1000_phy.h"
29262306a36Sopenharmony_ci#include "e1000_nvm.h"
29362306a36Sopenharmony_ci#include "e1000_mbx.h"
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_cistruct e1000_mac_operations {
29662306a36Sopenharmony_ci	s32 (*check_for_link)(struct e1000_hw *);
29762306a36Sopenharmony_ci	s32 (*reset_hw)(struct e1000_hw *);
29862306a36Sopenharmony_ci	s32 (*init_hw)(struct e1000_hw *);
29962306a36Sopenharmony_ci	bool (*check_mng_mode)(struct e1000_hw *);
30062306a36Sopenharmony_ci	s32 (*setup_physical_interface)(struct e1000_hw *);
30162306a36Sopenharmony_ci	void (*rar_set)(struct e1000_hw *, u8 *, u32);
30262306a36Sopenharmony_ci	s32 (*read_mac_addr)(struct e1000_hw *);
30362306a36Sopenharmony_ci	s32 (*get_speed_and_duplex)(struct e1000_hw *, u16 *, u16 *);
30462306a36Sopenharmony_ci	s32 (*acquire_swfw_sync)(struct e1000_hw *, u16);
30562306a36Sopenharmony_ci	void (*release_swfw_sync)(struct e1000_hw *, u16);
30662306a36Sopenharmony_ci#ifdef CONFIG_IGB_HWMON
30762306a36Sopenharmony_ci	s32 (*get_thermal_sensor_data)(struct e1000_hw *);
30862306a36Sopenharmony_ci	s32 (*init_thermal_sensor_thresh)(struct e1000_hw *);
30962306a36Sopenharmony_ci#endif
31062306a36Sopenharmony_ci	void (*write_vfta)(struct e1000_hw *, u32, u32);
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_cistruct e1000_phy_operations {
31462306a36Sopenharmony_ci	s32 (*acquire)(struct e1000_hw *);
31562306a36Sopenharmony_ci	s32 (*check_polarity)(struct e1000_hw *);
31662306a36Sopenharmony_ci	s32 (*check_reset_block)(struct e1000_hw *);
31762306a36Sopenharmony_ci	s32 (*force_speed_duplex)(struct e1000_hw *);
31862306a36Sopenharmony_ci	s32 (*get_cfg_done)(struct e1000_hw *hw);
31962306a36Sopenharmony_ci	s32 (*get_cable_length)(struct e1000_hw *);
32062306a36Sopenharmony_ci	s32 (*get_phy_info)(struct e1000_hw *);
32162306a36Sopenharmony_ci	s32 (*read_reg)(struct e1000_hw *, u32, u16 *);
32262306a36Sopenharmony_ci	void (*release)(struct e1000_hw *);
32362306a36Sopenharmony_ci	s32 (*reset)(struct e1000_hw *);
32462306a36Sopenharmony_ci	s32 (*set_d0_lplu_state)(struct e1000_hw *, bool);
32562306a36Sopenharmony_ci	s32 (*set_d3_lplu_state)(struct e1000_hw *, bool);
32662306a36Sopenharmony_ci	s32 (*write_reg)(struct e1000_hw *, u32, u16);
32762306a36Sopenharmony_ci	s32 (*read_i2c_byte)(struct e1000_hw *, u8, u8, u8 *);
32862306a36Sopenharmony_ci	s32 (*write_i2c_byte)(struct e1000_hw *, u8, u8, u8);
32962306a36Sopenharmony_ci};
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_cistruct e1000_nvm_operations {
33262306a36Sopenharmony_ci	s32 (*acquire)(struct e1000_hw *);
33362306a36Sopenharmony_ci	s32 (*read)(struct e1000_hw *, u16, u16, u16 *);
33462306a36Sopenharmony_ci	void (*release)(struct e1000_hw *);
33562306a36Sopenharmony_ci	s32 (*write)(struct e1000_hw *, u16, u16, u16 *);
33662306a36Sopenharmony_ci	s32 (*update)(struct e1000_hw *);
33762306a36Sopenharmony_ci	s32 (*validate)(struct e1000_hw *);
33862306a36Sopenharmony_ci	s32 (*valid_led_default)(struct e1000_hw *, u16 *);
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci#define E1000_MAX_SENSORS		3
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_cistruct e1000_thermal_diode_data {
34462306a36Sopenharmony_ci	u8 location;
34562306a36Sopenharmony_ci	u8 temp;
34662306a36Sopenharmony_ci	u8 caution_thresh;
34762306a36Sopenharmony_ci	u8 max_op_thresh;
34862306a36Sopenharmony_ci};
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistruct e1000_thermal_sensor_data {
35162306a36Sopenharmony_ci	struct e1000_thermal_diode_data sensor[E1000_MAX_SENSORS];
35262306a36Sopenharmony_ci};
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_cistruct e1000_info {
35562306a36Sopenharmony_ci	s32 (*get_invariants)(struct e1000_hw *);
35662306a36Sopenharmony_ci	struct e1000_mac_operations *mac_ops;
35762306a36Sopenharmony_ci	const struct e1000_phy_operations *phy_ops;
35862306a36Sopenharmony_ci	struct e1000_nvm_operations *nvm_ops;
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ciextern const struct e1000_info e1000_82575_info;
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistruct e1000_mac_info {
36462306a36Sopenharmony_ci	struct e1000_mac_operations ops;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	u8 addr[6];
36762306a36Sopenharmony_ci	u8 perm_addr[6];
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	enum e1000_mac_type type;
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	u32 ledctl_default;
37262306a36Sopenharmony_ci	u32 ledctl_mode1;
37362306a36Sopenharmony_ci	u32 ledctl_mode2;
37462306a36Sopenharmony_ci	u32 mc_filter_type;
37562306a36Sopenharmony_ci	u32 txcw;
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	u16 mta_reg_count;
37862306a36Sopenharmony_ci	u16 uta_reg_count;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	/* Maximum size of the MTA register table in all supported adapters */
38162306a36Sopenharmony_ci	#define MAX_MTA_REG 128
38262306a36Sopenharmony_ci	u32 mta_shadow[MAX_MTA_REG];
38362306a36Sopenharmony_ci	u16 rar_entry_count;
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	u8  forced_speed_duplex;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	bool adaptive_ifs;
38862306a36Sopenharmony_ci	bool arc_subsystem_valid;
38962306a36Sopenharmony_ci	bool asf_firmware_present;
39062306a36Sopenharmony_ci	bool autoneg;
39162306a36Sopenharmony_ci	bool autoneg_failed;
39262306a36Sopenharmony_ci	bool disable_hw_init_bits;
39362306a36Sopenharmony_ci	bool get_link_status;
39462306a36Sopenharmony_ci	bool ifs_params_forced;
39562306a36Sopenharmony_ci	bool in_ifs_mode;
39662306a36Sopenharmony_ci	bool report_tx_early;
39762306a36Sopenharmony_ci	bool serdes_has_link;
39862306a36Sopenharmony_ci	bool tx_pkt_filtering;
39962306a36Sopenharmony_ci	struct e1000_thermal_sensor_data thermal_sensor_data;
40062306a36Sopenharmony_ci};
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_cistruct e1000_phy_info {
40362306a36Sopenharmony_ci	struct e1000_phy_operations ops;
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	enum e1000_phy_type type;
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	enum e1000_1000t_rx_status local_rx;
40862306a36Sopenharmony_ci	enum e1000_1000t_rx_status remote_rx;
40962306a36Sopenharmony_ci	enum e1000_ms_type ms_type;
41062306a36Sopenharmony_ci	enum e1000_ms_type original_ms_type;
41162306a36Sopenharmony_ci	enum e1000_rev_polarity cable_polarity;
41262306a36Sopenharmony_ci	enum e1000_smart_speed smart_speed;
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci	u32 addr;
41562306a36Sopenharmony_ci	u32 id;
41662306a36Sopenharmony_ci	u32 reset_delay_us; /* in usec */
41762306a36Sopenharmony_ci	u32 revision;
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	enum e1000_media_type media_type;
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci	u16 autoneg_advertised;
42262306a36Sopenharmony_ci	u16 autoneg_mask;
42362306a36Sopenharmony_ci	u16 cable_length;
42462306a36Sopenharmony_ci	u16 max_cable_length;
42562306a36Sopenharmony_ci	u16 min_cable_length;
42662306a36Sopenharmony_ci	u16 pair_length[4];
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci	u8 mdix;
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	bool disable_polarity_correction;
43162306a36Sopenharmony_ci	bool is_mdix;
43262306a36Sopenharmony_ci	bool polarity_correction;
43362306a36Sopenharmony_ci	bool reset_disable;
43462306a36Sopenharmony_ci	bool speed_downgraded;
43562306a36Sopenharmony_ci	bool autoneg_wait_to_complete;
43662306a36Sopenharmony_ci};
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_cistruct e1000_nvm_info {
43962306a36Sopenharmony_ci	struct e1000_nvm_operations ops;
44062306a36Sopenharmony_ci	enum e1000_nvm_type type;
44162306a36Sopenharmony_ci	enum e1000_nvm_override override;
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	u32 flash_bank_size;
44462306a36Sopenharmony_ci	u32 flash_base_addr;
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	u16 word_size;
44762306a36Sopenharmony_ci	u16 delay_usec;
44862306a36Sopenharmony_ci	u16 address_bits;
44962306a36Sopenharmony_ci	u16 opcode_bits;
45062306a36Sopenharmony_ci	u16 page_size;
45162306a36Sopenharmony_ci};
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_cistruct e1000_bus_info {
45462306a36Sopenharmony_ci	enum e1000_bus_type type;
45562306a36Sopenharmony_ci	enum e1000_bus_speed speed;
45662306a36Sopenharmony_ci	enum e1000_bus_width width;
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	u32 snoop;
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci	u16 func;
46162306a36Sopenharmony_ci	u16 pci_cmd_word;
46262306a36Sopenharmony_ci};
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_cistruct e1000_fc_info {
46562306a36Sopenharmony_ci	u32 high_water;     /* Flow control high-water mark */
46662306a36Sopenharmony_ci	u32 low_water;      /* Flow control low-water mark */
46762306a36Sopenharmony_ci	u16 pause_time;     /* Flow control pause timer */
46862306a36Sopenharmony_ci	bool send_xon;      /* Flow control send XON */
46962306a36Sopenharmony_ci	bool strict_ieee;   /* Strict IEEE mode */
47062306a36Sopenharmony_ci	enum e1000_fc_mode current_mode; /* Type of flow control */
47162306a36Sopenharmony_ci	enum e1000_fc_mode requested_mode;
47262306a36Sopenharmony_ci};
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_cistruct e1000_mbx_operations {
47562306a36Sopenharmony_ci	s32 (*init_params)(struct e1000_hw *hw);
47662306a36Sopenharmony_ci	s32 (*read)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id,
47762306a36Sopenharmony_ci		    bool unlock);
47862306a36Sopenharmony_ci	s32 (*write)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
47962306a36Sopenharmony_ci	s32 (*read_posted)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
48062306a36Sopenharmony_ci	s32 (*write_posted)(struct e1000_hw *hw, u32 *msg, u16 size,
48162306a36Sopenharmony_ci			    u16 mbx_id);
48262306a36Sopenharmony_ci	s32 (*check_for_msg)(struct e1000_hw *hw, u16 mbx_id);
48362306a36Sopenharmony_ci	s32 (*check_for_ack)(struct e1000_hw *hw, u16 mbx_id);
48462306a36Sopenharmony_ci	s32 (*check_for_rst)(struct e1000_hw *hw, u16 mbx_id);
48562306a36Sopenharmony_ci	s32 (*unlock)(struct e1000_hw *hw, u16 mbx_id);
48662306a36Sopenharmony_ci};
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_cistruct e1000_mbx_stats {
48962306a36Sopenharmony_ci	u32 msgs_tx;
49062306a36Sopenharmony_ci	u32 msgs_rx;
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	u32 acks;
49362306a36Sopenharmony_ci	u32 reqs;
49462306a36Sopenharmony_ci	u32 rsts;
49562306a36Sopenharmony_ci};
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_cistruct e1000_mbx_info {
49862306a36Sopenharmony_ci	struct e1000_mbx_operations ops;
49962306a36Sopenharmony_ci	struct e1000_mbx_stats stats;
50062306a36Sopenharmony_ci	u32 timeout;
50162306a36Sopenharmony_ci	u32 usec_delay;
50262306a36Sopenharmony_ci	u16 size;
50362306a36Sopenharmony_ci};
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_cistruct e1000_dev_spec_82575 {
50662306a36Sopenharmony_ci	bool sgmii_active;
50762306a36Sopenharmony_ci	bool global_device_reset;
50862306a36Sopenharmony_ci	bool eee_disable;
50962306a36Sopenharmony_ci	bool clear_semaphore_once;
51062306a36Sopenharmony_ci	struct e1000_sfp_flags eth_flags;
51162306a36Sopenharmony_ci	bool module_plugged;
51262306a36Sopenharmony_ci	u8 media_port;
51362306a36Sopenharmony_ci	bool media_changed;
51462306a36Sopenharmony_ci	bool mas_capable;
51562306a36Sopenharmony_ci};
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_cistruct e1000_hw {
51862306a36Sopenharmony_ci	void *back;
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	u8 __iomem *hw_addr;
52162306a36Sopenharmony_ci	u8 __iomem *flash_address;
52262306a36Sopenharmony_ci	unsigned long io_base;
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci	struct e1000_mac_info  mac;
52562306a36Sopenharmony_ci	struct e1000_fc_info   fc;
52662306a36Sopenharmony_ci	struct e1000_phy_info  phy;
52762306a36Sopenharmony_ci	struct e1000_nvm_info  nvm;
52862306a36Sopenharmony_ci	struct e1000_bus_info  bus;
52962306a36Sopenharmony_ci	struct e1000_mbx_info mbx;
53062306a36Sopenharmony_ci	struct e1000_host_mng_dhcp_cookie mng_cookie;
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci	union {
53362306a36Sopenharmony_ci		struct e1000_dev_spec_82575	_82575;
53462306a36Sopenharmony_ci	} dev_spec;
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	u16 device_id;
53762306a36Sopenharmony_ci	u16 subsystem_vendor_id;
53862306a36Sopenharmony_ci	u16 subsystem_device_id;
53962306a36Sopenharmony_ci	u16 vendor_id;
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci	u8  revision_id;
54262306a36Sopenharmony_ci};
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_cistruct net_device *igb_get_hw_dev(struct e1000_hw *hw);
54562306a36Sopenharmony_ci#define hw_dbg(format, arg...) \
54662306a36Sopenharmony_ci	netdev_dbg(igb_get_hw_dev(hw), format, ##arg)
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci/* These functions must be implemented by drivers */
54962306a36Sopenharmony_cis32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
55062306a36Sopenharmony_cis32 igb_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_civoid igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
55362306a36Sopenharmony_civoid igb_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
55462306a36Sopenharmony_ci#endif /* _E1000_IGB_HW_H_ */
555