If the firmware missed to initialize the PHY correctly, Linux may hang up on socrates while eth0/eth1 interface startup (caused by continuous unacknowledged PHY interrupt).
This patch adds PHY fixup to socrates platform code to ensure the PHY is pre-initialized correctly. It is needed to be compatible with older firmware. Signed-off-by: Anatolij Gustschin <[email protected]> --- arch/powerpc/platforms/85xx/socrates.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/platforms/85xx/socrates.c b/arch/powerpc/platforms/85xx/socrates.c index d0e8443..2275a39 100644 --- a/arch/powerpc/platforms/85xx/socrates.c +++ b/arch/powerpc/platforms/85xx/socrates.c @@ -28,6 +28,7 @@ #include <linux/delay.h> #include <linux/seq_file.h> #include <linux/of_platform.h> +#include <linux/phy.h> #include <asm/system.h> #include <asm/time.h> @@ -78,6 +79,21 @@ static void __init socrates_pic_init(void) of_node_put(np); } +static int socrates_m88e1121_fixup(struct phy_device *phydev) +{ + int err; + + err = phy_write(phydev, 0x12, 0); + if (err < 0) + return err; + + err = phy_read(phydev, 0x13); + if (err < 0) + return err; + + return 0; +} + /* * Setup the architecture */ @@ -105,6 +121,8 @@ static struct of_device_id __initdata socrates_of_bus_ids[] = { static void __init socrates_init(void) { of_platform_bus_probe(NULL, socrates_of_bus_ids, NULL); + phy_register_fixup_for_uid(0x1410cb0, 0xffffff0, + socrates_m88e1121_fixup); } /* -- 1.5.6.3 _______________________________________________ Linuxppc-dev mailing list [email protected] https://ozlabs.org/mailman/listinfo/linuxppc-dev
