rbdr
pgcache = &rbdr->pgcache[rbdr->pgidx];
if (nicvf_init_rbdr(nic, &qs->rbdr[qidx], qs->rbdr_len,
if (rbdr->is_xdp) {
if (rbdr->pgalloc >= rbdr->pgcnt) {
rbdr->pgalloc++;
if (rbdr->is_xdp) {
rbdr->pgidx++;
rbdr->pgidx &= (rbdr->pgcnt - 1);
next = &rbdr->pgcache[rbdr->pgidx];
static inline int nicvf_alloc_rcv_buffer(struct nicvf *nic, struct rbdr *rbdr,
if (!rbdr->is_xdp && nic->rb_page &&
pgcache = nicvf_alloc_page(nic, rbdr, gfp);
if (rbdr->is_xdp)
if (rbdr->is_xdp && pgcache && pgcache->dma_addr) {
static int nicvf_init_rbdr(struct nicvf *nic, struct rbdr *rbdr,
err = nicvf_alloc_q_desc_mem(nic, &rbdr->dmem, ring_len,
rbdr->desc = rbdr->dmem.base;
rbdr->dma_size = buf_size;
rbdr->enable = true;
rbdr->thresh = RBDR_THRESH;
rbdr->head = 0;
rbdr->tail = 0;
rbdr->pgcnt = ring_len / (PAGE_SIZE / buf_size);
rbdr->is_xdp = false;
rbdr->pgcnt = ring_len;
rbdr->is_xdp = true;
rbdr->pgcnt = roundup_pow_of_two(rbdr->pgcnt);
rbdr->pgcache = kzalloc_objs(*rbdr->pgcache, rbdr->pgcnt);
if (!rbdr->pgcache)
rbdr->pgidx = 0;
rbdr->pgalloc = 0;
err = nicvf_alloc_rcv_buffer(nic, rbdr, GFP_KERNEL,
rbdr->tail = idx - 1;
desc = GET_RBDR_DESC(rbdr, idx);
static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
if (!rbdr)
rbdr->enable = false;
if (!rbdr->dmem.base)
head = rbdr->head;
tail = rbdr->tail;
desc = GET_RBDR_DESC(rbdr, head);
head &= (rbdr->dmem.q_len - 1);
desc = GET_RBDR_DESC(rbdr, tail);
while (head < rbdr->pgcnt) {
pgcache = &rbdr->pgcache[head];
if (rbdr->is_xdp) {
nicvf_free_q_desc_mem(nic, &rbdr->dmem);
struct rbdr *rbdr;
rbdr = &qs->rbdr[rbdr_idx];
if (!rbdr->enable)
tail &= (rbdr->dmem.q_len - 1);
if (nicvf_alloc_rcv_buffer(nic, rbdr, gfp, RCV_FRAG_LEN, &rbuf))
desc = GET_RBDR_DESC(rbdr, tail);
if (!nic->rb_alloc_fail && rbdr->enable &&
struct rbdr *rbdr, int qidx)
rbdr->head = nicvf_queue_reg_read(nic,
rbdr->tail = nicvf_queue_reg_read(nic,
struct rbdr *rbdr;
rbdr = &qs->rbdr[qidx];
nicvf_reclaim_rbdr(nic, rbdr, qidx);
qidx, (u64)(rbdr->dmem.phys_base));
rbdr_cfg.lines = rbdr->dma_size / 128;
struct rbdr *rbdr, gfp_t gfp)
qidx, rbdr->thresh - 1);
nicvf_free_rbdr(nic, &qs->rbdr[qidx]);
struct rbdr *rbdr_start;
struct rbdr *rbdr_cont;
struct rbdr rbdr[MAX_RCV_BUF_DESC_RINGS_PER_QS];