diff options
author | jogo <jogo@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2013-09-05 20:30:34 +0000 |
---|---|---|
committer | jogo <jogo@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2013-09-05 20:30:34 +0000 |
commit | 6d4ab9bd28d65b54c28e02cfa074a3bf6658addf (patch) | |
tree | be97394cde9c016a190ac3f3c635515c07720f0e /target/linux | |
parent | a6fd9cc288a93d49f56e22c32fc0e9a3e9e9cfd6 (diff) |
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>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@37906 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c | 26 | ||||
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/b53/b53_phy_fixup.c | 4 |
2 files changed, 28 insertions, 2 deletions
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; } |