ethdev: add namespace
[dpdk.git] / drivers / net / vmxnet3 / vmxnet3_rxtx.c
index 6644cde..870100f 100644 (file)
@@ -32,7 +32,7 @@
 #include <rte_malloc.h>
 #include <rte_mbuf.h>
 #include <rte_ether.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
 #include <rte_prefetch.h>
 #include <rte_ip.h>
 #include <rte_udp.h>
@@ -165,9 +165,9 @@ vmxnet3_cmd_ring_release(vmxnet3_cmd_ring_t *ring)
 }
 
 void
-vmxnet3_dev_tx_queue_release(void *txq)
+vmxnet3_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
 {
-       vmxnet3_tx_queue_t *tq = txq;
+       vmxnet3_tx_queue_t *tq = dev->data->tx_queues[qid];
 
        if (tq != NULL) {
                /* Release mbufs */
@@ -182,10 +182,10 @@ vmxnet3_dev_tx_queue_release(void *txq)
 }
 
 void
-vmxnet3_dev_rx_queue_release(void *rxq)
+vmxnet3_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
 {
        int i;
-       vmxnet3_rx_queue_t *rq = rxq;
+       vmxnet3_rx_queue_t *rq = dev->data->rx_queues[qid];
 
        if (rq != NULL) {
                /* Release mbufs */
@@ -361,7 +361,7 @@ vmxnet3_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
                 */
                if ((ol_flags & PKT_TX_TCP_SEG) == 0 &&
                                m->nb_segs > VMXNET3_MAX_TXD_PER_PKT) {
-                       rte_errno = -EINVAL;
+                       rte_errno = EINVAL;
                        return i;
                }
 
@@ -369,20 +369,20 @@ vmxnet3_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
                if ((ol_flags & VMXNET3_TX_OFFLOAD_NOTSUP_MASK) != 0 ||
                                (ol_flags & PKT_TX_L4_MASK) ==
                                PKT_TX_SCTP_CKSUM) {
-                       rte_errno = -ENOTSUP;
+                       rte_errno = ENOTSUP;
                        return i;
                }
 
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
                ret = rte_validate_tx_offload(m);
                if (ret != 0) {
-                       rte_errno = ret;
+                       rte_errno = -ret;
                        return i;
                }
 #endif
                ret = rte_net_intel_cksum_prepare(m);
                if (ret != 0) {
-                       rte_errno = ret;
+                       rte_errno = -ret;
                        return i;
                }
        }
@@ -674,6 +674,7 @@ vmxnet3_guess_mss(struct vmxnet3_hw *hw, const Vmxnet3_RxCompDesc *rcd,
        struct rte_ipv6_hdr *ipv6_hdr;
        struct rte_tcp_hdr *tcp_hdr;
        char *ptr;
+       uint8_t segs;
 
        RTE_ASSERT(rcd->tcp);
 
@@ -687,8 +688,7 @@ vmxnet3_guess_mss(struct vmxnet3_hw *hw, const Vmxnet3_RxCompDesc *rcd,
                                        - sizeof(struct rte_tcp_hdr);
 
                ipv4_hdr = (struct rte_ipv4_hdr *)(ptr + hlen);
-               hlen += (ipv4_hdr->version_ihl & RTE_IPV4_HDR_IHL_MASK) *
-                               RTE_IPV4_IHL_MULTIPLIER;
+               hlen += rte_ipv4_hdr_len(ipv4_hdr);
        } else if (rcd->v6) {
                if (unlikely(slen < hlen + sizeof(struct rte_ipv6_hdr)))
                        return hw->mtu - sizeof(struct rte_ipv6_hdr) -
@@ -711,9 +711,9 @@ vmxnet3_guess_mss(struct vmxnet3_hw *hw, const Vmxnet3_RxCompDesc *rcd,
        tcp_hdr = (struct rte_tcp_hdr *)(ptr + hlen);
        hlen += (tcp_hdr->data_off & 0xf0) >> 2;
 
-       if (rxm->udata64 > 1)
-               return (rte_pktmbuf_pkt_len(rxm) - hlen +
-                               rxm->udata64 - 1) / rxm->udata64;
+       segs = *vmxnet3_segs_dynfield(rxm);
+       if (segs > 1)
+               return (rte_pktmbuf_pkt_len(rxm) - hlen + segs - 1) / segs;
        else
                return hw->mtu - hlen + sizeof(struct rte_ether_hdr);
 }
@@ -738,7 +738,7 @@ vmxnet3_rx_offload(struct vmxnet3_hw *hw, const Vmxnet3_RxCompDesc *rcd,
                                        (const Vmxnet3_RxCompDescExt *)rcd;
 
                        rxm->tso_segsz = rcde->mss;
-                       rxm->udata64 = rcde->segCnt;
+                       *vmxnet3_segs_dynfield(rxm) = rcde->segCnt;
                        ol_flags |= PKT_RX_LRO;
                }
        } else { /* Offloads set in eop */
@@ -950,13 +950,17 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 
                        RTE_ASSERT(rxd->btype == VMXNET3_RXD_BTYPE_BODY);
 
-                       if (rxm->data_len) {
+                       if (likely(start && rxm->data_len > 0)) {
                                start->pkt_len += rxm->data_len;
                                start->nb_segs++;
 
                                rxq->last_seg->next = rxm;
                                rxq->last_seg = rxm;
                        } else {
+                               PMD_RX_LOG(ERR, "Error received empty or out of order frame.");
+                               rxq->stats.drop_total++;
+                               rxq->stats.drop_err++;
+
                                rte_pktmbuf_free_seg(rxm);
                        }
                }
@@ -1311,16 +1315,24 @@ vmxnet3_v4_rss_configure(struct rte_eth_dev *dev)
 
        cmdInfo->setRSSFields = 0;
        port_rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf;
+
+       if ((port_rss_conf->rss_hf & VMXNET3_MANDATORY_V4_RSS) !=
+           VMXNET3_MANDATORY_V4_RSS) {
+               PMD_INIT_LOG(WARNING, "RSS: IPv4/6 TCP is required for vmxnet3 v4 RSS,"
+                            "automatically setting it");
+               port_rss_conf->rss_hf |= VMXNET3_MANDATORY_V4_RSS;
+       }
+
        rss_hf = port_rss_conf->rss_hf &
                (VMXNET3_V4_RSS_MASK | VMXNET3_RSS_OFFLOAD_ALL);
 
-       if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
+       if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP)
                cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_TCPIP4;
-       if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP)
+       if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP)
                cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_TCPIP6;
-       if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP)
+       if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_UDP)
                cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_UDPIP4;
-       if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP)
+       if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_UDP)
                cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_UDPIP6;
 
        VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
@@ -1377,13 +1389,13 @@ vmxnet3_rss_configure(struct rte_eth_dev *dev)
        /* loading hashType */
        dev_rss_conf->hashType = 0;
        rss_hf = port_rss_conf->rss_hf & VMXNET3_RSS_OFFLOAD_ALL;
-       if (rss_hf & ETH_RSS_IPV4)
+       if (rss_hf & RTE_ETH_RSS_IPV4)
                dev_rss_conf->hashType |= VMXNET3_RSS_HASH_TYPE_IPV4;
-       if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
+       if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP)
                dev_rss_conf->hashType |= VMXNET3_RSS_HASH_TYPE_TCP_IPV4;
-       if (rss_hf & ETH_RSS_IPV6)
+       if (rss_hf & RTE_ETH_RSS_IPV6)
                dev_rss_conf->hashType |= VMXNET3_RSS_HASH_TYPE_IPV6;
-       if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP)
+       if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP)
                dev_rss_conf->hashType |= VMXNET3_RSS_HASH_TYPE_TCP_IPV6;
 
        return VMXNET3_SUCCESS;