• Vladimir Oltean's avatar
    net: mscc: ocelot: make use of all 63 PTP timestamp identifiers · c57fe003
    Vladimir Oltean authored
    At present, there is a problem when user space bombards a port with PTP
    event frames which have TX timestamping requests (or when a tc-taprio
    offload is installed on a port, which delays the TX timestamps by a
    significant amount of time). The driver will happily roll over the 2-bit
    timestamp ID and this will cause incorrect matches between an skb and
    the TX timestamp collected from the FIFO.
    
    The Ocelot switches have a 6-bit PTP timestamp identifier, and the value
    63 is reserved, so that leaves identifiers 0-62 to be used.
    
    The timestamp identifiers are selected by the REW_OP packet field, and
    are actually shared between CPU-injected frames and frames which match a
    VCAP IS2 rule that modifies the REW_OP. The hardware supports
    partitioning between the two uses of the REW_OP field through the
    PTP_ID_LOW and PTP_ID_HIGH registers, and by default reserves the PTP
    IDs 0-3 for CPU-injected traffic and the rest for VCAP IS2.
    
    The driver does not use VCAP IS2 to set REW_OP for 2-step timestamping,
    and it also writes 0xffffffff to both PTP_ID_HIGH and PTP_ID_LOW in
    ocelot_init_timestamp() which makes all timestamp identifiers available
    to CPU injection.
    
    Therefore, we can make use of all 63 timestamp identifiers, which should
    allow more timestampable packets to be in flight on each port. This is
    only part of the solution, more issues will be addressed in future changes.
    
    Fixes: 4e3b0468 ("net: mscc: PTP Hardware Clock (PHC) support")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    c57fe003
ocelot.c 59.4 KB