net/mlx5: Don't write read-only fields in MODIFY_HCA_VPORT_CONTEXT command
authorLeon Romanovsky <leonro@mellanox.com>
Wed, 13 Nov 2019 10:03:47 +0000 (12:03 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 22 Nov 2019 21:18:19 +0000 (13:18 -0800)
The MODIFY_HCA_VPORT_CONTEXT uses field_selector to mask fields needed
to be written, other fields are required to be zero according to the
HW specification. The supported fields are controlled by bitfield
and limited to vport state, node and port GUIDs.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/vport.c

index 30f7848a6f88b84ceb36a3ba74a444eee3285652..1faac31f74d0a76ad0371f4250f6ae379c565e50 100644 (file)
@@ -1064,26 +1064,13 @@ int mlx5_core_modify_hca_vport_context(struct mlx5_core_dev *dev,
 
        ctx = MLX5_ADDR_OF(modify_hca_vport_context_in, in, hca_vport_context);
        MLX5_SET(hca_vport_context, ctx, field_select, req->field_select);
-       MLX5_SET(hca_vport_context, ctx, sm_virt_aware, req->sm_virt_aware);
-       MLX5_SET(hca_vport_context, ctx, has_smi, req->has_smi);
-       MLX5_SET(hca_vport_context, ctx, has_raw, req->has_raw);
-       MLX5_SET(hca_vport_context, ctx, vport_state_policy, req->policy);
-       MLX5_SET(hca_vport_context, ctx, port_physical_state, req->phys_state);
-       MLX5_SET(hca_vport_context, ctx, vport_state, req->vport_state);
-       MLX5_SET64(hca_vport_context, ctx, port_guid, req->port_guid);
-       MLX5_SET64(hca_vport_context, ctx, node_guid, req->node_guid);
-       MLX5_SET(hca_vport_context, ctx, cap_mask1, req->cap_mask1);
-       MLX5_SET(hca_vport_context, ctx, cap_mask1_field_select, req->cap_mask1_perm);
-       MLX5_SET(hca_vport_context, ctx, cap_mask2, req->cap_mask2);
-       MLX5_SET(hca_vport_context, ctx, cap_mask2_field_select, req->cap_mask2_perm);
-       MLX5_SET(hca_vport_context, ctx, lid, req->lid);
-       MLX5_SET(hca_vport_context, ctx, init_type_reply, req->init_type_reply);
-       MLX5_SET(hca_vport_context, ctx, lmc, req->lmc);
-       MLX5_SET(hca_vport_context, ctx, subnet_timeout, req->subnet_timeout);
-       MLX5_SET(hca_vport_context, ctx, sm_lid, req->sm_lid);
-       MLX5_SET(hca_vport_context, ctx, sm_sl, req->sm_sl);
-       MLX5_SET(hca_vport_context, ctx, qkey_violation_counter, req->qkey_violation_counter);
-       MLX5_SET(hca_vport_context, ctx, pkey_violation_counter, req->pkey_violation_counter);
+       if (req->field_select & MLX5_HCA_VPORT_SEL_STATE_POLICY)
+               MLX5_SET(hca_vport_context, ctx, vport_state_policy,
+                        req->policy);
+       if (req->field_select & MLX5_HCA_VPORT_SEL_PORT_GUID)
+               MLX5_SET64(hca_vport_context, ctx, port_guid, req->port_guid);
+       if (req->field_select & MLX5_HCA_VPORT_SEL_NODE_GUID)
+               MLX5_SET64(hca_vport_context, ctx, node_guid, req->node_guid);
        err = mlx5_cmd_exec(dev, in, in_sz, out, sizeof(out));
 ex:
        kfree(in);