diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/net_driver.h')
| -rw-r--r-- | drivers/net/ethernet/sfc/net_driver.h | 78 | 
1 files changed, 52 insertions, 26 deletions
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index cd9c0a98969..c1a010cda89 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h @@ -37,7 +37,7 @@   *   **************************************************************************/ -#define EFX_DRIVER_VERSION	"3.1" +#define EFX_DRIVER_VERSION	"3.2"  #ifdef DEBUG  #define EFX_BUG_ON_PARANOID(x) BUG_ON(x) @@ -56,7 +56,8 @@  #define EFX_MAX_CHANNELS 32U  #define EFX_MAX_RX_QUEUES EFX_MAX_CHANNELS  #define EFX_EXTRA_CHANNEL_IOV	0 -#define EFX_MAX_EXTRA_CHANNELS	1U +#define EFX_EXTRA_CHANNEL_PTP	1 +#define EFX_MAX_EXTRA_CHANNELS	2U  /* Checksum generation is a per-queue option in hardware, so each   * queue visible to the networking core is backed by two hardware TX @@ -68,6 +69,9 @@  #define EFX_TXQ_TYPES		4  #define EFX_MAX_TX_QUEUES	(EFX_TXQ_TYPES * EFX_MAX_CHANNELS) +/* Forward declare Precision Time Protocol (PTP) support structure. */ +struct efx_ptp_data; +  struct efx_self_tests;  /** @@ -91,29 +95,31 @@ struct efx_special_buffer {  };  /** - * struct efx_tx_buffer - An Efx TX buffer - * @skb: The associated socket buffer. - *	Set only on the final fragment of a packet; %NULL for all other - *	fragments.  When this fragment completes, then we can free this - *	skb. - * @tsoh: The associated TSO header structure, or %NULL if this - *	buffer is not a TSO header. + * struct efx_tx_buffer - buffer state for a TX descriptor + * @skb: When @flags & %EFX_TX_BUF_SKB, the associated socket buffer to be + *	freed when descriptor completes + * @heap_buf: When @flags & %EFX_TX_BUF_HEAP, the associated heap buffer to be + *	freed when descriptor completes.   * @dma_addr: DMA address of the fragment. + * @flags: Flags for allocation and DMA mapping type   * @len: Length of this fragment.   *	This field is zero when the queue slot is empty. - * @continuation: True if this fragment is not the end of a packet. - * @unmap_single: True if dma_unmap_single should be used.   * @unmap_len: Length of this fragment to unmap   */  struct efx_tx_buffer { -	const struct sk_buff *skb; -	struct efx_tso_header *tsoh; +	union { +		const struct sk_buff *skb; +		void *heap_buf; +	};  	dma_addr_t dma_addr; +	unsigned short flags;  	unsigned short len; -	bool continuation; -	bool unmap_single;  	unsigned short unmap_len;  }; +#define EFX_TX_BUF_CONT		1	/* not last descriptor of packet */ +#define EFX_TX_BUF_SKB		2	/* buffer is last part of skb */ +#define EFX_TX_BUF_HEAP		4	/* buffer was allocated with kmalloc() */ +#define EFX_TX_BUF_MAP_SINGLE	8	/* buffer was mapped with dma_map_single() */  /**   * struct efx_tx_queue - An Efx TX queue @@ -133,6 +139,7 @@ struct efx_tx_buffer {   * @channel: The associated channel   * @core_txq: The networking core TX queue structure   * @buffer: The software buffer ring + * @tsoh_page: Array of pages of TSO header buffers   * @txd: The hardware descriptor ring   * @ptr_mask: The size of the ring minus 1.   * @initialised: Has hardware queue been initialised? @@ -156,9 +163,6 @@ struct efx_tx_buffer {   *	variable indicates that the queue is full.  This is to   *	avoid cache-line ping-pong between the xmit path and the   *	completion path. - * @tso_headers_free: A list of TSO headers allocated for this TX queue - *	that are not in use, and so available for new TSO sends. The list - *	is protected by the TX queue lock.   * @tso_bursts: Number of times TSO xmit invoked by kernel   * @tso_long_headers: Number of packets with headers too long for standard   *	blocks @@ -175,6 +179,7 @@ struct efx_tx_queue {  	struct efx_channel *channel;  	struct netdev_queue *core_txq;  	struct efx_tx_buffer *buffer; +	struct efx_buffer *tsoh_page;  	struct efx_special_buffer txd;  	unsigned int ptr_mask;  	bool initialised; @@ -187,7 +192,6 @@ struct efx_tx_queue {  	unsigned int insert_count ____cacheline_aligned_in_smp;  	unsigned int write_count;  	unsigned int old_read_count; -	struct efx_tso_header *tso_headers_free;  	unsigned int tso_bursts;  	unsigned int tso_long_headers;  	unsigned int tso_packets; @@ -242,6 +246,8 @@ struct efx_rx_page_state {  /**   * struct efx_rx_queue - An Efx RX queue   * @efx: The associated Efx NIC + * @core_index:  Index of network core RX queue.  Will be >= 0 iff this + *	is associated with a real RX queue.   * @buffer: The software buffer ring   * @rxd: The hardware descriptor ring   * @ptr_mask: The size of the ring minus 1. @@ -263,6 +269,7 @@ struct efx_rx_page_state {   */  struct efx_rx_queue {  	struct efx_nic *efx; +	int core_index;  	struct efx_rx_buffer *buffer;  	struct efx_special_buffer rxd;  	unsigned int ptr_mask; @@ -390,14 +397,17 @@ struct efx_channel {   * @get_name: Generate the channel's name (used for its IRQ handler)   * @copy: Copy the channel state prior to reallocation.  May be %NULL if   *	reallocation is not supported. + * @receive_skb: Handle an skb ready to be passed to netif_receive_skb()   * @keep_eventq: Flag for whether event queue should be kept initialised   *	while the device is stopped   */  struct efx_channel_type {  	void (*handle_no_channel)(struct efx_nic *);  	int (*pre_probe)(struct efx_channel *); +	void (*post_remove)(struct efx_channel *);  	void (*get_name)(struct efx_channel *, char *buf, size_t len);  	struct efx_channel *(*copy)(const struct efx_channel *); +	void (*receive_skb)(struct efx_channel *, struct sk_buff *);  	bool keep_eventq;  }; @@ -430,11 +440,9 @@ enum efx_int_mode {  #define EFX_INT_MODE_USE_MSI(x) (((x)->interrupt_mode) <= EFX_INT_MODE_MSI)  enum nic_state { -	STATE_INIT = 0, -	STATE_RUNNING = 1, -	STATE_FINI = 2, -	STATE_DISABLED = 3, -	STATE_MAX, +	STATE_UNINIT = 0,	/* device being probed/removed or is frozen */ +	STATE_READY = 1,	/* hardware ready and netdev registered */ +	STATE_DISABLED = 2,	/* device disabled due to hardware errors */  };  /* @@ -654,7 +662,7 @@ struct vfdi_status;   * @irq_rx_adaptive: Adaptive IRQ moderation enabled for RX event queues   * @irq_rx_moderation: IRQ moderation time for RX event queues   * @msg_enable: Log message enable flags - * @state: Device state flag. Serialised by the rtnl_lock. + * @state: Device state number (%STATE_*). Serialised by the rtnl_lock.   * @reset_pending: Bitmask for pending resets   * @tx_queue: TX DMA queues   * @rx_queue: RX DMA queues @@ -664,6 +672,8 @@ struct vfdi_status;   *	should be allocated for this NIC   * @rxq_entries: Size of receive queues requested by user.   * @txq_entries: Size of transmit queues requested by user. + * @txq_stop_thresh: TX queue fill level at or above which we stop it. + * @txq_wake_thresh: TX queue fill level at or below which we wake it.   * @tx_dc_base: Base qword address in SRAM of TX queue descriptor caches   * @rx_dc_base: Base qword address in SRAM of RX queue descriptor caches   * @sram_lim_qw: Qword address limit of SRAM @@ -730,6 +740,7 @@ struct vfdi_status;   *	%local_addr_list. Protected by %local_lock.   * @local_lock: Mutex protecting %local_addr_list and %local_page_list.   * @peer_work: Work item to broadcast peer addresses to VMs. + * @ptp_data: PTP state data   * @monitor_work: Hardware monitor workitem   * @biu_lock: BIU (bus interface unit) lock   * @last_irq_cpu: Last CPU to handle a possible test interrupt.  This @@ -774,6 +785,9 @@ struct efx_nic {  	unsigned rxq_entries;  	unsigned txq_entries; +	unsigned int txq_stop_thresh; +	unsigned int txq_wake_thresh; +  	unsigned tx_dc_base;  	unsigned rx_dc_base;  	unsigned sram_lim_qw; @@ -854,6 +868,10 @@ struct efx_nic {  	struct work_struct peer_work;  #endif +#ifdef CONFIG_SFC_PTP +	struct efx_ptp_data *ptp_data; +#endif +  	/* The following fields may be written more often */  	struct delayed_work monitor_work ____cacheline_aligned_in_smp; @@ -1044,7 +1062,7 @@ static inline bool efx_tx_queue_used(struct efx_tx_queue *tx_queue)  static inline bool efx_channel_has_rx_queue(struct efx_channel *channel)  { -	return channel->channel < channel->efx->n_rx_channels; +	return channel->rx_queue.core_index >= 0;  }  static inline struct efx_rx_queue * @@ -1116,5 +1134,13 @@ static inline void clear_bit_le(unsigned nr, unsigned char *addr)  #define EFX_MAX_FRAME_LEN(mtu) \  	((((mtu) + ETH_HLEN + VLAN_HLEN + 4/* FCS */ + 7) & ~7) + 16) +static inline bool efx_xmit_with_hwtstamp(struct sk_buff *skb) +{ +	return skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP; +} +static inline void efx_xmit_hwtstamp_pending(struct sk_buff *skb) +{ +	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; +}  #endif /* EFX_NET_DRIVER_H */  |