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 | |
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>
39 files changed, 536 insertions, 330 deletions
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index a5de9bffe5be..74547f43b938 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c | |||
@@ -658,7 +658,8 @@ static void mt7530_adjust_link(struct dsa_switch *ds, int port, | |||
658 | if (phydev->asym_pause) | 658 | if (phydev->asym_pause) |
659 | rmt_adv |= LPA_PAUSE_ASYM; | 659 | rmt_adv |= LPA_PAUSE_ASYM; |
660 | 660 | ||
661 | lcl_adv = ethtool_adv_to_lcl_adv_t(phydev->advertising); | 661 | lcl_adv = linkmode_adv_to_lcl_adv_t( |
662 | phydev->advertising); | ||
662 | flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); | 663 | flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); |
663 | 664 | ||
664 | if (flowctrl & FLOW_CTRL_TX) | 665 | if (flowctrl & FLOW_CTRL_TX) |
diff --git a/drivers/net/ethernet/aeroflex/greth.c b/drivers/net/ethernet/aeroflex/greth.c index 7c9348a26cbb..91fc64c1145e 100644 --- a/drivers/net/ethernet/aeroflex/greth.c +++ b/drivers/net/ethernet/aeroflex/greth.c | |||
@@ -1283,7 +1283,7 @@ static int greth_mdio_probe(struct net_device *dev) | |||
1283 | else | 1283 | else |
1284 | phy_set_max_speed(phy, SPEED_100); | 1284 | phy_set_max_speed(phy, SPEED_100); |
1285 | 1285 | ||
1286 | phy->advertising = phy->supported; | 1286 | linkmode_copy(phy->advertising, phy->supported); |
1287 | 1287 | ||
1288 | greth->link = 0; | 1288 | greth->link = 0; |
1289 | greth->speed = 0; | 1289 | greth->speed = 0; |
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; |
diff --git a/drivers/net/ethernet/apm/xgene-v2/mdio.c b/drivers/net/ethernet/apm/xgene-v2/mdio.c index f5fe3bb2e59d..53529cd85162 100644 --- a/drivers/net/ethernet/apm/xgene-v2/mdio.c +++ b/drivers/net/ethernet/apm/xgene-v2/mdio.c | |||
@@ -109,6 +109,7 @@ void xge_mdio_remove(struct net_device *ndev) | |||
109 | 109 | ||
110 | int xge_mdio_config(struct net_device *ndev) | 110 | int xge_mdio_config(struct net_device *ndev) |
111 | { | 111 | { |
112 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
112 | struct xge_pdata *pdata = netdev_priv(ndev); | 113 | struct xge_pdata *pdata = netdev_priv(ndev); |
113 | struct device *dev = &pdata->pdev->dev; | 114 | struct device *dev = &pdata->pdev->dev; |
114 | struct mii_bus *mdio_bus; | 115 | struct mii_bus *mdio_bus; |
@@ -148,16 +149,17 @@ int xge_mdio_config(struct net_device *ndev) | |||
148 | goto err; | 149 | goto err; |
149 | } | 150 | } |
150 | 151 | ||
151 | phydev->supported &= ~(SUPPORTED_10baseT_Half | | 152 | linkmode_set_bit_array(phy_10_100_features_array, |
152 | SUPPORTED_10baseT_Full | | 153 | ARRAY_SIZE(phy_10_100_features_array), |
153 | SUPPORTED_100baseT_Half | | 154 | mask); |
154 | SUPPORTED_100baseT_Full | | 155 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, mask); |
155 | SUPPORTED_1000baseT_Half | | 156 | linkmode_set_bit(ETHTOOL_LINK_MODE_AUI_BIT, mask); |
156 | SUPPORTED_AUI | | 157 | linkmode_set_bit(ETHTOOL_LINK_MODE_MII_BIT, mask); |
157 | SUPPORTED_MII | | 158 | linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, mask); |
158 | SUPPORTED_FIBRE | | 159 | linkmode_set_bit(ETHTOOL_LINK_MODE_BNC_BIT, mask); |
159 | SUPPORTED_BNC); | 160 | |
160 | phydev->advertising = phydev->supported; | 161 | linkmode_andnot(phydev->supported, phydev->supported, mask); |
162 | linkmode_copy(phydev->advertising, phydev->supported); | ||
161 | pdata->phy_speed = SPEED_UNKNOWN; | 163 | pdata->phy_speed = SPEED_UNKNOWN; |
162 | 164 | ||
163 | return 0; | 165 | return 0; |
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c index bd277b0dc615..4406325fdd9f 100644 --- a/drivers/net/ethernet/arc/emac_main.c +++ b/drivers/net/ethernet/arc/emac_main.c | |||
@@ -432,7 +432,8 @@ static int arc_emac_open(struct net_device *ndev) | |||
432 | phy_dev->autoneg = AUTONEG_ENABLE; | 432 | phy_dev->autoneg = AUTONEG_ENABLE; |
433 | phy_dev->speed = 0; | 433 | phy_dev->speed = 0; |
434 | phy_dev->duplex = 0; | 434 | phy_dev->duplex = 0; |
435 | phy_dev->advertising &= phy_dev->supported; | 435 | linkmode_and(phy_dev->advertising, phy_dev->advertising, |
436 | phy_dev->supported); | ||
436 | 437 | ||
437 | priv->last_rx_bd = 0; | 438 | priv->last_rx_bd = 0; |
438 | 439 | ||
diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c index e445ab724827..f44808959ff3 100644 --- a/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c | |||
@@ -2248,6 +2248,7 @@ static void b44_adjust_link(struct net_device *dev) | |||
2248 | 2248 | ||
2249 | static int b44_register_phy_one(struct b44 *bp) | 2249 | static int b44_register_phy_one(struct b44 *bp) |
2250 | { | 2250 | { |
2251 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
2251 | struct mii_bus *mii_bus; | 2252 | struct mii_bus *mii_bus; |
2252 | struct ssb_device *sdev = bp->sdev; | 2253 | struct ssb_device *sdev = bp->sdev; |
2253 | struct phy_device *phydev; | 2254 | struct phy_device *phydev; |
@@ -2303,11 +2304,12 @@ static int b44_register_phy_one(struct b44 *bp) | |||
2303 | } | 2304 | } |
2304 | 2305 | ||
2305 | /* mask with MAC supported features */ | 2306 | /* mask with MAC supported features */ |
2306 | phydev->supported &= (SUPPORTED_100baseT_Half | | 2307 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask); |
2307 | SUPPORTED_100baseT_Full | | 2308 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask); |
2308 | SUPPORTED_Autoneg | | 2309 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, mask); |
2309 | SUPPORTED_MII); | 2310 | linkmode_set_bit(ETHTOOL_LINK_MODE_MII_BIT, mask); |
2310 | phydev->advertising = phydev->supported; | 2311 | linkmode_and(phydev->supported, phydev->supported, mask); |
2312 | linkmode_copy(phydev->advertising, phydev->supported); | ||
2311 | 2313 | ||
2312 | bp->old_link = 0; | 2314 | bp->old_link = 0; |
2313 | bp->phy_addr = phydev->mdio.addr; | 2315 | bp->phy_addr = phydev->mdio.addr; |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c index a6cbaca37e94..aceb9b7b55bd 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c | |||
@@ -226,7 +226,8 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) | |||
226 | * capabilities, use that knowledge to also configure the | 226 | * capabilities, use that knowledge to also configure the |
227 | * Reverse MII interface correctly. | 227 | * Reverse MII interface correctly. |
228 | */ | 228 | */ |
229 | if (dev->phydev->supported & PHY_1000BT_FEATURES) | 229 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, |
230 | dev->phydev->supported)) | ||
230 | port_ctrl = PORT_MODE_EXT_RVMII_50; | 231 | port_ctrl = PORT_MODE_EXT_RVMII_50; |
231 | else | 232 | else |
232 | port_ctrl = PORT_MODE_EXT_RVMII_25; | 233 | port_ctrl = PORT_MODE_EXT_RVMII_25; |
@@ -317,7 +318,7 @@ int bcmgenet_mii_probe(struct net_device *dev) | |||
317 | return ret; | 318 | return ret; |
318 | } | 319 | } |
319 | 320 | ||
320 | phydev->advertising = phydev->supported; | 321 | linkmode_copy(phydev->advertising, phydev->supported); |
321 | 322 | ||
322 | /* The internal PHY has its link interrupts routed to the | 323 | /* The internal PHY has its link interrupts routed to the |
323 | * Ethernet MAC ISRs. On GENETv5 there is a hardware issue | 324 | * Ethernet MAC ISRs. On GENETv5 there is a hardware issue |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index ce44d208e137..79b881d9cdb0 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -2157,7 +2157,8 @@ static void tg3_phy_start(struct tg3 *tp) | |||
2157 | phydev->speed = tp->link_config.speed; | 2157 | phydev->speed = tp->link_config.speed; |
2158 | phydev->duplex = tp->link_config.duplex; | 2158 | phydev->duplex = tp->link_config.duplex; |
2159 | phydev->autoneg = tp->link_config.autoneg; | 2159 | phydev->autoneg = tp->link_config.autoneg; |
2160 | phydev->advertising = tp->link_config.advertising; | 2160 | ethtool_convert_legacy_u32_to_link_mode( |
2161 | phydev->advertising, tp->link_config.advertising); | ||
2161 | } | 2162 | } |
2162 | 2163 | ||
2163 | phy_start(phydev); | 2164 | phy_start(phydev); |
@@ -4057,8 +4058,9 @@ static int tg3_power_down_prepare(struct tg3 *tp) | |||
4057 | do_low_power = false; | 4058 | do_low_power = false; |
4058 | if ((tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) && | 4059 | if ((tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) && |
4059 | !(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) { | 4060 | !(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) { |
4061 | __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising) = { 0, }; | ||
4060 | struct phy_device *phydev; | 4062 | struct phy_device *phydev; |
4061 | u32 phyid, advertising; | 4063 | u32 phyid; |
4062 | 4064 | ||
4063 | phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); | 4065 | phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); |
4064 | 4066 | ||
@@ -4067,25 +4069,33 @@ static int tg3_power_down_prepare(struct tg3 *tp) | |||
4067 | tp->link_config.speed = phydev->speed; | 4069 | tp->link_config.speed = phydev->speed; |
4068 | tp->link_config.duplex = phydev->duplex; | 4070 | tp->link_config.duplex = phydev->duplex; |
4069 | tp->link_config.autoneg = phydev->autoneg; | 4071 | tp->link_config.autoneg = phydev->autoneg; |
4070 | tp->link_config.advertising = phydev->advertising; | 4072 | ethtool_convert_link_mode_to_legacy_u32( |
4071 | 4073 | &tp->link_config.advertising, | |
4072 | advertising = ADVERTISED_TP | | 4074 | phydev->advertising); |
4073 | ADVERTISED_Pause | | 4075 | |
4074 | ADVERTISED_Autoneg | | 4076 | linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, advertising); |
4075 | ADVERTISED_10baseT_Half; | 4077 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
4078 | advertising); | ||
4079 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, | ||
4080 | advertising); | ||
4081 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, | ||
4082 | advertising); | ||
4076 | 4083 | ||
4077 | if (tg3_flag(tp, ENABLE_ASF) || device_should_wake) { | 4084 | if (tg3_flag(tp, ENABLE_ASF) || device_should_wake) { |
4078 | if (tg3_flag(tp, WOL_SPEED_100MB)) | 4085 | if (tg3_flag(tp, WOL_SPEED_100MB)) { |
4079 | advertising |= | 4086 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, |
4080 | ADVERTISED_100baseT_Half | | 4087 | advertising); |
4081 | ADVERTISED_100baseT_Full | | 4088 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, |
4082 | ADVERTISED_10baseT_Full; | 4089 | advertising); |
4083 | else | 4090 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, |
4084 | advertising |= ADVERTISED_10baseT_Full; | 4091 | advertising); |
4092 | } else { | ||
4093 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, | ||
4094 | advertising); | ||
4095 | } | ||
4085 | } | 4096 | } |
4086 | 4097 | ||
4087 | phydev->advertising = advertising; | 4098 | linkmode_copy(phydev->advertising, advertising); |
4088 | |||
4089 | phy_start_aneg(phydev); | 4099 | phy_start_aneg(phydev); |
4090 | 4100 | ||
4091 | phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask; | 4101 | phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask; |
diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c index 4b3aecf98f2a..5359c1021f42 100644 --- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | |||
@@ -1080,8 +1080,11 @@ static int octeon_mgmt_open(struct net_device *netdev) | |||
1080 | /* Set the mode of the interface, RGMII/MII. */ | 1080 | /* Set the mode of the interface, RGMII/MII. */ |
1081 | if (OCTEON_IS_MODEL(OCTEON_CN6XXX) && netdev->phydev) { | 1081 | if (OCTEON_IS_MODEL(OCTEON_CN6XXX) && netdev->phydev) { |
1082 | union cvmx_agl_prtx_ctl agl_prtx_ctl; | 1082 | union cvmx_agl_prtx_ctl agl_prtx_ctl; |
1083 | int rgmii_mode = (netdev->phydev->supported & | 1083 | int rgmii_mode = |
1084 | (SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full)) != 0; | 1084 | (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1085 | netdev->phydev->supported) | | ||
1086 | linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
1087 | netdev->phydev->supported)) != 0; | ||
1085 | 1088 | ||
1086 | agl_prtx_ctl.u64 = cvmx_read_csr(p->agl_prt_ctl); | 1089 | agl_prtx_ctl.u64 = cvmx_read_csr(p->agl_prt_ctl); |
1087 | agl_prtx_ctl.s.mode = rgmii_mode ? 0 : 1; | 1090 | agl_prtx_ctl.s.mode = rgmii_mode ? 0 : 1; |
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index 6e0f47f2c8a3..9510c9d78858 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | |||
@@ -2475,6 +2475,7 @@ static void dpaa_adjust_link(struct net_device *net_dev) | |||
2475 | 2475 | ||
2476 | static int dpaa_phy_init(struct net_device *net_dev) | 2476 | static int dpaa_phy_init(struct net_device *net_dev) |
2477 | { | 2477 | { |
2478 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
2478 | struct mac_device *mac_dev; | 2479 | struct mac_device *mac_dev; |
2479 | struct phy_device *phy_dev; | 2480 | struct phy_device *phy_dev; |
2480 | struct dpaa_priv *priv; | 2481 | struct dpaa_priv *priv; |
@@ -2491,7 +2492,9 @@ static int dpaa_phy_init(struct net_device *net_dev) | |||
2491 | } | 2492 | } |
2492 | 2493 | ||
2493 | /* Remove any features not supported by the controller */ | 2494 | /* Remove any features not supported by the controller */ |
2494 | phy_dev->supported &= mac_dev->if_support; | 2495 | ethtool_convert_legacy_u32_to_link_mode(mask, mac_dev->if_support); |
2496 | linkmode_and(phy_dev->supported, phy_dev->supported, mask); | ||
2497 | |||
2495 | phy_support_asym_pause(phy_dev); | 2498 | phy_support_asym_pause(phy_dev); |
2496 | 2499 | ||
2497 | mac_dev->phy_dev = phy_dev; | 2500 | mac_dev->phy_dev = phy_dev; |
diff --git a/drivers/net/ethernet/freescale/fman/mac.c b/drivers/net/ethernet/freescale/fman/mac.c index d79e4e009d63..71f4205f14e7 100644 --- a/drivers/net/ethernet/freescale/fman/mac.c +++ b/drivers/net/ethernet/freescale/fman/mac.c | |||
@@ -393,7 +393,7 @@ void fman_get_pause_cfg(struct mac_device *mac_dev, bool *rx_pause, | |||
393 | */ | 393 | */ |
394 | 394 | ||
395 | /* get local capabilities */ | 395 | /* get local capabilities */ |
396 | lcl_adv = ethtool_adv_to_lcl_adv_t(phy_dev->advertising); | 396 | lcl_adv = linkmode_adv_to_lcl_adv_t(phy_dev->advertising); |
397 | 397 | ||
398 | /* get link partner capabilities */ | 398 | /* get link partner capabilities */ |
399 | rmt_adv = 0; | 399 | rmt_adv = 0; |
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 3c8da1a18ba0..0e102c764b13 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
@@ -1784,14 +1784,20 @@ static phy_interface_t gfar_get_interface(struct net_device *dev) | |||
1784 | */ | 1784 | */ |
1785 | static int init_phy(struct net_device *dev) | 1785 | static int init_phy(struct net_device *dev) |
1786 | { | 1786 | { |
1787 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
1787 | struct gfar_private *priv = netdev_priv(dev); | 1788 | struct gfar_private *priv = netdev_priv(dev); |
1788 | uint gigabit_support = | ||
1789 | priv->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT ? | ||
1790 | GFAR_SUPPORTED_GBIT : 0; | ||
1791 | phy_interface_t interface; | 1789 | phy_interface_t interface; |
1792 | struct phy_device *phydev; | 1790 | struct phy_device *phydev; |
1793 | struct ethtool_eee edata; | 1791 | struct ethtool_eee edata; |
1794 | 1792 | ||
1793 | linkmode_set_bit_array(phy_10_100_features_array, | ||
1794 | ARRAY_SIZE(phy_10_100_features_array), | ||
1795 | mask); | ||
1796 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, mask); | ||
1797 | linkmode_set_bit(ETHTOOL_LINK_MODE_MII_BIT, mask); | ||
1798 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT) | ||
1799 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, mask); | ||
1800 | |||
1795 | priv->oldlink = 0; | 1801 | priv->oldlink = 0; |
1796 | priv->oldspeed = 0; | 1802 | priv->oldspeed = 0; |
1797 | priv->oldduplex = -1; | 1803 | priv->oldduplex = -1; |
@@ -1809,8 +1815,8 @@ static int init_phy(struct net_device *dev) | |||
1809 | gfar_configure_serdes(dev); | 1815 | gfar_configure_serdes(dev); |
1810 | 1816 | ||
1811 | /* Remove any features not supported by the controller */ | 1817 | /* Remove any features not supported by the controller */ |
1812 | phydev->supported &= (GFAR_SUPPORTED | gigabit_support); | 1818 | linkmode_and(phydev->supported, phydev->supported, mask); |
1813 | phydev->advertising = phydev->supported; | 1819 | linkmode_copy(phydev->advertising, phydev->supported); |
1814 | 1820 | ||
1815 | /* Add support for flow control */ | 1821 | /* Add support for flow control */ |
1816 | phy_support_asym_pause(phydev); | 1822 | phy_support_asym_pause(phydev); |
@@ -3656,7 +3662,7 @@ static u32 gfar_get_flowctrl_cfg(struct gfar_private *priv) | |||
3656 | if (phydev->asym_pause) | 3662 | if (phydev->asym_pause) |
3657 | rmt_adv |= LPA_PAUSE_ASYM; | 3663 | rmt_adv |= LPA_PAUSE_ASYM; |
3658 | 3664 | ||
3659 | lcl_adv = ethtool_adv_to_lcl_adv_t(phydev->advertising); | 3665 | lcl_adv = linkmode_adv_to_lcl_adv_t(phydev->advertising); |
3660 | flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); | 3666 | flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); |
3661 | if (flowctrl & FLOW_CTRL_TX) | 3667 | if (flowctrl & FLOW_CTRL_TX) |
3662 | val |= MACCFG1_TX_FLOW; | 3668 | val |= MACCFG1_TX_FLOW; |
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c index 32e02700feaa..2e978cb8b28c 100644 --- a/drivers/net/ethernet/freescale/ucc_geth.c +++ b/drivers/net/ethernet/freescale/ucc_geth.c | |||
@@ -1742,12 +1742,7 @@ static int init_phy(struct net_device *dev) | |||
1742 | if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII) | 1742 | if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII) |
1743 | uec_configure_serdes(dev); | 1743 | uec_configure_serdes(dev); |
1744 | 1744 | ||
1745 | phy_set_max_speed(phydev, SPEED_100); | 1745 | phy_set_max_speed(phydev, priv->max_speed); |
1746 | |||
1747 | if (priv->max_speed == SPEED_1000) | ||
1748 | phydev->supported |= ADVERTISED_1000baseT_Full; | ||
1749 | |||
1750 | phydev->advertising = phydev->supported; | ||
1751 | 1746 | ||
1752 | priv->phydev = phydev; | 1747 | priv->phydev = phydev; |
1753 | 1748 | ||
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c index 28e907831b0e..c62378c07e70 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c | |||
@@ -1163,6 +1163,7 @@ static void hns_nic_adjust_link(struct net_device *ndev) | |||
1163 | */ | 1163 | */ |
1164 | int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h) | 1164 | int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h) |
1165 | { | 1165 | { |
1166 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; | ||
1166 | struct phy_device *phy_dev = h->phy_dev; | 1167 | struct phy_device *phy_dev = h->phy_dev; |
1167 | int ret; | 1168 | int ret; |
1168 | 1169 | ||
@@ -1180,8 +1181,9 @@ int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h) | |||
1180 | if (unlikely(ret)) | 1181 | if (unlikely(ret)) |
1181 | return -ENODEV; | 1182 | return -ENODEV; |
1182 | 1183 | ||
1183 | phy_dev->supported &= h->if_support; | 1184 | ethtool_convert_legacy_u32_to_link_mode(supported, h->if_support); |
1184 | phy_dev->advertising = phy_dev->supported; | 1185 | linkmode_and(phy_dev->supported, phy_dev->supported, supported); |
1186 | linkmode_copy(phy_dev->advertising, phy_dev->supported); | ||
1185 | 1187 | ||
1186 | if (h->phy_if == PHY_INTERFACE_MODE_XGMII) | 1188 | if (h->phy_if == PHY_INTERFACE_MODE_XGMII) |
1187 | phy_dev->autoneg = false; | 1189 | phy_dev->autoneg = false; |
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index ab90108db1c9..43bfc730a62d 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | |||
@@ -6582,7 +6582,7 @@ int hclge_cfg_flowctrl(struct hclge_dev *hdev) | |||
6582 | if (!phydev->link || !phydev->autoneg) | 6582 | if (!phydev->link || !phydev->autoneg) |
6583 | return 0; | 6583 | return 0; |
6584 | 6584 | ||
6585 | local_advertising = ethtool_adv_to_lcl_adv_t(phydev->advertising); | 6585 | local_advertising = linkmode_adv_to_lcl_adv_t(phydev->advertising); |
6586 | 6586 | ||
6587 | if (phydev->pause) | 6587 | if (phydev->pause) |
6588 | remote_advertising = LPA_PAUSE_CAP; | 6588 | remote_advertising = LPA_PAUSE_CAP; |
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c index 03018638f701..741cb3b9519d 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | |||
@@ -195,12 +195,13 @@ int hclge_mac_connect_phy(struct hclge_dev *hdev) | |||
195 | { | 195 | { |
196 | struct net_device *netdev = hdev->vport[0].nic.netdev; | 196 | struct net_device *netdev = hdev->vport[0].nic.netdev; |
197 | struct phy_device *phydev = hdev->hw.mac.phydev; | 197 | struct phy_device *phydev = hdev->hw.mac.phydev; |
198 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
198 | int ret; | 199 | int ret; |
199 | 200 | ||
200 | if (!phydev) | 201 | if (!phydev) |
201 | return 0; | 202 | return 0; |
202 | 203 | ||
203 | phydev->supported &= ~SUPPORTED_FIBRE; | 204 | linkmode_clear_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported); |
204 | 205 | ||
205 | ret = phy_connect_direct(netdev, phydev, | 206 | ret = phy_connect_direct(netdev, phydev, |
206 | hclge_mac_adjust_link, | 207 | hclge_mac_adjust_link, |
@@ -210,7 +211,15 @@ int hclge_mac_connect_phy(struct hclge_dev *hdev) | |||
210 | return ret; | 211 | return ret; |
211 | } | 212 | } |
212 | 213 | ||
213 | phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES; | 214 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, mask); |
215 | linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, mask); | ||
216 | linkmode_set_bit_array(phy_10_100_features_array, | ||
217 | ARRAY_SIZE(phy_10_100_features_array), | ||
218 | mask); | ||
219 | linkmode_set_bit_array(phy_gbit_features_array, | ||
220 | ARRAY_SIZE(phy_gbit_features_array), | ||
221 | mask); | ||
222 | linkmode_and(phydev->supported, phydev->supported, mask); | ||
214 | phy_support_asym_pause(phydev); | 223 | phy_support_asym_pause(phydev); |
215 | 224 | ||
216 | return 0; | 225 | return 0; |
diff --git a/drivers/net/ethernet/ibm/emac/core.c b/drivers/net/ethernet/ibm/emac/core.c index 760b2ad8e295..209255495bc9 100644 --- a/drivers/net/ethernet/ibm/emac/core.c +++ b/drivers/net/ethernet/ibm/emac/core.c | |||
@@ -2455,7 +2455,8 @@ static void emac_adjust_link(struct net_device *ndev) | |||
2455 | dev->phy.duplex = phy->duplex; | 2455 | dev->phy.duplex = phy->duplex; |
2456 | dev->phy.pause = phy->pause; | 2456 | dev->phy.pause = phy->pause; |
2457 | dev->phy.asym_pause = phy->asym_pause; | 2457 | dev->phy.asym_pause = phy->asym_pause; |
2458 | dev->phy.advertising = phy->advertising; | 2458 | ethtool_convert_link_mode_to_legacy_u32(&dev->phy.advertising, |
2459 | phy->advertising); | ||
2459 | } | 2460 | } |
2460 | 2461 | ||
2461 | static int emac_mii_bus_read(struct mii_bus *bus, int addr, int regnum) | 2462 | static int emac_mii_bus_read(struct mii_bus *bus, int addr, int regnum) |
@@ -2490,7 +2491,8 @@ static int emac_mdio_phy_start_aneg(struct mii_phy *phy, | |||
2490 | phy_dev->autoneg = phy->autoneg; | 2491 | phy_dev->autoneg = phy->autoneg; |
2491 | phy_dev->speed = phy->speed; | 2492 | phy_dev->speed = phy->speed; |
2492 | phy_dev->duplex = phy->duplex; | 2493 | phy_dev->duplex = phy->duplex; |
2493 | phy_dev->advertising = phy->advertising; | 2494 | ethtool_convert_legacy_u32_to_link_mode(phy_dev->advertising, |
2495 | phy->advertising); | ||
2494 | return phy_start_aneg(phy_dev); | 2496 | return phy_start_aneg(phy_dev); |
2495 | } | 2497 | } |
2496 | 2498 | ||
@@ -2624,7 +2626,8 @@ static int emac_dt_phy_connect(struct emac_instance *dev, | |||
2624 | dev->phy.def->phy_id_mask = dev->phy_dev->drv->phy_id_mask; | 2626 | dev->phy.def->phy_id_mask = dev->phy_dev->drv->phy_id_mask; |
2625 | dev->phy.def->name = dev->phy_dev->drv->name; | 2627 | dev->phy.def->name = dev->phy_dev->drv->name; |
2626 | dev->phy.def->ops = &emac_dt_mdio_phy_ops; | 2628 | dev->phy.def->ops = &emac_dt_mdio_phy_ops; |
2627 | dev->phy.features = dev->phy_dev->supported; | 2629 | ethtool_convert_link_mode_to_legacy_u32(&dev->phy.features, |
2630 | dev->phy_dev->supported); | ||
2628 | dev->phy.address = dev->phy_dev->mdio.addr; | 2631 | dev->phy.address = dev->phy_dev->mdio.addr; |
2629 | dev->phy.mode = dev->phy_dev->interface; | 2632 | dev->phy.mode = dev->phy_dev->interface; |
2630 | return 0; | 2633 | return 0; |
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c index 1e9bcbdc6a90..2f427271a793 100644 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c | |||
@@ -1499,23 +1499,16 @@ mv643xx_eth_get_link_ksettings_phy(struct mv643xx_eth_private *mp, | |||
1499 | struct ethtool_link_ksettings *cmd) | 1499 | struct ethtool_link_ksettings *cmd) |
1500 | { | 1500 | { |
1501 | struct net_device *dev = mp->dev; | 1501 | struct net_device *dev = mp->dev; |
1502 | u32 supported, advertising; | ||
1503 | 1502 | ||
1504 | phy_ethtool_ksettings_get(dev->phydev, cmd); | 1503 | phy_ethtool_ksettings_get(dev->phydev, cmd); |
1505 | 1504 | ||
1506 | /* | 1505 | /* |
1507 | * The MAC does not support 1000baseT_Half. | 1506 | * The MAC does not support 1000baseT_Half. |
1508 | */ | 1507 | */ |
1509 | ethtool_convert_link_mode_to_legacy_u32(&supported, | 1508 | linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1510 | cmd->link_modes.supported); | 1509 | cmd->link_modes.supported); |
1511 | ethtool_convert_link_mode_to_legacy_u32(&advertising, | 1510 | linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1512 | cmd->link_modes.advertising); | 1511 | cmd->link_modes.advertising); |
1513 | supported &= ~SUPPORTED_1000baseT_Half; | ||
1514 | advertising &= ~ADVERTISED_1000baseT_Half; | ||
1515 | ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, | ||
1516 | supported); | ||
1517 | ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising, | ||
1518 | advertising); | ||
1519 | 1512 | ||
1520 | return 0; | 1513 | return 0; |
1521 | } | 1514 | } |
@@ -3031,10 +3024,12 @@ static void phy_init(struct mv643xx_eth_private *mp, int speed, int duplex) | |||
3031 | phy->autoneg = AUTONEG_ENABLE; | 3024 | phy->autoneg = AUTONEG_ENABLE; |
3032 | phy->speed = 0; | 3025 | phy->speed = 0; |
3033 | phy->duplex = 0; | 3026 | phy->duplex = 0; |
3034 | phy->advertising = phy->supported | ADVERTISED_Autoneg; | 3027 | linkmode_copy(phy->advertising, phy->supported); |
3028 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, | ||
3029 | phy->advertising); | ||
3035 | } else { | 3030 | } else { |
3036 | phy->autoneg = AUTONEG_DISABLE; | 3031 | phy->autoneg = AUTONEG_DISABLE; |
3037 | phy->advertising = 0; | 3032 | linkmode_zero(phy->advertising); |
3038 | phy->speed = speed; | 3033 | phy->speed = speed; |
3039 | phy->duplex = duplex; | 3034 | phy->duplex = duplex; |
3040 | } | 3035 | } |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 7dbfdac4067a..399f565dd85a 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | |||
@@ -243,7 +243,7 @@ static void mtk_phy_link_adjust(struct net_device *dev) | |||
243 | if (dev->phydev->asym_pause) | 243 | if (dev->phydev->asym_pause) |
244 | rmt_adv |= LPA_PAUSE_ASYM; | 244 | rmt_adv |= LPA_PAUSE_ASYM; |
245 | 245 | ||
246 | lcl_adv = ethtool_adv_to_lcl_adv_t(dev->phydev->advertising); | 246 | lcl_adv = linkmode_adv_to_lcl_adv_t(dev->phydev->advertising); |
247 | flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); | 247 | flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); |
248 | 248 | ||
249 | if (flowctrl & FLOW_CTRL_TX) | 249 | if (flowctrl & FLOW_CTRL_TX) |
@@ -353,8 +353,9 @@ static int mtk_phy_connect(struct net_device *dev) | |||
353 | 353 | ||
354 | phy_set_max_speed(dev->phydev, SPEED_1000); | 354 | phy_set_max_speed(dev->phydev, SPEED_1000); |
355 | phy_support_asym_pause(dev->phydev); | 355 | phy_support_asym_pause(dev->phydev); |
356 | dev->phydev->advertising = dev->phydev->supported | | 356 | linkmode_copy(dev->phydev->advertising, dev->phydev->supported); |
357 | ADVERTISED_Autoneg; | 357 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
358 | dev->phydev->advertising); | ||
358 | phy_start_aneg(dev->phydev); | 359 | phy_start_aneg(dev->phydev); |
359 | 360 | ||
360 | of_node_put(np); | 361 | of_node_put(np); |
diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c index 25382f8fbb70..bd8695a4faaa 100644 --- a/drivers/net/ethernet/nxp/lpc_eth.c +++ b/drivers/net/ethernet/nxp/lpc_eth.c | |||
@@ -783,8 +783,6 @@ static int lpc_mii_probe(struct net_device *ndev) | |||
783 | 783 | ||
784 | phy_set_max_speed(phydev, SPEED_100); | 784 | phy_set_max_speed(phydev, SPEED_100); |
785 | 785 | ||
786 | phydev->advertising = phydev->supported; | ||
787 | |||
788 | pldat->link = 0; | 786 | pldat->link = 0; |
789 | pldat->speed = 0; | 787 | pldat->speed = 0; |
790 | pldat->duplex = -1; | 788 | pldat->duplex = -1; |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 1fd01688d37b..56de045268f8 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -6584,7 +6584,7 @@ static int r8169_phy_connect(struct rtl8169_private *tp) | |||
6584 | phy_set_max_speed(phydev, SPEED_100); | 6584 | phy_set_max_speed(phydev, SPEED_100); |
6585 | 6585 | ||
6586 | /* Ensure to advertise everything, incl. pause */ | 6586 | /* Ensure to advertise everything, incl. pause */ |
6587 | phydev->advertising = phydev->supported; | 6587 | linkmode_copy(phydev->advertising, phydev->supported); |
6588 | 6588 | ||
6589 | phy_attached_info(phydev); | 6589 | phy_attached_info(phydev); |
6590 | 6590 | ||
diff --git a/drivers/net/ethernet/socionext/sni_ave.c b/drivers/net/ethernet/socionext/sni_ave.c index 6732f5cbde08..9e7391faa1dc 100644 --- a/drivers/net/ethernet/socionext/sni_ave.c +++ b/drivers/net/ethernet/socionext/sni_ave.c | |||
@@ -1117,7 +1117,7 @@ static void ave_phy_adjust_link(struct net_device *ndev) | |||
1117 | if (phydev->asym_pause) | 1117 | if (phydev->asym_pause) |
1118 | rmt_adv |= LPA_PAUSE_ASYM; | 1118 | rmt_adv |= LPA_PAUSE_ASYM; |
1119 | 1119 | ||
1120 | lcl_adv = ethtool_adv_to_lcl_adv_t(phydev->advertising); | 1120 | lcl_adv = linkmode_adv_to_lcl_adv_t(phydev->advertising); |
1121 | cap = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); | 1121 | cap = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); |
1122 | if (cap & FLOW_CTRL_TX) | 1122 | if (cap & FLOW_CTRL_TX) |
1123 | txcr |= AVE_TXCR_FLOCTR; | 1123 | txcr |= AVE_TXCR_FLOCTR; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index 5710864fa809..d1f61c25d82b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | |||
@@ -458,8 +458,10 @@ stmmac_get_pauseparam(struct net_device *netdev, | |||
458 | if (!adv_lp.pause) | 458 | if (!adv_lp.pause) |
459 | return; | 459 | return; |
460 | } else { | 460 | } else { |
461 | if (!(netdev->phydev->supported & SUPPORTED_Pause) || | 461 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
462 | !(netdev->phydev->supported & SUPPORTED_Asym_Pause)) | 462 | netdev->phydev->supported) || |
463 | linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
464 | netdev->phydev->supported)) | ||
463 | return; | 465 | return; |
464 | } | 466 | } |
465 | 467 | ||
@@ -487,8 +489,10 @@ stmmac_set_pauseparam(struct net_device *netdev, | |||
487 | if (!adv_lp.pause) | 489 | if (!adv_lp.pause) |
488 | return -EOPNOTSUPP; | 490 | return -EOPNOTSUPP; |
489 | } else { | 491 | } else { |
490 | if (!(phy->supported & SUPPORTED_Pause) || | 492 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
491 | !(phy->supported & SUPPORTED_Asym_Pause)) | 493 | phy->supported) || |
494 | linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
495 | phy->supported)) | ||
492 | return -EOPNOTSUPP; | 496 | return -EOPNOTSUPP; |
493 | } | 497 | } |
494 | 498 | ||
diff --git a/drivers/net/ethernet/toshiba/tc35815.c b/drivers/net/ethernet/toshiba/tc35815.c index 6a71c2c0f17d..c50a9772f4af 100644 --- a/drivers/net/ethernet/toshiba/tc35815.c +++ b/drivers/net/ethernet/toshiba/tc35815.c | |||
@@ -607,9 +607,9 @@ static void tc_handle_link_change(struct net_device *dev) | |||
607 | 607 | ||
608 | static int tc_mii_probe(struct net_device *dev) | 608 | static int tc_mii_probe(struct net_device *dev) |
609 | { | 609 | { |
610 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
610 | struct tc35815_local *lp = netdev_priv(dev); | 611 | struct tc35815_local *lp = netdev_priv(dev); |
611 | struct phy_device *phydev; | 612 | struct phy_device *phydev; |
612 | u32 dropmask; | ||
613 | 613 | ||
614 | phydev = phy_find_first(lp->mii_bus); | 614 | phydev = phy_find_first(lp->mii_bus); |
615 | if (!phydev) { | 615 | if (!phydev) { |
@@ -630,17 +630,22 @@ static int tc_mii_probe(struct net_device *dev) | |||
630 | 630 | ||
631 | /* mask with MAC supported features */ | 631 | /* mask with MAC supported features */ |
632 | phy_set_max_speed(phydev, SPEED_100); | 632 | phy_set_max_speed(phydev, SPEED_100); |
633 | dropmask = 0; | 633 | if (options.speed == 10) { |
634 | if (options.speed == 10) | 634 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask); |
635 | dropmask |= SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full; | 635 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask); |
636 | else if (options.speed == 100) | 636 | } else if (options.speed == 100) { |
637 | dropmask |= SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full; | 637 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, mask); |
638 | if (options.duplex == 1) | 638 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, mask); |
639 | dropmask |= SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full; | 639 | } |
640 | else if (options.duplex == 2) | 640 | if (options.duplex == 1) { |
641 | dropmask |= SUPPORTED_10baseT_Half | SUPPORTED_100baseT_Half; | 641 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, mask); |
642 | phydev->supported &= ~dropmask; | 642 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask); |
643 | phydev->advertising = phydev->supported; | 643 | } else if (options.duplex == 2) { |
644 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, mask); | ||
645 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask); | ||
646 | } | ||
647 | linkmode_and(phydev->supported, phydev->supported, mask); | ||
648 | linkmode_copy(phydev->advertising, phydev->supported); | ||
644 | 649 | ||
645 | lp->link = 0; | 650 | lp->link = 0; |
646 | lp->speed = 0; | 651 | lp->speed = 0; |
diff --git a/drivers/net/phy/aquantia.c b/drivers/net/phy/aquantia.c index efc0fbde97a1..beb3309bb0f0 100644 --- a/drivers/net/phy/aquantia.c +++ b/drivers/net/phy/aquantia.c | |||
@@ -25,15 +25,10 @@ | |||
25 | #define PHY_ID_AQR107 0x03a1b4e0 | 25 | #define PHY_ID_AQR107 0x03a1b4e0 |
26 | #define PHY_ID_AQR405 0x03a1b4b0 | 26 | #define PHY_ID_AQR405 0x03a1b4b0 |
27 | 27 | ||
28 | #define PHY_AQUANTIA_FEATURES (SUPPORTED_10000baseT_Full | \ | ||
29 | SUPPORTED_1000baseT_Full | \ | ||
30 | SUPPORTED_100baseT_Full | \ | ||
31 | PHY_DEFAULT_FEATURES) | ||
32 | |||
33 | static int aquantia_config_aneg(struct phy_device *phydev) | 28 | static int aquantia_config_aneg(struct phy_device *phydev) |
34 | { | 29 | { |
35 | phydev->supported = PHY_AQUANTIA_FEATURES; | 30 | linkmode_copy(phydev->supported, phy_10gbit_features); |
36 | phydev->advertising = phydev->supported; | 31 | linkmode_copy(phydev->advertising, phydev->supported); |
37 | 32 | ||
38 | return 0; | 33 | return 0; |
39 | } | 34 | } |
diff --git a/drivers/net/phy/bcm63xx.c b/drivers/net/phy/bcm63xx.c index 6a547b87ff04..a88dd14a25c0 100644 --- a/drivers/net/phy/bcm63xx.c +++ b/drivers/net/phy/bcm63xx.c | |||
@@ -43,7 +43,7 @@ static int bcm63xx_config_init(struct phy_device *phydev) | |||
43 | int reg, err; | 43 | int reg, err; |
44 | 44 | ||
45 | /* ASYM_PAUSE bit is marked RO in datasheet, so don't cheat */ | 45 | /* ASYM_PAUSE bit is marked RO in datasheet, so don't cheat */ |
46 | phydev->supported |= SUPPORTED_Pause; | 46 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); |
47 | 47 | ||
48 | reg = phy_read(phydev, MII_BCM63XX_IR); | 48 | reg = phy_read(phydev, MII_BCM63XX_IR); |
49 | if (reg < 0) | 49 | if (reg < 0) |
diff --git a/drivers/net/phy/bcm87xx.c b/drivers/net/phy/bcm87xx.c index 64d5ba7bf94f..1b350183bffb 100644 --- a/drivers/net/phy/bcm87xx.c +++ b/drivers/net/phy/bcm87xx.c | |||
@@ -86,8 +86,12 @@ static int bcm87xx_of_reg_init(struct phy_device *phydev) | |||
86 | 86 | ||
87 | static int bcm87xx_config_init(struct phy_device *phydev) | 87 | static int bcm87xx_config_init(struct phy_device *phydev) |
88 | { | 88 | { |
89 | phydev->supported = SUPPORTED_10000baseR_FEC; | 89 | linkmode_zero(phydev->supported); |
90 | phydev->advertising = ADVERTISED_10000baseR_FEC; | 90 | linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseR_FEC_BIT, |
91 | phydev->supported); | ||
92 | linkmode_zero(phydev->advertising); | ||
93 | linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseR_FEC_BIT, | ||
94 | phydev->advertising); | ||
91 | phydev->state = PHY_NOLINK; | 95 | phydev->state = PHY_NOLINK; |
92 | phydev->autoneg = AUTONEG_DISABLE; | 96 | phydev->autoneg = AUTONEG_DISABLE; |
93 | 97 | ||
diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c index 67b260877f30..f7fb62712cd8 100644 --- a/drivers/net/phy/fixed_phy.c +++ b/drivers/net/phy/fixed_phy.c | |||
@@ -223,14 +223,23 @@ struct phy_device *fixed_phy_register(unsigned int irq, | |||
223 | 223 | ||
224 | switch (status->speed) { | 224 | switch (status->speed) { |
225 | case SPEED_1000: | 225 | case SPEED_1000: |
226 | phy->supported = PHY_1000BT_FEATURES; | 226 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
227 | break; | 227 | phy->supported); |
228 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
229 | phy->supported); | ||
230 | /* fall through */ | ||
228 | case SPEED_100: | 231 | case SPEED_100: |
229 | phy->supported = PHY_100BT_FEATURES; | 232 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, |
230 | break; | 233 | phy->supported); |
234 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, | ||
235 | phy->supported); | ||
236 | /* fall through */ | ||
231 | case SPEED_10: | 237 | case SPEED_10: |
232 | default: | 238 | default: |
233 | phy->supported = PHY_10BT_FEATURES; | 239 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, |
240 | phy->supported); | ||
241 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, | ||
242 | phy->supported); | ||
234 | } | 243 | } |
235 | 244 | ||
236 | ret = phy_device_register(phy); | 245 | ret = phy_device_register(phy); |
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 463c616a7281..96f33831ea99 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c | |||
@@ -491,25 +491,26 @@ static int m88e1318_config_aneg(struct phy_device *phydev) | |||
491 | } | 491 | } |
492 | 492 | ||
493 | /** | 493 | /** |
494 | * ethtool_adv_to_fiber_adv_t | 494 | * linkmode_adv_to_fiber_adv_t |
495 | * @ethadv: the ethtool advertisement settings | 495 | * @advertise: the linkmode advertisement settings |
496 | * | 496 | * |
497 | * A small helper function that translates ethtool advertisement | 497 | * A small helper function that translates linkmode advertisement |
498 | * settings to phy autonegotiation advertisements for the | 498 | * settings to phy autonegotiation advertisements for the MII_ADV |
499 | * MII_ADV register for fiber link. | 499 | * register for fiber link. |
500 | */ | 500 | */ |
501 | static inline u32 ethtool_adv_to_fiber_adv_t(u32 ethadv) | 501 | static inline u32 linkmode_adv_to_fiber_adv_t(unsigned long *advertise) |
502 | { | 502 | { |
503 | u32 result = 0; | 503 | u32 result = 0; |
504 | 504 | ||
505 | if (ethadv & ADVERTISED_1000baseT_Half) | 505 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, advertise)) |
506 | result |= ADVERTISE_FIBER_1000HALF; | 506 | result |= ADVERTISE_FIBER_1000HALF; |
507 | if (ethadv & ADVERTISED_1000baseT_Full) | 507 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, advertise)) |
508 | result |= ADVERTISE_FIBER_1000FULL; | 508 | result |= ADVERTISE_FIBER_1000FULL; |
509 | 509 | ||
510 | if ((ethadv & ADVERTISE_PAUSE_ASYM) && (ethadv & ADVERTISE_PAUSE_CAP)) | 510 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, advertise) && |
511 | linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, advertise)) | ||
511 | result |= LPA_PAUSE_ASYM_FIBER; | 512 | result |= LPA_PAUSE_ASYM_FIBER; |
512 | else if (ethadv & ADVERTISE_PAUSE_CAP) | 513 | else if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, advertise)) |
513 | result |= (ADVERTISE_PAUSE_FIBER | 514 | result |= (ADVERTISE_PAUSE_FIBER |
514 | & (~ADVERTISE_PAUSE_ASYM_FIBER)); | 515 | & (~ADVERTISE_PAUSE_ASYM_FIBER)); |
515 | 516 | ||
@@ -530,14 +531,13 @@ static int marvell_config_aneg_fiber(struct phy_device *phydev) | |||
530 | int changed = 0; | 531 | int changed = 0; |
531 | int err; | 532 | int err; |
532 | int adv, oldadv; | 533 | int adv, oldadv; |
533 | u32 advertise; | ||
534 | 534 | ||
535 | if (phydev->autoneg != AUTONEG_ENABLE) | 535 | if (phydev->autoneg != AUTONEG_ENABLE) |
536 | return genphy_setup_forced(phydev); | 536 | return genphy_setup_forced(phydev); |
537 | 537 | ||
538 | /* Only allow advertising what this PHY supports */ | 538 | /* Only allow advertising what this PHY supports */ |
539 | phydev->advertising &= phydev->supported; | 539 | linkmode_and(phydev->advertising, phydev->advertising, |
540 | advertise = phydev->advertising; | 540 | phydev->supported); |
541 | 541 | ||
542 | /* Setup fiber advertisement */ | 542 | /* Setup fiber advertisement */ |
543 | adv = phy_read(phydev, MII_ADVERTISE); | 543 | adv = phy_read(phydev, MII_ADVERTISE); |
@@ -547,7 +547,7 @@ static int marvell_config_aneg_fiber(struct phy_device *phydev) | |||
547 | oldadv = adv; | 547 | oldadv = adv; |
548 | adv &= ~(ADVERTISE_FIBER_1000HALF | ADVERTISE_FIBER_1000FULL | 548 | adv &= ~(ADVERTISE_FIBER_1000HALF | ADVERTISE_FIBER_1000FULL |
549 | | LPA_PAUSE_FIBER); | 549 | | LPA_PAUSE_FIBER); |
550 | adv |= ethtool_adv_to_fiber_adv_t(advertise); | 550 | adv |= linkmode_adv_to_fiber_adv_t(phydev->advertising); |
551 | 551 | ||
552 | if (adv != oldadv) { | 552 | if (adv != oldadv) { |
553 | err = phy_write(phydev, MII_ADVERTISE, adv); | 553 | err = phy_write(phydev, MII_ADVERTISE, adv); |
@@ -879,8 +879,14 @@ static int m88e1510_config_init(struct phy_device *phydev) | |||
879 | * so disable Pause support. | 879 | * so disable Pause support. |
880 | */ | 880 | */ |
881 | pause = SUPPORTED_Pause | SUPPORTED_Asym_Pause; | 881 | pause = SUPPORTED_Pause | SUPPORTED_Asym_Pause; |
882 | phydev->supported &= ~pause; | 882 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, |
883 | phydev->advertising &= ~pause; | 883 | phydev->supported); |
884 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, | ||
885 | phydev->supported); | ||
886 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
887 | phydev->advertising); | ||
888 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, | ||
889 | phydev->advertising); | ||
884 | } | 890 | } |
885 | 891 | ||
886 | return m88e1318_config_init(phydev); | 892 | return m88e1318_config_init(phydev); |
@@ -1235,7 +1241,8 @@ static int marvell_read_status(struct phy_device *phydev) | |||
1235 | int err; | 1241 | int err; |
1236 | 1242 | ||
1237 | /* Check the fiber mode first */ | 1243 | /* Check the fiber mode first */ |
1238 | if (phydev->supported & SUPPORTED_FIBRE && | 1244 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, |
1245 | phydev->supported) && | ||
1239 | phydev->interface != PHY_INTERFACE_MODE_SGMII) { | 1246 | phydev->interface != PHY_INTERFACE_MODE_SGMII) { |
1240 | err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); | 1247 | err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); |
1241 | if (err < 0) | 1248 | if (err < 0) |
@@ -1278,7 +1285,8 @@ static int marvell_suspend(struct phy_device *phydev) | |||
1278 | int err; | 1285 | int err; |
1279 | 1286 | ||
1280 | /* Suspend the fiber mode first */ | 1287 | /* Suspend the fiber mode first */ |
1281 | if (!(phydev->supported & SUPPORTED_FIBRE)) { | 1288 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, |
1289 | phydev->supported)) { | ||
1282 | err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); | 1290 | err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); |
1283 | if (err < 0) | 1291 | if (err < 0) |
1284 | goto error; | 1292 | goto error; |
@@ -1312,7 +1320,8 @@ static int marvell_resume(struct phy_device *phydev) | |||
1312 | int err; | 1320 | int err; |
1313 | 1321 | ||
1314 | /* Resume the fiber mode first */ | 1322 | /* Resume the fiber mode first */ |
1315 | if (!(phydev->supported & SUPPORTED_FIBRE)) { | 1323 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, |
1324 | phydev->supported)) { | ||
1316 | err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); | 1325 | err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); |
1317 | if (err < 0) | 1326 | if (err < 0) |
1318 | goto error; | 1327 | goto error; |
@@ -1463,7 +1472,8 @@ error: | |||
1463 | 1472 | ||
1464 | static int marvell_get_sset_count(struct phy_device *phydev) | 1473 | static int marvell_get_sset_count(struct phy_device *phydev) |
1465 | { | 1474 | { |
1466 | if (phydev->supported & SUPPORTED_FIBRE) | 1475 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, |
1476 | phydev->supported)) | ||
1467 | return ARRAY_SIZE(marvell_hw_stats); | 1477 | return ARRAY_SIZE(marvell_hw_stats); |
1468 | else | 1478 | else |
1469 | return ARRAY_SIZE(marvell_hw_stats) - NB_FIBER_STATS; | 1479 | return ARRAY_SIZE(marvell_hw_stats) - NB_FIBER_STATS; |
diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c index 1c9d039eec63..d939dce16b35 100644 --- a/drivers/net/phy/marvell10g.c +++ b/drivers/net/phy/marvell10g.c | |||
@@ -252,7 +252,6 @@ static int mv3310_resume(struct phy_device *phydev) | |||
252 | static int mv3310_config_init(struct phy_device *phydev) | 252 | static int mv3310_config_init(struct phy_device *phydev) |
253 | { | 253 | { |
254 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; | 254 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; |
255 | u32 mask; | ||
256 | int val; | 255 | int val; |
257 | 256 | ||
258 | /* Check that the PHY interface type is compatible */ | 257 | /* Check that the PHY interface type is compatible */ |
@@ -336,13 +335,9 @@ static int mv3310_config_init(struct phy_device *phydev) | |||
336 | } | 335 | } |
337 | } | 336 | } |
338 | 337 | ||
339 | if (!ethtool_convert_link_mode_to_legacy_u32(&mask, supported)) | 338 | linkmode_copy(phydev->supported, supported); |
340 | phydev_warn(phydev, | 339 | linkmode_and(phydev->advertising, phydev->advertising, |
341 | "PHY supports (%*pb) more modes than phylib supports, some modes not supported.\n", | 340 | phydev->supported); |
342 | __ETHTOOL_LINK_MODE_MASK_NBITS, supported); | ||
343 | |||
344 | phydev->supported &= mask; | ||
345 | phydev->advertising &= phydev->supported; | ||
346 | 341 | ||
347 | return 0; | 342 | return 0; |
348 | } | 343 | } |
@@ -350,7 +345,7 @@ static int mv3310_config_init(struct phy_device *phydev) | |||
350 | static int mv3310_config_aneg(struct phy_device *phydev) | 345 | static int mv3310_config_aneg(struct phy_device *phydev) |
351 | { | 346 | { |
352 | bool changed = false; | 347 | bool changed = false; |
353 | u32 advertising; | 348 | u16 reg; |
354 | int ret; | 349 | int ret; |
355 | 350 | ||
356 | /* We don't support manual MDI control */ | 351 | /* We don't support manual MDI control */ |
@@ -364,31 +359,35 @@ static int mv3310_config_aneg(struct phy_device *phydev) | |||
364 | return genphy_c45_an_disable_aneg(phydev); | 359 | return genphy_c45_an_disable_aneg(phydev); |
365 | } | 360 | } |
366 | 361 | ||
367 | phydev->advertising &= phydev->supported; | 362 | linkmode_and(phydev->advertising, phydev->advertising, |
368 | advertising = phydev->advertising; | 363 | phydev->supported); |
369 | 364 | ||
370 | ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, | 365 | ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, |
371 | ADVERTISE_ALL | ADVERTISE_100BASE4 | | 366 | ADVERTISE_ALL | ADVERTISE_100BASE4 | |
372 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, | 367 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, |
373 | ethtool_adv_to_mii_adv_t(advertising)); | 368 | linkmode_adv_to_mii_adv_t(phydev->advertising)); |
374 | if (ret < 0) | 369 | if (ret < 0) |
375 | return ret; | 370 | return ret; |
376 | if (ret > 0) | 371 | if (ret > 0) |
377 | changed = true; | 372 | changed = true; |
378 | 373 | ||
374 | reg = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); | ||
379 | ret = mv3310_modify(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, | 375 | ret = mv3310_modify(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, |
380 | ADVERTISE_1000FULL | ADVERTISE_1000HALF, | 376 | ADVERTISE_1000FULL | ADVERTISE_1000HALF, reg); |
381 | ethtool_adv_to_mii_ctrl1000_t(advertising)); | ||
382 | if (ret < 0) | 377 | if (ret < 0) |
383 | return ret; | 378 | return ret; |
384 | if (ret > 0) | 379 | if (ret > 0) |
385 | changed = true; | 380 | changed = true; |
386 | 381 | ||
387 | /* 10G control register */ | 382 | /* 10G control register */ |
383 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, | ||
384 | phydev->advertising)) | ||
385 | reg = MDIO_AN_10GBT_CTRL_ADV10G; | ||
386 | else | ||
387 | reg = 0; | ||
388 | |||
388 | ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, | 389 | ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, |
389 | MDIO_AN_10GBT_CTRL_ADV10G, | 390 | MDIO_AN_10GBT_CTRL_ADV10G, reg); |
390 | advertising & ADVERTISED_10000baseT_Full ? | ||
391 | MDIO_AN_10GBT_CTRL_ADV10G : 0); | ||
392 | if (ret < 0) | 391 | if (ret < 0) |
393 | return ret; | 392 | return ret; |
394 | if (ret > 0) | 393 | if (ret > 0) |
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index cb5783905a25..c33384710d26 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
@@ -311,17 +311,22 @@ static int kszphy_config_init(struct phy_device *phydev) | |||
311 | 311 | ||
312 | static int ksz8041_config_init(struct phy_device *phydev) | 312 | static int ksz8041_config_init(struct phy_device *phydev) |
313 | { | 313 | { |
314 | __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; | ||
315 | |||
314 | struct device_node *of_node = phydev->mdio.dev.of_node; | 316 | struct device_node *of_node = phydev->mdio.dev.of_node; |
315 | 317 | ||
316 | /* Limit supported and advertised modes in fiber mode */ | 318 | /* Limit supported and advertised modes in fiber mode */ |
317 | if (of_property_read_bool(of_node, "micrel,fiber-mode")) { | 319 | if (of_property_read_bool(of_node, "micrel,fiber-mode")) { |
318 | phydev->dev_flags |= MICREL_PHY_FXEN; | 320 | phydev->dev_flags |= MICREL_PHY_FXEN; |
319 | phydev->supported &= SUPPORTED_100baseT_Full | | 321 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask); |
320 | SUPPORTED_100baseT_Half; | 322 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask); |
321 | phydev->supported |= SUPPORTED_FIBRE; | 323 | |
322 | phydev->advertising &= ADVERTISED_100baseT_Full | | 324 | linkmode_and(phydev->supported, phydev->supported, mask); |
323 | ADVERTISED_100baseT_Half; | 325 | linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, |
324 | phydev->advertising |= ADVERTISED_FIBRE; | 326 | phydev->supported); |
327 | linkmode_and(phydev->advertising, phydev->advertising, mask); | ||
328 | linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, | ||
329 | phydev->advertising); | ||
325 | phydev->autoneg = AUTONEG_DISABLE; | 330 | phydev->autoneg = AUTONEG_DISABLE; |
326 | } | 331 | } |
327 | 332 | ||
diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c index d7636ff03bc7..a19f4dfa7470 100644 --- a/drivers/net/phy/phy-c45.c +++ b/drivers/net/phy/phy-c45.c | |||
@@ -304,8 +304,11 @@ EXPORT_SYMBOL_GPL(gen10g_no_soft_reset); | |||
304 | int gen10g_config_init(struct phy_device *phydev) | 304 | int gen10g_config_init(struct phy_device *phydev) |
305 | { | 305 | { |
306 | /* Temporarily just say we support everything */ | 306 | /* Temporarily just say we support everything */ |
307 | phydev->supported = SUPPORTED_10000baseT_Full; | 307 | linkmode_zero(phydev->supported); |
308 | phydev->advertising = SUPPORTED_10000baseT_Full; | 308 | |
309 | linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, | ||
310 | phydev->supported); | ||
311 | linkmode_copy(phydev->advertising, phydev->supported); | ||
309 | 312 | ||
310 | return 0; | 313 | return 0; |
311 | } | 314 | } |
diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c index c7da4cbb1103..9d192b660b07 100644 --- a/drivers/net/phy/phy-core.c +++ b/drivers/net/phy/phy-core.c | |||
@@ -129,7 +129,6 @@ static const struct phy_setting settings[] = { | |||
129 | * @speed: speed to match | 129 | * @speed: speed to match |
130 | * @duplex: duplex to match | 130 | * @duplex: duplex to match |
131 | * @mask: allowed link modes | 131 | * @mask: allowed link modes |
132 | * @maxbit: bit size of link modes | ||
133 | * @exact: an exact match is required | 132 | * @exact: an exact match is required |
134 | * | 133 | * |
135 | * Search the settings array for a setting that matches the speed and | 134 | * Search the settings array for a setting that matches the speed and |
@@ -143,14 +142,14 @@ static const struct phy_setting settings[] = { | |||
143 | * they all fail, %NULL will be returned. | 142 | * they all fail, %NULL will be returned. |
144 | */ | 143 | */ |
145 | const struct phy_setting * | 144 | const struct phy_setting * |
146 | phy_lookup_setting(int speed, int duplex, const unsigned long *mask, | 145 | phy_lookup_setting(int speed, int duplex, const unsigned long *mask, bool exact) |
147 | size_t maxbit, bool exact) | ||
148 | { | 146 | { |
149 | const struct phy_setting *p, *match = NULL, *last = NULL; | 147 | const struct phy_setting *p, *match = NULL, *last = NULL; |
150 | int i; | 148 | int i; |
151 | 149 | ||
152 | for (i = 0, p = settings; i < ARRAY_SIZE(settings); i++, p++) { | 150 | for (i = 0, p = settings; i < ARRAY_SIZE(settings); i++, p++) { |
153 | if (p->bit < maxbit && test_bit(p->bit, mask)) { | 151 | if (p->bit < __ETHTOOL_LINK_MODE_MASK_NBITS && |
152 | test_bit(p->bit, mask)) { | ||
154 | last = p; | 153 | last = p; |
155 | if (p->speed == speed && p->duplex == duplex) { | 154 | if (p->speed == speed && p->duplex == duplex) { |
156 | /* Exact match for speed and duplex */ | 155 | /* Exact match for speed and duplex */ |
@@ -175,13 +174,13 @@ phy_lookup_setting(int speed, int duplex, const unsigned long *mask, | |||
175 | EXPORT_SYMBOL_GPL(phy_lookup_setting); | 174 | EXPORT_SYMBOL_GPL(phy_lookup_setting); |
176 | 175 | ||
177 | size_t phy_speeds(unsigned int *speeds, size_t size, | 176 | size_t phy_speeds(unsigned int *speeds, size_t size, |
178 | unsigned long *mask, size_t maxbit) | 177 | unsigned long *mask) |
179 | { | 178 | { |
180 | size_t count; | 179 | size_t count; |
181 | int i; | 180 | int i; |
182 | 181 | ||
183 | for (i = 0, count = 0; i < ARRAY_SIZE(settings) && count < size; i++) | 182 | for (i = 0, count = 0; i < ARRAY_SIZE(settings) && count < size; i++) |
184 | if (settings[i].bit < maxbit && | 183 | if (settings[i].bit < __ETHTOOL_LINK_MODE_MASK_NBITS && |
185 | test_bit(settings[i].bit, mask) && | 184 | test_bit(settings[i].bit, mask) && |
186 | (count == 0 || speeds[count - 1] != settings[i].speed)) | 185 | (count == 0 || speeds[count - 1] != settings[i].speed)) |
187 | speeds[count++] = settings[i].speed; | 186 | speeds[count++] = settings[i].speed; |
@@ -199,27 +198,38 @@ size_t phy_speeds(unsigned int *speeds, size_t size, | |||
199 | */ | 198 | */ |
200 | void phy_resolve_aneg_linkmode(struct phy_device *phydev) | 199 | void phy_resolve_aneg_linkmode(struct phy_device *phydev) |
201 | { | 200 | { |
202 | u32 common = phydev->lp_advertising & phydev->advertising; | 201 | __ETHTOOL_DECLARE_LINK_MODE_MASK(common); |
202 | __ETHTOOL_DECLARE_LINK_MODE_MASK(lp); | ||
203 | 203 | ||
204 | if (common & ADVERTISED_10000baseT_Full) { | 204 | ethtool_convert_legacy_u32_to_link_mode(lp, phydev->lp_advertising); |
205 | |||
206 | linkmode_and(common, lp, phydev->advertising); | ||
207 | |||
208 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, common)) { | ||
205 | phydev->speed = SPEED_10000; | 209 | phydev->speed = SPEED_10000; |
206 | phydev->duplex = DUPLEX_FULL; | 210 | phydev->duplex = DUPLEX_FULL; |
207 | } else if (common & ADVERTISED_1000baseT_Full) { | 211 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, |
212 | common)) { | ||
208 | phydev->speed = SPEED_1000; | 213 | phydev->speed = SPEED_1000; |
209 | phydev->duplex = DUPLEX_FULL; | 214 | phydev->duplex = DUPLEX_FULL; |
210 | } else if (common & ADVERTISED_1000baseT_Half) { | 215 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
216 | common)) { | ||
211 | phydev->speed = SPEED_1000; | 217 | phydev->speed = SPEED_1000; |
212 | phydev->duplex = DUPLEX_HALF; | 218 | phydev->duplex = DUPLEX_HALF; |
213 | } else if (common & ADVERTISED_100baseT_Full) { | 219 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, |
220 | common)) { | ||
214 | phydev->speed = SPEED_100; | 221 | phydev->speed = SPEED_100; |
215 | phydev->duplex = DUPLEX_FULL; | 222 | phydev->duplex = DUPLEX_FULL; |
216 | } else if (common & ADVERTISED_100baseT_Half) { | 223 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, |
224 | common)) { | ||
217 | phydev->speed = SPEED_100; | 225 | phydev->speed = SPEED_100; |
218 | phydev->duplex = DUPLEX_HALF; | 226 | phydev->duplex = DUPLEX_HALF; |
219 | } else if (common & ADVERTISED_10baseT_Full) { | 227 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, |
228 | common)) { | ||
220 | phydev->speed = SPEED_10; | 229 | phydev->speed = SPEED_10; |
221 | phydev->duplex = DUPLEX_FULL; | 230 | phydev->duplex = DUPLEX_FULL; |
222 | } else if (common & ADVERTISED_10baseT_Half) { | 231 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, |
232 | common)) { | ||
223 | phydev->speed = SPEED_10; | 233 | phydev->speed = SPEED_10; |
224 | phydev->duplex = DUPLEX_HALF; | 234 | phydev->duplex = DUPLEX_HALF; |
225 | } | 235 | } |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 627e66ab60eb..ecc8a7d5306c 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -179,11 +179,9 @@ EXPORT_SYMBOL(phy_aneg_done); | |||
179 | * settings were found. | 179 | * settings were found. |
180 | */ | 180 | */ |
181 | static const struct phy_setting * | 181 | static const struct phy_setting * |
182 | phy_find_valid(int speed, int duplex, u32 supported) | 182 | phy_find_valid(int speed, int duplex, unsigned long *supported) |
183 | { | 183 | { |
184 | unsigned long mask = supported; | 184 | return phy_lookup_setting(speed, duplex, supported, false); |
185 | |||
186 | return phy_lookup_setting(speed, duplex, &mask, BITS_PER_LONG, false); | ||
187 | } | 185 | } |
188 | 186 | ||
189 | /** | 187 | /** |
@@ -200,9 +198,7 @@ unsigned int phy_supported_speeds(struct phy_device *phy, | |||
200 | unsigned int *speeds, | 198 | unsigned int *speeds, |
201 | unsigned int size) | 199 | unsigned int size) |
202 | { | 200 | { |
203 | unsigned long supported = phy->supported; | 201 | return phy_speeds(speeds, size, phy->supported); |
204 | |||
205 | return phy_speeds(speeds, size, &supported, BITS_PER_LONG); | ||
206 | } | 202 | } |
207 | 203 | ||
208 | /** | 204 | /** |
@@ -214,11 +210,10 @@ unsigned int phy_supported_speeds(struct phy_device *phy, | |||
214 | * | 210 | * |
215 | * Description: Returns true if there is a valid setting, false otherwise. | 211 | * Description: Returns true if there is a valid setting, false otherwise. |
216 | */ | 212 | */ |
217 | static inline bool phy_check_valid(int speed, int duplex, u32 features) | 213 | static inline bool phy_check_valid(int speed, int duplex, |
214 | unsigned long *features) | ||
218 | { | 215 | { |
219 | unsigned long mask = features; | 216 | return !!phy_lookup_setting(speed, duplex, features, true); |
220 | |||
221 | return !!phy_lookup_setting(speed, duplex, &mask, BITS_PER_LONG, true); | ||
222 | } | 217 | } |
223 | 218 | ||
224 | /** | 219 | /** |
@@ -232,13 +227,13 @@ static inline bool phy_check_valid(int speed, int duplex, u32 features) | |||
232 | static void phy_sanitize_settings(struct phy_device *phydev) | 227 | static void phy_sanitize_settings(struct phy_device *phydev) |
233 | { | 228 | { |
234 | const struct phy_setting *setting; | 229 | const struct phy_setting *setting; |
235 | u32 features = phydev->supported; | ||
236 | 230 | ||
237 | /* Sanitize settings based on PHY capabilities */ | 231 | /* Sanitize settings based on PHY capabilities */ |
238 | if ((features & SUPPORTED_Autoneg) == 0) | 232 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported)) |
239 | phydev->autoneg = AUTONEG_DISABLE; | 233 | phydev->autoneg = AUTONEG_DISABLE; |
240 | 234 | ||
241 | setting = phy_find_valid(phydev->speed, phydev->duplex, features); | 235 | setting = phy_find_valid(phydev->speed, phydev->duplex, |
236 | phydev->supported); | ||
242 | if (setting) { | 237 | if (setting) { |
243 | phydev->speed = setting->speed; | 238 | phydev->speed = setting->speed; |
244 | phydev->duplex = setting->duplex; | 239 | phydev->duplex = setting->duplex; |
@@ -264,13 +259,15 @@ static void phy_sanitize_settings(struct phy_device *phydev) | |||
264 | */ | 259 | */ |
265 | int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) | 260 | int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) |
266 | { | 261 | { |
262 | __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); | ||
267 | u32 speed = ethtool_cmd_speed(cmd); | 263 | u32 speed = ethtool_cmd_speed(cmd); |
268 | 264 | ||
269 | if (cmd->phy_address != phydev->mdio.addr) | 265 | if (cmd->phy_address != phydev->mdio.addr) |
270 | return -EINVAL; | 266 | return -EINVAL; |
271 | 267 | ||
272 | /* We make sure that we don't pass unsupported values in to the PHY */ | 268 | /* We make sure that we don't pass unsupported values in to the PHY */ |
273 | cmd->advertising &= phydev->supported; | 269 | ethtool_convert_legacy_u32_to_link_mode(advertising, cmd->advertising); |
270 | linkmode_and(advertising, advertising, phydev->supported); | ||
274 | 271 | ||
275 | /* Verify the settings we care about. */ | 272 | /* Verify the settings we care about. */ |
276 | if (cmd->autoneg != AUTONEG_ENABLE && cmd->autoneg != AUTONEG_DISABLE) | 273 | if (cmd->autoneg != AUTONEG_ENABLE && cmd->autoneg != AUTONEG_DISABLE) |
@@ -291,12 +288,14 @@ int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) | |||
291 | 288 | ||
292 | phydev->speed = speed; | 289 | phydev->speed = speed; |
293 | 290 | ||
294 | phydev->advertising = cmd->advertising; | 291 | linkmode_copy(phydev->advertising, advertising); |
295 | 292 | ||
296 | if (AUTONEG_ENABLE == cmd->autoneg) | 293 | if (AUTONEG_ENABLE == cmd->autoneg) |
297 | phydev->advertising |= ADVERTISED_Autoneg; | 294 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
295 | phydev->advertising); | ||
298 | else | 296 | else |
299 | phydev->advertising &= ~ADVERTISED_Autoneg; | 297 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
298 | phydev->advertising); | ||
300 | 299 | ||
301 | phydev->duplex = cmd->duplex; | 300 | phydev->duplex = cmd->duplex; |
302 | 301 | ||
@@ -312,19 +311,18 @@ EXPORT_SYMBOL(phy_ethtool_sset); | |||
312 | int phy_ethtool_ksettings_set(struct phy_device *phydev, | 311 | int phy_ethtool_ksettings_set(struct phy_device *phydev, |
313 | const struct ethtool_link_ksettings *cmd) | 312 | const struct ethtool_link_ksettings *cmd) |
314 | { | 313 | { |
314 | __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); | ||
315 | u8 autoneg = cmd->base.autoneg; | 315 | u8 autoneg = cmd->base.autoneg; |
316 | u8 duplex = cmd->base.duplex; | 316 | u8 duplex = cmd->base.duplex; |
317 | u32 speed = cmd->base.speed; | 317 | u32 speed = cmd->base.speed; |
318 | u32 advertising; | ||
319 | 318 | ||
320 | if (cmd->base.phy_address != phydev->mdio.addr) | 319 | if (cmd->base.phy_address != phydev->mdio.addr) |
321 | return -EINVAL; | 320 | return -EINVAL; |
322 | 321 | ||
323 | ethtool_convert_link_mode_to_legacy_u32(&advertising, | 322 | linkmode_copy(advertising, cmd->link_modes.advertising); |
324 | cmd->link_modes.advertising); | ||
325 | 323 | ||
326 | /* We make sure that we don't pass unsupported values in to the PHY */ | 324 | /* We make sure that we don't pass unsupported values in to the PHY */ |
327 | advertising &= phydev->supported; | 325 | linkmode_and(advertising, advertising, phydev->supported); |
328 | 326 | ||
329 | /* Verify the settings we care about. */ | 327 | /* Verify the settings we care about. */ |
330 | if (autoneg != AUTONEG_ENABLE && autoneg != AUTONEG_DISABLE) | 328 | if (autoneg != AUTONEG_ENABLE && autoneg != AUTONEG_DISABLE) |
@@ -345,12 +343,14 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev, | |||
345 | 343 | ||
346 | phydev->speed = speed; | 344 | phydev->speed = speed; |
347 | 345 | ||
348 | phydev->advertising = advertising; | 346 | linkmode_copy(phydev->advertising, advertising); |
349 | 347 | ||
350 | if (autoneg == AUTONEG_ENABLE) | 348 | if (autoneg == AUTONEG_ENABLE) |
351 | phydev->advertising |= ADVERTISED_Autoneg; | 349 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
350 | phydev->advertising); | ||
352 | else | 351 | else |
353 | phydev->advertising &= ~ADVERTISED_Autoneg; | 352 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
353 | phydev->advertising); | ||
354 | 354 | ||
355 | phydev->duplex = duplex; | 355 | phydev->duplex = duplex; |
356 | 356 | ||
@@ -366,11 +366,8 @@ EXPORT_SYMBOL(phy_ethtool_ksettings_set); | |||
366 | void phy_ethtool_ksettings_get(struct phy_device *phydev, | 366 | void phy_ethtool_ksettings_get(struct phy_device *phydev, |
367 | struct ethtool_link_ksettings *cmd) | 367 | struct ethtool_link_ksettings *cmd) |
368 | { | 368 | { |
369 | ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, | 369 | linkmode_copy(cmd->link_modes.supported, phydev->supported); |
370 | phydev->supported); | 370 | linkmode_copy(cmd->link_modes.advertising, phydev->advertising); |
371 | |||
372 | ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising, | ||
373 | phydev->advertising); | ||
374 | 371 | ||
375 | ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising, | 372 | ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising, |
376 | phydev->lp_advertising); | 373 | phydev->lp_advertising); |
@@ -442,7 +439,8 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) | |||
442 | } | 439 | } |
443 | break; | 440 | break; |
444 | case MII_ADVERTISE: | 441 | case MII_ADVERTISE: |
445 | phydev->advertising = mii_adv_to_ethtool_adv_t(val); | 442 | mii_adv_to_linkmode_adv_t(phydev->advertising, |
443 | val); | ||
446 | change_autoneg = true; | 444 | change_autoneg = true; |
447 | break; | 445 | break; |
448 | default: | 446 | default: |
@@ -604,20 +602,38 @@ static int phy_poll_aneg_done(struct phy_device *phydev) | |||
604 | */ | 602 | */ |
605 | int phy_speed_down(struct phy_device *phydev, bool sync) | 603 | int phy_speed_down(struct phy_device *phydev, bool sync) |
606 | { | 604 | { |
607 | u32 adv = phydev->lp_advertising & phydev->supported; | 605 | __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old); |
608 | u32 adv_old = phydev->advertising; | 606 | __ETHTOOL_DECLARE_LINK_MODE_MASK(adv); |
609 | int ret; | 607 | int ret; |
610 | 608 | ||
611 | if (phydev->autoneg != AUTONEG_ENABLE) | 609 | if (phydev->autoneg != AUTONEG_ENABLE) |
612 | return 0; | 610 | return 0; |
613 | 611 | ||
614 | if (adv & PHY_10BT_FEATURES) | 612 | linkmode_copy(adv_old, phydev->advertising); |
615 | phydev->advertising &= ~(PHY_100BT_FEATURES | | 613 | ethtool_convert_legacy_u32_to_link_mode(adv, phydev->lp_advertising); |
616 | PHY_1000BT_FEATURES); | 614 | linkmode_and(adv, adv, phydev->supported); |
617 | else if (adv & PHY_100BT_FEATURES) | 615 | |
618 | phydev->advertising &= ~PHY_1000BT_FEATURES; | 616 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, adv) || |
617 | linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, adv)) { | ||
618 | linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, | ||
619 | phydev->advertising); | ||
620 | linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, | ||
621 | phydev->advertising); | ||
622 | linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, | ||
623 | phydev->advertising); | ||
624 | linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
625 | phydev->advertising); | ||
626 | } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, | ||
627 | adv) || | ||
628 | linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, | ||
629 | adv)) { | ||
630 | linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, | ||
631 | phydev->advertising); | ||
632 | linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
633 | phydev->advertising); | ||
634 | } | ||
619 | 635 | ||
620 | if (phydev->advertising == adv_old) | 636 | if (linkmode_equal(phydev->advertising, adv_old)) |
621 | return 0; | 637 | return 0; |
622 | 638 | ||
623 | ret = phy_config_aneg(phydev); | 639 | ret = phy_config_aneg(phydev); |
@@ -636,15 +652,30 @@ EXPORT_SYMBOL_GPL(phy_speed_down); | |||
636 | */ | 652 | */ |
637 | int phy_speed_up(struct phy_device *phydev) | 653 | int phy_speed_up(struct phy_device *phydev) |
638 | { | 654 | { |
639 | u32 mask = PHY_10BT_FEATURES | PHY_100BT_FEATURES | PHY_1000BT_FEATURES; | 655 | __ETHTOOL_DECLARE_LINK_MODE_MASK(all_speeds) = { 0, }; |
640 | u32 adv_old = phydev->advertising; | 656 | __ETHTOOL_DECLARE_LINK_MODE_MASK(not_speeds); |
657 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); | ||
658 | __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old); | ||
659 | __ETHTOOL_DECLARE_LINK_MODE_MASK(speeds); | ||
660 | |||
661 | linkmode_copy(adv_old, phydev->advertising); | ||
641 | 662 | ||
642 | if (phydev->autoneg != AUTONEG_ENABLE) | 663 | if (phydev->autoneg != AUTONEG_ENABLE) |
643 | return 0; | 664 | return 0; |
644 | 665 | ||
645 | phydev->advertising = (adv_old & ~mask) | (phydev->supported & mask); | 666 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, all_speeds); |
667 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, all_speeds); | ||
668 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, all_speeds); | ||
669 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, all_speeds); | ||
670 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, all_speeds); | ||
671 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, all_speeds); | ||
646 | 672 | ||
647 | if (phydev->advertising == adv_old) | 673 | linkmode_andnot(not_speeds, adv_old, all_speeds); |
674 | linkmode_copy(supported, phydev->supported); | ||
675 | linkmode_and(speeds, supported, all_speeds); | ||
676 | linkmode_or(phydev->advertising, not_speeds, speeds); | ||
677 | |||
678 | if (linkmode_equal(phydev->advertising, adv_old)) | ||
648 | return 0; | 679 | return 0; |
649 | 680 | ||
650 | return phy_config_aneg(phydev); | 681 | return phy_config_aneg(phydev); |
@@ -973,6 +1004,30 @@ void phy_mac_interrupt(struct phy_device *phydev) | |||
973 | } | 1004 | } |
974 | EXPORT_SYMBOL(phy_mac_interrupt); | 1005 | EXPORT_SYMBOL(phy_mac_interrupt); |
975 | 1006 | ||
1007 | static void mmd_eee_adv_to_linkmode(unsigned long *advertising, u16 eee_adv) | ||
1008 | { | ||
1009 | linkmode_zero(advertising); | ||
1010 | |||
1011 | if (eee_adv & MDIO_EEE_100TX) | ||
1012 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, | ||
1013 | advertising); | ||
1014 | if (eee_adv & MDIO_EEE_1000T) | ||
1015 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
1016 | advertising); | ||
1017 | if (eee_adv & MDIO_EEE_10GT) | ||
1018 | linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, | ||
1019 | advertising); | ||
1020 | if (eee_adv & MDIO_EEE_1000KX) | ||
1021 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT, | ||
1022 | advertising); | ||
1023 | if (eee_adv & MDIO_EEE_10GKX4) | ||
1024 | linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, | ||
1025 | advertising); | ||
1026 | if (eee_adv & MDIO_EEE_10GKR) | ||
1027 | linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, | ||
1028 | advertising); | ||
1029 | } | ||
1030 | |||
976 | /** | 1031 | /** |
977 | * phy_init_eee - init and check the EEE feature | 1032 | * phy_init_eee - init and check the EEE feature |
978 | * @phydev: target phy_device struct | 1033 | * @phydev: target phy_device struct |
@@ -991,9 +1046,12 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) | |||
991 | /* According to 802.3az,the EEE is supported only in full duplex-mode. | 1046 | /* According to 802.3az,the EEE is supported only in full duplex-mode. |
992 | */ | 1047 | */ |
993 | if (phydev->duplex == DUPLEX_FULL) { | 1048 | if (phydev->duplex == DUPLEX_FULL) { |
1049 | __ETHTOOL_DECLARE_LINK_MODE_MASK(common); | ||
1050 | __ETHTOOL_DECLARE_LINK_MODE_MASK(lp); | ||
1051 | __ETHTOOL_DECLARE_LINK_MODE_MASK(adv); | ||
994 | int eee_lp, eee_cap, eee_adv; | 1052 | int eee_lp, eee_cap, eee_adv; |
995 | u32 lp, cap, adv; | ||
996 | int status; | 1053 | int status; |
1054 | u32 cap; | ||
997 | 1055 | ||
998 | /* Read phy status to properly get the right settings */ | 1056 | /* Read phy status to properly get the right settings */ |
999 | status = phy_read_status(phydev); | 1057 | status = phy_read_status(phydev); |
@@ -1020,9 +1078,11 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) | |||
1020 | if (eee_adv <= 0) | 1078 | if (eee_adv <= 0) |
1021 | goto eee_exit_err; | 1079 | goto eee_exit_err; |
1022 | 1080 | ||
1023 | adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv); | 1081 | mmd_eee_adv_to_linkmode(adv, eee_adv); |
1024 | lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp); | 1082 | mmd_eee_adv_to_linkmode(lp, eee_lp); |
1025 | if (!phy_check_valid(phydev->speed, phydev->duplex, lp & adv)) | 1083 | linkmode_and(common, adv, lp); |
1084 | |||
1085 | if (!phy_check_valid(phydev->speed, phydev->duplex, common)) | ||
1026 | goto eee_exit_err; | 1086 | goto eee_exit_err; |
1027 | 1087 | ||
1028 | if (clk_stop_enable) { | 1088 | if (clk_stop_enable) { |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 0f56d408b033..09a1c2d835b2 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -66,10 +66,12 @@ static const int phy_basic_ports_array[] = { | |||
66 | ETHTOOL_LINK_MODE_TP_BIT, | 66 | ETHTOOL_LINK_MODE_TP_BIT, |
67 | ETHTOOL_LINK_MODE_MII_BIT, | 67 | ETHTOOL_LINK_MODE_MII_BIT, |
68 | }; | 68 | }; |
69 | EXPORT_SYMBOL_GPL(phy_basic_ports_array); | ||
69 | 70 | ||
70 | static const int phy_fibre_port_array[] = { | 71 | static const int phy_fibre_port_array[] = { |
71 | ETHTOOL_LINK_MODE_FIBRE_BIT, | 72 | ETHTOOL_LINK_MODE_FIBRE_BIT, |
72 | }; | 73 | }; |
74 | EXPORT_SYMBOL_GPL(phy_fibre_port_array); | ||
73 | 75 | ||
74 | static const int phy_all_ports_features_array[] = { | 76 | static const int phy_all_ports_features_array[] = { |
75 | ETHTOOL_LINK_MODE_Autoneg_BIT, | 77 | ETHTOOL_LINK_MODE_Autoneg_BIT, |
@@ -80,27 +82,32 @@ static const int phy_all_ports_features_array[] = { | |||
80 | ETHTOOL_LINK_MODE_BNC_BIT, | 82 | ETHTOOL_LINK_MODE_BNC_BIT, |
81 | ETHTOOL_LINK_MODE_Backplane_BIT, | 83 | ETHTOOL_LINK_MODE_Backplane_BIT, |
82 | }; | 84 | }; |
85 | EXPORT_SYMBOL_GPL(phy_all_ports_features_array); | ||
83 | 86 | ||
84 | static const int phy_10_100_features_array[] = { | 87 | const int phy_10_100_features_array[4] = { |
85 | ETHTOOL_LINK_MODE_10baseT_Half_BIT, | 88 | ETHTOOL_LINK_MODE_10baseT_Half_BIT, |
86 | ETHTOOL_LINK_MODE_10baseT_Full_BIT, | 89 | ETHTOOL_LINK_MODE_10baseT_Full_BIT, |
87 | ETHTOOL_LINK_MODE_100baseT_Half_BIT, | 90 | ETHTOOL_LINK_MODE_100baseT_Half_BIT, |
88 | ETHTOOL_LINK_MODE_100baseT_Full_BIT, | 91 | ETHTOOL_LINK_MODE_100baseT_Full_BIT, |
89 | }; | 92 | }; |
93 | EXPORT_SYMBOL_GPL(phy_10_100_features_array); | ||
90 | 94 | ||
91 | static const int phy_basic_t1_features_array[] = { | 95 | const int phy_basic_t1_features_array[2] = { |
92 | ETHTOOL_LINK_MODE_TP_BIT, | 96 | ETHTOOL_LINK_MODE_TP_BIT, |
93 | ETHTOOL_LINK_MODE_100baseT_Full_BIT, | 97 | ETHTOOL_LINK_MODE_100baseT_Full_BIT, |
94 | }; | 98 | }; |
99 | EXPORT_SYMBOL_GPL(phy_basic_t1_features_array); | ||
95 | 100 | ||
96 | static const int phy_gbit_features_array[] = { | 101 | const int phy_gbit_features_array[2] = { |
97 | ETHTOOL_LINK_MODE_1000baseT_Half_BIT, | 102 | ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
98 | ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | 103 | ETHTOOL_LINK_MODE_1000baseT_Full_BIT, |
99 | }; | 104 | }; |
105 | EXPORT_SYMBOL_GPL(phy_gbit_features_array); | ||
100 | 106 | ||
101 | static const int phy_10gbit_features_array[] = { | 107 | const int phy_10gbit_features_array[1] = { |
102 | ETHTOOL_LINK_MODE_10000baseT_Full_BIT, | 108 | ETHTOOL_LINK_MODE_10000baseT_Full_BIT, |
103 | }; | 109 | }; |
110 | EXPORT_SYMBOL_GPL(phy_10gbit_features_array); | ||
104 | 111 | ||
105 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; | 112 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; |
106 | EXPORT_SYMBOL_GPL(phy_10gbit_full_features); | 113 | EXPORT_SYMBOL_GPL(phy_10gbit_full_features); |
@@ -1441,8 +1448,13 @@ static int genphy_config_advert(struct phy_device *phydev) | |||
1441 | int err, changed = 0; | 1448 | int err, changed = 0; |
1442 | 1449 | ||
1443 | /* Only allow advertising what this PHY supports */ | 1450 | /* Only allow advertising what this PHY supports */ |
1444 | phydev->advertising &= phydev->supported; | 1451 | linkmode_and(phydev->advertising, phydev->advertising, |
1445 | advertise = phydev->advertising; | 1452 | phydev->supported); |
1453 | if (!ethtool_convert_link_mode_to_legacy_u32(&advertise, | ||
1454 | phydev->advertising)) | ||
1455 | phydev_warn(phydev, "PHY advertising (%*pb) more modes than genphy supports, some modes not advertised.\n", | ||
1456 | __ETHTOOL_LINK_MODE_MASK_NBITS, | ||
1457 | phydev->advertising); | ||
1446 | 1458 | ||
1447 | /* Setup standard advertisement */ | 1459 | /* Setup standard advertisement */ |
1448 | adv = phy_read(phydev, MII_ADVERTISE); | 1460 | adv = phy_read(phydev, MII_ADVERTISE); |
@@ -1481,10 +1493,11 @@ static int genphy_config_advert(struct phy_device *phydev) | |||
1481 | oldadv = adv; | 1493 | oldadv = adv; |
1482 | adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); | 1494 | adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); |
1483 | 1495 | ||
1484 | if (phydev->supported & (SUPPORTED_1000baseT_Half | | 1496 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1485 | SUPPORTED_1000baseT_Full)) { | 1497 | phydev->supported) || |
1498 | linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
1499 | phydev->supported)) | ||
1486 | adv |= ethtool_adv_to_mii_ctrl1000_t(advertise); | 1500 | adv |= ethtool_adv_to_mii_ctrl1000_t(advertise); |
1487 | } | ||
1488 | 1501 | ||
1489 | if (adv != oldadv) | 1502 | if (adv != oldadv) |
1490 | changed = 1; | 1503 | changed = 1; |
@@ -1692,8 +1705,10 @@ int genphy_read_status(struct phy_device *phydev) | |||
1692 | phydev->lp_advertising = 0; | 1705 | phydev->lp_advertising = 0; |
1693 | 1706 | ||
1694 | if (AUTONEG_ENABLE == phydev->autoneg) { | 1707 | if (AUTONEG_ENABLE == phydev->autoneg) { |
1695 | if (phydev->supported & (SUPPORTED_1000baseT_Half | 1708 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1696 | | SUPPORTED_1000baseT_Full)) { | 1709 | phydev->supported) || |
1710 | linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
1711 | phydev->supported)) { | ||
1697 | lpagb = phy_read(phydev, MII_STAT1000); | 1712 | lpagb = phy_read(phydev, MII_STAT1000); |
1698 | if (lpagb < 0) | 1713 | if (lpagb < 0) |
1699 | return lpagb; | 1714 | return lpagb; |
@@ -1800,11 +1815,13 @@ EXPORT_SYMBOL(genphy_soft_reset); | |||
1800 | int genphy_config_init(struct phy_device *phydev) | 1815 | int genphy_config_init(struct phy_device *phydev) |
1801 | { | 1816 | { |
1802 | int val; | 1817 | int val; |
1803 | u32 features; | 1818 | __ETHTOOL_DECLARE_LINK_MODE_MASK(features) = { 0, }; |
1804 | 1819 | ||
1805 | features = (SUPPORTED_TP | SUPPORTED_MII | 1820 | linkmode_set_bit_array(phy_basic_ports_array, |
1806 | | SUPPORTED_AUI | SUPPORTED_FIBRE | | 1821 | ARRAY_SIZE(phy_basic_ports_array), |
1807 | SUPPORTED_BNC | SUPPORTED_Pause | SUPPORTED_Asym_Pause); | 1822 | features); |
1823 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, features); | ||
1824 | linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, features); | ||
1808 | 1825 | ||
1809 | /* Do we support autonegotiation? */ | 1826 | /* Do we support autonegotiation? */ |
1810 | val = phy_read(phydev, MII_BMSR); | 1827 | val = phy_read(phydev, MII_BMSR); |
@@ -1812,16 +1829,16 @@ int genphy_config_init(struct phy_device *phydev) | |||
1812 | return val; | 1829 | return val; |
1813 | 1830 | ||
1814 | if (val & BMSR_ANEGCAPABLE) | 1831 | if (val & BMSR_ANEGCAPABLE) |
1815 | features |= SUPPORTED_Autoneg; | 1832 | linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, features); |
1816 | 1833 | ||
1817 | if (val & BMSR_100FULL) | 1834 | if (val & BMSR_100FULL) |
1818 | features |= SUPPORTED_100baseT_Full; | 1835 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, features); |
1819 | if (val & BMSR_100HALF) | 1836 | if (val & BMSR_100HALF) |
1820 | features |= SUPPORTED_100baseT_Half; | 1837 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, features); |
1821 | if (val & BMSR_10FULL) | 1838 | if (val & BMSR_10FULL) |
1822 | features |= SUPPORTED_10baseT_Full; | 1839 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, features); |
1823 | if (val & BMSR_10HALF) | 1840 | if (val & BMSR_10HALF) |
1824 | features |= SUPPORTED_10baseT_Half; | 1841 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, features); |
1825 | 1842 | ||
1826 | if (val & BMSR_ESTATEN) { | 1843 | if (val & BMSR_ESTATEN) { |
1827 | val = phy_read(phydev, MII_ESTATUS); | 1844 | val = phy_read(phydev, MII_ESTATUS); |
@@ -1829,13 +1846,15 @@ int genphy_config_init(struct phy_device *phydev) | |||
1829 | return val; | 1846 | return val; |
1830 | 1847 | ||
1831 | if (val & ESTATUS_1000_TFULL) | 1848 | if (val & ESTATUS_1000_TFULL) |
1832 | features |= SUPPORTED_1000baseT_Full; | 1849 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, |
1850 | features); | ||
1833 | if (val & ESTATUS_1000_THALF) | 1851 | if (val & ESTATUS_1000_THALF) |
1834 | features |= SUPPORTED_1000baseT_Half; | 1852 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1853 | features); | ||
1835 | } | 1854 | } |
1836 | 1855 | ||
1837 | phydev->supported &= features; | 1856 | linkmode_and(phydev->supported, phydev->supported, features); |
1838 | phydev->advertising &= features; | 1857 | linkmode_and(phydev->advertising, phydev->advertising, features); |
1839 | 1858 | ||
1840 | return 0; | 1859 | return 0; |
1841 | } | 1860 | } |
@@ -1879,20 +1898,37 @@ EXPORT_SYMBOL(genphy_loopback); | |||
1879 | 1898 | ||
1880 | static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) | 1899 | static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) |
1881 | { | 1900 | { |
1882 | phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES | | 1901 | __ETHTOOL_DECLARE_LINK_MODE_MASK(speeds) = { 0, }; |
1883 | PHY_10BT_FEATURES); | 1902 | |
1903 | linkmode_set_bit_array(phy_10_100_features_array, | ||
1904 | ARRAY_SIZE(phy_10_100_features_array), | ||
1905 | speeds); | ||
1906 | linkmode_set_bit_array(phy_gbit_features_array, | ||
1907 | ARRAY_SIZE(phy_gbit_features_array), | ||
1908 | speeds); | ||
1909 | |||
1910 | linkmode_andnot(phydev->supported, phydev->supported, speeds); | ||
1884 | 1911 | ||
1885 | switch (max_speed) { | 1912 | switch (max_speed) { |
1886 | default: | 1913 | default: |
1887 | return -ENOTSUPP; | 1914 | return -ENOTSUPP; |
1888 | case SPEED_1000: | 1915 | case SPEED_1000: |
1889 | phydev->supported |= PHY_1000BT_FEATURES; | 1916 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
1917 | phydev->supported); | ||
1918 | linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, | ||
1919 | phydev->supported); | ||
1890 | /* fall through */ | 1920 | /* fall through */ |
1891 | case SPEED_100: | 1921 | case SPEED_100: |
1892 | phydev->supported |= PHY_100BT_FEATURES; | 1922 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, |
1923 | phydev->supported); | ||
1924 | linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, | ||
1925 | phydev->supported); | ||
1893 | /* fall through */ | 1926 | /* fall through */ |
1894 | case SPEED_10: | 1927 | case SPEED_10: |
1895 | phydev->supported |= PHY_10BT_FEATURES; | 1928 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, |
1929 | phydev->supported); | ||
1930 | linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, | ||
1931 | phydev->supported); | ||
1896 | } | 1932 | } |
1897 | 1933 | ||
1898 | return 0; | 1934 | return 0; |
@@ -1906,7 +1942,7 @@ int phy_set_max_speed(struct phy_device *phydev, u32 max_speed) | |||
1906 | if (err) | 1942 | if (err) |
1907 | return err; | 1943 | return err; |
1908 | 1944 | ||
1909 | phydev->advertising = phydev->supported; | 1945 | linkmode_copy(phydev->advertising, phydev->supported); |
1910 | 1946 | ||
1911 | return 0; | 1947 | return 0; |
1912 | } | 1948 | } |
@@ -1923,10 +1959,8 @@ EXPORT_SYMBOL(phy_set_max_speed); | |||
1923 | */ | 1959 | */ |
1924 | void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) | 1960 | void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) |
1925 | { | 1961 | { |
1926 | WARN_ON(link_mode > 31); | 1962 | linkmode_clear_bit(link_mode, phydev->supported); |
1927 | 1963 | linkmode_copy(phydev->advertising, phydev->supported); | |
1928 | phydev->supported &= ~BIT(link_mode); | ||
1929 | phydev->advertising = phydev->supported; | ||
1930 | } | 1964 | } |
1931 | EXPORT_SYMBOL(phy_remove_link_mode); | 1965 | EXPORT_SYMBOL(phy_remove_link_mode); |
1932 | 1966 | ||
@@ -1939,9 +1973,9 @@ EXPORT_SYMBOL(phy_remove_link_mode); | |||
1939 | */ | 1973 | */ |
1940 | void phy_support_sym_pause(struct phy_device *phydev) | 1974 | void phy_support_sym_pause(struct phy_device *phydev) |
1941 | { | 1975 | { |
1942 | phydev->supported &= ~SUPPORTED_Asym_Pause; | 1976 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); |
1943 | phydev->supported |= SUPPORTED_Pause; | 1977 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); |
1944 | phydev->advertising = phydev->supported; | 1978 | linkmode_copy(phydev->advertising, phydev->supported); |
1945 | } | 1979 | } |
1946 | EXPORT_SYMBOL(phy_support_sym_pause); | 1980 | EXPORT_SYMBOL(phy_support_sym_pause); |
1947 | 1981 | ||
@@ -1953,8 +1987,9 @@ EXPORT_SYMBOL(phy_support_sym_pause); | |||
1953 | */ | 1987 | */ |
1954 | void phy_support_asym_pause(struct phy_device *phydev) | 1988 | void phy_support_asym_pause(struct phy_device *phydev) |
1955 | { | 1989 | { |
1956 | phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; | 1990 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); |
1957 | phydev->advertising = phydev->supported; | 1991 | linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); |
1992 | linkmode_copy(phydev->advertising, phydev->supported); | ||
1958 | } | 1993 | } |
1959 | EXPORT_SYMBOL(phy_support_asym_pause); | 1994 | EXPORT_SYMBOL(phy_support_asym_pause); |
1960 | 1995 | ||
@@ -1972,12 +2007,13 @@ EXPORT_SYMBOL(phy_support_asym_pause); | |||
1972 | void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, | 2007 | void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, |
1973 | bool autoneg) | 2008 | bool autoneg) |
1974 | { | 2009 | { |
1975 | phydev->supported &= ~SUPPORTED_Pause; | 2010 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); |
1976 | 2011 | ||
1977 | if (rx && tx && autoneg) | 2012 | if (rx && tx && autoneg) |
1978 | phydev->supported |= SUPPORTED_Pause; | 2013 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2014 | phydev->supported); | ||
1979 | 2015 | ||
1980 | phydev->advertising = phydev->supported; | 2016 | linkmode_copy(phydev->advertising, phydev->supported); |
1981 | } | 2017 | } |
1982 | EXPORT_SYMBOL(phy_set_sym_pause); | 2018 | EXPORT_SYMBOL(phy_set_sym_pause); |
1983 | 2019 | ||
@@ -1994,20 +2030,29 @@ EXPORT_SYMBOL(phy_set_sym_pause); | |||
1994 | */ | 2030 | */ |
1995 | void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) | 2031 | void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) |
1996 | { | 2032 | { |
1997 | u16 oldadv = phydev->advertising; | 2033 | __ETHTOOL_DECLARE_LINK_MODE_MASK(oldadv); |
1998 | u16 newadv = oldadv &= ~(SUPPORTED_Pause | SUPPORTED_Asym_Pause); | ||
1999 | 2034 | ||
2000 | if (rx) | 2035 | linkmode_copy(oldadv, phydev->advertising); |
2001 | newadv |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; | ||
2002 | if (tx) | ||
2003 | newadv ^= SUPPORTED_Asym_Pause; | ||
2004 | 2036 | ||
2005 | if (oldadv != newadv) { | 2037 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2006 | phydev->advertising = newadv; | 2038 | phydev->advertising); |
2039 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2040 | phydev->advertising); | ||
2007 | 2041 | ||
2008 | if (phydev->autoneg) | 2042 | if (rx) { |
2009 | phy_start_aneg(phydev); | 2043 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2044 | phydev->advertising); | ||
2045 | linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2046 | phydev->advertising); | ||
2010 | } | 2047 | } |
2048 | |||
2049 | if (tx) | ||
2050 | linkmode_change_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2051 | phydev->advertising); | ||
2052 | |||
2053 | if (!linkmode_equal(oldadv, phydev->advertising) && | ||
2054 | phydev->autoneg) | ||
2055 | phy_start_aneg(phydev); | ||
2011 | } | 2056 | } |
2012 | EXPORT_SYMBOL(phy_set_asym_pause); | 2057 | EXPORT_SYMBOL(phy_set_asym_pause); |
2013 | 2058 | ||
@@ -2023,8 +2068,10 @@ EXPORT_SYMBOL(phy_set_asym_pause); | |||
2023 | bool phy_validate_pause(struct phy_device *phydev, | 2068 | bool phy_validate_pause(struct phy_device *phydev, |
2024 | struct ethtool_pauseparam *pp) | 2069 | struct ethtool_pauseparam *pp) |
2025 | { | 2070 | { |
2026 | if (!(phydev->supported & SUPPORTED_Pause) || | 2071 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2027 | (!(phydev->supported & SUPPORTED_Asym_Pause) && | 2072 | phydev->supported) || |
2073 | (!linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2074 | phydev->supported) && | ||
2028 | pp->rx_pause != pp->tx_pause)) | 2075 | pp->rx_pause != pp->tx_pause)) |
2029 | return false; | 2076 | return false; |
2030 | return true; | 2077 | return true; |
@@ -2112,9 +2159,9 @@ static int phy_probe(struct device *dev) | |||
2112 | * or both of these values | 2159 | * or both of these values |
2113 | */ | 2160 | */ |
2114 | ethtool_convert_link_mode_to_legacy_u32(&features, phydrv->features); | 2161 | ethtool_convert_link_mode_to_legacy_u32(&features, phydrv->features); |
2115 | phydev->supported = features; | 2162 | linkmode_copy(phydev->supported, phydrv->features); |
2116 | of_set_phy_supported(phydev); | 2163 | of_set_phy_supported(phydev); |
2117 | phydev->advertising = phydev->supported; | 2164 | linkmode_copy(phydev->advertising, phydev->supported); |
2118 | 2165 | ||
2119 | /* Get the EEE modes we want to prohibit. We will ask | 2166 | /* Get the EEE modes we want to prohibit. We will ask |
2120 | * the PHY stop advertising these mode later on | 2167 | * the PHY stop advertising these mode later on |
@@ -2134,14 +2181,22 @@ static int phy_probe(struct device *dev) | |||
2134 | */ | 2181 | */ |
2135 | if (test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydrv->features) || | 2182 | if (test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydrv->features) || |
2136 | test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydrv->features)) { | 2183 | test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydrv->features)) { |
2137 | phydev->supported &= ~(SUPPORTED_Pause | SUPPORTED_Asym_Pause); | 2184 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2185 | phydev->supported); | ||
2186 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2187 | phydev->supported); | ||
2138 | if (test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydrv->features)) | 2188 | if (test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydrv->features)) |
2139 | phydev->supported |= SUPPORTED_Pause; | 2189 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2190 | phydev->supported); | ||
2140 | if (test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | 2191 | if (test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, |
2141 | phydrv->features)) | 2192 | phydrv->features)) |
2142 | phydev->supported |= SUPPORTED_Asym_Pause; | 2193 | linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, |
2194 | phydev->supported); | ||
2143 | } else { | 2195 | } else { |
2144 | phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; | 2196 | linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2197 | phydev->supported); | ||
2198 | linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2199 | phydev->supported); | ||
2145 | } | 2200 | } |
2146 | 2201 | ||
2147 | /* Set the state to READY by default */ | 2202 | /* Set the state to READY by default */ |
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index 9b8dd0d0ee42..e7becc7379d7 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c | |||
@@ -191,8 +191,7 @@ static int phylink_parse_fixedlink(struct phylink *pl, | |||
191 | phylink_validate(pl, pl->supported, &pl->link_config); | 191 | phylink_validate(pl, pl->supported, &pl->link_config); |
192 | 192 | ||
193 | s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, | 193 | s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, |
194 | pl->supported, | 194 | pl->supported, true); |
195 | __ETHTOOL_LINK_MODE_MASK_NBITS, true); | ||
196 | linkmode_zero(pl->supported); | 195 | linkmode_zero(pl->supported); |
197 | phylink_set(pl->supported, MII); | 196 | phylink_set(pl->supported, MII); |
198 | if (s) { | 197 | if (s) { |
@@ -634,13 +633,11 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy) | |||
634 | { | 633 | { |
635 | struct phylink_link_state config; | 634 | struct phylink_link_state config; |
636 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); | 635 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); |
637 | u32 advertising; | ||
638 | int ret; | 636 | int ret; |
639 | 637 | ||
640 | memset(&config, 0, sizeof(config)); | 638 | memset(&config, 0, sizeof(config)); |
641 | ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported); | 639 | linkmode_copy(supported, phy->supported); |
642 | ethtool_convert_legacy_u32_to_link_mode(config.advertising, | 640 | linkmode_copy(config.advertising, phy->advertising); |
643 | phy->advertising); | ||
644 | config.interface = pl->link_config.interface; | 641 | config.interface = pl->link_config.interface; |
645 | 642 | ||
646 | /* | 643 | /* |
@@ -673,15 +670,14 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy) | |||
673 | linkmode_copy(pl->link_config.advertising, config.advertising); | 670 | linkmode_copy(pl->link_config.advertising, config.advertising); |
674 | 671 | ||
675 | /* Restrict the phy advertisement according to the MAC support. */ | 672 | /* Restrict the phy advertisement according to the MAC support. */ |
676 | ethtool_convert_link_mode_to_legacy_u32(&advertising, config.advertising); | 673 | linkmode_copy(phy->advertising, config.advertising); |
677 | phy->advertising = advertising; | ||
678 | mutex_unlock(&pl->state_mutex); | 674 | mutex_unlock(&pl->state_mutex); |
679 | mutex_unlock(&phy->lock); | 675 | mutex_unlock(&phy->lock); |
680 | 676 | ||
681 | netdev_dbg(pl->netdev, | 677 | netdev_dbg(pl->netdev, |
682 | "phy: setting supported %*pb advertising 0x%08x\n", | 678 | "phy: setting supported %*pb advertising %*pb\n", |
683 | __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, | 679 | __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, |
684 | phy->advertising); | 680 | __ETHTOOL_LINK_MODE_MASK_NBITS, phy->advertising); |
685 | 681 | ||
686 | phy_start_machine(phy); | 682 | phy_start_machine(phy); |
687 | if (phy->irq > 0) | 683 | if (phy->irq > 0) |
@@ -1088,8 +1084,7 @@ int phylink_ethtool_ksettings_set(struct phylink *pl, | |||
1088 | * duplex. | 1084 | * duplex. |
1089 | */ | 1085 | */ |
1090 | s = phy_lookup_setting(kset->base.speed, kset->base.duplex, | 1086 | s = phy_lookup_setting(kset->base.speed, kset->base.duplex, |
1091 | pl->supported, | 1087 | pl->supported, false); |
1092 | __ETHTOOL_LINK_MODE_MASK_NBITS, false); | ||
1093 | if (!s) | 1088 | if (!s) |
1094 | return -EINVAL; | 1089 | return -EINVAL; |
1095 | 1090 | ||
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index be1917be28f2..3c8bdac78866 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/if_vlan.h> | 14 | #include <linux/if_vlan.h> |
15 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
16 | #include <linux/linkmode.h> | ||
16 | #include <linux/list.h> | 17 | #include <linux/list.h> |
17 | #include <linux/ip.h> | 18 | #include <linux/ip.h> |
18 | #include <linux/ipv6.h> | 19 | #include <linux/ipv6.h> |
@@ -1586,18 +1587,17 @@ static int lan78xx_set_pause(struct net_device *net, | |||
1586 | dev->fc_request_control |= FLOW_CTRL_TX; | 1587 | dev->fc_request_control |= FLOW_CTRL_TX; |
1587 | 1588 | ||
1588 | if (ecmd.base.autoneg) { | 1589 | if (ecmd.base.autoneg) { |
1590 | __ETHTOOL_DECLARE_LINK_MODE_MASK(fc) = { 0, }; | ||
1589 | u32 mii_adv; | 1591 | u32 mii_adv; |
1590 | u32 advertising; | ||
1591 | 1592 | ||
1592 | ethtool_convert_link_mode_to_legacy_u32( | 1593 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
1593 | &advertising, ecmd.link_modes.advertising); | 1594 | ecmd.link_modes.advertising); |
1594 | 1595 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | |
1595 | advertising &= ~(ADVERTISED_Pause | ADVERTISED_Asym_Pause); | 1596 | ecmd.link_modes.advertising); |
1596 | mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); | 1597 | mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); |
1597 | advertising |= mii_adv_to_ethtool_adv_t(mii_adv); | 1598 | mii_adv_to_linkmode_adv_t(fc, mii_adv); |
1598 | 1599 | linkmode_or(ecmd.link_modes.advertising, fc, | |
1599 | ethtool_convert_legacy_u32_to_link_mode( | 1600 | ecmd.link_modes.advertising); |
1600 | ecmd.link_modes.advertising, advertising); | ||
1601 | 1601 | ||
1602 | phy_ethtool_ksettings_set(phydev, &ecmd); | 1602 | phy_ethtool_ksettings_set(phydev, &ecmd); |
1603 | } | 1603 | } |
@@ -2095,6 +2095,7 @@ static struct phy_device *lan7801_phy_init(struct lan78xx_net *dev) | |||
2095 | 2095 | ||
2096 | static int lan78xx_phy_init(struct lan78xx_net *dev) | 2096 | static int lan78xx_phy_init(struct lan78xx_net *dev) |
2097 | { | 2097 | { |
2098 | __ETHTOOL_DECLARE_LINK_MODE_MASK(fc) = { 0, }; | ||
2098 | int ret; | 2099 | int ret; |
2099 | u32 mii_adv; | 2100 | u32 mii_adv; |
2100 | struct phy_device *phydev; | 2101 | struct phy_device *phydev; |
@@ -2158,9 +2159,13 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) | |||
2158 | 2159 | ||
2159 | /* support both flow controls */ | 2160 | /* support both flow controls */ |
2160 | dev->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX); | 2161 | dev->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX); |
2161 | phydev->advertising &= ~(ADVERTISED_Pause | ADVERTISED_Asym_Pause); | 2162 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
2163 | phydev->advertising); | ||
2164 | linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
2165 | phydev->advertising); | ||
2162 | mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); | 2166 | mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); |
2163 | phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv); | 2167 | mii_adv_to_linkmode_adv_t(fc, mii_adv); |
2168 | linkmode_or(phydev->advertising, fc, phydev->advertising); | ||
2164 | 2169 | ||
2165 | if (phydev->mdio.dev.of_node) { | 2170 | if (phydev->mdio.dev.of_node) { |
2166 | u32 reg; | 2171 | u32 reg; |
diff --git a/include/linux/mii.h b/include/linux/mii.h index 2da85b02e1c0..aaa458bbef2a 100644 --- a/include/linux/mii.h +++ b/include/linux/mii.h | |||
@@ -385,19 +385,21 @@ static inline void mii_adv_to_linkmode_adv_t(unsigned long *advertising, | |||
385 | } | 385 | } |
386 | 386 | ||
387 | /** | 387 | /** |
388 | * ethtool_adv_to_lcl_adv_t | 388 | * linkmode_adv_to_lcl_adv_t |
389 | * @advertising:pointer to ethtool advertising | 389 | * @advertising:pointer to linkmode advertising |
390 | * | 390 | * |
391 | * A small helper function that translates ethtool advertising to LVL | 391 | * A small helper function that translates linkmode advertising to LVL |
392 | * pause capabilities. | 392 | * pause capabilities. |
393 | */ | 393 | */ |
394 | static inline u32 ethtool_adv_to_lcl_adv_t(u32 advertising) | 394 | static inline u32 linkmode_adv_to_lcl_adv_t(unsigned long *advertising) |
395 | { | 395 | { |
396 | u32 lcl_adv = 0; | 396 | u32 lcl_adv = 0; |
397 | 397 | ||
398 | if (advertising & ADVERTISED_Pause) | 398 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
399 | advertising)) | ||
399 | lcl_adv |= ADVERTISE_PAUSE_CAP; | 400 | lcl_adv |= ADVERTISE_PAUSE_CAP; |
400 | if (advertising & ADVERTISED_Asym_Pause) | 401 | if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
402 | advertising)) | ||
401 | lcl_adv |= ADVERTISE_PAUSE_ASYM; | 403 | lcl_adv |= ADVERTISE_PAUSE_ASYM; |
402 | 404 | ||
403 | return lcl_adv; | 405 | return lcl_adv; |
diff --git a/include/linux/phy.h b/include/linux/phy.h index a5bcb4aaa48e..cbc66ac3b560 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
@@ -58,6 +58,11 @@ extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_ini | |||
58 | #define PHY_10GBIT_FEATURES ((unsigned long *)&phy_10gbit_features) | 58 | #define PHY_10GBIT_FEATURES ((unsigned long *)&phy_10gbit_features) |
59 | #define PHY_10GBIT_FULL_FEATURES ((unsigned long *)&phy_10gbit_full_features) | 59 | #define PHY_10GBIT_FULL_FEATURES ((unsigned long *)&phy_10gbit_full_features) |
60 | 60 | ||
61 | extern const int phy_10_100_features_array[4]; | ||
62 | extern const int phy_basic_t1_features_array[2]; | ||
63 | extern const int phy_gbit_features_array[2]; | ||
64 | extern const int phy_10gbit_features_array[1]; | ||
65 | |||
61 | /* | 66 | /* |
62 | * Set phydev->irq to PHY_POLL if interrupts are not supported, | 67 | * Set phydev->irq to PHY_POLL if interrupts are not supported, |
63 | * or not desired for this PHY. Set to PHY_IGNORE_INTERRUPT if | 68 | * or not desired for this PHY. Set to PHY_IGNORE_INTERRUPT if |
@@ -405,10 +410,11 @@ struct phy_device { | |||
405 | int pause; | 410 | int pause; |
406 | int asym_pause; | 411 | int asym_pause; |
407 | 412 | ||
408 | /* Union of PHY and Attached devices' supported modes */ | 413 | /* Union of PHY and Attached devices' supported link modes */ |
409 | /* See mii.h for more info */ | 414 | /* See ethtool.h for more info */ |
410 | u32 supported; | 415 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); |
411 | u32 advertising; | 416 | __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); |
417 | |||
412 | u32 lp_advertising; | 418 | u32 lp_advertising; |
413 | 419 | ||
414 | /* Energy efficient ethernet modes which should be prohibited */ | 420 | /* Energy efficient ethernet modes which should be prohibited */ |
@@ -660,9 +666,9 @@ struct phy_setting { | |||
660 | 666 | ||
661 | const struct phy_setting * | 667 | const struct phy_setting * |
662 | phy_lookup_setting(int speed, int duplex, const unsigned long *mask, | 668 | phy_lookup_setting(int speed, int duplex, const unsigned long *mask, |
663 | size_t maxbit, bool exact); | 669 | bool exact); |
664 | size_t phy_speeds(unsigned int *speeds, size_t size, | 670 | size_t phy_speeds(unsigned int *speeds, size_t size, |
665 | unsigned long *mask, size_t maxbit); | 671 | unsigned long *mask); |
666 | 672 | ||
667 | void phy_resolve_aneg_linkmode(struct phy_device *phydev); | 673 | void phy_resolve_aneg_linkmode(struct phy_device *phydev); |
668 | 674 | ||