netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH net-next v2 0/2] Implement udp tunnel port for txgbe
  2025-04-14  9:10 [PATCH net-next v2 0/2] Implement udp tunnel port for txgbe Jiawen Wu
@ 2025-04-14  8:52 ` Michal Kubiak
  2025-04-14  9:10 ` [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
  2025-04-14  9:10 ` [PATCH net-next v2 2/2] net: wangxun: restrict feature flags for tunnel packets Jiawen Wu
  2 siblings, 0 replies; 7+ messages in thread
From: Michal Kubiak @ 2025-04-14  8:52 UTC (permalink / raw)
  To: Jiawen Wu
  Cc: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
	dlemoal, jdamato, saikrishnag, vadim.fedorenko,
	przemyslaw.kitszel, ecree.xilinx, rmk+kernel, mengyuanlou

On Mon, Apr 14, 2025 at 05:10:20PM +0800, Jiawen Wu wrote:
> Setting UDP tunnel port is supported on TXGBE devices, to implement
> hardware offload for various tunnel packets.
> 
> v2:
>  - Link to v1: https://lore.kernel.org/all/20250410074456.321847-1-jiawenwu@trustnetic.com/
>  - Remove pointless checks
>  - Adjust definition order
> 
> Jiawen Wu (2):
>   net: txgbe: Support to set UDP tunnel port
>   net: wangxun: restrict feature flags for tunnel packets
> 
>  drivers/net/ethernet/wangxun/libwx/wx_lib.c   | 27 ++++++
>  drivers/net/ethernet/wangxun/libwx/wx_lib.h   |  3 +
>  drivers/net/ethernet/wangxun/ngbe/ngbe_main.c |  1 +
>  .../net/ethernet/wangxun/txgbe/txgbe_main.c   | 87 +++++++++++++++++++
>  .../net/ethernet/wangxun/txgbe/txgbe_type.h   |  8 ++
>  5 files changed, 126 insertions(+)
> 
> -- 
> 2.27.0
> 
> 

For the series:
Reviewed-by: Michal Kubiak <michal.kubiak@intel.com>

Thanks,
Michal

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net-next v2 0/2] Implement udp tunnel port for txgbe
@ 2025-04-14  9:10 Jiawen Wu
  2025-04-14  8:52 ` Michal Kubiak
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Jiawen Wu @ 2025-04-14  9:10 UTC (permalink / raw)
  To: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
	dlemoal, jdamato, saikrishnag, vadim.fedorenko,
	przemyslaw.kitszel, ecree.xilinx, rmk+kernel
  Cc: mengyuanlou, Jiawen Wu

Setting UDP tunnel port is supported on TXGBE devices, to implement
hardware offload for various tunnel packets.

v2:
 - Link to v1: https://lore.kernel.org/all/20250410074456.321847-1-jiawenwu@trustnetic.com/
 - Remove pointless checks
 - Adjust definition order

Jiawen Wu (2):
  net: txgbe: Support to set UDP tunnel port
  net: wangxun: restrict feature flags for tunnel packets

 drivers/net/ethernet/wangxun/libwx/wx_lib.c   | 27 ++++++
 drivers/net/ethernet/wangxun/libwx/wx_lib.h   |  3 +
 drivers/net/ethernet/wangxun/ngbe/ngbe_main.c |  1 +
 .../net/ethernet/wangxun/txgbe/txgbe_main.c   | 87 +++++++++++++++++++
 .../net/ethernet/wangxun/txgbe/txgbe_type.h   |  8 ++
 5 files changed, 126 insertions(+)

-- 
2.27.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port
  2025-04-14  9:10 [PATCH net-next v2 0/2] Implement udp tunnel port for txgbe Jiawen Wu
  2025-04-14  8:52 ` Michal Kubiak
@ 2025-04-14  9:10 ` Jiawen Wu
  2025-04-16  0:33   ` Jakub Kicinski
  2025-04-14  9:10 ` [PATCH net-next v2 2/2] net: wangxun: restrict feature flags for tunnel packets Jiawen Wu
  2 siblings, 1 reply; 7+ messages in thread
From: Jiawen Wu @ 2025-04-14  9:10 UTC (permalink / raw)
  To: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
	dlemoal, jdamato, saikrishnag, vadim.fedorenko,
	przemyslaw.kitszel, ecree.xilinx, rmk+kernel
  Cc: mengyuanlou, Jiawen Wu

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   | 86 +++++++++++++++++++
 .../net/ethernet/wangxun/txgbe/txgbe_type.h   |  8 ++
 2 files changed, 94 insertions(+)

diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
index 6d9134a3ce4d..c3b0f15099db 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,87 @@ void txgbe_do_reset(struct net_device *netdev)
 		txgbe_reset(wx);
 }
 
+static int txgbe_udp_tunnel_set(struct net_device *dev, unsigned int table,
+				unsigned int entry, struct udp_tunnel_info *ti)
+{
+	struct wx *wx = netdev_priv(dev);
+	struct txgbe *txgbe = wx->priv;
+
+	switch (ti->type) {
+	case UDP_TUNNEL_TYPE_VXLAN:
+		if (txgbe->vxlan_port == ti->port)
+			break;
+
+		if (txgbe->vxlan_port) {
+			wx_err(wx, "VXLAN port %d set, not adding port %d\n",
+			       txgbe->vxlan_port, ti->port);
+			return -EINVAL;
+		}
+
+		txgbe->vxlan_port = ti->port;
+		wr32(wx, TXGBE_CFG_VXLAN, ntohs(ti->port));
+		break;
+	case UDP_TUNNEL_TYPE_VXLAN_GPE:
+		if (txgbe->vxlan_gpe_port == ti->port)
+			break;
+
+		if (txgbe->vxlan_gpe_port) {
+			wx_err(wx, "VXLAN-GPE port %d set, not adding port %d\n",
+			       txgbe->vxlan_gpe_port, ti->port);
+			return -EINVAL;
+		}
+
+		txgbe->vxlan_gpe_port = ti->port;
+		wr32(wx, TXGBE_CFG_VXLAN_GPE, ntohs(ti->port));
+		break;
+	case UDP_TUNNEL_TYPE_GENEVE:
+		if (txgbe->geneve_port == ti->port)
+			break;
+
+		if (txgbe->geneve_port) {
+			wx_err(wx, "GENEVE port %d set, not adding port %d\n",
+			       txgbe->geneve_port, ti->port);
+			return -EINVAL;
+		}
+
+		txgbe->geneve_port = ti->port;
+		wr32(wx, TXGBE_CFG_GENEVE, ntohs(ti->port));
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int txgbe_udp_tunnel_unset(struct net_device *dev,
+				  unsigned int table, unsigned int entry,
+				  struct udp_tunnel_info *ti)
+{
+	struct wx *wx = netdev_priv(dev);
+	struct txgbe *txgbe = wx->priv;
+
+	if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
+		txgbe->vxlan_port = 0;
+	else if (ti->type == UDP_TUNNEL_TYPE_VXLAN_GPE)
+		txgbe->vxlan_gpe_port = 0;
+	else
+		txgbe->geneve_port = 0;
+
+	return 0;
+}
+
+static const struct udp_tunnel_nic_info txgbe_udp_tunnels = {
+	.set_port	= txgbe_udp_tunnel_set,
+	.unset_port	= txgbe_udp_tunnel_unset,
+	.flags		= UDP_TUNNEL_NIC_INFO_MAY_SLEEP,
+	.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 +716,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 +762,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..7923adb9ac73 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
@@ -359,6 +362,11 @@ struct txgbe {
 	union txgbe_atr_input fdir_mask;
 	int fdir_filter_count;
 	spinlock_t fdir_perfect_lock; /* spinlock for FDIR */
+
+	/* tunnel port */
+	__be16 vxlan_port;
+	__be16 vxlan_gpe_port;
+	__be16 geneve_port;
 };
 
 #endif /* _TXGBE_TYPE_H_ */
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next v2 2/2] net: wangxun: restrict feature flags for tunnel packets
  2025-04-14  9:10 [PATCH net-next v2 0/2] Implement udp tunnel port for txgbe Jiawen Wu
  2025-04-14  8:52 ` Michal Kubiak
  2025-04-14  9:10 ` [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
@ 2025-04-14  9:10 ` Jiawen Wu
  2 siblings, 0 replies; 7+ messages in thread
From: Jiawen Wu @ 2025-04-14  9:10 UTC (permalink / raw)
  To: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
	dlemoal, jdamato, saikrishnag, vadim.fedorenko,
	przemyslaw.kitszel, ecree.xilinx, rmk+kernel
  Cc: mengyuanlou, Jiawen Wu, Michal Kubiak

Implement ndo_features_check to restrict Tx checksum offload flags, since
there are some inner layer length and protocols unsupported.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Michal Kubiak <michal.kubiak@intel.com>
---
 drivers/net/ethernet/wangxun/libwx/wx_lib.c   | 27 +++++++++++++++++++
 drivers/net/ethernet/wangxun/libwx/wx_lib.h   |  3 +++
 drivers/net/ethernet/wangxun/ngbe/ngbe_main.c |  1 +
 .../net/ethernet/wangxun/txgbe/txgbe_main.c   |  1 +
 4 files changed, 32 insertions(+)

diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
index 18422b940dbe..2a808afeb414 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c
+++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
@@ -3000,6 +3000,33 @@ netdev_features_t wx_fix_features(struct net_device *netdev,
 }
 EXPORT_SYMBOL(wx_fix_features);
 
+#define WX_MAX_TUNNEL_HDR_LEN	80
+netdev_features_t wx_features_check(struct sk_buff *skb,
+				    struct net_device *netdev,
+				    netdev_features_t features)
+{
+	struct wx *wx = netdev_priv(netdev);
+
+	if (!skb->encapsulation)
+		return features;
+
+	if (wx->mac.type == wx_mac_em)
+		return features & ~NETIF_F_CSUM_MASK;
+
+	if (unlikely(skb_inner_mac_header(skb) - skb_transport_header(skb) >
+		     WX_MAX_TUNNEL_HDR_LEN))
+		return features & ~NETIF_F_CSUM_MASK;
+
+	if (skb->inner_protocol_type == ENCAP_TYPE_ETHER &&
+	    skb->inner_protocol != htons(ETH_P_IP) &&
+	    skb->inner_protocol != htons(ETH_P_IPV6) &&
+	    skb->inner_protocol != htons(ETH_P_TEB))
+		return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
+
+	return features;
+}
+EXPORT_SYMBOL(wx_features_check);
+
 void wx_set_ring(struct wx *wx, u32 new_tx_count,
 		 u32 new_rx_count, struct wx_ring *temp_ring)
 {
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.h b/drivers/net/ethernet/wangxun/libwx/wx_lib.h
index fdeb0c315b75..919f49999308 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.h
+++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.h
@@ -33,6 +33,9 @@ void wx_get_stats64(struct net_device *netdev,
 int wx_set_features(struct net_device *netdev, netdev_features_t features);
 netdev_features_t wx_fix_features(struct net_device *netdev,
 				  netdev_features_t features);
+netdev_features_t wx_features_check(struct sk_buff *skb,
+				    struct net_device *netdev,
+				    netdev_features_t features);
 void wx_set_ring(struct wx *wx, u32 new_tx_count,
 		 u32 new_rx_count, struct wx_ring *temp_ring);
 
diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
index fd102078f5c9..82e27b9cfc9c 100644
--- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
+++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
@@ -587,6 +587,7 @@ static const struct net_device_ops ngbe_netdev_ops = {
 	.ndo_set_rx_mode        = wx_set_rx_mode,
 	.ndo_set_features       = wx_set_features,
 	.ndo_fix_features       = wx_fix_features,
+	.ndo_features_check     = wx_features_check,
 	.ndo_validate_addr      = eth_validate_addr,
 	.ndo_set_mac_address    = wx_set_mac,
 	.ndo_get_stats64        = wx_get_stats64,
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
index c3b0f15099db..259062b8f990 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
@@ -629,6 +629,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
 	.ndo_set_rx_mode        = wx_set_rx_mode,
 	.ndo_set_features       = wx_set_features,
 	.ndo_fix_features       = wx_fix_features,
+	.ndo_features_check     = wx_features_check,
 	.ndo_validate_addr      = eth_validate_addr,
 	.ndo_set_mac_address    = wx_set_mac,
 	.ndo_get_stats64        = wx_get_stats64,
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port
  2025-04-14  9:10 ` [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
@ 2025-04-16  0:33   ` Jakub Kicinski
  2025-04-16  6:29     ` Jiawen Wu
  0 siblings, 1 reply; 7+ messages in thread
From: Jakub Kicinski @ 2025-04-16  0:33 UTC (permalink / raw)
  To: Jiawen Wu
  Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
	jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
	ecree.xilinx, rmk+kernel, mengyuanlou

On Mon, 14 Apr 2025 17:10:21 +0800 Jiawen Wu wrote:
> +	udp_tunnel_nic_reset_ntf(netdev);

you issue the reset here, without clearing the ports...

>  	return 0;
>  
>  err_free_irq:
> @@ -537,6 +540,87 @@ void txgbe_do_reset(struct net_device *netdev)
>  		txgbe_reset(wx);
>  }
>  
> +static int txgbe_udp_tunnel_set(struct net_device *dev, unsigned int table,
> +				unsigned int entry, struct udp_tunnel_info *ti)
> +{
> +	struct wx *wx = netdev_priv(dev);
> +	struct txgbe *txgbe = wx->priv;
> +
> +	switch (ti->type) {
> +	case UDP_TUNNEL_TYPE_VXLAN:
> +		if (txgbe->vxlan_port == ti->port)

then you ignore the set if the port is already the same.

Why do you need the udp_tunnel_nic_reset_ntf() call?
Read the kdoc on that function.
It doesn't seem like your NIC loses the state.

> +			break;
> +
> +		if (txgbe->vxlan_port) {
> +			wx_err(wx, "VXLAN port %d set, not adding port %d\n",
> +			       txgbe->vxlan_port, ti->port);
> +			return -EINVAL;
> +		}

Why...

> +		txgbe->vxlan_port = ti->port;
> +		wr32(wx, TXGBE_CFG_VXLAN, ntohs(ti->port));
> +		break;

> +static const struct udp_tunnel_nic_info txgbe_udp_tunnels = {
> +	.set_port	= txgbe_udp_tunnel_set,
> +	.unset_port	= txgbe_udp_tunnel_unset,
> +	.flags		= UDP_TUNNEL_NIC_INFO_MAY_SLEEP,

Where do the callbacks sleep?
-- 
pw-bot: cr

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port
  2025-04-16  0:33   ` Jakub Kicinski
@ 2025-04-16  6:29     ` Jiawen Wu
  2025-04-17  2:40       ` Jiawen Wu
  0 siblings, 1 reply; 7+ messages in thread
From: Jiawen Wu @ 2025-04-16  6:29 UTC (permalink / raw)
  To: 'Jakub Kicinski'
  Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
	jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
	ecree.xilinx, rmk+kernel, mengyuanlou

On Wed, Apr 16, 2025 8:33 AM, Jakub Kicinski wrote:
> On Mon, 14 Apr 2025 17:10:21 +0800 Jiawen Wu wrote:
> > +	udp_tunnel_nic_reset_ntf(netdev);
> 
> you issue the reset here, without clearing the ports...
> 
> >  	return 0;
> >
> >  err_free_irq:
> > @@ -537,6 +540,87 @@ void txgbe_do_reset(struct net_device *netdev)
> >  		txgbe_reset(wx);
> >  }
> >
> > +static int txgbe_udp_tunnel_set(struct net_device *dev, unsigned int table,
> > +				unsigned int entry, struct udp_tunnel_info *ti)
> > +{
> > +	struct wx *wx = netdev_priv(dev);
> > +	struct txgbe *txgbe = wx->priv;
> > +
> > +	switch (ti->type) {
> > +	case UDP_TUNNEL_TYPE_VXLAN:
> > +		if (txgbe->vxlan_port == ti->port)
> 
> then you ignore the set if the port is already the same.
> 
> Why do you need the udp_tunnel_nic_reset_ntf() call?
> Read the kdoc on that function.
> It doesn't seem like your NIC loses the state.
> 
> > +			break;
> > +
> > +		if (txgbe->vxlan_port) {
> > +			wx_err(wx, "VXLAN port %d set, not adding port %d\n",
> > +			       txgbe->vxlan_port, ti->port);
> > +			return -EINVAL;
> > +		}
> 
> Why...
> 
> > +		txgbe->vxlan_port = ti->port;
> > +		wr32(wx, TXGBE_CFG_VXLAN, ntohs(ti->port));
> > +		break;
> 
> > +static const struct udp_tunnel_nic_info txgbe_udp_tunnels = {
> > +	.set_port	= txgbe_udp_tunnel_set,
> > +	.unset_port	= txgbe_udp_tunnel_unset,
> > +	.flags		= UDP_TUNNEL_NIC_INFO_MAY_SLEEP,
> 
> Where do the callbacks sleep?

I now understand how the "reset" works, it will be changed to
UDP_TUNNEL_NIC_INFO_OPEN_ONLY, and use .sync_table to simplify the flow.




^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port
  2025-04-16  6:29     ` Jiawen Wu
@ 2025-04-17  2:40       ` Jiawen Wu
  0 siblings, 0 replies; 7+ messages in thread
From: Jiawen Wu @ 2025-04-17  2:40 UTC (permalink / raw)
  To: 'Jakub Kicinski'
  Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
	jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
	ecree.xilinx, rmk+kernel, mengyuanlou

On Wed, Apr 16, 2025 2:30 PM, Jiawen Wu wrote:
> On Wed, Apr 16, 2025 8:33 AM, Jakub Kicinski wrote:
> > On Mon, 14 Apr 2025 17:10:21 +0800 Jiawen Wu wrote:
> > > +	udp_tunnel_nic_reset_ntf(netdev);
> >
> > you issue the reset here, without clearing the ports...
> >
> > >  	return 0;
> > >
> > >  err_free_irq:
> > > @@ -537,6 +540,87 @@ void txgbe_do_reset(struct net_device *netdev)
> > >  		txgbe_reset(wx);
> > >  }
> > >
> > > +static int txgbe_udp_tunnel_set(struct net_device *dev, unsigned int table,
> > > +				unsigned int entry, struct udp_tunnel_info *ti)
> > > +{
> > > +	struct wx *wx = netdev_priv(dev);
> > > +	struct txgbe *txgbe = wx->priv;
> > > +
> > > +	switch (ti->type) {
> > > +	case UDP_TUNNEL_TYPE_VXLAN:
> > > +		if (txgbe->vxlan_port == ti->port)
> >
> > then you ignore the set if the port is already the same.
> >
> > Why do you need the udp_tunnel_nic_reset_ntf() call?
> > Read the kdoc on that function.
> > It doesn't seem like your NIC loses the state.
> >
> > > +			break;
> > > +
> > > +		if (txgbe->vxlan_port) {
> > > +			wx_err(wx, "VXLAN port %d set, not adding port %d\n",
> > > +			       txgbe->vxlan_port, ti->port);
> > > +			return -EINVAL;
> > > +		}
> >
> > Why...
> >
> > > +		txgbe->vxlan_port = ti->port;
> > > +		wr32(wx, TXGBE_CFG_VXLAN, ntohs(ti->port));
> > > +		break;
> >
> > > +static const struct udp_tunnel_nic_info txgbe_udp_tunnels = {
> > > +	.set_port	= txgbe_udp_tunnel_set,
> > > +	.unset_port	= txgbe_udp_tunnel_unset,
> > > +	.flags		= UDP_TUNNEL_NIC_INFO_MAY_SLEEP,
> >
> > Where do the callbacks sleep?
> 
> I now understand how the "reset" works, it will be changed to
> UDP_TUNNEL_NIC_INFO_OPEN_ONLY, and use .sync_table to simplify the flow.

But I have a question.

There are two ethernet chips on the board with four ports eth0~eth3,
they all use txgbe driver. When I add a VXLAN port for eth0, in fact, all
4 devices are configured. So I can't add another different VXLAN port
for eth1~eth3. Is this a fixed behavior of the kernel?



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-04-17  2:41 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-14  9:10 [PATCH net-next v2 0/2] Implement udp tunnel port for txgbe Jiawen Wu
2025-04-14  8:52 ` Michal Kubiak
2025-04-14  9:10 ` [PATCH net-next v2 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
2025-04-16  0:33   ` Jakub Kicinski
2025-04-16  6:29     ` Jiawen Wu
2025-04-17  2:40       ` Jiawen Wu
2025-04-14  9:10 ` [PATCH net-next v2 2/2] net: wangxun: restrict feature flags for tunnel packets Jiawen Wu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).