diff options
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) { |