Vagrant, 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? Regards, Fabio Estevam
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
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot