diff options
| author | Andrew Lunn <andrew@lunn.ch> | 2018-11-10 17:43:33 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-11-11 13:10:01 -0500 |
| commit | 3c1bcc8614db10803f1f57ef0295363917448cb2 (patch) | |
| tree | 431ae141dae05b86ff2e3f39406436c1d9721a63 /drivers/net/ethernet/amd | |
| parent | 899a3cbbf77a2a3d6d53d67ff6f10ad59eb03605 (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.c | 41 |
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 | ||
| 858 | static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata) | 858 | static 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 | ||
| 892 | static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) | 899 | static 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; |
