rbdr
struct rbdr *rbdr;
rbdr = &qs->rbdr[qidx];
taskqueue_enqueue(rbdr->rbdr_taskq, &rbdr->rbdr_task_nowait);
nicvf_reclaim_rbdr(struct nicvf *nic, struct rbdr *rbdr, int qidx)
rbdr->head =
rbdr->tail =
struct rbdr *rbdr;
rbdr = &qs->rbdr[qidx];
nicvf_reclaim_rbdr(nic, rbdr, qidx);
(uint64_t)(rbdr->dmem.phys_base));
rbdr_cfg.lines = rbdr->dma_size / 128;
rbdr->thresh - 1);
nicvf_free_rbdr(nic, &qs->rbdr[qidx]);
if (nicvf_init_rbdr(nic, &qs->rbdr[qidx], qs->rbdr_len,
nicvf_alloc_rcv_buffer(struct nicvf *nic, struct rbdr *rbdr,
err = bus_dmamap_load_mbuf_sg(rbdr->rbdr_buff_dmat, dmap, mbuf, segs,
bus_dmamap_destroy(rbdr->rbdr_buff_dmat, dmap);
rinfo->dmat = rbdr->rbdr_buff_dmat;
nicvf_init_rbdr(struct nicvf *nic, struct rbdr *rbdr, int ring_len,
err = nicvf_alloc_q_desc_mem(nic, &rbdr->dmem, ring_len,
rbdr->desc = rbdr->dmem.base;
rbdr->dma_size = buf_size - NICVF_RCV_BUF_ALIGN_BYTES;
rbdr->enable = TRUE;
rbdr->thresh = RBDR_THRESH;
rbdr->nic = nic;
rbdr->idx = qidx;
&rbdr->rbdr_buff_dmat); /* dmat */
rbdr->rbdr_buff_dmaps = malloc(sizeof(*rbdr->rbdr_buff_dmaps) *
err = bus_dmamap_create(rbdr->rbdr_buff_dmat, 0, &dmap);
rbdr->rbdr_buff_dmaps[idx] = dmap;
err = nicvf_alloc_rcv_buffer(nic, rbdr, dmap, M_WAITOK,
desc = GET_RBDR_DESC(rbdr, idx);
TASK_INIT(&rbdr->rbdr_task, 0, nicvf_rbdr_task, rbdr);
TASK_INIT(&rbdr->rbdr_task_nowait, 0, nicvf_rbdr_task_nowait, rbdr);
rbdr->rbdr_taskq = taskqueue_create_fast("nicvf_rbdr_taskq", M_WAITOK,
taskqueue_thread_enqueue, &rbdr->rbdr_taskq);
taskqueue_start_threads(&rbdr->rbdr_taskq, 1, PI_NET, "%s: rbdr_taskq",
nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
if ((qs == NULL) || (rbdr == NULL))
rbdr->enable = FALSE;
if (rbdr->rbdr_taskq != NULL) {
while (taskqueue_cancel(rbdr->rbdr_taskq,
&rbdr->rbdr_task_nowait, NULL) != 0) {
taskqueue_drain(rbdr->rbdr_taskq,
&rbdr->rbdr_task_nowait);
taskqueue_free(rbdr->rbdr_taskq);
rbdr->rbdr_taskq = NULL;
&rbdr->rbdr_task, NULL) != 0) {
taskqueue_drain(taskqueue_thread, &rbdr->rbdr_task);
if (rbdr->rbdr_buff_dmat != NULL) {
head = rbdr->head;
tail = rbdr->tail;
desc = GET_RBDR_DESC(rbdr, head);
bus_dmamap_unload(rbdr->rbdr_buff_dmat, rinfo->dmap);
head &= (rbdr->dmem.q_len - 1);
desc = GET_RBDR_DESC(rbdr, tail);
bus_dmamap_unload(rbdr->rbdr_buff_dmat, rinfo->dmap);
if (rbdr->rbdr_buff_dmaps[idx] == NULL)
err = bus_dmamap_destroy(rbdr->rbdr_buff_dmat,
rbdr->rbdr_buff_dmaps[idx]);
rbdr->rbdr_buff_dmaps[idx] = NULL;
err = bus_dma_tag_destroy(rbdr->rbdr_buff_dmat);
rbdr->head = 0;
rbdr->tail = 0;
nicvf_free_q_desc_mem(nic, &rbdr->dmem);
nicvf_refill_rbdr(struct rbdr *rbdr, int mflags)
nic = rbdr->nic;
rbdr_idx = rbdr->idx;
if (!rbdr->enable)
tail &= (rbdr->dmem.q_len - 1);
dmap = rbdr->rbdr_buff_dmaps[tail];
if (nicvf_alloc_rcv_buffer(nic, rbdr, dmap, mflags,
desc = GET_RBDR_DESC(rbdr, tail);
struct rbdr *rbdr;
rbdr = (struct rbdr *)arg;
err = nicvf_refill_rbdr(rbdr, M_WAITOK);
struct rbdr *rbdr;
rbdr = (struct rbdr *)arg;
err = nicvf_refill_rbdr(rbdr, M_NOWAIT);
taskqueue_enqueue(taskqueue_thread, &rbdr->rbdr_task);
struct rbdr *rbdr_start;
struct rbdr *rbdr_cont;
struct rbdr rbdr[MAX_RCV_BUF_DESC_RINGS_PER_QS];