diff options
author | Eran Ben Elisha <eranbe@mellanox.com> | 2018-01-09 04:41:10 -0500 |
---|---|---|
committer | Saeed Mahameed <saeedm@mellanox.com> | 2018-01-11 17:52:42 -0500 |
commit | 8978cc921fc7fad3f4d6f91f1da01352aeeeff25 (patch) | |
tree | 2249e2b60eba4775d1443d9dfdcab6ffd4b7db34 | |
parent | ccc12b11c5332c84442ef120dcd631523be75089 (diff) |
{net,ib}/mlx5: Don't disable local loopback multicast traffic when needed
There are systems platform information management interfaces (such as
HOST2BMC) for which we cannot disable local loopback multicast traffic.
Separate disable_local_lb_mc and disable_local_lb_uc capability bits so
driver will not disable multicast loopback traffic if not supported.
(It is expected that Firmware will not set disable_local_lb_mc if
HOST2BMC is running for example.)
Function mlx5_nic_vport_update_local_lb will do best effort to
disable/enable UC/MC loopback traffic and return success only in case it
succeeded to changed all allowed by Firmware.
Adapt mlx5_ib and mlx5e to support the new cap bits.
Fixes: 2c43c5a036be ("net/mlx5e: Enable local loopback in loopback selftest")
Fixes: c85023e153e3 ("IB/mlx5: Add raw ethernet local loopback support")
Fixes: bded747bb432 ("net/mlx5: Add raw ethernet local loopback firmware command")
Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
Cc: kernel-team@fb.com
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
-rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c | 27 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/vport.c | 22 | ||||
-rw-r--r-- | include/linux/mlx5/mlx5_ifc.h | 5 |
5 files changed, 44 insertions, 22 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 8ac50de2b242..00cb184fa027 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -1324,7 +1324,8 @@ static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn) | |||
1324 | return err; | 1324 | return err; |
1325 | 1325 | ||
1326 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || | 1326 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || |
1327 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb)) | 1327 | (!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) && |
1328 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc))) | ||
1328 | return err; | 1329 | return err; |
1329 | 1330 | ||
1330 | mutex_lock(&dev->lb_mutex); | 1331 | mutex_lock(&dev->lb_mutex); |
@@ -1342,7 +1343,8 @@ static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn) | |||
1342 | mlx5_core_dealloc_transport_domain(dev->mdev, tdn); | 1343 | mlx5_core_dealloc_transport_domain(dev->mdev, tdn); |
1343 | 1344 | ||
1344 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || | 1345 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || |
1345 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb)) | 1346 | (!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) && |
1347 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc))) | ||
1346 | return; | 1348 | return; |
1347 | 1349 | ||
1348 | mutex_lock(&dev->lb_mutex); | 1350 | mutex_lock(&dev->lb_mutex); |
@@ -4187,7 +4189,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
4187 | } | 4189 | } |
4188 | 4190 | ||
4189 | if ((MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && | 4191 | if ((MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && |
4190 | MLX5_CAP_GEN(mdev, disable_local_lb)) | 4192 | (MLX5_CAP_GEN(mdev, disable_local_lb_uc) || |
4193 | MLX5_CAP_GEN(mdev, disable_local_lb_mc))) | ||
4191 | mutex_init(&dev->lb_mutex); | 4194 | mutex_init(&dev->lb_mutex); |
4192 | 4195 | ||
4193 | dev->ib_active = true; | 4196 | dev->ib_active = true; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c index 1f1f8af87d4d..5a4608281f38 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c | |||
@@ -238,15 +238,19 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv, | |||
238 | int err = 0; | 238 | int err = 0; |
239 | 239 | ||
240 | /* Temporarily enable local_lb */ | 240 | /* Temporarily enable local_lb */ |
241 | if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) { | 241 | err = mlx5_nic_vport_query_local_lb(priv->mdev, &lbtp->local_lb); |
242 | mlx5_nic_vport_query_local_lb(priv->mdev, &lbtp->local_lb); | 242 | if (err) |
243 | if (!lbtp->local_lb) | 243 | return err; |
244 | mlx5_nic_vport_update_local_lb(priv->mdev, true); | 244 | |
245 | if (!lbtp->local_lb) { | ||
246 | err = mlx5_nic_vport_update_local_lb(priv->mdev, true); | ||
247 | if (err) | ||
248 | return err; | ||
245 | } | 249 | } |
246 | 250 | ||
247 | err = mlx5e_refresh_tirs(priv, true); | 251 | err = mlx5e_refresh_tirs(priv, true); |
248 | if (err) | 252 | if (err) |
249 | return err; | 253 | goto out; |
250 | 254 | ||
251 | lbtp->loopback_ok = false; | 255 | lbtp->loopback_ok = false; |
252 | init_completion(&lbtp->comp); | 256 | init_completion(&lbtp->comp); |
@@ -256,16 +260,21 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv, | |||
256 | lbtp->pt.dev = priv->netdev; | 260 | lbtp->pt.dev = priv->netdev; |
257 | lbtp->pt.af_packet_priv = lbtp; | 261 | lbtp->pt.af_packet_priv = lbtp; |
258 | dev_add_pack(&lbtp->pt); | 262 | dev_add_pack(&lbtp->pt); |
263 | |||
264 | return 0; | ||
265 | |||
266 | out: | ||
267 | if (!lbtp->local_lb) | ||
268 | mlx5_nic_vport_update_local_lb(priv->mdev, false); | ||
269 | |||
259 | return err; | 270 | return err; |
260 | } | 271 | } |
261 | 272 | ||
262 | static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv, | 273 | static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv, |
263 | struct mlx5e_lbt_priv *lbtp) | 274 | struct mlx5e_lbt_priv *lbtp) |
264 | { | 275 | { |
265 | if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) { | 276 | if (!lbtp->local_lb) |
266 | if (!lbtp->local_lb) | 277 | mlx5_nic_vport_update_local_lb(priv->mdev, false); |
267 | mlx5_nic_vport_update_local_lb(priv->mdev, false); | ||
268 | } | ||
269 | 278 | ||
270 | dev_remove_pack(&lbtp->pt); | 279 | dev_remove_pack(&lbtp->pt); |
271 | mlx5e_refresh_tirs(priv, false); | 280 | mlx5e_refresh_tirs(priv, false); |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 8a89c7e8cd63..95e188d0883e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
@@ -578,8 +578,7 @@ static int mlx5_core_set_hca_defaults(struct mlx5_core_dev *dev) | |||
578 | int ret = 0; | 578 | int ret = 0; |
579 | 579 | ||
580 | /* Disable local_lb by default */ | 580 | /* Disable local_lb by default */ |
581 | if ((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && | 581 | if (MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH) |
582 | MLX5_CAP_GEN(dev, disable_local_lb)) | ||
583 | ret = mlx5_nic_vport_update_local_lb(dev, false); | 582 | ret = mlx5_nic_vport_update_local_lb(dev, false); |
584 | 583 | ||
585 | return ret; | 584 | return ret; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c index d653b0025b13..a1296a62497d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c | |||
@@ -908,23 +908,33 @@ int mlx5_nic_vport_update_local_lb(struct mlx5_core_dev *mdev, bool enable) | |||
908 | void *in; | 908 | void *in; |
909 | int err; | 909 | int err; |
910 | 910 | ||
911 | mlx5_core_dbg(mdev, "%s local_lb\n", enable ? "enable" : "disable"); | 911 | if (!MLX5_CAP_GEN(mdev, disable_local_lb_mc) && |
912 | !MLX5_CAP_GEN(mdev, disable_local_lb_uc)) | ||
913 | return 0; | ||
914 | |||
912 | in = kvzalloc(inlen, GFP_KERNEL); | 915 | in = kvzalloc(inlen, GFP_KERNEL); |
913 | if (!in) | 916 | if (!in) |
914 | return -ENOMEM; | 917 | return -ENOMEM; |
915 | 918 | ||
916 | MLX5_SET(modify_nic_vport_context_in, in, | 919 | MLX5_SET(modify_nic_vport_context_in, in, |
917 | field_select.disable_mc_local_lb, 1); | ||
918 | MLX5_SET(modify_nic_vport_context_in, in, | ||
919 | nic_vport_context.disable_mc_local_lb, !enable); | 920 | nic_vport_context.disable_mc_local_lb, !enable); |
920 | |||
921 | MLX5_SET(modify_nic_vport_context_in, in, | ||
922 | field_select.disable_uc_local_lb, 1); | ||
923 | MLX5_SET(modify_nic_vport_context_in, in, | 921 | MLX5_SET(modify_nic_vport_context_in, in, |
924 | nic_vport_context.disable_uc_local_lb, !enable); | 922 | nic_vport_context.disable_uc_local_lb, !enable); |
925 | 923 | ||
924 | if (MLX5_CAP_GEN(mdev, disable_local_lb_mc)) | ||
925 | MLX5_SET(modify_nic_vport_context_in, in, | ||
926 | field_select.disable_mc_local_lb, 1); | ||
927 | |||
928 | if (MLX5_CAP_GEN(mdev, disable_local_lb_uc)) | ||
929 | MLX5_SET(modify_nic_vport_context_in, in, | ||
930 | field_select.disable_uc_local_lb, 1); | ||
931 | |||
926 | err = mlx5_modify_nic_vport_context(mdev, in, inlen); | 932 | err = mlx5_modify_nic_vport_context(mdev, in, inlen); |
927 | 933 | ||
934 | if (!err) | ||
935 | mlx5_core_dbg(mdev, "%s local_lb\n", | ||
936 | enable ? "enable" : "disable"); | ||
937 | |||
928 | kvfree(in); | 938 | kvfree(in); |
929 | return err; | 939 | return err; |
930 | } | 940 | } |
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h index d44ec5f41d4a..1391a82da98e 100644 --- a/include/linux/mlx5/mlx5_ifc.h +++ b/include/linux/mlx5/mlx5_ifc.h | |||
@@ -1027,8 +1027,9 @@ struct mlx5_ifc_cmd_hca_cap_bits { | |||
1027 | u8 log_max_wq_sz[0x5]; | 1027 | u8 log_max_wq_sz[0x5]; |
1028 | 1028 | ||
1029 | u8 nic_vport_change_event[0x1]; | 1029 | u8 nic_vport_change_event[0x1]; |
1030 | u8 disable_local_lb[0x1]; | 1030 | u8 disable_local_lb_uc[0x1]; |
1031 | u8 reserved_at_3e2[0x9]; | 1031 | u8 disable_local_lb_mc[0x1]; |
1032 | u8 reserved_at_3e3[0x8]; | ||
1032 | u8 log_max_vlan_list[0x5]; | 1033 | u8 log_max_vlan_list[0x5]; |
1033 | u8 reserved_at_3f0[0x3]; | 1034 | u8 reserved_at_3f0[0x3]; |
1034 | u8 log_max_current_mc_list[0x5]; | 1035 | u8 log_max_current_mc_list[0x5]; |