Lines Matching refs:txq

54 	struct dpmaif_tx_queue *txq = &dpmaif_ctrl->txq[q_num];  in t7xx_dpmaif_update_drb_rd_idx()  local
58 if (!txq->que_started) in t7xx_dpmaif_update_drb_rd_idx()
61 old_sw_rd_idx = txq->drb_rd_idx; in t7xx_dpmaif_update_drb_rd_idx()
71 drb_cnt = txq->drb_size_cnt - old_sw_rd_idx + new_hw_rd_idx; in t7xx_dpmaif_update_drb_rd_idx()
73 spin_lock_irqsave(&txq->tx_lock, flags); in t7xx_dpmaif_update_drb_rd_idx()
74 txq->drb_rd_idx = new_hw_rd_idx; in t7xx_dpmaif_update_drb_rd_idx()
75 spin_unlock_irqrestore(&txq->tx_lock, flags); in t7xx_dpmaif_update_drb_rd_idx()
83 struct dpmaif_tx_queue *txq = &dpmaif_ctrl->txq[q_num]; in t7xx_dpmaif_release_tx_buffer() local
90 drb_skb_base = txq->drb_skb_base; in t7xx_dpmaif_release_tx_buffer()
91 drb_base = txq->drb_base; in t7xx_dpmaif_release_tx_buffer()
93 spin_lock_irqsave(&txq->tx_lock, flags); in t7xx_dpmaif_release_tx_buffer()
94 drb_cnt = txq->drb_size_cnt; in t7xx_dpmaif_release_tx_buffer()
95 cur_idx = txq->drb_release_rd_idx; in t7xx_dpmaif_release_tx_buffer()
96 spin_unlock_irqrestore(&txq->tx_lock, flags); in t7xx_dpmaif_release_tx_buffer()
119 spin_lock_irqsave(&txq->tx_lock, flags); in t7xx_dpmaif_release_tx_buffer()
121 txq->drb_release_rd_idx = cur_idx; in t7xx_dpmaif_release_tx_buffer()
122 spin_unlock_irqrestore(&txq->tx_lock, flags); in t7xx_dpmaif_release_tx_buffer()
124 if (atomic_inc_return(&txq->tx_budget) > txq->drb_size_cnt / 8) in t7xx_dpmaif_release_tx_buffer()
125 cb->state_notify(dpmaif_ctrl->t7xx_dev, DMPAIF_TXQ_STATE_IRQ, txq->index); in t7xx_dpmaif_release_tx_buffer()
137 struct dpmaif_tx_queue *txq = &dpmaif_ctrl->txq[q_num]; in t7xx_dpmaif_tx_release() local
143 rel_cnt = t7xx_ring_buf_rd_wr_count(txq->drb_size_cnt, txq->drb_release_rd_idx, in t7xx_dpmaif_tx_release()
144 txq->drb_rd_idx, DPMAIF_READ); in t7xx_dpmaif_tx_release()
153 static bool t7xx_dpmaif_drb_ring_not_empty(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_drb_ring_not_empty() argument
155 return !!t7xx_dpmaif_update_drb_rd_idx(txq->dpmaif_ctrl, txq->index); in t7xx_dpmaif_drb_ring_not_empty()
160 struct dpmaif_tx_queue *txq = container_of(work, struct dpmaif_tx_queue, dpmaif_tx_work); in t7xx_dpmaif_tx_done() local
161 struct dpmaif_ctrl *dpmaif_ctrl = txq->dpmaif_ctrl; in t7xx_dpmaif_tx_done()
173 ret = t7xx_dpmaif_tx_release(dpmaif_ctrl, txq->index, txq->drb_size_cnt); in t7xx_dpmaif_tx_done()
175 (t7xx_dpmaif_ul_clr_done(hw_info, txq->index) && in t7xx_dpmaif_tx_done()
176 t7xx_dpmaif_drb_ring_not_empty(txq))) { in t7xx_dpmaif_tx_done()
177 queue_work(dpmaif_ctrl->txq[txq->index].worker, in t7xx_dpmaif_tx_done()
178 &dpmaif_ctrl->txq[txq->index].dpmaif_tx_work); in t7xx_dpmaif_tx_done()
183 t7xx_dpmaif_unmask_ulq_intr(hw_info, txq->index); in t7xx_dpmaif_tx_done()
196 struct dpmaif_drb *drb_base = dpmaif_ctrl->txq[q_num].drb_base; in t7xx_setup_msg_drb()
212 struct dpmaif_drb *drb_base = dpmaif_ctrl->txq[q_num].drb_base; in t7xx_setup_payload_drb()
230 struct dpmaif_drb_skb *drb_skb_base = dpmaif_ctrl->txq[q_num].drb_skb_base; in t7xx_record_drb_skb()
248 struct dpmaif_tx_queue *txq; in t7xx_dpmaif_add_skb_to_ring() local
253 txq = &dpmaif_ctrl->txq[skb_cb->txq_number]; in t7xx_dpmaif_add_skb_to_ring()
254 if (!txq->que_started || dpmaif_ctrl->state != DPMAIF_STATE_PWRON) in t7xx_dpmaif_add_skb_to_ring()
257 atomic_set(&txq->tx_processing, 1); in t7xx_dpmaif_add_skb_to_ring()
269 spin_lock_irqsave(&txq->tx_lock, flags); in t7xx_dpmaif_add_skb_to_ring()
270 cur_idx = txq->drb_wr_idx; in t7xx_dpmaif_add_skb_to_ring()
272 txq->drb_wr_idx += send_cnt; in t7xx_dpmaif_add_skb_to_ring()
273 if (txq->drb_wr_idx >= txq->drb_size_cnt) in t7xx_dpmaif_add_skb_to_ring()
274 txq->drb_wr_idx -= txq->drb_size_cnt; in t7xx_dpmaif_add_skb_to_ring()
275 t7xx_setup_msg_drb(dpmaif_ctrl, txq->index, cur_idx, skb->len, 0, skb_cb->netif_idx); in t7xx_dpmaif_add_skb_to_ring()
276 t7xx_record_drb_skb(dpmaif_ctrl, txq->index, cur_idx, skb, true, 0, 0, 0, 0); in t7xx_dpmaif_add_skb_to_ring()
277 spin_unlock_irqrestore(&txq->tx_lock, flags); in t7xx_dpmaif_add_skb_to_ring()
301 cur_idx = t7xx_ring_buf_get_next_wr_idx(txq->drb_size_cnt, cur_idx); in t7xx_dpmaif_add_skb_to_ring()
303 spin_lock_irqsave(&txq->tx_lock, flags); in t7xx_dpmaif_add_skb_to_ring()
304 t7xx_setup_payload_drb(dpmaif_ctrl, txq->index, cur_idx, bus_addr, data_len, in t7xx_dpmaif_add_skb_to_ring()
306 t7xx_record_drb_skb(dpmaif_ctrl, txq->index, cur_idx, skb, false, is_frag, in t7xx_dpmaif_add_skb_to_ring()
308 spin_unlock_irqrestore(&txq->tx_lock, flags); in t7xx_dpmaif_add_skb_to_ring()
311 if (atomic_sub_return(send_cnt, &txq->tx_budget) <= (MAX_SKB_FRAGS + 2)) in t7xx_dpmaif_add_skb_to_ring()
312 cb->state_notify(dpmaif_ctrl->t7xx_dev, DMPAIF_TXQ_STATE_FULL, txq->index); in t7xx_dpmaif_add_skb_to_ring()
314 atomic_set(&txq->tx_processing, 0); in t7xx_dpmaif_add_skb_to_ring()
320 struct dpmaif_drb_skb *drb_skb = txq->drb_skb_base; in t7xx_dpmaif_add_skb_to_ring()
322 cur_idx = cur_idx ? cur_idx - 1 : txq->drb_size_cnt - 1; in t7xx_dpmaif_add_skb_to_ring()
328 txq->drb_wr_idx = drb_wr_idx_backup; in t7xx_dpmaif_add_skb_to_ring()
329 atomic_set(&txq->tx_processing, 0); in t7xx_dpmaif_add_skb_to_ring()
339 if (!skb_queue_empty(&dpmaif_ctrl->txq[i].tx_skb_head)) in t7xx_tx_lists_are_all_empty()
349 struct dpmaif_tx_queue *txq; in t7xx_select_tx_queue() local
351 txq = &dpmaif_ctrl->txq[DPMAIF_TX_DEFAULT_QUEUE]; in t7xx_select_tx_queue()
352 if (!txq->que_started) in t7xx_select_tx_queue()
355 return txq; in t7xx_select_tx_queue()
358 static unsigned int t7xx_txq_drb_wr_available(struct dpmaif_tx_queue *txq) in t7xx_txq_drb_wr_available() argument
360 return t7xx_ring_buf_rd_wr_count(txq->drb_size_cnt, txq->drb_release_rd_idx, in t7xx_txq_drb_wr_available()
361 txq->drb_wr_idx, DPMAIF_WRITE); in t7xx_txq_drb_wr_available()
370 static int t7xx_txq_burst_send_skb(struct dpmaif_tx_queue *txq) in t7xx_txq_burst_send_skb() argument
377 drb_remain_cnt = t7xx_txq_drb_wr_available(txq); in t7xx_txq_burst_send_skb()
382 skb = skb_peek(&txq->tx_skb_head); in t7xx_txq_burst_send_skb()
388 drb_remain_cnt = t7xx_txq_drb_wr_available(txq); in t7xx_txq_burst_send_skb()
394 ret = t7xx_dpmaif_add_skb_to_ring(txq->dpmaif_ctrl, skb); in t7xx_txq_burst_send_skb()
396 dev_err(txq->dpmaif_ctrl->dev, in t7xx_txq_burst_send_skb()
402 skb_unlink(skb, &txq->tx_skb_head); in t7xx_txq_burst_send_skb()
416 struct dpmaif_tx_queue *txq; in t7xx_do_tx_hw_push() local
419 txq = t7xx_select_tx_queue(dpmaif_ctrl); in t7xx_do_tx_hw_push()
420 if (!txq) in t7xx_do_tx_hw_push()
423 drb_send_cnt = t7xx_txq_burst_send_skb(txq); in t7xx_do_tx_hw_push()
438 t7xx_dpmaif_ul_update_hw_drb_cnt(&dpmaif_ctrl->hw_info, txq->index, in t7xx_do_tx_hw_push()
510 struct dpmaif_tx_queue *txq = &dpmaif_ctrl->txq[txq_number]; in t7xx_dpmaif_tx_send_skb() local
514 if (atomic_read(&txq->tx_budget) <= t7xx_skb_drb_cnt(skb)) { in t7xx_dpmaif_tx_send_skb()
521 skb_queue_tail(&txq->tx_skb_head, skb); in t7xx_dpmaif_tx_send_skb()
533 queue_work(dpmaif_ctrl->txq[i].worker, &dpmaif_ctrl->txq[i].dpmaif_tx_work); in t7xx_dpmaif_irq_tx_done()
537 static int t7xx_dpmaif_tx_drb_buf_init(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_tx_drb_buf_init() argument
544 txq->drb_size_cnt = DPMAIF_DRB_LIST_LEN; in t7xx_dpmaif_tx_drb_buf_init()
547 txq->drb_base = dma_alloc_coherent(txq->dpmaif_ctrl->dev, brb_pd_size, in t7xx_dpmaif_tx_drb_buf_init()
548 &txq->drb_bus_addr, GFP_KERNEL | __GFP_ZERO); in t7xx_dpmaif_tx_drb_buf_init()
549 if (!txq->drb_base) in t7xx_dpmaif_tx_drb_buf_init()
553 txq->drb_skb_base = devm_kzalloc(txq->dpmaif_ctrl->dev, brb_skb_size, GFP_KERNEL); in t7xx_dpmaif_tx_drb_buf_init()
554 if (!txq->drb_skb_base) { in t7xx_dpmaif_tx_drb_buf_init()
555 dma_free_coherent(txq->dpmaif_ctrl->dev, brb_pd_size, in t7xx_dpmaif_tx_drb_buf_init()
556 txq->drb_base, txq->drb_bus_addr); in t7xx_dpmaif_tx_drb_buf_init()
563 static void t7xx_dpmaif_tx_free_drb_skb(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_tx_free_drb_skb() argument
565 struct dpmaif_drb_skb *drb_skb, *drb_skb_base = txq->drb_skb_base; in t7xx_dpmaif_tx_free_drb_skb()
571 for (i = 0; i < txq->drb_size_cnt; i++) { in t7xx_dpmaif_tx_free_drb_skb()
577 dma_unmap_single(txq->dpmaif_ctrl->dev, drb_skb->bus_addr, in t7xx_dpmaif_tx_free_drb_skb()
587 static void t7xx_dpmaif_tx_drb_buf_rel(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_tx_drb_buf_rel() argument
589 if (txq->drb_base) in t7xx_dpmaif_tx_drb_buf_rel()
590 dma_free_coherent(txq->dpmaif_ctrl->dev, in t7xx_dpmaif_tx_drb_buf_rel()
591 txq->drb_size_cnt * sizeof(struct dpmaif_drb), in t7xx_dpmaif_tx_drb_buf_rel()
592 txq->drb_base, txq->drb_bus_addr); in t7xx_dpmaif_tx_drb_buf_rel()
594 t7xx_dpmaif_tx_free_drb_skb(txq); in t7xx_dpmaif_tx_drb_buf_rel()
607 int t7xx_dpmaif_txq_init(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_txq_init() argument
611 skb_queue_head_init(&txq->tx_skb_head); in t7xx_dpmaif_txq_init()
612 init_waitqueue_head(&txq->req_wq); in t7xx_dpmaif_txq_init()
613 atomic_set(&txq->tx_budget, DPMAIF_DRB_LIST_LEN); in t7xx_dpmaif_txq_init()
615 ret = t7xx_dpmaif_tx_drb_buf_init(txq); in t7xx_dpmaif_txq_init()
617 dev_err(txq->dpmaif_ctrl->dev, "Failed to initialize DRB buffers: %d\n", ret); in t7xx_dpmaif_txq_init()
621 txq->worker = alloc_ordered_workqueue("md_dpmaif_tx%d_worker", in t7xx_dpmaif_txq_init()
622 WQ_MEM_RECLAIM | (txq->index ? 0 : WQ_HIGHPRI), in t7xx_dpmaif_txq_init()
623 txq->index); in t7xx_dpmaif_txq_init()
624 if (!txq->worker) in t7xx_dpmaif_txq_init()
627 INIT_WORK(&txq->dpmaif_tx_work, t7xx_dpmaif_tx_done); in t7xx_dpmaif_txq_init()
628 spin_lock_init(&txq->tx_lock); in t7xx_dpmaif_txq_init()
633 void t7xx_dpmaif_txq_free(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_txq_free() argument
635 if (txq->worker) in t7xx_dpmaif_txq_free()
636 destroy_workqueue(txq->worker); in t7xx_dpmaif_txq_free()
638 skb_queue_purge(&txq->tx_skb_head); in t7xx_dpmaif_txq_free()
639 t7xx_dpmaif_tx_drb_buf_rel(txq); in t7xx_dpmaif_txq_free()
647 struct dpmaif_tx_queue *txq; in t7xx_dpmaif_tx_stop() local
650 txq = &dpmaif_ctrl->txq[i]; in t7xx_dpmaif_tx_stop()
651 txq->que_started = false; in t7xx_dpmaif_tx_stop()
656 while (atomic_read(&txq->tx_processing)) { in t7xx_dpmaif_tx_stop()
665 static void t7xx_dpmaif_txq_flush_rel(struct dpmaif_tx_queue *txq) in t7xx_dpmaif_txq_flush_rel() argument
667 txq->que_started = false; in t7xx_dpmaif_txq_flush_rel()
669 cancel_work_sync(&txq->dpmaif_tx_work); in t7xx_dpmaif_txq_flush_rel()
670 flush_work(&txq->dpmaif_tx_work); in t7xx_dpmaif_txq_flush_rel()
671 t7xx_dpmaif_tx_free_drb_skb(txq); in t7xx_dpmaif_txq_flush_rel()
673 txq->drb_rd_idx = 0; in t7xx_dpmaif_txq_flush_rel()
674 txq->drb_wr_idx = 0; in t7xx_dpmaif_txq_flush_rel()
675 txq->drb_release_rd_idx = 0; in t7xx_dpmaif_txq_flush_rel()
683 t7xx_dpmaif_txq_flush_rel(&dpmaif_ctrl->txq[i]); in t7xx_dpmaif_tx_clear()