xref: /linux/drivers/net/ethernet/sfc/siena/rx_common.h (revision 9410645520e9b820069761f3450ef6661418e279)
1d48523cbSMartin Habets /* SPDX-License-Identifier: GPL-2.0-only */
2d48523cbSMartin Habets /****************************************************************************
3d48523cbSMartin Habets  * Driver for Solarflare network controllers and boards
4d48523cbSMartin Habets  * Copyright 2018 Solarflare Communications Inc.
5d48523cbSMartin Habets  *
6d48523cbSMartin Habets  * This program is free software; you can redistribute it and/or modify it
7d48523cbSMartin Habets  * under the terms of the GNU General Public License version 2 as published
8d48523cbSMartin Habets  * by the Free Software Foundation, incorporated herein by reference.
9d48523cbSMartin Habets  */
10d48523cbSMartin Habets 
11d48523cbSMartin Habets #ifndef EFX_RX_COMMON_H
12d48523cbSMartin Habets #define EFX_RX_COMMON_H
13d48523cbSMartin Habets 
14d48523cbSMartin Habets /* Preferred number of descriptors to fill at once */
15d48523cbSMartin Habets #define EFX_RX_PREFERRED_BATCH 8U
16d48523cbSMartin Habets 
17d48523cbSMartin Habets /* Each packet can consume up to ceil(max_frame_len / buffer_size) buffers */
18d48523cbSMartin Habets #define EFX_RX_MAX_FRAGS DIV_ROUND_UP(EFX_MAX_FRAME_LEN(EFX_MAX_MTU), \
19d48523cbSMartin Habets 				      EFX_RX_USR_BUF_SIZE)
20d48523cbSMartin Habets 
21d48523cbSMartin Habets /* Number of RX buffers to recycle pages for.  When creating the RX page recycle
22d48523cbSMartin Habets  * ring, this number is divided by the number of buffers per page to calculate
23d48523cbSMartin Habets  * the number of pages to store in the RX page recycle ring.
24d48523cbSMartin Habets  */
25d48523cbSMartin Habets #define EFX_RECYCLE_RING_SIZE_10G	256
26d48523cbSMartin Habets 
efx_rx_buf_va(struct efx_rx_buffer * buf)27d48523cbSMartin Habets static inline u8 *efx_rx_buf_va(struct efx_rx_buffer *buf)
28d48523cbSMartin Habets {
29d48523cbSMartin Habets 	return page_address(buf->page) + buf->page_offset;
30d48523cbSMartin Habets }
31d48523cbSMartin Habets 
efx_rx_buf_hash(struct efx_nic * efx,const u8 * eh)32d48523cbSMartin Habets static inline u32 efx_rx_buf_hash(struct efx_nic *efx, const u8 *eh)
33d48523cbSMartin Habets {
34d48523cbSMartin Habets #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
35d48523cbSMartin Habets 	return __le32_to_cpup((const __le32 *)(eh + efx->rx_packet_hash_offset));
36d48523cbSMartin Habets #else
37d48523cbSMartin Habets 	const u8 *data = eh + efx->rx_packet_hash_offset;
38d48523cbSMartin Habets 
39d48523cbSMartin Habets 	return (u32)data[0]	  |
40d48523cbSMartin Habets 	       (u32)data[1] << 8  |
41d48523cbSMartin Habets 	       (u32)data[2] << 16 |
42d48523cbSMartin Habets 	       (u32)data[3] << 24;
43d48523cbSMartin Habets #endif
44d48523cbSMartin Habets }
45d48523cbSMartin Habets 
46*7f9e4b2aSMartin Habets void efx_siena_rx_slow_fill(struct timer_list *t);
47d48523cbSMartin Habets 
48*7f9e4b2aSMartin Habets void efx_siena_recycle_rx_pages(struct efx_channel *channel,
49d48523cbSMartin Habets 				struct efx_rx_buffer *rx_buf,
50d48523cbSMartin Habets 				unsigned int n_frags);
51*7f9e4b2aSMartin Habets void efx_siena_discard_rx_packet(struct efx_channel *channel,
52d48523cbSMartin Habets 				 struct efx_rx_buffer *rx_buf,
53d48523cbSMartin Habets 				 unsigned int n_frags);
54d48523cbSMartin Habets 
55*7f9e4b2aSMartin Habets int efx_siena_probe_rx_queue(struct efx_rx_queue *rx_queue);
56*7f9e4b2aSMartin Habets void efx_siena_init_rx_queue(struct efx_rx_queue *rx_queue);
57*7f9e4b2aSMartin Habets void efx_siena_fini_rx_queue(struct efx_rx_queue *rx_queue);
58*7f9e4b2aSMartin Habets void efx_siena_remove_rx_queue(struct efx_rx_queue *rx_queue);
59d48523cbSMartin Habets 
efx_sync_rx_buffer(struct efx_nic * efx,struct efx_rx_buffer * rx_buf,unsigned int len)60d48523cbSMartin Habets static inline void efx_sync_rx_buffer(struct efx_nic *efx,
61d48523cbSMartin Habets 				      struct efx_rx_buffer *rx_buf,
62d48523cbSMartin Habets 				      unsigned int len)
63d48523cbSMartin Habets {
64d48523cbSMartin Habets 	dma_sync_single_for_cpu(&efx->pci_dev->dev, rx_buf->dma_addr, len,
65d48523cbSMartin Habets 				DMA_FROM_DEVICE);
66d48523cbSMartin Habets }
67d48523cbSMartin Habets 
68*7f9e4b2aSMartin Habets void efx_siena_free_rx_buffers(struct efx_rx_queue *rx_queue,
69d48523cbSMartin Habets 			       struct efx_rx_buffer *rx_buf,
70d48523cbSMartin Habets 			       unsigned int num_bufs);
71d48523cbSMartin Habets 
72*7f9e4b2aSMartin Habets void efx_siena_rx_config_page_split(struct efx_nic *efx);
73*7f9e4b2aSMartin Habets void efx_siena_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue,
74*7f9e4b2aSMartin Habets 					bool atomic);
75d48523cbSMartin Habets 
76d48523cbSMartin Habets void
7771ad88f6SMartin Habets efx_siena_rx_packet_gro(struct efx_channel *channel,
7871ad88f6SMartin Habets 			struct efx_rx_buffer *rx_buf,
79d48523cbSMartin Habets 			unsigned int n_frags, u8 *eh, __wsum csum);
80d48523cbSMartin Habets 
81*7f9e4b2aSMartin Habets void efx_siena_set_default_rx_indir_table(struct efx_nic *efx,
82d48523cbSMartin Habets 					  struct efx_rss_context *ctx);
83d48523cbSMartin Habets 
84*7f9e4b2aSMartin Habets bool efx_siena_filter_is_mc_recipient(const struct efx_filter_spec *spec);
85*7f9e4b2aSMartin Habets bool efx_siena_filter_spec_equal(const struct efx_filter_spec *left,
86d48523cbSMartin Habets 				 const struct efx_filter_spec *right);
87*7f9e4b2aSMartin Habets u32 efx_siena_filter_spec_hash(const struct efx_filter_spec *spec);
88d48523cbSMartin Habets 
89d48523cbSMartin Habets #ifdef CONFIG_RFS_ACCEL
90*7f9e4b2aSMartin Habets bool efx_siena_rps_check_rule(struct efx_arfs_rule *rule,
91*7f9e4b2aSMartin Habets 			      unsigned int filter_idx, bool *force);
92*7f9e4b2aSMartin Habets struct efx_arfs_rule *efx_siena_rps_hash_find(struct efx_nic *efx,
93d48523cbSMartin Habets 					const struct efx_filter_spec *spec);
94*7f9e4b2aSMartin Habets void efx_siena_rps_hash_del(struct efx_nic *efx,
95*7f9e4b2aSMartin Habets 			    const struct efx_filter_spec *spec);
96d48523cbSMartin Habets 
97*7f9e4b2aSMartin Habets int efx_siena_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
98d48523cbSMartin Habets 			 u16 rxq_index, u32 flow_id);
99*7f9e4b2aSMartin Habets bool __efx_siena_filter_rfs_expire(struct efx_channel *channel,
100*7f9e4b2aSMartin Habets 				   unsigned int quota);
101d48523cbSMartin Habets #endif
102d48523cbSMartin Habets 
103*7f9e4b2aSMartin Habets int efx_siena_probe_filters(struct efx_nic *efx);
104*7f9e4b2aSMartin Habets void efx_siena_remove_filters(struct efx_nic *efx);
105d48523cbSMartin Habets 
106d48523cbSMartin Habets #endif
107