port@0 {
reg = <0>;
label = "lan1";
- phy-handle = <&phy0>;
+ pseudo-phy-handle = <&phy0>;
phy-mode = "10gbase-r";
sfp = <&sfp0>;
managed = "in-band-status";
port@8 {
reg = <8>;
label = "lan2";
- phy-handle = <&phy8>;
+ pseudo-phy-handle = <&phy8>;
phy-mode = "10gbase-r";
sfp = <&sfp1>;
managed = "in-band-status";
port@10 {
reg = <16>;
label = "lan3";
- phy-handle = <&phy16>;
+ pseudo-phy-handle = <&phy16>;
phy-mode = "10gbase-r";
sfp = <&sfp2>;
managed = "in-band-status";
port@14 {
reg = <20>;
label = "lan4";
- phy-handle = <&phy20>;
+ pseudo-phy-handle = <&phy20>;
phy-mode = "10gbase-r";
sfp = <&sfp3>;
managed = "in-band-status";
port@18 {
reg = <24>;
label = "lan5";
- phy-handle = <&phy24>;
+ pseudo-phy-handle = <&phy24>;
phy-mode = "10gbase-r";
sfp = <&sfp4>;
managed = "in-band-status";
port@19 {
reg = <25>;
label = "lan6";
- phy-handle = <&phy25>;
+ pseudo-phy-handle = <&phy25>;
phy-mode = "10gbase-r";
sfp = <&sfp5>;
managed = "in-band-status";
port@1a {
reg = <26>;
label = "lan7";
- phy-handle = <&phy26>;
+ pseudo-phy-handle = <&phy26>;
phy-mode = "10gbase-r";
sfp = <&sfp6>;
managed = "in-band-status";
port@1b {
reg = <27>;
label = "lan8";
- phy-handle = <&phy27>;
+ pseudo-phy-handle = <&phy27>;
phy-mode = "10gbase-r";
sfp = <&sfp7>;
managed = "in-band-status";
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);