kernel: bump 5.10 to 5.10.155
[openwrt/openwrt.git] / target / linux / generic / backport-5.10 / 792-v5.13-r8152-add-help-function-to-change-mtu.patch
1 From f010a7d51cbb42bdb956f0a28b8868b15d7a3816 Mon Sep 17 00:00:00 2001
2 From: Hayes Wang <hayeswang@realtek.com>
3 Date: Fri, 16 Apr 2021 16:04:34 +0800
4 Subject: [PATCH] r8152: add help function to change mtu
5
6 commit 67ce1a806f164e59a074fea8809725d3411eaa20 upstream.
7
8 The different chips may have different requests when changing mtu.
9 Therefore, add a new help function of rtl_ops to change mtu. Besides,
10 reset the tx/rx after changing mtu.
11
12 Additionally, add mtu_to_size() and size_to_mtu() macros to simplify
13 the code.
14
15 Signed-off-by: Hayes Wang <hayeswang@realtek.com>
16 Signed-off-by: David S. Miller <davem@davemloft.net>
17 ---
18 drivers/net/usb/r8152.c | 53 ++++++++++++++++++++++++-----------------
19 1 file changed, 31 insertions(+), 22 deletions(-)
20
21 --- a/drivers/net/usb/r8152.c
22 +++ b/drivers/net/usb/r8152.c
23 @@ -657,15 +657,13 @@ enum rtl_register_content {
24
25 #define INTR_LINK 0x0004
26
27 -#define RTL8153_MAX_PACKET 9216 /* 9K */
28 -#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
29 - ETH_FCS_LEN)
30 #define RTL8152_RMS (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
31 #define RTL8153_RMS RTL8153_MAX_PACKET
32 #define RTL8152_TX_TIMEOUT (5 * HZ)
33 #define RTL8152_NAPI_WEIGHT 64
34 -#define rx_reserved_size(x) ((x) + VLAN_ETH_HLEN + ETH_FCS_LEN + \
35 - sizeof(struct rx_desc) + RX_ALIGN)
36 +#define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN)
37 +#define size_to_mtu(s) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN)
38 +#define rx_reserved_size(x) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_ALIGN)
39
40 /* rtl8152 flags */
41 enum rtl8152_flags {
42 @@ -795,6 +793,7 @@ struct r8152 {
43 bool (*in_nway)(struct r8152 *tp);
44 void (*hw_phy_cfg)(struct r8152 *tp);
45 void (*autosuspend_en)(struct r8152 *tp, bool enable);
46 + void (*change_mtu)(struct r8152 *tp);
47 } rtl_ops;
48
49 struct ups_info {
50 @@ -1021,8 +1020,7 @@ enum tx_csum_stat {
51 static const int multicast_filter_limit = 32;
52 static unsigned int agg_buf_sz = 16384;
53
54 -#define RTL_LIMITED_TSO_SIZE (agg_buf_sz - sizeof(struct tx_desc) - \
55 - VLAN_ETH_HLEN - ETH_FCS_LEN)
56 +#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc))
57
58 static
59 int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
60 @@ -2634,10 +2632,7 @@ static void rtl8152_nic_reset(struct r81
61
62 static void set_tx_qlen(struct r8152 *tp)
63 {
64 - struct net_device *netdev = tp->netdev;
65 -
66 - tp->tx_qlen = agg_buf_sz / (netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN +
67 - sizeof(struct tx_desc));
68 + tp->tx_qlen = agg_buf_sz / (mtu_to_size(tp->netdev->mtu) + sizeof(struct tx_desc));
69 }
70
71 static inline u8 rtl8152_get_speed(struct r8152 *tp)
72 @@ -4726,6 +4721,12 @@ static void r8153b_hw_phy_cfg(struct r81
73 set_bit(PHY_RESET, &tp->flags);
74 }
75
76 +static void rtl8153_change_mtu(struct r8152 *tp)
77 +{
78 + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
79 + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
80 +}
81 +
82 static void r8153_first_init(struct r8152 *tp)
83 {
84 u32 ocp_data;
85 @@ -4758,9 +4759,7 @@ static void r8153_first_init(struct r815
86
87 rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX);
88
89 - ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
90 - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
91 - ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
92 + rtl8153_change_mtu(tp);
93
94 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
95 ocp_data |= TCR0_AUTO_FIFO;
96 @@ -4795,8 +4794,7 @@ static void r8153_enter_oob(struct r8152
97
98 wait_oob_link_list_ready(tp);
99
100 - ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
101 - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
102 + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
103
104 switch (tp->version) {
105 case RTL_VER_03:
106 @@ -6497,12 +6495,21 @@ static int rtl8152_change_mtu(struct net
107 dev->mtu = new_mtu;
108
109 if (netif_running(dev)) {
110 - u32 rms = new_mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
111 -
112 - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, rms);
113 + if (tp->rtl_ops.change_mtu)
114 + tp->rtl_ops.change_mtu(tp);
115
116 - if (netif_carrier_ok(dev))
117 - r8153_set_rx_early_size(tp);
118 + if (netif_carrier_ok(dev)) {
119 + netif_stop_queue(dev);
120 + napi_disable(&tp->napi);
121 + tasklet_disable(&tp->tx_tl);
122 + tp->rtl_ops.disable(tp);
123 + tp->rtl_ops.enable(tp);
124 + rtl_start_rx(tp);
125 + tasklet_enable(&tp->tx_tl);
126 + napi_enable(&tp->napi);
127 + rtl8152_set_rx_mode(dev);
128 + netif_wake_queue(dev);
129 + }
130 }
131
132 mutex_unlock(&tp->control);
133 @@ -6591,6 +6598,7 @@ static int rtl_ops_init(struct r8152 *tp
134 ops->in_nway = rtl8153_in_nway;
135 ops->hw_phy_cfg = r8153_hw_phy_cfg;
136 ops->autosuspend_en = rtl8153_runtime_enable;
137 + ops->change_mtu = rtl8153_change_mtu;
138 if (tp->udev->speed < USB_SPEED_SUPER)
139 tp->rx_buf_sz = 16 * 1024;
140 else
141 @@ -6612,6 +6620,7 @@ static int rtl_ops_init(struct r8152 *tp
142 ops->in_nway = rtl8153_in_nway;
143 ops->hw_phy_cfg = r8153b_hw_phy_cfg;
144 ops->autosuspend_en = rtl8153b_runtime_enable;
145 + ops->change_mtu = rtl8153_change_mtu;
146 tp->rx_buf_sz = 32 * 1024;
147 tp->eee_en = true;
148 tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
149 @@ -6832,7 +6841,7 @@ static int rtl8152_probe(struct usb_inte
150 netdev->max_mtu = ETH_DATA_LEN;
151 break;
152 default:
153 - netdev->max_mtu = RTL8153_MAX_MTU;
154 + netdev->max_mtu = size_to_mtu(9 * 1024);
155 break;
156 }
157