Commit b74b70c4 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller

net: dsa: Support prepended Broadcom tag

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: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f7c39e3d
...@@ -29,6 +29,7 @@ struct fixed_phy_status; ...@@ -29,6 +29,7 @@ struct fixed_phy_status;
enum dsa_tag_protocol { enum dsa_tag_protocol {
DSA_TAG_PROTO_NONE = 0, DSA_TAG_PROTO_NONE = 0,
DSA_TAG_PROTO_BRCM, DSA_TAG_PROTO_BRCM,
DSA_TAG_PROTO_BRCM_PREPEND,
DSA_TAG_PROTO_DSA, DSA_TAG_PROTO_DSA,
DSA_TAG_PROTO_EDSA, DSA_TAG_PROTO_EDSA,
DSA_TAG_PROTO_KSZ, DSA_TAG_PROTO_KSZ,
......
...@@ -19,6 +19,9 @@ if NET_DSA ...@@ -19,6 +19,9 @@ if NET_DSA
config NET_DSA_TAG_BRCM config NET_DSA_TAG_BRCM
bool bool
config NET_DSA_TAG_BRCM_PREPEND
bool
config NET_DSA_TAG_DSA config NET_DSA_TAG_DSA
bool bool
......
...@@ -5,6 +5,7 @@ dsa_core-y += dsa.o dsa2.o legacy.o master.o port.o slave.o switch.o ...@@ -5,6 +5,7 @@ dsa_core-y += dsa.o dsa2.o legacy.o master.o port.o slave.o switch.o
# tagging formats # tagging formats
dsa_core-$(CONFIG_NET_DSA_TAG_BRCM) += tag_brcm.o dsa_core-$(CONFIG_NET_DSA_TAG_BRCM) += tag_brcm.o
dsa_core-$(CONFIG_NET_DSA_TAG_BRCM_PREPEND) += tag_brcm.o
dsa_core-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o dsa_core-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o
dsa_core-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o dsa_core-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o
dsa_core-$(CONFIG_NET_DSA_TAG_KSZ) += tag_ksz.o dsa_core-$(CONFIG_NET_DSA_TAG_KSZ) += tag_ksz.o
......
...@@ -44,6 +44,9 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = { ...@@ -44,6 +44,9 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = {
#ifdef CONFIG_NET_DSA_TAG_BRCM #ifdef CONFIG_NET_DSA_TAG_BRCM
[DSA_TAG_PROTO_BRCM] = &brcm_netdev_ops, [DSA_TAG_PROTO_BRCM] = &brcm_netdev_ops,
#endif #endif
#ifdef CONFIG_NET_DSA_TAG_BRCM_PREPEND
[DSA_TAG_PROTO_BRCM_PREPEND] = &brcm_prepend_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_DSA #ifdef CONFIG_NET_DSA_TAG_DSA
[DSA_TAG_PROTO_DSA] = &dsa_netdev_ops, [DSA_TAG_PROTO_DSA] = &dsa_netdev_ops,
#endif #endif
......
...@@ -191,6 +191,7 @@ void dsa_switch_unregister_notifier(struct dsa_switch *ds); ...@@ -191,6 +191,7 @@ void dsa_switch_unregister_notifier(struct dsa_switch *ds);
/* tag_brcm.c */ /* tag_brcm.c */
extern const struct dsa_device_ops brcm_netdev_ops; extern const struct dsa_device_ops brcm_netdev_ops;
extern const struct dsa_device_ops brcm_prepend_netdev_ops;
/* tag_dsa.c */ /* tag_dsa.c */
extern const struct dsa_device_ops dsa_netdev_ops; extern const struct dsa_device_ops dsa_netdev_ops;
......
...@@ -96,13 +96,6 @@ static struct sk_buff *brcm_tag_xmit_ll(struct sk_buff *skb, ...@@ -96,13 +96,6 @@ static struct sk_buff *brcm_tag_xmit_ll(struct sk_buff *skb,
return skb; return skb;
} }
static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb,
struct net_device *dev)
{
/* Build the tag after the MAC Source Address */
return brcm_tag_xmit_ll(skb, dev, 2 * ETH_ALEN);
}
static struct sk_buff *brcm_tag_rcv_ll(struct sk_buff *skb, static struct sk_buff *brcm_tag_rcv_ll(struct sk_buff *skb,
struct net_device *dev, struct net_device *dev,
struct packet_type *pt, struct packet_type *pt,
...@@ -139,6 +132,15 @@ static struct sk_buff *brcm_tag_rcv_ll(struct sk_buff *skb, ...@@ -139,6 +132,15 @@ static struct sk_buff *brcm_tag_rcv_ll(struct sk_buff *skb,
return skb; return skb;
} }
#ifdef CONFIG_NET_DSA_TAG_BRCM
static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb,
struct net_device *dev)
{
/* Build the tag after the MAC Source Address */
return brcm_tag_xmit_ll(skb, dev, 2 * ETH_ALEN);
}
static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt) struct packet_type *pt)
{ {
...@@ -161,3 +163,26 @@ const struct dsa_device_ops brcm_netdev_ops = { ...@@ -161,3 +163,26 @@ const struct dsa_device_ops brcm_netdev_ops = {
.xmit = brcm_tag_xmit, .xmit = brcm_tag_xmit,
.rcv = brcm_tag_rcv, .rcv = brcm_tag_rcv,
}; };
#endif
#ifdef CONFIG_NET_DSA_TAG_BRCM_PREPEND
static struct sk_buff *brcm_tag_xmit_prepend(struct sk_buff *skb,
struct net_device *dev)
{
/* tag is prepended to the packet */
return brcm_tag_xmit_ll(skb, dev, 0);
}
static struct sk_buff *brcm_tag_rcv_prepend(struct sk_buff *skb,
struct net_device *dev,
struct packet_type *pt)
{
/* tag is prepended to the packet */
return brcm_tag_rcv_ll(skb, dev, pt, ETH_HLEN);
}
const struct dsa_device_ops brcm_prepend_netdev_ops = {
.xmit = brcm_tag_xmit_prepend,
.rcv = brcm_tag_rcv_prepend,
};
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment