[v4,2/6] ethdev: move jumbo frame offload check to library

Message ID 20211005171653.3700067-2-ferruh.yigit@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series [v4,1/6] ethdev: fix max Rx packet length |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Ferruh Yigit Oct. 5, 2021, 5:16 p.m. UTC
  Setting MTU bigger than RTE_ETHER_MTU requires the jumbo frame support,
and application should enable the jumbo frame offload support for it.

When jumbo frame offload is not enabled by application, but MTU bigger
than RTE_ETHER_MTU is requested there are two options, either fail or
enable jumbo frame offload implicitly.

Enabling jumbo frame offload implicitly is selected by many drivers
since setting a big MTU value already implies it, and this increases
usability.

This patch moves this logic from drivers to the library, both to reduce
the duplicated code in the drivers and to make behaviour more visible.

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Rosen Xu <rosen.xu@intel.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Acked-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
 drivers/net/axgbe/axgbe_ethdev.c        |  9 ++-------
 drivers/net/bnxt/bnxt_ethdev.c          |  9 ++-------
 drivers/net/cnxk/cnxk_ethdev_ops.c      |  5 -----
 drivers/net/cxgbe/cxgbe_ethdev.c        |  8 --------
 drivers/net/dpaa/dpaa_ethdev.c          |  7 -------
 drivers/net/dpaa2/dpaa2_ethdev.c        |  7 -------
 drivers/net/e1000/em_ethdev.c           |  9 ++-------
 drivers/net/e1000/igb_ethdev.c          |  9 ++-------
 drivers/net/enetc/enetc_ethdev.c        |  7 -------
 drivers/net/hinic/hinic_pmd_ethdev.c    |  7 -------
 drivers/net/hns3/hns3_ethdev.c          |  8 --------
 drivers/net/hns3/hns3_ethdev_vf.c       |  6 ------
 drivers/net/i40e/i40e_ethdev.c          |  5 -----
 drivers/net/iavf/iavf_ethdev.c          |  7 -------
 drivers/net/ice/ice_ethdev.c            |  5 -----
 drivers/net/igc/igc_ethdev.c            |  9 ++-------
 drivers/net/ipn3ke/ipn3ke_representor.c |  5 -----
 drivers/net/ixgbe/ixgbe_ethdev.c        |  7 ++-----
 drivers/net/liquidio/lio_ethdev.c       |  7 -------
 drivers/net/nfp/nfp_common.c            |  6 ------
 drivers/net/octeontx/octeontx_ethdev.c  |  5 -----
 drivers/net/octeontx2/otx2_ethdev_ops.c |  5 -----
 drivers/net/qede/qede_ethdev.c          |  4 ----
 drivers/net/sfc/sfc_ethdev.c            |  9 ---------
 drivers/net/thunderx/nicvf_ethdev.c     |  6 ------
 drivers/net/txgbe/txgbe_ethdev.c        |  6 ------
 lib/ethdev/rte_ethdev.c                 | 18 +++++++++++++++++-
 27 files changed, 29 insertions(+), 166 deletions(-)
  

Comments

Xu, Rosen Oct. 8, 2021, 8:39 a.m. UTC | #1
Reviewed-by: Rosen Xu <rosen.xu@intel.com>

> -----Original Message-----
> From: Yigit, Ferruh <ferruh.yigit@intel.com>
> Sent: Wednesday, October 06, 2021 1:17
> To: Somalapuram Amaranath <asomalap@amd.com>; Ajit Khaparde
> <ajit.khaparde@broadcom.com>; Somnath Kotur
> <somnath.kotur@broadcom.com>; Nithin Dabilpuram
> <ndabilpuram@marvell.com>; Kiran Kumar K <kirankumark@marvell.com>;
> Sunil Kumar Kori <skori@marvell.com>; Satha Rao
> <skoteshwar@marvell.com>; Rahul Lakkireddy
> <rahul.lakkireddy@chelsio.com>; Hemant Agrawal
> <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@oss.nxp.com>;
> Wang, Haiyue <haiyue.wang@intel.com>; Gagandeep Singh
> <g.singh@nxp.com>; Ziyang Xuan <xuanziyang2@huawei.com>; Xiaoyun
> Wang <cloud.wangxiaoyun@huawei.com>; Guoyang Zhou
> <zhouguoyang@huawei.com>; Min Hu (Connor) <humin29@huawei.com>;
> Yisen Zhuang <yisen.zhuang@huawei.com>; Lijun Ou
> <oulijun@huawei.com>; Xing, Beilei <beilei.xing@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Yang, Qiming <qiming.yang@intel.com>; Zhang, Qi
> Z <qi.z.zhang@intel.com>; Xu, Rosen <rosen.xu@intel.com>; Shijith Thotton
> <sthotton@marvell.com>; Srisivasubramanian Srinivasan
> <srinivasan@marvell.com>; Heinrich Kuhn <heinrich.kuhn@corigine.com>;
> Harman Kalra <hkalra@marvell.com>; Jerin Jacob <jerinj@marvell.com>;
> Rasesh Mody <rmody@marvell.com>; Devendra Singh Rawat
> <dsinghrawat@marvell.com>; Andrew Rybchenko
> <andrew.rybchenko@oktetlabs.ru>; Maciej Czekaj <mczekaj@marvell.com>;
> Jiawen Wu <jiawenwu@trustnetic.com>; Jian Wang
> <jianwang@trustnetic.com>; Thomas Monjalon <thomas@monjalon.net>
> Cc: Yigit, Ferruh <ferruh.yigit@intel.com>; dev@dpdk.org
> Subject: [PATCH v4 2/6] ethdev: move jumbo frame offload check to library
> 
> Setting MTU bigger than RTE_ETHER_MTU requires the jumbo frame support,
> and application should enable the jumbo frame offload support for it.
> 
> When jumbo frame offload is not enabled by application, but MTU bigger
> than RTE_ETHER_MTU is requested there are two options, either fail or
> enable jumbo frame offload implicitly.
> 
> Enabling jumbo frame offload implicitly is selected by many drivers since
> setting a big MTU value already implies it, and this increases usability.
> 
> This patch moves this logic from drivers to the library, both to reduce the
> duplicated code in the drivers and to make behaviour more visible.
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Reviewed-by: Rosen Xu <rosen.xu@intel.com>
> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> Acked-by: Somnath Kotur <somnath.kotur@broadcom.com>
> ---
>  drivers/net/axgbe/axgbe_ethdev.c        |  9 ++-------
>  drivers/net/bnxt/bnxt_ethdev.c          |  9 ++-------
>  drivers/net/cnxk/cnxk_ethdev_ops.c      |  5 -----
>  drivers/net/cxgbe/cxgbe_ethdev.c        |  8 --------
>  drivers/net/dpaa/dpaa_ethdev.c          |  7 -------
>  drivers/net/dpaa2/dpaa2_ethdev.c        |  7 -------
>  drivers/net/e1000/em_ethdev.c           |  9 ++-------
>  drivers/net/e1000/igb_ethdev.c          |  9 ++-------
>  drivers/net/enetc/enetc_ethdev.c        |  7 -------
>  drivers/net/hinic/hinic_pmd_ethdev.c    |  7 -------
>  drivers/net/hns3/hns3_ethdev.c          |  8 --------
>  drivers/net/hns3/hns3_ethdev_vf.c       |  6 ------
>  drivers/net/i40e/i40e_ethdev.c          |  5 -----
>  drivers/net/iavf/iavf_ethdev.c          |  7 -------
>  drivers/net/ice/ice_ethdev.c            |  5 -----
>  drivers/net/igc/igc_ethdev.c            |  9 ++-------
>  drivers/net/ipn3ke/ipn3ke_representor.c |  5 -----
>  drivers/net/ixgbe/ixgbe_ethdev.c        |  7 ++-----
>  drivers/net/liquidio/lio_ethdev.c       |  7 -------
>  drivers/net/nfp/nfp_common.c            |  6 ------
>  drivers/net/octeontx/octeontx_ethdev.c  |  5 -----
> drivers/net/octeontx2/otx2_ethdev_ops.c |  5 -----
>  drivers/net/qede/qede_ethdev.c          |  4 ----
>  drivers/net/sfc/sfc_ethdev.c            |  9 ---------
>  drivers/net/thunderx/nicvf_ethdev.c     |  6 ------
>  drivers/net/txgbe/txgbe_ethdev.c        |  6 ------
>  lib/ethdev/rte_ethdev.c                 | 18 +++++++++++++++++-
>  27 files changed, 29 insertions(+), 166 deletions(-)
> 
> diff --git a/drivers/net/axgbe/axgbe_ethdev.c
> b/drivers/net/axgbe/axgbe_ethdev.c
> index 76aeec077f2b..2960834b4539 100644
> --- a/drivers/net/axgbe/axgbe_ethdev.c
> +++ b/drivers/net/axgbe/axgbe_ethdev.c
> @@ -1492,15 +1492,10 @@ static int axgb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  				dev->data->port_id);
>  		return -EBUSY;
>  	}
> -	if (mtu > RTE_ETHER_MTU) {
> -		dev->data->dev_conf.rxmode.offloads |=
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
>  		val = 1;
> -	} else {
> -		dev->data->dev_conf.rxmode.offloads &=
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
>  		val = 0;
> -	}
>  	AXGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
>  	return 0;
>  }
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index 8c6f20b75aed..07ee19938930 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -3052,15 +3052,10 @@ int bnxt_mtu_set_op(struct rte_eth_dev
> *eth_dev, uint16_t new_mtu)
>  		return -EINVAL;
>  	}
> 
> -	if (new_mtu > RTE_ETHER_MTU) {
> +	if (new_mtu > RTE_ETHER_MTU)
>  		bp->flags |= BNXT_FLAG_JUMBO;
> -		bp->eth_dev->data->dev_conf.rxmode.offloads |=
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	} else {
> -		bp->eth_dev->data->dev_conf.rxmode.offloads &=
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
>  		bp->flags &= ~BNXT_FLAG_JUMBO;
> -	}
> 
>  	/* Is there a change in mtu setting? */
>  	if (eth_dev->data->mtu == new_mtu)
> diff --git a/drivers/net/cnxk/cnxk_ethdev_ops.c
> b/drivers/net/cnxk/cnxk_ethdev_ops.c
> index 695d0d6fd3e2..349896f6a1bf 100644
> --- a/drivers/net/cnxk/cnxk_ethdev_ops.c
> +++ b/drivers/net/cnxk/cnxk_ethdev_ops.c
> @@ -439,11 +439,6 @@ cnxk_nix_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  		plt_err("Failed to max Rx frame length, rc=%d", rc);
>  		goto exit;
>  	}
> -
> -	if (mtu > RTE_ETHER_MTU)
> -		dev->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		dev->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
>  exit:
>  	return rc;
>  }
> diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c
> b/drivers/net/cxgbe/cxgbe_ethdev.c
> index 8cf61f12a8d6..0c9cc2f5bb3f 100644
> --- a/drivers/net/cxgbe/cxgbe_ethdev.c
> +++ b/drivers/net/cxgbe/cxgbe_ethdev.c
> @@ -313,14 +313,6 @@ int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  	if (mtu < RTE_ETHER_MIN_MTU || new_mtu >
> dev_info.max_rx_pktlen)
>  		return -EINVAL;
> 
> -	/* set to jumbo mode if needed */
> -	if (mtu > RTE_ETHER_MTU)
> -		eth_dev->data->dev_conf.rxmode.offloads |=
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		eth_dev->data->dev_conf.rxmode.offloads &=
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
>  	err = t4_set_rxmode(adapter, adapter->mbox, pi->viid, new_mtu, -1,
> -1,
>  			    -1, -1, true);
>  	return err;
> diff --git a/drivers/net/dpaa/dpaa_ethdev.c
> b/drivers/net/dpaa/dpaa_ethdev.c index adbdb87baab9..57b09f16ba44
> 100644
> --- a/drivers/net/dpaa/dpaa_ethdev.c
> +++ b/drivers/net/dpaa/dpaa_ethdev.c
> @@ -187,13 +187,6 @@ dpaa_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EINVAL;
>  	}
> 
> -	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;
> -
>  	fman_if_set_maxfrm(dev->process_private, frame_size);
> 
>  	return 0;
> diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c
> b/drivers/net/dpaa2/dpaa2_ethdev.c
> index 758a14e0ad2d..df44bb204f65 100644
> --- a/drivers/net/dpaa2/dpaa2_ethdev.c
> +++ b/drivers/net/dpaa2/dpaa2_ethdev.c
> @@ -1470,13 +1470,6 @@ 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 (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;
> -
>  	/* 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 6f418a36aa04..1b41dd04df5a
> 100644
> --- a/drivers/net/e1000/em_ethdev.c
> +++ b/drivers/net/e1000/em_ethdev.c
> @@ -1818,15 +1818,10 @@ 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 (mtu > RTE_ETHER_MTU) {
> -		dev->data->dev_conf.rxmode.offloads |=
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
>  		rctl |= E1000_RCTL_LPE;
> -	} else {
> -		dev->data->dev_conf.rxmode.offloads &=
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
>  		rctl &= ~E1000_RCTL_LPE;
> -	}
>  	E1000_WRITE_REG(hw, E1000_RCTL, rctl);
> 
>  	return 0;
> diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
> index 4c114bf90fc7..a061d0529dd1 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -4396,15 +4396,10 @@ 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 (mtu > RTE_ETHER_MTU) {
> -		dev->data->dev_conf.rxmode.offloads |=
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
>  		rctl |= E1000_RCTL_LPE;
> -	} else {
> -		dev->data->dev_conf.rxmode.offloads &=
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
>  		rctl &= ~E1000_RCTL_LPE;
> -	}
>  	E1000_WRITE_REG(hw, E1000_RCTL, rctl);
> 
>  	E1000_WRITE_REG(hw, E1000_RLPML, frame_size); diff --git
> a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
> index cdb9783b5372..fbcbbb6c0533 100644
> --- a/drivers/net/enetc/enetc_ethdev.c
> +++ b/drivers/net/enetc/enetc_ethdev.c
> @@ -677,13 +677,6 @@ enetc_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EINVAL;
>  	}
> 
> -	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;
> -
>  	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
> ENETC_MAC_MAXFRM_SIZE);
>  	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 *
> ENETC_MAC_MAXFRM_SIZE);
> 
> diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c
> b/drivers/net/hinic/hinic_pmd_ethdev.c
> index 2d8271cb6095..4b30dfa222a8 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -1547,13 +1547,6 @@ static int hinic_dev_set_mtu(struct rte_eth_dev
> *dev, uint16_t mtu)
>  		return ret;
>  	}
> 
> -	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;
> -
>  	nic_dev->mtu_size = mtu;
> 
>  	return ret;
> diff --git a/drivers/net/hns3/hns3_ethdev.c
> b/drivers/net/hns3/hns3_ethdev.c index 4ead227f9122..e1d465de8234
> 100644
> --- a/drivers/net/hns3/hns3_ethdev.c
> +++ b/drivers/net/hns3/hns3_ethdev.c
> @@ -2571,7 +2571,6 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	struct hns3_adapter *hns = dev->data->dev_private;
>  	uint32_t frame_size = mtu + HNS3_ETH_OVERHEAD;
>  	struct hns3_hw *hw = &hns->hw;
> -	bool is_jumbo_frame;
>  	int ret;
> 
>  	if (dev->data->dev_started) {
> @@ -2581,7 +2580,6 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	}
> 
>  	rte_spinlock_lock(&hw->lock);
> -	is_jumbo_frame = mtu > RTE_ETHER_MTU ? true : false;
>  	frame_size = RTE_MAX(frame_size, HNS3_DEFAULT_FRAME_LEN);
> 
>  	/*
> @@ -2596,12 +2594,6 @@ hns3_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return ret;
>  	}
> 
> -	if (is_jumbo_frame)
> -		dev->data->dev_conf.rxmode.offloads |=
> -
> 	DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		dev->data->dev_conf.rxmode.offloads &=
> -
> 	~DEV_RX_OFFLOAD_JUMBO_FRAME;
>  	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 0b5db486f8d6..3438b3650de6 100644
> --- a/drivers/net/hns3/hns3_ethdev_vf.c
> +++ b/drivers/net/hns3/hns3_ethdev_vf.c
> @@ -908,12 +908,6 @@ hns3vf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		rte_spinlock_unlock(&hw->lock);
>  		return ret;
>  	}
> -	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;
>  	rte_spinlock_unlock(&hw->lock);
> 
>  	return 0;
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index ab571a921f9e..9283adb19304 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -11775,11 +11775,6 @@ i40e_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EBUSY;
>  	}
> 
> -	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;
> -
>  	return ret;
>  }
> 
> diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
> index 0eabce275d92..844d26d87ba6 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -1473,13 +1473,6 @@ iavf_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EBUSY;
>  	}
> 
> -	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;
> -
>  	return ret;
>  }
> 
> diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index
> 8ee1335ac6cf..3038a9714517 100644
> --- a/drivers/net/ice/ice_ethdev.c
> +++ b/drivers/net/ice/ice_ethdev.c
> @@ -3992,11 +3992,6 @@ ice_mtu_set(struct rte_eth_dev *dev, uint16_t
> mtu)
>  		return -EBUSY;
>  	}
> 
> -	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;
> -
>  	return 0;
>  }
> 
> diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c index
> b26723064b07..dcbc26b8186e 100644
> --- a/drivers/net/igc/igc_ethdev.c
> +++ b/drivers/net/igc/igc_ethdev.c
> @@ -1592,15 +1592,10 @@ eth_igc_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	}
> 
>  	rctl = IGC_READ_REG(hw, IGC_RCTL);
> -
> -	/* switch to jumbo mode if needed */
> -	if (mtu > RTE_ETHER_MTU) {
> -		dev->data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
>  		rctl |= IGC_RCTL_LPE;
> -	} else {
> -		dev->data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
>  		rctl &= ~IGC_RCTL_LPE;
> -	}
>  	IGC_WRITE_REG(hw, IGC_RCTL, rctl);
> 
>  	IGC_WRITE_REG(hw, IGC_RLPML, frame_size); diff --git
> a/drivers/net/ipn3ke/ipn3ke_representor.c
> b/drivers/net/ipn3ke/ipn3ke_representor.c
> index 3634c0c8c5f0..e8a33f04bd69 100644
> --- a/drivers/net/ipn3ke/ipn3ke_representor.c
> +++ b/drivers/net/ipn3ke/ipn3ke_representor.c
> @@ -2801,11 +2801,6 @@ ipn3ke_rpst_mtu_set(struct rte_eth_dev *ethdev,
> uint16_t mtu)
>  		return -EBUSY;
>  	}
> 
> -	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;
> -
>  	if (rpst->i40e_pf_eth) {
>  		ret = rpst->i40e_pf_eth->dev_ops->mtu_set(rpst-
> >i40e_pf_eth,
>  							mtu);
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 31e67d86e77b..574a7bffc9cb 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -5198,13 +5198,10 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
> 
>  	/* switch to jumbo mode if needed */
> -	if (mtu > RTE_ETHER_MTU) {
> -		dev->data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	if (mtu > RTE_ETHER_MTU)
>  		hlreg0 |= IXGBE_HLREG0_JUMBOEN;
> -	} else {
> -		dev->data->dev_conf.rxmode.offloads &=
> ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	else
>  		hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
> -	}
>  	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
> 
>  	maxfrs = IXGBE_READ_REG(hw, IXGBE_MAXFRS); diff --git
> a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c
> index 976916f870a5..3a516c52d199 100644
> --- a/drivers/net/liquidio/lio_ethdev.c
> +++ b/drivers/net/liquidio/lio_ethdev.c
> @@ -480,13 +480,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  		return -1;
>  	}
> 
> -	if (mtu > RTE_ETHER_MTU)
> -		eth_dev->data->dev_conf.rxmode.offloads |=
> -			DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		eth_dev->data->dev_conf.rxmode.offloads &=
> -			~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
>  	return 0;
>  }
> 
> diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c
> index a2031a7a82cc..850ec7655f82 100644
> --- a/drivers/net/nfp/nfp_common.c
> +++ b/drivers/net/nfp/nfp_common.c
> @@ -962,12 +962,6 @@ nfp_net_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EBUSY;
>  	}
> 
> -	/* switch to jumbo mode if needed */
> -	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;
> -
>  	/* writing to configuration space */
>  	nn_cfg_writel(hw, NFP_NET_CFG_MTU, mtu);
> 
> diff --git a/drivers/net/octeontx/octeontx_ethdev.c
> b/drivers/net/octeontx/octeontx_ethdev.c
> index 69c3bda12df8..fb65be2c2dc3 100644
> --- a/drivers/net/octeontx/octeontx_ethdev.c
> +++ b/drivers/net/octeontx/octeontx_ethdev.c
> @@ -552,11 +552,6 @@ octeontx_dev_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  	if (rc)
>  		return rc;
> 
> -	if (mtu > RTE_ETHER_MTU)
> -		nic->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		nic->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
>  	octeontx_log_info("Received pkt beyond  maxlen %d will be
> dropped",
>  			  frame_size);
> 
> diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c
> b/drivers/net/octeontx2/otx2_ethdev_ops.c
> index cf7804157198..293306c7be2a 100644
> --- a/drivers/net/octeontx2/otx2_ethdev_ops.c
> +++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
> @@ -59,11 +59,6 @@ otx2_nix_mtu_set(struct rte_eth_dev *eth_dev,
> uint16_t mtu)
>  	if (rc)
>  		return rc;
> 
> -	if (mtu > RTE_ETHER_MTU)
> -		dev->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		dev->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
>  	return rc;
>  }
> 
> diff --git a/drivers/net/qede/qede_ethdev.c
> b/drivers/net/qede/qede_ethdev.c index 4b971fd1fe3c..6886a4e5efb4
> 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -2361,10 +2361,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  			fp->rxq->rx_buf_size = rc;
>  		}
>  	}
> -	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;
> 
>  	if (!dev->data->dev_started && restart) {
>  		qede_dev_start(dev);
> diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index
> 1f55c90b419d..2ee80e2dc41f 100644
> --- a/drivers/net/sfc/sfc_ethdev.c
> +++ b/drivers/net/sfc/sfc_ethdev.c
> @@ -1064,15 +1064,6 @@ sfc_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		}
>  	}
> 
> -	/*
> -	 * The driver does not use it, but other PMDs update jumbo frame
> -	 * flag when MTU is set.
> -	 */
> -	if (mtu > RTE_ETHER_MTU) {
> -		struct rte_eth_rxmode *rxmode = &dev->data-
> >dev_conf.rxmode;
> -		rxmode->offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	}
> -
>  	sfc_adapter_unlock(sa);
> 
>  	sfc_log_init(sa, "done");
> diff --git a/drivers/net/thunderx/nicvf_ethdev.c
> b/drivers/net/thunderx/nicvf_ethdev.c
> index c8ae95a61306..b501fee5332c 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.c
> +++ b/drivers/net/thunderx/nicvf_ethdev.c
> @@ -151,7 +151,6 @@ nicvf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t
> mtu)
>  	struct nicvf *nic = nicvf_pmd_priv(dev);
>  	uint32_t buffsz, frame_size = mtu + NIC_HW_L2_OVERHEAD;
>  	size_t i;
> -	struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
> 
>  	PMD_INIT_FUNC_TRACE();
> 
> @@ -176,11 +175,6 @@ nicvf_dev_set_mtu(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		(frame_size + 2 * VLAN_TAG_SIZE > buffsz *
> NIC_HW_MAX_SEGS))
>  		return -EINVAL;
> 
> -	if (mtu > RTE_ETHER_MTU)
> -		rxmode->offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> -	else
> -		rxmode->offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> -
>  	if (nicvf_mbox_update_hw_max_frs(nic, mtu))
>  		return -EINVAL;
> 
> diff --git a/drivers/net/txgbe/txgbe_ethdev.c
> b/drivers/net/txgbe/txgbe_ethdev.c
> index 269de9f848dd..35b98097c3a4 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.c
> +++ b/drivers/net/txgbe/txgbe_ethdev.c
> @@ -3486,12 +3486,6 @@ txgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  		return -EINVAL;
>  	}
> 
> -	/* switch to jumbo mode if needed */
> -	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;
> -
>  	if (hw->mode)
>  		wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
>  			TXGBE_FRAME_SIZE_MAX);
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index
> 4d0584af52e3..1740bab98a83 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -3639,6 +3639,7 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t
> mtu)
>  	int ret;
>  	struct rte_eth_dev_info dev_info;
>  	struct rte_eth_dev *dev;
> +	int is_jumbo_frame_capable = 0;
> 
>  	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>  	dev = &rte_eth_devices[port_id];
> @@ -3657,12 +3658,27 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t
> mtu)
> 
>  		if (mtu < dev_info.min_mtu || mtu > dev_info.max_mtu)
>  			return -EINVAL;
> +
> +		if ((dev_info.rx_offload_capa &
> DEV_RX_OFFLOAD_JUMBO_FRAME) != 0)
> +			is_jumbo_frame_capable = 1;
>  	}
> 
> +	if (mtu > RTE_ETHER_MTU && is_jumbo_frame_capable == 0)
> +		return -EINVAL;
> +
>  	ret = (*dev->dev_ops->mtu_set)(dev, mtu);
> -	if (!ret)
> +	if (ret == 0) {
>  		dev->data->mtu = mtu;
> 
> +		/* switch to jumbo mode if needed */
> +		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;
> +	}
> +
>  	return eth_err(port_id, ret);
>  }
> 
> --
> 2.31.1
  

Patch

diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c
index 76aeec077f2b..2960834b4539 100644
--- a/drivers/net/axgbe/axgbe_ethdev.c
+++ b/drivers/net/axgbe/axgbe_ethdev.c
@@ -1492,15 +1492,10 @@  static int axgb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 				dev->data->port_id);
 		return -EBUSY;
 	}
-	if (mtu > RTE_ETHER_MTU) {
-		dev->data->dev_conf.rxmode.offloads |=
-			DEV_RX_OFFLOAD_JUMBO_FRAME;
+	if (mtu > RTE_ETHER_MTU)
 		val = 1;
-	} else {
-		dev->data->dev_conf.rxmode.offloads &=
-			~DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
 		val = 0;
-	}
 	AXGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
 	return 0;
 }
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 8c6f20b75aed..07ee19938930 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -3052,15 +3052,10 @@  int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
 		return -EINVAL;
 	}
 
-	if (new_mtu > RTE_ETHER_MTU) {
+	if (new_mtu > RTE_ETHER_MTU)
 		bp->flags |= BNXT_FLAG_JUMBO;
-		bp->eth_dev->data->dev_conf.rxmode.offloads |=
-			DEV_RX_OFFLOAD_JUMBO_FRAME;
-	} else {
-		bp->eth_dev->data->dev_conf.rxmode.offloads &=
-			~DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
 		bp->flags &= ~BNXT_FLAG_JUMBO;
-	}
 
 	/* Is there a change in mtu setting? */
 	if (eth_dev->data->mtu == new_mtu)
diff --git a/drivers/net/cnxk/cnxk_ethdev_ops.c b/drivers/net/cnxk/cnxk_ethdev_ops.c
index 695d0d6fd3e2..349896f6a1bf 100644
--- a/drivers/net/cnxk/cnxk_ethdev_ops.c
+++ b/drivers/net/cnxk/cnxk_ethdev_ops.c
@@ -439,11 +439,6 @@  cnxk_nix_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
 		plt_err("Failed to max Rx frame length, rc=%d", rc);
 		goto exit;
 	}
-
-	if (mtu > RTE_ETHER_MTU)
-		dev->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		dev->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
 exit:
 	return rc;
 }
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index 8cf61f12a8d6..0c9cc2f5bb3f 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -313,14 +313,6 @@  int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
 	if (mtu < RTE_ETHER_MIN_MTU || new_mtu > dev_info.max_rx_pktlen)
 		return -EINVAL;
 
-	/* set to jumbo mode if needed */
-	if (mtu > RTE_ETHER_MTU)
-		eth_dev->data->dev_conf.rxmode.offloads |=
-			DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		eth_dev->data->dev_conf.rxmode.offloads &=
-			~DEV_RX_OFFLOAD_JUMBO_FRAME;
-
 	err = t4_set_rxmode(adapter, adapter->mbox, pi->viid, new_mtu, -1, -1,
 			    -1, -1, true);
 	return err;
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index adbdb87baab9..57b09f16ba44 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -187,13 +187,6 @@  dpaa_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EINVAL;
 	}
 
-	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;
-
 	fman_if_set_maxfrm(dev->process_private, frame_size);
 
 	return 0;
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 758a14e0ad2d..df44bb204f65 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -1470,13 +1470,6 @@  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 (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;
-
 	/* 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 6f418a36aa04..1b41dd04df5a 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1818,15 +1818,10 @@  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 (mtu > RTE_ETHER_MTU) {
-		dev->data->dev_conf.rxmode.offloads |=
-			DEV_RX_OFFLOAD_JUMBO_FRAME;
+	if (mtu > RTE_ETHER_MTU)
 		rctl |= E1000_RCTL_LPE;
-	} else {
-		dev->data->dev_conf.rxmode.offloads &=
-			~DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
 		rctl &= ~E1000_RCTL_LPE;
-	}
 	E1000_WRITE_REG(hw, E1000_RCTL, rctl);
 
 	return 0;
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 4c114bf90fc7..a061d0529dd1 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -4396,15 +4396,10 @@  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 (mtu > RTE_ETHER_MTU) {
-		dev->data->dev_conf.rxmode.offloads |=
-			DEV_RX_OFFLOAD_JUMBO_FRAME;
+	if (mtu > RTE_ETHER_MTU)
 		rctl |= E1000_RCTL_LPE;
-	} else {
-		dev->data->dev_conf.rxmode.offloads &=
-			~DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
 		rctl &= ~E1000_RCTL_LPE;
-	}
 	E1000_WRITE_REG(hw, E1000_RCTL, rctl);
 
 	E1000_WRITE_REG(hw, E1000_RLPML, frame_size);
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index cdb9783b5372..fbcbbb6c0533 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -677,13 +677,6 @@  enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EINVAL;
 	}
 
-	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;
-
 	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
 	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
 
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 2d8271cb6095..4b30dfa222a8 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -1547,13 +1547,6 @@  static int hinic_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 		return ret;
 	}
 
-	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;
-
 	nic_dev->mtu_size = mtu;
 
 	return ret;
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 4ead227f9122..e1d465de8234 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -2571,7 +2571,6 @@  hns3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	struct hns3_adapter *hns = dev->data->dev_private;
 	uint32_t frame_size = mtu + HNS3_ETH_OVERHEAD;
 	struct hns3_hw *hw = &hns->hw;
-	bool is_jumbo_frame;
 	int ret;
 
 	if (dev->data->dev_started) {
@@ -2581,7 +2580,6 @@  hns3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	}
 
 	rte_spinlock_lock(&hw->lock);
-	is_jumbo_frame = mtu > RTE_ETHER_MTU ? true : false;
 	frame_size = RTE_MAX(frame_size, HNS3_DEFAULT_FRAME_LEN);
 
 	/*
@@ -2596,12 +2594,6 @@  hns3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return ret;
 	}
 
-	if (is_jumbo_frame)
-		dev->data->dev_conf.rxmode.offloads |=
-						DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		dev->data->dev_conf.rxmode.offloads &=
-						~DEV_RX_OFFLOAD_JUMBO_FRAME;
 	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 0b5db486f8d6..3438b3650de6 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -908,12 +908,6 @@  hns3vf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		rte_spinlock_unlock(&hw->lock);
 		return ret;
 	}
-	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;
 	rte_spinlock_unlock(&hw->lock);
 
 	return 0;
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index ab571a921f9e..9283adb19304 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -11775,11 +11775,6 @@  i40e_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EBUSY;
 	}
 
-	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;
-
 	return ret;
 }
 
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 0eabce275d92..844d26d87ba6 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -1473,13 +1473,6 @@  iavf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EBUSY;
 	}
 
-	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;
-
 	return ret;
 }
 
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index 8ee1335ac6cf..3038a9714517 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -3992,11 +3992,6 @@  ice_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EBUSY;
 	}
 
-	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;
-
 	return 0;
 }
 
diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c
index b26723064b07..dcbc26b8186e 100644
--- a/drivers/net/igc/igc_ethdev.c
+++ b/drivers/net/igc/igc_ethdev.c
@@ -1592,15 +1592,10 @@  eth_igc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	}
 
 	rctl = IGC_READ_REG(hw, IGC_RCTL);
-
-	/* switch to jumbo mode if needed */
-	if (mtu > RTE_ETHER_MTU) {
-		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+	if (mtu > RTE_ETHER_MTU)
 		rctl |= IGC_RCTL_LPE;
-	} else {
-		dev->data->dev_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
 		rctl &= ~IGC_RCTL_LPE;
-	}
 	IGC_WRITE_REG(hw, IGC_RCTL, rctl);
 
 	IGC_WRITE_REG(hw, IGC_RLPML, frame_size);
diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c
index 3634c0c8c5f0..e8a33f04bd69 100644
--- a/drivers/net/ipn3ke/ipn3ke_representor.c
+++ b/drivers/net/ipn3ke/ipn3ke_representor.c
@@ -2801,11 +2801,6 @@  ipn3ke_rpst_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
 		return -EBUSY;
 	}
 
-	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;
-
 	if (rpst->i40e_pf_eth) {
 		ret = rpst->i40e_pf_eth->dev_ops->mtu_set(rpst->i40e_pf_eth,
 							mtu);
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 31e67d86e77b..574a7bffc9cb 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -5198,13 +5198,10 @@  ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
 
 	/* switch to jumbo mode if needed */
-	if (mtu > RTE_ETHER_MTU) {
-		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+	if (mtu > RTE_ETHER_MTU)
 		hlreg0 |= IXGBE_HLREG0_JUMBOEN;
-	} else {
-		dev->data->dev_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
 		hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
-	}
 	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
 
 	maxfrs = IXGBE_READ_REG(hw, IXGBE_MAXFRS);
diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c
index 976916f870a5..3a516c52d199 100644
--- a/drivers/net/liquidio/lio_ethdev.c
+++ b/drivers/net/liquidio/lio_ethdev.c
@@ -480,13 +480,6 @@  lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
 		return -1;
 	}
 
-	if (mtu > RTE_ETHER_MTU)
-		eth_dev->data->dev_conf.rxmode.offloads |=
-			DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		eth_dev->data->dev_conf.rxmode.offloads &=
-			~DEV_RX_OFFLOAD_JUMBO_FRAME;
-
 	return 0;
 }
 
diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c
index a2031a7a82cc..850ec7655f82 100644
--- a/drivers/net/nfp/nfp_common.c
+++ b/drivers/net/nfp/nfp_common.c
@@ -962,12 +962,6 @@  nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EBUSY;
 	}
 
-	/* switch to jumbo mode if needed */
-	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;
-
 	/* writing to configuration space */
 	nn_cfg_writel(hw, NFP_NET_CFG_MTU, mtu);
 
diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c
index 69c3bda12df8..fb65be2c2dc3 100644
--- a/drivers/net/octeontx/octeontx_ethdev.c
+++ b/drivers/net/octeontx/octeontx_ethdev.c
@@ -552,11 +552,6 @@  octeontx_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
 	if (rc)
 		return rc;
 
-	if (mtu > RTE_ETHER_MTU)
-		nic->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		nic->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
-
 	octeontx_log_info("Received pkt beyond  maxlen %d will be dropped",
 			  frame_size);
 
diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c
index cf7804157198..293306c7be2a 100644
--- a/drivers/net/octeontx2/otx2_ethdev_ops.c
+++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
@@ -59,11 +59,6 @@  otx2_nix_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
 	if (rc)
 		return rc;
 
-	if (mtu > RTE_ETHER_MTU)
-		dev->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		dev->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
-
 	return rc;
 }
 
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 4b971fd1fe3c..6886a4e5efb4 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -2361,10 +2361,6 @@  static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 			fp->rxq->rx_buf_size = rc;
 		}
 	}
-	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;
 
 	if (!dev->data->dev_started && restart) {
 		qede_dev_start(dev);
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 1f55c90b419d..2ee80e2dc41f 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1064,15 +1064,6 @@  sfc_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 		}
 	}
 
-	/*
-	 * The driver does not use it, but other PMDs update jumbo frame
-	 * flag when MTU is set.
-	 */
-	if (mtu > RTE_ETHER_MTU) {
-		struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
-		rxmode->offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-	}
-
 	sfc_adapter_unlock(sa);
 
 	sfc_log_init(sa, "done");
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index c8ae95a61306..b501fee5332c 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -151,7 +151,6 @@  nicvf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 	struct nicvf *nic = nicvf_pmd_priv(dev);
 	uint32_t buffsz, frame_size = mtu + NIC_HW_L2_OVERHEAD;
 	size_t i;
-	struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -176,11 +175,6 @@  nicvf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 		(frame_size + 2 * VLAN_TAG_SIZE > buffsz * NIC_HW_MAX_SEGS))
 		return -EINVAL;
 
-	if (mtu > RTE_ETHER_MTU)
-		rxmode->offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-	else
-		rxmode->offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
-
 	if (nicvf_mbox_update_hw_max_frs(nic, mtu))
 		return -EINVAL;
 
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index 269de9f848dd..35b98097c3a4 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -3486,12 +3486,6 @@  txgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 		return -EINVAL;
 	}
 
-	/* switch to jumbo mode if needed */
-	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;
-
 	if (hw->mode)
 		wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
 			TXGBE_FRAME_SIZE_MAX);
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 4d0584af52e3..1740bab98a83 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -3639,6 +3639,7 @@  rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 	int ret;
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
+	int is_jumbo_frame_capable = 0;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
@@ -3657,12 +3658,27 @@  rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 
 		if (mtu < dev_info.min_mtu || mtu > dev_info.max_mtu)
 			return -EINVAL;
+
+		if ((dev_info.rx_offload_capa & DEV_RX_OFFLOAD_JUMBO_FRAME) != 0)
+			is_jumbo_frame_capable = 1;
 	}
 
+	if (mtu > RTE_ETHER_MTU && is_jumbo_frame_capable == 0)
+		return -EINVAL;
+
 	ret = (*dev->dev_ops->mtu_set)(dev, mtu);
-	if (!ret)
+	if (ret == 0) {
 		dev->data->mtu = mtu;
 
+		/* switch to jumbo mode if needed */
+		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;
+	}
+
 	return eth_err(port_id, ret);
 }