Lines Matching refs:tx_queue

283 static inline void efx_farch_notify_tx_desc(struct efx_tx_queue *tx_queue)
288 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;
290 efx_writed_page(tx_queue->efx, &reg,
291 FR_AZ_TX_DESC_UPD_DWORD_P0, tx_queue->queue);
295 static inline void efx_farch_push_tx_desc(struct efx_tx_queue *tx_queue,
304 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;
308 efx_writeo_page(tx_queue->efx, &reg,
309 FR_BZ_TX_DESC_UPD_P0, tx_queue->queue);
317 void efx_farch_tx_write(struct efx_tx_queue *tx_queue)
322 unsigned old_write_count = tx_queue->write_count;
324 tx_queue->xmit_pending = false;
325 if (unlikely(tx_queue->write_count == tx_queue->insert_count))
329 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;
330 buffer = &tx_queue->buffer[write_ptr];
331 txd = efx_tx_desc(tx_queue, write_ptr);
332 ++tx_queue->write_count;
344 } while (tx_queue->write_count != tx_queue->insert_count);
348 if (efx_nic_may_push_tx_desc(tx_queue, old_write_count)) {
349 txd = efx_tx_desc(tx_queue,
350 old_write_count & tx_queue->ptr_mask);
351 efx_farch_push_tx_desc(tx_queue, txd);
352 ++tx_queue->pushes;
354 efx_farch_notify_tx_desc(tx_queue);
358 unsigned int efx_farch_tx_limit_len(struct efx_tx_queue *tx_queue,
371 int efx_farch_tx_probe(struct efx_tx_queue *tx_queue)
373 struct efx_nic *efx = tx_queue->efx;
376 tx_queue->type = ((tx_queue->label & 1) ? EFX_TXQ_TYPE_OUTER_CSUM : 0) |
377 ((tx_queue->label & 2) ? EFX_TXQ_TYPE_HIGHPRI : 0);
378 entries = tx_queue->ptr_mask + 1;
379 return efx_alloc_special_buffer(efx, &tx_queue->txd,
383 void efx_farch_tx_init(struct efx_tx_queue *tx_queue)
385 int csum = tx_queue->type & EFX_TXQ_TYPE_OUTER_CSUM;
386 struct efx_nic *efx = tx_queue->efx;
390 efx_init_special_buffer(efx, &tx_queue->txd);
397 FRF_AZ_TX_DESCQ_BUF_BASE_ID, tx_queue->txd.index,
399 tx_queue->channel->channel,
401 FRF_AZ_TX_DESCQ_LABEL, tx_queue->label,
403 __ffs(tx_queue->txd.entries),
411 tx_queue->queue);
415 (tx_queue->type & EFX_TXQ_TYPE_HIGHPRI) ?
418 efx_writeo_table(efx, &reg, FR_BZ_TX_PACE_TBL, tx_queue->queue);
420 tx_queue->tso_version = 1;
423 static void efx_farch_flush_tx_queue(struct efx_tx_queue *tx_queue)
425 struct efx_nic *efx = tx_queue->efx;
428 WARN_ON(atomic_read(&tx_queue->flush_outstanding));
429 atomic_set(&tx_queue->flush_outstanding, 1);
433 FRF_AZ_TX_FLUSH_DESCQ, tx_queue->queue);
437 void efx_farch_tx_fini(struct efx_tx_queue *tx_queue)
439 struct efx_nic *efx = tx_queue->efx;
445 tx_queue->queue);
448 efx_fini_special_buffer(efx, &tx_queue->txd);
452 void efx_farch_tx_remove(struct efx_tx_queue *tx_queue)
454 efx_free_special_buffer(tx_queue->efx, &tx_queue->txd);
607 struct efx_tx_queue *tx_queue;
610 efx_for_each_channel_tx_queue(tx_queue, channel) {
612 FR_BZ_TX_DESC_PTR_TBL, tx_queue->queue);
619 tx_queue->queue);
621 } else if (atomic_cmpxchg(&tx_queue->flush_outstanding,
628 "the queue\n", tx_queue->queue);
635 tx_queue));
651 struct efx_tx_queue *tx_queue;
655 efx_for_each_channel_tx_queue(tx_queue, channel) {
656 efx_farch_flush_tx_queue(tx_queue);
719 struct efx_tx_queue *tx_queue;
735 efx_for_each_channel_tx_queue(tx_queue, channel)
736 efx_farch_tx_fini(tx_queue);
830 struct efx_tx_queue *tx_queue;
840 tx_queue = channel->tx_queue +
842 efx_siena_xmit_done(tx_queue, tx_ev_desc_ptr);
846 tx_queue = channel->tx_queue +
850 efx_farch_notify_tx_desc(tx_queue);
1085 struct efx_tx_queue *tx_queue;
1092 tx_queue = channel->tx_queue + (qid % EFX_MAX_TXQ_PER_CHANNEL);
1093 if (atomic_cmpxchg(&tx_queue->flush_outstanding, 1, 0))
1094 efx_farch_magic_event(tx_queue->channel,
1095 EFX_CHANNEL_MAGIC_TX_DRAIN(tx_queue));