| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- From 86b98abf4f8c691c260c5113d6a2d32f5377caca Mon Sep 17 00:00:00 2001
- From: Hayes Wang <[email protected]>
- 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 <[email protected]>
- Signed-off-by: Jakub Kicinski <[email protected]>
- ---
- 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
- @@ -3443,59 +3443,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);
-
- @@ -3980,7 +3997,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;
- @@ -4011,12 +4028,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);
- @@ -4221,7 +4237,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);
- @@ -4503,7 +4519,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);
- @@ -4577,7 +4593,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));
-
- @@ -4618,7 +4634,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);
- @@ -4635,7 +4651,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)
|