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