aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/core.c7
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/core.h8
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.h8
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c28
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
796static void *__dl_port(struct devlink_port *devlink_port) 797static 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
847static int 848static 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
884static int mlxsw_devlink_sb_occ_snapshot(struct devlink *devlink, 885static 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);
372int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, 372int 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);
375int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, 376int 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);
378int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, 379int 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);
381int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, 382int 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,
385int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, 386int 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);
389int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, 391int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
390 unsigned int sb_index); 392 unsigned int sb_index);
391int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, 393int 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
901int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, 902int 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
929static int mlxsw_sp_sb_threshold_in(struct mlxsw_sp *mlxsw_sp, u16 pool_index, 933static 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
964int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, 971int 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,
1004int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, 1011int 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