forked from Minki/linux
net: dsa: felix: re-enable TAS guard band mode
Commit316bcffe44
("net: dsa: felix: disable always guard band bit for TAS config") disabled the guard band and broke 802.3Qbv compliance. There are two issues here: (1) Without the guard band the end of the scheduling window could be overrun by a frame in transit. (2) Frames that don't fit into a configured window will still be sent. The reason for both issues is that the switch will schedule the _start_ of a frame transmission inside the predefined window without taking the length of the frame into account. Thus, we'll need the guard band which will close the gate early, so that a complete frame can still be sent. Revert the commit and add a note. For a lengthy discussion see [1]. [1] https://lore.kernel.org/netdev/c7618025da6723418c56a54fe4683bd7@walle.cc/ Fixes:316bcffe44
("net: dsa: felix: disable always guard band bit for TAS config") Signed-off-by: Michael Walle <michael@walle.cc> Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3058e01d31
commit
297c4de6f7
@ -1227,12 +1227,17 @@ static int vsc9959_qos_port_tas_set(struct ocelot *ocelot, int port,
|
||||
if (taprio->num_entries > VSC9959_TAS_GCL_ENTRY_MAX)
|
||||
return -ERANGE;
|
||||
|
||||
/* Set port num and disable ALWAYS_GUARD_BAND_SCH_Q, which means set
|
||||
* guard band to be implemented for nonschedule queues to schedule
|
||||
* queues transition.
|
||||
/* Enable guard band. The switch will schedule frames without taking
|
||||
* their length into account. Thus we'll always need to enable the
|
||||
* guard band which reserves the time of a maximum sized frame at the
|
||||
* end of the time window.
|
||||
*
|
||||
* Although the ALWAYS_GUARD_BAND_SCH_Q bit is global for all ports, we
|
||||
* need to set PORT_NUM, because subsequent writes to PARAM_CFG_REG_n
|
||||
* operate on the port number.
|
||||
*/
|
||||
ocelot_rmw(ocelot,
|
||||
QSYS_TAS_PARAM_CFG_CTRL_PORT_NUM(port),
|
||||
ocelot_rmw(ocelot, QSYS_TAS_PARAM_CFG_CTRL_PORT_NUM(port) |
|
||||
QSYS_TAS_PARAM_CFG_CTRL_ALWAYS_GUARD_BAND_SCH_Q,
|
||||
QSYS_TAS_PARAM_CFG_CTRL_PORT_NUM_M |
|
||||
QSYS_TAS_PARAM_CFG_CTRL_ALWAYS_GUARD_BAND_SCH_Q,
|
||||
QSYS_TAS_PARAM_CFG_CTRL);
|
||||
|
Loading…
Reference in New Issue
Block a user