diff options
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 77 |
1 files changed, 40 insertions, 37 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c index f991f669047e..a53e982a6863 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | |||
@@ -906,21 +906,34 @@ static int esw_inline_mode_to_devlink(u8 mlx5_mode, u8 *mode) | |||
906 | return 0; | 906 | return 0; |
907 | } | 907 | } |
908 | 908 | ||
909 | int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode) | 909 | static int mlx5_devlink_eswitch_check(struct devlink *devlink) |
910 | { | 910 | { |
911 | struct mlx5_core_dev *dev; | 911 | struct mlx5_core_dev *dev = devlink_priv(devlink); |
912 | u16 cur_mlx5_mode, mlx5_mode = 0; | ||
913 | 912 | ||
914 | dev = devlink_priv(devlink); | 913 | if (MLX5_CAP_GEN(dev, port_type) != MLX5_CAP_PORT_TYPE_ETH) |
914 | return -EOPNOTSUPP; | ||
915 | 915 | ||
916 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) | 916 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) |
917 | return -EOPNOTSUPP; | 917 | return -EOPNOTSUPP; |
918 | 918 | ||
919 | cur_mlx5_mode = dev->priv.eswitch->mode; | 919 | if (dev->priv.eswitch->mode == SRIOV_NONE) |
920 | |||
921 | if (cur_mlx5_mode == SRIOV_NONE) | ||
922 | return -EOPNOTSUPP; | 920 | return -EOPNOTSUPP; |
923 | 921 | ||
922 | return 0; | ||
923 | } | ||
924 | |||
925 | int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode) | ||
926 | { | ||
927 | struct mlx5_core_dev *dev = devlink_priv(devlink); | ||
928 | u16 cur_mlx5_mode, mlx5_mode = 0; | ||
929 | int err; | ||
930 | |||
931 | err = mlx5_devlink_eswitch_check(devlink); | ||
932 | if (err) | ||
933 | return err; | ||
934 | |||
935 | cur_mlx5_mode = dev->priv.eswitch->mode; | ||
936 | |||
924 | if (esw_mode_from_devlink(mode, &mlx5_mode)) | 937 | if (esw_mode_from_devlink(mode, &mlx5_mode)) |
925 | return -EINVAL; | 938 | return -EINVAL; |
926 | 939 | ||
@@ -937,15 +950,12 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode) | |||
937 | 950 | ||
938 | int mlx5_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode) | 951 | int mlx5_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode) |
939 | { | 952 | { |
940 | struct mlx5_core_dev *dev; | 953 | struct mlx5_core_dev *dev = devlink_priv(devlink); |
941 | 954 | int err; | |
942 | dev = devlink_priv(devlink); | ||
943 | |||
944 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) | ||
945 | return -EOPNOTSUPP; | ||
946 | 955 | ||
947 | if (dev->priv.eswitch->mode == SRIOV_NONE) | 956 | err = mlx5_devlink_eswitch_check(devlink); |
948 | return -EOPNOTSUPP; | 957 | if (err) |
958 | return err; | ||
949 | 959 | ||
950 | return esw_mode_to_devlink(dev->priv.eswitch->mode, mode); | 960 | return esw_mode_to_devlink(dev->priv.eswitch->mode, mode); |
951 | } | 961 | } |
@@ -954,15 +964,12 @@ int mlx5_devlink_eswitch_inline_mode_set(struct devlink *devlink, u8 mode) | |||
954 | { | 964 | { |
955 | struct mlx5_core_dev *dev = devlink_priv(devlink); | 965 | struct mlx5_core_dev *dev = devlink_priv(devlink); |
956 | struct mlx5_eswitch *esw = dev->priv.eswitch; | 966 | struct mlx5_eswitch *esw = dev->priv.eswitch; |
957 | int num_vports = esw->enabled_vports; | ||
958 | int err, vport; | 967 | int err, vport; |
959 | u8 mlx5_mode; | 968 | u8 mlx5_mode; |
960 | 969 | ||
961 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) | 970 | err = mlx5_devlink_eswitch_check(devlink); |
962 | return -EOPNOTSUPP; | 971 | if (err) |
963 | 972 | return err; | |
964 | if (esw->mode == SRIOV_NONE) | ||
965 | return -EOPNOTSUPP; | ||
966 | 973 | ||
967 | switch (MLX5_CAP_ETH(dev, wqe_inline_mode)) { | 974 | switch (MLX5_CAP_ETH(dev, wqe_inline_mode)) { |
968 | case MLX5_CAP_INLINE_MODE_NOT_REQUIRED: | 975 | case MLX5_CAP_INLINE_MODE_NOT_REQUIRED: |
@@ -985,7 +992,7 @@ int mlx5_devlink_eswitch_inline_mode_set(struct devlink *devlink, u8 mode) | |||
985 | if (err) | 992 | if (err) |
986 | goto out; | 993 | goto out; |
987 | 994 | ||
988 | for (vport = 1; vport < num_vports; vport++) { | 995 | for (vport = 1; vport < esw->enabled_vports; vport++) { |
989 | err = mlx5_modify_nic_vport_min_inline(dev, vport, mlx5_mode); | 996 | err = mlx5_modify_nic_vport_min_inline(dev, vport, mlx5_mode); |
990 | if (err) { | 997 | if (err) { |
991 | esw_warn(dev, "Failed to set min inline on vport %d\n", | 998 | esw_warn(dev, "Failed to set min inline on vport %d\n", |
@@ -1010,12 +1017,11 @@ int mlx5_devlink_eswitch_inline_mode_get(struct devlink *devlink, u8 *mode) | |||
1010 | { | 1017 | { |
1011 | struct mlx5_core_dev *dev = devlink_priv(devlink); | 1018 | struct mlx5_core_dev *dev = devlink_priv(devlink); |
1012 | struct mlx5_eswitch *esw = dev->priv.eswitch; | 1019 | struct mlx5_eswitch *esw = dev->priv.eswitch; |
1020 | int err; | ||
1013 | 1021 | ||
1014 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) | 1022 | err = mlx5_devlink_eswitch_check(devlink); |
1015 | return -EOPNOTSUPP; | 1023 | if (err) |
1016 | 1024 | return err; | |
1017 | if (esw->mode == SRIOV_NONE) | ||
1018 | return -EOPNOTSUPP; | ||
1019 | 1025 | ||
1020 | return esw_inline_mode_to_devlink(esw->offloads.inline_mode, mode); | 1026 | return esw_inline_mode_to_devlink(esw->offloads.inline_mode, mode); |
1021 | } | 1027 | } |
@@ -1062,11 +1068,9 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink, u8 encap) | |||
1062 | struct mlx5_eswitch *esw = dev->priv.eswitch; | 1068 | struct mlx5_eswitch *esw = dev->priv.eswitch; |
1063 | int err; | 1069 | int err; |
1064 | 1070 | ||
1065 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) | 1071 | err = mlx5_devlink_eswitch_check(devlink); |
1066 | return -EOPNOTSUPP; | 1072 | if (err) |
1067 | 1073 | return err; | |
1068 | if (esw->mode == SRIOV_NONE) | ||
1069 | return -EOPNOTSUPP; | ||
1070 | 1074 | ||
1071 | if (encap != DEVLINK_ESWITCH_ENCAP_MODE_NONE && | 1075 | if (encap != DEVLINK_ESWITCH_ENCAP_MODE_NONE && |
1072 | (!MLX5_CAP_ESW_FLOWTABLE_FDB(dev, encap) || | 1076 | (!MLX5_CAP_ESW_FLOWTABLE_FDB(dev, encap) || |
@@ -1105,12 +1109,11 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, u8 *encap) | |||
1105 | { | 1109 | { |
1106 | struct mlx5_core_dev *dev = devlink_priv(devlink); | 1110 | struct mlx5_core_dev *dev = devlink_priv(devlink); |
1107 | struct mlx5_eswitch *esw = dev->priv.eswitch; | 1111 | struct mlx5_eswitch *esw = dev->priv.eswitch; |
1112 | int err; | ||
1108 | 1113 | ||
1109 | if (!MLX5_CAP_GEN(dev, vport_group_manager)) | 1114 | err = mlx5_devlink_eswitch_check(devlink); |
1110 | return -EOPNOTSUPP; | 1115 | if (err) |
1111 | 1116 | return err; | |
1112 | if (esw->mode == SRIOV_NONE) | ||
1113 | return -EOPNOTSUPP; | ||
1114 | 1117 | ||
1115 | *encap = esw->offloads.encap; | 1118 | *encap = esw->offloads.encap; |
1116 | return 0; | 1119 | return 0; |