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