[openwrt/openwrt] realtek: rtl93xx: support SFPs with phys

LEDE Commits lede-commits at lists.infradead.org
Tue Feb 25 11:57:52 PST 2025


svanheule pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/4457c1eee49e263dea8ae14b9e498b4d1e8e4503

commit 4457c1eee49e263dea8ae14b9e498b4d1e8e4503
Author: Bjørn Mork <bjorn at mork.no>
AuthorDate: Thu Feb 6 17:51:48 2025 +0100

    realtek: rtl93xx: support SFPs with phys
    
    This driver use "phy-handle" as a placeholder for mac configuration
    data.  Such handles are therefore required for all ports - even those
    connected directly to SFP slots and having a managed property set to
    "in-band-status".
    
    The DSA core will register these nodes as if they are real phys. This
    prevents later attachment of pluggable phys with errors like
    
       sfp sfp-p8: sfp_add_phy failed: -EBUSY
    
    Replace the virtual SFP slot handles with "pseudo-phy-handle" to keep
    the driver logic as-is but hide the node from the DSA core.
    
    Signed-off-by: Bjørn Mork <bjorn at mork.no>
    Link: https://github.com/openwrt/openwrt/pull/17950
    Signed-off-by: Sander Vanheule <sander at svanheule.net>
---
 target/linux/realtek/dts/rtl9302_zyxel_xgs1250-12.dts    |  2 +-
 target/linux/realtek/dts/rtl9303_xikestor_sks8300-8x.dts | 16 ++++++++--------
 .../realtek/files-6.6/drivers/net/dsa/rtl83xx/common.c   | 16 ++++++++++++++++
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/target/linux/realtek/dts/rtl9302_zyxel_xgs1250-12.dts b/target/linux/realtek/dts/rtl9302_zyxel_xgs1250-12.dts
index d7252c9984..aa48511372 100644
--- a/target/linux/realtek/dts/rtl9302_zyxel_xgs1250-12.dts
+++ b/target/linux/realtek/dts/rtl9302_zyxel_xgs1250-12.dts
@@ -404,7 +404,7 @@
 			reg = <27>;
 			label = "lan12";
 			phy-mode = "1000base-x";
-			phy-handle = <&phy27>;
+			pseudo-phy-handle = <&phy27>;
 			sfp = <&sfp0>;
 			led-set = <2>;
 			managed = "in-band-status";
diff --git a/target/linux/realtek/dts/rtl9303_xikestor_sks8300-8x.dts b/target/linux/realtek/dts/rtl9303_xikestor_sks8300-8x.dts
index b143844ddd..9632159368 100644
--- a/target/linux/realtek/dts/rtl9303_xikestor_sks8300-8x.dts
+++ b/target/linux/realtek/dts/rtl9303_xikestor_sks8300-8x.dts
@@ -343,7 +343,7 @@
 		port at 0 {
 			reg = <0>;
 			label = "lan1";
-			phy-handle = <&phy0>;
+			pseudo-phy-handle = <&phy0>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp0>;
 			managed = "in-band-status";
@@ -353,7 +353,7 @@
 		port at 8 {
 			reg = <8>;
 			label = "lan2";
-			phy-handle = <&phy8>;
+			pseudo-phy-handle = <&phy8>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp1>;
 			managed = "in-band-status";
@@ -363,7 +363,7 @@
 		port at 10 {
 			reg = <16>;
 			label = "lan3";
-			phy-handle = <&phy16>;
+			pseudo-phy-handle = <&phy16>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp2>;
 			managed = "in-band-status";
@@ -373,7 +373,7 @@
 		port at 14 {
 			reg = <20>;
 			label = "lan4";
-			phy-handle = <&phy20>;
+			pseudo-phy-handle = <&phy20>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp3>;
 			managed = "in-band-status";
@@ -383,7 +383,7 @@
 		port at 18 {
 			reg = <24>;
 			label = "lan5";
-			phy-handle = <&phy24>;
+			pseudo-phy-handle = <&phy24>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp4>;
 			managed = "in-band-status";
@@ -393,7 +393,7 @@
 		port at 19 {
 			reg = <25>;
 			label = "lan6";
-			phy-handle = <&phy25>;
+			pseudo-phy-handle = <&phy25>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp5>;
 			managed = "in-band-status";
@@ -403,7 +403,7 @@
 		port at 1a {
 			reg = <26>;
 			label = "lan7";
-			phy-handle = <&phy26>;
+			pseudo-phy-handle = <&phy26>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp6>;
 			managed = "in-band-status";
@@ -413,7 +413,7 @@
 		port at 1b {
 			reg = <27>;
 			label = "lan8";
-			phy-handle = <&phy27>;
+			pseudo-phy-handle = <&phy27>;
 			phy-mode = "10gbase-r";
 			sfp = <&sfp7>;
 			managed = "in-band-status";
diff --git a/target/linux/realtek/files-6.6/drivers/net/dsa/rtl83xx/common.c b/target/linux/realtek/files-6.6/drivers/net/dsa/rtl83xx/common.c
index 28b836f6b2..cd532a7d3d 100644
--- a/target/linux/realtek/files-6.6/drivers/net/dsa/rtl83xx/common.c
+++ b/target/linux/realtek/files-6.6/drivers/net/dsa/rtl83xx/common.c
@@ -339,6 +339,22 @@ static int __init rtl83xx_mdio_probe(struct rtl838x_switch_priv *priv)
 			continue;
 
 		phy_node = of_parse_phandle(dn, "phy-handle", 0);
+
+		/* Major cleanup is needed...
+		 *
+		 * We use virtual "phys" as containers for mac
+		 * properties like the SERDES channel, even for simple
+		 * SFP slots.  "pseudo-phy-handle" is a hack to
+		 * support this construct and still allow pluggable
+		 * phys.
+		 *
+		 * The SERDES map is most likely static by port number
+		 * for each SoC.  No need to put that into the device
+		 * tree in the first place.
+		 */
+		if (!phy_node)
+			phy_node = of_parse_phandle(dn, "pseudo-phy-handle", 0);
+
 		if (!phy_node) {
 			if (pn != priv->cpu_port)
 				dev_err(priv->dev, "Port node %d misses phy-handle\n", pn);




More information about the lede-commits mailing list