/* * function to charge a given rq with buffers from a pool's free list * * dev - software handle to the device * rq - pointer to the RQ to charge * nbufs - numbers of buffers to be charged * * return number of rqe's charges. */ static inline int oce_rq_charge(struct oce_rq *rq, uint32_t nbufs, boolean_t repost) { struct oce_nic_rqe *rqe; oce_rq_bdesc_t *rqbd; oce_rq_bdesc_t **shadow_rq; int cnt; int cur_index; oce_ring_buffer_t *ring; shadow_rq = rq->shadow_ring; ring = rq->ring; cur_index = ring->cidx; for (cnt = 0; cnt < nbufs; cnt++) { if (!repost) { rqbd = oce_rqb_alloc(rq); } else { /* just repost the buffers from shadow ring */ rqbd = shadow_rq[cur_index]; cur_index = GET_Q_NEXT(cur_index, 1, ring->num_items); } /* fill the rqes */ rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe); rqe->u0.s.frag_pa_lo = rqbd->frag_addr.dw.addr_lo; rqe->u0.s.frag_pa_hi = rqbd->frag_addr.dw.addr_hi; shadow_rq[rq->ring->pidx] = rqbd; DW_SWAP(u32ptr(rqe), sizeof (struct oce_nic_rqe)); RING_PUT(rq->ring, 1); } return (cnt); } /* oce_rq_charge */
static void oce_fill_ring_descs(struct oce_wq *wq, oce_wqe_desc_t *wqed) { struct oce_nic_frag_wqe *wqe; int i; /* Copy the precreate WQE descs to the ring desc */ for (i = 0; i < wqed->wqe_cnt; i++) { wqe = RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_frag_wqe); bcopy(&wqed->frag[i], wqe, NIC_WQE_SIZE); RING_PUT(wq->ring, 1); } } /* oce_fill_ring_descs */