From: Erez Shitrit <ere...@nvidia.com>

eswitch_owner_vhca_id_valid value should be set to 1 only on
merged-eswitch device.

Signed-off-by: Erez Shitrit <ere...@nvidia.com>
Acked-by: Matan Azrad <ma...@nvidia.com>
---
 drivers/net/mlx5/hws/mlx5dr_action.c | 12 ++++++++++++
 drivers/net/mlx5/hws/mlx5dr_cmd.c    |  3 ++-
 drivers/net/mlx5/hws/mlx5dr_cmd.h    |  1 +
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/hws/mlx5dr_action.c 
b/drivers/net/mlx5/hws/mlx5dr_action.c
index 90f2f17bd0..03c3683f71 100644
--- a/drivers/net/mlx5/hws/mlx5dr_action.c
+++ b/drivers/net/mlx5/hws/mlx5dr_action.c
@@ -680,6 +680,8 @@ mlx5dr_action_fixup_stc_attr(struct mlx5dr_context *ctx,
                        fixup_stc_attr->stc_offset = stc_attr->stc_offset;
                        fixup_stc_attr->vport.esw_owner_vhca_id = 
ctx->caps->vhca_id;
                        fixup_stc_attr->vport.vport_num = 
ctx->caps->eswitch_manager_vport_number;
+                       fixup_stc_attr->vport.eswitch_owner_vhca_id_valid =
+                               ctx->caps->merged_eswitch;
                        use_fixup = true;
                }
                break;
@@ -700,6 +702,8 @@ mlx5dr_action_fixup_stc_attr(struct mlx5dr_context *ctx,
                        fixup_stc_attr->stc_offset = stc_attr->stc_offset;
                        fixup_stc_attr->vport.vport_num = 0;
                        fixup_stc_attr->vport.esw_owner_vhca_id = 
stc_attr->vport.esw_owner_vhca_id;
+                       fixup_stc_attr->vport.eswitch_owner_vhca_id_valid =
+                               ctx->caps->merged_eswitch;
                }
                use_fixup = true;
                break;
@@ -1429,6 +1433,14 @@ static int mlx5dr_action_create_dest_vport_hws(struct 
mlx5dr_context *ctx,
        action->vport.vport_num = vport_caps.vport_num;
        action->vport.esw_owner_vhca_id = vport_caps.esw_owner_vhca_id;
 
+       if (!ctx->caps->merged_eswitch &&
+           action->vport.esw_owner_vhca_id != ctx->caps->vhca_id) {
+               DR_LOG(ERR, "Not merged-eswitch (%d), not allowed to send to 
other vhca_id (%d)",
+                      ctx->caps->vhca_id, action->vport.esw_owner_vhca_id);
+               rte_errno = ENOTSUP;
+               return rte_errno;
+       }
+
        ret = mlx5dr_action_create_stcs(action, NULL);
        if (ret) {
                DR_LOG(ERR, "Failed creating stc for port %d", ib_port_num);
diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.c 
b/drivers/net/mlx5/hws/mlx5dr_cmd.c
index 666d678b42..72fc9e3d91 100644
--- a/drivers/net/mlx5/hws/mlx5dr_cmd.c
+++ b/drivers/net/mlx5/hws/mlx5dr_cmd.c
@@ -515,7 +515,8 @@ mlx5dr_cmd_stc_modify_set_stc_param(struct 
mlx5dr_cmd_stc_modify_attr *stc_attr,
                         stc_attr->vport.vport_num);
                MLX5_SET(stc_ste_param_vport, stc_param, eswitch_owner_vhca_id,
                         stc_attr->vport.esw_owner_vhca_id);
-               MLX5_SET(stc_ste_param_vport, stc_param, 
eswitch_owner_vhca_id_valid, 1);
+               MLX5_SET(stc_ste_param_vport, stc_param, 
eswitch_owner_vhca_id_valid,
+                        stc_attr->vport.eswitch_owner_vhca_id_valid);
                break;
        case MLX5_IFC_STC_ACTION_TYPE_DROP:
        case MLX5_IFC_STC_ACTION_TYPE_NOP:
diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.h 
b/drivers/net/mlx5/hws/mlx5dr_cmd.h
index ea5d346d8e..54840ec445 100644
--- a/drivers/net/mlx5/hws/mlx5dr_cmd.h
+++ b/drivers/net/mlx5/hws/mlx5dr_cmd.h
@@ -133,6 +133,7 @@ struct mlx5dr_cmd_stc_modify_attr {
                struct {
                        uint16_t vport_num;
                        uint16_t esw_owner_vhca_id;
+                       uint8_t eswitch_owner_vhca_id_valid;
                } vport;
                struct {
                        struct mlx5dr_pool_chunk ste;
-- 
2.39.3

Reply via email to