diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2009-04-29 04:21:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-04-29 20:32:37 -0400 |
commit | 0c09c1a49cc7b819b33566a49d9901f7cfdd6889 (patch) | |
tree | e10fc988a21ca0b3e1550ae905b96cc444f90a76 /drivers/net/mdio.c | |
parent | 3f926da82f128c68c479247b1771729b9487502a (diff) |
ethtool/mdio: Report MDIO mode support and link partner advertising
Add mdio_support and lp_advertising fields to ethtool_cmd. Set these
in mdio45_ethtool_gset{,_npage}().
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/mdio.c')
-rw-r--r-- | drivers/net/mdio.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/net/mdio.c b/drivers/net/mdio.c index 2fb0d16b61f7..ee383c256931 100644 --- a/drivers/net/mdio.c +++ b/drivers/net/mdio.c | |||
@@ -173,6 +173,8 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, | |||
173 | 173 | ||
174 | ecmd->transceiver = XCVR_INTERNAL; | 174 | ecmd->transceiver = XCVR_INTERNAL; |
175 | ecmd->phy_address = mdio->prtad; | 175 | ecmd->phy_address = mdio->prtad; |
176 | ecmd->mdio_support = | ||
177 | mdio->mode_support & (MDIO_SUPPORTS_C45 | MDIO_SUPPORTS_C22); | ||
176 | 178 | ||
177 | reg = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_PMAPMD, | 179 | reg = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_PMAPMD, |
178 | MDIO_CTRL2); | 180 | MDIO_CTRL2); |
@@ -235,16 +237,19 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, | |||
235 | 237 | ||
236 | if (ecmd->autoneg) { | 238 | if (ecmd->autoneg) { |
237 | u32 modes = 0; | 239 | u32 modes = 0; |
240 | int an_stat = mdio->mdio_read(mdio->dev, mdio->prtad, | ||
241 | MDIO_MMD_AN, MDIO_STAT1); | ||
238 | 242 | ||
239 | /* If AN is complete and successful, report best common | 243 | /* If AN is complete and successful, report best common |
240 | * mode, otherwise report best advertised mode. */ | 244 | * mode, otherwise report best advertised mode. */ |
241 | if (mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_AN, | 245 | if (an_stat & MDIO_AN_STAT1_COMPLETE) { |
242 | MDIO_STAT1) & | 246 | ecmd->lp_advertising = |
243 | MDIO_AN_STAT1_COMPLETE) | 247 | mdio45_get_an(mdio, MDIO_AN_LPA) | npage_lpa; |
244 | modes = (ecmd->advertising & | 248 | if (an_stat & MDIO_AN_STAT1_LPABLE) |
245 | (mdio45_get_an(mdio, MDIO_AN_LPA) | | 249 | ecmd->lp_advertising |= ADVERTISED_Autoneg; |
246 | npage_lpa)); | 250 | modes = ecmd->advertising & ecmd->lp_advertising; |
247 | if (modes == 0) | 251 | } |
252 | if ((modes & ~ADVERTISED_Autoneg) == 0) | ||
248 | modes = ecmd->advertising; | 253 | modes = ecmd->advertising; |
249 | 254 | ||
250 | if (modes & ADVERTISED_10000baseT_Full) { | 255 | if (modes & ADVERTISED_10000baseT_Full) { |