kernel: bump 5.10 to 5.10.124
[openwrt/openwrt.git] / target / linux / generic / backport-5.10 / 785-v5.12-r8152-adjust-the-flow-of-power-cut-for-RTL8153B.patch
1 From 29a61d8564ad3439d03c7ec135016a4e70072af1 Mon Sep 17 00:00:00 2001
2 From: Hayes Wang <hayeswang@realtek.com>
3 Date: Wed, 3 Feb 2021 17:14:29 +0800
4 Subject: [PATCH] r8152: adjust the flow of power cut for RTL8153B
5
6 commit 80fd850b31f09263ad175b2f640d5c5c6f76ed41 upstream.
7
8 For runtime resuming, the RTL8153B may be resumed from the state
9 of power cut, when enabling the feature of UPS. Then, the PHY
10 would be reset, so it is necessary to be initailized again.
11
12 Besides, the USB_U1U2_TIMER also has to be set again, so I move
13 it from r8153b_init() to r8153b_hw_phy_cfg().
14
15 Signed-off-by: Hayes Wang <hayeswang@realtek.com>
16 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
17 ---
18 drivers/net/usb/r8152.c | 68 ++++++++++++++++++++++++-----------------
19 1 file changed, 40 insertions(+), 28 deletions(-)
20
21 --- a/drivers/net/usb/r8152.c
22 +++ b/drivers/net/usb/r8152.c
23 @@ -1371,6 +1371,10 @@ void write_mii_word(struct net_device *n
24 static int
25 r8152_submit_rx(struct r8152 *tp, struct rx_agg *agg, gfp_t mem_flags);
26
27 +static int
28 +rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u32 speed, u8 duplex,
29 + u32 advertising);
30 +
31 static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
32 {
33 struct r8152 *tp = netdev_priv(netdev);
34 @@ -3182,8 +3186,6 @@ static void r8153b_ups_en(struct r8152 *
35 ocp_data |= BIT(0);
36 ocp_write_byte(tp, MCU_TYPE_USB, 0xcfff, ocp_data);
37 } else {
38 - u16 data;
39 -
40 ocp_data &= ~(UPS_EN | USP_PREWAKE);
41 ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
42
43 @@ -3191,31 +3193,20 @@ static void r8153b_ups_en(struct r8152 *
44 ocp_data &= ~BIT(0);
45 ocp_write_byte(tp, MCU_TYPE_USB, 0xcfff, ocp_data);
46
47 - ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
48 - ocp_data &= ~PCUT_STATUS;
49 - ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
50 + if (ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0) & PCUT_STATUS) {
51 + int i;
52
53 - data = r8153_phy_status(tp, 0);
54 + for (i = 0; i < 500; i++) {
55 + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
56 + AUTOLOAD_DONE)
57 + break;
58 + msleep(20);
59 + }
60
61 - switch (data) {
62 - case PHY_STAT_PWRDN:
63 - case PHY_STAT_EXT_INIT:
64 - r8153b_green_en(tp,
65 - test_bit(GREEN_ETHERNET, &tp->flags));
66 -
67 - data = r8152_mdio_read(tp, MII_BMCR);
68 - data &= ~BMCR_PDOWN;
69 - data |= BMCR_RESET;
70 - r8152_mdio_write(tp, MII_BMCR, data);
71 + tp->rtl_ops.hw_phy_cfg(tp);
72
73 - data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
74 - fallthrough;
75 -
76 - default:
77 - if (data != PHY_STAT_LAN_ON)
78 - netif_warn(tp, link, tp->netdev,
79 - "PHY not ready");
80 - break;
81 + rtl8152_set_speed(tp, tp->autoneg, tp->speed,
82 + tp->duplex, tp->advertising);
83 }
84 }
85 }
86 @@ -4587,13 +4578,37 @@ static void r8153b_hw_phy_cfg(struct r81
87 u32 ocp_data;
88 u16 data;
89
90 + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
91 + if (ocp_data & PCUT_STATUS) {
92 + ocp_data &= ~PCUT_STATUS;
93 + ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
94 + }
95 +
96 /* disable ALDPS before updating the PHY parameters */
97 r8153_aldps_en(tp, false);
98
99 /* disable EEE before updating the PHY parameters */
100 rtl_eee_enable(tp, false);
101
102 - rtl8152_apply_firmware(tp, false);
103 + /* U1/U2/L1 idle timer. 500 us */
104 + ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500);
105 +
106 + data = r8153_phy_status(tp, 0);
107 +
108 + switch (data) {
109 + case PHY_STAT_PWRDN:
110 + case PHY_STAT_EXT_INIT:
111 + rtl8152_apply_firmware(tp, true);
112 +
113 + data = r8152_mdio_read(tp, MII_BMCR);
114 + data &= ~BMCR_PDOWN;
115 + r8152_mdio_write(tp, MII_BMCR, data);
116 + break;
117 + case PHY_STAT_LAN_ON:
118 + default:
119 + rtl8152_apply_firmware(tp, false);
120 + break;
121 + }
122
123 r8153b_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags));
124
125 @@ -5522,9 +5537,6 @@ static void r8153b_init(struct r8152 *tp
126 /* MSC timer = 0xfff * 8ms = 32760 ms */
127 ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff);
128
129 - /* U1/U2/L1 idle timer. 500 us */
130 - ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500);
131 -
132 r8153b_power_cut_en(tp, false);
133 r8153b_ups_en(tp, false);
134 r8153_queue_wake(tp, false);