Lines Matching refs:tx_queue
275 static inline void ef4_farch_notify_tx_desc(struct ef4_tx_queue *tx_queue) in ef4_farch_notify_tx_desc() argument
280 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in ef4_farch_notify_tx_desc()
282 ef4_writed_page(tx_queue->efx, ®, in ef4_farch_notify_tx_desc()
283 FR_AZ_TX_DESC_UPD_DWORD_P0, tx_queue->queue); in ef4_farch_notify_tx_desc()
287 static inline void ef4_farch_push_tx_desc(struct ef4_tx_queue *tx_queue, in ef4_farch_push_tx_desc() argument
296 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in ef4_farch_push_tx_desc()
300 ef4_writeo_page(tx_queue->efx, ®, in ef4_farch_push_tx_desc()
301 FR_BZ_TX_DESC_UPD_P0, tx_queue->queue); in ef4_farch_push_tx_desc()
309 void ef4_farch_tx_write(struct ef4_tx_queue *tx_queue) in ef4_farch_tx_write() argument
314 unsigned old_write_count = tx_queue->write_count; in ef4_farch_tx_write()
316 tx_queue->xmit_more_available = false; in ef4_farch_tx_write()
317 if (unlikely(tx_queue->write_count == tx_queue->insert_count)) in ef4_farch_tx_write()
321 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in ef4_farch_tx_write()
322 buffer = &tx_queue->buffer[write_ptr]; in ef4_farch_tx_write()
323 txd = ef4_tx_desc(tx_queue, write_ptr); in ef4_farch_tx_write()
324 ++tx_queue->write_count; in ef4_farch_tx_write()
336 } while (tx_queue->write_count != tx_queue->insert_count); in ef4_farch_tx_write()
340 if (ef4_nic_may_push_tx_desc(tx_queue, old_write_count)) { in ef4_farch_tx_write()
341 txd = ef4_tx_desc(tx_queue, in ef4_farch_tx_write()
342 old_write_count & tx_queue->ptr_mask); in ef4_farch_tx_write()
343 ef4_farch_push_tx_desc(tx_queue, txd); in ef4_farch_tx_write()
344 ++tx_queue->pushes; in ef4_farch_tx_write()
346 ef4_farch_notify_tx_desc(tx_queue); in ef4_farch_tx_write()
350 unsigned int ef4_farch_tx_limit_len(struct ef4_tx_queue *tx_queue, in ef4_farch_tx_limit_len() argument
358 if (EF4_WORKAROUND_5391(tx_queue->efx) && (dma_addr & 0xf)) in ef4_farch_tx_limit_len()
366 int ef4_farch_tx_probe(struct ef4_tx_queue *tx_queue) in ef4_farch_tx_probe() argument
368 struct ef4_nic *efx = tx_queue->efx; in ef4_farch_tx_probe()
371 entries = tx_queue->ptr_mask + 1; in ef4_farch_tx_probe()
372 return ef4_alloc_special_buffer(efx, &tx_queue->txd, in ef4_farch_tx_probe()
376 void ef4_farch_tx_init(struct ef4_tx_queue *tx_queue) in ef4_farch_tx_init() argument
378 struct ef4_nic *efx = tx_queue->efx; in ef4_farch_tx_init()
382 ef4_init_special_buffer(efx, &tx_queue->txd); in ef4_farch_tx_init()
389 FRF_AZ_TX_DESCQ_BUF_BASE_ID, tx_queue->txd.index, in ef4_farch_tx_init()
391 tx_queue->channel->channel, in ef4_farch_tx_init()
393 FRF_AZ_TX_DESCQ_LABEL, tx_queue->queue, in ef4_farch_tx_init()
395 __ffs(tx_queue->txd.entries), in ef4_farch_tx_init()
400 int csum = tx_queue->queue & EF4_TXQ_TYPE_OFFLOAD; in ef4_farch_tx_init()
407 tx_queue->queue); in ef4_farch_tx_init()
414 if (tx_queue->queue & EF4_TXQ_TYPE_OFFLOAD) in ef4_farch_tx_init()
415 __clear_bit_le(tx_queue->queue, ®); in ef4_farch_tx_init()
417 __set_bit_le(tx_queue->queue, ®); in ef4_farch_tx_init()
424 (tx_queue->queue & EF4_TXQ_TYPE_HIGHPRI) ? in ef4_farch_tx_init()
428 tx_queue->queue); in ef4_farch_tx_init()
432 static void ef4_farch_flush_tx_queue(struct ef4_tx_queue *tx_queue) in ef4_farch_flush_tx_queue() argument
434 struct ef4_nic *efx = tx_queue->efx; in ef4_farch_flush_tx_queue()
437 WARN_ON(atomic_read(&tx_queue->flush_outstanding)); in ef4_farch_flush_tx_queue()
438 atomic_set(&tx_queue->flush_outstanding, 1); in ef4_farch_flush_tx_queue()
442 FRF_AZ_TX_FLUSH_DESCQ, tx_queue->queue); in ef4_farch_flush_tx_queue()
446 void ef4_farch_tx_fini(struct ef4_tx_queue *tx_queue) in ef4_farch_tx_fini() argument
448 struct ef4_nic *efx = tx_queue->efx; in ef4_farch_tx_fini()
454 tx_queue->queue); in ef4_farch_tx_fini()
457 ef4_fini_special_buffer(efx, &tx_queue->txd); in ef4_farch_tx_fini()
461 void ef4_farch_tx_remove(struct ef4_tx_queue *tx_queue) in ef4_farch_tx_remove() argument
463 ef4_free_special_buffer(tx_queue->efx, &tx_queue->txd); in ef4_farch_tx_remove()
622 struct ef4_tx_queue *tx_queue; in ef4_check_tx_flush_complete() local
625 ef4_for_each_channel_tx_queue(tx_queue, channel) { in ef4_check_tx_flush_complete()
627 FR_BZ_TX_DESC_PTR_TBL, tx_queue->queue); in ef4_check_tx_flush_complete()
634 tx_queue->queue); in ef4_check_tx_flush_complete()
636 } else if (atomic_cmpxchg(&tx_queue->flush_outstanding, in ef4_check_tx_flush_complete()
643 "the queue\n", tx_queue->queue); in ef4_check_tx_flush_complete()
650 tx_queue)); in ef4_check_tx_flush_complete()
666 struct ef4_tx_queue *tx_queue; in ef4_farch_do_flush() local
670 ef4_for_each_channel_tx_queue(tx_queue, channel) { in ef4_farch_do_flush()
671 ef4_farch_flush_tx_queue(tx_queue); in ef4_farch_do_flush()
723 struct ef4_tx_queue *tx_queue; in ef4_farch_fini_dmaq() local
739 ef4_for_each_channel_tx_queue(tx_queue, channel) in ef4_farch_fini_dmaq()
740 ef4_farch_tx_fini(tx_queue); in ef4_farch_fini_dmaq()
833 struct ef4_tx_queue *tx_queue; in ef4_farch_handle_tx_event() local
844 tx_queue = ef4_channel_get_tx_queue( in ef4_farch_handle_tx_event()
846 tx_packets = ((tx_ev_desc_ptr - tx_queue->read_count) & in ef4_farch_handle_tx_event()
847 tx_queue->ptr_mask); in ef4_farch_handle_tx_event()
848 ef4_xmit_done(tx_queue, tx_ev_desc_ptr); in ef4_farch_handle_tx_event()
852 tx_queue = ef4_channel_get_tx_queue( in ef4_farch_handle_tx_event()
856 ef4_farch_notify_tx_desc(tx_queue); in ef4_farch_handle_tx_event()
1096 struct ef4_tx_queue *tx_queue; in ef4_farch_handle_tx_flush_done() local
1101 tx_queue = ef4_get_tx_queue(efx, qid / EF4_TXQ_TYPES, in ef4_farch_handle_tx_flush_done()
1103 if (atomic_cmpxchg(&tx_queue->flush_outstanding, 1, 0)) { in ef4_farch_handle_tx_flush_done()
1104 ef4_farch_magic_event(tx_queue->channel, in ef4_farch_handle_tx_flush_done()
1105 EF4_CHANNEL_MAGIC_TX_DRAIN(tx_queue)); in ef4_farch_handle_tx_flush_done()