aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2009-04-29 04:19:36 -0400
committerDavid S. Miller <davem@davemloft.net>2009-04-29 20:32:36 -0400
commitaf2a3eac2fe6a6d8e9fdf6927284b34466a7d808 (patch)
tree7ccb5fd4ab0b81a46535e251cb7a151efa0c39f8
parenta8c30832b5b12e5d4e9d1c20cdac3cc2880e08b8 (diff)
mdio: Add mdio45_ethtool_spauseparam_an()
This implements the ETHTOOL_SPAUSEPARAM operation for MDIO (clause 45) PHYs with auto-negotiation MMDs. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/mdio.c30
-rw-r--r--include/linux/mdio.h3
2 files changed, 33 insertions, 0 deletions
diff --git a/drivers/net/mdio.c b/drivers/net/mdio.c
index 0604a25748ee..2fb0d16b61f7 100644
--- a/drivers/net/mdio.c
+++ b/drivers/net/mdio.c
@@ -275,6 +275,36 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
275EXPORT_SYMBOL(mdio45_ethtool_gset_npage); 275EXPORT_SYMBOL(mdio45_ethtool_gset_npage);
276 276
277/** 277/**
278 * mdio45_ethtool_spauseparam_an - set auto-negotiated pause parameters
279 * @mdio: MDIO interface
280 * @ecmd: Ethtool request structure
281 *
282 * This function assumes that the PHY has an auto-negotiation MMD. It
283 * will enable and disable advertising of flow control as appropriate.
284 */
285void mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio,
286 const struct ethtool_pauseparam *ecmd)
287{
288 int adv, old_adv;
289
290 WARN_ON(!(mdio->mmds & MDIO_DEVS_AN));
291
292 old_adv = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_AN,
293 MDIO_AN_ADVERTISE);
294 adv = old_adv & ~(ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
295 if (ecmd->autoneg)
296 adv |= mii_advertise_flowctrl(
297 (ecmd->rx_pause ? FLOW_CTRL_RX : 0) |
298 (ecmd->tx_pause ? FLOW_CTRL_TX : 0));
299 if (adv != old_adv) {
300 mdio->mdio_write(mdio->dev, mdio->prtad, MDIO_MMD_AN,
301 MDIO_AN_ADVERTISE, adv);
302 mdio45_nway_restart(mdio);
303 }
304}
305EXPORT_SYMBOL(mdio45_ethtool_spauseparam_an);
306
307/**
278 * mdio_mii_ioctl - MII ioctl interface for MDIO (clause 22 or 45) PHYs 308 * mdio_mii_ioctl - MII ioctl interface for MDIO (clause 22 or 45) PHYs
279 * @mdio: MDIO interface 309 * @mdio: MDIO interface
280 * @mii_data: MII ioctl data structure 310 * @mii_data: MII ioctl data structure
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
index ba41537eaa8a..5645c0f863dc 100644
--- a/include/linux/mdio.h
+++ b/include/linux/mdio.h
@@ -279,6 +279,9 @@ extern int mdio45_nway_restart(const struct mdio_if_info *mdio);
279extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, 279extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
280 struct ethtool_cmd *ecmd, 280 struct ethtool_cmd *ecmd,
281 u32 npage_adv, u32 npage_lpa); 281 u32 npage_adv, u32 npage_lpa);
282extern void
283mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio,
284 const struct ethtool_pauseparam *ecmd);
282 285
283/** 286/**
284 * mdio45_ethtool_gset - get settings for ETHTOOL_GSET 287 * mdio45_ethtool_gset - get settings for ETHTOOL_GSET