Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e44f8e2 authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

qlcnic: Replace ndo_add/del_vxlan_port with ndo_add/del_udp_enc_port



This change replaces the network device operations for adding or removing a
VXLAN port with operations that are more generically defined to be used for
any UDP offload port but provide a type.  As such by just adding a line to
verify that the offload type is VXLAN we can maintain the same
functionality.

Signed-off-by: default avatarAlexander Duyck <aduyck@mirantis.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f9f082a9
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -54,16 +54,6 @@ config QLCNIC_DCB
	  mode of DCB is supported. PG and PFC values are related only
	  to Tx.

config QLCNIC_VXLAN
	bool "Virtual eXtensible Local Area Network (VXLAN) offload support"
	default n
	depends on QLCNIC && VXLAN && !(QLCNIC=y && VXLAN=m)
	---help---
	  This enables hardware offload support for VXLAN protocol over QLogic's
	  84XX series adapters.
	  Say Y here if you want to enable hardware offload support for
	  Virtual eXtensible Local Area Network (VXLAN) in the driver.

config QLCNIC_HWMON
	bool "QLOGIC QLCNIC 82XX and 83XX family HWMON support"
	depends on QLCNIC && HWMON && !(QLCNIC=y && HWMON=m)
+0 −2
Original line number Diff line number Diff line
@@ -1026,10 +1026,8 @@ struct qlcnic_ipaddr {
#define QLCNIC_HAS_PHYS_PORT_ID		0x40000
#define QLCNIC_TSS_RSS			0x80000

#ifdef CONFIG_QLCNIC_VXLAN
#define QLCNIC_ADD_VXLAN_PORT		0x100000
#define QLCNIC_DEL_VXLAN_PORT		0x200000
#endif

#define QLCNIC_VLAN_FILTERING		0x800000

+0 −4
Original line number Diff line number Diff line
@@ -1020,7 +1020,6 @@ static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
	return 0;
}

#ifdef CONFIG_QLCNIC_VXLAN
#define QLC_83XX_ENCAP_TYPE_VXLAN	BIT_1
#define QLC_83XX_MATCH_ENCAP_ID		BIT_2
#define QLC_83XX_SET_VXLAN_UDP_DPORT	BIT_3
@@ -1089,14 +1088,12 @@ static int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter,

	return ret;
}
#endif

static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
{
	if (adapter->fhash.fnum)
		qlcnic_prune_lb_filters(adapter);

#ifdef CONFIG_QLCNIC_VXLAN
	if (adapter->flags & QLCNIC_ADD_VXLAN_PORT) {
		if (qlcnic_set_vxlan_port(adapter))
			return;
@@ -1112,7 +1109,6 @@ static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
		adapter->ahw->vxlan_port = 0;
		adapter->flags &= ~QLCNIC_DEL_VXLAN_PORT;
	}
#endif
}

/**
+14 −16
Original line number Diff line number Diff line
@@ -16,9 +16,7 @@
#include <linux/aer.h>
#include <linux/log2.h>
#include <linux/pci.h>
#ifdef CONFIG_QLCNIC_VXLAN
#include <net/vxlan.h>
#endif

#include "qlcnic.h"
#include "qlcnic_sriov.h"
@@ -474,13 +472,15 @@ static int qlcnic_get_phys_port_id(struct net_device *netdev,
	return 0;
}

#ifdef CONFIG_QLCNIC_VXLAN
static void qlcnic_add_vxlan_port(struct net_device *netdev,
				  sa_family_t sa_family, __be16 port)
				  struct udp_tunnel_info *ti)
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_hardware_context *ahw = adapter->ahw;

	if (ti->type != UDP_TUNNEL_TYPE_VXLAN)
		return;

	/* Adapter supports only one VXLAN port. Use very first port
	 * for enabling offload
	 */
@@ -488,23 +488,26 @@ static void qlcnic_add_vxlan_port(struct net_device *netdev,
		return;
	if (!ahw->vxlan_port_count) {
		ahw->vxlan_port_count = 1;
		ahw->vxlan_port = ntohs(port);
		ahw->vxlan_port = ntohs(ti->port);
		adapter->flags |= QLCNIC_ADD_VXLAN_PORT;
		return;
	}
	if (ahw->vxlan_port == ntohs(port))
	if (ahw->vxlan_port == ntohs(ti->port))
		ahw->vxlan_port_count++;

}

static void qlcnic_del_vxlan_port(struct net_device *netdev,
				  sa_family_t sa_family, __be16 port)
				  struct udp_tunnel_info *ti)
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_hardware_context *ahw = adapter->ahw;

	if (ti->type != UDP_TUNNEL_TYPE_VXLAN)
		return;

	if (!qlcnic_encap_rx_offload(adapter) || !ahw->vxlan_port_count ||
	    (ahw->vxlan_port != ntohs(port)))
	    (ahw->vxlan_port != ntohs(ti->port)))
		return;

	ahw->vxlan_port_count--;
@@ -519,7 +522,6 @@ static netdev_features_t qlcnic_features_check(struct sk_buff *skb,
	features = vlan_features_check(skb, features);
	return vxlan_features_check(skb, features);
}
#endif

static const struct net_device_ops qlcnic_netdev_ops = {
	.ndo_open	   = qlcnic_open,
@@ -539,11 +541,9 @@ static const struct net_device_ops qlcnic_netdev_ops = {
	.ndo_fdb_del		= qlcnic_fdb_del,
	.ndo_fdb_dump		= qlcnic_fdb_dump,
	.ndo_get_phys_port_id	= qlcnic_get_phys_port_id,
#ifdef CONFIG_QLCNIC_VXLAN
	.ndo_add_vxlan_port	= qlcnic_add_vxlan_port,
	.ndo_del_vxlan_port	= qlcnic_del_vxlan_port,
	.ndo_udp_tunnel_add	= qlcnic_add_vxlan_port,
	.ndo_udp_tunnel_del	= qlcnic_del_vxlan_port,
	.ndo_features_check	= qlcnic_features_check,
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller = qlcnic_poll_controller,
#endif
@@ -2015,10 +2015,8 @@ qlcnic_attach(struct qlcnic_adapter *adapter)

	qlcnic_create_sysfs_entries(adapter);

#ifdef CONFIG_QLCNIC_VXLAN
	if (qlcnic_encap_rx_offload(adapter))
		vxlan_get_rx_port(netdev);
#endif
		udp_tunnel_get_rx_info(netdev);

	adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC;
	return 0;