Lines Matching refs:tx_queue
282 static inline void efx_farch_notify_tx_desc(struct efx_tx_queue *tx_queue) in efx_farch_notify_tx_desc() argument
287 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in efx_farch_notify_tx_desc()
289 efx_writed_page(tx_queue->efx, ®, in efx_farch_notify_tx_desc()
290 FR_AZ_TX_DESC_UPD_DWORD_P0, tx_queue->queue); in efx_farch_notify_tx_desc()
294 static inline void efx_farch_push_tx_desc(struct efx_tx_queue *tx_queue, in efx_farch_push_tx_desc() argument
303 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in efx_farch_push_tx_desc()
307 efx_writeo_page(tx_queue->efx, ®, in efx_farch_push_tx_desc()
308 FR_BZ_TX_DESC_UPD_P0, tx_queue->queue); in efx_farch_push_tx_desc()
316 void efx_farch_tx_write(struct efx_tx_queue *tx_queue) in efx_farch_tx_write() argument
321 unsigned old_write_count = tx_queue->write_count; in efx_farch_tx_write()
323 tx_queue->xmit_pending = false; in efx_farch_tx_write()
324 if (unlikely(tx_queue->write_count == tx_queue->insert_count)) in efx_farch_tx_write()
328 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in efx_farch_tx_write()
329 buffer = &tx_queue->buffer[write_ptr]; in efx_farch_tx_write()
330 txd = efx_tx_desc(tx_queue, write_ptr); in efx_farch_tx_write()
331 ++tx_queue->write_count; in efx_farch_tx_write()
343 } while (tx_queue->write_count != tx_queue->insert_count); in efx_farch_tx_write()
347 if (efx_nic_may_push_tx_desc(tx_queue, old_write_count)) { in efx_farch_tx_write()
348 txd = efx_tx_desc(tx_queue, in efx_farch_tx_write()
349 old_write_count & tx_queue->ptr_mask); in efx_farch_tx_write()
350 efx_farch_push_tx_desc(tx_queue, txd); in efx_farch_tx_write()
351 ++tx_queue->pushes; in efx_farch_tx_write()
353 efx_farch_notify_tx_desc(tx_queue); in efx_farch_tx_write()
357 unsigned int efx_farch_tx_limit_len(struct efx_tx_queue *tx_queue, in efx_farch_tx_limit_len() argument
370 int efx_farch_tx_probe(struct efx_tx_queue *tx_queue) in efx_farch_tx_probe() argument
372 struct efx_nic *efx = tx_queue->efx; in efx_farch_tx_probe()
375 tx_queue->type = ((tx_queue->label & 1) ? EFX_TXQ_TYPE_OUTER_CSUM : 0) | in efx_farch_tx_probe()
376 ((tx_queue->label & 2) ? EFX_TXQ_TYPE_HIGHPRI : 0); in efx_farch_tx_probe()
377 entries = tx_queue->ptr_mask + 1; in efx_farch_tx_probe()
378 return efx_alloc_special_buffer(efx, &tx_queue->txd, in efx_farch_tx_probe()
382 void efx_farch_tx_init(struct efx_tx_queue *tx_queue) in efx_farch_tx_init() argument
384 int csum = tx_queue->type & EFX_TXQ_TYPE_OUTER_CSUM; in efx_farch_tx_init()
385 struct efx_nic *efx = tx_queue->efx; in efx_farch_tx_init()
389 efx_init_special_buffer(efx, &tx_queue->txd); in efx_farch_tx_init()
396 FRF_AZ_TX_DESCQ_BUF_BASE_ID, tx_queue->txd.index, in efx_farch_tx_init()
398 tx_queue->channel->channel, in efx_farch_tx_init()
400 FRF_AZ_TX_DESCQ_LABEL, tx_queue->label, in efx_farch_tx_init()
402 __ffs(tx_queue->txd.entries), in efx_farch_tx_init()
410 tx_queue->queue); in efx_farch_tx_init()
414 (tx_queue->type & EFX_TXQ_TYPE_HIGHPRI) ? in efx_farch_tx_init()
417 efx_writeo_table(efx, ®, FR_BZ_TX_PACE_TBL, tx_queue->queue); in efx_farch_tx_init()
419 tx_queue->tso_version = 1; in efx_farch_tx_init()
422 static void efx_farch_flush_tx_queue(struct efx_tx_queue *tx_queue) in efx_farch_flush_tx_queue() argument
424 struct efx_nic *efx = tx_queue->efx; in efx_farch_flush_tx_queue()
427 WARN_ON(atomic_read(&tx_queue->flush_outstanding)); in efx_farch_flush_tx_queue()
428 atomic_set(&tx_queue->flush_outstanding, 1); in efx_farch_flush_tx_queue()
432 FRF_AZ_TX_FLUSH_DESCQ, tx_queue->queue); in efx_farch_flush_tx_queue()
436 void efx_farch_tx_fini(struct efx_tx_queue *tx_queue) in efx_farch_tx_fini() argument
438 struct efx_nic *efx = tx_queue->efx; in efx_farch_tx_fini()
444 tx_queue->queue); in efx_farch_tx_fini()
447 efx_fini_special_buffer(efx, &tx_queue->txd); in efx_farch_tx_fini()
451 void efx_farch_tx_remove(struct efx_tx_queue *tx_queue) in efx_farch_tx_remove() argument
453 efx_free_special_buffer(tx_queue->efx, &tx_queue->txd); in efx_farch_tx_remove()
606 struct efx_tx_queue *tx_queue; in efx_check_tx_flush_complete() local
609 efx_for_each_channel_tx_queue(tx_queue, channel) { in efx_check_tx_flush_complete()
611 FR_BZ_TX_DESC_PTR_TBL, tx_queue->queue); in efx_check_tx_flush_complete()
618 tx_queue->queue); in efx_check_tx_flush_complete()
620 } else if (atomic_cmpxchg(&tx_queue->flush_outstanding, in efx_check_tx_flush_complete()
627 "the queue\n", tx_queue->queue); in efx_check_tx_flush_complete()
634 tx_queue)); in efx_check_tx_flush_complete()
650 struct efx_tx_queue *tx_queue; in efx_farch_do_flush() local
654 efx_for_each_channel_tx_queue(tx_queue, channel) { in efx_farch_do_flush()
655 efx_farch_flush_tx_queue(tx_queue); in efx_farch_do_flush()
718 struct efx_tx_queue *tx_queue; in efx_farch_fini_dmaq() local
734 efx_for_each_channel_tx_queue(tx_queue, channel) in efx_farch_fini_dmaq()
735 efx_farch_tx_fini(tx_queue); in efx_farch_fini_dmaq()
828 struct efx_tx_queue *tx_queue; in efx_farch_handle_tx_event() local
838 tx_queue = efx_channel_get_tx_queue( in efx_farch_handle_tx_event()
840 efx_xmit_done(tx_queue, tx_ev_desc_ptr); in efx_farch_handle_tx_event()
844 tx_queue = efx_channel_get_tx_queue( in efx_farch_handle_tx_event()
848 efx_farch_notify_tx_desc(tx_queue); in efx_farch_handle_tx_event()
1083 struct efx_tx_queue *tx_queue; in efx_farch_handle_tx_flush_done() local
1088 tx_queue = efx_get_tx_queue(efx, qid / EFX_MAX_TXQ_PER_CHANNEL, in efx_farch_handle_tx_flush_done()
1090 if (atomic_cmpxchg(&tx_queue->flush_outstanding, 1, 0)) { in efx_farch_handle_tx_flush_done()
1091 efx_farch_magic_event(tx_queue->channel, in efx_farch_handle_tx_flush_done()
1092 EFX_CHANNEL_MAGIC_TX_DRAIN(tx_queue)); in efx_farch_handle_tx_flush_done()