diff options
author | David S. Miller <davem@davemloft.net> | 2019-09-16 16:07:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-09-16 16:07:59 -0400 |
commit | 990925fad5c227269c3fcb76c7c46811b1e86c73 (patch) | |
tree | 94919d2ddeb333521b4857a38e8243c6b5c213cd /drivers/net | |
parent | b63e1a02d74bd92a346f4b9254bc0f3f1e776810 (diff) | |
parent | a759ab6dacd0dd8e27f60f19bb92c2201db213fb (diff) |
Merge branch 'mlxsw-spectrum_buffers-Add-the-ability-to-query-the-CPU-ports-shared-buffer'
Ido Schimmel says:
====================
mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer
Shalom says:
While debugging packet loss towards the CPU, it is useful to be able to
query the CPU port's shared buffer quotas and occupancy.
Patch #1 prevents changing the CPU port's threshold and binding.
Patch #2 registers the CPU port with devlink.
Patch #3 adds the ability to query the CPU port's shared buffer quotas and
occupancy.
v3:
Patch #2:
* Remove unnecessary wrapping
v2:
Patch #1:
* s/0/MLXSW_PORT_CPU_PORT/
* Assign "mlxsw_sp->ports[MLXSW_PORT_CPU_PORT]" at the end of
mlxsw_sp_cpu_port_create() to avoid NULL assignment on error path
* Add common functions for mlxsw_core_port_init/fini()
Patch #2:
* Move "changing CPU port's threshold and binding" check to a separate
patch
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.c | 63 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 46 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | 51 |
4 files changed, 148 insertions, 17 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 3fa96076e8a5..14dcc786926d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
@@ -1864,11 +1864,12 @@ u64 mlxsw_core_res_get(struct mlxsw_core *mlxsw_core, | |||
1864 | } | 1864 | } |
1865 | EXPORT_SYMBOL(mlxsw_core_res_get); | 1865 | EXPORT_SYMBOL(mlxsw_core_res_get); |
1866 | 1866 | ||
1867 | int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port, | 1867 | static int __mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port, |
1868 | u32 port_number, bool split, | 1868 | enum devlink_port_flavour flavour, |
1869 | u32 split_port_subnumber, | 1869 | u32 port_number, bool split, |
1870 | const unsigned char *switch_id, | 1870 | u32 split_port_subnumber, |
1871 | unsigned char switch_id_len) | 1871 | const unsigned char *switch_id, |
1872 | unsigned char switch_id_len) | ||
1872 | { | 1873 | { |
1873 | struct devlink *devlink = priv_to_devlink(mlxsw_core); | 1874 | struct devlink *devlink = priv_to_devlink(mlxsw_core); |
1874 | struct mlxsw_core_port *mlxsw_core_port = | 1875 | struct mlxsw_core_port *mlxsw_core_port = |
@@ -1877,17 +1878,16 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port, | |||
1877 | int err; | 1878 | int err; |
1878 | 1879 | ||
1879 | mlxsw_core_port->local_port = local_port; | 1880 | mlxsw_core_port->local_port = local_port; |
1880 | devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL, | 1881 | devlink_port_attrs_set(devlink_port, flavour, port_number, |
1881 | port_number, split, split_port_subnumber, | 1882 | split, split_port_subnumber, |
1882 | switch_id, switch_id_len); | 1883 | switch_id, switch_id_len); |
1883 | err = devlink_port_register(devlink, devlink_port, local_port); | 1884 | err = devlink_port_register(devlink, devlink_port, local_port); |
1884 | if (err) | 1885 | if (err) |
1885 | memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port)); | 1886 | memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port)); |
1886 | return err; | 1887 | return err; |
1887 | } | 1888 | } |
1888 | EXPORT_SYMBOL(mlxsw_core_port_init); | ||
1889 | 1889 | ||
1890 | void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port) | 1890 | static void __mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port) |
1891 | { | 1891 | { |
1892 | struct mlxsw_core_port *mlxsw_core_port = | 1892 | struct mlxsw_core_port *mlxsw_core_port = |
1893 | &mlxsw_core->ports[local_port]; | 1893 | &mlxsw_core->ports[local_port]; |
@@ -1896,8 +1896,53 @@ void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port) | |||
1896 | devlink_port_unregister(devlink_port); | 1896 | devlink_port_unregister(devlink_port); |
1897 | memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port)); | 1897 | memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port)); |
1898 | } | 1898 | } |
1899 | |||
1900 | int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port, | ||
1901 | u32 port_number, bool split, | ||
1902 | u32 split_port_subnumber, | ||
1903 | const unsigned char *switch_id, | ||
1904 | unsigned char switch_id_len) | ||
1905 | { | ||
1906 | return __mlxsw_core_port_init(mlxsw_core, local_port, | ||
1907 | DEVLINK_PORT_FLAVOUR_PHYSICAL, | ||
1908 | port_number, split, split_port_subnumber, | ||
1909 | switch_id, switch_id_len); | ||
1910 | } | ||
1911 | EXPORT_SYMBOL(mlxsw_core_port_init); | ||
1912 | |||
1913 | void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port) | ||
1914 | { | ||
1915 | __mlxsw_core_port_fini(mlxsw_core, local_port); | ||
1916 | } | ||
1899 | EXPORT_SYMBOL(mlxsw_core_port_fini); | 1917 | EXPORT_SYMBOL(mlxsw_core_port_fini); |
1900 | 1918 | ||
1919 | int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core, | ||
1920 | void *port_driver_priv, | ||
1921 | const unsigned char *switch_id, | ||
1922 | unsigned char switch_id_len) | ||
1923 | { | ||
1924 | struct mlxsw_core_port *mlxsw_core_port = | ||
1925 | &mlxsw_core->ports[MLXSW_PORT_CPU_PORT]; | ||
1926 | int err; | ||
1927 | |||
1928 | err = __mlxsw_core_port_init(mlxsw_core, MLXSW_PORT_CPU_PORT, | ||
1929 | DEVLINK_PORT_FLAVOUR_CPU, | ||
1930 | 0, false, 0, | ||
1931 | switch_id, switch_id_len); | ||
1932 | if (err) | ||
1933 | return err; | ||
1934 | |||
1935 | mlxsw_core_port->port_driver_priv = port_driver_priv; | ||
1936 | return 0; | ||
1937 | } | ||
1938 | EXPORT_SYMBOL(mlxsw_core_cpu_port_init); | ||
1939 | |||
1940 | void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core) | ||
1941 | { | ||
1942 | __mlxsw_core_port_fini(mlxsw_core, MLXSW_PORT_CPU_PORT); | ||
1943 | } | ||
1944 | EXPORT_SYMBOL(mlxsw_core_cpu_port_fini); | ||
1945 | |||
1901 | void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, | 1946 | void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, |
1902 | void *port_driver_priv, struct net_device *dev) | 1947 | void *port_driver_priv, struct net_device *dev) |
1903 | { | 1948 | { |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h index b65a17d49e43..5d7d2ab6d155 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.h +++ b/drivers/net/ethernet/mellanox/mlxsw/core.h | |||
@@ -177,6 +177,11 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port, | |||
177 | const unsigned char *switch_id, | 177 | const unsigned char *switch_id, |
178 | unsigned char switch_id_len); | 178 | unsigned char switch_id_len); |
179 | void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port); | 179 | void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port); |
180 | int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core, | ||
181 | void *port_driver_priv, | ||
182 | const unsigned char *switch_id, | ||
183 | unsigned char switch_id_len); | ||
184 | void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core); | ||
180 | void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, | 185 | void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, |
181 | void *port_driver_priv, struct net_device *dev); | 186 | void *port_driver_priv, struct net_device *dev); |
182 | void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port, | 187 | void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 91e4792bb7e7..dd234cf7b39d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
@@ -3872,6 +3872,45 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port) | |||
3872 | mlxsw_core_port_fini(mlxsw_sp->core, local_port); | 3872 | mlxsw_core_port_fini(mlxsw_sp->core, local_port); |
3873 | } | 3873 | } |
3874 | 3874 | ||
3875 | static int mlxsw_sp_cpu_port_create(struct mlxsw_sp *mlxsw_sp) | ||
3876 | { | ||
3877 | struct mlxsw_sp_port *mlxsw_sp_port; | ||
3878 | int err; | ||
3879 | |||
3880 | mlxsw_sp_port = kzalloc(sizeof(*mlxsw_sp_port), GFP_KERNEL); | ||
3881 | if (!mlxsw_sp_port) | ||
3882 | return -ENOMEM; | ||
3883 | |||
3884 | mlxsw_sp_port->mlxsw_sp = mlxsw_sp; | ||
3885 | mlxsw_sp_port->local_port = MLXSW_PORT_CPU_PORT; | ||
3886 | |||
3887 | err = mlxsw_core_cpu_port_init(mlxsw_sp->core, | ||
3888 | mlxsw_sp_port, | ||
3889 | mlxsw_sp->base_mac, | ||
3890 | sizeof(mlxsw_sp->base_mac)); | ||
3891 | if (err) { | ||
3892 | dev_err(mlxsw_sp->bus_info->dev, "Failed to initialize core CPU port\n"); | ||
3893 | goto err_core_cpu_port_init; | ||
3894 | } | ||
3895 | |||
3896 | mlxsw_sp->ports[MLXSW_PORT_CPU_PORT] = mlxsw_sp_port; | ||
3897 | return 0; | ||
3898 | |||
3899 | err_core_cpu_port_init: | ||
3900 | kfree(mlxsw_sp_port); | ||
3901 | return err; | ||
3902 | } | ||
3903 | |||
3904 | static void mlxsw_sp_cpu_port_remove(struct mlxsw_sp *mlxsw_sp) | ||
3905 | { | ||
3906 | struct mlxsw_sp_port *mlxsw_sp_port = | ||
3907 | mlxsw_sp->ports[MLXSW_PORT_CPU_PORT]; | ||
3908 | |||
3909 | mlxsw_core_cpu_port_fini(mlxsw_sp->core); | ||
3910 | mlxsw_sp->ports[MLXSW_PORT_CPU_PORT] = NULL; | ||
3911 | kfree(mlxsw_sp_port); | ||
3912 | } | ||
3913 | |||
3875 | static bool mlxsw_sp_port_created(struct mlxsw_sp *mlxsw_sp, u8 local_port) | 3914 | static bool mlxsw_sp_port_created(struct mlxsw_sp *mlxsw_sp, u8 local_port) |
3876 | { | 3915 | { |
3877 | return mlxsw_sp->ports[local_port] != NULL; | 3916 | return mlxsw_sp->ports[local_port] != NULL; |
@@ -3884,6 +3923,7 @@ static void mlxsw_sp_ports_remove(struct mlxsw_sp *mlxsw_sp) | |||
3884 | for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++) | 3923 | for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++) |
3885 | if (mlxsw_sp_port_created(mlxsw_sp, i)) | 3924 | if (mlxsw_sp_port_created(mlxsw_sp, i)) |
3886 | mlxsw_sp_port_remove(mlxsw_sp, i); | 3925 | mlxsw_sp_port_remove(mlxsw_sp, i); |
3926 | mlxsw_sp_cpu_port_remove(mlxsw_sp); | ||
3887 | kfree(mlxsw_sp->port_to_module); | 3927 | kfree(mlxsw_sp->port_to_module); |
3888 | kfree(mlxsw_sp->ports); | 3928 | kfree(mlxsw_sp->ports); |
3889 | } | 3929 | } |
@@ -3908,6 +3948,10 @@ static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp) | |||
3908 | goto err_port_to_module_alloc; | 3948 | goto err_port_to_module_alloc; |
3909 | } | 3949 | } |
3910 | 3950 | ||
3951 | err = mlxsw_sp_cpu_port_create(mlxsw_sp); | ||
3952 | if (err) | ||
3953 | goto err_cpu_port_create; | ||
3954 | |||
3911 | for (i = 1; i < max_ports; i++) { | 3955 | for (i = 1; i < max_ports; i++) { |
3912 | /* Mark as invalid */ | 3956 | /* Mark as invalid */ |
3913 | mlxsw_sp->port_to_module[i] = -1; | 3957 | mlxsw_sp->port_to_module[i] = -1; |
@@ -3931,6 +3975,8 @@ err_port_module_info_get: | |||
3931 | for (i--; i >= 1; i--) | 3975 | for (i--; i >= 1; i--) |
3932 | if (mlxsw_sp_port_created(mlxsw_sp, i)) | 3976 | if (mlxsw_sp_port_created(mlxsw_sp, i)) |
3933 | mlxsw_sp_port_remove(mlxsw_sp, i); | 3977 | mlxsw_sp_port_remove(mlxsw_sp, i); |
3978 | mlxsw_sp_cpu_port_remove(mlxsw_sp); | ||
3979 | err_cpu_port_create: | ||
3934 | kfree(mlxsw_sp->port_to_module); | 3980 | kfree(mlxsw_sp->port_to_module); |
3935 | err_port_to_module_alloc: | 3981 | err_port_to_module_alloc: |
3936 | kfree(mlxsw_sp->ports); | 3982 | kfree(mlxsw_sp->ports); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c index 888ba4300bcc..b9eeae37a4dc 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | |||
@@ -250,6 +250,10 @@ static int mlxsw_sp_sb_pm_occ_clear(struct mlxsw_sp *mlxsw_sp, u8 local_port, | |||
250 | &mlxsw_sp->sb_vals->pool_dess[pool_index]; | 250 | &mlxsw_sp->sb_vals->pool_dess[pool_index]; |
251 | char sbpm_pl[MLXSW_REG_SBPM_LEN]; | 251 | char sbpm_pl[MLXSW_REG_SBPM_LEN]; |
252 | 252 | ||
253 | if (local_port == MLXSW_PORT_CPU_PORT && | ||
254 | des->dir == MLXSW_REG_SBXX_DIR_INGRESS) | ||
255 | return 0; | ||
256 | |||
253 | mlxsw_reg_sbpm_pack(sbpm_pl, local_port, des->pool, des->dir, | 257 | mlxsw_reg_sbpm_pack(sbpm_pl, local_port, des->pool, des->dir, |
254 | true, 0, 0); | 258 | true, 0, 0); |
255 | return mlxsw_reg_trans_query(mlxsw_sp->core, MLXSW_REG(sbpm), sbpm_pl, | 259 | return mlxsw_reg_trans_query(mlxsw_sp->core, MLXSW_REG(sbpm), sbpm_pl, |
@@ -273,6 +277,10 @@ static int mlxsw_sp_sb_pm_occ_query(struct mlxsw_sp *mlxsw_sp, u8 local_port, | |||
273 | char sbpm_pl[MLXSW_REG_SBPM_LEN]; | 277 | char sbpm_pl[MLXSW_REG_SBPM_LEN]; |
274 | struct mlxsw_sp_sb_pm *pm; | 278 | struct mlxsw_sp_sb_pm *pm; |
275 | 279 | ||
280 | if (local_port == MLXSW_PORT_CPU_PORT && | ||
281 | des->dir == MLXSW_REG_SBXX_DIR_INGRESS) | ||
282 | return 0; | ||
283 | |||
276 | pm = mlxsw_sp_sb_pm_get(mlxsw_sp, local_port, pool_index); | 284 | pm = mlxsw_sp_sb_pm_get(mlxsw_sp, local_port, pool_index); |
277 | mlxsw_reg_sbpm_pack(sbpm_pl, local_port, des->pool, des->dir, | 285 | mlxsw_reg_sbpm_pack(sbpm_pl, local_port, des->pool, des->dir, |
278 | false, 0, 0); | 286 | false, 0, 0); |
@@ -1085,6 +1093,11 @@ int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, | |||
1085 | u32 max_buff; | 1093 | u32 max_buff; |
1086 | int err; | 1094 | int err; |
1087 | 1095 | ||
1096 | if (local_port == MLXSW_PORT_CPU_PORT) { | ||
1097 | NL_SET_ERR_MSG_MOD(extack, "Changing CPU port's threshold is forbidden"); | ||
1098 | return -EINVAL; | ||
1099 | } | ||
1100 | |||
1088 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index, | 1101 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index, |
1089 | threshold, &max_buff, extack); | 1102 | threshold, &max_buff, extack); |
1090 | if (err) | 1103 | if (err) |
@@ -1130,6 +1143,11 @@ int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, | |||
1130 | u32 max_buff; | 1143 | u32 max_buff; |
1131 | int err; | 1144 | int err; |
1132 | 1145 | ||
1146 | if (local_port == MLXSW_PORT_CPU_PORT) { | ||
1147 | NL_SET_ERR_MSG_MOD(extack, "Changing CPU port's binding is forbidden"); | ||
1148 | return -EINVAL; | ||
1149 | } | ||
1150 | |||
1133 | if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir) { | 1151 | if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir) { |
1134 | NL_SET_ERR_MSG_MOD(extack, "Binding egress TC to ingress pool and vice versa is forbidden"); | 1152 | NL_SET_ERR_MSG_MOD(extack, "Binding egress TC to ingress pool and vice versa is forbidden"); |
1135 | return -EINVAL; | 1153 | return -EINVAL; |
@@ -1187,6 +1205,11 @@ static void mlxsw_sp_sb_sr_occ_query_cb(struct mlxsw_core *mlxsw_core, | |||
1187 | local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) { | 1205 | local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) { |
1188 | if (!mlxsw_sp->ports[local_port]) | 1206 | if (!mlxsw_sp->ports[local_port]) |
1189 | continue; | 1207 | continue; |
1208 | if (local_port == MLXSW_PORT_CPU_PORT) { | ||
1209 | /* Ingress quotas are not supported for the CPU port */ | ||
1210 | masked_count++; | ||
1211 | continue; | ||
1212 | } | ||
1190 | for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++) { | 1213 | for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++) { |
1191 | cm = mlxsw_sp_sb_cm_get(mlxsw_sp, local_port, i, | 1214 | cm = mlxsw_sp_sb_cm_get(mlxsw_sp, local_port, i, |
1192 | MLXSW_REG_SBXX_DIR_INGRESS); | 1215 | MLXSW_REG_SBXX_DIR_INGRESS); |
@@ -1222,7 +1245,7 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, | |||
1222 | char *sbsr_pl; | 1245 | char *sbsr_pl; |
1223 | u8 masked_count; | 1246 | u8 masked_count; |
1224 | u8 local_port_1; | 1247 | u8 local_port_1; |
1225 | u8 local_port = 0; | 1248 | u8 local_port; |
1226 | int i; | 1249 | int i; |
1227 | int err; | 1250 | int err; |
1228 | int err2; | 1251 | int err2; |
@@ -1231,8 +1254,8 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, | |||
1231 | if (!sbsr_pl) | 1254 | if (!sbsr_pl) |
1232 | return -ENOMEM; | 1255 | return -ENOMEM; |
1233 | 1256 | ||
1257 | local_port = MLXSW_PORT_CPU_PORT; | ||
1234 | next_batch: | 1258 | next_batch: |
1235 | local_port++; | ||
1236 | local_port_1 = local_port; | 1259 | local_port_1 = local_port; |
1237 | masked_count = 0; | 1260 | masked_count = 0; |
1238 | mlxsw_reg_sbsr_pack(sbsr_pl, false); | 1261 | mlxsw_reg_sbsr_pack(sbsr_pl, false); |
@@ -1243,7 +1266,11 @@ next_batch: | |||
1243 | for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) { | 1266 | for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) { |
1244 | if (!mlxsw_sp->ports[local_port]) | 1267 | if (!mlxsw_sp->ports[local_port]) |
1245 | continue; | 1268 | continue; |
1246 | mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl, local_port, 1); | 1269 | if (local_port != MLXSW_PORT_CPU_PORT) { |
1270 | /* Ingress quotas are not supported for the CPU port */ | ||
1271 | mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl, | ||
1272 | local_port, 1); | ||
1273 | } | ||
1247 | mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1); | 1274 | mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1); |
1248 | for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) { | 1275 | for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) { |
1249 | err = mlxsw_sp_sb_pm_occ_query(mlxsw_sp, local_port, i, | 1276 | err = mlxsw_sp_sb_pm_occ_query(mlxsw_sp, local_port, i, |
@@ -1264,8 +1291,10 @@ do_query: | |||
1264 | cb_priv); | 1291 | cb_priv); |
1265 | if (err) | 1292 | if (err) |
1266 | goto out; | 1293 | goto out; |
1267 | if (local_port < mlxsw_core_max_ports(mlxsw_core)) | 1294 | if (local_port < mlxsw_core_max_ports(mlxsw_core)) { |
1295 | local_port++; | ||
1268 | goto next_batch; | 1296 | goto next_batch; |
1297 | } | ||
1269 | 1298 | ||
1270 | out: | 1299 | out: |
1271 | err2 = mlxsw_reg_trans_bulk_wait(&bulk_list); | 1300 | err2 = mlxsw_reg_trans_bulk_wait(&bulk_list); |
@@ -1282,7 +1311,7 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, | |||
1282 | LIST_HEAD(bulk_list); | 1311 | LIST_HEAD(bulk_list); |
1283 | char *sbsr_pl; | 1312 | char *sbsr_pl; |
1284 | unsigned int masked_count; | 1313 | unsigned int masked_count; |
1285 | u8 local_port = 0; | 1314 | u8 local_port; |
1286 | int i; | 1315 | int i; |
1287 | int err; | 1316 | int err; |
1288 | int err2; | 1317 | int err2; |
@@ -1291,8 +1320,8 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, | |||
1291 | if (!sbsr_pl) | 1320 | if (!sbsr_pl) |
1292 | return -ENOMEM; | 1321 | return -ENOMEM; |
1293 | 1322 | ||
1323 | local_port = MLXSW_PORT_CPU_PORT; | ||
1294 | next_batch: | 1324 | next_batch: |
1295 | local_port++; | ||
1296 | masked_count = 0; | 1325 | masked_count = 0; |
1297 | mlxsw_reg_sbsr_pack(sbsr_pl, true); | 1326 | mlxsw_reg_sbsr_pack(sbsr_pl, true); |
1298 | for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++) | 1327 | for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++) |
@@ -1302,7 +1331,11 @@ next_batch: | |||
1302 | for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) { | 1331 | for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) { |
1303 | if (!mlxsw_sp->ports[local_port]) | 1332 | if (!mlxsw_sp->ports[local_port]) |
1304 | continue; | 1333 | continue; |
1305 | mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl, local_port, 1); | 1334 | if (local_port != MLXSW_PORT_CPU_PORT) { |
1335 | /* Ingress quotas are not supported for the CPU port */ | ||
1336 | mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl, | ||
1337 | local_port, 1); | ||
1338 | } | ||
1306 | mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1); | 1339 | mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1); |
1307 | for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) { | 1340 | for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) { |
1308 | err = mlxsw_sp_sb_pm_occ_clear(mlxsw_sp, local_port, i, | 1341 | err = mlxsw_sp_sb_pm_occ_clear(mlxsw_sp, local_port, i, |
@@ -1319,8 +1352,10 @@ do_query: | |||
1319 | &bulk_list, NULL, 0); | 1352 | &bulk_list, NULL, 0); |
1320 | if (err) | 1353 | if (err) |
1321 | goto out; | 1354 | goto out; |
1322 | if (local_port < mlxsw_core_max_ports(mlxsw_core)) | 1355 | if (local_port < mlxsw_core_max_ports(mlxsw_core)) { |
1356 | local_port++; | ||
1323 | goto next_batch; | 1357 | goto next_batch; |
1358 | } | ||
1324 | 1359 | ||
1325 | out: | 1360 | out: |
1326 | err2 = mlxsw_reg_trans_bulk_wait(&bulk_list); | 1361 | err2 = mlxsw_reg_trans_bulk_wait(&bulk_list); |