net/mlx5: E-Switch, Avoid setup attempt if not being e-switch manager
[ Upstream commit 0efc8562491b7d36f6bbc4fbc8f3348cb6641e9c ] In smartnic env, the host (PF) driver might not be an e-switch manager, hence the FW will err on driver attempts to deal with setting/unsetting the eswitch and as a result the overall setup of sriov will fail. Fix that by avoiding the operation if e-switch management is not allowed for this driver instance. While here, move to use the correct name for the esw manager capability name. Fixes: 81848731ff40 ('net/mlx5: E-Switch, Add SR-IOV (FDB) support') Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Reported-by: Guy Kushnir <guyk@mellanox.com> Reviewed-by: Eli Cohen <eli@melloanox.com> Tested-by: Eli Cohen <eli@melloanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b216867c02
commit
c3994f4f8b
@ -726,7 +726,7 @@ static bool mlx5e_is_vf_vport_rep(struct mlx5e_priv *priv)
|
||||
struct mlx5e_rep_priv *rpriv = priv->ppriv;
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
|
||||
if (!MLX5_CAP_GEN(priv->mdev, eswitch_flow_table))
|
||||
if (!MLX5_ESWITCH_MANAGER(priv->mdev))
|
||||
return false;
|
||||
|
||||
rep = rpriv->rep;
|
||||
|
@ -1535,7 +1535,7 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
|
||||
if (!ESW_ALLOWED(esw))
|
||||
return 0;
|
||||
|
||||
if (!MLX5_CAP_GEN(esw->dev, eswitch_flow_table) ||
|
||||
if (!MLX5_ESWITCH_MANAGER(esw->dev) ||
|
||||
!MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, ft_support)) {
|
||||
esw_warn(esw->dev, "E-Switch FDB is not supported, aborting ...\n");
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -39,6 +39,8 @@
|
||||
#include <linux/mlx5/device.h>
|
||||
#include "lib/mpfs.h"
|
||||
|
||||
#define MLX5_ESWITCH_MANAGER(mdev) MLX5_CAP_GEN(mdev, eswitch_manager)
|
||||
|
||||
enum {
|
||||
SRIOV_NONE,
|
||||
SRIOV_LEGACY,
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "mlx5_core.h"
|
||||
#include "fs_core.h"
|
||||
#include "fs_cmd.h"
|
||||
#include "eswitch.h"
|
||||
#include "diag/fs_tracepoint.h"
|
||||
|
||||
#define INIT_TREE_NODE_ARRAY_SIZE(...) (sizeof((struct init_tree_node[]){__VA_ARGS__}) /\
|
||||
@ -2211,7 +2212,7 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (MLX5_CAP_GEN(dev, eswitch_flow_table)) {
|
||||
if (MLX5_ESWITCH_MANAGER(dev)) {
|
||||
if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, ft_support)) {
|
||||
err = init_fdb_root_ns(steering);
|
||||
if (err)
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <linux/mlx5/cmd.h>
|
||||
#include <linux/module.h>
|
||||
#include "mlx5_core.h"
|
||||
#include "eswitch.h"
|
||||
#include "../../mlxfw/mlxfw.h"
|
||||
|
||||
static int mlx5_cmd_query_adapter(struct mlx5_core_dev *dev, u32 *out,
|
||||
@ -152,13 +153,13 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev)
|
||||
}
|
||||
|
||||
if (MLX5_CAP_GEN(dev, vport_group_manager) &&
|
||||
MLX5_CAP_GEN(dev, eswitch_flow_table)) {
|
||||
MLX5_ESWITCH_MANAGER(dev)) {
|
||||
err = mlx5_core_get_caps(dev, MLX5_CAP_ESWITCH_FLOW_TABLE);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (MLX5_CAP_GEN(dev, eswitch_flow_table)) {
|
||||
if (MLX5_ESWITCH_MANAGER(dev)) {
|
||||
err = mlx5_core_get_caps(dev, MLX5_CAP_ESWITCH);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -88,6 +88,9 @@ static int mlx5_device_enable_sriov(struct mlx5_core_dev *dev, int num_vfs)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (!MLX5_ESWITCH_MANAGER(dev))
|
||||
goto enable_vfs_hca;
|
||||
|
||||
err = mlx5_eswitch_enable_sriov(dev->priv.eswitch, num_vfs, SRIOV_LEGACY);
|
||||
if (err) {
|
||||
mlx5_core_warn(dev,
|
||||
@ -95,6 +98,7 @@ static int mlx5_device_enable_sriov(struct mlx5_core_dev *dev, int num_vfs)
|
||||
return err;
|
||||
}
|
||||
|
||||
enable_vfs_hca:
|
||||
for (vf = 0; vf < num_vfs; vf++) {
|
||||
err = mlx5_core_enable_hca(dev, vf + 1);
|
||||
if (err) {
|
||||
@ -140,7 +144,8 @@ static void mlx5_device_disable_sriov(struct mlx5_core_dev *dev)
|
||||
}
|
||||
|
||||
out:
|
||||
mlx5_eswitch_disable_sriov(dev->priv.eswitch);
|
||||
if (MLX5_ESWITCH_MANAGER(dev))
|
||||
mlx5_eswitch_disable_sriov(dev->priv.eswitch);
|
||||
|
||||
if (mlx5_wait_for_vf_pages(dev))
|
||||
mlx5_core_warn(dev, "timeout reclaiming VFs pages\n");
|
||||
|
@ -857,7 +857,7 @@ struct mlx5_ifc_cmd_hca_cap_bits {
|
||||
u8 reserved_at_1a4[0x1];
|
||||
u8 ets[0x1];
|
||||
u8 nic_flow_table[0x1];
|
||||
u8 eswitch_flow_table[0x1];
|
||||
u8 eswitch_manager[0x1];
|
||||
u8 early_vf_enable[0x1];
|
||||
u8 mcam_reg[0x1];
|
||||
u8 pcam_reg[0x1];
|
||||
|
Loading…
x
Reference in New Issue
Block a user