davinci-mdio: failing to connect to PHY
Subsystems (2)
Hi,
I'm experiencing a peculiar problem with PHY communication in the current davinci-mdio.c driver.
After upgrading from kernel 3.17 to 4.5 my DT based AM1808 board started having issues with the PHY communication.
The MAC is detected, the MDIO is detected, the PHY is detected (twice?!?!), however there is no data being sent/received and the after issuing "ifdown -a" the MDIO starts spitting out messages that it cannot connect to the PHY:
net eth0: could not connect to phy davinci_mdio.0:00 davinci_mdio davinci_mdio.0: resetting idled controller
I'm using a single Micrel KSZ8081 PHY connected via RMII using the default PHY address 0x01. Here is the dmesg excerpt related to mdio:
davinci_mdio davinci_mdio.0: Runtime PM disabled, clock forced on.davinci_mdio davinci_mdio.0: davinci mdio revision 1.5davinci_mdio davinci_mdio.0: detected phy mask fffffffc
libphy: davinci_mdio.0: probeddavinci_mdio davinci_mdio.0: phy[0]: device davinci_mdio.0:00, driver Micrel KSZ8081 or KSZ8091davinci_mdio davinci_mdio.0: phy[1]: device davinci_mdio.0:01, driver Micrel KSZ8081 or KSZ8091davinci_mdio davinci_mdio.0: resetting idled controller
Micrel KSZ8081 or KSZ8091 davinci_mdio.0:00: failed to disable NAND tree mode
Micrel KSZ8081 or KSZ8091 davinci_mdio.0:00: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=davinci_mdio.0:00, irq=-1)
After a soft-reboot the MDIO uses a different PHY mask fffffffd, detects correctly only one PHY at address 1 (this is the default address) and the networking works:
davinci_mdio davinci_mdio.0: Runtime PM disabled, clock forced on.davinci_mdio davinci_mdio.0: davinci mdio revision 1.5davinci_mdio davinci_mdio.0: detected phy mask fffffffd
libphy: davinci_mdio.0: probeddavinci_mdio davinci_mdio.0: phy[1]: device davinci_mdio.0:01, driver Micrel KSZ8081 or KSZ8091davinci_mdio davinci_mdio.0: resetting idled controller
Micrel KSZ8081 or KSZ8091 davinci_mdio.0:01: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=davinci_mdio.0:01, irq=-1)
I'm wondering what the problem is and why the PHY mask is different after power-up and after a soft reboot. Also it's not clear to me why this set-up worked with kernel 3.17 even if it was detecting the PHY twice exactly the same way. How does the mask relate to the PHY address and how is it calculated?
Thanks
Petr
Quoted 35 lines · Petr Kulhavy
Hi,
I'm experiencing a peculiar problem with PHY communication in the current
davinci-mdio.cdriver.
After upgrading from kernel 3.17 to 4.5 my DT based AM1808 board started having issues with the PHY communication.
The MAC is detected, the MDIO is detected, the PHY is detected (twice?!?!), however there is no data being sent/received and the after issuing "ifdown -a" the MDIO starts spitting out messages that it cannot connect to the PHY:net eth0: could not connect to phy davinci_mdio.0:00
davinci_mdiodavinci_mdio.0: resetting idled controllerI'm using a single Micrel KSZ8081 PHY connected via RMII using the default PHY address
0x01.
Here is the dmesg excerpt related to mdio:
davinci_mdiodavinci_mdio.0: Runtime PM disabled, clock forced on.davinci_mdiodavinci_mdio.0: davinci mdio revision 1.5davinci_mdiodavinci_mdio.0: detected phy mask fffffffc
libphy: davinci_mdio.0: probeddavinci_mdiodavinci_mdio.0: phy[0]: device davinci_mdio.0:00, driver Micrel KSZ8081 or KSZ8091davinci_mdiodavinci_mdio.0: phy[1]: device davinci_mdio.0:01, driver Micrel KSZ8081 or KSZ8091davinci_mdiodavinci_mdio.0: resetting idled controller Micrel KSZ8081 or KSZ8091 davinci_mdio.0:00: failed to disable NAND tree mode
Micrel KSZ8081 or KSZ8091 davinci_mdio.0:00: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=davinci_mdio.0:00, irq=-1)
Quoted 3 lines
After a soft-reboot the MDIO uses a different PHY mask fffffffd, detects correctly only one PHY at address 1 (this is the default address) and the networking works:
Hi Petr
You might want to take a look at:
http://lxr.free-electrons.com/source/drivers/net/ethernet/ti/davinci_mdio.c#L137
It seems to be asking the hardware about the phy mask.
Andrew
Quoted 10 lines · Andrew Lunn
Hi Petr
You might want to take a look at:
http://lxr.free-electrons.com/source/drivers/net/ethernet/ti/davinci_mdio.c#L137
It seems to be asking the hardware about the phy mask.
Andrew
Hi Andrew,
thanks a lot for the link. In the meantime I've understood the issue better. It is due to the fact that the PHY is pin-strapped to address 1 and broadcast (at address 0) is enabled. The Micrel driver's config_init() disables the broadcast and the PHY stops responding, which causes the troubles. The kernel 3.17 didn't disable the broadcast and therefore it worked.
I'm wondering how to solve or workaround this...
Petr
Quoted 15 lines · Petr Kulhavy
Quoted 9 lines · Andrew Lunn
Hi Petr
You might want to take a look at:
http://lxr.free-electrons.com/source/drivers/net/ethernet/ti/davinci_mdio.c#L137
It seems to be asking the hardware about the phy mask.
Andrew
Hi Andrew,
Quoted 8 lines
thanks a lot for the link. In the meantime I've understood the issue better. It is due to the fact that the PHY is pin-strapped to address 1 and broadcast (at address 0) is enabled. The Micrel driver's
config_init()disables the broadcast and the PHY stops responding, which causes the troubles. The kernel 3.17 didn't disable the broadcast and therefore it worked.I'm wondering how to solve or workaround this...
One option is in your device tree is to explicitly list the phy on your mdio bus. Something like:
&mdio {
status = "okay";
ethphy0: ethernet-phy@1 {
reg = <1>;
};
};This alone might be sufficient. If not, you need to reference the phy via a phandle in the ethernet node.
ð0 {
status = "okay";
phy-handle = <ðphy0>;
};Andrew
Quoted 26 lines · Andrew Lunn
Quoted 10 lines · Petr Kulhavy
Hi Andrew,
thanks a lot for the link. In the meantime I've understood the issue better. It is due to the fact that the PHY is pin-strapped to address 1 and broadcast (at address 0) is enabled. The Micrel driver's
config_init()disables the broadcast and the PHY stops responding, which causes the troubles. The kernel 3.17 didn't disable the broadcast and therefore it worked.I'm wondering how to solve or workaround this...
One option is in your device tree is to explicitly list the phy on your mdio bus. Something like:
&mdio { status = "okay"; ethphy0: ethernet-phy@1 { reg = <1>; }; };This alone might be sufficient. If not, you need to reference the phy via a phandle in the ethernet node.
Quoted 6 lines
ð0 { status = "okay"; phy-handle = <ðphy0>; };Andrew
Thanks a lot, I'm going to try it out right now!
Cheers
Petr