[openwrt/openwrt] ipq40xx: fix ethernet vlan double tagging

LEDE Commits lede-commits at lists.infradead.org
Tue Jul 14 12:33:47 EDT 2020


blogic pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/9da2b567605b0964d921b9ca4f0c9886db4f636d

commit 9da2b567605b0964d921b9ca4f0c9886db4f636d
Author: John Crispin <john at phrozen.org>
AuthorDate: Tue Jul 14 10:07:32 2020 +0200

    ipq40xx: fix ethernet vlan double tagging
    
    As the the SoC uses implicit vlan tagging for dual MAC support, the
    offload feature breaks when using double tagging.
    
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Signed-off-by: John Crispin <john at phrozen.org>
---
 .../net/ethernet/qualcomm/essedma/edma_axi.c       |  9 +++--
 .../705-net-add-qualcomm-ar40xx-phy.patch          | 38 ++++++++++++++++++----
 2 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_axi.c b/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
index 96a82b3116..50335b0d14 100644
--- a/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
+++ b/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
@@ -968,7 +968,6 @@ static int edma_axi_probe(struct platform_device *pdev)
 		edma_netdev[i]->netdev_ops = &edma_axi_netdev_ops;
 		edma_netdev[i]->max_mtu = 9000;
 		edma_netdev[i]->features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM
-				      | NETIF_F_HW_VLAN_CTAG_TX
 				      | NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_SG |
 				      NETIF_F_TSO | NETIF_F_GRO;
 		edma_netdev[i]->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
@@ -980,10 +979,10 @@ static int edma_axi_probe(struct platform_device *pdev)
 					     NETIF_F_TSO | NETIF_F_GRO;
 
 #ifdef CONFIG_RFS_ACCEL
-		edma_netdev[i]->features |=  NETIF_F_RXHASH | NETIF_F_NTUPLE;
-		edma_netdev[i]->hw_features |=  NETIF_F_RXHASH | NETIF_F_NTUPLE;
-		edma_netdev[i]->vlan_features |= NETIF_F_RXHASH | NETIF_F_NTUPLE;
-		edma_netdev[i]->wanted_features |= NETIF_F_RXHASH | NETIF_F_NTUPLE;
+		edma_netdev[i]->features |=  NETIF_F_NTUPLE;
+		edma_netdev[i]->hw_features |=  NETIF_F_NTUPLE;
+		edma_netdev[i]->vlan_features |= NETIF_F_NTUPLE;
+		edma_netdev[i]->wanted_features |= NETIF_F_NTUPLE;
 #endif
 		edma_set_ethtool_ops(edma_netdev[i]);
 
diff --git a/target/linux/ipq40xx/patches-5.4/705-net-add-qualcomm-ar40xx-phy.patch b/target/linux/ipq40xx/patches-5.4/705-net-add-qualcomm-ar40xx-phy.patch
index 648723df06..6c823b3483 100644
--- a/target/linux/ipq40xx/patches-5.4/705-net-add-qualcomm-ar40xx-phy.patch
+++ b/target/linux/ipq40xx/patches-5.4/705-net-add-qualcomm-ar40xx-phy.patch
@@ -32,7 +32,7 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.c
 ===================================================================
 --- /dev/null
 +++ linux-5.4.51/drivers/net/phy/ar40xx.c
-@@ -0,0 +1,2097 @@
+@@ -0,0 +1,2118 @@
 +/*
 + * Copyright (c) 2016, The Linux Foundation. All rights reserved.
 + *
@@ -1235,7 +1235,11 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.c
 +	ar40xx_rmw(priv, AR40XX_REG_PORT_STATUS(port),
 +			AR40XX_PORT_AUTO_LINK_EN, 0);
 +
-+	ar40xx_write(priv, AR40XX_REG_PORT_HEADER(port), 0);
++	/* CPU port is setting headers to limit output ports */
++	if (port == 0)
++		ar40xx_write(priv, AR40XX_REG_PORT_HEADER(port), 0x8);
++	else
++		ar40xx_write(priv, AR40XX_REG_PORT_HEADER(port), 0);
 +
 +	ar40xx_write(priv, AR40XX_REG_PORT_VLAN0(port), 0);
 +
@@ -1278,6 +1282,10 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.c
 +	t = (AR40XX_PORT0_FC_THRESH_ON_DFLT << 16) |
 +	      AR40XX_PORT0_FC_THRESH_OFF_DFLT;
 +	ar40xx_write(priv, AR40XX_REG_PORT_FLOWCTRL_THRESH(0), t);
++
++	/* set service tag to 802.1q */
++	t = ETH_P_8021Q | AR40XX_ESS_SERVICE_TAG_STAG;
++	ar40xx_write(priv, AR40XX_ESS_SERVICE_TAG, t);
 +}
 +
 +static void
@@ -1603,7 +1611,11 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.c
 +	u32 pvid = priv->vlan_id[priv->pvid[port]];
 +
 +	if (priv->vlan) {
-+		egress = AR40XX_PORT_VLAN1_OUT_MODE_UNMOD;
++		if (priv->vlan_tagged & BIT(port))
++			egress = AR40XX_PORT_VLAN1_OUT_MODE_TAG;
++		else
++			egress = AR40XX_PORT_VLAN1_OUT_MODE_UNMOD;
++
 +		ingress = AR40XX_IN_SECURE;
 +	} else {
 +		egress = AR40XX_PORT_VLAN1_OUT_MODE_UNTOUCH;
@@ -1614,8 +1626,17 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.c
 +	t |= pvid << AR40XX_PORT_VLAN0_DEF_CVID_S;
 +	ar40xx_write(priv, AR40XX_REG_PORT_VLAN0(port), t);
 +
-+	t = AR40XX_PORT_VLAN1_PORT_VLAN_PROP;
-+	t |= egress << AR40XX_PORT_VLAN1_OUT_MODE_S;
++	t = egress << AR40XX_PORT_VLAN1_OUT_MODE_S;
++
++	/* set CPU port to core port */
++	if (port == 0)
++		t |= AR40XX_PORT_VLAN1_CORE_PORT;
++
++	if (priv->vlan_tagged & BIT(port))
++		t |= AR40XX_PORT_VLAN1_PORT_VLAN_PROP;
++	else
++		t |= AR40XX_PORT_VLAN1_PORT_TLS_MODE;
++
 +	ar40xx_write(priv, AR40XX_REG_PORT_VLAN1(port), t);
 +
 +	t = members;
@@ -2134,7 +2155,7 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.h
 ===================================================================
 --- /dev/null
 +++ linux-5.4.51/drivers/net/phy/ar40xx.h
-@@ -0,0 +1,337 @@
+@@ -0,0 +1,342 @@
 +/*
 + * Copyright (c) 2016, The Linux Foundation. All rights reserved.
 + *
@@ -2288,6 +2309,9 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.h
 +#define   AR40XX_MIB_FUNC_NO_OP		0x0
 +#define   AR40XX_MIB_FUNC_FLUSH		0x1
 +
++#define AR40XX_ESS_SERVICE_TAG		0x48
++#define AR40XX_ESS_SERVICE_TAG_STAG	BIT(17)
++
 +#define AR40XX_REG_PORT_STATUS(_i)		(0x07c + (_i) * 4)
 +#define   AR40XX_PORT_SPEED			BITS(0, 2)
 +#define   AR40XX_PORT_STATUS_SPEED_S	0
@@ -2316,6 +2340,8 @@ Index: linux-5.4.51/drivers/net/phy/ar40xx.h
 +#define   AR40XX_PORT_VLAN0_DEF_CVID_S		16
 +
 +#define AR40XX_REG_PORT_VLAN1(_i)		(0x424 + (_i) * 0x8)
++#define   AR40XX_PORT_VLAN1_CORE_PORT		BIT(9)
++#define   AR40XX_PORT_VLAN1_PORT_TLS_MODE	BIT(7)
 +#define   AR40XX_PORT_VLAN1_PORT_VLAN_PROP	BIT(6)
 +#define   AR40XX_PORT_VLAN1_OUT_MODE		BITS(12, 2)
 +#define   AR40XX_PORT_VLAN1_OUT_MODE_S		12



More information about the lede-commits mailing list