mbuf: make segment prefree function public
[dpdk.git] / drivers / net / fm10k / fm10k_rxtx.c
index dd92a91..c9bb04a 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2013-2016 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -35,6 +35,7 @@
 
 #include <rte_ethdev.h>
 #include <rte_common.h>
+#include <rte_net.h>
 #include "fm10k.h"
 #include "base/fm10k_type.h"
 
@@ -65,6 +66,15 @@ static inline void dump_rxd(union fm10k_rx_desc *rxd)
 }
 #endif
 
+#define FM10K_TX_OFFLOAD_MASK (  \
+               PKT_TX_VLAN_PKT |        \
+               PKT_TX_IP_CKSUM |        \
+               PKT_TX_L4_MASK |         \
+               PKT_TX_TCP_SEG)
+
+#define FM10K_TX_OFFLOAD_NOTSUP_MASK \
+               (PKT_TX_OFFLOAD_MASK ^ FM10K_TX_OFFLOAD_MASK)
+
 /* @note: When this function is changed, make corresponding change to
  * fm10k_dev_supported_ptypes_get()
  */
@@ -96,6 +106,20 @@ rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 
        if (d->w.pkt_info & FM10K_RXD_RSSTYPE_MASK)
                m->ol_flags |= PKT_RX_RSS_HASH;
+
+       if (unlikely((d->d.staterr &
+               (FM10K_RXD_STATUS_IPCS | FM10K_RXD_STATUS_IPE)) ==
+               (FM10K_RXD_STATUS_IPCS | FM10K_RXD_STATUS_IPE)))
+               m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+       else
+               m->ol_flags |= PKT_RX_IP_CKSUM_GOOD;
+
+       if (unlikely((d->d.staterr &
+               (FM10K_RXD_STATUS_L4CS | FM10K_RXD_STATUS_L4E)) ==
+               (FM10K_RXD_STATUS_L4CS | FM10K_RXD_STATUS_L4E)))
+               m->ol_flags |= PKT_RX_L4_CKSUM_BAD;
+       else
+               m->ol_flags |= PKT_RX_L4_CKSUM_GOOD;
 }
 
 uint16_t
@@ -114,10 +138,10 @@ fm10k_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 
        nb_pkts = RTE_MIN(nb_pkts, q->alloc_thresh);
        for (count = 0; count < nb_pkts; ++count) {
+               if (!(q->hw_ring[next_dd].d.staterr & FM10K_RXD_STATUS_DD))
+                       break;
                mbuf = q->sw_ring[next_dd];
                desc = q->hw_ring[next_dd];
-               if (!(desc.d.staterr & FM10K_RXD_STATUS_DD))
-                       break;
 #ifdef RTE_LIBRTE_FM10K_DEBUG_RX
                dump_rxd(&desc);
 #endif
@@ -228,10 +252,10 @@ fm10k_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 
        nb_seg = RTE_MIN(nb_pkts, q->alloc_thresh);
        for (count = 0; count < nb_seg; count++) {
+               if (!(q->hw_ring[next_dd].d.staterr & FM10K_RXD_STATUS_DD))
+                       break;
                mbuf = q->sw_ring[next_dd];
                desc = q->hw_ring[next_dd];
-               if (!(desc.d.staterr & FM10K_RXD_STATUS_DD))
-                       break;
 #ifdef RTE_LIBRTE_FM10K_DEBUG_RX
                dump_rxd(&desc);
 #endif
@@ -410,12 +434,12 @@ static inline void tx_free_bulk_mbuf(struct rte_mbuf **txep, int num)
        if (unlikely(num == 0))
                return;
 
-       m = __rte_pktmbuf_prefree_seg(txep[0]);
+       m = rte_pktmbuf_prefree_seg(txep[0]);
        if (likely(m != NULL)) {
                free[0] = m;
                nb_free = 1;
                for (i = 1; i < num; i++) {
-                       m = __rte_pktmbuf_prefree_seg(txep[i]);
+                       m = rte_pktmbuf_prefree_seg(txep[i]);
                        if (likely(m != NULL)) {
                                if (likely(m->pool == free[0]->pool))
                                        free[nb_free++] = m;
@@ -431,7 +455,7 @@ static inline void tx_free_bulk_mbuf(struct rte_mbuf **txep, int num)
                rte_mempool_put_bulk(free[0]->pool, (void **)free, nb_free);
        } else {
                for (i = 1; i < num; i++) {
-                       m = __rte_pktmbuf_prefree_seg(txep[i]);
+                       m = rte_pktmbuf_prefree_seg(txep[i]);
                        if (m != NULL)
                                rte_mempool_put(m->pool, m);
                        txep[i] = NULL;
@@ -583,3 +607,41 @@ fm10k_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 
        return count;
 }
+
+uint16_t
+fm10k_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
+               uint16_t nb_pkts)
+{
+       int i, ret;
+       struct rte_mbuf *m;
+
+       for (i = 0; i < nb_pkts; i++) {
+               m = tx_pkts[i];
+
+               if ((m->ol_flags & PKT_TX_TCP_SEG) &&
+                               (m->tso_segsz < FM10K_TSO_MINMSS)) {
+                       rte_errno = -EINVAL;
+                       return i;
+               }
+
+               if (m->ol_flags & FM10K_TX_OFFLOAD_NOTSUP_MASK) {
+                       rte_errno = -ENOTSUP;
+                       return i;
+               }
+
+#ifdef RTE_LIBRTE_ETHDEV_DEBUG
+               ret = rte_validate_tx_offload(m);
+               if (ret != 0) {
+                       rte_errno = ret;
+                       return i;
+               }
+#endif
+               ret = rte_net_intel_cksum_prepare(m);
+               if (ret != 0) {
+                       rte_errno = ret;
+                       return i;
+               }
+       }
+
+       return i;
+}