From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Simek Date: Fri, 21 Dec 2018 08:35:04 +0100 Subject: [U-Boot] [PATCH 2/2] net: phy: Add gmiitorgmii converter support In-Reply-To: <1543299551-1965-2-git-send-email-siva.durga.paladugu@xilinx.com> References: <1543299551-1965-1-git-send-email-siva.durga.paladugu@xilinx.com> <1543299551-1965-2-git-send-email-siva.durga.paladugu@xilinx.com> Message-ID: <1951bd5c-42f5-a85a-af3f-51176e920864@xilinx.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 27. 11. 18 7:19, Siva Durga Prasad Paladugu wrote: > This patch adds support for gmiitorgmii converter. > This converter sits between the MAC and the external phy > MAC <==> GMII2RGMII <==> RGMII_PHY. > The ethernet driver probes this bridge and this bridge driver > probes real phy driver and invokes the real phy functionalities > as requested. This bridge just needs to be configured based on > real phy negotiated speed and duplex. > > Signed-off-by: Siva Durga Prasad Paladugu > Signed-off-by: Michal Simek > --- > drivers/net/phy/Kconfig | 7 +++ > drivers/net/phy/Makefile | 1 + > drivers/net/phy/phy.c | 41 ++++++++++++++ > drivers/net/phy/xilinx_gmii2rgmii.c | 103 ++++++++++++++++++++++++++++++++++++ > include/phy.h | 6 +++ > 5 files changed, 158 insertions(+) > create mode 100644 drivers/net/phy/xilinx_gmii2rgmii.c > > diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig > index 3dc0822..a68e167 100644 > --- a/drivers/net/phy/Kconfig > +++ b/drivers/net/phy/Kconfig > @@ -217,6 +217,13 @@ config PHY_VITESSE > config PHY_XILINX > bool "Xilinx Ethernet PHYs support" > > +config PHY_XILINX_GMII2RGMII > + bool "Xilinx GMII to RGMII Ethernet PHYs support" > + help > + This adds support for Xilinx GMII to RGMII IP core. This IP acts > + as bridge between MAC connected over GMII and external phy that > + is connected over RGMII interface. > + > config PHY_FIXED > bool "Fixed-Link PHY" > depends on DM_ETH > diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile > index 555da83..76b6197 100644 > --- a/drivers/net/phy/Makefile > +++ b/drivers/net/phy/Makefile > @@ -27,6 +27,7 @@ obj-$(CONFIG_PHY_SMSC) += smsc.o > obj-$(CONFIG_PHY_TERANETICS) += teranetics.o > obj-$(CONFIG_PHY_TI) += ti.o > obj-$(CONFIG_PHY_XILINX) += xilinx_phy.o > +obj-$(CONFIG_PHY_XILINX_GMII2RGMII) += xilinx_gmii2rgmii.o > obj-$(CONFIG_PHY_VITESSE) += vitesse.o > obj-$(CONFIG_PHY_MSCC) += mscc.o > obj-$(CONFIG_PHY_FIXED) += fixed.o > diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c > index 3cb2785..d02c4d8 100644 > --- a/drivers/net/phy/phy.c > +++ b/drivers/net/phy/phy.c > @@ -528,6 +528,9 @@ int phy_init(void) > #ifdef CONFIG_PHY_FIXED > phy_fixed_init(); > #endif > +#ifdef CONFIG_PHY_XILINX_GMII2RGMII > + phy_xilinx_gmii2rgmii_init(); > +#endif > return 0; > } > > @@ -875,6 +878,41 @@ void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev) > debug("%s connected to %s\n", dev->name, phydev->drv->name); > } > > +#ifdef CONFIG_PHY_XILINX_GMII2RGMII > +#ifdef CONFIG_DM_ETH > +static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, > + struct udevice *dev, > + phy_interface_t interface) > +#else > +static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, > + struct eth_device *dev, > + phy_interface_t interface) > +#endif > +{ > + struct phy_device *phydev = NULL; > + int sn = dev_of_offset(dev); > + int off; > + > + while (sn > 0) { > + off = fdt_node_offset_by_compatible(gd->fdt_blob, sn, > + "xlnx,gmii-to-rgmii-1.0"); > + if (off > 0) { > + phydev = phy_device_create(bus, > + off, PHY_GMII2RGMII_ID, > + interface); > + break; > + } > + if (off == -FDT_ERR_NOTFOUND) > + sn = fdt_first_subnode(gd->fdt_blob, sn); > + else > + printf("%s: Error finding compat string:%d\n", > + __func__, off); > + } > + > + return phydev; > +} > +#endif > + > #ifdef CONFIG_PHY_FIXED > #ifdef CONFIG_DM_ETH > static struct phy_device *phy_connect_fixed(struct mii_dev *bus, > @@ -920,6 +958,9 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr, > #ifdef CONFIG_PHY_FIXED > phydev = phy_connect_fixed(bus, dev, interface); > #endif > +#ifdef CONFIG_PHY_XILINX_GMII2RGMII > + phydev = phy_connect_gmii2rgmii(bus, dev, interface); > +#endif I was debugging one issue in connection to fixed-link phy and I think we should try to connect gmii2rgmii if phydev is NULL. It means this should be #ifdef CONFIG_PHY_XILINX_GMII2RGMII if (!phydev) phydev = phy_connect_gmii2rgmii(bus, dev, interface); #endif Thanks, Michal