summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2018-09-11 19:53:15 -0400
committerDavid S. Miller <davem@davemloft.net>2018-09-12 23:24:21 -0400
commitaf8d9bb2f2f405ad541794b46f9d7bc70f13e5cb (patch)
tree1da441f208e3228e6888456e78a7b972889ccc6d
parent41124fa64d4b298b82266b7ddbefc43540b77b44 (diff)
net: ethernet: Add helper for MACs which support asym pause
Rather than have the MAC drivers manipulate phydev members to indicate they support Asym Pause, add a helper function. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c4
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.c4
-rw-r--r--drivers/net/ethernet/broadcom/sb1250-mac.c5
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c8
-rw-r--r--drivers/net/ethernet/cortina/gemini.c3
-rw-r--r--drivers/net/ethernet/dnet.c4
-rw-r--r--drivers/net/ethernet/faraday/ftgmac100.c3
-rw-r--r--drivers/net/ethernet/freescale/dpaa/dpaa_eth.c3
-rw-r--r--drivers/net/ethernet/freescale/gianfar.c4
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c4
-rw-r--r--drivers/net/ethernet/mediatek/mtk_eth_soc.c6
-rw-r--r--drivers/net/ethernet/microchip/lan743x_main.c5
-rw-r--r--drivers/net/ethernet/smsc/smsc911x.c3
-rw-r--r--drivers/net/ethernet/smsc/smsc9420.c3
-rw-r--r--drivers/net/ethernet/socionext/sni_ave.c3
-rw-r--r--drivers/net/phy/phy_device.c13
-rw-r--r--include/linux/phy.h1
17 files changed, 33 insertions, 43 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
index 3ceb4f95ca7c..289129011b9f 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
@@ -879,8 +879,8 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
879 phy_write(phy_data->phydev, 0x00, 0x9140); 879 phy_write(phy_data->phydev, 0x00, 0x9140);
880 880
881 phy_data->phydev->supported = PHY_GBIT_FEATURES; 881 phy_data->phydev->supported = PHY_GBIT_FEATURES;
882 phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
883 phy_data->phydev->advertising = phy_data->phydev->supported; 882 phy_data->phydev->advertising = phy_data->phydev->supported;
883 phy_support_asym_pause(phy_data->phydev);
884 884
885 netif_dbg(pdata, drv, pdata->netdev, 885 netif_dbg(pdata, drv, pdata->netdev,
886 "Finisar PHY quirk in place\n"); 886 "Finisar PHY quirk in place\n");
@@ -951,8 +951,8 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
951 phy_write(phy_data->phydev, 0x00, reg & ~0x00800); 951 phy_write(phy_data->phydev, 0x00, reg & ~0x00800);
952 952
953 phy_data->phydev->supported = PHY_GBIT_FEATURES; 953 phy_data->phydev->supported = PHY_GBIT_FEATURES;
954 phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
955 phy_data->phydev->advertising = phy_data->phydev->supported; 954 phy_data->phydev->advertising = phy_data->phydev->supported;
955 phy_support_asym_pause(phy_data->phydev);
956 956
957 netif_dbg(pdata, drv, pdata->netdev, 957 netif_dbg(pdata, drv, pdata->netdev,
958 "BelFuse PHY quirk in place\n"); 958 "BelFuse PHY quirk in place\n");
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
index 4831f9de5945..e3560311711a 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
@@ -898,9 +898,7 @@ int xgene_enet_phy_connect(struct net_device *ndev)
898 phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_10baseT_Half_BIT); 898 phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
899 phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_100baseT_Half_BIT); 899 phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
900 phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT); 900 phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
901 phy_dev->supported |= SUPPORTED_Pause | 901 phy_support_asym_pause(phy_dev);
902 SUPPORTED_Asym_Pause;
903 phy_dev->advertising = phy_dev->supported;
904 902
905 return 0; 903 return 0;
906} 904}
diff --git a/drivers/net/ethernet/broadcom/sb1250-mac.c b/drivers/net/ethernet/broadcom/sb1250-mac.c
index 4ce4b097ec05..53acbbb36637 100644
--- a/drivers/net/ethernet/broadcom/sb1250-mac.c
+++ b/drivers/net/ethernet/broadcom/sb1250-mac.c
@@ -2358,13 +2358,10 @@ static int sbmac_mii_probe(struct net_device *dev)
2358 2358
2359 /* Remove any features not supported by the controller */ 2359 /* Remove any features not supported by the controller */
2360 phy_set_max_speed(phy_dev, SPEED_1000); 2360 phy_set_max_speed(phy_dev, SPEED_1000);
2361 phy_dev->supported |= SUPPORTED_Pause | 2361 phy_support_asym_pause(phy_dev);
2362 SUPPORTED_Asym_Pause;
2363 2362
2364 phy_attached_info(phy_dev); 2363 phy_attached_info(phy_dev);
2365 2364
2366 phy_dev->advertising = phy_dev->supported;
2367
2368 sc->phy_dev = phy_dev; 2365 sc->phy_dev = phy_dev;
2369 2366
2370 return 0; 2367 return 0;
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index eab00239a47a..193e990fac7a 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -2123,15 +2123,13 @@ static int tg3_phy_init(struct tg3 *tp)
2123 case PHY_INTERFACE_MODE_RGMII: 2123 case PHY_INTERFACE_MODE_RGMII:
2124 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { 2124 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
2125 phy_set_max_speed(phydev, SPEED_1000); 2125 phy_set_max_speed(phydev, SPEED_1000);
2126 phydev->supported |= (SUPPORTED_Pause | 2126 phy_support_asym_pause(phydev);
2127 SUPPORTED_Asym_Pause);
2128 break; 2127 break;
2129 } 2128 }
2130 /* fallthru */ 2129 /* fallthru */
2131 case PHY_INTERFACE_MODE_MII: 2130 case PHY_INTERFACE_MODE_MII:
2132 phy_set_max_speed(phydev, SPEED_100); 2131 phy_set_max_speed(phydev, SPEED_100);
2133 phydev->supported |= (SUPPORTED_Pause | 2132 phy_support_asym_pause(phydev);
2134 SUPPORTED_Asym_Pause);
2135 break; 2133 break;
2136 default: 2134 default:
2137 phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)); 2135 phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr));
@@ -2140,8 +2138,6 @@ static int tg3_phy_init(struct tg3 *tp)
2140 2138
2141 tp->phy_flags |= TG3_PHYFLG_IS_CONNECTED; 2139 tp->phy_flags |= TG3_PHYFLG_IS_CONNECTED;
2142 2140
2143 phydev->advertising = phydev->supported;
2144
2145 phy_attached_info(phydev); 2141 phy_attached_info(phydev);
2146 2142
2147 return 0; 2143 return 0;
diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c
index 2b46c0de90d0..ceec467f590d 100644
--- a/drivers/net/ethernet/cortina/gemini.c
+++ b/drivers/net/ethernet/cortina/gemini.c
@@ -373,8 +373,7 @@ static int gmac_setup_phy(struct net_device *netdev)
373 netdev->phydev = phy; 373 netdev->phydev = phy;
374 374
375 phy_set_max_speed(phy, SPEED_1000); 375 phy_set_max_speed(phy, SPEED_1000);
376 phy->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause; 376 phy_support_asym_pause(phy);
377 phy->advertising = phy->supported;
378 377
379 /* set PHY interface type */ 378 /* set PHY interface type */
380 switch (phy->interface) { 379 switch (phy->interface) {
diff --git a/drivers/net/ethernet/dnet.c b/drivers/net/ethernet/dnet.c
index 08b7ad1594ce..79521e27f0d1 100644
--- a/drivers/net/ethernet/dnet.c
+++ b/drivers/net/ethernet/dnet.c
@@ -288,9 +288,7 @@ static int dnet_mii_probe(struct net_device *dev)
288 else 288 else
289 phy_set_max_speed(phydev, SPEED_100); 289 phy_set_max_speed(phydev, SPEED_100);
290 290
291 phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause; 291 phy_support_asym_pause(phydev);
292
293 phydev->advertising = phydev->supported;
294 292
295 bp->link = 0; 293 bp->link = 0;
296 bp->speed = 0; 294 bp->speed = 0;
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index ed6c76d20b45..3f319ee66ab4 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -1079,8 +1079,7 @@ static int ftgmac100_mii_probe(struct ftgmac100 *priv, phy_interface_t intf)
1079 /* Indicate that we support PAUSE frames (see comment in 1079 /* Indicate that we support PAUSE frames (see comment in
1080 * Documentation/networking/phy.txt) 1080 * Documentation/networking/phy.txt)
1081 */ 1081 */
1082 phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; 1082 phy_support_asym_pause(phydev);
1083 phydev->advertising = phydev->supported;
1084 1083
1085 /* Display what we found */ 1084 /* Display what we found */
1086 phy_attached_info(phydev); 1085 phy_attached_info(phydev);
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index 783134f1b779..a5131a510e8b 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -2491,8 +2491,7 @@ static int dpaa_phy_init(struct net_device *net_dev)
2491 2491
2492 /* Remove any features not supported by the controller */ 2492 /* Remove any features not supported by the controller */
2493 phy_dev->supported &= mac_dev->if_support; 2493 phy_dev->supported &= mac_dev->if_support;
2494 phy_dev->supported |= (SUPPORTED_Pause | SUPPORTED_Asym_Pause); 2494 phy_support_asym_pause(phy_dev);
2495 phy_dev->advertising = phy_dev->supported;
2496 2495
2497 mac_dev->phy_dev = phy_dev; 2496 mac_dev->phy_dev = phy_dev;
2498 net_dev->phydev = phy_dev; 2497 net_dev->phydev = phy_dev;
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index f27f9bae1a4a..40a1a87cd338 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -1814,8 +1814,8 @@ static int init_phy(struct net_device *dev)
1814 phydev->supported &= (GFAR_SUPPORTED | gigabit_support); 1814 phydev->supported &= (GFAR_SUPPORTED | gigabit_support);
1815 phydev->advertising = phydev->supported; 1815 phydev->advertising = phydev->supported;
1816 1816
1817 /* Add support for flow control, but don't advertise it by default */ 1817 /* Add support for flow control */
1818 phydev->supported |= (SUPPORTED_Pause | SUPPORTED_Asym_Pause); 1818 phy_support_asym_pause(phydev);
1819 1819
1820 /* disable EEE autoneg, EEE not supported by eTSEC */ 1820 /* disable EEE autoneg, EEE not supported by eTSEC */
1821 memset(&edata, 0, sizeof(struct ethtool_eee)); 1821 memset(&edata, 0, sizeof(struct ethtool_eee));
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
index 05b15d254e32..24b1f2a0c32a 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
@@ -211,9 +211,7 @@ int hclge_mac_connect_phy(struct hclge_dev *hdev)
211 } 211 }
212 212
213 phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES; 213 phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES;
214 phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; 214 phy_support_asym_pause(phydev);
215
216 phydev->advertising = phydev->supported;
217 215
218 return 0; 216 return 0;
219} 217}
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index db231bda7c2a..cc1e9a96a43b 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -355,12 +355,8 @@ static int mtk_phy_connect(struct net_device *dev)
355 dev->phydev->speed = 0; 355 dev->phydev->speed = 0;
356 dev->phydev->duplex = 0; 356 dev->phydev->duplex = 0;
357 357
358 if (of_phy_is_fixed_link(mac->of_node))
359 dev->phydev->supported |=
360 SUPPORTED_Pause | SUPPORTED_Asym_Pause;
361
362 phy_set_max_speed(dev->phydev, SPEED_1000); 358 phy_set_max_speed(dev->phydev, SPEED_1000);
363 dev->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; 359 phy_support_asym_pause(dev->phydev);
364 dev->phydev->advertising = dev->phydev->supported | 360 dev->phydev->advertising = dev->phydev->supported |
365 ADVERTISED_Autoneg; 361 ADVERTISED_Autoneg;
366 phy_start_aneg(dev->phydev); 362 phy_start_aneg(dev->phydev);
diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 048307959c01..b1a0e657febf 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -999,7 +999,6 @@ static int lan743x_phy_open(struct lan743x_adapter *adapter)
999 struct phy_device *phydev; 999 struct phy_device *phydev;
1000 struct net_device *netdev; 1000 struct net_device *netdev;
1001 int ret = -EIO; 1001 int ret = -EIO;
1002 u32 mii_adv;
1003 1002
1004 netdev = adapter->netdev; 1003 netdev = adapter->netdev;
1005 phydev = phy_find_first(adapter->mdiobus); 1004 phydev = phy_find_first(adapter->mdiobus);
@@ -1016,10 +1015,8 @@ static int lan743x_phy_open(struct lan743x_adapter *adapter)
1016 phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT); 1015 phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
1017 1016
1018 /* support both flow controls */ 1017 /* support both flow controls */
1018 phy_support_asym_pause(phydev);
1019 phy->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX); 1019 phy->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX);
1020 phydev->advertising &= ~(ADVERTISED_Pause | ADVERTISED_Asym_Pause);
1021 mii_adv = (u32)mii_advertise_flowctrl(phy->fc_request_control);
1022 phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv);
1023 phy->fc_autoneg = phydev->autoneg; 1020 phy->fc_autoneg = phydev->autoneg;
1024 1021
1025 phy_start(phydev); 1022 phy_start(phydev);
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c
index 3e34bf53f055..c009407618d9 100644
--- a/drivers/net/ethernet/smsc/smsc911x.c
+++ b/drivers/net/ethernet/smsc/smsc911x.c
@@ -1051,8 +1051,7 @@ static int smsc911x_mii_probe(struct net_device *dev)
1051 phy_set_max_speed(phydev, SPEED_100); 1051 phy_set_max_speed(phydev, SPEED_100);
1052 1052
1053 /* mask with MAC supported features */ 1053 /* mask with MAC supported features */
1054 phydev->supported |= (SUPPORTED_Pause | SUPPORTED_Asym_Pause); 1054 phy_support_asym_pause(phydev);
1055 phydev->advertising = phydev->supported;
1056 1055
1057 pdata->last_duplex = -1; 1056 pdata->last_duplex = -1;
1058 pdata->last_carrier = -1; 1057 pdata->last_carrier = -1;
diff --git a/drivers/net/ethernet/smsc/smsc9420.c b/drivers/net/ethernet/smsc/smsc9420.c
index 326177384544..9b6366b20110 100644
--- a/drivers/net/ethernet/smsc/smsc9420.c
+++ b/drivers/net/ethernet/smsc/smsc9420.c
@@ -1138,8 +1138,7 @@ static int smsc9420_mii_probe(struct net_device *dev)
1138 phy_set_max_speed(phydev, SPEED_100); 1138 phy_set_max_speed(phydev, SPEED_100);
1139 1139
1140 /* mask with MAC supported features */ 1140 /* mask with MAC supported features */
1141 phydev->supported |= (SUPPORTED_Pause | SUPPORTED_Asym_Pause); 1141 phy_support_asym_pause(phydev);
1142 phydev->advertising = phydev->supported;
1143 1142
1144 phy_attached_info(phydev); 1143 phy_attached_info(phydev);
1145 1144
diff --git a/drivers/net/ethernet/socionext/sni_ave.c b/drivers/net/ethernet/socionext/sni_ave.c
index 76ff364c40e9..a50720ec109c 100644
--- a/drivers/net/ethernet/socionext/sni_ave.c
+++ b/drivers/net/ethernet/socionext/sni_ave.c
@@ -1225,7 +1225,8 @@ static int ave_init(struct net_device *ndev)
1225 1225
1226 if (!phy_interface_is_rgmii(phydev)) 1226 if (!phy_interface_is_rgmii(phydev))
1227 phy_set_max_speed(phydev, SPEED_100); 1227 phy_set_max_speed(phydev, SPEED_100);
1228 phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; 1228
1229 phy_support_asym_pause(phydev);
1229 1230
1230 phy_attached_info(phydev); 1231 phy_attached_info(phydev);
1231 1232
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index e9ca83a438b0..a0646a66f005 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1783,6 +1783,19 @@ void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
1783} 1783}
1784EXPORT_SYMBOL(phy_remove_link_mode); 1784EXPORT_SYMBOL(phy_remove_link_mode);
1785 1785
1786/**
1787 * phy_support_asym_pause - Enable support of asym pause
1788 * @phydev: target phy_device struct
1789 *
1790 * Description: Called by the MAC to indicate is supports Asym Pause.
1791 */
1792void phy_support_asym_pause(struct phy_device *phydev)
1793{
1794 phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1795 phydev->advertising = phydev->supported;
1796}
1797EXPORT_SYMBOL(phy_support_asym_pause);
1798
1786static void of_set_phy_supported(struct phy_device *phydev) 1799static void of_set_phy_supported(struct phy_device *phydev)
1787{ 1800{
1788 struct device_node *node = phydev->mdio.dev.of_node; 1801 struct device_node *node = phydev->mdio.dev.of_node;
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 9c4c3eca8cf2..e2db819807c1 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -1050,6 +1050,7 @@ int phy_start_interrupts(struct phy_device *phydev);
1050void phy_print_status(struct phy_device *phydev); 1050void phy_print_status(struct phy_device *phydev);
1051int phy_set_max_speed(struct phy_device *phydev, u32 max_speed); 1051int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
1052void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode); 1052void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode);
1053void phy_support_asym_pause(struct phy_device *phydev);
1053 1054
1054int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, 1055int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
1055 int (*run)(struct phy_device *)); 1056 int (*run)(struct phy_device *));