Skip to content

Commit 1ad7829

Browse files
jacob-kellerJeff Kirsher
authored andcommitted
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 <[email protected]> Tested-by: Krishneil Singh <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent f92e0e4 commit 1ad7829

File tree

4 files changed

+31
-4
lines changed

4 files changed

+31
-4
lines changed

drivers/net/ethernet/intel/fm10k/fm10k.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ struct fm10k_intfc {
335335

336336
/* UDP encapsulation port tracking information */
337337
struct list_head vxlan_port;
338+
struct list_head geneve_port;
338339

339340
#ifdef CONFIG_DEBUG_FS
340341
struct dentry *dbg_intfc;

drivers/net/ethernet/intel/fm10k/fm10k_netdev.c

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ static void fm10k_request_glort_range(struct fm10k_intfc *interface)
387387
* fm10k_free_udp_port_info
388388
* @interface: board private structure
389389
*
390-
* This function frees the entire vxlan_port list
390+
* This function frees both geneve_port and vxlan_port structures
391391
**/
392392
static void fm10k_free_udp_port_info(struct fm10k_intfc *interface)
393393
{
@@ -403,6 +403,17 @@ static void fm10k_free_udp_port_info(struct fm10k_intfc *interface)
403403
struct fm10k_udp_port,
404404
list);
405405
}
406+
407+
/* flush all entries from geneve list */
408+
port = list_first_entry_or_null(&interface->geneve_port,
409+
struct fm10k_udp_port, list);
410+
while (port) {
411+
list_del(&port->list);
412+
kfree(port);
413+
port = list_first_entry_or_null(&interface->vxlan_port,
414+
struct fm10k_udp_port,
415+
list);
416+
}
406417
}
407418

408419
/**
@@ -427,6 +438,13 @@ static void fm10k_restore_udp_port_info(struct fm10k_intfc *interface)
427438
fm10k_write_reg(hw, FM10K_TUNNEL_CFG,
428439
(port ? ntohs(port->port) : 0) |
429440
(ETH_P_TEB << FM10K_TUNNEL_CFG_NVGRE_SHIFT));
441+
442+
port = list_first_entry_or_null(&interface->geneve_port,
443+
struct fm10k_udp_port, list);
444+
445+
/* restore Geneve tunnel configuration register */
446+
fm10k_write_reg(hw, FM10K_TUNNEL_CFG_GENEVE,
447+
(port ? ntohs(port->port) : 0));
430448
}
431449

432450
static struct fm10k_udp_port *
@@ -472,8 +490,8 @@ static void fm10k_insert_tunnel_port(struct list_head *ports,
472490
* @ti: Tunnel endpoint information
473491
*
474492
* This function is called when a new UDP tunnel port has been added.
475-
* Currently we only support VXLAN and only one port will actually be
476-
* offloaded due to hardware restrictions.
493+
* Due to hardware restrictions, only one port per type can be offloaded at
494+
* once.
477495
**/
478496
static void fm10k_udp_tunnel_add(struct net_device *dev,
479497
struct udp_tunnel_info *ti)
@@ -488,6 +506,9 @@ static void fm10k_udp_tunnel_add(struct net_device *dev,
488506
case UDP_TUNNEL_TYPE_VXLAN:
489507
fm10k_insert_tunnel_port(&interface->vxlan_port, ti);
490508
break;
509+
case UDP_TUNNEL_TYPE_GENEVE:
510+
fm10k_insert_tunnel_port(&interface->geneve_port, ti);
511+
break;
491512
default:
492513
return;
493514
}
@@ -517,6 +538,9 @@ static void fm10k_udp_tunnel_del(struct net_device *dev,
517538
case UDP_TUNNEL_TYPE_VXLAN:
518539
port = fm10k_remove_tunnel_port(&interface->vxlan_port, ti);
519540
break;
541+
case UDP_TUNNEL_TYPE_GENEVE:
542+
port = fm10k_remove_tunnel_port(&interface->geneve_port, ti);
543+
break;
520544
default:
521545
return;
522546
}

drivers/net/ethernet/intel/fm10k/fm10k_pci.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1835,8 +1835,9 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
18351835
interface->tx_itr = FM10K_TX_ITR_DEFAULT;
18361836
interface->rx_itr = FM10K_ITR_ADAPTIVE | FM10K_RX_ITR_DEFAULT;
18371837

1838-
/* initialize vxlan_port list */
1838+
/* initialize udp port lists */
18391839
INIT_LIST_HEAD(&interface->vxlan_port);
1840+
INIT_LIST_HEAD(&interface->geneve_port);
18401841

18411842
netdev_rss_key_fill(rss_key, sizeof(rss_key));
18421843
memcpy(interface->rssrk, rss_key, sizeof(rss_key));

drivers/net/ethernet/intel/fm10k/fm10k_type.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ struct fm10k_hw;
154154
#define FM10K_DGLORTDEC_INNERRSS_ENABLE 0x08000000
155155
#define FM10K_TUNNEL_CFG 0x0040
156156
#define FM10K_TUNNEL_CFG_NVGRE_SHIFT 16
157+
#define FM10K_TUNNEL_CFG_GENEVE 0x0041
157158
#define FM10K_SWPRI_MAP(_n) ((_n) + 0x0050)
158159
#define FM10K_SWPRI_MAX 16
159160
#define FM10K_RSSRK(_n, _m) (((_n) * 0x10) + (_m) + 0x0800)

0 commit comments

Comments
 (0)