summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2018-11-10 17:43:33 -0500
committerDavid S. Miller <davem@davemloft.net>2018-11-11 13:10:01 -0500
commit3c1bcc8614db10803f1f57ef0295363917448cb2 (patch)
tree431ae141dae05b86ff2e3f39406436c1d9721a63
parent899a3cbbf77a2a3d6d53d67ff6f10ad59eb03605 (diff)
net: ethernet: Convert phydev advertize and supported from u32 to link mode
There are a few MAC/PHYs combinations which now support > 1Gbps. These may need to make use of link modes with bits > 31. Thus their supported PHY features or advertised features cannot be implemented using the current bitmap in a u32. Convert to using a linkmode bitmap, which can support all the currently devices link modes, and is future proof as more modes are added. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/dsa/mt7530.c3
-rw-r--r--drivers/net/ethernet/aeroflex/greth.c2
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c41
-rw-r--r--drivers/net/ethernet/apm/xgene-v2/mdio.c22
-rw-r--r--drivers/net/ethernet/arc/emac_main.c3
-rw-r--r--drivers/net/ethernet/broadcom/b44.c12
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c5
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c44
-rw-r--r--drivers/net/ethernet/cavium/octeon/octeon_mgmt.c7
-rw-r--r--drivers/net/ethernet/freescale/dpaa/dpaa_eth.c5
-rw-r--r--drivers/net/ethernet/freescale/fman/mac.c2
-rw-r--r--drivers/net/ethernet/freescale/gianfar.c18
-rw-r--r--drivers/net/ethernet/freescale/ucc_geth.c7
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_enet.c6
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c2
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c13
-rw-r--r--drivers/net/ethernet/ibm/emac/core.c9
-rw-r--r--drivers/net/ethernet/marvell/mv643xx_eth.c21
-rw-r--r--drivers/net/ethernet/mediatek/mtk_eth_soc.c7
-rw-r--r--drivers/net/ethernet/nxp/lpc_eth.c2
-rw-r--r--drivers/net/ethernet/realtek/r8169.c2
-rw-r--r--drivers/net/ethernet/socionext/sni_ave.c2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c12
-rw-r--r--drivers/net/ethernet/toshiba/tc35815.c29
-rw-r--r--drivers/net/phy/aquantia.c9
-rw-r--r--drivers/net/phy/bcm63xx.c2
-rw-r--r--drivers/net/phy/bcm87xx.c8
-rw-r--r--drivers/net/phy/fixed_phy.c19
-rw-r--r--drivers/net/phy/marvell.c50
-rw-r--r--drivers/net/phy/marvell10g.c33
-rw-r--r--drivers/net/phy/micrel.c17
-rw-r--r--drivers/net/phy/phy-c45.c7
-rw-r--r--drivers/net/phy/phy-core.c38
-rw-r--r--drivers/net/phy/phy.c154
-rw-r--r--drivers/net/phy/phy_device.c175
-rw-r--r--drivers/net/phy/phylink.c19
-rw-r--r--drivers/net/usb/lan78xx.c27
-rw-r--r--include/linux/mii.h14
-rw-r--r--include/linux/phy.h18
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
858static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata) 858static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
859{ 859{
860 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
860 struct xgbe_phy_data *phy_data = pdata->phy_data; 861 struct xgbe_phy_data *phy_data = pdata->phy_data;
861 unsigned int phy_id = phy_data->phydev->phy_id; 862 unsigned int phy_id = phy_data->phydev->phy_id;
862 863
@@ -878,9 +879,15 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
878 phy_write(phy_data->phydev, 0x04, 0x0d01); 879 phy_write(phy_data->phydev, 0x04, 0x0d01);
879 phy_write(phy_data->phydev, 0x00, 0x9140); 880 phy_write(phy_data->phydev, 0x00, 0x9140);
880 881
881 phy_data->phydev->supported = PHY_10BT_FEATURES | 882 linkmode_set_bit_array(phy_10_100_features_array,
882 PHY_100BT_FEATURES | 883 ARRAY_SIZE(phy_10_100_features_array),
883 PHY_1000BT_FEATURES; 884 supported);
885 linkmode_set_bit_array(phy_gbit_features_array,
886 ARRAY_SIZE(phy_gbit_features_array),
887 supported);
888
889 linkmode_copy(phy_data->phydev->supported, supported);
890
884 phy_support_asym_pause(phy_data->phydev); 891 phy_support_asym_pause(phy_data->phydev);
885 892
886 netif_dbg(pdata, drv, pdata->netdev, 893 netif_dbg(pdata, drv, pdata->netdev,
@@ -891,6 +898,7 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
891 898
892static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) 899static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
893{ 900{
901 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
894 struct xgbe_phy_data *phy_data = pdata->phy_data; 902 struct xgbe_phy_data *phy_data = pdata->phy_data;
895 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom; 903 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
896 unsigned int phy_id = phy_data->phydev->phy_id; 904 unsigned int phy_id = phy_data->phydev->phy_id;
@@ -951,9 +959,13 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
951 reg = phy_read(phy_data->phydev, 0x00); 959 reg = phy_read(phy_data->phydev, 0x00);
952 phy_write(phy_data->phydev, 0x00, reg & ~0x00800); 960 phy_write(phy_data->phydev, 0x00, reg & ~0x00800);
953 961
954 phy_data->phydev->supported = (PHY_10BT_FEATURES | 962 linkmode_set_bit_array(phy_10_100_features_array,
955 PHY_100BT_FEATURES | 963 ARRAY_SIZE(phy_10_100_features_array),
956 PHY_1000BT_FEATURES); 964 supported);
965 linkmode_set_bit_array(phy_gbit_features_array,
966 ARRAY_SIZE(phy_gbit_features_array),
967 supported);
968 linkmode_copy(phy_data->phydev->supported, supported);
957 phy_support_asym_pause(phy_data->phydev); 969 phy_support_asym_pause(phy_data->phydev);
958 970
959 netif_dbg(pdata, drv, pdata->netdev, 971 netif_dbg(pdata, drv, pdata->netdev,
@@ -976,7 +988,6 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
976 struct ethtool_link_ksettings *lks = &pdata->phy.lks; 988 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
977 struct xgbe_phy_data *phy_data = pdata->phy_data; 989 struct xgbe_phy_data *phy_data = pdata->phy_data;
978 struct phy_device *phydev; 990 struct phy_device *phydev;
979 u32 advertising;
980 int ret; 991 int ret;
981 992
982 /* If we already have a PHY, just return */ 993 /* If we already have a PHY, just return */
@@ -1036,9 +1047,8 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
1036 1047
1037 xgbe_phy_external_phy_quirks(pdata); 1048 xgbe_phy_external_phy_quirks(pdata);
1038 1049
1039 ethtool_convert_link_mode_to_legacy_u32(&advertising, 1050 linkmode_and(phydev->advertising, phydev->advertising,
1040 lks->link_modes.advertising); 1051 lks->link_modes.advertising);
1041 phydev->advertising &= advertising;
1042 1052
1043 phy_start_aneg(phy_data->phydev); 1053 phy_start_aneg(phy_data->phydev);
1044 1054
@@ -1497,7 +1507,7 @@ static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata)
1497 if (!phy_data->phydev) 1507 if (!phy_data->phydev)
1498 return; 1508 return;
1499 1509
1500 lcl_adv = ethtool_adv_to_lcl_adv_t(phy_data->phydev->advertising); 1510 lcl_adv = linkmode_adv_to_lcl_adv_t(phy_data->phydev->advertising);
1501 1511
1502 if (phy_data->phydev->pause) { 1512 if (phy_data->phydev->pause) {
1503 XGBE_SET_LP_ADV(lks, Pause); 1513 XGBE_SET_LP_ADV(lks, Pause);
@@ -1815,7 +1825,6 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1815{ 1825{
1816 struct ethtool_link_ksettings *lks = &pdata->phy.lks; 1826 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1817 struct xgbe_phy_data *phy_data = pdata->phy_data; 1827 struct xgbe_phy_data *phy_data = pdata->phy_data;
1818 u32 advertising;
1819 int ret; 1828 int ret;
1820 1829
1821 ret = xgbe_phy_find_phy_device(pdata); 1830 ret = xgbe_phy_find_phy_device(pdata);
@@ -1825,12 +1834,10 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1825 if (!phy_data->phydev) 1834 if (!phy_data->phydev)
1826 return 0; 1835 return 0;
1827 1836
1828 ethtool_convert_link_mode_to_legacy_u32(&advertising,
1829 lks->link_modes.advertising);
1830
1831 phy_data->phydev->autoneg = pdata->phy.autoneg; 1837 phy_data->phydev->autoneg = pdata->phy.autoneg;
1832 phy_data->phydev->advertising = phy_data->phydev->supported & 1838 linkmode_and(phy_data->phydev->advertising,
1833 advertising; 1839 phy_data->phydev->supported,
1840 lks->link_modes.advertising);
1834 1841
1835 if (pdata->phy.autoneg != AUTONEG_ENABLE) { 1842 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1836 phy_data->phydev->speed = pdata->phy.speed; 1843 phy_data->phydev->speed = pdata->phy.speed;
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
110int xge_mdio_config(struct net_device *ndev) 110int 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
2249static int b44_register_phy_one(struct b44 *bp) 2249static 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
2476static int dpaa_phy_init(struct net_device *net_dev) 2476static 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 */
1785static int init_phy(struct net_device *dev) 1785static 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 */
1164int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h) 1164int 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
2461static int emac_mii_bus_read(struct mii_bus *bus, int addr, int regnum) 2462static 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
608static int tc_mii_probe(struct net_device *dev) 608static 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
33static int aquantia_config_aneg(struct phy_device *phydev) 28static 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
87static int bcm87xx_config_init(struct phy_device *phydev) 87static 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 */
501static inline u32 ethtool_adv_to_fiber_adv_t(u32 ethadv) 501static 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
1464static int marvell_get_sset_count(struct phy_device *phydev) 1473static 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)
252static int mv3310_config_init(struct phy_device *phydev) 252static 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)
350static int mv3310_config_aneg(struct phy_device *phydev) 345static 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
312static int ksz8041_config_init(struct phy_device *phydev) 312static 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);
304int gen10g_config_init(struct phy_device *phydev) 304int 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 */
145const struct phy_setting * 144const struct phy_setting *
146phy_lookup_setting(int speed, int duplex, const unsigned long *mask, 145phy_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,
175EXPORT_SYMBOL_GPL(phy_lookup_setting); 174EXPORT_SYMBOL_GPL(phy_lookup_setting);
176 175
177size_t phy_speeds(unsigned int *speeds, size_t size, 176size_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 */
200void phy_resolve_aneg_linkmode(struct phy_device *phydev) 199void 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 */
181static const struct phy_setting * 181static const struct phy_setting *
182phy_find_valid(int speed, int duplex, u32 supported) 182phy_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 */
217static inline bool phy_check_valid(int speed, int duplex, u32 features) 213static 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)
232static void phy_sanitize_settings(struct phy_device *phydev) 227static 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 */
265int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) 260int 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);
312int phy_ethtool_ksettings_set(struct phy_device *phydev, 311int 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);
366void phy_ethtool_ksettings_get(struct phy_device *phydev, 366void 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 */
605int phy_speed_down(struct phy_device *phydev, bool sync) 603int 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 */
637int phy_speed_up(struct phy_device *phydev) 653int 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}
974EXPORT_SYMBOL(phy_mac_interrupt); 1005EXPORT_SYMBOL(phy_mac_interrupt);
975 1006
1007static 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};
69EXPORT_SYMBOL_GPL(phy_basic_ports_array);
69 70
70static const int phy_fibre_port_array[] = { 71static const int phy_fibre_port_array[] = {
71 ETHTOOL_LINK_MODE_FIBRE_BIT, 72 ETHTOOL_LINK_MODE_FIBRE_BIT,
72}; 73};
74EXPORT_SYMBOL_GPL(phy_fibre_port_array);
73 75
74static const int phy_all_ports_features_array[] = { 76static 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};
85EXPORT_SYMBOL_GPL(phy_all_ports_features_array);
83 86
84static const int phy_10_100_features_array[] = { 87const 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};
93EXPORT_SYMBOL_GPL(phy_10_100_features_array);
90 94
91static const int phy_basic_t1_features_array[] = { 95const 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};
99EXPORT_SYMBOL_GPL(phy_basic_t1_features_array);
95 100
96static const int phy_gbit_features_array[] = { 101const 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};
105EXPORT_SYMBOL_GPL(phy_gbit_features_array);
100 106
101static const int phy_10gbit_features_array[] = { 107const int phy_10gbit_features_array[1] = {
102 ETHTOOL_LINK_MODE_10000baseT_Full_BIT, 108 ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
103}; 109};
110EXPORT_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;
106EXPORT_SYMBOL_GPL(phy_10gbit_full_features); 113EXPORT_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);
1800int genphy_config_init(struct phy_device *phydev) 1815int 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
1880static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) 1899static 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 */
1924void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) 1960void 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}
1931EXPORT_SYMBOL(phy_remove_link_mode); 1965EXPORT_SYMBOL(phy_remove_link_mode);
1932 1966
@@ -1939,9 +1973,9 @@ EXPORT_SYMBOL(phy_remove_link_mode);
1939 */ 1973 */
1940void phy_support_sym_pause(struct phy_device *phydev) 1974void 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}
1946EXPORT_SYMBOL(phy_support_sym_pause); 1980EXPORT_SYMBOL(phy_support_sym_pause);
1947 1981
@@ -1953,8 +1987,9 @@ EXPORT_SYMBOL(phy_support_sym_pause);
1953 */ 1987 */
1954void phy_support_asym_pause(struct phy_device *phydev) 1988void 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}
1959EXPORT_SYMBOL(phy_support_asym_pause); 1994EXPORT_SYMBOL(phy_support_asym_pause);
1960 1995
@@ -1972,12 +2007,13 @@ EXPORT_SYMBOL(phy_support_asym_pause);
1972void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, 2007void 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}
1982EXPORT_SYMBOL(phy_set_sym_pause); 2018EXPORT_SYMBOL(phy_set_sym_pause);
1983 2019
@@ -1994,20 +2030,29 @@ EXPORT_SYMBOL(phy_set_sym_pause);
1994 */ 2030 */
1995void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) 2031void 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}
2012EXPORT_SYMBOL(phy_set_asym_pause); 2057EXPORT_SYMBOL(phy_set_asym_pause);
2013 2058
@@ -2023,8 +2068,10 @@ EXPORT_SYMBOL(phy_set_asym_pause);
2023bool phy_validate_pause(struct phy_device *phydev, 2068bool 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
2096static int lan78xx_phy_init(struct lan78xx_net *dev) 2096static 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 */
394static inline u32 ethtool_adv_to_lcl_adv_t(u32 advertising) 394static 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
61extern const int phy_10_100_features_array[4];
62extern const int phy_basic_t1_features_array[2];
63extern const int phy_gbit_features_array[2];
64extern 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
661const struct phy_setting * 667const struct phy_setting *
662phy_lookup_setting(int speed, int duplex, const unsigned long *mask, 668phy_lookup_setting(int speed, int duplex, const unsigned long *mask,
663 size_t maxbit, bool exact); 669 bool exact);
664size_t phy_speeds(unsigned int *speeds, size_t size, 670size_t phy_speeds(unsigned int *speeds, size_t size,
665 unsigned long *mask, size_t maxbit); 671 unsigned long *mask);
666 672
667void phy_resolve_aneg_linkmode(struct phy_device *phydev); 673void phy_resolve_aneg_linkmode(struct phy_device *phydev);
668 674