mlxsw: spectrum_dcb: Allow setting default port priority
authorPetr Machata <petrm@mellanox.com>
Sun, 29 Dec 2019 11:48:28 +0000 (13:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 Jan 2020 23:40:14 +0000 (15:40 -0800)
When APP TLV selector 1 (EtherType) is used with PID of 0, the
corresponding entry specifies "default application priority [...] when
application priority is not otherwise specified."

mlxsw currently supports this type of APP entry, but uses it only as a
fallback for unspecified DSCP rules. However non-IP traffic is prioritized
according to port-default priority, not according to the DSCP-to-prio
tables, and thus it's currently not possible to prioritize such traffic
correctly.

Extend the use of the abovementioned APP entry to also set default port
priority.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c

index fe3bbba906594a1321459e46a42bb621d91fb544..db66f2b56a6d6a3c7fba0695d42b026d35423e80 100644 (file)
@@ -368,6 +368,17 @@ err_update_qrwe:
        return err;
 }
 
+static int
+mlxsw_sp_port_dcb_app_update_qpdp(struct mlxsw_sp_port *mlxsw_sp_port,
+                                 u8 default_prio)
+{
+       struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
+       char qpdp_pl[MLXSW_REG_QPDP_LEN];
+
+       mlxsw_reg_qpdp_pack(qpdp_pl, mlxsw_sp_port->local_port, default_prio);
+       return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(qpdp), qpdp_pl);
+}
+
 static int
 mlxsw_sp_port_dcb_app_update_qpdpm(struct mlxsw_sp_port *mlxsw_sp_port,
                                   struct dcb_ieee_app_dscp_map *map)
@@ -405,6 +416,12 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port)
        int err;
 
        default_prio = mlxsw_sp_port_dcb_app_default_prio(mlxsw_sp_port);
+       err = mlxsw_sp_port_dcb_app_update_qpdp(mlxsw_sp_port, default_prio);
+       if (err) {
+               netdev_err(mlxsw_sp_port->dev, "Couldn't configure port default priority\n");
+               return err;
+       }
+
        have_dscp = mlxsw_sp_port_dcb_app_prio_dscp_map(mlxsw_sp_port,
                                                        &prio_map);