diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/net_driver.h')
| -rw-r--r-- | drivers/net/ethernet/sfc/net_driver.h | 93 | 
1 files changed, 71 insertions, 22 deletions
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index b172ed13305..5bdae8ed7c5 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h @@ -91,6 +91,7 @@  /* Forward declare Precision Time Protocol (PTP) support structure. */  struct efx_ptp_data; +struct hwtstamp_config;  struct efx_self_tests; @@ -141,6 +142,8 @@ struct efx_special_buffer {   * @len: Length of this fragment.   *	This field is zero when the queue slot is empty.   * @unmap_len: Length of this fragment to unmap + * @dma_offset: Offset of @dma_addr from the address of the backing DMA mapping. + * Only valid if @unmap_len != 0.   */  struct efx_tx_buffer {  	union { @@ -154,6 +157,7 @@ struct efx_tx_buffer {  	unsigned short flags;  	unsigned short len;  	unsigned short unmap_len; +	unsigned short dma_offset;  };  #define EFX_TX_BUF_CONT		1	/* not last descriptor of packet */  #define EFX_TX_BUF_SKB		2	/* buffer is last part of skb */ @@ -182,6 +186,9 @@ struct efx_tx_buffer {   * @tsoh_page: Array of pages of TSO header buffers   * @txd: The hardware descriptor ring   * @ptr_mask: The size of the ring minus 1. + * @piobuf: PIO buffer region for this TX queue (shared with its partner). + *	Size of the region is efx_piobuf_size. + * @piobuf_offset: Buffer offset to be specified in PIO descriptors   * @initialised: Has hardware queue been initialised?   * @read_count: Current read pointer.   *	This is the number of buffers that have been removed from both rings. @@ -209,6 +216,7 @@ struct efx_tx_buffer {   *	blocks   * @tso_packets: Number of packets via the TSO xmit path   * @pushes: Number of times the TX push feature has been used + * @pio_packets: Number of times the TX PIO feature has been used   * @empty_read_count: If the completion path has seen the queue as empty   *	and the transmission path has not yet checked this, the value of   *	@read_count bitwise-added to %EFX_EMPTY_COUNT_VALID; otherwise 0. @@ -223,6 +231,8 @@ struct efx_tx_queue {  	struct efx_buffer *tsoh_page;  	struct efx_special_buffer txd;  	unsigned int ptr_mask; +	void __iomem *piobuf; +	unsigned int piobuf_offset;  	bool initialised;  	/* Members used mainly on the completion path */ @@ -238,6 +248,7 @@ struct efx_tx_queue {  	unsigned int tso_long_headers;  	unsigned int tso_packets;  	unsigned int pushes; +	unsigned int pio_packets;  	/* Members shared between paths and sometimes updated */  	unsigned int empty_read_count ____cacheline_aligned_in_smp; @@ -277,12 +288,9 @@ struct efx_rx_buffer {   * Used to facilitate sharing dma mappings between recycled rx buffers   * and those passed up to the kernel.   * - * @refcnt: Number of struct efx_rx_buffer's referencing this page. - *	When refcnt falls to zero, the page is unmapped for dma   * @dma_addr: The dma address of this page.   */  struct efx_rx_page_state { -	unsigned refcnt;  	dma_addr_t dma_addr;  	unsigned int __pad[0] ____cacheline_aligned; @@ -352,10 +360,11 @@ struct efx_rx_queue {  	unsigned int slow_fill_count;  }; -enum efx_rx_alloc_method { -	RX_ALLOC_METHOD_AUTO = 0, -	RX_ALLOC_METHOD_SKB = 1, -	RX_ALLOC_METHOD_PAGE = 2, +enum efx_sync_events_state { +	SYNC_EVENTS_DISABLED = 0, +	SYNC_EVENTS_QUIESCENT, +	SYNC_EVENTS_REQUESTED, +	SYNC_EVENTS_VALID,  };  /** @@ -397,6 +406,9 @@ enum efx_rx_alloc_method {   *	by __efx_rx_packet(), if @rx_pkt_n_frags != 0   * @rx_queue: RX queue for this channel   * @tx_queue: TX queues for this channel + * @sync_events_state: Current state of sync events on this channel + * @sync_timestamp_major: Major part of the last ptp sync event + * @sync_timestamp_minor: Minor part of the last ptp sync event   */  struct efx_channel {  	struct efx_nic *efx; @@ -435,6 +447,10 @@ struct efx_channel {  	struct efx_rx_queue rx_queue;  	struct efx_tx_queue tx_queue[EFX_TXQ_TYPES]; + +	enum efx_sync_events_state sync_events_state; +	u32 sync_timestamp_major; +	u32 sync_timestamp_minor;  };  /** @@ -510,15 +526,6 @@ enum nic_state {  	STATE_RECOVERY = 3,	/* device recovering from PCI error */  }; -/* - * Alignment of the skb->head which wraps a page-allocated RX buffer - * - * The skb allocated to wrap an rx_buffer can have this alignment. Since - * the data is memcpy'd from the rx_buf, it does not need to be equal to - * NET_IP_ALIGN. - */ -#define EFX_PAGE_SKB_ALIGN 2 -  /* Forward declaration */  struct efx_nic; @@ -641,6 +648,13 @@ struct vfdi_status;   * struct efx_nic - an Efx NIC   * @name: Device name (net device name or bus id before net device registered)   * @pci_dev: The PCI device + * @node: List node for maintaning primary/secondary function lists + * @primary: &struct efx_nic instance for the primary function of this + *	controller.  May be the same structure, and may be %NULL if no + *	primary function is bound.  Serialised by rtnl_lock. + * @secondary_list: List of &struct efx_nic instances for the secondary PCI + *	functions of the controller, if this is for the primary function. + *	Serialised by rtnl_lock.   * @type: Controller type attributes   * @legacy_irq: IRQ number   * @workqueue: Workqueue for port reconfigures and the HW monitor. @@ -673,6 +687,8 @@ struct vfdi_status;   * @n_channels: Number of channels in use   * @n_rx_channels: Number of channels used for RX (= number of RX queues)   * @n_tx_channels: Number of channels used for TX + * @rx_ip_align: RX DMA address offset to have IP header aligned in + *	in accordance with NET_IP_ALIGN   * @rx_dma_len: Current maximum RX DMA length   * @rx_buffer_order: Order (log2) of number of pages for each RX buffer   * @rx_buffer_truesize: Amortised allocation size of an RX buffer, @@ -682,6 +698,8 @@ struct vfdi_status;   *	(valid only if @rx_prefix_size != 0; always negative)   * @rx_packet_len_offset: Offset of RX packet length from start of packet data   *	(valid only for NICs that set %EFX_RX_PKT_PREFIX_LEN; always negative) + * @rx_packet_ts_offset: Offset of timestamp from start of packet data + *	(valid only if channel->sync_timestamps_enabled; always negative)   * @rx_hash_key: Toeplitz hash key for RSS   * @rx_indir_table: Indirection table for RSS   * @rx_scatter: Scatter mode enabled for receives @@ -751,6 +769,7 @@ struct vfdi_status;   * @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 + * @vpd_sn: Serial number read from VPD   * @monitor_work: Hardware monitor workitem   * @biu_lock: BIU (bus interface unit) lock   * @last_irq_cpu: Last CPU to handle a possible test interrupt.  This @@ -765,6 +784,9 @@ struct efx_nic {  	/* The following fields should be written very rarely */  	char name[IFNAMSIZ]; +	struct list_head node; +	struct efx_nic *primary; +	struct list_head secondary_list;  	struct pci_dev *pci_dev;  	unsigned int port_num;  	const struct efx_nic_type *type; @@ -806,6 +828,7 @@ struct efx_nic {  	unsigned rss_spread;  	unsigned tx_channel_offset;  	unsigned n_tx_channels; +	unsigned int rx_ip_align;  	unsigned int rx_dma_len;  	unsigned int rx_buffer_order;  	unsigned int rx_buffer_truesize; @@ -815,6 +838,7 @@ struct efx_nic {  	unsigned int rx_prefix_size;  	int rx_packet_hash_offset;  	int rx_packet_len_offset; +	int rx_packet_ts_offset;  	u8 rx_hash_key[40];  	u32 rx_indir_table[128];  	bool rx_scatter; @@ -839,10 +863,14 @@ struct efx_nic {  	struct work_struct mac_work;  	bool port_enabled; +	bool mc_bist_for_other_fn;  	bool port_initialized;  	struct net_device *net_dev;  	struct efx_buffer stats_buffer; +	u64 rx_nodesc_drops_total; +	u64 rx_nodesc_drops_while_down; +	bool rx_nodesc_drops_prev_state;  	unsigned int phy_type;  	const struct efx_phy_operations *phy_op; @@ -894,6 +922,8 @@ struct efx_nic {  	struct efx_ptp_data *ptp_data; +	char *vpd_sn; +  	/* The following fields may be written more often */  	struct delayed_work monitor_work ____cacheline_aligned_in_smp; @@ -942,10 +972,13 @@ struct efx_mtd_partition {   *	(for Falcon architecture)   * @finish_flush: Clean up after flushing the DMA queues (for Falcon   *	architecture) + * @prepare_flr: Prepare for an FLR + * @finish_flr: Clean up after an FLR   * @describe_stats: Describe statistics for ethtool   * @update_stats: Update statistics not provided by event handling.   *	Either argument may be %NULL.   * @start_stats: Start the regular fetching of statistics + * @pull_stats: Pull stats from the NIC and wait until they arrive.   * @stop_stats: Stop the regular fetching of statistics   * @set_id_led: Set state of identifying LED or revert to automatic function   * @push_irq_moderation: Apply interrupt moderation value @@ -984,7 +1017,7 @@ struct efx_mtd_partition {   * @tx_init: Initialise TX queue on the NIC   * @tx_remove: Free resources for TX queue   * @tx_write: Write TX descriptors and doorbell - * @rx_push_indir_table: Write RSS indirection table to the NIC + * @rx_push_rss_config: Write RSS hash key and indirection table to the NIC   * @rx_probe: Allocate resources for RX queue   * @rx_init: Initialise RX queue on the NIC   * @rx_remove: Free resources for RX queue @@ -1004,7 +1037,8 @@ struct efx_mtd_partition {   * @filter_insert: add or replace a filter   * @filter_remove_safe: remove a filter by ID, carefully   * @filter_get_safe: retrieve a filter by ID, carefully - * @filter_clear_rx: remove RX filters by priority + * @filter_clear_rx: Remove all RX filters whose priority is less than or + *	equal to the given priority and is not %EFX_FILTER_PRI_AUTO   * @filter_count_rx_used: Get the number of filters in use at a given priority   * @filter_get_rx_id_limit: Get maximum value of a filter id, plus 1   * @filter_get_rx_ids: Get list of RX filters at a given priority @@ -1024,6 +1058,12 @@ struct efx_mtd_partition {   * @mtd_sync: Wait for write-back to complete on MTD partition.  This   *	also notifies the driver that a writer has finished using this   *	partition. + * @ptp_write_host_time: Send host time to MC as part of sync protocol + * @ptp_set_ts_sync_events: Enable or disable sync events for inline RX + *	timestamping, possibly only temporarily for the purposes of a reset. + * @ptp_set_ts_config: Set hardware timestamp configuration.  The flags + *	and tx_type will already have been validated but this operation + *	must validate and update rx_filter.   * @revision: Hardware architecture revision   * @txd_ptr_tbl_base: TX descriptor ring base address   * @rxd_ptr_tbl_base: RX descriptor ring base address @@ -1033,6 +1073,7 @@ struct efx_mtd_partition {   * @max_dma_mask: Maximum possible DMA mask   * @rx_prefix_size: Size of RX prefix before packet data   * @rx_hash_offset: Offset of RX flow hash within prefix + * @rx_ts_offset: Offset of timestamp within prefix   * @rx_buffer_padding: Size of padding at end of RX packet   * @can_rx_scatter: NIC is able to scatter packets to multiple buffers   * @always_rx_scatter: NIC will always scatter packets to multiple buffers @@ -1042,6 +1083,7 @@ struct efx_mtd_partition {   * @offload_features: net_device feature flags for protocol offload   *	features implemented in hardware   * @mcdi_max_ver: Maximum MCDI version supported + * @hwtstamp_filters: Mask of hardware timestamp filter types supported   */  struct efx_nic_type {  	unsigned int (*mem_map_size)(struct efx_nic *efx); @@ -1060,10 +1102,13 @@ struct efx_nic_type {  	int (*fini_dmaq)(struct efx_nic *efx);  	void (*prepare_flush)(struct efx_nic *efx);  	void (*finish_flush)(struct efx_nic *efx); +	void (*prepare_flr)(struct efx_nic *efx); +	void (*finish_flr)(struct efx_nic *efx);  	size_t (*describe_stats)(struct efx_nic *efx, u8 *names);  	size_t (*update_stats)(struct efx_nic *efx, u64 *full_stats,  			       struct rtnl_link_stats64 *core_stats);  	void (*start_stats)(struct efx_nic *efx); +	void (*pull_stats)(struct efx_nic *efx);  	void (*stop_stats)(struct efx_nic *efx);  	void (*set_id_led)(struct efx_nic *efx, enum efx_led_mode mode);  	void (*push_irq_moderation)(struct efx_channel *channel); @@ -1092,7 +1137,7 @@ struct efx_nic_type {  	void (*tx_init)(struct efx_tx_queue *tx_queue);  	void (*tx_remove)(struct efx_tx_queue *tx_queue);  	void (*tx_write)(struct efx_tx_queue *tx_queue); -	void (*rx_push_indir_table)(struct efx_nic *efx); +	void (*rx_push_rss_config)(struct efx_nic *efx);  	int (*rx_probe)(struct efx_rx_queue *rx_queue);  	void (*rx_init)(struct efx_rx_queue *rx_queue);  	void (*rx_remove)(struct efx_rx_queue *rx_queue); @@ -1117,8 +1162,8 @@ struct efx_nic_type {  	int (*filter_get_safe)(struct efx_nic *efx,  			       enum efx_filter_priority priority,  			       u32 filter_id, struct efx_filter_spec *); -	void (*filter_clear_rx)(struct efx_nic *efx, -				enum efx_filter_priority priority); +	int (*filter_clear_rx)(struct efx_nic *efx, +			       enum efx_filter_priority priority);  	u32 (*filter_count_rx_used)(struct efx_nic *efx,  				    enum efx_filter_priority priority);  	u32 (*filter_get_rx_id_limit)(struct efx_nic *efx); @@ -1142,6 +1187,9 @@ struct efx_nic_type {  	int (*mtd_sync)(struct mtd_info *mtd);  #endif  	void (*ptp_write_host_time)(struct efx_nic *efx, u32 host_time); +	int (*ptp_set_ts_sync_events)(struct efx_nic *efx, bool en, bool temp); +	int (*ptp_set_ts_config)(struct efx_nic *efx, +				 struct hwtstamp_config *init);  	int revision;  	unsigned int txd_ptr_tbl_base; @@ -1152,6 +1200,7 @@ struct efx_nic_type {  	u64 max_dma_mask;  	unsigned int rx_prefix_size;  	unsigned int rx_hash_offset; +	unsigned int rx_ts_offset;  	unsigned int rx_buffer_padding;  	bool can_rx_scatter;  	bool always_rx_scatter; @@ -1160,6 +1209,7 @@ struct efx_nic_type {  	netdev_features_t offload_features;  	int mcdi_max_ver;  	unsigned int max_rx_ip_filters; +	u32 hwtstamp_filters;  };  /************************************************************************** @@ -1277,7 +1327,6 @@ static inline struct efx_rx_buffer *efx_rx_buffer(struct efx_rx_queue *rx_queue,  	return &rx_queue->buffer[index];  } -  /**   * EFX_MAX_FRAME_LEN - calculate maximum frame length   *  | 
