18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* Copyright (c) 2018 Intel Corporation */ 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#ifndef _IGC_HW_H_ 58c2ecf20Sopenharmony_ci#define _IGC_HW_H_ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/types.h> 88c2ecf20Sopenharmony_ci#include <linux/if_ether.h> 98c2ecf20Sopenharmony_ci#include <linux/netdevice.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "igc_regs.h" 128c2ecf20Sopenharmony_ci#include "igc_defines.h" 138c2ecf20Sopenharmony_ci#include "igc_mac.h" 148c2ecf20Sopenharmony_ci#include "igc_phy.h" 158c2ecf20Sopenharmony_ci#include "igc_nvm.h" 168c2ecf20Sopenharmony_ci#include "igc_i225.h" 178c2ecf20Sopenharmony_ci#include "igc_base.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_LM 0x15F2 208c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_V 0x15F3 218c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_I 0x15F8 228c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I220_V 0x15F7 238c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_K 0x3100 248c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_K2 0x3101 258c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I226_K 0x3102 268c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_LMVP 0x5502 278c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_IT 0x0D9F 288c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I226_LM 0x125B 298c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I226_V 0x125C 308c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I226_IT 0x125D 318c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I221_V 0x125E 328c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I226_BLANK_NVM 0x125F 338c2ecf20Sopenharmony_ci#define IGC_DEV_ID_I225_BLANK_NVM 0x15FD 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* Function pointers for the MAC. */ 368c2ecf20Sopenharmony_cistruct igc_mac_operations { 378c2ecf20Sopenharmony_ci s32 (*check_for_link)(struct igc_hw *hw); 388c2ecf20Sopenharmony_ci s32 (*reset_hw)(struct igc_hw *hw); 398c2ecf20Sopenharmony_ci s32 (*init_hw)(struct igc_hw *hw); 408c2ecf20Sopenharmony_ci s32 (*setup_physical_interface)(struct igc_hw *hw); 418c2ecf20Sopenharmony_ci void (*rar_set)(struct igc_hw *hw, u8 *address, u32 index); 428c2ecf20Sopenharmony_ci s32 (*read_mac_addr)(struct igc_hw *hw); 438c2ecf20Sopenharmony_ci s32 (*get_speed_and_duplex)(struct igc_hw *hw, u16 *speed, 448c2ecf20Sopenharmony_ci u16 *duplex); 458c2ecf20Sopenharmony_ci s32 (*acquire_swfw_sync)(struct igc_hw *hw, u16 mask); 468c2ecf20Sopenharmony_ci void (*release_swfw_sync)(struct igc_hw *hw, u16 mask); 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cienum igc_mac_type { 508c2ecf20Sopenharmony_ci igc_undefined = 0, 518c2ecf20Sopenharmony_ci igc_i225, 528c2ecf20Sopenharmony_ci igc_num_macs /* List is 1-based, so subtract 1 for true count. */ 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cienum igc_phy_type { 568c2ecf20Sopenharmony_ci igc_phy_unknown = 0, 578c2ecf20Sopenharmony_ci igc_phy_none, 588c2ecf20Sopenharmony_ci igc_phy_i225, 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cienum igc_media_type { 628c2ecf20Sopenharmony_ci igc_media_type_unknown = 0, 638c2ecf20Sopenharmony_ci igc_media_type_copper = 1, 648c2ecf20Sopenharmony_ci igc_num_media_types 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cienum igc_nvm_type { 688c2ecf20Sopenharmony_ci igc_nvm_unknown = 0, 698c2ecf20Sopenharmony_ci igc_nvm_eeprom_spi, 708c2ecf20Sopenharmony_ci igc_nvm_flash_hw, 718c2ecf20Sopenharmony_ci igc_nvm_invm, 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistruct igc_info { 758c2ecf20Sopenharmony_ci s32 (*get_invariants)(struct igc_hw *hw); 768c2ecf20Sopenharmony_ci struct igc_mac_operations *mac_ops; 778c2ecf20Sopenharmony_ci const struct igc_phy_operations *phy_ops; 788c2ecf20Sopenharmony_ci struct igc_nvm_operations *nvm_ops; 798c2ecf20Sopenharmony_ci}; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ciextern const struct igc_info igc_base_info; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistruct igc_mac_info { 848c2ecf20Sopenharmony_ci struct igc_mac_operations ops; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci u8 addr[ETH_ALEN]; 878c2ecf20Sopenharmony_ci u8 perm_addr[ETH_ALEN]; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci enum igc_mac_type type; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci u32 mc_filter_type; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci u16 mta_reg_count; 948c2ecf20Sopenharmony_ci u16 uta_reg_count; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci u32 mta_shadow[MAX_MTA_REG]; 978c2ecf20Sopenharmony_ci u16 rar_entry_count; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci u8 forced_speed_duplex; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci bool asf_firmware_present; 1028c2ecf20Sopenharmony_ci bool arc_subsystem_valid; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci bool autoneg; 1058c2ecf20Sopenharmony_ci bool autoneg_failed; 1068c2ecf20Sopenharmony_ci bool get_link_status; 1078c2ecf20Sopenharmony_ci}; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistruct igc_nvm_operations { 1108c2ecf20Sopenharmony_ci s32 (*acquire)(struct igc_hw *hw); 1118c2ecf20Sopenharmony_ci s32 (*read)(struct igc_hw *hw, u16 offset, u16 i, u16 *data); 1128c2ecf20Sopenharmony_ci void (*release)(struct igc_hw *hw); 1138c2ecf20Sopenharmony_ci s32 (*write)(struct igc_hw *hw, u16 offset, u16 i, u16 *data); 1148c2ecf20Sopenharmony_ci s32 (*update)(struct igc_hw *hw); 1158c2ecf20Sopenharmony_ci s32 (*validate)(struct igc_hw *hw); 1168c2ecf20Sopenharmony_ci s32 (*valid_led_default)(struct igc_hw *hw, u16 *data); 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistruct igc_phy_operations { 1208c2ecf20Sopenharmony_ci s32 (*acquire)(struct igc_hw *hw); 1218c2ecf20Sopenharmony_ci s32 (*check_reset_block)(struct igc_hw *hw); 1228c2ecf20Sopenharmony_ci s32 (*force_speed_duplex)(struct igc_hw *hw); 1238c2ecf20Sopenharmony_ci s32 (*get_phy_info)(struct igc_hw *hw); 1248c2ecf20Sopenharmony_ci s32 (*read_reg)(struct igc_hw *hw, u32 address, u16 *data); 1258c2ecf20Sopenharmony_ci void (*release)(struct igc_hw *hw); 1268c2ecf20Sopenharmony_ci s32 (*reset)(struct igc_hw *hw); 1278c2ecf20Sopenharmony_ci s32 (*write_reg)(struct igc_hw *hw, u32 address, u16 data); 1288c2ecf20Sopenharmony_ci}; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_cistruct igc_nvm_info { 1318c2ecf20Sopenharmony_ci struct igc_nvm_operations ops; 1328c2ecf20Sopenharmony_ci enum igc_nvm_type type; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci u16 word_size; 1358c2ecf20Sopenharmony_ci u16 delay_usec; 1368c2ecf20Sopenharmony_ci u16 address_bits; 1378c2ecf20Sopenharmony_ci u16 opcode_bits; 1388c2ecf20Sopenharmony_ci u16 page_size; 1398c2ecf20Sopenharmony_ci}; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cistruct igc_phy_info { 1428c2ecf20Sopenharmony_ci struct igc_phy_operations ops; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci enum igc_phy_type type; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci u32 addr; 1478c2ecf20Sopenharmony_ci u32 id; 1488c2ecf20Sopenharmony_ci u32 reset_delay_us; /* in usec */ 1498c2ecf20Sopenharmony_ci u32 revision; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci enum igc_media_type media_type; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci u16 autoneg_advertised; 1548c2ecf20Sopenharmony_ci u16 autoneg_mask; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci u8 mdix; 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci bool is_mdix; 1598c2ecf20Sopenharmony_ci bool speed_downgraded; 1608c2ecf20Sopenharmony_ci bool autoneg_wait_to_complete; 1618c2ecf20Sopenharmony_ci}; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_cistruct igc_bus_info { 1648c2ecf20Sopenharmony_ci u16 func; 1658c2ecf20Sopenharmony_ci u16 pci_cmd_word; 1668c2ecf20Sopenharmony_ci}; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_cienum igc_fc_mode { 1698c2ecf20Sopenharmony_ci igc_fc_none = 0, 1708c2ecf20Sopenharmony_ci igc_fc_rx_pause, 1718c2ecf20Sopenharmony_ci igc_fc_tx_pause, 1728c2ecf20Sopenharmony_ci igc_fc_full, 1738c2ecf20Sopenharmony_ci igc_fc_default = 0xFF 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistruct igc_fc_info { 1778c2ecf20Sopenharmony_ci u32 high_water; /* Flow control high-water mark */ 1788c2ecf20Sopenharmony_ci u32 low_water; /* Flow control low-water mark */ 1798c2ecf20Sopenharmony_ci u16 pause_time; /* Flow control pause timer */ 1808c2ecf20Sopenharmony_ci bool send_xon; /* Flow control send XON */ 1818c2ecf20Sopenharmony_ci bool strict_ieee; /* Strict IEEE mode */ 1828c2ecf20Sopenharmony_ci enum igc_fc_mode current_mode; /* Type of flow control */ 1838c2ecf20Sopenharmony_ci enum igc_fc_mode requested_mode; 1848c2ecf20Sopenharmony_ci}; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_cistruct igc_dev_spec_base { 1878c2ecf20Sopenharmony_ci bool clear_semaphore_once; 1888c2ecf20Sopenharmony_ci bool eee_enable; 1898c2ecf20Sopenharmony_ci}; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_cistruct igc_hw { 1928c2ecf20Sopenharmony_ci void *back; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci u8 __iomem *hw_addr; 1958c2ecf20Sopenharmony_ci unsigned long io_base; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci struct igc_mac_info mac; 1988c2ecf20Sopenharmony_ci struct igc_fc_info fc; 1998c2ecf20Sopenharmony_ci struct igc_nvm_info nvm; 2008c2ecf20Sopenharmony_ci struct igc_phy_info phy; 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci struct igc_bus_info bus; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci union { 2058c2ecf20Sopenharmony_ci struct igc_dev_spec_base _base; 2068c2ecf20Sopenharmony_ci } dev_spec; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci u16 device_id; 2098c2ecf20Sopenharmony_ci u16 subsystem_vendor_id; 2108c2ecf20Sopenharmony_ci u16 subsystem_device_id; 2118c2ecf20Sopenharmony_ci u16 vendor_id; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci u8 revision_id; 2148c2ecf20Sopenharmony_ci}; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci/* Statistics counters collected by the MAC */ 2178c2ecf20Sopenharmony_cistruct igc_hw_stats { 2188c2ecf20Sopenharmony_ci u64 crcerrs; 2198c2ecf20Sopenharmony_ci u64 algnerrc; 2208c2ecf20Sopenharmony_ci u64 symerrs; 2218c2ecf20Sopenharmony_ci u64 rxerrc; 2228c2ecf20Sopenharmony_ci u64 mpc; 2238c2ecf20Sopenharmony_ci u64 scc; 2248c2ecf20Sopenharmony_ci u64 ecol; 2258c2ecf20Sopenharmony_ci u64 mcc; 2268c2ecf20Sopenharmony_ci u64 latecol; 2278c2ecf20Sopenharmony_ci u64 colc; 2288c2ecf20Sopenharmony_ci u64 dc; 2298c2ecf20Sopenharmony_ci u64 tncrs; 2308c2ecf20Sopenharmony_ci u64 sec; 2318c2ecf20Sopenharmony_ci u64 cexterr; 2328c2ecf20Sopenharmony_ci u64 rlec; 2338c2ecf20Sopenharmony_ci u64 xonrxc; 2348c2ecf20Sopenharmony_ci u64 xontxc; 2358c2ecf20Sopenharmony_ci u64 xoffrxc; 2368c2ecf20Sopenharmony_ci u64 xofftxc; 2378c2ecf20Sopenharmony_ci u64 fcruc; 2388c2ecf20Sopenharmony_ci u64 prc64; 2398c2ecf20Sopenharmony_ci u64 prc127; 2408c2ecf20Sopenharmony_ci u64 prc255; 2418c2ecf20Sopenharmony_ci u64 prc511; 2428c2ecf20Sopenharmony_ci u64 prc1023; 2438c2ecf20Sopenharmony_ci u64 prc1522; 2448c2ecf20Sopenharmony_ci u64 tlpic; 2458c2ecf20Sopenharmony_ci u64 rlpic; 2468c2ecf20Sopenharmony_ci u64 gprc; 2478c2ecf20Sopenharmony_ci u64 bprc; 2488c2ecf20Sopenharmony_ci u64 mprc; 2498c2ecf20Sopenharmony_ci u64 gptc; 2508c2ecf20Sopenharmony_ci u64 gorc; 2518c2ecf20Sopenharmony_ci u64 gotc; 2528c2ecf20Sopenharmony_ci u64 rnbc; 2538c2ecf20Sopenharmony_ci u64 ruc; 2548c2ecf20Sopenharmony_ci u64 rfc; 2558c2ecf20Sopenharmony_ci u64 roc; 2568c2ecf20Sopenharmony_ci u64 rjc; 2578c2ecf20Sopenharmony_ci u64 mgprc; 2588c2ecf20Sopenharmony_ci u64 mgpdc; 2598c2ecf20Sopenharmony_ci u64 mgptc; 2608c2ecf20Sopenharmony_ci u64 tor; 2618c2ecf20Sopenharmony_ci u64 tot; 2628c2ecf20Sopenharmony_ci u64 tpr; 2638c2ecf20Sopenharmony_ci u64 tpt; 2648c2ecf20Sopenharmony_ci u64 ptc64; 2658c2ecf20Sopenharmony_ci u64 ptc127; 2668c2ecf20Sopenharmony_ci u64 ptc255; 2678c2ecf20Sopenharmony_ci u64 ptc511; 2688c2ecf20Sopenharmony_ci u64 ptc1023; 2698c2ecf20Sopenharmony_ci u64 ptc1522; 2708c2ecf20Sopenharmony_ci u64 mptc; 2718c2ecf20Sopenharmony_ci u64 bptc; 2728c2ecf20Sopenharmony_ci u64 tsctc; 2738c2ecf20Sopenharmony_ci u64 tsctfc; 2748c2ecf20Sopenharmony_ci u64 iac; 2758c2ecf20Sopenharmony_ci u64 htdpmc; 2768c2ecf20Sopenharmony_ci u64 rpthc; 2778c2ecf20Sopenharmony_ci u64 hgptc; 2788c2ecf20Sopenharmony_ci u64 hgorc; 2798c2ecf20Sopenharmony_ci u64 hgotc; 2808c2ecf20Sopenharmony_ci u64 lenerrs; 2818c2ecf20Sopenharmony_ci u64 scvpc; 2828c2ecf20Sopenharmony_ci u64 hrmpc; 2838c2ecf20Sopenharmony_ci u64 doosync; 2848c2ecf20Sopenharmony_ci u64 o2bgptc; 2858c2ecf20Sopenharmony_ci u64 o2bspc; 2868c2ecf20Sopenharmony_ci u64 b2ospc; 2878c2ecf20Sopenharmony_ci u64 b2ogprc; 2888c2ecf20Sopenharmony_ci}; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_cistruct net_device *igc_get_hw_dev(struct igc_hw *hw); 2918c2ecf20Sopenharmony_ci#define hw_dbg(format, arg...) \ 2928c2ecf20Sopenharmony_ci netdev_dbg(igc_get_hw_dev(hw), format, ##arg) 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_cis32 igc_read_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 2958c2ecf20Sopenharmony_cis32 igc_write_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 2968c2ecf20Sopenharmony_civoid igc_read_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 2978c2ecf20Sopenharmony_civoid igc_write_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci#endif /* _IGC_HW_H_ */ 300