bnxt: Update drivers to support unified UDP encapsulation offload functions
authorAlexander Duyck <aduyck@mirantis.com>
Thu, 16 Jun 2016 19:21:19 +0000 (12:21 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 18 Jun 2016 03:23:29 +0000 (20:23 -0700)
This patch ends up doing several things.  First it updates the driver to
make use of the new unified UDP tunnel offload notifier functions.  In
addition I updated the code so that we can work around the bits that were
checking for if VXLAN was enabled since we are now using a notifier based
setup.

Signed-off-by: Alexander Duyck <aduyck@mirantis.com>
Acked-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/Kconfig
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index d92c37fa8036afa0ff090a5cde8ed8ec0c69e6cc..d74a92e1c27dbb1ea95508747de2c751628f80ee 100644 (file)
@@ -166,7 +166,6 @@ config SYSTEMPORT
 config BNXT
        tristate "Broadcom NetXtreme-C/E support"
        depends on PCI
-       depends on VXLAN || VXLAN=n
        select FW_LOADER
        select LIBCRC32C
        ---help---
index 9aaa6a61c8006f050088f89ea29d0d9a8ba1df36..03a5d84198ee714bfe3c1d256285e0098050a566 100644 (file)
@@ -37,9 +37,7 @@
 #include <net/udp.h>
 #include <net/checksum.h>
 #include <net/ip6_checksum.h>
-#if defined(CONFIG_VXLAN) || defined(CONFIG_VXLAN_MODULE)
-#include <net/vxlan.h>
-#endif
+#include <net/udp_tunnel.h>
 #ifdef CONFIG_NET_RX_BUSY_POLL
 #include <net/busy_poll.h>
 #endif
@@ -5256,9 +5254,7 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
        }
 
        if (irq_re_init) {
-#if defined(CONFIG_VXLAN) || defined(CONFIG_VXLAN_MODULE)
-               vxlan_get_rx_port(bp->dev);
-#endif
+               udp_tunnel_get_rx_info(bp->dev);
                if (!bnxt_hwrm_tunnel_dst_port_alloc(
                                bp, htons(0x17c1),
                                TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE))
@@ -6250,47 +6246,63 @@ static void bnxt_cfg_ntp_filters(struct bnxt *bp)
 
 #endif /* CONFIG_RFS_ACCEL */
 
-static void bnxt_add_vxlan_port(struct net_device *dev, sa_family_t sa_family,
-                               __be16 port)
+static void bnxt_udp_tunnel_add(struct net_device *dev,
+                               struct udp_tunnel_info *ti)
 {
        struct bnxt *bp = netdev_priv(dev);
 
-       if (!netif_running(dev))
+       if (ti->sa_family != AF_INET6 && ti->sa_family != AF_INET)
                return;
 
-       if (sa_family != AF_INET6 && sa_family != AF_INET)
+       if (!netif_running(dev))
                return;
 
-       if (bp->vxlan_port_cnt && bp->vxlan_port != port)
-               return;
+       switch (ti->type) {
+       case UDP_TUNNEL_TYPE_VXLAN:
+               if (bp->vxlan_port_cnt && bp->vxlan_port != ti->port)
+                       return;
 
-       bp->vxlan_port_cnt++;
-       if (bp->vxlan_port_cnt == 1) {
-               bp->vxlan_port = port;
-               set_bit(BNXT_VXLAN_ADD_PORT_SP_EVENT, &bp->sp_event);
-               schedule_work(&bp->sp_task);
+               bp->vxlan_port_cnt++;
+               if (bp->vxlan_port_cnt == 1) {
+                       bp->vxlan_port = ti->port;
+                       set_bit(BNXT_VXLAN_ADD_PORT_SP_EVENT, &bp->sp_event);
+                       schedule_work(&bp->sp_task);
+               }
+               break;
+       default:
+               return;
        }
+
+       schedule_work(&bp->sp_task);
 }
 
-static void bnxt_del_vxlan_port(struct net_device *dev, sa_family_t sa_family,
-                               __be16 port)
+static void bnxt_udp_tunnel_del(struct net_device *dev,
+                               struct udp_tunnel_info *ti)
 {
        struct bnxt *bp = netdev_priv(dev);
 
-       if (!netif_running(dev))
+       if (ti->sa_family != AF_INET6 && ti->sa_family != AF_INET)
                return;
 
-       if (sa_family != AF_INET6 && sa_family != AF_INET)
+       if (!netif_running(dev))
                return;
 
-       if (bp->vxlan_port_cnt && bp->vxlan_port == port) {
+       switch (ti->type) {
+       case UDP_TUNNEL_TYPE_VXLAN:
+               if (!bp->vxlan_port_cnt || bp->vxlan_port != ti->port)
+                       return;
                bp->vxlan_port_cnt--;
 
-               if (bp->vxlan_port_cnt == 0) {
-                       set_bit(BNXT_VXLAN_DEL_PORT_SP_EVENT, &bp->sp_event);
-                       schedule_work(&bp->sp_task);
-               }
+               if (bp->vxlan_port_cnt != 0)
+                       return;
+
+               set_bit(BNXT_VXLAN_DEL_PORT_SP_EVENT, &bp->sp_event);
+               break;
+       default:
+               return;
        }
+
+       schedule_work(&bp->sp_task);
 }
 
 static const struct net_device_ops bnxt_netdev_ops = {
@@ -6321,8 +6333,8 @@ static const struct net_device_ops bnxt_netdev_ops = {
 #ifdef CONFIG_RFS_ACCEL
        .ndo_rx_flow_steer      = bnxt_rx_flow_steer,
 #endif
-       .ndo_add_vxlan_port     = bnxt_add_vxlan_port,
-       .ndo_del_vxlan_port     = bnxt_del_vxlan_port,
+       .ndo_udp_tunnel_add     = bnxt_udp_tunnel_add,
+       .ndo_udp_tunnel_del     = bnxt_udp_tunnel_del,
 #ifdef CONFIG_NET_RX_BUSY_POLL
        .ndo_busy_poll          = bnxt_busy_poll,
 #endif