| From 3bd2ad911f19692b4573472c578594942179c8f2 Mon Sep 17 00:00:00 2001 |
| From: Madalin Bucur <madalin.bucur@oss.nxp.com> |
| Date: Tue, 4 Feb 2020 12:08:58 +0200 |
| Subject: [PATCH] dpaa_eth: support all modes with rate adapting PHYs |
| |
| commit 73a21fa817f0cc8022dc6226250a86bca727a56d upstream. |
| |
| Stop removing modes that are not supported on the system interface |
| when the connected PHY is capable of rate adaptation. This addresses |
| an issue with the LS1046ARDB board 10G interface no longer working |
| with an 1G link partner after autonegotiation support was added |
| for the Aquantia PHY on board in |
| |
| commit 09c4c57f7bc4 ("net: phy: aquantia: add support for auto-negotiation configuration") |
| |
| Before this commit the values advertised by the PHY were not |
| influenced by the dpaa_eth driver removal of system-side unsupported |
| modes as the aqr_config_aneg() was basically a no-op. After this |
| commit, the modes removed by the dpaa_eth driver were no longer |
| advertised thus autonegotiation with 1G link partners failed. |
| |
| Reported-by: Mian Yousaf Kaukab <ykaukab@suse.de> |
| Signed-off-by: Madalin Bucur <madalin.bucur@oss.nxp.com> |
| Reviewed-by: Andrew Lunn <andrew@lunn.ch> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c |
| index cb1694478745..2ee645d5e4bd 100644 |
| --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c |
| +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c |
| @@ -2483,6 +2483,9 @@ static void dpaa_adjust_link(struct net_device *net_dev) |
| mac_dev->adjust_link(mac_dev); |
| } |
| |
| +/* The Aquantia PHYs are capable of performing rate adaptation */ |
| +#define PHY_VEND_AQUANTIA 0x03a1b400 |
| + |
| static int dpaa_phy_init(struct net_device *net_dev) |
| { |
| __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; |
| @@ -2501,9 +2504,14 @@ static int dpaa_phy_init(struct net_device *net_dev) |
| return -ENODEV; |
| } |
| |
| - /* Remove any features not supported by the controller */ |
| - ethtool_convert_legacy_u32_to_link_mode(mask, mac_dev->if_support); |
| - linkmode_and(phy_dev->supported, phy_dev->supported, mask); |
| + /* Unless the PHY is capable of rate adaptation */ |
| + if (mac_dev->phy_if != PHY_INTERFACE_MODE_XGMII || |
| + ((phy_dev->drv->phy_id & GENMASK(31, 10)) != PHY_VEND_AQUANTIA)) { |
| + /* remove any features not supported by the controller */ |
| + ethtool_convert_legacy_u32_to_link_mode(mask, |
| + mac_dev->if_support); |
| + linkmode_and(phy_dev->supported, phy_dev->supported, mask); |
| + } |
| |
| phy_support_asym_pause(phy_dev); |
| |
| -- |
| 2.7.4 |
| |