[U-Boot] mx6cuboxi: PHY/FEC detection
Vagrant Cascadian
vagrant at aikidev.net
Sat May 2 02:07:38 CEST 2015
On 2015-05-01, Fabio Estevam wrote:
> On Fri, May 1, 2015 at 5:20 PM, Fabio Estevam <festevam at 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.estevam at 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 <rabeeh at solid-run.com>
> Signed-off-by: Fabio Estevam <fabio.estevam at 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.estevam at 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 <vagrant at aikidev.net>
> Signed-off-by: Rabeeh Khoury <rabeeh at solid-run.com>
> Signed-off-by: Fabio Estevam <fabio.estevam at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20150501/1d9d4b3d/attachment.sig>
More information about the U-Boot
mailing list