Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6eb9c9da authored by Linus Walleij's avatar Linus Walleij Committed by David S. Miller
Browse files

of: mdio: Support fixed links in of_phy_get_and_connect()



By a simple extension of of_phy_get_and_connect() drivers
that have a fixed link on e.g. RGMII can support also
fixed links, so in addition to:

ethernet-port {
	phy-mode = "rgmii";
	phy-handle = <&foo>;
};

This setup with a fixed-link node and no phy-handle will
now also work just fine:

ethernet-port {
	phy-mode = "rgmii";
	fixed-link {
		speed = <1000>;
		full-duplex;
		pause;
	};
};

This is very helpful for connecting random ethernet ports
to e.g. DSA switches that typically reside on fixed links.

The phy-mode is still there as the fixes link in this case
is still an RGMII link.

Tested on the Cortina Gemini driver with the Vitesse DSA
router chip on a fixed 1Gbit link.

Suggested-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 01683a14
Loading
Loading
Loading
Loading
+13 −4
Original line number Original line Diff line number Diff line
@@ -367,14 +367,23 @@ struct phy_device *of_phy_get_and_connect(struct net_device *dev,
	phy_interface_t iface;
	phy_interface_t iface;
	struct device_node *phy_np;
	struct device_node *phy_np;
	struct phy_device *phy;
	struct phy_device *phy;
	int ret;


	iface = of_get_phy_mode(np);
	iface = of_get_phy_mode(np);
	if (iface < 0)
	if (iface < 0)
		return NULL;
		return NULL;

	if (of_phy_is_fixed_link(np)) {
		ret = of_phy_register_fixed_link(np);
		if (ret < 0) {
			netdev_err(dev, "broken fixed-link specification\n");
			return NULL;
		}
		phy_np = of_node_get(np);
	} else {
		phy_np = of_parse_phandle(np, "phy-handle", 0);
		phy_np = of_parse_phandle(np, "phy-handle", 0);
		if (!phy_np)
		if (!phy_np)
			return NULL;
			return NULL;
	}


	phy = of_phy_connect(dev, phy_np, hndlr, 0, iface);
	phy = of_phy_connect(dev, phy_np, hndlr, 0, iface);