aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.15/784-v5.12-r8152-replace-several-functions-about-phy-patch-requ.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.15/784-v5.12-r8152-replace-several-functions-about-phy-patch-requ.patch')
-rw-r--r--target/linux/generic/backport-5.15/784-v5.12-r8152-replace-several-functions-about-phy-patch-requ.patch198
1 files changed, 198 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.15/784-v5.12-r8152-replace-several-functions-about-phy-patch-requ.patch b/target/linux/generic/backport-5.15/784-v5.12-r8152-replace-several-functions-about-phy-patch-requ.patch
new file mode 100644
index 0000000000..bbb2b5c0c9
--- /dev/null
+++ b/target/linux/generic/backport-5.15/784-v5.12-r8152-replace-several-functions-about-phy-patch-requ.patch
@@ -0,0 +1,198 @@
+From 86b98abf4f8c691c260c5113d6a2d32f5377caca Mon Sep 17 00:00:00 2001
+From: Hayes Wang <hayeswang@realtek.com>
+Date: Wed, 3 Feb 2021 17:14:28 +0800
+Subject: [PATCH] r8152: replace several functions about phy patch
+ request
+
+commit a08c0d309d8c078d22717d815cf9853f6f2c07bd upstream.
+
+Replace r8153_patch_request() with rtl_phy_patch_request().
+Replace r8153_pre_ram_code() with rtl_pre_ram_code().
+Replace r8153_post_ram_code() with rtl_post_ram_code().
+Add rtl_patch_key_set().
+
+The new functions have an additional parameter. It is used to wait
+the patch request command finished. When the PHY is resumed from
+the state of power cut, the PHY is at a safe mode and the
+OCP_PHY_PATCH_STAT wouldn't be updated. For this situation, it is
+safe to set patch request command without waiting OCP_PHY_PATCH_STAT.
+
+Signed-off-by: Hayes Wang <hayeswang@realtek.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/usb/r8152.c | 84 ++++++++++++++++++++++++-----------------
+ 1 file changed, 50 insertions(+), 34 deletions(-)
+
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -3444,59 +3444,76 @@ static void rtl_clear_bp(struct r8152 *t
+ ocp_write_word(tp, type, PLA_BP_BA, 0);
+ }
+
+-static int r8153_patch_request(struct r8152 *tp, bool request)
++static int rtl_phy_patch_request(struct r8152 *tp, bool request, bool wait)
+ {
+- u16 data;
++ u16 data, check;
+ int i;
+
+ data = ocp_reg_read(tp, OCP_PHY_PATCH_CMD);
+- if (request)
++ if (request) {
+ data |= PATCH_REQUEST;
+- else
++ check = 0;
++ } else {
+ data &= ~PATCH_REQUEST;
++ check = PATCH_READY;
++ }
+ ocp_reg_write(tp, OCP_PHY_PATCH_CMD, data);
+
+- for (i = 0; request && i < 5000; i++) {
++ for (i = 0; wait && i < 5000; i++) {
++ u32 ocp_data;
++
+ usleep_range(1000, 2000);
+- if (ocp_reg_read(tp, OCP_PHY_PATCH_STAT) & PATCH_READY)
++ ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT);
++ if ((ocp_data & PATCH_READY) ^ check)
+ break;
+ }
+
+- if (request && !(ocp_reg_read(tp, OCP_PHY_PATCH_STAT) & PATCH_READY)) {
+- netif_err(tp, drv, tp->netdev, "patch request fail\n");
+- r8153_patch_request(tp, false);
++ if (request && wait &&
++ !(ocp_reg_read(tp, OCP_PHY_PATCH_STAT) & PATCH_READY)) {
++ dev_err(&tp->intf->dev, "PHY patch request fail\n");
++ rtl_phy_patch_request(tp, false, false);
+ return -ETIME;
+ } else {
+ return 0;
+ }
+ }
+
+-static int r8153_pre_ram_code(struct r8152 *tp, u16 key_addr, u16 patch_key)
++static void rtl_patch_key_set(struct r8152 *tp, u16 key_addr, u16 patch_key)
+ {
+- if (r8153_patch_request(tp, true)) {
+- dev_err(&tp->intf->dev, "patch request fail\n");
+- return -ETIME;
+- }
++ if (patch_key && key_addr) {
++ sram_write(tp, key_addr, patch_key);
++ sram_write(tp, SRAM_PHY_LOCK, PHY_PATCH_LOCK);
++ } else if (key_addr) {
++ u16 data;
+
+- sram_write(tp, key_addr, patch_key);
+- sram_write(tp, SRAM_PHY_LOCK, PHY_PATCH_LOCK);
++ sram_write(tp, 0x0000, 0x0000);
+
+- return 0;
++ data = ocp_reg_read(tp, OCP_PHY_LOCK);
++ data &= ~PATCH_LOCK;
++ ocp_reg_write(tp, OCP_PHY_LOCK, data);
++
++ sram_write(tp, key_addr, 0x0000);
++ } else {
++ WARN_ON_ONCE(1);
++ }
+ }
+
+-static int r8153_post_ram_code(struct r8152 *tp, u16 key_addr)
++static int
++rtl_pre_ram_code(struct r8152 *tp, u16 key_addr, u16 patch_key, bool wait)
+ {
+- u16 data;
++ if (rtl_phy_patch_request(tp, true, wait))
++ return -ETIME;
+
+- sram_write(tp, 0x0000, 0x0000);
++ rtl_patch_key_set(tp, key_addr, patch_key);
+
+- data = ocp_reg_read(tp, OCP_PHY_LOCK);
+- data &= ~PATCH_LOCK;
+- ocp_reg_write(tp, OCP_PHY_LOCK, data);
++ return 0;
++}
+
+- sram_write(tp, key_addr, 0x0000);
++static int rtl_post_ram_code(struct r8152 *tp, u16 key_addr, bool wait)
++{
++ rtl_patch_key_set(tp, key_addr, 0);
+
+- r8153_patch_request(tp, false);
++ rtl_phy_patch_request(tp, false, wait);
+
+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
+
+@@ -3981,7 +3998,7 @@ static void rtl8152_fw_mac_apply(struct
+ dev_dbg(&tp->intf->dev, "successfully applied %s\n", mac->info);
+ }
+
+-static void rtl8152_apply_firmware(struct r8152 *tp)
++static void rtl8152_apply_firmware(struct r8152 *tp, bool power_cut)
+ {
+ struct rtl_fw *rtl_fw = &tp->rtl_fw;
+ const struct firmware *fw;
+@@ -4012,12 +4029,11 @@ static void rtl8152_apply_firmware(struc
+ case RTL_FW_PHY_START:
+ key = (struct fw_phy_patch_key *)block;
+ key_addr = __le16_to_cpu(key->key_reg);
+- r8153_pre_ram_code(tp, key_addr,
+- __le16_to_cpu(key->key_data));
++ rtl_pre_ram_code(tp, key_addr, __le16_to_cpu(key->key_data), !power_cut);
+ break;
+ case RTL_FW_PHY_STOP:
+ WARN_ON(!key_addr);
+- r8153_post_ram_code(tp, key_addr);
++ rtl_post_ram_code(tp, key_addr, !power_cut);
+ break;
+ case RTL_FW_PHY_NC:
+ rtl8152_fw_phy_nc_apply(tp, (struct fw_phy_nc *)block);
+@@ -4222,7 +4238,7 @@ static void rtl8152_disable(struct r8152
+
+ static void r8152b_hw_phy_cfg(struct r8152 *tp)
+ {
+- rtl8152_apply_firmware(tp);
++ rtl8152_apply_firmware(tp, false);
+ rtl_eee_enable(tp, tp->eee_en);
+ r8152_aldps_en(tp, true);
+ r8152b_enable_fc(tp);
+@@ -4504,7 +4520,7 @@ static void r8153_hw_phy_cfg(struct r815
+ /* disable EEE before updating the PHY parameters */
+ rtl_eee_enable(tp, false);
+
+- rtl8152_apply_firmware(tp);
++ rtl8152_apply_firmware(tp, false);
+
+ if (tp->version == RTL_VER_03) {
+ data = ocp_reg_read(tp, OCP_EEE_CFG);
+@@ -4578,7 +4594,7 @@ static void r8153b_hw_phy_cfg(struct r81
+ /* disable EEE before updating the PHY parameters */
+ rtl_eee_enable(tp, false);
+
+- rtl8152_apply_firmware(tp);
++ rtl8152_apply_firmware(tp, false);
+
+ r8153b_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags));
+
+@@ -4619,7 +4635,7 @@ static void r8153b_hw_phy_cfg(struct r81
+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
+
+ /* Advnace EEE */
+- if (!r8153_patch_request(tp, true)) {
++ if (!rtl_phy_patch_request(tp, true, true)) {
+ data = ocp_reg_read(tp, OCP_POWER_CFG);
+ data |= EEE_CLKDIV_EN;
+ ocp_reg_write(tp, OCP_POWER_CFG, data);
+@@ -4636,7 +4652,7 @@ static void r8153b_hw_phy_cfg(struct r81
+ ocp_reg_write(tp, OCP_SYSCLK_CFG, clk_div_expo(5));
+ tp->ups_info._250m_ckdiv = true;
+
+- r8153_patch_request(tp, false);
++ rtl_phy_patch_request(tp, false, true);
+ }
+
+ if (tp->eee_en)