net/qede: fix odd number of queues usage in 100G mode
[dpdk.git] / drivers / net / mlx5 / mlx5_rxtx.c
index 3e51bb0..f540977 100644 (file)
@@ -2130,6 +2130,9 @@ mlx5_tx_handle_completion(struct mlx5_txq_data *restrict txq,
  *   Pointer to TX queue structure.
  * @param loc
  *   Pointer to burst routine local context.
+ * @param multi,
+ *   Routine is called from multi-segment sending loop,
+ *   do not correct the elts_head according to the pkts_copy.
  * @param olx
  *   Configured Tx offloads mask. It is fully defined at
  *   compile time and may be used for optimization.
@@ -2137,12 +2140,14 @@ mlx5_tx_handle_completion(struct mlx5_txq_data *restrict txq,
 static __rte_always_inline void
 mlx5_tx_request_completion(struct mlx5_txq_data *restrict txq,
                           struct mlx5_txq_local *restrict loc,
+                          bool multi,
                           unsigned int olx)
 {
        uint16_t head = txq->elts_head;
        unsigned int part;
 
-       part = MLX5_TXOFF_CONFIG(INLINE) ? 0 : loc->pkts_sent - loc->pkts_copy;
+       part = (MLX5_TXOFF_CONFIG(INLINE) || multi) ?
+              0 : loc->pkts_sent - loc->pkts_copy;
        head += part;
        if ((uint16_t)(head - txq->elts_comp) >= MLX5_TX_COMP_THRESH ||
             (MLX5_TXOFF_CONFIG(INLINE) &&
@@ -2856,13 +2861,14 @@ mlx5_tx_dseg_vlan(struct mlx5_txq_data *restrict txq,
        memcpy(pdst, buf, MLX5_DSEG_MIN_INLINE_SIZE);
        buf += MLX5_DSEG_MIN_INLINE_SIZE;
        pdst += MLX5_DSEG_MIN_INLINE_SIZE;
+       len -= MLX5_DSEG_MIN_INLINE_SIZE;
        /* Insert VLAN ethertype + VLAN tag. Pointer is aligned. */
        assert(pdst == RTE_PTR_ALIGN(pdst, MLX5_WSEG_SIZE));
+       if (unlikely(pdst >= (uint8_t *)txq->wqes_end))
+               pdst = (uint8_t *)txq->wqes;
        *(uint32_t *)pdst = rte_cpu_to_be_32((RTE_ETHER_TYPE_VLAN << 16) |
                                              loc->mbuf->vlan_tci);
        pdst += sizeof(struct rte_vlan_hdr);
-       if (unlikely(pdst >= (uint8_t *)txq->wqes_end))
-               pdst = (uint8_t *)txq->wqes;
        /*
         * The WQEBB space availability is checked by caller.
         * Here we should be aware of WQE ring buffer wraparound only.
@@ -3091,7 +3097,7 @@ mlx5_tx_packet_multi_tso(struct mlx5_txq_data *restrict txq,
        txq->wqe_ci += (ds + 3) / 4;
        loc->wqe_free -= (ds + 3) / 4;
        /* Request CQE generation if limits are reached. */
-       mlx5_tx_request_completion(txq, loc, olx);
+       mlx5_tx_request_completion(txq, loc, true, olx);
        return MLX5_TXCMP_CODE_MULTI;
 }
 
@@ -3201,7 +3207,7 @@ mlx5_tx_packet_multi_send(struct mlx5_txq_data *restrict txq,
        txq->wqe_ci += (ds + 3) / 4;
        loc->wqe_free -= (ds + 3) / 4;
        /* Request CQE generation if limits are reached. */
-       mlx5_tx_request_completion(txq, loc, olx);
+       mlx5_tx_request_completion(txq, loc, true, olx);
        return MLX5_TXCMP_CODE_MULTI;
 }
 
@@ -3359,7 +3365,7 @@ do_align:
        txq->wqe_ci += (ds + 3) / 4;
        loc->wqe_free -= (ds + 3) / 4;
        /* Request CQE generation if limits are reached. */
-       mlx5_tx_request_completion(txq, loc, olx);
+       mlx5_tx_request_completion(txq, loc, true, olx);
        return MLX5_TXCMP_CODE_MULTI;
 }
 
@@ -3441,7 +3447,7 @@ mlx5_tx_burst_mseg(struct mlx5_txq_data *restrict txq,
                        continue;
                /* Here ends the series of multi-segment packets. */
                if (MLX5_TXOFF_CONFIG(TSO) &&
-                   unlikely(!(loc->mbuf->ol_flags & PKT_TX_TCP_SEG)))
+                   unlikely(loc->mbuf->ol_flags & PKT_TX_TCP_SEG))
                        return MLX5_TXCMP_CODE_TSO;
                return MLX5_TXCMP_CODE_SINGLE;
        }
@@ -3570,7 +3576,7 @@ mlx5_tx_burst_tso(struct mlx5_txq_data *restrict txq,
                ++loc->pkts_sent;
                --pkts_n;
                /* Request CQE generation if limits are reached. */
-               mlx5_tx_request_completion(txq, loc, olx);
+               mlx5_tx_request_completion(txq, loc, false, olx);
                if (unlikely(!pkts_n || !loc->elts_free || !loc->wqe_free))
                        return MLX5_TXCMP_CODE_EXIT;
                loc->mbuf = *pkts++;
@@ -3579,7 +3585,7 @@ mlx5_tx_burst_tso(struct mlx5_txq_data *restrict txq,
                if (MLX5_TXOFF_CONFIG(MULTI) &&
                    unlikely(NB_SEGS(loc->mbuf) > 1))
                        return MLX5_TXCMP_CODE_MULTI;
-               if (unlikely(!(loc->mbuf->ol_flags & PKT_TX_TCP_SEG)))
+               if (likely(!(loc->mbuf->ol_flags & PKT_TX_TCP_SEG)))
                        return MLX5_TXCMP_CODE_SINGLE;
                /* Continue with the next TSO packet. */
        }
@@ -3728,7 +3734,7 @@ mlx5_tx_sdone_empw(struct mlx5_txq_data *restrict txq,
        txq->wqe_ci += (ds + 3) / 4;
        loc->wqe_free -= (ds + 3) / 4;
        /* Request CQE generation if limits are reached. */
-       mlx5_tx_request_completion(txq, loc, olx);
+       mlx5_tx_request_completion(txq, loc, false, olx);
 }
 
 /*
@@ -3772,7 +3778,7 @@ mlx5_tx_idone_empw(struct mlx5_txq_data *restrict txq,
        txq->wqe_ci += (len + 3) / 4;
        loc->wqe_free -= (len + 3) / 4;
        /* Request CQE generation if limits are reached. */
-       mlx5_tx_request_completion(txq, loc, olx);
+       mlx5_tx_request_completion(txq, loc, false, olx);
 }
 
 /**
@@ -3965,7 +3971,7 @@ next_empw:
                loc->wqe_free -= (2 + part + 3) / 4;
                pkts_n -= part;
                /* Request CQE generation if limits are reached. */
-               mlx5_tx_request_completion(txq, loc, olx);
+               mlx5_tx_request_completion(txq, loc, false, olx);
                if (unlikely(!pkts_n || !loc->elts_free || !loc->wqe_free))
                        return MLX5_TXCMP_CODE_EXIT;
                loc->mbuf = *pkts++;
@@ -4440,7 +4446,7 @@ mlx5_tx_burst_single_send(struct mlx5_txq_data *restrict txq,
                ++loc->pkts_sent;
                --pkts_n;
                /* Request CQE generation if limits are reached. */
-               mlx5_tx_request_completion(txq, loc, olx);
+               mlx5_tx_request_completion(txq, loc, false, olx);
                if (unlikely(!pkts_n || !loc->elts_free || !loc->wqe_free))
                        return MLX5_TXCMP_CODE_EXIT;
                loc->mbuf = *pkts++;