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
This commit is contained in:
parent
bdc04e379f
commit
4b0655500a
2 changed files with 28 additions and 2 deletions
|
@ -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 __init b53_phy_driver_register(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -383,13 +399,21 @@ int __init b53_phy_driver_register(void)
|
||||||
|
|
||||||
ret = phy_driver_register(&b53_phy_driver_id2);
|
ret = phy_driver_register(&b53_phy_driver_id2);
|
||||||
if (ret)
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __exit b53_phy_driver_unregister(void)
|
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_id2);
|
||||||
phy_driver_unregister(&b53_phy_driver_id1);
|
phy_driver_unregister(&b53_phy_driver_id1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#define B53_BRCM_OUI_1 0x0143bc00
|
#define B53_BRCM_OUI_1 0x0143bc00
|
||||||
#define B53_BRCM_OUI_2 0x03625c00
|
#define B53_BRCM_OUI_2 0x03625c00
|
||||||
|
#define B53_BRCM_OUI_3 0x00406000
|
||||||
|
|
||||||
static int b53_phy_fixup(struct phy_device *dev)
|
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);
|
phy_id |= mdiobus_read(bus, 0, 3);
|
||||||
|
|
||||||
if ((phy_id & 0xfffffc00) == B53_BRCM_OUI_1 ||
|
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;
|
dev->phy_id = phy_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue