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