diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.c | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.h | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | 28 |
4 files changed, 33 insertions, 18 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index a6533d42b285..bcbe07ec22be 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
| @@ -790,7 +790,8 @@ mlxsw_devlink_sb_pool_set(struct devlink *devlink, | |||
| 790 | if (!mlxsw_driver->sb_pool_set) | 790 | if (!mlxsw_driver->sb_pool_set) |
| 791 | return -EOPNOTSUPP; | 791 | return -EOPNOTSUPP; |
| 792 | return mlxsw_driver->sb_pool_set(mlxsw_core, sb_index, | 792 | return mlxsw_driver->sb_pool_set(mlxsw_core, sb_index, |
| 793 | pool_index, size, threshold_type); | 793 | pool_index, size, threshold_type, |
| 794 | extack); | ||
| 794 | } | 795 | } |
| 795 | 796 | ||
| 796 | static void *__dl_port(struct devlink_port *devlink_port) | 797 | static void *__dl_port(struct devlink_port *devlink_port) |
| @@ -841,7 +842,7 @@ static int mlxsw_devlink_sb_port_pool_set(struct devlink_port *devlink_port, | |||
| 841 | !mlxsw_core_port_check(mlxsw_core_port)) | 842 | !mlxsw_core_port_check(mlxsw_core_port)) |
| 842 | return -EOPNOTSUPP; | 843 | return -EOPNOTSUPP; |
| 843 | return mlxsw_driver->sb_port_pool_set(mlxsw_core_port, sb_index, | 844 | return mlxsw_driver->sb_port_pool_set(mlxsw_core_port, sb_index, |
| 844 | pool_index, threshold); | 845 | pool_index, threshold, extack); |
| 845 | } | 846 | } |
| 846 | 847 | ||
| 847 | static int | 848 | static int |
| @@ -878,7 +879,7 @@ mlxsw_devlink_sb_tc_pool_bind_set(struct devlink_port *devlink_port, | |||
| 878 | return -EOPNOTSUPP; | 879 | return -EOPNOTSUPP; |
| 879 | return mlxsw_driver->sb_tc_pool_bind_set(mlxsw_core_port, sb_index, | 880 | return mlxsw_driver->sb_tc_pool_bind_set(mlxsw_core_port, sb_index, |
| 880 | tc_index, pool_type, | 881 | tc_index, pool_type, |
| 881 | pool_index, threshold); | 882 | pool_index, threshold, extack); |
| 882 | } | 883 | } |
| 883 | 884 | ||
| 884 | static int mlxsw_devlink_sb_occ_snapshot(struct devlink *devlink, | 885 | static int mlxsw_devlink_sb_occ_snapshot(struct devlink *devlink, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h index d51dfc3560b6..917be621c904 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.h +++ b/drivers/net/ethernet/mellanox/mlxsw/core.h | |||
| @@ -254,13 +254,14 @@ struct mlxsw_driver { | |||
| 254 | struct devlink_sb_pool_info *pool_info); | 254 | struct devlink_sb_pool_info *pool_info); |
| 255 | int (*sb_pool_set)(struct mlxsw_core *mlxsw_core, | 255 | int (*sb_pool_set)(struct mlxsw_core *mlxsw_core, |
| 256 | unsigned int sb_index, u16 pool_index, u32 size, | 256 | unsigned int sb_index, u16 pool_index, u32 size, |
| 257 | enum devlink_sb_threshold_type threshold_type); | 257 | enum devlink_sb_threshold_type threshold_type, |
| 258 | struct netlink_ext_ack *extack); | ||
| 258 | int (*sb_port_pool_get)(struct mlxsw_core_port *mlxsw_core_port, | 259 | int (*sb_port_pool_get)(struct mlxsw_core_port *mlxsw_core_port, |
| 259 | unsigned int sb_index, u16 pool_index, | 260 | unsigned int sb_index, u16 pool_index, |
| 260 | u32 *p_threshold); | 261 | u32 *p_threshold); |
| 261 | int (*sb_port_pool_set)(struct mlxsw_core_port *mlxsw_core_port, | 262 | int (*sb_port_pool_set)(struct mlxsw_core_port *mlxsw_core_port, |
| 262 | unsigned int sb_index, u16 pool_index, | 263 | unsigned int sb_index, u16 pool_index, |
| 263 | u32 threshold); | 264 | u32 threshold, struct netlink_ext_ack *extack); |
| 264 | int (*sb_tc_pool_bind_get)(struct mlxsw_core_port *mlxsw_core_port, | 265 | int (*sb_tc_pool_bind_get)(struct mlxsw_core_port *mlxsw_core_port, |
| 265 | unsigned int sb_index, u16 tc_index, | 266 | unsigned int sb_index, u16 tc_index, |
| 266 | enum devlink_sb_pool_type pool_type, | 267 | enum devlink_sb_pool_type pool_type, |
| @@ -268,7 +269,8 @@ struct mlxsw_driver { | |||
| 268 | int (*sb_tc_pool_bind_set)(struct mlxsw_core_port *mlxsw_core_port, | 269 | int (*sb_tc_pool_bind_set)(struct mlxsw_core_port *mlxsw_core_port, |
| 269 | unsigned int sb_index, u16 tc_index, | 270 | unsigned int sb_index, u16 tc_index, |
| 270 | enum devlink_sb_pool_type pool_type, | 271 | enum devlink_sb_pool_type pool_type, |
| 271 | u16 pool_index, u32 threshold); | 272 | u16 pool_index, u32 threshold, |
| 273 | struct netlink_ext_ack *extack); | ||
| 272 | int (*sb_occ_snapshot)(struct mlxsw_core *mlxsw_core, | 274 | int (*sb_occ_snapshot)(struct mlxsw_core *mlxsw_core, |
| 273 | unsigned int sb_index); | 275 | unsigned int sb_index); |
| 274 | int (*sb_occ_max_clear)(struct mlxsw_core *mlxsw_core, | 276 | int (*sb_occ_max_clear)(struct mlxsw_core *mlxsw_core, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h index da6278b0caa4..8601b3041acd 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h | |||
| @@ -371,13 +371,14 @@ int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core, | |||
| 371 | struct devlink_sb_pool_info *pool_info); | 371 | struct devlink_sb_pool_info *pool_info); |
| 372 | int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, | 372 | int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, |
| 373 | unsigned int sb_index, u16 pool_index, u32 size, | 373 | unsigned int sb_index, u16 pool_index, u32 size, |
| 374 | enum devlink_sb_threshold_type threshold_type); | 374 | enum devlink_sb_threshold_type threshold_type, |
| 375 | struct netlink_ext_ack *extack); | ||
| 375 | int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, | 376 | int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, |
| 376 | unsigned int sb_index, u16 pool_index, | 377 | unsigned int sb_index, u16 pool_index, |
| 377 | u32 *p_threshold); | 378 | u32 *p_threshold); |
| 378 | int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, | 379 | int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, |
| 379 | unsigned int sb_index, u16 pool_index, | 380 | unsigned int sb_index, u16 pool_index, |
| 380 | u32 threshold); | 381 | u32 threshold, struct netlink_ext_ack *extack); |
| 381 | int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, | 382 | int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, |
| 382 | unsigned int sb_index, u16 tc_index, | 383 | unsigned int sb_index, u16 tc_index, |
| 383 | enum devlink_sb_pool_type pool_type, | 384 | enum devlink_sb_pool_type pool_type, |
| @@ -385,7 +386,8 @@ int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, | |||
| 385 | int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, | 386 | int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, |
| 386 | unsigned int sb_index, u16 tc_index, | 387 | unsigned int sb_index, u16 tc_index, |
| 387 | enum devlink_sb_pool_type pool_type, | 388 | enum devlink_sb_pool_type pool_type, |
| 388 | u16 pool_index, u32 threshold); | 389 | u16 pool_index, u32 threshold, |
| 390 | struct netlink_ext_ack *extack); | ||
| 389 | int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, | 391 | int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, |
| 390 | unsigned int sb_index); | 392 | unsigned int sb_index); |
| 391 | int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, | 393 | int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c index d633bef5f105..3329f7037746 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/dcbnl.h> | 6 | #include <linux/dcbnl.h> |
| 7 | #include <linux/if_ether.h> | 7 | #include <linux/if_ether.h> |
| 8 | #include <linux/list.h> | 8 | #include <linux/list.h> |
| 9 | #include <linux/netlink.h> | ||
| 9 | 10 | ||
| 10 | #include "spectrum.h" | 11 | #include "spectrum.h" |
| 11 | #include "core.h" | 12 | #include "core.h" |
| @@ -900,14 +901,17 @@ int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core, | |||
| 900 | 901 | ||
| 901 | int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, | 902 | int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, |
| 902 | unsigned int sb_index, u16 pool_index, u32 size, | 903 | unsigned int sb_index, u16 pool_index, u32 size, |
| 903 | enum devlink_sb_threshold_type threshold_type) | 904 | enum devlink_sb_threshold_type threshold_type, |
| 905 | struct netlink_ext_ack *extack) | ||
| 904 | { | 906 | { |
| 905 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); | 907 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); |
| 906 | u32 pool_size = mlxsw_sp_bytes_cells(mlxsw_sp, size); | 908 | u32 pool_size = mlxsw_sp_bytes_cells(mlxsw_sp, size); |
| 907 | enum mlxsw_reg_sbpr_mode mode; | 909 | enum mlxsw_reg_sbpr_mode mode; |
| 908 | 910 | ||
| 909 | if (size > MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_BUFFER_SIZE)) | 911 | if (size > MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_BUFFER_SIZE)) { |
| 912 | NL_SET_ERR_MSG_MOD(extack, "Exceeded shared buffer size"); | ||
| 910 | return -EINVAL; | 913 | return -EINVAL; |
| 914 | } | ||
| 911 | 915 | ||
| 912 | mode = (enum mlxsw_reg_sbpr_mode) threshold_type; | 916 | mode = (enum mlxsw_reg_sbpr_mode) threshold_type; |
| 913 | return mlxsw_sp_sb_pr_write(mlxsw_sp, pool_index, mode, | 917 | return mlxsw_sp_sb_pr_write(mlxsw_sp, pool_index, mode, |
| @@ -927,7 +931,8 @@ static u32 mlxsw_sp_sb_threshold_out(struct mlxsw_sp *mlxsw_sp, u16 pool_index, | |||
| 927 | } | 931 | } |
| 928 | 932 | ||
| 929 | static int mlxsw_sp_sb_threshold_in(struct mlxsw_sp *mlxsw_sp, u16 pool_index, | 933 | static int mlxsw_sp_sb_threshold_in(struct mlxsw_sp *mlxsw_sp, u16 pool_index, |
| 930 | u32 threshold, u32 *p_max_buff) | 934 | u32 threshold, u32 *p_max_buff, |
| 935 | struct netlink_ext_ack *extack) | ||
| 931 | { | 936 | { |
| 932 | struct mlxsw_sp_sb_pr *pr = mlxsw_sp_sb_pr_get(mlxsw_sp, pool_index); | 937 | struct mlxsw_sp_sb_pr *pr = mlxsw_sp_sb_pr_get(mlxsw_sp, pool_index); |
| 933 | 938 | ||
| @@ -936,8 +941,10 @@ static int mlxsw_sp_sb_threshold_in(struct mlxsw_sp *mlxsw_sp, u16 pool_index, | |||
| 936 | 941 | ||
| 937 | val = threshold + MLXSW_SP_SB_THRESHOLD_TO_ALPHA_OFFSET; | 942 | val = threshold + MLXSW_SP_SB_THRESHOLD_TO_ALPHA_OFFSET; |
| 938 | if (val < MLXSW_REG_SBXX_DYN_MAX_BUFF_MIN || | 943 | if (val < MLXSW_REG_SBXX_DYN_MAX_BUFF_MIN || |
| 939 | val > MLXSW_REG_SBXX_DYN_MAX_BUFF_MAX) | 944 | val > MLXSW_REG_SBXX_DYN_MAX_BUFF_MAX) { |
| 945 | NL_SET_ERR_MSG_MOD(extack, "Invalid dynamic threshold value"); | ||
| 940 | return -EINVAL; | 946 | return -EINVAL; |
| 947 | } | ||
| 941 | *p_max_buff = val; | 948 | *p_max_buff = val; |
| 942 | } else { | 949 | } else { |
| 943 | *p_max_buff = mlxsw_sp_bytes_cells(mlxsw_sp, threshold); | 950 | *p_max_buff = mlxsw_sp_bytes_cells(mlxsw_sp, threshold); |
| @@ -963,7 +970,7 @@ int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, | |||
| 963 | 970 | ||
| 964 | int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, | 971 | int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, |
| 965 | unsigned int sb_index, u16 pool_index, | 972 | unsigned int sb_index, u16 pool_index, |
| 966 | u32 threshold) | 973 | u32 threshold, struct netlink_ext_ack *extack) |
| 967 | { | 974 | { |
| 968 | struct mlxsw_sp_port *mlxsw_sp_port = | 975 | struct mlxsw_sp_port *mlxsw_sp_port = |
| 969 | mlxsw_core_port_driver_priv(mlxsw_core_port); | 976 | mlxsw_core_port_driver_priv(mlxsw_core_port); |
| @@ -973,7 +980,7 @@ int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, | |||
| 973 | int err; | 980 | int err; |
| 974 | 981 | ||
| 975 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index, | 982 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index, |
| 976 | threshold, &max_buff); | 983 | threshold, &max_buff, extack); |
| 977 | if (err) | 984 | if (err) |
| 978 | return err; | 985 | return err; |
| 979 | 986 | ||
| @@ -1004,7 +1011,8 @@ int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, | |||
| 1004 | int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, | 1011 | int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, |
| 1005 | unsigned int sb_index, u16 tc_index, | 1012 | unsigned int sb_index, u16 tc_index, |
| 1006 | enum devlink_sb_pool_type pool_type, | 1013 | enum devlink_sb_pool_type pool_type, |
| 1007 | u16 pool_index, u32 threshold) | 1014 | u16 pool_index, u32 threshold, |
| 1015 | struct netlink_ext_ack *extack) | ||
| 1008 | { | 1016 | { |
| 1009 | struct mlxsw_sp_port *mlxsw_sp_port = | 1017 | struct mlxsw_sp_port *mlxsw_sp_port = |
| 1010 | mlxsw_core_port_driver_priv(mlxsw_core_port); | 1018 | mlxsw_core_port_driver_priv(mlxsw_core_port); |
| @@ -1015,11 +1023,13 @@ int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, | |||
| 1015 | u32 max_buff; | 1023 | u32 max_buff; |
| 1016 | int err; | 1024 | int err; |
| 1017 | 1025 | ||
| 1018 | if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir) | 1026 | if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir) { |
| 1027 | NL_SET_ERR_MSG_MOD(extack, "Binding egress TC to ingress pool and vice versa is forbidden"); | ||
| 1019 | return -EINVAL; | 1028 | return -EINVAL; |
| 1029 | } | ||
| 1020 | 1030 | ||
| 1021 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index, | 1031 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index, |
| 1022 | threshold, &max_buff); | 1032 | threshold, &max_buff, extack); |
| 1023 | if (err) | 1033 | if (err) |
| 1024 | return err; | 1034 | return err; |
| 1025 | 1035 | ||
