forked from Minki/linux
net/mlx5: E-Switch, Verify support QoS element type
Check if firmware supports the requested element type before attempting to create the element type. In addition, explicitly specify the request element type and tsar type. Signed-off-by: Eli Cohen <eli@mellanox.com> Reviewed-by: Paul Blakey <paulb@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
0000a5f250
commit
6cedde4513
@ -1393,19 +1393,50 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool element_type_supported(struct mlx5_eswitch *esw, int type)
|
||||
{
|
||||
struct mlx5_core_dev *dev = esw->dev = esw->dev;
|
||||
|
||||
switch (type) {
|
||||
case SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR:
|
||||
return MLX5_CAP_QOS(dev, esw_element_type) &
|
||||
ELEMENT_TYPE_CAP_MASK_TASR;
|
||||
case SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT:
|
||||
return MLX5_CAP_QOS(dev, esw_element_type) &
|
||||
ELEMENT_TYPE_CAP_MASK_VPORT;
|
||||
case SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT_TC:
|
||||
return MLX5_CAP_QOS(dev, esw_element_type) &
|
||||
ELEMENT_TYPE_CAP_MASK_VPORT_TC;
|
||||
case SCHEDULING_CONTEXT_ELEMENT_TYPE_PARA_VPORT_TC:
|
||||
return MLX5_CAP_QOS(dev, esw_element_type) &
|
||||
ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Vport QoS management */
|
||||
static int esw_create_tsar(struct mlx5_eswitch *esw)
|
||||
{
|
||||
u32 tsar_ctx[MLX5_ST_SZ_DW(scheduling_context)] = {0};
|
||||
struct mlx5_core_dev *dev = esw->dev;
|
||||
__be32 *attr;
|
||||
int err;
|
||||
|
||||
if (!MLX5_CAP_GEN(dev, qos) || !MLX5_CAP_QOS(dev, esw_scheduling))
|
||||
return 0;
|
||||
|
||||
if (!element_type_supported(esw, SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR))
|
||||
return 0;
|
||||
|
||||
if (esw->qos.enabled)
|
||||
return -EEXIST;
|
||||
|
||||
MLX5_SET(scheduling_context, tsar_ctx, element_type,
|
||||
SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR);
|
||||
|
||||
attr = MLX5_ADDR_OF(scheduling_context, tsar_ctx, element_attributes);
|
||||
*attr = cpu_to_be32(TSAR_ELEMENT_TSAR_TYPE_DWRR << 16);
|
||||
|
||||
err = mlx5_create_scheduling_element_cmd(dev,
|
||||
SCHEDULING_HIERARCHY_E_SWITCH,
|
||||
tsar_ctx,
|
||||
|
@ -2957,6 +2957,13 @@ enum {
|
||||
SCHEDULING_CONTEXT_ELEMENT_TYPE_PARA_VPORT_TC = 0x3,
|
||||
};
|
||||
|
||||
enum {
|
||||
ELEMENT_TYPE_CAP_MASK_TASR = 1 << 0,
|
||||
ELEMENT_TYPE_CAP_MASK_VPORT = 1 << 1,
|
||||
ELEMENT_TYPE_CAP_MASK_VPORT_TC = 1 << 2,
|
||||
ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC = 1 << 3,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_scheduling_context_bits {
|
||||
u8 element_type[0x8];
|
||||
u8 reserved_at_8[0x18];
|
||||
|
Loading…
Reference in New Issue
Block a user