From: Jonas Gorski <jogo@openwrt.org>
Date: Thu, 5 Sep 2013 20:30:34 +0000 (+0000)
Subject: kernel: b53: support phy ids for BCM5365
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=4b0655500ae1be6f15613c77a670680d9eae9991;p=openwrt%2Fstaging%2Fthess.git

kernel: b53: support phy ids for BCM5365

BCM5365 (and probably other older variants) use a different phy id, so
the phy driver never attached for them.
Fix this by adding the appropriate phy id to the fixup and the phy
driver.

Reported-by: Russell Senior <russell@personaltelco.net>
Signed-off-by: Jonas Gorski <jogo@openwrt.org>

SVN-Revision: 37906
---

diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c b/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c
index 1ba05914ea..6403cc6388 100644
--- a/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c
+++ b/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c
@@ -373,6 +373,22 @@ static struct phy_driver b53_phy_driver_id2 = {
 	},
 };
 
+/* BCM5365 */
+static struct phy_driver b53_phy_driver_id3 = {
+	.phy_id		= 0x00406000,
+	.name		= "Broadcom B53 (3)",
+	.phy_id_mask	= 0x1ffffc00,
+	.features	= 0,
+	.probe		= b53_phy_probe,
+	.remove		= b53_phy_remove,
+	.config_aneg	= b53_phy_config_aneg,
+	.config_init	= b53_phy_config_init,
+	.read_status	= b53_phy_read_status,
+	.driver = {
+		.owner = THIS_MODULE,
+	},
+};
+
 int __init b53_phy_driver_register(void)
 {
 	int ret;
@@ -383,13 +399,21 @@ int __init b53_phy_driver_register(void)
 
 	ret = phy_driver_register(&b53_phy_driver_id2);
 	if (ret)
-		phy_driver_unregister(&b53_phy_driver_id1);
+		goto err1;
 
+	ret = phy_driver_register(&b53_phy_driver_id3);
+	if (!ret)
+		return 0;
+
+	phy_driver_unregister(&b53_phy_driver_id2);
+err1:
+	phy_driver_unregister(&b53_phy_driver_id1);
 	return ret;
 }
 
 void __exit b53_phy_driver_unregister(void)
 {
+	phy_driver_unregister(&b53_phy_driver_id3);
 	phy_driver_unregister(&b53_phy_driver_id2);
 	phy_driver_unregister(&b53_phy_driver_id1);
 }
diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_phy_fixup.c b/target/linux/generic/files/drivers/net/phy/b53/b53_phy_fixup.c
index 447f30b649..72d1373d7f 100644
--- a/target/linux/generic/files/drivers/net/phy/b53/b53_phy_fixup.c
+++ b/target/linux/generic/files/drivers/net/phy/b53/b53_phy_fixup.c
@@ -24,6 +24,7 @@
 
 #define B53_BRCM_OUI_1	0x0143bc00
 #define B53_BRCM_OUI_2	0x03625c00
+#define B53_BRCM_OUI_3	0x00406000
 
 static int b53_phy_fixup(struct phy_device *dev)
 {
@@ -38,7 +39,8 @@ static int b53_phy_fixup(struct phy_device *dev)
 	phy_id |= mdiobus_read(bus, 0, 3);
 
 	if ((phy_id & 0xfffffc00) == B53_BRCM_OUI_1 ||
-	    (phy_id & 0xfffffc00) == B53_BRCM_OUI_2) {
+	    (phy_id & 0xfffffc00) == B53_BRCM_OUI_2 ||
+	    (phy_id & 0xfffffc00) == B53_BRCM_OUI_3) {
 		dev->phy_id = phy_id;
 	}