[U-Boot] [PATCH 2/2] net: phy: Add gmiitorgmii converter support

Michal Simek michal.simek at xilinx.com
Fri Dec 21 07:35:04 UTC 2018


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 <siva.durga.paladugu at xilinx.com>
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>  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


More information about the U-Boot mailing list