From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ophirmu@mellanox.com>
Received: from EUR01-DB5-obe.outbound.protection.outlook.com
 (mail-db5eur01on0084.outbound.protection.outlook.com [104.47.2.84])
 by dpdk.org (Postfix) with ESMTP id 55B57AAC3
 for <dev@dpdk.org>; Sun, 25 Mar 2018 22:20:09 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;
 s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;
 bh=ZOlgxM3QrrutBkr+c3wzLIBnOUEubvjxtWwks4DE/Ro=;
 b=NIsbtVhu6IcI/ElR7ywSvBerhaFnigRZXTvkFlymX00+nhYZ3ywqfqPXf8obReCdi0gpZZV4I/i8oD1yyGbCAbaz2Cn1TB2Vdak4JqxLhb4we775+sQEP1nYFN4Jt51po13e4ZvEQoS98kbGOYhyPyOJKFcB0MRfL9N1TOhlfpY=
Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=ophirmu@mellanox.com; 
Received: from mellanox.com (37.142.13.130) by
 HE1PR0502MB3883.eurprd05.prod.outlook.com (2603:10a6:7:87::26) with Microsoft
 SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.609.10; Sun, 25
 Mar 2018 20:20:05 +0000
From: Ophir Munk <ophirmu@mellanox.com>
To: dev@dpdk.org,
	Adrien Mazarguil <adrien.mazarguil@6wind.com>
Cc: Thomas Monjalon <thomas@monjalon.net>, Olga Shern <olgas@mellanox.com>,
 Ophir Munk <ophirmu@mellanox.com>, Shahaf shuler <shahafs@mellanox.com>
Date: Sun, 25 Mar 2018 20:19:29 +0000
Message-Id: <1522009169-13860-1-git-send-email-ophirmu@mellanox.com>
X-Mailer: git-send-email 1.8.3.1
In-Reply-To: <1521477410-8936-1-git-send-email-ophirmu@mellanox.com>
References: <1521477410-8936-1-git-send-email-ophirmu@mellanox.com>
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [37.142.13.130]
X-ClientProxiedBy: VI1PR09CA0067.eurprd09.prod.outlook.com
 (2603:10a6:802:29::11) To HE1PR0502MB3883.eurprd05.prod.outlook.com
 (2603:10a6:7:87::26)
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-HT: Tenant
X-MS-Office365-Filtering-Correlation-Id: 1bfc5f02-b866-4274-e39c-08d5928dccd3
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020);
 SRVR:HE1PR0502MB3883; 
X-Microsoft-Exchange-Diagnostics: 1; HE1PR0502MB3883;
 3:b6xf8GOmXMD4qZXbAQ4mnOdC1jObVZvyC4zo6UNLjOjenUoSAkyUWQuch18zWpqiSbfvL9LvhHpbQsWtI2vot8Et1J2VYhvjDnus02WrS0JMRmeGIV+UDshf1Ufyifxl/hXa25MmXAz12VeNxFUJikYX0KFkoS4T2IOi2NQqQzub9+IQSRBGOEliXhSHfAyFkBwxjH/KXiw8oK4DPmsCQmrsqjktNgh/xykQDbfU+YcQsB2NDFUUugnpZKAhu9xB;
 25:gDrTl1cctlUAT9kjD9cr8Fnl4c6EYks7yjpM+nxXz/SWoSBGWunme4gK6m5pOM0RPR1z04Re+5O7/HJSdlBiWuRhtw3xQdKkbUL/0ECGRNSHJuUeBu/EgYNnQQTtlcPHvO3qqdZSLvSogV0jrqpYrceW1WFvgfN8vkjqu8pPjdFFEfFJ2Au2CCED2rZ7wuaAxU8rtWcbMB9UBAtVDOTOnJaX77Mj1QKD+gEI8gzsY0vy11B/T2d4y1NL3Dzw2XnCQztw2BUicLxRg40/EV3lbbuYOXd2O7veeeU6P8+mpnfxCpC9SUSe2uOF9wKc4akRLx6zeJQBVkk8eQdrO64Ywg==;
 31:egIsHuSOe0NQvP7lgYzKrtPTKdtifhuG37eriAZ/Wbm2Tehk71L8wXCi1gGwygdMtyC7TFjgohQFzeqXIMvNIxLGhBBnaRfH5+XbBVVqE/LlDx83cskSflfwgGPgpKKW/o4dIA7l3y+pT3y6U67d1O0sYQ8ax/Kj48MW4fbwm50gynC1JtMAYjMsXnFiS2Ows1GOM/emn1r0SEgXySPXMs9TmfKFbSdfzMV6qjRDAvM=
X-MS-TrafficTypeDiagnostic: HE1PR0502MB3883:
X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr
X-Microsoft-Exchange-Diagnostics: 1; HE1PR0502MB3883;
 20:nyNEmbJLtkQeeo/ARWzti86KVOTNcId/rmvGq/4C84DkguXycwCp3QG+ZvsRbL01BAcstm4kCdrP/XXlv8Igu5/aWqVKtTmzBltK8ZODcfWs0SHzCnRNqehubVG78fpuiDLCBPqYHV1+wH++a7jgtWw5xlXNd3ofZpi6X+kmvkl8QPCck8FcBO3Wzma34xgYnUKAnwu0jbse9QnTxdLieiKJR1XZpwONl/cSfvpoAIm4FjSUO4aXTwJgyKq10q3abLFX07L9F4M9yStvUEKbKZHGDY9VL8chaKLhLJowJ1W+SJzxJX41bP8MTItMDfccjh6W8hw074Ag2ua15LB9wDP8jG1/6360tRlmoPxBDFWKAQYDD4uK9J2EPZywMl/uH1eMDsROp0+Z3o8ZyWAOZVm+YgyJZu9qpPgNShrvRTKnm80kHmTKSS7BgIWAgqGSB/ZtITaP3RWhbNK740qq0qgmMsAju4YZoDFiPBE9SifTeZYlfjjgwH8e2hv8CO+7;
 4:otsh4VEvFcxrqQlU4J2snEPM96j+H3Nu9MU8ZG7iVAaWDEQxBfhSjM3lyOBk1cn1G3moLsiNTfVJbLzE/uKcXjE3OWo65rllpG+cVjJ750FvwPkmlm/CN2B9viMSqzKK4aB6LOGdpmD2WueYAtAT3Tk5y9IKsb7x9Qn10VxAbN0WFagQ90WrS1t1nLDXEuE3kR9QW228vUxURsQDaPiUc17s0j8ql1apj0FHU8JT5jI+ZigNzZ1W2veARRqHOWftfD8ZZdqwEFzMnxuc4H+g+w==
X-Microsoft-Antispam-PRVS: <HE1PR0502MB388345BB1F3CC8B7CEFE745CD1AE0@HE1PR0502MB3883.eurprd05.prod.outlook.com>
X-Exchange-Antispam-Report-Test: UriScan:;
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(93001095)(3231221)(944501327)(52105095)(6055026)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123558120)(20161123562045)(6072148)(201708071742011);
 SRVR:HE1PR0502MB3883; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0502MB3883; 
X-Forefront-PRVS: 0622A98CD5
X-Forefront-Antispam-Report: SFV:NSPM;
 SFS:(10009020)(396003)(366004)(376002)(39860400002)(39380400002)(346002)(199004)(189003)(2616005)(3846002)(6116002)(106356001)(5660300001)(2906002)(4720700003)(6666003)(316002)(16586007)(6916009)(69596002)(386003)(48376002)(59450400001)(50226002)(956004)(36756003)(50466002)(107886003)(8676002)(81156014)(81166006)(33026002)(76176011)(8936002)(52116002)(51416003)(7696005)(11346002)(16526019)(186003)(4326008)(7736002)(53936002)(55016002)(446003)(26005)(305945005)(478600001)(86362001)(66066001)(47776003)(54906003)(21086003)(68736007)(5890100001)(97736004)(105586002)(25786009);
 DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0502MB3883; H:mellanox.com; FPR:; SPF:None;
 PTR:InfoNoRecords; A:1; MX:1; LANG:en; 
Received-SPF: None (protection.outlook.com: mellanox.com does not designate
 permitted sender hosts)
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0502MB3883;
 23:Ns5prgkjALFcdb5eCytRGH8x5jGI80z3jvN5Dxr?=
 =?us-ascii?Q?+WyGUwvdmABzNAcn0JfKDYo/IIxha1H5cSbO2+l1fVMbL+vF9lz9UWWsyA6i?=
 =?us-ascii?Q?Jq2nrk4ZXfo20CZZFNOAQ4qFgcXRwVfcKnuo1vUcU9N0eaB73SlkqIi6R4EM?=
 =?us-ascii?Q?eZALYXcdZSwNBC6t+kd+/+KKdoL7t8jMHpQ25daAOFodvo8grfU4v6uL925c?=
 =?us-ascii?Q?72zyzU4/1t7qzYmMv3RnCbE94iPLPZC92xGtq2dPC+prwjpE5Ft6W2g86Tg2?=
 =?us-ascii?Q?JZDubGEJBNkdjeeZymACkxDdtRUEBlGEEAblgTyhGxoa+Q+C9zaGeVuiLCuU?=
 =?us-ascii?Q?w+v7gIBJawmev6r+RunFFfnlrHURMmWxpP4TZBH36jUmpUYz0gCtVQUWD4Nj?=
 =?us-ascii?Q?II7VRYwePiUiagOvExMoI7h9VU0R4TfUyAfoy1ZQLM9GbMj2BR+t56phwfxn?=
 =?us-ascii?Q?V6o9tyx9jN5PLkstyw7wMvzla0dwqpkIu3wO2VTlHm96ytUOv+OOmuOkLBpe?=
 =?us-ascii?Q?aqSLK0JakqrY69iD+ZvSeMIOfV0azi4oaaTYYYf18S7qPVKEISBCoHBVkY9n?=
 =?us-ascii?Q?a6cWo/390aU9d7hnZP0G4gXKEqnwGFCHnPeO/iDPQArxPChcZwUH1mwatV7L?=
 =?us-ascii?Q?NsymY2vzBfsRlLNpwpEW6LZFrZA3ics9Uq32UuMLmuSeXvqJlNZKIz2s3qew?=
 =?us-ascii?Q?V2fZuxc12wGZpLqB9v3WVp3BjTzQ7OneDtJhIEWJ7SphQK80+n1gloL309xe?=
 =?us-ascii?Q?X9b/4Kre6SCwXQ7NHgk9TXRmFP00goEyu5JYhw++Yd5kFvEAOwTg/cxqcnx2?=
 =?us-ascii?Q?W1j9LkeRjBEIQs/3FpNjwofEUXU7axf6GIRGjjWL7alTqtusdUqRMGZRDvtl?=
 =?us-ascii?Q?PoX6/UOdMoWywZjdXMx7i53UoQWWHpUC4ARDsTtMEGAwn3hztOE+qn8YncWq?=
 =?us-ascii?Q?oirD3h6KpMSb8ii0KSrpssj3p93oNPng5iot6e0hLP9IKgFwNilEJ8/BrNFm?=
 =?us-ascii?Q?u/GuDQd05yfUOEdlqHlzdCEu+ix6z4HFWLI/qKBRWnUpZECFBnTvbEHuICgp?=
 =?us-ascii?Q?2SVBdivmZYP8/g0mASFlOcNnw2CwzD0/16pMxhGliXzQeCS1Zvt8HpfKPnFo?=
 =?us-ascii?Q?CllY+50VYTDCQKMJkp1/si3wQ77O/pgQbT5SbjBLlOkEsViQen+kpo/ooQQg?=
 =?us-ascii?Q?v7jcx2D+ZwJDIceOqNr0RaFpFUUDkYA/80CR2HMsmxr+QPLDiqmjL//sypl9?=
 =?us-ascii?Q?TEBKPzivgvQ+zaFQHp6yCVZnIvWDufG0inxgKfN5WzEC2Ul8eqCASTi6XIRW?=
 =?us-ascii?Q?Q+n5Q5hNiXvrp/WH7wB+D0B8=3D?=
X-Microsoft-Antispam-Message-Info: lzdXvzZ5+fDydDMW6xKLbjGsOxTGH5wfbLUuy5TNzts9EyKv6HLTIIryZH57oMTJS2uaRbrt/xI6YHdvlqiF+b35Jwh4QF9OkL84G+RBsP+meYejghWBilg1L/dPr+FixseHwkySI8hwwy6ivH40xrcnA4EYJCj4KvAg5cz9mn/QGGTu9fkeYmQ4JR2ZUb+H
X-Microsoft-Exchange-Diagnostics: 1; HE1PR0502MB3883;
 6:dPaCc1qpCqWhWXyQLGqGESmdT0YWpwiVRyxv+860i7Drw0Y24ukVRpvYDeBbqXOAUe9DhLqMBkbFxcFkcsFIQtdsBSwIF/kXOmMd/XSb7tDcjcY8xMSQ4l8ou/EqW8LhGB16wzWWw34uFFUx4nitlBJcmhrsElo+A0JFAKYOlaFCcdnFwy/MEI7dDo/cQnfu9nHoFsDCcxN0uAb4JuEhi8mjD7E9Xb+uAPkZwe5/OUm9TN42ebYIzsUmDtN8soePRHdmJo9j8hgR4GCzEuUQyqyS0zM6Zw7lMrvdKRru4CVUHq68GmA6yz+hnQwsDPN5rg5csNHngP/bL/r/5PXv1zvEuook0sroeyo9Wbhn09ZX+4ZGbGcrhlOiWutR7KFJ6CXqOSsXtpUMwmIodDpPojWWxgz58ezpZWTZvAkL/nFw3RufXNZwgSPUqTwZLNrIDiK1+39C/owDs7rU8moBbA==;
 5:aYb0D0CMggo1EgkWZF9P6sB/rrhok9Um1aR0F4qrgKiOVEdwDR23GLFHct4KeL8zjFZGnrXazUqD/23xiHYrzpYDjkjgy3EcOVLKmDF40Gqtus76O9hGjJu2GTYZihJ827BD+ioaB/lCFSd0nC5OGaHx+ekunnSRqr934cuySBY=;
 24:MkBnrhtYAqBSezhxkGqJ0y79f1kAsC/twfUNOWdmONshDfV+9T52TNK+3/2++DEXioTOO/vgdsCbQz/IkUstyJQWXk2ODO1eMZQDIU24yiA=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; HE1PR0502MB3883;
 7:DbOsqnN533GnHLPrg+D9+Lb2rFtIYNzkghrIZuhqu3Bg6dkQ3vfKFM+wtZKFqcuJH/b570+7LVPlgv9BTyOtpuFD9ZVn9NRIUEFyJgncJ8i6o4cdJMbW+URmClsdGaMh2ET7rFC+HdhPGQuonLmMXiLU6hSKz1gSbUyhdEtgHR3QLDgGJtmirIHGlyMk6BjIgmcgpRdK4EekHlriQcCyggr6NypsMEcq8SV/bv58DZBetFXtCNAlLA30AqiKXAG5
X-OriginatorOrg: Mellanox.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Mar 2018 20:20:05.5087 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: 1bfc5f02-b866-4274-e39c-08d5928dccd3
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b
X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0502MB3883
Subject: [dpdk-dev] [PATCH v3] net/mlx4: support CRC strip toggling
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Sun, 25 Mar 2018 20:20:09 -0000

Previous to this commit mlx4 CRC stripping was executed by default and
there was no verbs API to disable it.

Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
---
v1: initial version
v2: following internal reviews
v3: following dpdk.org mailing list reviews

 drivers/net/mlx4/mlx4.c      |  6 +++++-
 drivers/net/mlx4/mlx4.h      |  1 +
 drivers/net/mlx4/mlx4_rxq.c  | 33 +++++++++++++++++++++++++++++++--
 drivers/net/mlx4/mlx4_rxtx.c |  3 +++
 drivers/net/mlx4/mlx4_rxtx.h |  1 +
 5 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index ee93daf..eea6e93 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -562,7 +562,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
 			(device_attr.vendor_part_id ==
 			 PCI_DEVICE_ID_MELLANOX_CONNECTX3PRO);
 		DEBUG("L2 tunnel checksum offloads are %ssupported",
-		      (priv->hw_csum_l2tun ? "" : "not "));
+		      priv->hw_csum_l2tun ? "" : "not ");
 		priv->hw_rss_sup = device_attr_ex.rss_caps.rx_hash_fields_mask;
 		if (!priv->hw_rss_sup) {
 			WARN("no RSS capabilities reported; disabling support"
@@ -578,6 +578,10 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
 		}
 		DEBUG("supported RSS hash fields mask: %016" PRIx64,
 		      priv->hw_rss_sup);
+		priv->hw_fcs_strip = !!(device_attr_ex.raw_packet_caps &
+					 IBV_RAW_PACKET_CAP_SCATTER_FCS);
+		DEBUG("FCS stripping toggling is %ssupported",
+		      priv->hw_fcs_strip ? "" : "not ");
 		/* Configure the first MAC address by default. */
 		if (mlx4_get_mac(priv, &mac.addr_bytes)) {
 			ERROR("cannot get MAC address, is mlx4_en loaded?"
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index 19c8a22..3ae3ce6 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -105,6 +105,7 @@ struct priv {
 	uint32_t isolated:1; /**< Toggle isolated mode. */
 	uint32_t hw_csum:1; /**< Checksum offload is supported. */
 	uint32_t hw_csum_l2tun:1; /**< Checksum support for L2 tunnels. */
+	uint32_t hw_fcs_strip:1; /**< FCS stripping toggling is supported. */
 	uint64_t hw_rss_sup; /**< Supported RSS hash fields (Verbs format). */
 	struct rte_intr_handle intr_handle; /**< Port interrupt handle. */
 	struct mlx4_drop *drop; /**< Shared resources for drop flow rules. */
diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c
index 7a036ed..b437bb8 100644
--- a/drivers/net/mlx4/mlx4_rxq.c
+++ b/drivers/net/mlx4/mlx4_rxq.c
@@ -491,6 +491,8 @@ mlx4_rxq_attach(struct rxq *rxq)
 	const char *msg;
 	struct ibv_cq *cq = NULL;
 	struct ibv_wq *wq = NULL;
+	uint32_t create_flags = 0;
+	uint32_t comp_mask = 0;
 	volatile struct mlx4_wqe_data_seg (*wqes)[];
 	unsigned int i;
 	int ret;
@@ -503,6 +505,11 @@ mlx4_rxq_attach(struct rxq *rxq)
 		msg = "CQ creation failure";
 		goto error;
 	}
+	/* By default, FCS (CRC) is stripped by hardware. */
+	if (rxq->crc_present) {
+		create_flags |= IBV_WQ_FLAGS_SCATTER_FCS;
+		comp_mask |= IBV_WQ_INIT_ATTR_FLAGS;
+	}
 	wq = mlx4_glue->create_wq
 		(priv->ctx,
 		 &(struct ibv_wq_init_attr){
@@ -511,6 +518,8 @@ mlx4_rxq_attach(struct rxq *rxq)
 			.max_sge = sges_n,
 			.pd = priv->pd,
 			.cq = cq,
+			.comp_mask = comp_mask,
+			.create_flags = create_flags,
 		 });
 	if (!wq) {
 		ret = errno ? errno : EINVAL;
@@ -649,9 +658,10 @@ mlx4_rxq_detach(struct rxq *rxq)
 uint64_t
 mlx4_get_rx_queue_offloads(struct priv *priv)
 {
-	uint64_t offloads = DEV_RX_OFFLOAD_SCATTER |
-			    DEV_RX_OFFLOAD_CRC_STRIP;
+	uint64_t offloads = DEV_RX_OFFLOAD_SCATTER;
 
+	if (priv->hw_fcs_strip)
+		offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
 	if (priv->hw_csum)
 		offloads |= DEV_RX_OFFLOAD_CHECKSUM;
 	return offloads;
@@ -736,6 +746,7 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
 		},
 	};
 	int ret;
+	uint32_t crc_present;
 
 	(void)conf; /* Thresholds configuration (ignored). */
 	DEBUG("%p: configuring queue %u for %u descriptors",
@@ -774,6 +785,23 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
 		     " to the next power of two (%u)",
 		     (void *)dev, idx, desc);
 	}
+	/* By default, FCS (CRC) is stripped by hardware. */
+	if (conf->offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
+		crc_present = 0;
+	} else if (priv->hw_fcs_strip) {
+		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);
+		crc_present = 0;
+	}
+	DEBUG("%p: CRC stripping is %s, %u bytes will be subtracted from"
+	      " incoming frames to hide it",
+	      (void *)dev,
+	      crc_present ? "disabled" : "enabled",
+	      crc_present << 2);
 	/* Allocate and initialize Rx queue. */
 	mlx4_zmallocv_socket("RXQ", vec, RTE_DIM(vec), socket);
 	if (!rxq) {
@@ -793,6 +821,7 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
 			(conf->offloads & DEV_RX_OFFLOAD_CHECKSUM),
 		.csum_l2tun = priv->hw_csum_l2tun &&
 			      (conf->offloads & DEV_RX_OFFLOAD_CHECKSUM),
+		.crc_present = crc_present,
 		.l2tun_offload = priv->hw_csum_l2tun,
 		.stats = {
 			.idx = idx,
diff --git a/drivers/net/mlx4/mlx4_rxtx.c b/drivers/net/mlx4/mlx4_rxtx.c
index 8ca8b77..2a10058 100644
--- a/drivers/net/mlx4/mlx4_rxtx.c
+++ b/drivers/net/mlx4/mlx4_rxtx.c
@@ -934,11 +934,14 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 				goto skip;
 			}
 			pkt = seg;
+			assert(len >= (rxq->crc_present << 2));
 			/* Update packet information. */
 			pkt->packet_type =
 				rxq_cq_to_pkt_type(cqe, rxq->l2tun_offload);
 			pkt->ol_flags = PKT_RX_RSS_HASH;
 			pkt->hash.rss = cqe->immed_rss_invalid;
+			if (rxq->crc_present)
+				len -= ETHER_CRC_LEN;
 			pkt->pkt_len = len;
 			if (rxq->csum | rxq->csum_l2tun) {
 				uint32_t flags =
diff --git a/drivers/net/mlx4/mlx4_rxtx.h b/drivers/net/mlx4/mlx4_rxtx.h
index c12bd39..a0633bf 100644
--- a/drivers/net/mlx4/mlx4_rxtx.h
+++ b/drivers/net/mlx4/mlx4_rxtx.h
@@ -52,6 +52,7 @@ struct rxq {
 	volatile uint32_t *rq_db; /**< RQ doorbell record. */
 	uint32_t csum:1; /**< Enable checksum offloading. */
 	uint32_t csum_l2tun:1; /**< Same for L2 tunnels. */
+	uint32_t crc_present:1; /**< CRC must be subtracted. */
 	uint32_t l2tun_offload:1; /**< L2 tunnel offload is enabled. */
 	struct mlx4_cq mcq;  /**< Info for directly manipulating the CQ. */
 	struct mlx4_rxq_stats stats; /**< Rx queue counters. */
-- 
2.7.4