162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright(c) 2009 - 2018 Intel Corporation. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci/* Linux PRO/1000 Ethernet Driver main header file */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _IGBVF_H_ 762306a36Sopenharmony_ci#define _IGBVF_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci#include <linux/timer.h> 1162306a36Sopenharmony_ci#include <linux/io.h> 1262306a36Sopenharmony_ci#include <linux/netdevice.h> 1362306a36Sopenharmony_ci#include <linux/if_vlan.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "vf.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Forward declarations */ 1862306a36Sopenharmony_cistruct igbvf_info; 1962306a36Sopenharmony_cistruct igbvf_adapter; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* Interrupt defines */ 2262306a36Sopenharmony_ci#define IGBVF_START_ITR 488 /* ~8000 ints/sec */ 2362306a36Sopenharmony_ci#define IGBVF_4K_ITR 980 2462306a36Sopenharmony_ci#define IGBVF_20K_ITR 196 2562306a36Sopenharmony_ci#define IGBVF_70K_ITR 56 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum latency_range { 2862306a36Sopenharmony_ci lowest_latency = 0, 2962306a36Sopenharmony_ci low_latency = 1, 3062306a36Sopenharmony_ci bulk_latency = 2, 3162306a36Sopenharmony_ci latency_invalid = 255 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* Interrupt modes, as used by the IntMode parameter */ 3562306a36Sopenharmony_ci#define IGBVF_INT_MODE_LEGACY 0 3662306a36Sopenharmony_ci#define IGBVF_INT_MODE_MSI 1 3762306a36Sopenharmony_ci#define IGBVF_INT_MODE_MSIX 2 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* Tx/Rx descriptor defines */ 4062306a36Sopenharmony_ci#define IGBVF_DEFAULT_TXD 256 4162306a36Sopenharmony_ci#define IGBVF_MAX_TXD 4096 4262306a36Sopenharmony_ci#define IGBVF_MIN_TXD 64 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define IGBVF_DEFAULT_RXD 256 4562306a36Sopenharmony_ci#define IGBVF_MAX_RXD 4096 4662306a36Sopenharmony_ci#define IGBVF_MIN_RXD 64 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define IGBVF_MIN_ITR_USECS 10 /* 100000 irq/sec */ 4962306a36Sopenharmony_ci#define IGBVF_MAX_ITR_USECS 10000 /* 100 irq/sec */ 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* RX descriptor control thresholds. 5262306a36Sopenharmony_ci * PTHRESH - MAC will consider prefetch if it has fewer than this number of 5362306a36Sopenharmony_ci * descriptors available in its onboard memory. 5462306a36Sopenharmony_ci * Setting this to 0 disables RX descriptor prefetch. 5562306a36Sopenharmony_ci * HTHRESH - MAC will only prefetch if there are at least this many descriptors 5662306a36Sopenharmony_ci * available in host memory. 5762306a36Sopenharmony_ci * If PTHRESH is 0, this should also be 0. 5862306a36Sopenharmony_ci * WTHRESH - RX descriptor writeback threshold - MAC will delay writing back 5962306a36Sopenharmony_ci * descriptors until either it has this many to write back, or the 6062306a36Sopenharmony_ci * ITR timer expires. 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci#define IGBVF_RX_PTHRESH 16 6362306a36Sopenharmony_ci#define IGBVF_RX_HTHRESH 8 6462306a36Sopenharmony_ci#define IGBVF_RX_WTHRESH 1 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* this is the size past which hardware will drop packets when setting LPE=0 */ 6762306a36Sopenharmony_ci#define MAXIMUM_ETHERNET_VLAN_SIZE 1522 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define IGBVF_FC_PAUSE_TIME 0x0680 /* 858 usec */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* How many Tx Descriptors do we need to call netif_wake_queue ? */ 7262306a36Sopenharmony_ci#define IGBVF_TX_QUEUE_WAKE 32 7362306a36Sopenharmony_ci/* How many Rx Buffers do we bundle into one write to the hardware ? */ 7462306a36Sopenharmony_ci#define IGBVF_RX_BUFFER_WRITE 16 /* Must be power of 2 */ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#define AUTO_ALL_MODES 0 7762306a36Sopenharmony_ci#define IGBVF_EEPROM_APME 0x0400 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define IGBVF_MNG_VLAN_NONE (-1) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define IGBVF_MAX_MAC_FILTERS 3 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* Number of packet split data buffers (not including the header buffer) */ 8462306a36Sopenharmony_ci#define PS_PAGE_BUFFERS (MAX_PS_BUFFERS - 1) 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cienum igbvf_boards { 8762306a36Sopenharmony_ci board_vf, 8862306a36Sopenharmony_ci board_i350_vf, 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistruct igbvf_queue_stats { 9262306a36Sopenharmony_ci u64 packets; 9362306a36Sopenharmony_ci u64 bytes; 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* wrappers around a pointer to a socket buffer, 9762306a36Sopenharmony_ci * so a DMA handle can be stored along with the buffer 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_cistruct igbvf_buffer { 10062306a36Sopenharmony_ci dma_addr_t dma; 10162306a36Sopenharmony_ci struct sk_buff *skb; 10262306a36Sopenharmony_ci union { 10362306a36Sopenharmony_ci /* Tx */ 10462306a36Sopenharmony_ci struct { 10562306a36Sopenharmony_ci unsigned long time_stamp; 10662306a36Sopenharmony_ci union e1000_adv_tx_desc *next_to_watch; 10762306a36Sopenharmony_ci u16 length; 10862306a36Sopenharmony_ci u16 mapped_as_page; 10962306a36Sopenharmony_ci }; 11062306a36Sopenharmony_ci /* Rx */ 11162306a36Sopenharmony_ci struct { 11262306a36Sopenharmony_ci struct page *page; 11362306a36Sopenharmony_ci u64 page_dma; 11462306a36Sopenharmony_ci unsigned int page_offset; 11562306a36Sopenharmony_ci }; 11662306a36Sopenharmony_ci }; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ciunion igbvf_desc { 12062306a36Sopenharmony_ci union e1000_adv_rx_desc rx_desc; 12162306a36Sopenharmony_ci union e1000_adv_tx_desc tx_desc; 12262306a36Sopenharmony_ci struct e1000_adv_tx_context_desc tx_context_desc; 12362306a36Sopenharmony_ci}; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistruct igbvf_ring { 12662306a36Sopenharmony_ci struct igbvf_adapter *adapter; /* backlink */ 12762306a36Sopenharmony_ci union igbvf_desc *desc; /* pointer to ring memory */ 12862306a36Sopenharmony_ci dma_addr_t dma; /* phys address of ring */ 12962306a36Sopenharmony_ci unsigned int size; /* length of ring in bytes */ 13062306a36Sopenharmony_ci unsigned int count; /* number of desc. in ring */ 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci u16 next_to_use; 13362306a36Sopenharmony_ci u16 next_to_clean; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci u16 head; 13662306a36Sopenharmony_ci u16 tail; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci /* array of buffer information structs */ 13962306a36Sopenharmony_ci struct igbvf_buffer *buffer_info; 14062306a36Sopenharmony_ci struct napi_struct napi; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci char name[IFNAMSIZ + 5]; 14362306a36Sopenharmony_ci u32 eims_value; 14462306a36Sopenharmony_ci u32 itr_val; 14562306a36Sopenharmony_ci enum latency_range itr_range; 14662306a36Sopenharmony_ci u16 itr_register; 14762306a36Sopenharmony_ci int set_itr; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci struct sk_buff *rx_skb_top; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci struct igbvf_queue_stats stats; 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* board specific private data structure */ 15562306a36Sopenharmony_cistruct igbvf_adapter { 15662306a36Sopenharmony_ci struct timer_list watchdog_timer; 15762306a36Sopenharmony_ci struct timer_list blink_timer; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci struct work_struct reset_task; 16062306a36Sopenharmony_ci struct work_struct watchdog_task; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci const struct igbvf_info *ei; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 16562306a36Sopenharmony_ci u32 bd_number; 16662306a36Sopenharmony_ci u32 rx_buffer_len; 16762306a36Sopenharmony_ci u32 polling_interval; 16862306a36Sopenharmony_ci u16 mng_vlan_id; 16962306a36Sopenharmony_ci u16 link_speed; 17062306a36Sopenharmony_ci u16 link_duplex; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci spinlock_t tx_queue_lock; /* prevent concurrent tail updates */ 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci /* track device up/down/testing state */ 17562306a36Sopenharmony_ci unsigned long state; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* Interrupt Throttle Rate */ 17862306a36Sopenharmony_ci u32 requested_itr; /* ints/sec or adaptive */ 17962306a36Sopenharmony_ci u32 current_itr; /* Actual ITR register value, not ints/sec */ 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* Tx */ 18262306a36Sopenharmony_ci struct igbvf_ring *tx_ring /* One per active queue */ 18362306a36Sopenharmony_ci ____cacheline_aligned_in_smp; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci unsigned int restart_queue; 18662306a36Sopenharmony_ci u32 txd_cmd; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci u32 tx_int_delay; 18962306a36Sopenharmony_ci u32 tx_abs_int_delay; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci unsigned int total_tx_bytes; 19262306a36Sopenharmony_ci unsigned int total_tx_packets; 19362306a36Sopenharmony_ci unsigned int total_rx_bytes; 19462306a36Sopenharmony_ci unsigned int total_rx_packets; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci /* Tx stats */ 19762306a36Sopenharmony_ci u32 tx_timeout_count; 19862306a36Sopenharmony_ci u32 tx_fifo_head; 19962306a36Sopenharmony_ci u32 tx_head_addr; 20062306a36Sopenharmony_ci u32 tx_fifo_size; 20162306a36Sopenharmony_ci u32 tx_dma_failed; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci /* Rx */ 20462306a36Sopenharmony_ci struct igbvf_ring *rx_ring; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci u32 rx_int_delay; 20762306a36Sopenharmony_ci u32 rx_abs_int_delay; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* Rx stats */ 21062306a36Sopenharmony_ci u64 hw_csum_err; 21162306a36Sopenharmony_ci u64 hw_csum_good; 21262306a36Sopenharmony_ci u64 rx_hdr_split; 21362306a36Sopenharmony_ci u32 alloc_rx_buff_failed; 21462306a36Sopenharmony_ci u32 rx_dma_failed; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci unsigned int rx_ps_hdr_size; 21762306a36Sopenharmony_ci u32 max_frame_size; 21862306a36Sopenharmony_ci u32 min_frame_size; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* OS defined structs */ 22162306a36Sopenharmony_ci struct net_device *netdev; 22262306a36Sopenharmony_ci struct pci_dev *pdev; 22362306a36Sopenharmony_ci spinlock_t stats_lock; /* prevent concurrent stats updates */ 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci /* structs defined in e1000_hw.h */ 22662306a36Sopenharmony_ci struct e1000_hw hw; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci /* The VF counters don't clear on read so we have to get a base 22962306a36Sopenharmony_ci * count on driver start up and always subtract that base on 23062306a36Sopenharmony_ci * the first update, thus the flag.. 23162306a36Sopenharmony_ci */ 23262306a36Sopenharmony_ci struct e1000_vf_stats stats; 23362306a36Sopenharmony_ci u64 zero_base; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci struct igbvf_ring test_tx_ring; 23662306a36Sopenharmony_ci struct igbvf_ring test_rx_ring; 23762306a36Sopenharmony_ci u32 test_icr; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci u32 msg_enable; 24062306a36Sopenharmony_ci struct msix_entry *msix_entries; 24162306a36Sopenharmony_ci int int_mode; 24262306a36Sopenharmony_ci u32 eims_enable_mask; 24362306a36Sopenharmony_ci u32 eims_other; 24462306a36Sopenharmony_ci u32 int_counter0; 24562306a36Sopenharmony_ci u32 int_counter1; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci u32 eeprom_wol; 24862306a36Sopenharmony_ci u32 wol; 24962306a36Sopenharmony_ci u32 pba; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci bool fc_autoneg; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci unsigned long led_status; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci unsigned int flags; 25662306a36Sopenharmony_ci unsigned long last_reset; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct igbvf_info { 26062306a36Sopenharmony_ci enum e1000_mac_type mac; 26162306a36Sopenharmony_ci unsigned int flags; 26262306a36Sopenharmony_ci u32 pba; 26362306a36Sopenharmony_ci void (*init_ops)(struct e1000_hw *); 26462306a36Sopenharmony_ci s32 (*get_variants)(struct igbvf_adapter *); 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* hardware capability, feature, and workaround flags */ 26862306a36Sopenharmony_ci#define IGBVF_FLAG_RX_CSUM_DISABLED BIT(0) 26962306a36Sopenharmony_ci#define IGBVF_FLAG_RX_LB_VLAN_BSWAP BIT(1) 27062306a36Sopenharmony_ci#define IGBVF_RX_DESC_ADV(R, i) \ 27162306a36Sopenharmony_ci (&((((R).desc))[i].rx_desc)) 27262306a36Sopenharmony_ci#define IGBVF_TX_DESC_ADV(R, i) \ 27362306a36Sopenharmony_ci (&((((R).desc))[i].tx_desc)) 27462306a36Sopenharmony_ci#define IGBVF_TX_CTXTDESC_ADV(R, i) \ 27562306a36Sopenharmony_ci (&((((R).desc))[i].tx_context_desc)) 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cienum igbvf_state_t { 27862306a36Sopenharmony_ci __IGBVF_TESTING, 27962306a36Sopenharmony_ci __IGBVF_RESETTING, 28062306a36Sopenharmony_ci __IGBVF_DOWN 28162306a36Sopenharmony_ci}; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ciextern char igbvf_driver_name[]; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_civoid igbvf_check_options(struct igbvf_adapter *); 28662306a36Sopenharmony_civoid igbvf_set_ethtool_ops(struct net_device *); 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ciint igbvf_up(struct igbvf_adapter *); 28962306a36Sopenharmony_civoid igbvf_down(struct igbvf_adapter *); 29062306a36Sopenharmony_civoid igbvf_reinit_locked(struct igbvf_adapter *); 29162306a36Sopenharmony_ciint igbvf_setup_rx_resources(struct igbvf_adapter *, struct igbvf_ring *); 29262306a36Sopenharmony_ciint igbvf_setup_tx_resources(struct igbvf_adapter *, struct igbvf_ring *); 29362306a36Sopenharmony_civoid igbvf_free_rx_resources(struct igbvf_ring *); 29462306a36Sopenharmony_civoid igbvf_free_tx_resources(struct igbvf_ring *); 29562306a36Sopenharmony_civoid igbvf_update_stats(struct igbvf_adapter *); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ciextern unsigned int copybreak; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci#endif /* _IGBVF_H_ */ 300