1d89f8841SSasha Neftin /* SPDX-License-Identifier: GPL-2.0 */ 2d89f8841SSasha Neftin /* Copyright (c) 2018 Intel Corporation */ 3d89f8841SSasha Neftin 4d89f8841SSasha Neftin #ifndef _IGC_HW_H_ 5d89f8841SSasha Neftin #define _IGC_HW_H_ 6d89f8841SSasha Neftin 7146740f9SSasha Neftin #include <linux/types.h> 8146740f9SSasha Neftin #include <linux/if_ether.h> 9c0071c7aSSasha Neftin #include <linux/netdevice.h> 10c0071c7aSSasha Neftin 11146740f9SSasha Neftin #include "igc_regs.h" 12146740f9SSasha Neftin #include "igc_defines.h" 13146740f9SSasha Neftin #include "igc_mac.h" 145586838fSSasha Neftin #include "igc_phy.h" 15ab405612SSasha Neftin #include "igc_nvm.h" 16146740f9SSasha Neftin #include "igc_i225.h" 1713b5b7fdSSasha Neftin #include "igc_base.h" 18146740f9SSasha Neftin 19d89f8841SSasha Neftin #define IGC_DEV_ID_I225_LM 0x15F2 20d89f8841SSasha Neftin #define IGC_DEV_ID_I225_V 0x15F3 21d89f8841SSasha Neftin 225586838fSSasha Neftin #define IGC_FUNC_0 0 235586838fSSasha Neftin 24146740f9SSasha Neftin /* Function pointers for the MAC. */ 25146740f9SSasha Neftin struct igc_mac_operations { 26c0071c7aSSasha Neftin s32 (*check_for_link)(struct igc_hw *hw); 27c0071c7aSSasha Neftin s32 (*reset_hw)(struct igc_hw *hw); 28c0071c7aSSasha Neftin s32 (*init_hw)(struct igc_hw *hw); 29c0071c7aSSasha Neftin s32 (*setup_physical_interface)(struct igc_hw *hw); 30c0071c7aSSasha Neftin void (*rar_set)(struct igc_hw *hw, u8 *address, u32 index); 31c0071c7aSSasha Neftin s32 (*read_mac_addr)(struct igc_hw *hw); 32c0071c7aSSasha Neftin s32 (*get_speed_and_duplex)(struct igc_hw *hw, u16 *speed, 33c0071c7aSSasha Neftin u16 *duplex); 34c0071c7aSSasha Neftin s32 (*acquire_swfw_sync)(struct igc_hw *hw, u16 mask); 35c0071c7aSSasha Neftin void (*release_swfw_sync)(struct igc_hw *hw, u16 mask); 36146740f9SSasha Neftin }; 37146740f9SSasha Neftin 38146740f9SSasha Neftin enum igc_mac_type { 39146740f9SSasha Neftin igc_undefined = 0, 40146740f9SSasha Neftin igc_i225, 41146740f9SSasha Neftin igc_num_macs /* List is 1-based, so subtract 1 for true count. */ 42146740f9SSasha Neftin }; 43146740f9SSasha Neftin 44146740f9SSasha Neftin enum igc_phy_type { 45146740f9SSasha Neftin igc_phy_unknown = 0, 46146740f9SSasha Neftin igc_phy_none, 47146740f9SSasha Neftin igc_phy_i225, 48146740f9SSasha Neftin }; 49146740f9SSasha Neftin 505586838fSSasha Neftin enum igc_media_type { 515586838fSSasha Neftin igc_media_type_unknown = 0, 525586838fSSasha Neftin igc_media_type_copper = 1, 535586838fSSasha Neftin igc_num_media_types 545586838fSSasha Neftin }; 555586838fSSasha Neftin 56c0071c7aSSasha Neftin enum igc_nvm_type { 57c0071c7aSSasha Neftin igc_nvm_unknown = 0, 588c5ad0daSSasha Neftin igc_nvm_eeprom_spi, 59c0071c7aSSasha Neftin igc_nvm_flash_hw, 60c0071c7aSSasha Neftin igc_nvm_invm, 61c0071c7aSSasha Neftin }; 62c0071c7aSSasha Neftin 63c0071c7aSSasha Neftin struct igc_info { 64c0071c7aSSasha Neftin s32 (*get_invariants)(struct igc_hw *hw); 65c0071c7aSSasha Neftin struct igc_mac_operations *mac_ops; 66c0071c7aSSasha Neftin const struct igc_phy_operations *phy_ops; 67c0071c7aSSasha Neftin struct igc_nvm_operations *nvm_ops; 68c0071c7aSSasha Neftin }; 69c0071c7aSSasha Neftin 70ab405612SSasha Neftin extern const struct igc_info igc_base_info; 71ab405612SSasha Neftin 72146740f9SSasha Neftin struct igc_mac_info { 73146740f9SSasha Neftin struct igc_mac_operations ops; 74146740f9SSasha Neftin 75146740f9SSasha Neftin u8 addr[ETH_ALEN]; 76146740f9SSasha Neftin u8 perm_addr[ETH_ALEN]; 77146740f9SSasha Neftin 78146740f9SSasha Neftin enum igc_mac_type type; 79146740f9SSasha Neftin 80146740f9SSasha Neftin u32 collision_delta; 81146740f9SSasha Neftin u32 ledctl_default; 82146740f9SSasha Neftin u32 ledctl_mode1; 83146740f9SSasha Neftin u32 ledctl_mode2; 84146740f9SSasha Neftin u32 mc_filter_type; 85146740f9SSasha Neftin u32 tx_packet_delta; 86146740f9SSasha Neftin u32 txcw; 87146740f9SSasha Neftin 88146740f9SSasha Neftin u16 mta_reg_count; 89146740f9SSasha Neftin u16 uta_reg_count; 90146740f9SSasha Neftin 91146740f9SSasha Neftin u16 rar_entry_count; 92146740f9SSasha Neftin 93146740f9SSasha Neftin u8 forced_speed_duplex; 94146740f9SSasha Neftin 95146740f9SSasha Neftin bool adaptive_ifs; 96146740f9SSasha Neftin bool has_fwsm; 975586838fSSasha Neftin bool asf_firmware_present; 98146740f9SSasha Neftin bool arc_subsystem_valid; 99146740f9SSasha Neftin 100146740f9SSasha Neftin bool autoneg; 101146740f9SSasha Neftin bool autoneg_failed; 102c9a11c23SSasha Neftin bool get_link_status; 103146740f9SSasha Neftin }; 104146740f9SSasha Neftin 105c0071c7aSSasha Neftin struct igc_nvm_operations { 106c0071c7aSSasha Neftin s32 (*acquire)(struct igc_hw *hw); 107c0071c7aSSasha Neftin s32 (*read)(struct igc_hw *hw, u16 offset, u16 i, u16 *data); 108c0071c7aSSasha Neftin void (*release)(struct igc_hw *hw); 109c0071c7aSSasha Neftin s32 (*write)(struct igc_hw *hw, u16 offset, u16 i, u16 *data); 110c0071c7aSSasha Neftin s32 (*update)(struct igc_hw *hw); 111c0071c7aSSasha Neftin s32 (*validate)(struct igc_hw *hw); 112c0071c7aSSasha Neftin s32 (*valid_led_default)(struct igc_hw *hw, u16 *data); 113c0071c7aSSasha Neftin }; 114c0071c7aSSasha Neftin 1155586838fSSasha Neftin struct igc_phy_operations { 1165586838fSSasha Neftin s32 (*acquire)(struct igc_hw *hw); 1175586838fSSasha Neftin s32 (*check_polarity)(struct igc_hw *hw); 1185586838fSSasha Neftin s32 (*check_reset_block)(struct igc_hw *hw); 1195586838fSSasha Neftin s32 (*force_speed_duplex)(struct igc_hw *hw); 1205586838fSSasha Neftin s32 (*get_cfg_done)(struct igc_hw *hw); 1215586838fSSasha Neftin s32 (*get_cable_length)(struct igc_hw *hw); 1225586838fSSasha Neftin s32 (*get_phy_info)(struct igc_hw *hw); 1235586838fSSasha Neftin s32 (*read_reg)(struct igc_hw *hw, u32 address, u16 *data); 1245586838fSSasha Neftin void (*release)(struct igc_hw *hw); 1255586838fSSasha Neftin s32 (*reset)(struct igc_hw *hw); 1265586838fSSasha Neftin s32 (*write_reg)(struct igc_hw *hw, u32 address, u16 data); 1275586838fSSasha Neftin }; 1285586838fSSasha Neftin 129c0071c7aSSasha Neftin struct igc_nvm_info { 130c0071c7aSSasha Neftin struct igc_nvm_operations ops; 131c0071c7aSSasha Neftin enum igc_nvm_type type; 132c0071c7aSSasha Neftin 133c0071c7aSSasha Neftin u32 flash_bank_size; 134c0071c7aSSasha Neftin u32 flash_base_addr; 135c0071c7aSSasha Neftin 136c0071c7aSSasha Neftin u16 word_size; 137c0071c7aSSasha Neftin u16 delay_usec; 138c0071c7aSSasha Neftin u16 address_bits; 139c0071c7aSSasha Neftin u16 opcode_bits; 140c0071c7aSSasha Neftin u16 page_size; 141c0071c7aSSasha Neftin }; 142c0071c7aSSasha Neftin 1435586838fSSasha Neftin struct igc_phy_info { 1445586838fSSasha Neftin struct igc_phy_operations ops; 1455586838fSSasha Neftin 1465586838fSSasha Neftin enum igc_phy_type type; 1475586838fSSasha Neftin 1485586838fSSasha Neftin u32 addr; 1495586838fSSasha Neftin u32 id; 1505586838fSSasha Neftin u32 reset_delay_us; /* in usec */ 1515586838fSSasha Neftin u32 revision; 1525586838fSSasha Neftin 1535586838fSSasha Neftin enum igc_media_type media_type; 1545586838fSSasha Neftin 1555586838fSSasha Neftin u16 autoneg_advertised; 1565586838fSSasha Neftin u16 autoneg_mask; 1575586838fSSasha Neftin u16 cable_length; 1585586838fSSasha Neftin u16 max_cable_length; 1595586838fSSasha Neftin u16 min_cable_length; 1605586838fSSasha Neftin u16 pair_length[4]; 1615586838fSSasha Neftin 1625586838fSSasha Neftin u8 mdix; 1635586838fSSasha Neftin 1645586838fSSasha Neftin bool disable_polarity_correction; 1655586838fSSasha Neftin bool is_mdix; 1665586838fSSasha Neftin bool polarity_correction; 1675586838fSSasha Neftin bool reset_disable; 1685586838fSSasha Neftin bool speed_downgraded; 1695586838fSSasha Neftin bool autoneg_wait_to_complete; 1705586838fSSasha Neftin }; 1715586838fSSasha Neftin 172146740f9SSasha Neftin struct igc_bus_info { 173146740f9SSasha Neftin u16 func; 174146740f9SSasha Neftin u16 pci_cmd_word; 175146740f9SSasha Neftin }; 176146740f9SSasha Neftin 177c0071c7aSSasha Neftin enum igc_fc_mode { 178c0071c7aSSasha Neftin igc_fc_none = 0, 179c0071c7aSSasha Neftin igc_fc_rx_pause, 180c0071c7aSSasha Neftin igc_fc_tx_pause, 181c0071c7aSSasha Neftin igc_fc_full, 182c0071c7aSSasha Neftin igc_fc_default = 0xFF 183c0071c7aSSasha Neftin }; 184c0071c7aSSasha Neftin 185c0071c7aSSasha Neftin struct igc_fc_info { 186c0071c7aSSasha Neftin u32 high_water; /* Flow control high-water mark */ 187c0071c7aSSasha Neftin u32 low_water; /* Flow control low-water mark */ 188c0071c7aSSasha Neftin u16 pause_time; /* Flow control pause timer */ 189c0071c7aSSasha Neftin bool send_xon; /* Flow control send XON */ 190c0071c7aSSasha Neftin bool strict_ieee; /* Strict IEEE mode */ 191c0071c7aSSasha Neftin enum igc_fc_mode current_mode; /* Type of flow control */ 192c0071c7aSSasha Neftin enum igc_fc_mode requested_mode; 193c0071c7aSSasha Neftin }; 194c0071c7aSSasha Neftin 195c0071c7aSSasha Neftin struct igc_dev_spec_base { 196c0071c7aSSasha Neftin bool global_device_reset; 197c0071c7aSSasha Neftin bool eee_disable; 198c0071c7aSSasha Neftin bool clear_semaphore_once; 199c0071c7aSSasha Neftin bool module_plugged; 200c0071c7aSSasha Neftin u8 media_port; 201208983f0SSasha Neftin bool mas_capable; 202c0071c7aSSasha Neftin }; 203c0071c7aSSasha Neftin 204146740f9SSasha Neftin struct igc_hw { 205146740f9SSasha Neftin void *back; 206146740f9SSasha Neftin 207146740f9SSasha Neftin u8 __iomem *hw_addr; 208146740f9SSasha Neftin unsigned long io_base; 209146740f9SSasha Neftin 210146740f9SSasha Neftin struct igc_mac_info mac; 211c0071c7aSSasha Neftin struct igc_fc_info fc; 212c0071c7aSSasha Neftin struct igc_nvm_info nvm; 2135586838fSSasha Neftin struct igc_phy_info phy; 214146740f9SSasha Neftin 215146740f9SSasha Neftin struct igc_bus_info bus; 216146740f9SSasha Neftin 217c0071c7aSSasha Neftin union { 218c0071c7aSSasha Neftin struct igc_dev_spec_base _base; 219c0071c7aSSasha Neftin } dev_spec; 220c0071c7aSSasha Neftin 221146740f9SSasha Neftin u16 device_id; 222146740f9SSasha Neftin u16 subsystem_vendor_id; 223146740f9SSasha Neftin u16 subsystem_device_id; 224146740f9SSasha Neftin u16 vendor_id; 225146740f9SSasha Neftin 226146740f9SSasha Neftin u8 revision_id; 227146740f9SSasha Neftin }; 228146740f9SSasha Neftin 2293df25e4cSSasha Neftin /* Statistics counters collected by the MAC */ 2303df25e4cSSasha Neftin struct igc_hw_stats { 2313df25e4cSSasha Neftin u64 crcerrs; 2323df25e4cSSasha Neftin u64 algnerrc; 2333df25e4cSSasha Neftin u64 symerrs; 2343df25e4cSSasha Neftin u64 rxerrc; 2353df25e4cSSasha Neftin u64 mpc; 2363df25e4cSSasha Neftin u64 scc; 2373df25e4cSSasha Neftin u64 ecol; 2383df25e4cSSasha Neftin u64 mcc; 2393df25e4cSSasha Neftin u64 latecol; 2403df25e4cSSasha Neftin u64 colc; 2413df25e4cSSasha Neftin u64 dc; 2423df25e4cSSasha Neftin u64 tncrs; 2433df25e4cSSasha Neftin u64 sec; 2443df25e4cSSasha Neftin u64 cexterr; 2453df25e4cSSasha Neftin u64 rlec; 2463df25e4cSSasha Neftin u64 xonrxc; 2473df25e4cSSasha Neftin u64 xontxc; 2483df25e4cSSasha Neftin u64 xoffrxc; 2493df25e4cSSasha Neftin u64 xofftxc; 2503df25e4cSSasha Neftin u64 fcruc; 2513df25e4cSSasha Neftin u64 prc64; 2523df25e4cSSasha Neftin u64 prc127; 2533df25e4cSSasha Neftin u64 prc255; 2543df25e4cSSasha Neftin u64 prc511; 2553df25e4cSSasha Neftin u64 prc1023; 2563df25e4cSSasha Neftin u64 prc1522; 2573df25e4cSSasha Neftin u64 gprc; 2583df25e4cSSasha Neftin u64 bprc; 2593df25e4cSSasha Neftin u64 mprc; 2603df25e4cSSasha Neftin u64 gptc; 2613df25e4cSSasha Neftin u64 gorc; 2623df25e4cSSasha Neftin u64 gotc; 2633df25e4cSSasha Neftin u64 rnbc; 2643df25e4cSSasha Neftin u64 ruc; 2653df25e4cSSasha Neftin u64 rfc; 2663df25e4cSSasha Neftin u64 roc; 2673df25e4cSSasha Neftin u64 rjc; 2683df25e4cSSasha Neftin u64 mgprc; 2693df25e4cSSasha Neftin u64 mgpdc; 2703df25e4cSSasha Neftin u64 mgptc; 2713df25e4cSSasha Neftin u64 tor; 2723df25e4cSSasha Neftin u64 tot; 2733df25e4cSSasha Neftin u64 tpr; 2743df25e4cSSasha Neftin u64 tpt; 2753df25e4cSSasha Neftin u64 ptc64; 2763df25e4cSSasha Neftin u64 ptc127; 2773df25e4cSSasha Neftin u64 ptc255; 2783df25e4cSSasha Neftin u64 ptc511; 2793df25e4cSSasha Neftin u64 ptc1023; 2803df25e4cSSasha Neftin u64 ptc1522; 2813df25e4cSSasha Neftin u64 mptc; 2823df25e4cSSasha Neftin u64 bptc; 2833df25e4cSSasha Neftin u64 tsctc; 2843df25e4cSSasha Neftin u64 tsctfc; 2853df25e4cSSasha Neftin u64 iac; 2863df25e4cSSasha Neftin u64 icrxptc; 2873df25e4cSSasha Neftin u64 icrxatc; 2883df25e4cSSasha Neftin u64 ictxptc; 2893df25e4cSSasha Neftin u64 ictxatc; 2903df25e4cSSasha Neftin u64 ictxqec; 2913df25e4cSSasha Neftin u64 ictxqmtc; 2923df25e4cSSasha Neftin u64 icrxdmtc; 2933df25e4cSSasha Neftin u64 icrxoc; 2943df25e4cSSasha Neftin u64 cbtmpc; 2953df25e4cSSasha Neftin u64 htdpmc; 2963df25e4cSSasha Neftin u64 cbrdpc; 2973df25e4cSSasha Neftin u64 cbrmpc; 2983df25e4cSSasha Neftin u64 rpthc; 2993df25e4cSSasha Neftin u64 hgptc; 3003df25e4cSSasha Neftin u64 htcbdpc; 3013df25e4cSSasha Neftin u64 hgorc; 3023df25e4cSSasha Neftin u64 hgotc; 3033df25e4cSSasha Neftin u64 lenerrs; 3043df25e4cSSasha Neftin u64 scvpc; 3053df25e4cSSasha Neftin u64 hrmpc; 3063df25e4cSSasha Neftin u64 doosync; 3073df25e4cSSasha Neftin u64 o2bgptc; 3083df25e4cSSasha Neftin u64 o2bspc; 3093df25e4cSSasha Neftin u64 b2ospc; 3103df25e4cSSasha Neftin u64 b2ogprc; 3113df25e4cSSasha Neftin }; 3123df25e4cSSasha Neftin 313c0071c7aSSasha Neftin struct net_device *igc_get_hw_dev(struct igc_hw *hw); 314c0071c7aSSasha Neftin #define hw_dbg(format, arg...) \ 315c0071c7aSSasha Neftin netdev_dbg(igc_get_hw_dev(hw), format, ##arg) 316c0071c7aSSasha Neftin 317146740f9SSasha Neftin s32 igc_read_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 318146740f9SSasha Neftin s32 igc_write_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 319146740f9SSasha Neftin void igc_read_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 320146740f9SSasha Neftin void igc_write_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 321146740f9SSasha Neftin 322d89f8841SSasha Neftin #endif /* _IGC_HW_H_ */ 323