From mboxrd@z Thu Jan 1 00:00:00 1970 From: Subject: [PATCH RFC 5/6] net: dsa: microchip: Update tag_ksz.c to access switch driver Date: Mon, 3 Dec 2018 15:34:56 -0800 Message-ID: <1543880097-7106-6-git-send-email-Tristram.Ha@microchip.com> References: <1543880097-7106-1-git-send-email-Tristram.Ha@microchip.com> Mime-Version: 1.0 Content-Type: text/plain Cc: Tristram Ha , , To: Andrew Lunn , Florian Fainelli , Pavel Machek Return-path: Received: from esa2.microchip.iphmx.com ([68.232.149.84]:44889 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725984AbeLCXfC (ORCPT ); Mon, 3 Dec 2018 18:35:02 -0500 In-Reply-To: <1543880097-7106-1-git-send-email-Tristram.Ha@microchip.com> Sender: netdev-owner@vger.kernel.org List-ID: From: Tristram Ha Update tag_ksz.c to access switch driver's tail tagging operations. Signed-off-by: Tristram Ha --- net/dsa/tag_ksz.c | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index 0f62eff..307e58b 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -11,37 +11,25 @@ #include #include #include +#include #include #include "dsa_priv.h" -/* For Ingress (Host -> KSZ), 2 bytes are added before FCS. - * --------------------------------------------------------------------------- - * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|tag0(1byte)|tag1(1byte)|FCS(4bytes) - * --------------------------------------------------------------------------- - * tag0 : Prioritization (not used now) - * tag1 : each bit represents port (eg, 0x01=port1, 0x02=port2, 0x10=port5) - * - * For Egress (KSZ -> Host), 1 byte is added before FCS. - * --------------------------------------------------------------------------- - * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|tag0(1byte)|FCS(4bytes) - * --------------------------------------------------------------------------- - * tag0 : zero-based value represents port - * (eg, 0x00=port1, 0x02=port3, 0x06=port7) - */ - -#define KSZ_INGRESS_TAG_LEN 2 #define KSZ_EGRESS_TAG_LEN 1 static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) { struct dsa_port *dp = dsa_slave_to_port(dev); + struct ksz_device *sw = dp->ds->priv; struct sk_buff *nskb; + int len; int padlen; - u8 *tag; + + len = sw->tag_ops->get_len(sw); padlen = (skb->len >= ETH_ZLEN) ? 0 : ETH_ZLEN - skb->len; - if (skb_tailroom(skb) >= padlen + KSZ_INGRESS_TAG_LEN) { + if (skb_tailroom(skb) >= padlen + len) { /* Let dsa_slave_xmit() free skb */ if (__skb_put_padto(skb, skb->len + padlen, false)) return NULL; @@ -49,7 +37,7 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) nskb = skb; } else { nskb = alloc_skb(NET_IP_ALIGN + skb->len + - padlen + KSZ_INGRESS_TAG_LEN, GFP_ATOMIC); + padlen + len, GFP_ATOMIC); if (!nskb) return NULL; skb_reserve(nskb, NET_IP_ALIGN); @@ -70,9 +58,8 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) consume_skb(skb); } - tag = skb_put(nskb, KSZ_INGRESS_TAG_LEN); - tag[0] = 0; - tag[1] = 1 << dp->index; /* destination port */ + sw->tag_ops->set_tag(sw, skb_put(nskb, len), skb_mac_header(nskb), + dp->index); return nskb; } @@ -80,18 +67,27 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) static struct sk_buff *ksz_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { + struct dsa_port *cpu_dp = dev->dsa_ptr; + struct dsa_switch_tree *dst = cpu_dp->dst; + struct dsa_switch *ds = dst->ds[0]; + struct ksz_device *sw; u8 *tag; + int len; int source_port; + if (!ds) + return NULL; + sw = ds->priv; + tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; - source_port = tag[0] & 7; + len = sw->tag_ops->get_tag(sw, tag, &source_port); skb->dev = dsa_master_find_slave(dev, 0, source_port); if (!skb->dev) return NULL; - pskb_trim_rcsum(skb, skb->len - KSZ_EGRESS_TAG_LEN); + pskb_trim_rcsum(skb, skb->len - len); return skb; } -- 1.9.1