Commit 085c5c42 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

bnx2x: convert to new udp_tunnel_nic infra

Fairly straightforward conversion - no need to keep track
of the use count, and replay when ports get removed, also
callbacks can just sleep.
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4df587ab
...@@ -1287,7 +1287,6 @@ enum sp_rtnl_flag { ...@@ -1287,7 +1287,6 @@ enum sp_rtnl_flag {
BNX2X_SP_RTNL_HYPERVISOR_VLAN, BNX2X_SP_RTNL_HYPERVISOR_VLAN,
BNX2X_SP_RTNL_TX_STOP, BNX2X_SP_RTNL_TX_STOP,
BNX2X_SP_RTNL_GET_DRV_VERSION, BNX2X_SP_RTNL_GET_DRV_VERSION,
BNX2X_SP_RTNL_CHANGE_UDP_PORT,
BNX2X_SP_RTNL_UPDATE_SVID, BNX2X_SP_RTNL_UPDATE_SVID,
}; };
...@@ -1343,11 +1342,6 @@ enum bnx2x_udp_port_type { ...@@ -1343,11 +1342,6 @@ enum bnx2x_udp_port_type {
BNX2X_UDP_PORT_MAX, BNX2X_UDP_PORT_MAX,
}; };
struct bnx2x_udp_tunnel {
u16 dst_port;
u8 count;
};
struct bnx2x { struct bnx2x {
/* Fields used in the tx and intr/napi performance paths /* Fields used in the tx and intr/napi performance paths
* are grouped together in the beginning of the structure * are grouped together in the beginning of the structure
...@@ -1855,7 +1849,7 @@ struct bnx2x { ...@@ -1855,7 +1849,7 @@ struct bnx2x {
bool accept_any_vlan; bool accept_any_vlan;
/* Vxlan/Geneve related information */ /* Vxlan/Geneve related information */
struct bnx2x_udp_tunnel udp_tunnel_ports[BNX2X_UDP_PORT_MAX]; u16 udp_tunnel_ports[BNX2X_UDP_PORT_MAX];
}; };
/* Tx queues may be less or equal to Rx queues */ /* Tx queues may be less or equal to Rx queues */
......
...@@ -960,12 +960,12 @@ static inline int bnx2x_func_start(struct bnx2x *bp) ...@@ -960,12 +960,12 @@ static inline int bnx2x_func_start(struct bnx2x *bp)
start_params->network_cos_mode = STATIC_COS; start_params->network_cos_mode = STATIC_COS;
else /* CHIP_IS_E1X */ else /* CHIP_IS_E1X */
start_params->network_cos_mode = FW_WRR; start_params->network_cos_mode = FW_WRR;
if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN].count) { if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN]) {
port = bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN].dst_port; port = bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN];
start_params->vxlan_dst_port = port; start_params->vxlan_dst_port = port;
} }
if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE].count) { if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE]) {
port = bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE].dst_port; port = bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE];
start_params->geneve_dst_port = port; start_params->geneve_dst_port = port;
} }
......
...@@ -10152,7 +10152,6 @@ static int bnx2x_udp_port_update(struct bnx2x *bp) ...@@ -10152,7 +10152,6 @@ static int bnx2x_udp_port_update(struct bnx2x *bp)
{ {
struct bnx2x_func_switch_update_params *switch_update_params; struct bnx2x_func_switch_update_params *switch_update_params;
struct bnx2x_func_state_params func_params = {NULL}; struct bnx2x_func_state_params func_params = {NULL};
struct bnx2x_udp_tunnel *udp_tunnel;
u16 vxlan_port = 0, geneve_port = 0; u16 vxlan_port = 0, geneve_port = 0;
int rc; int rc;
...@@ -10169,15 +10168,13 @@ static int bnx2x_udp_port_update(struct bnx2x *bp) ...@@ -10169,15 +10168,13 @@ static int bnx2x_udp_port_update(struct bnx2x *bp)
__set_bit(BNX2X_F_UPDATE_TUNNEL_CFG_CHNG, __set_bit(BNX2X_F_UPDATE_TUNNEL_CFG_CHNG,
&switch_update_params->changes); &switch_update_params->changes);
if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE].count) { if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE]) {
udp_tunnel = &bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE]; geneve_port = bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE];
geneve_port = udp_tunnel->dst_port;
switch_update_params->geneve_dst_port = geneve_port; switch_update_params->geneve_dst_port = geneve_port;
} }
if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN].count) { if (bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN]) {
udp_tunnel = &bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN]; vxlan_port = bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN];
vxlan_port = udp_tunnel->dst_port;
switch_update_params->vxlan_dst_port = vxlan_port; switch_update_params->vxlan_dst_port = vxlan_port;
} }
...@@ -10197,94 +10194,27 @@ static int bnx2x_udp_port_update(struct bnx2x *bp) ...@@ -10197,94 +10194,27 @@ static int bnx2x_udp_port_update(struct bnx2x *bp)
return rc; return rc;
} }
static void __bnx2x_add_udp_port(struct bnx2x *bp, u16 port, static int bnx2x_udp_tunnel_sync(struct net_device *netdev, unsigned int table)
enum bnx2x_udp_port_type type)
{
struct bnx2x_udp_tunnel *udp_port = &bp->udp_tunnel_ports[type];
if (!netif_running(bp->dev) || !IS_PF(bp) || CHIP_IS_E1x(bp))
return;
if (udp_port->count && udp_port->dst_port == port) {
udp_port->count++;
return;
}
if (udp_port->count) {
DP(BNX2X_MSG_SP,
"UDP tunnel [%d] - destination port limit reached\n",
type);
return;
}
udp_port->dst_port = port;
udp_port->count = 1;
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_CHANGE_UDP_PORT, 0);
}
static void __bnx2x_del_udp_port(struct bnx2x *bp, u16 port,
enum bnx2x_udp_port_type type)
{
struct bnx2x_udp_tunnel *udp_port = &bp->udp_tunnel_ports[type];
if (!IS_PF(bp) || CHIP_IS_E1x(bp))
return;
if (!udp_port->count || udp_port->dst_port != port) {
DP(BNX2X_MSG_SP, "Invalid UDP tunnel [%d] port\n",
type);
return;
}
/* Remove reference, and make certain it's no longer in use */
udp_port->count--;
if (udp_port->count)
return;
udp_port->dst_port = 0;
if (netif_running(bp->dev))
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_CHANGE_UDP_PORT, 0);
else
DP(BNX2X_MSG_SP, "Deleted UDP tunnel [%d] port %d\n",
type, port);
}
static void bnx2x_udp_tunnel_add(struct net_device *netdev,
struct udp_tunnel_info *ti)
{ {
struct bnx2x *bp = netdev_priv(netdev); struct bnx2x *bp = netdev_priv(netdev);
u16 t_port = ntohs(ti->port); struct udp_tunnel_info ti;
switch (ti->type) { udp_tunnel_nic_get_port(netdev, table, 0, &ti);
case UDP_TUNNEL_TYPE_VXLAN: bp->udp_tunnel_ports[table] = be16_to_cpu(ti.port);
__bnx2x_add_udp_port(bp, t_port, BNX2X_UDP_PORT_VXLAN);
break;
case UDP_TUNNEL_TYPE_GENEVE:
__bnx2x_add_udp_port(bp, t_port, BNX2X_UDP_PORT_GENEVE);
break;
default:
break;
}
}
static void bnx2x_udp_tunnel_del(struct net_device *netdev, return bnx2x_udp_port_update(bp);
struct udp_tunnel_info *ti)
{
struct bnx2x *bp = netdev_priv(netdev);
u16 t_port = ntohs(ti->port);
switch (ti->type) {
case UDP_TUNNEL_TYPE_VXLAN:
__bnx2x_del_udp_port(bp, t_port, BNX2X_UDP_PORT_VXLAN);
break;
case UDP_TUNNEL_TYPE_GENEVE:
__bnx2x_del_udp_port(bp, t_port, BNX2X_UDP_PORT_GENEVE);
break;
default:
break;
}
} }
static const struct udp_tunnel_nic_info bnx2x_udp_tunnels = {
.sync_table = bnx2x_udp_tunnel_sync,
.flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP |
UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
.tables = {
{ .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN, },
{ .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_GENEVE, },
},
};
static int bnx2x_close(struct net_device *dev); static int bnx2x_close(struct net_device *dev);
/* bnx2x_nic_unload() flushes the bnx2x_wq, thus reset task is /* bnx2x_nic_unload() flushes the bnx2x_wq, thus reset task is
...@@ -10407,24 +10337,6 @@ static void bnx2x_sp_rtnl_task(struct work_struct *work) ...@@ -10407,24 +10337,6 @@ static void bnx2x_sp_rtnl_task(struct work_struct *work)
if (test_and_clear_bit(BNX2X_SP_RTNL_UPDATE_SVID, &bp->sp_rtnl_state)) if (test_and_clear_bit(BNX2X_SP_RTNL_UPDATE_SVID, &bp->sp_rtnl_state))
bnx2x_handle_update_svid_cmd(bp); bnx2x_handle_update_svid_cmd(bp);
if (test_and_clear_bit(BNX2X_SP_RTNL_CHANGE_UDP_PORT,
&bp->sp_rtnl_state)) {
if (bnx2x_udp_port_update(bp)) {
/* On error, forget configuration */
memset(bp->udp_tunnel_ports, 0,
sizeof(struct bnx2x_udp_tunnel) *
BNX2X_UDP_PORT_MAX);
} else {
/* Since we don't store additional port information,
* if no ports are configured for any feature ask for
* information about currently configured ports.
*/
if (!bp->udp_tunnel_ports[BNX2X_UDP_PORT_VXLAN].count &&
!bp->udp_tunnel_ports[BNX2X_UDP_PORT_GENEVE].count)
udp_tunnel_get_rx_info(bp->dev);
}
}
/* work which needs rtnl lock not-taken (as it takes the lock itself and /* work which needs rtnl lock not-taken (as it takes the lock itself and
* can be called from other contexts as well) * can be called from other contexts as well)
*/ */
...@@ -12620,9 +12532,6 @@ static int bnx2x_open(struct net_device *dev) ...@@ -12620,9 +12532,6 @@ static int bnx2x_open(struct net_device *dev)
if (rc) if (rc)
return rc; return rc;
if (IS_PF(bp))
udp_tunnel_get_rx_info(dev);
return 0; return 0;
} }
...@@ -13162,8 +13071,8 @@ static const struct net_device_ops bnx2x_netdev_ops = { ...@@ -13162,8 +13071,8 @@ static const struct net_device_ops bnx2x_netdev_ops = {
.ndo_get_phys_port_id = bnx2x_get_phys_port_id, .ndo_get_phys_port_id = bnx2x_get_phys_port_id,
.ndo_set_vf_link_state = bnx2x_set_vf_link_state, .ndo_set_vf_link_state = bnx2x_set_vf_link_state,
.ndo_features_check = bnx2x_features_check, .ndo_features_check = bnx2x_features_check,
.ndo_udp_tunnel_add = bnx2x_udp_tunnel_add, .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
.ndo_udp_tunnel_del = bnx2x_udp_tunnel_del, .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
}; };
static int bnx2x_set_coherency_mask(struct bnx2x *bp) static int bnx2x_set_coherency_mask(struct bnx2x *bp)
...@@ -13358,6 +13267,9 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev, ...@@ -13358,6 +13267,9 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
dev->gso_partial_features = NETIF_F_GSO_GRE_CSUM | dev->gso_partial_features = NETIF_F_GSO_GRE_CSUM |
NETIF_F_GSO_UDP_TUNNEL_CSUM; NETIF_F_GSO_UDP_TUNNEL_CSUM;
if (IS_PF(bp))
dev->udp_tunnel_nic_info = &bnx2x_udp_tunnels;
} }
dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment