diff options
Diffstat (limited to 'drivers/net/mdio.c')
-rw-r--r-- | drivers/net/mdio.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/drivers/net/mdio.c b/drivers/net/mdio.c index ee383c256931..66483035f683 100644 --- a/drivers/net/mdio.c +++ b/drivers/net/mdio.c | |||
@@ -202,12 +202,29 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, | |||
202 | break; | 202 | break; |
203 | 203 | ||
204 | case MDIO_PMA_CTRL2_10GBCX4: | 204 | case MDIO_PMA_CTRL2_10GBCX4: |
205 | ecmd->port = PORT_OTHER; | ||
206 | ecmd->supported = 0; | ||
207 | ecmd->advertising = 0; | ||
208 | break; | ||
209 | |||
205 | case MDIO_PMA_CTRL2_10GBKX4: | 210 | case MDIO_PMA_CTRL2_10GBKX4: |
206 | case MDIO_PMA_CTRL2_10GBKR: | 211 | case MDIO_PMA_CTRL2_10GBKR: |
207 | case MDIO_PMA_CTRL2_1000BKX: | 212 | case MDIO_PMA_CTRL2_1000BKX: |
208 | ecmd->port = PORT_OTHER; | 213 | ecmd->port = PORT_OTHER; |
209 | ecmd->supported = 0; | 214 | ecmd->supported = SUPPORTED_Backplane; |
210 | ecmd->advertising = 0; | 215 | reg = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_PMAPMD, |
216 | MDIO_PMA_EXTABLE); | ||
217 | if (reg & MDIO_PMA_EXTABLE_10GBKX4) | ||
218 | ecmd->supported |= SUPPORTED_10000baseKX4_Full; | ||
219 | if (reg & MDIO_PMA_EXTABLE_10GBKR) | ||
220 | ecmd->supported |= SUPPORTED_10000baseKR_Full; | ||
221 | if (reg & MDIO_PMA_EXTABLE_1000BKX) | ||
222 | ecmd->supported |= SUPPORTED_1000baseKX_Full; | ||
223 | reg = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_PMAPMD, | ||
224 | MDIO_PMA_10GBR_FECABLE); | ||
225 | if (reg & MDIO_PMA_10GBR_FECABLE_ABLE) | ||
226 | ecmd->supported |= SUPPORTED_10000baseR_FEC; | ||
227 | ecmd->advertising = ADVERTISED_Backplane; | ||
211 | break; | 228 | break; |
212 | 229 | ||
213 | /* All the other defined modes are flavours of optical */ | 230 | /* All the other defined modes are flavours of optical */ |
@@ -252,13 +269,16 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, | |||
252 | if ((modes & ~ADVERTISED_Autoneg) == 0) | 269 | if ((modes & ~ADVERTISED_Autoneg) == 0) |
253 | modes = ecmd->advertising; | 270 | modes = ecmd->advertising; |
254 | 271 | ||
255 | if (modes & ADVERTISED_10000baseT_Full) { | 272 | if (modes & (ADVERTISED_10000baseT_Full | |
273 | ADVERTISED_10000baseKX4_Full | | ||
274 | ADVERTISED_10000baseKR_Full)) { | ||
256 | ecmd->speed = SPEED_10000; | 275 | ecmd->speed = SPEED_10000; |
257 | ecmd->duplex = DUPLEX_FULL; | 276 | ecmd->duplex = DUPLEX_FULL; |
258 | } else if (modes & (ADVERTISED_1000baseT_Full | | 277 | } else if (modes & (ADVERTISED_1000baseT_Full | |
259 | ADVERTISED_1000baseT_Half)) { | 278 | ADVERTISED_1000baseT_Half | |
279 | ADVERTISED_1000baseKX_Full)) { | ||
260 | ecmd->speed = SPEED_1000; | 280 | ecmd->speed = SPEED_1000; |
261 | ecmd->duplex = !!(modes & ADVERTISED_1000baseT_Full); | 281 | ecmd->duplex = !(modes & ADVERTISED_1000baseT_Half); |
262 | } else if (modes & (ADVERTISED_100baseT_Full | | 282 | } else if (modes & (ADVERTISED_100baseT_Full | |
263 | ADVERTISED_100baseT_Half)) { | 283 | ADVERTISED_100baseT_Half)) { |
264 | ecmd->speed = SPEED_100; | 284 | ecmd->speed = SPEED_100; |