Lines Matching refs:rx

606 static void tsnep_rx_ring_cleanup(struct tsnep_rx *rx)  in tsnep_rx_ring_cleanup()  argument
608 struct device *dmadev = rx->adapter->dmadev; in tsnep_rx_ring_cleanup()
613 entry = &rx->entry[i]; in tsnep_rx_ring_cleanup()
615 page_pool_put_full_page(rx->page_pool, entry->page, in tsnep_rx_ring_cleanup()
620 if (rx->page_pool) in tsnep_rx_ring_cleanup()
621 page_pool_destroy(rx->page_pool); in tsnep_rx_ring_cleanup()
623 memset(rx->entry, 0, sizeof(rx->entry)); in tsnep_rx_ring_cleanup()
626 if (rx->page[i]) { in tsnep_rx_ring_cleanup()
627 dma_free_coherent(dmadev, PAGE_SIZE, rx->page[i], in tsnep_rx_ring_cleanup()
628 rx->page_dma[i]); in tsnep_rx_ring_cleanup()
629 rx->page[i] = NULL; in tsnep_rx_ring_cleanup()
630 rx->page_dma[i] = 0; in tsnep_rx_ring_cleanup()
635 static int tsnep_rx_alloc_buffer(struct tsnep_rx *rx, in tsnep_rx_alloc_buffer() argument
640 page = page_pool_dev_alloc_pages(rx->page_pool); in tsnep_rx_alloc_buffer()
647 entry->desc->rx = __cpu_to_le64(entry->dma + TSNEP_SKB_PAD); in tsnep_rx_alloc_buffer()
652 static int tsnep_rx_ring_init(struct tsnep_rx *rx) in tsnep_rx_ring_init() argument
654 struct device *dmadev = rx->adapter->dmadev; in tsnep_rx_ring_init()
662 rx->page[i] = in tsnep_rx_ring_init()
663 dma_alloc_coherent(dmadev, PAGE_SIZE, &rx->page_dma[i], in tsnep_rx_ring_init()
665 if (!rx->page[i]) { in tsnep_rx_ring_init()
670 entry = &rx->entry[TSNEP_RING_ENTRIES_PER_PAGE * i + j]; in tsnep_rx_ring_init()
672 (((u8 *)rx->page[i]) + TSNEP_DESC_SIZE * j); in tsnep_rx_ring_init()
675 entry->desc_dma = rx->page_dma[i] + TSNEP_DESC_SIZE * j; in tsnep_rx_ring_init()
687 rx->page_pool = page_pool_create(&pp_params); in tsnep_rx_ring_init()
688 if (IS_ERR(rx->page_pool)) { in tsnep_rx_ring_init()
689 retval = PTR_ERR(rx->page_pool); in tsnep_rx_ring_init()
690 rx->page_pool = NULL; in tsnep_rx_ring_init()
695 entry = &rx->entry[i]; in tsnep_rx_ring_init()
696 next_entry = &rx->entry[(i + 1) % TSNEP_RING_SIZE]; in tsnep_rx_ring_init()
699 retval = tsnep_rx_alloc_buffer(rx, entry); in tsnep_rx_ring_init()
707 tsnep_rx_ring_cleanup(rx); in tsnep_rx_ring_init()
711 static void tsnep_rx_activate(struct tsnep_rx *rx, int index) in tsnep_rx_activate() argument
713 struct tsnep_rx_entry *entry = &rx->entry[index]; in tsnep_rx_activate()
718 if (index == rx->increment_owner_counter) { in tsnep_rx_activate()
719 rx->owner_counter++; in tsnep_rx_activate()
720 if (rx->owner_counter == 4) in tsnep_rx_activate()
721 rx->owner_counter = 1; in tsnep_rx_activate()
722 rx->increment_owner_counter--; in tsnep_rx_activate()
723 if (rx->increment_owner_counter < 0) in tsnep_rx_activate()
724 rx->increment_owner_counter = TSNEP_RING_SIZE - 1; in tsnep_rx_activate()
727 (rx->owner_counter << TSNEP_DESC_OWNER_COUNTER_SHIFT) & in tsnep_rx_activate()
738 static struct sk_buff *tsnep_build_skb(struct tsnep_rx *rx, struct page *page, in tsnep_build_skb() argument
751 if (rx->adapter->hwtstamp_config.rx_filter == HWTSTAMP_FILTER_ALL) { in tsnep_build_skb()
763 skb_record_rx_queue(skb, rx->queue_index); in tsnep_build_skb()
764 skb->protocol = eth_type_trans(skb, rx->adapter->netdev); in tsnep_build_skb()
769 static int tsnep_rx_poll(struct tsnep_rx *rx, struct napi_struct *napi, in tsnep_rx_poll() argument
772 struct device *dmadev = rx->adapter->dmadev; in tsnep_rx_poll()
782 dma_dir = page_pool_get_dma_dir(rx->page_pool); in tsnep_rx_poll()
785 entry = &rx->entry[rx->read]; in tsnep_rx_poll()
806 retval = tsnep_rx_alloc_buffer(rx, entry); in tsnep_rx_poll()
808 skb = tsnep_build_skb(rx, page, length); in tsnep_rx_poll()
810 page_pool_release_page(rx->page_pool, page); in tsnep_rx_poll()
812 rx->packets++; in tsnep_rx_poll()
813 rx->bytes += length - in tsnep_rx_poll()
816 rx->multicast++; in tsnep_rx_poll()
820 page_pool_recycle_direct(rx->page_pool, page); in tsnep_rx_poll()
822 rx->dropped++; in tsnep_rx_poll()
826 rx->dropped++; in tsnep_rx_poll()
829 tsnep_rx_activate(rx, rx->read); in tsnep_rx_poll()
833 rx->read = (rx->read + 1) % TSNEP_RING_SIZE; in tsnep_rx_poll()
842 iowrite32(TSNEP_CONTROL_RX_ENABLE, rx->addr + TSNEP_CONTROL); in tsnep_rx_poll()
848 static bool tsnep_rx_pending(struct tsnep_rx *rx) in tsnep_rx_pending() argument
852 entry = &rx->entry[rx->read]; in tsnep_rx_pending()
862 int queue_index, struct tsnep_rx *rx) in tsnep_rx_open() argument
868 memset(rx, 0, sizeof(*rx)); in tsnep_rx_open()
869 rx->adapter = adapter; in tsnep_rx_open()
870 rx->addr = addr; in tsnep_rx_open()
871 rx->queue_index = queue_index; in tsnep_rx_open()
873 retval = tsnep_rx_ring_init(rx); in tsnep_rx_open()
877 dma = rx->entry[0].desc_dma | TSNEP_RESET_OWNER_COUNTER; in tsnep_rx_open()
878 iowrite32(DMA_ADDR_LOW(dma), rx->addr + TSNEP_RX_DESC_ADDR_LOW); in tsnep_rx_open()
879 iowrite32(DMA_ADDR_HIGH(dma), rx->addr + TSNEP_RX_DESC_ADDR_HIGH); in tsnep_rx_open()
880 rx->owner_counter = 1; in tsnep_rx_open()
881 rx->increment_owner_counter = TSNEP_RING_SIZE - 1; in tsnep_rx_open()
884 tsnep_rx_activate(rx, i); in tsnep_rx_open()
889 iowrite32(TSNEP_CONTROL_RX_ENABLE, rx->addr + TSNEP_CONTROL); in tsnep_rx_open()
894 static void tsnep_rx_close(struct tsnep_rx *rx) in tsnep_rx_close() argument
898 iowrite32(TSNEP_CONTROL_RX_DISABLE, rx->addr + TSNEP_CONTROL); in tsnep_rx_close()
899 readx_poll_timeout(ioread32, rx->addr + TSNEP_CONTROL, val, in tsnep_rx_close()
903 tsnep_rx_ring_cleanup(rx); in tsnep_rx_close()
911 if (queue->rx && tsnep_rx_pending(queue->rx)) in tsnep_pending()
927 if (queue->rx) { in tsnep_poll()
928 done = tsnep_rx_poll(queue->rx, napi, budget); in tsnep_poll()
965 if (queue->tx && queue->rx) in tsnep_request_irq()
967 queue->rx->queue_index); in tsnep_request_irq()
973 queue->rx->queue_index); in tsnep_request_irq()
1022 if (adapter->queue[i].rx) { in tsnep_netdev_open()
1026 adapter->queue[i].rx); in tsnep_netdev_open()
1072 if (adapter->queue[i].rx) in tsnep_netdev_open()
1073 tsnep_rx_close(adapter->queue[i].rx); in tsnep_netdev_open()
1096 if (adapter->queue[i].rx) in tsnep_netdev_close()
1097 tsnep_rx_close(adapter->queue[i].rx); in tsnep_netdev_close()
1157 stats->rx_packets += adapter->rx[i].packets; in tsnep_netdev_get_stats64()
1158 stats->rx_bytes += adapter->rx[i].bytes; in tsnep_netdev_get_stats64()
1159 stats->rx_dropped += adapter->rx[i].dropped; in tsnep_netdev_get_stats64()
1160 stats->multicast += adapter->rx[i].multicast; in tsnep_netdev_get_stats64()
1375 adapter->queue[0].rx = &adapter->rx[0]; in tsnep_queue_init()
1394 adapter->queue[i].rx = &adapter->rx[i]; in tsnep_queue_init()