// SPDX-License-Identifier: GPL-2.0-only /**************************************************************************** * Driver for Solarflare network controllers and boards * Copyright 2005-2006 Fen Systems Ltd. * Copyright 2005-2013 Solarflare Communications Inc. */ #include <linux/pci.h> #include <linux/tcp.h> #include <linux/ip.h> #include <linux/in.h> #include <linux/ipv6.h> #include <linux/slab.h> #include <net/ipv6.h> #include <linux/if_ether.h> #include <linux/highmem.h> #include <linux/cache.h> #include "net_driver.h" #include "efx.h" #include "io.h" #include "nic.h" #include "tx.h" #include "tx_common.h" #include "workarounds.h" #include "ef10_regs.h" #ifdef EFX_USE_PIO #define EFX_PIOBUF_SIZE_DEF … unsigned int efx_piobuf_size __read_mostly = …; #endif /* EFX_USE_PIO */ static inline u8 *efx_tx_get_copy_buffer(struct efx_tx_queue *tx_queue, struct efx_tx_buffer *buffer) { … } u8 *efx_tx_get_copy_buffer_limited(struct efx_tx_queue *tx_queue, struct efx_tx_buffer *buffer, size_t len) { … } static void efx_tx_maybe_stop_queue(struct efx_tx_queue *txq1) { … } static int efx_enqueue_skb_copy(struct efx_tx_queue *tx_queue, struct sk_buff *skb) { … } #ifdef EFX_USE_PIO struct efx_short_copy_buffer { … }; /* Copy to PIO, respecting that writes to PIO buffers must be dword aligned. * Advances piobuf pointer. Leaves additional data in the copy buffer. */ static void efx_memcpy_toio_aligned(struct efx_nic *efx, u8 __iomem **piobuf, u8 *data, int len, struct efx_short_copy_buffer *copy_buf) { … } /* Copy to PIO, respecting dword alignment, popping data from copy buffer first. * Advances piobuf pointer. Leaves additional data in the copy buffer. */ static void efx_memcpy_toio_aligned_cb(struct efx_nic *efx, u8 __iomem **piobuf, u8 *data, int len, struct efx_short_copy_buffer *copy_buf) { … } static void efx_flush_copy_buffer(struct efx_nic *efx, u8 __iomem *piobuf, struct efx_short_copy_buffer *copy_buf) { … } /* Traverse skb structure and copy fragments in to PIO buffer. * Advances piobuf pointer. */ static void efx_skb_copy_bits_to_pio(struct efx_nic *efx, struct sk_buff *skb, u8 __iomem **piobuf, struct efx_short_copy_buffer *copy_buf) { … } static int efx_enqueue_skb_pio(struct efx_tx_queue *tx_queue, struct sk_buff *skb) { … } /* Decide whether we can use TX PIO, ie. write packet data directly into * a buffer on the device. This can reduce latency at the expense of * throughput, so we only do this if both hardware and software TX rings * are empty, including all queues for the channel. This also ensures that * only one packet at a time can be using the PIO buffer. If the xmit_more * flag is set then we don't use this - there'll be another packet along * shortly and we want to hold off the doorbell. */ static bool efx_tx_may_pio(struct efx_tx_queue *tx_queue) { … } #endif /* EFX_USE_PIO */ /* Send any pending traffic for a channel. xmit_more is shared across all * queues for a channel, so we must check all of them. */ static void efx_tx_send_pending(struct efx_channel *channel) { … } /* * Add a socket buffer to a TX queue * * This maps all fragments of a socket buffer for DMA and adds them to * the TX queue. The queue's insert pointer will be incremented by * the number of fragments in the socket buffer. * * If any DMA mapping fails, any mapped fragments will be unmapped, * the queue's insert pointer will be restored to its original value. * * This function is split out from efx_hard_start_xmit to allow the * loopback test to direct packets via specific TX queues. * * Returns NETDEV_TX_OK. * You must hold netif_tx_lock() to call this function. */ netdev_tx_t __efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb) { … } /* Transmit a packet from an XDP buffer * * Returns number of packets sent on success, error code otherwise. * Runs in NAPI context, either in our poll (for XDP TX) or a different NIC * (for XDP redirect). */ int efx_xdp_tx_buffers(struct efx_nic *efx, int n, struct xdp_frame **xdpfs, bool flush) { … } /* Initiate a packet transmission. We use one channel per CPU * (sharing when we have more CPUs than channels). * * Context: non-blocking. * Should always return NETDEV_TX_OK and consume the skb. */ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, struct net_device *net_dev) { … } void efx_xmit_done_single(struct efx_tx_queue *tx_queue) { … } void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue) { … }