#include "net_driver.h"
#include <linux/module.h>
#include <linux/iommu.h>
#include <net/rps.h>
#include "efx.h"
#include "nic.h"
#include "rx_common.h"
static unsigned int rx_refill_threshold;
module_param(rx_refill_threshold, uint, 0444);
MODULE_PARM_DESC(…) …;
#define EFX_RXD_HEAD_ROOM …
static struct page *efx_reuse_page(struct efx_rx_queue *rx_queue)
{ … }
static void efx_recycle_rx_page(struct efx_channel *channel,
struct efx_rx_buffer *rx_buf)
{ … }
void efx_recycle_rx_pages(struct efx_channel *channel,
struct efx_rx_buffer *rx_buf,
unsigned int n_frags)
{ … }
void efx_discard_rx_packet(struct efx_channel *channel,
struct efx_rx_buffer *rx_buf,
unsigned int n_frags)
{ … }
static void efx_init_rx_recycle_ring(struct efx_rx_queue *rx_queue)
{ … }
static void efx_fini_rx_recycle_ring(struct efx_rx_queue *rx_queue)
{ … }
static void efx_fini_rx_buffer(struct efx_rx_queue *rx_queue,
struct efx_rx_buffer *rx_buf)
{ … }
int efx_probe_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_init_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_fini_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_remove_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_unmap_rx_buffer(struct efx_nic *efx,
struct efx_rx_buffer *rx_buf)
{ … }
void efx_free_rx_buffers(struct efx_rx_queue *rx_queue,
struct efx_rx_buffer *rx_buf,
unsigned int num_bufs)
{ … }
void efx_rx_slow_fill(struct timer_list *t)
{ … }
void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue)
{ … }
static int efx_init_rx_buffers(struct efx_rx_queue *rx_queue, bool atomic)
{ … }
void efx_rx_config_page_split(struct efx_nic *efx)
{ … }
void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, bool atomic)
{ … }
void
efx_rx_packet_gro(struct efx_channel *channel, struct efx_rx_buffer *rx_buf,
unsigned int n_frags, u8 *eh, __wsum csum)
{ … }
struct efx_rss_context_priv *efx_find_rss_context_entry(struct efx_nic *efx,
u32 id)
{ … }
void efx_set_default_rx_indir_table(struct efx_nic *efx, u32 *indir)
{ … }
bool efx_filter_is_mc_recipient(const struct efx_filter_spec *spec)
{ … }
bool efx_filter_spec_equal(const struct efx_filter_spec *left,
const struct efx_filter_spec *right)
{ … }
u32 efx_filter_spec_hash(const struct efx_filter_spec *spec)
{ … }
#ifdef CONFIG_RFS_ACCEL
bool efx_rps_check_rule(struct efx_arfs_rule *rule, unsigned int filter_idx,
bool *force)
{ … }
static
struct hlist_head *efx_rps_hash_bucket(struct efx_nic *efx,
const struct efx_filter_spec *spec)
{ … }
struct efx_arfs_rule *efx_rps_hash_find(struct efx_nic *efx,
const struct efx_filter_spec *spec)
{ … }
struct efx_arfs_rule *efx_rps_hash_add(struct efx_nic *efx,
const struct efx_filter_spec *spec,
bool *new)
{ … }
void efx_rps_hash_del(struct efx_nic *efx, const struct efx_filter_spec *spec)
{ … }
#endif
int efx_probe_filters(struct efx_nic *efx)
{ … }
void efx_remove_filters(struct efx_nic *efx)
{ … }
#ifdef CONFIG_RFS_ACCEL
static void efx_filter_rfs_work(struct work_struct *data)
{ … }
int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
u16 rxq_index, u32 flow_id)
{ … }
bool __efx_filter_rfs_expire(struct efx_channel *channel, unsigned int quota)
{ … }
#endif