#include <linux/bitfield.h>
#include <linux/iopoll.h>
#include <linux/pci.h>
#include <net/netdev_queues.h>
#include <net/page_pool/helpers.h>
#include "fbnic.h"
#include "fbnic_csr.h"
#include "fbnic_netdev.h"
#include "fbnic_txrx.h"
struct fbnic_xmit_cb { … };
#define FBNIC_XMIT_CB(__skb) …
static u32 __iomem *fbnic_ring_csr_base(const struct fbnic_ring *ring)
{ … }
static u32 fbnic_ring_rd32(struct fbnic_ring *ring, unsigned int csr)
{ … }
static void fbnic_ring_wr32(struct fbnic_ring *ring, unsigned int csr, u32 val)
{ … }
static unsigned int fbnic_desc_unused(struct fbnic_ring *ring)
{ … }
static unsigned int fbnic_desc_used(struct fbnic_ring *ring)
{ … }
static struct netdev_queue *txring_txq(const struct net_device *dev,
const struct fbnic_ring *ring)
{ … }
static int fbnic_maybe_stop_tx(const struct net_device *dev,
struct fbnic_ring *ring,
const unsigned int size)
{ … }
static bool fbnic_tx_sent_queue(struct sk_buff *skb, struct fbnic_ring *ring)
{ … }
static void fbnic_unmap_single_twd(struct device *dev, __le64 *twd)
{ … }
static void fbnic_unmap_page_twd(struct device *dev, __le64 *twd)
{ … }
#define FBNIC_TWD_TYPE(_type) …
static bool
fbnic_tx_offloads(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
{ … }
static void
fbnic_rx_csum(u64 rcd, struct sk_buff *skb, struct fbnic_ring *rcq)
{ … }
static bool
fbnic_tx_map(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
{ … }
#define FBNIC_MIN_FRAME_LEN …
static netdev_tx_t
fbnic_xmit_frame_ring(struct sk_buff *skb, struct fbnic_ring *ring)
{ … }
netdev_tx_t fbnic_xmit_frame(struct sk_buff *skb, struct net_device *dev)
{ … }
netdev_features_t
fbnic_features_check(struct sk_buff *skb, struct net_device *dev,
netdev_features_t features)
{ … }
static void fbnic_clean_twq0(struct fbnic_napi_vector *nv, int napi_budget,
struct fbnic_ring *ring, bool discard,
unsigned int hw_head)
{ … }
static void fbnic_page_pool_init(struct fbnic_ring *ring, unsigned int idx,
struct page *page)
{ … }
static struct page *fbnic_page_pool_get(struct fbnic_ring *ring,
unsigned int idx)
{ … }
static void fbnic_page_pool_drain(struct fbnic_ring *ring, unsigned int idx,
struct fbnic_napi_vector *nv, int budget)
{ … }
static void fbnic_clean_twq(struct fbnic_napi_vector *nv, int napi_budget,
struct fbnic_q_triad *qt, s32 head0)
{ … }
static void
fbnic_clean_tcq(struct fbnic_napi_vector *nv, struct fbnic_q_triad *qt,
int napi_budget)
{ … }
static void fbnic_clean_bdq(struct fbnic_napi_vector *nv, int napi_budget,
struct fbnic_ring *ring, unsigned int hw_head)
{ … }
static void fbnic_bd_prep(struct fbnic_ring *bdq, u16 id, struct page *page)
{ … }
static void fbnic_fill_bdq(struct fbnic_napi_vector *nv, struct fbnic_ring *bdq)
{ … }
static unsigned int fbnic_hdr_pg_start(unsigned int pg_off)
{ … }
static unsigned int fbnic_hdr_pg_end(unsigned int pg_off, unsigned int len)
{ … }
static void fbnic_pkt_prepare(struct fbnic_napi_vector *nv, u64 rcd,
struct fbnic_pkt_buff *pkt,
struct fbnic_q_triad *qt)
{ … }
static void fbnic_add_rx_frag(struct fbnic_napi_vector *nv, u64 rcd,
struct fbnic_pkt_buff *pkt,
struct fbnic_q_triad *qt)
{ … }
static void fbnic_put_pkt_buff(struct fbnic_napi_vector *nv,
struct fbnic_pkt_buff *pkt, int budget)
{ … }
static struct sk_buff *fbnic_build_skb(struct fbnic_napi_vector *nv,
struct fbnic_pkt_buff *pkt)
{ … }
static enum pkt_hash_types fbnic_skb_hash_type(u64 rcd)
{ … }
static void fbnic_populate_skb_fields(struct fbnic_napi_vector *nv,
u64 rcd, struct sk_buff *skb,
struct fbnic_q_triad *qt)
{ … }
static bool fbnic_rcd_metadata_err(u64 rcd)
{ … }
static int fbnic_clean_rcq(struct fbnic_napi_vector *nv,
struct fbnic_q_triad *qt, int budget)
{ … }
static void fbnic_nv_irq_disable(struct fbnic_napi_vector *nv)
{ … }
static void fbnic_nv_irq_rearm(struct fbnic_napi_vector *nv)
{ … }
static int fbnic_poll(struct napi_struct *napi, int budget)
{ … }
static irqreturn_t fbnic_msix_clean_rings(int __always_unused irq, void *data)
{ … }
static void fbnic_aggregate_ring_rx_counters(struct fbnic_net *fbn,
struct fbnic_ring *rxr)
{ … }
static void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
struct fbnic_ring *txr)
{ … }
static void fbnic_remove_tx_ring(struct fbnic_net *fbn,
struct fbnic_ring *txr)
{ … }
static void fbnic_remove_rx_ring(struct fbnic_net *fbn,
struct fbnic_ring *rxr)
{ … }
static void fbnic_free_napi_vector(struct fbnic_net *fbn,
struct fbnic_napi_vector *nv)
{ … }
void fbnic_free_napi_vectors(struct fbnic_net *fbn)
{ … }
static void fbnic_name_napi_vector(struct fbnic_napi_vector *nv)
{ … }
#define FBNIC_PAGE_POOL_FLAGS …
static int fbnic_alloc_nv_page_pool(struct fbnic_net *fbn,
struct fbnic_napi_vector *nv)
{ … }
static void fbnic_ring_init(struct fbnic_ring *ring, u32 __iomem *doorbell,
int q_idx, u8 flags)
{ … }
static int fbnic_alloc_napi_vector(struct fbnic_dev *fbd, struct fbnic_net *fbn,
unsigned int v_count, unsigned int v_idx,
unsigned int txq_count, unsigned int txq_idx,
unsigned int rxq_count, unsigned int rxq_idx)
{ … }
int fbnic_alloc_napi_vectors(struct fbnic_net *fbn)
{ … }
static void fbnic_free_ring_resources(struct device *dev,
struct fbnic_ring *ring)
{ … }
static int fbnic_alloc_tx_ring_desc(struct fbnic_net *fbn,
struct fbnic_ring *txr)
{ … }
static int fbnic_alloc_tx_ring_buffer(struct fbnic_ring *txr)
{ … }
static int fbnic_alloc_tx_ring_resources(struct fbnic_net *fbn,
struct fbnic_ring *txr)
{ … }
static int fbnic_alloc_rx_ring_desc(struct fbnic_net *fbn,
struct fbnic_ring *rxr)
{ … }
static int fbnic_alloc_rx_ring_buffer(struct fbnic_ring *rxr)
{ … }
static int fbnic_alloc_rx_ring_resources(struct fbnic_net *fbn,
struct fbnic_ring *rxr)
{ … }
static void fbnic_free_qt_resources(struct fbnic_net *fbn,
struct fbnic_q_triad *qt)
{ … }
static int fbnic_alloc_tx_qt_resources(struct fbnic_net *fbn,
struct fbnic_q_triad *qt)
{ … }
static int fbnic_alloc_rx_qt_resources(struct fbnic_net *fbn,
struct fbnic_q_triad *qt)
{ … }
static void fbnic_free_nv_resources(struct fbnic_net *fbn,
struct fbnic_napi_vector *nv)
{ … }
static int fbnic_alloc_nv_resources(struct fbnic_net *fbn,
struct fbnic_napi_vector *nv)
{ … }
void fbnic_free_resources(struct fbnic_net *fbn)
{ … }
int fbnic_alloc_resources(struct fbnic_net *fbn)
{ … }
static void fbnic_disable_twq0(struct fbnic_ring *txr)
{ … }
static void fbnic_disable_tcq(struct fbnic_ring *txr)
{ … }
static void fbnic_disable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
{ … }
static void fbnic_disable_rcq(struct fbnic_ring *rxr)
{ … }
void fbnic_napi_disable(struct fbnic_net *fbn)
{ … }
void fbnic_disable(struct fbnic_net *fbn)
{ … }
static void fbnic_tx_flush(struct fbnic_dev *fbd)
{ … }
static void fbnic_tx_flush_off(struct fbnic_dev *fbd)
{ … }
struct fbnic_idle_regs { … };
static bool fbnic_all_idle(struct fbnic_dev *fbd,
const struct fbnic_idle_regs *regs,
unsigned int nregs)
{ … }
static void fbnic_idle_dump(struct fbnic_dev *fbd,
const struct fbnic_idle_regs *regs,
unsigned int nregs, const char *dir, int err)
{ … }
int fbnic_wait_all_queues_idle(struct fbnic_dev *fbd, bool may_fail)
{ … }
void fbnic_flush(struct fbnic_net *fbn)
{ … }
void fbnic_fill(struct fbnic_net *fbn)
{ … }
static void fbnic_enable_twq0(struct fbnic_ring *twq)
{ … }
static void fbnic_enable_tcq(struct fbnic_napi_vector *nv,
struct fbnic_ring *tcq)
{ … }
static void fbnic_enable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
{ … }
static void fbnic_config_drop_mode_rcq(struct fbnic_napi_vector *nv,
struct fbnic_ring *rcq)
{ … }
static void fbnic_enable_rcq(struct fbnic_napi_vector *nv,
struct fbnic_ring *rcq)
{ … }
void fbnic_enable(struct fbnic_net *fbn)
{ … }
static void fbnic_nv_irq_enable(struct fbnic_napi_vector *nv)
{ … }
void fbnic_napi_enable(struct fbnic_net *fbn)
{ … }
void fbnic_napi_depletion_check(struct net_device *netdev)
{ … }