Lines Matching full:rx
10 static struct page *lan966x_fdma_rx_alloc_page(struct lan966x_rx *rx, in lan966x_fdma_rx_alloc_page() argument
13 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_alloc_page()
17 page = dev_alloc_pages(rx->page_order); in lan966x_fdma_rx_alloc_page()
22 PAGE_SIZE << rx->page_order, in lan966x_fdma_rx_alloc_page()
32 __free_pages(page, rx->page_order); in lan966x_fdma_rx_alloc_page()
36 static void lan966x_fdma_rx_free_pages(struct lan966x_rx *rx) in lan966x_fdma_rx_free_pages() argument
38 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_free_pages()
44 dcb = &rx->dcbs[i]; in lan966x_fdma_rx_free_pages()
50 PAGE_SIZE << rx->page_order, in lan966x_fdma_rx_free_pages()
52 __free_pages(rx->page[i][j], rx->page_order); in lan966x_fdma_rx_free_pages()
57 static void lan966x_fdma_rx_add_dcb(struct lan966x_rx *rx, in lan966x_fdma_rx_add_dcb() argument
70 dcb->info = FDMA_DCB_INFO_DATAL(PAGE_SIZE << rx->page_order); in lan966x_fdma_rx_add_dcb()
72 rx->last_entry->nextptr = nextptr; in lan966x_fdma_rx_add_dcb()
73 rx->last_entry = dcb; in lan966x_fdma_rx_add_dcb()
76 static int lan966x_fdma_rx_alloc(struct lan966x_rx *rx) in lan966x_fdma_rx_alloc() argument
78 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_alloc()
89 rx->dcbs = dma_alloc_coherent(lan966x->dev, size, &rx->dma, GFP_KERNEL); in lan966x_fdma_rx_alloc()
90 if (!rx->dcbs) in lan966x_fdma_rx_alloc()
93 rx->last_entry = rx->dcbs; in lan966x_fdma_rx_alloc()
94 rx->db_index = 0; in lan966x_fdma_rx_alloc()
95 rx->dcb_index = 0; in lan966x_fdma_rx_alloc()
99 dcb = &rx->dcbs[i]; in lan966x_fdma_rx_alloc()
105 page = lan966x_fdma_rx_alloc_page(rx, db); in lan966x_fdma_rx_alloc()
110 rx->page[i][j] = page; in lan966x_fdma_rx_alloc()
113 lan966x_fdma_rx_add_dcb(rx, dcb, rx->dma + sizeof(*dcb) * i); in lan966x_fdma_rx_alloc()
119 static void lan966x_fdma_rx_free(struct lan966x_rx *rx) in lan966x_fdma_rx_free() argument
121 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_free()
127 dma_free_coherent(lan966x->dev, size, rx->dcbs, rx->dma); in lan966x_fdma_rx_free()
130 static void lan966x_fdma_rx_start(struct lan966x_rx *rx) in lan966x_fdma_rx_start() argument
132 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_start()
138 lan_wr(lower_32_bits((u64)rx->dma), lan966x, in lan966x_fdma_rx_start()
139 FDMA_DCB_LLP(rx->channel_id)); in lan966x_fdma_rx_start()
140 lan_wr(upper_32_bits((u64)rx->dma), lan966x, in lan966x_fdma_rx_start()
141 FDMA_DCB_LLP1(rx->channel_id)); in lan966x_fdma_rx_start()
147 lan966x, FDMA_CH_CFG(rx->channel_id)); in lan966x_fdma_rx_start()
157 mask |= BIT(rx->channel_id); in lan966x_fdma_rx_start()
163 lan_rmw(FDMA_CH_ACTIVATE_CH_ACTIVATE_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_start()
168 static void lan966x_fdma_rx_disable(struct lan966x_rx *rx) in lan966x_fdma_rx_disable() argument
170 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_disable()
174 lan_rmw(FDMA_CH_DISABLE_CH_DISABLE_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_disable()
179 val, !(val & BIT(rx->channel_id)), in lan966x_fdma_rx_disable()
182 lan_rmw(FDMA_CH_DB_DISCARD_DB_DISCARD_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_disable()
187 static void lan966x_fdma_rx_reload(struct lan966x_rx *rx) in lan966x_fdma_rx_reload() argument
189 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_reload()
191 lan_rmw(FDMA_CH_RELOAD_CH_RELOAD_SET(BIT(rx->channel_id)), in lan966x_fdma_rx_reload()
394 static bool lan966x_fdma_rx_more_frames(struct lan966x_rx *rx) in lan966x_fdma_rx_more_frames() argument
399 db = &rx->dcbs[rx->dcb_index].db[rx->db_index]; in lan966x_fdma_rx_more_frames()
406 static struct sk_buff *lan966x_fdma_rx_get_frame(struct lan966x_rx *rx) in lan966x_fdma_rx_get_frame() argument
408 struct lan966x *lan966x = rx->lan966x; in lan966x_fdma_rx_get_frame()
415 db = &rx->dcbs[rx->dcb_index].db[rx->db_index]; in lan966x_fdma_rx_get_frame()
416 page = rx->page[rx->dcb_index][rx->db_index]; in lan966x_fdma_rx_get_frame()
422 skb = build_skb(page_address(page), PAGE_SIZE << rx->page_order); in lan966x_fdma_rx_get_frame()
435 PAGE_SIZE << rx->page_order, DMA_FROM_DEVICE, in lan966x_fdma_rx_get_frame()
464 PAGE_SIZE << rx->page_order, DMA_FROM_DEVICE, in lan966x_fdma_rx_get_frame()
466 __free_pages(page, rx->page_order); in lan966x_fdma_rx_get_frame()
474 struct lan966x_rx *rx = &lan966x->rx; in lan966x_fdma_napi_poll() local
475 int dcb_reload = rx->dcb_index; in lan966x_fdma_napi_poll()
487 if (!lan966x_fdma_rx_more_frames(rx)) in lan966x_fdma_napi_poll()
490 skb = lan966x_fdma_rx_get_frame(rx); in lan966x_fdma_napi_poll()
492 rx->page[rx->dcb_index][rx->db_index] = NULL; in lan966x_fdma_napi_poll()
493 rx->dcb_index++; in lan966x_fdma_napi_poll()
494 rx->dcb_index &= FDMA_DCB_MAX - 1; in lan966x_fdma_napi_poll()
504 while (dcb_reload != rx->dcb_index) { in lan966x_fdma_napi_poll()
505 db = &rx->dcbs[dcb_reload].db[rx->db_index]; in lan966x_fdma_napi_poll()
506 page = lan966x_fdma_rx_alloc_page(rx, db); in lan966x_fdma_napi_poll()
509 rx->page[dcb_reload][rx->db_index] = page; in lan966x_fdma_napi_poll()
511 old_dcb = &rx->dcbs[dcb_reload]; in lan966x_fdma_napi_poll()
515 nextptr = rx->dma + ((unsigned long)old_dcb - in lan966x_fdma_napi_poll()
516 (unsigned long)rx->dcbs); in lan966x_fdma_napi_poll()
517 lan966x_fdma_rx_add_dcb(rx, old_dcb, nextptr); in lan966x_fdma_napi_poll()
518 lan966x_fdma_rx_reload(rx); in lan966x_fdma_napi_poll()
705 rx_dma = lan966x->rx.dma; in lan966x_fdma_reload()
706 rx_dcbs = lan966x->rx.dcbs; in lan966x_fdma_reload()
712 lan966x_fdma_rx_disable(&lan966x->rx); in lan966x_fdma_reload()
713 lan966x_fdma_rx_free_pages(&lan966x->rx); in lan966x_fdma_reload()
714 lan966x->rx.page_order = round_up(new_mtu, PAGE_SIZE) / PAGE_SIZE - 1; in lan966x_fdma_reload()
715 err = lan966x_fdma_rx_alloc(&lan966x->rx); in lan966x_fdma_reload()
718 lan966x_fdma_rx_start(&lan966x->rx); in lan966x_fdma_reload()
729 lan966x->rx.dma = rx_dma; in lan966x_fdma_reload()
730 lan966x->rx.dcbs = rx_dcbs; in lan966x_fdma_reload()
731 lan966x_fdma_rx_start(&lan966x->rx); in lan966x_fdma_reload()
748 lan966x->rx.page_order) in lan966x_fdma_change_mtu()
801 lan966x->rx.lan966x = lan966x; in lan966x_fdma_init()
802 lan966x->rx.channel_id = FDMA_XTR_CHANNEL; in lan966x_fdma_init()
807 err = lan966x_fdma_rx_alloc(&lan966x->rx); in lan966x_fdma_init()
813 lan966x_fdma_rx_free(&lan966x->rx); in lan966x_fdma_init()
817 lan966x_fdma_rx_start(&lan966x->rx); in lan966x_fdma_init()
827 lan966x_fdma_rx_disable(&lan966x->rx); in lan966x_fdma_deinit()
833 lan966x_fdma_rx_free_pages(&lan966x->rx); in lan966x_fdma_deinit()
834 lan966x_fdma_rx_free(&lan966x->rx); in lan966x_fdma_deinit()