Denis Kirjanov 968106
From 4516a76b0ee26777ae8e8c8e787817ebb24a93e8 Mon Sep 17 00:00:00 2001
Denis Kirjanov 968106
From: Christian Lamparter <chunkeey@gmail.com>
Denis Kirjanov 968106
Date: Mon, 17 Sep 2018 17:22:40 +0200
Denis Kirjanov 968106
Subject: [PATCH 7/7] net: emac: fix fixed-link setup for the RTL8363SB switch
Denis Kirjanov 968106
References: git-fixes
Denis Kirjanov 968106
Patch-mainline: v4.19-rc6
Denis Kirjanov 968106
Git-commit: 08e39982ef64f800fd1f9b9b92968d14d5fafa82
Denis Kirjanov 968106
Denis Kirjanov 968106
On the Netgear WNDAP620, the emac ethernet isn't receiving nor
Denis Kirjanov 968106
xmitting any frames from/to the RTL8363SB (identifies itself
Denis Kirjanov 968106
as a RTL8367RB).
Denis Kirjanov 968106
Denis Kirjanov 968106
This is caused by the emac hardware not knowing the forced link
Denis Kirjanov 968106
parameters for speed, duplex, pause, etc.
Denis Kirjanov 968106
Denis Kirjanov 968106
This begs the question, how this was working on the original
Denis Kirjanov 968106
driver code, when it was necessary to set the phy_address and
Denis Kirjanov 968106
phy_map to 0xffffffff. But I guess without access to the old
Denis Kirjanov 968106
PPC405/440/460 hardware, it's not possible to know.
Denis Kirjanov 968106
Denis Kirjanov 968106
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Denis Kirjanov 968106
Signed-off-by: David S. Miller <davem@davemloft.net>
Denis Kirjanov 968106
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov 968106
---
Denis Kirjanov 968106
 drivers/net/ethernet/ibm/emac/core.c | 15 ++++++++++-----
Denis Kirjanov 968106
 1 file changed, 10 insertions(+), 5 deletions(-)
Denis Kirjanov 968106
Denis Kirjanov 968106
diff --git a/drivers/net/ethernet/ibm/emac/core.c b/drivers/net/ethernet/ibm/emac/core.c
Denis Kirjanov 968106
index d28e5a9a1363..b7d65158e498 100644
Denis Kirjanov 968106
--- a/drivers/net/ethernet/ibm/emac/core.c
Denis Kirjanov 968106
+++ b/drivers/net/ethernet/ibm/emac/core.c
Denis Kirjanov 968106
@@ -2673,12 +2673,17 @@ static int emac_init_phy(struct emac_instance *dev)
Denis Kirjanov 968106
 		if (of_phy_is_fixed_link(np)) {
Denis Kirjanov 968106
 			int res = emac_dt_mdio_probe(dev);
Denis Kirjanov 968106
 
Denis Kirjanov 968106
-			if (!res) {
Denis Kirjanov 968106
-				res = of_phy_register_fixed_link(np);
Denis Kirjanov 968106
-				if (res)
Denis Kirjanov 968106
-					mdiobus_unregister(dev->mii_bus);
Denis Kirjanov 968106
+			if (res)
Denis Kirjanov 968106
+				return res;
Denis Kirjanov 968106
+
Denis Kirjanov 968106
+			res = of_phy_register_fixed_link(np);
Denis Kirjanov 968106
+			dev->phy_dev = of_phy_find_device(np);
Denis Kirjanov 968106
+			if (res || !dev->phy_dev) {
Denis Kirjanov 968106
+				mdiobus_unregister(dev->mii_bus);
Denis Kirjanov 968106
+				return res ? res : -EINVAL;
Denis Kirjanov 968106
 			}
Denis Kirjanov 968106
-			return res;
Denis Kirjanov 968106
+			emac_adjust_link(dev->ndev);
Denis Kirjanov 968106
+			put_device(&dev->phy_dev->mdio.dev);
Denis Kirjanov 968106
 		}
Denis Kirjanov 968106
 		return 0;
Denis Kirjanov 968106
 	}
Denis Kirjanov 968106
-- 
Denis Kirjanov 968106
2.16.4
Denis Kirjanov 968106