From b99a0ca91110fdd31df242e5761d3990e2f57675 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 19 Mar 2021 11:49:08 +0100 Subject: [PATCH] 4.19-stable patches added patches: net-dsa-b53-support-setting-learning-on-port.patch net-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch --- ...b53-support-setting-learning-on-port.patch | 107 ++++++++++++++++++ ...-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch | 83 ++++++++++++++ queue-4.19/series | 2 + 3 files changed, 192 insertions(+) create mode 100644 queue-4.19/net-dsa-b53-support-setting-learning-on-port.patch create mode 100644 queue-4.19/net-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch diff --git a/queue-4.19/net-dsa-b53-support-setting-learning-on-port.patch b/queue-4.19/net-dsa-b53-support-setting-learning-on-port.patch new file mode 100644 index 00000000000..0b1f5fa65d4 --- /dev/null +++ b/queue-4.19/net-dsa-b53-support-setting-learning-on-port.patch @@ -0,0 +1,107 @@ +From f9b3827ee66cfcf297d0acd6ecf33653a5f297ef Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Mon, 22 Feb 2021 14:30:10 -0800 +Subject: net: dsa: b53: Support setting learning on port + +From: Florian Fainelli + +commit f9b3827ee66cfcf297d0acd6ecf33653a5f297ef upstream. + +Add support for being able to set the learning attribute on port, and +make sure that the standalone ports start up with learning disabled. + +We can remove the code in bcm_sf2 that configured the ports learning +attribute because we want the standalone ports to have learning disabled +by default and port 7 cannot be bridged, so its learning attribute will +not change past its initial configuration. + +Signed-off-by: Florian Fainelli +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/dsa/b53/b53_common.c | 19 +++++++++++++++++++ + drivers/net/dsa/b53/b53_regs.h | 1 + + drivers/net/dsa/bcm_sf2.c | 5 ----- + 3 files changed, 20 insertions(+), 5 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -507,12 +507,27 @@ void b53_imp_vlan_setup(struct dsa_switc + } + EXPORT_SYMBOL(b53_imp_vlan_setup); + ++static void b53_port_set_learning(struct b53_device *dev, int port, ++ bool learning) ++{ ++ u16 reg; ++ ++ b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, ®); ++ if (learning) ++ reg &= ~BIT(port); ++ else ++ reg |= BIT(port); ++ b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, reg); ++} ++ + int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy) + { + struct b53_device *dev = ds->priv; + unsigned int cpu_port = ds->ports[port].cpu_dp->index; + u16 pvlan; + ++ b53_port_set_learning(dev, port, false); ++ + /* Clear the Rx and Tx disable bits and set to no spanning tree */ + b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), 0); + +@@ -620,6 +635,7 @@ static void b53_enable_cpu_port(struct b + b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), port_ctrl); + + b53_brcm_hdr_setup(dev->ds, port); ++ b53_port_set_learning(dev, port, false); + } + + static void b53_enable_mib(struct b53_device *dev) +@@ -1517,6 +1533,8 @@ int b53_br_join(struct dsa_switch *ds, i + b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), pvlan); + dev->ports[port].vlan_ctl_mask = pvlan; + ++ b53_port_set_learning(dev, port, true); ++ + return 0; + } + EXPORT_SYMBOL(b53_br_join); +@@ -1564,6 +1582,7 @@ void b53_br_leave(struct dsa_switch *ds, + vl->untag |= BIT(port) | BIT(cpu_port); + b53_set_vlan_entry(dev, pvid, vl); + } ++ b53_port_set_learning(dev, port, false); + } + EXPORT_SYMBOL(b53_br_leave); + +--- a/drivers/net/dsa/b53/b53_regs.h ++++ b/drivers/net/dsa/b53/b53_regs.h +@@ -115,6 +115,7 @@ + #define B53_UC_FLOOD_MASK 0x32 + #define B53_MC_FLOOD_MASK 0x34 + #define B53_IPMC_FLOOD_MASK 0x36 ++#define B53_DIS_LEARNING 0x3c + + /* + * Override Ports 0-7 State on devices with xMII interfaces (8 bit) +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -173,11 +173,6 @@ static int bcm_sf2_port_setup(struct dsa + reg &= ~P_TXQ_PSM_VDD(port); + core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); + +- /* Enable learning */ +- reg = core_readl(priv, CORE_DIS_LEARN); +- reg &= ~BIT(port); +- core_writel(priv, reg, CORE_DIS_LEARN); +- + /* Enable Broadcom tags for that port if requested */ + if (priv->brcm_tag_mask & BIT(port)) + b53_brcm_hdr_setup(ds, port); diff --git a/queue-4.19/net-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch b/queue-4.19/net-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch new file mode 100644 index 00000000000..6b774ecb2fb --- /dev/null +++ b/queue-4.19/net-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch @@ -0,0 +1,83 @@ +From 9200f515c41f4cbaeffd8fdd1d8b6373a18b1b67 Mon Sep 17 00:00:00 2001 +From: DENG Qingfang +Date: Tue, 2 Mar 2021 00:01:59 +0800 +Subject: net: dsa: tag_mtk: fix 802.1ad VLAN egress + +From: DENG Qingfang + +commit 9200f515c41f4cbaeffd8fdd1d8b6373a18b1b67 upstream. + +A different TPID bit is used for 802.1ad VLAN frames. + +Reported-by: Ilario Gelmetti +Fixes: f0af34317f4b ("net: dsa: mediatek: combine MediaTek tag with VLAN tag") +Signed-off-by: DENG Qingfang +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + net/dsa/tag_mtk.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +--- a/net/dsa/tag_mtk.c ++++ b/net/dsa/tag_mtk.c +@@ -20,6 +20,7 @@ + #define MTK_HDR_LEN 4 + #define MTK_HDR_XMIT_UNTAGGED 0 + #define MTK_HDR_XMIT_TAGGED_TPID_8100 1 ++#define MTK_HDR_XMIT_TAGGED_TPID_88A8 2 + #define MTK_HDR_RECV_SOURCE_PORT_MASK GENMASK(2, 0) + #define MTK_HDR_XMIT_DP_BIT_MASK GENMASK(5, 0) + #define MTK_HDR_XMIT_SA_DIS BIT(6) +@@ -28,8 +29,8 @@ static struct sk_buff *mtk_tag_xmit(stru + struct net_device *dev) + { + struct dsa_port *dp = dsa_slave_to_port(dev); ++ u8 xmit_tpid; + u8 *mtk_tag; +- bool is_vlan_skb = true; + unsigned char *dest = eth_hdr(skb)->h_dest; + bool is_multicast_skb = is_multicast_ether_addr(dest) && + !is_broadcast_ether_addr(dest); +@@ -40,13 +41,20 @@ static struct sk_buff *mtk_tag_xmit(stru + * the both special and VLAN tag at the same time and then look up VLAN + * table with VID. + */ +- if (!skb_vlan_tagged(skb)) { ++ switch (skb->protocol) { ++ case htons(ETH_P_8021Q): ++ xmit_tpid = MTK_HDR_XMIT_TAGGED_TPID_8100; ++ break; ++ case htons(ETH_P_8021AD): ++ xmit_tpid = MTK_HDR_XMIT_TAGGED_TPID_88A8; ++ break; ++ default: + if (skb_cow_head(skb, MTK_HDR_LEN) < 0) + return NULL; + ++ xmit_tpid = MTK_HDR_XMIT_UNTAGGED; + skb_push(skb, MTK_HDR_LEN); + memmove(skb->data, skb->data + MTK_HDR_LEN, 2 * ETH_ALEN); +- is_vlan_skb = false; + } + + mtk_tag = skb->data + 2 * ETH_ALEN; +@@ -54,8 +62,7 @@ static struct sk_buff *mtk_tag_xmit(stru + /* Mark tag attribute on special tag insertion to notify hardware + * whether that's a combined special tag with 802.1Q header. + */ +- mtk_tag[0] = is_vlan_skb ? MTK_HDR_XMIT_TAGGED_TPID_8100 : +- MTK_HDR_XMIT_UNTAGGED; ++ mtk_tag[0] = xmit_tpid; + mtk_tag[1] = (1 << dp->index) & MTK_HDR_XMIT_DP_BIT_MASK; + + /* Disable SA learning for multicast frames */ +@@ -63,7 +70,7 @@ static struct sk_buff *mtk_tag_xmit(stru + mtk_tag[1] |= MTK_HDR_XMIT_SA_DIS; + + /* Tag control information is kept for 802.1Q */ +- if (!is_vlan_skb) { ++ if (xmit_tpid == MTK_HDR_XMIT_UNTAGGED) { + mtk_tag[2] = 0; + mtk_tag[3] = 0; + } diff --git a/queue-4.19/series b/queue-4.19/series index 342c993c7bb..d21042fb09a 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -4,3 +4,5 @@ bpf-prohibit-alu-ops-for-pointer-types-not-defining-ptr_limit.patch bpf-fix-off-by-one-for-area-size-in-creating-mask-to-left.patch bpf-simplify-alu_limit-masking-for-pointer-arithmetic.patch bpf-add-sanity-check-for-upper-ptr_limit.patch +net-dsa-tag_mtk-fix-802.1ad-vlan-egress.patch +net-dsa-b53-support-setting-learning-on-port.patch -- 2.47.3