[v1,15/18] net/r8169: impelment MTU configuration

Message ID 20241015030928.70642-16-howard_wang@realsil.com.cn (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers
Series net/r8169: add r8169 pmd to dpdk |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Howard Wang Oct. 15, 2024, 3:09 a.m. UTC
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

Stephen Hemminger Oct. 15, 2024, 3:26 p.m. UTC | #1
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;
	}
  

Patch

diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c
index 3e6bc570d6..70c3661691 100644
--- a/drivers/net/r8169/r8169_ethdev.c
+++ b/drivers/net/r8169/r8169_ethdev.c
@@ -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)
 {