[v1,15/18] net/r8169: impelment MTU configuration
Checks
Commit Message
Add support for updating MTU value.
Signed-off-by: Howard Wang <howard_wang@realsil.com.cn>
---
drivers/net/r8169/r8169_ethdev.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
Comments
On Tue, 15 Oct 2024 11:09:25 +0800
Howard Wang <howard_wang@realsil.com.cn> wrote:
> +static int
> +rtl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
> +{
> + struct rte_eth_dev_info dev_info;
> + struct rtl_adapter *adapter = RTL_DEV_PRIVATE(dev);
> + struct rtl_hw *hw = &adapter->hw;
> + int ret;
> + uint32_t frame_size = mtu + RTL_ETH_OVERHEAD;
> +
> + ret = rtl_dev_infos_get(dev, &dev_info);
> + if (ret != 0)
> + return ret;
> +
> + if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)
> + return -EINVAL;
> +
This validation is already done in ethdev, not needed here.
int
rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
{
...
ret = rte_eth_dev_info_get(port_id, &dev_info);
if (ret != 0)
return ret;
ret = eth_dev_validate_mtu(port_id, &dev_info, mtu);
if (ret != 0)
return ret;
static int
eth_dev_validate_mtu(uint16_t port_id, struct rte_eth_dev_info *dev_info,
uint16_t mtu)
{
uint32_t overhead_len;
uint32_t frame_size;
if (mtu < dev_info->min_mtu) {
RTE_ETHDEV_LOG_LINE(ERR,
"MTU (%u) < device min MTU (%u) for port_id %u",
mtu, dev_info->min_mtu, port_id);
return -EINVAL;
}
if (mtu > dev_info->max_mtu) {
RTE_ETHDEV_LOG_LINE(ERR,
"MTU (%u) > device max MTU (%u) for port_id %u",
mtu, dev_info->max_mtu, port_id);
return -EINVAL;
}
@@ -47,6 +47,7 @@ static int rtl_promiscuous_enable(struct rte_eth_dev *dev);
static int rtl_promiscuous_disable(struct rte_eth_dev *dev);
static int rtl_allmulticast_enable(struct rte_eth_dev *dev);
static int rtl_allmulticast_disable(struct rte_eth_dev *dev);
+static int rtl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
/*
* The set of PCI devices this driver supports
@@ -93,6 +94,8 @@ static const struct eth_dev_ops rtl_eth_dev_ops = {
.stats_get = rtl_dev_stats_get,
.stats_reset = rtl_dev_stats_reset,
+ .mtu_set = rtl_dev_mtu_set,
+
.rx_queue_setup = rtl_rx_queue_setup,
.rx_queue_release = rtl_rx_queue_release,
.rxq_info_get = rtl_rxq_info_get,
@@ -388,6 +391,9 @@ rtl_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
break;
}
+ dev_info->min_mtu = RTE_ETHER_MIN_MTU;
+ dev_info->max_mtu = dev_info->max_rx_pktlen - RTL_ETH_OVERHEAD;
+
dev_info->rx_offload_capa = (rtl_get_rx_port_offloads() |
dev_info->rx_queue_offload_capa);
dev_info->tx_offload_capa = rtl_get_tx_port_offloads();
@@ -610,6 +616,29 @@ rtl_dev_close(struct rte_eth_dev *dev)
return ret_stp;
}
+static int
+rtl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+ struct rte_eth_dev_info dev_info;
+ struct rtl_adapter *adapter = RTL_DEV_PRIVATE(dev);
+ struct rtl_hw *hw = &adapter->hw;
+ int ret;
+ uint32_t frame_size = mtu + RTL_ETH_OVERHEAD;
+
+ ret = rtl_dev_infos_get(dev, &dev_info);
+ if (ret != 0)
+ return ret;
+
+ if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)
+ return -EINVAL;
+
+ hw->mtu = mtu;
+
+ RTL_W16(hw, RxMaxSize, frame_size);
+
+ return 0;
+}
+
static int
rtl_dev_init(struct rte_eth_dev *dev)
{