aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mdio.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2009-04-29 04:25:57 -0400
committerDavid S. Miller <davem@davemloft.net>2009-04-29 20:32:40 -0400
commit894b19a6b343ce3589237167a56e6df0fe72ef0d (patch)
tree0713a034ac095488151bcd94f3510c50d660cc11 /drivers/net/mdio.c
parent0c09c1a49cc7b819b33566a49d9901f7cfdd6889 (diff)
ethtool/mdio: Support backplane mode negotiation
Compile-tested only. 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.c30
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;