• Vladimir Oltean's avatar
    net: mscc: ocelot: fix oversize frame dropping for preemptible TCs · c6efb4ae
    Vladimir Oltean authored
    This switch implements Hold/Release in a strange way, with no control
    from the user as required by IEEE 802.1Q-2018 through Set-And-Hold-MAC
    and Set-And-Release-MAC, but rather, it emits HOLD requests implicitly
    based on the schedule.
    
    Namely, when the gate of a preemptible TC is about to close (actually
    QSYS::PREEMPTION_CFG.HOLD_ADVANCE octet times in advance of this event),
    the QSYS seems to emit a HOLD request pulse towards the MAC which
    preempts the currently transmitted packet, and further packets are held
    back in the queue system.
    
    This allows large frames to be squeezed through small time slots,
    because HOLD requests initiated by the gate events result in the frame
    being segmented in multiple fragments, the bit time of which is equal to
    the size of the time slot.
    
    It has been reported that the vsc9959_tas_guard_bands_update() logic
    breaks this, because it doesn't take preemptible TCs into account, and
    enables oversized frame dropping when the time slot doesn't allow a full
    MTU to be sent, but it does allow 2*minFragSize to be sent (128B).
    Packets larger than 128B are dropped instead of being sent in multiple
    fragments.
    
    Confusingly, the manual says:
    
    | For guard band, SDU calculation of a traffic class of a port, if
    | preemption is enabled (through 'QSYS::PREEMPTION_CFG.P_QUEUES') then
    | QSYS::PREEMPTION_CFG.HOLD_ADVANCE is used, otherwise
    | QSYS::QMAXSDU_CFG_*.QMAXSDU_* is used.
    
    but this only refers to the static guard band durations, and the
    QMAXSDU_CFG_* registers have dual purpose - the other being oversized
    frame dropping, which takes place irrespective of whether frames are
    preemptible or express.
    
    So, to fix the problem, we need to call vsc9959_tas_guard_bands_update()
    from ocelot_port_update_active_preemptible_tcs(), and modify the guard
    band logic to consider a different (lower) oversize limit for
    preemptible traffic classes.
    
    Fixes: 403ffc2c ("net: mscc: ocelot: add support for preemptible traffic classes")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Message-ID: <20230705104422.49025-4-vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    c6efb4ae
felix_vsc9959.c 80.7 KB