net/qede/base: support doorbell overflow recovery
[dpdk.git] / drivers / net / mlx5 / mlx5_rxtx_vec_sse.c
index 37854a7..aff3359 100644 (file)
@@ -112,8 +112,7 @@ txq_wr_dseg_v(struct txq *txq, __m128i *dseg,
 }
 
 /**
- * Count the number of continuous single segment packets. The first packet must
- * be a single segment packet.
+ * Count the number of continuous single segment packets.
  *
  * @param pkts
  *   Pointer to array of packets.
@@ -130,9 +129,8 @@ txq_check_multiseg(struct rte_mbuf **pkts, uint16_t pkts_n)
 
        if (!pkts_n)
                return 0;
-       assert(NB_SEGS(pkts[0]) == 1);
        /* Count the number of continuous single segment packets. */
-       for (pos = 1; pos < pkts_n; ++pos)
+       for (pos = 0; pos < pkts_n; ++pos)
                if (NB_SEGS(pkts[pos]) > 1)
                        break;
        return pos;
@@ -250,6 +248,10 @@ txq_scatter_v(struct txq *txq, struct rte_mbuf **pkts, uint16_t pkts_n)
                if (segs_n == 1 ||
                    max_elts < segs_n || max_wqe < 2)
                        break;
+               if (segs_n > MLX5_MPW_DSEG_MAX) {
+                       txq->stats.oerrors++;
+                       break;
+               }
                wqe = &((volatile struct mlx5_wqe64 *)
                         txq->wqes)[wqe_ci & wq_mask].hdr;
                if (buf->ol_flags &
@@ -291,7 +293,7 @@ txq_scatter_v(struct txq *txq, struct rte_mbuf **pkts, uint16_t pkts_n)
                /* Fill ESEG in the header. */
                _mm_store_si128(t_wqe + 1,
                                _mm_set_epi16(0, 0, 0, 0,
-                                             htons(len), cs_flags,
+                                             rte_cpu_to_be_16(len), cs_flags,
                                              0, 0));
                txq->wqe_ci = wqe_ci;
        }
@@ -300,7 +302,7 @@ txq_scatter_v(struct txq *txq, struct rte_mbuf **pkts, uint16_t pkts_n)
        txq->elts_comp += (uint16_t)(elts_head - txq->elts_head);
        txq->elts_head = elts_head;
        if (txq->elts_comp >= MLX5_TX_COMP_THRESH) {
-               wqe->ctrl[2] = htonl(8);
+               wqe->ctrl[2] = rte_cpu_to_be_32(8);
                wqe->ctrl[3] = txq->elts_head;
                txq->elts_comp = 0;
                ++txq->cq_pi;
@@ -367,6 +369,7 @@ txq_burst_v(struct txq *txq, struct rte_mbuf **pkts, uint16_t pkts_n,
        max_elts = (elts_n - (elts_head - txq->elts_tail));
        max_wqe = (1u << txq->wqe_n) - (txq->wqe_ci - txq->wqe_pi);
        pkts_n = RTE_MIN((unsigned int)RTE_MIN(pkts_n, max_wqe), max_elts);
+       assert(pkts_n <= MLX5_DSEG_MAX - nb_dword_in_hdr);
        if (unlikely(!pkts_n))
                return 0;
        elts = &(*txq->elts)[elts_head & elts_m];
@@ -561,11 +564,11 @@ rxq_replenish_bulk_mbuf(struct rxq *rxq, uint16_t n)
                return;
        }
        for (i = 0; i < n; ++i)
-               wq[i].addr = htonll((uintptr_t)elts[i]->buf_addr +
-                                   RTE_PKTMBUF_HEADROOM);
+               wq[i].addr = rte_cpu_to_be_64((uintptr_t)elts[i]->buf_addr +
+                                             RTE_PKTMBUF_HEADROOM);
        rxq->rq_ci += n;
        rte_wmb();
-       *rxq->rq_db = htonl(rxq->rq_ci);
+       *rxq->rq_db = rte_cpu_to_be_32(rxq->rq_ci);
 }
 
 /**
@@ -1248,7 +1251,7 @@ rxq_burst_v(struct rxq *rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
                }
        }
        rte_wmb();
-       *rxq->cq_db = htonl(rxq->cq_ci);
+       *rxq->cq_db = rte_cpu_to_be_32(rxq->cq_ci);
        return rcvd_pkt;
 }