[U-Boot-Users] [PATCH] Fix mpc8360emds board hang on second network operation
Kim Phillips
kim.phillips at freescale.com
Wed Feb 27 17:46:48 CET 2008
On Tue, 26 Feb 2008 21:32:30 -0500
Jerry Van Baren <gvb.uboot at gmail.com> wrote:
> The changeset that causes my problems is ee62ed32
>
> The original code calls init_phy(dev) followed by phy_change(dev) *once*
> during PHY initialization. The part of changeset that appears to cause
> my problems is calling phy_change(dev) every time uec_init() is called.
phy_change is there so that u-boot will renegotiate the link in case
its state has changed since the last networking command (this was the
original complaint that warranted the ee62ed32 patch, iirc).
> On my mpc8360emds board, without this change the second command that does
> a network operation hangs the board (requires a hard reset to recover).
> Example failure sequence is two "ping" commands: the first works, the
> second hangs the board.
>
> This also speeds up the network initialization and doesn't cause a packet
> error on the first TFTP packet.
>
> Signed-off-by: Gerald Van Baren <vanbaren at cideas.com>
> ---
>
> Kim:
>
> Does this make any sense? Any thoughts why it isn't causing problems
> for you? It makes all the difference in the world for me.
>
> One other interesting sequence difference with patch ee62ed32 is that
> the ethernet MAC address is set on every uec_init() call. The following
> code was inside the "if (uec->the_first_run == 0)" conditional, now it
> is outside the conditional and thus run on every uec_init() call.
> Functionally, it doesn't seem to matter for me either way, but seems
> unnecessary.
>
> + /* Set up the MAC address */
> + if (dev->enetaddr[0] & 0x01) {
> + printf("%s: MacAddress is multcast address\n",
> + __FUNCTION__);
> + return -1;
> + }
> + uec_set_mac_address(uec, dev->enetaddr);
>
this was done in order to be able to re-set eth[1]addr between
networking commands, and have the new eth[1]addr value actually
programmed on the interface.
I've tested 100BT, and experience the same as you. The reason u-boot
doesn't recover is that i is not incremented in genmii_update_link(),
but adding that doesn't resolve the problem. I believe the PHY status
is being incorrectly determined somehow - these PHYs are really
finicky :/.
Kim
More information about the U-Boot
mailing list