On Fri, Jan 14, 2022 at 2:08 PM Michal Simek <michal.si...@xilinx.com> wrote:
>
> From: Ashok Reddy Soma <ashok.reddy.s...@xilinx.com>
>
> For configurations with gmii2rgmii and external phy the DT nodes link
> should be gem->gmii2rgmii->phy. But due to limitation in Linux driver
> the DT is mentioned as gem->phy and gmii2rgmii->phy as shown in below DT.
>
> ethernet@ff0c0000 {
> compatible = "cdns,zynqmp-gem\0cdns,gem";
> status = "okay";
> interrupt-parent = <0x04>;
> interrupts = <0x00 0x3b 0x04 0x00 0x3b 0x04>;
> reg = <0x00 0xff0c0000 0x00 0x1000>;
> clock-names = "pclk\0hclk\0tx_clk\0rx_clk\0tsu_clk";
> #address-cells = <0x01>;
> #size-cells = <0x00>;
> #stream-id-cells = <0x01>;
> iommus = <0x0d 0x875>;
> power-domains = <0x0c 0x1e>;
> clocks = <0x03 0x1f 0x03 0x69 0x03 0x2e 0x03 0x32 0x03 0x2c>;
> phy-handle = <0x0e>;
> phy-mode = "gmii";
> xlnx,ptp-enet-clock = <0x00>;
> local-mac-address = [ff ff ff ff ff ff];
> phandle = <0x4d>;
>
> mdio {
> #address-cells = <0x01>;
> #size-cells = <0x00>;
> phandle = <0x4e>;
>
> ethernet-phy@1 {
> reg = <0x01>;
> rxc-skew-ps = <0x708>;
> txc-skew-ps = <0x708>;
> phandle = <0x0e>;
> };
>
> gmii_to_rgmii_0@8 {
> compatible = "xlnx,gmii-to-rgmii-1.0";
> phy-handle = <0x0e>;
> reg = <0x08>;
> phandle = <0x4f>;
> };
> };
> };
>
> Since same DT is used in Linux and U-Boot we need to workaround this
> issue by using the gmii2rgmii node which points to phy and we should
> ignore the gem pointing to phy directly.
>
> Do this workaround by updating priv->phydev->node value with
> priv->phy_of_node only if it is not valid node.
>
> Signed-off-by: Ashok Reddy Soma <ashok.reddy.s...@xilinx.com>
> Signed-off-by: Michal Simek <michal.si...@xilinx.com>
> ---
>
> drivers/net/zynq_gem.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c
> index b751d28e611f..f238811786c6 100644
> --- a/drivers/net/zynq_gem.c
> +++ b/drivers/net/zynq_gem.c
> @@ -338,7 +338,8 @@ static int zynq_phy_init(struct udevice *dev)
> ADVERTISED_Asym_Pause;
>
> priv->phydev->advertising = priv->phydev->supported;
> - priv->phydev->node = priv->phy_of_node;
> + if (!ofnode_valid(priv->phydev->node))
> + priv->phydev->node = priv->phy_of_node;
>
> return phy_config(priv->phydev);
> }
> --
> 2.34.1
>
Reviewed-by: Ramon Fried <rfried....@gmail.com>