1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright (c) 2018 Intel Corporation */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _IGC_HW_H_ 5*4882a593Smuzhiyun #define _IGC_HW_H_ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/types.h> 8*4882a593Smuzhiyun #include <linux/if_ether.h> 9*4882a593Smuzhiyun #include <linux/netdevice.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include "igc_regs.h" 12*4882a593Smuzhiyun #include "igc_defines.h" 13*4882a593Smuzhiyun #include "igc_mac.h" 14*4882a593Smuzhiyun #include "igc_phy.h" 15*4882a593Smuzhiyun #include "igc_nvm.h" 16*4882a593Smuzhiyun #include "igc_i225.h" 17*4882a593Smuzhiyun #include "igc_base.h" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define IGC_DEV_ID_I225_LM 0x15F2 20*4882a593Smuzhiyun #define IGC_DEV_ID_I225_V 0x15F3 21*4882a593Smuzhiyun #define IGC_DEV_ID_I225_I 0x15F8 22*4882a593Smuzhiyun #define IGC_DEV_ID_I220_V 0x15F7 23*4882a593Smuzhiyun #define IGC_DEV_ID_I225_K 0x3100 24*4882a593Smuzhiyun #define IGC_DEV_ID_I225_K2 0x3101 25*4882a593Smuzhiyun #define IGC_DEV_ID_I226_K 0x3102 26*4882a593Smuzhiyun #define IGC_DEV_ID_I225_LMVP 0x5502 27*4882a593Smuzhiyun #define IGC_DEV_ID_I225_IT 0x0D9F 28*4882a593Smuzhiyun #define IGC_DEV_ID_I226_LM 0x125B 29*4882a593Smuzhiyun #define IGC_DEV_ID_I226_V 0x125C 30*4882a593Smuzhiyun #define IGC_DEV_ID_I226_IT 0x125D 31*4882a593Smuzhiyun #define IGC_DEV_ID_I221_V 0x125E 32*4882a593Smuzhiyun #define IGC_DEV_ID_I226_BLANK_NVM 0x125F 33*4882a593Smuzhiyun #define IGC_DEV_ID_I225_BLANK_NVM 0x15FD 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* Function pointers for the MAC. */ 36*4882a593Smuzhiyun struct igc_mac_operations { 37*4882a593Smuzhiyun s32 (*check_for_link)(struct igc_hw *hw); 38*4882a593Smuzhiyun s32 (*reset_hw)(struct igc_hw *hw); 39*4882a593Smuzhiyun s32 (*init_hw)(struct igc_hw *hw); 40*4882a593Smuzhiyun s32 (*setup_physical_interface)(struct igc_hw *hw); 41*4882a593Smuzhiyun void (*rar_set)(struct igc_hw *hw, u8 *address, u32 index); 42*4882a593Smuzhiyun s32 (*read_mac_addr)(struct igc_hw *hw); 43*4882a593Smuzhiyun s32 (*get_speed_and_duplex)(struct igc_hw *hw, u16 *speed, 44*4882a593Smuzhiyun u16 *duplex); 45*4882a593Smuzhiyun s32 (*acquire_swfw_sync)(struct igc_hw *hw, u16 mask); 46*4882a593Smuzhiyun void (*release_swfw_sync)(struct igc_hw *hw, u16 mask); 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun enum igc_mac_type { 50*4882a593Smuzhiyun igc_undefined = 0, 51*4882a593Smuzhiyun igc_i225, 52*4882a593Smuzhiyun igc_num_macs /* List is 1-based, so subtract 1 for true count. */ 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun enum igc_phy_type { 56*4882a593Smuzhiyun igc_phy_unknown = 0, 57*4882a593Smuzhiyun igc_phy_none, 58*4882a593Smuzhiyun igc_phy_i225, 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun enum igc_media_type { 62*4882a593Smuzhiyun igc_media_type_unknown = 0, 63*4882a593Smuzhiyun igc_media_type_copper = 1, 64*4882a593Smuzhiyun igc_num_media_types 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum igc_nvm_type { 68*4882a593Smuzhiyun igc_nvm_unknown = 0, 69*4882a593Smuzhiyun igc_nvm_eeprom_spi, 70*4882a593Smuzhiyun igc_nvm_flash_hw, 71*4882a593Smuzhiyun igc_nvm_invm, 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct igc_info { 75*4882a593Smuzhiyun s32 (*get_invariants)(struct igc_hw *hw); 76*4882a593Smuzhiyun struct igc_mac_operations *mac_ops; 77*4882a593Smuzhiyun const struct igc_phy_operations *phy_ops; 78*4882a593Smuzhiyun struct igc_nvm_operations *nvm_ops; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun extern const struct igc_info igc_base_info; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct igc_mac_info { 84*4882a593Smuzhiyun struct igc_mac_operations ops; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun u8 addr[ETH_ALEN]; 87*4882a593Smuzhiyun u8 perm_addr[ETH_ALEN]; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun enum igc_mac_type type; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun u32 mc_filter_type; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun u16 mta_reg_count; 94*4882a593Smuzhiyun u16 uta_reg_count; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun u32 mta_shadow[MAX_MTA_REG]; 97*4882a593Smuzhiyun u16 rar_entry_count; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun u8 forced_speed_duplex; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun bool asf_firmware_present; 102*4882a593Smuzhiyun bool arc_subsystem_valid; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun bool autoneg; 105*4882a593Smuzhiyun bool autoneg_failed; 106*4882a593Smuzhiyun bool get_link_status; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct igc_nvm_operations { 110*4882a593Smuzhiyun s32 (*acquire)(struct igc_hw *hw); 111*4882a593Smuzhiyun s32 (*read)(struct igc_hw *hw, u16 offset, u16 i, u16 *data); 112*4882a593Smuzhiyun void (*release)(struct igc_hw *hw); 113*4882a593Smuzhiyun s32 (*write)(struct igc_hw *hw, u16 offset, u16 i, u16 *data); 114*4882a593Smuzhiyun s32 (*update)(struct igc_hw *hw); 115*4882a593Smuzhiyun s32 (*validate)(struct igc_hw *hw); 116*4882a593Smuzhiyun s32 (*valid_led_default)(struct igc_hw *hw, u16 *data); 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun struct igc_phy_operations { 120*4882a593Smuzhiyun s32 (*acquire)(struct igc_hw *hw); 121*4882a593Smuzhiyun s32 (*check_reset_block)(struct igc_hw *hw); 122*4882a593Smuzhiyun s32 (*force_speed_duplex)(struct igc_hw *hw); 123*4882a593Smuzhiyun s32 (*get_phy_info)(struct igc_hw *hw); 124*4882a593Smuzhiyun s32 (*read_reg)(struct igc_hw *hw, u32 address, u16 *data); 125*4882a593Smuzhiyun void (*release)(struct igc_hw *hw); 126*4882a593Smuzhiyun s32 (*reset)(struct igc_hw *hw); 127*4882a593Smuzhiyun s32 (*write_reg)(struct igc_hw *hw, u32 address, u16 data); 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun struct igc_nvm_info { 131*4882a593Smuzhiyun struct igc_nvm_operations ops; 132*4882a593Smuzhiyun enum igc_nvm_type type; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun u16 word_size; 135*4882a593Smuzhiyun u16 delay_usec; 136*4882a593Smuzhiyun u16 address_bits; 137*4882a593Smuzhiyun u16 opcode_bits; 138*4882a593Smuzhiyun u16 page_size; 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun struct igc_phy_info { 142*4882a593Smuzhiyun struct igc_phy_operations ops; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun enum igc_phy_type type; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun u32 addr; 147*4882a593Smuzhiyun u32 id; 148*4882a593Smuzhiyun u32 reset_delay_us; /* in usec */ 149*4882a593Smuzhiyun u32 revision; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun enum igc_media_type media_type; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun u16 autoneg_advertised; 154*4882a593Smuzhiyun u16 autoneg_mask; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun u8 mdix; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun bool is_mdix; 159*4882a593Smuzhiyun bool speed_downgraded; 160*4882a593Smuzhiyun bool autoneg_wait_to_complete; 161*4882a593Smuzhiyun }; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun struct igc_bus_info { 164*4882a593Smuzhiyun u16 func; 165*4882a593Smuzhiyun u16 pci_cmd_word; 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun enum igc_fc_mode { 169*4882a593Smuzhiyun igc_fc_none = 0, 170*4882a593Smuzhiyun igc_fc_rx_pause, 171*4882a593Smuzhiyun igc_fc_tx_pause, 172*4882a593Smuzhiyun igc_fc_full, 173*4882a593Smuzhiyun igc_fc_default = 0xFF 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun struct igc_fc_info { 177*4882a593Smuzhiyun u32 high_water; /* Flow control high-water mark */ 178*4882a593Smuzhiyun u32 low_water; /* Flow control low-water mark */ 179*4882a593Smuzhiyun u16 pause_time; /* Flow control pause timer */ 180*4882a593Smuzhiyun bool send_xon; /* Flow control send XON */ 181*4882a593Smuzhiyun bool strict_ieee; /* Strict IEEE mode */ 182*4882a593Smuzhiyun enum igc_fc_mode current_mode; /* Type of flow control */ 183*4882a593Smuzhiyun enum igc_fc_mode requested_mode; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct igc_dev_spec_base { 187*4882a593Smuzhiyun bool clear_semaphore_once; 188*4882a593Smuzhiyun bool eee_enable; 189*4882a593Smuzhiyun }; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun struct igc_hw { 192*4882a593Smuzhiyun void *back; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun u8 __iomem *hw_addr; 195*4882a593Smuzhiyun unsigned long io_base; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct igc_mac_info mac; 198*4882a593Smuzhiyun struct igc_fc_info fc; 199*4882a593Smuzhiyun struct igc_nvm_info nvm; 200*4882a593Smuzhiyun struct igc_phy_info phy; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun struct igc_bus_info bus; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun union { 205*4882a593Smuzhiyun struct igc_dev_spec_base _base; 206*4882a593Smuzhiyun } dev_spec; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun u16 device_id; 209*4882a593Smuzhiyun u16 subsystem_vendor_id; 210*4882a593Smuzhiyun u16 subsystem_device_id; 211*4882a593Smuzhiyun u16 vendor_id; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun u8 revision_id; 214*4882a593Smuzhiyun }; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* Statistics counters collected by the MAC */ 217*4882a593Smuzhiyun struct igc_hw_stats { 218*4882a593Smuzhiyun u64 crcerrs; 219*4882a593Smuzhiyun u64 algnerrc; 220*4882a593Smuzhiyun u64 symerrs; 221*4882a593Smuzhiyun u64 rxerrc; 222*4882a593Smuzhiyun u64 mpc; 223*4882a593Smuzhiyun u64 scc; 224*4882a593Smuzhiyun u64 ecol; 225*4882a593Smuzhiyun u64 mcc; 226*4882a593Smuzhiyun u64 latecol; 227*4882a593Smuzhiyun u64 colc; 228*4882a593Smuzhiyun u64 dc; 229*4882a593Smuzhiyun u64 tncrs; 230*4882a593Smuzhiyun u64 sec; 231*4882a593Smuzhiyun u64 cexterr; 232*4882a593Smuzhiyun u64 rlec; 233*4882a593Smuzhiyun u64 xonrxc; 234*4882a593Smuzhiyun u64 xontxc; 235*4882a593Smuzhiyun u64 xoffrxc; 236*4882a593Smuzhiyun u64 xofftxc; 237*4882a593Smuzhiyun u64 fcruc; 238*4882a593Smuzhiyun u64 prc64; 239*4882a593Smuzhiyun u64 prc127; 240*4882a593Smuzhiyun u64 prc255; 241*4882a593Smuzhiyun u64 prc511; 242*4882a593Smuzhiyun u64 prc1023; 243*4882a593Smuzhiyun u64 prc1522; 244*4882a593Smuzhiyun u64 tlpic; 245*4882a593Smuzhiyun u64 rlpic; 246*4882a593Smuzhiyun u64 gprc; 247*4882a593Smuzhiyun u64 bprc; 248*4882a593Smuzhiyun u64 mprc; 249*4882a593Smuzhiyun u64 gptc; 250*4882a593Smuzhiyun u64 gorc; 251*4882a593Smuzhiyun u64 gotc; 252*4882a593Smuzhiyun u64 rnbc; 253*4882a593Smuzhiyun u64 ruc; 254*4882a593Smuzhiyun u64 rfc; 255*4882a593Smuzhiyun u64 roc; 256*4882a593Smuzhiyun u64 rjc; 257*4882a593Smuzhiyun u64 mgprc; 258*4882a593Smuzhiyun u64 mgpdc; 259*4882a593Smuzhiyun u64 mgptc; 260*4882a593Smuzhiyun u64 tor; 261*4882a593Smuzhiyun u64 tot; 262*4882a593Smuzhiyun u64 tpr; 263*4882a593Smuzhiyun u64 tpt; 264*4882a593Smuzhiyun u64 ptc64; 265*4882a593Smuzhiyun u64 ptc127; 266*4882a593Smuzhiyun u64 ptc255; 267*4882a593Smuzhiyun u64 ptc511; 268*4882a593Smuzhiyun u64 ptc1023; 269*4882a593Smuzhiyun u64 ptc1522; 270*4882a593Smuzhiyun u64 mptc; 271*4882a593Smuzhiyun u64 bptc; 272*4882a593Smuzhiyun u64 tsctc; 273*4882a593Smuzhiyun u64 tsctfc; 274*4882a593Smuzhiyun u64 iac; 275*4882a593Smuzhiyun u64 htdpmc; 276*4882a593Smuzhiyun u64 rpthc; 277*4882a593Smuzhiyun u64 hgptc; 278*4882a593Smuzhiyun u64 hgorc; 279*4882a593Smuzhiyun u64 hgotc; 280*4882a593Smuzhiyun u64 lenerrs; 281*4882a593Smuzhiyun u64 scvpc; 282*4882a593Smuzhiyun u64 hrmpc; 283*4882a593Smuzhiyun u64 doosync; 284*4882a593Smuzhiyun u64 o2bgptc; 285*4882a593Smuzhiyun u64 o2bspc; 286*4882a593Smuzhiyun u64 b2ospc; 287*4882a593Smuzhiyun u64 b2ogprc; 288*4882a593Smuzhiyun }; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun struct net_device *igc_get_hw_dev(struct igc_hw *hw); 291*4882a593Smuzhiyun #define hw_dbg(format, arg...) \ 292*4882a593Smuzhiyun netdev_dbg(igc_get_hw_dev(hw), format, ##arg) 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun s32 igc_read_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 295*4882a593Smuzhiyun s32 igc_write_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 296*4882a593Smuzhiyun void igc_read_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 297*4882a593Smuzhiyun void igc_write_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun #endif /* _IGC_HW_H_ */ 300