diff options
author | Johan Hovold <johan@kernel.org> | 2014-11-11 20:00:10 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-11-12 13:55:36 -0500 |
commit | bde151296a27c8ffaf000bb92ae6b318b8b3e0ec (patch) | |
tree | b2aefb46a4c79cf4e89b3af3d91cff5665fc6ada /drivers/net/phy/micrel.c | |
parent | 00aee095000c064cd77556050d08ed3f49f2af59 (diff) |
net: phy: micrel: refactor broadcast disable
Refactor and clean up broadcast disable.
Some Micrel PHYs have a broadcast-off bit in the Operation Mode Strap
Override register which can be used to disable PHY address 0 as the
broadcast address, so that it can be used as a unique (non-broadcast)
address on a shared bus.
Note that the KSZPHY_OMSO_RMII_OVERRIDE bit is set by default on
KSZ8021/8031.
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy/micrel.c')
-rw-r--r-- | drivers/net/phy/micrel.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index d962a2866bb..21abe5ade3d 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -184,6 +184,25 @@ static int kszphy_setup_led(struct phy_device *phydev, return rc < 0 ? rc : 0; } +/* Disable PHY address 0 as the broadcast address, so that it can be used as a + * unique (non-broadcast) address on a shared bus. + */ +static int kszphy_broadcast_disable(struct phy_device *phydev) +{ + int ret; + + ret = phy_read(phydev, MII_KSZPHY_OMSO); + if (ret < 0) + goto out; + + ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); +out: + if (ret) + dev_err(&phydev->dev, "failed to disable broadcast address\n"); + + return ret; +} + static int kszphy_config_init(struct phy_device *phydev) { return 0; @@ -197,7 +216,6 @@ static int kszphy_config_init_led8041(struct phy_device *phydev) static int ksz8021_config_init(struct phy_device *phydev) { - const u16 val = KSZPHY_OMSO_B_CAST_OFF | KSZPHY_OMSO_RMII_OVERRIDE; int rc; rc = kszphy_setup_led(phydev, 0x1f, 4); @@ -207,7 +225,9 @@ static int ksz8021_config_init(struct phy_device *phydev) rc = ksz_config_flags(phydev); if (rc < 0) return rc; - rc = phy_write(phydev, MII_KSZPHY_OMSO, val); + + rc = kszphy_broadcast_disable(phydev); + return rc < 0 ? rc : 0; } |