Lines Matching refs:tx_queue

23 int ef100_tx_probe(struct efx_tx_queue *tx_queue)  in ef100_tx_probe()  argument
26 return efx_nic_alloc_buffer(tx_queue->efx, &tx_queue->txd.buf, in ef100_tx_probe()
27 (tx_queue->ptr_mask + 2) * in ef100_tx_probe()
32 void ef100_tx_init(struct efx_tx_queue *tx_queue) in ef100_tx_init() argument
35 tx_queue->core_txq = in ef100_tx_init()
36 netdev_get_tx_queue(tx_queue->efx->net_dev, in ef100_tx_init()
37 tx_queue->channel->channel - in ef100_tx_init()
38 tx_queue->efx->tx_channel_offset); in ef100_tx_init()
46 tx_queue->tso_version = 3; in ef100_tx_init()
47 if (efx_mcdi_tx_init(tx_queue)) in ef100_tx_init()
48 netdev_WARN(tx_queue->efx->net_dev, in ef100_tx_init()
49 "failed to initialise TXQ %d\n", tx_queue->queue); in ef100_tx_init()
52 static bool ef100_tx_can_tso(struct efx_tx_queue *tx_queue, struct sk_buff *skb) in ef100_tx_can_tso() argument
54 struct efx_nic *efx = tx_queue->efx; in ef100_tx_can_tso()
93 buffer = efx_tx_queue_get_insert_buffer(tx_queue); in ef100_tx_can_tso()
98 ++tx_queue->insert_count; in ef100_tx_can_tso()
102 static efx_oword_t *ef100_tx_desc(struct efx_tx_queue *tx_queue, unsigned int index) in ef100_tx_desc() argument
104 if (likely(tx_queue->txd.buf.addr)) in ef100_tx_desc()
105 return ((efx_oword_t *)tx_queue->txd.buf.addr) + index; in ef100_tx_desc()
110 static void ef100_notify_tx_desc(struct efx_tx_queue *tx_queue) in ef100_notify_tx_desc() argument
115 tx_queue->xmit_pending = false; in ef100_notify_tx_desc()
117 if (unlikely(tx_queue->notify_count == tx_queue->write_count)) in ef100_notify_tx_desc()
120 write_ptr = tx_queue->write_count & tx_queue->ptr_mask; in ef100_notify_tx_desc()
123 efx_writed_page(tx_queue->efx, &reg, in ef100_notify_tx_desc()
124 ER_GZ_TX_RING_DOORBELL, tx_queue->queue); in ef100_notify_tx_desc()
125 tx_queue->notify_count = tx_queue->write_count; in ef100_notify_tx_desc()
128 static void ef100_tx_push_buffers(struct efx_tx_queue *tx_queue) in ef100_tx_push_buffers() argument
130 ef100_notify_tx_desc(tx_queue); in ef100_tx_push_buffers()
131 ++tx_queue->pushes; in ef100_tx_push_buffers()
255 static void ef100_tx_make_descriptors(struct efx_tx_queue *tx_queue, in ef100_tx_make_descriptors() argument
259 unsigned int old_write_count = tx_queue->write_count; in ef100_tx_make_descriptors()
265 unsigned int nr_descs = tx_queue->insert_count - old_write_count; in ef100_tx_make_descriptors()
280 write_ptr = new_write_count & tx_queue->ptr_mask; in ef100_tx_make_descriptors()
281 buffer = &tx_queue->buffer[write_ptr]; in ef100_tx_make_descriptors()
282 txd = ef100_tx_desc(tx_queue, write_ptr); in ef100_tx_make_descriptors()
286 tx_queue->packet_write_count = new_write_count; in ef100_tx_make_descriptors()
290 ef100_make_send_desc(tx_queue->efx, skb, in ef100_tx_make_descriptors()
296 ef100_make_tso_desc(tx_queue->efx, skb, in ef100_tx_make_descriptors()
310 } while (new_write_count != tx_queue->insert_count); in ef100_tx_make_descriptors()
314 tx_queue->write_count = new_write_count; in ef100_tx_make_descriptors()
325 void ef100_tx_write(struct efx_tx_queue *tx_queue) in ef100_tx_write() argument
327 ef100_tx_make_descriptors(tx_queue, NULL, 0); in ef100_tx_write()
328 ef100_tx_push_buffers(tx_queue); in ef100_tx_write()
337 struct efx_tx_queue *tx_queue = in ef100_ev_tx() local
339 unsigned int tx_index = (tx_queue->read_count + tx_done - 1) & in ef100_ev_tx()
340 tx_queue->ptr_mask; in ef100_ev_tx()
342 efx_xmit_done(tx_queue, tx_index); in ef100_ev_tx()
352 int ef100_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb) in ef100_enqueue_skb() argument
354 unsigned int old_insert_count = tx_queue->insert_count; in ef100_enqueue_skb()
355 struct efx_nic *efx = tx_queue->efx; in ef100_enqueue_skb()
361 if (!tx_queue->buffer || !tx_queue->ptr_mask) { in ef100_enqueue_skb()
370 if (segments && !ef100_tx_can_tso(tx_queue, skb)) { in ef100_enqueue_skb()
371 rc = efx_tx_tso_fallback(tx_queue, skb); in ef100_enqueue_skb()
372 tx_queue->tso_fallbacks++; in ef100_enqueue_skb()
380 rc = efx_tx_map_data(tx_queue, skb, segments); in ef100_enqueue_skb()
383 ef100_tx_make_descriptors(tx_queue, skb, segments); in ef100_enqueue_skb()
385 fill_level = efx_channel_tx_old_fill_level(tx_queue->channel); in ef100_enqueue_skb()
389 netif_tx_stop_queue(tx_queue->core_txq); in ef100_enqueue_skb()
395 efx_for_each_channel_tx_queue(txq2, tx_queue->channel) in ef100_enqueue_skb()
397 fill_level = efx_channel_tx_old_fill_level(tx_queue->channel); in ef100_enqueue_skb()
399 netif_tx_start_queue(tx_queue->core_txq); in ef100_enqueue_skb()
402 tx_queue->xmit_pending = true; in ef100_enqueue_skb()
408 if (__netdev_tx_sent_queue(tx_queue->core_txq, skb->len, xmit_more) || in ef100_enqueue_skb()
409 tx_queue->write_count - tx_queue->notify_count > 255) in ef100_enqueue_skb()
410 ef100_tx_push_buffers(tx_queue); in ef100_enqueue_skb()
413 tx_queue->tso_bursts++; in ef100_enqueue_skb()
414 tx_queue->tso_packets += segments; in ef100_enqueue_skb()
415 tx_queue->tx_packets += segments; in ef100_enqueue_skb()
417 tx_queue->tx_packets++; in ef100_enqueue_skb()
422 efx_enqueue_unwind(tx_queue, old_insert_count); in ef100_enqueue_skb()
431 if (tx_queue->xmit_pending && !xmit_more) in ef100_enqueue_skb()
432 ef100_tx_push_buffers(tx_queue); in ef100_enqueue_skb()