mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 06:34:11 +08:00
mlxsw: spectrum: Prevent invalid ingress buffer mapping
Packets entering the switch are mapped to a Switch Priority (SP)
according to their PCP value (untagged frames are mapped to SP 0).
The packets are classified to a priority group (PG) buffer in the port's
headroom according to their SP.
The switch maintains another mapping (SP to IEEE priority), which is
used to generate PFC frames for lossless PGs. This mapping is
initialized to IEEE = SP % 8.
Therefore, when mapping SP 'x' to PG 'y' we create a situation in which
an IEEE priority is mapped to two different PGs:
IEEE 'x' ---> SP 'x' ---> PG 'y'
IEEE 'x' ---> SP 'x + 8' ---> PG '0' (default)
Which is invalid, as a flow can use only one PG buffer.
Fix this by mapping both SP 'x' and 'x + 8' to the same PG buffer.
Fixes: 8e8dfe9fdf
("mlxsw: spectrum: Add IEEE 802.1Qaz ETS support")
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
28f5275e4a
commit
11719a58bd
@ -2718,7 +2718,7 @@ static inline void mlxsw_reg_ppcnt_pack(char *payload, u8 local_port,
|
||||
* Configures the switch priority to buffer table.
|
||||
*/
|
||||
#define MLXSW_REG_PPTB_ID 0x500B
|
||||
#define MLXSW_REG_PPTB_LEN 0x0C
|
||||
#define MLXSW_REG_PPTB_LEN 0x10
|
||||
|
||||
static const struct mlxsw_reg_info mlxsw_reg_pptb = {
|
||||
.id = MLXSW_REG_PPTB_ID,
|
||||
@ -2784,6 +2784,13 @@ MLXSW_ITEM32(reg, pptb, pm_msb, 0x08, 24, 8);
|
||||
*/
|
||||
MLXSW_ITEM32(reg, pptb, untagged_buff, 0x08, 0, 4);
|
||||
|
||||
/* reg_pptb_prio_to_buff_msb
|
||||
* Mapping of switch priority <i+8> to one of the allocated receive port
|
||||
* buffers.
|
||||
* Access: RW
|
||||
*/
|
||||
MLXSW_ITEM_BIT_ARRAY(reg, pptb, prio_to_buff_msb, 0x0C, 0x04, 4);
|
||||
|
||||
#define MLXSW_REG_PPTB_ALL_PRIO 0xFF
|
||||
|
||||
static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port)
|
||||
@ -2792,6 +2799,14 @@ static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port)
|
||||
mlxsw_reg_pptb_mm_set(payload, MLXSW_REG_PPTB_MM_UM);
|
||||
mlxsw_reg_pptb_local_port_set(payload, local_port);
|
||||
mlxsw_reg_pptb_pm_set(payload, MLXSW_REG_PPTB_ALL_PRIO);
|
||||
mlxsw_reg_pptb_pm_msb_set(payload, MLXSW_REG_PPTB_ALL_PRIO);
|
||||
}
|
||||
|
||||
static inline void mlxsw_reg_pptb_prio_to_buff_pack(char *payload, u8 prio,
|
||||
u8 buff)
|
||||
{
|
||||
mlxsw_reg_pptb_prio_to_buff_set(payload, prio, buff);
|
||||
mlxsw_reg_pptb_prio_to_buff_msb_set(payload, prio, buff);
|
||||
}
|
||||
|
||||
/* PBMC - Port Buffer Management Control Register
|
||||
|
@ -194,7 +194,7 @@ static int mlxsw_sp_port_pb_prio_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
|
||||
mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
|
||||
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
|
||||
mlxsw_reg_pptb_prio_to_buff_set(pptb_pl, i, 0);
|
||||
mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, 0);
|
||||
return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
|
||||
pptb_pl);
|
||||
}
|
||||
|
@ -103,7 +103,8 @@ static int mlxsw_sp_port_pg_prio_map(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
|
||||
mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
|
||||
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
|
||||
mlxsw_reg_pptb_prio_to_buff_set(pptb_pl, i, prio_tc[i]);
|
||||
mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, prio_tc[i]);
|
||||
|
||||
return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
|
||||
pptb_pl);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user