@@ -838,6 +838,7 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
838838 struct mlx5_flow_handle * flow_rule ;
839839 struct mlx5_flow_spec * spec ;
840840 void * misc ;
841+ u16 vport ;
841842
842843 spec = kvzalloc (sizeof (* spec ), GFP_KERNEL );
843844 if (!spec ) {
@@ -847,20 +848,43 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
847848
848849 misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters );
849850 MLX5_SET (fte_match_set_misc , misc , source_sqn , sqn );
850- /* source vport is the esw manager */
851- MLX5_SET (fte_match_set_misc , misc , source_port , from_esw -> manager_vport );
852- if (MLX5_CAP_ESW (on_esw -> dev , merged_eswitch ))
853- MLX5_SET (fte_match_set_misc , misc , source_eswitch_owner_vhca_id ,
854- MLX5_CAP_GEN (from_esw -> dev , vhca_id ));
855851
856852 misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters );
857853 MLX5_SET_TO_ONES (fte_match_set_misc , misc , source_sqn );
858- MLX5_SET_TO_ONES (fte_match_set_misc , misc , source_port );
859- if (MLX5_CAP_ESW (on_esw -> dev , merged_eswitch ))
860- MLX5_SET_TO_ONES (fte_match_set_misc , misc ,
861- source_eswitch_owner_vhca_id );
862854
863855 spec -> match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS ;
856+
857+ /* source vport is the esw manager */
858+ vport = from_esw -> manager_vport ;
859+
860+ if (mlx5_eswitch_vport_match_metadata_enabled (on_esw )) {
861+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters_2 );
862+ MLX5_SET (fte_match_set_misc2 , misc , metadata_reg_c_0 ,
863+ mlx5_eswitch_get_vport_metadata_for_match (from_esw , vport ));
864+
865+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters_2 );
866+ MLX5_SET (fte_match_set_misc2 , misc , metadata_reg_c_0 ,
867+ mlx5_eswitch_get_vport_metadata_mask ());
868+
869+ spec -> match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2 ;
870+ } else {
871+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters );
872+ MLX5_SET (fte_match_set_misc , misc , source_port , vport );
873+
874+ if (MLX5_CAP_ESW (on_esw -> dev , merged_eswitch ))
875+ MLX5_SET (fte_match_set_misc , misc , source_eswitch_owner_vhca_id ,
876+ MLX5_CAP_GEN (from_esw -> dev , vhca_id ));
877+
878+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters );
879+ MLX5_SET_TO_ONES (fte_match_set_misc , misc , source_port );
880+
881+ if (MLX5_CAP_ESW (on_esw -> dev , merged_eswitch ))
882+ MLX5_SET_TO_ONES (fte_match_set_misc , misc ,
883+ source_eswitch_owner_vhca_id );
884+
885+ spec -> match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS ;
886+ }
887+
864888 dest .type = MLX5_FLOW_DESTINATION_TYPE_VPORT ;
865889 dest .vport .num = rep -> vport ;
866890 dest .vport .vhca_id = MLX5_CAP_GEN (rep -> esw -> dev , vhca_id );
@@ -1270,7 +1294,8 @@ esw_add_restore_rule(struct mlx5_eswitch *esw, u32 tag)
12701294#define MAX_SQ_NVPORTS 32
12711295
12721296static void esw_set_flow_group_source_port (struct mlx5_eswitch * esw ,
1273- u32 * flow_group_in )
1297+ u32 * flow_group_in ,
1298+ int match_params )
12741299{
12751300 void * match_criteria = MLX5_ADDR_OF (create_flow_group_in ,
12761301 flow_group_in ,
@@ -1279,15 +1304,15 @@ static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
12791304 if (mlx5_eswitch_vport_match_metadata_enabled (esw )) {
12801305 MLX5_SET (create_flow_group_in , flow_group_in ,
12811306 match_criteria_enable ,
1282- MLX5_MATCH_MISC_PARAMETERS_2 );
1307+ MLX5_MATCH_MISC_PARAMETERS_2 | match_params );
12831308
12841309 MLX5_SET (fte_match_param , match_criteria ,
12851310 misc_parameters_2 .metadata_reg_c_0 ,
12861311 mlx5_eswitch_get_vport_metadata_mask ());
12871312 } else {
12881313 MLX5_SET (create_flow_group_in , flow_group_in ,
12891314 match_criteria_enable ,
1290- MLX5_MATCH_MISC_PARAMETERS );
1315+ MLX5_MATCH_MISC_PARAMETERS | match_params );
12911316
12921317 MLX5_SET_TO_ONES (fte_match_param , match_criteria ,
12931318 misc_parameters .source_port );
@@ -1463,14 +1488,13 @@ esw_create_send_to_vport_group(struct mlx5_eswitch *esw,
14631488
14641489 memset (flow_group_in , 0 , inlen );
14651490
1466- MLX5_SET (create_flow_group_in , flow_group_in , match_criteria_enable ,
1467- MLX5_MATCH_MISC_PARAMETERS );
1491+ esw_set_flow_group_source_port (esw , flow_group_in , MLX5_MATCH_MISC_PARAMETERS );
14681492
14691493 match_criteria = MLX5_ADDR_OF (create_flow_group_in , flow_group_in , match_criteria );
1470-
14711494 MLX5_SET_TO_ONES (fte_match_param , match_criteria , misc_parameters .source_sqn );
1472- MLX5_SET_TO_ONES (fte_match_param , match_criteria , misc_parameters .source_port );
1473- if (MLX5_CAP_ESW (esw -> dev , merged_eswitch )) {
1495+
1496+ if (!mlx5_eswitch_vport_match_metadata_enabled (esw ) &&
1497+ MLX5_CAP_ESW (esw -> dev , merged_eswitch )) {
14741498 MLX5_SET_TO_ONES (fte_match_param , match_criteria ,
14751499 misc_parameters .source_eswitch_owner_vhca_id );
14761500 MLX5_SET (create_flow_group_in , flow_group_in ,
@@ -1558,7 +1582,7 @@ esw_create_peer_esw_miss_group(struct mlx5_eswitch *esw,
15581582
15591583 memset (flow_group_in , 0 , inlen );
15601584
1561- esw_set_flow_group_source_port (esw , flow_group_in );
1585+ esw_set_flow_group_source_port (esw , flow_group_in , 0 );
15621586
15631587 if (!mlx5_eswitch_vport_match_metadata_enabled (esw )) {
15641588 match_criteria = MLX5_ADDR_OF (create_flow_group_in ,
@@ -1845,7 +1869,7 @@ static int esw_create_vport_rx_group(struct mlx5_eswitch *esw)
18451869 return - ENOMEM ;
18461870
18471871 /* create vport rx group */
1848- esw_set_flow_group_source_port (esw , flow_group_in );
1872+ esw_set_flow_group_source_port (esw , flow_group_in , 0 );
18491873
18501874 MLX5_SET (create_flow_group_in , flow_group_in , start_flow_index , 0 );
18511875 MLX5_SET (create_flow_group_in , flow_group_in , end_flow_index , nvports - 1 );
0 commit comments