r8152: fix the setting of detecting the linking change for runtime suspend
authorHayes Wang <hayeswang@realtek.com>
Mon, 1 Jul 2019 07:53:19 +0000 (15:53 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Jul 2019 02:31:57 +0000 (19:31 -0700)
1. Rename r8153b_queue_wake() to r8153_queue_wake().

2. Correct the setting. The enable bit should be 0xd38c bit 0. Besides,
   the 0xd38a bit 0 and 0xd398 bit 8 have to be cleared for both enabled
   and disabled.

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

index e0dcb681cfe5a3c96fded0d74abaca28ebe11551..101d1325f3f14ee94c529751667ada543bf9db51 100644 (file)
@@ -53,6 +53,9 @@
 #define PAL_BDC_CR             0xd1a0
 #define PLA_TEREDO_TIMER       0xd2cc
 #define PLA_REALWOW_TIMER      0xd2e8
+#define PLA_SUSPEND_FLAG       0xd38a
+#define PLA_INDICATE_FALG      0xd38c
+#define PLA_EXTRA_STATUS       0xd398
 #define PLA_EFUSE_DATA         0xdd00
 #define PLA_EFUSE_CMD          0xdd02
 #define PLA_LEDSEL             0xdd90
 /* PLA_BOOT_CTRL */
 #define AUTOLOAD_DONE          0x0002
 
+/* PLA_SUSPEND_FLAG */
+#define LINK_CHG_EVENT         BIT(0)
+
+/* PLA_INDICATE_FALG */
+#define UPCOMING_RUNTIME_D3    BIT(0)
+
+/* PLA_EXTRA_STATUS */
+#define LINK_CHANGE_FLAG       BIT(8)
+
 /* USB_USB2PHY */
 #define USB2PHY_SUSPEND                0x0001
 #define USB2PHY_L1             0x0002
@@ -2806,20 +2818,24 @@ static void r8153b_power_cut_en(struct r8152 *tp, bool enable)
        ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
 }
 
-static void r8153b_queue_wake(struct r8152 *tp, bool enable)
+static void r8153_queue_wake(struct r8152 *tp, bool enable)
 {
        u32 ocp_data;
 
-       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, 0xd38a);
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_INDICATE_FALG);
        if (enable)
-               ocp_data |= BIT(0);
+               ocp_data |= UPCOMING_RUNTIME_D3;
        else
-               ocp_data &= ~BIT(0);
-       ocp_write_byte(tp, MCU_TYPE_PLA, 0xd38a, ocp_data);
+               ocp_data &= ~UPCOMING_RUNTIME_D3;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_INDICATE_FALG, ocp_data);
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_SUSPEND_FLAG);
+       ocp_data &= ~LINK_CHG_EVENT;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_SUSPEND_FLAG, ocp_data);
 
-       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, 0xd38c);
-       ocp_data &= ~BIT(0);
-       ocp_write_byte(tp, MCU_TYPE_PLA, 0xd38c, ocp_data);
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
+       ocp_data &= ~LINK_CHANGE_FLAG;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
 }
 
 static bool rtl_can_wakeup(struct r8152 *tp)
@@ -2887,14 +2903,14 @@ static void rtl8153_runtime_enable(struct r8152 *tp, bool enable)
 static void rtl8153b_runtime_enable(struct r8152 *tp, bool enable)
 {
        if (enable) {
-               r8153b_queue_wake(tp, true);
+               r8153_queue_wake(tp, true);
                r8153b_u1u2en(tp, false);
                r8153_u2p3en(tp, false);
                rtl_runtime_suspend_enable(tp, true);
                r8153b_ups_en(tp, true);
        } else {
                r8153b_ups_en(tp, false);
-               r8153b_queue_wake(tp, false);
+               r8153_queue_wake(tp, false);
                rtl_runtime_suspend_enable(tp, false);
                r8153_u2p3en(tp, true);
                r8153b_u1u2en(tp, true);
@@ -4221,7 +4237,7 @@ static void r8153b_init(struct r8152 *tp)
 
        r8153b_power_cut_en(tp, false);
        r8153b_ups_en(tp, false);
-       r8153b_queue_wake(tp, false);
+       r8153_queue_wake(tp, false);
        rtl_runtime_suspend_enable(tp, false);
        r8153b_u1u2en(tp, true);
        usb_enable_lpm(tp->udev);