diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc.h')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc.h | 43 | 
1 files changed, 41 insertions, 2 deletions
| diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index 34aebf00a512..00a5ee487812 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -13,6 +13,7 @@  #include <linux/ptp_clock_kernel.h>  #include <linux/timecounter.h>  #include <linux/net_tstamp.h> +#include <linux/bitfield.h>  #include "igc_hw.h" @@ -228,7 +229,10 @@ struct igc_adapter {  	struct ptp_clock *ptp_clock;  	struct ptp_clock_info ptp_caps; -	struct work_struct ptp_tx_work; +	/* Access to ptp_tx_skb and ptp_tx_start are protected by the +	 * ptp_tx_lock. +	 */ +	spinlock_t ptp_tx_lock;  	struct sk_buff *ptp_tx_skb;  	struct hwtstamp_config tstamp_config;  	unsigned long ptp_tx_start; @@ -311,6 +315,33 @@ extern char igc_driver_name[];  #define IGC_MRQC_RSS_FIELD_IPV4_UDP	0x00400000  #define IGC_MRQC_RSS_FIELD_IPV6_UDP	0x00800000 +/* RX-desc Write-Back format RSS Type's */ +enum igc_rss_type_num { +	IGC_RSS_TYPE_NO_HASH		= 0, +	IGC_RSS_TYPE_HASH_TCP_IPV4	= 1, +	IGC_RSS_TYPE_HASH_IPV4		= 2, +	IGC_RSS_TYPE_HASH_TCP_IPV6	= 3, +	IGC_RSS_TYPE_HASH_IPV6_EX	= 4, +	IGC_RSS_TYPE_HASH_IPV6		= 5, +	IGC_RSS_TYPE_HASH_TCP_IPV6_EX	= 6, +	IGC_RSS_TYPE_HASH_UDP_IPV4	= 7, +	IGC_RSS_TYPE_HASH_UDP_IPV6	= 8, +	IGC_RSS_TYPE_HASH_UDP_IPV6_EX	= 9, +	IGC_RSS_TYPE_MAX		= 10, +}; +#define IGC_RSS_TYPE_MAX_TABLE		16 +#define IGC_RSS_TYPE_MASK		GENMASK(3,0) /* 4-bits (3:0) = mask 0x0F */ + +/* igc_rss_type - Rx descriptor RSS type field */ +static inline u32 igc_rss_type(const union igc_adv_rx_desc *rx_desc) +{ +	/* RSS Type 4-bits (3:0) number: 0-9 (above 9 is reserved) +	 * Accessing the same bits via u16 (wb.lower.lo_dword.hs_rss.pkt_info) +	 * is slightly slower than via u32 (wb.lower.lo_dword.data) +	 */ +	return le32_get_bits(rx_desc->wb.lower.lo_dword.data, IGC_RSS_TYPE_MASK); +} +  /* Interrupt defines */  #define IGC_START_ITR			648 /* ~6000 ints/sec */  #define IGC_4K_ITR			980 @@ -401,7 +432,6 @@ enum igc_state_t {  	__IGC_TESTING,  	__IGC_RESETTING,  	__IGC_DOWN, -	__IGC_PTP_TX_IN_PROGRESS,  };  enum igc_tx_flags { @@ -471,6 +501,13 @@ struct igc_rx_buffer {  	};  }; +/* context wrapper around xdp_buff to provide access to descriptor metadata */ +struct igc_xdp_buff { +	struct xdp_buff xdp; +	union igc_adv_rx_desc *rx_desc; +	ktime_t rx_ts; /* data indication bit IGC_RXDADV_STAT_TSIP */ +}; +  struct igc_q_vector {  	struct igc_adapter *adapter;    /* backlink */  	void __iomem *itr_register; @@ -578,6 +615,7 @@ enum igc_ring_flags_t {  	IGC_RING_FLAG_TX_CTX_IDX,  	IGC_RING_FLAG_TX_DETECT_HANG,  	IGC_RING_FLAG_AF_XDP_ZC, +	IGC_RING_FLAG_TX_HWTSTAMP,  };  #define ring_uses_large_buffer(ring) \ @@ -634,6 +672,7 @@ int igc_ptp_set_ts_config(struct net_device *netdev, struct ifreq *ifr);  int igc_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr);  void igc_ptp_tx_hang(struct igc_adapter *adapter);  void igc_ptp_read(struct igc_adapter *adapter, struct timespec64 *ts); +void igc_ptp_tx_tstamp_event(struct igc_adapter *adapter);  #define igc_rx_pg_size(_ring) (PAGE_SIZE << igc_rx_pg_order(_ring)) |