Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2024 Realtek Corporation. All rights reserved
3 : : */
4 : :
5 : : #include "../r8169_compat.h"
6 : : #include "../r8169_hw.h"
7 : : #include "../r8169_phy.h"
8 : : #include "rtl8168g.h"
9 : :
10 : : /* For RTL8168G,RTL8168GU, CFG_METHOD_21,22,24,25 */
11 : :
12 : : static void
13 : 0 : hw_init_rxcfg_8168g(struct rtl_hw *hw)
14 : : {
15 : 0 : RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
16 : : (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
17 : 0 : }
18 : :
19 : : static void
20 : 0 : hw_ephy_config_8168g(struct rtl_hw *hw)
21 : : {
22 : : u16 ephy_data;
23 : :
24 [ # # # ]: 0 : switch (hw->mcfg) {
25 : 0 : case CFG_METHOD_21:
26 : : case CFG_METHOD_22:
27 : 0 : ephy_data = rtl_ephy_read(hw, 0x00);
28 : 0 : ephy_data &= ~BIT_3;
29 : 0 : rtl_ephy_write(hw, 0x00, ephy_data);
30 : 0 : ephy_data = rtl_ephy_read(hw, 0x0C);
31 : 0 : ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
32 : : BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
33 : 0 : ephy_data |= (BIT_5 | BIT_11);
34 : 0 : rtl_ephy_write(hw, 0x0C, ephy_data);
35 : :
36 : 0 : ephy_data = rtl_ephy_read(hw, 0x1E);
37 : 0 : ephy_data |= BIT_0;
38 : 0 : rtl_ephy_write(hw, 0x1E, ephy_data);
39 : :
40 : 0 : ephy_data = rtl_ephy_read(hw, 0x19);
41 : 0 : ephy_data &= ~BIT_15;
42 : 0 : rtl_ephy_write(hw, 0x19, ephy_data);
43 : 0 : break;
44 : 0 : case CFG_METHOD_25:
45 : 0 : ephy_data = rtl_ephy_read(hw, 0x00);
46 : 0 : ephy_data &= ~BIT_3;
47 : 0 : rtl_ephy_write(hw, 0x00, ephy_data);
48 : 0 : ephy_data = rtl_ephy_read(hw, 0x0C);
49 : 0 : ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
50 : : BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
51 : 0 : ephy_data |= (BIT_5 | BIT_11);
52 : 0 : rtl_ephy_write(hw, 0x0C, ephy_data);
53 : :
54 : 0 : rtl_ephy_write(hw, 0x19, 0x7C00);
55 : 0 : rtl_ephy_write(hw, 0x1E, 0x20EB);
56 : 0 : rtl_ephy_write(hw, 0x0D, 0x1666);
57 : 0 : rtl_ephy_write(hw, 0x00, 0x10A3);
58 : 0 : rtl_ephy_write(hw, 0x06, 0xF050);
59 : :
60 : 0 : rtl_set_pcie_phy_bit(hw, 0x04, BIT_4);
61 : 0 : rtl_clear_pcie_phy_bit(hw, 0x1D, BIT_14);
62 : 0 : break;
63 : : default:
64 : : break;
65 : : }
66 : 0 : }
67 : :
68 : : static void
69 : 0 : hw_phy_config_8168g_1(struct rtl_hw *hw)
70 : : {
71 : : u16 gphy_val;
72 : :
73 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A46);
74 : 0 : gphy_val = rtl_mdio_read(hw, 0x10);
75 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCC);
76 [ # # ]: 0 : if (gphy_val & BIT_8)
77 : 0 : rtl_clear_eth_phy_bit(hw, 0x12, BIT_15);
78 : : else
79 : 0 : rtl_set_eth_phy_bit(hw, 0x12, BIT_15);
80 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A46);
81 : 0 : gphy_val = rtl_mdio_read(hw, 0x13);
82 : 0 : rtl_mdio_write(hw, 0x1F, 0x0C41);
83 [ # # ]: 0 : if (gphy_val & BIT_8)
84 : 0 : rtl_set_eth_phy_bit(hw, 0x15, BIT_1);
85 : : else
86 : 0 : rtl_clear_eth_phy_bit(hw, 0x15, BIT_1);
87 : :
88 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
89 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2 | BIT_3);
90 : :
91 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCC);
92 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
93 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
94 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
95 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
96 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
97 : 0 : rtl_mdio_write(hw, 0x13, 0x8084);
98 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
99 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
100 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
101 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
102 : :
103 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A4B);
104 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2);
105 : :
106 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
107 : 0 : rtl_mdio_write(hw, 0x13, 0x8012);
108 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
109 : :
110 : 0 : rtl_mdio_write(hw, 0x1F, 0x0C42);
111 : 0 : gphy_val = rtl_mdio_read(hw, 0x11);
112 : : gphy_val |= BIT_14;
113 : 0 : gphy_val &= ~BIT_13;
114 : 0 : rtl_mdio_write(hw, 0x11, gphy_val);
115 : :
116 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
117 : 0 : rtl_mdio_write(hw, 0x13, 0x809A);
118 : 0 : rtl_mdio_write(hw, 0x14, 0x8022);
119 : 0 : rtl_mdio_write(hw, 0x13, 0x80A0);
120 : 0 : gphy_val = rtl_mdio_read(hw, 0x14) & 0x00FF;
121 : 0 : gphy_val |= 0x1000;
122 : 0 : rtl_mdio_write(hw, 0x14, gphy_val);
123 : 0 : rtl_mdio_write(hw, 0x13, 0x8088);
124 : 0 : rtl_mdio_write(hw, 0x14, 0x9222);
125 : :
126 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
127 : 0 : }
128 : :
129 : : static void
130 : 0 : hw_phy_config_8168g_2(struct rtl_hw *hw)
131 : : {
132 : : u16 gphy_val;
133 : :
134 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCC);
135 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
136 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
137 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
138 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
139 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
140 : 0 : rtl_mdio_write(hw, 0x13, 0x8084);
141 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
142 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
143 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
144 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
145 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
146 : 0 : rtl_mdio_write(hw, 0x13, 0x8012);
147 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
148 : :
149 : 0 : rtl_mdio_write(hw, 0x1F, 0x0C42);
150 : 0 : gphy_val = rtl_mdio_read(hw, 0x11);
151 : : gphy_val |= BIT_14;
152 : 0 : gphy_val &= ~BIT_13;
153 : 0 : rtl_mdio_write(hw, 0x11, gphy_val);
154 : 0 : }
155 : :
156 : : static void
157 : 0 : hw_phy_config_8168g_3(struct rtl_hw *hw)
158 : : {
159 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCC);
160 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
161 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
162 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
163 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
164 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
165 : 0 : rtl_mdio_write(hw, 0x13, 0x8084);
166 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
167 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
168 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
169 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
170 : :
171 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
172 : 0 : rtl_mdio_write(hw, 0x13, 0x8012);
173 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
174 : :
175 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCE);
176 : 0 : rtl_mdio_write(hw, 0x12, 0x8860);
177 : :
178 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
179 : 0 : rtl_mdio_write(hw, 0x13, 0x80F3);
180 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00);
181 : 0 : rtl_mdio_write(hw, 0x13, 0x80F0);
182 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00);
183 : 0 : rtl_mdio_write(hw, 0x13, 0x80EF);
184 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500);
185 : 0 : rtl_mdio_write(hw, 0x13, 0x80F6);
186 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00);
187 : 0 : rtl_mdio_write(hw, 0x13, 0x80EC);
188 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800);
189 : 0 : rtl_mdio_write(hw, 0x13, 0x80ED);
190 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
191 : 0 : rtl_mdio_write(hw, 0x13, 0x80F2);
192 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400);
193 : 0 : rtl_mdio_write(hw, 0x13, 0x80F4);
194 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500);
195 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
196 : 0 : rtl_mdio_write(hw, 0x13, 0x8110);
197 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800);
198 : 0 : rtl_mdio_write(hw, 0x13, 0x810F);
199 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00);
200 : 0 : rtl_mdio_write(hw, 0x13, 0x8111);
201 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500);
202 : 0 : rtl_mdio_write(hw, 0x13, 0x8113);
203 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100);
204 : 0 : rtl_mdio_write(hw, 0x13, 0x8115);
205 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200);
206 : 0 : rtl_mdio_write(hw, 0x13, 0x810E);
207 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400);
208 : 0 : rtl_mdio_write(hw, 0x13, 0x810C);
209 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
210 : 0 : rtl_mdio_write(hw, 0x13, 0x810B);
211 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00);
212 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
213 : 0 : rtl_mdio_write(hw, 0x13, 0x80D1);
214 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00);
215 : 0 : rtl_mdio_write(hw, 0x13, 0x80CD);
216 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00);
217 : 0 : rtl_mdio_write(hw, 0x13, 0x80D3);
218 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00);
219 : 0 : rtl_mdio_write(hw, 0x13, 0x80D5);
220 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00);
221 : 0 : rtl_mdio_write(hw, 0x13, 0x80D7);
222 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400);
223 : 0 : }
224 : :
225 : : static void
226 : 0 : hw_phy_config_8168g(struct rtl_hw *hw)
227 : : {
228 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_21)
229 : 0 : hw_phy_config_8168g_1(hw);
230 [ # # ]: 0 : else if (hw->mcfg == CFG_METHOD_24)
231 : 0 : hw_phy_config_8168g_2(hw);
232 [ # # ]: 0 : else if (hw->mcfg == CFG_METHOD_25)
233 : 0 : hw_phy_config_8168g_3(hw);
234 : :
235 : : /* Disable EthPhyPPSW */
236 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCD);
237 : 0 : rtl_mdio_write(hw, 0x14, 0x5065);
238 : 0 : rtl_mdio_write(hw, 0x14, 0xD065);
239 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BC8);
240 : 0 : rtl_mdio_write(hw, 0x11, 0x5655);
241 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCD);
242 : 0 : rtl_mdio_write(hw, 0x14, 0x1065);
243 : 0 : rtl_mdio_write(hw, 0x14, 0x9065);
244 : 0 : rtl_mdio_write(hw, 0x14, 0x1065);
245 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
246 : 0 : }
247 : :
248 : : static void
249 : 0 : hw_config_8168g(struct rtl_hw *hw)
250 : : {
251 : : u32 csi_tmp;
252 : :
253 : : /* Share fifo rx params */
254 : 0 : rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
255 : 0 : rtl_eri_write(hw, 0xCC, 1, 0x38, ERIAR_ExGMAC);
256 : 0 : rtl_eri_write(hw, 0xD0, 1, 0x48, ERIAR_ExGMAC);
257 : 0 : rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
258 : :
259 : : /* Adjust the trx fifo*/
260 : 0 : rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
261 : 0 : rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
262 : :
263 : : /* Disable share fifo */
264 : 0 : RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
265 : :
266 : 0 : RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
267 : :
268 : : /* EEE led enable */
269 : 0 : RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
270 : :
271 : 0 : RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En);
272 : :
273 : : /* CRC wake disable */
274 : 0 : rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
275 : :
276 : 0 : csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC);
277 : 0 : csi_tmp &= ~BIT_12;
278 : 0 : rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
279 : :
280 : 0 : csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC);
281 : 0 : csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2);
282 : 0 : csi_tmp |= BIT_0;
283 : 0 : rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
284 : :
285 : 0 : csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC);
286 : 0 : csi_tmp |= BIT_1;
287 : 0 : rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
288 : 0 : }
289 : :
290 : : const struct rtl_hw_ops rtl8168g_ops = {
291 : : .hw_config = hw_config_8168g,
292 : : .hw_init_rxcfg = hw_init_rxcfg_8168g,
293 : : .hw_ephy_config = hw_ephy_config_8168g,
294 : : .hw_phy_config = hw_phy_config_8168g,
295 : : .hw_mac_mcu_config = hw_mac_mcu_config_8168g,
296 : : .hw_phy_mcu_config = hw_phy_mcu_config_8168g,
297 : : };
|