@@ -2034,6 +2034,7 @@ static bool b53_can_enable_brcm_tags(struct dsa_switch *ds, int port,switch(tag_protocol){caseDSA_TAG_PROTO_BRCM:+caseDSA_TAG_PROTO_BRCM_LEGACY:caseDSA_TAG_PROTO_BRCM_PREPEND:dev_warn(ds->dev,"Port %d is stacked to Broadcom tag switch\n",port);
@@ -2055,12 +2056,16 @@ enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds, int port,/* Older models (5325, 5365) support a different tag format that we do*notsupportinnet/dsa/tag_brcm.cyet.*/-if(is5325(dev)||is5365(dev)||-!b53_can_enable_brcm_tags(ds,port,mprot)){+if(!b53_can_enable_brcm_tags(ds,port,mprot)){dev->tag_protocol=DSA_TAG_PROTO_NONE;gotoout;}+if(is5325(dev)||is5365(dev)||is63xx(dev)){+dev->tag_protocol=DSA_TAG_PROTO_BRCM_LEGACY;+gotoout;+}+/* Broadcom BCM58xx chips have a flow accelerator on Port 8*whichrequiresustousetheprependedBroadcomtagtype*/
Add support for legacy Broadcom tags, which are similar to DSA_TAG_PROTO_BRCM.
These tags are used on BCM5325, BCM5365 and BCM63xx switches.
Signed-off-by: Álvaro Fernández Rojas <redacted>
---
include/net/dsa.h | 2 +
net/dsa/Kconfig | 7 ++++
net/dsa/tag_brcm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 105 insertions(+)
@@ -9,9 +9,23 @@#include<linux/etherdevice.h>#include<linux/list.h>#include<linux/slab.h>+#include<linux/types.h>#include"dsa_priv.h"+structbcm_legacy_tag{+uint16_ttype;+#define BRCM_LEG_TYPE 0x8874++uint32_ttag;+#define BRCM_LEG_TAG_PORT_ID (0xf)+#define BRCM_LEG_TAG_MULTICAST (1 << 29)+#define BRCM_LEG_TAG_EGRESS (2 << 29)+#define BRCM_LEG_TAG_INGRESS (3 << 29)+}__attribute__((packed));++#define BRCM_LEG_TAG_LEN sizeof(struct bcm_legacy_tag)+/* This tag length is 4 bytes, older ones were 6 bytes, we do not*handlethem*/
@@ -195,6 +209,85 @@ DSA_TAG_DRIVER(brcm_netdev_ops);MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM);#endif+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)+staticstructsk_buff*brcm_leg_tag_xmit(structsk_buff*skb,+structnet_device*dev)+{+structdsa_port*dp=dsa_slave_to_port(dev);+structbcm_legacy_tag*brcm_tag;++if(skb_cow_head(skb,BRCM_LEG_TAG_LEN)<0)+returnNULL;++/* The Ethernet switch we are interfaced with needs packets to be at+*least64bytes(includingFCS)otherwisetheywillbediscardedwhen+*theyentertheswitchportlogic.WhenBroadcomtagsareenabled,we+*needtomakesurethatpacketsareatleast70bytes+*(includingFCSandtag)becausethelengthverificationisdoneafter+*theBroadcomtagisstrippedofftheingresspacket.+*+*Letdsa_slave_xmit()freetheSKB+*/+if(__skb_put_padto(skb,ETH_ZLEN+BRCM_LEG_TAG_LEN,false))+returnNULL;++skb_push(skb,BRCM_LEG_TAG_LEN);++memmove(skb->data,skb->data+BRCM_LEG_TAG_LEN,2*ETH_ALEN);++brcm_tag=(structbcm_legacy_tag*)(skb->data+2*ETH_ALEN);++brcm_tag->type=BRCM_LEG_TYPE;+brcm_tag->tag=BRCM_LEG_TAG_EGRESS;+brcm_tag->tag|=dp->index&BRCM_LEG_TAG_PORT_ID;++returnskb;+}+++staticstructsk_buff*brcm_leg_tag_rcv(structsk_buff*skb,+structnet_device*dev,+structpacket_type*pt)+{+intsource_port;+structbcm_legacy_tag*brcm_tag;++if(unlikely(!pskb_may_pull(skb,BRCM_LEG_TAG_LEN)))+returnNULL;++brcm_tag=(structbcm_legacy_tag*)(skb->data-2);++source_port=brcm_tag->tag&BRCM_LEG_TAG_PORT_ID;++skb->dev=dsa_master_find_slave(dev,0,source_port);+if(!skb->dev)+returnNULL;++/* Remove Broadcom tag and update checksum */+skb_pull_rcsum(skb,BRCM_LEG_TAG_LEN);++skb->offload_fwd_mark=1;++/* Move the Ethernet DA and SA */+memmove(skb->data-ETH_HLEN,+skb->data-ETH_HLEN-BRCM_LEG_TAG_LEN,+2*ETH_ALEN);++returnskb;+}++staticconststructdsa_device_opsbrcm_legacy_netdev_ops={+.name="brcm-legacy",+.proto=DSA_TAG_PROTO_BRCM_LEGACY,+.xmit=brcm_leg_tag_xmit,+.rcv=brcm_leg_tag_rcv,+.overhead=BRCM_LEG_TAG_LEN,+};++DSA_TAG_DRIVER(brcm_legacy_netdev_ops);+MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY);+#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY */+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND)staticstructsk_buff*brcm_tag_xmit_prepend(structsk_buff*skb,structnet_device*dev)
I am not sure about that one, so for now we can probably be
conservative. You can definitively not "stack" two or more switches that
are configured with DSA_TAG_PROTO_BRCM because the first switch
receiving the Broadcom tag will terminate it locally and not pass it up.
The legacy Broadcom tag however is different and has a "Scr Dev ID"
field which is intended to support cascading. Whether that works with
only DSA_TAG_PROTO_BRCM_LEGACY or across DSA_PROTO_BRCM_LEGACY +
DSA_TAG_PROTO_BRCM may be something you will have to determine.
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
On 3/15/2021 7:27 AM, Álvaro Fernández Rojas wrote:
quoted hunk
Add support for legacy Broadcom tags, which are similar to DSA_TAG_PROTO_BRCM.
These tags are used on BCM5325, BCM5365 and BCM63xx switches.
Signed-off-by: Álvaro Fernández Rojas <redacted>
---
include/net/dsa.h | 2 +
net/dsa/Kconfig | 7 ++++
net/dsa/tag_brcm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 105 insertions(+)
Please define these as relatives within a byte such that only byte
accesses are done, thus eliminating any endian issues, your code for
instance will work fine on a big-endian machine (like the 63xx you have
tested) but not on a little-endian machine.
Other than that, this looks good, thanks!
quoted hunk
+
+#define BRCM_LEG_TAG_LEN sizeof(struct bcm_legacy_tag)
+
/* This tag length is 4 bytes, older ones were 6 bytes, we do not
* handle them
*/
@@ -195,6 +209,85 @@ DSA_TAG_DRIVER(brcm_netdev_ops); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM); #endif+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)+static struct sk_buff *brcm_leg_tag_xmit(struct sk_buff *skb,+ struct net_device *dev)+{+ struct dsa_port *dp = dsa_slave_to_port(dev);+ struct bcm_legacy_tag *brcm_tag;++ if (skb_cow_head(skb, BRCM_LEG_TAG_LEN) < 0)+ return NULL;++ /* The Ethernet switch we are interfaced with needs packets to be at+ * least 64 bytes (including FCS) otherwise they will be discarded when+ * they enter the switch port logic. When Broadcom tags are enabled, we+ * need to make sure that packets are at least 70 bytes+ * (including FCS and tag) because the length verification is done after+ * the Broadcom tag is stripped off the ingress packet.+ *+ * Let dsa_slave_xmit() free the SKB+ */+ if (__skb_put_padto(skb, ETH_ZLEN + BRCM_LEG_TAG_LEN, false))+ return NULL;++ skb_push(skb, BRCM_LEG_TAG_LEN);++ memmove(skb->data, skb->data + BRCM_LEG_TAG_LEN, 2 * ETH_ALEN);++ brcm_tag = (struct bcm_legacy_tag *) (skb->data + 2 * ETH_ALEN);++ brcm_tag->type = BRCM_LEG_TYPE;+ brcm_tag->tag = BRCM_LEG_TAG_EGRESS;+ brcm_tag->tag |= dp->index & BRCM_LEG_TAG_PORT_ID;++ return skb;+}+++static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb,+ struct net_device *dev,+ struct packet_type *pt)+{+ int source_port;+ struct bcm_legacy_tag *brcm_tag;++ if (unlikely(!pskb_may_pull(skb, BRCM_LEG_TAG_LEN)))+ return NULL;++ brcm_tag = (struct bcm_legacy_tag *) (skb->data - 2);++ source_port = brcm_tag->tag & BRCM_LEG_TAG_PORT_ID;++ skb->dev = dsa_master_find_slave(dev, 0, source_port);+ if (!skb->dev)+ return NULL;++ /* Remove Broadcom tag and update checksum */+ skb_pull_rcsum(skb, BRCM_LEG_TAG_LEN);++ skb->offload_fwd_mark = 1;++ /* Move the Ethernet DA and SA */+ memmove(skb->data - ETH_HLEN,+ skb->data - ETH_HLEN - BRCM_LEG_TAG_LEN,+ 2 * ETH_ALEN);++ return skb;+}++static const struct dsa_device_ops brcm_legacy_netdev_ops = {+ .name = "brcm-legacy",+ .proto = DSA_TAG_PROTO_BRCM_LEGACY,+ .xmit = brcm_leg_tag_xmit,+ .rcv = brcm_leg_tag_rcv,+ .overhead = BRCM_LEG_TAG_LEN,+};++DSA_TAG_DRIVER(brcm_legacy_netdev_ops);+MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY);+#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY */+ #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND) static struct sk_buff *brcm_tag_xmit_prepend(struct sk_buff *skb, struct net_device *dev)
From: Vladimir Oltean <olteanv@gmail.com> Date: 2021-03-15 21:29:28
On Mon, Mar 15, 2021 at 03:27:35PM +0100, Álvaro Fernández Rojas wrote:
quoted hunk
Add support for legacy Broadcom tags, which are similar to DSA_TAG_PROTO_BRCM.
These tags are used on BCM5325, BCM5365 and BCM63xx switches.
Signed-off-by: Álvaro Fernández Rojas <redacted>
---
include/net/dsa.h | 2 +
net/dsa/Kconfig | 7 ++++
net/dsa/tag_brcm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 105 insertions(+)
@@ -48,6 +48,13 @@ config NET_DSA_TAG_BRCMSayYifyouwanttoenablesupportfortaggingframesfortheBroadcomswitcheswhichplacethetagaftertheMACsourceaddress.+configNET_DSA_TAG_BRCM_LEGACY+tristate"Tag driver for Broadcom legacy switches using in-frame headers"
Aren't all headers in-frame?
quoted hunk
+ select NET_DSA_TAG_BRCM_COMMON
+ help
+ Say Y if you want to enable support for tagging frames for the
+ Broadcom legacy switches which place the tag after the MAC source
+ address.
config NET_DSA_TAG_BRCM_PREPEND
tristate "Tag driver for Broadcom switches using prepended headers"
This is not needed since commit 2f0d030c5ffe ("net: dsa: tag_brcm: let
DSA core deal with TX reallocation").
+ /* The Ethernet switch we are interfaced with needs packets to be at
+ * least 64 bytes (including FCS) otherwise they will be discarded when
+ * they enter the switch port logic. When Broadcom tags are enabled, we
+ * need to make sure that packets are at least 70 bytes
+ * (including FCS and tag) because the length verification is done after
+ * the Broadcom tag is stripped off the ingress packet.
+ *
+ * Let dsa_slave_xmit() free the SKB
+ */
+ if (__skb_put_padto(skb, ETH_ZLEN + BRCM_LEG_TAG_LEN, false))
+ return NULL;
Are you sure the switches you're working on need this, or is it just
another copy-pasta?
El 15 mar 2021, a las 22:28, Vladimir Oltean [off-list ref] escribió:
On Mon, Mar 15, 2021 at 03:27:35PM +0100, Álvaro Fernández Rojas wrote:
quoted
Add support for legacy Broadcom tags, which are similar to DSA_TAG_PROTO_BRCM.
These tags are used on BCM5325, BCM5365 and BCM63xx switches.
Signed-off-by: Álvaro Fernández Rojas <redacted>
---
include/net/dsa.h | 2 +
net/dsa/Kconfig | 7 ++++
net/dsa/tag_brcm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 105 insertions(+)
Say Y if you want to enable support for tagging frames for the
Broadcom switches which place the tag after the MAC source address.
+config NET_DSA_TAG_BRCM_LEGACY
+ tristate "Tag driver for Broadcom legacy switches using in-frame headers"
+ select NET_DSA_TAG_BRCM_COMMON
+ help
+ Say Y if you want to enable support for tagging frames for the
+ Broadcom legacy switches which place the tag after the MAC source
+ address.
config NET_DSA_TAG_BRCM_PREPEND
tristate "Tag driver for Broadcom switches using prepended headers"
This is not needed since commit 2f0d030c5ffe ("net: dsa: tag_brcm: let
DSA core deal with TX reallocation").
I’m testing this on v5.10 and I forgot to remove it, sorry :$.
quoted
+ /* The Ethernet switch we are interfaced with needs packets to be at
+ * least 64 bytes (including FCS) otherwise they will be discarded when
+ * they enter the switch port logic. When Broadcom tags are enabled, we
+ * need to make sure that packets are at least 70 bytes
+ * (including FCS and tag) because the length verification is done after
+ * the Broadcom tag is stripped off the ingress packet.
+ *
+ * Let dsa_slave_xmit() free the SKB
+ */
+ if (__skb_put_padto(skb, ETH_ZLEN + BRCM_LEG_TAG_LEN, false))
+ return NULL;
Are you sure the switches you're working on need this, or is it just
another copy-pasta?
From: Jonas Gorski <jonas.gorski@gmail.com> Date: 2021-03-17 11:22:30
On Wed, 17 Mar 2021 at 10:16, Álvaro Fernández Rojas [off-list ref] wrote:
Hi Vladimir,
quoted
El 15 mar 2021, a las 22:28, Vladimir Oltean [off-list ref] escribió:
On Mon, Mar 15, 2021 at 03:27:35PM +0100, Álvaro Fernández Rojas wrote:
quoted
Add support for legacy Broadcom tags, which are similar to DSA_TAG_PROTO_BRCM.
These tags are used on BCM5325, BCM5365 and BCM63xx switches.
Signed-off-by: Álvaro Fernández Rojas <redacted>
---
include/net/dsa.h | 2 +
net/dsa/Kconfig | 7 ++++
net/dsa/tag_brcm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 105 insertions(+)
Is there no better qualifier for this tagging protocol name than "legacy"?
It’s always referred to as “legacy”, so that’s what I used.
Maybe @Florian can suggest a better name for this...
Broadcom refers to both as "the BRCM tag" or "the Broadcom Management
Header/Tag" in documentation with no versioning at all.
Codewise, the brcm963xx code names the old one BRCM_TAG and the newer
one BRCM_TAG_TYPE2. Not really better IMHO.
Maybe BRCM_OLD? less characters than Legacy, and doesn't need to be abbreviated.
To make matters worse, there seem to exist different versions of the
tag variants where some opcodes mean different things, e.g. BCM5325
might set the opcode to 1 for Multicast frames.
I would probably suggest enabling it only for switch models we
verified to be working with it.
On a different side node, should the dsa_tag_protocol be ordered
numerically, i.e. should DSA_TAG_PROTO_BRCM_PREPEND be the last one
since it is the highest with 22?
This means that the tag is inserted after the SRC/DST mac addresses,
in contrast to BRCM_PREPEND that gets prepended to the full frame.
quoted
quoted
+ select NET_DSA_TAG_BRCM_COMMON
+ help
+ Say Y if you want to enable support for tagging frames for the
+ Broadcom legacy switches which place the tag after the MAC source
+ address.
config NET_DSA_TAG_BRCM_PREPEND
tristate "Tag driver for Broadcom switches using prepended headers"