Merge remote-tracking branch 'kbuild/for-next'
[deliverable/linux.git] / drivers / net / ethernet / intel / fm10k / fm10k_netdev.c
index 07c5a685f0e94689fb81202cc8b2ef699d18eaa8..05629381be6be5de004680f6f27fd5b577851e63 100644 (file)
@@ -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;
        }
This page took 0.044945 seconds and 5 git commands to generate.