From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 9A291A034F;
	Fri,  8 Oct 2021 10:36:27 +0200 (CEST)
Received: from [217.70.189.124] (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 3319440DDA;
	Fri,  8 Oct 2021 10:36:27 +0200 (CEST)
Received: from mga03.intel.com (mga03.intel.com [134.134.136.65])
 by mails.dpdk.org (Postfix) with ESMTP id B53B940696
 for <dev@dpdk.org>; Fri,  8 Oct 2021 10:36:24 +0200 (CEST)
X-IronPort-AV: E=McAfee;i="6200,9189,10130"; a="226415499"
X-IronPort-AV: E=Sophos;i="5.85,357,1624345200"; d="scan'208";a="226415499"
Received: from orsmga001.jf.intel.com ([10.7.209.18])
 by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;
 08 Oct 2021 01:36:22 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="5.85,357,1624345200"; d="scan'208";a="522915562"
Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16])
 by orsmga001.jf.intel.com with ESMTP; 08 Oct 2021 01:36:21 -0700
Received: from orsmsx607.amr.corp.intel.com (10.22.229.20) by
 ORSMSX603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server
 (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id
 15.1.2242.12; Fri, 8 Oct 2021 01:36:21 -0700
Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by
 orsmsx607.amr.corp.intel.com (10.22.229.20) with Microsoft SMTP Server
 (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id
 15.1.2242.12 via Frontend Transport; Fri, 8 Oct 2021 01:36:21 -0700
Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.173)
 by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server
 (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.1.2242.12; Fri, 8 Oct 2021 01:36:20 -0700
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=Tjf8jCpqgnkcaRo9gru8Elc367u0dY27Ex7vmbLUnvqyaWMMv+mQey8HWw0oLALPppGrDyC/rkQkNbjzpRvvIh6KAS4qRrT74IfPd6yYrcQ1gVnxct7LggoOWJTWN4P7ri0cAz5+e1HRBZB7V8z8rUeWjYUMK1pP9pbCsa/T5HTLanlKwc4+7UF3clKXFjFHb7PL+ZzhU5eM7EK68TLf45qA0SQLvWXM6fQ+1zHEDnzhuW52WMdFI3JtT/S3AG8sH40W9uF5D8czUTPb7pYSDGXj8cJBTobf/XQC1LWzaTPdniGPxGbCurTULjdALRaHQZXVaN1KSPVwGmdaJhAj8w==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;
 bh=i3Pocp2u6PxH1hX4bmXvIUAMJD+nNqK5OFtWa8lKCJ8=;
 b=DNgxkMmOxQ9ciWYRuGR/d8yB+2mknp8oIOOI+f1t6IoFRq3bsNLUEgM0YV66g6KEa+jthcV0ubVqtdbTY1zks+ljUESm6MKiHUG++kx0BLsEK/W2x0PIkLxmapOmoPytWbExXj3syp6BQK4DX9h9Z23/mf33DN6M+xEzXai20oZXv/6paOYTrSPf4HwhkLj7jQp6rdM/CsskpWm+J9all8MuFD1xcEwFkxHV3tEaLHXDHiXkDKe9fASIMmdG1WfSXn37a9q4MP/DMbFP7DuQtlfJaWGQrcXgaDgy/O/RnTR9tdfby2LCw8RsbrmXrxFMu3z2BiNvwzzq3DRu8mrVhw==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com;
 dkim=pass header.d=intel.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; 
 s=selector2-intel-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=i3Pocp2u6PxH1hX4bmXvIUAMJD+nNqK5OFtWa8lKCJ8=;
 b=vnFpwY6y4Fs4naI7SeJDpexcEQkV11rlSHaJeweBfwG+tWILppPtYdcCWXdo38LX7Hl7DJQc6XcYH4pFB5UDxAOucoMKcWh3BHiAUUlK9GASUPDbAT0n8IxVhFN1Oeaa0VhhiXQerE7lsQ9QdSua24T76GSM4YB+2TRL+UWcugI=
Received: from BYAPR11MB2901.namprd11.prod.outlook.com (2603:10b6:a03:91::23)
 by SJ0PR11MB4928.namprd11.prod.outlook.com (2603:10b6:a03:2d2::13)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.19; Fri, 8 Oct
 2021 08:36:14 +0000
Received: from BYAPR11MB2901.namprd11.prod.outlook.com
 ([fe80::954c:3fe0:a7af:7c96]) by BYAPR11MB2901.namprd11.prod.outlook.com
 ([fe80::954c:3fe0:a7af:7c96%3]) with mapi id 15.20.4566.022; Fri, 8 Oct 2021
 08:36:14 +0000
From: "Xu, Rosen" <rosen.xu@intel.com>
To: "Yigit, Ferruh" <ferruh.yigit@intel.com>, Jerin Jacob
 <jerinj@marvell.com>, "Li, Xiaoyun" <xiaoyun.li@intel.com>, Chas Williams
 <chas3@att.com>, "Min Hu (Connor)" <humin29@huawei.com>, Hemant Agrawal
 <hemant.agrawal@nxp.com>, Sachin Saxena <sachin.saxena@oss.nxp.com>, "Zhang,
 Qi Z" <qi.z.zhang@intel.com>, "Wang, Xiao W" <xiao.w.wang@intel.com>, "Matan
 Azrad" <matan@nvidia.com>, Viacheslav Ovsiienko <viacheslavo@nvidia.com>,
 Harman Kalra <hkalra@marvell.com>, Maciej Czekaj <mczekaj@marvell.com>, "Ray
 Kinsella" <mdr@ashroe.eu>, "Iremonger, Bernard"
 <bernard.iremonger@intel.com>, "Ananyev, Konstantin"
 <konstantin.ananyev@intel.com>, Kiran Kumar K <kirankumark@marvell.com>,
 Nithin Dabilpuram <ndabilpuram@marvell.com>, "Hunt, David"
 <david.hunt@intel.com>, "Mcnamara, John" <john.mcnamara@intel.com>,
 "Richardson, Bruce" <bruce.richardson@intel.com>, Igor Russkikh
 <irusskikh@marvell.com>, Steven Webster <steven.webster@windriver.com>,
 "Peters, Matt" <matt.peters@windriver.com>, Somalapuram Amaranath
 <asomalap@amd.com>, Rasesh Mody <rmody@marvell.com>, Shahed Shaikh
 <shshaikh@marvell.com>, Ajit Khaparde <ajit.khaparde@broadcom.com>, "Somnath
 Kotur" <somnath.kotur@broadcom.com>, Sunil Kumar Kori <skori@marvell.com>,
 Satha Rao <skoteshwar@marvell.com>, Rahul Lakkireddy
 <rahul.lakkireddy@chelsio.com>, "Wang, Haiyue" <haiyue.wang@intel.com>,
 Marcin Wojtas <mw@semihalf.com>, Michal Krawczyk <mk@semihalf.com>, "Shai
 Brandes" <shaibran@amazon.com>, Evgeny Schemeilin <evgenys@amazon.com>, "Igor
 Chauskin" <igorch@amazon.com>, Gagandeep Singh <g.singh@nxp.com>, "Daley,
 John" <johndale@cisco.com>, Hyong Youb Kim <hyonkim@cisco.com>, Ziyang Xuan
 <xuanziyang2@huawei.com>, Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>,
 Guoyang Zhou <zhouguoyang@huawei.com>, Yisen Zhuang
 <yisen.zhuang@huawei.com>, Lijun Ou <oulijun@huawei.com>, "Xing, Beilei"
 <beilei.xing@intel.com>, "Wu, Jingjing" <jingjing.wu@intel.com>, "Yang,
 Qiming" <qiming.yang@intel.com>, Andrew Boyer <aboyer@pensando.io>, "Shijith
 Thotton" <sthotton@marvell.com>, Srisivasubramanian Srinivasan
 <srinivasan@marvell.com>, Zyta Szpak <zr@semihalf.com>, Liron Himi
 <lironh@marvell.com>, Heinrich Kuhn <heinrich.kuhn@corigine.com>, "Devendra
 Singh Rawat" <dsinghrawat@marvell.com>, Andrew Rybchenko
 <andrew.rybchenko@oktetlabs.ru>, "Wiles, Keith" <keith.wiles@intel.com>,
 Jiawen Wu <jiawenwu@trustnetic.com>, Jian Wang <jianwang@trustnetic.com>,
 Maxime Coquelin <maxime.coquelin@redhat.com>, "Xia, Chenbo"
 <chenbo.xia@intel.com>, "Chautru, Nicolas" <nicolas.chautru@intel.com>, "Van
 Haaren, Harry" <harry.van.haaren@intel.com>, "Dumitrescu, Cristian"
 <cristian.dumitrescu@intel.com>, "Nicolau, Radu" <radu.nicolau@intel.com>,
 Akhil Goyal <gakhil@marvell.com>, "Kantecki, Tomasz"
 <tomasz.kantecki@intel.com>, "Doherty, Declan" <declan.doherty@intel.com>,
 Pavan Nikhilesh <pbhagavatula@marvell.com>, "Rybalchenko, Kirill"
 <kirill.rybalchenko@intel.com>, "Singh, Jasvinder"
 <jasvinder.singh@intel.com>, Thomas Monjalon <thomas@monjalon.net>
CC: "dev@dpdk.org" <dev@dpdk.org>
Thread-Topic: [PATCH v4 1/6] ethdev: fix max Rx packet length
Thread-Index: AQHXugzfrtXFFcZ22UuE57pKO9IH4avIysxw
Date: Fri, 8 Oct 2021 08:36:13 +0000
Message-ID: <BYAPR11MB29014AA19F2477ADB65E5C7B89B29@BYAPR11MB2901.namprd11.prod.outlook.com>
References: <20211001143624.3744505-1-ferruh.yigit@intel.com>
 <20211005171653.3700067-1-ferruh.yigit@intel.com>
In-Reply-To: <20211005171653.3700067-1-ferruh.yigit@intel.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNzBhNzZkNDEtZWFkYi00YjkyLTg0MzAtYmNmMGRkNjQzNTMxIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiQWxXMm1kRVRKNG5jWHcrRTlBcG1kQ0ZiOUd1QWtEZHFsWlRzaVRKR05EbHhxK0FqbDMzcW0wUE1PendQWnd3cSJ9
x-ctpclassification: CTP_NT
authentication-results: intel.com; dkim=none (message not signed)
 header.d=none;intel.com; dmarc=none action=none header.from=intel.com;
x-ms-publictraffictype: Email
x-ms-office365-filtering-correlation-id: 4e6b43be-35a1-4af2-e24f-08d98a36b070
x-ms-traffictypediagnostic: SJ0PR11MB4928:
x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr
x-ms-exchange-transport-forked: True
x-microsoft-antispam-prvs: <SJ0PR11MB4928B061DE2FC8A8DE196F9089B29@SJ0PR11MB4928.namprd11.prod.outlook.com>
x-ms-oob-tlc-oobclassifiers: OLM:800;
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam: BCL:0;
x-microsoft-antispam-message-info: hbHonb4Tsf/I1rujdkSRwANqhZMckPwHSGMBpzi4p0Paik18VYqBEgdnxzpC4NKgO2Oc+aKC/C1ter0fniEfsC5EWtlTNrjfv8cSOjKwKa9klhzSBDGTGRmhJL19BzHsvRjWrXzlJxZXqCHyC2ZPdzUBY2AN0FmU59M0NVURXtffj1X0FOgYCMl5C9Zx5knS3E1VpCMASnRZcKKlUe3Zti+aRj24D3ltkYv47YRrDKt8CjnbR7Ly/6IPscZXUJ/LU6bPWEla1GH98BGodcjp3G1pYXZRVbCrY4EKY2az+vVTKN/UfrhfYQyd1AXFXb6X6i3rEq9ni3EpBUguMk26IhLiM05FdkfYMPefmIe3YPmU0/CB0g2QlbglFMznNB/132rf0c2ObcOaiXIxtRY7oFu9FZiQON9G9tj9RYYC7oxZVYx9oSs8X/CKcMw2ukcsOK8weD9GucfHZrgDKCKJUDHhsI32wEJYQgF1uCkM6d6iHcxI9jkEUh5nfgbO2Ys84beZfdHaTr0rBdV2aV8KbFKlqzjAUwq+8iq5aoaV5/icmQS+6pAxaGrAuo22sC3Z8HambXtdnSxXOpmpfaLv1o1wyD1ROWmLy6pPdiQv4snimoEZp+t1wcmDqoVKqkghXyQgooJ95pEj1tpC77upWFBgYAZ7hQ0RroGj0a49jvPfh2piJaai5EDxsy9qSCb49PZEy4p3LXrOubVybatbzMAOfqf0yZH8gRbet18t560=
x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:BYAPR11MB2901.namprd11.prod.outlook.com; PTR:; CAT:NONE;
 SFS:(4636009)(366004)(55016002)(9686003)(53546011)(2906002)(83380400001)(6506007)(26005)(33656002)(186003)(64756008)(66556008)(66446008)(66476007)(30864003)(66946007)(86362001)(52536014)(921005)(5660300002)(8676002)(1191002)(76116006)(316002)(4326008)(8936002)(122000001)(110136005)(7696005)(38070700005)(7366002)(7416002)(508600001)(71200400001)(38100700002)(7406005)(559001)(569008)(579004);
 DIR:OUT; SFP:1102; 
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?x2vD889HltB2ojb33jHbDJfwyYR/tiXeo+PbnyGJuK/vcK+aj/qe0rodf4r7?=
 =?us-ascii?Q?T3JzTomsvtKr2xb+gG3aVY8BIWkUfIN4dzC2OBiiEeQpjoMapNlYTWrP7KdM?=
 =?us-ascii?Q?vJHo9oENfHIxljG8uikpYRoA4GZEbac3TckBlsyOIM1G34dES2OGOXVelvj/?=
 =?us-ascii?Q?6L5R/+8LyLoikZYHzZPjS+RVgCQwKna5vJhbm0oahv7TG1rPtm0S4CkYP7Bw?=
 =?us-ascii?Q?c2TTPOrYoUSZ/xW7zRmuwdYYdXDedDyWH1XfDTEKo9s+yFEcJtiqtT49SMFD?=
 =?us-ascii?Q?RbFXMC9hVxpem30qpMdZ4+eo8ZSrYiBVRRR0OH0g43TJQBFpRj+c6KI4NcbV?=
 =?us-ascii?Q?Dcda1abjvcK9ziaj20lU/Yjexg0aZg8AWp/I39ZmGOClAUuZEyF+878SrexS?=
 =?us-ascii?Q?eWs2BfzTyXoQJOlSx5fc1/bm0xxVyUqlLN2f4jYmhqtuwbGLVawgl5tYerqu?=
 =?us-ascii?Q?D1Q06cOFLCLIlecOGWM9Xb5ayqSo3ttz5bk/rVbnJPGQe0ErrY12IyLL7pha?=
 =?us-ascii?Q?p3ZO2ZPG0GhqPK19UxqAWxi0RzOxiEzy4sL/3yTiSucPHTXPNz5RQlxoi5jH?=
 =?us-ascii?Q?CATqEQMV1CE8TfYgH1ibyShpokcmipqxcwlHwquCS8TG5gf8vFqlT99kk9KV?=
 =?us-ascii?Q?DJBmVT2R1eEyxPqw9816siOenSlpIaedtdjMTztMCSxXd4MFS3oqGlcLYCT1?=
 =?us-ascii?Q?dTyLRk3TJBxSb7GYZkSp7JKicYYxJ1MY+h9etxQ3P0oO749sySHGK90EpNyl?=
 =?us-ascii?Q?SeB3H8SQ1+u/VJu9o4Znq9b6BoiE6N5jfhwlG+2jqZiGPi7da4CbKCftVec4?=
 =?us-ascii?Q?NSxeygbhuAhqBCXGYMeCLhqWIVpyoXlmxQyBt98yIrLdI8vS/xpUi2pZ+2+i?=
 =?us-ascii?Q?pwRHmP5yKjxHPbmnGRkNdtBki8qKwPekxrJXoWRdCE8/UpJeemjlO4sdcOhT?=
 =?us-ascii?Q?2X1ilmnY0o9QejMWgLudJ1PaxCCGbC54RtBJO4lOdW9+trSfygUY3w+RtnS7?=
 =?us-ascii?Q?Y+EB5v7gM9gGXXVMF1tW84feNzhLuYS4IrI1B/I/6XexX24MK/VbFqXmd7vi?=
 =?us-ascii?Q?tGQZjWXIAKUE7/qiM9xY2kKa5n9Qjob0H0dQ5RmacVZge0PK6Dl63/YhSczn?=
 =?us-ascii?Q?+RxaGpFSnQHsNgw5tBM7wO/icHLwMTuj4mmmXyXZkCpRPV7AGCk9kerIfyZY?=
 =?us-ascii?Q?tcHDiCfTfs6g17tTFpXBnxrp/Q+gXTT9KSU+YZAwqIEsMS8hdiLgCARhFIF5?=
 =?us-ascii?Q?xCNmLIfrB9Ei8XFDkAZ8Ssa662E2aBZm+pF99ON2+L4d5wcp+E8/KlXhtEaG?=
 =?us-ascii?Q?dHTBIr60sK63hCT9+qyso5wx?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: BYAPR11MB2901.namprd11.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 4e6b43be-35a1-4af2-e24f-08d98a36b070
X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Oct 2021 08:36:13.6454 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: uQ89YQyDIJNLLrD2sEkYPS8hHWG8hOe9JqZnZ2ZLanEDlRI4TuLv2tL4hYKwJSuCluW4mkfalw6i9p0XTWdWUQ==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR11MB4928
X-OriginatorOrg: intel.com
Subject: Re: [dpdk-dev] [PATCH v4 1/6] ethdev: fix max Rx packet length
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

Hi,

> -----Original Message-----
> From: Yigit, Ferruh <ferruh.yigit@intel.com>
> Sent: Wednesday, October 06, 2021 1:17
> To: Jerin Jacob <jerinj@marvell.com>; Li, Xiaoyun <xiaoyun.li@intel.com>;
> Chas Williams <chas3@att.com>; Min Hu (Connor) <humin29@huawei.com>;
> Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena
> <sachin.saxena@oss.nxp.com>; Zhang, Qi Z <qi.z.zhang@intel.com>; Wang,
> Xiao W <xiao.w.wang@intel.com>; Matan Azrad <matan@nvidia.com>;
> Viacheslav Ovsiienko <viacheslavo@nvidia.com>; Harman Kalra
> <hkalra@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>; Ray Kinsella
> <mdr@ashroe.eu>; Iremonger, Bernard <bernard.iremonger@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>; Kiran Kumar K
> <kirankumark@marvell.com>; Nithin Dabilpuram
> <ndabilpuram@marvell.com>; Hunt, David <david.hunt@intel.com>;
> Mcnamara, John <john.mcnamara@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>; Igor Russkikh <irusskikh@marvell.com>;
> Steven Webster <steven.webster@windriver.com>; Peters, Matt
> <matt.peters@windriver.com>; Somalapuram Amaranath
> <asomalap@amd.com>; Rasesh Mody <rmody@marvell.com>; Shahed
> Shaikh <shshaikh@marvell.com>; Ajit Khaparde
> <ajit.khaparde@broadcom.com>; Somnath Kotur
> <somnath.kotur@broadcom.com>; Sunil Kumar Kori <skori@marvell.com>;
> Satha Rao <skoteshwar@marvell.com>; Rahul Lakkireddy
> <rahul.lakkireddy@chelsio.com>; Wang, Haiyue <haiyue.wang@intel.com>;
> Marcin Wojtas <mw@semihalf.com>; Michal Krawczyk <mk@semihalf.com>;
> Shai Brandes <shaibran@amazon.com>; Evgeny Schemeilin
> <evgenys@amazon.com>; Igor Chauskin <igorch@amazon.com>; Gagandeep
> Singh <g.singh@nxp.com>; Daley, John <johndale@cisco.com>; Hyong Youb
> Kim <hyonkim@cisco.com>; Ziyang Xuan <xuanziyang2@huawei.com>;
> Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Guoyang Zhou
> <zhouguoyang@huawei.com>; Yisen Zhuang <yisen.zhuang@huawei.com>;
> Lijun Ou <oulijun@huawei.com>; Xing, Beilei <beilei.xing@intel.com>; Wu,
> Jingjing <jingjing.wu@intel.com>; Yang, Qiming <qiming.yang@intel.com>;
> Andrew Boyer <aboyer@pensando.io>; Xu, Rosen <rosen.xu@intel.com>;
> Shijith Thotton <sthotton@marvell.com>; Srisivasubramanian Srinivasan
> <srinivasan@marvell.com>; Zyta Szpak <zr@semihalf.com>; Liron Himi
> <lironh@marvell.com>; Heinrich Kuhn <heinrich.kuhn@corigine.com>;
> Devendra Singh Rawat <dsinghrawat@marvell.com>; Andrew Rybchenko
> <andrew.rybchenko@oktetlabs.ru>; Wiles, Keith <keith.wiles@intel.com>;
> Jiawen Wu <jiawenwu@trustnetic.com>; Jian Wang
> <jianwang@trustnetic.com>; Maxime Coquelin
> <maxime.coquelin@redhat.com>; Xia, Chenbo <chenbo.xia@intel.com>;
> Chautru, Nicolas <nicolas.chautru@intel.com>; Van Haaren, Harry
> <harry.van.haaren@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Nicolau, Radu <radu.nicolau@intel.com>;
> Akhil Goyal <gakhil@marvell.com>; Kantecki, Tomasz
> <tomasz.kantecki@intel.com>; Doherty, Declan <declan.doherty@intel.com>;
> Pavan Nikhilesh <pbhagavatula@marvell.com>; Rybalchenko, Kirill
> <kirill.rybalchenko@intel.com>; Singh, Jasvinder
> <jasvinder.singh@intel.com>; Thomas Monjalon <thomas@monjalon.net>
> Cc: Yigit, Ferruh <ferruh.yigit@intel.com>; dev@dpdk.org
> Subject: [PATCH v4 1/6] ethdev: fix max Rx packet length
>=20
> There is a confusion on setting max Rx packet length, this patch aims to
> clarify it.
>=20
> 'rte_eth_dev_configure()' API accepts max Rx packet size via
> 'uint32_t max_rx_pkt_len' field of the config struct 'struct
> rte_eth_conf'.
>=20
> Also 'rte_eth_dev_set_mtu()' API can be used to set the MTU, and result
> stored into '(struct rte_eth_dev)->data->mtu'.
>=20
> These two APIs are related but they work in a disconnected way, they
> store the set values in different variables which makes hard to figure
> out which one to use, also having two different method for a related
> functionality is confusing for the users.
>=20
> Other issues causing confusion is:
> * maximum transmission unit (MTU) is payload of the Ethernet frame. And
>   'max_rx_pkt_len' is the size of the Ethernet frame. Difference is
>   Ethernet frame overhead, and this overhead may be different from
>   device to device based on what device supports, like VLAN and QinQ.
> * 'max_rx_pkt_len' is only valid when application requested jumbo frame,
>   which adds additional confusion and some APIs and PMDs already
>   discards this documented behavior.
> * For the jumbo frame enabled case, 'max_rx_pkt_len' is an mandatory
>   field, this adds configuration complexity for application.
>=20
> As solution, both APIs gets MTU as parameter, and both saves the result
> in same variable '(struct rte_eth_dev)->data->mtu'. For this
> 'max_rx_pkt_len' updated as 'mtu', and it is always valid independent
> from jumbo frame.
>=20
> For 'rte_eth_dev_configure()', 'dev->data->dev_conf.rxmode.mtu' is user
> request and it should be used only within configure function and result
> should be stored to '(struct rte_eth_dev)->data->mtu'. After that point
> both application and PMD uses MTU from this variable.
>=20
> When application doesn't provide an MTU during 'rte_eth_dev_configure()'
> default 'RTE_ETHER_MTU' value is used.
>=20
> Additional clarification done on scattered Rx configuration, in
> relation to MTU and Rx buffer size.
> MTU is used to configure the device for physical Rx/Tx size limitation,
> Rx buffer is where to store Rx packets, many PMDs use mbuf data buffer
> size as Rx buffer size.
> PMDs compare MTU against Rx buffer size to decide enabling scattered Rx
> or not. If scattered Rx is not supported by device, MTU bigger than Rx
> buffer size should fail.
>=20
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> ---
> Cc: Min Hu (Connor) <humin29@huawei.com>
>=20
> v2:
> * Converted to explicit checks for zero/non-zero
> * fixed hns3 checks
> * fixed some sample app rxmode.mtu value
> * fixed some sample app max-pkt-len argument and updated doc for it
>=20
> v3:
> * rebased
>=20
> v4:
> * fix typos in commit logs
> ---
>  app/test-eventdev/test_perf_common.c          |   1 -
>  app/test-eventdev/test_pipeline_common.c      |   5 +-
>  app/test-pmd/cmdline.c                        |  49 +++----
>  app/test-pmd/config.c                         |  22 ++-
>  app/test-pmd/parameters.c                     |   4 +-
>  app/test-pmd/testpmd.c                        | 103 ++++++++------
>  app/test-pmd/testpmd.h                        |   2 +-
>  app/test/test_link_bonding.c                  |   1 -
>  app/test/test_link_bonding_mode4.c            |   1 -
>  app/test/test_link_bonding_rssconf.c          |   2 -
>  app/test/test_pmd_perf.c                      |   1 -
>  doc/guides/nics/dpaa.rst                      |   2 +-
>  doc/guides/nics/dpaa2.rst                     |   2 +-
>  doc/guides/nics/features.rst                  |   2 +-
>  doc/guides/nics/fm10k.rst                     |   2 +-
>  doc/guides/nics/mlx5.rst                      |   4 +-
>  doc/guides/nics/octeontx.rst                  |   2 +-
>  doc/guides/nics/thunderx.rst                  |   2 +-
>  doc/guides/rel_notes/deprecation.rst          |  25 ----
>  doc/guides/sample_app_ug/flow_classify.rst    |   7 +-
>  doc/guides/sample_app_ug/l3_forward.rst       |   6 +-
>  .../sample_app_ug/l3_forward_access_ctrl.rst  |   4 +-
>  doc/guides/sample_app_ug/l3_forward_graph.rst |   6 +-
>  .../sample_app_ug/l3_forward_power_man.rst    |   4 +-
>  .../sample_app_ug/performance_thread.rst      |   4 +-
>  doc/guides/sample_app_ug/skeleton.rst         |   7 +-
>  drivers/net/atlantic/atl_ethdev.c             |   3 -
>  drivers/net/avp/avp_ethdev.c                  |  17 +--
>  drivers/net/axgbe/axgbe_ethdev.c              |   7 +-
>  drivers/net/bnx2x/bnx2x_ethdev.c              |   6 +-
>  drivers/net/bnxt/bnxt_ethdev.c                |  21 +--
>  drivers/net/bonding/rte_eth_bond_pmd.c        |   4 +-
>  drivers/net/cnxk/cnxk_ethdev.c                |   9 +-
>  drivers/net/cnxk/cnxk_ethdev_ops.c            |   8 +-
>  drivers/net/cxgbe/cxgbe_ethdev.c              |  12 +-
>  drivers/net/cxgbe/cxgbe_main.c                |   3 +-
>  drivers/net/cxgbe/sge.c                       |   3 +-
>  drivers/net/dpaa/dpaa_ethdev.c                |  52 +++----
>  drivers/net/dpaa2/dpaa2_ethdev.c              |  31 ++---
>  drivers/net/e1000/em_ethdev.c                 |   4 +-
>  drivers/net/e1000/igb_ethdev.c                |  18 +--
>  drivers/net/e1000/igb_rxtx.c                  |  16 +--
>  drivers/net/ena/ena_ethdev.c                  |  27 ++--
>  drivers/net/enetc/enetc_ethdev.c              |  24 +---
>  drivers/net/enic/enic_ethdev.c                |   2 +-
>  drivers/net/enic/enic_main.c                  |  42 +++---
>  drivers/net/fm10k/fm10k_ethdev.c              |   2 +-
>  drivers/net/hinic/hinic_pmd_ethdev.c          |  20 ++-
>  drivers/net/hns3/hns3_ethdev.c                |  42 +-----
>  drivers/net/hns3/hns3_ethdev_vf.c             |  28 +---
>  drivers/net/hns3/hns3_rxtx.c                  |  10 +-
>  drivers/net/i40e/i40e_ethdev.c                |  10 +-
>  drivers/net/i40e/i40e_rxtx.c                  |   4 +-
>  drivers/net/iavf/iavf_ethdev.c                |   9 +-
>  drivers/net/ice/ice_dcf_ethdev.c              |   5 +-
>  drivers/net/ice/ice_ethdev.c                  |  14 +-
>  drivers/net/ice/ice_rxtx.c                    |  12 +-
>  drivers/net/igc/igc_ethdev.c                  |  51 ++-----
>  drivers/net/igc/igc_ethdev.h                  |   7 +
>  drivers/net/igc/igc_txrx.c                    |  22 +--
>  drivers/net/ionic/ionic_ethdev.c              |  12 +-
>  drivers/net/ionic/ionic_rxtx.c                |   6 +-
>  drivers/net/ipn3ke/ipn3ke_representor.c       |  10 +-
>  drivers/net/ixgbe/ixgbe_ethdev.c              |  35 ++---
>  drivers/net/ixgbe/ixgbe_pf.c                  |   6 +-
>  drivers/net/ixgbe/ixgbe_rxtx.c                |  15 +-
>  drivers/net/liquidio/lio_ethdev.c             |  20 +--
>  drivers/net/mlx4/mlx4_rxq.c                   |  17 +--
>  drivers/net/mlx5/mlx5_rxq.c                   |  25 ++--
>  drivers/net/mvneta/mvneta_ethdev.c            |   7 -
>  drivers/net/mvneta/mvneta_rxtx.c              |  13 +-
>  drivers/net/mvpp2/mrvl_ethdev.c               |  34 ++---
>  drivers/net/nfp/nfp_common.c                  |   9 +-
>  drivers/net/octeontx/octeontx_ethdev.c        |  12 +-
>  drivers/net/octeontx2/otx2_ethdev.c           |   2 +-
>  drivers/net/octeontx2/otx2_ethdev_ops.c       |  11 +-
>  drivers/net/pfe/pfe_ethdev.c                  |   7 +-
>  drivers/net/qede/qede_ethdev.c                |  16 +--
>  drivers/net/qede/qede_rxtx.c                  |   8 +-
>  drivers/net/sfc/sfc_ethdev.c                  |   4 +-
>  drivers/net/sfc/sfc_port.c                    |   6 +-
>  drivers/net/tap/rte_eth_tap.c                 |   7 +-
>  drivers/net/thunderx/nicvf_ethdev.c           |  13 +-
>  drivers/net/txgbe/txgbe_ethdev.c              |   7 +-
>  drivers/net/txgbe/txgbe_ethdev.h              |   4 +
>  drivers/net/txgbe/txgbe_ethdev_vf.c           |   2 -
>  drivers/net/txgbe/txgbe_rxtx.c                |  19 +--
>  drivers/net/virtio/virtio_ethdev.c            |   9 +-
>  examples/bbdev_app/main.c                     |   1 -
>  examples/bond/main.c                          |   1 -
>  examples/distributor/main.c                   |   1 -
>  .../pipeline_worker_generic.c                 |   1 -
>  .../eventdev_pipeline/pipeline_worker_tx.c    |   1 -
>  examples/flow_classify/flow_classify.c        |  12 +-
>  examples/ioat/ioatfwd.c                       |   1 -
>  examples/ip_fragmentation/main.c              |  12 +-
>  examples/ip_pipeline/link.c                   |   2 +-
>  examples/ip_reassembly/main.c                 |  12 +-
>  examples/ipsec-secgw/ipsec-secgw.c            |   7 +-
>  examples/ipv4_multicast/main.c                |   9 +-
>  examples/kni/main.c                           |   6 +-
>  examples/l2fwd-cat/l2fwd-cat.c                |   8 +-
>  examples/l2fwd-crypto/main.c                  |   1 -
>  examples/l2fwd-event/l2fwd_common.c           |   1 -
>  examples/l3fwd-acl/main.c                     | 129 +++++++++---------
>  examples/l3fwd-graph/main.c                   |  83 +++++++----
>  examples/l3fwd-power/main.c                   |  90 +++++++-----
>  examples/l3fwd/main.c                         |  84 +++++++-----
>  .../performance-thread/l3fwd-thread/main.c    |  88 +++++++-----
>  .../performance-thread/l3fwd-thread/test.sh   |  24 ++--
>  examples/pipeline/obj.c                       |   2 +-
>  examples/ptpclient/ptpclient.c                |  10 +-
>  examples/qos_meter/main.c                     |   1 -
>  examples/qos_sched/init.c                     |   1 -
>  examples/rxtx_callbacks/main.c                |  10 +-
>  examples/skeleton/basicfwd.c                  |  12 +-
>  examples/vhost/main.c                         |   4 +-
>  examples/vm_power_manager/main.c              |  11 +-
>  lib/ethdev/rte_ethdev.c                       |  92 +++++++------
>  lib/ethdev/rte_ethdev.h                       |   2 +-
>  lib/ethdev/rte_ethdev_trace.h                 |   2 +-
>  121 files changed, 801 insertions(+), 1071 deletions(-)
>=20
> diff --git a/app/test-eventdev/test_perf_common.c b/app/test-
> eventdev/test_perf_common.c
> index cc100650c21e..660d5a0364b6 100644
> --- a/app/test-eventdev/test_perf_common.c
> +++ b/app/test-eventdev/test_perf_common.c
> @@ -669,7 +669,6 @@ perf_ethdev_setup(struct evt_test *test, struct
> evt_options *opt)
>  	struct rte_eth_conf port_conf =3D {
>  		.rxmode =3D {
>  			.mq_mode =3D ETH_MQ_RX_RSS,
> -			.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  			.split_hdr_size =3D 0,
>  		},
>  		.rx_adv_conf =3D {
> diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-
> eventdev/test_pipeline_common.c
> index 6ee530d4cdc9..5fcea74b4d43 100644
> --- a/app/test-eventdev/test_pipeline_common.c
> +++ b/app/test-eventdev/test_pipeline_common.c
> @@ -197,8 +197,9 @@ pipeline_ethdev_setup(struct evt_test *test, struct
> evt_options *opt)
>  		return -EINVAL;
>  	}
>=20
> -	port_conf.rxmode.max_rx_pkt_len =3D opt->max_pkt_sz;
> -	if (opt->max_pkt_sz > RTE_ETHER_MAX_LEN)
> +	port_conf.rxmode.mtu =3D opt->max_pkt_sz - RTE_ETHER_HDR_LEN -
> +		RTE_ETHER_CRC_LEN;
> +	if (port_conf.rxmode.mtu > RTE_ETHER_MTU)
>  		port_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
>  	t->internal_port =3D 1;
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index a9efd027c376..a677451073ae 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -1892,45 +1892,38 @@ cmd_config_max_pkt_len_parsed(void
> *parsed_result,
>  				__rte_unused void *data)
>  {
>  	struct cmd_config_max_pkt_len_result *res =3D parsed_result;
> -	uint32_t max_rx_pkt_len_backup =3D 0;
> -	portid_t pid;
> +	portid_t port_id;
>  	int ret;
>=20
> +	if (strcmp(res->name, "max-pkt-len") !=3D 0) {
> +		printf("Unknown parameter\n");
> +		return;
> +	}
> +
>  	if (!all_ports_stopped()) {
>  		fprintf(stderr, "Please stop all ports first\n");
>  		return;
>  	}
>=20
> -	RTE_ETH_FOREACH_DEV(pid) {
> -		struct rte_port *port =3D &ports[pid];
> +	RTE_ETH_FOREACH_DEV(port_id) {
> +		struct rte_port *port =3D &ports[port_id];
>=20
> -		if (!strcmp(res->name, "max-pkt-len")) {
> -			if (res->value < RTE_ETHER_MIN_LEN) {
> -				fprintf(stderr,
> -					"max-pkt-len can not be less
> than %d\n",
> -					RTE_ETHER_MIN_LEN);
> -				return;
> -			}
> -			if (res->value =3D=3D port-
> >dev_conf.rxmode.max_rx_pkt_len)
> -				return;
> -
> -			ret =3D eth_dev_info_get_print_err(pid, &port-
> >dev_info);
> -			if (ret !=3D 0) {
> -				fprintf(stderr,
> -					"rte_eth_dev_info_get() failed for
> port %u\n",
> -					pid);
> -				return;
> -			}
> -
> -			max_rx_pkt_len_backup =3D port-
> >dev_conf.rxmode.max_rx_pkt_len;
> +		if (res->value < RTE_ETHER_MIN_LEN) {
> +			fprintf(stderr,
> +				"max-pkt-len can not be less than %d\n",
> +				RTE_ETHER_MIN_LEN);
> +			return;
> +		}
>=20
> -			port->dev_conf.rxmode.max_rx_pkt_len =3D res->value;
> -			if (update_jumbo_frame_offload(pid) !=3D 0)
> -				port->dev_conf.rxmode.max_rx_pkt_len =3D
> max_rx_pkt_len_backup;
> -		} else {
> -			fprintf(stderr, "Unknown parameter\n");
> +		ret =3D eth_dev_info_get_print_err(port_id, &port->dev_info);
> +		if (ret !=3D 0) {
> +			fprintf(stderr,
> +				"rte_eth_dev_info_get() failed for port %u\n",
> +				port_id);
>  			return;
>  		}
> +
> +		update_jumbo_frame_offload(port_id, res->value);
>  	}
>=20
>  	init_port_config();
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index 9c66329e96ee..db3eeffa0093 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1147,7 +1147,6 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
>  	int diag;
>  	struct rte_port *rte_port =3D &ports[port_id];
>  	struct rte_eth_dev_info dev_info;
> -	uint16_t eth_overhead;
>  	int ret;
>=20
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> @@ -1164,21 +1163,18 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
>  		return;
>  	}
>  	diag =3D rte_eth_dev_set_mtu(port_id, mtu);
> -	if (diag)
> +	if (diag !=3D 0) {
>  		fprintf(stderr, "Set MTU failed. diag=3D%d\n", diag);
> -	else if (dev_info.rx_offload_capa &
> DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		/*
> -		 * Ether overhead in driver is equal to the difference of
> -		 * max_rx_pktlen and max_mtu in rte_eth_dev_info when
> the
> -		 * device supports jumbo frame.
> -		 */
> -		eth_overhead =3D dev_info.max_rx_pktlen - dev_info.max_mtu;
> -		if (mtu > RTE_ETHER_MTU) {
> +		return;
> +	}
> +
> +	rte_port->dev_conf.rxmode.mtu =3D mtu;
> +
> +	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> +		if (mtu > RTE_ETHER_MTU)
>  			rte_port->dev_conf.rxmode.offloads |=3D
>=20
> 	DEV_RX_OFFLOAD_JUMBO_FRAME;
> -			rte_port->dev_conf.rxmode.max_rx_pkt_len =3D
> -						mtu + eth_overhead;
> -		} else
> +		else
>  			rte_port->dev_conf.rxmode.offloads &=3D
>=20
> 	~DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	}
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index 3f94a82e321f..27eb4bc667df 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -870,7 +870,9 @@ launch_args_parse(int argc, char** argv)
>  			if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
>  				n =3D atoi(optarg);
>  				if (n >=3D RTE_ETHER_MIN_LEN)
> -					rx_mode.max_rx_pkt_len =3D (uint32_t)
> n;
> +					rx_mode.mtu =3D (uint32_t) n -
> +						(RTE_ETHER_HDR_LEN +
> +						 RTE_ETHER_CRC_LEN);
>  				else
>  					rte_exit(EXIT_FAILURE,
>  						 "Invalid max-pkt-len=3D%d -
> should be > %d\n",
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 97ae52e17ecd..8c23cfe7c3da 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -446,13 +446,7 @@ lcoreid_t latencystats_lcore_id =3D -1;
>  /*
>   * Ethernet device configuration.
>   */
> -struct rte_eth_rxmode rx_mode =3D {
> -	/* Default maximum frame length.
> -	 * Zero is converted to "RTE_ETHER_MTU + PMD Ethernet overhead"
> -	 * in init_config().
> -	 */
> -	.max_rx_pkt_len =3D 0,
> -};
> +struct rte_eth_rxmode rx_mode;
>=20
>  struct rte_eth_txmode tx_mode =3D {
>  	.offloads =3D DEV_TX_OFFLOAD_MBUF_FAST_FREE,
> @@ -1481,11 +1475,24 @@ check_nb_hairpinq(queueid_t hairpinq)
>  	return 0;
>  }
>=20
> +static int
> +get_eth_overhead(struct rte_eth_dev_info *dev_info)
> +{
> +	uint32_t eth_overhead;
> +
> +	if (dev_info->max_mtu !=3D UINT16_MAX &&
> +	    dev_info->max_rx_pktlen > dev_info->max_mtu)
> +		eth_overhead =3D dev_info->max_rx_pktlen - dev_info-
> >max_mtu;
> +	else
> +		eth_overhead =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return eth_overhead;
> +}
> +
>  static void
>  init_config_port_offloads(portid_t pid, uint32_t socket_id)
>  {
>  	struct rte_port *port =3D &ports[pid];
> -	uint16_t data_size;
>  	int ret;
>  	int i;
>=20
> @@ -1496,7 +1503,7 @@ init_config_port_offloads(portid_t pid, uint32_t
> socket_id)
>  	if (ret !=3D 0)
>  		rte_exit(EXIT_FAILURE, "rte_eth_dev_info_get() failed\n");
>=20
> -	ret =3D update_jumbo_frame_offload(pid);
> +	ret =3D update_jumbo_frame_offload(pid, 0);
>  	if (ret !=3D 0)
>  		fprintf(stderr,
>  			"Updating jumbo frame offload failed for port %u\n",
> @@ -1528,14 +1535,20 @@ init_config_port_offloads(portid_t pid, uint32_t
> socket_id)
>  	 */
>  	if (port->dev_info.rx_desc_lim.nb_mtu_seg_max !=3D UINT16_MAX &&
>  	    port->dev_info.rx_desc_lim.nb_mtu_seg_max !=3D 0) {
> -		data_size =3D rx_mode.max_rx_pkt_len /
> -			port->dev_info.rx_desc_lim.nb_mtu_seg_max;
> -
> -		if ((data_size + RTE_PKTMBUF_HEADROOM) >
> mbuf_data_size[0]) {
> -			mbuf_data_size[0] =3D data_size +
> RTE_PKTMBUF_HEADROOM;
> -			TESTPMD_LOG(WARNING,
> -				    "Configured mbuf size of the first
> segment %hu\n",
> -				    mbuf_data_size[0]);
> +		uint32_t eth_overhead =3D get_eth_overhead(&port-
> >dev_info);
> +		uint16_t mtu;
> +
> +		if (rte_eth_dev_get_mtu(pid, &mtu) =3D=3D 0) {
> +			uint16_t data_size =3D (mtu + eth_overhead) /
> +				port-
> >dev_info.rx_desc_lim.nb_mtu_seg_max;
> +			uint16_t buffer_size =3D data_size +
> RTE_PKTMBUF_HEADROOM;
> +
> +			if (buffer_size > mbuf_data_size[0]) {
> +				mbuf_data_size[0] =3D buffer_size;
> +				TESTPMD_LOG(WARNING,
> +					"Configured mbuf size of the first
> segment %hu\n",
> +					mbuf_data_size[0]);
> +			}
>  		}
>  	}
>  }
> @@ -3451,44 +3464,45 @@ rxtx_port_config(struct rte_port *port)
>=20
>  /*
>   * Helper function to arrange max_rx_pktlen value and JUMBO_FRAME
> offload,
> - * MTU is also aligned if JUMBO_FRAME offload is not set.
> + * MTU is also aligned.
>   *
>   * port->dev_info should be set before calling this function.
>   *
> + * if 'max_rx_pktlen' is zero, it is set to current device value, "MTU +
> + * ETH_OVERHEAD". This is useful to update flags but not MTU value.
> + *
>   * return 0 on success, negative on error
>   */
>  int
> -update_jumbo_frame_offload(portid_t portid)
> +update_jumbo_frame_offload(portid_t portid, uint32_t max_rx_pktlen)
>  {
>  	struct rte_port *port =3D &ports[portid];
>  	uint32_t eth_overhead;
>  	uint64_t rx_offloads;
> -	int ret;
> +	uint16_t mtu, new_mtu;
>  	bool on;
>=20
> -	/* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
> -	if (port->dev_info.max_mtu !=3D UINT16_MAX &&
> -	    port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
> -		eth_overhead =3D port->dev_info.max_rx_pktlen -
> -				port->dev_info.max_mtu;
> -	else
> -		eth_overhead =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +	eth_overhead =3D get_eth_overhead(&port->dev_info);
>=20
> -	rx_offloads =3D port->dev_conf.rxmode.offloads;
> +	if (rte_eth_dev_get_mtu(portid, &mtu) !=3D 0) {
> +		printf("Failed to get MTU for port %u\n", portid);
> +		return -1;
> +	}
> +
> +	if (max_rx_pktlen =3D=3D 0)
> +		max_rx_pktlen =3D mtu + eth_overhead;
>=20
> -	/* Default config value is 0 to use PMD specific overhead */
> -	if (port->dev_conf.rxmode.max_rx_pkt_len =3D=3D 0)
> -		port->dev_conf.rxmode.max_rx_pkt_len =3D RTE_ETHER_MTU
> + eth_overhead;
> +	rx_offloads =3D port->dev_conf.rxmode.offloads;
> +	new_mtu =3D max_rx_pktlen - eth_overhead;
>=20
> -	if (port->dev_conf.rxmode.max_rx_pkt_len <=3D RTE_ETHER_MTU +
> eth_overhead) {
> +	if (new_mtu <=3D RTE_ETHER_MTU) {
>  		rx_offloads &=3D ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		on =3D false;
>  	} else {
>  		if ((port->dev_info.rx_offload_capa &
> DEV_RX_OFFLOAD_JUMBO_FRAME) =3D=3D 0) {
>  			fprintf(stderr,
>  				"Frame size (%u) is not supported by
> port %u\n",
> -				port->dev_conf.rxmode.max_rx_pkt_len,
> -				portid);
> +				max_rx_pktlen, portid);
>  			return -1;
>  		}
>  		rx_offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
> @@ -3509,19 +3523,18 @@ update_jumbo_frame_offload(portid_t portid)
>  		}
>  	}
>=20
> -	/* If JUMBO_FRAME is set MTU conversion done by ethdev layer,
> -	 * if unset do it here
> -	 */
> -	if ((rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) =3D=3D 0) {
> -		ret =3D eth_dev_set_mtu_mp(portid,
> -				port->dev_conf.rxmode.max_rx_pkt_len -
> eth_overhead);
> -		if (ret)
> -			fprintf(stderr,
> -				"Failed to set MTU to %u for port %u\n",
> -				port->dev_conf.rxmode.max_rx_pkt_len -
> eth_overhead,
> -				portid);
> +	if (mtu =3D=3D new_mtu)
> +		return 0;
> +
> +	if (eth_dev_set_mtu_mp(portid, new_mtu) !=3D 0) {
> +		fprintf(stderr,
> +			"Failed to set MTU to %u for port %u\n",
> +			new_mtu, portid);
> +		return -1;
>  	}
>=20
> +	port->dev_conf.rxmode.mtu =3D new_mtu;
> +
>  	return 0;
>  }
>=20
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
> index 5863b2f43f3e..17562215c733 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -1022,7 +1022,7 @@ uint16_t tx_pkt_set_dynf(uint16_t port_id,
> __rte_unused uint16_t queue,
>  			 __rte_unused void *user_param);
>  void add_tx_dynf_callback(portid_t portid);
>  void remove_tx_dynf_callback(portid_t portid);
> -int update_jumbo_frame_offload(portid_t portid);
> +int update_jumbo_frame_offload(portid_t portid, uint32_t max_rx_pktlen);
>=20
>  /*
>   * Work-around of a compilation error with ICC on invocations of the
> diff --git a/app/test/test_link_bonding.c b/app/test/test_link_bonding.c
> index 8a5c8310a8b4..5388d18125a6 100644
> --- a/app/test/test_link_bonding.c
> +++ b/app/test/test_link_bonding.c
> @@ -136,7 +136,6 @@ static struct rte_eth_conf default_pmd_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
>  		.split_hdr_size =3D 0,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  	},
>  	.txmode =3D {
>  		.mq_mode =3D ETH_MQ_TX_NONE,
> diff --git a/app/test/test_link_bonding_mode4.c
> b/app/test/test_link_bonding_mode4.c
> index 2c835fa7adc7..3e9254fe896d 100644
> --- a/app/test/test_link_bonding_mode4.c
> +++ b/app/test/test_link_bonding_mode4.c
> @@ -108,7 +108,6 @@ static struct link_bonding_unittest_params
> test_params  =3D {
>  static struct rte_eth_conf default_pmd_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> diff --git a/app/test/test_link_bonding_rssconf.c
> b/app/test/test_link_bonding_rssconf.c
> index 5dac60ca1edd..e7bb0497b663 100644
> --- a/app/test/test_link_bonding_rssconf.c
> +++ b/app/test/test_link_bonding_rssconf.c
> @@ -81,7 +81,6 @@ static struct link_bonding_rssconf_unittest_params
> test_params  =3D {
>  static struct rte_eth_conf default_pmd_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> @@ -93,7 +92,6 @@ static struct rte_eth_conf default_pmd_conf =3D {
>  static struct rte_eth_conf rss_pmd_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> diff --git a/app/test/test_pmd_perf.c b/app/test/test_pmd_perf.c
> index 3a248d512c4a..a3b4f52c65e6 100644
> --- a/app/test/test_pmd_perf.c
> +++ b/app/test/test_pmd_perf.c
> @@ -63,7 +63,6 @@ static struct rte_ether_addr
> ports_eth_addr[RTE_MAX_ETHPORTS];
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> diff --git a/doc/guides/nics/dpaa.rst b/doc/guides/nics/dpaa.rst
> index 7355ec305916..9dad612058c6 100644
> --- a/doc/guides/nics/dpaa.rst
> +++ b/doc/guides/nics/dpaa.rst
> @@ -335,7 +335,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
>=20
>  The DPAA SoC family support a maximum of a 10240 jumbo frame. The
> value
> -is fixed and cannot be changed. So, even when the
> ``rxmode.max_rx_pkt_len``
> +is fixed and cannot be changed. So, even when the ``rxmode.mtu``
>  member of ``struct rte_eth_conf`` is set to a value lower than 10240, fr=
ames
>  up to 10240 bytes can still reach the host interface.
>=20
> diff --git a/doc/guides/nics/dpaa2.rst b/doc/guides/nics/dpaa2.rst
> index df23a5704dca..831bc564883a 100644
> --- a/doc/guides/nics/dpaa2.rst
> +++ b/doc/guides/nics/dpaa2.rst
> @@ -545,7 +545,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
>=20
>  The DPAA2 SoC family support a maximum of a 10240 jumbo frame. The
> value
> -is fixed and cannot be changed. So, even when the
> ``rxmode.max_rx_pkt_len``
> +is fixed and cannot be changed. So, even when the ``rxmode.mtu``
>  member of ``struct rte_eth_conf`` is set to a value lower than 10240, fr=
ames
>  up to 10240 bytes can still reach the host interface.
>=20
> diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
> index 4fce8cd1c976..483cb7da576f 100644
> --- a/doc/guides/nics/features.rst
> +++ b/doc/guides/nics/features.rst
> @@ -166,7 +166,7 @@ Jumbo frame
>  Supports Rx jumbo frames.
>=20
>  * **[uses]    rte_eth_rxconf,rte_eth_rxmode**:
> ``offloads:DEV_RX_OFFLOAD_JUMBO_FRAME``.
> -  ``dev_conf.rxmode.max_rx_pkt_len``.
> +  ``dev_conf.rxmode.mtu``.
>  * **[related] rte_eth_dev_info**: ``max_rx_pktlen``.
>  * **[related] API**: ``rte_eth_dev_set_mtu()``.
>=20
> diff --git a/doc/guides/nics/fm10k.rst b/doc/guides/nics/fm10k.rst
> index 7b8ef0e7823d..ed6afd62703d 100644
> --- a/doc/guides/nics/fm10k.rst
> +++ b/doc/guides/nics/fm10k.rst
> @@ -141,7 +141,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
>=20
>  The FM10000 family of NICS support a maximum of a 15K jumbo frame. The
> value
> -is fixed and cannot be changed. So, even when the
> ``rxmode.max_rx_pkt_len``
> +is fixed and cannot be changed. So, even when the ``rxmode.mtu``
>  member of ``struct rte_eth_conf`` is set to a value lower than 15364, fr=
ames
>  up to 15364 bytes can still reach the host interface.
>=20
> diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
> index bae73f42d882..1f5619ed53fc 100644
> --- a/doc/guides/nics/mlx5.rst
> +++ b/doc/guides/nics/mlx5.rst
> @@ -606,9 +606,9 @@ Driver options
>    and each stride receives one packet. MPRQ can improve throughput for
>    small-packet traffic.
>=20
> -  When MPRQ is enabled, max_rx_pkt_len can be larger than the size of
> +  When MPRQ is enabled, MTU can be larger than the size of
>    user-provided mbuf even if DEV_RX_OFFLOAD_SCATTER isn't enabled.
> PMD will
> -  configure large stride size enough to accommodate max_rx_pkt_len as lo=
ng
> as
> +  configure large stride size enough to accommodate MTU as long as
>    device allows. Note that this can waste system memory compared to
> enabling Rx
>    scatter and multi-segment packet.
>=20
> diff --git a/doc/guides/nics/octeontx.rst b/doc/guides/nics/octeontx.rst
> index b1a868b054d1..8236cc3e93e0 100644
> --- a/doc/guides/nics/octeontx.rst
> +++ b/doc/guides/nics/octeontx.rst
> @@ -157,7 +157,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
>=20
>  The OCTEON TX SoC family NICs support a maximum of a 32K jumbo frame.
> The value
> -is fixed and cannot be changed. So, even when the
> ``rxmode.max_rx_pkt_len``
> +is fixed and cannot be changed. So, even when the ``rxmode.mtu``
>  member of ``struct rte_eth_conf`` is set to a value lower than 32k, fram=
es
>  up to 32k bytes can still reach the host interface.
>=20
> diff --git a/doc/guides/nics/thunderx.rst b/doc/guides/nics/thunderx.rst
> index 12d43ce93e28..98f23a2b2a3d 100644
> --- a/doc/guides/nics/thunderx.rst
> +++ b/doc/guides/nics/thunderx.rst
> @@ -392,7 +392,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
>=20
>  The ThunderX SoC family NICs support a maximum of a 9K jumbo frame. The
> value
> -is fixed and cannot be changed. So, even when the
> ``rxmode.max_rx_pkt_len``
> +is fixed and cannot be changed. So, even when the ``rxmode.mtu``
>  member of ``struct rte_eth_conf`` is set to a value lower than 9200, fra=
mes
>  up to 9200 bytes can still reach the host interface.
>=20
> diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> index a2fe766d4b4f..1063a1fe4bea 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -81,31 +81,6 @@ Deprecation Notices
>    In 19.11 PMDs will still update the field even when the offload is not
>    enabled.
>=20
> -* ethdev: ``uint32_t max_rx_pkt_len`` field of ``struct rte_eth_rxmode``=
, will
> be
> -  replaced by a new ``uint32_t mtu`` field of ``struct rte_eth_conf`` in=
 v21.11.
> -  The new ``mtu`` field will be used to configure the initial device MTU=
 via
> -  ``rte_eth_dev_configure()`` API.
> -  Later MTU can be changed by ``rte_eth_dev_set_mtu()`` API as done now.
> -  The existing ``(struct rte_eth_dev)->data->mtu`` variable will be used=
 to
> store
> -  the configured ``mtu`` value,
> -  and this new ``(struct rte_eth_dev)->data->dev_conf.mtu`` variable wil=
l
> -  be used to store the user configuration request.
> -  Unlike ``max_rx_pkt_len``, which was valid only when ``JUMBO_FRAME``
> enabled,
> -  ``mtu`` field will be always valid.
> -  When ``mtu`` config is not provided by the application, default
> ``RTE_ETHER_MTU``
> -  value will be used.
> -  ``(struct rte_eth_dev)->data->mtu`` should be updated after MTU set
> successfully,
> -  either by ``rte_eth_dev_configure()`` or ``rte_eth_dev_set_mtu()``.
> -
> -  An application may need to configure device for a specific Rx packet s=
ize,
> like for
> -  cases ``DEV_RX_OFFLOAD_SCATTER`` is not supported and device received
> packet size
> -  can't be bigger than Rx buffer size.
> -  To cover these cases an application needs to know the device packet
> overhead to be
> -  able to calculate the ``mtu`` corresponding to a Rx buffer size, for t=
his
> -  ``(struct rte_eth_dev_info).max_rx_pktlen`` will be kept,
> -  the device packet overhead can be calculated as:
> -  ``(struct rte_eth_dev_info).max_rx_pktlen - (struct
> rte_eth_dev_info).max_mtu``
> -
>  * ethdev: ``rx_descriptor_done`` dev_ops and
> ``rte_eth_rx_descriptor_done``
>    will be removed in 21.11.
>    Existing ``rte_eth_rx_descriptor_status`` and
> ``rte_eth_tx_descriptor_status``
> diff --git a/doc/guides/sample_app_ug/flow_classify.rst
> b/doc/guides/sample_app_ug/flow_classify.rst
> index 812aaa87b05b..6c4c04e935e4 100644
> --- a/doc/guides/sample_app_ug/flow_classify.rst
> +++ b/doc/guides/sample_app_ug/flow_classify.rst
> @@ -162,12 +162,7 @@ Forwarding application is shown below:
>      :end-before: >8 End of initializing a given port.
>=20
>  The Ethernet ports are configured with default settings using the
> -``rte_eth_dev_configure()`` function and the ``port_conf_default`` struc=
t.
> -
> -.. literalinclude:: ../../../examples/flow_classify/flow_classify.c
> -    :language: c
> -    :start-after: Ethernet ports configured with default settings using =
struct. 8<
> -    :end-before: >8 End of configuration of Ethernet ports.
> +``rte_eth_dev_configure()`` function.
>=20
>  For this example the ports are set up with 1 RX and 1 TX queue using the
>  ``rte_eth_rx_queue_setup()`` and ``rte_eth_tx_queue_setup()`` functions.
> diff --git a/doc/guides/sample_app_ug/l3_forward.rst
> b/doc/guides/sample_app_ug/l3_forward.rst
> index 2d5cd5f1c0ba..56af5cd5b383 100644
> --- a/doc/guides/sample_app_ug/l3_forward.rst
> +++ b/doc/guides/sample_app_ug/l3_forward.rst
> @@ -65,7 +65,7 @@ The application has a number of command line
> options::
>                               [--lookup LOOKUP_METHOD]
>                               --config(port,queue,lcore)[,(port,queue,lco=
re)]
>                               [--eth-dest=3DX,MM:MM:MM:MM:MM:MM]
> -                             [--enable-jumbo [--max-pkt-len PKTLEN]]
> +                             [--max-pkt-len PKTLEN]
>                               [--no-numa]
>                               [--hash-entry-num]
>                               [--ipv6]
> @@ -95,9 +95,7 @@ Where,
>=20
>  * ``--eth-dest=3DX,MM:MM:MM:MM:MM:MM:`` Optional, ethernet
> destination for port X.
>=20
> -* ``--enable-jumbo:`` Optional, enables jumbo frames.
> -
> -* ``--max-pkt-len:`` Optional, under the premise of enabling jumbo,
> maximum packet length in decimal (64-9600).
> +* ``--max-pkt-len:`` Optional, maximum packet length in decimal (64-9600=
).
>=20
>  * ``--no-numa:`` Optional, disables numa awareness.
>=20
> diff --git a/doc/guides/sample_app_ug/l3_forward_access_ctrl.rst
> b/doc/guides/sample_app_ug/l3_forward_access_ctrl.rst
> index 2cf6e4556f14..486247ac2e4f 100644
> --- a/doc/guides/sample_app_ug/l3_forward_access_ctrl.rst
> +++ b/doc/guides/sample_app_ug/l3_forward_access_ctrl.rst
> @@ -236,7 +236,7 @@ The application has a number of command line
> options:
>=20
>  ..  code-block:: console
>=20
> -    ./<build_dir>/examples/dpdk-l3fwd-acl [EAL options] -- -p PORTMASK [=
-P]
> --config(port,queue,lcore)[,(port,queue,lcore)] --rule_ipv4 FILENAME --
> rule_ipv6 FILENAME [--alg=3D<val>] [--enable-jumbo [--max-pkt-len PKTLEN]=
] [--
> no-numa] [--eth-dest=3DX,MM:MM:MM:MM:MM:MM]
> +    ./<build_dir>/examples/dpdk-l3fwd-acl [EAL options] -- -p PORTMASK [=
-P]
> --config(port,queue,lcore)[,(port,queue,lcore)] --rule_ipv4 FILENAME --
> rule_ipv6 FILENAME [--alg=3D<val>] [--max-pkt-len PKTLEN] [--no-numa] [--=
eth-
> dest=3DX,MM:MM:MM:MM:MM:MM]
>=20
>=20
>  where,
> @@ -255,8 +255,6 @@ where,
>  *   --alg=3D<val>: optional, ACL classify method to use, one of:
>      ``scalar|sse|avx2|neon|altivec|avx512x16|avx512x32``
>=20
> -*   --enable-jumbo: optional, enables jumbo frames
> -
>  *   --max-pkt-len: optional, maximum packet length in decimal (64-9600)
>=20
>  *   --no-numa: optional, disables numa awareness
> diff --git a/doc/guides/sample_app_ug/l3_forward_graph.rst
> b/doc/guides/sample_app_ug/l3_forward_graph.rst
> index 03e9a85aa68c..0a3e0d44ecea 100644
> --- a/doc/guides/sample_app_ug/l3_forward_graph.rst
> +++ b/doc/guides/sample_app_ug/l3_forward_graph.rst
> @@ -48,7 +48,7 @@ The application has a number of command line options
> similar to l3fwd::
>                                     [-P]
>                                     --config(port,queue,lcore)[,(port,que=
ue,lcore)]
>                                     [--eth-dest=3DX,MM:MM:MM:MM:MM:MM]
> -                                   [--enable-jumbo [--max-pkt-len PKTLEN=
]]
> +                                   [--max-pkt-len PKTLEN]
>                                     [--no-numa]
>                                     [--per-port-pool]
>=20
> @@ -63,9 +63,7 @@ Where,
>=20
>  * ``--eth-dest=3DX,MM:MM:MM:MM:MM:MM:`` Optional, ethernet
> destination for port X.
>=20
> -* ``--enable-jumbo:`` Optional, enables jumbo frames.
> -
> -* ``--max-pkt-len:`` Optional, under the premise of enabling jumbo,
> maximum packet length in decimal (64-9600).
> +* ``--max-pkt-len:`` Optional, maximum packet length in decimal (64-9600=
).
>=20
>  * ``--no-numa:`` Optional, disables numa awareness.
>=20
> diff --git a/doc/guides/sample_app_ug/l3_forward_power_man.rst
> b/doc/guides/sample_app_ug/l3_forward_power_man.rst
> index 0495314c87d5..8817eaadbfc3 100644
> --- a/doc/guides/sample_app_ug/l3_forward_power_man.rst
> +++ b/doc/guides/sample_app_ug/l3_forward_power_man.rst
> @@ -88,7 +88,7 @@ The application has a number of command line options:
>=20
>  .. code-block:: console
>=20
> -    ./<build_dir>/examples/dpdk-l3fwd_power [EAL options] -- -p PORTMASK
> [-P]  --config(port,queue,lcore)[,(port,queue,lcore)] [--enable-jumbo [--=
max-
> pkt-len PKTLEN]] [--no-numa]
> +    ./<build_dir>/examples/dpdk-l3fwd_power [EAL options] -- -p PORTMASK
> [-P]  --config(port,queue,lcore)[,(port,queue,lcore)] [--max-pkt-len PKTL=
EN] [-
> -no-numa]
>=20
>  where,
>=20
> @@ -99,8 +99,6 @@ where,
>=20
>  *   --config (port,queue,lcore)[,(port,queue,lcore)]: determines which
> queues from which ports are mapped to which cores.
>=20
> -*   --enable-jumbo: optional, enables jumbo frames
> -
>  *   --max-pkt-len: optional, maximum packet length in decimal (64-9600)
>=20
>  *   --no-numa: optional, disables numa awareness
> diff --git a/doc/guides/sample_app_ug/performance_thread.rst
> b/doc/guides/sample_app_ug/performance_thread.rst
> index 9b09838f6448..7d1bf6eaae8c 100644
> --- a/doc/guides/sample_app_ug/performance_thread.rst
> +++ b/doc/guides/sample_app_ug/performance_thread.rst
> @@ -59,7 +59,7 @@ The application has a number of command line
> options::
>          -p PORTMASK [-P]
>          --rx(port,queue,lcore,thread)[,(port,queue,lcore,thread)]
>          --tx(lcore,thread)[,(lcore,thread)]
> -        [--enable-jumbo] [--max-pkt-len PKTLEN]]  [--no-numa]
> +        [--max-pkt-len PKTLEN]  [--no-numa]
>          [--hash-entry-num] [--ipv6] [--no-lthreads] [--stat-lcore lcore]
>          [--parse-ptype]
>=20
> @@ -80,8 +80,6 @@ Where:
>    the lcore the thread runs on, and the id of RX thread with which it is
>    associated. The parameters are explained below.
>=20
> -* ``--enable-jumbo``: optional, enables jumbo frames.
> -
>  * ``--max-pkt-len``: optional, maximum packet length in decimal (64-9600=
).
>=20
>  * ``--no-numa``: optional, disables numa awareness.
> diff --git a/doc/guides/sample_app_ug/skeleton.rst
> b/doc/guides/sample_app_ug/skeleton.rst
> index f7bcd7ed2a1d..6d0de6440105 100644
> --- a/doc/guides/sample_app_ug/skeleton.rst
> +++ b/doc/guides/sample_app_ug/skeleton.rst
> @@ -106,12 +106,7 @@ Forwarding application is shown below:
>      :end-before: >8 End of main functional part of port initialization.
>=20
>  The Ethernet ports are configured with default settings using the
> -``rte_eth_dev_configure()`` function and the ``port_conf_default`` struc=
t:
> -
> -.. literalinclude:: ../../../examples/skeleton/basicfwd.c
> -        :language: c
> -        :start-after: Configuration of ethernet ports. 8<
> -        :end-before: >8 End of configuration of ethernet ports.
> +``rte_eth_dev_configure()`` function.
>=20
>  For this example the ports are set up with 1 RX and 1 TX queue using the
>  ``rte_eth_rx_queue_setup()`` and ``rte_eth_tx_queue_setup()`` functions.
> diff --git a/drivers/net/atlantic/atl_ethdev.c
> b/drivers/net/atlantic/atl_ethdev.c
> index 0ce35eb519e2..3f654c071566 100644
> --- a/drivers/net/atlantic/atl_ethdev.c
> +++ b/drivers/net/atlantic/atl_ethdev.c
> @@ -1636,9 +1636,6 @@ atl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  	if (mtu < RTE_ETHER_MIN_MTU || frame_size >
> dev_info.max_rx_pktlen)
>  		return -EINVAL;
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	return 0;
>  }
>=20
> diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
> index 623fa5e5ff5b..0feacc822433 100644
> --- a/drivers/net/avp/avp_ethdev.c
> +++ b/drivers/net/avp/avp_ethdev.c
> @@ -1059,17 +1059,18 @@ static int
>  avp_dev_enable_scattered(struct rte_eth_dev *eth_dev,
>  			 struct avp_dev *avp)
>  {
> -	unsigned int max_rx_pkt_len;
> +	unsigned int max_rx_pktlen;
>=20
> -	max_rx_pkt_len =3D eth_dev->data->dev_conf.rxmode.max_rx_pkt_len;
> +	max_rx_pktlen =3D eth_dev->data->mtu + RTE_ETHER_HDR_LEN +
> +		RTE_ETHER_CRC_LEN;
>=20
> -	if ((max_rx_pkt_len > avp->guest_mbuf_size) ||
> -	    (max_rx_pkt_len > avp->host_mbuf_size)) {
> +	if (max_rx_pktlen > avp->guest_mbuf_size ||
> +	    max_rx_pktlen > avp->host_mbuf_size) {
>  		/*
>  		 * If the guest MTU is greater than either the host or guest
>  		 * buffers then chained mbufs have to be enabled in the TX
>  		 * direction.  It is assumed that the application will not need
> -		 * to send packets larger than their max_rx_pkt_len (MRU).
> +		 * to send packets larger than their MTU.
>  		 */
>  		return 1;
>  	}
> @@ -1124,7 +1125,7 @@ avp_dev_rx_queue_setup(struct rte_eth_dev
> *eth_dev,
>=20
>  	PMD_DRV_LOG(DEBUG, "AVP max_rx_pkt_len=3D(%u,%u)
> mbuf_size=3D(%u,%u)\n",
>  		    avp->max_rx_pkt_len,
> -		    eth_dev->data->dev_conf.rxmode.max_rx_pkt_len,
> +		    eth_dev->data->mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN,
>  		    avp->host_mbuf_size,
>  		    avp->guest_mbuf_size);
>=20
> @@ -1889,8 +1890,8 @@ avp_xmit_pkts(void *tx_queue, struct rte_mbuf
> **tx_pkts, uint16_t nb_pkts)
>  			 * function; send it truncated to avoid the
> performance
>  			 * hit of having to manage returning the already
>  			 * allocated buffer to the free list.  This should not
> -			 * happen since the application should have set the
> -			 * max_rx_pkt_len based on its MTU and it should be
> +			 * happen since the application should have not send
> +			 * packages larger than its MTU and it should be
>  			 * policing its own packet sizes.
>  			 */
>  			txq->errors++;
> diff --git a/drivers/net/axgbe/axgbe_ethdev.c
> b/drivers/net/axgbe/axgbe_ethdev.c
> index 9cb4818af11f..76aeec077f2b 100644
> --- a/drivers/net/axgbe/axgbe_ethdev.c
> +++ b/drivers/net/axgbe/axgbe_ethdev.c
> @@ -350,7 +350,7 @@ axgbe_dev_start(struct rte_eth_dev *dev)
>  	struct axgbe_port *pdata =3D dev->data->dev_private;
>  	int ret;
>  	struct rte_eth_dev_data *dev_data =3D dev->data;
> -	uint16_t max_pkt_len =3D dev_data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	uint16_t max_pkt_len;
>=20
>  	dev->dev_ops =3D &axgbe_eth_dev_ops;
>=20
> @@ -383,6 +383,8 @@ axgbe_dev_start(struct rte_eth_dev *dev)
>=20
>  	rte_bit_relaxed_clear32(AXGBE_STOPPED, &pdata->dev_state);
>  	rte_bit_relaxed_clear32(AXGBE_DOWN, &pdata->dev_state);
> +
> +	max_pkt_len =3D dev_data->mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
>  	if ((dev_data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_SCATTER) ||
>  				max_pkt_len > pdata->rx_buf_size)
>  		dev_data->scattered_rx =3D 1;
> @@ -1490,7 +1492,7 @@ static int axgb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  				dev->data->port_id);
>  		return -EBUSY;
>  	}
> -	if (frame_size > AXGBE_ETH_MAX_LEN) {
> +	if (mtu > RTE_ETHER_MTU) {
>  		dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		val =3D 1;
> @@ -1500,7 +1502,6 @@ static int axgb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		val =3D 0;
>  	}
>  	AXGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
>  	return 0;
>  }
>=20
> diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c
> b/drivers/net/bnx2x/bnx2x_ethdev.c
> index 463886f17a58..009a94e9a8fa 100644
> --- a/drivers/net/bnx2x/bnx2x_ethdev.c
> +++ b/drivers/net/bnx2x/bnx2x_ethdev.c
> @@ -175,16 +175,12 @@ static int
>  bnx2x_dev_configure(struct rte_eth_dev *dev)
>  {
>  	struct bnx2x_softc *sc =3D dev->data->dev_private;
> -	struct rte_eth_rxmode *rxmode =3D &dev->data->dev_conf.rxmode;
>=20
>  	int mp_ncpus =3D sysconf(_SC_NPROCESSORS_CONF);
>=20
>  	PMD_INIT_FUNC_TRACE(sc);
>=20
> -	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		sc->mtu =3D dev->data->dev_conf.rxmode.max_rx_pkt_len;
> -		dev->data->mtu =3D sc->mtu;
> -	}
> +	sc->mtu =3D dev->data->dev_conf.rxmode.mtu;
>=20
>  	if (dev->data->nb_tx_queues > dev->data->nb_rx_queues) {
>  		PMD_DRV_LOG(ERR, sc, "The number of TX queues is greater
> than number of RX queues");
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethde=
v.c
> index aa7e7fdc85fa..8c6f20b75aed 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -1157,13 +1157,8 @@ static int bnxt_dev_configure_op(struct
> rte_eth_dev *eth_dev)
>  		rx_offloads |=3D DEV_RX_OFFLOAD_RSS_HASH;
>  	eth_dev->data->dev_conf.rxmode.offloads =3D rx_offloads;
>=20
> -	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		eth_dev->data->mtu =3D
> -			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
> -			RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN -
> VLAN_TAG_SIZE *
> -			BNXT_NUM_VLANS;
> -		bnxt_mtu_set_op(eth_dev, eth_dev->data->mtu);
> -	}
> +	bnxt_mtu_set_op(eth_dev, eth_dev->data->mtu);
> +
>  	return 0;
>=20
>  resource_error:
> @@ -1201,6 +1196,7 @@ void bnxt_print_link_info(struct rte_eth_dev
> *eth_dev)
>   */
>  static int bnxt_scattered_rx(struct rte_eth_dev *eth_dev)
>  {
> +	uint32_t overhead =3D BNXT_MAX_PKT_LEN - BNXT_MAX_MTU;
>  	uint16_t buf_size;
>  	int i;
>=20
> @@ -1215,7 +1211,7 @@ static int bnxt_scattered_rx(struct rte_eth_dev
> *eth_dev)
>=20
>  		buf_size =3D (uint16_t)(rte_pktmbuf_data_room_size(rxq-
> >mb_pool) -
>  				      RTE_PKTMBUF_HEADROOM);
> -		if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len >
> buf_size)
> +		if (eth_dev->data->mtu + overhead > buf_size)
>  			return 1;
>  	}
>  	return 0;
> @@ -3026,6 +3022,7 @@ bnxt_tx_burst_mode_get(struct rte_eth_dev *dev,
> __rte_unused uint16_t queue_id,
>=20
>  int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
>  {
> +	uint32_t overhead =3D BNXT_MAX_PKT_LEN - BNXT_MAX_MTU;
>  	struct bnxt *bp =3D eth_dev->data->dev_private;
>  	uint32_t new_pkt_size;
>  	uint32_t rc =3D 0;
> @@ -3039,8 +3036,7 @@ int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev,
> uint16_t new_mtu)
>  	if (!eth_dev->data->nb_rx_queues)
>  		return rc;
>=20
> -	new_pkt_size =3D new_mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN +
> -		       VLAN_TAG_SIZE * BNXT_NUM_VLANS;
> +	new_pkt_size =3D new_mtu + overhead;
>=20
>  	/*
>  	 * Disallow any MTU change that would require scattered receive
> support
> @@ -3067,7 +3063,7 @@ int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev,
> uint16_t new_mtu)
>  	}
>=20
>  	/* Is there a change in mtu setting? */
> -	if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =3D=3D
> new_pkt_size)
> +	if (eth_dev->data->mtu =3D=3D new_mtu)
>  		return rc;
>=20
>  	for (i =3D 0; i < bp->nr_vnics; i++) {
> @@ -3089,9 +3085,6 @@ int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev,
> uint16_t new_mtu)
>  		}
>  	}
>=20
> -	if (!rc)
> -		eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =3D
> new_pkt_size;
> -
>  	if (bnxt_hwrm_config_host_mtu(bp))
>  		PMD_DRV_LOG(WARNING, "Failed to configure host
> MTU\n");
>=20
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c
> b/drivers/net/bonding/rte_eth_bond_pmd.c
> index 54987d96b34d..412acff42f65 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -1724,8 +1724,8 @@ slave_configure(struct rte_eth_dev
> *bonded_eth_dev,
>  		slave_eth_dev->data->dev_conf.rxmode.offloads &=3D
>  				~DEV_RX_OFFLOAD_VLAN_FILTER;
>=20
> -	slave_eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =3D
> -			bonded_eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	slave_eth_dev->data->dev_conf.rxmode.mtu =3D
> +			bonded_eth_dev->data->dev_conf.rxmode.mtu;
>=20
>  	if (bonded_eth_dev->data->dev_conf.rxmode.offloads &
>  			DEV_RX_OFFLOAD_JUMBO_FRAME)
> diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethde=
v.c
> index 8629193d5049..8d0677cd89d9 100644
> --- a/drivers/net/cnxk/cnxk_ethdev.c
> +++ b/drivers/net/cnxk/cnxk_ethdev.c
> @@ -53,7 +53,7 @@ nix_enable_mseg_on_jumbo(struct cnxk_eth_rxq_sp
> *rxq)
>  	mbp_priv =3D rte_mempool_get_priv(rxq->qconf.mp);
>  	buffsz =3D mbp_priv->mbuf_data_room_size -
> RTE_PKTMBUF_HEADROOM;
>=20
> -	if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len > buffsz) {
> +	if (eth_dev->data->mtu + (uint32_t)CNXK_NIX_L2_OVERHEAD >
> buffsz) {
>  		dev->rx_offloads |=3D DEV_RX_OFFLOAD_SCATTER;
>  		dev->tx_offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
>  	}
> @@ -64,18 +64,13 @@ nix_recalc_mtu(struct rte_eth_dev *eth_dev)
>  {
>  	struct rte_eth_dev_data *data =3D eth_dev->data;
>  	struct cnxk_eth_rxq_sp *rxq;
> -	uint16_t mtu;
>  	int rc;
>=20
>  	rxq =3D ((struct cnxk_eth_rxq_sp *)data->rx_queues[0]) - 1;
>  	/* Setup scatter mode if needed by jumbo */
>  	nix_enable_mseg_on_jumbo(rxq);
>=20
> -	/* Setup MTU based on max_rx_pkt_len */
> -	mtu =3D data->dev_conf.rxmode.max_rx_pkt_len -
> CNXK_NIX_L2_OVERHEAD +
> -				CNXK_NIX_MAX_VTAG_ACT_SIZE;
> -
> -	rc =3D cnxk_nix_mtu_set(eth_dev, mtu);
> +	rc =3D cnxk_nix_mtu_set(eth_dev, data->mtu);
>  	if (rc)
>  		plt_err("Failed to set default MTU size, rc=3D%d", rc);
>=20
> diff --git a/drivers/net/cnxk/cnxk_ethdev_ops.c
> b/drivers/net/cnxk/cnxk_ethdev_ops.c
> index b6cc5286c6d0..695d0d6fd3e2 100644
> --- a/drivers/net/cnxk/cnxk_ethdev_ops.c
> +++ b/drivers/net/cnxk/cnxk_ethdev_ops.c
> @@ -440,16 +440,10 @@ cnxk_nix_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  		goto exit;
>  	}
>=20
> -	frame_size +=3D RTE_ETHER_CRC_LEN;
> -
> -	if (frame_size > RTE_ETHER_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->rx_offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->rx_offloads &=3D ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
> -	/* Update max_rx_pkt_len */
> -	data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  exit:
>  	return rc;
>  }
> diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c
> b/drivers/net/cxgbe/cxgbe_ethdev.c
> index 177eca397600..8cf61f12a8d6 100644
> --- a/drivers/net/cxgbe/cxgbe_ethdev.c
> +++ b/drivers/net/cxgbe/cxgbe_ethdev.c
> @@ -310,11 +310,11 @@ int cxgbe_dev_mtu_set(struct rte_eth_dev
> *eth_dev, uint16_t mtu)
>  		return err;
>=20
>  	/* Must accommodate at least RTE_ETHER_MIN_MTU */
> -	if (new_mtu < RTE_ETHER_MIN_MTU || new_mtu >
> dev_info.max_rx_pktlen)
> +	if (mtu < RTE_ETHER_MIN_MTU || new_mtu >
> dev_info.max_rx_pktlen)
>  		return -EINVAL;
>=20
>  	/* set to jumbo mode if needed */
> -	if (new_mtu > CXGBE_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		eth_dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
> @@ -323,9 +323,6 @@ int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>=20
>  	err =3D t4_set_rxmode(adapter, adapter->mbox, pi->viid, new_mtu, -1,
> -1,
>  			    -1, -1, true);
> -	if (!err)
> -		eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =3D
> new_mtu;
> -
>  	return err;
>  }
>=20
> @@ -623,7 +620,8 @@ int cxgbe_dev_rx_queue_setup(struct rte_eth_dev
> *eth_dev,
>  			     const struct rte_eth_rxconf *rx_conf __rte_unused,
>  			     struct rte_mempool *mp)
>  {
> -	unsigned int pkt_len =3D eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	unsigned int pkt_len =3D eth_dev->data->mtu + RTE_ETHER_HDR_LEN +
> +		RTE_ETHER_CRC_LEN;
>  	struct port_info *pi =3D eth_dev->data->dev_private;
>  	struct adapter *adapter =3D pi->adapter;
>  	struct rte_eth_dev_info dev_info;
> @@ -683,7 +681,7 @@ int cxgbe_dev_rx_queue_setup(struct rte_eth_dev
> *eth_dev,
>  		rxq->fl.size =3D temp_nb_desc;
>=20
>  	/* Set to jumbo mode if necessary */
> -	if (pkt_len > CXGBE_ETH_MAX_LEN)
> +	if (eth_dev->data->mtu > RTE_ETHER_MTU)
>  		eth_dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
> diff --git a/drivers/net/cxgbe/cxgbe_main.c
> b/drivers/net/cxgbe/cxgbe_main.c
> index 6dd1bf1f836e..91d6bb9bbcb0 100644
> --- a/drivers/net/cxgbe/cxgbe_main.c
> +++ b/drivers/net/cxgbe/cxgbe_main.c
> @@ -1661,8 +1661,7 @@ int cxgbe_link_start(struct port_info *pi)
>  	unsigned int mtu;
>  	int ret;
>=20
> -	mtu =3D pi->eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
> -	      (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN);
> +	mtu =3D pi->eth_dev->data->mtu;
>=20
>  	conf_offloads =3D pi->eth_dev->data->dev_conf.rxmode.offloads;
>=20
> diff --git a/drivers/net/cxgbe/sge.c b/drivers/net/cxgbe/sge.c
> index e5f7721dc4b3..830f5192474d 100644
> --- a/drivers/net/cxgbe/sge.c
> +++ b/drivers/net/cxgbe/sge.c
> @@ -1113,7 +1113,7 @@ int t4_eth_xmit(struct sge_eth_txq *txq, struct
> rte_mbuf *mbuf,
>  	u32 wr_mid;
>  	u64 cntrl, *end;
>  	bool v6;
> -	u32 max_pkt_len =3D txq->data->dev_conf.rxmode.max_rx_pkt_len;
> +	u32 max_pkt_len;
>=20
>  	/* Reject xmit if queue is stopped */
>  	if (unlikely(txq->flags & EQ_STOPPED))
> @@ -1129,6 +1129,7 @@ int t4_eth_xmit(struct sge_eth_txq *txq, struct
> rte_mbuf *mbuf,
>  		return 0;
>  	}
>=20
> +	max_pkt_len =3D txq->data->mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
>  	if ((!(m->ol_flags & PKT_TX_TCP_SEG)) &&
>  	    (unlikely(m->pkt_len > max_pkt_len)))
>  		goto out_free;
> diff --git a/drivers/net/dpaa/dpaa_ethdev.c
> b/drivers/net/dpaa/dpaa_ethdev.c
> index 36d8f9249df1..adbdb87baab9 100644
> --- a/drivers/net/dpaa/dpaa_ethdev.c
> +++ b/drivers/net/dpaa/dpaa_ethdev.c
> @@ -187,15 +187,13 @@ dpaa_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EINVAL;
>  	}
>=20
> -	if (frame_size > DPAA_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads |=3D
>=20
> 	DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
>=20
> 	~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	fman_if_set_maxfrm(dev->process_private, frame_size);
>=20
>  	return 0;
> @@ -213,6 +211,7 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
>  	struct fman_if *fif =3D dev->process_private;
>  	struct __fman_if *__fif;
>  	struct rte_intr_handle *intr_handle;
> +	uint32_t max_rx_pktlen;
>  	int speed, duplex;
>  	int ret;
>=20
> @@ -238,27 +237,17 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
>  		tx_offloads, dev_tx_offloads_nodis);
>  	}
>=20
> -	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		uint32_t max_len;
> -
> -		DPAA_PMD_DEBUG("enabling jumbo");
> -
> -		if (dev->data->dev_conf.rxmode.max_rx_pkt_len <=3D
> -		    DPAA_MAX_RX_PKT_LEN)
> -			max_len =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> -		else {
> -			DPAA_PMD_INFO("enabling jumbo override conf
> max len=3D%d "
> -				"supported is %d",
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len,
> -				DPAA_MAX_RX_PKT_LEN);
> -			max_len =3D DPAA_MAX_RX_PKT_LEN;
> -		}
> -
> -		fman_if_set_maxfrm(dev->process_private, max_len);
> -		dev->data->mtu =3D max_len
> -			- RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN -
> VLAN_TAG_SIZE;
> +	max_rx_pktlen =3D eth_conf->rxmode.mtu + RTE_ETHER_HDR_LEN +
> +			RTE_ETHER_CRC_LEN + VLAN_TAG_SIZE;
> +	if (max_rx_pktlen > DPAA_MAX_RX_PKT_LEN) {
> +		DPAA_PMD_INFO("enabling jumbo override conf max
> len=3D%d "
> +			"supported is %d",
> +			max_rx_pktlen, DPAA_MAX_RX_PKT_LEN);
> +		max_rx_pktlen =3D DPAA_MAX_RX_PKT_LEN;
>  	}
>=20
> +	fman_if_set_maxfrm(dev->process_private, max_rx_pktlen);
> +
>  	if (rx_offloads & DEV_RX_OFFLOAD_SCATTER) {
>  		DPAA_PMD_DEBUG("enabling scatter mode");
>  		fman_if_set_sg(dev->process_private, 1);
> @@ -936,6 +925,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev
> *dev, uint16_t queue_idx,
>  	u32 flags =3D 0;
>  	int ret;
>  	u32 buffsz =3D rte_pktmbuf_data_room_size(mp) -
> RTE_PKTMBUF_HEADROOM;
> +	uint32_t max_rx_pktlen;
>=20
>  	PMD_INIT_FUNC_TRACE();
>=20
> @@ -977,17 +967,17 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev
> *dev, uint16_t queue_idx,
>  		return -EINVAL;
>  	}
>=20
> +	max_rx_pktlen =3D dev->data->mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN +
> +		VLAN_TAG_SIZE;
>  	/* Max packet can fit in single buffer */
> -	if (dev->data->dev_conf.rxmode.max_rx_pkt_len <=3D buffsz) {
> +	if (max_rx_pktlen <=3D buffsz) {
>  		;
>  	} else if (dev->data->dev_conf.rxmode.offloads &
>  			DEV_RX_OFFLOAD_SCATTER) {
> -		if (dev->data->dev_conf.rxmode.max_rx_pkt_len >
> -			buffsz * DPAA_SGT_MAX_ENTRIES) {
> -			DPAA_PMD_ERR("max RxPkt size %d too big to fit "
> +		if (max_rx_pktlen > buffsz * DPAA_SGT_MAX_ENTRIES) {
> +			DPAA_PMD_ERR("Maximum Rx packet size %d too
> big to fit "
>  				"MaxSGlist %d",
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len,
> -				buffsz * DPAA_SGT_MAX_ENTRIES);
> +				max_rx_pktlen, buffsz *
> DPAA_SGT_MAX_ENTRIES);
>  			rte_errno =3D EOVERFLOW;
>  			return -rte_errno;
>  		}
> @@ -995,8 +985,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev
> *dev, uint16_t queue_idx,
>  		DPAA_PMD_WARN("The requested maximum Rx packet size
> (%u) is"
>  		     " larger than a single mbuf (%u) and scattered"
>  		     " mode has not been requested",
> -		     dev->data->dev_conf.rxmode.max_rx_pkt_len,
> -		     buffsz - RTE_PKTMBUF_HEADROOM);
> +		     max_rx_pktlen, buffsz - RTE_PKTMBUF_HEADROOM);
>  	}
>=20
>  	dpaa_intf->bp_info =3D DPAA_MEMPOOL_TO_POOL_INFO(mp);
> @@ -1034,8 +1023,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev
> *dev, uint16_t queue_idx,
>=20
>  	dpaa_intf->valid =3D 1;
>  	DPAA_PMD_DEBUG("if:%s sg_on =3D %d, max_frm =3D%d", dpaa_intf-
> >name,
> -		fman_if_get_sg_enable(fif),
> -		dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +		fman_if_get_sg_enable(fif), max_rx_pktlen);
>  	/* checking if push mode only, no error check for now */
>  	if (!rxq->is_static &&
>  	    dpaa_push_mode_max_queue > dpaa_push_queue_idx) {
> diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c
> b/drivers/net/dpaa2/dpaa2_ethdev.c
> index c12169578e22..758a14e0ad2d 100644
> --- a/drivers/net/dpaa2/dpaa2_ethdev.c
> +++ b/drivers/net/dpaa2/dpaa2_ethdev.c
> @@ -540,6 +540,7 @@ dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
>  	int tx_l3_csum_offload =3D false;
>  	int tx_l4_csum_offload =3D false;
>  	int ret, tc_index;
> +	uint32_t max_rx_pktlen;
>=20
>  	PMD_INIT_FUNC_TRACE();
>=20
> @@ -559,23 +560,17 @@ dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
>  		tx_offloads, dev_tx_offloads_nodis);
>  	}
>=20
> -	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		if (eth_conf->rxmode.max_rx_pkt_len <=3D
> DPAA2_MAX_RX_PKT_LEN) {
> -			ret =3D dpni_set_max_frame_length(dpni,
> CMD_PRI_LOW,
> -				priv->token, eth_conf-
> >rxmode.max_rx_pkt_len
> -				- RTE_ETHER_CRC_LEN);
> -			if (ret) {
> -				DPAA2_PMD_ERR(
> -					"Unable to set mtu. check config");
> -				return ret;
> -			}
> -			dev->data->mtu =3D
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len -
> -				RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN
> -
> -				VLAN_TAG_SIZE;
> -		} else {
> -			return -1;
> +	max_rx_pktlen =3D eth_conf->rxmode.mtu + RTE_ETHER_HDR_LEN +
> +				RTE_ETHER_CRC_LEN + VLAN_TAG_SIZE;
> +	if (max_rx_pktlen <=3D DPAA2_MAX_RX_PKT_LEN) {
> +		ret =3D dpni_set_max_frame_length(dpni, CMD_PRI_LOW,
> +			priv->token, max_rx_pktlen - RTE_ETHER_CRC_LEN);
> +		if (ret !=3D 0) {
> +			DPAA2_PMD_ERR("Unable to set mtu. check config");
> +			return ret;
>  		}
> +	} else {
> +		return -1;
>  	}
>=20
>  	if (eth_conf->rxmode.mq_mode =3D=3D ETH_MQ_RX_RSS) {
> @@ -1475,15 +1470,13 @@ dpaa2_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	if (mtu < RTE_ETHER_MIN_MTU || frame_size >
> DPAA2_MAX_RX_PKT_LEN)
>  		return -EINVAL;
>=20
> -	if (frame_size > DPAA2_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads |=3D
>=20
> 	DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
>=20
> 	~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	/* Set the Max Rx frame length as 'mtu' +
>  	 * Maximum Ethernet header length
>  	 */
> diff --git a/drivers/net/e1000/em_ethdev.c
> b/drivers/net/e1000/em_ethdev.c
> index a0ca371b0275..6f418a36aa04 100644
> --- a/drivers/net/e1000/em_ethdev.c
> +++ b/drivers/net/e1000/em_ethdev.c
> @@ -1818,7 +1818,7 @@ eth_em_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	rctl =3D E1000_READ_REG(hw, E1000_RCTL);
>=20
>  	/* switch to jumbo mode if needed */
> -	if (frame_size > E1000_ETH_MAX_LEN) {
> +	if (mtu > RTE_ETHER_MTU) {
>  		dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		rctl |=3D E1000_RCTL_LPE;
> @@ -1829,8 +1829,6 @@ eth_em_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	}
>  	E1000_WRITE_REG(hw, E1000_RCTL, rctl);
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
>  	return 0;
>  }
>=20
> diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethde=
v.c
> index d80fad01e36d..4c114bf90fc7 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -2681,9 +2681,7 @@ igb_vlan_hw_extend_disable(struct rte_eth_dev
> *dev)
>  	E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
>=20
>  	/* Update maximum packet length */
> -	if (dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		E1000_WRITE_REG(hw, E1000_RLPML,
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len);
> +	E1000_WRITE_REG(hw, E1000_RLPML, dev->data->mtu +
> E1000_ETH_OVERHEAD);
>  }
>=20
>  static void
> @@ -2699,10 +2697,8 @@ igb_vlan_hw_extend_enable(struct rte_eth_dev
> *dev)
>  	E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
>=20
>  	/* Update maximum packet length */
> -	if (dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		E1000_WRITE_REG(hw, E1000_RLPML,
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -						VLAN_TAG_SIZE);
> +	E1000_WRITE_REG(hw, E1000_RLPML,
> +		dev->data->mtu + E1000_ETH_OVERHEAD + VLAN_TAG_SIZE);
>  }
>=20
>  static int
> @@ -4400,7 +4396,7 @@ eth_igb_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  	rctl =3D E1000_READ_REG(hw, E1000_RCTL);
>=20
>  	/* switch to jumbo mode if needed */
> -	if (frame_size > E1000_ETH_MAX_LEN) {
> +	if (mtu > RTE_ETHER_MTU) {
>  		dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		rctl |=3D E1000_RCTL_LPE;
> @@ -4411,11 +4407,7 @@ eth_igb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	}
>  	E1000_WRITE_REG(hw, E1000_RCTL, rctl);
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
> -	E1000_WRITE_REG(hw, E1000_RLPML,
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +	E1000_WRITE_REG(hw, E1000_RLPML, frame_size);
>=20
>  	return 0;
>  }
> diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
> index 278d5d2712af..e9a30d393bd7 100644
> --- a/drivers/net/e1000/igb_rxtx.c
> +++ b/drivers/net/e1000/igb_rxtx.c
> @@ -2324,6 +2324,7 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
>  	uint32_t srrctl;
>  	uint16_t buf_size;
>  	uint16_t rctl_bsize;
> +	uint32_t max_len;
>  	uint16_t i;
>  	int ret;
>=20
> @@ -2342,9 +2343,8 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
>  	/*
>  	 * Configure support of jumbo frames, if any.
>  	 */
> +	max_len =3D dev->data->mtu + E1000_ETH_OVERHEAD;
>  	if (dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		uint32_t max_len =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> -
>  		rctl |=3D E1000_RCTL_LPE;
>=20
>  		/*
> @@ -2422,8 +2422,7 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
>  					       E1000_SRRCTL_BSIZEPKT_SHIFT);
>=20
>  			/* It adds dual VLAN length for supporting dual VLAN
> */
> -			if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -						2 * VLAN_TAG_SIZE) >
> buf_size){
> +			if ((max_len + 2 * VLAN_TAG_SIZE) > buf_size) {
>  				if (!dev->data->scattered_rx)
>  					PMD_INIT_LOG(DEBUG,
>  						     "forcing scatter mode");
> @@ -2647,15 +2646,15 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev)
>  	uint32_t srrctl;
>  	uint16_t buf_size;
>  	uint16_t rctl_bsize;
> +	uint32_t max_len;
>  	uint16_t i;
>  	int ret;
>=20
>  	hw =3D E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>=20
>  	/* setup MTU */
> -	e1000_rlpml_set_vf(hw,
> -		(uint16_t)(dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -		VLAN_TAG_SIZE));
> +	max_len =3D dev->data->mtu + E1000_ETH_OVERHEAD;
> +	e1000_rlpml_set_vf(hw, (uint16_t)(max_len + VLAN_TAG_SIZE));
>=20
>  	/* Configure and enable each RX queue. */
>  	rctl_bsize =3D 0;
> @@ -2712,8 +2711,7 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev)
>  					       E1000_SRRCTL_BSIZEPKT_SHIFT);
>=20
>  			/* It adds dual VLAN length for supporting dual VLAN
> */
> -			if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -						2 * VLAN_TAG_SIZE) >
> buf_size){
> +			if ((max_len + 2 * VLAN_TAG_SIZE) > buf_size) {
>  				if (!dev->data->scattered_rx)
>  					PMD_INIT_LOG(DEBUG,
>  						     "forcing scatter mode");
> diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
> index 4cebf60a68a7..3a9d5031b262 100644
> --- a/drivers/net/ena/ena_ethdev.c
> +++ b/drivers/net/ena/ena_ethdev.c
> @@ -679,26 +679,14 @@ static int ena_queue_start_all(struct rte_eth_dev
> *dev,
>  	return rc;
>  }
>=20
> -static uint32_t ena_get_mtu_conf(struct ena_adapter *adapter)
> -{
> -	uint32_t max_frame_len =3D adapter->max_mtu;
> -
> -	if (adapter->edev_data->dev_conf.rxmode.offloads &
> -	    DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		max_frame_len =3D
> -			adapter->edev_data-
> >dev_conf.rxmode.max_rx_pkt_len;
> -
> -	return max_frame_len;
> -}
> -
>  static int ena_check_valid_conf(struct ena_adapter *adapter)
>  {
> -	uint32_t max_frame_len =3D ena_get_mtu_conf(adapter);
> +	uint32_t mtu =3D adapter->edev_data->mtu;
>=20
> -	if (max_frame_len > adapter->max_mtu || max_frame_len <
> ENA_MIN_MTU) {
> +	if (mtu > adapter->max_mtu || mtu < ENA_MIN_MTU) {
>  		PMD_INIT_LOG(ERR,
>  			"Unsupported MTU of %d. Max MTU: %d, min
> MTU: %d\n",
> -			max_frame_len, adapter->max_mtu,
> ENA_MIN_MTU);
> +			mtu, adapter->max_mtu, ENA_MIN_MTU);
>  		return ENA_COM_UNSUPPORTED;
>  	}
>=20
> @@ -871,10 +859,10 @@ static int ena_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	ena_dev =3D &adapter->ena_dev;
>  	ena_assert_msg(ena_dev !=3D NULL, "Uninitialized device\n");
>=20
> -	if (mtu > ena_get_mtu_conf(adapter) || mtu < ENA_MIN_MTU) {
> +	if (mtu > adapter->max_mtu || mtu < ENA_MIN_MTU) {
>  		PMD_DRV_LOG(ERR,
>  			"Invalid MTU setting. New MTU: %d, max MTU: %d,
> min MTU: %d\n",
> -			mtu, ena_get_mtu_conf(adapter), ENA_MIN_MTU);
> +			mtu, adapter->max_mtu, ENA_MIN_MTU);
>  		return -EINVAL;
>  	}
>=20
> @@ -1945,7 +1933,10 @@ static int ena_infos_get(struct rte_eth_dev *dev,
>  	dev_info->hash_key_size =3D ENA_HASH_KEY_SIZE;
>=20
>  	dev_info->min_rx_bufsize =3D ENA_MIN_FRAME_LEN;
> -	dev_info->max_rx_pktlen  =3D adapter->max_mtu;
> +	dev_info->max_rx_pktlen  =3D adapter->max_mtu +
> RTE_ETHER_HDR_LEN +
> +		RTE_ETHER_CRC_LEN;
> +	dev_info->min_mtu =3D ENA_MIN_MTU;
> +	dev_info->max_mtu =3D adapter->max_mtu;
>  	dev_info->max_mac_addrs =3D 1;
>=20
>  	dev_info->max_rx_queues =3D adapter->max_num_io_queues;
> diff --git a/drivers/net/enetc/enetc_ethdev.c
> b/drivers/net/enetc/enetc_ethdev.c
> index b496cd470045..cdb9783b5372 100644
> --- a/drivers/net/enetc/enetc_ethdev.c
> +++ b/drivers/net/enetc/enetc_ethdev.c
> @@ -677,7 +677,7 @@ enetc_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EINVAL;
>  	}
>=20
> -	if (frame_size > ENETC_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads &=3D
>=20
> 	DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
> @@ -687,8 +687,6 @@ enetc_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
> ENETC_MAC_MAXFRM_SIZE);
>  	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 *
> ENETC_MAC_MAXFRM_SIZE);
>=20
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	/*setting the MTU*/
>  	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
> ENETC_SET_MAXFRM(frame_size) |
>  		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
> @@ -705,23 +703,15 @@ enetc_dev_configure(struct rte_eth_dev *dev)
>  	struct rte_eth_conf *eth_conf =3D &dev->data->dev_conf;
>  	uint64_t rx_offloads =3D eth_conf->rxmode.offloads;
>  	uint32_t checksum =3D L3_CKSUM | L4_CKSUM;
> +	uint32_t max_len;
>=20
>  	PMD_INIT_FUNC_TRACE();
>=20
> -	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		uint32_t max_len;
> -
> -		max_len =3D dev->data->dev_conf.rxmode.max_rx_pkt_len;
> -
> -		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
> -			      ENETC_SET_MAXFRM(max_len));
> -		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
> -			      ENETC_MAC_MAXFRM_SIZE);
> -		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
> -			      2 * ENETC_MAC_MAXFRM_SIZE);
> -		dev->data->mtu =3D RTE_ETHER_MAX_LEN -
> RTE_ETHER_HDR_LEN -
> -			RTE_ETHER_CRC_LEN;
> -	}
> +	max_len =3D dev->data->dev_conf.rxmode.mtu +
> RTE_ETHER_HDR_LEN +
> +		RTE_ETHER_CRC_LEN;
> +	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
> ENETC_SET_MAXFRM(max_len));
> +	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
> ENETC_MAC_MAXFRM_SIZE);
> +	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 *
> ENETC_MAC_MAXFRM_SIZE);
>=20
>  	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
>  		int config;
> diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethde=
v.c
> index 8d5797523b8f..6a81ceb62ba7 100644
> --- a/drivers/net/enic/enic_ethdev.c
> +++ b/drivers/net/enic/enic_ethdev.c
> @@ -455,7 +455,7 @@ static int enicpmd_dev_info_get(struct rte_eth_dev
> *eth_dev,
>  	 * max mtu regardless of the current mtu (vNIC's mtu). vNIC mtu is
>  	 * a hint to the driver to size receive buffers accordingly so that
>  	 * larger-than-vnic-mtu packets get truncated.. For DPDK, we let
> -	 * the user decide the buffer size via rxmode.max_rx_pkt_len,
> basically
> +	 * the user decide the buffer size via rxmode.mtu, basically
>  	 * ignoring vNIC mtu.
>  	 */
>  	device_info->max_rx_pktlen =3D enic_mtu_to_max_rx_pktlen(enic-
> >max_mtu);
> diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
> index 2affd380c6a4..dfc7f5d1f94f 100644
> --- a/drivers/net/enic/enic_main.c
> +++ b/drivers/net/enic/enic_main.c
> @@ -282,7 +282,7 @@ enic_alloc_rx_queue_mbufs(struct enic *enic, struct
> vnic_rq *rq)
>  	struct rq_enet_desc *rqd =3D rq->ring.descs;
>  	unsigned i;
>  	dma_addr_t dma_addr;
> -	uint32_t max_rx_pkt_len;
> +	uint32_t max_rx_pktlen;
>  	uint16_t rq_buf_len;
>=20
>  	if (!rq->in_use)
> @@ -293,16 +293,16 @@ enic_alloc_rx_queue_mbufs(struct enic *enic,
> struct vnic_rq *rq)
>=20
>  	/*
>  	 * If *not* using scatter and the mbuf size is greater than the
> -	 * requested max packet size (max_rx_pkt_len), then reduce the
> -	 * posted buffer size to max_rx_pkt_len. HW still receives packets
> -	 * larger than max_rx_pkt_len, but they will be truncated, which we
> +	 * requested max packet size (mtu + eth overhead), then reduce the
> +	 * posted buffer size to max packet size. HW still receives packets
> +	 * larger than max packet size, but they will be truncated, which we
>  	 * drop in the rx handler. Not ideal, but better than returning
>  	 * large packets when the user is not expecting them.
>  	 */
> -	max_rx_pkt_len =3D enic->rte_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	max_rx_pktlen =3D enic_mtu_to_max_rx_pktlen(enic->rte_dev->data-
> >mtu);
>  	rq_buf_len =3D rte_pktmbuf_data_room_size(rq->mp) -
> RTE_PKTMBUF_HEADROOM;
> -	if (max_rx_pkt_len < rq_buf_len && !rq->data_queue_enable)
> -		rq_buf_len =3D max_rx_pkt_len;
> +	if (max_rx_pktlen < rq_buf_len && !rq->data_queue_enable)
> +		rq_buf_len =3D max_rx_pktlen;
>  	for (i =3D 0; i < rq->ring.desc_count; i++, rqd++) {
>  		mb =3D rte_mbuf_raw_alloc(rq->mp);
>  		if (mb =3D=3D NULL) {
> @@ -818,7 +818,7 @@ int enic_alloc_rq(struct enic *enic, uint16_t
> queue_idx,
>  	unsigned int mbuf_size, mbufs_per_pkt;
>  	unsigned int nb_sop_desc, nb_data_desc;
>  	uint16_t min_sop, max_sop, min_data, max_data;
> -	uint32_t max_rx_pkt_len;
> +	uint32_t max_rx_pktlen;
>=20
>  	/*
>  	 * Representor uses a reserved PF queue. Translate representor
> @@ -854,23 +854,23 @@ int enic_alloc_rq(struct enic *enic, uint16_t
> queue_idx,
>=20
>  	mbuf_size =3D (uint16_t)(rte_pktmbuf_data_room_size(mp) -
>  			       RTE_PKTMBUF_HEADROOM);
> -	/* max_rx_pkt_len includes the ethernet header and CRC. */
> -	max_rx_pkt_len =3D enic->rte_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	/* max_rx_pktlen includes the ethernet header and CRC. */
> +	max_rx_pktlen =3D enic_mtu_to_max_rx_pktlen(enic->rte_dev->data-
> >mtu);
>=20
>  	if (enic->rte_dev->data->dev_conf.rxmode.offloads &
>  	    DEV_RX_OFFLOAD_SCATTER) {
>  		dev_info(enic, "Rq %u Scatter rx mode enabled\n",
> queue_idx);
>  		/* ceil((max pkt len)/mbuf_size) */
> -		mbufs_per_pkt =3D (max_rx_pkt_len + mbuf_size - 1) /
> mbuf_size;
> +		mbufs_per_pkt =3D (max_rx_pktlen + mbuf_size - 1) /
> mbuf_size;
>  	} else {
>  		dev_info(enic, "Scatter rx mode disabled\n");
>  		mbufs_per_pkt =3D 1;
> -		if (max_rx_pkt_len > mbuf_size) {
> +		if (max_rx_pktlen > mbuf_size) {
>  			dev_warning(enic, "The maximum Rx packet size (%u)
> is"
>  				    " larger than the mbuf size (%u), and"
>  				    " scatter is disabled. Larger packets will"
>  				    " be truncated.\n",
> -				    max_rx_pkt_len, mbuf_size);
> +				    max_rx_pktlen, mbuf_size);
>  		}
>  	}
>=20
> @@ -879,16 +879,15 @@ int enic_alloc_rq(struct enic *enic, uint16_t
> queue_idx,
>  		rq_sop->data_queue_enable =3D 1;
>  		rq_data->in_use =3D 1;
>  		/*
> -		 * HW does not directly support rxmode.max_rx_pkt_len.
> HW always
> +		 * HW does not directly support MTU. HW always
>  		 * receives packet sizes up to the "max" MTU.
>  		 * If not using scatter, we can achieve the effect of dropping
>  		 * larger packets by reducing the size of posted buffers.
>  		 * See enic_alloc_rx_queue_mbufs().
>  		 */
> -		if (max_rx_pkt_len <
> -		    enic_mtu_to_max_rx_pktlen(enic->max_mtu)) {
> -			dev_warning(enic, "rxmode.max_rx_pkt_len is
> ignored"
> -				    " when scatter rx mode is in use.\n");
> +		if (enic->rte_dev->data->mtu < enic->max_mtu) {
> +			dev_warning(enic,
> +				"mtu is ignored when scatter rx mode is in
> use.\n");
>  		}
>  	} else {
>  		dev_info(enic, "Rq %u Scatter rx mode not being used\n",
> @@ -931,7 +930,7 @@ int enic_alloc_rq(struct enic *enic, uint16_t
> queue_idx,
>  	if (mbufs_per_pkt > 1) {
>  		dev_info(enic, "For max packet size %u and mbuf size %u
> valid"
>  			 " rx descriptor range is %u to %u\n",
> -			 max_rx_pkt_len, mbuf_size, min_sop + min_data,
> +			 max_rx_pktlen, mbuf_size, min_sop + min_data,
>  			 max_sop + max_data);
>  	}
>  	dev_info(enic, "Using %d rx descriptors (sop %d, data %d)\n",
> @@ -1634,11 +1633,6 @@ int enic_set_mtu(struct enic *enic, uint16_t
> new_mtu)
>  			"MTU (%u) is greater than value configured in NIC
> (%u)\n",
>  			new_mtu, config_mtu);
>=20
> -	/* Update the MTU and maximum packet length */
> -	eth_dev->data->mtu =3D new_mtu;
> -	eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =3D
> -		enic_mtu_to_max_rx_pktlen(new_mtu);
> -
>  	/*
>  	 * If the device has not started (enic_enable), nothing to do.
>  	 * Later, enic_enable() will set up RQs reflecting the new maximum
> diff --git a/drivers/net/fm10k/fm10k_ethdev.c
> b/drivers/net/fm10k/fm10k_ethdev.c
> index 3236290e4021..5e4b361ca6c0 100644
> --- a/drivers/net/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/fm10k/fm10k_ethdev.c
> @@ -757,7 +757,7 @@ fm10k_dev_rx_init(struct rte_eth_dev *dev)
>  				FM10K_SRRCTL_LOOPBACK_SUPPRESS);
>=20
>  		/* It adds dual VLAN length for supporting dual VLAN */
> -		if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
> +		if ((dev->data->mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN +
>  				2 * FM10K_VLAN_TAG_SIZE) > buf_size ||
>  			rxq->offloads & DEV_RX_OFFLOAD_SCATTER) {
>  			uint32_t reg;
> diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c
> b/drivers/net/hinic/hinic_pmd_ethdev.c
> index c01e2ec1d450..2d8271cb6095 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -315,19 +315,19 @@ static int hinic_dev_configure(struct rte_eth_dev
> *dev)
>  		dev->data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_RSS_HASH;
>=20
>  	/* mtu size is 256~9600 */
> -	if (dev->data->dev_conf.rxmode.max_rx_pkt_len <
> HINIC_MIN_FRAME_SIZE ||
> -	    dev->data->dev_conf.rxmode.max_rx_pkt_len >
> -	    HINIC_MAX_JUMBO_FRAME_SIZE) {
> +	if (HINIC_MTU_TO_PKTLEN(dev->data->dev_conf.rxmode.mtu) <
> +			HINIC_MIN_FRAME_SIZE ||
> +	    HINIC_MTU_TO_PKTLEN(dev->data->dev_conf.rxmode.mtu) >
> +			HINIC_MAX_JUMBO_FRAME_SIZE) {
>  		PMD_DRV_LOG(ERR,
> -			"Max rx pkt len out of range, get max_rx_pkt_len:%d,
> "
> +			"Packet length out of range, get packet length:%d, "
>  			"expect between %d and %d",
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len,
> +			HINIC_MTU_TO_PKTLEN(dev->data-
> >dev_conf.rxmode.mtu),
>  			HINIC_MIN_FRAME_SIZE,
> HINIC_MAX_JUMBO_FRAME_SIZE);
>  		return -EINVAL;
>  	}
>=20
> -	nic_dev->mtu_size =3D
> -		HINIC_PKTLEN_TO_MTU(dev->data-
> >dev_conf.rxmode.max_rx_pkt_len);
> +	nic_dev->mtu_size =3D dev->data->dev_conf.rxmode.mtu;
>=20
>  	/* rss template */
>  	err =3D hinic_config_mq_mode(dev, TRUE);
> @@ -1530,7 +1530,6 @@ static void hinic_deinit_mac_addr(struct
> rte_eth_dev *eth_dev)
>  static int hinic_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
>  {
>  	struct hinic_nic_dev *nic_dev =3D
> HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
> -	uint32_t frame_size;
>  	int ret =3D 0;
>=20
>  	PMD_DRV_LOG(INFO, "Set port mtu, port_id: %d, mtu: %d,
> max_pkt_len: %d",
> @@ -1548,16 +1547,13 @@ static int hinic_dev_set_mtu(struct rte_eth_dev
> *dev, uint16_t mtu)
>  		return ret;
>  	}
>=20
> -	/* update max frame size */
> -	frame_size =3D HINIC_MTU_TO_PKTLEN(mtu);
> -	if (frame_size > HINIC_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
>  			~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
>  	nic_dev->mtu_size =3D mtu;
>=20
>  	return ret;
> diff --git a/drivers/net/hns3/hns3_ethdev.c
> b/drivers/net/hns3/hns3_ethdev.c
> index 7d37004972bf..4ead227f9122 100644
> --- a/drivers/net/hns3/hns3_ethdev.c
> +++ b/drivers/net/hns3/hns3_ethdev.c
> @@ -2371,41 +2371,6 @@ hns3_init_ring_with_vector(struct hns3_hw *hw)
>  	return 0;
>  }
>=20
> -static int
> -hns3_refresh_mtu(struct rte_eth_dev *dev, struct rte_eth_conf *conf)
> -{
> -	struct hns3_adapter *hns =3D dev->data->dev_private;
> -	struct hns3_hw *hw =3D &hns->hw;
> -	uint32_t max_rx_pkt_len;
> -	uint16_t mtu;
> -	int ret;
> -
> -	if (!(conf->rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME))
> -		return 0;
> -
> -	/*
> -	 * If jumbo frames are enabled, MTU needs to be refreshed
> -	 * according to the maximum RX packet length.
> -	 */
> -	max_rx_pkt_len =3D conf->rxmode.max_rx_pkt_len;
> -	if (max_rx_pkt_len > HNS3_MAX_FRAME_LEN ||
> -	    max_rx_pkt_len <=3D HNS3_DEFAULT_FRAME_LEN) {
> -		hns3_err(hw, "maximum Rx packet length must be greater
> than %u "
> -			 "and no more than %u when jumbo frame enabled.",
> -			 (uint16_t)HNS3_DEFAULT_FRAME_LEN,
> -			 (uint16_t)HNS3_MAX_FRAME_LEN);
> -		return -EINVAL;
> -	}
> -
> -	mtu =3D (uint16_t)HNS3_PKTLEN_TO_MTU(max_rx_pkt_len);
> -	ret =3D hns3_dev_mtu_set(dev, mtu);
> -	if (ret)
> -		return ret;
> -	dev->data->mtu =3D mtu;
> -
> -	return 0;
> -}
> -
>  static int
>  hns3_setup_dcb(struct rte_eth_dev *dev)
>  {
> @@ -2520,8 +2485,8 @@ hns3_dev_configure(struct rte_eth_dev *dev)
>  			goto cfg_err;
>  	}
>=20
> -	ret =3D hns3_refresh_mtu(dev, conf);
> -	if (ret)
> +	ret =3D hns3_dev_mtu_set(dev, conf->rxmode.mtu);
> +	if (ret !=3D 0)
>  		goto cfg_err;
>=20
>  	ret =3D hns3_mbuf_dyn_rx_timestamp_register(dev, conf);
> @@ -2616,7 +2581,7 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	}
>=20
>  	rte_spinlock_lock(&hw->lock);
> -	is_jumbo_frame =3D frame_size > HNS3_DEFAULT_FRAME_LEN ? true :
> false;
> +	is_jumbo_frame =3D mtu > RTE_ETHER_MTU ? true : false;
>  	frame_size =3D RTE_MAX(frame_size, HNS3_DEFAULT_FRAME_LEN);
>=20
>  	/*
> @@ -2637,7 +2602,6 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
>=20
> 	~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
>  	rte_spinlock_unlock(&hw->lock);
>=20
>  	return 0;
> diff --git a/drivers/net/hns3/hns3_ethdev_vf.c
> b/drivers/net/hns3/hns3_ethdev_vf.c
> index 8d9b7979c806..0b5db486f8d6 100644
> --- a/drivers/net/hns3/hns3_ethdev_vf.c
> +++ b/drivers/net/hns3/hns3_ethdev_vf.c
> @@ -784,8 +784,6 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
>  	uint16_t nb_rx_q =3D dev->data->nb_rx_queues;
>  	uint16_t nb_tx_q =3D dev->data->nb_tx_queues;
>  	struct rte_eth_rss_conf rss_conf;
> -	uint32_t max_rx_pkt_len;
> -	uint16_t mtu;
>  	bool gro_en;
>  	int ret;
>=20
> @@ -825,28 +823,9 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
>  			goto cfg_err;
>  	}
>=20
> -	/*
> -	 * If jumbo frames are enabled, MTU needs to be refreshed
> -	 * according to the maximum RX packet length.
> -	 */
> -	if (conf->rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		max_rx_pkt_len =3D conf->rxmode.max_rx_pkt_len;
> -		if (max_rx_pkt_len > HNS3_MAX_FRAME_LEN ||
> -		    max_rx_pkt_len <=3D HNS3_DEFAULT_FRAME_LEN) {
> -			hns3_err(hw, "maximum Rx packet length must be
> greater "
> -				 "than %u and less than %u when jumbo
> frame enabled.",
> -				 (uint16_t)HNS3_DEFAULT_FRAME_LEN,
> -				 (uint16_t)HNS3_MAX_FRAME_LEN);
> -			ret =3D -EINVAL;
> -			goto cfg_err;
> -		}
> -
> -		mtu =3D (uint16_t)HNS3_PKTLEN_TO_MTU(max_rx_pkt_len);
> -		ret =3D hns3vf_dev_mtu_set(dev, mtu);
> -		if (ret)
> -			goto cfg_err;
> -		dev->data->mtu =3D mtu;
> -	}
> +	ret =3D hns3vf_dev_mtu_set(dev, conf->rxmode.mtu);
> +	if (ret !=3D 0)
> +		goto cfg_err;
>=20
>  	ret =3D hns3vf_dev_configure_vlan(dev);
>  	if (ret)
> @@ -935,7 +914,6 @@ hns3vf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
>=20
> 	~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
>  	rte_spinlock_unlock(&hw->lock);
>=20
>  	return 0;
> diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
> index 481872e3957f..a260212f73f1 100644
> --- a/drivers/net/hns3/hns3_rxtx.c
> +++ b/drivers/net/hns3/hns3_rxtx.c
> @@ -1735,18 +1735,18 @@ hns3_rxq_conf_runtime_check(struct hns3_hw
> *hw, uint16_t buf_size,
>  				uint16_t nb_desc)
>  {
>  	struct rte_eth_dev *dev =3D &rte_eth_devices[hw->data->port_id];
> -	struct rte_eth_rxmode *rxmode =3D &hw->data->dev_conf.rxmode;
>  	eth_rx_burst_t pkt_burst =3D dev->rx_pkt_burst;
> +	uint32_t frame_size =3D dev->data->mtu + HNS3_ETH_OVERHEAD;
>  	uint16_t min_vec_bds;
>=20
>  	/*
>  	 * HNS3 hardware network engine set scattered as default. If the
> driver
>  	 * is not work in scattered mode and the pkts greater than buf_size
> -	 * but smaller than max_rx_pkt_len will be distributed to multiple
> BDs.
> +	 * but smaller than frame size will be distributed to multiple BDs.
>  	 * Driver cannot handle this situation.
>  	 */
> -	if (!hw->data->scattered_rx && rxmode->max_rx_pkt_len > buf_size)
> {
> -		hns3_err(hw, "max_rx_pkt_len is not allowed to be set
> greater "
> +	if (!hw->data->scattered_rx && frame_size > buf_size) {
> +		hns3_err(hw, "frame size is not allowed to be set greater "
>  			     "than rx_buf_len if scattered is off.");
>  		return -EINVAL;
>  	}
> @@ -1958,7 +1958,7 @@ hns3_rx_scattered_calc(struct rte_eth_dev *dev)
>  	}
>=20
>  	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_SCATTER ||
> -	    dev_conf->rxmode.max_rx_pkt_len > hw->rx_buf_len)
> +	    dev->data->mtu + HNS3_ETH_OVERHEAD > hw->rx_buf_len)
>  		dev->data->scattered_rx =3D true;
>  }
>=20
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethde=
v.c
> index bd97d93dd746..ab571a921f9e 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -11775,14 +11775,10 @@ i40e_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EBUSY;
>  	}
>=20
> -	if (frame_size > I40E_ETH_MAX_LEN)
> -		dev_data->dev_conf.rxmode.offloads |=3D
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
> +		dev_data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
> -		dev_data->dev_conf.rxmode.offloads &=3D
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
> -	dev_data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> +		dev_data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
>  	return ret;
>  }
> diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
> index d5847ac6b546..1d27cf2b0a01 100644
> --- a/drivers/net/i40e/i40e_rxtx.c
> +++ b/drivers/net/i40e/i40e_rxtx.c
> @@ -2909,8 +2909,8 @@ i40e_rx_queue_config(struct i40e_rx_queue *rxq)
>  	}
>=20
>  	rxq->max_pkt_len =3D
> -		RTE_MIN((uint32_t)(hw->func_caps.rx_buf_chain_len *
> -			rxq->rx_buf_len), data-
> >dev_conf.rxmode.max_rx_pkt_len);
> +		RTE_MIN(hw->func_caps.rx_buf_chain_len * rxq-
> >rx_buf_len,
> +				data->mtu + I40E_ETH_OVERHEAD);
>  	if (data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME) {
>  		if (rxq->max_pkt_len <=3D I40E_ETH_MAX_LEN ||
>  			rxq->max_pkt_len > I40E_FRAME_SIZE_MAX) {
> diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethde=
v.c
> index 5a5a7f59e152..0eabce275d92 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -576,13 +576,14 @@ iavf_init_rxq(struct rte_eth_dev *dev, struct
> iavf_rx_queue *rxq)
>  	struct iavf_hw *hw =3D IAVF_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
>  	struct rte_eth_dev_data *dev_data =3D dev->data;
>  	uint16_t buf_size, max_pkt_len;
> +	uint32_t frame_size =3D dev->data->mtu + IAVF_ETH_OVERHEAD;
>=20
>  	buf_size =3D rte_pktmbuf_data_room_size(rxq->mp) -
> RTE_PKTMBUF_HEADROOM;
>=20
>  	/* Calculate the maximum packet length allowed */
>  	max_pkt_len =3D RTE_MIN((uint32_t)
>  			rxq->rx_buf_len * IAVF_MAX_CHAINED_RX_BUFFERS,
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +			frame_size);
>=20
>  	/* Check if the jumbo frame and maximum packet length are set
>  	 * correctly.
> @@ -839,7 +840,7 @@ iavf_dev_start(struct rte_eth_dev *dev)
>=20
>  	adapter->stopped =3D 0;
>=20
> -	vf->max_pkt_len =3D dev->data->dev_conf.rxmode.max_rx_pkt_len;
> +	vf->max_pkt_len =3D dev->data->mtu + IAVF_ETH_OVERHEAD;
>  	vf->num_queue_pairs =3D RTE_MAX(dev->data->nb_rx_queues,
>  				      dev->data->nb_tx_queues);
>  	num_queue_pairs =3D vf->num_queue_pairs;
> @@ -1472,15 +1473,13 @@ iavf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EBUSY;
>  	}
>=20
> -	if (frame_size > IAVF_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads |=3D
>  				DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
>  				~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	return ret;
>  }
>=20
> diff --git a/drivers/net/ice/ice_dcf_ethdev.c
> b/drivers/net/ice/ice_dcf_ethdev.c
> index 4e4cdbcd7d71..c3c7ad88f250 100644
> --- a/drivers/net/ice/ice_dcf_ethdev.c
> +++ b/drivers/net/ice/ice_dcf_ethdev.c
> @@ -66,9 +66,8 @@ ice_dcf_init_rxq(struct rte_eth_dev *dev, struct
> ice_rx_queue *rxq)
>  	buf_size =3D rte_pktmbuf_data_room_size(rxq->mp) -
> RTE_PKTMBUF_HEADROOM;
>  	rxq->rx_hdr_len =3D 0;
>  	rxq->rx_buf_len =3D RTE_ALIGN(buf_size, (1 <<
> ICE_RLAN_CTX_DBUF_S));
> -	max_pkt_len =3D RTE_MIN((uint32_t)
> -			      ICE_SUPPORT_CHAIN_NUM * rxq->rx_buf_len,
> -			      dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +	max_pkt_len =3D RTE_MIN(ICE_SUPPORT_CHAIN_NUM * rxq-
> >rx_buf_len,
> +			      dev->data->mtu + ICE_ETH_OVERHEAD);
>=20
>  	/* Check if the jumbo frame and maximum packet length are set
>  	 * correctly.
> diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
> index 9ab7704ff003..8ee1335ac6cf 100644
> --- a/drivers/net/ice/ice_ethdev.c
> +++ b/drivers/net/ice/ice_ethdev.c
> @@ -3603,8 +3603,8 @@ ice_dev_start(struct rte_eth_dev *dev)
>  	pf->adapter_stopped =3D false;
>=20
>  	/* Set the max frame size to default value*/
> -	max_frame_size =3D pf->dev_data->dev_conf.rxmode.max_rx_pkt_len ?
> -		pf->dev_data->dev_conf.rxmode.max_rx_pkt_len :
> +	max_frame_size =3D pf->dev_data->mtu ?
> +		pf->dev_data->mtu + ICE_ETH_OVERHEAD :
>  		ICE_FRAME_SIZE_MAX;
>=20
>  	/* Set the max frame size to HW*/
> @@ -3992,14 +3992,10 @@ ice_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EBUSY;
>  	}
>=20
> -	if (frame_size > ICE_ETH_MAX_LEN)
> -		dev_data->dev_conf.rxmode.offloads |=3D
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
> +		dev_data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
> -		dev_data->dev_conf.rxmode.offloads &=3D
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
> -	dev_data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> +		dev_data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
>  	return 0;
>  }
> diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
> index 83fb788e6930..f9ef6ce57277 100644
> --- a/drivers/net/ice/ice_rxtx.c
> +++ b/drivers/net/ice/ice_rxtx.c
> @@ -271,15 +271,16 @@ ice_program_hw_rx_queue(struct ice_rx_queue
> *rxq)
>  	uint32_t rxdid =3D ICE_RXDID_COMMS_OVS;
>  	uint32_t regval;
>  	struct ice_adapter *ad =3D rxq->vsi->adapter;
> +	uint32_t frame_size =3D dev_data->mtu + ICE_ETH_OVERHEAD;
>=20
>  	/* Set buffer size as the head split is disabled. */
>  	buf_size =3D (uint16_t)(rte_pktmbuf_data_room_size(rxq->mp) -
>  			      RTE_PKTMBUF_HEADROOM);
>  	rxq->rx_hdr_len =3D 0;
>  	rxq->rx_buf_len =3D RTE_ALIGN(buf_size, (1 <<
> ICE_RLAN_CTX_DBUF_S));
> -	rxq->max_pkt_len =3D RTE_MIN((uint32_t)
> -				   ICE_SUPPORT_CHAIN_NUM * rxq-
> >rx_buf_len,
> -				   dev_data-
> >dev_conf.rxmode.max_rx_pkt_len);
> +	rxq->max_pkt_len =3D
> +		RTE_MIN((uint32_t)ICE_SUPPORT_CHAIN_NUM * rxq-
> >rx_buf_len,
> +			frame_size);
>=20
>  	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
>  		if (rxq->max_pkt_len <=3D ICE_ETH_MAX_LEN ||
> @@ -385,11 +386,8 @@ ice_program_hw_rx_queue(struct ice_rx_queue
> *rxq)
>  		return -EINVAL;
>  	}
>=20
> -	buf_size =3D (uint16_t)(rte_pktmbuf_data_room_size(rxq->mp) -
> -			      RTE_PKTMBUF_HEADROOM);
> -
>  	/* Check if scattered RX needs to be used. */
> -	if (rxq->max_pkt_len > buf_size)
> +	if (frame_size > buf_size)
>  		dev_data->scattered_rx =3D 1;
>=20
>  	rxq->qrx_tail =3D hw->hw_addr + QRX_TAIL(rxq->reg_idx);
> diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c
> index 224a0954836b..b26723064b07 100644
> --- a/drivers/net/igc/igc_ethdev.c
> +++ b/drivers/net/igc/igc_ethdev.c
> @@ -20,13 +20,6 @@
>=20
>  #define IGC_INTEL_VENDOR_ID		0x8086
>=20
> -/*
> - * The overhead from MTU to max frame size.
> - * Considering VLAN so tag needs to be counted.
> - */
> -#define IGC_ETH_OVERHEAD		(RTE_ETHER_HDR_LEN + \
> -					RTE_ETHER_CRC_LEN +
> VLAN_TAG_SIZE)
> -
>  #define IGC_FC_PAUSE_TIME		0x0680
>  #define IGC_LINK_UPDATE_CHECK_TIMEOUT	90  /* 9s */
>  #define IGC_LINK_UPDATE_CHECK_INTERVAL	100 /* ms */
> @@ -1602,21 +1595,15 @@ eth_igc_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>=20
>  	/* switch to jumbo mode if needed */
>  	if (mtu > RTE_ETHER_MTU) {
> -		dev->data->dev_conf.rxmode.offloads |=3D
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +		dev->data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		rctl |=3D IGC_RCTL_LPE;
>  	} else {
> -		dev->data->dev_conf.rxmode.offloads &=3D
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +		dev->data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		rctl &=3D ~IGC_RCTL_LPE;
>  	}
>  	IGC_WRITE_REG(hw, IGC_RCTL, rctl);
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
> -	IGC_WRITE_REG(hw, IGC_RLPML,
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +	IGC_WRITE_REG(hw, IGC_RLPML, frame_size);
>=20
>  	return 0;
>  }
> @@ -2486,6 +2473,7 @@ static int
>  igc_vlan_hw_extend_disable(struct rte_eth_dev *dev)
>  {
>  	struct igc_hw *hw =3D IGC_DEV_PRIVATE_HW(dev);
> +	uint32_t frame_size =3D dev->data->mtu + IGC_ETH_OVERHEAD;
>  	uint32_t ctrl_ext;
>=20
>  	ctrl_ext =3D IGC_READ_REG(hw, IGC_CTRL_EXT);
> @@ -2494,23 +2482,14 @@ igc_vlan_hw_extend_disable(struct rte_eth_dev
> *dev)
>  	if ((ctrl_ext & IGC_CTRL_EXT_EXT_VLAN) =3D=3D 0)
>  		return 0;
>=20
> -	if ((dev->data->dev_conf.rxmode.offloads &
> -			DEV_RX_OFFLOAD_JUMBO_FRAME) =3D=3D 0)
> -		goto write_ext_vlan;
> -
>  	/* Update maximum packet length */
> -	if (dev->data->dev_conf.rxmode.max_rx_pkt_len <
> -		RTE_ETHER_MIN_MTU + VLAN_TAG_SIZE) {
> +	if (frame_size < RTE_ETHER_MIN_MTU + VLAN_TAG_SIZE) {
>  		PMD_DRV_LOG(ERR, "Maximum packet length %u error, min
> is %u",
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len,
> -			VLAN_TAG_SIZE + RTE_ETHER_MIN_MTU);
> +			frame_size, VLAN_TAG_SIZE +
> RTE_ETHER_MIN_MTU);
>  		return -EINVAL;
>  	}
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len -=3D VLAN_TAG_SIZE;
> -	IGC_WRITE_REG(hw, IGC_RLPML,
> -		dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +	IGC_WRITE_REG(hw, IGC_RLPML, frame_size - VLAN_TAG_SIZE);
>=20
> -write_ext_vlan:
>  	IGC_WRITE_REG(hw, IGC_CTRL_EXT, ctrl_ext &
> ~IGC_CTRL_EXT_EXT_VLAN);
>  	return 0;
>  }
> @@ -2519,6 +2498,7 @@ static int
>  igc_vlan_hw_extend_enable(struct rte_eth_dev *dev)
>  {
>  	struct igc_hw *hw =3D IGC_DEV_PRIVATE_HW(dev);
> +	uint32_t frame_size =3D dev->data->mtu + IGC_ETH_OVERHEAD;
>  	uint32_t ctrl_ext;
>=20
>  	ctrl_ext =3D IGC_READ_REG(hw, IGC_CTRL_EXT);
> @@ -2527,23 +2507,14 @@ igc_vlan_hw_extend_enable(struct rte_eth_dev
> *dev)
>  	if (ctrl_ext & IGC_CTRL_EXT_EXT_VLAN)
>  		return 0;
>=20
> -	if ((dev->data->dev_conf.rxmode.offloads &
> -			DEV_RX_OFFLOAD_JUMBO_FRAME) =3D=3D 0)
> -		goto write_ext_vlan;
> -
>  	/* Update maximum packet length */
> -	if (dev->data->dev_conf.rxmode.max_rx_pkt_len >
> -		MAX_RX_JUMBO_FRAME_SIZE - VLAN_TAG_SIZE) {
> +	if (frame_size > MAX_RX_JUMBO_FRAME_SIZE) {
>  		PMD_DRV_LOG(ERR, "Maximum packet length %u error, max
> is %u",
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -			VLAN_TAG_SIZE, MAX_RX_JUMBO_FRAME_SIZE);
> +			frame_size, MAX_RX_JUMBO_FRAME_SIZE);
>  		return -EINVAL;
>  	}
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len +=3D VLAN_TAG_SIZE;
> -	IGC_WRITE_REG(hw, IGC_RLPML,
> -		dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +	IGC_WRITE_REG(hw, IGC_RLPML, frame_size);
>=20
> -write_ext_vlan:
>  	IGC_WRITE_REG(hw, IGC_CTRL_EXT, ctrl_ext |
> IGC_CTRL_EXT_EXT_VLAN);
>  	return 0;
>  }
> diff --git a/drivers/net/igc/igc_ethdev.h b/drivers/net/igc/igc_ethdev.h
> index 7b6c209df3b6..b3473b5b1646 100644
> --- a/drivers/net/igc/igc_ethdev.h
> +++ b/drivers/net/igc/igc_ethdev.h
> @@ -35,6 +35,13 @@ extern "C" {
>  #define IGC_HKEY_REG_SIZE		IGC_DEFAULT_REG_SIZE
>  #define IGC_HKEY_SIZE			(IGC_HKEY_REG_SIZE *
> IGC_HKEY_MAX_INDEX)
>=20
> +/*
> + * The overhead from MTU to max frame size.
> + * Considering VLAN so tag needs to be counted.
> + */
> +#define IGC_ETH_OVERHEAD		(RTE_ETHER_HDR_LEN + \
> +					RTE_ETHER_CRC_LEN +
> VLAN_TAG_SIZE * 2)
> +
>  /*
>   * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN
> should be
>   * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary.
> diff --git a/drivers/net/igc/igc_txrx.c b/drivers/net/igc/igc_txrx.c
> index b5489eedd220..28d3076439c3 100644
> --- a/drivers/net/igc/igc_txrx.c
> +++ b/drivers/net/igc/igc_txrx.c
> @@ -1081,7 +1081,7 @@ igc_rx_init(struct rte_eth_dev *dev)
>  	struct igc_rx_queue *rxq;
>  	struct igc_hw *hw =3D IGC_DEV_PRIVATE_HW(dev);
>  	uint64_t offloads =3D dev->data->dev_conf.rxmode.offloads;
> -	uint32_t max_rx_pkt_len =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	uint32_t max_rx_pktlen;
>  	uint32_t rctl;
>  	uint32_t rxcsum;
>  	uint16_t buf_size;
> @@ -1099,17 +1099,17 @@ igc_rx_init(struct rte_eth_dev *dev)
>  	IGC_WRITE_REG(hw, IGC_RCTL, rctl & ~IGC_RCTL_EN);
>=20
>  	/* Configure support of jumbo frames, if any. */
> -	if (offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> +	if ((offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) !=3D 0)
>  		rctl |=3D IGC_RCTL_LPE;
> -
> -		/*
> -		 * Set maximum packet length by default, and might be
> updated
> -		 * together with enabling/disabling dual VLAN.
> -		 */
> -		IGC_WRITE_REG(hw, IGC_RLPML, max_rx_pkt_len);
> -	} else {
> +	else
>  		rctl &=3D ~IGC_RCTL_LPE;
> -	}
> +
> +	max_rx_pktlen =3D dev->data->mtu + IGC_ETH_OVERHEAD;
> +	/*
> +	 * Set maximum packet length by default, and might be updated
> +	 * together with enabling/disabling dual VLAN.
> +	 */
> +	IGC_WRITE_REG(hw, IGC_RLPML, max_rx_pktlen);
>=20
>  	/* Configure and enable each RX queue. */
>  	rctl_bsize =3D 0;
> @@ -1168,7 +1168,7 @@ igc_rx_init(struct rte_eth_dev *dev)
>  					IGC_SRRCTL_BSIZEPKT_SHIFT);
>=20
>  			/* It adds dual VLAN length for supporting dual VLAN
> */
> -			if (max_rx_pkt_len + 2 * VLAN_TAG_SIZE > buf_size)
> +			if (max_rx_pktlen > buf_size)
>  				dev->data->scattered_rx =3D 1;
>  		} else {
>  			/*
> diff --git a/drivers/net/ionic/ionic_ethdev.c
> b/drivers/net/ionic/ionic_ethdev.c
> index e6207939665e..97447a10e46a 100644
> --- a/drivers/net/ionic/ionic_ethdev.c
> +++ b/drivers/net/ionic/ionic_ethdev.c
> @@ -343,25 +343,15 @@ static int
>  ionic_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
>  {
>  	struct ionic_lif *lif =3D IONIC_ETH_DEV_TO_LIF(eth_dev);
> -	uint32_t max_frame_size;
>  	int err;
>=20
>  	IONIC_PRINT_CALL();
>=20
>  	/*
>  	 * Note: mtu check against IONIC_MIN_MTU, IONIC_MAX_MTU
> -	 * is done by the the API.
> +	 * is done by the API.
>  	 */
>=20
> -	/*
> -	 * Max frame size is MTU + Ethernet header + VLAN + QinQ
> -	 * (plus ETHER_CRC_LEN if the adapter is able to keep CRC)
> -	 */
> -	max_frame_size =3D mtu + RTE_ETHER_HDR_LEN + 4 + 4;
> -
> -	if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len <
> max_frame_size)
> -		return -EINVAL;
> -
>  	err =3D ionic_lif_change_mtu(lif, mtu);
>  	if (err)
>  		return err;
> diff --git a/drivers/net/ionic/ionic_rxtx.c b/drivers/net/ionic/ionic_rxt=
x.c
> index b83ea1bcaa6a..3f5fc66abf71 100644
> --- a/drivers/net/ionic/ionic_rxtx.c
> +++ b/drivers/net/ionic/ionic_rxtx.c
> @@ -773,7 +773,7 @@ ionic_rx_clean(struct ionic_rx_qcq *rxq,
>  	struct ionic_rxq_comp *cq_desc =3D &cq_desc_base[cq_desc_index];
>  	struct rte_mbuf *rxm, *rxm_seg;
>  	uint32_t max_frame_size =3D
> -		rxq->qcq.lif->eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +		rxq->qcq.lif->eth_dev->data->mtu + RTE_ETHER_HDR_LEN;
>  	uint64_t pkt_flags =3D 0;
>  	uint32_t pkt_type;
>  	struct ionic_rx_stats *stats =3D &rxq->stats;
> @@ -1016,7 +1016,7 @@ ionic_rx_fill(struct ionic_rx_qcq *rxq, uint32_t le=
n)
>  int __rte_cold
>  ionic_dev_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t
> rx_queue_id)
>  {
> -	uint32_t frame_size =3D eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	uint32_t frame_size =3D eth_dev->data->mtu + RTE_ETHER_HDR_LEN;
>  	uint8_t *rx_queue_state =3D eth_dev->data->rx_queue_state;
>  	struct ionic_rx_qcq *rxq;
>  	int err;
> @@ -1130,7 +1130,7 @@ ionic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  {
>  	struct ionic_rx_qcq *rxq =3D rx_queue;
>  	uint32_t frame_size =3D
> -		rxq->qcq.lif->eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +		rxq->qcq.lif->eth_dev->data->mtu + RTE_ETHER_HDR_LEN;
>  	struct ionic_rx_service service_cb_arg;
>=20
>  	service_cb_arg.rx_pkts =3D rx_pkts;
> diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c
> b/drivers/net/ipn3ke/ipn3ke_representor.c
> index 589d9fa5877d..3634c0c8c5f0 100644
> --- a/drivers/net/ipn3ke/ipn3ke_representor.c
> +++ b/drivers/net/ipn3ke/ipn3ke_representor.c
> @@ -2801,14 +2801,10 @@ ipn3ke_rpst_mtu_set(struct rte_eth_dev
> *ethdev, uint16_t mtu)
>  		return -EBUSY;
>  	}
>=20
> -	if (frame_size > IPN3KE_ETH_MAX_LEN)
> -		dev_data->dev_conf.rxmode.offloads |=3D
> -			(uint64_t)(DEV_RX_OFFLOAD_JUMBO_FRAME);
> +	if (mtu > RTE_ETHER_MTU)
> +		dev_data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
> -		dev_data->dev_conf.rxmode.offloads &=3D
> -			(uint64_t)(~DEV_RX_OFFLOAD_JUMBO_FRAME);
> -
> -	dev_data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> +		dev_data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
>  	if (rpst->i40e_pf_eth) {
>  		ret =3D rpst->i40e_pf_eth->dev_ops->mtu_set(rpst-
> >i40e_pf_eth,
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 47693c0c47cd..31e67d86e77b 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -5174,7 +5174,6 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	struct ixgbe_hw *hw;
>  	struct rte_eth_dev_info dev_info;
>  	uint32_t frame_size =3D mtu + IXGBE_ETH_OVERHEAD;
> -	struct rte_eth_dev_data *dev_data =3D dev->data;
>  	int ret;
>=20
>  	ret =3D ixgbe_dev_info_get(dev, &dev_info);
> @@ -5188,9 +5187,9 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	/* If device is started, refuse mtu that requires the support of
>  	 * scattered packets when this feature has not been enabled before.
>  	 */
> -	if (dev_data->dev_started && !dev_data->scattered_rx &&
> -	    (frame_size + 2 * IXGBE_VLAN_TAG_SIZE >
> -	     dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM)) {
> +	if (dev->data->dev_started && !dev->data->scattered_rx &&
> +	    frame_size + 2 * IXGBE_VLAN_TAG_SIZE >
> +			dev->data->min_rx_buf_size -
> RTE_PKTMBUF_HEADROOM) {
>  		PMD_INIT_LOG(ERR, "Stop port first.");
>  		return -EINVAL;
>  	}
> @@ -5199,23 +5198,18 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	hlreg0 =3D IXGBE_READ_REG(hw, IXGBE_HLREG0);
>=20
>  	/* switch to jumbo mode if needed */
> -	if (frame_size > IXGBE_ETH_MAX_LEN) {
> -		dev->data->dev_conf.rxmode.offloads |=3D
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU) {
> +		dev->data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		hlreg0 |=3D IXGBE_HLREG0_JUMBOEN;
>  	} else {
> -		dev->data->dev_conf.rxmode.offloads &=3D
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +		dev->data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		hlreg0 &=3D ~IXGBE_HLREG0_JUMBOEN;
>  	}
>  	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	maxfrs =3D IXGBE_READ_REG(hw, IXGBE_MAXFRS);
>  	maxfrs &=3D 0x0000FFFF;
> -	maxfrs |=3D (dev->data->dev_conf.rxmode.max_rx_pkt_len << 16);
> +	maxfrs |=3D (frame_size << 16);
>  	IXGBE_WRITE_REG(hw, IXGBE_MAXFRS, maxfrs);
>=20
>  	return 0;
> @@ -6272,12 +6266,10 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev
> *dev,
>  	 * set as 0x4.
>  	 */
>  	if ((rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) &&
> -	    (rxmode->max_rx_pkt_len >=3D IXGBE_MAX_JUMBO_FRAME_SIZE))
> -		IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM,
> -			IXGBE_MMW_SIZE_JUMBO_FRAME);
> +	    (dev->data->mtu + IXGBE_ETH_OVERHEAD >=3D
> IXGBE_MAX_JUMBO_FRAME_SIZE))
> +		IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM,
> IXGBE_MMW_SIZE_JUMBO_FRAME);
>  	else
> -		IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM,
> -			IXGBE_MMW_SIZE_DEFAULT);
> +		IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM,
> IXGBE_MMW_SIZE_DEFAULT);
>=20
>  	/* Set RTTBCNRC of queue X */
>  	IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, queue_idx);
> @@ -6549,8 +6541,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>=20
>  	hw =3D IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>=20
> -	if (mtu < RTE_ETHER_MIN_MTU ||
> -			max_frame > RTE_ETHER_MAX_JUMBO_FRAME_LEN)
> +	if (mtu < RTE_ETHER_MIN_MTU || max_frame >
> RTE_ETHER_MAX_JUMBO_FRAME_LEN)
>  		return -EINVAL;
>=20
>  	/* If device is started, refuse mtu that requires the support of
> @@ -6558,7 +6549,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	 */
>  	if (dev_data->dev_started && !dev_data->scattered_rx &&
>  	    (max_frame + 2 * IXGBE_VLAN_TAG_SIZE >
> -	     dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM)) {
> +			dev->data->min_rx_buf_size -
> RTE_PKTMBUF_HEADROOM)) {
>  		PMD_INIT_LOG(ERR, "Stop port first.");
>  		return -EINVAL;
>  	}
> @@ -6575,8 +6566,6 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	if (ixgbevf_rlpml_set_vf(hw, max_frame))
>  		return -EINVAL;
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D max_frame;
>  	return 0;
>  }
>=20
> diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c
> index fbf2b17d160f..9bcbc445f2d0 100644
> --- a/drivers/net/ixgbe/ixgbe_pf.c
> +++ b/drivers/net/ixgbe/ixgbe_pf.c
> @@ -576,8 +576,7 @@ ixgbe_set_vf_lpe(struct rte_eth_dev *dev, uint32_t vf=
,
> uint32_t *msgbuf)
>  			  * if PF has jumbo frames enabled which means
> legacy
>  			  * VFs are disabled.
>  			  */
> -			if (dev->data->dev_conf.rxmode.max_rx_pkt_len >
> -			    IXGBE_ETH_MAX_LEN)
> +			if (dev->data->mtu > RTE_ETHER_MTU)
>  				break;
>  			/* fall through */
>  		default:
> @@ -587,8 +586,7 @@ ixgbe_set_vf_lpe(struct rte_eth_dev *dev, uint32_t vf=
,
> uint32_t *msgbuf)
>  			 * legacy VFs.
>  			 */
>  			if (max_frame > IXGBE_ETH_MAX_LEN ||
> -			    dev->data->dev_conf.rxmode.max_rx_pkt_len >
> -			    IXGBE_ETH_MAX_LEN)
> +					dev->data->mtu > RTE_ETHER_MTU)
>  				return -1;
>  			break;
>  		}
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxt=
x.c
> index bfdfd5e755de..03991711fd6e 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -5063,6 +5063,7 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
>  	uint16_t buf_size;
>  	uint16_t i;
>  	struct rte_eth_rxmode *rx_conf =3D &dev->data->dev_conf.rxmode;
> +	uint32_t frame_size =3D dev->data->mtu + IXGBE_ETH_OVERHEAD;
>  	int rc;
>=20
>  	PMD_INIT_FUNC_TRACE();
> @@ -5098,7 +5099,7 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
>  		hlreg0 |=3D IXGBE_HLREG0_JUMBOEN;
>  		maxfrs =3D IXGBE_READ_REG(hw, IXGBE_MAXFRS);
>  		maxfrs &=3D 0x0000FFFF;
> -		maxfrs |=3D (rx_conf->max_rx_pkt_len << 16);
> +		maxfrs |=3D (frame_size << 16);
>  		IXGBE_WRITE_REG(hw, IXGBE_MAXFRS, maxfrs);
>  	} else
>  		hlreg0 &=3D ~IXGBE_HLREG0_JUMBOEN;
> @@ -5172,8 +5173,7 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
>  				       IXGBE_SRRCTL_BSIZEPKT_SHIFT);
>=20
>  		/* It adds dual VLAN length for supporting dual VLAN */
> -		if (dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -					    2 * IXGBE_VLAN_TAG_SIZE >
> buf_size)
> +		if (frame_size + 2 * IXGBE_VLAN_TAG_SIZE > buf_size)
>  			dev->data->scattered_rx =3D 1;
>  		if (rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
>  			rx_conf->offloads |=3D DEV_RX_OFFLOAD_VLAN_STRIP;
> @@ -5653,6 +5653,7 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev)
>  	struct ixgbe_hw     *hw;
>  	struct ixgbe_rx_queue *rxq;
>  	struct rte_eth_rxmode *rxmode =3D &dev->data->dev_conf.rxmode;
> +	uint32_t frame_size =3D dev->data->mtu + IXGBE_ETH_OVERHEAD;
>  	uint64_t bus_addr;
>  	uint32_t srrctl, psrtype =3D 0;
>  	uint16_t buf_size;
> @@ -5689,10 +5690,9 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev)
>  	 * ixgbevf_rlpml_set_vf even if jumbo frames are not used. This way,
>  	 * VF packets received can work in all cases.
>  	 */
> -	if (ixgbevf_rlpml_set_vf(hw,
> -	    (uint16_t)dev->data->dev_conf.rxmode.max_rx_pkt_len)) {
> +	if (ixgbevf_rlpml_set_vf(hw, frame_size) !=3D 0) {
>  		PMD_INIT_LOG(ERR, "Set max packet length to %d failed.",
> -			     dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +			     frame_size);
>  		return -EINVAL;
>  	}
>=20
> @@ -5751,8 +5751,7 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev)
>=20
>  		if (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER ||
>  		    /* It adds dual VLAN length for supporting dual VLAN */
> -		    (rxmode->max_rx_pkt_len +
> -				2 * IXGBE_VLAN_TAG_SIZE) > buf_size) {
> +		    (frame_size + 2 * IXGBE_VLAN_TAG_SIZE) > buf_size) {
>  			if (!dev->data->scattered_rx)
>  				PMD_INIT_LOG(DEBUG, "forcing scatter
> mode");
>  			dev->data->scattered_rx =3D 1;
> diff --git a/drivers/net/liquidio/lio_ethdev.c
> b/drivers/net/liquidio/lio_ethdev.c
> index b72060a4499b..976916f870a5 100644
> --- a/drivers/net/liquidio/lio_ethdev.c
> +++ b/drivers/net/liquidio/lio_ethdev.c
> @@ -435,7 +435,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  {
>  	struct lio_device *lio_dev =3D LIO_DEV(eth_dev);
>  	uint16_t pf_mtu =3D lio_dev->linfo.link.s.mtu;
> -	uint32_t frame_len =3D mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
>  	struct lio_dev_ctrl_cmd ctrl_cmd;
>  	struct lio_ctrl_pkt ctrl_pkt;
>=20
> @@ -481,16 +480,13 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  		return -1;
>  	}
>=20
> -	if (frame_len > LIO_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		eth_dev->data->dev_conf.rxmode.offloads |=3D
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		eth_dev->data->dev_conf.rxmode.offloads &=3D
>  			~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_len;
> -	eth_dev->data->mtu =3D mtu;
> -
>  	return 0;
>  }
>=20
> @@ -1398,8 +1394,6 @@ lio_sync_link_state_check(void *eth_dev)
>  static int
>  lio_dev_start(struct rte_eth_dev *eth_dev)
>  {
> -	uint16_t mtu;
> -	uint32_t frame_len =3D eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
>  	struct lio_device *lio_dev =3D LIO_DEV(eth_dev);
>  	uint16_t timeout =3D LIO_MAX_CMD_TIMEOUT;
>  	int ret =3D 0;
> @@ -1442,15 +1436,9 @@ lio_dev_start(struct rte_eth_dev *eth_dev)
>  		goto dev_mtu_set_error;
>  	}
>=20
> -	mtu =3D (uint16_t)(frame_len - RTE_ETHER_HDR_LEN -
> RTE_ETHER_CRC_LEN);
> -	if (mtu < RTE_ETHER_MIN_MTU)
> -		mtu =3D RTE_ETHER_MIN_MTU;
> -
> -	if (eth_dev->data->mtu !=3D mtu) {
> -		ret =3D lio_dev_mtu_set(eth_dev, mtu);
> -		if (ret)
> -			goto dev_mtu_set_error;
> -	}
> +	ret =3D lio_dev_mtu_set(eth_dev, eth_dev->data->mtu);
> +	if (ret !=3D 0)
> +		goto dev_mtu_set_error;
>=20
>  	return 0;
>=20
> diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c
> index 978cbb8201ea..4a5cfd22aa71 100644
> --- a/drivers/net/mlx4/mlx4_rxq.c
> +++ b/drivers/net/mlx4/mlx4_rxq.c
> @@ -753,6 +753,7 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  	int ret;
>  	uint32_t crc_present;
>  	uint64_t offloads;
> +	uint32_t max_rx_pktlen;
>=20
>  	offloads =3D conf->offloads | dev->data->dev_conf.rxmode.offloads;
>=20
> @@ -828,13 +829,11 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  	};
>  	/* Enable scattered packets support for this queue if necessary. */
>  	MLX4_ASSERT(mb_len >=3D RTE_PKTMBUF_HEADROOM);
> -	if (dev->data->dev_conf.rxmode.max_rx_pkt_len <=3D
> -	    (mb_len - RTE_PKTMBUF_HEADROOM)) {
> +	max_rx_pktlen =3D dev->data->mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +	if (max_rx_pktlen <=3D (mb_len - RTE_PKTMBUF_HEADROOM)) {
>  		;
>  	} else if (offloads & DEV_RX_OFFLOAD_SCATTER) {
> -		uint32_t size =3D
> -			RTE_PKTMBUF_HEADROOM +
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len;
> +		uint32_t size =3D RTE_PKTMBUF_HEADROOM + max_rx_pktlen;
>  		uint32_t sges_n;
>=20
>  		/*
> @@ -846,21 +845,19 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  		/* Make sure sges_n did not overflow. */
>  		size =3D mb_len * (1 << rxq->sges_n);
>  		size -=3D RTE_PKTMBUF_HEADROOM;
> -		if (size < dev->data->dev_conf.rxmode.max_rx_pkt_len) {
> +		if (size < max_rx_pktlen) {
>  			rte_errno =3D EOVERFLOW;
>  			ERROR("%p: too many SGEs (%u) needed to handle"
>  			      " requested maximum packet size %u",
>  			      (void *)dev,
> -			      1 << sges_n,
> -			      dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +			      1 << sges_n, max_rx_pktlen);
>  			goto error;
>  		}
>  	} else {
>  		WARN("%p: the requested maximum Rx packet size (%u) is"
>  		     " larger than a single mbuf (%u) and scattered"
>  		     " mode has not been requested",
> -		     (void *)dev,
> -		     dev->data->dev_conf.rxmode.max_rx_pkt_len,
> +		     (void *)dev, max_rx_pktlen,
>  		     mb_len - RTE_PKTMBUF_HEADROOM);
>  	}
>  	DEBUG("%p: maximum number of segments per packet: %u",
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index abd8ce798986..6f4f351222d3 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -1330,10 +1330,11 @@ mlx5_rxq_new(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  	uint64_t offloads =3D conf->offloads |
>  			   dev->data->dev_conf.rxmode.offloads;
>  	unsigned int lro_on_queue =3D !!(offloads &
> DEV_RX_OFFLOAD_TCP_LRO);
> -	unsigned int max_rx_pkt_len =3D lro_on_queue ?
> +	unsigned int max_rx_pktlen =3D lro_on_queue ?
>  			dev->data->dev_conf.rxmode.max_lro_pkt_size :
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len;
> -	unsigned int non_scatter_min_mbuf_size =3D max_rx_pkt_len +
> +			dev->data->mtu + (unsigned
> int)RTE_ETHER_HDR_LEN +
> +				RTE_ETHER_CRC_LEN;
> +	unsigned int non_scatter_min_mbuf_size =3D max_rx_pktlen +
>=20
> 	RTE_PKTMBUF_HEADROOM;
>  	unsigned int max_lro_size =3D 0;
>  	unsigned int first_mb_free_size =3D mb_len -
> RTE_PKTMBUF_HEADROOM;
> @@ -1372,7 +1373,7 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
>  	 * needed to handle max size packets, replace zero length
>  	 * with the buffer length from the pool.
>  	 */
> -	tail_len =3D max_rx_pkt_len;
> +	tail_len =3D max_rx_pktlen;
>  	do {
>  		struct mlx5_eth_rxseg *hw_seg =3D
>  					&tmpl->rxq.rxseg[tmpl->rxq.rxseg_n];
> @@ -1410,7 +1411,7 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
>  				"port %u too many SGEs (%u) needed to
> handle"
>  				" requested maximum packet size %u, the
> maximum"
>  				" supported are %u", dev->data->port_id,
> -				tmpl->rxq.rxseg_n, max_rx_pkt_len,
> +				tmpl->rxq.rxseg_n, max_rx_pktlen,
>  				MLX5_MAX_RXQ_NSEG);
>  			rte_errno =3D ENOTSUP;
>  			goto error;
> @@ -1435,7 +1436,7 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
>  		DRV_LOG(ERR, "port %u Rx queue %u: Scatter offload is not"
>  			" configured and no enough mbuf space(%u) to
> contain "
>  			"the maximum RX packet length(%u) with head-
> room(%u)",
> -			dev->data->port_id, idx, mb_len, max_rx_pkt_len,
> +			dev->data->port_id, idx, mb_len, max_rx_pktlen,
>  			RTE_PKTMBUF_HEADROOM);
>  		rte_errno =3D ENOSPC;
>  		goto error;
> @@ -1454,7 +1455,7 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
>  	 * following conditions are met:
>  	 *  - MPRQ is enabled.
>  	 *  - The number of descs is more than the number of strides.
> -	 *  - max_rx_pkt_len plus overhead is less than the max size
> +	 *  - max_rx_pktlen plus overhead is less than the max size
>  	 *    of a stride or mprq_stride_size is specified by a user.
>  	 *    Need to make sure that there are enough strides to encap
>  	 *    the maximum packet size in case mprq_stride_size is set.
> @@ -1478,7 +1479,7 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
>  				!!(offloads & DEV_RX_OFFLOAD_SCATTER);
>  		tmpl->rxq.mprq_max_memcpy_len =3D
> RTE_MIN(first_mb_free_size,
>  				config->mprq.max_memcpy_len);
> -		max_lro_size =3D RTE_MIN(max_rx_pkt_len,
> +		max_lro_size =3D RTE_MIN(max_rx_pktlen,
>  				       (1u << tmpl->rxq.strd_num_n) *
>  				       (1u << tmpl->rxq.strd_sz_n));
>  		DRV_LOG(DEBUG,
> @@ -1487,9 +1488,9 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
>  			dev->data->port_id, idx,
>  			tmpl->rxq.strd_num_n, tmpl->rxq.strd_sz_n);
>  	} else if (tmpl->rxq.rxseg_n =3D=3D 1) {
> -		MLX5_ASSERT(max_rx_pkt_len <=3D first_mb_free_size);
> +		MLX5_ASSERT(max_rx_pktlen <=3D first_mb_free_size);
>  		tmpl->rxq.sges_n =3D 0;
> -		max_lro_size =3D max_rx_pkt_len;
> +		max_lro_size =3D max_rx_pktlen;
>  	} else if (offloads & DEV_RX_OFFLOAD_SCATTER) {
>  		unsigned int sges_n;
>=20
> @@ -1511,13 +1512,13 @@ mlx5_rxq_new(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  				"port %u too many SGEs (%u) needed to
> handle"
>  				" requested maximum packet size %u, the
> maximum"
>  				" supported are %u", dev->data->port_id,
> -				1 << sges_n, max_rx_pkt_len,
> +				1 << sges_n, max_rx_pktlen,
>  				1u << MLX5_MAX_LOG_RQ_SEGS);
>  			rte_errno =3D ENOTSUP;
>  			goto error;
>  		}
>  		tmpl->rxq.sges_n =3D sges_n;
> -		max_lro_size =3D max_rx_pkt_len;
> +		max_lro_size =3D max_rx_pktlen;
>  	}
>  	if (config->mprq.enabled && !mlx5_rxq_mprq_enabled(&tmpl->rxq))
>  		DRV_LOG(WARNING,
> diff --git a/drivers/net/mvneta/mvneta_ethdev.c
> b/drivers/net/mvneta/mvneta_ethdev.c
> index a3ee15020466..520c6fdb1d31 100644
> --- a/drivers/net/mvneta/mvneta_ethdev.c
> +++ b/drivers/net/mvneta/mvneta_ethdev.c
> @@ -126,10 +126,6 @@ mvneta_dev_configure(struct rte_eth_dev *dev)
>  		return -EINVAL;
>  	}
>=20
> -	if (dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		dev->data->mtu =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len -
> -				 MRVL_NETA_ETH_HDRS_LEN;
> -
>  	if (dev->data->dev_conf.txmode.offloads &
> DEV_TX_OFFLOAD_MULTI_SEGS)
>  		priv->multiseg =3D 1;
>=20
> @@ -261,9 +257,6 @@ mvneta_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EINVAL;
>  	}
>=20
> -	dev->data->mtu =3D mtu;
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D mru - MV_MH_SIZE;
> -
>  	if (!priv->ppio)
>  		/* It is OK. New MTU will be set later on mvneta_dev_start */
>  		return 0;
> diff --git a/drivers/net/mvneta/mvneta_rxtx.c
> b/drivers/net/mvneta/mvneta_rxtx.c
> index dfa7ecc09039..2cd4fb31348b 100644
> --- a/drivers/net/mvneta/mvneta_rxtx.c
> +++ b/drivers/net/mvneta/mvneta_rxtx.c
> @@ -708,19 +708,18 @@ mvneta_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  	struct mvneta_priv *priv =3D dev->data->dev_private;
>  	struct mvneta_rxq *rxq;
>  	uint32_t frame_size, buf_size =3D rte_pktmbuf_data_room_size(mp);
> -	uint32_t max_rx_pkt_len =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	uint32_t max_rx_pktlen =3D dev->data->mtu + RTE_ETHER_HDR_LEN;
>=20
>  	frame_size =3D buf_size - RTE_PKTMBUF_HEADROOM -
> MVNETA_PKT_EFFEC_OFFS;
>=20
> -	if (frame_size < max_rx_pkt_len) {
> +	if (frame_size < max_rx_pktlen) {
>  		MVNETA_LOG(ERR,
>  			"Mbuf size must be increased to %u bytes to hold up
> "
>  			"to %u bytes of data.",
> -			buf_size + max_rx_pkt_len - frame_size,
> -			max_rx_pkt_len);
> -		dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -		MVNETA_LOG(INFO, "Setting max rx pkt len to %u",
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +			max_rx_pktlen + buf_size - frame_size,
> +			max_rx_pktlen);
> +		dev->data->mtu =3D frame_size - RTE_ETHER_HDR_LEN;
> +		MVNETA_LOG(INFO, "Setting MTU to %u", dev->data->mtu);
>  	}
>=20
>  	if (dev->data->rx_queues[idx]) {
> diff --git a/drivers/net/mvpp2/mrvl_ethdev.c
> b/drivers/net/mvpp2/mrvl_ethdev.c
> index 078aefbb8da4..5ce71661c84e 100644
> --- a/drivers/net/mvpp2/mrvl_ethdev.c
> +++ b/drivers/net/mvpp2/mrvl_ethdev.c
> @@ -496,16 +496,11 @@ mrvl_dev_configure(struct rte_eth_dev *dev)
>  		return -EINVAL;
>  	}
>=20
> -	if (dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		dev->data->mtu =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len -
> -				 MRVL_PP2_ETH_HDRS_LEN;
> -		if (dev->data->mtu > priv->max_mtu) {
> -			MRVL_LOG(ERR, "inherit MTU %u from
> max_rx_pkt_len %u is larger than max_mtu %u\n",
> -				 dev->data->mtu,
> -				 dev->data-
> >dev_conf.rxmode.max_rx_pkt_len,
> -				 priv->max_mtu);
> -			return -EINVAL;
> -		}
> +	if (dev->data->dev_conf.rxmode.mtu > priv->max_mtu) {
> +		MRVL_LOG(ERR, "MTU %u is larger than max_mtu %u\n",
> +			 dev->data->dev_conf.rxmode.mtu,
> +			 priv->max_mtu);
> +		return -EINVAL;
>  	}
>=20
>  	if (dev->data->dev_conf.txmode.offloads &
> DEV_TX_OFFLOAD_MULTI_SEGS)
> @@ -595,9 +590,6 @@ mrvl_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
>  		return -EINVAL;
>  	}
>=20
> -	dev->data->mtu =3D mtu;
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D mru - MV_MH_SIZE;
> -
>  	if (!priv->ppio)
>  		return 0;
>=20
> @@ -1994,7 +1986,7 @@ mrvl_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  	struct mrvl_priv *priv =3D dev->data->dev_private;
>  	struct mrvl_rxq *rxq;
>  	uint32_t frame_size, buf_size =3D rte_pktmbuf_data_room_size(mp);
> -	uint32_t max_rx_pkt_len =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +	uint32_t max_rx_pktlen =3D dev->data->mtu + RTE_ETHER_HDR_LEN;
>  	int ret, tc, inq;
>  	uint64_t offloads;
>=20
> @@ -2009,17 +2001,15 @@ mrvl_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t idx, uint16_t desc,
>  		return -EFAULT;
>  	}
>=20
> -	frame_size =3D buf_size - RTE_PKTMBUF_HEADROOM -
> -		     MRVL_PKT_EFFEC_OFFS + RTE_ETHER_CRC_LEN;
> -	if (frame_size < max_rx_pkt_len) {
> +	frame_size =3D buf_size - RTE_PKTMBUF_HEADROOM -
> MRVL_PKT_EFFEC_OFFS;
> +	if (frame_size < max_rx_pktlen) {
>  		MRVL_LOG(WARNING,
>  			"Mbuf size must be increased to %u bytes to hold up
> "
>  			"to %u bytes of data.",
> -			buf_size + max_rx_pkt_len - frame_size,
> -			max_rx_pkt_len);
> -		dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -		MRVL_LOG(INFO, "Setting max rx pkt len to %u",
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +			max_rx_pktlen + buf_size - frame_size,
> +			max_rx_pktlen);
> +		dev->data->mtu =3D frame_size - RTE_ETHER_HDR_LEN;
> +		MRVL_LOG(INFO, "Setting MTU to %u", dev->data->mtu);
>  	}
>=20
>  	if (dev->data->rx_queues[idx]) {
> diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c
> index 1b4bc33593fb..a2031a7a82cc 100644
> --- a/drivers/net/nfp/nfp_common.c
> +++ b/drivers/net/nfp/nfp_common.c
> @@ -370,7 +370,7 @@ nfp_check_offloads(struct rte_eth_dev *dev)
>  	}
>=20
>  	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		hw->mtu =3D rxmode->max_rx_pkt_len;
> +		hw->mtu =3D dev->data->mtu;
>=20
>  	if (txmode->offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
>  		ctrl |=3D NFP_NET_CFG_CTRL_TXVLAN;
> @@ -963,16 +963,13 @@ nfp_net_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	}
>=20
>  	/* switch to jumbo mode if needed */
> -	if ((uint32_t)mtu > RTE_ETHER_MTU)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D (uint32_t)mtu;
> -
>  	/* writing to configuration space */
> -	nn_cfg_writel(hw, NFP_NET_CFG_MTU, (uint32_t)mtu);
> +	nn_cfg_writel(hw, NFP_NET_CFG_MTU, mtu);
>=20
>  	hw->mtu =3D mtu;
>=20
> diff --git a/drivers/net/octeontx/octeontx_ethdev.c
> b/drivers/net/octeontx/octeontx_ethdev.c
> index 9f4c0503b4d4..69c3bda12df8 100644
> --- a/drivers/net/octeontx/octeontx_ethdev.c
> +++ b/drivers/net/octeontx/octeontx_ethdev.c
> @@ -552,13 +552,11 @@ octeontx_dev_mtu_set(struct rte_eth_dev
> *eth_dev, uint16_t mtu)
>  	if (rc)
>  		return rc;
>=20
> -	if (frame_size > OCCTX_L2_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		nic->rx_offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		nic->rx_offloads &=3D ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	/* Update max_rx_pkt_len */
> -	data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
>  	octeontx_log_info("Received pkt beyond  maxlen %d will be
> dropped",
>  			  frame_size);
>=20
> @@ -581,7 +579,7 @@ octeontx_recheck_rx_offloads(struct octeontx_rxq
> *rxq)
>  	buffsz =3D mbp_priv->mbuf_data_room_size -
> RTE_PKTMBUF_HEADROOM;
>=20
>  	/* Setup scatter mode if needed by jumbo */
> -	if (data->dev_conf.rxmode.max_rx_pkt_len > buffsz) {
> +	if (data->mtu > buffsz) {
>  		nic->rx_offloads |=3D DEV_RX_OFFLOAD_SCATTER;
>  		nic->rx_offload_flags |=3D octeontx_rx_offload_flags(eth_dev);
>  		nic->tx_offload_flags |=3D octeontx_tx_offload_flags(eth_dev);
> @@ -593,8 +591,8 @@ octeontx_recheck_rx_offloads(struct octeontx_rxq
> *rxq)
>  	evdev_priv->rx_offload_flags =3D nic->rx_offload_flags;
>  	evdev_priv->tx_offload_flags =3D nic->tx_offload_flags;
>=20
> -	/* Setup MTU based on max_rx_pkt_len */
> -	nic->mtu =3D data->dev_conf.rxmode.max_rx_pkt_len -
> OCCTX_L2_OVERHEAD;
> +	/* Setup MTU */
> +	nic->mtu =3D data->mtu;
>=20
>  	return 0;
>  }
> @@ -615,7 +613,7 @@ octeontx_dev_start(struct rte_eth_dev *dev)
>  		octeontx_recheck_rx_offloads(rxq);
>  	}
>=20
> -	/* Setting up the mtu based on max_rx_pkt_len */
> +	/* Setting up the mtu */
>  	ret =3D octeontx_dev_mtu_set(dev, nic->mtu);
>  	if (ret) {
>  		octeontx_log_err("Failed to set default MTU size %d", ret);
> diff --git a/drivers/net/octeontx2/otx2_ethdev.c
> b/drivers/net/octeontx2/otx2_ethdev.c
> index 75d4cabf2e7c..787e8d890215 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.c
> +++ b/drivers/net/octeontx2/otx2_ethdev.c
> @@ -912,7 +912,7 @@ otx2_nix_enable_mseg_on_jumbo(struct
> otx2_eth_rxq *rxq)
>  	mbp_priv =3D rte_mempool_get_priv(rxq->pool);
>  	buffsz =3D mbp_priv->mbuf_data_room_size -
> RTE_PKTMBUF_HEADROOM;
>=20
> -	if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len > buffsz) {
> +	if (eth_dev->data->mtu + (uint32_t)NIX_L2_OVERHEAD > buffsz) {
>  		dev->rx_offloads |=3D DEV_RX_OFFLOAD_SCATTER;
>  		dev->tx_offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
>=20
> diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c
> b/drivers/net/octeontx2/otx2_ethdev_ops.c
> index 552e6bd43d2b..cf7804157198 100644
> --- a/drivers/net/octeontx2/otx2_ethdev_ops.c
> +++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
> @@ -59,14 +59,11 @@ otx2_nix_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  	if (rc)
>  		return rc;
>=20
> -	if (frame_size > NIX_L2_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->rx_offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->rx_offloads &=3D ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	/* Update max_rx_pkt_len */
> -	data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> -
>  	return rc;
>  }
>=20
> @@ -75,7 +72,6 @@ otx2_nix_recalc_mtu(struct rte_eth_dev *eth_dev)
>  {
>  	struct rte_eth_dev_data *data =3D eth_dev->data;
>  	struct otx2_eth_rxq *rxq;
> -	uint16_t mtu;
>  	int rc;
>=20
>  	rxq =3D data->rx_queues[0];
> @@ -83,10 +79,7 @@ otx2_nix_recalc_mtu(struct rte_eth_dev *eth_dev)
>  	/* Setup scatter mode if needed by jumbo */
>  	otx2_nix_enable_mseg_on_jumbo(rxq);
>=20
> -	/* Setup MTU based on max_rx_pkt_len */
> -	mtu =3D data->dev_conf.rxmode.max_rx_pkt_len - NIX_L2_OVERHEAD;
> -
> -	rc =3D otx2_nix_mtu_set(eth_dev, mtu);
> +	rc =3D otx2_nix_mtu_set(eth_dev, data->mtu);
>  	if (rc)
>  		otx2_err("Failed to set default MTU size %d", rc);
>=20
> diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c
> index feec4d10a26e..2619bd2f2a19 100644
> --- a/drivers/net/pfe/pfe_ethdev.c
> +++ b/drivers/net/pfe/pfe_ethdev.c
> @@ -682,16 +682,11 @@ pfe_link_up(struct rte_eth_dev *dev)
>  static int
>  pfe_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
>  {
> -	int ret;
>  	struct pfe_eth_priv_s *priv =3D dev->data->dev_private;
>  	uint16_t frame_size =3D mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
>=20
>  	/*TODO Support VLAN*/
> -	ret =3D gemac_set_rx(priv->EMAC_baseaddr, frame_size);
> -	if (!ret)
> -		dev->data->mtu =3D mtu;
> -
> -	return ret;
> +	return gemac_set_rx(priv->EMAC_baseaddr, frame_size);
>  }
>=20
>  /* pfe_eth_enet_addr_byte_mac
> diff --git a/drivers/net/qede/qede_ethdev.c
> b/drivers/net/qede/qede_ethdev.c
> index a4304e0eff44..4b971fd1fe3c 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -1312,12 +1312,6 @@ static int qede_dev_configure(struct rte_eth_dev
> *eth_dev)
>  			return -ENOMEM;
>  	}
>=20
> -	/* If jumbo enabled adjust MTU */
> -	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		eth_dev->data->mtu =3D
> -			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
> -			RTE_ETHER_HDR_LEN - QEDE_ETH_OVERHEAD;
> -
>  	if (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER)
>  		eth_dev->data->scattered_rx =3D 1;
>=20
> @@ -2315,7 +2309,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	struct ecore_dev *edev =3D QEDE_INIT_EDEV(qdev);
>  	struct rte_eth_dev_info dev_info =3D {0};
>  	struct qede_fastpath *fp;
> -	uint32_t max_rx_pkt_len;
>  	uint32_t frame_size;
>  	uint16_t bufsz;
>  	bool restart =3D false;
> @@ -2327,8 +2320,8 @@ static int qede_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		DP_ERR(edev, "Error during getting ethernet device info\n");
>  		return rc;
>  	}
> -	max_rx_pkt_len =3D mtu + QEDE_MAX_ETHER_HDR_LEN;
> -	frame_size =3D max_rx_pkt_len;
> +
> +	frame_size =3D mtu + QEDE_MAX_ETHER_HDR_LEN;
>  	if (mtu < RTE_ETHER_MIN_MTU || frame_size >
> dev_info.max_rx_pktlen) {
>  		DP_ERR(edev, "MTU %u out of range, %u is maximum
> allowable\n",
>  		       mtu, dev_info.max_rx_pktlen - RTE_ETHER_HDR_LEN -
> @@ -2368,7 +2361,7 @@ static int qede_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  			fp->rxq->rx_buf_size =3D rc;
>  		}
>  	}
> -	if (frame_size > QEDE_ETH_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		dev->data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		dev->data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> @@ -2378,9 +2371,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		dev->data->dev_started =3D 1;
>  	}
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D max_rx_pkt_len;
> -
>  	return 0;
>  }
>=20
> diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
> index 35cde561ba59..c2263787b4ec 100644
> --- a/drivers/net/qede/qede_rxtx.c
> +++ b/drivers/net/qede/qede_rxtx.c
> @@ -224,7 +224,7 @@ qede_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t qid,
>  	struct ecore_dev *edev =3D QEDE_INIT_EDEV(qdev);
>  	struct rte_eth_rxmode *rxmode =3D &dev->data->dev_conf.rxmode;
>  	struct qede_rx_queue *rxq;
> -	uint16_t max_rx_pkt_len;
> +	uint16_t max_rx_pktlen;
>  	uint16_t bufsz;
>  	int rc;
>=20
> @@ -243,21 +243,21 @@ qede_rx_queue_setup(struct rte_eth_dev *dev,
> uint16_t qid,
>  		dev->data->rx_queues[qid] =3D NULL;
>  	}
>=20
> -	max_rx_pkt_len =3D (uint16_t)rxmode->max_rx_pkt_len;
> +	max_rx_pktlen =3D dev->data->mtu + RTE_ETHER_HDR_LEN;
>=20
>  	/* Fix up RX buffer size */
>  	bufsz =3D (uint16_t)rte_pktmbuf_data_room_size(mp) -
> RTE_PKTMBUF_HEADROOM;
>  	/* cache align the mbuf size to simplfy rx_buf_size calculation */
>  	bufsz =3D QEDE_FLOOR_TO_CACHE_LINE_SIZE(bufsz);
>  	if ((rxmode->offloads & DEV_RX_OFFLOAD_SCATTER)	||
> -	    (max_rx_pkt_len + QEDE_ETH_OVERHEAD) > bufsz) {
> +	    (max_rx_pktlen + QEDE_ETH_OVERHEAD) > bufsz) {
>  		if (!dev->data->scattered_rx) {
>  			DP_INFO(edev, "Forcing scatter-gather mode\n");
>  			dev->data->scattered_rx =3D 1;
>  		}
>  	}
>=20
> -	rc =3D qede_calc_rx_buf_size(dev, bufsz, max_rx_pkt_len);
> +	rc =3D qede_calc_rx_buf_size(dev, bufsz, max_rx_pktlen);
>  	if (rc < 0)
>  		return rc;
>=20
> diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
> index 2db0d000c3ad..1f55c90b419d 100644
> --- a/drivers/net/sfc/sfc_ethdev.c
> +++ b/drivers/net/sfc/sfc_ethdev.c
> @@ -1066,15 +1066,13 @@ sfc_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>=20
>  	/*
>  	 * The driver does not use it, but other PMDs update jumbo frame
> -	 * flag and max_rx_pkt_len when MTU is set.
> +	 * flag when MTU is set.
>  	 */
>  	if (mtu > RTE_ETHER_MTU) {
>  		struct rte_eth_rxmode *rxmode =3D &dev->data-
> >dev_conf.rxmode;
>  		rxmode->offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	}
>=20
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D sa->port.pdu;
> -
>  	sfc_adapter_unlock(sa);
>=20
>  	sfc_log_init(sa, "done");
> diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
> index adb2b2cb8175..22f74735db08 100644
> --- a/drivers/net/sfc/sfc_port.c
> +++ b/drivers/net/sfc/sfc_port.c
> @@ -383,14 +383,10 @@ sfc_port_configure(struct sfc_adapter *sa)
>  {
>  	const struct rte_eth_dev_data *dev_data =3D sa->eth_dev->data;
>  	struct sfc_port *port =3D &sa->port;
> -	const struct rte_eth_rxmode *rxmode =3D &dev_data-
> >dev_conf.rxmode;
>=20
>  	sfc_log_init(sa, "entry");
>=20
> -	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		port->pdu =3D rxmode->max_rx_pkt_len;
> -	else
> -		port->pdu =3D EFX_MAC_PDU(dev_data->mtu);
> +	port->pdu =3D EFX_MAC_PDU(dev_data->mtu);
>=20
>  	return 0;
>  }
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.=
c
> index c515de3bf71d..0a8d29277aeb 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -1627,13 +1627,8 @@ tap_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  {
>  	struct pmd_internals *pmd =3D dev->data->dev_private;
>  	struct ifreq ifr =3D { .ifr_mtu =3D mtu };
> -	int err =3D 0;
>=20
> -	err =3D tap_ioctl(pmd, SIOCSIFMTU, &ifr, 1, LOCAL_AND_REMOTE);
> -	if (!err)
> -		dev->data->mtu =3D mtu;
> -
> -	return err;
> +	return tap_ioctl(pmd, SIOCSIFMTU, &ifr, 1, LOCAL_AND_REMOTE);
>  }
>=20
>  static int
> diff --git a/drivers/net/thunderx/nicvf_ethdev.c
> b/drivers/net/thunderx/nicvf_ethdev.c
> index 561a98fc81a3..c8ae95a61306 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.c
> +++ b/drivers/net/thunderx/nicvf_ethdev.c
> @@ -176,7 +176,7 @@ nicvf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		(frame_size + 2 * VLAN_TAG_SIZE > buffsz *
> NIC_HW_MAX_SEGS))
>  		return -EINVAL;
>=20
> -	if (frame_size > NIC_HW_L2_MAX_LEN)
> +	if (mtu > RTE_ETHER_MTU)
>  		rxmode->offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		rxmode->offloads &=3D ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> @@ -184,8 +184,6 @@ nicvf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t
> mtu)
>  	if (nicvf_mbox_update_hw_max_frs(nic, mtu))
>  		return -EINVAL;
>=20
> -	/* Update max_rx_pkt_len */
> -	rxmode->max_rx_pkt_len =3D mtu + RTE_ETHER_HDR_LEN;
>  	nic->mtu =3D mtu;
>=20
>  	for (i =3D 0; i < nic->sqs_count; i++)
> @@ -1724,16 +1722,13 @@ nicvf_dev_start(struct rte_eth_dev *dev)
>  	}
>=20
>  	/* Setup scatter mode if needed by jumbo */
> -	if (dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -					    2 * VLAN_TAG_SIZE > buffsz)
> +	if (dev->data->mtu + (uint32_t)NIC_HW_L2_OVERHEAD + 2 *
> VLAN_TAG_SIZE > buffsz)
>  		dev->data->scattered_rx =3D 1;
>  	if ((rx_conf->offloads & DEV_RX_OFFLOAD_SCATTER) !=3D 0)
>  		dev->data->scattered_rx =3D 1;
>=20
> -	/* Setup MTU based on max_rx_pkt_len or default */
> -	mtu =3D dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME ?
> -		dev->data->dev_conf.rxmode.max_rx_pkt_len
> -			-  RTE_ETHER_HDR_LEN : RTE_ETHER_MTU;
> +	/* Setup MTU */
> +	mtu =3D dev->data->mtu;
>=20
>  	if (nicvf_dev_set_mtu(dev, mtu)) {
>  		PMD_INIT_LOG(ERR, "Failed to set default mtu size");
> diff --git a/drivers/net/txgbe/txgbe_ethdev.c
> b/drivers/net/txgbe/txgbe_ethdev.c
> index 006399468841..269de9f848dd 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.c
> +++ b/drivers/net/txgbe/txgbe_ethdev.c
> @@ -3486,8 +3486,11 @@ txgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EINVAL;
>  	}
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D frame_size;
> +	/* switch to jumbo mode if needed */
> +	if (mtu > RTE_ETHER_MTU)
> +		dev->data->dev_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
> +		dev->data->dev_conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
>  	if (hw->mode)
>  		wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
> diff --git a/drivers/net/txgbe/txgbe_ethdev.h
> b/drivers/net/txgbe/txgbe_ethdev.h
> index 3021933965c8..44cfcd76bca4 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.h
> +++ b/drivers/net/txgbe/txgbe_ethdev.h
> @@ -55,6 +55,10 @@
>  #define TXGBE_5TUPLE_MAX_PRI            7
>  #define TXGBE_5TUPLE_MIN_PRI            1
>=20
> +
> +/* The overhead from MTU to max frame size. */
> +#define TXGBE_ETH_OVERHEAD (RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN)
> +
>  #define TXGBE_RSS_OFFLOAD_ALL ( \
>  	ETH_RSS_IPV4 | \
>  	ETH_RSS_NONFRAG_IPV4_TCP | \
> diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c
> b/drivers/net/txgbe/txgbe_ethdev_vf.c
> index 896da8a88770..43dc0ed39b75 100644
> --- a/drivers/net/txgbe/txgbe_ethdev_vf.c
> +++ b/drivers/net/txgbe/txgbe_ethdev_vf.c
> @@ -1128,8 +1128,6 @@ txgbevf_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	if (txgbevf_rlpml_set_vf(hw, max_frame))
>  		return -EINVAL;
>=20
> -	/* update max frame size */
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D max_frame;
>  	return 0;
>  }
>=20
> diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxt=
x.c
> index 1a261287d1bd..c6cd3803c434 100644
> --- a/drivers/net/txgbe/txgbe_rxtx.c
> +++ b/drivers/net/txgbe/txgbe_rxtx.c
> @@ -4305,13 +4305,8 @@ txgbe_dev_rx_init(struct rte_eth_dev *dev)
>  	/*
>  	 * Configure jumbo frame support, if any.
>  	 */
> -	if (rx_conf->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -		wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
> -			TXGBE_FRMSZ_MAX(rx_conf->max_rx_pkt_len));
> -	} else {
> -		wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
> -			TXGBE_FRMSZ_MAX(TXGBE_FRAME_SIZE_DFT));
> -	}
> +	wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
> +		TXGBE_FRMSZ_MAX(dev->data->mtu +
> TXGBE_ETH_OVERHEAD));
>=20
>  	/*
>  	 * If loopback mode is configured, set LPBK bit.
> @@ -4373,8 +4368,8 @@ txgbe_dev_rx_init(struct rte_eth_dev *dev)
>  		wr32(hw, TXGBE_RXCFG(rxq->reg_idx), srrctl);
>=20
>  		/* It adds dual VLAN length for supporting dual VLAN */
> -		if (dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -					    2 * TXGBE_VLAN_TAG_SIZE >
> buf_size)
> +		if (dev->data->mtu + TXGBE_ETH_OVERHEAD +
> +				2 * TXGBE_VLAN_TAG_SIZE > buf_size)
>  			dev->data->scattered_rx =3D 1;
>  		if (rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
>  			rx_conf->offloads |=3D DEV_RX_OFFLOAD_VLAN_STRIP;
> @@ -4826,9 +4821,9 @@ txgbevf_dev_rx_init(struct rte_eth_dev *dev)
>  	 * VF packets received can work in all cases.
>  	 */
>  	if (txgbevf_rlpml_set_vf(hw,
> -	    (uint16_t)dev->data->dev_conf.rxmode.max_rx_pkt_len)) {
> +	    (uint16_t)dev->data->mtu + TXGBE_ETH_OVERHEAD)) {
>  		PMD_INIT_LOG(ERR, "Set max packet length to %d failed.",
> -			     dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +			     dev->data->mtu + TXGBE_ETH_OVERHEAD);
>  		return -EINVAL;
>  	}
>=20
> @@ -4890,7 +4885,7 @@ txgbevf_dev_rx_init(struct rte_eth_dev *dev)
>=20
>  		if (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER ||
>  		    /* It adds dual VLAN length for supporting dual VLAN */
> -		    (rxmode->max_rx_pkt_len +
> +		    (dev->data->mtu + TXGBE_ETH_OVERHEAD +
>  				2 * TXGBE_VLAN_TAG_SIZE) > buf_size) {
>  			if (!dev->data->scattered_rx)
>  				PMD_INIT_LOG(DEBUG, "forcing scatter
> mode");
> diff --git a/drivers/net/virtio/virtio_ethdev.c
> b/drivers/net/virtio/virtio_ethdev.c
> index b60eeb24abe7..5d341a3e23bb 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -930,7 +930,6 @@ virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
>  	}
>=20
>  	hw->max_rx_pkt_len =3D frame_size;
> -	dev->data->dev_conf.rxmode.max_rx_pkt_len =3D hw-
> >max_rx_pkt_len;
>=20
>  	return 0;
>  }
> @@ -2116,14 +2115,10 @@ virtio_dev_configure(struct rte_eth_dev *dev)
>  			return ret;
>  	}
>=20
> -	if ((rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) &&
> -	    (rxmode->max_rx_pkt_len > hw->max_mtu + ether_hdr_len))
> +	if (rxmode->mtu > hw->max_mtu)
>  		req_features &=3D ~(1ULL << VIRTIO_NET_F_MTU);
>=20
> -	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> -		hw->max_rx_pkt_len =3D rxmode->max_rx_pkt_len;
> -	else
> -		hw->max_rx_pkt_len =3D ether_hdr_len + dev->data->mtu;
> +	hw->max_rx_pkt_len =3D ether_hdr_len + rxmode->mtu;
>=20
>  	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM |
>  			   DEV_RX_OFFLOAD_TCP_CKSUM))
> diff --git a/examples/bbdev_app/main.c b/examples/bbdev_app/main.c
> index adbd40808396..68e3c13730ad 100644
> --- a/examples/bbdev_app/main.c
> +++ b/examples/bbdev_app/main.c
> @@ -72,7 +72,6 @@ mbuf_input(struct rte_mbuf *mbuf)
>  static const struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> diff --git a/examples/bond/main.c b/examples/bond/main.c
> index a63ca70a7f06..25ca459be57b 100644
> --- a/examples/bond/main.c
> +++ b/examples/bond/main.c
> @@ -116,7 +116,6 @@ static struct rte_mempool *mbuf_pool;
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.rx_adv_conf =3D {
> diff --git a/examples/distributor/main.c b/examples/distributor/main.c
> index d0f40a1fb4bc..8c4a8feec0c2 100644
> --- a/examples/distributor/main.c
> +++ b/examples/distributor/main.c
> @@ -81,7 +81,6 @@ struct app_stats prev_app_stats;
>  static const struct rte_eth_conf port_conf_default =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  	},
>  	.txmode =3D {
>  		.mq_mode =3D ETH_MQ_TX_NONE,
> diff --git a/examples/eventdev_pipeline/pipeline_worker_generic.c
> b/examples/eventdev_pipeline/pipeline_worker_generic.c
> index 5ed0dc73ec60..e26be8edf28f 100644
> --- a/examples/eventdev_pipeline/pipeline_worker_generic.c
> +++ b/examples/eventdev_pipeline/pipeline_worker_generic.c
> @@ -284,7 +284,6 @@ port_init(uint8_t port, struct rte_mempool
> *mbuf_pool)
>  	static const struct rte_eth_conf port_conf_default =3D {
>  		.rxmode =3D {
>  			.mq_mode =3D ETH_MQ_RX_RSS,
> -			.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		},
>  		.rx_adv_conf =3D {
>  			.rss_conf =3D {
> diff --git a/examples/eventdev_pipeline/pipeline_worker_tx.c
> b/examples/eventdev_pipeline/pipeline_worker_tx.c
> index ab8c6d6a0dad..476b147bdfcc 100644
> --- a/examples/eventdev_pipeline/pipeline_worker_tx.c
> +++ b/examples/eventdev_pipeline/pipeline_worker_tx.c
> @@ -615,7 +615,6 @@ port_init(uint8_t port, struct rte_mempool
> *mbuf_pool)
>  	static const struct rte_eth_conf port_conf_default =3D {
>  		.rxmode =3D {
>  			.mq_mode =3D ETH_MQ_RX_RSS,
> -			.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		},
>  		.rx_adv_conf =3D {
>  			.rss_conf =3D {
> diff --git a/examples/flow_classify/flow_classify.c
> b/examples/flow_classify/flow_classify.c
> index 65c1d85cf2fb..8a43f6ac0f92 100644
> --- a/examples/flow_classify/flow_classify.c
> +++ b/examples/flow_classify/flow_classify.c
> @@ -59,14 +59,6 @@ static struct{
>  } parm_config;
>  const char cb_port_delim[] =3D ":";
>=20
> -/* Ethernet ports configured with default settings using struct. 8< */
> -static const struct rte_eth_conf port_conf_default =3D {
> -	.rxmode =3D {
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
> -	},
> -};
> -/* >8 End of configuration of Ethernet ports. */
> -
>  /* Creation of flow classifier object. 8< */
>  struct flow_classifier {
>  	struct rte_flow_classifier *cls;
> @@ -200,7 +192,7 @@ static struct rte_flow_attr attr;
>  static inline int
>  port_init(uint8_t port, struct rte_mempool *mbuf_pool)
>  {
> -	struct rte_eth_conf port_conf =3D port_conf_default;
> +	struct rte_eth_conf port_conf;
>  	struct rte_ether_addr addr;
>  	const uint16_t rx_rings =3D 1, tx_rings =3D 1;
>  	int retval;
> @@ -211,6 +203,8 @@ port_init(uint8_t port, struct rte_mempool
> *mbuf_pool)
>  	if (!rte_eth_dev_is_valid_port(port))
>  		return -1;
>=20
> +	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
> +
>  	retval =3D rte_eth_dev_info_get(port, &dev_info);
>  	if (retval !=3D 0) {
>  		printf("Error during getting device (port %u) info: %s\n",
> diff --git a/examples/ioat/ioatfwd.c b/examples/ioat/ioatfwd.c
> index b3977a8be561..fdc66368dce9 100644
> --- a/examples/ioat/ioatfwd.c
> +++ b/examples/ioat/ioatfwd.c
> @@ -820,7 +820,6 @@ port_init(uint16_t portid, struct rte_mempool
> *mbuf_pool, uint16_t nb_queues)
>  	static const struct rte_eth_conf port_conf =3D {
>  		.rxmode =3D {
>  			.mq_mode =3D ETH_MQ_RX_RSS,
> -			.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN
>  		},
>  		.rx_adv_conf =3D {
>  			.rss_conf =3D {
> diff --git a/examples/ip_fragmentation/main.c
> b/examples/ip_fragmentation/main.c
> index f24536972084..12062a785dc6 100644
> --- a/examples/ip_fragmentation/main.c
> +++ b/examples/ip_fragmentation/main.c
> @@ -146,7 +146,8 @@ struct lcore_queue_conf
> lcore_queue_conf[RTE_MAX_LCORE];
>=20
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
> -		.max_rx_pkt_len =3D JUMBO_FRAME_MAX_SIZE,
> +		.mtu =3D JUMBO_FRAME_MAX_SIZE - RTE_ETHER_HDR_LEN -
> +			RTE_ETHER_CRC_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D (DEV_RX_OFFLOAD_CHECKSUM |
>  			     DEV_RX_OFFLOAD_SCATTER |
> @@ -918,9 +919,9 @@ main(int argc, char **argv)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> -		local_port_conf.rxmode.max_rx_pkt_len =3D RTE_MIN(
> -		    dev_info.max_rx_pktlen,
> -		    local_port_conf.rxmode.max_rx_pkt_len);
> +		local_port_conf.rxmode.mtu =3D RTE_MIN(
> +		    dev_info.max_mtu,
> +		    local_port_conf.rxmode.mtu);
>=20
>  		/* get the lcore_id for this port */
>  		while (rte_lcore_is_enabled(rx_lcore_id) =3D=3D 0 ||
> @@ -963,8 +964,7 @@ main(int argc, char **argv)
>  		}
>=20
>  		/* set the mtu to the maximum received packet size */
> -		ret =3D rte_eth_dev_set_mtu(portid,
> -			local_port_conf.rxmode.max_rx_pkt_len -
> MTU_OVERHEAD);
> +		ret =3D rte_eth_dev_set_mtu(portid,
> local_port_conf.rxmode.mtu);
>  		if (ret < 0) {
>  			printf("\n");
>  			rte_exit(EXIT_FAILURE, "Set MTU failed: "
> diff --git a/examples/ip_pipeline/link.c b/examples/ip_pipeline/link.c
> index 16bcffe356bc..9ba02e687adb 100644
> --- a/examples/ip_pipeline/link.c
> +++ b/examples/ip_pipeline/link.c
> @@ -46,7 +46,7 @@ static struct rte_eth_conf port_conf_default =3D {
>  	.link_speeds =3D 0,
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D 9000, /* Jumbo frame max packet len */
> +		.mtu =3D 9000 - (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN),
> /* Jumbo frame MTU */
>  		.split_hdr_size =3D 0, /* Header split buffer size */
>  	},
>  	.rx_adv_conf =3D {
> diff --git a/examples/ip_reassembly/main.c
> b/examples/ip_reassembly/main.c
> index 8645ac790be4..e5c7d46d2caa 100644
> --- a/examples/ip_reassembly/main.c
> +++ b/examples/ip_reassembly/main.c
> @@ -162,7 +162,8 @@ static struct lcore_queue_conf
> lcore_queue_conf[RTE_MAX_LCORE];
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode        =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D JUMBO_FRAME_MAX_SIZE,
> +		.mtu =3D JUMBO_FRAME_MAX_SIZE - RTE_ETHER_HDR_LEN -
> +			RTE_ETHER_CRC_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D (DEV_RX_OFFLOAD_CHECKSUM |
>  			     DEV_RX_OFFLOAD_JUMBO_FRAME),
> @@ -882,7 +883,8 @@ setup_queue_tbl(struct rx_queue *rxq, uint32_t
> lcore, uint32_t queue)
>=20
>  	/* mbufs stored int the gragment table. 8< */
>  	nb_mbuf =3D RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST) *
> MAX_FRAG_NUM;
> -	nb_mbuf *=3D (port_conf.rxmode.max_rx_pkt_len + BUF_SIZE - 1) /
> BUF_SIZE;
> +	nb_mbuf *=3D (port_conf.rxmode.mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN
> +			+ BUF_SIZE - 1) / BUF_SIZE;
>  	nb_mbuf *=3D 2; /* ipv4 and ipv6 */
>  	nb_mbuf +=3D nb_rxd + nb_txd;
>=20
> @@ -1054,9 +1056,9 @@ main(int argc, char **argv)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> -		local_port_conf.rxmode.max_rx_pkt_len =3D RTE_MIN(
> -		    dev_info.max_rx_pktlen,
> -		    local_port_conf.rxmode.max_rx_pkt_len);
> +		local_port_conf.rxmode.mtu =3D RTE_MIN(
> +		    dev_info.max_mtu,
> +		    local_port_conf.rxmode.mtu);
>=20
>  		/* get the lcore_id for this port */
>  		while (rte_lcore_is_enabled(rx_lcore_id) =3D=3D 0 ||
> diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-
> secgw/ipsec-secgw.c
> index 7ad94cb8228b..d032a47d1c3b 100644
> --- a/examples/ipsec-secgw/ipsec-secgw.c
> +++ b/examples/ipsec-secgw/ipsec-secgw.c
> @@ -235,7 +235,6 @@ static struct lcore_conf lcore_conf[RTE_MAX_LCORE];
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode	=3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_CHECKSUM,
>  	},
> @@ -2163,7 +2162,6 @@ cryptodevs_init(uint16_t req_queue_num)
>  static void
>  port_init(uint16_t portid, uint64_t req_rx_offloads, uint64_t req_tx_off=
loads)
>  {
> -	uint32_t frame_size;
>  	struct rte_eth_dev_info dev_info;
>  	struct rte_eth_txconf *txconf;
>  	uint16_t nb_tx_queue, nb_rx_queue;
> @@ -2211,10 +2209,9 @@ port_init(uint16_t portid, uint64_t
> req_rx_offloads, uint64_t req_tx_offloads)
>  	printf("Creating queues: nb_rx_queue=3D%d nb_tx_queue=3D%u...\n",
>  			nb_rx_queue, nb_tx_queue);
>=20
> -	frame_size =3D MTU_TO_FRAMELEN(mtu_size);
> -	if (frame_size > local_port_conf.rxmode.max_rx_pkt_len)
> +	if (mtu_size > RTE_ETHER_MTU)
>  		local_port_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	local_port_conf.rxmode.max_rx_pkt_len =3D frame_size;
> +	local_port_conf.rxmode.mtu =3D mtu_size;
>=20
>  	if (multi_seg_required()) {
>  		local_port_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_SCATTER;
> diff --git a/examples/ipv4_multicast/main.c
> b/examples/ipv4_multicast/main.c
> index cc527d7f6b38..b3993685ec92 100644
> --- a/examples/ipv4_multicast/main.c
> +++ b/examples/ipv4_multicast/main.c
> @@ -110,7 +110,8 @@ static struct lcore_queue_conf
> lcore_queue_conf[RTE_MAX_LCORE];
>=20
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
> -		.max_rx_pkt_len =3D JUMBO_FRAME_MAX_SIZE,
> +		.mtu =3D JUMBO_FRAME_MAX_SIZE - RTE_ETHER_HDR_LEN -
> +			RTE_ETHER_CRC_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_JUMBO_FRAME,
>  	},
> @@ -715,9 +716,9 @@ main(int argc, char **argv)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> -		local_port_conf.rxmode.max_rx_pkt_len =3D RTE_MIN(
> -		    dev_info.max_rx_pktlen,
> -		    local_port_conf.rxmode.max_rx_pkt_len);
> +		local_port_conf.rxmode.mtu =3D RTE_MIN(
> +		    dev_info.max_mtu,
> +		    local_port_conf.rxmode.mtu);
>=20
>  		/* get the lcore_id for this port */
>  		while (rte_lcore_is_enabled(rx_lcore_id) =3D=3D 0 ||
> diff --git a/examples/kni/main.c b/examples/kni/main.c
> index beabb3c848aa..c10814c6a94f 100644
> --- a/examples/kni/main.c
> +++ b/examples/kni/main.c
> @@ -791,14 +791,12 @@ kni_change_mtu_(uint16_t port_id, unsigned int
> new_mtu)
>=20
>  	memcpy(&conf, &port_conf, sizeof(conf));
>  	/* Set new MTU */
> -	if (new_mtu > RTE_ETHER_MAX_LEN)
> +	if (new_mtu > RTE_ETHER_MTU)
>  		conf.rxmode.offloads |=3D DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	else
>  		conf.rxmode.offloads &=3D
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>=20
> -	/* mtu + length of header + length of FCS =3D max pkt length */
> -	conf.rxmode.max_rx_pkt_len =3D new_mtu + KNI_ENET_HEADER_SIZE
> +
> -							KNI_ENET_FCS_SIZE;
> +	conf.rxmode.mtu =3D new_mtu;
>  	ret =3D rte_eth_dev_configure(port_id, 1, 1, &conf);
>  	if (ret < 0) {
>  		RTE_LOG(ERR, APP, "Fail to reconfigure port %d\n", port_id);
> diff --git a/examples/l2fwd-cat/l2fwd-cat.c b/examples/l2fwd-cat/l2fwd-ca=
t.c
> index 9b3e324efb23..d9cf00c9dfc7 100644
> --- a/examples/l2fwd-cat/l2fwd-cat.c
> +++ b/examples/l2fwd-cat/l2fwd-cat.c
> @@ -19,10 +19,6 @@
>  #define MBUF_CACHE_SIZE 250
>  #define BURST_SIZE 32
>=20
> -static const struct rte_eth_conf port_conf_default =3D {
> -	.rxmode =3D { .max_rx_pkt_len =3D RTE_ETHER_MAX_LEN }
> -};
> -
>  /* l2fwd-cat.c: CAT enabled, basic DPDK skeleton forwarding example. */
>=20
>  /*
> @@ -32,7 +28,7 @@ static const struct rte_eth_conf port_conf_default =3D =
{
>  static inline int
>  port_init(uint16_t port, struct rte_mempool *mbuf_pool)
>  {
> -	struct rte_eth_conf port_conf =3D port_conf_default;
> +	struct rte_eth_conf port_conf;
>  	const uint16_t rx_rings =3D 1, tx_rings =3D 1;
>  	int retval;
>  	uint16_t q;
> @@ -42,6 +38,8 @@ port_init(uint16_t port, struct rte_mempool
> *mbuf_pool)
>  	if (!rte_eth_dev_is_valid_port(port))
>  		return -1;
>=20
> +	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
> +
>  	/* Configure the Ethernet device. */
>  	retval =3D rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);
>  	if (retval !=3D 0)
> diff --git a/examples/l2fwd-crypto/main.c b/examples/l2fwd-crypto/main.c
> index 66d1491bf76d..f9438176cbb1 100644
> --- a/examples/l2fwd-crypto/main.c
> +++ b/examples/l2fwd-crypto/main.c
> @@ -217,7 +217,6 @@ struct lcore_queue_conf
> lcore_queue_conf[RTE_MAX_LCORE];
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> diff --git a/examples/l2fwd-event/l2fwd_common.c b/examples/l2fwd-
> event/l2fwd_common.c
> index 19f32809aa9d..9040be5ed9b6 100644
> --- a/examples/l2fwd-event/l2fwd_common.c
> +++ b/examples/l2fwd-event/l2fwd_common.c
> @@ -11,7 +11,6 @@ l2fwd_event_init_ports(struct l2fwd_resources *rsrc)
>  	uint16_t nb_txd =3D RTE_TEST_TX_DESC_DEFAULT;
>  	struct rte_eth_conf port_conf =3D {
>  		.rxmode =3D {
> -			.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  			.split_hdr_size =3D 0,
>  		},
>  		.txmode =3D {
> diff --git a/examples/l3fwd-acl/main.c b/examples/l3fwd-acl/main.c
> index a1f457b564b6..7abb612ee6a4 100644
> --- a/examples/l3fwd-acl/main.c
> +++ b/examples/l3fwd-acl/main.c
> @@ -125,7 +125,6 @@ static uint16_t nb_lcore_params =3D
> sizeof(lcore_params_array_default) /
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode	=3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_CHECKSUM,
>  	},
> @@ -141,6 +140,8 @@ static struct rte_eth_conf port_conf =3D {
>  	},
>  };
>=20
> +static uint16_t max_pkt_len;
> +
>  static struct rte_mempool *pktmbuf_pool[NB_SOCKETS];
>=20
>  /* ethernet addresses of ports */
> @@ -201,8 +202,8 @@ enum {
>  	OPT_CONFIG_NUM =3D 256,
>  #define OPT_NONUMA      "no-numa"
>  	OPT_NONUMA_NUM,
> -#define OPT_ENBJMO      "enable-jumbo"
> -	OPT_ENBJMO_NUM,
> +#define OPT_MAX_PKT_LEN "max-pkt-len"
> +	OPT_MAX_PKT_LEN_NUM,
>  #define OPT_RULE_IPV4   "rule_ipv4"
>  	OPT_RULE_IPV4_NUM,
>  #define OPT_RULE_IPV6	"rule_ipv6"
> @@ -1619,26 +1620,21 @@ print_usage(const char *prgname)
>=20
>  	usage_acl_alg(alg, sizeof(alg));
>  	printf("%s [EAL options] -- -p PORTMASK -P"
> -		"--"OPT_RULE_IPV4"=3DFILE"
> -		"--"OPT_RULE_IPV6"=3DFILE"
> +		"  --"OPT_RULE_IPV4"=3DFILE"
> +		"  --"OPT_RULE_IPV6"=3DFILE"
>  		"  [--"OPT_CONFIG" (port,queue,lcore)[,(port,queue,lcore]]"
> -		"  [--"OPT_ENBJMO" [--max-pkt-len PKTLEN]]\n"
> +		"  [--"OPT_MAX_PKT_LEN" PKTLEN]\n"
>  		"  -p PORTMASK: hexadecimal bitmask of ports to
> configure\n"
> -		"  -P : enable promiscuous mode\n"
> -		"  --"OPT_CONFIG": (port,queue,lcore): "
> -		"rx queues configuration\n"
> +		"  -P: enable promiscuous mode\n"
> +		"  --"OPT_CONFIG" (port,queue,lcore): rx queues
> configuration\n"
>  		"  --"OPT_NONUMA": optional, disable numa awareness\n"
> -		"  --"OPT_ENBJMO": enable jumbo frame"
> -		" which max packet len is PKTLEN in decimal (64-9600)\n"
> -		"  --"OPT_RULE_IPV4"=3DFILE: specify the ipv4 rules entries "
> -		"file. "
> +		"  --"OPT_MAX_PKT_LEN" PKTLEN: maximum packet length in
> decimal (64-9600)\n"
> +		"  --"OPT_RULE_IPV4"=3DFILE: specify the ipv4 rules entries file.
> "
>  		"Each rule occupy one line. "
>  		"2 kinds of rules are supported. "
>  		"One is ACL entry at while line leads with character '%c', "
> -		"another is route entry at while line leads with "
> -		"character '%c'.\n"
> -		"  --"OPT_RULE_IPV6"=3DFILE: specify the ipv6 rules "
> -		"entries file.\n"
> +		"another is route entry at while line leads with character
> '%c'.\n"
> +		"  --"OPT_RULE_IPV6"=3DFILE: specify the ipv6 rules entries
> file.\n"
>  		"  --"OPT_ALG": ACL classify method to use, one of: %s\n",
>  		prgname, ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
>  }
> @@ -1758,14 +1754,14 @@ parse_args(int argc, char **argv)
>  	int option_index;
>  	char *prgname =3D argv[0];
>  	static struct option lgopts[] =3D {
> -		{OPT_CONFIG,    1, NULL, OPT_CONFIG_NUM    },
> -		{OPT_NONUMA,    0, NULL, OPT_NONUMA_NUM    },
> -		{OPT_ENBJMO,    0, NULL, OPT_ENBJMO_NUM    },
> -		{OPT_RULE_IPV4, 1, NULL, OPT_RULE_IPV4_NUM },
> -		{OPT_RULE_IPV6, 1, NULL, OPT_RULE_IPV6_NUM },
> -		{OPT_ALG,       1, NULL, OPT_ALG_NUM       },
> -		{OPT_ETH_DEST,  1, NULL, OPT_ETH_DEST_NUM  },
> -		{NULL,          0, 0,    0                 }
> +		{OPT_CONFIG,      1, NULL, OPT_CONFIG_NUM      },
> +		{OPT_NONUMA,      0, NULL, OPT_NONUMA_NUM      },
> +		{OPT_MAX_PKT_LEN, 1, NULL, OPT_MAX_PKT_LEN_NUM },
> +		{OPT_RULE_IPV4,   1, NULL, OPT_RULE_IPV4_NUM   },
> +		{OPT_RULE_IPV6,   1, NULL, OPT_RULE_IPV6_NUM   },
> +		{OPT_ALG,         1, NULL, OPT_ALG_NUM         },
> +		{OPT_ETH_DEST,    1, NULL, OPT_ETH_DEST_NUM    },
> +		{NULL,            0, 0,    0                   }
>  	};
>=20
>  	argvopt =3D argv;
> @@ -1804,43 +1800,11 @@ parse_args(int argc, char **argv)
>  			numa_on =3D 0;
>  			break;
>=20
> -		case OPT_ENBJMO_NUM:
> -		{
> -			struct option lenopts =3D {
> -				"max-pkt-len",
> -				required_argument,
> -				0,
> -				0
> -			};
> -
> -			printf("jumbo frame is enabled\n");
> -			port_conf.rxmode.offloads |=3D
> -					DEV_RX_OFFLOAD_JUMBO_FRAME;
> -			port_conf.txmode.offloads |=3D
> -					DEV_TX_OFFLOAD_MULTI_SEGS;
> -
> -			/*
> -			 * if no max-pkt-len set, then use the
> -			 * default value RTE_ETHER_MAX_LEN
> -			 */
> -			if (getopt_long(argc, argvopt, "",
> -					&lenopts, &option_index) =3D=3D 0) {
> -				ret =3D parse_max_pkt_len(optarg);
> -				if ((ret < 64) ||
> -					(ret > MAX_JUMBO_PKT_LEN)) {
> -					printf("invalid packet "
> -						"length\n");
> -					print_usage(prgname);
> -					return -1;
> -				}
> -				port_conf.rxmode.max_rx_pkt_len =3D ret;
> -			}
> -			printf("set jumbo frame max packet length "
> -				"to %u\n",
> -				(unsigned int)
> -				port_conf.rxmode.max_rx_pkt_len);
> +		case OPT_MAX_PKT_LEN_NUM:
> +			printf("Custom frame size is configured\n");
> +			max_pkt_len =3D parse_max_pkt_len(optarg);
>  			break;
> -		}
> +
>  		case OPT_RULE_IPV4_NUM:
>  			parm_config.rule_ipv4_name =3D optarg;
>  			break;
> @@ -2007,6 +1971,43 @@ set_default_dest_mac(void)
>  	}
>  }
>=20
> +static uint16_t
> +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_mtu !=3D UINT16_MAX && max_rx_pktlen > max_mtu)
> +		overhead_len =3D max_rx_pktlen - max_mtu;
> +	else
> +		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return overhead_len;
> +}
> +
> +static int
> +config_port_max_pkt_len(struct rte_eth_conf *conf,
> +		struct rte_eth_dev_info *dev_info)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_pkt_len =3D=3D 0)
> +		return 0;
> +
> +	if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len >
> MAX_JUMBO_PKT_LEN)
> +		return -1;
> +
> +	overhead_len =3D eth_dev_get_overhead_len(dev_info-
> >max_rx_pktlen,
> +			dev_info->max_mtu);
> +	conf->rxmode.mtu =3D max_pkt_len - overhead_len;
> +
> +	if (conf->rxmode.mtu > RTE_ETHER_MTU) {
> +		conf->txmode.offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
> +		conf->rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	}
> +
> +	return 0;
> +}
> +
>  int
>  main(int argc, char **argv)
>  {
> @@ -2080,6 +2081,12 @@ main(int argc, char **argv)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> +		ret =3D config_port_max_pkt_len(&local_port_conf, &dev_info);
> +		if (ret !=3D 0)
> +			rte_exit(EXIT_FAILURE,
> +				"Invalid max packet length: %u (port %u)\n",
> +				max_pkt_len, portid);
> +
>  		if (dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_MBUF_FAST_FREE)
>  			local_port_conf.txmode.offloads |=3D
>  				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> diff --git a/examples/l3fwd-graph/main.c b/examples/l3fwd-graph/main.c
> index a0de8ca9b42d..b431b9ff5f3c 100644
> --- a/examples/l3fwd-graph/main.c
> +++ b/examples/l3fwd-graph/main.c
> @@ -112,7 +112,6 @@ static uint16_t nb_lcore_params =3D
> RTE_DIM(lcore_params_array_default);
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.rx_adv_conf =3D {
> @@ -126,6 +125,8 @@ static struct rte_eth_conf port_conf =3D {
>  	},
>  };
>=20
> +static uint16_t max_pkt_len;
> +
>  static struct rte_mempool
> *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];
>=20
>  static struct rte_node_ethdev_config ethdev_conf[RTE_MAX_ETHPORTS];
> @@ -259,7 +260,7 @@ print_usage(const char *prgname)
>  		" [-P]"
>  		" --config (port,queue,lcore)[,(port,queue,lcore)]"
>  		" [--eth-dest=3DX,MM:MM:MM:MM:MM:MM]"
> -		" [--enable-jumbo [--max-pkt-len PKTLEN]]"
> +		" [--max-pkt-len PKTLEN]"
>  		" [--no-numa]"
>  		" [--per-port-pool]\n\n"
>=20
> @@ -268,9 +269,7 @@ print_usage(const char *prgname)
>  		"  --config (port,queue,lcore): Rx queue configuration\n"
>  		"  --eth-dest=3DX,MM:MM:MM:MM:MM:MM: Ethernet
> destination for "
>  		"port X\n"
> -		"  --enable-jumbo: Enable jumbo frames\n"
> -		"  --max-pkt-len: Under the premise of enabling jumbo,\n"
> -		"                 maximum packet length in decimal (64-9600)\n"
> +		"  --max-pkt-len PKTLEN: maximum packet length in decimal
> (64-9600)\n"
>  		"  --no-numa: Disable numa awareness\n"
>  		"  --per-port-pool: Use separate buffer pool per port\n\n",
>  		prgname);
> @@ -404,7 +403,7 @@ static const char short_options[] =3D "p:" /* portmas=
k
> */
>  #define CMD_LINE_OPT_CONFIG	   "config"
>  #define CMD_LINE_OPT_ETH_DEST	   "eth-dest"
>  #define CMD_LINE_OPT_NO_NUMA	   "no-numa"
> -#define CMD_LINE_OPT_ENABLE_JUMBO  "enable-jumbo"
> +#define CMD_LINE_OPT_MAX_PKT_LEN   "max-pkt-len"
>  #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
>  enum {
>  	/* Long options mapped to a short option */
> @@ -416,7 +415,7 @@ enum {
>  	CMD_LINE_OPT_CONFIG_NUM,
>  	CMD_LINE_OPT_ETH_DEST_NUM,
>  	CMD_LINE_OPT_NO_NUMA_NUM,
> -	CMD_LINE_OPT_ENABLE_JUMBO_NUM,
> +	CMD_LINE_OPT_MAX_PKT_LEN_NUM,
>  	CMD_LINE_OPT_PARSE_PER_PORT_POOL,
>  };
>=20
> @@ -424,7 +423,7 @@ static const struct option lgopts[] =3D {
>  	{CMD_LINE_OPT_CONFIG, 1, 0, CMD_LINE_OPT_CONFIG_NUM},
>  	{CMD_LINE_OPT_ETH_DEST, 1, 0, CMD_LINE_OPT_ETH_DEST_NUM},
>  	{CMD_LINE_OPT_NO_NUMA, 0, 0,
> CMD_LINE_OPT_NO_NUMA_NUM},
> -	{CMD_LINE_OPT_ENABLE_JUMBO, 0, 0,
> CMD_LINE_OPT_ENABLE_JUMBO_NUM},
> +	{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0,
> CMD_LINE_OPT_MAX_PKT_LEN_NUM},
>  	{CMD_LINE_OPT_PER_PORT_POOL, 0, 0,
> CMD_LINE_OPT_PARSE_PER_PORT_POOL},
>  	{NULL, 0, 0, 0},
>  };
> @@ -490,28 +489,8 @@ parse_args(int argc, char **argv)
>  			numa_on =3D 0;
>  			break;
>=20
> -		case CMD_LINE_OPT_ENABLE_JUMBO_NUM: {
> -			const struct option lenopts =3D {"max-pkt-len",
> -						       required_argument, 0, 0};
> -
> -			port_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> -			port_conf.txmode.offloads |=3D
> DEV_TX_OFFLOAD_MULTI_SEGS;
> -
> -			/*
> -			 * if no max-pkt-len set, use the default
> -			 * value RTE_ETHER_MAX_LEN.
> -			 */
> -			if (getopt_long(argc, argvopt, "", &lenopts,
> -					&option_index) =3D=3D 0) {
> -				ret =3D parse_max_pkt_len(optarg);
> -				if (ret < 64 || ret > MAX_JUMBO_PKT_LEN) {
> -					fprintf(stderr, "Invalid maximum "
> -							"packet length\n");
> -					print_usage(prgname);
> -					return -1;
> -				}
> -				port_conf.rxmode.max_rx_pkt_len =3D ret;
> -			}
> +		case CMD_LINE_OPT_MAX_PKT_LEN_NUM: {
> +			max_pkt_len =3D parse_max_pkt_len(optarg);
>  			break;
>  		}
>=20
> @@ -722,6 +701,43 @@ graph_main_loop(void *conf)
>  }
>  /* >8 End of main processing loop. */
>=20
> +static uint16_t
> +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_mtu !=3D UINT16_MAX && max_rx_pktlen > max_mtu)
> +		overhead_len =3D max_rx_pktlen - max_mtu;
> +	else
> +		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return overhead_len;
> +}
> +
> +static int
> +config_port_max_pkt_len(struct rte_eth_conf *conf,
> +		struct rte_eth_dev_info *dev_info)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_pkt_len =3D=3D 0)
> +		return 0;
> +
> +	if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len >
> MAX_JUMBO_PKT_LEN)
> +		return -1;
> +
> +	overhead_len =3D eth_dev_get_overhead_len(dev_info-
> >max_rx_pktlen,
> +			dev_info->max_mtu);
> +	conf->rxmode.mtu =3D max_pkt_len - overhead_len;
> +
> +	if (conf->rxmode.mtu > RTE_ETHER_MTU) {
> +		conf->txmode.offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
> +		conf->rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	}
> +
> +	return 0;
> +}
> +
>  int
>  main(int argc, char **argv)
>  {
> @@ -807,6 +823,13 @@ main(int argc, char **argv)
>  		       nb_rx_queue, n_tx_queue);
>=20
>  		rte_eth_dev_info_get(portid, &dev_info);
> +
> +		ret =3D config_port_max_pkt_len(&local_port_conf, &dev_info);
> +		if (ret !=3D 0)
> +			rte_exit(EXIT_FAILURE,
> +				"Invalid max packet length: %u (port %u)\n",
> +				max_pkt_len, portid);
> +
>  		if (dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_MBUF_FAST_FREE)
>  			local_port_conf.txmode.offloads |=3D
>  				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
> index aa7b8db44ae8..e58561327c48 100644
> --- a/examples/l3fwd-power/main.c
> +++ b/examples/l3fwd-power/main.c
> @@ -251,7 +251,6 @@ uint16_t nb_lcore_params =3D
> RTE_DIM(lcore_params_array_default);
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode        =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_CHECKSUM,
>  	},
> @@ -266,6 +265,8 @@ static struct rte_eth_conf port_conf =3D {
>  	}
>  };
>=20
> +static uint16_t max_pkt_len;
> +
>  static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];
>=20
>=20
> @@ -1601,16 +1602,15 @@ print_usage(const char *prgname)
>  		"  [--config (port,queue,lcore)[,(port,queue,lcore]]"
>  		"  [--high-perf-cores CORELIST"
>  		"  [--perf-config
> (port,queue,hi_perf,lcore_index)[,(port,queue,hi_perf,lcore_index]]"
> -		"  [--enable-jumbo [--max-pkt-len PKTLEN]]\n"
> +		"  [--max-pkt-len PKTLEN]\n"
>  		"  -p PORTMASK: hexadecimal bitmask of ports to
> configure\n"
> -		"  -P : enable promiscuous mode\n"
> +		"  -P: enable promiscuous mode\n"
>  		"  --config (port,queue,lcore): rx queues configuration\n"
>  		"  --high-perf-cores CORELIST: list of high performance
> cores\n"
>  		"  --perf-config: similar as config, cores specified as indices"
>  		" for bins containing high or regular performance cores\n"
>  		"  --no-numa: optional, disable numa awareness\n"
> -		"  --enable-jumbo: enable jumbo frame"
> -		" which max packet len is PKTLEN in decimal (64-9600)\n"
> +		"  --max-pkt-len PKTLEN: maximum packet length in decimal
> (64-9600)\n"
>  		"  --parse-ptype: parse packet type by software\n"
>  		"  --legacy: use legacy interrupt-based scaling\n"
>  		"  --empty-poll: enable empty poll detection"
> @@ -1795,6 +1795,7 @@ parse_ep_config(const char *q_arg)
>  #define CMD_LINE_OPT_INTERRUPT_ONLY "interrupt-only"
>  #define CMD_LINE_OPT_TELEMETRY "telemetry"
>  #define CMD_LINE_OPT_PMD_MGMT "pmd-mgmt"
> +#define CMD_LINE_OPT_MAX_PKT_LEN "max-pkt-len"
>=20
>  /* Parse the argument given in the command line of the application */
>  static int
> @@ -1810,7 +1811,7 @@ parse_args(int argc, char **argv)
>  		{"perf-config", 1, 0, 0},
>  		{"high-perf-cores", 1, 0, 0},
>  		{"no-numa", 0, 0, 0},
> -		{"enable-jumbo", 0, 0, 0},
> +		{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, 0},
>  		{CMD_LINE_OPT_EMPTY_POLL, 1, 0, 0},
>  		{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0},
>  		{CMD_LINE_OPT_LEGACY, 0, 0, 0},
> @@ -1954,36 +1955,10 @@ parse_args(int argc, char **argv)
>  			}
>=20
>  			if (!strncmp(lgopts[option_index].name,
> -					"enable-jumbo", 12)) {
> -				struct option lenopts =3D
> -					{"max-pkt-len", required_argument, \
> -									0, 0};
> -
> -				printf("jumbo frame is enabled \n");
> -				port_conf.rxmode.offloads |=3D
> -
> 	DEV_RX_OFFLOAD_JUMBO_FRAME;
> -				port_conf.txmode.offloads |=3D
> -
> 	DEV_TX_OFFLOAD_MULTI_SEGS;
> -
> -				/**
> -				 * if no max-pkt-len set, use the default value
> -				 * RTE_ETHER_MAX_LEN
> -				 */
> -				if (0 =3D=3D getopt_long(argc, argvopt, "",
> -						&lenopts, &option_index)) {
> -					ret =3D parse_max_pkt_len(optarg);
> -					if ((ret < 64) ||
> -						(ret >
> MAX_JUMBO_PKT_LEN)){
> -						printf("invalid packet "
> -								"length\n");
> -						print_usage(prgname);
> -						return -1;
> -					}
> -					port_conf.rxmode.max_rx_pkt_len =3D
> ret;
> -				}
> -				printf("set jumbo frame "
> -					"max packet length to %u\n",
> -				(unsigned
> int)port_conf.rxmode.max_rx_pkt_len);
> +					CMD_LINE_OPT_MAX_PKT_LEN,
> +
> 	sizeof(CMD_LINE_OPT_MAX_PKT_LEN))) {
> +				printf("Custom frame size is configured\n");
> +				max_pkt_len =3D parse_max_pkt_len(optarg);
>  			}
>=20
>  			if (!strncmp(lgopts[option_index].name,
> @@ -2505,6 +2480,43 @@ mode_to_str(enum appmode mode)
>  	}
>  }
>=20
> +static uint16_t
> +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_mtu !=3D UINT16_MAX && max_rx_pktlen > max_mtu)
> +		overhead_len =3D max_rx_pktlen - max_mtu;
> +	else
> +		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return overhead_len;
> +}
> +
> +static int
> +config_port_max_pkt_len(struct rte_eth_conf *conf,
> +		struct rte_eth_dev_info *dev_info)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_pkt_len =3D=3D 0)
> +		return 0;
> +
> +	if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len >
> MAX_JUMBO_PKT_LEN)
> +		return -1;
> +
> +	overhead_len =3D eth_dev_get_overhead_len(dev_info-
> >max_rx_pktlen,
> +			dev_info->max_mtu);
> +	conf->rxmode.mtu =3D max_pkt_len - overhead_len;
> +
> +	if (conf->rxmode.mtu > RTE_ETHER_MTU) {
> +		conf->txmode.offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
> +		conf->rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	}
> +
> +	return 0;
> +}
> +
>  /* Power library initialized in the main routine. 8< */
>  int
>  main(int argc, char **argv)
> @@ -2622,6 +2634,12 @@ main(int argc, char **argv)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> +		ret =3D config_port_max_pkt_len(&local_port_conf, &dev_info);
> +		if (ret !=3D 0)
> +			rte_exit(EXIT_FAILURE,
> +				"Invalid max packet length: %u (port %u)\n",
> +				max_pkt_len, portid);
> +
>  		if (dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_MBUF_FAST_FREE)
>  			local_port_conf.txmode.offloads |=3D
>  				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 00ac267af1dd..cb9bc7ad6002 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -121,7 +121,6 @@ static uint16_t nb_lcore_params =3D
> sizeof(lcore_params_array_default) /
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_CHECKSUM,
>  	},
> @@ -136,6 +135,8 @@ static struct rte_eth_conf port_conf =3D {
>  	},
>  };
>=20
> +static uint16_t max_pkt_len;
> +
>  static struct rte_mempool
> *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];
>  static uint8_t lkp_per_socket[NB_SOCKETS];
>=20
> @@ -326,7 +327,7 @@ print_usage(const char *prgname)
>  		" [--lookup]"
>  		" --config (port,queue,lcore)[,(port,queue,lcore)]"
>  		" [--eth-dest=3DX,MM:MM:MM:MM:MM:MM]"
> -		" [--enable-jumbo [--max-pkt-len PKTLEN]]"
> +		" [--max-pkt-len PKTLEN]"
>  		" [--no-numa]"
>  		" [--hash-entry-num]"
>  		" [--ipv6]"
> @@ -344,9 +345,7 @@ print_usage(const char *prgname)
>  		"            Accepted: em (Exact Match), lpm (Longest Prefix
> Match), fib (Forwarding Information Base)\n"
>  		"  --config (port,queue,lcore): Rx queue configuration\n"
>  		"  --eth-dest=3DX,MM:MM:MM:MM:MM:MM: Ethernet
> destination for port X\n"
> -		"  --enable-jumbo: Enable jumbo frames\n"
> -		"  --max-pkt-len: Under the premise of enabling jumbo,\n"
> -		"                 maximum packet length in decimal (64-9600)\n"
> +		"  --max-pkt-len PKTLEN: maximum packet length in decimal
> (64-9600)\n"
>  		"  --no-numa: Disable numa awareness\n"
>  		"  --hash-entry-num: Specify the hash entry number in
> hexadecimal to be setup\n"
>  		"  --ipv6: Set if running ipv6 packets\n"
> @@ -566,7 +565,7 @@ static const char short_options[] =3D
>  #define CMD_LINE_OPT_ETH_DEST "eth-dest"
>  #define CMD_LINE_OPT_NO_NUMA "no-numa"
>  #define CMD_LINE_OPT_IPV6 "ipv6"
> -#define CMD_LINE_OPT_ENABLE_JUMBO "enable-jumbo"
> +#define CMD_LINE_OPT_MAX_PKT_LEN "max-pkt-len"
>  #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
>  #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
>  #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
> @@ -584,7 +583,7 @@ enum {
>  	CMD_LINE_OPT_ETH_DEST_NUM,
>  	CMD_LINE_OPT_NO_NUMA_NUM,
>  	CMD_LINE_OPT_IPV6_NUM,
> -	CMD_LINE_OPT_ENABLE_JUMBO_NUM,
> +	CMD_LINE_OPT_MAX_PKT_LEN_NUM,
>  	CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
>  	CMD_LINE_OPT_PARSE_PTYPE_NUM,
>  	CMD_LINE_OPT_PARSE_PER_PORT_POOL,
> @@ -599,7 +598,7 @@ static const struct option lgopts[] =3D {
>  	{CMD_LINE_OPT_ETH_DEST, 1, 0, CMD_LINE_OPT_ETH_DEST_NUM},
>  	{CMD_LINE_OPT_NO_NUMA, 0, 0,
> CMD_LINE_OPT_NO_NUMA_NUM},
>  	{CMD_LINE_OPT_IPV6, 0, 0, CMD_LINE_OPT_IPV6_NUM},
> -	{CMD_LINE_OPT_ENABLE_JUMBO, 0, 0,
> CMD_LINE_OPT_ENABLE_JUMBO_NUM},
> +	{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0,
> CMD_LINE_OPT_MAX_PKT_LEN_NUM},
>  	{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0,
> CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
>  	{CMD_LINE_OPT_PARSE_PTYPE, 0, 0,
> CMD_LINE_OPT_PARSE_PTYPE_NUM},
>  	{CMD_LINE_OPT_PER_PORT_POOL, 0, 0,
> CMD_LINE_OPT_PARSE_PER_PORT_POOL},
> @@ -698,31 +697,9 @@ parse_args(int argc, char **argv)
>  			ipv6 =3D 1;
>  			break;
>=20
> -		case CMD_LINE_OPT_ENABLE_JUMBO_NUM: {
> -			const struct option lenopts =3D {
> -				"max-pkt-len", required_argument, 0, 0
> -			};
> -
> -			port_conf.rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> -			port_conf.txmode.offloads |=3D
> DEV_TX_OFFLOAD_MULTI_SEGS;
> -
> -			/*
> -			 * if no max-pkt-len set, use the default
> -			 * value RTE_ETHER_MAX_LEN.
> -			 */
> -			if (getopt_long(argc, argvopt, "",
> -					&lenopts, &option_index) =3D=3D 0) {
> -				ret =3D parse_max_pkt_len(optarg);
> -				if (ret < 64 || ret > MAX_JUMBO_PKT_LEN) {
> -					fprintf(stderr,
> -						"invalid maximum packet
> length\n");
> -					print_usage(prgname);
> -					return -1;
> -				}
> -				port_conf.rxmode.max_rx_pkt_len =3D ret;
> -			}
> +		case CMD_LINE_OPT_MAX_PKT_LEN_NUM:
> +			max_pkt_len =3D parse_max_pkt_len(optarg);
>  			break;
> -		}
>=20
>  		case CMD_LINE_OPT_HASH_ENTRY_NUM_NUM:
>  			ret =3D parse_hash_entry_number(optarg);
> @@ -981,6 +958,43 @@ prepare_ptype_parser(uint16_t portid, uint16_t
> queueid)
>  	return 0;
>  }
>=20
> +static uint16_t
> +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_mtu !=3D UINT16_MAX && max_rx_pktlen > max_mtu)
> +		overhead_len =3D max_rx_pktlen - max_mtu;
> +	else
> +		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return overhead_len;
> +}
> +
> +static int
> +config_port_max_pkt_len(struct rte_eth_conf *conf,
> +		struct rte_eth_dev_info *dev_info)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_pkt_len =3D=3D 0)
> +		return 0;
> +
> +	if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len >
> MAX_JUMBO_PKT_LEN)
> +		return -1;
> +
> +	overhead_len =3D eth_dev_get_overhead_len(dev_info-
> >max_rx_pktlen,
> +			dev_info->max_mtu);
> +	conf->rxmode.mtu =3D max_pkt_len - overhead_len;
> +
> +	if (conf->rxmode.mtu > RTE_ETHER_MTU) {
> +		conf->txmode.offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
> +		conf->rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	}
> +
> +	return 0;
> +}
> +
>  static void
>  l3fwd_poll_resource_setup(void)
>  {
> @@ -1035,6 +1049,12 @@ l3fwd_poll_resource_setup(void)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> +		ret =3D config_port_max_pkt_len(&local_port_conf, &dev_info);
> +		if (ret !=3D 0)
> +			rte_exit(EXIT_FAILURE,
> +				"Invalid max packet length: %u (port %u)\n",
> +				max_pkt_len, portid);
> +
>  		if (dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_MBUF_FAST_FREE)
>  			local_port_conf.txmode.offloads |=3D
>  				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> diff --git a/examples/performance-thread/l3fwd-thread/main.c
> b/examples/performance-thread/l3fwd-thread/main.c
> index 2f593abf263d..b6cddc8c7b51 100644
> --- a/examples/performance-thread/l3fwd-thread/main.c
> +++ b/examples/performance-thread/l3fwd-thread/main.c
> @@ -308,7 +308,6 @@ static uint16_t nb_tx_thread_params =3D
> RTE_DIM(tx_thread_params_array_default);
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_CHECKSUM,
>  	},
> @@ -323,6 +322,8 @@ static struct rte_eth_conf port_conf =3D {
>  	},
>  };
>=20
> +static uint16_t max_pkt_len;
> +
>  static struct rte_mempool *pktmbuf_pool[NB_SOCKETS];
>=20
>  #if (APP_LOOKUP_METHOD =3D=3D APP_LOOKUP_EXACT_MATCH)
> @@ -2643,7 +2644,7 @@ print_usage(const char *prgname)
>  	printf("%s [EAL options] -- -p PORTMASK -P"
>  		"  [--rx
> (port,queue,lcore,thread)[,(port,queue,lcore,thread]]"
>  		"  [--tx (lcore,thread)[,(lcore,thread]]"
> -		"  [--enable-jumbo [--max-pkt-len PKTLEN]]\n"
> +		"  [--max-pkt-len PKTLEN]"
>  		"  [--parse-ptype]\n\n"
>  		"  -p PORTMASK: hexadecimal bitmask of ports to
> configure\n"
>  		"  -P : enable promiscuous mode\n"
> @@ -2653,8 +2654,7 @@ print_usage(const char *prgname)
>  		"  --eth-dest=3DX,MM:MM:MM:MM:MM:MM: optional,
> ethernet destination for port X\n"
>  		"  --no-numa: optional, disable numa awareness\n"
>  		"  --ipv6: optional, specify it if running ipv6 packets\n"
> -		"  --enable-jumbo: enable jumbo frame"
> -		" which max packet len is PKTLEN in decimal (64-9600)\n"
> +		"  --max-pkt-len PKTLEN: maximum packet length in decimal
> (64-9600)\n"
>  		"  --hash-entry-num: specify the hash entry number in
> hexadecimal to be setup\n"
>  		"  --no-lthreads: turn off lthread model\n"
>  		"  --parse-ptype: set to use software to analyze packet
> type\n\n",
> @@ -2877,8 +2877,8 @@ enum {
>  	OPT_NO_NUMA_NUM,
>  #define OPT_IPV6            "ipv6"
>  	OPT_IPV6_NUM,
> -#define OPT_ENABLE_JUMBO    "enable-jumbo"
> -	OPT_ENABLE_JUMBO_NUM,
> +#define OPT_MAX_PKT_LEN "max-pkt-len"
> +	OPT_MAX_PKT_LEN_NUM,
>  #define OPT_HASH_ENTRY_NUM  "hash-entry-num"
>  	OPT_HASH_ENTRY_NUM_NUM,
>  #define OPT_NO_LTHREADS     "no-lthreads"
> @@ -2902,7 +2902,7 @@ parse_args(int argc, char **argv)
>  		{OPT_ETH_DEST,       1, NULL, OPT_ETH_DEST_NUM       },
>  		{OPT_NO_NUMA,        0, NULL, OPT_NO_NUMA_NUM        },
>  		{OPT_IPV6,           0, NULL, OPT_IPV6_NUM           },
> -		{OPT_ENABLE_JUMBO,   0, NULL,
> OPT_ENABLE_JUMBO_NUM   },
> +		{OPT_MAX_PKT_LEN,    1, NULL, OPT_MAX_PKT_LEN_NUM    },
>  		{OPT_HASH_ENTRY_NUM, 1, NULL,
> OPT_HASH_ENTRY_NUM_NUM },
>  		{OPT_NO_LTHREADS,    0, NULL, OPT_NO_LTHREADS_NUM    },
>  		{OPT_PARSE_PTYPE,    0, NULL, OPT_PARSE_PTYPE_NUM    },
> @@ -2981,35 +2981,10 @@ parse_args(int argc, char **argv)
>  			parse_ptype_on =3D 1;
>  			break;
>=20
> -		case OPT_ENABLE_JUMBO_NUM:
> -		{
> -			struct option lenopts =3D {"max-pkt-len",
> -					required_argument, 0, 0};
> -
> -			printf("jumbo frame is enabled - disabling simple TX
> path\n");
> -			port_conf.rxmode.offloads |=3D
> -					DEV_RX_OFFLOAD_JUMBO_FRAME;
> -			port_conf.txmode.offloads |=3D
> -					DEV_TX_OFFLOAD_MULTI_SEGS;
> -
> -			/* if no max-pkt-len set, use the default value
> -			 * RTE_ETHER_MAX_LEN
> -			 */
> -			if (getopt_long(argc, argvopt, "", &lenopts,
> -					&option_index) =3D=3D 0) {
> -
> -				ret =3D parse_max_pkt_len(optarg);
> -				if ((ret < 64) || (ret > MAX_JUMBO_PKT_LEN))
> {
> -					printf("invalid packet length\n");
> -					print_usage(prgname);
> -					return -1;
> -				}
> -				port_conf.rxmode.max_rx_pkt_len =3D ret;
> -			}
> -			printf("set jumbo frame max packet length to %u\n",
> -				(unsigned
> int)port_conf.rxmode.max_rx_pkt_len);
> +		case OPT_MAX_PKT_LEN_NUM:
> +			max_pkt_len =3D parse_max_pkt_len(optarg);
>  			break;
> -		}
> +
>  #if (APP_LOOKUP_METHOD =3D=3D APP_LOOKUP_EXACT_MATCH)
>  		case OPT_HASH_ENTRY_NUM_NUM:
>  			ret =3D parse_hash_entry_number(optarg);
> @@ -3489,6 +3464,43 @@ check_all_ports_link_status(uint32_t port_mask)
>  	}
>  }
>=20
> +static uint16_t
> +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_mtu !=3D UINT16_MAX && max_rx_pktlen > max_mtu)
> +		overhead_len =3D max_rx_pktlen - max_mtu;
> +	else
> +		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return overhead_len;
> +}
> +
> +static int
> +config_port_max_pkt_len(struct rte_eth_conf *conf,
> +		struct rte_eth_dev_info *dev_info)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_pkt_len =3D=3D 0)
> +		return 0;
> +
> +	if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len >
> MAX_JUMBO_PKT_LEN)
> +		return -1;
> +
> +	overhead_len =3D eth_dev_get_overhead_len(dev_info-
> >max_rx_pktlen,
> +			dev_info->max_mtu);
> +	conf->rxmode.mtu =3D max_pkt_len - overhead_len;
> +
> +	if (conf->rxmode.mtu > RTE_ETHER_MTU) {
> +		conf->txmode.offloads |=3D DEV_TX_OFFLOAD_MULTI_SEGS;
> +		conf->rxmode.offloads |=3D
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	}
> +
> +	return 0;
> +}
> +
>  int
>  main(int argc, char **argv)
>  {
> @@ -3577,6 +3589,12 @@ main(int argc, char **argv)
>  				"Error during getting device (port %u)
> info: %s\n",
>  				portid, strerror(-ret));
>=20
> +		ret =3D config_port_max_pkt_len(&local_port_conf, &dev_info);
> +		if (ret !=3D 0)
> +			rte_exit(EXIT_FAILURE,
> +				"Invalid max packet length: %u (port %u)\n",
> +				max_pkt_len, portid);
> +
>  		if (dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_MBUF_FAST_FREE)
>  			local_port_conf.txmode.offloads |=3D
>  				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
> diff --git a/examples/performance-thread/l3fwd-thread/test.sh
> b/examples/performance-thread/l3fwd-thread/test.sh
> index f0b6e271a5f3..3dd33407ea41 100755
> --- a/examples/performance-thread/l3fwd-thread/test.sh
> +++ b/examples/performance-thread/l3fwd-thread/test.sh
> @@ -11,7 +11,7 @@ case "$1" in
>  		echo "1.1 1 L-core per pcore (N=3D2)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 -- -P -p 3 \
> -				--enable-jumbo --max-pkt-len 1500  \
> +				--max-pkt-len 1500  \
>  				--rx=3D"(0,0,0,0)(1,0,0,0)"          \
>  				--tx=3D"(1,0)"                       \
>  				--stat-lcore 2                     \
> @@ -23,7 +23,7 @@ case "$1" in
>  		echo "1.2 1 L-core per pcore (N=3D4)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 -- -P -p 3 \
> -				--enable-jumbo --max-pkt-len 1500  \
> +				--max-pkt-len 1500  \
>  				--rx=3D"(0,0,0,0)(1,0,1,1)"          \
>  				--tx=3D"(2,0)(3,1)"                  \
>  				--stat-lcore 4                     \
> @@ -34,7 +34,7 @@ case "$1" in
>  		echo "1.3 1 L-core per pcore (N=3D8)"
>=20
>  		./build/l3fwd-thread -c 1ff -n 2 -- -P -p 3                          \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                            \
>  				--rx=3D"(0,0,0,0)(0,1,1,1)(1,0,2,2)(1,1,3,3)"
> \
>  				--tx=3D"(4,0)(5,1)(6,2)(7,3)"                                  \
>  				--stat-lcore 8                                               \
> @@ -45,7 +45,7 @@ case "$1" in
>  		echo "1.3 1 L-core per pcore (N=3D16)"
>=20
>  		./build/l3fwd-thread -c 3ffff -n 2 -- -P -p 3                         =
 \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                              \
>  				--
> rx=3D"(0,0,0,0)(0,1,1,1)(0,2,2,2)(0,3,3,3)(1,0,4,4)(1,1,5,5)(1,2,6,6)(1,3=
,7,7)" \
>  				--
> tx=3D"(8,0)(9,1)(10,2)(11,3)(12,4)(13,5)(14,6)(15,7)"          \
>  				--stat-lcore 16                                                \
> @@ -61,7 +61,7 @@ case "$1" in
>  		echo "2.1 N L-core per pcore (N=3D2)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 --lcores=3D"2,(0-1)@0" -- -P -p 3 \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                       \
>  				--rx=3D"(0,0,0,0)(1,0,0,0)"                               \
>  				--tx=3D"(1,0)"                                            \
>  				--stat-lcore 2                                          \
> @@ -73,7 +73,7 @@ case "$1" in
>  		echo "2.2 N L-core per pcore (N=3D4)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 --lcores=3D"(0-3)@0,4" -- -P -p 3 \
> -				--enable-jumbo --max-pkt-len 1500  \
> +				--max-pkt-len 1500  \
>  				--rx=3D"(0,0,0,0)(1,0,1,1)"          \
>  				--tx=3D"(2,0)(3,1)"                  \
>  				--stat-lcore 4                     \
> @@ -84,7 +84,7 @@ case "$1" in
>  		echo "2.3 N L-core per pcore (N=3D8)"
>=20
>  		./build/l3fwd-thread -c 3ffff -n 2 --lcores=3D"(0-7)@0,8" -- -P -p
> 3     \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                              \
>  				--rx=3D"(0,0,0,0)(0,1,1,1)(1,0,2,2)(1,1,3,3)"
> \
>  				--tx=3D"(4,0)(5,1)(6,2)(7,3)"                                    \
>  				--stat-lcore 8                                                 \
> @@ -95,7 +95,7 @@ case "$1" in
>  		echo "2.3 N L-core per pcore (N=3D16)"
>=20
>  		./build/l3fwd-thread -c 3ffff -n 2 --lcores=3D"(0-15)@0,16" -- -P
> -p 3   \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                              \
>  				--
> rx=3D"(0,0,0,0)(0,1,1,1)(0,2,2,2)(0,3,3,3)(1,0,4,4)(1,1,5,5)(1,2,6,6)(1,3=
,7,7)" \
>  				--
> tx=3D"(8,0)(9,1)(10,2)(11,3)(12,4)(13,5)(14,6)(15,7)"          \
>  				--stat-lcore 16                                                \
> @@ -111,7 +111,7 @@ case "$1" in
>  		echo "3.1 N L-threads per pcore (N=3D2)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 -- -P -p 3  \
> -				--enable-jumbo --max-pkt-len 1500   \
> +				--max-pkt-len 1500   \
>  				--rx=3D"(0,0,0,0)(1,0,0,0)"           \
>  				--tx=3D"(0,0)"                        \
>  				--stat-lcore 1
> @@ -121,7 +121,7 @@ case "$1" in
>  		echo "3.2 N L-threads per pcore (N=3D4)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 -- -P -p 3  \
> -				--enable-jumbo --max-pkt-len 1500   \
> +				--max-pkt-len 1500   \
>  				--rx=3D"(0,0,0,0)(1,0,0,1)"           \
>  				--tx=3D"(0,0)(0,1)"                   \
>  				--stat-lcore 1
> @@ -131,7 +131,7 @@ case "$1" in
>  		echo "3.2 N L-threads per pcore (N=3D8)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 -- -P -p 3                            =
 \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                              \
>  				--rx=3D"(0,0,0,0)(0,1,0,1)(1,0,0,2)(1,1,0,3)"
> \
>  				--tx=3D"(0,0)(0,1)(0,2)(0,3)"                                    \
>  				--stat-lcore 1
> @@ -141,7 +141,7 @@ case "$1" in
>  		echo "3.2 N L-threads per pcore (N=3D16)"
>=20
>  		./build/l3fwd-thread -c ff -n 2 -- -P -p 3                            =
 \
> -				--enable-jumbo --max-pkt-len 1500
> \
> +				--max-pkt-len 1500                              \
>  				--
> rx=3D"(0,0,0,0)(0,1,0,1)(0,2,0,2)(0,0,0,3)(1,0,0,4)(1,1,0,5)(1,2,0,6)(1,3=
,0,7)" \
>  				--tx=3D"(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)"
> \
>  				--stat-lcore 1
> diff --git a/examples/pipeline/obj.c b/examples/pipeline/obj.c
> index 467cda5a6dac..4f20dfc4be06 100644
> --- a/examples/pipeline/obj.c
> +++ b/examples/pipeline/obj.c
> @@ -134,7 +134,7 @@ static struct rte_eth_conf port_conf_default =3D {
>  	.link_speeds =3D 0,
>  	.rxmode =3D {
>  		.mq_mode =3D ETH_MQ_RX_NONE,
> -		.max_rx_pkt_len =3D 9000, /* Jumbo frame max packet len */
> +		.mtu =3D 9000 - (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN),
> /* Jumbo frame MTU */
>  		.split_hdr_size =3D 0, /* Header split buffer size */
>  	},
>  	.rx_adv_conf =3D {
> diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclien=
t.c
> index 4f32ade7fbf7..3b6c6c297f43 100644
> --- a/examples/ptpclient/ptpclient.c
> +++ b/examples/ptpclient/ptpclient.c
> @@ -47,12 +47,6 @@ uint32_t ptp_enabled_port_mask;
>  uint8_t ptp_enabled_port_nb;
>  static uint8_t ptp_enabled_ports[RTE_MAX_ETHPORTS];
>=20
> -static const struct rte_eth_conf port_conf_default =3D {
> -	.rxmode =3D {
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
> -	},
> -};
> -
>  static const struct rte_ether_addr ether_multicast =3D {
>  	.addr_bytes =3D {0x01, 0x1b, 0x19, 0x0, 0x0, 0x0}
>  };
> @@ -178,7 +172,7 @@ static inline int
>  port_init(uint16_t port, struct rte_mempool *mbuf_pool)
>  {
>  	struct rte_eth_dev_info dev_info;
> -	struct rte_eth_conf port_conf =3D port_conf_default;
> +	struct rte_eth_conf port_conf;
>  	const uint16_t rx_rings =3D 1;
>  	const uint16_t tx_rings =3D 1;
>  	int retval;
> @@ -189,6 +183,8 @@ port_init(uint16_t port, struct rte_mempool
> *mbuf_pool)
>  	if (!rte_eth_dev_is_valid_port(port))
>  		return -1;
>=20
> +	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
> +
>  	retval =3D rte_eth_dev_info_get(port, &dev_info);
>  	if (retval !=3D 0) {
>  		printf("Error during getting device (port %u) info: %s\n",
> diff --git a/examples/qos_meter/main.c b/examples/qos_meter/main.c
> index 7ffccc8369dc..c32d2e12e633 100644
> --- a/examples/qos_meter/main.c
> +++ b/examples/qos_meter/main.c
> @@ -52,7 +52,6 @@ static struct rte_mempool *pool =3D NULL;
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
>  		.mq_mode	=3D ETH_MQ_RX_RSS,
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  		.offloads =3D DEV_RX_OFFLOAD_CHECKSUM,
>  	},
> diff --git a/examples/qos_sched/init.c b/examples/qos_sched/init.c
> index 1abe003fc6ae..1367569c65db 100644
> --- a/examples/qos_sched/init.c
> +++ b/examples/qos_sched/init.c
> @@ -57,7 +57,6 @@ struct flow_conf qos_conf[MAX_DATA_STREAMS];
>=20
>  static struct rte_eth_conf port_conf =3D {
>  	.rxmode =3D {
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
>  		.split_hdr_size =3D 0,
>  	},
>  	.txmode =3D {
> diff --git a/examples/rxtx_callbacks/main.c
> b/examples/rxtx_callbacks/main.c
> index ab6fa7d56c5d..6845c396b8d9 100644
> --- a/examples/rxtx_callbacks/main.c
> +++ b/examples/rxtx_callbacks/main.c
> @@ -40,12 +40,6 @@ tsc_field(struct rte_mbuf *mbuf)
>  static const char usage[] =3D
>  	"%s EAL_ARGS -- [-t]\n";
>=20
> -static const struct rte_eth_conf port_conf_default =3D {
> -	.rxmode =3D {
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
> -	},
> -};
> -
>  static struct {
>  	uint64_t total_cycles;
>  	uint64_t total_queue_cycles;
> @@ -124,7 +118,7 @@ calc_latency(uint16_t port, uint16_t qidx
> __rte_unused,
>  static inline int
>  port_init(uint16_t port, struct rte_mempool *mbuf_pool)
>  {
> -	struct rte_eth_conf port_conf =3D port_conf_default;
> +	struct rte_eth_conf port_conf;
>  	const uint16_t rx_rings =3D 1, tx_rings =3D 1;
>  	uint16_t nb_rxd =3D RX_RING_SIZE;
>  	uint16_t nb_txd =3D TX_RING_SIZE;
> @@ -137,6 +131,8 @@ port_init(uint16_t port, struct rte_mempool
> *mbuf_pool)
>  	if (!rte_eth_dev_is_valid_port(port))
>  		return -1;
>=20
> +	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
> +
>  	retval =3D rte_eth_dev_info_get(port, &dev_info);
>  	if (retval !=3D 0) {
>  		printf("Error during getting device (port %u) info: %s\n",
> diff --git a/examples/skeleton/basicfwd.c b/examples/skeleton/basicfwd.c
> index ae9bbee8d820..fd7207aee758 100644
> --- a/examples/skeleton/basicfwd.c
> +++ b/examples/skeleton/basicfwd.c
> @@ -17,14 +17,6 @@
>  #define MBUF_CACHE_SIZE 250
>  #define BURST_SIZE 32
>=20
> -/* Configuration of ethernet ports. 8<  */
> -static const struct rte_eth_conf port_conf_default =3D {
> -	.rxmode =3D {
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
> -	},
> -};
> -/* >8 End of configuration of ethernet ports. */
> -
>  /* basicfwd.c: Basic DPDK skeleton forwarding example. */
>=20
>  /*
> @@ -36,7 +28,7 @@ static const struct rte_eth_conf port_conf_default =3D =
{
>  static inline int
>  port_init(uint16_t port, struct rte_mempool *mbuf_pool)
>  {
> -	struct rte_eth_conf port_conf =3D port_conf_default;
> +	struct rte_eth_conf port_conf;
>  	const uint16_t rx_rings =3D 1, tx_rings =3D 1;
>  	uint16_t nb_rxd =3D RX_RING_SIZE;
>  	uint16_t nb_txd =3D TX_RING_SIZE;
> @@ -48,6 +40,8 @@ port_init(uint16_t port, struct rte_mempool
> *mbuf_pool)
>  	if (!rte_eth_dev_is_valid_port(port))
>  		return -1;
>=20
> +	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
> +
>  	retval =3D rte_eth_dev_info_get(port, &dev_info);
>  	if (retval !=3D 0) {
>  		printf("Error during getting device (port %u) info: %s\n",
> diff --git a/examples/vhost/main.c b/examples/vhost/main.c
> index d0bf1f31e36a..da381b41c0c5 100644
> --- a/examples/vhost/main.c
> +++ b/examples/vhost/main.c
> @@ -44,6 +44,7 @@
>  #define BURST_RX_RETRIES 4		/* Number of retries on RX. */
>=20
>  #define JUMBO_FRAME_MAX_SIZE    0x2600
> +#define MAX_MTU (JUMBO_FRAME_MAX_SIZE - (RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN))
>=20
>  /* State of virtio device. */
>  #define DEVICE_MAC_LEARNING 0
> @@ -633,8 +634,7 @@ us_vhost_parse_args(int argc, char **argv)
>  			if (ret) {
>  				vmdq_conf_default.rxmode.offloads |=3D
>  					DEV_RX_OFFLOAD_JUMBO_FRAME;
> -				vmdq_conf_default.rxmode.max_rx_pkt_len
> -					=3D JUMBO_FRAME_MAX_SIZE;
> +				vmdq_conf_default.rxmode.mtu =3D
> MAX_MTU;
>  			}
>  			break;
>=20
> diff --git a/examples/vm_power_manager/main.c
> b/examples/vm_power_manager/main.c
> index e59fb7d3478b..e19d79a40802 100644
> --- a/examples/vm_power_manager/main.c
> +++ b/examples/vm_power_manager/main.c
> @@ -51,17 +51,10 @@
>  static uint32_t enabled_port_mask;
>  static volatile bool force_quit;
>=20
> -/****************/
> -static const struct rte_eth_conf port_conf_default =3D {
> -	.rxmode =3D {
> -		.max_rx_pkt_len =3D RTE_ETHER_MAX_LEN,
> -	},
> -};
> -
>  static inline int
>  port_init(uint16_t port, struct rte_mempool *mbuf_pool)
>  {
> -	struct rte_eth_conf port_conf =3D port_conf_default;
> +	struct rte_eth_conf port_conf;
>  	const uint16_t rx_rings =3D 1, tx_rings =3D 1;
>  	int retval;
>  	uint16_t q;
> @@ -71,6 +64,8 @@ port_init(uint16_t port, struct rte_mempool
> *mbuf_pool)
>  	if (!rte_eth_dev_is_valid_port(port))
>  		return -1;
>=20
> +	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
> +
>  	retval =3D rte_eth_dev_info_get(port, &dev_info);
>  	if (retval !=3D 0) {
>  		printf("Error during getting device (port %u) info: %s\n",
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index daf5ca924221..4d0584af52e3 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -1324,6 +1324,19 @@ eth_dev_validate_offloads(uint16_t port_id,
> uint64_t req_offloads,
>  	return ret;
>  }
>=20
> +static uint16_t
> +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
> +{
> +	uint16_t overhead_len;
> +
> +	if (max_mtu !=3D UINT16_MAX && max_rx_pktlen > max_mtu)
> +		overhead_len =3D max_rx_pktlen - max_mtu;
> +	else
> +		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +	return overhead_len;
> +}
> +
>  int
>  rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx=
_q,
>  		      const struct rte_eth_conf *dev_conf)
> @@ -1331,6 +1344,7 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t
> nb_rx_q, uint16_t nb_tx_q,
>  	struct rte_eth_dev *dev;
>  	struct rte_eth_dev_info dev_info;
>  	struct rte_eth_conf orig_conf;
> +	uint32_t max_rx_pktlen;
>  	uint16_t overhead_len;
>  	int diag;
>  	int ret;
> @@ -1381,11 +1395,8 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t
> nb_rx_q, uint16_t nb_tx_q,
>  		goto rollback;
>=20
>  	/* Get the real Ethernet overhead length */
> -	if (dev_info.max_mtu !=3D UINT16_MAX &&
> -	    dev_info.max_rx_pktlen > dev_info.max_mtu)
> -		overhead_len =3D dev_info.max_rx_pktlen - dev_info.max_mtu;
> -	else
> -		overhead_len =3D RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +	overhead_len =3D eth_dev_get_overhead_len(dev_info.max_rx_pktlen,
> +			dev_info.max_mtu);
>=20
>  	/* If number of queues specified by application for both Rx and Tx is
>  	 * zero, use driver preferred values. This cannot be done individually
> @@ -1454,49 +1465,45 @@ rte_eth_dev_configure(uint16_t port_id,
> uint16_t nb_rx_q, uint16_t nb_tx_q,
>  	}
>=20
>  	/*
> -	 * If jumbo frames are enabled, check that the maximum RX packet
> -	 * length is supported by the configured device.
> +	 * Check that the maximum RX packet length is supported by the
> +	 * configured device.
>  	 */
> -	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> {
> -		if (dev_conf->rxmode.max_rx_pkt_len >
> dev_info.max_rx_pktlen) {
> -			RTE_ETHDEV_LOG(ERR,
> -				"Ethdev port_id=3D%u max_rx_pkt_len %u >
> max valid value %u\n",
> -				port_id, dev_conf->rxmode.max_rx_pkt_len,
> -				dev_info.max_rx_pktlen);
> -			ret =3D -EINVAL;
> -			goto rollback;
> -		} else if (dev_conf->rxmode.max_rx_pkt_len <
> RTE_ETHER_MIN_LEN) {
> -			RTE_ETHDEV_LOG(ERR,
> -				"Ethdev port_id=3D%u max_rx_pkt_len %u <
> min valid value %u\n",
> -				port_id, dev_conf->rxmode.max_rx_pkt_len,
> -				(unsigned int)RTE_ETHER_MIN_LEN);
> -			ret =3D -EINVAL;
> -			goto rollback;
> -		}
> +	if (dev_conf->rxmode.mtu =3D=3D 0)
> +		dev->data->dev_conf.rxmode.mtu =3D RTE_ETHER_MTU;
> +	max_rx_pktlen =3D dev->data->dev_conf.rxmode.mtu + overhead_len;
> +	if (max_rx_pktlen > dev_info.max_rx_pktlen) {
> +		RTE_ETHDEV_LOG(ERR,
> +			"Ethdev port_id=3D%u max_rx_pktlen %u > max valid
> value %u\n",
> +			port_id, max_rx_pktlen, dev_info.max_rx_pktlen);
> +		ret =3D -EINVAL;
> +		goto rollback;
> +	} else if (max_rx_pktlen < RTE_ETHER_MIN_LEN) {
> +		RTE_ETHDEV_LOG(ERR,
> +			"Ethdev port_id=3D%u max_rx_pktlen %u < min valid
> value %u\n",
> +			port_id, max_rx_pktlen, RTE_ETHER_MIN_LEN);
> +		ret =3D -EINVAL;
> +		goto rollback;
> +	}
>=20
> -		/* Scale the MTU size to adapt max_rx_pkt_len */
> -		dev->data->mtu =3D dev->data-
> >dev_conf.rxmode.max_rx_pkt_len -
> -				overhead_len;
> -	} else {
> -		uint16_t pktlen =3D dev_conf->rxmode.max_rx_pkt_len;
> -		if (pktlen < RTE_ETHER_MIN_MTU + overhead_len ||
> -		    pktlen > RTE_ETHER_MTU + overhead_len)
> +	if ((dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> =3D=3D 0) {
> +		if (dev->data->dev_conf.rxmode.mtu <
> RTE_ETHER_MIN_MTU ||
> +				dev->data->dev_conf.rxmode.mtu >
> RTE_ETHER_MTU)
>  			/* Use default value */
> -			dev->data->dev_conf.rxmode.max_rx_pkt_len =3D
> -						RTE_ETHER_MTU +
> overhead_len;
> +			dev->data->dev_conf.rxmode.mtu =3D
> RTE_ETHER_MTU;
>  	}
>=20
> +	dev->data->mtu =3D dev->data->dev_conf.rxmode.mtu;
> +
>  	/*
>  	 * If LRO is enabled, check that the maximum aggregated packet
>  	 * size is supported by the configured device.
>  	 */
>  	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
>  		if (dev_conf->rxmode.max_lro_pkt_size =3D=3D 0)
> -			dev->data->dev_conf.rxmode.max_lro_pkt_size =3D
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +			dev->data->dev_conf.rxmode.max_lro_pkt_size =3D
> max_rx_pktlen;
>  		ret =3D eth_dev_check_lro_pkt_size(port_id,
>  				dev->data-
> >dev_conf.rxmode.max_lro_pkt_size,
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len,
> +				max_rx_pktlen,
>  				dev_info.max_lro_pkt_size);
>  		if (ret !=3D 0)
>  			goto rollback;
> @@ -2156,13 +2163,20 @@ rte_eth_rx_queue_setup(uint16_t port_id,
> uint16_t rx_queue_id,
>  	 * If LRO is enabled, check that the maximum aggregated packet
>  	 * size is supported by the configured device.
>  	 */
> +	/* Get the real Ethernet overhead length */
>  	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
> +		uint16_t overhead_len;
> +		uint32_t max_rx_pktlen;
> +		int ret;
> +
> +		overhead_len =3D
> eth_dev_get_overhead_len(dev_info.max_rx_pktlen,
> +				dev_info.max_mtu);
> +		max_rx_pktlen =3D dev->data->mtu + overhead_len;
>  		if (dev->data->dev_conf.rxmode.max_lro_pkt_size =3D=3D 0)
> -			dev->data->dev_conf.rxmode.max_lro_pkt_size =3D
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> -		int ret =3D eth_dev_check_lro_pkt_size(port_id,
> +			dev->data->dev_conf.rxmode.max_lro_pkt_size =3D
> max_rx_pktlen;
> +		ret =3D eth_dev_check_lro_pkt_size(port_id,
>  				dev->data-
> >dev_conf.rxmode.max_lro_pkt_size,
> -				dev->data-
> >dev_conf.rxmode.max_rx_pkt_len,
> +				max_rx_pktlen,
>  				dev_info.max_lro_pkt_size);
>  		if (ret !=3D 0)
>  			return ret;
> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
> index afdc53b674cc..9fba2bd73c84 100644
> --- a/lib/ethdev/rte_ethdev.h
> +++ b/lib/ethdev/rte_ethdev.h
> @@ -416,7 +416,7 @@ enum rte_eth_tx_mq_mode {
>  struct rte_eth_rxmode {
>  	/** The multi-queue packet distribution mode to be used, e.g. RSS.
> */
>  	enum rte_eth_rx_mq_mode mq_mode;
> -	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME enabled.
> */
> +	uint32_t mtu;  /**< Requested MTU. */
>  	/** Maximum allowed size of LRO aggregated packet. */
>  	uint32_t max_lro_pkt_size;
>  	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
> diff --git a/lib/ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.=
h
> index 0036bda7465c..1491c815c312 100644
> --- a/lib/ethdev/rte_ethdev_trace.h
> +++ b/lib/ethdev/rte_ethdev_trace.h
> @@ -28,7 +28,7 @@ RTE_TRACE_POINT(
>  	rte_trace_point_emit_u16(nb_tx_q);
>  	rte_trace_point_emit_u32(dev_conf->link_speeds);
>  	rte_trace_point_emit_u32(dev_conf->rxmode.mq_mode);
> -	rte_trace_point_emit_u32(dev_conf->rxmode.max_rx_pkt_len);
> +	rte_trace_point_emit_u32(dev_conf->rxmode.mtu);
>  	rte_trace_point_emit_u64(dev_conf->rxmode.offloads);
>  	rte_trace_point_emit_u32(dev_conf->txmode.mq_mode);
>  	rte_trace_point_emit_u64(dev_conf->txmode.offloads);
> --
> 2.31.1

Reviewed-by: Rosen Xu <rosen.xu@intel.com>