| From e2b5b467a282aaae917e81c02bc0e9ecb69a56b7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 14 Apr 2021 10:47:10 +0200 |
| Subject: r8169: don't advertise pause in jumbo mode |
| |
| From: Heiner Kallweit <hkallweit1@gmail.com> |
| |
| [ Upstream commit 453a77894efa4d9b6ef9644d74b9419c47ac427c ] |
| |
| It has been reported [0] that using pause frames in jumbo mode impacts |
| performance. There's no available chip documentation, but vendor |
| drivers r8168 and r8125 don't advertise pause in jumbo mode. So let's |
| do the same, according to Roman it fixes the issue. |
| |
| [0] https://bugzilla.kernel.org/show_bug.cgi?id=212617 |
| |
| Fixes: 9cf9b84cc701 ("r8169: make use of phy_set_asym_pause") |
| Reported-by: Roman Mamedov <rm+bko@romanrm.net> |
| Tested-by: Roman Mamedov <rm+bko@romanrm.net> |
| Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/realtek/r8169_main.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c |
| index 47a4ff832d75..e04e885f2893 100644 |
| --- a/drivers/net/ethernet/realtek/r8169_main.c |
| +++ b/drivers/net/ethernet/realtek/r8169_main.c |
| @@ -2384,6 +2384,13 @@ static void rtl_jumbo_config(struct rtl8169_private *tp) |
| |
| if (pci_is_pcie(tp->pci_dev) && tp->supports_gmii) |
| pcie_set_readrq(tp->pci_dev, readrq); |
| + |
| + /* Chip doesn't support pause in jumbo mode */ |
| + linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
| + tp->phydev->advertising, !jumbo); |
| + linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, |
| + tp->phydev->advertising, !jumbo); |
| + phy_start_aneg(tp->phydev); |
| } |
| |
| DECLARE_RTL_COND(rtl_chipcmd_cond) |
| @@ -4662,8 +4669,6 @@ static int r8169_phy_connect(struct rtl8169_private *tp) |
| if (!tp->supports_gmii) |
| phy_set_max_speed(phydev, SPEED_100); |
| |
| - phy_support_asym_pause(phydev); |
| - |
| phy_attached_info(phydev); |
| |
| return 0; |
| -- |
| 2.30.2 |
| |