Commit a3914272 authored by Hayes Wang's avatar Hayes Wang Committed by David S. Miller

r8152: fix runtime resume for linking change

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: default avatarHayes Wang <hayeswang@realtek.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 940ba149
...@@ -365,8 +365,10 @@ ...@@ -365,8 +365,10 @@
#define DEBUG_LTSSM 0x0082 #define DEBUG_LTSSM 0x0082
/* PLA_EXTRA_STATUS */ /* PLA_EXTRA_STATUS */
#define CUR_LINK_OK BIT(15)
#define U3P3_CHECK_EN BIT(7) /* RTL_VER_05 only */ #define U3P3_CHECK_EN BIT(7) /* RTL_VER_05 only */
#define LINK_CHANGE_FLAG BIT(8) #define LINK_CHANGE_FLAG BIT(8)
#define POLL_LINK_CHG BIT(0)
/* USB_USB2PHY */ /* USB_USB2PHY */
#define USB2PHY_SUSPEND 0x0001 #define USB2PHY_SUSPEND 0x0001
...@@ -5387,6 +5389,16 @@ static void r8153_init(struct r8152 *tp) ...@@ -5387,6 +5389,16 @@ static void r8153_init(struct r8152 *tp)
else else
ocp_data |= DYNAMIC_BURST; ocp_data |= DYNAMIC_BURST;
ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data); 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); ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2);
...@@ -5416,6 +5428,7 @@ static void r8153_init(struct r8152 *tp) ...@@ -5416,6 +5428,7 @@ static void r8153_init(struct r8152 *tp)
ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001); ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001);
r8153_power_cut_en(tp, false); r8153_power_cut_en(tp, false);
rtl_runtime_suspend_enable(tp, false);
r8153_u1u2en(tp, true); r8153_u1u2en(tp, true);
r8153_mac_clk_spd(tp, false); r8153_mac_clk_spd(tp, false);
usb_enable_lpm(tp->udev); usb_enable_lpm(tp->udev);
...@@ -5484,6 +5497,14 @@ static void r8153b_init(struct r8152 *tp) ...@@ -5484,6 +5497,14 @@ static void r8153b_init(struct r8152 *tp)
r8153b_ups_en(tp, false); r8153b_ups_en(tp, false);
r8153_queue_wake(tp, false); r8153_queue_wake(tp, false);
rtl_runtime_suspend_enable(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); r8153b_u1u2en(tp, true);
usb_enable_lpm(tp->udev); usb_enable_lpm(tp->udev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment