Message ID | 641eb13425ffe80e0743f60cf90d0f940577b9e9.1642162085.git.michal.simek@xilinx.com |
---|---|
State | Accepted |
Commit | ca994327ce424f8cc433753bf3f135f6006199f0 |
Delegated to: | Michal Simek |
Headers | show |
Series | net: gem: Workaround gmii2rgmii bridge DT node issue | expand |
On Fri, Jan 14, 2022 at 2:08 PM Michal Simek <michal.simek@xilinx.com> wrote: > > From: Ashok Reddy Soma <ashok.reddy.soma@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.soma@xilinx.com> > Signed-off-by: Michal Simek <michal.simek@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.dev@gmail.com>
pá 14. 1. 2022 v 13:08 odesílatel Michal Simek <michal.simek@xilinx.com> napsal: > > From: Ashok Reddy Soma <ashok.reddy.soma@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.soma@xilinx.com> > Signed-off-by: Michal Simek <michal.simek@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 > Applied. M
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); }