Lines Matching refs:rx_queue
79 efx_rx_buf_next(struct efx_rx_queue *rx_queue, struct efx_rx_buffer *rx_buf) in efx_rx_buf_next() argument
81 if (unlikely(rx_buf == efx_rx_buffer(rx_queue, rx_queue->ptr_mask))) in efx_rx_buf_next()
82 return efx_rx_buffer(rx_queue, 0); in efx_rx_buf_next()
109 static struct page *efx_reuse_page(struct efx_rx_queue *rx_queue) in efx_reuse_page() argument
111 struct efx_nic *efx = rx_queue->efx; in efx_reuse_page()
116 index = rx_queue->page_remove & rx_queue->page_ptr_mask; in efx_reuse_page()
117 page = rx_queue->page_ring[index]; in efx_reuse_page()
121 rx_queue->page_ring[index] = NULL; in efx_reuse_page()
123 if (rx_queue->page_remove != rx_queue->page_add) in efx_reuse_page()
124 ++rx_queue->page_remove; in efx_reuse_page()
128 ++rx_queue->page_recycle_count; in efx_reuse_page()
136 ++rx_queue->page_recycle_failed; in efx_reuse_page()
152 static int efx_init_rx_buffers(struct efx_rx_queue *rx_queue, bool atomic) in efx_init_rx_buffers() argument
154 struct efx_nic *efx = rx_queue->efx; in efx_init_rx_buffers()
164 page = efx_reuse_page(rx_queue); in efx_init_rx_buffers()
191 index = rx_queue->added_count & rx_queue->ptr_mask; in efx_init_rx_buffers()
192 rx_buf = efx_rx_buffer(rx_queue, index); in efx_init_rx_buffers()
198 ++rx_queue->added_count; in efx_init_rx_buffers()
227 static void efx_free_rx_buffers(struct efx_rx_queue *rx_queue, in efx_free_rx_buffers() argument
236 rx_buf = efx_rx_buf_next(rx_queue, rx_buf); in efx_free_rx_buffers()
248 struct efx_rx_queue *rx_queue = efx_channel_get_rx_queue(channel); in efx_recycle_rx_page() local
249 struct efx_nic *efx = rx_queue->efx; in efx_recycle_rx_page()
256 index = rx_queue->page_add & rx_queue->page_ptr_mask; in efx_recycle_rx_page()
257 if (rx_queue->page_ring[index] == NULL) { in efx_recycle_rx_page()
258 unsigned read_index = rx_queue->page_remove & in efx_recycle_rx_page()
259 rx_queue->page_ptr_mask; in efx_recycle_rx_page()
266 ++rx_queue->page_remove; in efx_recycle_rx_page()
267 rx_queue->page_ring[index] = page; in efx_recycle_rx_page()
268 ++rx_queue->page_add; in efx_recycle_rx_page()
271 ++rx_queue->page_recycle_full; in efx_recycle_rx_page()
276 static void efx_fini_rx_buffer(struct efx_rx_queue *rx_queue, in efx_fini_rx_buffer() argument
285 efx_unmap_rx_buffer(rx_queue->efx, rx_buf); in efx_fini_rx_buffer()
286 efx_free_rx_buffers(rx_queue, rx_buf, 1); in efx_fini_rx_buffer()
296 struct efx_rx_queue *rx_queue = efx_channel_get_rx_queue(channel); in efx_recycle_rx_pages() local
300 rx_buf = efx_rx_buf_next(rx_queue, rx_buf); in efx_recycle_rx_pages()
308 struct efx_rx_queue *rx_queue = efx_channel_get_rx_queue(channel); in efx_discard_rx_packet() local
312 efx_free_rx_buffers(rx_queue, rx_buf, n_frags); in efx_discard_rx_packet()
327 void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, bool atomic) in efx_fast_push_rx_descriptors() argument
329 struct efx_nic *efx = rx_queue->efx; in efx_fast_push_rx_descriptors()
333 if (!rx_queue->refill_enabled) in efx_fast_push_rx_descriptors()
337 fill_level = (rx_queue->added_count - rx_queue->removed_count); in efx_fast_push_rx_descriptors()
338 EFX_WARN_ON_ONCE_PARANOID(fill_level > rx_queue->efx->rxq_entries); in efx_fast_push_rx_descriptors()
339 if (fill_level >= rx_queue->fast_fill_trigger) in efx_fast_push_rx_descriptors()
343 if (unlikely(fill_level < rx_queue->min_fill)) { in efx_fast_push_rx_descriptors()
345 rx_queue->min_fill = fill_level; in efx_fast_push_rx_descriptors()
349 space = rx_queue->max_fill - fill_level; in efx_fast_push_rx_descriptors()
352 netif_vdbg(rx_queue->efx, rx_status, rx_queue->efx->net_dev, in efx_fast_push_rx_descriptors()
355 efx_rx_queue_index(rx_queue), fill_level, in efx_fast_push_rx_descriptors()
356 rx_queue->max_fill); in efx_fast_push_rx_descriptors()
360 rc = efx_init_rx_buffers(rx_queue, atomic); in efx_fast_push_rx_descriptors()
363 if (rx_queue->added_count == rx_queue->removed_count) in efx_fast_push_rx_descriptors()
364 efx_schedule_slow_fill(rx_queue); in efx_fast_push_rx_descriptors()
369 netif_vdbg(rx_queue->efx, rx_status, rx_queue->efx->net_dev, in efx_fast_push_rx_descriptors()
371 "to level %d\n", efx_rx_queue_index(rx_queue), in efx_fast_push_rx_descriptors()
372 rx_queue->added_count - rx_queue->removed_count); in efx_fast_push_rx_descriptors()
375 if (rx_queue->notified_count != rx_queue->added_count) in efx_fast_push_rx_descriptors()
376 efx_nic_notify_rx_desc(rx_queue); in efx_fast_push_rx_descriptors()
381 struct efx_rx_queue *rx_queue = from_timer(rx_queue, t, slow_fill); in efx_rx_slow_fill() local
384 efx_nic_generate_fill_event(rx_queue); in efx_rx_slow_fill()
385 ++rx_queue->slow_fill_count; in efx_rx_slow_fill()
388 static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue, in efx_rx_packet__check_len() argument
392 struct efx_nic *efx = rx_queue->efx; in efx_rx_packet__check_len()
406 efx_rx_queue_index(rx_queue), len, max_len); in efx_rx_packet__check_len()
408 efx_rx_queue_channel(rx_queue)->n_rx_overlength++; in efx_rx_packet__check_len()
425 struct efx_rx_queue *rx_queue; in efx_rx_packet_gro() local
427 rx_queue = efx_channel_get_rx_queue(channel); in efx_rx_packet_gro()
428 efx_free_rx_buffers(rx_queue, rx_buf, n_frags); in efx_rx_packet_gro()
448 rx_buf = efx_rx_buf_next(&channel->rx_queue, rx_buf); in efx_rx_packet_gro()
454 skb_record_rx_queue(skb, channel->rx_queue.core_index); in efx_rx_packet_gro()
501 rx_buf = efx_rx_buf_next(&channel->rx_queue, rx_buf); in efx_rx_mk_skb()
519 void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index, in efx_rx_packet() argument
522 struct efx_nic *efx = rx_queue->efx; in efx_rx_packet()
523 struct efx_channel *channel = efx_rx_queue_channel(rx_queue); in efx_rx_packet()
526 rx_queue->rx_packets++; in efx_rx_packet()
528 rx_buf = efx_rx_buffer(rx_queue, index); in efx_rx_packet()
534 efx_rx_packet__check_len(rx_queue, rx_buf, len); in efx_rx_packet()
548 efx_rx_queue_index(rx_queue), index, in efx_rx_packet()
549 (index + n_frags - 1) & rx_queue->ptr_mask, len, in efx_rx_packet()
585 rx_buf = efx_rx_buf_next(rx_queue, rx_buf); in efx_rx_packet()
595 rx_buf = efx_rx_buffer(rx_queue, index); in efx_rx_packet()
615 struct efx_rx_queue *rx_queue; in efx_rx_deliver() local
617 rx_queue = efx_channel_get_rx_queue(channel); in efx_rx_deliver()
618 efx_free_rx_buffers(rx_queue, rx_buf, n_frags); in efx_rx_deliver()
621 skb_record_rx_queue(skb, channel->rx_queue.core_index); in efx_rx_deliver()
650 efx_rx_buffer(&channel->rx_queue, channel->rx_pkt_index); in __efx_rx_packet()
664 struct efx_rx_queue *rx_queue; in __efx_rx_packet() local
667 rx_queue = efx_channel_get_rx_queue(channel); in __efx_rx_packet()
668 efx_free_rx_buffers(rx_queue, rx_buf, in __efx_rx_packet()
684 int efx_probe_rx_queue(struct efx_rx_queue *rx_queue) in efx_probe_rx_queue() argument
686 struct efx_nic *efx = rx_queue->efx; in efx_probe_rx_queue()
693 rx_queue->ptr_mask = entries - 1; in efx_probe_rx_queue()
697 efx_rx_queue_index(rx_queue), efx->rxq_entries, in efx_probe_rx_queue()
698 rx_queue->ptr_mask); in efx_probe_rx_queue()
701 rx_queue->buffer = kcalloc(entries, sizeof(*rx_queue->buffer), in efx_probe_rx_queue()
703 if (!rx_queue->buffer) in efx_probe_rx_queue()
706 rc = efx_nic_probe_rx(rx_queue); in efx_probe_rx_queue()
708 kfree(rx_queue->buffer); in efx_probe_rx_queue()
709 rx_queue->buffer = NULL; in efx_probe_rx_queue()
716 struct efx_rx_queue *rx_queue) in efx_init_rx_recycle_ring() argument
732 rx_queue->page_ring = kcalloc(page_ring_size, in efx_init_rx_recycle_ring()
733 sizeof(*rx_queue->page_ring), GFP_KERNEL); in efx_init_rx_recycle_ring()
734 rx_queue->page_ptr_mask = page_ring_size - 1; in efx_init_rx_recycle_ring()
737 void efx_init_rx_queue(struct efx_rx_queue *rx_queue) in efx_init_rx_queue() argument
739 struct efx_nic *efx = rx_queue->efx; in efx_init_rx_queue()
742 netif_dbg(rx_queue->efx, drv, rx_queue->efx->net_dev, in efx_init_rx_queue()
743 "initialising RX queue %d\n", efx_rx_queue_index(rx_queue)); in efx_init_rx_queue()
746 rx_queue->added_count = 0; in efx_init_rx_queue()
747 rx_queue->notified_count = 0; in efx_init_rx_queue()
748 rx_queue->removed_count = 0; in efx_init_rx_queue()
749 rx_queue->min_fill = -1U; in efx_init_rx_queue()
750 efx_init_rx_recycle_ring(efx, rx_queue); in efx_init_rx_queue()
752 rx_queue->page_remove = 0; in efx_init_rx_queue()
753 rx_queue->page_add = rx_queue->page_ptr_mask + 1; in efx_init_rx_queue()
754 rx_queue->page_recycle_count = 0; in efx_init_rx_queue()
755 rx_queue->page_recycle_failed = 0; in efx_init_rx_queue()
756 rx_queue->page_recycle_full = 0; in efx_init_rx_queue()
770 rx_queue->max_fill = max_fill; in efx_init_rx_queue()
771 rx_queue->fast_fill_trigger = trigger; in efx_init_rx_queue()
772 rx_queue->refill_enabled = true; in efx_init_rx_queue()
775 efx_nic_init_rx(rx_queue); in efx_init_rx_queue()
778 void efx_fini_rx_queue(struct efx_rx_queue *rx_queue) in efx_fini_rx_queue() argument
781 struct efx_nic *efx = rx_queue->efx; in efx_fini_rx_queue()
784 netif_dbg(rx_queue->efx, drv, rx_queue->efx->net_dev, in efx_fini_rx_queue()
785 "shutting down RX queue %d\n", efx_rx_queue_index(rx_queue)); in efx_fini_rx_queue()
787 del_timer_sync(&rx_queue->slow_fill); in efx_fini_rx_queue()
790 if (rx_queue->buffer) { in efx_fini_rx_queue()
791 for (i = rx_queue->removed_count; i < rx_queue->added_count; in efx_fini_rx_queue()
793 unsigned index = i & rx_queue->ptr_mask; in efx_fini_rx_queue()
794 rx_buf = efx_rx_buffer(rx_queue, index); in efx_fini_rx_queue()
795 efx_fini_rx_buffer(rx_queue, rx_buf); in efx_fini_rx_queue()
800 for (i = 0; i <= rx_queue->page_ptr_mask; i++) { in efx_fini_rx_queue()
801 struct page *page = rx_queue->page_ring[i]; in efx_fini_rx_queue()
813 kfree(rx_queue->page_ring); in efx_fini_rx_queue()
814 rx_queue->page_ring = NULL; in efx_fini_rx_queue()
817 void efx_remove_rx_queue(struct efx_rx_queue *rx_queue) in efx_remove_rx_queue() argument
819 netif_dbg(rx_queue->efx, drv, rx_queue->efx->net_dev, in efx_remove_rx_queue()
820 "destroying RX queue %d\n", efx_rx_queue_index(rx_queue)); in efx_remove_rx_queue()
822 efx_nic_remove_rx(rx_queue); in efx_remove_rx_queue()
824 kfree(rx_queue->buffer); in efx_remove_rx_queue()
825 rx_queue->buffer = NULL; in efx_remove_rx_queue()