mlx5: add Rx CRC stripping configuration
authorOlga Shern <olgas@mellanox.com>
Thu, 17 Mar 2016 15:38:56 +0000 (16:38 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 25 Mar 2016 17:56:44 +0000 (18:56 +0100)
Until now, CRC was always stripped by hardware. This feature can be
configured since MLNX_OFED >= 3.2.

Signed-off-by: Olga Shern <olgas@mellanox.com>
doc/guides/nics/mlx5.rst
doc/guides/rel_notes/release_16_04.rst
drivers/net/mlx5/Makefile
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_rxq.c
drivers/net/mlx5/mlx5_rxtx.c
drivers/net/mlx5/mlx5_rxtx.h

index 5cd09b2..2573bb4 100644 (file)
@@ -79,6 +79,7 @@ Features
 - Support for multiple MAC addresses.
 - VLAN filtering.
 - RX VLAN stripping.
+- RX CRC stripping configuration.
 - Promiscuous mode.
 - Multicast promiscuous mode.
 - Hardware checksum offloads.
@@ -227,6 +228,7 @@ Currently supported by DPDK:
 
     - Flow director.
     - RX VLAN stripping.
+    - RX CRC stripping configuration.
 
 - Minimum firmware version:
 
index b58befa..37e6407 100644 (file)
@@ -217,6 +217,12 @@ This section should contain new features added in this release. Sample format:
 
   Implemented TX support in secondary processes (like mlx4).
 
+* **Added mlx5 RX CRC stripping configuration.**
+
+  Until now, CRC was always stripped. It can now be configured.
+
+  Only available with Mellanox OFED >= 3.2.
+
 * **Changed szedata2 type of driver from vdev to pdev.**
 
   Previously szedata2 device had to be added by ``--vdev`` option.
index c4f7c5f..0b74991 100644 (file)
@@ -131,6 +131,11 @@ mlx5_autoconf.h: $(RTE_SDK)/scripts/auto-config-h.sh
                infiniband/verbs.h \
                enum IBV_EXP_CQ_RX_TCP_PACKET \
                $(AUTOCONF_OUTPUT)
+       $Q sh -- '$<' '$@' \
+               HAVE_VERBS_FCS \
+               infiniband/verbs.h \
+               enum IBV_EXP_CREATE_WQ_FLAG_SCATTER_FCS \
+               $(AUTOCONF_OUTPUT)
 
 $(SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD):.c=.o): mlx5_autoconf.h
 
index b25eaab..02ff362 100644 (file)
@@ -418,6 +418,13 @@ mlx5_pci_devinit(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                DEBUG("VLAN stripping is %ssupported",
                      (priv->hw_vlan_strip ? "" : "not "));
 
+#ifdef HAVE_VERBS_FCS
+               priv->hw_fcs_strip = !!(exp_device_attr.exp_device_cap_flags &
+                                       IBV_EXP_DEVICE_SCATTER_FCS);
+#endif /* HAVE_VERBS_FCS */
+               DEBUG("FCS stripping configuration is %ssupported",
+                     (priv->hw_fcs_strip ? "" : "not "));
+
 #else /* HAVE_EXP_QUERY_DEVICE */
                priv->ind_table_max_size = RSS_INDIRECTION_TABLE_SIZE;
 #endif /* HAVE_EXP_QUERY_DEVICE */
index 99d1443..399f885 100644 (file)
@@ -103,6 +103,7 @@ struct priv {
        unsigned int hw_csum:1; /* Checksum offload is supported. */
        unsigned int hw_csum_l2tun:1; /* Same for L2 tunnels. */
        unsigned int hw_vlan_strip:1; /* VLAN stripping is supported. */
+       unsigned int hw_fcs_strip:1; /* FCS stripping is supported. */
        unsigned int vf:1; /* This is a VF device. */
        unsigned int pending_alarm:1; /* An alarm is pending. */
        /* RX/TX queues. */
index 3d84f41..19a1119 100644 (file)
@@ -1258,6 +1258,30 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc,
                                  0),
 #endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */
        };
+
+#ifdef HAVE_VERBS_FCS
+       /* By default, FCS (CRC) is stripped by hardware. */
+       if (dev->data->dev_conf.rxmode.hw_strip_crc) {
+               tmpl.crc_present = 0;
+       } else if (priv->hw_fcs_strip) {
+               /* Ask HW/Verbs to leave CRC in place when supported. */
+               attr.wq.flags |= IBV_EXP_CREATE_WQ_FLAG_SCATTER_FCS;
+               attr.wq.comp_mask |= IBV_EXP_CREATE_WQ_FLAGS;
+               tmpl.crc_present = 1;
+       } else {
+               WARN("%p: CRC stripping has been disabled but will still"
+                    " be performed by hardware, make sure MLNX_OFED and"
+                    " firmware are up to date",
+                    (void *)dev);
+               tmpl.crc_present = 0;
+       }
+       DEBUG("%p: CRC stripping is %s, %u bytes will be subtracted from"
+             " incoming frames to hide it",
+             (void *)dev,
+             tmpl.crc_present ? "disabled" : "enabled",
+             tmpl.crc_present << 2);
+#endif /* HAVE_VERBS_FCS */
+
        tmpl.wq = ibv_exp_create_wq(priv->ctx, &attr.wq);
        if (tmpl.wq == NULL) {
                ret = (errno ? errno : EINVAL);
index 0128139..25db788 100644 (file)
@@ -830,7 +830,8 @@ mlx5_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
                }
                if (ret == 0)
                        break;
-               len = ret;
+               assert(ret >= (rxq->crc_present << 2));
+               len = ret - (rxq->crc_present << 2);
                pkt_buf_len = len;
                /*
                 * Replace spent segments with new ones, concatenate and
@@ -1042,7 +1043,8 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
                }
                if (ret == 0)
                        break;
-               len = ret;
+               assert(ret >= (rxq->crc_present << 2));
+               len = ret - (rxq->crc_present << 2);
                rep = __rte_mbuf_raw_alloc(rxq->mp);
                if (unlikely(rep == NULL)) {
                        /*
index 6a0087e..61be3e4 100644 (file)
@@ -116,6 +116,7 @@ struct rxq {
        unsigned int csum:1; /* Enable checksum offloading. */
        unsigned int csum_l2tun:1; /* Same for L2 tunnels. */
        unsigned int vlan_strip:1; /* Enable VLAN stripping. */
+       unsigned int crc_present:1; /* CRC must be subtracted. */
        union {
                struct rxq_elt_sp (*sp)[]; /* Scattered RX elements. */
                struct rxq_elt (*no_sp)[]; /* RX elements. */