Skip to content

Commit f8538ae

Browse files
Amit Cohendavem330
authored andcommitted
mlxsw: Add support for more than 256 ports in SBSR register
Add 'port_page' field in SBSR to be able to query occupancy of more than 256 ports. The field determines the range of the ports specified in the 'ingress_port_mask' and 'egress_port_mask' bit masks: >From '256 * port_page' to '256 * port_page + 255'. For each local port, the appropriate port page is used. A query is never performed for a port range that spans multiple port pages. Signed-off-by: Amit Cohen <[email protected]> Reviewed-by: Petr Machata <[email protected]> Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c934757 commit f8538ae

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

drivers/net/ethernet/mellanox/mlxsw/reg.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12255,6 +12255,16 @@ MLXSW_REG_DEFINE(sbsr, MLXSW_REG_SBSR_ID, MLXSW_REG_SBSR_LEN);
1225512255
*/
1225612256
MLXSW_ITEM32(reg, sbsr, clr, 0x00, 31, 1);
1225712257

12258+
#define MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE 256
12259+
12260+
/* reg_sbsr_port_page
12261+
* Determines the range of the ports specified in the 'ingress_port_mask'
12262+
* and 'egress_port_mask' bit masks.
12263+
* {ingress,egress}_port_mask[x] is (256 * port_page) + x
12264+
* Access: Index
12265+
*/
12266+
MLXSW_ITEM32(reg, sbsr, port_page, 0x04, 0, 4);
12267+
1225812268
/* reg_sbsr_ingress_port_mask
1225912269
* Bit vector for all ingress network ports.
1226012270
* Indicates which of the ports (for which the relevant bit is set)

drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,13 +1582,12 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
15821582
unsigned int sb_index)
15831583
{
15841584
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
1585+
u16 local_port, local_port_1, last_local_port;
15851586
struct mlxsw_sp_sb_sr_occ_query_cb_ctx cb_ctx;
1587+
u8 masked_count, current_page = 0;
15861588
unsigned long cb_priv = 0;
15871589
LIST_HEAD(bulk_list);
15881590
char *sbsr_pl;
1589-
u8 masked_count;
1590-
u16 local_port_1;
1591-
u16 local_port;
15921591
int i;
15931592
int err;
15941593
int err2;
@@ -1602,13 +1601,21 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
16021601
local_port_1 = local_port;
16031602
masked_count = 0;
16041603
mlxsw_reg_sbsr_pack(sbsr_pl, false);
1604+
mlxsw_reg_sbsr_port_page_set(sbsr_pl, current_page);
1605+
last_local_port = current_page * MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE +
1606+
MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE - 1;
1607+
16051608
for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++)
16061609
mlxsw_reg_sbsr_pg_buff_mask_set(sbsr_pl, i, 1);
16071610
for (i = 0; i < MLXSW_SP_SB_EG_TC_COUNT; i++)
16081611
mlxsw_reg_sbsr_tclass_mask_set(sbsr_pl, i, 1);
16091612
for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) {
16101613
if (!mlxsw_sp->ports[local_port])
16111614
continue;
1615+
if (local_port > last_local_port) {
1616+
current_page++;
1617+
goto do_query;
1618+
}
16121619
if (local_port != MLXSW_PORT_CPU_PORT) {
16131620
/* Ingress quotas are not supported for the CPU port */
16141621
mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl,
@@ -1651,10 +1658,11 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
16511658
unsigned int sb_index)
16521659
{
16531660
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
1661+
u16 local_port, last_local_port;
16541662
LIST_HEAD(bulk_list);
1655-
char *sbsr_pl;
16561663
unsigned int masked_count;
1657-
u16 local_port;
1664+
u8 current_page = 0;
1665+
char *sbsr_pl;
16581666
int i;
16591667
int err;
16601668
int err2;
@@ -1667,13 +1675,21 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
16671675
next_batch:
16681676
masked_count = 0;
16691677
mlxsw_reg_sbsr_pack(sbsr_pl, true);
1678+
mlxsw_reg_sbsr_port_page_set(sbsr_pl, current_page);
1679+
last_local_port = current_page * MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE +
1680+
MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE - 1;
1681+
16701682
for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++)
16711683
mlxsw_reg_sbsr_pg_buff_mask_set(sbsr_pl, i, 1);
16721684
for (i = 0; i < MLXSW_SP_SB_EG_TC_COUNT; i++)
16731685
mlxsw_reg_sbsr_tclass_mask_set(sbsr_pl, i, 1);
16741686
for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) {
16751687
if (!mlxsw_sp->ports[local_port])
16761688
continue;
1689+
if (local_port > last_local_port) {
1690+
current_page++;
1691+
goto do_query;
1692+
}
16771693
if (local_port != MLXSW_PORT_CPU_PORT) {
16781694
/* Ingress quotas are not supported for the CPU port */
16791695
mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl,

0 commit comments

Comments
 (0)