Lines Matching refs:wq

34 static void oce_free_wqed(struct oce_wq *wq,  oce_wqe_desc_t *wqed);
35 static int oce_map_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed,
37 static int oce_bcopy_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed, mblk_t *mp,
39 static void oce_wqb_dtor(struct oce_wq *wq, oce_wq_bdesc_t *wqbd);
40 static int oce_wqb_ctor(oce_wq_bdesc_t *wqbd, struct oce_wq *wq,
42 static inline oce_wq_bdesc_t *oce_wqb_alloc(struct oce_wq *wq);
43 static void oce_wqb_free(struct oce_wq *wq, oce_wq_bdesc_t *wqbd);
45 static void oce_wqmd_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd);
46 static void oce_wqm_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd);
47 static oce_wq_mdesc_t *oce_wqm_alloc(struct oce_wq *wq);
48 static int oce_wqm_ctor(oce_wq_mdesc_t *wqmd, struct oce_wq *wq);
49 static void oce_wqm_dtor(struct oce_wq *wq, oce_wq_mdesc_t *wqmd);
50 static void oce_fill_ring_descs(struct oce_wq *wq, oce_wqe_desc_t *wqed);
53 static inline int oce_process_tx_compl(struct oce_wq *wq, boolean_t rearm);
90 * wq - Pointer to WQ structure
97 oce_wqm_dtor(struct oce_wq *wq, oce_wq_mdesc_t *wqmd)
99 _NOTE(ARGUNUSED(wq));
110 * wq - Pointer to WQ structure
115 oce_wqm_ctor(oce_wq_mdesc_t *wqmd, struct oce_wq *wq)
120 dev = wq->parent;
131 * wq - pointer to WQ structure
136 oce_wqm_cache_create(struct oce_wq *wq)
138 struct oce_dev *dev = wq->parent;
143 size = wq->cfg.nhdl * sizeof (oce_wq_mdesc_t);
144 wq->wq_mdesc_array = kmem_zalloc(size, KM_NOSLEEP);
145 if (wq->wq_mdesc_array == NULL) {
150 OCE_LIST_CREATE(&wq->wq_mdesc_list, DDI_INTR_PRI(dev->intr_pri));
152 for (cnt = 0; cnt < wq->cfg.nhdl; cnt++) {
153 ret = oce_wqm_ctor(&wq->wq_mdesc_array[cnt], wq);
157 OCE_LIST_INSERT_TAIL(&wq->wq_mdesc_list,
158 &wq->wq_mdesc_array[cnt]);
163 oce_wqm_cache_destroy(wq);
170 * wq - pointer to WQ structure
175 oce_wqm_cache_destroy(struct oce_wq *wq)
179 while ((wqmd = OCE_LIST_REM_HEAD(&wq->wq_mdesc_list)) != NULL) {
180 oce_wqm_dtor(wq, wqmd);
183 kmem_free(wq->wq_mdesc_array,
184 wq->cfg.nhdl * sizeof (oce_wq_mdesc_t));
186 OCE_LIST_DESTROY(&wq->wq_mdesc_list);
192 * wq - pointer to WQ structure
198 oce_wqb_cache_create(struct oce_wq *wq, size_t buf_size)
200 struct oce_dev *dev = wq->parent;
205 size = wq->cfg.nbufs * sizeof (oce_wq_bdesc_t);
206 wq->wq_bdesc_array = kmem_zalloc(size, KM_NOSLEEP);
207 if (wq->wq_bdesc_array == NULL) {
212 OCE_LIST_CREATE(&wq->wq_buf_list, DDI_INTR_PRI(dev->intr_pri));
214 for (cnt = 0; cnt < wq->cfg.nbufs; cnt++) {
215 ret = oce_wqb_ctor(&wq->wq_bdesc_array[cnt],
216 wq, buf_size, DDI_DMA_STREAMING);
220 OCE_LIST_INSERT_TAIL(&wq->wq_buf_list,
221 &wq->wq_bdesc_array[cnt]);
226 oce_wqb_cache_destroy(wq);
233 * wq - pointer to WQ structure
238 oce_wqb_cache_destroy(struct oce_wq *wq)
241 while ((wqbd = OCE_LIST_REM_HEAD(&wq->wq_buf_list)) != NULL) {
242 oce_wqb_dtor(wq, wqbd);
244 kmem_free(wq->wq_bdesc_array,
245 wq->cfg.nbufs * sizeof (oce_wq_bdesc_t));
246 OCE_LIST_DESTROY(&wq->wq_buf_list);
253 * wq - pointer to WQ structure
260 oce_wqb_ctor(oce_wq_bdesc_t *wqbd, struct oce_wq *wq, size_t size, int flags)
263 dev = wq->parent;
278 * wq - pointer to WQ structure
284 oce_wqb_dtor(struct oce_wq *wq, oce_wq_bdesc_t *wqbd)
286 oce_free_dma_buffer(wq->parent, wqbd->wqb);
292 * wq - pointer to WQ structure
297 oce_wqb_alloc(struct oce_wq *wq)
299 return (OCE_LIST_REM_HEAD(&wq->wq_buf_list));
305 * wq - pointer to WQ structure
311 oce_wqb_free(struct oce_wq *wq, oce_wq_bdesc_t *wqbd)
313 OCE_LIST_INSERT_TAIL(&wq->wq_buf_list, wqbd);
319 * wq - pointer to WQ structure
324 oce_wqm_alloc(struct oce_wq *wq)
326 return (OCE_LIST_REM_HEAD(&wq->wq_mdesc_list));
332 * wq - pointer to WQ structure
338 oce_wqm_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd)
340 OCE_LIST_INSERT_TAIL(&wq->wq_mdesc_list, wqmd);
346 * wq - pointer to WQ structure
352 oce_wqmd_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd)
358 oce_wqm_free(wq, wqmd);
404 struct oce_wq *wq;
413 wq = dev->wq[qidx];
415 return (wq);
421 * wq - pointer to wq
428 oce_fill_ring_descs(struct oce_wq *wq, oce_wqe_desc_t *wqed)
435 wqe = RING_GET_PRODUCER_ITEM_VA(wq->ring,
439 RING_PUT(wq->ring, 1);
446 * wq - pointer to WQ
454 oce_bcopy_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed, mblk_t *mp,
459 struct oce_dev *dev = wq->parent;
462 wqbd = oce_wqb_alloc(wq);
488 oce_wqb_free(wq, wqbd);
503 * wq - pointer to WQ
510 oce_map_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed, mblk_t *mp,
517 struct oce_dev *dev = wq->parent;
519 wqmd = oce_wqm_alloc(wq);
534 oce_wqm_free(wq, wqmd);
559 oce_process_tx_compl(struct oce_wq *wq, boolean_t rearm)
568 cq = wq->cq;
569 dev = wq->parent;
573 mutex_enter(&wq->txc_lock);
585 wqed = OCE_LIST_REM_HEAD(&wq->wqe_desc_list);
588 oce_free_wqed(wq, wqed);
589 RING_GET(wq->ring, wqe_freed);
590 atomic_add_32(&wq->wq_free, wqe_freed);
598 mutex_exit(&wq->txc_lock);
600 oce_arm_cq(wq->parent, cq->cq_id, num_cqe, rearm);
617 struct oce_wq *wq;
619 wq = (struct oce_wq *)arg;
620 dev = wq->parent;
623 num_cqe = oce_process_tx_compl(wq, B_FALSE);
626 if (wq->resched && num_cqe) {
627 wq->resched = B_FALSE;
673 * wq - pointer to WQ
679 oce_send_packet(struct oce_wq *wq, mblk_t *mp)
705 dev = wq->parent;
708 if (wq->wq_free < dev->tx_reclaim_threshold) {
709 (void) oce_process_tx_compl(wq, B_FALSE);
711 if (wq->wq_free < OCE_MAX_TX_HDL) {
736 atomic_inc_32(&wq->pkt_drops);
746 wqed = kmem_cache_alloc(wq->wqed_cache, KM_NOSLEEP);
748 atomic_inc_32(&wq->pkt_drops);
767 wqed->wq = wq;
777 ret = oce_bcopy_wqe(wq, wqed, mp, pkt_len);
786 ret = oce_bcopy_wqe(wq, wqed, nmp, len);
788 ret = oce_map_wqe(wq, wqed, nmp, len);
800 oce_free_wqed(wq, wqed);
801 atomic_inc_32(&wq->pkt_drops);
851 mutex_enter(&wq->tx_lock);
852 if (num_wqes > wq->wq_free) {
853 atomic_inc_32(&wq->tx_deferd);
854 mutex_exit(&wq->tx_lock);
857 atomic_add_32(&wq->wq_free, -num_wqes);
859 /* fill the wq for adapter */
860 oce_fill_ring_descs(wq, wqed);
863 OCE_LIST_INSERT_TAIL(&wq->wqe_desc_list, wqed);
864 (void) ddi_dma_sync(wq->ring->dbuf->dma_handle, 0, 0,
868 reg_value = (num_wqes << 16) | wq->wq_id;
871 mutex_exit(&wq->tx_lock);
888 oce_free_wqed(wq, wqed);
895 * wq - pointer to WQ
902 oce_free_wqed(struct oce_wq *wq, oce_wqe_desc_t *wqed)
911 oce_wqb_free(wq, wqed->hdesc[i].hdl);
913 oce_wqmd_free(wq, wqed->hdesc[i].hdl);
918 kmem_cache_free(wq->wqed_cache, wqed);
924 * wq - pointer to WQ
930 oce_start_wq(struct oce_wq *wq)
932 _NOTE(ARGUNUSED(wq));
939 * wq - pointer to WQ
944 oce_clean_wq(struct oce_wq *wq)
952 (void) oce_process_tx_compl(wq, B_FALSE);
957 while ((wqed = OCE_LIST_REM_HEAD(&wq->wqe_desc_list)) != NULL) {
958 atomic_add_32(&wq->wq_free, wqed->wqe_cnt);
959 oce_free_wqed(wq, wqed);
961 oce_drain_eq(wq->cq->eq);