linux/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_tx.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
   2
   3/* Packet transmit logic for Mellanox Gigabit Ethernet driver
   4 *
   5 * Copyright (C) 2020-2021 NVIDIA CORPORATION & AFFILIATES
   6 */
   7
   8#include <linux/skbuff.h>
   9
  10#include "mlxbf_gige.h"
  11#include "mlxbf_gige_regs.h"
  12
  13/* Transmit Initialization
  14 * 1) Allocates TX WQE array using coherent DMA mapping
  15 * 2) Allocates TX completion counter using coherent DMA mapping
  16 */
  17int mlxbf_gige_tx_init(struct mlxbf_gige *priv)
  18{
  19        size_t size;
  20
  21        size = MLXBF_GIGE_TX_WQE_SZ * priv->tx_q_entries;
  22        priv->tx_wqe_base = dma_alloc_coherent(priv->dev, size,
  23                                               &priv->tx_wqe_base_dma,
  24                                               GFP_KERNEL);
  25        if (!priv->tx_wqe_base)
  26                return -ENOMEM;
  27
  28        priv->tx_wqe_next = priv->tx_wqe_base;
  29
  30        /* Write TX WQE base address into MMIO reg */
  31        writeq(priv->tx_wqe_base_dma, priv->base + MLXBF_GIGE_TX_WQ_BASE);
  32
  33        /* Allocate address for TX completion count */
  34        priv->tx_cc = dma_alloc_coherent(priv->dev, MLXBF_GIGE_TX_CC_SZ,
  35                                         &priv->tx_cc_dma, GFP_KERNEL);
  36        if (!priv->tx_cc) {
  37                dma_free_coherent(priv->dev, size,
  38                                  priv->tx_wqe_base, priv->tx_wqe_base_dma);
  39                return -ENOMEM;
  40        }
  41
  42        /* Write TX CC base address into MMIO reg */
  43        writeq(priv->tx_cc_dma, priv->base + MLXBF_GIGE_TX_CI_UPDATE_ADDRESS);
  44
  45        writeq(ilog2(priv->tx_q_entries),
  46               priv->base + MLXBF_GIGE_TX_WQ_SIZE_LOG2);
  47
  48        priv->prev_tx_ci = 0;
  49        priv->tx_pi = 0;
  50
  51        return 0;
  52}
  53
  54/* Transmit Deinitialization
  55 * This routine will free allocations done by mlxbf_gige_tx_init(),
  56 * namely the TX WQE array and the TX completion counter
  57 */
  58void mlxbf_gige_tx_deinit(struct mlxbf_gige *priv)
  59{
  60        u64 *tx_wqe_addr;
  61        size_t size;
  62        int i;
  63
  64        tx_wqe_addr = priv->tx_wqe_base;
  65
  66        for (i = 0; i < priv->tx_q_entries; i++) {
  67                if (priv->tx_skb[i]) {
  68                        dma_unmap_single(priv->dev, *tx_wqe_addr,
  69                                         priv->tx_skb[i]->len, DMA_TO_DEVICE);
  70                        dev_kfree_skb(priv->tx_skb[i]);
  71                        priv->tx_skb[i] = NULL;
  72                }
  73                tx_wqe_addr += 2;
  74        }
  75
  76        size = MLXBF_GIGE_TX_WQE_SZ * priv->tx_q_entries;
  77        dma_free_coherent(priv->dev, size,
  78                          priv->tx_wqe_base, priv->tx_wqe_base_dma);
  79
  80        dma_free_coherent(priv->dev, MLXBF_GIGE_TX_CC_SZ,
  81                          priv->tx_cc, priv->tx_cc_dma);
  82
  83        priv->tx_wqe_base = NULL;
  84        priv->tx_wqe_base_dma = 0;
  85        priv->tx_cc = NULL;
  86        priv->tx_cc_dma = 0;
  87        priv->tx_wqe_next = NULL;
  88        writeq(0, priv->base + MLXBF_GIGE_TX_WQ_BASE);
  89        writeq(0, priv->base + MLXBF_GIGE_TX_CI_UPDATE_ADDRESS);
  90}
  91
  92/* Function that returns status of TX ring:
  93 *          0: TX ring is full, i.e. there are no
  94 *             available un-used entries in TX ring.
  95 *   non-null: TX ring is not full, i.e. there are
  96 *             some available entries in TX ring.
  97 *             The non-null value is a measure of
  98 *             how many TX entries are available, but
  99 *             it is not the exact number of available
 100 *             entries (see below).
 101 *
 102 * The algorithm makes the assumption that if
 103 * (prev_tx_ci == tx_pi) then the TX ring is empty.
 104 * An empty ring actually has (tx_q_entries-1)
 105 * entries, which allows the algorithm to differentiate
 106 * the case of an empty ring vs. a full ring.
 107 */
 108static u16 mlxbf_gige_tx_buffs_avail(struct mlxbf_gige *priv)
 109{
 110        unsigned long flags;
 111        u16 avail;
 112
 113        spin_lock_irqsave(&priv->lock, flags);
 114
 115        if (priv->prev_tx_ci == priv->tx_pi)
 116                avail = priv->tx_q_entries - 1;
 117        else
 118                avail = ((priv->tx_q_entries + priv->prev_tx_ci - priv->tx_pi)
 119                          % priv->tx_q_entries) - 1;
 120
 121        spin_unlock_irqrestore(&priv->lock, flags);
 122
 123        return avail;
 124}
 125
 126bool mlxbf_gige_handle_tx_complete(struct mlxbf_gige *priv)
 127{
 128        struct net_device_stats *stats;
 129        u16 tx_wqe_index;
 130        u64 *tx_wqe_addr;
 131        u64 tx_status;
 132        u16 tx_ci;
 133
 134        tx_status = readq(priv->base + MLXBF_GIGE_TX_STATUS);
 135        if (tx_status & MLXBF_GIGE_TX_STATUS_DATA_FIFO_FULL)
 136                priv->stats.tx_fifo_full++;
 137        tx_ci = readq(priv->base + MLXBF_GIGE_TX_CONSUMER_INDEX);
 138        stats = &priv->netdev->stats;
 139
 140        /* Transmit completion logic needs to loop until the completion
 141         * index (in SW) equals TX consumer index (from HW).  These
 142         * parameters are unsigned 16-bit values and the wrap case needs
 143         * to be supported, that is TX consumer index wrapped from 0xFFFF
 144         * to 0 while TX completion index is still < 0xFFFF.
 145         */
 146        for (; priv->prev_tx_ci != tx_ci; priv->prev_tx_ci++) {
 147                tx_wqe_index = priv->prev_tx_ci % priv->tx_q_entries;
 148                /* Each TX WQE is 16 bytes. The 8 MSB store the 2KB TX
 149                 * buffer address and the 8 LSB contain information
 150                 * about the TX WQE.
 151                 */
 152                tx_wqe_addr = priv->tx_wqe_base +
 153                               (tx_wqe_index * MLXBF_GIGE_TX_WQE_SZ_QWORDS);
 154
 155                stats->tx_packets++;
 156                stats->tx_bytes += MLXBF_GIGE_TX_WQE_PKT_LEN(tx_wqe_addr);
 157
 158                dma_unmap_single(priv->dev, *tx_wqe_addr,
 159                                 priv->tx_skb[tx_wqe_index]->len, DMA_TO_DEVICE);
 160                dev_consume_skb_any(priv->tx_skb[tx_wqe_index]);
 161                priv->tx_skb[tx_wqe_index] = NULL;
 162
 163                /* Ensure completion of updates across all cores */
 164                mb();
 165        }
 166
 167        /* Since the TX ring was likely just drained, check if TX queue
 168         * had previously been stopped and now that there are TX buffers
 169         * available the TX queue can be awakened.
 170         */
 171        if (netif_queue_stopped(priv->netdev) &&
 172            mlxbf_gige_tx_buffs_avail(priv))
 173                netif_wake_queue(priv->netdev);
 174
 175        return true;
 176}
 177
 178/* Function to advance the tx_wqe_next pointer to next TX WQE */
 179void mlxbf_gige_update_tx_wqe_next(struct mlxbf_gige *priv)
 180{
 181        /* Advance tx_wqe_next pointer */
 182        priv->tx_wqe_next += MLXBF_GIGE_TX_WQE_SZ_QWORDS;
 183
 184        /* Check if 'next' pointer is beyond end of TX ring */
 185        /* If so, set 'next' back to 'base' pointer of ring */
 186        if (priv->tx_wqe_next == (priv->tx_wqe_base +
 187                                  (priv->tx_q_entries * MLXBF_GIGE_TX_WQE_SZ_QWORDS)))
 188                priv->tx_wqe_next = priv->tx_wqe_base;
 189}
 190
 191netdev_tx_t mlxbf_gige_start_xmit(struct sk_buff *skb,
 192                                  struct net_device *netdev)
 193{
 194        struct mlxbf_gige *priv = netdev_priv(netdev);
 195        long buff_addr, start_dma_page, end_dma_page;
 196        struct sk_buff *tx_skb;
 197        dma_addr_t tx_buf_dma;
 198        unsigned long flags;
 199        u64 *tx_wqe_addr;
 200        u64 word2;
 201
 202        /* If needed, linearize TX SKB as hardware DMA expects this */
 203        if (skb->len > MLXBF_GIGE_DEFAULT_BUF_SZ || skb_linearize(skb)) {
 204                dev_kfree_skb(skb);
 205                netdev->stats.tx_dropped++;
 206                return NETDEV_TX_OK;
 207        }
 208
 209        buff_addr = (long)skb->data;
 210        start_dma_page = buff_addr >> MLXBF_GIGE_DMA_PAGE_SHIFT;
 211        end_dma_page   = (buff_addr + skb->len - 1) >> MLXBF_GIGE_DMA_PAGE_SHIFT;
 212
 213        /* Verify that payload pointer and data length of SKB to be
 214         * transmitted does not violate the hardware DMA limitation.
 215         */
 216        if (start_dma_page != end_dma_page) {
 217                /* DMA operation would fail as-is, alloc new aligned SKB */
 218                tx_skb = mlxbf_gige_alloc_skb(priv, skb->len,
 219                                              &tx_buf_dma, DMA_TO_DEVICE);
 220                if (!tx_skb) {
 221                        /* Free original skb, could not alloc new aligned SKB */
 222                        dev_kfree_skb(skb);
 223                        netdev->stats.tx_dropped++;
 224                        return NETDEV_TX_OK;
 225                }
 226
 227                skb_put_data(tx_skb, skb->data, skb->len);
 228
 229                /* Free the original SKB */
 230                dev_kfree_skb(skb);
 231        } else {
 232                tx_skb = skb;
 233                tx_buf_dma = dma_map_single(priv->dev, skb->data,
 234                                            skb->len, DMA_TO_DEVICE);
 235                if (dma_mapping_error(priv->dev, tx_buf_dma)) {
 236                        dev_kfree_skb(skb);
 237                        netdev->stats.tx_dropped++;
 238                        return NETDEV_TX_OK;
 239                }
 240        }
 241
 242        /* Get address of TX WQE */
 243        tx_wqe_addr = priv->tx_wqe_next;
 244
 245        mlxbf_gige_update_tx_wqe_next(priv);
 246
 247        /* Put PA of buffer address into first 64-bit word of TX WQE */
 248        *tx_wqe_addr = tx_buf_dma;
 249
 250        /* Set TX WQE pkt_len appropriately
 251         * NOTE: GigE silicon will automatically pad up to
 252         *       minimum packet length if needed.
 253         */
 254        word2 = tx_skb->len & MLXBF_GIGE_TX_WQE_PKT_LEN_MASK;
 255
 256        /* Write entire 2nd word of TX WQE */
 257        *(tx_wqe_addr + 1) = word2;
 258
 259        spin_lock_irqsave(&priv->lock, flags);
 260        priv->tx_skb[priv->tx_pi % priv->tx_q_entries] = tx_skb;
 261        priv->tx_pi++;
 262        spin_unlock_irqrestore(&priv->lock, flags);
 263
 264        if (!netdev_xmit_more()) {
 265                /* Create memory barrier before write to TX PI */
 266                wmb();
 267                writeq(priv->tx_pi, priv->base + MLXBF_GIGE_TX_PRODUCER_INDEX);
 268        }
 269
 270        /* Check if the last TX entry was just used */
 271        if (!mlxbf_gige_tx_buffs_avail(priv)) {
 272                /* TX ring is full, inform stack */
 273                netif_stop_queue(netdev);
 274
 275                /* Since there is no separate "TX complete" interrupt, need
 276                 * to explicitly schedule NAPI poll.  This will trigger logic
 277                 * which processes TX completions, and will hopefully drain
 278                 * the TX ring allowing the TX queue to be awakened.
 279                 */
 280                napi_schedule(&priv->napi);
 281        }
 282
 283        return NETDEV_TX_OK;
 284}
 285