• Vladimir Oltean's avatar
    net: dsa: tag_8021q: add a context structure · 5899ee36
    Vladimir Oltean authored
    While working on another tag_8021q driver implementation, some things
    became apparent:
    
    - It is not mandatory for a DSA driver to offload the tag_8021q VLANs by
      using the VLAN table per se. For example, it can add custom TCAM rules
      that simply encapsulate RX traffic, and redirect & decapsulate rules
      for TX traffic. For such a driver, it makes no sense to receive the
      tag_8021q configuration through the same callback as it receives the
      VLAN configuration from the bridge and the 8021q modules.
    
    - Currently, sja1105 (the only tag_8021q user) sets a
      priv->expect_dsa_8021q variable to distinguish between the bridge
      calling, and tag_8021q calling. That can be improved, to say the
      least.
    
    - The crosschip bridging operations are, in fact, stateful already. The
      list of crosschip_links must be kept by the caller and passed to the
      relevant tag_8021q functions.
    
    So it would be nice if the tag_8021q configuration was more
    self-contained. This patch attempts to do that.
    
    Create a struct dsa_8021q_context which encapsulates a struct
    dsa_switch, and has 2 function pointers for adding and deleting a VLAN.
    These will replace the previous channel to the driver, which was through
    the .port_vlan_add and .port_vlan_del callbacks of dsa_switch_ops.
    
    Also put the list of crosschip_links into this dsa_8021q_context.
    Drivers that don't support cross-chip bridging can simply omit to
    initialize this list, as long as they dont call any cross-chip function.
    
    The sja1105_vlan_add and sja1105_vlan_del functions are refactored into
    a smaller sja1105_vlan_add_one, which now has 2 entry points:
    - sja1105_vlan_add, from struct dsa_switch_ops
    - sja1105_dsa_8021q_vlan_add, from the tag_8021q ops
    But even this change is fairly trivial. It just reflects the fact that
    for sja1105, the VLANs from these 2 channels end up in the same hardware
    table. However that is not necessarily true in the general sense (and
    that's the reason for making this change).
    
    The rest of the patch is mostly plain refactoring of "ds" -> "ctx". The
    dsa_8021q_context structure needs to be propagated because adding a VLAN
    is now done through the ops function pointers inside of it.
    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>
    5899ee36
sja1105_main.c 100 KB