Lines Matching refs:rx

13 static struct page *lan966x_fdma_rx_alloc_page(struct lan966x_rx *rx,  in lan966x_fdma_rx_alloc_page()  argument
18 page = page_pool_dev_alloc_pages(rx->page_pool); in lan966x_fdma_rx_alloc_page()
27 static void lan966x_fdma_rx_free_pages(struct lan966x_rx *rx) in lan966x_fdma_rx_free_pages() argument
33 page_pool_put_full_page(rx->page_pool, in lan966x_fdma_rx_free_pages()
34 rx->page[i][j], false); in lan966x_fdma_rx_free_pages()
38 static void lan966x_fdma_rx_free_page(struct lan966x_rx *rx) in lan966x_fdma_rx_free_page() argument
42 page = rx->page[rx->dcb_index][rx->db_index]; in lan966x_fdma_rx_free_page()
46 page_pool_recycle_direct(rx->page_pool, page); in lan966x_fdma_rx_free_page()
49 static void lan966x_fdma_rx_add_dcb(struct lan966x_rx *rx, in lan966x_fdma_rx_add_dcb() argument
62 dcb->info = FDMA_DCB_INFO_DATAL(PAGE_SIZE << rx->page_order); in lan966x_fdma_rx_add_dcb()
64 rx->last_entry->nextptr = nextptr; in lan966x_fdma_rx_add_dcb()
65 rx->last_entry = dcb; in lan966x_fdma_rx_add_dcb()
68 static int lan966x_fdma_rx_alloc_page_pool(struct lan966x_rx *rx) in lan966x_fdma_rx_alloc_page_pool() argument
70 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_alloc_page_pool()
72 .order = rx->page_order, in lan966x_fdma_rx_alloc_page_pool()
79 .max_len = rx->max_mtu - in lan966x_fdma_rx_alloc_page_pool()
86 rx->page_pool = page_pool_create(&pp_params); in lan966x_fdma_rx_alloc_page_pool()
97 rx->page_pool); in lan966x_fdma_rx_alloc_page_pool()
100 return PTR_ERR_OR_ZERO(rx->page_pool); in lan966x_fdma_rx_alloc_page_pool()
103 static int lan966x_fdma_rx_alloc(struct lan966x_rx *rx) in lan966x_fdma_rx_alloc() argument
105 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_alloc()
112 if (lan966x_fdma_rx_alloc_page_pool(rx)) in lan966x_fdma_rx_alloc()
113 return PTR_ERR(rx->page_pool); in lan966x_fdma_rx_alloc()
119 rx->dcbs = dma_alloc_coherent(lan966x->dev, size, &rx->dma, GFP_KERNEL); in lan966x_fdma_rx_alloc()
120 if (!rx->dcbs) in lan966x_fdma_rx_alloc()
123 rx->last_entry = rx->dcbs; in lan966x_fdma_rx_alloc()
124 rx->db_index = 0; in lan966x_fdma_rx_alloc()
125 rx->dcb_index = 0; in lan966x_fdma_rx_alloc()
129 dcb = &rx->dcbs[i]; in lan966x_fdma_rx_alloc()
135 page = lan966x_fdma_rx_alloc_page(rx, db); in lan966x_fdma_rx_alloc()
140 rx->page[i][j] = page; in lan966x_fdma_rx_alloc()
143 lan966x_fdma_rx_add_dcb(rx, dcb, rx->dma + sizeof(*dcb) * i); in lan966x_fdma_rx_alloc()
149 static void lan966x_fdma_rx_advance_dcb(struct lan966x_rx *rx) in lan966x_fdma_rx_advance_dcb() argument
151 rx->dcb_index++; in lan966x_fdma_rx_advance_dcb()
152 rx->dcb_index &= FDMA_DCB_MAX - 1; in lan966x_fdma_rx_advance_dcb()
155 static void lan966x_fdma_rx_free(struct lan966x_rx *rx) in lan966x_fdma_rx_free() argument
157 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_free()
163 dma_free_coherent(lan966x->dev, size, rx->dcbs, rx->dma); in lan966x_fdma_rx_free()
166 static void lan966x_fdma_rx_start(struct lan966x_rx *rx) in lan966x_fdma_rx_start() argument
168 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_start()
174 lan_wr(lower_32_bits((u64)rx->dma), lan966x, in lan966x_fdma_rx_start()
175 FDMA_DCB_LLP(rx->channel_id)); in lan966x_fdma_rx_start()
176 lan_wr(upper_32_bits((u64)rx->dma), lan966x, in lan966x_fdma_rx_start()
177 FDMA_DCB_LLP1(rx->channel_id)); in lan966x_fdma_rx_start()
183 lan966x, FDMA_CH_CFG(rx->channel_id)); in lan966x_fdma_rx_start()
193 mask |= BIT(rx->channel_id); in lan966x_fdma_rx_start()
199 lan_rmw(FDMA_CH_ACTIVATE_CH_ACTIVATE_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_start()
204 static void lan966x_fdma_rx_disable(struct lan966x_rx *rx) in lan966x_fdma_rx_disable() argument
206 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_disable()
210 lan_rmw(FDMA_CH_DISABLE_CH_DISABLE_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_disable()
215 val, !(val & BIT(rx->channel_id)), in lan966x_fdma_rx_disable()
218 lan_rmw(FDMA_CH_DB_DISCARD_DB_DISCARD_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_disable()
223 static void lan966x_fdma_rx_reload(struct lan966x_rx *rx) in lan966x_fdma_rx_reload() argument
225 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_reload()
227 lan_rmw(FDMA_CH_RELOAD_CH_RELOAD_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_reload()
449 static bool lan966x_fdma_rx_more_frames(struct lan966x_rx *rx) in lan966x_fdma_rx_more_frames() argument
454 db = &rx->dcbs[rx->dcb_index].db[rx->db_index]; in lan966x_fdma_rx_more_frames()
461 static int lan966x_fdma_rx_check_frame(struct lan966x_rx *rx, u64 *src_port) in lan966x_fdma_rx_check_frame() argument
463 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_check_frame()
468 db = &rx->dcbs[rx->dcb_index].db[rx->db_index]; in lan966x_fdma_rx_check_frame()
469 page = rx->page[rx->dcb_index][rx->db_index]; in lan966x_fdma_rx_check_frame()
490 static struct sk_buff *lan966x_fdma_rx_get_frame(struct lan966x_rx *rx, in lan966x_fdma_rx_get_frame() argument
493 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_get_frame()
500 db = &rx->dcbs[rx->dcb_index].db[rx->db_index]; in lan966x_fdma_rx_get_frame()
501 page = rx->page[rx->dcb_index][rx->db_index]; in lan966x_fdma_rx_get_frame()
503 skb = build_skb(page_address(page), PAGE_SIZE << rx->page_order); in lan966x_fdma_rx_get_frame()
537 page_pool_recycle_direct(rx->page_pool, page); in lan966x_fdma_rx_get_frame()
545 struct lan966x_rx *rx = &lan966x->rx; in lan966x_fdma_napi_poll() local
546 int dcb_reload = rx->dcb_index; in lan966x_fdma_napi_poll()
560 if (!lan966x_fdma_rx_more_frames(rx)) in lan966x_fdma_napi_poll()
565 switch (lan966x_fdma_rx_check_frame(rx, &src_port)) { in lan966x_fdma_napi_poll()
569 lan966x_fdma_rx_free_page(rx); in lan966x_fdma_napi_poll()
570 lan966x_fdma_rx_advance_dcb(rx); in lan966x_fdma_napi_poll()
576 lan966x_fdma_rx_advance_dcb(rx); in lan966x_fdma_napi_poll()
579 lan966x_fdma_rx_free_page(rx); in lan966x_fdma_napi_poll()
580 lan966x_fdma_rx_advance_dcb(rx); in lan966x_fdma_napi_poll()
584 skb = lan966x_fdma_rx_get_frame(rx, src_port); in lan966x_fdma_napi_poll()
585 lan966x_fdma_rx_advance_dcb(rx); in lan966x_fdma_napi_poll()
594 while (dcb_reload != rx->dcb_index) { in lan966x_fdma_napi_poll()
595 db = &rx->dcbs[dcb_reload].db[rx->db_index]; in lan966x_fdma_napi_poll()
596 page = lan966x_fdma_rx_alloc_page(rx, db); in lan966x_fdma_napi_poll()
599 rx->page[dcb_reload][rx->db_index] = page; in lan966x_fdma_napi_poll()
601 old_dcb = &rx->dcbs[dcb_reload]; in lan966x_fdma_napi_poll()
605 nextptr = rx->dma + ((unsigned long)old_dcb - in lan966x_fdma_napi_poll()
606 (unsigned long)rx->dcbs); in lan966x_fdma_napi_poll()
607 lan966x_fdma_rx_add_dcb(rx, old_dcb, nextptr); in lan966x_fdma_napi_poll()
608 lan966x_fdma_rx_reload(rx); in lan966x_fdma_napi_poll()
905 rx_dma = lan966x->rx.dma; in lan966x_fdma_reload()
906 rx_dcbs = lan966x->rx.dcbs; in lan966x_fdma_reload()
907 page_pool = lan966x->rx.page_pool; in lan966x_fdma_reload()
913 lan966x_fdma_rx_disable(&lan966x->rx); in lan966x_fdma_reload()
914 lan966x_fdma_rx_free_pages(&lan966x->rx); in lan966x_fdma_reload()
915 lan966x->rx.page_order = round_up(new_mtu, PAGE_SIZE) / PAGE_SIZE - 1; in lan966x_fdma_reload()
916 lan966x->rx.max_mtu = new_mtu; in lan966x_fdma_reload()
917 err = lan966x_fdma_rx_alloc(&lan966x->rx); in lan966x_fdma_reload()
920 lan966x_fdma_rx_start(&lan966x->rx); in lan966x_fdma_reload()
933 lan966x->rx.page_pool = page_pool; in lan966x_fdma_reload()
934 lan966x->rx.dma = rx_dma; in lan966x_fdma_reload()
935 lan966x->rx.dcbs = rx_dcbs; in lan966x_fdma_reload()
936 lan966x_fdma_rx_start(&lan966x->rx); in lan966x_fdma_reload()
985 if (max_mtu == lan966x->rx.max_mtu) in lan966x_fdma_change_mtu()
1024 lan966x->rx.lan966x = lan966x; in lan966x_fdma_init()
1025 lan966x->rx.channel_id = FDMA_XTR_CHANNEL; in lan966x_fdma_init()
1026 lan966x->rx.max_mtu = lan966x_fdma_get_max_frame(lan966x); in lan966x_fdma_init()
1031 err = lan966x_fdma_rx_alloc(&lan966x->rx); in lan966x_fdma_init()
1037 lan966x_fdma_rx_free(&lan966x->rx); in lan966x_fdma_init()
1041 lan966x_fdma_rx_start(&lan966x->rx); in lan966x_fdma_init()
1051 lan966x_fdma_rx_disable(&lan966x->rx); in lan966x_fdma_deinit()
1057 lan966x_fdma_rx_free_pages(&lan966x->rx); in lan966x_fdma_deinit()
1058 lan966x_fdma_rx_free(&lan966x->rx); in lan966x_fdma_deinit()
1059 page_pool_destroy(lan966x->rx.page_pool); in lan966x_fdma_deinit()