Lines Matching defs:tx_queue

23 int ef100_tx_probe(struct efx_tx_queue *tx_queue)
26 return efx_nic_alloc_buffer(tx_queue->efx, &tx_queue->txd,
27 (tx_queue->ptr_mask + 2) *
32 void ef100_tx_init(struct efx_tx_queue *tx_queue)
35 tx_queue->core_txq =
36 netdev_get_tx_queue(tx_queue->efx->net_dev,
37 tx_queue->channel->channel -
38 tx_queue->efx->tx_channel_offset);
46 tx_queue->tso_version = 3;
47 if (efx_mcdi_tx_init(tx_queue))
48 netdev_WARN(tx_queue->efx->net_dev,
49 "failed to initialise TXQ %d\n", tx_queue->queue);
52 static bool ef100_tx_can_tso(struct efx_tx_queue *tx_queue, struct sk_buff *skb)
54 struct efx_nic *efx = tx_queue->efx;
93 buffer = efx_tx_queue_get_insert_buffer(tx_queue);
98 ++tx_queue->insert_count;
102 static efx_oword_t *ef100_tx_desc(struct efx_tx_queue *tx_queue, unsigned int index)
104 if (likely(tx_queue->txd.addr))
105 return ((efx_oword_t *)tx_queue->txd.addr) + index;
110 static void ef100_notify_tx_desc(struct efx_tx_queue *tx_queue)
115 tx_queue->xmit_pending = false;
117 if (unlikely(tx_queue->notify_count == tx_queue->write_count))
120 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;
123 efx_writed_page(tx_queue->efx, &reg,
124 ER_GZ_TX_RING_DOORBELL, tx_queue->queue);
125 tx_queue->notify_count = tx_queue->write_count;
128 static void ef100_tx_push_buffers(struct efx_tx_queue *tx_queue)
130 ef100_notify_tx_desc(tx_queue);
131 ++tx_queue->pushes;
255 static void ef100_tx_make_descriptors(struct efx_tx_queue *tx_queue,
260 unsigned int old_write_count = tx_queue->write_count;
266 unsigned int nr_descs = tx_queue->insert_count - old_write_count;
278 write_ptr = new_write_count & tx_queue->ptr_mask;
279 txd = ef100_tx_desc(tx_queue, write_ptr);
282 tx_queue->packet_write_count = new_write_count;
295 write_ptr = new_write_count & tx_queue->ptr_mask;
296 buffer = &tx_queue->buffer[write_ptr];
297 txd = ef100_tx_desc(tx_queue, write_ptr);
301 tx_queue->packet_write_count = new_write_count;
305 ef100_make_send_desc(tx_queue->efx, skb,
311 ef100_make_tso_desc(tx_queue->efx, skb,
328 } while (new_write_count != tx_queue->insert_count);
332 tx_queue->write_count = new_write_count;
343 void ef100_tx_write(struct efx_tx_queue *tx_queue)
345 ef100_tx_make_descriptors(tx_queue, NULL, 0, NULL);
346 ef100_tx_push_buffers(tx_queue);
355 struct efx_tx_queue *tx_queue =
357 unsigned int tx_index = (tx_queue->read_count + tx_done - 1) &
358 tx_queue->ptr_mask;
360 return efx_xmit_done(tx_queue, tx_index);
370 netdev_tx_t ef100_enqueue_skb(struct efx_tx_queue *tx_queue,
373 return __ef100_enqueue_skb(tx_queue, skb, NULL);
376 int __ef100_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb,
379 unsigned int old_insert_count = tx_queue->insert_count;
380 struct efx_nic *efx = tx_queue->efx;
386 if (!tx_queue->buffer || !tx_queue->ptr_mask) {
395 if (segments && !ef100_tx_can_tso(tx_queue, skb)) {
396 rc = efx_tx_tso_fallback(tx_queue, skb);
397 tx_queue->tso_fallbacks++;
405 struct efx_tx_buffer *buffer = __efx_tx_queue_get_insert_buffer(tx_queue);
413 if (netif_tx_queue_stopped(tx_queue->core_txq) ||
425 fill_level = efx_channel_tx_old_fill_level(tx_queue->channel);
431 efx_for_each_channel_tx_queue(txq2, tx_queue->channel)
434 fill_level = efx_channel_tx_old_fill_level(tx_queue->channel);
444 tx_queue->insert_count++;
448 rc = efx_tx_map_data(tx_queue, skb, segments);
451 ef100_tx_make_descriptors(tx_queue, skb, segments, efv);
453 fill_level = efx_channel_tx_old_fill_level(tx_queue->channel);
462 netif_tx_stop_queue(tx_queue->core_txq);
468 efx_for_each_channel_tx_queue(txq2, tx_queue->channel)
470 fill_level = efx_channel_tx_old_fill_level(tx_queue->channel);
472 netif_tx_start_queue(tx_queue->core_txq);
475 tx_queue->xmit_pending = true;
485 __netdev_tx_sent_queue(tx_queue->core_txq, skb->len, xmit_more) ||
486 tx_queue->write_count - tx_queue->notify_count > 255)
487 ef100_tx_push_buffers(tx_queue);
490 tx_queue->tso_bursts++;
491 tx_queue->tso_packets += segments;
492 tx_queue->tx_packets += segments;
494 tx_queue->tx_packets++;
499 efx_enqueue_unwind(tx_queue, old_insert_count);
508 if (tx_queue->xmit_pending && !xmit_more)
509 ef100_tx_push_buffers(tx_queue);