Message ID | 20250417080328.426554-2-jiawenwu@trustnetic.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Implement udp tunnel port for txgbe | expand |
On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote: > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev) ^^^^^^^^^^ > > txgbe_up_complete(wx); > > + udp_tunnel_nic_reset_ntf(netdev); ^^^^^^^^^^^^^^^^^^^^^^^^ > return 0; > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY, Documentation says: /* Device only supports offloads when it's open, all ports * will be removed before close and re-added after open. */ UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1), Are you sure you have to explicitly reset?
On Fri, Apr 18, 2025 7:58 AM, Jakub Kicinski wrote: > On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote: > > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev) > ^^^^^^^^^^ > > > > txgbe_up_complete(wx); > > > > + udp_tunnel_nic_reset_ntf(netdev); > ^^^^^^^^^^^^^^^^^^^^^^^^ > > return 0; > > > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY, > > Documentation says: > > /* Device only supports offloads when it's open, all ports > * will be removed before close and re-added after open. > */ > UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1), > > Are you sure you have to explicitly reset? Yes. Stop device will reset hardware, which reset UDP port to the default value. So it has to re-configure the ports.
On Fri, 18 Apr 2025 09:44:00 +0800 Jiawen Wu wrote: > On Fri, Apr 18, 2025 7:58 AM, Jakub Kicinski wrote: > > On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote: > > > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev) > > ^^^^^^^^^^ > > > > > > txgbe_up_complete(wx); > > > > > > + udp_tunnel_nic_reset_ntf(netdev); > > ^^^^^^^^^^^^^^^^^^^^^^^^ > > > return 0; > > > > > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY, > > > > Documentation says: > > > > /* Device only supports offloads when it's open, all ports > > * will be removed before close and re-added after open. > > */ > > UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1), > > > > Are you sure you have to explicitly reset? > > Yes. Stop device will reset hardware, which reset UDP port to the default value. > So it has to re-configure the ports. My point is that this is basically what the UDP_TUNNEL_NIC_INFO_OPEN_ONLY flag already assumes. There should be no need to reset if you already told the core with the flag that the device forgets everything when closed. Could you retest without the reset_ntf ?
On Fri, Apr 18, 2025 10:20 AM, Jakub Kicinski wrote: > On Fri, 18 Apr 2025 09:44:00 +0800 Jiawen Wu wrote: > > On Fri, Apr 18, 2025 7:58 AM, Jakub Kicinski wrote: > > > On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote: > > > > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev) > > > ^^^^^^^^^^ > > > > > > > > txgbe_up_complete(wx); > > > > > > > > + udp_tunnel_nic_reset_ntf(netdev); > > > ^^^^^^^^^^^^^^^^^^^^^^^^ > > > > return 0; > > > > > > > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY, > > > > > > Documentation says: > > > > > > /* Device only supports offloads when it's open, all ports > > > * will be removed before close and re-added after open. > > > */ > > > UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1), > > > > > > Are you sure you have to explicitly reset? > > > > Yes. Stop device will reset hardware, which reset UDP port to the default value. > > So it has to re-configure the ports. > > My point is that this is basically what the > UDP_TUNNEL_NIC_INFO_OPEN_ONLY flag already assumes. > There should be no need to reset if you already told the core > with the flag that the device forgets everything when closed. > > Could you retest without the reset_ntf ? Thanks for the guidance. The test result looks the same as before, when I remove reset_ntf. I'll fix it in patch v4. :)
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c index 6d9134a3ce4d..95e5262a1e9c 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c @@ -8,6 +8,7 @@ #include <linux/string.h> #include <linux/etherdevice.h> #include <linux/phylink.h> +#include <net/udp_tunnel.h> #include <net/ip.h> #include <linux/if_vlan.h> @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev) txgbe_up_complete(wx); + udp_tunnel_nic_reset_ntf(netdev); + return 0; err_free_irq: @@ -537,6 +540,39 @@ void txgbe_do_reset(struct net_device *netdev) txgbe_reset(wx); } +static int txgbe_udp_tunnel_sync(struct net_device *dev, unsigned int table) +{ + struct wx *wx = netdev_priv(dev); + struct udp_tunnel_info ti; + + udp_tunnel_nic_get_port(dev, table, 0, &ti); + switch (ti.type) { + case UDP_TUNNEL_TYPE_VXLAN: + wr32(wx, TXGBE_CFG_VXLAN, ntohs(ti.port)); + break; + case UDP_TUNNEL_TYPE_VXLAN_GPE: + wr32(wx, TXGBE_CFG_VXLAN_GPE, ntohs(ti.port)); + break; + case UDP_TUNNEL_TYPE_GENEVE: + wr32(wx, TXGBE_CFG_GENEVE, ntohs(ti.port)); + break; + default: + break; + } + + return 0; +} + +static const struct udp_tunnel_nic_info txgbe_udp_tunnels = { + .sync_table = txgbe_udp_tunnel_sync, + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY, + .tables = { + { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN, }, + { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN_GPE, }, + { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_GENEVE, }, + }, +}; + static const struct net_device_ops txgbe_netdev_ops = { .ndo_open = txgbe_open, .ndo_stop = txgbe_close, @@ -632,6 +668,7 @@ static int txgbe_probe(struct pci_dev *pdev, wx->driver_name = txgbe_driver_name; txgbe_set_ethtool_ops(netdev); netdev->netdev_ops = &txgbe_netdev_ops; + netdev->udp_tunnel_nic_info = &txgbe_udp_tunnels; /* setup the private structure */ err = txgbe_sw_init(wx); @@ -677,6 +714,7 @@ static int txgbe_probe(struct pci_dev *pdev, netdev->features |= NETIF_F_HIGHDMA; netdev->hw_features |= NETIF_F_GRO; netdev->features |= NETIF_F_GRO; + netdev->features |= NETIF_F_RX_UDP_TUNNEL_PORT; netdev->priv_flags |= IFF_UNICAST_FLT; netdev->priv_flags |= IFF_SUPP_NOFCS; diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h index 5937cbc6bd05..cb553318641d 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h @@ -88,6 +88,9 @@ /* Port cfg registers */ #define TXGBE_CFG_PORT_ST 0x14404 #define TXGBE_CFG_PORT_ST_LINK_UP BIT(0) +#define TXGBE_CFG_VXLAN 0x14410 +#define TXGBE_CFG_VXLAN_GPE 0x14414 +#define TXGBE_CFG_GENEVE 0x14418 /* I2C registers */ #define TXGBE_I2C_BASE 0x14900
Tunnel types VXLAN/VXLAN_GPE/GENEVE are supported for txgbe devices. The hardware supports to set only one port for each tunnel type. Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com> --- .../net/ethernet/wangxun/txgbe/txgbe_main.c | 38 +++++++++++++++++++ .../net/ethernet/wangxun/txgbe/txgbe_type.h | 3 ++ 2 files changed, 41 insertions(+)