Hi,

> -----Original Message-----
> From: Yigit, Ferruh <ferruh.yi...@intel.com>
> Sent: Saturday, July 10, 2021 1:29
> To: Jerin Jacob <jer...@marvell.com>; Li, Xiaoyun <xiaoyun...@intel.com>;
> Chas Williams <ch...@att.com>; Min Hu (Connor) <humi...@huawei.com>;
> Hemant Agrawal <hemant.agra...@nxp.com>; Sachin Saxena
> <sachin.sax...@oss.nxp.com>; Zhang, Qi Z <qi.z.zh...@intel.com>; Wang,
> Xiao W <xiao.w.w...@intel.com>; Matan Azrad <ma...@nvidia.com>;
> Shahaf Shuler <shah...@nvidia.com>; Viacheslav Ovsiienko
> <viachesl...@nvidia.com>; Harman Kalra <hka...@marvell.com>; Maciej
> Czekaj <mcze...@marvell.com>; Ray Kinsella <m...@ashroe.eu>; Neil
> Horman <nhor...@tuxdriver.com>; Iremonger, Bernard
> <bernard.iremon...@intel.com>; Richardson, Bruce
> <bruce.richard...@intel.com>; Ananyev, Konstantin
> <konstantin.anan...@intel.com>; Mcnamara, John
> <john.mcnam...@intel.com>; Igor Russkikh <igor.russk...@aquantia.com>;
> Pavel Belous <pavel.bel...@aquantia.com>; Steven Webster
> <steven.webs...@windriver.com>; Matt Peters
> <matt.pet...@windriver.com>; Somalapuram Amaranath
> <asoma...@amd.com>; Rasesh Mody <rm...@marvell.com>; Shahed
> Shaikh <shsha...@marvell.com>; Ajit Khaparde
> <ajit.khapa...@broadcom.com>; Somnath Kotur
> <somnath.ko...@broadcom.com>; Nithin Dabilpuram
> <ndabilpu...@marvell.com>; Kiran Kumar K <kirankum...@marvell.com>;
> Sunil Kumar Kori <sk...@marvell.com>; Satha Rao
> <skotesh...@marvell.com>; Rahul Lakkireddy
> <rahul.lakkire...@chelsio.com>; Wang, Haiyue <haiyue.w...@intel.com>;
> Marcin Wojtas <m...@semihalf.com>; Michal Krawczyk <m...@semihalf.com>;
> Guy Tzalik <gtza...@amazon.com>; Evgeny Schemeilin
> <evge...@amazon.com>; Igor Chauskin <igo...@amazon.com>;
> Gagandeep Singh <g.si...@nxp.com>; Daley, John <johnd...@cisco.com>;
> Hyong Youb Kim <hyon...@cisco.com>; Ziyang Xuan
> <xuanziya...@huawei.com>; Xiaoyun Wang
> <cloud.wangxiao...@huawei.com>; Guoyang Zhou
> <zhouguoy...@huawei.com>; Yisen Zhuang <yisen.zhu...@huawei.com>;
> Lijun Ou <ouli...@huawei.com>; Xing, Beilei <beilei.x...@intel.com>; Wu,
> Jingjing <jingjing...@intel.com>; Yang, Qiming <qiming.y...@intel.com>;
> Andrew Boyer <abo...@pensando.io>; Xu, Rosen <rosen...@intel.com>;
> Shijith Thotton <sthot...@marvell.com>; Srisivasubramanian Srinivasan
> <sriniva...@marvell.com>; Zyta Szpak <z...@semihalf.com>; Liron Himi
> <lir...@marvell.com>; Heinrich Kuhn <heinrich.k...@netronome.com>;
> Devendra Singh Rawat <dsinghra...@marvell.com>; Andrew Rybchenko
> <andrew.rybche...@oktetlabs.ru>; Wiles, Keith <keith.wi...@intel.com>;
> Jiawen Wu <jiawe...@trustnetic.com>; Jian Wang
> <jianw...@trustnetic.com>; Maxime Coquelin
> <maxime.coque...@redhat.com>; Xia, Chenbo <chenbo....@intel.com>;
> Chautru, Nicolas <nicolas.chau...@intel.com>; Hunt, David
> <david.h...@intel.com>; Van Haaren, Harry <harry.van.haa...@intel.com>;
> Dumitrescu, Cristian <cristian.dumitre...@intel.com>; Nicolau, Radu
> <radu.nico...@intel.com>; Akhil Goyal <gak...@marvell.com>; Kantecki,
> Tomasz <tomasz.kante...@intel.com>; Doherty, Declan
> <declan.dohe...@intel.com>; Pavan Nikhilesh
> <pbhagavat...@marvell.com>; Rybalchenko, Kirill
> <kirill.rybalche...@intel.com>; Singh, Jasvinder
> <jasvinder.si...@intel.com>; Thomas Monjalon <tho...@monjalon.net>
> Cc: Yigit, Ferruh <ferruh.yi...@intel.com>; dev@dpdk.org
> Subject: [PATCH 1/4] ethdev: fix max Rx packet length
> 
> There is a confusion on setting max Rx packet length, this patch aims to
> clarify it.
> 
> 'rte_eth_dev_configure()' API accepts max Rx packet size via
> 'uint32_t max_rx_pkt_len' filed of the config struct 'struct
> rte_eth_conf'.
> 
> Also 'rte_eth_dev_set_mtu()' API can be used to set the MTU, and result
> stored into '(struct rte_eth_dev)->data->mtu'.
> 
> 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 two different related method is confusing for
> the users.
> 
> 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, but this 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.
> 
> 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.
> 
> 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.
> 
> When application doesn't provide an MTU during 'rte_eth_dev_configure()'
> default 'RTE_ETHER_MTU' value is used.
> 
> As additional clarification, MTU is used to configure the device for
> physical Rx/Tx limitation. Other related issue is size of the buffer to
> store Rx packets, many PMDs use mbuf data buffer size as Rx buffer size.
> And compares MTU against Rx buffer size to decide enabling scattered Rx
> or not, if PMD supports it. If scattered Rx is not supported by device,
> MTU bigger than Rx buffer size should fail.
> 
> Signed-off-by: Ferruh Yigit <ferruh.yi...@intel.com>
> ---
>  app/test-eventdev/test_perf_common.c          |  1 -
>  app/test-eventdev/test_pipeline_common.c      |  5 +-
>  app/test-pmd/cmdline.c                        | 45 ++++-----
>  app/test-pmd/config.c                         | 18 ++--
>  app/test-pmd/parameters.c                     |  4 +-
>  app/test-pmd/testpmd.c                        | 94 ++++++++++--------
>  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    |  8 +-
>  doc/guides/sample_app_ug/ioat.rst             |  1 -
>  doc/guides/sample_app_ug/ip_reassembly.rst    |  2 +-
>  doc/guides/sample_app_ug/skeleton.rst         |  8 +-
>  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                | 28 ++----
>  drivers/net/hns3/hns3_ethdev_vf.c             | 38 +++----
>  drivers/net/hns3/hns3_rxtx.c                  | 10 +-
>  drivers/net/i40e/i40e_ethdev.c                | 10 +-
>  drivers/net/i40e/i40e_ethdev_vf.c             | 14 +--
>  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_net.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            |  4 +-
>  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        | 10 +-
>  examples/ioat/ioatfwd.c                       |  1 -
>  examples/ip_fragmentation/main.c              | 11 +--
>  examples/ip_pipeline/link.c                   |  2 +-
>  examples/ip_reassembly/main.c                 | 11 ++-
>  examples/ipsec-secgw/ipsec-secgw.c            |  7 +-
>  examples/ipv4_multicast/main.c                |  8 +-
>  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                     | 11 +--
>  examples/l3fwd-graph/main.c                   |  4 +-
>  examples/l3fwd-power/main.c                   | 11 ++-
>  examples/l3fwd/main.c                         |  4 +-
>  .../performance-thread/l3fwd-thread/main.c    |  7 +-
>  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                  | 10 +-
>  examples/vhost/main.c                         |  4 +-
>  examples/vm_power_manager/main.c              | 11 +--
>  lib/ethdev/rte_ethdev.c                       | 98 +++++++++++--------
>  lib/ethdev/rte_ethdev.h                       |  2 +-
>  lib/ethdev/rte_ethdev_trace.h                 |  2 +-
>  118 files changed, 531 insertions(+), 848 deletions(-)
> 
> 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 = {
>               .rxmode = {
>                       .mq_mode = ETH_MQ_RX_RSS,
> -                     .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
>                       .split_hdr_size = 0,
>               },
>               .rx_adv_conf = {
> 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;
>       }
> 
> -     port_conf.rxmode.max_rx_pkt_len = opt->max_pkt_sz;
> -     if (opt->max_pkt_sz > RTE_ETHER_MAX_LEN)
> +     port_conf.rxmode.mtu = opt->max_pkt_sz - RTE_ETHER_HDR_LEN -
> +             RTE_ETHER_CRC_LEN;
> +     if (port_conf.rxmode.mtu > RTE_ETHER_MTU)
>               port_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
>       t->internal_port = 1;
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index 8468018cf35d..8bdc042f6e8e 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -1892,43 +1892,36 @@ cmd_config_max_pkt_len_parsed(void
> *parsed_result,
>                               __rte_unused void *data)
>  {
>       struct cmd_config_max_pkt_len_result *res = parsed_result;
> -     uint32_t max_rx_pkt_len_backup = 0;
> -     portid_t pid;
> +     portid_t port_id;
>       int ret;
> 
> +     if (strcmp(res->name, "max-pkt-len")) {
> +             printf("Unknown parameter\n");
> +             return;
> +     }
> +
>       if (!all_ports_stopped()) {
>               printf("Please stop all ports first\n");
>               return;
>       }
> 
> -     RTE_ETH_FOREACH_DEV(pid) {
> -             struct rte_port *port = &ports[pid];
> -
> -             if (!strcmp(res->name, "max-pkt-len")) {
> -                     if (res->value < RTE_ETHER_MIN_LEN) {
> -                             printf("max-pkt-len can not be less
> than %d\n",
> -                                             RTE_ETHER_MIN_LEN);
> -                             return;
> -                     }
> -                     if (res->value == port-
> >dev_conf.rxmode.max_rx_pkt_len)
> -                             return;
> -
> -                     ret = eth_dev_info_get_print_err(pid, &port-
> >dev_info);
> -                     if (ret != 0) {
> -                             printf("rte_eth_dev_info_get() failed for
> port %u\n",
> -                                     pid);
> -                             return;
> -                     }
> +     RTE_ETH_FOREACH_DEV(port_id) {
> +             struct rte_port *port = &ports[port_id];
> 
> -                     max_rx_pkt_len_backup = port-
> >dev_conf.rxmode.max_rx_pkt_len;
> +             if (res->value < RTE_ETHER_MIN_LEN) {
> +                     printf("max-pkt-len can not be less than %d\n",
> +                                     RTE_ETHER_MIN_LEN);
> +                     return;
> +             }
> 
> -                     port->dev_conf.rxmode.max_rx_pkt_len = res-
> >value;
> -                     if (update_jumbo_frame_offload(pid) != 0)
> -                             port->dev_conf.rxmode.max_rx_pkt_len =
> max_rx_pkt_len_backup;
> -             } else {
> -                     printf("Unknown parameter\n");
> +             ret = eth_dev_info_get_print_err(port_id, &port->dev_info);
> +             if (ret != 0) {
> +                     printf("rte_eth_dev_info_get() failed for port %u\n",
> +                             port_id);
>                       return;
>               }
> +
> +             update_jumbo_frame_offload(port_id, res->value);
>       }
> 
>       init_port_config();
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index 04ae0feb5852..a87265d7638b 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1139,7 +1139,6 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
>       int diag;
>       struct rte_port *rte_port = &ports[port_id];
>       struct rte_eth_dev_info dev_info;
> -     uint16_t eth_overhead;
>       int ret;
> 
>       if (port_id_is_invalid(port_id, ENABLED_WARN))
> @@ -1155,20 +1154,17 @@ port_mtu_set(portid_t port_id, uint16_t mtu)
>               return;
>       }
>       diag = rte_eth_dev_set_mtu(port_id, mtu);
> -     if (diag)
> +     if (diag) {
>               printf("Set MTU failed. diag=%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 = dev_info.max_rx_pktlen -
> dev_info.max_mtu;
> +             return;
> +     }
> +
> +     rte_port->dev_conf.rxmode.mtu = mtu;
> +
> +     if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_JUMBO_FRAME)
> {
>               if (mtu > RTE_ETHER_MTU) {
>                       rte_port->dev_conf.rxmode.offloads |=
> 
>       DEV_RX_OFFLOAD_JUMBO_FRAME;
> -                     rte_port->dev_conf.rxmode.max_rx_pkt_len =
> -                                             mtu + eth_overhead;
>               } else
>                       rte_port->dev_conf.rxmode.offloads &=
> 
>       ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index 5e69d2aa8cfe..8e8556d74a4a 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -860,7 +860,9 @@ launch_args_parse(int argc, char** argv)
>                       if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
>                               n = atoi(optarg);
>                               if (n >= RTE_ETHER_MIN_LEN)
> -                                     rx_mode.max_rx_pkt_len =
> (uint32_t) n;
> +                                     rx_mode.mtu = (uint32_t) n -
> +                                             (RTE_ETHER_HDR_LEN +
> +                                              RTE_ETHER_CRC_LEN);
>                               else
>                                       rte_exit(EXIT_FAILURE,
>                                                "Invalid max-pkt-len=%d -
> should be > %d\n",
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 1cdd3cdd12b6..2c79cae05664 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -445,13 +445,7 @@ lcoreid_t latencystats_lcore_id = -1;
>  /*
>   * Ethernet device configuration.
>   */
> -struct rte_eth_rxmode rx_mode = {
> -     /* Default maximum frame length.
> -      * Zero is converted to "RTE_ETHER_MTU + PMD Ethernet overhead"
> -      * in init_config().
> -      */
> -     .max_rx_pkt_len = 0,
> -};
> +struct rte_eth_rxmode rx_mode;
> 
>  struct rte_eth_txmode tx_mode = {
>       .offloads = DEV_TX_OFFLOAD_MBUF_FAST_FREE,
> @@ -1417,6 +1411,20 @@ check_nb_hairpinq(queueid_t hairpinq)
>       return 0;
>  }
> 
> +static int
> +get_eth_overhead(struct rte_eth_dev_info *dev_info)
> +{
> +     uint32_t eth_overhead;
> +
> +     if (dev_info->max_mtu != UINT16_MAX &&
> +         dev_info->max_rx_pktlen > dev_info->max_mtu)
> +             eth_overhead = dev_info->max_rx_pktlen - dev_info-
> >max_mtu;
> +     else
> +             eth_overhead = RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +
> +     return eth_overhead;
> +}
> +
>  static void
>  init_config(void)
>  {
> @@ -1465,7 +1473,7 @@ init_config(void)
>                       rte_exit(EXIT_FAILURE,
>                                "rte_eth_dev_info_get() failed\n");
> 
> -             ret = update_jumbo_frame_offload(pid);
> +             ret = update_jumbo_frame_offload(pid, 0);
>               if (ret != 0)
>                       printf("Updating jumbo frame offload failed for
> port %u\n",
>                               pid);
> @@ -1512,14 +1520,19 @@ init_config(void)
>                */
>               if (port->dev_info.rx_desc_lim.nb_mtu_seg_max !=
> UINT16_MAX &&
>                               port-
> >dev_info.rx_desc_lim.nb_mtu_seg_max != 0) {
> -                     data_size = rx_mode.max_rx_pkt_len /
> -                             port-
> >dev_info.rx_desc_lim.nb_mtu_seg_max;
> +                     uint32_t eth_overhead = get_eth_overhead(&port-
> >dev_info);
> +                     uint16_t mtu;
> 
> -                     if ((data_size + RTE_PKTMBUF_HEADROOM) >
> +                     if (rte_eth_dev_get_mtu(pid, &mtu) == 0) {
> +                             data_size = mtu + eth_overhead /
> +                                     port-
> >dev_info.rx_desc_lim.nb_mtu_seg_max;
> +
> +                             if ((data_size + RTE_PKTMBUF_HEADROOM) >
>                                                       mbuf_data_size[0]) {
> -                             mbuf_data_size[0] = data_size +
> -                                              RTE_PKTMBUF_HEADROOM;
> -                             warning = 1;
> +                                     mbuf_data_size[0] = data_size +
> +
> RTE_PKTMBUF_HEADROOM;
> +                                     warning = 1;
> +                             }
>                       }
>               }
>       }
> @@ -3352,43 +3365,44 @@ rxtx_port_config(struct rte_port *port)
> 
>  /*
>   * 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 = &ports[portid];
>       uint32_t eth_overhead;
>       uint64_t rx_offloads;
> -     int ret;
> +     uint16_t mtu, new_mtu;
>       bool on;
> 
> -     /* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
> -     if (port->dev_info.max_mtu != UINT16_MAX &&
> -         port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
> -             eth_overhead = port->dev_info.max_rx_pktlen -
> -                             port->dev_info.max_mtu;
> -     else
> -             eth_overhead = RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN;
> +     eth_overhead = get_eth_overhead(&port->dev_info);
> 
> -     rx_offloads = port->dev_conf.rxmode.offloads;
> +     if (rte_eth_dev_get_mtu(portid, &mtu) != 0) {
> +             printf("Failed to get MTU for port %u\n", portid);
> +             return -1;
> +     }
> +
> +     if (max_rx_pktlen == 0)
> +             max_rx_pktlen = mtu + eth_overhead;
> 
> -     /* Default config value is 0 to use PMD specific overhead */
> -     if (port->dev_conf.rxmode.max_rx_pkt_len == 0)
> -             port->dev_conf.rxmode.max_rx_pkt_len = RTE_ETHER_MTU
> + eth_overhead;
> +     rx_offloads = port->dev_conf.rxmode.offloads;
> +     new_mtu = max_rx_pktlen - eth_overhead;
> 
> -     if (port->dev_conf.rxmode.max_rx_pkt_len <= RTE_ETHER_MTU +
> eth_overhead) {
> +     if (new_mtu <= RTE_ETHER_MTU) {
>               rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>               on = false;
>       } else {
>               if ((port->dev_info.rx_offload_capa &
> DEV_RX_OFFLOAD_JUMBO_FRAME) == 0) {
>                       printf("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 |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> @@ -3409,18 +3423,16 @@ update_jumbo_frame_offload(portid_t portid)
>               }
>       }
> 
> -     /* If JUMBO_FRAME is set MTU conversion done by ethdev layer,
> -      * if unset do it here
> -      */
> -     if ((rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) == 0) {
> -             ret = rte_eth_dev_set_mtu(portid,
> -                             port->dev_conf.rxmode.max_rx_pkt_len -
> eth_overhead);
> -             if (ret)
> -                     printf("Failed to set MTU to %u for port %u\n",
> -                             port->dev_conf.rxmode.max_rx_pkt_len -
> eth_overhead,
> -                             portid);
> +     if (mtu == new_mtu)
> +             return 0;
> +
> +     if (rte_eth_dev_set_mtu(portid, new_mtu) != 0) {
> +             printf("Failed to set MTU to %u for port %u\n", new_mtu,
> portid);
> +             return -1;
>       }
> 
> +     port->dev_conf.rxmode.mtu = new_mtu;
> +
>       return 0;
>  }
> 
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
> index d61a055bdd1b..42143f85924f 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -1012,7 +1012,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);
> 
>  /*
>   * 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 = {
>       .rxmode = {
>               .mq_mode = ETH_MQ_RX_NONE,
>               .split_hdr_size = 0,
> -             .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
>       },
>       .txmode = {
>               .mq_mode = 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  = {
>  static struct rte_eth_conf default_pmd_conf = {
>       .rxmode = {
>               .mq_mode = ETH_MQ_RX_NONE,
> -             .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
>               .split_hdr_size = 0,
>       },
>       .txmode = {
> 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  = {
>  static struct rte_eth_conf default_pmd_conf = {
>       .rxmode = {
>               .mq_mode = ETH_MQ_RX_NONE,
> -             .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
>               .split_hdr_size = 0,
>       },
>       .txmode = {
> @@ -93,7 +92,6 @@ static struct rte_eth_conf default_pmd_conf = {
>  static struct rte_eth_conf rss_pmd_conf = {
>       .rxmode = {
>               .mq_mode = ETH_MQ_RX_RSS,
> -             .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
>               .split_hdr_size = 0,
>       },
>       .txmode = {
> 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 = {
>       .rxmode = {
>               .mq_mode = ETH_MQ_RX_NONE,
> -             .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
>               .split_hdr_size = 0,
>       },
>       .txmode = {
> diff --git a/doc/guides/nics/dpaa.rst b/doc/guides/nics/dpaa.rst
> index 917482dbe2a5..b8d43aa90098 100644
> --- a/doc/guides/nics/dpaa.rst
> +++ b/doc/guides/nics/dpaa.rst
> @@ -335,7 +335,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
> 
>  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, frames
>  up to 10240 bytes can still reach the host interface.
> 
> diff --git a/doc/guides/nics/dpaa2.rst b/doc/guides/nics/dpaa2.rst
> index 6470f1c05ac8..ce16e1047df2 100644
> --- a/doc/guides/nics/dpaa2.rst
> +++ b/doc/guides/nics/dpaa2.rst
> @@ -551,7 +551,7 @@ Maximum packet length
>  ~~~~~~~~~~~~~~~~~~~~~
> 
>  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, frames
>  up to 10240 bytes can still reach the host interface.
> 
> diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
> index 403c2b03a386..c98242f3b72f 100644
> --- a/doc/guides/nics/features.rst
> +++ b/doc/guides/nics/features.rst
> @@ -166,7 +166,7 @@ Jumbo frame
>  Supports Rx jumbo frames.
> 
>  * **[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()``.
> 
> 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
>  ~~~~~~~~~~~~~~~~~~~~~
> 
>  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, frames
>  up to 15364 bytes can still reach the host interface.
> 
> diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
> index 83299646ddb1..338734826a7a 100644
> --- a/doc/guides/nics/mlx5.rst
> +++ b/doc/guides/nics/mlx5.rst
> @@ -584,9 +584,9 @@ Driver options
>    and each stride receives one packet. MPRQ can improve throughput for
>    small-packet traffic.
> 
> -  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
> long 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.
> 
> 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
>  ~~~~~~~~~~~~~~~~~~~~~
> 
>  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, frames
>  up to 32k bytes can still reach the host interface.
> 
> 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
>  ~~~~~~~~~~~~~~~~~~~~~
> 
>  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, frames
>  up to 9200 bytes can still reach the host interface.
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> index 9584d6bfd723..86da47d8f9c6 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -56,31 +56,6 @@ Deprecation Notices
>    In 19.11 PMDs will still update the field even when the offload is not
>    enabled.
> 
> -* 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 will
> -  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 size,
> 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 this
> -  ``(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 01915971ae83..2cc36a688af3 100644
> --- a/doc/guides/sample_app_ug/flow_classify.rst
> +++ b/doc/guides/sample_app_ug/flow_classify.rst
> @@ -325,13 +325,7 @@ Forwarding application is shown below:
>      }
> 
>  The Ethernet ports are configured with default settings using the
> -``rte_eth_dev_configure()`` function and the ``port_conf_default`` struct.
> -
> -.. code-block:: c
> -
> -    static const struct rte_eth_conf port_conf_default = {
> -        .rxmode = { .max_rx_pkt_len = RTE_ETHER_MAX_LEN }
> -    };
> +``rte_eth_dev_configure()`` function.
> 
>  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/ioat.rst
> b/doc/guides/sample_app_ug/ioat.rst
> index 7eb557f91c7a..c5c06261e395 100644
> --- a/doc/guides/sample_app_ug/ioat.rst
> +++ b/doc/guides/sample_app_ug/ioat.rst
> @@ -162,7 +162,6 @@ multiple CBDMA channels per port:
>      static const struct rte_eth_conf port_conf = {
>          .rxmode = {
>              .mq_mode        = ETH_MQ_RX_RSS,
> -            .max_rx_pkt_len = RTE_ETHER_MAX_LEN
>          },
>          .rx_adv_conf = {
>              .rss_conf = {
> diff --git a/doc/guides/sample_app_ug/ip_reassembly.rst
> b/doc/guides/sample_app_ug/ip_reassembly.rst
> index e72c8492e972..2090b23fdd1c 100644
> --- a/doc/guides/sample_app_ug/ip_reassembly.rst
> +++ b/doc/guides/sample_app_ug/ip_reassembly.rst
> @@ -175,7 +175,7 @@ each RX queue uses its own mempool.
>  .. code-block:: c
> 
>      nb_mbuf = RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST) *
> RTE_LIBRTE_IP_FRAG_MAX_FRAGS;
> -    nb_mbuf *= (port_conf.rxmode.max_rx_pkt_len + BUF_SIZE - 1) /
> BUF_SIZE;
> +    nb_mbuf *= (port_conf.rxmode.mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN + BUF_SIZE - 1) / BUF_SIZE;
>      nb_mbuf *= 2; /* ipv4 and ipv6 */
>      nb_mbuf += RTE_TEST_RX_DESC_DEFAULT +
> RTE_TEST_TX_DESC_DEFAULT;
>      nb_mbuf = RTE_MAX(nb_mbuf, (uint32_t)NB_MBUF);
> diff --git a/doc/guides/sample_app_ug/skeleton.rst
> b/doc/guides/sample_app_ug/skeleton.rst
> index 263d8debc81b..a88cb8f14a4b 100644
> --- a/doc/guides/sample_app_ug/skeleton.rst
> +++ b/doc/guides/sample_app_ug/skeleton.rst
> @@ -157,13 +157,7 @@ Forwarding application is shown below:
>      }
> 
>  The Ethernet ports are configured with default settings using the
> -``rte_eth_dev_configure()`` function and the ``port_conf_default`` struct:
> -
> -.. code-block:: c
> -
> -    static const struct rte_eth_conf port_conf_default = {
> -        .rxmode = { .max_rx_pkt_len = RTE_ETHER_MAX_LEN }
> -    };
> +``rte_eth_dev_configure()`` function.
> 
>  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;
> 
> -     /* update max frame size */
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> -
>       return 0;
>  }
> 
> diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
> index 623fa5e5ff5b..2554f5fdf59a 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;
> 
> -     max_rx_pkt_len = eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     max_rx_pktlen = eth_dev->data->mtu + RTE_ETHER_HDR_LEN +
> +             RTE_ETHER_CRC_LEN;
> 
> -     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,
> 
>       PMD_DRV_LOG(DEBUG, "AVP max_rx_pkt_len=(%u,%u)
> mbuf_size=(%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);
> 
> @@ -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 = dev->data->dev_private;
>       int ret;
>       struct rte_eth_dev_data *dev_data = dev->data;
> -     uint16_t max_pkt_len = dev_data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     uint16_t max_pkt_len;
> 
>       dev->dev_ops = &axgbe_eth_dev_ops;
> 
> @@ -383,6 +383,8 @@ axgbe_dev_start(struct rte_eth_dev *dev)
> 
>       rte_bit_relaxed_clear32(AXGBE_STOPPED, &pdata->dev_state);
>       rte_bit_relaxed_clear32(AXGBE_DOWN, &pdata->dev_state);
> +
> +     max_pkt_len = 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 = 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 |=
>                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>               val = 1;
> @@ -1500,7 +1502,6 @@ static int axgb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>               val = 0;
>       }
>       AXGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
>       return 0;
>  }
> 
> 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 = dev->data->dev_private;
> -     struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
> 
>       int mp_ncpus = sysconf(_SC_NPROCESSORS_CONF);
> 
>       PMD_INIT_FUNC_TRACE(sc);
> 
> -     if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -             sc->mtu = dev->data->dev_conf.rxmode.max_rx_pkt_len;
> -             dev->data->mtu = sc->mtu;
> -     }
> +     sc->mtu = dev->data->dev_conf.rxmode.mtu;
> 
>       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_ethdev.c
> index c9536f79267d..335505a106d5 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -1128,13 +1128,8 @@ static int bnxt_dev_configure_op(struct
> rte_eth_dev *eth_dev)
>               rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
>       eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
> 
> -     if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -             eth_dev->data->mtu =
> -                     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;
> 
>  resource_error:
> @@ -1172,6 +1167,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 = BNXT_MAX_PKT_LEN - BNXT_MAX_MTU;
>       uint16_t buf_size;
>       int i;
> 
> @@ -1186,7 +1182,7 @@ static int bnxt_scattered_rx(struct rte_eth_dev
> *eth_dev)
> 
>               buf_size = (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;
> @@ -2992,6 +2988,7 @@ bnxt_tx_burst_mode_get(struct rte_eth_dev *dev,
> __rte_unused uint16_t queue_id,
> 
>  int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
>  {
> +     uint32_t overhead = BNXT_MAX_PKT_LEN - BNXT_MAX_MTU;
>       struct bnxt *bp = eth_dev->data->dev_private;
>       uint32_t new_pkt_size;
>       uint32_t rc = 0;
> @@ -3005,8 +3002,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;
> 
> -     new_pkt_size = new_mtu + RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN +
> -                    VLAN_TAG_SIZE * BNXT_NUM_VLANS;
> +     new_pkt_size = new_mtu + overhead;
> 
>       /*
>        * Disallow any MTU change that would require scattered receive
> support
> @@ -3033,7 +3029,7 @@ int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev,
> uint16_t new_mtu)
>       }
> 
>       /* Is there a change in mtu setting? */
> -     if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len ==
> new_pkt_size)
> +     if (eth_dev->data->mtu == new_mtu)
>               return rc;
> 
>       for (i = 0; i < bp->nr_vnics; i++) {
> @@ -3055,9 +3051,6 @@ int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev,
> uint16_t new_mtu)
>               }
>       }
> 
> -     if (!rc)
> -             eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =
> new_pkt_size;
> -
>       PMD_DRV_LOG(INFO, "New MTU is %d\n", new_mtu);
> 
>       return rc;
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c
> b/drivers/net/bonding/rte_eth_bond_pmd.c
> index b01ef003e65c..b2a1833e3f91 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -1728,8 +1728,8 @@ slave_configure(struct rte_eth_dev
> *bonded_eth_dev,
>               slave_eth_dev->data->dev_conf.rxmode.offloads &=
>                               ~DEV_RX_OFFLOAD_VLAN_FILTER;
> 
> -     slave_eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =
> -                     bonded_eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     slave_eth_dev->data->dev_conf.rxmode.mtu =
> +                     bonded_eth_dev->data->dev_conf.rxmode.mtu;
> 
>       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_ethdev.c
> index 7adab4605819..da6c5e8f242f 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 = rte_mempool_get_priv(rxq->qconf.mp);
>       buffsz = mbp_priv->mbuf_data_room_size -
> RTE_PKTMBUF_HEADROOM;
> 
> -     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 |= DEV_RX_OFFLOAD_SCATTER;
>               dev->tx_offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
>       }
> @@ -64,18 +64,13 @@ nix_recalc_mtu(struct rte_eth_dev *eth_dev)
>  {
>       struct rte_eth_dev_data *data = eth_dev->data;
>       struct cnxk_eth_rxq_sp *rxq;
> -     uint16_t mtu;
>       int rc;
> 
>       rxq = ((struct cnxk_eth_rxq_sp *)data->rx_queues[0]) - 1;
>       /* Setup scatter mode if needed by jumbo */
>       nix_enable_mseg_on_jumbo(rxq);
> 
> -     /* Setup MTU based on max_rx_pkt_len */
> -     mtu = data->dev_conf.rxmode.max_rx_pkt_len -
> CNXK_NIX_L2_OVERHEAD +
> -                             CNXK_NIX_MAX_VTAG_ACT_SIZE;
> -
> -     rc = cnxk_nix_mtu_set(eth_dev, mtu);
> +     rc = cnxk_nix_mtu_set(eth_dev, data->mtu);
>       if (rc)
>               plt_err("Failed to set default MTU size, rc=%d", rc);
> 
> 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;
>       }
> 
> -     frame_size += RTE_ETHER_CRC_LEN;
> -
> -     if (frame_size > RTE_ETHER_MAX_LEN)
> +     if (mtu > RTE_ETHER_MTU)
>               dev->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
>               dev->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
> -     /* Update max_rx_pkt_len */
> -     data->dev_conf.rxmode.max_rx_pkt_len = 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;
> 
>       /* 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;
> 
>       /* 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 |=
>                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
> @@ -323,9 +323,6 @@ int cxgbe_dev_mtu_set(struct rte_eth_dev
> *eth_dev, uint16_t mtu)
> 
>       err = 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 =
> new_mtu;
> -
>       return err;
>  }
> 
> @@ -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 = eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     unsigned int pkt_len = eth_dev->data->mtu + RTE_ETHER_HDR_LEN
> +
> +             RTE_ETHER_CRC_LEN;
>       struct port_info *pi = eth_dev->data->dev_private;
>       struct adapter *adapter = 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 = temp_nb_desc;
> 
>       /* 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 |=
>                       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;
> 
> -     mtu = pi->eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
> -           (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN);
> +     mtu = pi->eth_dev->data->mtu;
> 
>       conf_offloads = pi->eth_dev->data->dev_conf.rxmode.offloads;
> 
> 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 = txq->data->dev_conf.rxmode.max_rx_pkt_len;
> +     u32 max_pkt_len;
> 
>       /* 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;
>       }
> 
> +     max_pkt_len = 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 27d670f843d2..56703e3a39e8 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;
>       }
> 
> -     if (frame_size > DPAA_ETH_MAX_LEN)
> +     if (mtu > RTE_ETHER_MTU)
>               dev->data->dev_conf.rxmode.offloads |=
> 
>       DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
>               dev->data->dev_conf.rxmode.offloads &=
> 
>       ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> -
>       fman_if_set_maxfrm(dev->process_private, frame_size);
> 
>       return 0;
> @@ -213,6 +211,7 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
>       struct fman_if *fif = dev->process_private;
>       struct __fman_if *__fif;
>       struct rte_intr_handle *intr_handle;
> +     uint32_t max_rx_pktlen;
>       int speed, duplex;
>       int ret;
> 
> @@ -238,27 +237,17 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
>               tx_offloads, dev_tx_offloads_nodis);
>       }
> 
> -     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 <=
> -                 DPAA_MAX_RX_PKT_LEN)
> -                     max_len = dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> -             else {
> -                     DPAA_PMD_INFO("enabling jumbo override conf
> max len=%d "
> -                             "supported is %d",
> -                             dev->data-
> >dev_conf.rxmode.max_rx_pkt_len,
> -                             DPAA_MAX_RX_PKT_LEN);
> -                     max_len = DPAA_MAX_RX_PKT_LEN;
> -             }
> -
> -             fman_if_set_maxfrm(dev->process_private, max_len);
> -             dev->data->mtu = max_len
> -                     - RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN -
> VLAN_TAG_SIZE;
> +     max_rx_pktlen = 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=%d "
> +                     "supported is %d",
> +                     max_rx_pktlen, DPAA_MAX_RX_PKT_LEN);
> +             max_rx_pktlen = DPAA_MAX_RX_PKT_LEN;
>       }
> 
> +     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 = 0;
>       int ret;
>       u32 buffsz = rte_pktmbuf_data_room_size(mp) -
> RTE_PKTMBUF_HEADROOM;
> +     uint32_t max_rx_pktlen;
> 
>       PMD_INIT_FUNC_TRACE();
> 
> @@ -977,17 +967,17 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev
> *dev, uint16_t queue_idx,
>               return -EINVAL;
>       }
> 
> +     max_rx_pktlen = 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 <= buffsz) {
> +     if (max_rx_pktlen <= 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 = 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);
>       }
> 
>       dpaa_intf->bp_info = 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,
> 
>       dpaa_intf->valid = 1;
>       DPAA_PMD_DEBUG("if:%s sg_on = %d, max_frm =%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 8b803b8542dc..6213bcbf3a43 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 = false;
>       int tx_l4_csum_offload = false;
>       int ret, tc_index;
> +     uint32_t max_rx_pktlen;
> 
>       PMD_INIT_FUNC_TRACE();
> 
> @@ -559,23 +560,17 @@ dpaa2_eth_dev_configure(struct rte_eth_dev
> *dev)
>               tx_offloads, dev_tx_offloads_nodis);
>       }
> 
> -     if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -             if (eth_conf->rxmode.max_rx_pkt_len <=
> DPAA2_MAX_RX_PKT_LEN) {
> -                     ret = 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 =
> -                             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 = eth_conf->rxmode.mtu + RTE_ETHER_HDR_LEN +
> +                             RTE_ETHER_CRC_LEN + VLAN_TAG_SIZE;
> +     if (max_rx_pktlen <= DPAA2_MAX_RX_PKT_LEN) {
> +             ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW,
> +                     priv->token, max_rx_pktlen - RTE_ETHER_CRC_LEN);
> +             if (ret) {
> +                     DPAA2_PMD_ERR("Unable to set mtu. check config");
> +                     return ret;
>               }
> +     } else {
> +             return -1;
>       }
> 
>       if (eth_conf->rxmode.mq_mode == 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;
> 
> -     if (frame_size > DPAA2_ETH_MAX_LEN)
> +     if (mtu > RTE_ETHER_MTU)
>               dev->data->dev_conf.rxmode.offloads |=
> 
>       DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
>               dev->data->dev_conf.rxmode.offloads &=
> 
>       ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = 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 = E1000_READ_REG(hw, E1000_RCTL);
> 
>       /* switch to jumbo mode if needed */
> -     if (frame_size > E1000_ETH_MAX_LEN) {
> +     if (mtu > RTE_ETHER_MTU) {
>               dev->data->dev_conf.rxmode.offloads |=
>                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>               rctl |= 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);
> 
> -     /* update max frame size */
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
>       return 0;
>  }
> 
> diff --git a/drivers/net/e1000/igb_ethdev.c
> b/drivers/net/e1000/igb_ethdev.c
> index 10ee0f33415a..35b517891d67 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -2686,9 +2686,7 @@ igb_vlan_hw_extend_disable(struct rte_eth_dev
> *dev)
>       E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
> 
>       /* 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);
>  }
> 
>  static void
> @@ -2704,10 +2702,8 @@ igb_vlan_hw_extend_enable(struct rte_eth_dev
> *dev)
>       E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
> 
>       /* 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);
>  }
> 
>  static int
> @@ -4405,7 +4401,7 @@ eth_igb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>       rctl = E1000_READ_REG(hw, E1000_RCTL);
> 
>       /* switch to jumbo mode if needed */
> -     if (frame_size > E1000_ETH_MAX_LEN) {
> +     if (mtu > RTE_ETHER_MTU) {
>               dev->data->dev_conf.rxmode.offloads |=
>                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>               rctl |= E1000_RCTL_LPE;
> @@ -4416,11 +4412,7 @@ eth_igb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>       }
>       E1000_WRITE_REG(hw, E1000_RCTL, rctl);
> 
> -     /* update max frame size */
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = 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);
> 
>       return 0;
>  }
> diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
> index 278d5d2712af..de12997b4bdd 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;
> 
> @@ -2342,9 +2343,8 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
>       /*
>        * Configure support of jumbo frames, if any.
>        */
> +     max_len = dev->data->mtu + E1000_ETH_OVERHEAD;
>       if (dev->data->dev_conf.rxmode.offloads &
> DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -             uint32_t max_len = dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> -
>               rctl |= E1000_RCTL_LPE;
> 
>               /*
> @@ -2422,8 +2422,7 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
>                                              E1000_SRRCTL_BSIZEPKT_SHIFT);
> 
>                       /* 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;
> 
>       hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> 
>       /* setup MTU */
> -     e1000_rlpml_set_vf(hw,
> -             (uint16_t)(dev->data->dev_conf.rxmode.max_rx_pkt_len +
> -             VLAN_TAG_SIZE));
> +     max_len = dev->data->mtu + E1000_ETH_OVERHEAD;
> +     e1000_rlpml_set_vf(hw, (uint16_t)(max_len + VLAN_TAG_SIZE));
> 
>       /* Configure and enable each RX queue. */
>       rctl_bsize = 0;
> @@ -2712,8 +2711,7 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev)
>                                              E1000_SRRCTL_BSIZEPKT_SHIFT);
> 
>                       /* 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 dfe68279fa7b..e9b718786a39 100644
> --- a/drivers/net/ena/ena_ethdev.c
> +++ b/drivers/net/ena/ena_ethdev.c
> @@ -850,26 +850,14 @@ static int ena_queue_start_all(struct rte_eth_dev
> *dev,
>       return rc;
>  }
> 
> -static uint32_t ena_get_mtu_conf(struct ena_adapter *adapter)
> -{
> -     uint32_t max_frame_len = adapter->max_mtu;
> -
> -     if (adapter->edev_data->dev_conf.rxmode.offloads &
> -         DEV_RX_OFFLOAD_JUMBO_FRAME)
> -             max_frame_len =
> -                     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 = ena_get_mtu_conf(adapter);
> +     uint32_t mtu = adapter->edev_data->mtu;
> 
> -     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",
> -                          max_frame_len, adapter->max_mtu,
> ENA_MIN_MTU);
> +                          mtu, adapter->max_mtu, ENA_MIN_MTU);
>               return ENA_COM_UNSUPPORTED;
>       }
> 
> @@ -1042,11 +1030,11 @@ static int ena_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>       ena_dev = &adapter->ena_dev;
>       ena_assert_msg(ena_dev != NULL, "Uninitialized device\n");
> 
> -     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;
>       }
> 
> @@ -2067,7 +2055,10 @@ static int ena_infos_get(struct rte_eth_dev *dev,
>                                          ETH_RSS_UDP;
> 
>       dev_info->min_rx_bufsize = ENA_MIN_FRAME_LEN;
> -     dev_info->max_rx_pktlen  = adapter->max_mtu;
> +     dev_info->max_rx_pktlen  = adapter->max_mtu +
> RTE_ETHER_HDR_LEN +
> +             RTE_ETHER_CRC_LEN;
> +     dev_info->min_mtu = ENA_MIN_MTU;
> +     dev_info->max_mtu = adapter->max_mtu;
>       dev_info->max_mac_addrs = 1;
> 
>       dev_info->max_rx_queues = 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;
>       }
> 
> -     if (frame_size > ENETC_ETH_MAX_LEN)
> +     if (mtu > RTE_ETHER_MTU)
>               dev->data->dev_conf.rxmode.offloads &=
> 
>       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);
> 
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = 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 = &dev->data->dev_conf;
>       uint64_t rx_offloads = eth_conf->rxmode.offloads;
>       uint32_t checksum = L3_CKSUM | L4_CKSUM;
> +     uint32_t max_len;
> 
>       PMD_INIT_FUNC_TRACE();
> 
> -     if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> -             uint32_t max_len;
> -
> -             max_len = 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 = RTE_ETHER_MAX_LEN -
> RTE_ETHER_HDR_LEN -
> -                     RTE_ETHER_CRC_LEN;
> -     }
> +     max_len = 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);
> 
>       if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
>               int config;
> diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.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 = 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 = 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;
> 
>       if (!rq->in_use)
> @@ -293,16 +293,16 @@ enic_alloc_rx_queue_mbufs(struct enic *enic,
> struct vnic_rq *rq)
> 
>       /*
>        * 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 = enic->rte_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     max_rx_pktlen = enic_mtu_to_max_rx_pktlen(enic->rte_dev-
> >data->mtu);
>       rq_buf_len = 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 = max_rx_pkt_len;
> +     if (max_rx_pktlen < rq_buf_len && !rq->data_queue_enable)
> +             rq_buf_len = max_rx_pktlen;
>       for (i = 0; i < rq->ring.desc_count; i++, rqd++) {
>               mb = rte_mbuf_raw_alloc(rq->mp);
>               if (mb == 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;
> 
>       /*
>        * Representor uses a reserved PF queue. Translate representor
> @@ -854,23 +854,23 @@ int enic_alloc_rq(struct enic *enic, uint16_t
> queue_idx,
> 
>       mbuf_size = (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 = enic->rte_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     /* max_rx_pktlen includes the ethernet header and CRC. */
> +     max_rx_pktlen = enic_mtu_to_max_rx_pktlen(enic->rte_dev-
> >data->mtu);
> 
>       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 = (max_rx_pkt_len + mbuf_size - 1) /
> mbuf_size;
> +             mbufs_per_pkt = (max_rx_pktlen + mbuf_size - 1) /
> mbuf_size;
>       } else {
>               dev_info(enic, "Scatter rx mode disabled\n");
>               mbufs_per_pkt = 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);
>               }
>       }
> 
> @@ -879,16 +879,15 @@ int enic_alloc_rq(struct enic *enic, uint16_t
> queue_idx,
>               rq_sop->data_queue_enable = 1;
>               rq_data->in_use = 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);
> 
> -     /* Update the MTU and maximum packet length */
> -     eth_dev->data->mtu = new_mtu;
> -     eth_dev->data->dev_conf.rxmode.max_rx_pkt_len =
> -             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);
> 
>               /* 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 946465779f2e..c737ef8d06d8 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -324,19 +324,19 @@ static int hinic_dev_configure(struct rte_eth_dev
> *dev)
>               dev->data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_RSS_HASH;
> 
>       /* 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;
>       }
> 
> -     nic_dev->mtu_size =
> -             HINIC_PKTLEN_TO_MTU(dev->data-
> >dev_conf.rxmode.max_rx_pkt_len);
> +     nic_dev->mtu_size = dev->data->dev_conf.rxmode.mtu;
> 
>       /* rss template */
>       err = hinic_config_mq_mode(dev, TRUE);
> @@ -1539,7 +1539,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 =
> HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
> -     uint32_t frame_size;
>       int ret = 0;
> 
>       PMD_DRV_LOG(INFO, "Set port mtu, port_id: %d, mtu: %d,
> max_pkt_len: %d",
> @@ -1557,16 +1556,13 @@ static int hinic_dev_set_mtu(struct rte_eth_dev
> *dev, uint16_t mtu)
>               return ret;
>       }
> 
> -     /* update max frame size */
> -     frame_size = HINIC_MTU_TO_PKTLEN(mtu);
> -     if (frame_size > HINIC_ETH_MAX_LEN)
> +     if (mtu > RTE_ETHER_MTU)
>               dev->data->dev_conf.rxmode.offloads |=
>                       DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
>               dev->data->dev_conf.rxmode.offloads &=
>                       ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
>       nic_dev->mtu_size = mtu;
> 
>       return ret;
> diff --git a/drivers/net/hns3/hns3_ethdev.c
> b/drivers/net/hns3/hns3_ethdev.c
> index e51512560e15..8bccdeddb2f7 100644
> --- a/drivers/net/hns3/hns3_ethdev.c
> +++ b/drivers/net/hns3/hns3_ethdev.c
> @@ -2379,20 +2379,11 @@ hns3_refresh_mtu(struct rte_eth_dev *dev,
> struct rte_eth_conf *conf)
>  {
>       struct hns3_adapter *hns = dev->data->dev_private;
>       struct hns3_hw *hw = &hns->hw;
> -     uint32_t max_rx_pkt_len;
> -     uint16_t mtu;
> -     int ret;
> -
> -     if (!(conf->rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME))
> -             return 0;
> +     uint32_t max_rx_pktlen;
> 
> -     /*
> -      * If jumbo frames are enabled, MTU needs to be refreshed
> -      * according to the maximum RX packet length.
> -      */
> -     max_rx_pkt_len = conf->rxmode.max_rx_pkt_len;
> -     if (max_rx_pkt_len > HNS3_MAX_FRAME_LEN ||
> -         max_rx_pkt_len <= HNS3_DEFAULT_FRAME_LEN) {
> +     max_rx_pktlen = conf->rxmode.mtu + HNS3_ETH_OVERHEAD;
> +     if (max_rx_pktlen > HNS3_MAX_FRAME_LEN ||
> +         max_rx_pktlen <= 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,
> @@ -2400,13 +2391,7 @@ hns3_refresh_mtu(struct rte_eth_dev *dev,
> struct rte_eth_conf *conf)
>               return -EINVAL;
>       }
> 
> -     mtu = (uint16_t)HNS3_PKTLEN_TO_MTU(max_rx_pkt_len);
> -     ret = hns3_dev_mtu_set(dev, mtu);
> -     if (ret)
> -             return ret;
> -     dev->data->mtu = mtu;
> -
> -     return 0;
> +     return hns3_dev_mtu_set(dev, conf->rxmode.mtu);
>  }
> 
>  static int
> @@ -2622,7 +2607,7 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>       }
> 
>       rte_spinlock_lock(&hw->lock);
> -     is_jumbo_frame = frame_size > HNS3_DEFAULT_FRAME_LEN ? true :
> false;
> +     is_jumbo_frame = mtu > RTE_ETHER_MTU ? true : false;
>       frame_size = RTE_MAX(frame_size, HNS3_DEFAULT_FRAME_LEN);
> 
>       /*
> @@ -2643,7 +2628,6 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>       else
>               dev->data->dev_conf.rxmode.offloads &=
> 
>       ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
>       rte_spinlock_unlock(&hw->lock);
> 
>       return 0;
> diff --git a/drivers/net/hns3/hns3_ethdev_vf.c
> b/drivers/net/hns3/hns3_ethdev_vf.c
> index e582503f529b..ca839fa55fa0 100644
> --- a/drivers/net/hns3/hns3_ethdev_vf.c
> +++ b/drivers/net/hns3/hns3_ethdev_vf.c
> @@ -784,8 +784,7 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
>       uint16_t nb_rx_q = dev->data->nb_rx_queues;
>       uint16_t nb_tx_q = dev->data->nb_tx_queues;
>       struct rte_eth_rss_conf rss_conf;
> -     uint32_t max_rx_pkt_len;
> -     uint16_t mtu;
> +     uint32_t max_rx_pktlen;
>       bool gro_en;
>       int ret;
> 
> @@ -825,29 +824,21 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
>                       goto cfg_err;
>       }
> 
> -     /*
> -      * 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 = conf->rxmode.max_rx_pkt_len;
> -             if (max_rx_pkt_len > HNS3_MAX_FRAME_LEN ||
> -                 max_rx_pkt_len <= 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 = -EINVAL;
> -                     goto cfg_err;
> -             }
> -
> -             mtu = (uint16_t)HNS3_PKTLEN_TO_MTU(max_rx_pkt_len);
> -             ret = hns3vf_dev_mtu_set(dev, mtu);
> -             if (ret)
> -                     goto cfg_err;
> -             dev->data->mtu = mtu;
> +     max_rx_pktlen = conf->rxmode.mtu + HNS3_ETH_OVERHEAD;
> +     if (max_rx_pktlen > HNS3_MAX_FRAME_LEN ||
> +         max_rx_pktlen <= 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 = -EINVAL;
> +             goto cfg_err;
>       }
> 
> +     ret = hns3vf_dev_mtu_set(dev, conf->rxmode.mtu);
> +     if (ret)
> +             goto cfg_err;
> +
>       ret = hns3vf_dev_configure_vlan(dev);
>       if (ret)
>               goto cfg_err;
> @@ -935,7 +926,6 @@ hns3vf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>       else
>               dev->data->dev_conf.rxmode.offloads &=
> 
>       ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
>       rte_spinlock_unlock(&hw->lock);
> 
>       return 0;
> diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
> index cb9eccf9faae..6b81688a7225 100644
> --- a/drivers/net/hns3/hns3_rxtx.c
> +++ b/drivers/net/hns3/hns3_rxtx.c
> @@ -1734,18 +1734,18 @@ hns3_rxq_conf_runtime_check(struct hns3_hw
> *hw, uint16_t buf_size,
>                               uint16_t nb_desc)
>  {
>       struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id];
> -     struct rte_eth_rxmode *rxmode = &hw->data->dev_conf.rxmode;
>       eth_rx_burst_t pkt_burst = dev->rx_pkt_burst;
> +     uint32_t frame_size = dev->data->mtu + HNS3_ETH_OVERHEAD;
>       uint16_t min_vec_bds;
> 
>       /*
>        * 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;
>       }
> @@ -1957,7 +1957,7 @@ hns3_rx_scattered_calc(struct rte_eth_dev *dev)
>       }
> 
>       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 = true;
>  }
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 7b230e2ed17a..1161f301b9ae 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -11772,14 +11772,10 @@ i40e_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>               return -EBUSY;
>       }
> 
> -     if (frame_size > I40E_ETH_MAX_LEN)
> -             dev_data->dev_conf.rxmode.offloads |=
> -                     DEV_RX_OFFLOAD_JUMBO_FRAME;
> +     if (mtu > RTE_ETHER_MTU)
> +             dev_data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
> -             dev_data->dev_conf.rxmode.offloads &=
> -                     ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
> -     dev_data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> +             dev_data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
>       return ret;
>  }
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index 0cfe13b7b227..086a167ca672 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -1927,8 +1927,7 @@ i40evf_rxq_init(struct rte_eth_dev *dev, struct
> i40e_rx_queue *rxq)
>       rxq->rx_hdr_len = 0;
>       rxq->rx_buf_len = RTE_ALIGN(buf_size, (1 <<
> I40E_RXQ_CTX_DBUFF_SHIFT));
>       len = rxq->rx_buf_len * I40E_MAX_CHAINED_RX_BUFFERS;
> -     rxq->max_pkt_len = RTE_MIN(len,
> -             dev_data->dev_conf.rxmode.max_rx_pkt_len);
> +     rxq->max_pkt_len = RTE_MIN(len, dev_data->mtu +
> I40E_ETH_OVERHEAD);
> 
>       /**
>        * Check if the jumbo frame and maximum packet length are set
> correctly
> @@ -2173,7 +2172,7 @@ i40evf_dev_start(struct rte_eth_dev *dev)
> 
>       hw->adapter_stopped = 0;
> 
> -     vf->max_pkt_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
> +     vf->max_pkt_len = dev->data->mtu + I40E_ETH_OVERHEAD;
>       vf->num_queue_pairs = RTE_MAX(dev->data->nb_rx_queues,
>                                       dev->data->nb_tx_queues);
> 
> @@ -2885,13 +2884,10 @@ i40evf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>               return -EBUSY;
>       }
> 
> -     if (frame_size > I40E_ETH_MAX_LEN)
> -             dev_data->dev_conf.rxmode.offloads |=
> -                     DEV_RX_OFFLOAD_JUMBO_FRAME;
> +     if (mtu > RTE_ETHER_MTU)
> +             dev_data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
> -             dev_data->dev_conf.rxmode.offloads &=
> -                     ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -     dev_data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> +             dev_data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
>       return ret;
>  }
> diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
> index 8d65f287f455..aa43796ef1af 100644
> --- a/drivers/net/i40e/i40e_rxtx.c
> +++ b/drivers/net/i40e/i40e_rxtx.c
> @@ -2904,8 +2904,8 @@ i40e_rx_queue_config(struct i40e_rx_queue *rxq)
>       }
> 
>       rxq->max_pkt_len =
> -             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 <= 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_ethdev.c
> index 41382c6d669b..13c2329d85a7 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -563,12 +563,13 @@ iavf_init_rxq(struct rte_eth_dev *dev, struct
> iavf_rx_queue *rxq)
>       struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
>       struct rte_eth_dev_data *dev_data = dev->data;
>       uint16_t buf_size, max_pkt_len, len;
> +     uint32_t frame_size = dev->data->mtu + IAVF_ETH_OVERHEAD;
> 
>       buf_size = rte_pktmbuf_data_room_size(rxq->mp) -
> RTE_PKTMBUF_HEADROOM;
> 
>       /* Calculate the maximum packet length allowed */
>       len = rxq->rx_buf_len * IAVF_MAX_CHAINED_RX_BUFFERS;
> -     max_pkt_len = RTE_MIN(len, dev->data-
> >dev_conf.rxmode.max_rx_pkt_len);
> +     max_pkt_len = RTE_MIN(len, frame_size);
> 
>       /* Check if the jumbo frame and maximum packet length are set
>        * correctly.
> @@ -815,7 +816,7 @@ iavf_dev_start(struct rte_eth_dev *dev)
> 
>       adapter->stopped = 0;
> 
> -     vf->max_pkt_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
> +     vf->max_pkt_len = dev->data->mtu + IAVF_ETH_OVERHEAD;
>       vf->num_queue_pairs = RTE_MAX(dev->data->nb_rx_queues,
>                                     dev->data->nb_tx_queues);
>       num_queue_pairs = vf->num_queue_pairs;
> @@ -1445,15 +1446,13 @@ iavf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>               return -EBUSY;
>       }
> 
> -     if (frame_size > IAVF_ETH_MAX_LEN)
> +     if (mtu > RTE_ETHER_MTU)
>               dev->data->dev_conf.rxmode.offloads |=
>                               DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
>               dev->data->dev_conf.rxmode.offloads &=
>                               ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> -
>       return ret;
>  }
> 
> diff --git a/drivers/net/ice/ice_dcf_ethdev.c
> b/drivers/net/ice/ice_dcf_ethdev.c
> index 69fe6e63d1d3..34b6c9b2a7ed 100644
> --- a/drivers/net/ice/ice_dcf_ethdev.c
> +++ b/drivers/net/ice/ice_dcf_ethdev.c
> @@ -59,9 +59,8 @@ ice_dcf_init_rxq(struct rte_eth_dev *dev, struct
> ice_rx_queue *rxq)
>       buf_size = rte_pktmbuf_data_room_size(rxq->mp) -
> RTE_PKTMBUF_HEADROOM;
>       rxq->rx_hdr_len = 0;
>       rxq->rx_buf_len = RTE_ALIGN(buf_size, (1 <<
> ICE_RLAN_CTX_DBUF_S));
> -     max_pkt_len = RTE_MIN((uint32_t)
> -                           ICE_SUPPORT_CHAIN_NUM * rxq->rx_buf_len,
> -                           dev->data->dev_conf.rxmode.max_rx_pkt_len);
> +     max_pkt_len = RTE_MIN(ICE_SUPPORT_CHAIN_NUM * rxq-
> >rx_buf_len,
> +                           dev->data->mtu + ICE_ETH_OVERHEAD);
> 
>       /* 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 63f735d1ff72..bdda6fee3f8e 100644
> --- a/drivers/net/ice/ice_ethdev.c
> +++ b/drivers/net/ice/ice_ethdev.c
> @@ -3426,8 +3426,8 @@ ice_dev_start(struct rte_eth_dev *dev)
>       pf->adapter_stopped = false;
> 
>       /* Set the max frame size to default value*/
> -     max_frame_size = pf->dev_data-
> >dev_conf.rxmode.max_rx_pkt_len ?
> -             pf->dev_data->dev_conf.rxmode.max_rx_pkt_len :
> +     max_frame_size = pf->dev_data->mtu ?
> +             pf->dev_data->mtu + ICE_ETH_OVERHEAD :
>               ICE_FRAME_SIZE_MAX;
> 
>       /* Set the max frame size to HW*/
> @@ -3806,14 +3806,10 @@ ice_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>               return -EBUSY;
>       }
> 
> -     if (frame_size > ICE_ETH_MAX_LEN)
> -             dev_data->dev_conf.rxmode.offloads |=
> -                     DEV_RX_OFFLOAD_JUMBO_FRAME;
> +     if (mtu > RTE_ETHER_MTU)
> +             dev_data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
> -             dev_data->dev_conf.rxmode.offloads &=
> -                     ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
> -     dev_data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> +             dev_data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
>       return 0;
>  }
> diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
> index 3f6e7359844b..a3de4172e2bc 100644
> --- a/drivers/net/ice/ice_rxtx.c
> +++ b/drivers/net/ice/ice_rxtx.c
> @@ -262,15 +262,16 @@ ice_program_hw_rx_queue(struct ice_rx_queue
> *rxq)
>       struct rte_eth_rxmode *rxmode = &dev_data->dev_conf.rxmode;
>       uint32_t rxdid = ICE_RXDID_COMMS_OVS;
>       uint32_t regval;
> +     uint32_t frame_size = dev_data->mtu + ICE_ETH_OVERHEAD;
> 
>       /* Set buffer size as the head split is disabled. */
>       buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rxq->mp) -
>                             RTE_PKTMBUF_HEADROOM);
>       rxq->rx_hdr_len = 0;
>       rxq->rx_buf_len = RTE_ALIGN(buf_size, (1 <<
> ICE_RLAN_CTX_DBUF_S));
> -     rxq->max_pkt_len = 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 =
> +             RTE_MIN((uint32_t)ICE_SUPPORT_CHAIN_NUM * rxq-
> >rx_buf_len,
> +                     frame_size);
> 
>       if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
>               if (rxq->max_pkt_len <= ICE_ETH_MAX_LEN ||
> @@ -361,11 +362,8 @@ ice_program_hw_rx_queue(struct ice_rx_queue
> *rxq)
>               return -EINVAL;
>       }
> 
> -     buf_size = (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 = 1;
> 
>       rxq->qrx_tail = 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 @@
> 
>  #define IGC_INTEL_VENDOR_ID          0x8086
> 
> -/*
> - * 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)
> 
>       /* switch to jumbo mode if needed */
>       if (mtu > RTE_ETHER_MTU) {
> -             dev->data->dev_conf.rxmode.offloads |=
> -                     DEV_RX_OFFLOAD_JUMBO_FRAME;
> +             dev->data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>               rctl |= IGC_RCTL_LPE;
>       } else {
> -             dev->data->dev_conf.rxmode.offloads &=
> -                     ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +             dev->data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>               rctl &= ~IGC_RCTL_LPE;
>       }
>       IGC_WRITE_REG(hw, IGC_RCTL, rctl);
> 
> -     /* update max frame size */
> -     dev->data->dev_conf.rxmode.max_rx_pkt_len = 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);
> 
>       return 0;
>  }
> @@ -2486,6 +2473,7 @@ static int
>  igc_vlan_hw_extend_disable(struct rte_eth_dev *dev)
>  {
>       struct igc_hw *hw = IGC_DEV_PRIVATE_HW(dev);
> +     uint32_t frame_size = dev->data->mtu + IGC_ETH_OVERHEAD;
>       uint32_t ctrl_ext;
> 
>       ctrl_ext = 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) == 0)
>               return 0;
> 
> -     if ((dev->data->dev_conf.rxmode.offloads &
> -                     DEV_RX_OFFLOAD_JUMBO_FRAME) == 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 -= 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);
> 
> -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 = IGC_DEV_PRIVATE_HW(dev);
> +     uint32_t frame_size = dev->data->mtu + IGC_ETH_OVERHEAD;
>       uint32_t ctrl_ext;
> 
>       ctrl_ext = 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;
> 
> -     if ((dev->data->dev_conf.rxmode.offloads &
> -                     DEV_RX_OFFLOAD_JUMBO_FRAME) == 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 += 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);
> 
> -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)
> 
> +/*
> + * 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..d80808a002f5 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 = IGC_DEV_PRIVATE_HW(dev);
>       uint64_t offloads = dev->data->dev_conf.rxmode.offloads;
> -     uint32_t max_rx_pkt_len = 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);
> 
>       /* Configure support of jumbo frames, if any. */
> -     if (offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
> +     if (offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
>               rctl |= 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 &= ~IGC_RCTL_LPE;
> -     }
> +
> +     max_rx_pktlen = 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);
> 
>       /* Configure and enable each RX queue. */
>       rctl_bsize = 0;
> @@ -1168,7 +1168,7 @@ igc_rx_init(struct rte_eth_dev *dev)
>                                       IGC_SRRCTL_BSIZEPKT_SHIFT);
> 
>                       /* 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 = 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 = IONIC_ETH_DEV_TO_LIF(eth_dev);
> -     uint32_t max_frame_size;
>       int err;
> 
>       IONIC_PRINT_CALL();
> 
>       /*
>        * Note: mtu check against IONIC_MIN_MTU, IONIC_MAX_MTU
> -      * is done by the the API.
> +      * is done by the API.
>        */
> 
> -     /*
> -      * Max frame size is MTU + Ethernet header + VLAN + QinQ
> -      * (plus ETHER_CRC_LEN if the adapter is able to keep CRC)
> -      */
> -     max_frame_size = mtu + RTE_ETHER_HDR_LEN + 4 + 4;
> -
> -     if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len <
> max_frame_size)
> -             return -EINVAL;
> -
>       err = ionic_lif_change_mtu(lif, mtu);
>       if (err)
>               return err;
> diff --git a/drivers/net/ionic/ionic_rxtx.c b/drivers/net/ionic/ionic_rxtx.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 = &cq_desc_base[cq_desc_index];
>       struct rte_mbuf *rxm, *rxm_seg;
>       uint32_t max_frame_size =
> -             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 = 0;
>       uint32_t pkt_type;
>       struct ionic_rx_stats *stats = &rxq->stats;
> @@ -1016,7 +1016,7 @@ ionic_rx_fill(struct ionic_rx_qcq *rxq, uint32_t len)
>  int __rte_cold
>  ionic_dev_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t
> rx_queue_id)
>  {
> -     uint32_t frame_size = eth_dev->data-
> >dev_conf.rxmode.max_rx_pkt_len;
> +     uint32_t frame_size = eth_dev->data->mtu + RTE_ETHER_HDR_LEN;
>       uint8_t *rx_queue_state = 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 = rx_queue;
>       uint32_t frame_size =
> -             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;
> 
>       service_cb_arg.rx_pkts = 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;
>       }
> 
> -     if (frame_size > IPN3KE_ETH_MAX_LEN)
> -             dev_data->dev_conf.rxmode.offloads |=
> -                     (uint64_t)(DEV_RX_OFFLOAD_JUMBO_FRAME);
> +     if (mtu > RTE_ETHER_MTU)
> +             dev_data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
>       else
> -             dev_data->dev_conf.rxmode.offloads &=
> -                     (uint64_t)(~DEV_RX_OFFLOAD_JUMBO_FRAME);
> -
> -     dev_data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
> +             dev_data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 
>       if (rpst->i40e_pf_eth) {
>               ret = rpst->i40e_pf_eth->dev_ops->mtu_set(rpst-
> >i40e_pf_eth,

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


Reply via email to