18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright(c) 2007 - 2018 Intel Corporation. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef _E1000_HW_H_
58c2ecf20Sopenharmony_ci#define _E1000_HW_H_
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/types.h>
88c2ecf20Sopenharmony_ci#include <linux/delay.h>
98c2ecf20Sopenharmony_ci#include <linux/io.h>
108c2ecf20Sopenharmony_ci#include <linux/netdevice.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include "e1000_regs.h"
138c2ecf20Sopenharmony_ci#include "e1000_defines.h"
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct e1000_hw;
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576			0x10C9
188c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_FIBER		0x10E6
198c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_SERDES		0x10E7
208c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_QUAD_COPPER		0x10E8
218c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_QUAD_COPPER_ET2	0x1526
228c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_NS			0x150A
238c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_NS_SERDES		0x1518
248c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82576_SERDES_QUAD		0x150D
258c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82575EB_COPPER		0x10A7
268c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82575EB_FIBER_SERDES	0x10A9
278c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82575GB_QUAD_COPPER	0x10D6
288c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82580_COPPER		0x150E
298c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82580_FIBER		0x150F
308c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82580_SERDES		0x1510
318c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82580_SGMII		0x1511
328c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82580_COPPER_DUAL		0x1516
338c2ecf20Sopenharmony_ci#define E1000_DEV_ID_82580_QUAD_FIBER		0x1527
348c2ecf20Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_SGMII		0x0438
358c2ecf20Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_SERDES		0x043A
368c2ecf20Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_BACKPLANE		0x043C
378c2ecf20Sopenharmony_ci#define E1000_DEV_ID_DH89XXCC_SFP		0x0440
388c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I350_COPPER		0x1521
398c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I350_FIBER			0x1522
408c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I350_SERDES		0x1523
418c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I350_SGMII			0x1524
428c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I210_COPPER		0x1533
438c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I210_FIBER			0x1536
448c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I210_SERDES		0x1537
458c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I210_SGMII			0x1538
468c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I210_COPPER_FLASHLESS	0x157B
478c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I210_SERDES_FLASHLESS	0x157C
488c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I211_COPPER		0x1539
498c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I354_BACKPLANE_1GBPS	0x1F40
508c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I354_SGMII			0x1F41
518c2ecf20Sopenharmony_ci#define E1000_DEV_ID_I354_BACKPLANE_2_5GBPS	0x1F45
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#define E1000_REVISION_2 2
548c2ecf20Sopenharmony_ci#define E1000_REVISION_4 4
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#define E1000_FUNC_0     0
578c2ecf20Sopenharmony_ci#define E1000_FUNC_1     1
588c2ecf20Sopenharmony_ci#define E1000_FUNC_2     2
598c2ecf20Sopenharmony_ci#define E1000_FUNC_3     3
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0   0
628c2ecf20Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1   3
638c2ecf20Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN2   6
648c2ecf20Sopenharmony_ci#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN3   9
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cienum e1000_mac_type {
678c2ecf20Sopenharmony_ci	e1000_undefined = 0,
688c2ecf20Sopenharmony_ci	e1000_82575,
698c2ecf20Sopenharmony_ci	e1000_82576,
708c2ecf20Sopenharmony_ci	e1000_82580,
718c2ecf20Sopenharmony_ci	e1000_i350,
728c2ecf20Sopenharmony_ci	e1000_i354,
738c2ecf20Sopenharmony_ci	e1000_i210,
748c2ecf20Sopenharmony_ci	e1000_i211,
758c2ecf20Sopenharmony_ci	e1000_num_macs  /* List is 1-based, so subtract 1 for true count. */
768c2ecf20Sopenharmony_ci};
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cienum e1000_media_type {
798c2ecf20Sopenharmony_ci	e1000_media_type_unknown = 0,
808c2ecf20Sopenharmony_ci	e1000_media_type_copper = 1,
818c2ecf20Sopenharmony_ci	e1000_media_type_fiber = 2,
828c2ecf20Sopenharmony_ci	e1000_media_type_internal_serdes = 3,
838c2ecf20Sopenharmony_ci	e1000_num_media_types
848c2ecf20Sopenharmony_ci};
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_cienum e1000_nvm_type {
878c2ecf20Sopenharmony_ci	e1000_nvm_unknown = 0,
888c2ecf20Sopenharmony_ci	e1000_nvm_none,
898c2ecf20Sopenharmony_ci	e1000_nvm_eeprom_spi,
908c2ecf20Sopenharmony_ci	e1000_nvm_flash_hw,
918c2ecf20Sopenharmony_ci	e1000_nvm_invm,
928c2ecf20Sopenharmony_ci	e1000_nvm_flash_sw
938c2ecf20Sopenharmony_ci};
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_cienum e1000_nvm_override {
968c2ecf20Sopenharmony_ci	e1000_nvm_override_none = 0,
978c2ecf20Sopenharmony_ci	e1000_nvm_override_spi_small,
988c2ecf20Sopenharmony_ci	e1000_nvm_override_spi_large,
998c2ecf20Sopenharmony_ci};
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_cienum e1000_phy_type {
1028c2ecf20Sopenharmony_ci	e1000_phy_unknown = 0,
1038c2ecf20Sopenharmony_ci	e1000_phy_none,
1048c2ecf20Sopenharmony_ci	e1000_phy_m88,
1058c2ecf20Sopenharmony_ci	e1000_phy_igp,
1068c2ecf20Sopenharmony_ci	e1000_phy_igp_2,
1078c2ecf20Sopenharmony_ci	e1000_phy_gg82563,
1088c2ecf20Sopenharmony_ci	e1000_phy_igp_3,
1098c2ecf20Sopenharmony_ci	e1000_phy_ife,
1108c2ecf20Sopenharmony_ci	e1000_phy_82580,
1118c2ecf20Sopenharmony_ci	e1000_phy_i210,
1128c2ecf20Sopenharmony_ci	e1000_phy_bcm54616,
1138c2ecf20Sopenharmony_ci};
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cienum e1000_bus_type {
1168c2ecf20Sopenharmony_ci	e1000_bus_type_unknown = 0,
1178c2ecf20Sopenharmony_ci	e1000_bus_type_pci,
1188c2ecf20Sopenharmony_ci	e1000_bus_type_pcix,
1198c2ecf20Sopenharmony_ci	e1000_bus_type_pci_express,
1208c2ecf20Sopenharmony_ci	e1000_bus_type_reserved
1218c2ecf20Sopenharmony_ci};
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cienum e1000_bus_speed {
1248c2ecf20Sopenharmony_ci	e1000_bus_speed_unknown = 0,
1258c2ecf20Sopenharmony_ci	e1000_bus_speed_33,
1268c2ecf20Sopenharmony_ci	e1000_bus_speed_66,
1278c2ecf20Sopenharmony_ci	e1000_bus_speed_100,
1288c2ecf20Sopenharmony_ci	e1000_bus_speed_120,
1298c2ecf20Sopenharmony_ci	e1000_bus_speed_133,
1308c2ecf20Sopenharmony_ci	e1000_bus_speed_2500,
1318c2ecf20Sopenharmony_ci	e1000_bus_speed_5000,
1328c2ecf20Sopenharmony_ci	e1000_bus_speed_reserved
1338c2ecf20Sopenharmony_ci};
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_cienum e1000_bus_width {
1368c2ecf20Sopenharmony_ci	e1000_bus_width_unknown = 0,
1378c2ecf20Sopenharmony_ci	e1000_bus_width_pcie_x1,
1388c2ecf20Sopenharmony_ci	e1000_bus_width_pcie_x2,
1398c2ecf20Sopenharmony_ci	e1000_bus_width_pcie_x4 = 4,
1408c2ecf20Sopenharmony_ci	e1000_bus_width_pcie_x8 = 8,
1418c2ecf20Sopenharmony_ci	e1000_bus_width_32,
1428c2ecf20Sopenharmony_ci	e1000_bus_width_64,
1438c2ecf20Sopenharmony_ci	e1000_bus_width_reserved
1448c2ecf20Sopenharmony_ci};
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_cienum e1000_1000t_rx_status {
1478c2ecf20Sopenharmony_ci	e1000_1000t_rx_status_not_ok = 0,
1488c2ecf20Sopenharmony_ci	e1000_1000t_rx_status_ok,
1498c2ecf20Sopenharmony_ci	e1000_1000t_rx_status_undefined = 0xFF
1508c2ecf20Sopenharmony_ci};
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_cienum e1000_rev_polarity {
1538c2ecf20Sopenharmony_ci	e1000_rev_polarity_normal = 0,
1548c2ecf20Sopenharmony_ci	e1000_rev_polarity_reversed,
1558c2ecf20Sopenharmony_ci	e1000_rev_polarity_undefined = 0xFF
1568c2ecf20Sopenharmony_ci};
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cienum e1000_fc_mode {
1598c2ecf20Sopenharmony_ci	e1000_fc_none = 0,
1608c2ecf20Sopenharmony_ci	e1000_fc_rx_pause,
1618c2ecf20Sopenharmony_ci	e1000_fc_tx_pause,
1628c2ecf20Sopenharmony_ci	e1000_fc_full,
1638c2ecf20Sopenharmony_ci	e1000_fc_default = 0xFF
1648c2ecf20Sopenharmony_ci};
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci/* Statistics counters collected by the MAC */
1678c2ecf20Sopenharmony_cistruct e1000_hw_stats {
1688c2ecf20Sopenharmony_ci	u64 crcerrs;
1698c2ecf20Sopenharmony_ci	u64 algnerrc;
1708c2ecf20Sopenharmony_ci	u64 symerrs;
1718c2ecf20Sopenharmony_ci	u64 rxerrc;
1728c2ecf20Sopenharmony_ci	u64 mpc;
1738c2ecf20Sopenharmony_ci	u64 scc;
1748c2ecf20Sopenharmony_ci	u64 ecol;
1758c2ecf20Sopenharmony_ci	u64 mcc;
1768c2ecf20Sopenharmony_ci	u64 latecol;
1778c2ecf20Sopenharmony_ci	u64 colc;
1788c2ecf20Sopenharmony_ci	u64 dc;
1798c2ecf20Sopenharmony_ci	u64 tncrs;
1808c2ecf20Sopenharmony_ci	u64 sec;
1818c2ecf20Sopenharmony_ci	u64 cexterr;
1828c2ecf20Sopenharmony_ci	u64 rlec;
1838c2ecf20Sopenharmony_ci	u64 xonrxc;
1848c2ecf20Sopenharmony_ci	u64 xontxc;
1858c2ecf20Sopenharmony_ci	u64 xoffrxc;
1868c2ecf20Sopenharmony_ci	u64 xofftxc;
1878c2ecf20Sopenharmony_ci	u64 fcruc;
1888c2ecf20Sopenharmony_ci	u64 prc64;
1898c2ecf20Sopenharmony_ci	u64 prc127;
1908c2ecf20Sopenharmony_ci	u64 prc255;
1918c2ecf20Sopenharmony_ci	u64 prc511;
1928c2ecf20Sopenharmony_ci	u64 prc1023;
1938c2ecf20Sopenharmony_ci	u64 prc1522;
1948c2ecf20Sopenharmony_ci	u64 gprc;
1958c2ecf20Sopenharmony_ci	u64 bprc;
1968c2ecf20Sopenharmony_ci	u64 mprc;
1978c2ecf20Sopenharmony_ci	u64 gptc;
1988c2ecf20Sopenharmony_ci	u64 gorc;
1998c2ecf20Sopenharmony_ci	u64 gotc;
2008c2ecf20Sopenharmony_ci	u64 rnbc;
2018c2ecf20Sopenharmony_ci	u64 ruc;
2028c2ecf20Sopenharmony_ci	u64 rfc;
2038c2ecf20Sopenharmony_ci	u64 roc;
2048c2ecf20Sopenharmony_ci	u64 rjc;
2058c2ecf20Sopenharmony_ci	u64 mgprc;
2068c2ecf20Sopenharmony_ci	u64 mgpdc;
2078c2ecf20Sopenharmony_ci	u64 mgptc;
2088c2ecf20Sopenharmony_ci	u64 tor;
2098c2ecf20Sopenharmony_ci	u64 tot;
2108c2ecf20Sopenharmony_ci	u64 tpr;
2118c2ecf20Sopenharmony_ci	u64 tpt;
2128c2ecf20Sopenharmony_ci	u64 ptc64;
2138c2ecf20Sopenharmony_ci	u64 ptc127;
2148c2ecf20Sopenharmony_ci	u64 ptc255;
2158c2ecf20Sopenharmony_ci	u64 ptc511;
2168c2ecf20Sopenharmony_ci	u64 ptc1023;
2178c2ecf20Sopenharmony_ci	u64 ptc1522;
2188c2ecf20Sopenharmony_ci	u64 mptc;
2198c2ecf20Sopenharmony_ci	u64 bptc;
2208c2ecf20Sopenharmony_ci	u64 tsctc;
2218c2ecf20Sopenharmony_ci	u64 tsctfc;
2228c2ecf20Sopenharmony_ci	u64 iac;
2238c2ecf20Sopenharmony_ci	u64 icrxptc;
2248c2ecf20Sopenharmony_ci	u64 icrxatc;
2258c2ecf20Sopenharmony_ci	u64 ictxptc;
2268c2ecf20Sopenharmony_ci	u64 ictxatc;
2278c2ecf20Sopenharmony_ci	u64 ictxqec;
2288c2ecf20Sopenharmony_ci	u64 ictxqmtc;
2298c2ecf20Sopenharmony_ci	u64 icrxdmtc;
2308c2ecf20Sopenharmony_ci	u64 icrxoc;
2318c2ecf20Sopenharmony_ci	u64 cbtmpc;
2328c2ecf20Sopenharmony_ci	u64 htdpmc;
2338c2ecf20Sopenharmony_ci	u64 cbrdpc;
2348c2ecf20Sopenharmony_ci	u64 cbrmpc;
2358c2ecf20Sopenharmony_ci	u64 rpthc;
2368c2ecf20Sopenharmony_ci	u64 hgptc;
2378c2ecf20Sopenharmony_ci	u64 htcbdpc;
2388c2ecf20Sopenharmony_ci	u64 hgorc;
2398c2ecf20Sopenharmony_ci	u64 hgotc;
2408c2ecf20Sopenharmony_ci	u64 lenerrs;
2418c2ecf20Sopenharmony_ci	u64 scvpc;
2428c2ecf20Sopenharmony_ci	u64 hrmpc;
2438c2ecf20Sopenharmony_ci	u64 doosync;
2448c2ecf20Sopenharmony_ci	u64 o2bgptc;
2458c2ecf20Sopenharmony_ci	u64 o2bspc;
2468c2ecf20Sopenharmony_ci	u64 b2ospc;
2478c2ecf20Sopenharmony_ci	u64 b2ogprc;
2488c2ecf20Sopenharmony_ci};
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_cistruct e1000_host_mng_dhcp_cookie {
2518c2ecf20Sopenharmony_ci	u32 signature;
2528c2ecf20Sopenharmony_ci	u8  status;
2538c2ecf20Sopenharmony_ci	u8  reserved0;
2548c2ecf20Sopenharmony_ci	u16 vlan_id;
2558c2ecf20Sopenharmony_ci	u32 reserved1;
2568c2ecf20Sopenharmony_ci	u16 reserved2;
2578c2ecf20Sopenharmony_ci	u8  reserved3;
2588c2ecf20Sopenharmony_ci	u8  checksum;
2598c2ecf20Sopenharmony_ci};
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci/* Host Interface "Rev 1" */
2628c2ecf20Sopenharmony_cistruct e1000_host_command_header {
2638c2ecf20Sopenharmony_ci	u8 command_id;
2648c2ecf20Sopenharmony_ci	u8 command_length;
2658c2ecf20Sopenharmony_ci	u8 command_options;
2668c2ecf20Sopenharmony_ci	u8 checksum;
2678c2ecf20Sopenharmony_ci};
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci#define E1000_HI_MAX_DATA_LENGTH     252
2708c2ecf20Sopenharmony_cistruct e1000_host_command_info {
2718c2ecf20Sopenharmony_ci	struct e1000_host_command_header command_header;
2728c2ecf20Sopenharmony_ci	u8 command_data[E1000_HI_MAX_DATA_LENGTH];
2738c2ecf20Sopenharmony_ci};
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci/* Host Interface "Rev 2" */
2768c2ecf20Sopenharmony_cistruct e1000_host_mng_command_header {
2778c2ecf20Sopenharmony_ci	u8  command_id;
2788c2ecf20Sopenharmony_ci	u8  checksum;
2798c2ecf20Sopenharmony_ci	u16 reserved1;
2808c2ecf20Sopenharmony_ci	u16 reserved2;
2818c2ecf20Sopenharmony_ci	u16 command_length;
2828c2ecf20Sopenharmony_ci};
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ci#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8
2858c2ecf20Sopenharmony_cistruct e1000_host_mng_command_info {
2868c2ecf20Sopenharmony_ci	struct e1000_host_mng_command_header command_header;
2878c2ecf20Sopenharmony_ci	u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH];
2888c2ecf20Sopenharmony_ci};
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci#include "e1000_mac.h"
2918c2ecf20Sopenharmony_ci#include "e1000_phy.h"
2928c2ecf20Sopenharmony_ci#include "e1000_nvm.h"
2938c2ecf20Sopenharmony_ci#include "e1000_mbx.h"
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_cistruct e1000_mac_operations {
2968c2ecf20Sopenharmony_ci	s32 (*check_for_link)(struct e1000_hw *);
2978c2ecf20Sopenharmony_ci	s32 (*reset_hw)(struct e1000_hw *);
2988c2ecf20Sopenharmony_ci	s32 (*init_hw)(struct e1000_hw *);
2998c2ecf20Sopenharmony_ci	bool (*check_mng_mode)(struct e1000_hw *);
3008c2ecf20Sopenharmony_ci	s32 (*setup_physical_interface)(struct e1000_hw *);
3018c2ecf20Sopenharmony_ci	void (*rar_set)(struct e1000_hw *, u8 *, u32);
3028c2ecf20Sopenharmony_ci	s32 (*read_mac_addr)(struct e1000_hw *);
3038c2ecf20Sopenharmony_ci	s32 (*get_speed_and_duplex)(struct e1000_hw *, u16 *, u16 *);
3048c2ecf20Sopenharmony_ci	s32 (*acquire_swfw_sync)(struct e1000_hw *, u16);
3058c2ecf20Sopenharmony_ci	void (*release_swfw_sync)(struct e1000_hw *, u16);
3068c2ecf20Sopenharmony_ci#ifdef CONFIG_IGB_HWMON
3078c2ecf20Sopenharmony_ci	s32 (*get_thermal_sensor_data)(struct e1000_hw *);
3088c2ecf20Sopenharmony_ci	s32 (*init_thermal_sensor_thresh)(struct e1000_hw *);
3098c2ecf20Sopenharmony_ci#endif
3108c2ecf20Sopenharmony_ci	void (*write_vfta)(struct e1000_hw *, u32, u32);
3118c2ecf20Sopenharmony_ci};
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_cistruct e1000_phy_operations {
3148c2ecf20Sopenharmony_ci	s32 (*acquire)(struct e1000_hw *);
3158c2ecf20Sopenharmony_ci	s32 (*check_polarity)(struct e1000_hw *);
3168c2ecf20Sopenharmony_ci	s32 (*check_reset_block)(struct e1000_hw *);
3178c2ecf20Sopenharmony_ci	s32 (*force_speed_duplex)(struct e1000_hw *);
3188c2ecf20Sopenharmony_ci	s32 (*get_cfg_done)(struct e1000_hw *hw);
3198c2ecf20Sopenharmony_ci	s32 (*get_cable_length)(struct e1000_hw *);
3208c2ecf20Sopenharmony_ci	s32 (*get_phy_info)(struct e1000_hw *);
3218c2ecf20Sopenharmony_ci	s32 (*read_reg)(struct e1000_hw *, u32, u16 *);
3228c2ecf20Sopenharmony_ci	void (*release)(struct e1000_hw *);
3238c2ecf20Sopenharmony_ci	s32 (*reset)(struct e1000_hw *);
3248c2ecf20Sopenharmony_ci	s32 (*set_d0_lplu_state)(struct e1000_hw *, bool);
3258c2ecf20Sopenharmony_ci	s32 (*set_d3_lplu_state)(struct e1000_hw *, bool);
3268c2ecf20Sopenharmony_ci	s32 (*write_reg)(struct e1000_hw *, u32, u16);
3278c2ecf20Sopenharmony_ci	s32 (*read_i2c_byte)(struct e1000_hw *, u8, u8, u8 *);
3288c2ecf20Sopenharmony_ci	s32 (*write_i2c_byte)(struct e1000_hw *, u8, u8, u8);
3298c2ecf20Sopenharmony_ci};
3308c2ecf20Sopenharmony_ci
3318c2ecf20Sopenharmony_cistruct e1000_nvm_operations {
3328c2ecf20Sopenharmony_ci	s32 (*acquire)(struct e1000_hw *);
3338c2ecf20Sopenharmony_ci	s32 (*read)(struct e1000_hw *, u16, u16, u16 *);
3348c2ecf20Sopenharmony_ci	void (*release)(struct e1000_hw *);
3358c2ecf20Sopenharmony_ci	s32 (*write)(struct e1000_hw *, u16, u16, u16 *);
3368c2ecf20Sopenharmony_ci	s32 (*update)(struct e1000_hw *);
3378c2ecf20Sopenharmony_ci	s32 (*validate)(struct e1000_hw *);
3388c2ecf20Sopenharmony_ci	s32 (*valid_led_default)(struct e1000_hw *, u16 *);
3398c2ecf20Sopenharmony_ci};
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ci#define E1000_MAX_SENSORS		3
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_cistruct e1000_thermal_diode_data {
3448c2ecf20Sopenharmony_ci	u8 location;
3458c2ecf20Sopenharmony_ci	u8 temp;
3468c2ecf20Sopenharmony_ci	u8 caution_thresh;
3478c2ecf20Sopenharmony_ci	u8 max_op_thresh;
3488c2ecf20Sopenharmony_ci};
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_cistruct e1000_thermal_sensor_data {
3518c2ecf20Sopenharmony_ci	struct e1000_thermal_diode_data sensor[E1000_MAX_SENSORS];
3528c2ecf20Sopenharmony_ci};
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_cistruct e1000_info {
3558c2ecf20Sopenharmony_ci	s32 (*get_invariants)(struct e1000_hw *);
3568c2ecf20Sopenharmony_ci	struct e1000_mac_operations *mac_ops;
3578c2ecf20Sopenharmony_ci	const struct e1000_phy_operations *phy_ops;
3588c2ecf20Sopenharmony_ci	struct e1000_nvm_operations *nvm_ops;
3598c2ecf20Sopenharmony_ci};
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ciextern const struct e1000_info e1000_82575_info;
3628c2ecf20Sopenharmony_ci
3638c2ecf20Sopenharmony_cistruct e1000_mac_info {
3648c2ecf20Sopenharmony_ci	struct e1000_mac_operations ops;
3658c2ecf20Sopenharmony_ci
3668c2ecf20Sopenharmony_ci	u8 addr[6];
3678c2ecf20Sopenharmony_ci	u8 perm_addr[6];
3688c2ecf20Sopenharmony_ci
3698c2ecf20Sopenharmony_ci	enum e1000_mac_type type;
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci	u32 ledctl_default;
3728c2ecf20Sopenharmony_ci	u32 ledctl_mode1;
3738c2ecf20Sopenharmony_ci	u32 ledctl_mode2;
3748c2ecf20Sopenharmony_ci	u32 mc_filter_type;
3758c2ecf20Sopenharmony_ci	u32 txcw;
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci	u16 mta_reg_count;
3788c2ecf20Sopenharmony_ci	u16 uta_reg_count;
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	/* Maximum size of the MTA register table in all supported adapters */
3818c2ecf20Sopenharmony_ci	#define MAX_MTA_REG 128
3828c2ecf20Sopenharmony_ci	u32 mta_shadow[MAX_MTA_REG];
3838c2ecf20Sopenharmony_ci	u16 rar_entry_count;
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_ci	u8  forced_speed_duplex;
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci	bool adaptive_ifs;
3888c2ecf20Sopenharmony_ci	bool arc_subsystem_valid;
3898c2ecf20Sopenharmony_ci	bool asf_firmware_present;
3908c2ecf20Sopenharmony_ci	bool autoneg;
3918c2ecf20Sopenharmony_ci	bool autoneg_failed;
3928c2ecf20Sopenharmony_ci	bool disable_hw_init_bits;
3938c2ecf20Sopenharmony_ci	bool get_link_status;
3948c2ecf20Sopenharmony_ci	bool ifs_params_forced;
3958c2ecf20Sopenharmony_ci	bool in_ifs_mode;
3968c2ecf20Sopenharmony_ci	bool report_tx_early;
3978c2ecf20Sopenharmony_ci	bool serdes_has_link;
3988c2ecf20Sopenharmony_ci	bool tx_pkt_filtering;
3998c2ecf20Sopenharmony_ci	struct e1000_thermal_sensor_data thermal_sensor_data;
4008c2ecf20Sopenharmony_ci};
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_cistruct e1000_phy_info {
4038c2ecf20Sopenharmony_ci	struct e1000_phy_operations ops;
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci	enum e1000_phy_type type;
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_ci	enum e1000_1000t_rx_status local_rx;
4088c2ecf20Sopenharmony_ci	enum e1000_1000t_rx_status remote_rx;
4098c2ecf20Sopenharmony_ci	enum e1000_ms_type ms_type;
4108c2ecf20Sopenharmony_ci	enum e1000_ms_type original_ms_type;
4118c2ecf20Sopenharmony_ci	enum e1000_rev_polarity cable_polarity;
4128c2ecf20Sopenharmony_ci	enum e1000_smart_speed smart_speed;
4138c2ecf20Sopenharmony_ci
4148c2ecf20Sopenharmony_ci	u32 addr;
4158c2ecf20Sopenharmony_ci	u32 id;
4168c2ecf20Sopenharmony_ci	u32 reset_delay_us; /* in usec */
4178c2ecf20Sopenharmony_ci	u32 revision;
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci	enum e1000_media_type media_type;
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	u16 autoneg_advertised;
4228c2ecf20Sopenharmony_ci	u16 autoneg_mask;
4238c2ecf20Sopenharmony_ci	u16 cable_length;
4248c2ecf20Sopenharmony_ci	u16 max_cable_length;
4258c2ecf20Sopenharmony_ci	u16 min_cable_length;
4268c2ecf20Sopenharmony_ci	u16 pair_length[4];
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci	u8 mdix;
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci	bool disable_polarity_correction;
4318c2ecf20Sopenharmony_ci	bool is_mdix;
4328c2ecf20Sopenharmony_ci	bool polarity_correction;
4338c2ecf20Sopenharmony_ci	bool reset_disable;
4348c2ecf20Sopenharmony_ci	bool speed_downgraded;
4358c2ecf20Sopenharmony_ci	bool autoneg_wait_to_complete;
4368c2ecf20Sopenharmony_ci};
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_cistruct e1000_nvm_info {
4398c2ecf20Sopenharmony_ci	struct e1000_nvm_operations ops;
4408c2ecf20Sopenharmony_ci	enum e1000_nvm_type type;
4418c2ecf20Sopenharmony_ci	enum e1000_nvm_override override;
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ci	u32 flash_bank_size;
4448c2ecf20Sopenharmony_ci	u32 flash_base_addr;
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci	u16 word_size;
4478c2ecf20Sopenharmony_ci	u16 delay_usec;
4488c2ecf20Sopenharmony_ci	u16 address_bits;
4498c2ecf20Sopenharmony_ci	u16 opcode_bits;
4508c2ecf20Sopenharmony_ci	u16 page_size;
4518c2ecf20Sopenharmony_ci};
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_cistruct e1000_bus_info {
4548c2ecf20Sopenharmony_ci	enum e1000_bus_type type;
4558c2ecf20Sopenharmony_ci	enum e1000_bus_speed speed;
4568c2ecf20Sopenharmony_ci	enum e1000_bus_width width;
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	u32 snoop;
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci	u16 func;
4618c2ecf20Sopenharmony_ci	u16 pci_cmd_word;
4628c2ecf20Sopenharmony_ci};
4638c2ecf20Sopenharmony_ci
4648c2ecf20Sopenharmony_cistruct e1000_fc_info {
4658c2ecf20Sopenharmony_ci	u32 high_water;     /* Flow control high-water mark */
4668c2ecf20Sopenharmony_ci	u32 low_water;      /* Flow control low-water mark */
4678c2ecf20Sopenharmony_ci	u16 pause_time;     /* Flow control pause timer */
4688c2ecf20Sopenharmony_ci	bool send_xon;      /* Flow control send XON */
4698c2ecf20Sopenharmony_ci	bool strict_ieee;   /* Strict IEEE mode */
4708c2ecf20Sopenharmony_ci	enum e1000_fc_mode current_mode; /* Type of flow control */
4718c2ecf20Sopenharmony_ci	enum e1000_fc_mode requested_mode;
4728c2ecf20Sopenharmony_ci};
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_cistruct e1000_mbx_operations {
4758c2ecf20Sopenharmony_ci	s32 (*init_params)(struct e1000_hw *hw);
4768c2ecf20Sopenharmony_ci	s32 (*read)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id,
4778c2ecf20Sopenharmony_ci		    bool unlock);
4788c2ecf20Sopenharmony_ci	s32 (*write)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
4798c2ecf20Sopenharmony_ci	s32 (*read_posted)(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
4808c2ecf20Sopenharmony_ci	s32 (*write_posted)(struct e1000_hw *hw, u32 *msg, u16 size,
4818c2ecf20Sopenharmony_ci			    u16 mbx_id);
4828c2ecf20Sopenharmony_ci	s32 (*check_for_msg)(struct e1000_hw *hw, u16 mbx_id);
4838c2ecf20Sopenharmony_ci	s32 (*check_for_ack)(struct e1000_hw *hw, u16 mbx_id);
4848c2ecf20Sopenharmony_ci	s32 (*check_for_rst)(struct e1000_hw *hw, u16 mbx_id);
4858c2ecf20Sopenharmony_ci	s32 (*unlock)(struct e1000_hw *hw, u16 mbx_id);
4868c2ecf20Sopenharmony_ci};
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_cistruct e1000_mbx_stats {
4898c2ecf20Sopenharmony_ci	u32 msgs_tx;
4908c2ecf20Sopenharmony_ci	u32 msgs_rx;
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci	u32 acks;
4938c2ecf20Sopenharmony_ci	u32 reqs;
4948c2ecf20Sopenharmony_ci	u32 rsts;
4958c2ecf20Sopenharmony_ci};
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_cistruct e1000_mbx_info {
4988c2ecf20Sopenharmony_ci	struct e1000_mbx_operations ops;
4998c2ecf20Sopenharmony_ci	struct e1000_mbx_stats stats;
5008c2ecf20Sopenharmony_ci	u32 timeout;
5018c2ecf20Sopenharmony_ci	u32 usec_delay;
5028c2ecf20Sopenharmony_ci	u16 size;
5038c2ecf20Sopenharmony_ci};
5048c2ecf20Sopenharmony_ci
5058c2ecf20Sopenharmony_cistruct e1000_dev_spec_82575 {
5068c2ecf20Sopenharmony_ci	bool sgmii_active;
5078c2ecf20Sopenharmony_ci	bool global_device_reset;
5088c2ecf20Sopenharmony_ci	bool eee_disable;
5098c2ecf20Sopenharmony_ci	bool clear_semaphore_once;
5108c2ecf20Sopenharmony_ci	struct e1000_sfp_flags eth_flags;
5118c2ecf20Sopenharmony_ci	bool module_plugged;
5128c2ecf20Sopenharmony_ci	u8 media_port;
5138c2ecf20Sopenharmony_ci	bool media_changed;
5148c2ecf20Sopenharmony_ci	bool mas_capable;
5158c2ecf20Sopenharmony_ci};
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_cistruct e1000_hw {
5188c2ecf20Sopenharmony_ci	void *back;
5198c2ecf20Sopenharmony_ci
5208c2ecf20Sopenharmony_ci	u8 __iomem *hw_addr;
5218c2ecf20Sopenharmony_ci	u8 __iomem *flash_address;
5228c2ecf20Sopenharmony_ci	unsigned long io_base;
5238c2ecf20Sopenharmony_ci
5248c2ecf20Sopenharmony_ci	struct e1000_mac_info  mac;
5258c2ecf20Sopenharmony_ci	struct e1000_fc_info   fc;
5268c2ecf20Sopenharmony_ci	struct e1000_phy_info  phy;
5278c2ecf20Sopenharmony_ci	struct e1000_nvm_info  nvm;
5288c2ecf20Sopenharmony_ci	struct e1000_bus_info  bus;
5298c2ecf20Sopenharmony_ci	struct e1000_mbx_info mbx;
5308c2ecf20Sopenharmony_ci	struct e1000_host_mng_dhcp_cookie mng_cookie;
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ci	union {
5338c2ecf20Sopenharmony_ci		struct e1000_dev_spec_82575	_82575;
5348c2ecf20Sopenharmony_ci	} dev_spec;
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci	u16 device_id;
5378c2ecf20Sopenharmony_ci	u16 subsystem_vendor_id;
5388c2ecf20Sopenharmony_ci	u16 subsystem_device_id;
5398c2ecf20Sopenharmony_ci	u16 vendor_id;
5408c2ecf20Sopenharmony_ci
5418c2ecf20Sopenharmony_ci	u8  revision_id;
5428c2ecf20Sopenharmony_ci};
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_cistruct net_device *igb_get_hw_dev(struct e1000_hw *hw);
5458c2ecf20Sopenharmony_ci#define hw_dbg(format, arg...) \
5468c2ecf20Sopenharmony_ci	netdev_dbg(igb_get_hw_dev(hw), format, ##arg)
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci/* These functions must be implemented by drivers */
5498c2ecf20Sopenharmony_cis32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
5508c2ecf20Sopenharmony_cis32 igb_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_civoid igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
5538c2ecf20Sopenharmony_civoid igb_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
5548c2ecf20Sopenharmony_ci#endif /* _E1000_HW_H_ */
555