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

Commit af2a3eac authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

mdio: Add mdio45_ethtool_spauseparam_an()



This implements the ETHTOOL_SPAUSEPARAM operation for MDIO (clause 45)
PHYs with auto-negotiation MMDs.

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a8c30832
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -274,6 +274,36 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
}
EXPORT_SYMBOL(mdio45_ethtool_gset_npage);

/**
 * mdio45_ethtool_spauseparam_an - set auto-negotiated pause parameters
 * @mdio: MDIO interface
 * @ecmd: Ethtool request structure
 *
 * This function assumes that the PHY has an auto-negotiation MMD.  It
 * will enable and disable advertising of flow control as appropriate.
 */
void mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio,
				   const struct ethtool_pauseparam *ecmd)
{
	int adv, old_adv;

	WARN_ON(!(mdio->mmds & MDIO_DEVS_AN));

	old_adv = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_AN,
				  MDIO_AN_ADVERTISE);
	adv = old_adv & ~(ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
	if (ecmd->autoneg)
		adv |= mii_advertise_flowctrl(
			(ecmd->rx_pause ? FLOW_CTRL_RX : 0) |
			(ecmd->tx_pause ? FLOW_CTRL_TX : 0));
	if (adv != old_adv) {
		mdio->mdio_write(mdio->dev, mdio->prtad, MDIO_MMD_AN,
				 MDIO_AN_ADVERTISE, adv);
		mdio45_nway_restart(mdio);
	}
}
EXPORT_SYMBOL(mdio45_ethtool_spauseparam_an);

/**
 * mdio_mii_ioctl - MII ioctl interface for MDIO (clause 22 or 45) PHYs
 * @mdio: MDIO interface
+3 −0
Original line number Diff line number Diff line
@@ -279,6 +279,9 @@ extern int mdio45_nway_restart(const struct mdio_if_info *mdio);
extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
				      struct ethtool_cmd *ecmd,
				      u32 npage_adv, u32 npage_lpa);
extern void
mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio,
			      const struct ethtool_pauseparam *ecmd);

/**
 * mdio45_ethtool_gset - get settings for ETHTOOL_GSET