> > when application presets the max rx packet length and expected mtu at > the same time, driver need identify if the preset max frame size can > hold mtu data and Ether overhead completely. > > if not, adjust the max frame size via mtu_set ops within dev_configure. > > Fixes: ff8282f4bbcd ("net/i40e: consider QinQ when setting MTU") > > Signed-off-by: SteveX Yang <stevex.y...@intel.com> > --- > drivers/net/i40e/i40e_ethdev.c | 11 +++++++++++ > drivers/net/i40e/i40e_ethdev_vf.c | 13 ++++++++++++- > 2 files changed, 23 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c > index 943cfe71d..272cfc7ca 100644 > --- a/drivers/net/i40e/i40e_ethdev.c > +++ b/drivers/net/i40e/i40e_ethdev.c > @@ -1911,6 +1911,7 @@ i40e_dev_configure(struct rte_eth_dev *dev) > struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); > struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); > enum rte_eth_rx_mq_mode mq_mode = dev->data->dev_conf.rxmode.mq_mode; > + uint32_t frame_size = dev->data->mtu + I40E_ETH_OVERHEAD; > int i, ret; > > ret = i40e_dev_sync_phy_type(hw); > @@ -1925,6 +1926,16 @@ i40e_dev_configure(struct rte_eth_dev *dev) > ad->tx_simple_allowed = true; > ad->tx_vec_allowed = true; > > + /** > + * Reset the max frame size via mtu_set ops if preset max frame
Typo, should be 'present', I think. Acked-by: Konstantin Ananyev <konstantin.anan...@intel.com> > + * cannot hold MTU data and Ether overhead. > + */ > + if (frame_size > dev->data->dev_conf.rxmode.max_rx_pkt_len) { > + ret = i40e_dev_mtu_set(dev, dev->data->mtu); > + if (ret != 0) > + return ret; > + } > + > if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) > dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH; > > diff --git a/drivers/net/i40e/i40e_ethdev_vf.c > b/drivers/net/i40e/i40e_ethdev_vf.c > index 4d6510d1f..686f3c627 100644 > --- a/drivers/net/i40e/i40e_ethdev_vf.c > +++ b/drivers/net/i40e/i40e_ethdev_vf.c > @@ -1664,6 +1664,8 @@ i40evf_dev_configure(struct rte_eth_dev *dev) > I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > uint16_t num_queue_pairs = RTE_MAX(dev->data->nb_rx_queues, > dev->data->nb_tx_queues); > + uint32_t frame_size = dev->data->mtu + I40E_ETH_OVERHEAD; > + int ret; > > /* Initialize to TRUE. If any of Rx queues doesn't meet the bulk > * allocation or vector Rx preconditions we will reset it. > @@ -1676,9 +1678,18 @@ i40evf_dev_configure(struct rte_eth_dev *dev) > dev->data->dev_conf.intr_conf.lsc = > !!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC); > > + /** > + * Reset the max frame size via mtu_set ops if preset max frame > + * cannot hold MTU data and Ether overhead. > + */ > + if (frame_size > dev->data->dev_conf.rxmode.max_rx_pkt_len) { > + ret = i40evf_dev_mtu_set(dev, dev->data->mtu); > + if (ret != 0) > + return ret; > + } > + > if (num_queue_pairs > vf->vsi_res->num_queue_pairs) { > struct i40e_hw *hw; > - int ret; > > if (rte_eal_process_type() != RTE_PROC_PRIMARY) { > PMD_DRV_LOG(ERR, > -- > 2.17.1