aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/amd
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2018-11-10 17:43:33 -0500
committerDavid S. Miller <davem@davemloft.net>2018-11-11 13:10:01 -0500
commit3c1bcc8614db10803f1f57ef0295363917448cb2 (patch)
tree431ae141dae05b86ff2e3f39406436c1d9721a63 /drivers/net/ethernet/amd
parent899a3cbbf77a2a3d6d53d67ff6f10ad59eb03605 (diff)
net: ethernet: Convert phydev advertize and supported from u32 to link mode
There are a few MAC/PHYs combinations which now support > 1Gbps. These may need to make use of link modes with bits > 31. Thus their supported PHY features or advertised features cannot be implemented using the current bitmap in a u32. Convert to using a linkmode bitmap, which can support all the currently devices link modes, and is future proof as more modes are added. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/amd')
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
index 151bdb629e8a..128cd648ba99 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
@@ -857,6 +857,7 @@ static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
857 857
858static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata) 858static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
859{ 859{
860 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
860 struct xgbe_phy_data *phy_data = pdata->phy_data; 861 struct xgbe_phy_data *phy_data = pdata->phy_data;
861 unsigned int phy_id = phy_data->phydev->phy_id; 862 unsigned int phy_id = phy_data->phydev->phy_id;
862 863
@@ -878,9 +879,15 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
878 phy_write(phy_data->phydev, 0x04, 0x0d01); 879 phy_write(phy_data->phydev, 0x04, 0x0d01);
879 phy_write(phy_data->phydev, 0x00, 0x9140); 880 phy_write(phy_data->phydev, 0x00, 0x9140);
880 881
881 phy_data->phydev->supported = PHY_10BT_FEATURES | 882 linkmode_set_bit_array(phy_10_100_features_array,
882 PHY_100BT_FEATURES | 883 ARRAY_SIZE(phy_10_100_features_array),
883 PHY_1000BT_FEATURES; 884 supported);
885 linkmode_set_bit_array(phy_gbit_features_array,
886 ARRAY_SIZE(phy_gbit_features_array),
887 supported);
888
889 linkmode_copy(phy_data->phydev->supported, supported);
890
884 phy_support_asym_pause(phy_data->phydev); 891 phy_support_asym_pause(phy_data->phydev);
885 892
886 netif_dbg(pdata, drv, pdata->netdev, 893 netif_dbg(pdata, drv, pdata->netdev,
@@ -891,6 +898,7 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
891 898
892static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) 899static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
893{ 900{
901 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
894 struct xgbe_phy_data *phy_data = pdata->phy_data; 902 struct xgbe_phy_data *phy_data = pdata->phy_data;
895 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom; 903 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
896 unsigned int phy_id = phy_data->phydev->phy_id; 904 unsigned int phy_id = phy_data->phydev->phy_id;
@@ -951,9 +959,13 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
951 reg = phy_read(phy_data->phydev, 0x00); 959 reg = phy_read(phy_data->phydev, 0x00);
952 phy_write(phy_data->phydev, 0x00, reg & ~0x00800); 960 phy_write(phy_data->phydev, 0x00, reg & ~0x00800);
953 961
954 phy_data->phydev->supported = (PHY_10BT_FEATURES | 962 linkmode_set_bit_array(phy_10_100_features_array,
955 PHY_100BT_FEATURES | 963 ARRAY_SIZE(phy_10_100_features_array),
956 PHY_1000BT_FEATURES); 964 supported);
965 linkmode_set_bit_array(phy_gbit_features_array,
966 ARRAY_SIZE(phy_gbit_features_array),
967 supported);
968 linkmode_copy(phy_data->phydev->supported, supported);
957 phy_support_asym_pause(phy_data->phydev); 969 phy_support_asym_pause(phy_data->phydev);
958 970
959 netif_dbg(pdata, drv, pdata->netdev, 971 netif_dbg(pdata, drv, pdata->netdev,
@@ -976,7 +988,6 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
976 struct ethtool_link_ksettings *lks = &pdata->phy.lks; 988 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
977 struct xgbe_phy_data *phy_data = pdata->phy_data; 989 struct xgbe_phy_data *phy_data = pdata->phy_data;
978 struct phy_device *phydev; 990 struct phy_device *phydev;
979 u32 advertising;
980 int ret; 991 int ret;
981 992
982 /* If we already have a PHY, just return */ 993 /* If we already have a PHY, just return */
@@ -1036,9 +1047,8 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
1036 1047
1037 xgbe_phy_external_phy_quirks(pdata); 1048 xgbe_phy_external_phy_quirks(pdata);
1038 1049
1039 ethtool_convert_link_mode_to_legacy_u32(&advertising, 1050 linkmode_and(phydev->advertising, phydev->advertising,
1040 lks->link_modes.advertising); 1051 lks->link_modes.advertising);
1041 phydev->advertising &= advertising;
1042 1052
1043 phy_start_aneg(phy_data->phydev); 1053 phy_start_aneg(phy_data->phydev);
1044 1054
@@ -1497,7 +1507,7 @@ static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata)
1497 if (!phy_data->phydev) 1507 if (!phy_data->phydev)
1498 return; 1508 return;
1499 1509
1500 lcl_adv = ethtool_adv_to_lcl_adv_t(phy_data->phydev->advertising); 1510 lcl_adv = linkmode_adv_to_lcl_adv_t(phy_data->phydev->advertising);
1501 1511
1502 if (phy_data->phydev->pause) { 1512 if (phy_data->phydev->pause) {
1503 XGBE_SET_LP_ADV(lks, Pause); 1513 XGBE_SET_LP_ADV(lks, Pause);
@@ -1815,7 +1825,6 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1815{ 1825{
1816 struct ethtool_link_ksettings *lks = &pdata->phy.lks; 1826 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1817 struct xgbe_phy_data *phy_data = pdata->phy_data; 1827 struct xgbe_phy_data *phy_data = pdata->phy_data;
1818 u32 advertising;
1819 int ret; 1828 int ret;
1820 1829
1821 ret = xgbe_phy_find_phy_device(pdata); 1830 ret = xgbe_phy_find_phy_device(pdata);
@@ -1825,12 +1834,10 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1825 if (!phy_data->phydev) 1834 if (!phy_data->phydev)
1826 return 0; 1835 return 0;
1827 1836
1828 ethtool_convert_link_mode_to_legacy_u32(&advertising,
1829 lks->link_modes.advertising);
1830
1831 phy_data->phydev->autoneg = pdata->phy.autoneg; 1837 phy_data->phydev->autoneg = pdata->phy.autoneg;
1832 phy_data->phydev->advertising = phy_data->phydev->supported & 1838 linkmode_and(phy_data->phydev->advertising,
1833 advertising; 1839 phy_data->phydev->supported,
1840 lks->link_modes.advertising);
1834 1841
1835 if (pdata->phy.autoneg != AUTONEG_ENABLE) { 1842 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1836 phy_data->phydev->speed = pdata->phy.speed; 1843 phy_data->phydev->speed = pdata->phy.speed;