[openwrt/openwrt] bcm4908: backport the latest bcm_sf2 commits

LEDE Commits lede-commits at lists.infradead.org
Thu Apr 8 12:40:44 BST 2021


rmilecki pushed a commit to openwrt/openwrt.git, branch openwrt-21.02:
https://git.openwrt.org/23cb83c20949794b1a61be63fe8c3354e575f199

commit 23cb83c20949794b1a61be63fe8c3354e575f199
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Mon Mar 22 08:09:53 2021 +0100

    bcm4908: backport the latest bcm_sf2 commits
    
    1. CFP support for BCM4908
    2. Upstream RGMII regs fix
    
    Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
    (cherry picked from commit a49fd9db0a2bfad8ea9a09f32fadbd3cc7e46205)
---
 ...t-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch |  25 ++++
 ...m_sf2-add-function-finding-RGMII-register.patch | 127 +++++++++++++++++++++
 ...5-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch |  56 +++++++++
 ...sa-bcm_sf2-enable-GPHY-for-switch-probing.patch |   2 +-
 ...-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch |   2 +-
 ..._sf2-quick-fix-for-RGMII-reg-access-on-BC.patch | 109 ------------------
 6 files changed, 210 insertions(+), 111 deletions(-)

diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch
new file mode 100644
index 0000000000..8971cdae39
--- /dev/null
+++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch
@@ -0,0 +1,25 @@
+From f4e6d7cdbfae502788bc468295b232dec76ee57e Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli at gmail.com>
+Date: Fri, 12 Mar 2021 13:11:01 -0800
+Subject: [PATCH] net: dsa: bcm_sf2: Fill in BCM4908 CFP entries
+
+The BCM4908 switch has 256 CFP entrie, update that setting so CFP can be
+used.
+
+Signed-off-by: Florian Fainelli <f.fainelli at gmail.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/dsa/bcm_sf2.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/dsa/bcm_sf2.c
++++ b/drivers/net/dsa/bcm_sf2.c
+@@ -1058,7 +1058,7 @@ static const struct bcm_sf2_of_data bcm_
+ 	.type		= BCM4908_DEVICE_ID,
+ 	.core_reg_align	= 0,
+ 	.reg_offsets	= bcm_sf2_4908_reg_offsets,
+-	.num_cfp_rules	= 0, /* FIXME */
++	.num_cfp_rules	= 256,
+ 	.num_crossbar_int_ports = 2,
+ };
+ 
diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch
new file mode 100644
index 0000000000..9e40b321e0
--- /dev/null
+++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch
@@ -0,0 +1,127 @@
+From 55cfeb396965c3906a84d09a9c487d065e37773b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Thu, 18 Mar 2021 09:01:42 +0100
+Subject: [PATCH 1/2] net: dsa: bcm_sf2: add function finding RGMII register
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Simple macro like REG_RGMII_CNTRL_P() is insufficient as:
+1. It doesn't validate port argument
+2. It doesn't support chipsets with non-lineral RGMII regs layout
+
+Missing port validation could result in getting register offset from out
+of array. Random memory -> random offset -> random reads/writes. It
+affected e.g. BCM4908 for REG_RGMII_CNTRL_P(7).
+
+Fixes: a78e86ed586d ("net: dsa: bcm_sf2: Prepare for different register layouts")
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+Acked-by: Florian Fainelli <f.fainelli at gmail.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/dsa/bcm_sf2.c      | 49 +++++++++++++++++++++++++++++-----
+ drivers/net/dsa/bcm_sf2_regs.h |  2 --
+ 2 files changed, 42 insertions(+), 9 deletions(-)
+
+--- a/drivers/net/dsa/bcm_sf2.c
++++ b/drivers/net/dsa/bcm_sf2.c
+@@ -31,6 +31,31 @@
+ #include "b53/b53_priv.h"
+ #include "b53/b53_regs.h"
+ 
++static u16 bcm_sf2_reg_rgmii_cntrl(struct bcm_sf2_priv *priv, int port)
++{
++	switch (priv->type) {
++	case BCM4908_DEVICE_ID:
++		/* TODO */
++		break;
++	default:
++		switch (port) {
++		case 0:
++			return REG_RGMII_0_CNTRL;
++		case 1:
++			return REG_RGMII_1_CNTRL;
++		case 2:
++			return REG_RGMII_2_CNTRL;
++		default:
++			break;
++		}
++	}
++
++	WARN_ONCE(1, "Unsupported port %d\n", port);
++
++	/* RO fallback reg */
++	return REG_SWITCH_STATUS;
++}
++
+ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)
+ {
+ 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
+@@ -586,6 +611,7 @@ static void bcm_sf2_sw_mac_config(struct
+ {
+ 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
+ 	u32 id_mode_dis = 0, port_mode;
++	u32 reg_rgmii_ctrl;
+ 	u32 reg, offset;
+ 
+ 	if (port == core_readl(priv, CORE_IMP0_PRT_ID))
+@@ -615,10 +641,12 @@ static void bcm_sf2_sw_mac_config(struct
+ 		goto force_link;
+ 	}
+ 
++	reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, port);
++
+ 	/* Clear id_mode_dis bit, and the existing port mode, let
+ 	 * RGMII_MODE_EN bet set by mac_link_{up,down}
+ 	 */
+-	reg = reg_readl(priv, REG_RGMII_CNTRL_P(port));
++	reg = reg_readl(priv, reg_rgmii_ctrl);
+ 	reg &= ~ID_MODE_DIS;
+ 	reg &= ~(PORT_MODE_MASK << PORT_MODE_SHIFT);
+ 	reg &= ~(RX_PAUSE_EN | TX_PAUSE_EN);
+@@ -633,7 +661,7 @@ static void bcm_sf2_sw_mac_config(struct
+ 		reg |= RX_PAUSE_EN;
+ 	}
+ 
+-	reg_writel(priv, reg, REG_RGMII_CNTRL_P(port));
++	reg_writel(priv, reg, reg_rgmii_ctrl);
+ 
+ force_link:
+ 	/* Force link settings detected from the PHY */
+@@ -659,6 +687,7 @@ static void bcm_sf2_sw_mac_link_set(stru
+ 				    phy_interface_t interface, bool link)
+ {
+ 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
++	u32 reg_rgmii_ctrl;
+ 	u32 reg;
+ 
+ 	if (!phy_interface_mode_is_rgmii(interface) &&
+@@ -666,13 +695,15 @@ static void bcm_sf2_sw_mac_link_set(stru
+ 	    interface != PHY_INTERFACE_MODE_REVMII)
+ 		return;
+ 
++	reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, port);
++
+ 	/* If the link is down, just disable the interface to conserve power */
+-	reg = reg_readl(priv, REG_RGMII_CNTRL_P(port));
++	reg = reg_readl(priv, reg_rgmii_ctrl);
+ 	if (link)
+ 		reg |= RGMII_MODE_EN;
+ 	else
+ 		reg &= ~RGMII_MODE_EN;
+-	reg_writel(priv, reg, REG_RGMII_CNTRL_P(port));
++	reg_writel(priv, reg, reg_rgmii_ctrl);
+ }
+ 
+ static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port,
+--- a/drivers/net/dsa/bcm_sf2_regs.h
++++ b/drivers/net/dsa/bcm_sf2_regs.h
+@@ -55,8 +55,6 @@ enum bcm_sf2_reg_offs {
+ #define CROSSBAR_BCM4908_EXT_GPHY4	1
+ #define CROSSBAR_BCM4908_EXT_RGMII	2
+ 
+-#define REG_RGMII_CNTRL_P(x)		(REG_RGMII_0_CNTRL + (x))
+-
+ /* Relative to REG_RGMII_CNTRL */
+ #define  RGMII_MODE_EN			(1 << 0)
+ #define  ID_MODE_DIS			(1 << 1)
diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch
new file mode 100644
index 0000000000..ccb18c7d51
--- /dev/null
+++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch
@@ -0,0 +1,56 @@
+From 6859d91549341c2ad769d482de58129f080c0f04 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Thu, 18 Mar 2021 09:01:43 +0100
+Subject: [PATCH 2/2] net: dsa: bcm_sf2: fix BCM4908 RGMII reg(s)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BCM4908 has only 1 RGMII reg for controlling port 7.
+
+Fixes: 73b7a6047971 ("net: dsa: bcm_sf2: support BCM4908's integrated switch")
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+Acked-by: Florian Fainelli <f.fainelli at gmail.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/dsa/bcm_sf2.c      | 11 +++++++----
+ drivers/net/dsa/bcm_sf2_regs.h |  1 +
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/net/dsa/bcm_sf2.c
++++ b/drivers/net/dsa/bcm_sf2.c
+@@ -35,7 +35,12 @@ static u16 bcm_sf2_reg_rgmii_cntrl(struc
+ {
+ 	switch (priv->type) {
+ 	case BCM4908_DEVICE_ID:
+-		/* TODO */
++		switch (port) {
++		case 7:
++			return REG_RGMII_11_CNTRL;
++		default:
++			break;
++		}
+ 		break;
+ 	default:
+ 		switch (port) {
+@@ -1077,9 +1082,7 @@ static const u16 bcm_sf2_4908_reg_offset
+ 	[REG_PHY_REVISION]	= 0x14,
+ 	[REG_SPHY_CNTRL]	= 0x24,
+ 	[REG_CROSSBAR]		= 0xc8,
+-	[REG_RGMII_0_CNTRL]	= 0xe0,
+-	[REG_RGMII_1_CNTRL]	= 0xec,
+-	[REG_RGMII_2_CNTRL]	= 0xf8,
++	[REG_RGMII_11_CNTRL]	= 0x014c,
+ 	[REG_LED_0_CNTRL]	= 0x40,
+ 	[REG_LED_1_CNTRL]	= 0x4c,
+ 	[REG_LED_2_CNTRL]	= 0x58,
+--- a/drivers/net/dsa/bcm_sf2_regs.h
++++ b/drivers/net/dsa/bcm_sf2_regs.h
+@@ -21,6 +21,7 @@ enum bcm_sf2_reg_offs {
+ 	REG_RGMII_0_CNTRL,
+ 	REG_RGMII_1_CNTRL,
+ 	REG_RGMII_2_CNTRL,
++	REG_RGMII_11_CNTRL,
+ 	REG_LED_0_CNTRL,
+ 	REG_LED_1_CNTRL,
+ 	REG_LED_2_CNTRL,
diff --git a/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch b/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch
index 0fe59e411a..2087559262 100644
--- a/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch
+++ b/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch
@@ -29,7 +29,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
 
 --- a/drivers/net/dsa/bcm_sf2.c
 +++ b/drivers/net/dsa/bcm_sf2.c
-@@ -1285,10 +1285,14 @@ static int bcm_sf2_sw_probe(struct platf
+@@ -1319,10 +1319,14 @@ static int bcm_sf2_sw_probe(struct platf
  	rev = reg_readl(priv, REG_PHY_REVISION);
  	priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK;
  
diff --git a/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch b/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch
index df66c62b10..2d08cd83c2 100644
--- a/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch
+++ b/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch
@@ -15,7 +15,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
 
 --- a/drivers/net/dsa/bcm_sf2.c
 +++ b/drivers/net/dsa/bcm_sf2.c
-@@ -1299,6 +1299,12 @@ static int bcm_sf2_sw_probe(struct platf
+@@ -1333,6 +1333,12 @@ static int bcm_sf2_sw_probe(struct platf
  		 priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff,
  		 priv->irq0, priv->irq1);
  
diff --git a/target/linux/bcm4908/patches-5.4/702-net-dsa-bcm_sf2-quick-fix-for-RGMII-reg-access-on-BC.patch b/target/linux/bcm4908/patches-5.4/702-net-dsa-bcm_sf2-quick-fix-for-RGMII-reg-access-on-BC.patch
deleted file mode 100644
index e24b6b1acf..0000000000
--- a/target/linux/bcm4908/patches-5.4/702-net-dsa-bcm_sf2-quick-fix-for-RGMII-reg-access-on-BC.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-From 7e2dc41c745f6d9c571919d98abed2d783fce8fb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
-Date: Sun, 14 Mar 2021 22:43:32 +0100
-Subject: [PATCH] net: dsa: bcm_sf2: quick fix for RGMII reg access on BCM4908
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-BCM4908 has only 1 RGMII register and it's used for port 7.
-
-Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
----
- drivers/net/dsa/bcm_sf2.c      | 30 +++++++++++++++++++++++-------
- drivers/net/dsa/bcm_sf2_regs.h |  1 +
- 2 files changed, 24 insertions(+), 7 deletions(-)
-
---- a/drivers/net/dsa/bcm_sf2.c
-+++ b/drivers/net/dsa/bcm_sf2.c
-@@ -587,10 +587,19 @@ static void bcm_sf2_sw_mac_config(struct
- 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
- 	u32 id_mode_dis = 0, port_mode;
- 	u32 reg, offset;
-+	u32 rgmii_ctrl;
- 
- 	if (port == core_readl(priv, CORE_IMP0_PRT_ID))
- 		return;
- 
-+	if (priv->type == BCM4908_DEVICE_ID) {
-+		if (port != 7)
-+			return;
-+		rgmii_ctrl = REG_RGMII_11_CNTRL;
-+	} else {
-+		rgmii_ctrl = REG_RGMII_CNTRL_P(port);
-+	}
-+
- 	if (priv->type == BCM4908_DEVICE_ID ||
- 	    priv->type == BCM7445_DEVICE_ID)
- 		offset = CORE_STS_OVERRIDE_GMIIP_PORT(port);
-@@ -618,7 +627,7 @@ static void bcm_sf2_sw_mac_config(struct
- 	/* Clear id_mode_dis bit, and the existing port mode, let
- 	 * RGMII_MODE_EN bet set by mac_link_{up,down}
- 	 */
--	reg = reg_readl(priv, REG_RGMII_CNTRL_P(port));
-+	reg = reg_readl(priv, rgmii_ctrl);
- 	reg &= ~ID_MODE_DIS;
- 	reg &= ~(PORT_MODE_MASK << PORT_MODE_SHIFT);
- 	reg &= ~(RX_PAUSE_EN | TX_PAUSE_EN);
-@@ -633,7 +642,7 @@ static void bcm_sf2_sw_mac_config(struct
- 		reg |= RX_PAUSE_EN;
- 	}
- 
--	reg_writel(priv, reg, REG_RGMII_CNTRL_P(port));
-+	reg_writel(priv, reg, rgmii_ctrl);
- 
- force_link:
- 	/* Force link settings detected from the PHY */
-@@ -659,6 +668,7 @@ static void bcm_sf2_sw_mac_link_set(stru
- 				    phy_interface_t interface, bool link)
- {
- 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
-+	u32 rgmii_ctrl;
- 	u32 reg;
- 
- 	if (!phy_interface_mode_is_rgmii(interface) &&
-@@ -666,13 +676,21 @@ static void bcm_sf2_sw_mac_link_set(stru
- 	    interface != PHY_INTERFACE_MODE_REVMII)
- 		return;
- 
-+	if (priv->type == BCM4908_DEVICE_ID) {
-+		if (port != 7)
-+			return;
-+		rgmii_ctrl = REG_RGMII_11_CNTRL;
-+	} else {
-+		rgmii_ctrl = REG_RGMII_CNTRL_P(port);
-+	}
-+
- 	/* If the link is down, just disable the interface to conserve power */
--	reg = reg_readl(priv, REG_RGMII_CNTRL_P(port));
-+	reg = reg_readl(priv, rgmii_ctrl);
- 	if (link)
- 		reg |= RGMII_MODE_EN;
- 	else
- 		reg &= ~RGMII_MODE_EN;
--	reg_writel(priv, reg, REG_RGMII_CNTRL_P(port));
-+	reg_writel(priv, reg, rgmii_ctrl);
- }
- 
- static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port,
-@@ -1046,9 +1064,7 @@ static const u16 bcm_sf2_4908_reg_offset
- 	[REG_PHY_REVISION]	= 0x14,
- 	[REG_SPHY_CNTRL]	= 0x24,
- 	[REG_CROSSBAR]		= 0xc8,
--	[REG_RGMII_0_CNTRL]	= 0xe0,
--	[REG_RGMII_1_CNTRL]	= 0xec,
--	[REG_RGMII_2_CNTRL]	= 0xf8,
-+	[REG_RGMII_11_CNTRL]	= 0x014c,
- 	[REG_LED_0_CNTRL]	= 0x40,
- 	[REG_LED_1_CNTRL]	= 0x4c,
- 	[REG_LED_2_CNTRL]	= 0x58,
---- a/drivers/net/dsa/bcm_sf2_regs.h
-+++ b/drivers/net/dsa/bcm_sf2_regs.h
-@@ -21,6 +21,7 @@ enum bcm_sf2_reg_offs {
- 	REG_RGMII_0_CNTRL,
- 	REG_RGMII_1_CNTRL,
- 	REG_RGMII_2_CNTRL,
-+	REG_RGMII_11_CNTRL,
- 	REG_LED_0_CNTRL,
- 	REG_LED_1_CNTRL,
- 	REG_LED_2_CNTRL,



More information about the lede-commits mailing list