Lines Matching refs:droq
108 struct octeon_droq *droq) in octeon_droq_check_hw_for_pkts() argument
112 pkt_count = readl(droq->pkts_sent_reg); in octeon_droq_check_hw_for_pkts()
114 atomic_add(pkt_count, &droq->pkts_pending); in octeon_droq_check_hw_for_pkts()
115 writel(pkt_count, droq->pkts_sent_reg); in octeon_droq_check_hw_for_pkts()
121 static void octeon_droq_compute_max_packet_bufs(struct octeon_droq *droq) in octeon_droq_compute_max_packet_bufs() argument
130 droq->max_empty_descs = 0; in octeon_droq_compute_max_packet_bufs()
133 droq->max_empty_descs++; in octeon_droq_compute_max_packet_bufs()
134 count += droq->buffer_size; in octeon_droq_compute_max_packet_bufs()
137 droq->max_empty_descs = droq->max_count - droq->max_empty_descs; in octeon_droq_compute_max_packet_bufs()
140 static void octeon_droq_reset_indices(struct octeon_droq *droq) in octeon_droq_reset_indices() argument
142 droq->read_idx = 0; in octeon_droq_reset_indices()
143 droq->write_idx = 0; in octeon_droq_reset_indices()
144 droq->refill_idx = 0; in octeon_droq_reset_indices()
145 droq->refill_count = 0; in octeon_droq_reset_indices()
146 atomic_set(&droq->pkts_pending, 0); in octeon_droq_reset_indices()
151 struct octeon_droq *droq) in octeon_droq_destroy_ring_buffers() argument
155 for (i = 0; i < droq->max_count; i++) { in octeon_droq_destroy_ring_buffers()
156 if (droq->recv_buf_list[i].buffer) { in octeon_droq_destroy_ring_buffers()
157 if (droq->desc_ring) { in octeon_droq_destroy_ring_buffers()
159 (u64)droq-> in octeon_droq_destroy_ring_buffers()
163 (u64)droq->desc_ring[i]. in octeon_droq_destroy_ring_buffers()
165 droq->buffer_size); in octeon_droq_destroy_ring_buffers()
167 recv_buffer_free(droq->recv_buf_list[i].buffer); in octeon_droq_destroy_ring_buffers()
168 droq->recv_buf_list[i].buffer = NULL; in octeon_droq_destroy_ring_buffers()
172 octeon_droq_reset_indices(droq); in octeon_droq_destroy_ring_buffers()
177 struct octeon_droq *droq) in octeon_droq_setup_ring_buffers() argument
181 struct octeon_droq_desc *desc_ring = droq->desc_ring; in octeon_droq_setup_ring_buffers()
183 for (i = 0; i < droq->max_count; i++) { in octeon_droq_setup_ring_buffers()
184 buf = recv_buffer_alloc(oct, droq->q_no, droq->buffer_size); in octeon_droq_setup_ring_buffers()
192 droq->recv_buf_list[i].buffer = buf; in octeon_droq_setup_ring_buffers()
193 droq->recv_buf_list[i].data = get_rbd(buf); in octeon_droq_setup_ring_buffers()
195 droq->info_list[i].length = 0; in octeon_droq_setup_ring_buffers()
198 desc_ring[i].info_ptr = lio_map_ring_info(droq, i); in octeon_droq_setup_ring_buffers()
201 droq->recv_buf_list[i].buffer, in octeon_droq_setup_ring_buffers()
202 droq->buffer_size); in octeon_droq_setup_ring_buffers()
205 octeon_droq_reset_indices(droq); in octeon_droq_setup_ring_buffers()
207 octeon_droq_compute_max_packet_bufs(droq); in octeon_droq_setup_ring_buffers()
214 struct octeon_droq *droq = oct->droq[q_no]; in octeon_delete_droq() local
218 octeon_droq_destroy_ring_buffers(oct, droq); in octeon_delete_droq()
219 vfree(droq->recv_buf_list); in octeon_delete_droq()
221 if (droq->info_base_addr) in octeon_delete_droq()
222 cnnic_free_aligned_dma(oct->pci_dev, droq->info_list, in octeon_delete_droq()
223 droq->info_alloc_size, in octeon_delete_droq()
224 droq->info_base_addr, in octeon_delete_droq()
225 droq->info_list_dma); in octeon_delete_droq()
227 if (droq->desc_ring) in octeon_delete_droq()
228 lio_dma_free(oct, (droq->max_count * OCT_DROQ_DESC_SIZE), in octeon_delete_droq()
229 droq->desc_ring, droq->desc_ring_dma); in octeon_delete_droq()
231 memset(droq, 0, OCT_DROQ_SIZE); in octeon_delete_droq()
242 struct octeon_droq *droq; in octeon_init_droq() local
248 droq = oct->droq[q_no]; in octeon_init_droq()
249 memset(droq, 0, OCT_DROQ_SIZE); in octeon_init_droq()
251 droq->oct_dev = oct; in octeon_init_droq()
252 droq->q_no = q_no; in octeon_init_droq()
254 droq->app_ctx = app_ctx; in octeon_init_droq()
256 droq->app_ctx = (void *)(size_t)q_no; in octeon_init_droq()
267 droq->max_count = c_num_descs; in octeon_init_droq()
268 droq->buffer_size = c_buf_size; in octeon_init_droq()
270 desc_ring_size = droq->max_count * OCT_DROQ_DESC_SIZE; in octeon_init_droq()
271 droq->desc_ring = lio_dma_alloc(oct, desc_ring_size, in octeon_init_droq()
272 (dma_addr_t *)&droq->desc_ring_dma); in octeon_init_droq()
274 if (!droq->desc_ring) { in octeon_init_droq()
281 q_no, droq->desc_ring, droq->desc_ring_dma); in octeon_init_droq()
283 droq->max_count); in octeon_init_droq()
285 droq->info_list = in octeon_init_droq()
287 (droq->max_count * OCT_DROQ_INFO_SIZE), in octeon_init_droq()
288 &droq->info_alloc_size, in octeon_init_droq()
289 &droq->info_base_addr, in octeon_init_droq()
290 &droq->info_list_dma); in octeon_init_droq()
292 if (!droq->info_list) { in octeon_init_droq()
294 lio_dma_free(oct, (droq->max_count * OCT_DROQ_DESC_SIZE), in octeon_init_droq()
295 droq->desc_ring, droq->desc_ring_dma); in octeon_init_droq()
299 droq->recv_buf_list = (struct octeon_recv_buffer *) in octeon_init_droq()
300 vmalloc(droq->max_count * in octeon_init_droq()
302 if (!droq->recv_buf_list) { in octeon_init_droq()
307 if (octeon_droq_setup_ring_buffers(oct, droq)) in octeon_init_droq()
310 droq->pkts_per_intr = c_pkts_per_intr; in octeon_init_droq()
311 droq->refill_threshold = c_refill_threshold; in octeon_init_droq()
314 droq->max_empty_descs); in octeon_init_droq()
316 spin_lock_init(&droq->lock); in octeon_init_droq()
318 INIT_LIST_HEAD(&droq->dispatch_list); in octeon_init_droq()
353 struct octeon_droq *droq, in octeon_create_recv_info() argument
362 info = &droq->info_list[idx]; in octeon_create_recv_info()
379 (u64)droq->desc_ring[idx].buffer_ptr, in octeon_create_recv_info()
380 droq->buffer_size); in octeon_create_recv_info()
384 droq->buffer_size) ? droq->buffer_size : bytes_left; in octeon_create_recv_info()
386 recv_pkt->buffer_ptr[i] = droq->recv_buf_list[idx].buffer; in octeon_create_recv_info()
387 droq->recv_buf_list[idx].buffer = NULL; in octeon_create_recv_info()
389 INCR_INDEX_BY1(idx, droq->max_count); in octeon_create_recv_info()
390 bytes_left -= droq->buffer_size; in octeon_create_recv_info()
402 octeon_droq_refill_pullup_descs(struct octeon_droq *droq, in octeon_droq_refill_pullup_descs() argument
407 u32 refill_index = droq->refill_idx; in octeon_droq_refill_pullup_descs()
409 while (refill_index != droq->read_idx) { in octeon_droq_refill_pullup_descs()
410 if (droq->recv_buf_list[refill_index].buffer) { in octeon_droq_refill_pullup_descs()
411 droq->recv_buf_list[droq->refill_idx].buffer = in octeon_droq_refill_pullup_descs()
412 droq->recv_buf_list[refill_index].buffer; in octeon_droq_refill_pullup_descs()
413 droq->recv_buf_list[droq->refill_idx].data = in octeon_droq_refill_pullup_descs()
414 droq->recv_buf_list[refill_index].data; in octeon_droq_refill_pullup_descs()
415 desc_ring[droq->refill_idx].buffer_ptr = in octeon_droq_refill_pullup_descs()
417 droq->recv_buf_list[refill_index].buffer = NULL; in octeon_droq_refill_pullup_descs()
420 INCR_INDEX_BY1(droq->refill_idx, in octeon_droq_refill_pullup_descs()
421 droq->max_count); in octeon_droq_refill_pullup_descs()
423 droq->refill_count--; in octeon_droq_refill_pullup_descs()
424 } while (droq->recv_buf_list[droq->refill_idx]. in octeon_droq_refill_pullup_descs()
427 INCR_INDEX_BY1(refill_index, droq->max_count); in octeon_droq_refill_pullup_descs()
446 octeon_droq_refill(struct octeon_device *octeon_dev, struct octeon_droq *droq) in octeon_droq_refill() argument
453 desc_ring = droq->desc_ring; in octeon_droq_refill()
455 while (droq->refill_count && (desc_refilled < droq->max_count)) { in octeon_droq_refill()
460 if (!droq->recv_buf_list[droq->refill_idx].buffer) { in octeon_droq_refill()
461 buf = recv_buffer_alloc(octeon_dev, droq->q_no, in octeon_droq_refill()
462 droq->buffer_size); in octeon_droq_refill()
468 droq->recv_buf_list[droq->refill_idx].buffer = in octeon_droq_refill()
472 data = get_rbd(droq->recv_buf_list in octeon_droq_refill()
473 [droq->refill_idx].buffer); in octeon_droq_refill()
476 droq->recv_buf_list[droq->refill_idx].data = data; in octeon_droq_refill()
478 desc_ring[droq->refill_idx].buffer_ptr = in octeon_droq_refill()
480 droq->recv_buf_list[droq-> in octeon_droq_refill()
482 droq->buffer_size); in octeon_droq_refill()
485 droq->info_list[droq->refill_idx].length = 0; in octeon_droq_refill()
487 INCR_INDEX_BY1(droq->refill_idx, droq->max_count); in octeon_droq_refill()
489 droq->refill_count--; in octeon_droq_refill()
492 if (droq->refill_count) in octeon_droq_refill()
494 octeon_droq_refill_pullup_descs(droq, desc_ring); in octeon_droq_refill()
516 struct octeon_droq *droq, in octeon_droq_dispatch_pkt() argument
524 cnt = octeon_droq_get_bufcount(droq->buffer_size, (u32)info->length); in octeon_droq_dispatch_pkt()
529 rinfo = octeon_create_recv_info(oct, droq, cnt, droq->read_idx); in octeon_droq_dispatch_pkt()
537 &droq->dispatch_list); in octeon_droq_dispatch_pkt()
539 droq->stats.dropped_nomem++; in octeon_droq_dispatch_pkt()
543 droq->stats.dropped_nodispatch++; in octeon_droq_dispatch_pkt()
550 struct octeon_droq *droq, in octeon_droq_drop_packets() argument
557 info = &droq->info_list[droq->read_idx]; in octeon_droq_drop_packets()
562 droq->stats.bytes_received += info->length; in octeon_droq_drop_packets()
563 buf_cnt = octeon_droq_get_bufcount(droq->buffer_size, in octeon_droq_drop_packets()
570 INCR_INDEX(droq->read_idx, buf_cnt, droq->max_count); in octeon_droq_drop_packets()
571 droq->refill_count += buf_cnt; in octeon_droq_drop_packets()
577 struct octeon_droq *droq, in octeon_droq_fast_process_packets() argument
590 info = &droq->info_list[droq->read_idx]; in octeon_droq_fast_process_packets()
596 droq->q_no, droq->read_idx, pkt_count); in octeon_droq_fast_process_packets()
612 buf_cnt = octeon_droq_dispatch_pkt(oct, droq, rh, info); in octeon_droq_fast_process_packets()
613 INCR_INDEX(droq->read_idx, buf_cnt, droq->max_count); in octeon_droq_fast_process_packets()
614 droq->refill_count += buf_cnt; in octeon_droq_fast_process_packets()
616 if (info->length <= droq->buffer_size) { in octeon_droq_fast_process_packets()
618 (u64)droq->desc_ring[ in octeon_droq_fast_process_packets()
619 droq->read_idx].buffer_ptr, in octeon_droq_fast_process_packets()
620 droq->buffer_size); in octeon_droq_fast_process_packets()
622 nicbuf = droq->recv_buf_list[ in octeon_droq_fast_process_packets()
623 droq->read_idx].buffer; in octeon_droq_fast_process_packets()
624 droq->recv_buf_list[droq->read_idx].buffer = in octeon_droq_fast_process_packets()
626 INCR_INDEX_BY1(droq->read_idx, droq->max_count); in octeon_droq_fast_process_packets()
628 droq->refill_count++; in octeon_droq_fast_process_packets()
630 nicbuf = octeon_fast_packet_alloc(oct, droq, in octeon_droq_fast_process_packets()
631 droq->q_no, in octeon_droq_fast_process_packets()
642 droq->buffer_size) > in octeon_droq_fast_process_packets()
645 droq->buffer_size; in octeon_droq_fast_process_packets()
650 droq->desc_ring in octeon_droq_fast_process_packets()
651 [droq->read_idx]. in octeon_droq_fast_process_packets()
653 droq-> in octeon_droq_fast_process_packets()
655 octeon_fast_packet_next(droq, in octeon_droq_fast_process_packets()
658 droq-> in octeon_droq_fast_process_packets()
664 INCR_INDEX_BY1(droq->read_idx, in octeon_droq_fast_process_packets()
665 droq->max_count); in octeon_droq_fast_process_packets()
666 droq->refill_count++; in octeon_droq_fast_process_packets()
671 if (droq->ops.fptr) in octeon_droq_fast_process_packets()
672 droq->ops.fptr(oct->octeon_id, in octeon_droq_fast_process_packets()
674 rh, &droq->napi); in octeon_droq_fast_process_packets()
680 if (droq->refill_count >= droq->refill_threshold) { in octeon_droq_fast_process_packets()
681 int desc_refilled = octeon_droq_refill(oct, droq); in octeon_droq_fast_process_packets()
688 writel((desc_refilled), droq->pkts_credit_reg); in octeon_droq_fast_process_packets()
696 droq->stats.pkts_received += pkt; in octeon_droq_fast_process_packets()
697 droq->stats.bytes_received += total_len; in octeon_droq_fast_process_packets()
699 if ((droq->ops.drop_on_max) && (pkts_to_process - pkt)) { in octeon_droq_fast_process_packets()
700 octeon_droq_drop_packets(oct, droq, (pkts_to_process - pkt)); in octeon_droq_fast_process_packets()
702 droq->stats.dropped_toomany += (pkts_to_process - pkt); in octeon_droq_fast_process_packets()
711 struct octeon_droq *droq, in octeon_droq_process_packets() argument
717 pkt_count = atomic_read(&droq->pkts_pending); in octeon_droq_process_packets()
725 spin_lock(&droq->lock); in octeon_droq_process_packets()
727 pkts_processed = octeon_droq_fast_process_packets(oct, droq, pkt_count); in octeon_droq_process_packets()
729 atomic_sub(pkts_processed, &droq->pkts_pending); in octeon_droq_process_packets()
732 spin_unlock(&droq->lock); in octeon_droq_process_packets()
734 list_for_each_safe(tmp, tmp2, &droq->dispatch_list) { in octeon_droq_process_packets()
746 if (atomic_read(&droq->pkts_pending)) in octeon_droq_process_packets()
759 struct octeon_droq *droq, u32 budget) in octeon_droq_process_poll_pkts() argument
765 if (budget > droq->max_count) in octeon_droq_process_poll_pkts()
766 budget = droq->max_count; in octeon_droq_process_poll_pkts()
768 spin_lock(&droq->lock); in octeon_droq_process_poll_pkts()
773 (u32)(atomic_read(&droq->pkts_pending))); in octeon_droq_process_poll_pkts()
779 octeon_droq_fast_process_packets(oct, droq, in octeon_droq_process_poll_pkts()
782 atomic_sub(pkts_processed, &droq->pkts_pending); in octeon_droq_process_poll_pkts()
786 octeon_droq_check_hw_for_pkts(oct, droq); in octeon_droq_process_poll_pkts()
789 spin_unlock(&droq->lock); in octeon_droq_process_poll_pkts()
791 list_for_each_safe(tmp, tmp2, &droq->dispatch_list) { in octeon_droq_process_poll_pkts()
809 struct octeon_droq *droq; in octeon_process_droq_poll_cmd() local
823 droq = oct->droq[q_no]; in octeon_process_droq_poll_cmd()
826 return octeon_droq_process_poll_pkts(oct, droq, arg); in octeon_process_droq_poll_cmd()
829 u32 pkt_cnt = atomic_read(&droq->pkts_pending); in octeon_process_droq_poll_cmd()
831 return octeon_droq_process_packets(oct, droq, pkt_cnt); in octeon_process_droq_poll_cmd()
880 struct octeon_droq *droq; in octeon_register_droq_ops() local
901 droq = oct->droq[q_no]; in octeon_register_droq_ops()
903 spin_lock_irqsave(&droq->lock, flags); in octeon_register_droq_ops()
905 memcpy(&droq->ops, ops, sizeof(struct octeon_droq_ops)); in octeon_register_droq_ops()
907 spin_unlock_irqrestore(&droq->lock, flags); in octeon_register_droq_ops()
915 struct octeon_droq *droq; in octeon_unregister_droq_ops() local
929 droq = oct->droq[q_no]; in octeon_unregister_droq_ops()
931 if (!droq) { in octeon_unregister_droq_ops()
937 spin_lock_irqsave(&droq->lock, flags); in octeon_unregister_droq_ops()
939 droq->ops.fptr = NULL; in octeon_unregister_droq_ops()
940 droq->ops.drop_on_max = 0; in octeon_unregister_droq_ops()
942 spin_unlock_irqrestore(&droq->lock, flags); in octeon_unregister_droq_ops()
951 struct octeon_droq *droq; in octeon_create_droq() local
953 if (oct->droq[q_no]) { in octeon_create_droq()
960 droq = vmalloc(sizeof(*droq)); in octeon_create_droq()
961 if (!droq) in octeon_create_droq()
963 memset(droq, 0, sizeof(struct octeon_droq)); in octeon_create_droq()
967 oct->droq[q_no] = droq; in octeon_create_droq()