[U-Boot] Ethernet PHY Power Down

Michael Welling mwelling at ieee.org
Fri Nov 6 23:04:29 CET 2015


On Fri, Nov 06, 2015 at 07:22:00PM -0200, Fabio Estevam wrote:
> On Fri, Nov 6, 2015 at 6:22 PM, Michael Welling <mwelling at ieee.org> wrote:
> > Lets try this again with list membership.
> >
> > I have run into an issue with a KSZ9031 Gigabit Ethernet PHY on an IMX6 module.
> >
> > After booting into Linux and rebooting the ethernet fails consistently.
> >
> > With a bit of investigation I found that the power-down bit in the PHY control
> > register is being set on reboot.
> >
> > => dhcp
> > BOOTP broadcast 1
> > BOOTP broadcast 2
> > BOOTP broadcast 3
> > BOOTP broadcast 4
> > BOOTP broadcast 5
> > .
> > .
> > Abort
> > => mii dump 1 0
> > 0.     (1940)                 -- PHY control register --
> >   (8000:0000) 0.15    =     0    reset
> >   (4000:0000) 0.14    =     0    loopback
> >   (2040:0040) 0. 6,13 =   b10    speed selection = 1000 Mbps
> >   (1000:1000) 0.12    =     1    A/N enable
> >   (0800:0800) 0.11    =     1    power-down
> >   (0400:0000) 0.10    =     0    isolate
> >   (0200:0000) 0. 9    =     0    restart A/N
> >   (0100:0100) 0. 8    =     1    duplex = full
> >   (0080:0000) 0. 7    =     0    collision test enable
> >   (003f:0000) 0. 5- 0 =     0    (reserved)
> >
> > When I manually toggle the power down bit it starts to work again.
> >
> > => mii write 1 0 1140
> > => dhcp
> > FEC Waiting for PHY auto negotiation to complete........ done
> > BOOTP broadcast 1
> > DHCP client bound to address 192.168.0.12 (62 ms)
> >
> > I tried performing the above steps in the PHY driver code with little luck.
> >
> > When I toggle the bit in the code the first dhcp always fails but then it
> > works on subsequent attempts.
> >
> > Any ideas?
> > Has anyone else seen this issue with other PHYs?
> 
> Could you try to revert 59370f3fc as suggested here?
> https://www.mail-archive.com/u-boot@lists.denx.de/msg191196.html

So I added the following lines to my board_phy_config function and the problem
seems to be fixed:
.
.
	ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);                                                                                                                                                                                                                   
	if (ctl & BMCR_PDOWN) {                                                                                                                                                                                                                                              
		ctl &= ~BMCR_PDOWN;                                                                                                                                                                                                                                          
		phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, ctl);                                                                                                                                                                                                           
		mdelay(15);                                                                                                                                                                                                                                                  
	}
.
.

Should this be handled somewhere in the PHY driver core?



More information about the U-Boot mailing list