01 Apr, 2020

1 commit

  • [ Upstream commit 0e62f543bed03a64495bd2651d4fe1aa4bcb7fe5 ]

    When both the switch and the bridge are learning about new addresses,
    switch ports attached to the bridge would see duplicate ARP frames
    because both entities would attempt to send them.

    Fixes: 5037d532b83d ("net: dsa: add Broadcom tag RX/TX handler")
    Reported-by: Maxime Bizon
    Signed-off-by: Florian Fainelli
    Reviewed-by: Vivien Didelot
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Florian Fainelli
     

11 May, 2019

1 commit

  • Fix gcc build error:

    net/dsa/tag_brcm.c:211:16: error: brcm_prepend_netdev_ops undeclared here (not in a function); did you mean brcm_netdev_ops?
    DSA_TAG_DRIVER(brcm_prepend_netdev_ops);
    ^
    ./include/net/dsa.h:708:10: note: in definition of macro DSA_TAG_DRIVER
    .ops = &__ops, \
    ^~~~~
    ./include/net/dsa.h:701:36: warning: dsa_tag_driver_brcm_prepend_netdev_ops defined but not used [-Wunused-variable]
    #define DSA_TAG_DRIVER_NAME(__ops) dsa_tag_driver ## _ ## __ops
    ^
    ./include/net/dsa.h:707:30: note: in expansion of macro DSA_TAG_DRIVER_NAME
    static struct dsa_tag_driver DSA_TAG_DRIVER_NAME(__ops) = { \
    ^~~~~~~~~~~~~~~~~~~
    net/dsa/tag_brcm.c:211:1: note: in expansion of macro DSA_TAG_DRIVER
    DSA_TAG_DRIVER(brcm_prepend_netdev_ops);

    Like the CONFIG_NET_DSA_TAG_BRCM case,
    brcm_prepend_netdev_ops and DSA_TAG_PROTO_BRCM_PREPEND
    should be wrappeed by CONFIG_NET_DSA_TAG_BRCM_PREPEND.

    Reported-by: Hulk Robot
    Fixes: b74b70c44986 ("net: dsa: Support prepended Broadcom tag")
    Signed-off-by: YueHaibing
    Reviewed-by: Andrew Lunn
    Signed-off-by: David S. Miller

    YueHaibing
     

29 Apr, 2019

8 commits

  • It is possible that the driver is compiled with both
    CONFIG_NET_DSA_TAG_BRCM and CONFIG_NET_DSA_TAG_BRCM_PREPEND disabled.
    This results in warnings about unused symbols. Add some conditional
    compilation to avoid this.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli

    v2
    Reorder patch to before tag drivers can be modules

    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • Now that tag drivers dynamically register, we don't need the static
    table. Remove it. This also means the tag driver structures can be
    made static.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • A DSA tag driver module will need to register the tag protocols it
    implements with the DSA core. Add macros containing this boiler plate.

    The registration/unregistration code is currently just a stub. A Later
    patch will add the real implementation.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli

    v2
    Fix indent of #endif
    Rewrite to move list pointer into a new structure
    v3
    Move kdoc next to macro
    Fix THIS_MODULE indentation

    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • In order that we can match the tagging protocol a switch driver
    request to the tagger, we need to know what protocol the tagger
    supports. Add this information to the ops structure.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli

    v2
    More tag protocol to end of structure to keep hot members at the beginning.

    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • All the tag drivers are some variant of GPL. Add a MODULE_LICENSE()
    indicating this, so the drivers can later be compiled as modules.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • When the tag drivers become modules, we will need to dynamically load
    them based on what the switch drivers need. Add aliases to map between
    the TAG protocol and the driver.

    In order to do this, we need the tag protocol number as something
    which the C pre-processor can stringinfy. Only the compiler knows the
    value of an enum, CPP cannot use them. So add #defines.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • Rather than keep a list to map a tagger ops to a name, place the name
    into the ops structure. This removes the hard coded list, a step
    towards making the taggers more dynamic.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli

    v2:
    Move name to end of structure, keeping the hot entries at the beginning.

    Signed-off-by: David S. Miller

    Andrew Lunn
     
  • Add an SPDX header, and remove the license boilerplate text.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Andrew Lunn
     

07 Dec, 2018

1 commit

  • Each DSA tag protocol needs to add additional headers to the Ethernet
    frame in order to direct it towards a specific switch egress port. It
    must also remove the head from a frame received from a
    switch. Indicate the maximum size of these headers in the tag protocol
    ops structure, so the core can take these overheads into account.

    Signed-off-by: Andrew Lunn
    Signed-off-by: David S. Miller

    Andrew Lunn
     

06 Jan, 2018

1 commit

  • Instead of having the different master network device drivers
    potentially used by DSA/Broadcom tags, move the padding necessary for
    the switches to accept short packets where it makes most sense: within
    tag_brcm.c. This avoids multiplying the number of similar commits to
    e.g: bgmac, bcmsysport, etc.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     

13 Nov, 2017

2 commits

  • Add a new type: DSA_TAG_PROTO_PREPEND which allows us to support for the
    4-bytes Broadcom tag that we already support, but in a format where it
    is pre-pended to the packet instead of located between the MAC SA and
    the Ethertyper (DSA_TAG_PROTO_BRCM).

    Signed-off-by: Florian Fainelli
    Reviewed-by: Andrew Lunn
    Signed-off-by: David S. Miller

    Florian Fainelli
     
  • In preparation for supporting the same Broadcom tag format, but instead
    of inserted between the MAC SA and EtherType, prepended to the Ethernet
    frame, restructure the code a little bit to make that possible and take
    an offset parameter.

    Signed-off-by: Florian Fainelli
    Reviewed-by: Andrew Lunn
    Signed-off-by: David S. Miller

    Florian Fainelli
     

18 Oct, 2017

2 commits

  • The dsa_master_get_slave is slightly confusing since the idiomatic "get"
    term often suggests reference counting, in symmetry to "put".

    Rename it to dsa_master_find_slave to make the look up operation clear.

    Signed-off-by: Vivien Didelot
    Signed-off-by: David S. Miller

    Vivien Didelot
     
  • Many portions of DSA core code require to get the dsa_port structure
    corresponding to a slave net_device. For this purpose, introduce a
    dsa_slave_to_port() helper.

    Signed-off-by: Vivien Didelot
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Vivien Didelot
     

13 Oct, 2017

1 commit


01 Oct, 2017

1 commit

  • The DSA tagging code does not need to know about the DSA architecture,
    it only needs to return the slave device corresponding to the source
    port index (and eventually the source device index for cascade-capable
    switches) parsed from the frame received on the master device.

    For this purpose, provide an inline dsa_master_get_slave helper which
    validates the device and port indexes and look up the slave device.

    This makes the tagging rcv functions more concise and robust, and also
    makes dsa_get_cpu_port obsolete.

    Signed-off-by: Vivien Didelot
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Vivien Didelot
     

06 Sep, 2017

1 commit


22 Aug, 2017

1 commit


14 Jun, 2017

1 commit

  • Introduce a helper function which will return a reference to the CPU
    port used in a dsa_switch_tree. Right now this is a singleton, but this
    will change once we introduce multi-CPU port support, so ease the
    transition by converting the affected code paths.

    Reviewed-by: Vivien Didelot
    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     

02 Jun, 2017

2 commits

  • As of a86d8becc3f0 ("net: dsa: Factor bottom tag receive functions"),
    the rcv caller frees the original SKB in case or error.

    Be symmetric with that and make the xmit caller do the same.

    At the same time, fix the checkpatch NULL comparison check:

    CHECK: Comparison to NULL could be written "!nskb"
    #208: FILE: net/dsa/tag_trailer.c:35:
    + if (nskb == NULL)

    Signed-off-by: Vivien Didelot
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Vivien Didelot
     
  • Many rcv functions from net/dsa/tag_*.c have a useless out_drop goto
    label which simply returns NULL. Kill it in favor of the obvious.

    Reviewed-by: Florian Fainelli
    Signed-off-by: Vivien Didelot
    Signed-off-by: David S. Miller

    Vivien Didelot
     

18 May, 2017

2 commits

  • The public include/net/dsa.h file is meant for DSA drivers, while all
    DSA core files share a common private header net/dsa/dsa_priv.h file.

    Ensure that dsa_priv.h is the only DSA core file to include net/dsa.h,
    and add a new line to separate absolute and relative headers at the same
    time.

    Signed-off-by: Vivien Didelot
    Signed-off-by: David S. Miller

    Vivien Didelot
     
  • A dsa_switch_tree instance holds a dsa_switch pointer and a port index
    to identify the switch port to which the CPU is attached.

    Now that the DSA layer has a dsa_port structure to hold this data, use
    it to point the switch CPU port.

    This patch simply substitutes s/dst->cpu_switch/dst->cpu_dp->ds/ and
    s/dst->cpu_port/dst->cpu_dp->index/.

    Signed-off-by: Vivien Didelot
    Reviewed-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Vivien Didelot
     

09 Apr, 2017

3 commits

  • All DSA tag receive functions do strictly the same thing after they have located
    the originating source port from their tag specific protocol:

    - push ETH_HLEN bytes
    - set pkt_type to PACKET_HOST
    - call eth_type_trans()
    - bump up counters
    - call netif_receive_skb()

    Factor all of that into dsa_switch_rcv(). This also makes us return a pointer to
    a sk_buff, which makes us symetric with the xmit function.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     
  • All DSA tag receive functions need to unshare the skb before mangling it, move
    this to the generic dsa_switch_rcv() function which will allow us to make the
    tag receive function return their mangled skb without caring about freeing a
    NULL skb.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     
  • dsa_switch_rcv() already tests for dst == NULL, so there is no need to duplicate
    the same check within the tag receive functions.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     

29 Mar, 2017

1 commit

  • There is an include loop between netdevice.h, dsa.h, devlink.h because
    of NETDEV_ALIGN, making it impossible to use devlink structures in
    dsa.h.

    Break this loop by taking dsa.h out of netdevice.h, add a forward
    declaration of dsa_switch_tree and netdev_set_default_ethtool_ops()
    function, which is what netdevice.h requires.

    No longer having dsa.h in netdevice.h means the includes in dsa.h no
    longer get included. This breaks a few other files which depend on
    these includes. Add these directly in the affected file.

    Signed-off-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Andrew Lunn
     

30 Jan, 2017

2 commits


25 Jan, 2017

1 commit

  • We may be able to see invalid Broadcom tags when the hardware and drivers are
    misconfigured, or just while exercising the error path. Instead of flooding
    the console with messages, flat out drop the packet.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     

19 Jan, 2017

1 commit

  • Now that the DSA Ethernet switches are true Linux devices, the CPU
    switch is not necessarily the first one. If its address is higher than
    the second switch on the same MDIO bus, its index will be 1, not 0.

    Avoid any confusion by using dst->cpu_switch instead of dst->ds[0].

    Signed-off-by: Vivien Didelot
    Reviewed-by: Andrew Lunn
    Reviewed-by: Florian Fainelli
    Reviewed-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Vivien Didelot
     

05 Jun, 2016

1 commit


01 Aug, 2015

1 commit

  • All tagging protocols do the same thing: increment device statistics,
    make room for the tag to be inserted, create the tag, invoke the parent
    network device transmit function.

    In order to prepare for adding netpoll support, which requires the tag
    creation, but not using the parent network device transmit function, do
    some little refactoring which eliminates duplication between the 4
    tagging protocols supported.

    We need to return a sk_buff pointer back to the caller because the tag
    specific transmit function may have to reallocate the original skb (e.g:
    tag_trailer.c) and this is the one we should be transmitting, not the
    original sk_buff we were passed.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     

16 Sep, 2014

1 commit

  • This change addresses several issues.

    First, it was possible to set tag_protocol without setting the ops pointer.
    To correct that I have reordered things so that rcv is now populated before
    we set tag_protocol.

    Second, it didn't make much sense to keep setting the device ops each time a
    new slave was registered. So by moving the receive portion out into root
    switch initialization that issue should be addressed.

    Third, I wanted to avoid sending tags if the rcv pointer was not registered
    so I changed the tag check to verify if the rcv function pointer is set on
    the root tree. If it is then we start sending DSA tagged frames.

    Finally I split the device ops pointer in the structures into two spots. I
    placed the rcv function pointer in the root switch since this makes it
    easiest to access from there, and I placed the xmit function pointer in the
    slave for the same reason.

    Signed-off-by: Alexander Duyck
    Signed-off-by: David S. Miller

    Alexander Duyck
     

14 Sep, 2014

1 commit

  • Now that we introduced an additional multiplexing/demultiplexing layer
    with commit 3e8a72d1dae37 ("net: dsa: reduce number of protocol hooks")
    that lives within the DSA code, we no longer need to have a given switch
    driver tag_protocol be an actual ethertype value, instead, we can
    replace it with an enum: dsa_tag_protocol.

    Do this replacement in the drivers, which allows us to get rid of the
    cpu_to_be16()/htons() dance, and remove ETH_P_BRCMTAG since we do not
    need it anymore.

    Suggested-by: Alexander Duyck
    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     

28 Aug, 2014

1 commit

  • Add support for the 4-bytes Broadcom tag that built-in switches such as
    the Starfighter 2 might insert when receiving packets, or that we need
    to insert while targetting specific switch ports. We use a fake local
    EtherType value for this 4-bytes switch tag: ETH_P_BRCMTAG to make sure
    we can assign DSA-specific network operations within the DSA drivers.

    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli