1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2874aeea5SJeff Kirsher /**************************************************************************** 3f7a6d2c4SBen Hutchings * Driver for Solarflare network controllers and boards 4874aeea5SJeff Kirsher * Copyright 2005-2006 Fen Systems Ltd. 5f7a6d2c4SBen Hutchings * Copyright 2005-2013 Solarflare Communications Inc. 6874aeea5SJeff Kirsher */ 7874aeea5SJeff Kirsher 8874aeea5SJeff Kirsher #include <linux/pci.h> 9874aeea5SJeff Kirsher #include <linux/tcp.h> 10874aeea5SJeff Kirsher #include <linux/ip.h> 11874aeea5SJeff Kirsher #include <linux/in.h> 12874aeea5SJeff Kirsher #include <linux/ipv6.h> 13874aeea5SJeff Kirsher #include <linux/slab.h> 14874aeea5SJeff Kirsher #include <net/ipv6.h> 15874aeea5SJeff Kirsher #include <linux/if_ether.h> 16874aeea5SJeff Kirsher #include <linux/highmem.h> 17183233beSBen Hutchings #include <linux/cache.h> 18874aeea5SJeff Kirsher #include "net_driver.h" 19874aeea5SJeff Kirsher #include "efx.h" 20183233beSBen Hutchings #include "io.h" 21874aeea5SJeff Kirsher #include "nic.h" 22e9117e50SBert Kenward #include "tx.h" 23874aeea5SJeff Kirsher #include "workarounds.h" 24dfa50be9SBen Hutchings #include "ef10_regs.h" 25874aeea5SJeff Kirsher 26183233beSBen Hutchings #ifdef EFX_USE_PIO 27183233beSBen Hutchings 28183233beSBen Hutchings #define EFX_PIOBUF_SIZE_DEF ALIGN(256, L1_CACHE_BYTES) 29183233beSBen Hutchings unsigned int efx_piobuf_size __read_mostly = EFX_PIOBUF_SIZE_DEF; 30183233beSBen Hutchings 31183233beSBen Hutchings #endif /* EFX_USE_PIO */ 32183233beSBen Hutchings 33e9117e50SBert Kenward static inline u8 *efx_tx_get_copy_buffer(struct efx_tx_queue *tx_queue, 34e9117e50SBert Kenward struct efx_tx_buffer *buffer) 350fe5565bSBen Hutchings { 36e9117e50SBert Kenward unsigned int index = efx_tx_queue_get_insert_index(tx_queue); 37e9117e50SBert Kenward struct efx_buffer *page_buf = 38e9117e50SBert Kenward &tx_queue->cb_page[index >> (PAGE_SHIFT - EFX_TX_CB_ORDER)]; 39e9117e50SBert Kenward unsigned int offset = 40e9117e50SBert Kenward ((index << EFX_TX_CB_ORDER) + NET_IP_ALIGN) & (PAGE_SIZE - 1); 41e9117e50SBert Kenward 42e9117e50SBert Kenward if (unlikely(!page_buf->addr) && 43e9117e50SBert Kenward efx_nic_alloc_buffer(tx_queue->efx, page_buf, PAGE_SIZE, 44e9117e50SBert Kenward GFP_ATOMIC)) 45e9117e50SBert Kenward return NULL; 46e9117e50SBert Kenward buffer->dma_addr = page_buf->dma_addr + offset; 47e9117e50SBert Kenward buffer->unmap_len = 0; 48e9117e50SBert Kenward return (u8 *)page_buf->addr + offset; 490fe5565bSBen Hutchings } 500fe5565bSBen Hutchings 51e9117e50SBert Kenward u8 *efx_tx_get_copy_buffer_limited(struct efx_tx_queue *tx_queue, 52e9117e50SBert Kenward struct efx_tx_buffer *buffer, size_t len) 530fe5565bSBen Hutchings { 54e9117e50SBert Kenward if (len > EFX_TX_CB_SIZE) 55e9117e50SBert Kenward return NULL; 56e9117e50SBert Kenward return efx_tx_get_copy_buffer(tx_queue, buffer); 570fe5565bSBen Hutchings } 580fe5565bSBen Hutchings 59874aeea5SJeff Kirsher static void efx_dequeue_buffer(struct efx_tx_queue *tx_queue, 60c3940999STom Herbert struct efx_tx_buffer *buffer, 61c3940999STom Herbert unsigned int *pkts_compl, 62c3940999STom Herbert unsigned int *bytes_compl) 63874aeea5SJeff Kirsher { 64874aeea5SJeff Kirsher if (buffer->unmap_len) { 650e33d870SBen Hutchings struct device *dma_dev = &tx_queue->efx->pci_dev->dev; 662acdb92eSAlexandre Rames dma_addr_t unmap_addr = buffer->dma_addr - buffer->dma_offset; 677668ff9cSBen Hutchings if (buffer->flags & EFX_TX_BUF_MAP_SINGLE) 680e33d870SBen Hutchings dma_unmap_single(dma_dev, unmap_addr, buffer->unmap_len, 690e33d870SBen Hutchings DMA_TO_DEVICE); 70874aeea5SJeff Kirsher else 710e33d870SBen Hutchings dma_unmap_page(dma_dev, unmap_addr, buffer->unmap_len, 720e33d870SBen Hutchings DMA_TO_DEVICE); 73874aeea5SJeff Kirsher buffer->unmap_len = 0; 74874aeea5SJeff Kirsher } 75874aeea5SJeff Kirsher 767668ff9cSBen Hutchings if (buffer->flags & EFX_TX_BUF_SKB) { 77b9b603d4SMartin Habets struct sk_buff *skb = (struct sk_buff *)buffer->skb; 78b9b603d4SMartin Habets 79d4a7a889SBert Kenward EFX_WARN_ON_PARANOID(!pkts_compl || !bytes_compl); 80c3940999STom Herbert (*pkts_compl)++; 81b9b603d4SMartin Habets (*bytes_compl) += skb->len; 82b9b603d4SMartin Habets if (tx_queue->timestamping && 83b9b603d4SMartin Habets (tx_queue->completed_timestamp_major || 84b9b603d4SMartin Habets tx_queue->completed_timestamp_minor)) { 85b9b603d4SMartin Habets struct skb_shared_hwtstamps hwtstamp; 86b9b603d4SMartin Habets 87b9b603d4SMartin Habets hwtstamp.hwtstamp = 88b9b603d4SMartin Habets efx_ptp_nic_to_kernel_time(tx_queue); 89b9b603d4SMartin Habets skb_tstamp_tx(skb, &hwtstamp); 90b9b603d4SMartin Habets 91b9b603d4SMartin Habets tx_queue->completed_timestamp_major = 0; 92b9b603d4SMartin Habets tx_queue->completed_timestamp_minor = 0; 93b9b603d4SMartin Habets } 944ef6dae4SRick Jones dev_consume_skb_any((struct sk_buff *)buffer->skb); 95874aeea5SJeff Kirsher netif_vdbg(tx_queue->efx, tx_done, tx_queue->efx->net_dev, 96874aeea5SJeff Kirsher "TX queue %d transmission id %x complete\n", 97874aeea5SJeff Kirsher tx_queue->queue, tx_queue->read_count); 988c423501SCharles McLachlan } else if (buffer->flags & EFX_TX_BUF_XDP) { 998c423501SCharles McLachlan xdp_return_frame_rx_napi(buffer->xdpf); 100874aeea5SJeff Kirsher } 1017668ff9cSBen Hutchings 102f7251a9cSBen Hutchings buffer->len = 0; 103f7251a9cSBen Hutchings buffer->flags = 0; 104874aeea5SJeff Kirsher } 105874aeea5SJeff Kirsher 1067e6d06f0SBen Hutchings unsigned int efx_tx_max_skb_descs(struct efx_nic *efx) 1077e6d06f0SBen Hutchings { 1087e6d06f0SBen Hutchings /* Header and payload descriptor for each output segment, plus 1097e6d06f0SBen Hutchings * one for every input fragment boundary within a segment 1107e6d06f0SBen Hutchings */ 1117e6d06f0SBen Hutchings unsigned int max_descs = EFX_TSO_MAX_SEGS * 2 + MAX_SKB_FRAGS; 1127e6d06f0SBen Hutchings 1135a6681e2SEdward Cree /* Possibly one more per segment for option descriptors */ 1145a6681e2SEdward Cree if (efx_nic_rev(efx) >= EFX_REV_HUNT_A0) 1157e6d06f0SBen Hutchings max_descs += EFX_TSO_MAX_SEGS; 1167e6d06f0SBen Hutchings 1177e6d06f0SBen Hutchings /* Possibly more for PCIe page boundaries within input fragments */ 1187e6d06f0SBen Hutchings if (PAGE_SIZE > EFX_PAGE_SIZE) 1197e6d06f0SBen Hutchings max_descs += max_t(unsigned int, MAX_SKB_FRAGS, 1207e6d06f0SBen Hutchings DIV_ROUND_UP(GSO_MAX_SIZE, EFX_PAGE_SIZE)); 1217e6d06f0SBen Hutchings 1227e6d06f0SBen Hutchings return max_descs; 1237e6d06f0SBen Hutchings } 1247e6d06f0SBen Hutchings 12514bf718fSBen Hutchings static void efx_tx_maybe_stop_queue(struct efx_tx_queue *txq1) 12614bf718fSBen Hutchings { 12714bf718fSBen Hutchings /* We need to consider both queues that the net core sees as one */ 12814bf718fSBen Hutchings struct efx_tx_queue *txq2 = efx_tx_queue_partner(txq1); 12914bf718fSBen Hutchings struct efx_nic *efx = txq1->efx; 13014bf718fSBen Hutchings unsigned int fill_level; 13114bf718fSBen Hutchings 13214bf718fSBen Hutchings fill_level = max(txq1->insert_count - txq1->old_read_count, 13314bf718fSBen Hutchings txq2->insert_count - txq2->old_read_count); 13414bf718fSBen Hutchings if (likely(fill_level < efx->txq_stop_thresh)) 13514bf718fSBen Hutchings return; 13614bf718fSBen Hutchings 13714bf718fSBen Hutchings /* We used the stale old_read_count above, which gives us a 13814bf718fSBen Hutchings * pessimistic estimate of the fill level (which may even 13914bf718fSBen Hutchings * validly be >= efx->txq_entries). Now try again using 14014bf718fSBen Hutchings * read_count (more likely to be a cache miss). 14114bf718fSBen Hutchings * 14214bf718fSBen Hutchings * If we read read_count and then conditionally stop the 14314bf718fSBen Hutchings * queue, it is possible for the completion path to race with 14414bf718fSBen Hutchings * us and complete all outstanding descriptors in the middle, 14514bf718fSBen Hutchings * after which there will be no more completions to wake it. 14614bf718fSBen Hutchings * Therefore we stop the queue first, then read read_count 14714bf718fSBen Hutchings * (with a memory barrier to ensure the ordering), then 14814bf718fSBen Hutchings * restart the queue if the fill level turns out to be low 14914bf718fSBen Hutchings * enough. 15014bf718fSBen Hutchings */ 15114bf718fSBen Hutchings netif_tx_stop_queue(txq1->core_txq); 15214bf718fSBen Hutchings smp_mb(); 1536aa7de05SMark Rutland txq1->old_read_count = READ_ONCE(txq1->read_count); 1546aa7de05SMark Rutland txq2->old_read_count = READ_ONCE(txq2->read_count); 15514bf718fSBen Hutchings 15614bf718fSBen Hutchings fill_level = max(txq1->insert_count - txq1->old_read_count, 15714bf718fSBen Hutchings txq2->insert_count - txq2->old_read_count); 158e01b16a7SEdward Cree EFX_WARN_ON_ONCE_PARANOID(fill_level >= efx->txq_entries); 15914bf718fSBen Hutchings if (likely(fill_level < efx->txq_stop_thresh)) { 16014bf718fSBen Hutchings smp_mb(); 16114bf718fSBen Hutchings if (likely(!efx->loopback_selftest)) 16214bf718fSBen Hutchings netif_tx_start_queue(txq1->core_txq); 16314bf718fSBen Hutchings } 16414bf718fSBen Hutchings } 16514bf718fSBen Hutchings 166e9117e50SBert Kenward static int efx_enqueue_skb_copy(struct efx_tx_queue *tx_queue, 167e9117e50SBert Kenward struct sk_buff *skb) 168e9117e50SBert Kenward { 169e9117e50SBert Kenward unsigned int copy_len = skb->len; 170e9117e50SBert Kenward struct efx_tx_buffer *buffer; 171e9117e50SBert Kenward u8 *copy_buffer; 172e9117e50SBert Kenward int rc; 173e9117e50SBert Kenward 174e01b16a7SEdward Cree EFX_WARN_ON_ONCE_PARANOID(copy_len > EFX_TX_CB_SIZE); 175e9117e50SBert Kenward 176e9117e50SBert Kenward buffer = efx_tx_queue_get_insert_buffer(tx_queue); 177e9117e50SBert Kenward 178e9117e50SBert Kenward copy_buffer = efx_tx_get_copy_buffer(tx_queue, buffer); 179e9117e50SBert Kenward if (unlikely(!copy_buffer)) 180e9117e50SBert Kenward return -ENOMEM; 181e9117e50SBert Kenward 182e9117e50SBert Kenward rc = skb_copy_bits(skb, 0, copy_buffer, copy_len); 183e9117e50SBert Kenward EFX_WARN_ON_PARANOID(rc); 184e9117e50SBert Kenward buffer->len = copy_len; 185e9117e50SBert Kenward 186e9117e50SBert Kenward buffer->skb = skb; 187e9117e50SBert Kenward buffer->flags = EFX_TX_BUF_SKB; 188e9117e50SBert Kenward 189e9117e50SBert Kenward ++tx_queue->insert_count; 190e9117e50SBert Kenward return rc; 191e9117e50SBert Kenward } 192e9117e50SBert Kenward 193ee45fd92SJon Cooper #ifdef EFX_USE_PIO 194ee45fd92SJon Cooper 195ee45fd92SJon Cooper struct efx_short_copy_buffer { 196ee45fd92SJon Cooper int used; 197ee45fd92SJon Cooper u8 buf[L1_CACHE_BYTES]; 198ee45fd92SJon Cooper }; 199ee45fd92SJon Cooper 200ee45fd92SJon Cooper /* Copy to PIO, respecting that writes to PIO buffers must be dword aligned. 201ee45fd92SJon Cooper * Advances piobuf pointer. Leaves additional data in the copy buffer. 202ee45fd92SJon Cooper */ 203ee45fd92SJon Cooper static void efx_memcpy_toio_aligned(struct efx_nic *efx, u8 __iomem **piobuf, 204ee45fd92SJon Cooper u8 *data, int len, 205ee45fd92SJon Cooper struct efx_short_copy_buffer *copy_buf) 206ee45fd92SJon Cooper { 207ee45fd92SJon Cooper int block_len = len & ~(sizeof(copy_buf->buf) - 1); 208ee45fd92SJon Cooper 2094984c237SBen Hutchings __iowrite64_copy(*piobuf, data, block_len >> 3); 210ee45fd92SJon Cooper *piobuf += block_len; 211ee45fd92SJon Cooper len -= block_len; 212ee45fd92SJon Cooper 213ee45fd92SJon Cooper if (len) { 214ee45fd92SJon Cooper data += block_len; 215ee45fd92SJon Cooper BUG_ON(copy_buf->used); 216ee45fd92SJon Cooper BUG_ON(len > sizeof(copy_buf->buf)); 217ee45fd92SJon Cooper memcpy(copy_buf->buf, data, len); 218ee45fd92SJon Cooper copy_buf->used = len; 219ee45fd92SJon Cooper } 220ee45fd92SJon Cooper } 221ee45fd92SJon Cooper 222ee45fd92SJon Cooper /* Copy to PIO, respecting dword alignment, popping data from copy buffer first. 223ee45fd92SJon Cooper * Advances piobuf pointer. Leaves additional data in the copy buffer. 224ee45fd92SJon Cooper */ 225ee45fd92SJon Cooper static void efx_memcpy_toio_aligned_cb(struct efx_nic *efx, u8 __iomem **piobuf, 226ee45fd92SJon Cooper u8 *data, int len, 227ee45fd92SJon Cooper struct efx_short_copy_buffer *copy_buf) 228ee45fd92SJon Cooper { 229ee45fd92SJon Cooper if (copy_buf->used) { 230ee45fd92SJon Cooper /* if the copy buffer is partially full, fill it up and write */ 231ee45fd92SJon Cooper int copy_to_buf = 232ee45fd92SJon Cooper min_t(int, sizeof(copy_buf->buf) - copy_buf->used, len); 233ee45fd92SJon Cooper 234ee45fd92SJon Cooper memcpy(copy_buf->buf + copy_buf->used, data, copy_to_buf); 235ee45fd92SJon Cooper copy_buf->used += copy_to_buf; 236ee45fd92SJon Cooper 237ee45fd92SJon Cooper /* if we didn't fill it up then we're done for now */ 238ee45fd92SJon Cooper if (copy_buf->used < sizeof(copy_buf->buf)) 239ee45fd92SJon Cooper return; 240ee45fd92SJon Cooper 2414984c237SBen Hutchings __iowrite64_copy(*piobuf, copy_buf->buf, 2424984c237SBen Hutchings sizeof(copy_buf->buf) >> 3); 243ee45fd92SJon Cooper *piobuf += sizeof(copy_buf->buf); 244ee45fd92SJon Cooper data += copy_to_buf; 245ee45fd92SJon Cooper len -= copy_to_buf; 246ee45fd92SJon Cooper copy_buf->used = 0; 247ee45fd92SJon Cooper } 248ee45fd92SJon Cooper 249ee45fd92SJon Cooper efx_memcpy_toio_aligned(efx, piobuf, data, len, copy_buf); 250ee45fd92SJon Cooper } 251ee45fd92SJon Cooper 252ee45fd92SJon Cooper static void efx_flush_copy_buffer(struct efx_nic *efx, u8 __iomem *piobuf, 253ee45fd92SJon Cooper struct efx_short_copy_buffer *copy_buf) 254ee45fd92SJon Cooper { 255ee45fd92SJon Cooper /* if there's anything in it, write the whole buffer, including junk */ 256ee45fd92SJon Cooper if (copy_buf->used) 2574984c237SBen Hutchings __iowrite64_copy(piobuf, copy_buf->buf, 2584984c237SBen Hutchings sizeof(copy_buf->buf) >> 3); 259ee45fd92SJon Cooper } 260ee45fd92SJon Cooper 261ee45fd92SJon Cooper /* Traverse skb structure and copy fragments in to PIO buffer. 262ee45fd92SJon Cooper * Advances piobuf pointer. 263ee45fd92SJon Cooper */ 264ee45fd92SJon Cooper static void efx_skb_copy_bits_to_pio(struct efx_nic *efx, struct sk_buff *skb, 265ee45fd92SJon Cooper u8 __iomem **piobuf, 266ee45fd92SJon Cooper struct efx_short_copy_buffer *copy_buf) 267ee45fd92SJon Cooper { 268ee45fd92SJon Cooper int i; 269ee45fd92SJon Cooper 270ee45fd92SJon Cooper efx_memcpy_toio_aligned(efx, piobuf, skb->data, skb_headlen(skb), 271ee45fd92SJon Cooper copy_buf); 272ee45fd92SJon Cooper 273ee45fd92SJon Cooper for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) { 274ee45fd92SJon Cooper skb_frag_t *f = &skb_shinfo(skb)->frags[i]; 275ee45fd92SJon Cooper u8 *vaddr; 276ee45fd92SJon Cooper 277ee45fd92SJon Cooper vaddr = kmap_atomic(skb_frag_page(f)); 278ee45fd92SJon Cooper 279b54c9d5bSJonathan Lemon efx_memcpy_toio_aligned_cb(efx, piobuf, vaddr + skb_frag_off(f), 280ee45fd92SJon Cooper skb_frag_size(f), copy_buf); 281ee45fd92SJon Cooper kunmap_atomic(vaddr); 282ee45fd92SJon Cooper } 283ee45fd92SJon Cooper 284e01b16a7SEdward Cree EFX_WARN_ON_ONCE_PARANOID(skb_shinfo(skb)->frag_list); 285ee45fd92SJon Cooper } 286ee45fd92SJon Cooper 287e9117e50SBert Kenward static int efx_enqueue_skb_pio(struct efx_tx_queue *tx_queue, 288e9117e50SBert Kenward struct sk_buff *skb) 289ee45fd92SJon Cooper { 290ee45fd92SJon Cooper struct efx_tx_buffer *buffer = 291ee45fd92SJon Cooper efx_tx_queue_get_insert_buffer(tx_queue); 292ee45fd92SJon Cooper u8 __iomem *piobuf = tx_queue->piobuf; 293ee45fd92SJon Cooper 294ee45fd92SJon Cooper /* Copy to PIO buffer. Ensure the writes are padded to the end 295ee45fd92SJon Cooper * of a cache line, as this is required for write-combining to be 296ee45fd92SJon Cooper * effective on at least x86. 297ee45fd92SJon Cooper */ 298ee45fd92SJon Cooper 299ee45fd92SJon Cooper if (skb_shinfo(skb)->nr_frags) { 300ee45fd92SJon Cooper /* The size of the copy buffer will ensure all writes 301ee45fd92SJon Cooper * are the size of a cache line. 302ee45fd92SJon Cooper */ 303ee45fd92SJon Cooper struct efx_short_copy_buffer copy_buf; 304ee45fd92SJon Cooper 305ee45fd92SJon Cooper copy_buf.used = 0; 306ee45fd92SJon Cooper 307ee45fd92SJon Cooper efx_skb_copy_bits_to_pio(tx_queue->efx, skb, 308ee45fd92SJon Cooper &piobuf, ©_buf); 309ee45fd92SJon Cooper efx_flush_copy_buffer(tx_queue->efx, piobuf, ©_buf); 310ee45fd92SJon Cooper } else { 311ee45fd92SJon Cooper /* Pad the write to the size of a cache line. 312e9117e50SBert Kenward * We can do this because we know the skb_shared_info struct is 313ee45fd92SJon Cooper * after the source, and the destination buffer is big enough. 314ee45fd92SJon Cooper */ 315ee45fd92SJon Cooper BUILD_BUG_ON(L1_CACHE_BYTES > 316ee45fd92SJon Cooper SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); 3174984c237SBen Hutchings __iowrite64_copy(tx_queue->piobuf, skb->data, 3184984c237SBen Hutchings ALIGN(skb->len, L1_CACHE_BYTES) >> 3); 319ee45fd92SJon Cooper } 320ee45fd92SJon Cooper 321e9117e50SBert Kenward buffer->skb = skb; 322e9117e50SBert Kenward buffer->flags = EFX_TX_BUF_SKB | EFX_TX_BUF_OPTION; 323e9117e50SBert Kenward 324ee45fd92SJon Cooper EFX_POPULATE_QWORD_5(buffer->option, 325ee45fd92SJon Cooper ESF_DZ_TX_DESC_IS_OPT, 1, 326ee45fd92SJon Cooper ESF_DZ_TX_OPTION_TYPE, ESE_DZ_TX_OPTION_DESC_PIO, 327ee45fd92SJon Cooper ESF_DZ_TX_PIO_CONT, 0, 328ee45fd92SJon Cooper ESF_DZ_TX_PIO_BYTE_CNT, skb->len, 329ee45fd92SJon Cooper ESF_DZ_TX_PIO_BUF_ADDR, 330ee45fd92SJon Cooper tx_queue->piobuf_offset); 331ee45fd92SJon Cooper ++tx_queue->insert_count; 332e9117e50SBert Kenward return 0; 333ee45fd92SJon Cooper } 334ee45fd92SJon Cooper #endif /* EFX_USE_PIO */ 335ee45fd92SJon Cooper 336e9117e50SBert Kenward static struct efx_tx_buffer *efx_tx_map_chunk(struct efx_tx_queue *tx_queue, 337e9117e50SBert Kenward dma_addr_t dma_addr, 338e9117e50SBert Kenward size_t len) 339e9117e50SBert Kenward { 340e9117e50SBert Kenward const struct efx_nic_type *nic_type = tx_queue->efx->type; 341e9117e50SBert Kenward struct efx_tx_buffer *buffer; 342e9117e50SBert Kenward unsigned int dma_len; 343e9117e50SBert Kenward 344e9117e50SBert Kenward /* Map the fragment taking account of NIC-dependent DMA limits. */ 345e9117e50SBert Kenward do { 346e9117e50SBert Kenward buffer = efx_tx_queue_get_insert_buffer(tx_queue); 347e9117e50SBert Kenward dma_len = nic_type->tx_limit_len(tx_queue, dma_addr, len); 348e9117e50SBert Kenward 349e9117e50SBert Kenward buffer->len = dma_len; 350e9117e50SBert Kenward buffer->dma_addr = dma_addr; 351e9117e50SBert Kenward buffer->flags = EFX_TX_BUF_CONT; 352e9117e50SBert Kenward len -= dma_len; 353e9117e50SBert Kenward dma_addr += dma_len; 354e9117e50SBert Kenward ++tx_queue->insert_count; 355e9117e50SBert Kenward } while (len); 356e9117e50SBert Kenward 357e9117e50SBert Kenward return buffer; 358e9117e50SBert Kenward } 359e9117e50SBert Kenward 360e9117e50SBert Kenward /* Map all data from an SKB for DMA and create descriptors on the queue. 361e9117e50SBert Kenward */ 362e9117e50SBert Kenward static int efx_tx_map_data(struct efx_tx_queue *tx_queue, struct sk_buff *skb, 363e9117e50SBert Kenward unsigned int segment_count) 364e9117e50SBert Kenward { 365e9117e50SBert Kenward struct efx_nic *efx = tx_queue->efx; 366e9117e50SBert Kenward struct device *dma_dev = &efx->pci_dev->dev; 367e9117e50SBert Kenward unsigned int frag_index, nr_frags; 368e9117e50SBert Kenward dma_addr_t dma_addr, unmap_addr; 369e9117e50SBert Kenward unsigned short dma_flags; 370e9117e50SBert Kenward size_t len, unmap_len; 371e9117e50SBert Kenward 372e9117e50SBert Kenward nr_frags = skb_shinfo(skb)->nr_frags; 373e9117e50SBert Kenward frag_index = 0; 374e9117e50SBert Kenward 375e9117e50SBert Kenward /* Map header data. */ 376e9117e50SBert Kenward len = skb_headlen(skb); 377e9117e50SBert Kenward dma_addr = dma_map_single(dma_dev, skb->data, len, DMA_TO_DEVICE); 378e9117e50SBert Kenward dma_flags = EFX_TX_BUF_MAP_SINGLE; 379e9117e50SBert Kenward unmap_len = len; 380e9117e50SBert Kenward unmap_addr = dma_addr; 381e9117e50SBert Kenward 382e9117e50SBert Kenward if (unlikely(dma_mapping_error(dma_dev, dma_addr))) 383e9117e50SBert Kenward return -EIO; 384e9117e50SBert Kenward 385e9117e50SBert Kenward if (segment_count) { 386e9117e50SBert Kenward /* For TSO we need to put the header in to a separate 387e9117e50SBert Kenward * descriptor. Map this separately if necessary. 388e9117e50SBert Kenward */ 389e9117e50SBert Kenward size_t header_len = skb_transport_header(skb) - skb->data + 390e9117e50SBert Kenward (tcp_hdr(skb)->doff << 2u); 391e9117e50SBert Kenward 392e9117e50SBert Kenward if (header_len != len) { 393e9117e50SBert Kenward tx_queue->tso_long_headers++; 394e9117e50SBert Kenward efx_tx_map_chunk(tx_queue, dma_addr, header_len); 395e9117e50SBert Kenward len -= header_len; 396e9117e50SBert Kenward dma_addr += header_len; 397e9117e50SBert Kenward } 398e9117e50SBert Kenward } 399e9117e50SBert Kenward 400e9117e50SBert Kenward /* Add descriptors for each fragment. */ 401e9117e50SBert Kenward do { 402e9117e50SBert Kenward struct efx_tx_buffer *buffer; 403e9117e50SBert Kenward skb_frag_t *fragment; 404e9117e50SBert Kenward 405e9117e50SBert Kenward buffer = efx_tx_map_chunk(tx_queue, dma_addr, len); 406e9117e50SBert Kenward 407e9117e50SBert Kenward /* The final descriptor for a fragment is responsible for 408e9117e50SBert Kenward * unmapping the whole fragment. 409e9117e50SBert Kenward */ 410e9117e50SBert Kenward buffer->flags = EFX_TX_BUF_CONT | dma_flags; 411e9117e50SBert Kenward buffer->unmap_len = unmap_len; 412e9117e50SBert Kenward buffer->dma_offset = buffer->dma_addr - unmap_addr; 413e9117e50SBert Kenward 414e9117e50SBert Kenward if (frag_index >= nr_frags) { 415e9117e50SBert Kenward /* Store SKB details with the final buffer for 416e9117e50SBert Kenward * the completion. 417e9117e50SBert Kenward */ 418e9117e50SBert Kenward buffer->skb = skb; 419e9117e50SBert Kenward buffer->flags = EFX_TX_BUF_SKB | dma_flags; 420e9117e50SBert Kenward return 0; 421e9117e50SBert Kenward } 422e9117e50SBert Kenward 423e9117e50SBert Kenward /* Move on to the next fragment. */ 424e9117e50SBert Kenward fragment = &skb_shinfo(skb)->frags[frag_index++]; 425e9117e50SBert Kenward len = skb_frag_size(fragment); 426e9117e50SBert Kenward dma_addr = skb_frag_dma_map(dma_dev, fragment, 427e9117e50SBert Kenward 0, len, DMA_TO_DEVICE); 428e9117e50SBert Kenward dma_flags = 0; 429e9117e50SBert Kenward unmap_len = len; 430e9117e50SBert Kenward unmap_addr = dma_addr; 431e9117e50SBert Kenward 432e9117e50SBert Kenward if (unlikely(dma_mapping_error(dma_dev, dma_addr))) 433e9117e50SBert Kenward return -EIO; 434e9117e50SBert Kenward } while (1); 435e9117e50SBert Kenward } 436e9117e50SBert Kenward 4370c235113SMartin Habets /* Remove buffers put into a tx_queue for the current packet. 4380c235113SMartin Habets * None of the buffers must have an skb attached. 439e9117e50SBert Kenward */ 4400c235113SMartin Habets static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue, 4410c235113SMartin Habets unsigned int insert_count) 442e9117e50SBert Kenward { 443e9117e50SBert Kenward struct efx_tx_buffer *buffer; 444d4a7a889SBert Kenward unsigned int bytes_compl = 0; 445d4a7a889SBert Kenward unsigned int pkts_compl = 0; 446e9117e50SBert Kenward 447e9117e50SBert Kenward /* Work backwards until we hit the original insert pointer value */ 4480c235113SMartin Habets while (tx_queue->insert_count != insert_count) { 449e9117e50SBert Kenward --tx_queue->insert_count; 450e9117e50SBert Kenward buffer = __efx_tx_queue_get_insert_buffer(tx_queue); 451d4a7a889SBert Kenward efx_dequeue_buffer(tx_queue, buffer, &pkts_compl, &bytes_compl); 452e9117e50SBert Kenward } 453e9117e50SBert Kenward } 454e9117e50SBert Kenward 45546d1efd8SEdward Cree /* 45646d1efd8SEdward Cree * Fallback to software TSO. 45746d1efd8SEdward Cree * 45846d1efd8SEdward Cree * This is used if we are unable to send a GSO packet through hardware TSO. 45946d1efd8SEdward Cree * This should only ever happen due to per-queue restrictions - unsupported 46046d1efd8SEdward Cree * packets should first be filtered by the feature flags. 46146d1efd8SEdward Cree * 46246d1efd8SEdward Cree * Returns 0 on success, error code otherwise. 46346d1efd8SEdward Cree */ 46446d1efd8SEdward Cree static int efx_tx_tso_fallback(struct efx_tx_queue *tx_queue, 46546d1efd8SEdward Cree struct sk_buff *skb) 466e9117e50SBert Kenward { 46746d1efd8SEdward Cree struct sk_buff *segments, *next; 46846d1efd8SEdward Cree 46946d1efd8SEdward Cree segments = skb_gso_segment(skb, 0); 47046d1efd8SEdward Cree if (IS_ERR(segments)) 47146d1efd8SEdward Cree return PTR_ERR(segments); 47246d1efd8SEdward Cree 473f694be27SHuang Zijiang dev_consume_skb_any(skb); 47446d1efd8SEdward Cree skb = segments; 47546d1efd8SEdward Cree 47646d1efd8SEdward Cree while (skb) { 47746d1efd8SEdward Cree next = skb->next; 47846d1efd8SEdward Cree skb->next = NULL; 47946d1efd8SEdward Cree 48046d1efd8SEdward Cree efx_enqueue_skb(tx_queue, skb); 48146d1efd8SEdward Cree skb = next; 48246d1efd8SEdward Cree } 48346d1efd8SEdward Cree 48446d1efd8SEdward Cree return 0; 485e9117e50SBert Kenward } 486e9117e50SBert Kenward 487874aeea5SJeff Kirsher /* 488874aeea5SJeff Kirsher * Add a socket buffer to a TX queue 489874aeea5SJeff Kirsher * 490874aeea5SJeff Kirsher * This maps all fragments of a socket buffer for DMA and adds them to 491874aeea5SJeff Kirsher * the TX queue. The queue's insert pointer will be incremented by 492874aeea5SJeff Kirsher * the number of fragments in the socket buffer. 493874aeea5SJeff Kirsher * 494874aeea5SJeff Kirsher * If any DMA mapping fails, any mapped fragments will be unmapped, 495874aeea5SJeff Kirsher * the queue's insert pointer will be restored to its original value. 496874aeea5SJeff Kirsher * 497874aeea5SJeff Kirsher * This function is split out from efx_hard_start_xmit to allow the 498874aeea5SJeff Kirsher * loopback test to direct packets via specific TX queues. 499874aeea5SJeff Kirsher * 50014bf718fSBen Hutchings * Returns NETDEV_TX_OK. 501874aeea5SJeff Kirsher * You must hold netif_tx_lock() to call this function. 502874aeea5SJeff Kirsher */ 503874aeea5SJeff Kirsher netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb) 504874aeea5SJeff Kirsher { 5050c235113SMartin Habets unsigned int old_insert_count = tx_queue->insert_count; 506f79c957aSFlorian Westphal bool xmit_more = netdev_xmit_more(); 507e9117e50SBert Kenward bool data_mapped = false; 508e9117e50SBert Kenward unsigned int segments; 509e9117e50SBert Kenward unsigned int skb_len; 51046d1efd8SEdward Cree int rc; 511874aeea5SJeff Kirsher 512e9117e50SBert Kenward skb_len = skb->len; 513e9117e50SBert Kenward segments = skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 0; 514e9117e50SBert Kenward if (segments == 1) 515e9117e50SBert Kenward segments = 0; /* Don't use TSO for a single segment. */ 516874aeea5SJeff Kirsher 517e9117e50SBert Kenward /* Handle TSO first - it's *possible* (although unlikely) that we might 518e9117e50SBert Kenward * be passed a packet to segment that's smaller than the copybreak/PIO 519e9117e50SBert Kenward * size limit. 520874aeea5SJeff Kirsher */ 521e9117e50SBert Kenward if (segments) { 522e01b16a7SEdward Cree EFX_WARN_ON_ONCE_PARANOID(!tx_queue->handle_tso); 52346d1efd8SEdward Cree rc = tx_queue->handle_tso(tx_queue, skb, &data_mapped); 52446d1efd8SEdward Cree if (rc == -EINVAL) { 52546d1efd8SEdward Cree rc = efx_tx_tso_fallback(tx_queue, skb); 52646d1efd8SEdward Cree tx_queue->tso_fallbacks++; 52746d1efd8SEdward Cree if (rc == 0) 52846d1efd8SEdward Cree return 0; 52946d1efd8SEdward Cree } 53046d1efd8SEdward Cree if (rc) 531e9117e50SBert Kenward goto err; 532e9117e50SBert Kenward #ifdef EFX_USE_PIO 533f79c957aSFlorian Westphal } else if (skb_len <= efx_piobuf_size && !xmit_more && 534e9117e50SBert Kenward efx_nic_may_tx_pio(tx_queue)) { 535e9117e50SBert Kenward /* Use PIO for short packets with an empty queue. */ 536e9117e50SBert Kenward if (efx_enqueue_skb_pio(tx_queue, skb)) 537e9117e50SBert Kenward goto err; 538e9117e50SBert Kenward tx_queue->pio_packets++; 539e9117e50SBert Kenward data_mapped = true; 540e9117e50SBert Kenward #endif 5415a6681e2SEdward Cree } else if (skb->data_len && skb_len <= EFX_TX_CB_SIZE) { 542e9117e50SBert Kenward /* Pad short packets or coalesce short fragmented packets. */ 543e9117e50SBert Kenward if (efx_enqueue_skb_copy(tx_queue, skb)) 544e9117e50SBert Kenward goto err; 545e9117e50SBert Kenward tx_queue->cb_packets++; 546e9117e50SBert Kenward data_mapped = true; 547874aeea5SJeff Kirsher } 548874aeea5SJeff Kirsher 549e9117e50SBert Kenward /* Map for DMA and create descriptors if we haven't done so already. */ 550e9117e50SBert Kenward if (!data_mapped && (efx_tx_map_data(tx_queue, skb, segments))) 551e9117e50SBert Kenward goto err; 552874aeea5SJeff Kirsher 5530c235113SMartin Habets efx_tx_maybe_stop_queue(tx_queue); 5540c235113SMartin Habets 555874aeea5SJeff Kirsher /* Pass off to hardware */ 55629e12207SEdward Cree if (__netdev_tx_sent_queue(tx_queue->core_txq, skb_len, xmit_more)) { 557b2663a4fSMartin Habets struct efx_tx_queue *txq2 = efx_tx_queue_partner(tx_queue); 558b2663a4fSMartin Habets 559f79c957aSFlorian Westphal /* There could be packets left on the partner queue if 560f79c957aSFlorian Westphal * xmit_more was set. If we do not push those they 561b2663a4fSMartin Habets * could be left for a long time and cause a netdev watchdog. 562b2663a4fSMartin Habets */ 563b2663a4fSMartin Habets if (txq2->xmit_more_available) 564b2663a4fSMartin Habets efx_nic_push_buffers(txq2); 565b2663a4fSMartin Habets 566874aeea5SJeff Kirsher efx_nic_push_buffers(tx_queue); 567b2663a4fSMartin Habets } else { 568f79c957aSFlorian Westphal tx_queue->xmit_more_available = xmit_more; 569b2663a4fSMartin Habets } 570874aeea5SJeff Kirsher 571e9117e50SBert Kenward if (segments) { 572e9117e50SBert Kenward tx_queue->tso_bursts++; 573e9117e50SBert Kenward tx_queue->tso_packets += segments; 574e9117e50SBert Kenward tx_queue->tx_packets += segments; 575e9117e50SBert Kenward } else { 5768ccf3800SAndrew Rybchenko tx_queue->tx_packets++; 577e9117e50SBert Kenward } 578e9117e50SBert Kenward 579874aeea5SJeff Kirsher return NETDEV_TX_OK; 580874aeea5SJeff Kirsher 581874aeea5SJeff Kirsher 582e9117e50SBert Kenward err: 5830c235113SMartin Habets efx_enqueue_unwind(tx_queue, old_insert_count); 584874aeea5SJeff Kirsher dev_kfree_skb_any(skb); 5850c235113SMartin Habets 5860c235113SMartin Habets /* If we're not expecting another transmit and we had something to push 5870c235113SMartin Habets * on this queue or a partner queue then we need to push here to get the 5880c235113SMartin Habets * previous packets out. 5890c235113SMartin Habets */ 5900c235113SMartin Habets if (!xmit_more) { 5910c235113SMartin Habets struct efx_tx_queue *txq2 = efx_tx_queue_partner(tx_queue); 5920c235113SMartin Habets 5930c235113SMartin Habets if (txq2->xmit_more_available) 5940c235113SMartin Habets efx_nic_push_buffers(txq2); 5950c235113SMartin Habets 5960c235113SMartin Habets efx_nic_push_buffers(tx_queue); 5970c235113SMartin Habets } 5980c235113SMartin Habets 59914bf718fSBen Hutchings return NETDEV_TX_OK; 600874aeea5SJeff Kirsher } 601874aeea5SJeff Kirsher 602874aeea5SJeff Kirsher /* Remove packets from the TX queue 603874aeea5SJeff Kirsher * 604874aeea5SJeff Kirsher * This removes packets from the TX queue, up to and including the 605874aeea5SJeff Kirsher * specified index. 606874aeea5SJeff Kirsher */ 607874aeea5SJeff Kirsher static void efx_dequeue_buffers(struct efx_tx_queue *tx_queue, 608c3940999STom Herbert unsigned int index, 609c3940999STom Herbert unsigned int *pkts_compl, 610c3940999STom Herbert unsigned int *bytes_compl) 611874aeea5SJeff Kirsher { 612874aeea5SJeff Kirsher struct efx_nic *efx = tx_queue->efx; 613874aeea5SJeff Kirsher unsigned int stop_index, read_ptr; 614874aeea5SJeff Kirsher 615874aeea5SJeff Kirsher stop_index = (index + 1) & tx_queue->ptr_mask; 616874aeea5SJeff Kirsher read_ptr = tx_queue->read_count & tx_queue->ptr_mask; 617874aeea5SJeff Kirsher 618874aeea5SJeff Kirsher while (read_ptr != stop_index) { 619874aeea5SJeff Kirsher struct efx_tx_buffer *buffer = &tx_queue->buffer[read_ptr]; 620ba8977bdSBen Hutchings 621ba8977bdSBen Hutchings if (!(buffer->flags & EFX_TX_BUF_OPTION) && 622ba8977bdSBen Hutchings unlikely(buffer->len == 0)) { 623874aeea5SJeff Kirsher netif_err(efx, tx_err, efx->net_dev, 624874aeea5SJeff Kirsher "TX queue %d spurious TX completion id %x\n", 625874aeea5SJeff Kirsher tx_queue->queue, read_ptr); 626874aeea5SJeff Kirsher efx_schedule_reset(efx, RESET_TYPE_TX_SKIP); 627874aeea5SJeff Kirsher return; 628874aeea5SJeff Kirsher } 629874aeea5SJeff Kirsher 630c3940999STom Herbert efx_dequeue_buffer(tx_queue, buffer, pkts_compl, bytes_compl); 631874aeea5SJeff Kirsher 632874aeea5SJeff Kirsher ++tx_queue->read_count; 633874aeea5SJeff Kirsher read_ptr = tx_queue->read_count & tx_queue->ptr_mask; 634874aeea5SJeff Kirsher } 635874aeea5SJeff Kirsher } 636874aeea5SJeff Kirsher 637874aeea5SJeff Kirsher /* Initiate a packet transmission. We use one channel per CPU 638874aeea5SJeff Kirsher * (sharing when we have more CPUs than channels). On Falcon, the TX 639874aeea5SJeff Kirsher * completion events will be directed back to the CPU that transmitted 640874aeea5SJeff Kirsher * the packet, which should be cache-efficient. 641874aeea5SJeff Kirsher * 642874aeea5SJeff Kirsher * Context: non-blocking. 643874aeea5SJeff Kirsher * Note that returning anything other than NETDEV_TX_OK will cause the 644874aeea5SJeff Kirsher * OS to free the skb. 645874aeea5SJeff Kirsher */ 646874aeea5SJeff Kirsher netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, 647874aeea5SJeff Kirsher struct net_device *net_dev) 648874aeea5SJeff Kirsher { 649874aeea5SJeff Kirsher struct efx_nic *efx = netdev_priv(net_dev); 650874aeea5SJeff Kirsher struct efx_tx_queue *tx_queue; 651874aeea5SJeff Kirsher unsigned index, type; 652874aeea5SJeff Kirsher 653874aeea5SJeff Kirsher EFX_WARN_ON_PARANOID(!netif_device_present(net_dev)); 654874aeea5SJeff Kirsher 6557c236c43SStuart Hodgson /* PTP "event" packet */ 6567c236c43SStuart Hodgson if (unlikely(efx_xmit_with_hwtstamp(skb)) && 6577c236c43SStuart Hodgson unlikely(efx_ptp_is_ptp_tx(efx, skb))) { 6587c236c43SStuart Hodgson return efx_ptp_tx(efx, skb); 6597c236c43SStuart Hodgson } 6607c236c43SStuart Hodgson 661874aeea5SJeff Kirsher index = skb_get_queue_mapping(skb); 662874aeea5SJeff Kirsher type = skb->ip_summed == CHECKSUM_PARTIAL ? EFX_TXQ_TYPE_OFFLOAD : 0; 663874aeea5SJeff Kirsher if (index >= efx->n_tx_channels) { 664874aeea5SJeff Kirsher index -= efx->n_tx_channels; 665874aeea5SJeff Kirsher type |= EFX_TXQ_TYPE_HIGHPRI; 666874aeea5SJeff Kirsher } 667874aeea5SJeff Kirsher tx_queue = efx_get_tx_queue(efx, index, type); 668874aeea5SJeff Kirsher 669874aeea5SJeff Kirsher return efx_enqueue_skb(tx_queue, skb); 670874aeea5SJeff Kirsher } 671874aeea5SJeff Kirsher 672874aeea5SJeff Kirsher void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue) 673874aeea5SJeff Kirsher { 674874aeea5SJeff Kirsher struct efx_nic *efx = tx_queue->efx; 675874aeea5SJeff Kirsher 676874aeea5SJeff Kirsher /* Must be inverse of queue lookup in efx_hard_start_xmit() */ 677874aeea5SJeff Kirsher tx_queue->core_txq = 678874aeea5SJeff Kirsher netdev_get_tx_queue(efx->net_dev, 679874aeea5SJeff Kirsher tx_queue->queue / EFX_TXQ_TYPES + 680874aeea5SJeff Kirsher ((tx_queue->queue & EFX_TXQ_TYPE_HIGHPRI) ? 681874aeea5SJeff Kirsher efx->n_tx_channels : 0)); 682874aeea5SJeff Kirsher } 683874aeea5SJeff Kirsher 6842572ac53SJiri Pirko int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type, 685de4784caSJiri Pirko void *type_data) 686874aeea5SJeff Kirsher { 687874aeea5SJeff Kirsher struct efx_nic *efx = netdev_priv(net_dev); 688de4784caSJiri Pirko struct tc_mqprio_qopt *mqprio = type_data; 689874aeea5SJeff Kirsher struct efx_channel *channel; 690874aeea5SJeff Kirsher struct efx_tx_queue *tx_queue; 69116e5cc64SJohn Fastabend unsigned tc, num_tc; 692874aeea5SJeff Kirsher int rc; 693874aeea5SJeff Kirsher 694575ed7d3SNogah Frankel if (type != TC_SETUP_QDISC_MQPRIO) 69538cf0426SJiri Pirko return -EOPNOTSUPP; 696e4c6734eSJohn Fastabend 697de4784caSJiri Pirko num_tc = mqprio->num_tc; 69816e5cc64SJohn Fastabend 6995a6681e2SEdward Cree if (num_tc > EFX_MAX_TX_TC) 700874aeea5SJeff Kirsher return -EINVAL; 701874aeea5SJeff Kirsher 702de4784caSJiri Pirko mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS; 70356f36acdSAmritha Nambiar 704874aeea5SJeff Kirsher if (num_tc == net_dev->num_tc) 705874aeea5SJeff Kirsher return 0; 706874aeea5SJeff Kirsher 707874aeea5SJeff Kirsher for (tc = 0; tc < num_tc; tc++) { 708874aeea5SJeff Kirsher net_dev->tc_to_txq[tc].offset = tc * efx->n_tx_channels; 709874aeea5SJeff Kirsher net_dev->tc_to_txq[tc].count = efx->n_tx_channels; 710874aeea5SJeff Kirsher } 711874aeea5SJeff Kirsher 712874aeea5SJeff Kirsher if (num_tc > net_dev->num_tc) { 713874aeea5SJeff Kirsher /* Initialise high-priority queues as necessary */ 714874aeea5SJeff Kirsher efx_for_each_channel(channel, efx) { 715874aeea5SJeff Kirsher efx_for_each_possible_channel_tx_queue(tx_queue, 716874aeea5SJeff Kirsher channel) { 717874aeea5SJeff Kirsher if (!(tx_queue->queue & EFX_TXQ_TYPE_HIGHPRI)) 718874aeea5SJeff Kirsher continue; 719874aeea5SJeff Kirsher if (!tx_queue->buffer) { 720874aeea5SJeff Kirsher rc = efx_probe_tx_queue(tx_queue); 721874aeea5SJeff Kirsher if (rc) 722874aeea5SJeff Kirsher return rc; 723874aeea5SJeff Kirsher } 724874aeea5SJeff Kirsher if (!tx_queue->initialised) 725874aeea5SJeff Kirsher efx_init_tx_queue(tx_queue); 726874aeea5SJeff Kirsher efx_init_tx_queue_core_txq(tx_queue); 727874aeea5SJeff Kirsher } 728874aeea5SJeff Kirsher } 729874aeea5SJeff Kirsher } else { 730874aeea5SJeff Kirsher /* Reduce number of classes before number of queues */ 731874aeea5SJeff Kirsher net_dev->num_tc = num_tc; 732874aeea5SJeff Kirsher } 733874aeea5SJeff Kirsher 734874aeea5SJeff Kirsher rc = netif_set_real_num_tx_queues(net_dev, 735874aeea5SJeff Kirsher max_t(int, num_tc, 1) * 736874aeea5SJeff Kirsher efx->n_tx_channels); 737874aeea5SJeff Kirsher if (rc) 738874aeea5SJeff Kirsher return rc; 739874aeea5SJeff Kirsher 740874aeea5SJeff Kirsher /* Do not destroy high-priority queues when they become 741874aeea5SJeff Kirsher * unused. We would have to flush them first, and it is 742874aeea5SJeff Kirsher * fairly difficult to flush a subset of TX queues. Leave 743874aeea5SJeff Kirsher * it to efx_fini_channels(). 744874aeea5SJeff Kirsher */ 745874aeea5SJeff Kirsher 746874aeea5SJeff Kirsher net_dev->num_tc = num_tc; 747874aeea5SJeff Kirsher return 0; 748874aeea5SJeff Kirsher } 749874aeea5SJeff Kirsher 750874aeea5SJeff Kirsher void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index) 751874aeea5SJeff Kirsher { 752874aeea5SJeff Kirsher unsigned fill_level; 753874aeea5SJeff Kirsher struct efx_nic *efx = tx_queue->efx; 75414bf718fSBen Hutchings struct efx_tx_queue *txq2; 755c3940999STom Herbert unsigned int pkts_compl = 0, bytes_compl = 0; 756874aeea5SJeff Kirsher 757e01b16a7SEdward Cree EFX_WARN_ON_ONCE_PARANOID(index > tx_queue->ptr_mask); 758874aeea5SJeff Kirsher 759c3940999STom Herbert efx_dequeue_buffers(tx_queue, index, &pkts_compl, &bytes_compl); 760c936835cSPeter Dunning tx_queue->pkts_compl += pkts_compl; 761c936835cSPeter Dunning tx_queue->bytes_compl += bytes_compl; 762874aeea5SJeff Kirsher 76302e12165SBen Hutchings if (pkts_compl > 1) 76402e12165SBen Hutchings ++tx_queue->merge_events; 76502e12165SBen Hutchings 76614bf718fSBen Hutchings /* See if we need to restart the netif queue. This memory 76714bf718fSBen Hutchings * barrier ensures that we write read_count (inside 76814bf718fSBen Hutchings * efx_dequeue_buffers()) before reading the queue status. 76914bf718fSBen Hutchings */ 770874aeea5SJeff Kirsher smp_mb(); 771874aeea5SJeff Kirsher if (unlikely(netif_tx_queue_stopped(tx_queue->core_txq)) && 772874aeea5SJeff Kirsher likely(efx->port_enabled) && 773874aeea5SJeff Kirsher likely(netif_device_present(efx->net_dev))) { 77414bf718fSBen Hutchings txq2 = efx_tx_queue_partner(tx_queue); 77514bf718fSBen Hutchings fill_level = max(tx_queue->insert_count - tx_queue->read_count, 77614bf718fSBen Hutchings txq2->insert_count - txq2->read_count); 77714bf718fSBen Hutchings if (fill_level <= efx->txq_wake_thresh) 778874aeea5SJeff Kirsher netif_tx_wake_queue(tx_queue->core_txq); 779874aeea5SJeff Kirsher } 780874aeea5SJeff Kirsher 781874aeea5SJeff Kirsher /* Check whether the hardware queue is now empty */ 782874aeea5SJeff Kirsher if ((int)(tx_queue->read_count - tx_queue->old_write_count) >= 0) { 7836aa7de05SMark Rutland tx_queue->old_write_count = READ_ONCE(tx_queue->write_count); 784874aeea5SJeff Kirsher if (tx_queue->read_count == tx_queue->old_write_count) { 785874aeea5SJeff Kirsher smp_mb(); 786874aeea5SJeff Kirsher tx_queue->empty_read_count = 787874aeea5SJeff Kirsher tx_queue->read_count | EFX_EMPTY_COUNT_VALID; 788874aeea5SJeff Kirsher } 789874aeea5SJeff Kirsher } 790874aeea5SJeff Kirsher } 791874aeea5SJeff Kirsher 792e9117e50SBert Kenward static unsigned int efx_tx_cb_page_count(struct efx_tx_queue *tx_queue) 793f7251a9cSBen Hutchings { 794e9117e50SBert Kenward return DIV_ROUND_UP(tx_queue->ptr_mask + 1, PAGE_SIZE >> EFX_TX_CB_ORDER); 795f7251a9cSBen Hutchings } 796f7251a9cSBen Hutchings 797874aeea5SJeff Kirsher int efx_probe_tx_queue(struct efx_tx_queue *tx_queue) 798874aeea5SJeff Kirsher { 799874aeea5SJeff Kirsher struct efx_nic *efx = tx_queue->efx; 800874aeea5SJeff Kirsher unsigned int entries; 8017668ff9cSBen Hutchings int rc; 802874aeea5SJeff Kirsher 803874aeea5SJeff Kirsher /* Create the smallest power-of-two aligned ring */ 804874aeea5SJeff Kirsher entries = max(roundup_pow_of_two(efx->txq_entries), EFX_MIN_DMAQ_SIZE); 805e01b16a7SEdward Cree EFX_WARN_ON_PARANOID(entries > EFX_MAX_DMAQ_SIZE); 806874aeea5SJeff Kirsher tx_queue->ptr_mask = entries - 1; 807874aeea5SJeff Kirsher 808874aeea5SJeff Kirsher netif_dbg(efx, probe, efx->net_dev, 809874aeea5SJeff Kirsher "creating TX queue %d size %#x mask %#x\n", 810874aeea5SJeff Kirsher tx_queue->queue, efx->txq_entries, tx_queue->ptr_mask); 811874aeea5SJeff Kirsher 812874aeea5SJeff Kirsher /* Allocate software ring */ 813c2e4e25aSThomas Meyer tx_queue->buffer = kcalloc(entries, sizeof(*tx_queue->buffer), 814874aeea5SJeff Kirsher GFP_KERNEL); 815874aeea5SJeff Kirsher if (!tx_queue->buffer) 816874aeea5SJeff Kirsher return -ENOMEM; 817874aeea5SJeff Kirsher 818e9117e50SBert Kenward tx_queue->cb_page = kcalloc(efx_tx_cb_page_count(tx_queue), 819e9117e50SBert Kenward sizeof(tx_queue->cb_page[0]), GFP_KERNEL); 820e9117e50SBert Kenward if (!tx_queue->cb_page) { 821f7251a9cSBen Hutchings rc = -ENOMEM; 822f7251a9cSBen Hutchings goto fail1; 823f7251a9cSBen Hutchings } 824f7251a9cSBen Hutchings 825874aeea5SJeff Kirsher /* Allocate hardware ring */ 826874aeea5SJeff Kirsher rc = efx_nic_probe_tx(tx_queue); 827874aeea5SJeff Kirsher if (rc) 828f7251a9cSBen Hutchings goto fail2; 829874aeea5SJeff Kirsher 830874aeea5SJeff Kirsher return 0; 831874aeea5SJeff Kirsher 832f7251a9cSBen Hutchings fail2: 833e9117e50SBert Kenward kfree(tx_queue->cb_page); 834e9117e50SBert Kenward tx_queue->cb_page = NULL; 835f7251a9cSBen Hutchings fail1: 836874aeea5SJeff Kirsher kfree(tx_queue->buffer); 837874aeea5SJeff Kirsher tx_queue->buffer = NULL; 838874aeea5SJeff Kirsher return rc; 839874aeea5SJeff Kirsher } 840874aeea5SJeff Kirsher 841874aeea5SJeff Kirsher void efx_init_tx_queue(struct efx_tx_queue *tx_queue) 842874aeea5SJeff Kirsher { 843e9117e50SBert Kenward struct efx_nic *efx = tx_queue->efx; 844e9117e50SBert Kenward 845e9117e50SBert Kenward netif_dbg(efx, drv, efx->net_dev, 846874aeea5SJeff Kirsher "initialising TX queue %d\n", tx_queue->queue); 847874aeea5SJeff Kirsher 848874aeea5SJeff Kirsher tx_queue->insert_count = 0; 849874aeea5SJeff Kirsher tx_queue->write_count = 0; 850de1deff9SEdward Cree tx_queue->packet_write_count = 0; 851874aeea5SJeff Kirsher tx_queue->old_write_count = 0; 852874aeea5SJeff Kirsher tx_queue->read_count = 0; 853874aeea5SJeff Kirsher tx_queue->old_read_count = 0; 854874aeea5SJeff Kirsher tx_queue->empty_read_count = 0 | EFX_EMPTY_COUNT_VALID; 855b2663a4fSMartin Habets tx_queue->xmit_more_available = false; 8562935e3c3SEdward Cree tx_queue->timestamping = (efx_ptp_use_mac_tx_timestamps(efx) && 8572935e3c3SEdward Cree tx_queue->channel == efx_ptp_channel(efx)); 858b9b603d4SMartin Habets tx_queue->completed_desc_ptr = tx_queue->ptr_mask; 859b9b603d4SMartin Habets tx_queue->completed_timestamp_major = 0; 860b9b603d4SMartin Habets tx_queue->completed_timestamp_minor = 0; 861874aeea5SJeff Kirsher 8623990a8ffSCharles McLachlan tx_queue->xdp_tx = efx_channel_is_xdp_tx(tx_queue->channel); 8633990a8ffSCharles McLachlan 864e9117e50SBert Kenward /* Set up default function pointers. These may get replaced by 865e9117e50SBert Kenward * efx_nic_init_tx() based off NIC/queue capabilities. 866e9117e50SBert Kenward */ 86746d1efd8SEdward Cree tx_queue->handle_tso = efx_enqueue_skb_tso; 868e9117e50SBert Kenward 869874aeea5SJeff Kirsher /* Set up TX descriptor ring */ 870874aeea5SJeff Kirsher efx_nic_init_tx(tx_queue); 871874aeea5SJeff Kirsher 872874aeea5SJeff Kirsher tx_queue->initialised = true; 873874aeea5SJeff Kirsher } 874874aeea5SJeff Kirsher 875e42c3d85SBen Hutchings void efx_fini_tx_queue(struct efx_tx_queue *tx_queue) 876874aeea5SJeff Kirsher { 877874aeea5SJeff Kirsher struct efx_tx_buffer *buffer; 878874aeea5SJeff Kirsher 879e42c3d85SBen Hutchings netif_dbg(tx_queue->efx, drv, tx_queue->efx->net_dev, 880e42c3d85SBen Hutchings "shutting down TX queue %d\n", tx_queue->queue); 881e42c3d85SBen Hutchings 882874aeea5SJeff Kirsher if (!tx_queue->buffer) 883874aeea5SJeff Kirsher return; 884874aeea5SJeff Kirsher 885874aeea5SJeff Kirsher /* Free any buffers left in the ring */ 886874aeea5SJeff Kirsher while (tx_queue->read_count != tx_queue->write_count) { 887c3940999STom Herbert unsigned int pkts_compl = 0, bytes_compl = 0; 888874aeea5SJeff Kirsher buffer = &tx_queue->buffer[tx_queue->read_count & tx_queue->ptr_mask]; 889c3940999STom Herbert efx_dequeue_buffer(tx_queue, buffer, &pkts_compl, &bytes_compl); 890874aeea5SJeff Kirsher 891874aeea5SJeff Kirsher ++tx_queue->read_count; 892874aeea5SJeff Kirsher } 893b2663a4fSMartin Habets tx_queue->xmit_more_available = false; 894c3940999STom Herbert netdev_tx_reset_queue(tx_queue->core_txq); 895874aeea5SJeff Kirsher } 896874aeea5SJeff Kirsher 897874aeea5SJeff Kirsher void efx_remove_tx_queue(struct efx_tx_queue *tx_queue) 898874aeea5SJeff Kirsher { 899f7251a9cSBen Hutchings int i; 900f7251a9cSBen Hutchings 901874aeea5SJeff Kirsher if (!tx_queue->buffer) 902874aeea5SJeff Kirsher return; 903874aeea5SJeff Kirsher 904874aeea5SJeff Kirsher netif_dbg(tx_queue->efx, drv, tx_queue->efx->net_dev, 905874aeea5SJeff Kirsher "destroying TX queue %d\n", tx_queue->queue); 906874aeea5SJeff Kirsher efx_nic_remove_tx(tx_queue); 907874aeea5SJeff Kirsher 908e9117e50SBert Kenward if (tx_queue->cb_page) { 909e9117e50SBert Kenward for (i = 0; i < efx_tx_cb_page_count(tx_queue); i++) 910f7251a9cSBen Hutchings efx_nic_free_buffer(tx_queue->efx, 911e9117e50SBert Kenward &tx_queue->cb_page[i]); 912e9117e50SBert Kenward kfree(tx_queue->cb_page); 913e9117e50SBert Kenward tx_queue->cb_page = NULL; 914f7251a9cSBen Hutchings } 915f7251a9cSBen Hutchings 916874aeea5SJeff Kirsher kfree(tx_queue->buffer); 917874aeea5SJeff Kirsher tx_queue->buffer = NULL; 918874aeea5SJeff Kirsher } 919