162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright(c) 2007 - 2018 Intel Corporation. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci/* Linux PRO/1000 Ethernet Driver main header file */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _IGB_H_ 762306a36Sopenharmony_ci#define _IGB_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "e1000_mac.h" 1062306a36Sopenharmony_ci#include "e1000_82575.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/timecounter.h> 1362306a36Sopenharmony_ci#include <linux/net_tstamp.h> 1462306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h> 1562306a36Sopenharmony_ci#include <linux/bitops.h> 1662306a36Sopenharmony_ci#include <linux/if_vlan.h> 1762306a36Sopenharmony_ci#include <linux/i2c.h> 1862306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 1962306a36Sopenharmony_ci#include <linux/pci.h> 2062306a36Sopenharmony_ci#include <linux/mdio.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <net/xdp.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct igb_adapter; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define E1000_PCS_CFG_IGN_SD 1 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Interrupt defines */ 2962306a36Sopenharmony_ci#define IGB_START_ITR 648 /* ~6000 ints/sec */ 3062306a36Sopenharmony_ci#define IGB_4K_ITR 980 3162306a36Sopenharmony_ci#define IGB_20K_ITR 196 3262306a36Sopenharmony_ci#define IGB_70K_ITR 56 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* TX/RX descriptor defines */ 3562306a36Sopenharmony_ci#define IGB_DEFAULT_TXD 256 3662306a36Sopenharmony_ci#define IGB_DEFAULT_TX_WORK 128 3762306a36Sopenharmony_ci#define IGB_MIN_TXD 64 3862306a36Sopenharmony_ci#define IGB_MAX_TXD 4096 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define IGB_DEFAULT_RXD 256 4162306a36Sopenharmony_ci#define IGB_MIN_RXD 64 4262306a36Sopenharmony_ci#define IGB_MAX_RXD 4096 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define IGB_DEFAULT_ITR 3 /* dynamic */ 4562306a36Sopenharmony_ci#define IGB_MAX_ITR_USECS 10000 4662306a36Sopenharmony_ci#define IGB_MIN_ITR_USECS 10 4762306a36Sopenharmony_ci#define NON_Q_VECTORS 1 4862306a36Sopenharmony_ci#define MAX_Q_VECTORS 8 4962306a36Sopenharmony_ci#define MAX_MSIX_ENTRIES 10 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* Transmit and receive queues */ 5262306a36Sopenharmony_ci#define IGB_MAX_RX_QUEUES 8 5362306a36Sopenharmony_ci#define IGB_MAX_RX_QUEUES_82575 4 5462306a36Sopenharmony_ci#define IGB_MAX_RX_QUEUES_I211 2 5562306a36Sopenharmony_ci#define IGB_MAX_TX_QUEUES 8 5662306a36Sopenharmony_ci#define IGB_MAX_VF_MC_ENTRIES 30 5762306a36Sopenharmony_ci#define IGB_MAX_VF_FUNCTIONS 8 5862306a36Sopenharmony_ci#define IGB_MAX_VFTA_ENTRIES 128 5962306a36Sopenharmony_ci#define IGB_82576_VF_DEV_ID 0x10CA 6062306a36Sopenharmony_ci#define IGB_I350_VF_DEV_ID 0x1520 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* NVM version defines */ 6362306a36Sopenharmony_ci#define IGB_MAJOR_MASK 0xF000 6462306a36Sopenharmony_ci#define IGB_MINOR_MASK 0x0FF0 6562306a36Sopenharmony_ci#define IGB_BUILD_MASK 0x000F 6662306a36Sopenharmony_ci#define IGB_COMB_VER_MASK 0x00FF 6762306a36Sopenharmony_ci#define IGB_MAJOR_SHIFT 12 6862306a36Sopenharmony_ci#define IGB_MINOR_SHIFT 4 6962306a36Sopenharmony_ci#define IGB_COMB_VER_SHFT 8 7062306a36Sopenharmony_ci#define IGB_NVM_VER_INVALID 0xFFFF 7162306a36Sopenharmony_ci#define IGB_ETRACK_SHIFT 16 7262306a36Sopenharmony_ci#define NVM_ETRACK_WORD 0x0042 7362306a36Sopenharmony_ci#define NVM_COMB_VER_OFF 0x0083 7462306a36Sopenharmony_ci#define NVM_COMB_VER_PTR 0x003d 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* Transmit and receive latency (for PTP timestamps) */ 7762306a36Sopenharmony_ci#define IGB_I210_TX_LATENCY_10 9542 7862306a36Sopenharmony_ci#define IGB_I210_TX_LATENCY_100 1024 7962306a36Sopenharmony_ci#define IGB_I210_TX_LATENCY_1000 178 8062306a36Sopenharmony_ci#define IGB_I210_RX_LATENCY_10 20662 8162306a36Sopenharmony_ci#define IGB_I210_RX_LATENCY_100 2213 8262306a36Sopenharmony_ci#define IGB_I210_RX_LATENCY_1000 448 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* XDP */ 8562306a36Sopenharmony_ci#define IGB_XDP_PASS 0 8662306a36Sopenharmony_ci#define IGB_XDP_CONSUMED BIT(0) 8762306a36Sopenharmony_ci#define IGB_XDP_TX BIT(1) 8862306a36Sopenharmony_ci#define IGB_XDP_REDIR BIT(2) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct vf_data_storage { 9162306a36Sopenharmony_ci unsigned char vf_mac_addresses[ETH_ALEN]; 9262306a36Sopenharmony_ci u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES]; 9362306a36Sopenharmony_ci u16 num_vf_mc_hashes; 9462306a36Sopenharmony_ci u32 flags; 9562306a36Sopenharmony_ci unsigned long last_nack; 9662306a36Sopenharmony_ci u16 pf_vlan; /* When set, guest VLAN config not allowed. */ 9762306a36Sopenharmony_ci u16 pf_qos; 9862306a36Sopenharmony_ci u16 tx_rate; 9962306a36Sopenharmony_ci bool spoofchk_enabled; 10062306a36Sopenharmony_ci bool trusted; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* Number of unicast MAC filters reserved for the PF in the RAR registers */ 10462306a36Sopenharmony_ci#define IGB_PF_MAC_FILTERS_RESERVED 3 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistruct vf_mac_filter { 10762306a36Sopenharmony_ci struct list_head l; 10862306a36Sopenharmony_ci int vf; 10962306a36Sopenharmony_ci bool free; 11062306a36Sopenharmony_ci u8 vf_mac[ETH_ALEN]; 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define IGB_VF_FLAG_CTS 0x00000001 /* VF is clear to send data */ 11462306a36Sopenharmony_ci#define IGB_VF_FLAG_UNI_PROMISC 0x00000002 /* VF has unicast promisc */ 11562306a36Sopenharmony_ci#define IGB_VF_FLAG_MULTI_PROMISC 0x00000004 /* VF has multicast promisc */ 11662306a36Sopenharmony_ci#define IGB_VF_FLAG_PF_SET_MAC 0x00000008 /* PF has set MAC address */ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* RX descriptor control thresholds. 11962306a36Sopenharmony_ci * PTHRESH - MAC will consider prefetch if it has fewer than this number of 12062306a36Sopenharmony_ci * descriptors available in its onboard memory. 12162306a36Sopenharmony_ci * Setting this to 0 disables RX descriptor prefetch. 12262306a36Sopenharmony_ci * HTHRESH - MAC will only prefetch if there are at least this many descriptors 12362306a36Sopenharmony_ci * available in host memory. 12462306a36Sopenharmony_ci * If PTHRESH is 0, this should also be 0. 12562306a36Sopenharmony_ci * WTHRESH - RX descriptor writeback threshold - MAC will delay writing back 12662306a36Sopenharmony_ci * descriptors until either it has this many to write back, or the 12762306a36Sopenharmony_ci * ITR timer expires. 12862306a36Sopenharmony_ci */ 12962306a36Sopenharmony_ci#define IGB_RX_PTHRESH ((hw->mac.type == e1000_i354) ? 12 : 8) 13062306a36Sopenharmony_ci#define IGB_RX_HTHRESH 8 13162306a36Sopenharmony_ci#define IGB_TX_PTHRESH ((hw->mac.type == e1000_i354) ? 20 : 8) 13262306a36Sopenharmony_ci#define IGB_TX_HTHRESH 1 13362306a36Sopenharmony_ci#define IGB_RX_WTHRESH ((hw->mac.type == e1000_82576 && \ 13462306a36Sopenharmony_ci (adapter->flags & IGB_FLAG_HAS_MSIX)) ? 1 : 4) 13562306a36Sopenharmony_ci#define IGB_TX_WTHRESH ((hw->mac.type == e1000_82576 && \ 13662306a36Sopenharmony_ci (adapter->flags & IGB_FLAG_HAS_MSIX)) ? 1 : 16) 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* this is the size past which hardware will drop packets when setting LPE=0 */ 13962306a36Sopenharmony_ci#define MAXIMUM_ETHERNET_VLAN_SIZE 1522 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define IGB_ETH_PKT_HDR_PAD (ETH_HLEN + ETH_FCS_LEN + (VLAN_HLEN * 2)) 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/* Supported Rx Buffer Sizes */ 14462306a36Sopenharmony_ci#define IGB_RXBUFFER_256 256 14562306a36Sopenharmony_ci#define IGB_RXBUFFER_1536 1536 14662306a36Sopenharmony_ci#define IGB_RXBUFFER_2048 2048 14762306a36Sopenharmony_ci#define IGB_RXBUFFER_3072 3072 14862306a36Sopenharmony_ci#define IGB_RX_HDR_LEN IGB_RXBUFFER_256 14962306a36Sopenharmony_ci#define IGB_TS_HDR_LEN 16 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* Attempt to maximize the headroom available for incoming frames. We 15262306a36Sopenharmony_ci * use a 2K buffer for receives and need 1536/1534 to store the data for 15362306a36Sopenharmony_ci * the frame. This leaves us with 512 bytes of room. From that we need 15462306a36Sopenharmony_ci * to deduct the space needed for the shared info and the padding needed 15562306a36Sopenharmony_ci * to IP align the frame. 15662306a36Sopenharmony_ci * 15762306a36Sopenharmony_ci * Note: For cache line sizes 256 or larger this value is going to end 15862306a36Sopenharmony_ci * up negative. In these cases we should fall back to the 3K 15962306a36Sopenharmony_ci * buffers. 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_ci#if (PAGE_SIZE < 8192) 16262306a36Sopenharmony_ci#define IGB_MAX_FRAME_BUILD_SKB (IGB_RXBUFFER_1536 - NET_IP_ALIGN) 16362306a36Sopenharmony_ci#define IGB_2K_TOO_SMALL_WITH_PADDING \ 16462306a36Sopenharmony_ci((NET_SKB_PAD + IGB_TS_HDR_LEN + IGB_RXBUFFER_1536) > SKB_WITH_OVERHEAD(IGB_RXBUFFER_2048)) 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistatic inline int igb_compute_pad(int rx_buf_len) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci int page_size, pad_size; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci page_size = ALIGN(rx_buf_len, PAGE_SIZE / 2); 17162306a36Sopenharmony_ci pad_size = SKB_WITH_OVERHEAD(page_size) - rx_buf_len; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci return pad_size; 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistatic inline int igb_skb_pad(void) 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci int rx_buf_len; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* If a 2K buffer cannot handle a standard Ethernet frame then 18162306a36Sopenharmony_ci * optimize padding for a 3K buffer instead of a 1.5K buffer. 18262306a36Sopenharmony_ci * 18362306a36Sopenharmony_ci * For a 3K buffer we need to add enough padding to allow for 18462306a36Sopenharmony_ci * tailroom due to NET_IP_ALIGN possibly shifting us out of 18562306a36Sopenharmony_ci * cache-line alignment. 18662306a36Sopenharmony_ci */ 18762306a36Sopenharmony_ci if (IGB_2K_TOO_SMALL_WITH_PADDING) 18862306a36Sopenharmony_ci rx_buf_len = IGB_RXBUFFER_3072 + SKB_DATA_ALIGN(NET_IP_ALIGN); 18962306a36Sopenharmony_ci else 19062306a36Sopenharmony_ci rx_buf_len = IGB_RXBUFFER_1536; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci /* if needed make room for NET_IP_ALIGN */ 19362306a36Sopenharmony_ci rx_buf_len -= NET_IP_ALIGN; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci return igb_compute_pad(rx_buf_len); 19662306a36Sopenharmony_ci} 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#define IGB_SKB_PAD igb_skb_pad() 19962306a36Sopenharmony_ci#else 20062306a36Sopenharmony_ci#define IGB_SKB_PAD (NET_SKB_PAD + NET_IP_ALIGN) 20162306a36Sopenharmony_ci#endif 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci/* How many Rx Buffers do we bundle into one write to the hardware ? */ 20462306a36Sopenharmony_ci#define IGB_RX_BUFFER_WRITE 16 /* Must be power of 2 */ 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci#define IGB_RX_DMA_ATTR \ 20762306a36Sopenharmony_ci (DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING) 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci#define AUTO_ALL_MODES 0 21062306a36Sopenharmony_ci#define IGB_EEPROM_APME 0x0400 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci#ifndef IGB_MASTER_SLAVE 21362306a36Sopenharmony_ci/* Switch to override PHY master/slave setting */ 21462306a36Sopenharmony_ci#define IGB_MASTER_SLAVE e1000_ms_hw_default 21562306a36Sopenharmony_ci#endif 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci#define IGB_MNG_VLAN_NONE -1 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cienum igb_tx_flags { 22062306a36Sopenharmony_ci /* cmd_type flags */ 22162306a36Sopenharmony_ci IGB_TX_FLAGS_VLAN = 0x01, 22262306a36Sopenharmony_ci IGB_TX_FLAGS_TSO = 0x02, 22362306a36Sopenharmony_ci IGB_TX_FLAGS_TSTAMP = 0x04, 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci /* olinfo flags */ 22662306a36Sopenharmony_ci IGB_TX_FLAGS_IPV4 = 0x10, 22762306a36Sopenharmony_ci IGB_TX_FLAGS_CSUM = 0x20, 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci/* VLAN info */ 23162306a36Sopenharmony_ci#define IGB_TX_FLAGS_VLAN_MASK 0xffff0000 23262306a36Sopenharmony_ci#define IGB_TX_FLAGS_VLAN_SHIFT 16 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/* The largest size we can write to the descriptor is 65535. In order to 23562306a36Sopenharmony_ci * maintain a power of two alignment we have to limit ourselves to 32K. 23662306a36Sopenharmony_ci */ 23762306a36Sopenharmony_ci#define IGB_MAX_TXD_PWR 15 23862306a36Sopenharmony_ci#define IGB_MAX_DATA_PER_TXD (1u << IGB_MAX_TXD_PWR) 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/* Tx Descriptors needed, worst case */ 24162306a36Sopenharmony_ci#define TXD_USE_COUNT(S) DIV_ROUND_UP((S), IGB_MAX_DATA_PER_TXD) 24262306a36Sopenharmony_ci#define DESC_NEEDED (MAX_SKB_FRAGS + 4) 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci/* EEPROM byte offsets */ 24562306a36Sopenharmony_ci#define IGB_SFF_8472_SWAP 0x5C 24662306a36Sopenharmony_ci#define IGB_SFF_8472_COMP 0x5E 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci/* Bitmasks */ 24962306a36Sopenharmony_ci#define IGB_SFF_ADDRESSING_MODE 0x4 25062306a36Sopenharmony_ci#define IGB_SFF_8472_UNSUP 0x00 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci/* TX resources are shared between XDP and netstack 25362306a36Sopenharmony_ci * and we need to tag the buffer type to distinguish them 25462306a36Sopenharmony_ci */ 25562306a36Sopenharmony_cienum igb_tx_buf_type { 25662306a36Sopenharmony_ci IGB_TYPE_SKB = 0, 25762306a36Sopenharmony_ci IGB_TYPE_XDP, 25862306a36Sopenharmony_ci}; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci/* wrapper around a pointer to a socket buffer, 26162306a36Sopenharmony_ci * so a DMA handle can be stored along with the buffer 26262306a36Sopenharmony_ci */ 26362306a36Sopenharmony_cistruct igb_tx_buffer { 26462306a36Sopenharmony_ci union e1000_adv_tx_desc *next_to_watch; 26562306a36Sopenharmony_ci unsigned long time_stamp; 26662306a36Sopenharmony_ci enum igb_tx_buf_type type; 26762306a36Sopenharmony_ci union { 26862306a36Sopenharmony_ci struct sk_buff *skb; 26962306a36Sopenharmony_ci struct xdp_frame *xdpf; 27062306a36Sopenharmony_ci }; 27162306a36Sopenharmony_ci unsigned int bytecount; 27262306a36Sopenharmony_ci u16 gso_segs; 27362306a36Sopenharmony_ci __be16 protocol; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci DEFINE_DMA_UNMAP_ADDR(dma); 27662306a36Sopenharmony_ci DEFINE_DMA_UNMAP_LEN(len); 27762306a36Sopenharmony_ci u32 tx_flags; 27862306a36Sopenharmony_ci}; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cistruct igb_rx_buffer { 28162306a36Sopenharmony_ci dma_addr_t dma; 28262306a36Sopenharmony_ci struct page *page; 28362306a36Sopenharmony_ci#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536) 28462306a36Sopenharmony_ci __u32 page_offset; 28562306a36Sopenharmony_ci#else 28662306a36Sopenharmony_ci __u16 page_offset; 28762306a36Sopenharmony_ci#endif 28862306a36Sopenharmony_ci __u16 pagecnt_bias; 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistruct igb_tx_queue_stats { 29262306a36Sopenharmony_ci u64 packets; 29362306a36Sopenharmony_ci u64 bytes; 29462306a36Sopenharmony_ci u64 restart_queue; 29562306a36Sopenharmony_ci u64 restart_queue2; 29662306a36Sopenharmony_ci}; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistruct igb_rx_queue_stats { 29962306a36Sopenharmony_ci u64 packets; 30062306a36Sopenharmony_ci u64 bytes; 30162306a36Sopenharmony_ci u64 drops; 30262306a36Sopenharmony_ci u64 csum_err; 30362306a36Sopenharmony_ci u64 alloc_failed; 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cistruct igb_ring_container { 30762306a36Sopenharmony_ci struct igb_ring *ring; /* pointer to linked list of rings */ 30862306a36Sopenharmony_ci unsigned int total_bytes; /* total bytes processed this int */ 30962306a36Sopenharmony_ci unsigned int total_packets; /* total packets processed this int */ 31062306a36Sopenharmony_ci u16 work_limit; /* total work allowed per interrupt */ 31162306a36Sopenharmony_ci u8 count; /* total number of rings in vector */ 31262306a36Sopenharmony_ci u8 itr; /* current ITR setting for ring */ 31362306a36Sopenharmony_ci}; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistruct igb_ring { 31662306a36Sopenharmony_ci struct igb_q_vector *q_vector; /* backlink to q_vector */ 31762306a36Sopenharmony_ci struct net_device *netdev; /* back pointer to net_device */ 31862306a36Sopenharmony_ci struct bpf_prog *xdp_prog; 31962306a36Sopenharmony_ci struct device *dev; /* device pointer for dma mapping */ 32062306a36Sopenharmony_ci union { /* array of buffer info structs */ 32162306a36Sopenharmony_ci struct igb_tx_buffer *tx_buffer_info; 32262306a36Sopenharmony_ci struct igb_rx_buffer *rx_buffer_info; 32362306a36Sopenharmony_ci }; 32462306a36Sopenharmony_ci void *desc; /* descriptor ring memory */ 32562306a36Sopenharmony_ci unsigned long flags; /* ring specific flags */ 32662306a36Sopenharmony_ci void __iomem *tail; /* pointer to ring tail register */ 32762306a36Sopenharmony_ci dma_addr_t dma; /* phys address of the ring */ 32862306a36Sopenharmony_ci unsigned int size; /* length of desc. ring in bytes */ 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci u16 count; /* number of desc. in the ring */ 33162306a36Sopenharmony_ci u8 queue_index; /* logical index of the ring*/ 33262306a36Sopenharmony_ci u8 reg_idx; /* physical index of the ring */ 33362306a36Sopenharmony_ci bool launchtime_enable; /* true if LaunchTime is enabled */ 33462306a36Sopenharmony_ci bool cbs_enable; /* indicates if CBS is enabled */ 33562306a36Sopenharmony_ci s32 idleslope; /* idleSlope in kbps */ 33662306a36Sopenharmony_ci s32 sendslope; /* sendSlope in kbps */ 33762306a36Sopenharmony_ci s32 hicredit; /* hiCredit in bytes */ 33862306a36Sopenharmony_ci s32 locredit; /* loCredit in bytes */ 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci /* everything past this point are written often */ 34162306a36Sopenharmony_ci u16 next_to_clean; 34262306a36Sopenharmony_ci u16 next_to_use; 34362306a36Sopenharmony_ci u16 next_to_alloc; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci union { 34662306a36Sopenharmony_ci /* TX */ 34762306a36Sopenharmony_ci struct { 34862306a36Sopenharmony_ci struct igb_tx_queue_stats tx_stats; 34962306a36Sopenharmony_ci struct u64_stats_sync tx_syncp; 35062306a36Sopenharmony_ci struct u64_stats_sync tx_syncp2; 35162306a36Sopenharmony_ci }; 35262306a36Sopenharmony_ci /* RX */ 35362306a36Sopenharmony_ci struct { 35462306a36Sopenharmony_ci struct sk_buff *skb; 35562306a36Sopenharmony_ci struct igb_rx_queue_stats rx_stats; 35662306a36Sopenharmony_ci struct u64_stats_sync rx_syncp; 35762306a36Sopenharmony_ci }; 35862306a36Sopenharmony_ci }; 35962306a36Sopenharmony_ci struct xdp_rxq_info xdp_rxq; 36062306a36Sopenharmony_ci} ____cacheline_internodealigned_in_smp; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistruct igb_q_vector { 36362306a36Sopenharmony_ci struct igb_adapter *adapter; /* backlink */ 36462306a36Sopenharmony_ci int cpu; /* CPU for DCA */ 36562306a36Sopenharmony_ci u32 eims_value; /* EIMS mask value */ 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci u16 itr_val; 36862306a36Sopenharmony_ci u8 set_itr; 36962306a36Sopenharmony_ci void __iomem *itr_register; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci struct igb_ring_container rx, tx; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci struct napi_struct napi; 37462306a36Sopenharmony_ci struct rcu_head rcu; /* to avoid race with update stats on free */ 37562306a36Sopenharmony_ci char name[IFNAMSIZ + 9]; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci /* for dynamic allocation of rings associated with this q_vector */ 37862306a36Sopenharmony_ci struct igb_ring ring[] ____cacheline_internodealigned_in_smp; 37962306a36Sopenharmony_ci}; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cienum e1000_ring_flags_t { 38262306a36Sopenharmony_ci IGB_RING_FLAG_RX_3K_BUFFER, 38362306a36Sopenharmony_ci IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, 38462306a36Sopenharmony_ci IGB_RING_FLAG_RX_SCTP_CSUM, 38562306a36Sopenharmony_ci IGB_RING_FLAG_RX_LB_VLAN_BSWAP, 38662306a36Sopenharmony_ci IGB_RING_FLAG_TX_CTX_IDX, 38762306a36Sopenharmony_ci IGB_RING_FLAG_TX_DETECT_HANG 38862306a36Sopenharmony_ci}; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci#define ring_uses_large_buffer(ring) \ 39162306a36Sopenharmony_ci test_bit(IGB_RING_FLAG_RX_3K_BUFFER, &(ring)->flags) 39262306a36Sopenharmony_ci#define set_ring_uses_large_buffer(ring) \ 39362306a36Sopenharmony_ci set_bit(IGB_RING_FLAG_RX_3K_BUFFER, &(ring)->flags) 39462306a36Sopenharmony_ci#define clear_ring_uses_large_buffer(ring) \ 39562306a36Sopenharmony_ci clear_bit(IGB_RING_FLAG_RX_3K_BUFFER, &(ring)->flags) 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci#define ring_uses_build_skb(ring) \ 39862306a36Sopenharmony_ci test_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags) 39962306a36Sopenharmony_ci#define set_ring_build_skb_enabled(ring) \ 40062306a36Sopenharmony_ci set_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags) 40162306a36Sopenharmony_ci#define clear_ring_build_skb_enabled(ring) \ 40262306a36Sopenharmony_ci clear_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags) 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistatic inline unsigned int igb_rx_bufsz(struct igb_ring *ring) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci#if (PAGE_SIZE < 8192) 40762306a36Sopenharmony_ci if (ring_uses_large_buffer(ring)) 40862306a36Sopenharmony_ci return IGB_RXBUFFER_3072; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci if (ring_uses_build_skb(ring)) 41162306a36Sopenharmony_ci return IGB_MAX_FRAME_BUILD_SKB; 41262306a36Sopenharmony_ci#endif 41362306a36Sopenharmony_ci return IGB_RXBUFFER_2048; 41462306a36Sopenharmony_ci} 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_cistatic inline unsigned int igb_rx_pg_order(struct igb_ring *ring) 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci#if (PAGE_SIZE < 8192) 41962306a36Sopenharmony_ci if (ring_uses_large_buffer(ring)) 42062306a36Sopenharmony_ci return 1; 42162306a36Sopenharmony_ci#endif 42262306a36Sopenharmony_ci return 0; 42362306a36Sopenharmony_ci} 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci#define igb_rx_pg_size(_ring) (PAGE_SIZE << igb_rx_pg_order(_ring)) 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci#define IGB_TXD_DCMD (E1000_ADVTXD_DCMD_EOP | E1000_ADVTXD_DCMD_RS) 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci#define IGB_RX_DESC(R, i) \ 43062306a36Sopenharmony_ci (&(((union e1000_adv_rx_desc *)((R)->desc))[i])) 43162306a36Sopenharmony_ci#define IGB_TX_DESC(R, i) \ 43262306a36Sopenharmony_ci (&(((union e1000_adv_tx_desc *)((R)->desc))[i])) 43362306a36Sopenharmony_ci#define IGB_TX_CTXTDESC(R, i) \ 43462306a36Sopenharmony_ci (&(((struct e1000_adv_tx_context_desc *)((R)->desc))[i])) 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci/* igb_test_staterr - tests bits within Rx descriptor status and error fields */ 43762306a36Sopenharmony_cistatic inline __le32 igb_test_staterr(union e1000_adv_rx_desc *rx_desc, 43862306a36Sopenharmony_ci const u32 stat_err_bits) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci return rx_desc->wb.upper.status_error & cpu_to_le32(stat_err_bits); 44162306a36Sopenharmony_ci} 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci/* igb_desc_unused - calculate if we have unused descriptors */ 44462306a36Sopenharmony_cistatic inline int igb_desc_unused(struct igb_ring *ring) 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci if (ring->next_to_clean > ring->next_to_use) 44762306a36Sopenharmony_ci return ring->next_to_clean - ring->next_to_use - 1; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci return ring->count + ring->next_to_clean - ring->next_to_use - 1; 45062306a36Sopenharmony_ci} 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci#ifdef CONFIG_IGB_HWMON 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci#define IGB_HWMON_TYPE_LOC 0 45562306a36Sopenharmony_ci#define IGB_HWMON_TYPE_TEMP 1 45662306a36Sopenharmony_ci#define IGB_HWMON_TYPE_CAUTION 2 45762306a36Sopenharmony_ci#define IGB_HWMON_TYPE_MAX 3 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistruct hwmon_attr { 46062306a36Sopenharmony_ci struct device_attribute dev_attr; 46162306a36Sopenharmony_ci struct e1000_hw *hw; 46262306a36Sopenharmony_ci struct e1000_thermal_diode_data *sensor; 46362306a36Sopenharmony_ci char name[12]; 46462306a36Sopenharmony_ci }; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistruct hwmon_buff { 46762306a36Sopenharmony_ci struct attribute_group group; 46862306a36Sopenharmony_ci const struct attribute_group *groups[2]; 46962306a36Sopenharmony_ci struct attribute *attrs[E1000_MAX_SENSORS * 4 + 1]; 47062306a36Sopenharmony_ci struct hwmon_attr hwmon_list[E1000_MAX_SENSORS * 4]; 47162306a36Sopenharmony_ci unsigned int n_hwmon; 47262306a36Sopenharmony_ci }; 47362306a36Sopenharmony_ci#endif 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci/* The number of L2 ether-type filter registers, Index 3 is reserved 47662306a36Sopenharmony_ci * for PTP 1588 timestamp 47762306a36Sopenharmony_ci */ 47862306a36Sopenharmony_ci#define MAX_ETYPE_FILTER (4 - 1) 47962306a36Sopenharmony_ci/* ETQF filter list: one static filter per filter consumer. This is 48062306a36Sopenharmony_ci * to avoid filter collisions later. Add new filters here!! 48162306a36Sopenharmony_ci * 48262306a36Sopenharmony_ci * Current filters: Filter 3 48362306a36Sopenharmony_ci */ 48462306a36Sopenharmony_ci#define IGB_ETQF_FILTER_1588 3 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci#define IGB_N_EXTTS 2 48762306a36Sopenharmony_ci#define IGB_N_PEROUT 2 48862306a36Sopenharmony_ci#define IGB_N_SDP 4 48962306a36Sopenharmony_ci#define IGB_RETA_SIZE 128 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cienum igb_filter_match_flags { 49262306a36Sopenharmony_ci IGB_FILTER_FLAG_ETHER_TYPE = 0x1, 49362306a36Sopenharmony_ci IGB_FILTER_FLAG_VLAN_TCI = 0x2, 49462306a36Sopenharmony_ci IGB_FILTER_FLAG_SRC_MAC_ADDR = 0x4, 49562306a36Sopenharmony_ci IGB_FILTER_FLAG_DST_MAC_ADDR = 0x8, 49662306a36Sopenharmony_ci}; 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci#define IGB_MAX_RXNFC_FILTERS 16 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci/* RX network flow classification data structure */ 50162306a36Sopenharmony_cistruct igb_nfc_input { 50262306a36Sopenharmony_ci /* Byte layout in order, all values with MSB first: 50362306a36Sopenharmony_ci * match_flags - 1 byte 50462306a36Sopenharmony_ci * etype - 2 bytes 50562306a36Sopenharmony_ci * vlan_tci - 2 bytes 50662306a36Sopenharmony_ci */ 50762306a36Sopenharmony_ci u8 match_flags; 50862306a36Sopenharmony_ci __be16 etype; 50962306a36Sopenharmony_ci __be16 vlan_tci; 51062306a36Sopenharmony_ci u8 src_addr[ETH_ALEN]; 51162306a36Sopenharmony_ci u8 dst_addr[ETH_ALEN]; 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistruct igb_nfc_filter { 51562306a36Sopenharmony_ci struct hlist_node nfc_node; 51662306a36Sopenharmony_ci struct igb_nfc_input filter; 51762306a36Sopenharmony_ci unsigned long cookie; 51862306a36Sopenharmony_ci u16 etype_reg_index; 51962306a36Sopenharmony_ci u16 sw_idx; 52062306a36Sopenharmony_ci u16 action; 52162306a36Sopenharmony_ci}; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_cistruct igb_mac_addr { 52462306a36Sopenharmony_ci u8 addr[ETH_ALEN]; 52562306a36Sopenharmony_ci u8 queue; 52662306a36Sopenharmony_ci u8 state; /* bitmask */ 52762306a36Sopenharmony_ci}; 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci#define IGB_MAC_STATE_DEFAULT 0x1 53062306a36Sopenharmony_ci#define IGB_MAC_STATE_IN_USE 0x2 53162306a36Sopenharmony_ci#define IGB_MAC_STATE_SRC_ADDR 0x4 53262306a36Sopenharmony_ci#define IGB_MAC_STATE_QUEUE_STEERING 0x8 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci/* board specific private data structure */ 53562306a36Sopenharmony_cistruct igb_adapter { 53662306a36Sopenharmony_ci unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci struct net_device *netdev; 53962306a36Sopenharmony_ci struct bpf_prog *xdp_prog; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci unsigned long state; 54262306a36Sopenharmony_ci unsigned int flags; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci unsigned int num_q_vectors; 54562306a36Sopenharmony_ci struct msix_entry msix_entries[MAX_MSIX_ENTRIES]; 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci /* Interrupt Throttle Rate */ 54862306a36Sopenharmony_ci u32 rx_itr_setting; 54962306a36Sopenharmony_ci u32 tx_itr_setting; 55062306a36Sopenharmony_ci u16 tx_itr; 55162306a36Sopenharmony_ci u16 rx_itr; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci /* TX */ 55462306a36Sopenharmony_ci u16 tx_work_limit; 55562306a36Sopenharmony_ci u32 tx_timeout_count; 55662306a36Sopenharmony_ci int num_tx_queues; 55762306a36Sopenharmony_ci struct igb_ring *tx_ring[16]; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci /* RX */ 56062306a36Sopenharmony_ci int num_rx_queues; 56162306a36Sopenharmony_ci struct igb_ring *rx_ring[16]; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci u32 max_frame_size; 56462306a36Sopenharmony_ci u32 min_frame_size; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci struct timer_list watchdog_timer; 56762306a36Sopenharmony_ci struct timer_list phy_info_timer; 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci u16 mng_vlan_id; 57062306a36Sopenharmony_ci u32 bd_number; 57162306a36Sopenharmony_ci u32 wol; 57262306a36Sopenharmony_ci u32 en_mng_pt; 57362306a36Sopenharmony_ci u16 link_speed; 57462306a36Sopenharmony_ci u16 link_duplex; 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci u8 __iomem *io_addr; /* Mainly for iounmap use */ 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci struct work_struct reset_task; 57962306a36Sopenharmony_ci struct work_struct watchdog_task; 58062306a36Sopenharmony_ci bool fc_autoneg; 58162306a36Sopenharmony_ci u8 tx_timeout_factor; 58262306a36Sopenharmony_ci struct timer_list blink_timer; 58362306a36Sopenharmony_ci unsigned long led_status; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci /* OS defined structs */ 58662306a36Sopenharmony_ci struct pci_dev *pdev; 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci spinlock_t stats64_lock; 58962306a36Sopenharmony_ci struct rtnl_link_stats64 stats64; 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci /* structs defined in e1000_hw.h */ 59262306a36Sopenharmony_ci struct e1000_hw hw; 59362306a36Sopenharmony_ci struct e1000_hw_stats stats; 59462306a36Sopenharmony_ci struct e1000_phy_info phy_info; 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci u32 test_icr; 59762306a36Sopenharmony_ci struct igb_ring test_tx_ring; 59862306a36Sopenharmony_ci struct igb_ring test_rx_ring; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci int msg_enable; 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci struct igb_q_vector *q_vector[MAX_Q_VECTORS]; 60362306a36Sopenharmony_ci u32 eims_enable_mask; 60462306a36Sopenharmony_ci u32 eims_other; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci /* to not mess up cache alignment, always add to the bottom */ 60762306a36Sopenharmony_ci u16 tx_ring_count; 60862306a36Sopenharmony_ci u16 rx_ring_count; 60962306a36Sopenharmony_ci unsigned int vfs_allocated_count; 61062306a36Sopenharmony_ci struct vf_data_storage *vf_data; 61162306a36Sopenharmony_ci int vf_rate_link_speed; 61262306a36Sopenharmony_ci u32 rss_queues; 61362306a36Sopenharmony_ci u32 wvbr; 61462306a36Sopenharmony_ci u32 *shadow_vfta; 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci struct ptp_clock *ptp_clock; 61762306a36Sopenharmony_ci struct ptp_clock_info ptp_caps; 61862306a36Sopenharmony_ci struct delayed_work ptp_overflow_work; 61962306a36Sopenharmony_ci struct work_struct ptp_tx_work; 62062306a36Sopenharmony_ci struct sk_buff *ptp_tx_skb; 62162306a36Sopenharmony_ci struct hwtstamp_config tstamp_config; 62262306a36Sopenharmony_ci unsigned long ptp_tx_start; 62362306a36Sopenharmony_ci unsigned long last_rx_ptp_check; 62462306a36Sopenharmony_ci unsigned long last_rx_timestamp; 62562306a36Sopenharmony_ci unsigned int ptp_flags; 62662306a36Sopenharmony_ci spinlock_t tmreg_lock; 62762306a36Sopenharmony_ci struct cyclecounter cc; 62862306a36Sopenharmony_ci struct timecounter tc; 62962306a36Sopenharmony_ci u32 tx_hwtstamp_timeouts; 63062306a36Sopenharmony_ci u32 tx_hwtstamp_skipped; 63162306a36Sopenharmony_ci u32 rx_hwtstamp_cleared; 63262306a36Sopenharmony_ci bool pps_sys_wrap_on; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci struct ptp_pin_desc sdp_config[IGB_N_SDP]; 63562306a36Sopenharmony_ci struct { 63662306a36Sopenharmony_ci struct timespec64 start; 63762306a36Sopenharmony_ci struct timespec64 period; 63862306a36Sopenharmony_ci } perout[IGB_N_PEROUT]; 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci char fw_version[32]; 64162306a36Sopenharmony_ci#ifdef CONFIG_IGB_HWMON 64262306a36Sopenharmony_ci struct hwmon_buff *igb_hwmon_buff; 64362306a36Sopenharmony_ci bool ets; 64462306a36Sopenharmony_ci#endif 64562306a36Sopenharmony_ci struct i2c_algo_bit_data i2c_algo; 64662306a36Sopenharmony_ci struct i2c_adapter i2c_adap; 64762306a36Sopenharmony_ci struct i2c_client *i2c_client; 64862306a36Sopenharmony_ci u32 rss_indir_tbl_init; 64962306a36Sopenharmony_ci u8 rss_indir_tbl[IGB_RETA_SIZE]; 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci unsigned long link_check_timeout; 65262306a36Sopenharmony_ci int copper_tries; 65362306a36Sopenharmony_ci struct e1000_info ei; 65462306a36Sopenharmony_ci u16 eee_advert; 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci /* RX network flow classification support */ 65762306a36Sopenharmony_ci struct hlist_head nfc_filter_list; 65862306a36Sopenharmony_ci struct hlist_head cls_flower_list; 65962306a36Sopenharmony_ci unsigned int nfc_filter_count; 66062306a36Sopenharmony_ci /* lock for RX network flow classification filter */ 66162306a36Sopenharmony_ci spinlock_t nfc_lock; 66262306a36Sopenharmony_ci bool etype_bitmap[MAX_ETYPE_FILTER]; 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci struct igb_mac_addr *mac_table; 66562306a36Sopenharmony_ci struct vf_mac_filter vf_macs; 66662306a36Sopenharmony_ci struct vf_mac_filter *vf_mac_list; 66762306a36Sopenharmony_ci /* lock for VF resources */ 66862306a36Sopenharmony_ci spinlock_t vfs_lock; 66962306a36Sopenharmony_ci}; 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci/* flags controlling PTP/1588 function */ 67262306a36Sopenharmony_ci#define IGB_PTP_ENABLED BIT(0) 67362306a36Sopenharmony_ci#define IGB_PTP_OVERFLOW_CHECK BIT(1) 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci#define IGB_FLAG_HAS_MSI BIT(0) 67662306a36Sopenharmony_ci#define IGB_FLAG_DCA_ENABLED BIT(1) 67762306a36Sopenharmony_ci#define IGB_FLAG_QUAD_PORT_A BIT(2) 67862306a36Sopenharmony_ci#define IGB_FLAG_QUEUE_PAIRS BIT(3) 67962306a36Sopenharmony_ci#define IGB_FLAG_DMAC BIT(4) 68062306a36Sopenharmony_ci#define IGB_FLAG_RSS_FIELD_IPV4_UDP BIT(6) 68162306a36Sopenharmony_ci#define IGB_FLAG_RSS_FIELD_IPV6_UDP BIT(7) 68262306a36Sopenharmony_ci#define IGB_FLAG_WOL_SUPPORTED BIT(8) 68362306a36Sopenharmony_ci#define IGB_FLAG_NEED_LINK_UPDATE BIT(9) 68462306a36Sopenharmony_ci#define IGB_FLAG_MEDIA_RESET BIT(10) 68562306a36Sopenharmony_ci#define IGB_FLAG_MAS_CAPABLE BIT(11) 68662306a36Sopenharmony_ci#define IGB_FLAG_MAS_ENABLE BIT(12) 68762306a36Sopenharmony_ci#define IGB_FLAG_HAS_MSIX BIT(13) 68862306a36Sopenharmony_ci#define IGB_FLAG_EEE BIT(14) 68962306a36Sopenharmony_ci#define IGB_FLAG_VLAN_PROMISC BIT(15) 69062306a36Sopenharmony_ci#define IGB_FLAG_RX_LEGACY BIT(16) 69162306a36Sopenharmony_ci#define IGB_FLAG_FQTSS BIT(17) 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci/* Media Auto Sense */ 69462306a36Sopenharmony_ci#define IGB_MAS_ENABLE_0 0X0001 69562306a36Sopenharmony_ci#define IGB_MAS_ENABLE_1 0X0002 69662306a36Sopenharmony_ci#define IGB_MAS_ENABLE_2 0X0004 69762306a36Sopenharmony_ci#define IGB_MAS_ENABLE_3 0X0008 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci/* DMA Coalescing defines */ 70062306a36Sopenharmony_ci#define IGB_MIN_TXPBSIZE 20408 70162306a36Sopenharmony_ci#define IGB_TX_BUF_4096 4096 70262306a36Sopenharmony_ci#define IGB_DMCTLX_DCFLUSH_DIS 0x80000000 /* Disable DMA Coal Flush */ 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci#define IGB_82576_TSYNC_SHIFT 19 70562306a36Sopenharmony_cienum e1000_state_t { 70662306a36Sopenharmony_ci __IGB_TESTING, 70762306a36Sopenharmony_ci __IGB_RESETTING, 70862306a36Sopenharmony_ci __IGB_DOWN, 70962306a36Sopenharmony_ci __IGB_PTP_TX_IN_PROGRESS, 71062306a36Sopenharmony_ci}; 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_cienum igb_boards { 71362306a36Sopenharmony_ci board_82575, 71462306a36Sopenharmony_ci}; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_ciextern char igb_driver_name[]; 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ciint igb_xmit_xdp_ring(struct igb_adapter *adapter, 71962306a36Sopenharmony_ci struct igb_ring *ring, 72062306a36Sopenharmony_ci struct xdp_frame *xdpf); 72162306a36Sopenharmony_ciint igb_open(struct net_device *netdev); 72262306a36Sopenharmony_ciint igb_close(struct net_device *netdev); 72362306a36Sopenharmony_ciint igb_up(struct igb_adapter *); 72462306a36Sopenharmony_civoid igb_down(struct igb_adapter *); 72562306a36Sopenharmony_civoid igb_reinit_locked(struct igb_adapter *); 72662306a36Sopenharmony_civoid igb_reset(struct igb_adapter *); 72762306a36Sopenharmony_ciint igb_reinit_queues(struct igb_adapter *); 72862306a36Sopenharmony_civoid igb_write_rss_indir_tbl(struct igb_adapter *); 72962306a36Sopenharmony_ciint igb_set_spd_dplx(struct igb_adapter *, u32, u8); 73062306a36Sopenharmony_ciint igb_setup_tx_resources(struct igb_ring *); 73162306a36Sopenharmony_ciint igb_setup_rx_resources(struct igb_ring *); 73262306a36Sopenharmony_civoid igb_free_tx_resources(struct igb_ring *); 73362306a36Sopenharmony_civoid igb_free_rx_resources(struct igb_ring *); 73462306a36Sopenharmony_civoid igb_configure_tx_ring(struct igb_adapter *, struct igb_ring *); 73562306a36Sopenharmony_civoid igb_configure_rx_ring(struct igb_adapter *, struct igb_ring *); 73662306a36Sopenharmony_civoid igb_setup_tctl(struct igb_adapter *); 73762306a36Sopenharmony_civoid igb_setup_rctl(struct igb_adapter *); 73862306a36Sopenharmony_civoid igb_setup_srrctl(struct igb_adapter *, struct igb_ring *); 73962306a36Sopenharmony_cinetdev_tx_t igb_xmit_frame_ring(struct sk_buff *, struct igb_ring *); 74062306a36Sopenharmony_civoid igb_alloc_rx_buffers(struct igb_ring *, u16); 74162306a36Sopenharmony_civoid igb_update_stats(struct igb_adapter *); 74262306a36Sopenharmony_cibool igb_has_link(struct igb_adapter *adapter); 74362306a36Sopenharmony_civoid igb_set_ethtool_ops(struct net_device *); 74462306a36Sopenharmony_civoid igb_power_up_link(struct igb_adapter *); 74562306a36Sopenharmony_civoid igb_set_fw_version(struct igb_adapter *); 74662306a36Sopenharmony_civoid igb_ptp_init(struct igb_adapter *adapter); 74762306a36Sopenharmony_civoid igb_ptp_stop(struct igb_adapter *adapter); 74862306a36Sopenharmony_civoid igb_ptp_reset(struct igb_adapter *adapter); 74962306a36Sopenharmony_civoid igb_ptp_suspend(struct igb_adapter *adapter); 75062306a36Sopenharmony_civoid igb_ptp_rx_hang(struct igb_adapter *adapter); 75162306a36Sopenharmony_civoid igb_ptp_tx_hang(struct igb_adapter *adapter); 75262306a36Sopenharmony_civoid igb_ptp_rx_rgtstamp(struct igb_q_vector *q_vector, struct sk_buff *skb); 75362306a36Sopenharmony_ciint igb_ptp_rx_pktstamp(struct igb_q_vector *q_vector, void *va, 75462306a36Sopenharmony_ci ktime_t *timestamp); 75562306a36Sopenharmony_ciint igb_ptp_set_ts_config(struct net_device *netdev, struct ifreq *ifr); 75662306a36Sopenharmony_ciint igb_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr); 75762306a36Sopenharmony_civoid igb_set_flag_queue_pairs(struct igb_adapter *, const u32); 75862306a36Sopenharmony_ciunsigned int igb_get_max_rss_queues(struct igb_adapter *); 75962306a36Sopenharmony_ci#ifdef CONFIG_IGB_HWMON 76062306a36Sopenharmony_civoid igb_sysfs_exit(struct igb_adapter *adapter); 76162306a36Sopenharmony_ciint igb_sysfs_init(struct igb_adapter *adapter); 76262306a36Sopenharmony_ci#endif 76362306a36Sopenharmony_cistatic inline s32 igb_reset_phy(struct e1000_hw *hw) 76462306a36Sopenharmony_ci{ 76562306a36Sopenharmony_ci if (hw->phy.ops.reset) 76662306a36Sopenharmony_ci return hw->phy.ops.reset(hw); 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci return 0; 76962306a36Sopenharmony_ci} 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_cistatic inline s32 igb_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) 77262306a36Sopenharmony_ci{ 77362306a36Sopenharmony_ci if (hw->phy.ops.read_reg) 77462306a36Sopenharmony_ci return hw->phy.ops.read_reg(hw, offset, data); 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci return 0; 77762306a36Sopenharmony_ci} 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_cistatic inline s32 igb_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) 78062306a36Sopenharmony_ci{ 78162306a36Sopenharmony_ci if (hw->phy.ops.write_reg) 78262306a36Sopenharmony_ci return hw->phy.ops.write_reg(hw, offset, data); 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci return 0; 78562306a36Sopenharmony_ci} 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_cistatic inline s32 igb_get_phy_info(struct e1000_hw *hw) 78862306a36Sopenharmony_ci{ 78962306a36Sopenharmony_ci if (hw->phy.ops.get_phy_info) 79062306a36Sopenharmony_ci return hw->phy.ops.get_phy_info(hw); 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_ci return 0; 79362306a36Sopenharmony_ci} 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_cistatic inline struct netdev_queue *txring_txq(const struct igb_ring *tx_ring) 79662306a36Sopenharmony_ci{ 79762306a36Sopenharmony_ci return netdev_get_tx_queue(tx_ring->netdev, tx_ring->queue_index); 79862306a36Sopenharmony_ci} 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ciint igb_add_filter(struct igb_adapter *adapter, 80162306a36Sopenharmony_ci struct igb_nfc_filter *input); 80262306a36Sopenharmony_ciint igb_erase_filter(struct igb_adapter *adapter, 80362306a36Sopenharmony_ci struct igb_nfc_filter *input); 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ciint igb_add_mac_steering_filter(struct igb_adapter *adapter, 80662306a36Sopenharmony_ci const u8 *addr, u8 queue, u8 flags); 80762306a36Sopenharmony_ciint igb_del_mac_steering_filter(struct igb_adapter *adapter, 80862306a36Sopenharmony_ci const u8 *addr, u8 queue, u8 flags); 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci#endif /* _IGB_H_ */ 811