diff options
Diffstat (limited to 'drivers/net/phy')
-rw-r--r-- | drivers/net/phy/amd-xgbe-phy.c | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/drivers/net/phy/amd-xgbe-phy.c b/drivers/net/phy/amd-xgbe-phy.c index 32efbd48f326..acb444928c76 100644 --- a/drivers/net/phy/amd-xgbe-phy.c +++ b/drivers/net/phy/amd-xgbe-phy.c | |||
@@ -932,8 +932,8 @@ static enum amd_xgbe_phy_an amd_xgbe_an_incompat_link(struct phy_device *phydev) | |||
932 | if (amd_xgbe_phy_in_kr_mode(phydev)) { | 932 | if (amd_xgbe_phy_in_kr_mode(phydev)) { |
933 | priv->kr_state = AMD_XGBE_RX_ERROR; | 933 | priv->kr_state = AMD_XGBE_RX_ERROR; |
934 | 934 | ||
935 | if (!(phydev->supported & SUPPORTED_1000baseKX_Full) && | 935 | if (!(phydev->advertising & SUPPORTED_1000baseKX_Full) && |
936 | !(phydev->supported & SUPPORTED_2500baseX_Full)) | 936 | !(phydev->advertising & SUPPORTED_2500baseX_Full)) |
937 | return AMD_XGBE_AN_NO_LINK; | 937 | return AMD_XGBE_AN_NO_LINK; |
938 | 938 | ||
939 | if (priv->kx_state != AMD_XGBE_RX_BPA) | 939 | if (priv->kx_state != AMD_XGBE_RX_BPA) |
@@ -941,7 +941,7 @@ static enum amd_xgbe_phy_an amd_xgbe_an_incompat_link(struct phy_device *phydev) | |||
941 | } else { | 941 | } else { |
942 | priv->kx_state = AMD_XGBE_RX_ERROR; | 942 | priv->kx_state = AMD_XGBE_RX_ERROR; |
943 | 943 | ||
944 | if (!(phydev->supported & SUPPORTED_10000baseKR_Full)) | 944 | if (!(phydev->advertising & SUPPORTED_10000baseKR_Full)) |
945 | return AMD_XGBE_AN_NO_LINK; | 945 | return AMD_XGBE_AN_NO_LINK; |
946 | 946 | ||
947 | if (priv->kr_state != AMD_XGBE_RX_BPA) | 947 | if (priv->kr_state != AMD_XGBE_RX_BPA) |
@@ -1101,7 +1101,7 @@ static int amd_xgbe_an_init(struct phy_device *phydev) | |||
1101 | if (ret < 0) | 1101 | if (ret < 0) |
1102 | return ret; | 1102 | return ret; |
1103 | 1103 | ||
1104 | if (phydev->supported & SUPPORTED_10000baseR_FEC) | 1104 | if (phydev->advertising & SUPPORTED_10000baseR_FEC) |
1105 | ret |= 0xc000; | 1105 | ret |= 0xc000; |
1106 | else | 1106 | else |
1107 | ret &= ~0xc000; | 1107 | ret &= ~0xc000; |
@@ -1113,13 +1113,13 @@ static int amd_xgbe_an_init(struct phy_device *phydev) | |||
1113 | if (ret < 0) | 1113 | if (ret < 0) |
1114 | return ret; | 1114 | return ret; |
1115 | 1115 | ||
1116 | if (phydev->supported & SUPPORTED_10000baseKR_Full) | 1116 | if (phydev->advertising & SUPPORTED_10000baseKR_Full) |
1117 | ret |= 0x80; | 1117 | ret |= 0x80; |
1118 | else | 1118 | else |
1119 | ret &= ~0x80; | 1119 | ret &= ~0x80; |
1120 | 1120 | ||
1121 | if ((phydev->supported & SUPPORTED_1000baseKX_Full) || | 1121 | if ((phydev->advertising & SUPPORTED_1000baseKX_Full) || |
1122 | (phydev->supported & SUPPORTED_2500baseX_Full)) | 1122 | (phydev->advertising & SUPPORTED_2500baseX_Full)) |
1123 | ret |= 0x20; | 1123 | ret |= 0x20; |
1124 | else | 1124 | else |
1125 | ret &= ~0x20; | 1125 | ret &= ~0x20; |
@@ -1131,12 +1131,12 @@ static int amd_xgbe_an_init(struct phy_device *phydev) | |||
1131 | if (ret < 0) | 1131 | if (ret < 0) |
1132 | return ret; | 1132 | return ret; |
1133 | 1133 | ||
1134 | if (phydev->supported & SUPPORTED_Pause) | 1134 | if (phydev->advertising & SUPPORTED_Pause) |
1135 | ret |= 0x400; | 1135 | ret |= 0x400; |
1136 | else | 1136 | else |
1137 | ret &= ~0x400; | 1137 | ret &= ~0x400; |
1138 | 1138 | ||
1139 | if (phydev->supported & SUPPORTED_Asym_Pause) | 1139 | if (phydev->advertising & SUPPORTED_Asym_Pause) |
1140 | ret |= 0x800; | 1140 | ret |= 0x800; |
1141 | else | 1141 | else |
1142 | ret &= ~0x800; | 1142 | ret &= ~0x800; |
@@ -1212,38 +1212,14 @@ static int amd_xgbe_phy_config_init(struct phy_device *phydev) | |||
1212 | priv->an_irq_allocated = 1; | 1212 | priv->an_irq_allocated = 1; |
1213 | } | 1213 | } |
1214 | 1214 | ||
1215 | ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FEC_ABILITY); | ||
1216 | if (ret < 0) | ||
1217 | return ret; | ||
1218 | priv->fec_ability = ret & XGBE_PHY_FEC_MASK; | ||
1219 | |||
1220 | /* Initialize supported features */ | ||
1221 | phydev->supported = SUPPORTED_Autoneg; | ||
1222 | phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; | ||
1223 | phydev->supported |= SUPPORTED_Backplane; | ||
1224 | phydev->supported |= SUPPORTED_10000baseKR_Full; | ||
1225 | switch (priv->speed_set) { | ||
1226 | case AMD_XGBE_PHY_SPEEDSET_1000_10000: | ||
1227 | phydev->supported |= SUPPORTED_1000baseKX_Full; | ||
1228 | break; | ||
1229 | case AMD_XGBE_PHY_SPEEDSET_2500_10000: | ||
1230 | phydev->supported |= SUPPORTED_2500baseX_Full; | ||
1231 | break; | ||
1232 | } | ||
1233 | |||
1234 | if (priv->fec_ability & XGBE_PHY_FEC_ENABLE) | ||
1235 | phydev->supported |= SUPPORTED_10000baseR_FEC; | ||
1236 | |||
1237 | phydev->advertising = phydev->supported; | ||
1238 | |||
1239 | /* Set initial mode - call the mode setting routines | 1215 | /* Set initial mode - call the mode setting routines |
1240 | * directly to insure we are properly configured | 1216 | * directly to insure we are properly configured |
1241 | */ | 1217 | */ |
1242 | if (phydev->supported & SUPPORTED_10000baseKR_Full) | 1218 | if (phydev->advertising & SUPPORTED_10000baseKR_Full) |
1243 | ret = amd_xgbe_phy_xgmii_mode(phydev); | 1219 | ret = amd_xgbe_phy_xgmii_mode(phydev); |
1244 | else if (phydev->supported & SUPPORTED_1000baseKX_Full) | 1220 | else if (phydev->advertising & SUPPORTED_1000baseKX_Full) |
1245 | ret = amd_xgbe_phy_gmii_mode(phydev); | 1221 | ret = amd_xgbe_phy_gmii_mode(phydev); |
1246 | else if (phydev->supported & SUPPORTED_2500baseX_Full) | 1222 | else if (phydev->advertising & SUPPORTED_2500baseX_Full) |
1247 | ret = amd_xgbe_phy_gmii_2500_mode(phydev); | 1223 | ret = amd_xgbe_phy_gmii_2500_mode(phydev); |
1248 | else | 1224 | else |
1249 | ret = -EINVAL; | 1225 | ret = -EINVAL; |
@@ -1315,10 +1291,10 @@ static int __amd_xgbe_phy_config_aneg(struct phy_device *phydev) | |||
1315 | disable_irq(priv->an_irq); | 1291 | disable_irq(priv->an_irq); |
1316 | 1292 | ||
1317 | /* Start auto-negotiation in a supported mode */ | 1293 | /* Start auto-negotiation in a supported mode */ |
1318 | if (phydev->supported & SUPPORTED_10000baseKR_Full) | 1294 | if (phydev->advertising & SUPPORTED_10000baseKR_Full) |
1319 | ret = amd_xgbe_phy_set_mode(phydev, AMD_XGBE_MODE_KR); | 1295 | ret = amd_xgbe_phy_set_mode(phydev, AMD_XGBE_MODE_KR); |
1320 | else if ((phydev->supported & SUPPORTED_1000baseKX_Full) || | 1296 | else if ((phydev->advertising & SUPPORTED_1000baseKX_Full) || |
1321 | (phydev->supported & SUPPORTED_2500baseX_Full)) | 1297 | (phydev->advertising & SUPPORTED_2500baseX_Full)) |
1322 | ret = amd_xgbe_phy_set_mode(phydev, AMD_XGBE_MODE_KX); | 1298 | ret = amd_xgbe_phy_set_mode(phydev, AMD_XGBE_MODE_KX); |
1323 | else | 1299 | else |
1324 | ret = -EINVAL; | 1300 | ret = -EINVAL; |
@@ -1746,6 +1722,29 @@ static int amd_xgbe_phy_probe(struct phy_device *phydev) | |||
1746 | sizeof(priv->serdes_dfe_tap_ena)); | 1722 | sizeof(priv->serdes_dfe_tap_ena)); |
1747 | } | 1723 | } |
1748 | 1724 | ||
1725 | /* Initialize supported features */ | ||
1726 | phydev->supported = SUPPORTED_Autoneg; | ||
1727 | phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; | ||
1728 | phydev->supported |= SUPPORTED_Backplane; | ||
1729 | phydev->supported |= SUPPORTED_10000baseKR_Full; | ||
1730 | switch (priv->speed_set) { | ||
1731 | case AMD_XGBE_PHY_SPEEDSET_1000_10000: | ||
1732 | phydev->supported |= SUPPORTED_1000baseKX_Full; | ||
1733 | break; | ||
1734 | case AMD_XGBE_PHY_SPEEDSET_2500_10000: | ||
1735 | phydev->supported |= SUPPORTED_2500baseX_Full; | ||
1736 | break; | ||
1737 | } | ||
1738 | |||
1739 | ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FEC_ABILITY); | ||
1740 | if (ret < 0) | ||
1741 | return ret; | ||
1742 | priv->fec_ability = ret & XGBE_PHY_FEC_MASK; | ||
1743 | if (priv->fec_ability & XGBE_PHY_FEC_ENABLE) | ||
1744 | phydev->supported |= SUPPORTED_10000baseR_FEC; | ||
1745 | |||
1746 | phydev->advertising = phydev->supported; | ||
1747 | |||
1749 | phydev->priv = priv; | 1748 | phydev->priv = priv; |
1750 | 1749 | ||
1751 | if (!priv->adev || acpi_disabled) | 1750 | if (!priv->adev || acpi_disabled) |