diff options
author | David S. Miller <davem@davemloft.net> | 2022-06-19 10:38:27 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2022-06-19 10:38:27 +0100 |
commit | 5fc217a3c9a87a99e22d9be085c3ab8370ab7271 (patch) | |
tree | 3bf67116cfa16c369de0bb884b1ad0f490657488 /drivers | |
parent | 5d1d527cd905752c6486421eeb27592849da17ab (diff) | |
parent | 449b7a15200a15af8affefdd80ac567c40898dce (diff) |
Merge branch 'mii_bmcr_encode_fixed'
Russell King says:
====================
net: introduce mii_bmcr_encode_fixed()
While converting the mv88e6xxx driver to phylink pcs, it has been
noticed that we've started to have repeated cases where we convert a
speed and duplex to a BMCR value.
Rather than open coding this in multiple locations, let's provide a
helper for this - in linux/mii.h. This helper not only takes care of
the standard 10, 100 and 1000Mbps encodings, but also includes
2500Mbps (which is the same as 1000Mbps) for those users who require
that encoding as well. Unknown speeds will be encoded to 10Mbps, and
non-full duplexes will be encoded as half duplex.
This series converts the existing users to the new helper, and the
mv88e6xxx conversion will add further users in the 6352 and 639x PCS
code.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/pcs/pcs-xpcs.c | 18 | ||||
-rw-r--r-- | drivers/net/phy/marvell.c | 10 | ||||
-rw-r--r-- | drivers/net/phy/phy_device.c | 18 |
3 files changed, 6 insertions, 40 deletions
diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index a5d520e34ea3..ab0af1d2531f 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -1081,23 +1081,7 @@ static void xpcs_link_up_sgmii(struct dw_xpcs *xpcs, unsigned int mode, if (phylink_autoneg_inband(mode)) return; - switch (speed) { - case SPEED_1000: - val = BMCR_SPEED1000; - break; - case SPEED_100: - val = BMCR_SPEED100; - break; - case SPEED_10: - val = BMCR_SPEED10; - break; - default: - return; - } - - if (duplex == DUPLEX_FULL) - val |= BMCR_FULLDPLX; - + val = mii_bmcr_encode_fixed(speed, duplex); ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1, val); if (ret) pr_err("%s: xpcs_write returned %pe\n", __func__, ERR_PTR(ret)); diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index d777c8851ed6..a714150f5e8c 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -1991,15 +1991,9 @@ static int m88e1510_loopback(struct phy_device *phydev, bool enable) int err; if (enable) { - u16 bmcr_ctl = 0, mscr2_ctl = 0; + u16 bmcr_ctl, mscr2_ctl = 0; - if (phydev->speed == SPEED_1000) - bmcr_ctl = BMCR_SPEED1000; - else if (phydev->speed == SPEED_100) - bmcr_ctl = BMCR_SPEED100; - - if (phydev->duplex == DUPLEX_FULL) - bmcr_ctl |= BMCR_FULLDPLX; + bmcr_ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); err = phy_write(phydev, MII_BMCR, bmcr_ctl); if (err < 0) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 431a8719c635..7885bceff773 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2001,18 +2001,12 @@ EXPORT_SYMBOL(genphy_config_eee_advert); */ int genphy_setup_forced(struct phy_device *phydev) { - u16 ctl = 0; + u16 ctl; phydev->pause = 0; phydev->asym_pause = 0; - if (SPEED_1000 == phydev->speed) - ctl |= BMCR_SPEED1000; - else if (SPEED_100 == phydev->speed) - ctl |= BMCR_SPEED100; - - if (DUPLEX_FULL == phydev->duplex) - ctl |= BMCR_FULLDPLX; + ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); return phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK | BMCR_ISOLATE | BMCR_PDOWN), ctl); @@ -2614,13 +2608,7 @@ int genphy_loopback(struct phy_device *phydev, bool enable) u16 val, ctl = BMCR_LOOPBACK; int ret; - if (phydev->speed == SPEED_1000) - ctl |= BMCR_SPEED1000; - else if (phydev->speed == SPEED_100) - ctl |= BMCR_SPEED100; - - if (phydev->duplex == DUPLEX_FULL) - ctl |= BMCR_FULLDPLX; + ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); phy_modify(phydev, MII_BMCR, ~0, ctl); |