net/mlx5: use SPDX tags in 6WIND copyrighted files
[dpdk.git] / drivers / net / mlx5 / mlx5_rxtx.c
index d5e32b8..dc4ead9 100644 (file)
@@ -1,34 +1,6 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright 2015 6WIND S.A.
- *   Copyright 2015 Mellanox.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of 6WIND S.A. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2015 6WIND S.A.
+ * Copyright 2015 Mellanox.
  */
 
 #include <assert.h>
@@ -1351,21 +1323,13 @@ txq_burst_empw(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
                unsigned int n;
                unsigned int do_inline = 0; /* Whether inline is possible. */
                uint32_t length;
-               unsigned int segs_n = buf->nb_segs;
                uint8_t cs_flags;
 
-               /*
-                * Make sure there is enough room to store this packet and
-                * that one ring entry remains unused.
-                */
-               assert(segs_n);
-               if (max_elts - j < segs_n)
-                       break;
-               /* Do not bother with large packets MPW cannot handle. */
-               if (segs_n > MLX5_MPW_DSEG_MAX) {
-                       txq->stats.oerrors++;
+               /* Multi-segmented packet is handled in slow-path outside. */
+               assert(NB_SEGS(buf) == 1);
+               /* Make sure there is enough room to store this packet. */
+               if (max_elts - j == 0)
                        break;
-               }
                cs_flags = txq_ol_cksum_to_cs(txq, buf);
                /* Retrieve packet information. */
                length = PKT_LEN(buf);
@@ -1374,50 +1338,35 @@ txq_burst_empw(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
                 * - no space left even for a dseg
                 * - next packet can be inlined with a new WQE
                 * - cs_flag differs
-                * It can't be MLX5_MPW_STATE_OPENED as always have a single
-                * segmented packet.
                 */
                if (mpw.state == MLX5_MPW_ENHANCED_STATE_OPENED) {
-                       if ((segs_n != 1) ||
-                           (inl_pad + sizeof(struct mlx5_wqe_data_seg) >
-                             mpw_room) ||
+                       if ((inl_pad + sizeof(struct mlx5_wqe_data_seg) >
+                            mpw_room) ||
                            (length <= txq->inline_max_packet_sz &&
                             inl_pad + sizeof(inl_hdr) + length >
-                             mpw_room) ||
+                            mpw_room) ||
                            (mpw.wqe->eseg.cs_flags != cs_flags))
                                max_wqe -= mlx5_empw_close(txq, &mpw);
                }
                if (unlikely(mpw.state == MLX5_MPW_STATE_CLOSED)) {
-                       if (unlikely(segs_n != 1)) {
-                               /* Fall back to legacy MPW.
-                                * A MPW session consumes 2 WQEs at most to
-                                * include MLX5_MPW_DSEG_MAX pointers.
-                                */
-                               if (unlikely(max_wqe < 2))
-                                       break;
-                               mlx5_mpw_new(txq, &mpw, length);
-                       } else {
-                               /* In Enhanced MPW, inline as much as the budget
-                                * is allowed. The remaining space is to be
-                                * filled with dsegs. If the title WQEBB isn't
-                                * padded, it will have 2 dsegs there.
-                                */
-                               mpw_room = RTE_MIN(MLX5_WQE_SIZE_MAX,
-                                           (max_inline ? max_inline :
-                                            pkts_n * MLX5_WQE_DWORD_SIZE) +
-                                           MLX5_WQE_SIZE);
-                               if (unlikely(max_wqe * MLX5_WQE_SIZE <
-                                             mpw_room))
-                                       break;
-                               /* Don't pad the title WQEBB to not waste WQ. */
-                               mlx5_empw_new(txq, &mpw, 0);
-                               mpw_room -= mpw.total_len;
-                               inl_pad = 0;
-                               do_inline =
-                                       length <= txq->inline_max_packet_sz &&
-                                       sizeof(inl_hdr) + length <= mpw_room &&
-                                       !txq->mpw_hdr_dseg;
-                       }
+                       /* In Enhanced MPW, inline as much as the budget is
+                        * allowed. The remaining space is to be filled with
+                        * dsegs. If the title WQEBB isn't padded, it will have
+                        * 2 dsegs there.
+                        */
+                       mpw_room = RTE_MIN(MLX5_WQE_SIZE_MAX,
+                                          (max_inline ? max_inline :
+                                           pkts_n * MLX5_WQE_DWORD_SIZE) +
+                                          MLX5_WQE_SIZE);
+                       if (unlikely(max_wqe * MLX5_WQE_SIZE < mpw_room))
+                               break;
+                       /* Don't pad the title WQEBB to not waste WQ. */
+                       mlx5_empw_new(txq, &mpw, 0);
+                       mpw_room -= mpw.total_len;
+                       inl_pad = 0;
+                       do_inline = length <= txq->inline_max_packet_sz &&
+                                   sizeof(inl_hdr) + length <= mpw_room &&
+                                   !txq->mpw_hdr_dseg;
                        mpw.wqe->eseg.cs_flags = cs_flags;
                } else {
                        /* Evaluate whether the next packet can be inlined.
@@ -1433,41 +1382,7 @@ txq_burst_empw(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
                                (!txq->mpw_hdr_dseg ||
                                 mpw.total_len >= MLX5_WQE_SIZE);
                }
-               /* Multi-segment packets must be alone in their MPW. */
-               assert((segs_n == 1) || (mpw.pkts_n == 0));
-               if (unlikely(mpw.state == MLX5_MPW_STATE_OPENED)) {
-#if defined(MLX5_PMD_SOFT_COUNTERS) || !defined(NDEBUG)
-                       length = 0;
-#endif
-                       do {
-                               volatile struct mlx5_wqe_data_seg *dseg;
-
-                               assert(buf);
-                               (*txq->elts)[elts_head++ & elts_m] = buf;
-                               dseg = mpw.data.dseg[mpw.pkts_n];
-                               addr = rte_pktmbuf_mtod(buf, uintptr_t);
-                               *dseg = (struct mlx5_wqe_data_seg){
-                                       .byte_count = rte_cpu_to_be_32(
-                                                               DATA_LEN(buf)),
-                                       .lkey = mlx5_tx_mb2mr(txq, buf),
-                                       .addr = rte_cpu_to_be_64(addr),
-                               };
-#if defined(MLX5_PMD_SOFT_COUNTERS) || !defined(NDEBUG)
-                               length += DATA_LEN(buf);
-#endif
-                               buf = buf->next;
-                               ++j;
-                               ++mpw.pkts_n;
-                       } while (--segs_n);
-                       /* A multi-segmented packet takes one MPW session.
-                        * TODO: Pack more multi-segmented packets if possible.
-                        */
-                       mlx5_mpw_close(txq, &mpw);
-                       if (mpw.pkts_n < 3)
-                               max_wqe--;
-                       else
-                               max_wqe -= 2;
-               } else if (do_inline) {
+               if (do_inline) {
                        /* Inline packet into WQE. */
                        unsigned int max;
 
@@ -1576,8 +1491,6 @@ txq_burst_empw(struct mlx5_txq_data *txq, struct rte_mbuf **pkts,
 #endif
        if (mpw.state == MLX5_MPW_ENHANCED_STATE_OPENED)
                mlx5_empw_close(txq, &mpw);
-       else if (mpw.state == MLX5_MPW_STATE_OPENED)
-               mlx5_mpw_close(txq, &mpw);
        /* Ring QP doorbell. */
        mlx5_tx_dbrec(txq, mpw.wqe);
        txq->elts_head = elts_head;
@@ -1728,6 +1641,7 @@ mlx5_rx_poll_len(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cqe,
                        return 0;
                ++rxq->cq_ci;
                op_own = cqe->op_own;
+               rte_cio_rmb();
                if (MLX5_CQE_FORMAT(op_own) == MLX5_COMPRESSED) {
                        volatile struct mlx5_mini_cqe8 (*mc)[8] =
                                (volatile struct mlx5_mini_cqe8 (*)[8])
@@ -1957,9 +1871,9 @@ skip:
                return 0;
        /* Update the consumer index. */
        rxq->rq_ci = rq_ci >> sges_n;
-       rte_io_wmb();
+       rte_cio_wmb();
        *rxq->cq_db = rte_cpu_to_be_32(rxq->cq_ci);
-       rte_io_wmb();
+       rte_cio_wmb();
        *rxq->rq_db = rte_cpu_to_be_32(rxq->rq_ci);
 #ifdef MLX5_PMD_SOFT_COUNTERS
        /* Increment packets counter. */
@@ -2053,16 +1967,18 @@ mlx5_rx_burst_vec(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 }
 
 int __attribute__((weak))
-priv_check_raw_vec_tx_support(struct priv *priv)
+priv_check_raw_vec_tx_support(struct priv *priv, struct rte_eth_dev *dev)
 {
        (void)priv;
+       (void)dev;
        return -ENOTSUP;
 }
 
 int __attribute__((weak))
-priv_check_vec_tx_support(struct priv *priv)
+priv_check_vec_tx_support(struct priv *priv, struct rte_eth_dev *dev)
 {
        (void)priv;
+       (void)dev;
        return -ENOTSUP;
 }