• Vladimir Oltean's avatar
    net: dsa: felix: create a template for the DSA tags on xmit · 67c24049
    Vladimir Oltean authored
    With this patch we try to kill 2 birds with 1 stone.
    
    First of all, some switches that use tag_ocelot.c don't have the exact
    same bitfield layout for the DSA tags. The destination ports field is
    different for Seville VSC9953 for example. So the choices are to either
    duplicate tag_ocelot.c into a new tag_seville.c (sub-optimal) or somehow
    take into account a supposed ocelot->dest_ports_offset when packing this
    field into the DSA injection header (again not ideal).
    
    Secondly, tag_ocelot.c already needs to memset a 128-bit area to zero
    and call some packing() functions of dubious performance in the
    fastpath. And most of the values it needs to pack are pretty much
    constant (BYPASS=1, SRC_PORT=CPU, DEST=port index). So it would be good
    if we could improve that.
    
    The proposed solution is to allocate a memory area per port at probe
    time, initialize that with the statically defined bits as per chip
    hardware revision, and just perform a simpler memcpy in the fastpath.
    
    Other alternatives have been analyzed, such as:
    - Create a separate tag_seville.c: too much code duplication for just 1
      bit field difference.
    - Create a separate DSA_TAG_PROTO_SEVILLE under tag_ocelot.c, just like
      tag_brcm.c, which would have a separate .xmit function. Again, too
      much code duplication for just 1 bit field difference.
    - Allocate the template from the init function of the tag_ocelot.c
      module, instead of from the driver: couldn't figure out a method of
      accessing the correct port template corresponding to the correct
      tagger in the .xmit function.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    67c24049
ocelot.h 19.9 KB