net: dsa: felix: act upon the mqprio qopt in taprio offload
authorVladimir Oltean <vladimir.oltean@nxp.com>
Sat, 15 Apr 2023 17:05:50 +0000 (20:05 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 18 Apr 2023 02:01:19 +0000 (19:01 -0700)
The mqprio queue configuration can appear either through
TC_SETUP_QDISC_MQPRIO or through TC_SETUP_QDISC_TAPRIO. Make sure both
are treated in the same way.

Code does nothing new for now (except for rejecting multiple TXQs per
TC, which is a useless concept with DSA switches).

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Ferenc Fejes <fejes@inf.elte.hu>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/ocelot/felix_vsc9959.c

index 66ec2740e3cb17aca782188acbc3053c1a9ec874..e055b3980ccc5fedd1bca89bf0850ffe6c99ea07 100644 (file)
@@ -1424,6 +1424,7 @@ static int vsc9959_qos_port_tas_set(struct ocelot *ocelot, int port,
        mutex_lock(&ocelot->tas_lock);
 
        if (!taprio->enable) {
+               ocelot_port_mqprio(ocelot, port, &taprio->mqprio);
                ocelot_rmw_rix(ocelot, 0, QSYS_TAG_CONFIG_ENABLE,
                               QSYS_TAG_CONFIG, port);
 
@@ -1436,15 +1437,19 @@ static int vsc9959_qos_port_tas_set(struct ocelot *ocelot, int port,
                return 0;
        }
 
+       ret = ocelot_port_mqprio(ocelot, port, &taprio->mqprio);
+       if (ret)
+               goto err_unlock;
+
        if (taprio->cycle_time > NSEC_PER_SEC ||
            taprio->cycle_time_extension >= NSEC_PER_SEC) {
                ret = -EINVAL;
-               goto err;
+               goto err_reset_tc;
        }
 
        if (taprio->num_entries > VSC9959_TAS_GCL_ENTRY_MAX) {
                ret = -ERANGE;
-               goto err;
+               goto err_reset_tc;
        }
 
        /* Enable guard band. The switch will schedule frames without taking
@@ -1468,7 +1473,7 @@ static int vsc9959_qos_port_tas_set(struct ocelot *ocelot, int port,
        val = ocelot_read(ocelot, QSYS_PARAM_STATUS_REG_8);
        if (val & QSYS_PARAM_STATUS_REG_8_CONFIG_PENDING) {
                ret = -EBUSY;
-               goto err;
+               goto err_reset_tc;
        }
 
        ocelot_rmw_rix(ocelot,
@@ -1503,12 +1508,19 @@ static int vsc9959_qos_port_tas_set(struct ocelot *ocelot, int port,
                                 !(val & QSYS_TAS_PARAM_CFG_CTRL_CONFIG_CHANGE),
                                 10, 100000);
        if (ret)
-               goto err;
+               goto err_reset_tc;
 
        ocelot_port->taprio = taprio_offload_get(taprio);
        vsc9959_tas_guard_bands_update(ocelot, port);
 
-err:
+       mutex_unlock(&ocelot->tas_lock);
+
+       return 0;
+
+err_reset_tc:
+       taprio->mqprio.qopt.num_tc = 0;
+       ocelot_port_mqprio(ocelot, port, &taprio->mqprio);
+err_unlock:
        mutex_unlock(&ocelot->tas_lock);
 
        return ret;