Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7127f2fe authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'u32-to-linkmode-fixes'



Andrew Lunn says:

====================
u32 to linkmode fixes

This patchset fixes issues found in the last patchset which converted
the phydev advertise etc, from a u32 to a linux bitmap. Most of the
issues are the result of clearing bits which should not of been
cleared. To make the API clearer, the idea from Heiner Kallweit was
used, with _mod_ to indicate the function modifies just the bits it
needs to, or _to_ to clear all bits and just set bit that need to be
set.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b255e500 9db299c7
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -1047,21 +1047,21 @@ static int m88e1145_config_init(struct phy_device *phydev)
}

/**
 * fiber_lpa_to_linkmode_lpa_t
 * fiber_lpa_mod_linkmode_lpa_t
 * @advertising: the linkmode advertisement settings
 * @lpa: value of the MII_LPA register for fiber link
 *
 * A small helper function that translates MII_LPA
 * bits to linkmode LP advertisement settings.
 * A small helper function that translates MII_LPA bits to linkmode LP
 * advertisement settings. Other bits in advertising are left
 * unchanged.
 */
static void fiber_lpa_to_linkmode_lpa_t(unsigned long *advertising, u32 lpa)
static void fiber_lpa_mod_linkmode_lpa_t(unsigned long *advertising, u32 lpa)
{
	if (lpa & LPA_FIBER_1000HALF)
		linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
				 advertising);
	if (lpa & LPA_FIBER_1000FULL)
		linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
				 advertising);
	linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
			 advertising, lpa & LPA_FIBER_1000HALF);

	linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
			 advertising, lpa & LPA_FIBER_1000FULL);
}

/**
@@ -1138,7 +1138,7 @@ static int marvell_read_status_page_an(struct phy_device *phydev,

	if (!fiber) {
		mii_lpa_to_linkmode_lpa_t(phydev->lp_advertising, lpa);
		mii_stat1000_to_linkmode_lpa_t(phydev->lp_advertising, lpagb);
		mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, lpagb);

		if (phydev->duplex == DUPLEX_FULL) {
			phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
@@ -1146,7 +1146,7 @@ static int marvell_read_status_page_an(struct phy_device *phydev,
		}
	} else {
		/* The fiber link is only 1000M capable */
		fiber_lpa_to_linkmode_lpa_t(phydev->lp_advertising, lpa);
		fiber_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);

		if (phydev->duplex == DUPLEX_FULL) {
			if (!(lpa & LPA_PAUSE_FIBER)) {
+1 −1
Original line number Diff line number Diff line
@@ -490,7 +490,7 @@ static int mv3310_read_status(struct phy_device *phydev)
		if (val < 0)
			return val;

		mii_stat1000_to_linkmode_lpa_t(phydev->lp_advertising, val);
		mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);

		if (phydev->autoneg == AUTONEG_ENABLE)
			phy_resolve_aneg_linkmode(phydev);
+2 −2
Original line number Diff line number Diff line
@@ -437,7 +437,7 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
				}
				break;
			case MII_ADVERTISE:
				mii_adv_to_linkmode_adv_t(phydev->advertising,
				mii_adv_mod_linkmode_adv_t(phydev->advertising,
							   val);
				change_autoneg = true;
				break;
+3 −3
Original line number Diff line number Diff line
@@ -1739,7 +1739,7 @@ int genphy_read_status(struct phy_device *phydev)
				return -ENOLINK;
			}

			mii_stat1000_to_linkmode_lpa_t(phydev->lp_advertising,
			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
							lpagb);
			common_adv_gb = lpagb & adv << 2;
		}
@@ -1748,7 +1748,7 @@ int genphy_read_status(struct phy_device *phydev)
		if (lpa < 0)
			return lpa;

		mii_lpa_to_linkmode_lpa_t(phydev->lp_advertising, lpa);
		mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);

		adv = phy_read(phydev, MII_ADVERTISE);
		if (adv < 0)
+9 −0
Original line number Diff line number Diff line
@@ -57,6 +57,15 @@ static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr)
	__clear_bit(nr, addr);
}

static inline void linkmode_mod_bit(int nr, volatile unsigned long *addr,
				    int set)
{
	if (set)
		linkmode_set_bit(nr, addr);
	else
		linkmode_clear_bit(nr, addr);
}

static inline void linkmode_change_bit(int nr, volatile unsigned long *addr)
{
	__change_bit(nr, addr);
Loading