#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 void efx_unmap_rx_buffer(struct efx_nic *efx,
struct efx_rx_buffer *rx_buf);
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_siena_recycle_rx_pages(struct efx_channel *channel,
struct efx_rx_buffer *rx_buf,
unsigned int n_frags)
{ … }
void efx_siena_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_siena_probe_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_siena_init_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_siena_fini_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
void efx_siena_remove_rx_queue(struct efx_rx_queue *rx_queue)
{ … }
static void efx_unmap_rx_buffer(struct efx_nic *efx,
struct efx_rx_buffer *rx_buf)
{ … }
void efx_siena_free_rx_buffers(struct efx_rx_queue *rx_queue,
struct efx_rx_buffer *rx_buf,
unsigned int num_bufs)
{ … }
void efx_siena_rx_slow_fill(struct timer_list *t)
{ … }
static 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_siena_rx_config_page_split(struct efx_nic *efx)
{ … }
void efx_siena_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue,
bool atomic)
{ … }
void
efx_siena_rx_packet_gro(struct efx_channel *channel,
struct efx_rx_buffer *rx_buf,
unsigned int n_frags, u8 *eh, __wsum csum)
{ … }
void efx_siena_set_default_rx_indir_table(struct efx_nic *efx,
struct efx_rss_context *ctx)
{ … }
bool efx_siena_filter_is_mc_recipient(const struct efx_filter_spec *spec)
{ … }
bool efx_siena_filter_spec_equal(const struct efx_filter_spec *left,
const struct efx_filter_spec *right)
{ … }
u32 efx_siena_filter_spec_hash(const struct efx_filter_spec *spec)
{ … }
#ifdef CONFIG_RFS_ACCEL
bool efx_siena_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_siena_rps_hash_find(struct efx_nic *efx,
const struct efx_filter_spec *spec)
{ … }
static struct efx_arfs_rule *efx_rps_hash_add(struct efx_nic *efx,
const struct efx_filter_spec *spec,
bool *new)
{ … }
void efx_siena_rps_hash_del(struct efx_nic *efx,
const struct efx_filter_spec *spec)
{ … }
#endif
int efx_siena_probe_filters(struct efx_nic *efx)
{ … }
void efx_siena_remove_filters(struct efx_nic *efx)
{ … }
#ifdef CONFIG_RFS_ACCEL
static void efx_filter_rfs_work(struct work_struct *data)
{ … }
int efx_siena_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
u16 rxq_index, u32 flow_id)
{ … }
bool __efx_siena_filter_rfs_expire(struct efx_channel *channel,
unsigned int quota)
{ … }
#endif