From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vagrant Cascadian Date: Mon, 04 May 2015 09:02:31 -0700 Subject: [U-Boot] [U-Boot, v2, 1/2] mx6cuboxi: Fix Ethernet PHY detection problem In-Reply-To: <1430749376-6918-1-git-send-email-fabio.estevam@freescale.com> References: <1430749376-6918-1-git-send-email-fabio.estevam@freescale.com> Message-ID: <87383ctjoo.fsf@aikidev.net> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 2015-05-04, Fabio Estevam wrote: > mx6cuboxi sometimes fails to recognize the Ethernet PHY: > > Net: Phy 0 not found > > The explanation for this behavior comes from from Rabeeh Khoury: > > "The LED_ACT pin on the carrier-one boards had a pull down that > forces the phy address to 0x0; where on CuBox-i and the production > HummingBoard that pin is connected directly to LED that depending > on the pull down strength of the LED it might be sampled as '0' or '1' thus > the phy address might appear as either address 0x0 or 0x4." > > "This is AR8035 implementation; in reset stage the LED pin is configured as > input, and pull up/down does matter. In this case it configures the PHY > address. > > After reset is deasserted the same LED pin becomes output and then > according to the previous pull/up it should be active high/low" > > One way to properly fix this behavior is to place external pull-up/down > resistors in the LED line, but from a software standpoint we can fix it > by telling phy_find_by_mask() to scan the PHY at addresses > 0x0 and 0x4. > > Reported-by: Vagrant Cascadian > Signed-off-by: Rabeeh Khoury > Signed-off-by: Fabio Estevam > --- > Changes since v1: > - Explain what the proper hardware fix would be as suggested by Nikolay > - Remove error message from fec_probe as this function already prints on error. > > board/solidrun/mx6cuboxi/mx6cuboxi.c | 29 ++++++++++++++++++++++++++++- > 1 file changed, 28 insertions(+), 1 deletion(-) > > diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c > index 9aa0259..e83d2fe 100644 > --- a/board/solidrun/mx6cuboxi/mx6cuboxi.c > +++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c > @@ -25,6 +25,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -152,9 +153,14 @@ int board_phy_config(struct phy_device *phydev) > return 0; > } > > +/* On Cuboxi Ethernet PHY can be located at addresses 0x0 or 0x4 */ > +#define ETH_PHY_MASK ((1 << 0x0) | (1 << 0x4)) > + > int board_eth_init(bd_t *bis) > { > struct iomuxc *const iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; > + struct mii_dev *bus; > + struct phy_device *phydev; > > int ret = enable_fec_anatop_clock(ENET_25MHZ); > if (ret) > @@ -165,7 +171,28 @@ int board_eth_init(bd_t *bis) > > setup_iomux_enet(); > > - return cpu_eth_init(bis); > + bus = fec_get_miibus(IMX_FEC_BASE, -1); > + if (!bus) > + return -EINVAL; > + > + phydev = phy_find_by_mask(bus, ETH_PHY_MASK, PHY_INTERFACE_MODE_RGMII); > + if (!phydev) { > + ret = -EINVAL; > + goto free_bus; > + } > + > + debug("using phy at address %d\n", phydev->addr); > + ret = fec_probe(bis, -1, IMX_FEC_BASE, bus, phydev); > + if (ret) > + goto free_phydev; > + > + return 0; > + > +free_phydev: > + free(phydev); > +free_bus: > + free(bus); > + return ret; > } > > #ifdef CONFIG_VIDEO_IPUV3 > -- > 1.9.1 Tested on cubox-i4pro and hummingboard-i2ex. Tested-By: Vagrant Cascadian -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 818 bytes Desc: not available URL: