mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 13:23:18 +00:00
dsa: add support for Arrow XRS700x tag trailer
Add support for Arrow SpeedChips XRS700x single byte tag trailer. This is modeled on tag_trailer.c which works in a similar way. Signed-off-by: George McCollister <george.mccollister@gmail.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Reviewed-by: Vladimir Oltean <olteanv@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
e7fa5c80de
commit
54a52823a2
@ -46,6 +46,7 @@ struct phylink_link_state;
|
||||
#define DSA_TAG_PROTO_AR9331_VALUE 16
|
||||
#define DSA_TAG_PROTO_RTL4_A_VALUE 17
|
||||
#define DSA_TAG_PROTO_HELLCREEK_VALUE 18
|
||||
#define DSA_TAG_PROTO_XRS700X_VALUE 19
|
||||
|
||||
enum dsa_tag_protocol {
|
||||
DSA_TAG_PROTO_NONE = DSA_TAG_PROTO_NONE_VALUE,
|
||||
@ -67,6 +68,7 @@ enum dsa_tag_protocol {
|
||||
DSA_TAG_PROTO_AR9331 = DSA_TAG_PROTO_AR9331_VALUE,
|
||||
DSA_TAG_PROTO_RTL4_A = DSA_TAG_PROTO_RTL4_A_VALUE,
|
||||
DSA_TAG_PROTO_HELLCREEK = DSA_TAG_PROTO_HELLCREEK_VALUE,
|
||||
DSA_TAG_PROTO_XRS700X = DSA_TAG_PROTO_XRS700X_VALUE,
|
||||
};
|
||||
|
||||
struct packet_type;
|
||||
|
@ -139,4 +139,10 @@ config NET_DSA_TAG_TRAILER
|
||||
Say Y or M if you want to enable support for tagging frames at
|
||||
with a trailed. e.g. Marvell 88E6060.
|
||||
|
||||
config NET_DSA_TAG_XRS700X
|
||||
tristate "Tag driver for XRS700x switches"
|
||||
help
|
||||
Say Y or M if you want to enable support for tagging frames for
|
||||
Arrow SpeedChips XRS700x switches that use a single byte tag trailer.
|
||||
|
||||
endif
|
||||
|
@ -18,3 +18,4 @@ obj-$(CONFIG_NET_DSA_TAG_OCELOT) += tag_ocelot.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_QCA) += tag_qca.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_SJA1105) += tag_sja1105.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag_trailer.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_XRS700X) += tag_xrs700x.o
|
||||
|
61
net/dsa/tag_xrs700x.c
Normal file
61
net/dsa/tag_xrs700x.c
Normal file
@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* XRS700x tag format handling
|
||||
* Copyright (c) 2008-2009 Marvell Semiconductor
|
||||
* Copyright (c) 2020 NovaTech LLC
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include "dsa_priv.h"
|
||||
|
||||
static struct sk_buff *xrs700x_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct dsa_port *dp = dsa_slave_to_port(dev);
|
||||
u8 *trailer;
|
||||
|
||||
trailer = skb_put(skb, 1);
|
||||
trailer[0] = BIT(dp->index);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *xrs700x_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt)
|
||||
{
|
||||
int source_port;
|
||||
u8 *trailer;
|
||||
|
||||
trailer = skb_tail_pointer(skb) - 1;
|
||||
|
||||
source_port = ffs((int)trailer[0]) - 1;
|
||||
|
||||
if (source_port < 0)
|
||||
return NULL;
|
||||
|
||||
skb->dev = dsa_master_find_slave(dev, 0, source_port);
|
||||
if (!skb->dev)
|
||||
return NULL;
|
||||
|
||||
if (pskb_trim_rcsum(skb, skb->len - 1))
|
||||
return NULL;
|
||||
|
||||
/* Frame is forwarded by hardware, don't forward in software. */
|
||||
skb->offload_fwd_mark = 1;
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static const struct dsa_device_ops xrs700x_netdev_ops = {
|
||||
.name = "xrs700x",
|
||||
.proto = DSA_TAG_PROTO_XRS700X,
|
||||
.xmit = xrs700x_xmit,
|
||||
.rcv = xrs700x_rcv,
|
||||
.overhead = 1,
|
||||
.tail_tag = true,
|
||||
};
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_XRS700X);
|
||||
|
||||
module_dsa_tag_driver(xrs700x_netdev_ops);
|
Loading…
Reference in New Issue
Block a user