aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-3.10/208-b44-add-dummy-phy-device-if-we-do-not-find-any.patch
blob: fd51a3f61b9ff8b55914924ef35af0a88f8acbf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
From 1a900b17b34ddca0336c739a2836bcb7f8aad5a8 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Fri, 25 Oct 2013 00:03:33 +0200
Subject: [PATCH 9/9] b44: add dummy phy device if we do not find any

---
 drivers/net/ethernet/broadcom/b44.c |   25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

--- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c
@@ -2222,6 +2222,8 @@ static int b44_register_phy_one(struct b
 	struct ssb_device *sdev = bp->sdev;
 	struct phy_device *phydev;
 	int err;
+	bool dummy_phy = false;
+	struct phy_c45_device_ids c45_ids = {0};
 
 	mii_bus = mdiobus_alloc();
 	if (!mii_bus) {
@@ -2256,9 +2258,21 @@ static int b44_register_phy_one(struct b
 
 	phydev = bp->mii_bus->phy_map[bp->phy_addr];
 	if (!phydev) {
-		dev_err(sdev->dev, "could not find PHY at %i\n", bp->phy_addr);
-		err = -ENODEV;
-		goto err_out_mdiobus_unregister;
+		dummy_phy = true;
+		dev_info(sdev->dev, "could not find PHY at %i, create dummy one\n",
+			 bp->phy_addr);
+
+		phydev = phy_device_create(bp->mii_bus, bp->phy_addr, 0x0, false, &c45_ids);
+		if (IS_ERR(phydev)) {
+			err = PTR_ERR(phydev);
+			dev_err(sdev->dev, "Can not create dummy PHY\n");
+			goto err_out_mdiobus_unregister;
+		}
+		err = phy_device_register(phydev);
+		if (err) {
+			dev_err(sdev->dev, "failed to register MII bus\n");
+			goto err_out_phy_free;
+		}
 	}
 
 	err = phy_connect_direct(bp->dev, phydev, &b44_adjust_link,
@@ -2266,7 +2280,7 @@ static int b44_register_phy_one(struct b
 	if (err < 0) {
 		dev_err(sdev->dev, "could not attach PHY at %i\n",
 			bp->phy_addr);
-		goto err_out_mdiobus_unregister;
+		goto err_out_phy_free;
 	}
 
 	/* mask with MAC supported features */
@@ -2288,6 +2302,9 @@ static int b44_register_phy_one(struct b
 
 	return 0;
 
+err_out_phy_free:
+	if (phydev && dummy_phy)
+		phy_device_free(phydev);
 err_out_mdiobus_unregister:
 	mdiobus_unregister(mii_bus);