From: Andrew Lunn <andrew@lunn.ch>
A RMU frame sent to the switch needs a DSA header. Add a helper to the
tag driver to add such a header to an skbuff, and provide access to
the helper via the tagger data structure. This keeps most of the
details of the DSA header in the tag driver.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
include/linux/dsa/mv88e6xxx.h | 3 +++
net/dsa/tag_dsa.c | 24 ++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/include/linux/dsa/mv88e6xxx.h b/include/linux/dsa/mv88e6xxx.h
index 1e9460d6f7782..74a885b3bc4cb 100644
--- a/include/linux/dsa/mv88e6xxx.h
+++ b/include/linux/dsa/mv88e6xxx.h
@@ -13,6 +13,9 @@ struct dsa_tagger_data {
void (*rmu_frame2reg)(struct dsa_switch *ds,
struct sk_buff *skb,
u8 seqno);
+ /* Add DSA header to frame to be sent to switch */
+ void (*rmu_reg2frame)(struct dsa_switch *ds,
+ struct sk_buff *skb);
};
#define MV88E6XXX_VID_STANDALONE 0diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c
index 5a95873e87340..a23c3279c49bd 100644
--- a/net/dsa/tag_dsa.c
+++ b/net/dsa/tag_dsa.c
@@ -341,6 +341,29 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev,
return skb;
}
+static void dsa_rmu_reg2frame(struct dsa_switch *ds,
+ struct sk_buff *skb)
+{
+ enum dsa_cmd cmd = DSA_CMD_FROM_CPU;
+ u8 tag_dev = ds->index;
+ u8 *dsa_header;
+
+ dsa_header = skb_push(skb, DSA_HLEN);
+ dsa_header[0] = (cmd << 6) | tag_dev;
+ dsa_header[1] = BIT(1) | 0x3e << 2;
+ dsa_header[2] = 6 << 5 | 0xf;
+ dsa_header[3] = 0; /* Sequence number is filled in later */
+
+ if (ds->dst->tag_ops->proto == DSA_TAG_PROTO_EDSA) {
+ u8 *edsa_header = skb_push(skb, 4);
+
+ edsa_header[0] = (ETH_P_EDSA >> 8) & 0xff;
+ edsa_header[1] = ETH_P_EDSA & 0xff;
+ edsa_header[2] = 0x00;
+ edsa_header[3] = 0x00;
+ }
+}
+
static int dsa_tag_connect(struct dsa_switch *ds)
{
struct dsa_tagger_data *tagger_data;@@ -349,6 +372,7 @@ static int dsa_tag_connect(struct dsa_switch *ds)
if (!tagger_data)
return -ENOMEM;
+ tagger_data->rmu_reg2frame = dsa_rmu_reg2frame;
ds->tagger_data = tagger_data;
return 0;
--
2.43.0