18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (c)  2018 Intel Corporation */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef _IGC_H_
58c2ecf20Sopenharmony_ci#define _IGC_H_
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/kobject.h>
88c2ecf20Sopenharmony_ci#include <linux/pci.h>
98c2ecf20Sopenharmony_ci#include <linux/netdevice.h>
108c2ecf20Sopenharmony_ci#include <linux/vmalloc.h>
118c2ecf20Sopenharmony_ci#include <linux/ethtool.h>
128c2ecf20Sopenharmony_ci#include <linux/sctp.h>
138c2ecf20Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
148c2ecf20Sopenharmony_ci#include <linux/timecounter.h>
158c2ecf20Sopenharmony_ci#include <linux/net_tstamp.h>
168c2ecf20Sopenharmony_ci#include <linux/bitfield.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include "igc_hw.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_civoid igc_ethtool_set_ops(struct net_device *);
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci/* Transmit and receive queues */
238c2ecf20Sopenharmony_ci#define IGC_MAX_RX_QUEUES		4
248c2ecf20Sopenharmony_ci#define IGC_MAX_TX_QUEUES		4
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#define MAX_Q_VECTORS			8
278c2ecf20Sopenharmony_ci#define MAX_STD_JUMBO_FRAME_SIZE	9216
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define MAX_ETYPE_FILTER		8
308c2ecf20Sopenharmony_ci#define IGC_RETA_SIZE			128
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cienum igc_mac_filter_type {
338c2ecf20Sopenharmony_ci	IGC_MAC_FILTER_TYPE_DST = 0,
348c2ecf20Sopenharmony_ci	IGC_MAC_FILTER_TYPE_SRC
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistruct igc_tx_queue_stats {
388c2ecf20Sopenharmony_ci	u64 packets;
398c2ecf20Sopenharmony_ci	u64 bytes;
408c2ecf20Sopenharmony_ci	u64 restart_queue;
418c2ecf20Sopenharmony_ci	u64 restart_queue2;
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistruct igc_rx_queue_stats {
458c2ecf20Sopenharmony_ci	u64 packets;
468c2ecf20Sopenharmony_ci	u64 bytes;
478c2ecf20Sopenharmony_ci	u64 drops;
488c2ecf20Sopenharmony_ci	u64 csum_err;
498c2ecf20Sopenharmony_ci	u64 alloc_failed;
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistruct igc_rx_packet_stats {
538c2ecf20Sopenharmony_ci	u64 ipv4_packets;      /* IPv4 headers processed */
548c2ecf20Sopenharmony_ci	u64 ipv4e_packets;     /* IPv4E headers with extensions processed */
558c2ecf20Sopenharmony_ci	u64 ipv6_packets;      /* IPv6 headers processed */
568c2ecf20Sopenharmony_ci	u64 ipv6e_packets;     /* IPv6E headers with extensions processed */
578c2ecf20Sopenharmony_ci	u64 tcp_packets;       /* TCP headers processed */
588c2ecf20Sopenharmony_ci	u64 udp_packets;       /* UDP headers processed */
598c2ecf20Sopenharmony_ci	u64 sctp_packets;      /* SCTP headers processed */
608c2ecf20Sopenharmony_ci	u64 nfs_packets;       /* NFS headers processe */
618c2ecf20Sopenharmony_ci	u64 other_packets;
628c2ecf20Sopenharmony_ci};
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistruct igc_ring_container {
658c2ecf20Sopenharmony_ci	struct igc_ring *ring;          /* pointer to linked list of rings */
668c2ecf20Sopenharmony_ci	unsigned int total_bytes;       /* total bytes processed this int */
678c2ecf20Sopenharmony_ci	unsigned int total_packets;     /* total packets processed this int */
688c2ecf20Sopenharmony_ci	u16 work_limit;                 /* total work allowed per interrupt */
698c2ecf20Sopenharmony_ci	u8 count;                       /* total number of rings in vector */
708c2ecf20Sopenharmony_ci	u8 itr;                         /* current ITR setting for ring */
718c2ecf20Sopenharmony_ci};
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_cistruct igc_ring {
748c2ecf20Sopenharmony_ci	struct igc_q_vector *q_vector;  /* backlink to q_vector */
758c2ecf20Sopenharmony_ci	struct net_device *netdev;      /* back pointer to net_device */
768c2ecf20Sopenharmony_ci	struct device *dev;             /* device for dma mapping */
778c2ecf20Sopenharmony_ci	union {                         /* array of buffer info structs */
788c2ecf20Sopenharmony_ci		struct igc_tx_buffer *tx_buffer_info;
798c2ecf20Sopenharmony_ci		struct igc_rx_buffer *rx_buffer_info;
808c2ecf20Sopenharmony_ci	};
818c2ecf20Sopenharmony_ci	void *desc;                     /* descriptor ring memory */
828c2ecf20Sopenharmony_ci	unsigned long flags;            /* ring specific flags */
838c2ecf20Sopenharmony_ci	void __iomem *tail;             /* pointer to ring tail register */
848c2ecf20Sopenharmony_ci	dma_addr_t dma;                 /* phys address of the ring */
858c2ecf20Sopenharmony_ci	unsigned int size;              /* length of desc. ring in bytes */
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	u16 count;                      /* number of desc. in the ring */
888c2ecf20Sopenharmony_ci	u8 queue_index;                 /* logical index of the ring*/
898c2ecf20Sopenharmony_ci	u8 reg_idx;                     /* physical index of the ring */
908c2ecf20Sopenharmony_ci	bool launchtime_enable;         /* true if LaunchTime is enabled */
918c2ecf20Sopenharmony_ci	ktime_t last_tx_cycle;          /* end of the cycle with a launchtime transmission */
928c2ecf20Sopenharmony_ci	ktime_t last_ff_cycle;          /* Last cycle with an active first flag */
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	u32 start_time;
958c2ecf20Sopenharmony_ci	u32 end_time;
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	/* everything past this point are written often */
988c2ecf20Sopenharmony_ci	u16 next_to_clean;
998c2ecf20Sopenharmony_ci	u16 next_to_use;
1008c2ecf20Sopenharmony_ci	u16 next_to_alloc;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	union {
1038c2ecf20Sopenharmony_ci		/* TX */
1048c2ecf20Sopenharmony_ci		struct {
1058c2ecf20Sopenharmony_ci			struct igc_tx_queue_stats tx_stats;
1068c2ecf20Sopenharmony_ci			struct u64_stats_sync tx_syncp;
1078c2ecf20Sopenharmony_ci			struct u64_stats_sync tx_syncp2;
1088c2ecf20Sopenharmony_ci		};
1098c2ecf20Sopenharmony_ci		/* RX */
1108c2ecf20Sopenharmony_ci		struct {
1118c2ecf20Sopenharmony_ci			struct igc_rx_queue_stats rx_stats;
1128c2ecf20Sopenharmony_ci			struct igc_rx_packet_stats pkt_stats;
1138c2ecf20Sopenharmony_ci			struct u64_stats_sync rx_syncp;
1148c2ecf20Sopenharmony_ci			struct sk_buff *skb;
1158c2ecf20Sopenharmony_ci		};
1168c2ecf20Sopenharmony_ci	};
1178c2ecf20Sopenharmony_ci} ____cacheline_internodealigned_in_smp;
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci/* Board specific private data structure */
1208c2ecf20Sopenharmony_cistruct igc_adapter {
1218c2ecf20Sopenharmony_ci	struct net_device *netdev;
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	struct ethtool_eee eee;
1248c2ecf20Sopenharmony_ci	u16 eee_advert;
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	unsigned long state;
1278c2ecf20Sopenharmony_ci	unsigned int flags;
1288c2ecf20Sopenharmony_ci	unsigned int num_q_vectors;
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci	struct msix_entry *msix_entries;
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	/* TX */
1338c2ecf20Sopenharmony_ci	u16 tx_work_limit;
1348c2ecf20Sopenharmony_ci	u32 tx_timeout_count;
1358c2ecf20Sopenharmony_ci	int num_tx_queues;
1368c2ecf20Sopenharmony_ci	struct igc_ring *tx_ring[IGC_MAX_TX_QUEUES];
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	/* RX */
1398c2ecf20Sopenharmony_ci	int num_rx_queues;
1408c2ecf20Sopenharmony_ci	struct igc_ring *rx_ring[IGC_MAX_RX_QUEUES];
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	struct timer_list watchdog_timer;
1438c2ecf20Sopenharmony_ci	struct timer_list dma_err_timer;
1448c2ecf20Sopenharmony_ci	struct timer_list phy_info_timer;
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	u32 wol;
1478c2ecf20Sopenharmony_ci	u32 en_mng_pt;
1488c2ecf20Sopenharmony_ci	u16 link_speed;
1498c2ecf20Sopenharmony_ci	u16 link_duplex;
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci	u8 port_num;
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	u8 __iomem *io_addr;
1548c2ecf20Sopenharmony_ci	/* Interrupt Throttle Rate */
1558c2ecf20Sopenharmony_ci	u32 rx_itr_setting;
1568c2ecf20Sopenharmony_ci	u32 tx_itr_setting;
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci	struct work_struct reset_task;
1598c2ecf20Sopenharmony_ci	struct work_struct watchdog_task;
1608c2ecf20Sopenharmony_ci	struct work_struct dma_err_task;
1618c2ecf20Sopenharmony_ci	bool fc_autoneg;
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	u8 tx_timeout_factor;
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci	int msg_enable;
1668c2ecf20Sopenharmony_ci	u32 max_frame_size;
1678c2ecf20Sopenharmony_ci	u32 min_frame_size;
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_ci	ktime_t base_time;
1708c2ecf20Sopenharmony_ci	ktime_t cycle_time;
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci	/* OS defined structs */
1738c2ecf20Sopenharmony_ci	struct pci_dev *pdev;
1748c2ecf20Sopenharmony_ci	/* lock for statistics */
1758c2ecf20Sopenharmony_ci	spinlock_t stats64_lock;
1768c2ecf20Sopenharmony_ci	struct rtnl_link_stats64 stats64;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	/* structs defined in igc_hw.h */
1798c2ecf20Sopenharmony_ci	struct igc_hw hw;
1808c2ecf20Sopenharmony_ci	struct igc_hw_stats stats;
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	struct igc_q_vector *q_vector[MAX_Q_VECTORS];
1838c2ecf20Sopenharmony_ci	u32 eims_enable_mask;
1848c2ecf20Sopenharmony_ci	u32 eims_other;
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	u16 tx_ring_count;
1878c2ecf20Sopenharmony_ci	u16 rx_ring_count;
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	u32 tx_hwtstamp_timeouts;
1908c2ecf20Sopenharmony_ci	u32 tx_hwtstamp_skipped;
1918c2ecf20Sopenharmony_ci	u32 rx_hwtstamp_cleared;
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci	u32 rss_queues;
1948c2ecf20Sopenharmony_ci	u32 rss_indir_tbl_init;
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	/* Any access to elements in nfc_rule_list is protected by the
1978c2ecf20Sopenharmony_ci	 * nfc_rule_lock.
1988c2ecf20Sopenharmony_ci	 */
1998c2ecf20Sopenharmony_ci	struct mutex nfc_rule_lock;
2008c2ecf20Sopenharmony_ci	struct list_head nfc_rule_list;
2018c2ecf20Sopenharmony_ci	unsigned int nfc_rule_count;
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	u8 rss_indir_tbl[IGC_RETA_SIZE];
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	unsigned long link_check_timeout;
2068c2ecf20Sopenharmony_ci	struct igc_info ei;
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci	u32 test_icr;
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	struct ptp_clock *ptp_clock;
2118c2ecf20Sopenharmony_ci	struct ptp_clock_info ptp_caps;
2128c2ecf20Sopenharmony_ci	struct work_struct ptp_tx_work;
2138c2ecf20Sopenharmony_ci	/* Access to ptp_tx_skb and ptp_tx_start are protected by the
2148c2ecf20Sopenharmony_ci	 * ptp_tx_lock.
2158c2ecf20Sopenharmony_ci	 */
2168c2ecf20Sopenharmony_ci	spinlock_t ptp_tx_lock;
2178c2ecf20Sopenharmony_ci	struct sk_buff *ptp_tx_skb;
2188c2ecf20Sopenharmony_ci	struct hwtstamp_config tstamp_config;
2198c2ecf20Sopenharmony_ci	unsigned long ptp_tx_start;
2208c2ecf20Sopenharmony_ci	unsigned int ptp_flags;
2218c2ecf20Sopenharmony_ci	/* System time value lock */
2228c2ecf20Sopenharmony_ci	spinlock_t tmreg_lock;
2238c2ecf20Sopenharmony_ci	struct cyclecounter cc;
2248c2ecf20Sopenharmony_ci	struct timecounter tc;
2258c2ecf20Sopenharmony_ci	struct timespec64 prev_ptp_time; /* Pre-reset PTP clock */
2268c2ecf20Sopenharmony_ci	ktime_t ptp_reset_start; /* Reset time in clock mono */
2278c2ecf20Sopenharmony_ci};
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_civoid igc_up(struct igc_adapter *adapter);
2308c2ecf20Sopenharmony_civoid igc_down(struct igc_adapter *adapter);
2318c2ecf20Sopenharmony_ciint igc_open(struct net_device *netdev);
2328c2ecf20Sopenharmony_ciint igc_close(struct net_device *netdev);
2338c2ecf20Sopenharmony_ciint igc_setup_tx_resources(struct igc_ring *ring);
2348c2ecf20Sopenharmony_ciint igc_setup_rx_resources(struct igc_ring *ring);
2358c2ecf20Sopenharmony_civoid igc_free_tx_resources(struct igc_ring *ring);
2368c2ecf20Sopenharmony_civoid igc_free_rx_resources(struct igc_ring *ring);
2378c2ecf20Sopenharmony_ciunsigned int igc_get_max_rss_queues(struct igc_adapter *adapter);
2388c2ecf20Sopenharmony_civoid igc_set_flag_queue_pairs(struct igc_adapter *adapter,
2398c2ecf20Sopenharmony_ci			      const u32 max_rss_queues);
2408c2ecf20Sopenharmony_ciint igc_reinit_queues(struct igc_adapter *adapter);
2418c2ecf20Sopenharmony_civoid igc_write_rss_indir_tbl(struct igc_adapter *adapter);
2428c2ecf20Sopenharmony_cibool igc_has_link(struct igc_adapter *adapter);
2438c2ecf20Sopenharmony_civoid igc_reset(struct igc_adapter *adapter);
2448c2ecf20Sopenharmony_ciint igc_set_spd_dplx(struct igc_adapter *adapter, u32 spd, u8 dplx);
2458c2ecf20Sopenharmony_civoid igc_update_stats(struct igc_adapter *adapter);
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci/* igc_dump declarations */
2488c2ecf20Sopenharmony_civoid igc_rings_dump(struct igc_adapter *adapter);
2498c2ecf20Sopenharmony_civoid igc_regs_dump(struct igc_adapter *adapter);
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ciextern char igc_driver_name[];
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci#define IGC_REGS_LEN			740
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci/* flags controlling PTP/1588 function */
2568c2ecf20Sopenharmony_ci#define IGC_PTP_ENABLED		BIT(0)
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci/* Flags definitions */
2598c2ecf20Sopenharmony_ci#define IGC_FLAG_HAS_MSI		BIT(0)
2608c2ecf20Sopenharmony_ci#define IGC_FLAG_QUEUE_PAIRS		BIT(3)
2618c2ecf20Sopenharmony_ci#define IGC_FLAG_DMAC			BIT(4)
2628c2ecf20Sopenharmony_ci#define IGC_FLAG_PTP			BIT(8)
2638c2ecf20Sopenharmony_ci#define IGC_FLAG_WOL_SUPPORTED		BIT(8)
2648c2ecf20Sopenharmony_ci#define IGC_FLAG_NEED_LINK_UPDATE	BIT(9)
2658c2ecf20Sopenharmony_ci#define IGC_FLAG_MEDIA_RESET		BIT(10)
2668c2ecf20Sopenharmony_ci#define IGC_FLAG_MAS_ENABLE		BIT(12)
2678c2ecf20Sopenharmony_ci#define IGC_FLAG_HAS_MSIX		BIT(13)
2688c2ecf20Sopenharmony_ci#define IGC_FLAG_EEE			BIT(14)
2698c2ecf20Sopenharmony_ci#define IGC_FLAG_VLAN_PROMISC		BIT(15)
2708c2ecf20Sopenharmony_ci#define IGC_FLAG_RX_LEGACY		BIT(16)
2718c2ecf20Sopenharmony_ci#define IGC_FLAG_TSN_QBV_ENABLED	BIT(17)
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci#define IGC_FLAG_RSS_FIELD_IPV4_UDP	BIT(6)
2748c2ecf20Sopenharmony_ci#define IGC_FLAG_RSS_FIELD_IPV6_UDP	BIT(7)
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci#define IGC_MRQC_ENABLE_RSS_MQ		0x00000002
2778c2ecf20Sopenharmony_ci#define IGC_MRQC_RSS_FIELD_IPV4_UDP	0x00400000
2788c2ecf20Sopenharmony_ci#define IGC_MRQC_RSS_FIELD_IPV6_UDP	0x00800000
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci/* RX-desc Write-Back format RSS Type's */
2818c2ecf20Sopenharmony_cienum igc_rss_type_num {
2828c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_NO_HASH		= 0,
2838c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_TCP_IPV4	= 1,
2848c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_IPV4		= 2,
2858c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_TCP_IPV6	= 3,
2868c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_IPV6_EX	= 4,
2878c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_IPV6		= 5,
2888c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_TCP_IPV6_EX	= 6,
2898c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_UDP_IPV4	= 7,
2908c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_UDP_IPV6	= 8,
2918c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_HASH_UDP_IPV6_EX	= 9,
2928c2ecf20Sopenharmony_ci	IGC_RSS_TYPE_MAX		= 10,
2938c2ecf20Sopenharmony_ci};
2948c2ecf20Sopenharmony_ci#define IGC_RSS_TYPE_MAX_TABLE		16
2958c2ecf20Sopenharmony_ci#define IGC_RSS_TYPE_MASK		GENMASK(3,0) /* 4-bits (3:0) = mask 0x0F */
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci/* igc_rss_type - Rx descriptor RSS type field */
2988c2ecf20Sopenharmony_cistatic inline u32 igc_rss_type(const union igc_adv_rx_desc *rx_desc)
2998c2ecf20Sopenharmony_ci{
3008c2ecf20Sopenharmony_ci	/* RSS Type 4-bits (3:0) number: 0-9 (above 9 is reserved)
3018c2ecf20Sopenharmony_ci	 * Accessing the same bits via u16 (wb.lower.lo_dword.hs_rss.pkt_info)
3028c2ecf20Sopenharmony_ci	 * is slightly slower than via u32 (wb.lower.lo_dword.data)
3038c2ecf20Sopenharmony_ci	 */
3048c2ecf20Sopenharmony_ci	return le32_get_bits(rx_desc->wb.lower.lo_dword.data, IGC_RSS_TYPE_MASK);
3058c2ecf20Sopenharmony_ci}
3068c2ecf20Sopenharmony_ci
3078c2ecf20Sopenharmony_ci/* Interrupt defines */
3088c2ecf20Sopenharmony_ci#define IGC_START_ITR			648 /* ~6000 ints/sec */
3098c2ecf20Sopenharmony_ci#define IGC_4K_ITR			980
3108c2ecf20Sopenharmony_ci#define IGC_20K_ITR			196
3118c2ecf20Sopenharmony_ci#define IGC_70K_ITR			56
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci#define IGC_DEFAULT_ITR		3 /* dynamic */
3148c2ecf20Sopenharmony_ci#define IGC_MAX_ITR_USECS	10000
3158c2ecf20Sopenharmony_ci#define IGC_MIN_ITR_USECS	10
3168c2ecf20Sopenharmony_ci#define NON_Q_VECTORS		1
3178c2ecf20Sopenharmony_ci#define MAX_MSIX_ENTRIES	10
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci/* TX/RX descriptor defines */
3208c2ecf20Sopenharmony_ci#define IGC_DEFAULT_TXD		256
3218c2ecf20Sopenharmony_ci#define IGC_DEFAULT_TX_WORK	128
3228c2ecf20Sopenharmony_ci#define IGC_MIN_TXD		64
3238c2ecf20Sopenharmony_ci#define IGC_MAX_TXD		4096
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci#define IGC_DEFAULT_RXD		256
3268c2ecf20Sopenharmony_ci#define IGC_MIN_RXD		64
3278c2ecf20Sopenharmony_ci#define IGC_MAX_RXD		4096
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ci/* Supported Rx Buffer Sizes */
3308c2ecf20Sopenharmony_ci#define IGC_RXBUFFER_256		256
3318c2ecf20Sopenharmony_ci#define IGC_RXBUFFER_2048		2048
3328c2ecf20Sopenharmony_ci#define IGC_RXBUFFER_3072		3072
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci#define AUTO_ALL_MODES		0
3358c2ecf20Sopenharmony_ci#define IGC_RX_HDR_LEN			IGC_RXBUFFER_256
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci/* Transmit and receive latency (for PTP timestamps) */
3388c2ecf20Sopenharmony_ci#define IGC_I225_TX_LATENCY_10		240
3398c2ecf20Sopenharmony_ci#define IGC_I225_TX_LATENCY_100		58
3408c2ecf20Sopenharmony_ci#define IGC_I225_TX_LATENCY_1000	80
3418c2ecf20Sopenharmony_ci#define IGC_I225_TX_LATENCY_2500	1325
3428c2ecf20Sopenharmony_ci#define IGC_I225_RX_LATENCY_10		6450
3438c2ecf20Sopenharmony_ci#define IGC_I225_RX_LATENCY_100		185
3448c2ecf20Sopenharmony_ci#define IGC_I225_RX_LATENCY_1000	300
3458c2ecf20Sopenharmony_ci#define IGC_I225_RX_LATENCY_2500	1485
3468c2ecf20Sopenharmony_ci
3478c2ecf20Sopenharmony_ci/* RX and TX descriptor control thresholds.
3488c2ecf20Sopenharmony_ci * PTHRESH - MAC will consider prefetch if it has fewer than this number of
3498c2ecf20Sopenharmony_ci *           descriptors available in its onboard memory.
3508c2ecf20Sopenharmony_ci *           Setting this to 0 disables RX descriptor prefetch.
3518c2ecf20Sopenharmony_ci * HTHRESH - MAC will only prefetch if there are at least this many descriptors
3528c2ecf20Sopenharmony_ci *           available in host memory.
3538c2ecf20Sopenharmony_ci *           If PTHRESH is 0, this should also be 0.
3548c2ecf20Sopenharmony_ci * WTHRESH - RX descriptor writeback threshold - MAC will delay writing back
3558c2ecf20Sopenharmony_ci *           descriptors until either it has this many to write back, or the
3568c2ecf20Sopenharmony_ci *           ITR timer expires.
3578c2ecf20Sopenharmony_ci */
3588c2ecf20Sopenharmony_ci#define IGC_RX_PTHRESH			8
3598c2ecf20Sopenharmony_ci#define IGC_RX_HTHRESH			8
3608c2ecf20Sopenharmony_ci#define IGC_TX_PTHRESH			8
3618c2ecf20Sopenharmony_ci#define IGC_TX_HTHRESH			1
3628c2ecf20Sopenharmony_ci#define IGC_RX_WTHRESH			4
3638c2ecf20Sopenharmony_ci#define IGC_TX_WTHRESH			16
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci#define IGC_RX_DMA_ATTR \
3668c2ecf20Sopenharmony_ci	(DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING)
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci#define IGC_TS_HDR_LEN			16
3698c2ecf20Sopenharmony_ci
3708c2ecf20Sopenharmony_ci#define IGC_SKB_PAD			(NET_SKB_PAD + NET_IP_ALIGN)
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ci#if (PAGE_SIZE < 8192)
3738c2ecf20Sopenharmony_ci#define IGC_MAX_FRAME_BUILD_SKB \
3748c2ecf20Sopenharmony_ci	(SKB_WITH_OVERHEAD(IGC_RXBUFFER_2048) - IGC_SKB_PAD - IGC_TS_HDR_LEN)
3758c2ecf20Sopenharmony_ci#else
3768c2ecf20Sopenharmony_ci#define IGC_MAX_FRAME_BUILD_SKB (IGC_RXBUFFER_2048 - IGC_TS_HDR_LEN)
3778c2ecf20Sopenharmony_ci#endif
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ci/* How many Rx Buffers do we bundle into one write to the hardware ? */
3808c2ecf20Sopenharmony_ci#define IGC_RX_BUFFER_WRITE	16 /* Must be power of 2 */
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci/* VLAN info */
3838c2ecf20Sopenharmony_ci#define IGC_TX_FLAGS_VLAN_MASK	0xffff0000
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_ci/* igc_test_staterr - tests bits within Rx descriptor status and error fields */
3868c2ecf20Sopenharmony_cistatic inline __le32 igc_test_staterr(union igc_adv_rx_desc *rx_desc,
3878c2ecf20Sopenharmony_ci				      const u32 stat_err_bits)
3888c2ecf20Sopenharmony_ci{
3898c2ecf20Sopenharmony_ci	return rx_desc->wb.upper.status_error & cpu_to_le32(stat_err_bits);
3908c2ecf20Sopenharmony_ci}
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_cienum igc_state_t {
3938c2ecf20Sopenharmony_ci	__IGC_TESTING,
3948c2ecf20Sopenharmony_ci	__IGC_RESETTING,
3958c2ecf20Sopenharmony_ci	__IGC_DOWN,
3968c2ecf20Sopenharmony_ci};
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_cienum igc_tx_flags {
3998c2ecf20Sopenharmony_ci	/* cmd_type flags */
4008c2ecf20Sopenharmony_ci	IGC_TX_FLAGS_VLAN	= 0x01,
4018c2ecf20Sopenharmony_ci	IGC_TX_FLAGS_TSO	= 0x02,
4028c2ecf20Sopenharmony_ci	IGC_TX_FLAGS_TSTAMP	= 0x04,
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ci	/* olinfo flags */
4058c2ecf20Sopenharmony_ci	IGC_TX_FLAGS_IPV4	= 0x10,
4068c2ecf20Sopenharmony_ci	IGC_TX_FLAGS_CSUM	= 0x20,
4078c2ecf20Sopenharmony_ci};
4088c2ecf20Sopenharmony_ci
4098c2ecf20Sopenharmony_cienum igc_boards {
4108c2ecf20Sopenharmony_ci	board_base,
4118c2ecf20Sopenharmony_ci};
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci/* The largest size we can write to the descriptor is 65535.  In order to
4148c2ecf20Sopenharmony_ci * maintain a power of two alignment we have to limit ourselves to 32K.
4158c2ecf20Sopenharmony_ci */
4168c2ecf20Sopenharmony_ci#define IGC_MAX_TXD_PWR		15
4178c2ecf20Sopenharmony_ci#define IGC_MAX_DATA_PER_TXD	BIT(IGC_MAX_TXD_PWR)
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci/* Tx Descriptors needed, worst case */
4208c2ecf20Sopenharmony_ci#define TXD_USE_COUNT(S)	DIV_ROUND_UP((S), IGC_MAX_DATA_PER_TXD)
4218c2ecf20Sopenharmony_ci#define DESC_NEEDED	(MAX_SKB_FRAGS + 4)
4228c2ecf20Sopenharmony_ci
4238c2ecf20Sopenharmony_ci/* wrapper around a pointer to a socket buffer,
4248c2ecf20Sopenharmony_ci * so a DMA handle can be stored along with the buffer
4258c2ecf20Sopenharmony_ci */
4268c2ecf20Sopenharmony_cistruct igc_tx_buffer {
4278c2ecf20Sopenharmony_ci	union igc_adv_tx_desc *next_to_watch;
4288c2ecf20Sopenharmony_ci	unsigned long time_stamp;
4298c2ecf20Sopenharmony_ci	struct sk_buff *skb;
4308c2ecf20Sopenharmony_ci	unsigned int bytecount;
4318c2ecf20Sopenharmony_ci	u16 gso_segs;
4328c2ecf20Sopenharmony_ci	__be16 protocol;
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	DEFINE_DMA_UNMAP_ADDR(dma);
4358c2ecf20Sopenharmony_ci	DEFINE_DMA_UNMAP_LEN(len);
4368c2ecf20Sopenharmony_ci	u32 tx_flags;
4378c2ecf20Sopenharmony_ci};
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_cistruct igc_rx_buffer {
4408c2ecf20Sopenharmony_ci	dma_addr_t dma;
4418c2ecf20Sopenharmony_ci	struct page *page;
4428c2ecf20Sopenharmony_ci#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
4438c2ecf20Sopenharmony_ci	__u32 page_offset;
4448c2ecf20Sopenharmony_ci#else
4458c2ecf20Sopenharmony_ci	__u16 page_offset;
4468c2ecf20Sopenharmony_ci#endif
4478c2ecf20Sopenharmony_ci	__u16 pagecnt_bias;
4488c2ecf20Sopenharmony_ci};
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_cistruct igc_q_vector {
4518c2ecf20Sopenharmony_ci	struct igc_adapter *adapter;    /* backlink */
4528c2ecf20Sopenharmony_ci	void __iomem *itr_register;
4538c2ecf20Sopenharmony_ci	u32 eims_value;                 /* EIMS mask value */
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ci	u16 itr_val;
4568c2ecf20Sopenharmony_ci	u8 set_itr;
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	struct igc_ring_container rx, tx;
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci	struct napi_struct napi;
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci	struct rcu_head rcu;    /* to avoid race with update stats on free */
4638c2ecf20Sopenharmony_ci	char name[IFNAMSIZ + 9];
4648c2ecf20Sopenharmony_ci	struct net_device poll_dev;
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_ci	/* for dynamic allocation of rings associated with this q_vector */
4678c2ecf20Sopenharmony_ci	struct igc_ring ring[] ____cacheline_internodealigned_in_smp;
4688c2ecf20Sopenharmony_ci};
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_cienum igc_filter_match_flags {
4718c2ecf20Sopenharmony_ci	IGC_FILTER_FLAG_ETHER_TYPE =	0x1,
4728c2ecf20Sopenharmony_ci	IGC_FILTER_FLAG_VLAN_TCI   =	0x2,
4738c2ecf20Sopenharmony_ci	IGC_FILTER_FLAG_SRC_MAC_ADDR =	0x4,
4748c2ecf20Sopenharmony_ci	IGC_FILTER_FLAG_DST_MAC_ADDR =	0x8,
4758c2ecf20Sopenharmony_ci};
4768c2ecf20Sopenharmony_ci
4778c2ecf20Sopenharmony_cistruct igc_nfc_filter {
4788c2ecf20Sopenharmony_ci	u8 match_flags;
4798c2ecf20Sopenharmony_ci	u16 etype;
4808c2ecf20Sopenharmony_ci	u16 vlan_tci;
4818c2ecf20Sopenharmony_ci	u8 src_addr[ETH_ALEN];
4828c2ecf20Sopenharmony_ci	u8 dst_addr[ETH_ALEN];
4838c2ecf20Sopenharmony_ci};
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_cistruct igc_nfc_rule {
4868c2ecf20Sopenharmony_ci	struct list_head list;
4878c2ecf20Sopenharmony_ci	struct igc_nfc_filter filter;
4888c2ecf20Sopenharmony_ci	u32 location;
4898c2ecf20Sopenharmony_ci	u16 action;
4908c2ecf20Sopenharmony_ci};
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci/* IGC supports a total of 32 NFC rules: 16 MAC address based,, 8 VLAN priority
4938c2ecf20Sopenharmony_ci * based, and 8 ethertype based.
4948c2ecf20Sopenharmony_ci */
4958c2ecf20Sopenharmony_ci#define IGC_MAX_RXNFC_RULES		32
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci/* igc_desc_unused - calculate if we have unused descriptors */
4988c2ecf20Sopenharmony_cistatic inline u16 igc_desc_unused(const struct igc_ring *ring)
4998c2ecf20Sopenharmony_ci{
5008c2ecf20Sopenharmony_ci	u16 ntc = ring->next_to_clean;
5018c2ecf20Sopenharmony_ci	u16 ntu = ring->next_to_use;
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_ci	return ((ntc > ntu) ? 0 : ring->count) + ntc - ntu - 1;
5048c2ecf20Sopenharmony_ci}
5058c2ecf20Sopenharmony_ci
5068c2ecf20Sopenharmony_cistatic inline s32 igc_get_phy_info(struct igc_hw *hw)
5078c2ecf20Sopenharmony_ci{
5088c2ecf20Sopenharmony_ci	if (hw->phy.ops.get_phy_info)
5098c2ecf20Sopenharmony_ci		return hw->phy.ops.get_phy_info(hw);
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_ci	return 0;
5128c2ecf20Sopenharmony_ci}
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_cistatic inline s32 igc_reset_phy(struct igc_hw *hw)
5158c2ecf20Sopenharmony_ci{
5168c2ecf20Sopenharmony_ci	if (hw->phy.ops.reset)
5178c2ecf20Sopenharmony_ci		return hw->phy.ops.reset(hw);
5188c2ecf20Sopenharmony_ci
5198c2ecf20Sopenharmony_ci	return 0;
5208c2ecf20Sopenharmony_ci}
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_cistatic inline struct netdev_queue *txring_txq(const struct igc_ring *tx_ring)
5238c2ecf20Sopenharmony_ci{
5248c2ecf20Sopenharmony_ci	return netdev_get_tx_queue(tx_ring->netdev, tx_ring->queue_index);
5258c2ecf20Sopenharmony_ci}
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_cienum igc_ring_flags_t {
5288c2ecf20Sopenharmony_ci	IGC_RING_FLAG_RX_3K_BUFFER,
5298c2ecf20Sopenharmony_ci	IGC_RING_FLAG_RX_BUILD_SKB_ENABLED,
5308c2ecf20Sopenharmony_ci	IGC_RING_FLAG_RX_SCTP_CSUM,
5318c2ecf20Sopenharmony_ci	IGC_RING_FLAG_RX_LB_VLAN_BSWAP,
5328c2ecf20Sopenharmony_ci	IGC_RING_FLAG_TX_CTX_IDX,
5338c2ecf20Sopenharmony_ci	IGC_RING_FLAG_TX_DETECT_HANG
5348c2ecf20Sopenharmony_ci};
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci#define ring_uses_large_buffer(ring) \
5378c2ecf20Sopenharmony_ci	test_bit(IGC_RING_FLAG_RX_3K_BUFFER, &(ring)->flags)
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci#define ring_uses_build_skb(ring) \
5408c2ecf20Sopenharmony_ci	test_bit(IGC_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags)
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_cistatic inline unsigned int igc_rx_bufsz(struct igc_ring *ring)
5438c2ecf20Sopenharmony_ci{
5448c2ecf20Sopenharmony_ci#if (PAGE_SIZE < 8192)
5458c2ecf20Sopenharmony_ci	if (ring_uses_large_buffer(ring))
5468c2ecf20Sopenharmony_ci		return IGC_RXBUFFER_3072;
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci	if (ring_uses_build_skb(ring))
5498c2ecf20Sopenharmony_ci		return IGC_MAX_FRAME_BUILD_SKB + IGC_TS_HDR_LEN;
5508c2ecf20Sopenharmony_ci#endif
5518c2ecf20Sopenharmony_ci	return IGC_RXBUFFER_2048;
5528c2ecf20Sopenharmony_ci}
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_cistatic inline unsigned int igc_rx_pg_order(struct igc_ring *ring)
5558c2ecf20Sopenharmony_ci{
5568c2ecf20Sopenharmony_ci#if (PAGE_SIZE < 8192)
5578c2ecf20Sopenharmony_ci	if (ring_uses_large_buffer(ring))
5588c2ecf20Sopenharmony_ci		return 1;
5598c2ecf20Sopenharmony_ci#endif
5608c2ecf20Sopenharmony_ci	return 0;
5618c2ecf20Sopenharmony_ci}
5628c2ecf20Sopenharmony_ci
5638c2ecf20Sopenharmony_cistatic inline s32 igc_read_phy_reg(struct igc_hw *hw, u32 offset, u16 *data)
5648c2ecf20Sopenharmony_ci{
5658c2ecf20Sopenharmony_ci	if (hw->phy.ops.read_reg)
5668c2ecf20Sopenharmony_ci		return hw->phy.ops.read_reg(hw, offset, data);
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	return -EOPNOTSUPP;
5698c2ecf20Sopenharmony_ci}
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_civoid igc_reinit_locked(struct igc_adapter *);
5728c2ecf20Sopenharmony_cistruct igc_nfc_rule *igc_get_nfc_rule(struct igc_adapter *adapter,
5738c2ecf20Sopenharmony_ci				      u32 location);
5748c2ecf20Sopenharmony_ciint igc_add_nfc_rule(struct igc_adapter *adapter, struct igc_nfc_rule *rule);
5758c2ecf20Sopenharmony_civoid igc_del_nfc_rule(struct igc_adapter *adapter, struct igc_nfc_rule *rule);
5768c2ecf20Sopenharmony_ci
5778c2ecf20Sopenharmony_civoid igc_ptp_init(struct igc_adapter *adapter);
5788c2ecf20Sopenharmony_civoid igc_ptp_reset(struct igc_adapter *adapter);
5798c2ecf20Sopenharmony_civoid igc_ptp_suspend(struct igc_adapter *adapter);
5808c2ecf20Sopenharmony_civoid igc_ptp_stop(struct igc_adapter *adapter);
5818c2ecf20Sopenharmony_civoid igc_ptp_rx_pktstamp(struct igc_q_vector *q_vector, __le32 *va,
5828c2ecf20Sopenharmony_ci			 struct sk_buff *skb);
5838c2ecf20Sopenharmony_ciint igc_ptp_set_ts_config(struct net_device *netdev, struct ifreq *ifr);
5848c2ecf20Sopenharmony_ciint igc_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr);
5858c2ecf20Sopenharmony_civoid igc_ptp_tx_hang(struct igc_adapter *adapter);
5868c2ecf20Sopenharmony_civoid igc_ptp_read(struct igc_adapter *adapter, struct timespec64 *ts);
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci#define igc_rx_pg_size(_ring) (PAGE_SIZE << igc_rx_pg_order(_ring))
5898c2ecf20Sopenharmony_ci
5908c2ecf20Sopenharmony_ci#define IGC_TXD_DCMD	(IGC_ADVTXD_DCMD_EOP | IGC_ADVTXD_DCMD_RS)
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_ci#define IGC_RX_DESC(R, i)       \
5938c2ecf20Sopenharmony_ci	(&(((union igc_adv_rx_desc *)((R)->desc))[i]))
5948c2ecf20Sopenharmony_ci#define IGC_TX_DESC(R, i)       \
5958c2ecf20Sopenharmony_ci	(&(((union igc_adv_tx_desc *)((R)->desc))[i]))
5968c2ecf20Sopenharmony_ci#define IGC_TX_CTXTDESC(R, i)   \
5978c2ecf20Sopenharmony_ci	(&(((struct igc_adv_tx_context_desc *)((R)->desc))[i]))
5988c2ecf20Sopenharmony_ci
5998c2ecf20Sopenharmony_ci#endif /* _IGC_H_ */
600