Lines Matching refs:sdma

110 	struct prestera_sdma sdma;  member
113 static int prestera_sdma_buf_init(struct prestera_sdma *sdma, in prestera_sdma_buf_init() argument
119 desc = dma_pool_alloc(sdma->desc_pool, GFP_DMA | GFP_KERNEL, &dma); in prestera_sdma_buf_init()
131 static u32 prestera_sdma_map(struct prestera_sdma *sdma, dma_addr_t pa) in prestera_sdma_map() argument
133 return sdma->map_addr + pa; in prestera_sdma_map()
136 static void prestera_sdma_rx_desc_init(struct prestera_sdma *sdma, in prestera_sdma_rx_desc_init() argument
145 desc->buff = cpu_to_le32(prestera_sdma_map(sdma, buf)); in prestera_sdma_rx_desc_init()
153 static void prestera_sdma_rx_desc_set_next(struct prestera_sdma *sdma, in prestera_sdma_rx_desc_set_next() argument
157 desc->next = cpu_to_le32(prestera_sdma_map(sdma, next)); in prestera_sdma_rx_desc_set_next()
160 static int prestera_sdma_rx_skb_alloc(struct prestera_sdma *sdma, in prestera_sdma_rx_skb_alloc() argument
163 struct device *dev = sdma->sw->dev->dev; in prestera_sdma_rx_skb_alloc()
190 static struct sk_buff *prestera_sdma_rx_skb_get(struct prestera_sdma *sdma, in prestera_sdma_rx_skb_get() argument
198 err = prestera_sdma_rx_skb_alloc(sdma, buf); in prestera_sdma_rx_skb_get()
210 prestera_sdma_rx_desc_init(sdma, buf->desc, buf->buf_dma); in prestera_sdma_rx_skb_get()
215 static int prestera_rxtx_process_skb(struct prestera_sdma *sdma, in prestera_rxtx_process_skb() argument
234 port = prestera_port_find_by_hwid(sdma->sw, dev_id, hw_port); in prestera_rxtx_process_skb()
236 dev_warn_ratelimited(prestera_dev(sdma->sw), "received pkt for non-existent port(%u, %u)\n", in prestera_rxtx_process_skb()
279 struct prestera_sdma *sdma; in prestera_sdma_rx_poll() local
290 sdma = container_of(napi, struct prestera_sdma, rx_napi); in prestera_sdma_rx_poll()
294 struct prestera_rx_ring *ring = &sdma->rx_ring[q]; in prestera_sdma_rx_poll()
314 skb = prestera_sdma_rx_skb_get(sdma, buf); in prestera_sdma_rx_poll()
318 if (unlikely(prestera_rxtx_process_skb(sdma, skb))) in prestera_sdma_rx_poll()
328 prestera_write(sdma->sw, PRESTERA_SDMA_RX_INTR_MASK_REG, in prestera_sdma_rx_poll()
336 static void prestera_sdma_rx_fini(struct prestera_sdma *sdma) in prestera_sdma_rx_fini() argument
342 prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_STATUS_REG, in prestera_sdma_rx_fini()
346 struct prestera_rx_ring *ring = &sdma->rx_ring[q]; in prestera_sdma_rx_fini()
355 dma_pool_free(sdma->desc_pool, buf->desc, in prestera_sdma_rx_fini()
362 dma_unmap_single(sdma->sw->dev->dev, in prestera_sdma_rx_fini()
370 static int prestera_sdma_rx_init(struct prestera_sdma *sdma) in prestera_sdma_rx_init() argument
378 prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_STATUS_REG, in prestera_sdma_rx_init()
383 struct prestera_rx_ring *ring = &sdma->rx_ring[q]; in prestera_sdma_rx_init()
397 err = prestera_sdma_buf_init(sdma, next); in prestera_sdma_rx_init()
401 err = prestera_sdma_rx_skb_alloc(sdma, next); in prestera_sdma_rx_init()
405 prestera_sdma_rx_desc_init(sdma, next->desc, in prestera_sdma_rx_init()
408 prestera_sdma_rx_desc_set_next(sdma, prev->desc, in prestera_sdma_rx_init()
416 prestera_sdma_rx_desc_set_next(sdma, tail->desc, head->desc_dma); in prestera_sdma_rx_init()
418 prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_DESC_REG(q), in prestera_sdma_rx_init()
419 prestera_sdma_map(sdma, head->desc_dma)); in prestera_sdma_rx_init()
425 prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_STATUS_REG, in prestera_sdma_rx_init()
431 static void prestera_sdma_tx_desc_init(struct prestera_sdma *sdma, in prestera_sdma_tx_desc_init() argument
438 static void prestera_sdma_tx_desc_set_next(struct prestera_sdma *sdma, in prestera_sdma_tx_desc_set_next() argument
442 desc->next = cpu_to_le32(prestera_sdma_map(sdma, next)); in prestera_sdma_tx_desc_set_next()
445 static void prestera_sdma_tx_desc_set_buf(struct prestera_sdma *sdma, in prestera_sdma_tx_desc_set_buf() argument
453 desc->buff = cpu_to_le32(prestera_sdma_map(sdma, buf)); in prestera_sdma_tx_desc_set_buf()
469 static int prestera_sdma_tx_buf_map(struct prestera_sdma *sdma, in prestera_sdma_tx_buf_map() argument
473 struct device *dma_dev = sdma->sw->dev->dev; in prestera_sdma_tx_buf_map()
486 static void prestera_sdma_tx_buf_unmap(struct prestera_sdma *sdma, in prestera_sdma_tx_buf_unmap() argument
489 struct device *dma_dev = sdma->sw->dev->dev; in prestera_sdma_tx_buf_unmap()
498 struct prestera_sdma *sdma; in prestera_sdma_tx_recycle_work_fn() local
501 sdma = container_of(work, struct prestera_sdma, tx_work); in prestera_sdma_tx_recycle_work_fn()
503 tx_ring = &sdma->tx_ring; in prestera_sdma_tx_recycle_work_fn()
514 prestera_sdma_tx_buf_unmap(sdma, buf); in prestera_sdma_tx_recycle_work_fn()
525 static int prestera_sdma_tx_init(struct prestera_sdma *sdma) in prestera_sdma_tx_init() argument
528 struct prestera_tx_ring *tx_ring = &sdma->tx_ring; in prestera_sdma_tx_init()
532 INIT_WORK(&sdma->tx_work, prestera_sdma_tx_recycle_work_fn); in prestera_sdma_tx_init()
533 spin_lock_init(&sdma->tx_lock); in prestera_sdma_tx_init()
549 err = prestera_sdma_buf_init(sdma, next); in prestera_sdma_tx_init()
555 prestera_sdma_tx_desc_init(sdma, next->desc); in prestera_sdma_tx_init()
557 prestera_sdma_tx_desc_set_next(sdma, prev->desc, in prestera_sdma_tx_init()
565 prestera_sdma_tx_desc_set_next(sdma, tail->desc, head->desc_dma); in prestera_sdma_tx_init()
570 prestera_write(sdma->sw, PRESTERA_SDMA_TX_QUEUE_DESC_REG, in prestera_sdma_tx_init()
571 prestera_sdma_map(sdma, head->desc_dma)); in prestera_sdma_tx_init()
576 static void prestera_sdma_tx_fini(struct prestera_sdma *sdma) in prestera_sdma_tx_fini() argument
578 struct prestera_tx_ring *ring = &sdma->tx_ring; in prestera_sdma_tx_fini()
582 cancel_work_sync(&sdma->tx_work); in prestera_sdma_tx_fini()
591 dma_pool_free(sdma->desc_pool, buf->desc, in prestera_sdma_tx_fini()
597 dma_unmap_single(sdma->sw->dev->dev, buf->buf_dma, in prestera_sdma_tx_fini()
608 struct prestera_sdma *sdma = arg; in prestera_rxtx_handle_event() local
613 prestera_write(sdma->sw, PRESTERA_SDMA_RX_INTR_MASK_REG, 0); in prestera_rxtx_handle_event()
614 napi_schedule(&sdma->rx_napi); in prestera_rxtx_handle_event()
619 struct prestera_sdma *sdma = &sw->rxtx->sdma; in prestera_sdma_switch_init() local
632 sdma->dma_mask = dma_get_mask(dev); in prestera_sdma_switch_init()
633 sdma->map_addr = p.map_addr; in prestera_sdma_switch_init()
634 sdma->sw = sw; in prestera_sdma_switch_init()
636 sdma->desc_pool = dma_pool_create("desc_pool", dev, in prestera_sdma_switch_init()
639 if (!sdma->desc_pool) in prestera_sdma_switch_init()
642 err = prestera_sdma_rx_init(sdma); in prestera_sdma_switch_init()
648 err = prestera_sdma_tx_init(sdma); in prestera_sdma_switch_init()
656 sdma); in prestera_sdma_switch_init()
660 init_dummy_netdev(&sdma->napi_dev); in prestera_sdma_switch_init()
662 netif_napi_add(&sdma->napi_dev, &sdma->rx_napi, prestera_sdma_rx_poll); in prestera_sdma_switch_init()
663 napi_enable(&sdma->rx_napi); in prestera_sdma_switch_init()
669 prestera_sdma_tx_fini(sdma); in prestera_sdma_switch_init()
671 prestera_sdma_rx_fini(sdma); in prestera_sdma_switch_init()
673 dma_pool_destroy(sdma->desc_pool); in prestera_sdma_switch_init()
679 struct prestera_sdma *sdma = &sw->rxtx->sdma; in prestera_sdma_switch_fini() local
681 napi_disable(&sdma->rx_napi); in prestera_sdma_switch_fini()
682 netif_napi_del(&sdma->rx_napi); in prestera_sdma_switch_fini()
685 prestera_sdma_tx_fini(sdma); in prestera_sdma_switch_fini()
686 prestera_sdma_rx_fini(sdma); in prestera_sdma_switch_fini()
687 dma_pool_destroy(sdma->desc_pool); in prestera_sdma_switch_fini()
690 static bool prestera_sdma_is_ready(struct prestera_sdma *sdma) in prestera_sdma_is_ready() argument
692 return !(prestera_read(sdma->sw, PRESTERA_SDMA_TX_QUEUE_START_REG) & 1); in prestera_sdma_is_ready()
695 static int prestera_sdma_tx_wait(struct prestera_sdma *sdma, in prestera_sdma_tx_wait() argument
701 if (prestera_sdma_is_ready(sdma)) in prestera_sdma_tx_wait()
710 static void prestera_sdma_tx_start(struct prestera_sdma *sdma) in prestera_sdma_tx_start() argument
712 prestera_write(sdma->sw, PRESTERA_SDMA_TX_QUEUE_START_REG, 1); in prestera_sdma_tx_start()
713 schedule_work(&sdma->tx_work); in prestera_sdma_tx_start()
716 static netdev_tx_t prestera_sdma_xmit(struct prestera_sdma *sdma, in prestera_sdma_xmit() argument
719 struct device *dma_dev = sdma->sw->dev->dev; in prestera_sdma_xmit()
725 spin_lock(&sdma->tx_lock); in prestera_sdma_xmit()
727 tx_ring = &sdma->tx_ring; in prestera_sdma_xmit()
731 schedule_work(&sdma->tx_work); in prestera_sdma_xmit()
738 err = prestera_sdma_tx_buf_map(sdma, buf, skb); in prestera_sdma_xmit()
742 prestera_sdma_tx_desc_set_buf(sdma, buf->desc, buf->buf_dma, skb->len); in prestera_sdma_xmit()
752 err = prestera_sdma_tx_wait(sdma, tx_ring); in prestera_sdma_xmit()
761 prestera_sdma_tx_start(sdma); in prestera_sdma_xmit()
766 prestera_sdma_tx_buf_unmap(sdma, buf); in prestera_sdma_xmit()
772 spin_unlock(&sdma->tx_lock); in prestera_sdma_xmit()
822 return prestera_sdma_xmit(&port->sw->rxtx->sdma, skb); in prestera_rxtx_xmit()