On 2015-05-01, Fabio Estevam wrote: > On Fri, May 1, 2015 at 5:20 PM, Fabio Estevam <feste...@gmail.com> wrote: > >> Looking at Solid-run's tree they have the following commit that may be >> related to this PHY issue: > > I applied Rabeeh's patch on top of this v2 series and generated the > two attached patches. > > Could you please give them a try and let us know if it fixes the > Ethernet PHY detect issue?
After some brief testing with these two patches, it seems to be working. After trying various methods (cold boot, reset from u-boot prompt several consecutive times, reboot from linux several times), it seems to consistantly detect the PHY. Thanks for looking into it! live well, vagrant > From c0078a4fe907f8c579924f89ee5ac48e40d84736 Mon Sep 17 00:00:00 2001 > From: Fabio Estevam <fabio.este...@freescale.com> > Date: Fri, 1 May 2015 18:09:30 -0300 > Subject: [PATCH 1/2] fec: Allow passing a phy mask in > fecmxc_initialize_multi() > > Instead of only accepting a fixed PHY address, allow passing a range of PHY > addresses through a mask address. > > Signed-off-by: Rabeeh Khoury <rab...@solid-run.com> > Signed-off-by: Fabio Estevam <fabio.este...@freescale.com> > --- > board/denx/m28evk/m28evk.c | 4 ++-- > board/freescale/mx28evk/mx28evk.c | 4 ++-- > board/schulercontrol/sc_sps_1/sc_sps_1.c | 4 ++-- > drivers/net/fec_mxc.c | 10 +++++----- > include/netdev.h | 2 +- > 5 files changed, 12 insertions(+), 12 deletions(-) > > diff --git a/board/denx/m28evk/m28evk.c b/board/denx/m28evk/m28evk.c > index 33d38cf..7b4f67d 100644 > --- a/board/denx/m28evk/m28evk.c > +++ b/board/denx/m28evk/m28evk.c > @@ -131,13 +131,13 @@ int board_eth_init(bd_t *bis) > udelay(10000); > #endif > > - ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE); > + ret = fecmxc_initialize_multi(bis, 0, 1 << 0, MXS_ENET0_BASE); > if (ret) { > printf("FEC MXS: Unable to init FEC0\n"); > return ret; > } > > - ret = fecmxc_initialize_multi(bis, 1, 3, MXS_ENET1_BASE); > + ret = fecmxc_initialize_multi(bis, 1, 1 << 3, MXS_ENET1_BASE); > if (ret) { > printf("FEC MXS: Unable to init FEC1\n"); > return ret; > diff --git a/board/freescale/mx28evk/mx28evk.c > b/board/freescale/mx28evk/mx28evk.c > index 5005fe2..4cf9332 100644 > --- a/board/freescale/mx28evk/mx28evk.c > +++ b/board/freescale/mx28evk/mx28evk.c > @@ -118,13 +118,13 @@ int board_eth_init(bd_t *bis) > udelay(200); > gpio_set_value(MX28_PAD_ENET0_RX_CLK__GPIO_4_13, 1); > > - ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE); > + ret = fecmxc_initialize_multi(bis, 0, 1 << 0, MXS_ENET0_BASE); > if (ret) { > puts("FEC MXS: Unable to init FEC0\n"); > return ret; > } > > - ret = fecmxc_initialize_multi(bis, 1, 3, MXS_ENET1_BASE); > + ret = fecmxc_initialize_multi(bis, 1, 1 << 3, MXS_ENET1_BASE); > if (ret) { > puts("FEC MXS: Unable to init FEC1\n"); > return ret; > diff --git a/board/schulercontrol/sc_sps_1/sc_sps_1.c > b/board/schulercontrol/sc_sps_1/sc_sps_1.c > index 7f0b591..fdaa383 100644 > --- a/board/schulercontrol/sc_sps_1/sc_sps_1.c > +++ b/board/schulercontrol/sc_sps_1/sc_sps_1.c > @@ -79,13 +79,13 @@ int board_eth_init(bd_t *bis) > CLKCTRL_ENET_TIME_SEL_MASK, > CLKCTRL_ENET_TIME_SEL_RMII_CLK | CLKCTRL_ENET_CLK_OUT_EN); > > - ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE); > + ret = fecmxc_initialize_multi(bis, 0, 1 << 0, MXS_ENET0_BASE); > if (ret) { > printf("FEC MXS: Unable to init FEC0\n"); > return ret; > } > > - ret = fecmxc_initialize_multi(bis, 1, 1, MXS_ENET1_BASE); > + ret = fecmxc_initialize_multi(bis, 1, 1 << 1, MXS_ENET1_BASE); > if (ret) { > printf("FEC MXS: Unable to init FEC1\n"); > return ret; > diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c > index b572470..9817df2 100644 > --- a/drivers/net/fec_mxc.c > +++ b/drivers/net/fec_mxc.c > @@ -1077,7 +1077,7 @@ struct mii_dev *fec_get_miibus(uint32_t base_addr, int > dev_id) > return bus; > } > > -int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr) > +int fecmxc_initialize_multi(bd_t *bd, int dev_id, uint32_t phy_mask, > uint32_t addr) > { > uint32_t base_mii; > struct mii_dev *bus = NULL; > @@ -1095,19 +1095,19 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int > phy_id, uint32_t addr) > #else > base_mii = addr; > #endif > - debug("eth_init: fec_probe(bd, %i, %i) @ %08x\n", dev_id, phy_id, addr); > + debug("eth_init: fec_probe(bd, %i, %i) @ %08x\n", dev_id, phy_mask, > addr); > bus = fec_get_miibus(base_mii, dev_id); > if (!bus) > return -ENOMEM; > #ifdef CONFIG_PHYLIB > - phydev = phy_find_by_mask(bus, 1 << phy_id, PHY_INTERFACE_MODE_RGMII); > + phydev = phy_find_by_mask(bus, phy_mask, PHY_INTERFACE_MODE_RGMII); > if (!phydev) { > free(bus); > return -ENOMEM; > } > ret = fec_probe(bd, dev_id, addr, bus, phydev); > #else > - ret = fec_probe(bd, dev_id, addr, bus, phy_id); > + ret = fec_probe(bd, dev_id, addr, bus, phy_mask); > #endif > if (ret) { > #ifdef CONFIG_PHYLIB > @@ -1121,7 +1121,7 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int > phy_id, uint32_t addr) > #ifdef CONFIG_FEC_MXC_PHYADDR > int fecmxc_initialize(bd_t *bd) > { > - return fecmxc_initialize_multi(bd, -1, CONFIG_FEC_MXC_PHYADDR, > + return fecmxc_initialize_multi(bd, -1, 1 << CONFIG_FEC_MXC_PHYADDR, > IMX_FEC_BASE); > } > #endif > diff --git a/include/netdev.h b/include/netdev.h > index d96e1da..15c513d 100644 > --- a/include/netdev.h > +++ b/include/netdev.h > @@ -49,7 +49,7 @@ int eth_3com_initialize (bd_t * bis); > int ethoc_initialize(u8 dev_num, int base_addr); > int fec_initialize (bd_t *bis); > int fecmxc_initialize(bd_t *bis); > -int fecmxc_initialize_multi(bd_t *bis, int dev_id, int phy_id, uint32_t > addr); > +int fecmxc_initialize_multi(bd_t *bis, int dev_id, uint32_t phy_mask, > uint32_t addr); > int ftgmac100_initialize(bd_t *bits); > int ftmac100_initialize(bd_t *bits); > int ftmac110_initialize(bd_t *bits); > -- > 1.9.1 > > From cc3a6625a4ddab8943c8d66f5dd0aac651e7c5e5 Mon Sep 17 00:00:00 2001 > From: Fabio Estevam <fabio.este...@freescale.com> > Date: Fri, 1 May 2015 18:16:13 -0300 > Subject: [PATCH 2/2] mx6cuboxi: Fix Ethernet PHY undetected problem > > mx6cuboxi sometimes fails to recognize the Ethernet PHY: > > Net: Phy 0 not found > > The explanation comes from a patch from Rabeeh: > > "Initialize the phy in address 0x0 or 0x4 (0x11 phy mask). > 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." > > Reported-by: Vagrant Cascadian <vagr...@aikidev.net> > Signed-off-by: Rabeeh Khoury <rab...@solid-run.com> > Signed-off-by: Fabio Estevam <fabio.este...@freescale.com> > --- > board/solidrun/mx6cuboxi/mx6cuboxi.c | 16 ++++++++++++++++ > include/configs/mx6cuboxi.h | 1 - > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c > b/board/solidrun/mx6cuboxi/mx6cuboxi.c > index 9aa0259..d1ba2dd 100644 > --- a/board/solidrun/mx6cuboxi/mx6cuboxi.c > +++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c > @@ -133,6 +133,8 @@ static iomux_v3_cfg_t const enet_pads[] = { > IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)), > IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)), > IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | > MUX_PAD_CTRL(ENET_PAD_CTRL_PD)), > + IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)), > + IOMUX_PADS(PAD_ENET_RXD1__GPIO1_IO26 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)), > }; > > static void setup_iomux_enet(void) > @@ -144,6 +146,20 @@ static void setup_iomux_enet(void) > gpio_set_value(ETH_PHY_RESET, 1); > } > > +int fecmxc_initialize(bd_t *bd) > +{ > + /* > + * Initialize the phy in address 0x0 or 0x4 (0x11 phy mask). > + * 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. > + */ > + return fecmxc_initialize_multi(bd, -1, 0x11, IMX_FEC_BASE); > +} > + > int board_phy_config(struct phy_device *phydev) > { > if (phydev->drv->config) > diff --git a/include/configs/mx6cuboxi.h b/include/configs/mx6cuboxi.h > index 4e07f59..3759b3f 100644 > --- a/include/configs/mx6cuboxi.h > +++ b/include/configs/mx6cuboxi.h > @@ -57,7 +57,6 @@ > #define CONFIG_MII > #define IMX_FEC_BASE ENET_BASE_ADDR > #define CONFIG_FEC_XCV_TYPE RGMII > -#define CONFIG_FEC_MXC_PHYADDR 0 > #define CONFIG_PHYLIB > #define CONFIG_PHY_ATHEROS > > -- > 1.9.1
signature.asc
Description: PGP signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot