diff options
author | Jacob Keller <jacob.e.keller@intel.com> | 2016-06-23 22:54:03 +0200 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2016-08-29 10:31:03 +0200 |
commit | 1ad782928f16e7f1b5269ce4358caffe566f44db (patch) | |
tree | c1f3c176e36433ea38819e252e802189e27442a4 /drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | |
parent | fm10k: rework vxlan_port offload before adding geneve support (diff) | |
download | linux-1ad782928f16e7f1b5269ce4358caffe566f44db.tar.xz linux-1ad782928f16e7f1b5269ce4358caffe566f44db.zip |
fm10k: add support for Rx offloads on one Geneve tunnel
Similar to how we handle VXLAN offload, enable support for a single
Geneve tunnel.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/fm10k/fm10k_netdev.c')
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c index 07c5a685f0e9..05629381be6b 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c @@ -387,7 +387,7 @@ static void fm10k_request_glort_range(struct fm10k_intfc *interface) * fm10k_free_udp_port_info * @interface: board private structure * - * This function frees the entire vxlan_port list + * This function frees both geneve_port and vxlan_port structures **/ static void fm10k_free_udp_port_info(struct fm10k_intfc *interface) { @@ -403,6 +403,17 @@ static void fm10k_free_udp_port_info(struct fm10k_intfc *interface) struct fm10k_udp_port, list); } + + /* flush all entries from geneve list */ + port = list_first_entry_or_null(&interface->geneve_port, + struct fm10k_udp_port, list); + while (port) { + list_del(&port->list); + kfree(port); + port = list_first_entry_or_null(&interface->vxlan_port, + struct fm10k_udp_port, + list); + } } /** @@ -427,6 +438,13 @@ static void fm10k_restore_udp_port_info(struct fm10k_intfc *interface) fm10k_write_reg(hw, FM10K_TUNNEL_CFG, (port ? ntohs(port->port) : 0) | (ETH_P_TEB << FM10K_TUNNEL_CFG_NVGRE_SHIFT)); + + port = list_first_entry_or_null(&interface->geneve_port, + struct fm10k_udp_port, list); + + /* restore Geneve tunnel configuration register */ + fm10k_write_reg(hw, FM10K_TUNNEL_CFG_GENEVE, + (port ? ntohs(port->port) : 0)); } static struct fm10k_udp_port * @@ -472,8 +490,8 @@ static void fm10k_insert_tunnel_port(struct list_head *ports, * @ti: Tunnel endpoint information * * This function is called when a new UDP tunnel port has been added. - * Currently we only support VXLAN and only one port will actually be - * offloaded due to hardware restrictions. + * Due to hardware restrictions, only one port per type can be offloaded at + * once. **/ static void fm10k_udp_tunnel_add(struct net_device *dev, struct udp_tunnel_info *ti) @@ -488,6 +506,9 @@ static void fm10k_udp_tunnel_add(struct net_device *dev, case UDP_TUNNEL_TYPE_VXLAN: fm10k_insert_tunnel_port(&interface->vxlan_port, ti); break; + case UDP_TUNNEL_TYPE_GENEVE: + fm10k_insert_tunnel_port(&interface->geneve_port, ti); + break; default: return; } @@ -517,6 +538,9 @@ static void fm10k_udp_tunnel_del(struct net_device *dev, case UDP_TUNNEL_TYPE_VXLAN: port = fm10k_remove_tunnel_port(&interface->vxlan_port, ti); break; + case UDP_TUNNEL_TYPE_GENEVE: + port = fm10k_remove_tunnel_port(&interface->geneve_port, ti); + break; default: return; } |