r8152: fix the poor throughput for 2.5G devices
authorHayes Wang <hayeswang@realtek.com>
Fri, 28 Apr 2023 08:53:30 +0000 (16:53 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 May 2023 09:53:34 +0000 (11:53 +0200)
[ Upstream commit 61b0ad6f58e2066e054c6d4839d67974d2861a7d ]

Fix the poor throughput for 2.5G devices, when changing the speed from
auto mode to force mode. This patch is used to notify the MAC when the
mode is changed.

Fixes: 195aae321c82 ("r8152: support new chips")
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/usb/r8152.c

index b0ce524ef1a506418cb15aae76e110e3809dffb5..a7665accc81c89d6695d88f1df28a5c2209f1fe8 100644 (file)
 #define OCP_EEE_AR             0xa41a
 #define OCP_EEE_DATA           0xa41c
 #define OCP_PHY_STATUS         0xa420
+#define OCP_INTR_EN            0xa424
 #define OCP_NCTL_CFG           0xa42c
 #define OCP_POWER_CFG          0xa430
 #define OCP_EEE_CFG            0xa432
@@ -620,6 +621,9 @@ enum spd_duplex {
 #define PHY_STAT_LAN_ON                3
 #define PHY_STAT_PWRDN         5
 
+/* OCP_INTR_EN */
+#define INTR_SPEED_FORCE       BIT(3)
+
 /* OCP_NCTL_CFG */
 #define PGA_RETURN_EN          BIT(1)
 
@@ -7554,6 +7558,11 @@ static void r8156_hw_phy_cfg(struct r8152 *tp)
                                      ((swap_a & 0x1f) << 8) |
                                      ((swap_a >> 8) & 0x1f));
                }
+
+               /* Notify the MAC when the speed is changed to force mode. */
+               data = ocp_reg_read(tp, OCP_INTR_EN);
+               data |= INTR_SPEED_FORCE;
+               ocp_reg_write(tp, OCP_INTR_EN, data);
                break;
        default:
                break;
@@ -7949,6 +7958,11 @@ static void r8156b_hw_phy_cfg(struct r8152 *tp)
                break;
        }
 
+       /* Notify the MAC when the speed is changed to force mode. */
+       data = ocp_reg_read(tp, OCP_INTR_EN);
+       data |= INTR_SPEED_FORCE;
+       ocp_reg_write(tp, OCP_INTR_EN, data);
+
        if (rtl_phy_patch_request(tp, true, true))
                return;