]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
r8152: fix runtime resume for linking change
authorHayes Wang <hayeswang@realtek.com>
Wed, 22 Jan 2020 08:02:05 +0000 (16:02 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Jan 2020 10:20:57 +0000 (11:20 +0100)
Fix the runtime resume doesn't work normally for linking change.

1. Reset the settings and status of runtime suspend.
2. Sync the linking status.
3. Poll the linking change.

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/r8152.c

index 031cb8fff9094bb1281e1aaf8306838c2784d5a7..115559707683f8ddde7b47eeaba5b5a7d8e446cd 100644 (file)
 #define DEBUG_LTSSM            0x0082
 
 /* PLA_EXTRA_STATUS */
+#define CUR_LINK_OK            BIT(15)
 #define U3P3_CHECK_EN          BIT(7)  /* RTL_VER_05 only */
 #define LINK_CHANGE_FLAG       BIT(8)
+#define POLL_LINK_CHG          BIT(0)
 
 /* USB_USB2PHY */
 #define USB2PHY_SUSPEND                0x0001
@@ -5387,6 +5389,16 @@ static void r8153_init(struct r8152 *tp)
                else
                        ocp_data |= DYNAMIC_BURST;
                ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
+
+               r8153_queue_wake(tp, false);
+
+               ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
+               if (rtl8152_get_speed(tp) & LINK_STATUS)
+                       ocp_data |= CUR_LINK_OK;
+               else
+                       ocp_data &= ~CUR_LINK_OK;
+               ocp_data |= POLL_LINK_CHG;
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
        }
 
        ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2);
@@ -5416,6 +5428,7 @@ static void r8153_init(struct r8152 *tp)
        ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001);
 
        r8153_power_cut_en(tp, false);
+       rtl_runtime_suspend_enable(tp, false);
        r8153_u1u2en(tp, true);
        r8153_mac_clk_spd(tp, false);
        usb_enable_lpm(tp->udev);
@@ -5484,6 +5497,14 @@ static void r8153b_init(struct r8152 *tp)
        r8153b_ups_en(tp, false);
        r8153_queue_wake(tp, false);
        rtl_runtime_suspend_enable(tp, false);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
+       if (rtl8152_get_speed(tp) & LINK_STATUS)
+               ocp_data |= CUR_LINK_OK;
+       else
+               ocp_data &= ~CUR_LINK_OK;
+       ocp_data |= POLL_LINK_CHG;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
        r8153b_u1u2en(tp, true);
        usb_enable_lpm(tp->udev);