mdio: Expose 10GBASE-T MDI-X status via ethtool
authorBen Hutchings <bhutchings@solarflare.com>
Wed, 10 Jun 2009 05:28:04 +0000 (05:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Jun 2009 09:47:10 +0000 (02:47 -0700)
This is available in a standard MDIO register in 10GBASE-T PHYs.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mdio.c
include/linux/mdio.h

index 66483035f68323a24b6df61247ea8538d8ac22a1..dc45e9856c35bcd810ad9ab4363d2174a3e2e3ee 100644 (file)
@@ -296,6 +296,23 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
                ecmd->duplex = (reg & MDIO_CTRL1_FULLDPLX ||
                                ecmd->speed == SPEED_10000);
        }
+
+       /* 10GBASE-T MDI/MDI-X */
+       if (ecmd->port == PORT_TP && ecmd->speed == SPEED_10000) {
+               switch (mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_PMAPMD,
+                                       MDIO_PMA_10GBT_SWAPPOL)) {
+               case MDIO_PMA_10GBT_SWAPPOL_ABNX | MDIO_PMA_10GBT_SWAPPOL_CDNX:
+                       ecmd->eth_tp_mdix = ETH_TP_MDI;
+                       break;
+               case 0:
+                       ecmd->eth_tp_mdix = ETH_TP_MDI_X;
+                       break;
+               default:
+                       /* It's complicated... */
+                       ecmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
+                       break;
+               }
+       }
 }
 EXPORT_SYMBOL(mdio45_ethtool_gset_npage);
 
index 56851646529ad6bebd55d85aa98845c763efcb72..cfdf1df2875e4e12eff9a21dd24e29f0e873b64c 100644 (file)
@@ -45,6 +45,7 @@
 #define MDIO_PHYXS_LNSTAT      24      /* PHY XGXS lane state */
 
 /* Media-dependent registers. */
+#define MDIO_PMA_10GBT_SWAPPOL 130     /* 10GBASE-T pair swap & polarity */
 #define MDIO_PMA_10GBT_TXPWR   131     /* 10GBASE-T TX power control */
 #define MDIO_PMA_10GBT_SNR     133     /* 10GBASE-T SNR margin, lane A.
                                         * Lanes B-D are numbered 134-136. */
 #define MDIO_PHYXS_LNSTAT_SYNC3                0x0008
 #define MDIO_PHYXS_LNSTAT_ALIGN                0x1000
 
+/* PMA 10GBASE-T pair swap & polarity */
+#define MDIO_PMA_10GBT_SWAPPOL_ABNX    0x0001  /* Pair A/B uncrossed */
+#define MDIO_PMA_10GBT_SWAPPOL_CDNX    0x0002  /* Pair C/D uncrossed */
+#define MDIO_PMA_10GBT_SWAPPOL_AREV    0x0100  /* Pair A polarity reversed */
+#define MDIO_PMA_10GBT_SWAPPOL_BREV    0x0200  /* Pair B polarity reversed */
+#define MDIO_PMA_10GBT_SWAPPOL_CREV    0x0400  /* Pair C polarity reversed */
+#define MDIO_PMA_10GBT_SWAPPOL_DREV    0x0800  /* Pair D polarity reversed */
+
 /* PMA 10GBASE-T TX power register. */
 #define MDIO_PMA_10GBT_TXPWR_SHORT     0x0001  /* Short-reach mode */