--- /dev/null
+From 0878fff1f42c18e448ab5b8b4f6a3eb32365b5b6 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Sun, 5 Mar 2017 12:34:49 -0800
+Subject: net: phy: Do not perform software reset for Generic PHY
+
+From: Florian Fainelli <f.fainelli@gmail.com>
+
+commit 0878fff1f42c18e448ab5b8b4f6a3eb32365b5b6 upstream.
+
+The Generic PHY driver is a catch-all PHY driver and it should preserve
+whatever prior initialization has been done by boot loader or firmware
+agents. For specific PHY device configuration it is expected that a
+specialized PHY driver would take over that role.
+
+Resetting the generic PHY was a bad idea that has lead to several
+complaints and downstream workarounds e.g: in OpenWrt/LEDE so restore
+the behavior prior to 87aa9f9c61ad ("net: phy: consolidate PHY
+reset in phy_init_hw()").
+
+Reported-by: Felix Fietkau <nbd@nbd.name>
+Fixes: 87aa9f9c61ad ("net: phy: consolidate PHY reset in phy_init_hw()")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/phy/phy_device.c | 2 +-
+ include/linux/phy.h | 4 ++++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/phy/phy_device.c
++++ b/drivers/net/phy/phy_device.c
+@@ -1341,7 +1341,7 @@ static struct phy_driver genphy_driver[]
+ .phy_id = 0xffffffff,
+ .phy_id_mask = 0xffffffff,
+ .name = "Generic PHY",
+- .soft_reset = genphy_soft_reset,
++ .soft_reset = genphy_no_soft_reset,
+ .config_init = genphy_config_init,
+ .features = PHY_GBIT_FEATURES | SUPPORTED_MII |
+ SUPPORTED_AUI | SUPPORTED_FIBRE |
+--- a/include/linux/phy.h
++++ b/include/linux/phy.h
+@@ -737,6 +737,10 @@ int genphy_read_status(struct phy_device
+ int genphy_suspend(struct phy_device *phydev);
+ int genphy_resume(struct phy_device *phydev);
+ int genphy_soft_reset(struct phy_device *phydev);
++static inline int genphy_no_soft_reset(struct phy_device *phydev)
++{
++ return 0;
++}
+ void phy_driver_unregister(struct phy_driver *drv);
+ void phy_drivers_unregister(struct phy_driver *drv, int n);
+ int phy_driver_register(struct phy_driver *new_driver);