• Vladimir Oltean's avatar
    net: dsa: keep a copy of the tagging protocol in the DSA switch tree · 357f203b
    Vladimir Oltean authored
    Cascading DSA switches can be done multiple ways. There is the brute
    force approach / tag stacking, where one upstream switch, located
    between leaf switches and the host Ethernet controller, will just
    happily transport the DSA header of those leaf switches as payload.
    For this kind of setups, DSA works without any special kind of treatment
    compared to a single switch - they just aren't aware of each other.
    Then there's the approach where the upstream switch understands the tags
    it transports from its leaves below, as it doesn't push a tag of its own,
    but it routes based on the source port & switch id information present
    in that tag (as opposed to DMAC & VID) and it strips the tag when
    egressing a front-facing port. Currently only Marvell implements the
    latter, and Marvell DSA trees contain only Marvell switches.
    
    So it is safe to say that DSA trees already have a single tag protocol
    shared by all switches, and in fact this is what makes the switches able
    to understand each other. This fact is also implied by the fact that
    currently, the tagging protocol is reported as part of a sysfs installed
    on the DSA master and not per port, so it must be the same for all the
    ports connected to that DSA master regardless of the switch that they
    belong to.
    
    It's time to make this official and enforce it (yes, this also means we
    won't have any "switch understands tag to some extent but is not able to
    speak it" hardware oddities that we'll support in the future).
    
    This is needed due to the imminent introduction of the dsa_switch_ops::
    change_tag_protocol driver API. When that is introduced, we'll have
    to notify switches of the tagging protocol that they're configured to
    use. Currently the tag_ops structure pointer is held only for CPU ports.
    But there are switches which don't have CPU ports and nonetheless still
    need to be configured. These would be Marvell leaf switches whose
    upstream port is just a DSA link. How do we inform these of their
    tagging protocol setup/deletion?
    
    One answer to the above would be: iterate through the DSA switch tree's
    ports once, list the CPU ports, get their tag_ops, then iterate again
    now that we have it, and notify everybody of that tag_ops. But what to
    do if conflicts appear between one cpu_dp->tag_ops and another? There's
    no escaping the fact that conflict resolution needs to be done, so we
    can be upfront about it.
    
    Ease our work and just keep the master copy of the tag_ops inside the
    struct dsa_switch_tree. Reference counting is now moved to be per-tree
    too, instead of per-CPU port.
    
    There are many places in the data path that access master->dsa_ptr->tag_ops
    and we would introduce unnecessary performance penalty going through yet
    another indirection, so keep those right where they are.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    357f203b
dsa2.c 28.1 KB