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 <stdio.h>
6 : : #include <errno.h>
7 : : #include <stdint.h>
8 : :
9 : : #include <rte_ether.h>
10 : : #include <ethdev_pci.h>
11 : :
12 : : #include "r8169_ethdev.h"
13 : : #include "r8169_hw.h"
14 : : #include "r8169_phy.h"
15 : : #include "r8169_logs.h"
16 : : #include "r8169_dash.h"
17 : : #include "r8169_fiber.h"
18 : :
19 : : static u16
20 : : rtl_map_phy_ocp_addr(u16 PageNum, u8 RegNum)
21 : : {
22 : : u8 ocp_reg_num = 0;
23 : : u16 ocp_page_num = 0;
24 : : u16 ocp_phy_address = 0;
25 : :
26 : 0 : if (PageNum == 0) {
27 : 0 : ocp_page_num = OCP_STD_PHY_BASE_PAGE + (RegNum / 8);
28 : 0 : ocp_reg_num = 0x10 + (RegNum % 8);
29 : : } else {
30 : : ocp_page_num = PageNum;
31 : : ocp_reg_num = RegNum;
32 : : }
33 : :
34 : 0 : ocp_page_num <<= 4;
35 : :
36 [ # # # # ]: 0 : if (ocp_reg_num < 16) {
37 : : ocp_phy_address = 0;
38 : : } else {
39 : 0 : ocp_reg_num -= 16;
40 : 0 : ocp_reg_num <<= 1;
41 : :
42 : 0 : ocp_phy_address = ocp_page_num + ocp_reg_num;
43 : : }
44 : :
45 : : return ocp_phy_address;
46 : : }
47 : :
48 : : static u32
49 : 0 : rtl_mdio_real_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
50 : : {
51 : : u32 data32;
52 : : int i, value = 0;
53 : :
54 : 0 : data32 = RegAddr / 2;
55 : 0 : data32 <<= OCPR_Addr_Reg_shift;
56 : :
57 : 0 : RTL_W32(hw, PHYOCP, data32);
58 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
59 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
60 : :
61 [ # # ]: 0 : if (RTL_R32(hw, PHYOCP) & OCPR_Flag)
62 : : break;
63 : : }
64 : 0 : value = RTL_R32(hw, PHYOCP) & OCPDR_Data_Mask;
65 : :
66 : 0 : return value;
67 : : }
68 : :
69 : : u32
70 : 0 : rtl_mdio_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
71 : : {
72 : 0 : return rtl_mdio_real_direct_read_phy_ocp(hw, RegAddr);
73 : : }
74 : :
75 : : u32
76 : 0 : rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr)
77 : : {
78 : : u16 ocp_addr;
79 : :
80 [ # # ]: 0 : ocp_addr = rtl_map_phy_ocp_addr(PageNum, RegAddr);
81 : :
82 : 0 : return rtl_mdio_real_direct_read_phy_ocp(hw, ocp_addr);
83 : : }
84 : :
85 : : static u32
86 : : rtl_mdio_real_read(struct rtl_hw *hw, u32 RegAddr)
87 : : {
88 : 0 : return rtl_mdio_real_read_phy_ocp(hw, hw->cur_page, RegAddr);
89 : : }
90 : :
91 : : u32
92 : 0 : rtl_mdio_read(struct rtl_hw *hw, u32 RegAddr)
93 : : {
94 : 0 : return rtl_mdio_real_read(hw, RegAddr);
95 : : }
96 : :
97 : : static void
98 : 0 : rtl_mdio_real_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
99 : : {
100 : : u32 data32;
101 : : int i;
102 : :
103 : 0 : data32 = RegAddr / 2;
104 : 0 : data32 <<= OCPR_Addr_Reg_shift;
105 : 0 : data32 |= OCPR_Write | value;
106 : :
107 : 0 : RTL_W32(hw, PHYOCP, data32);
108 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
109 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
110 : :
111 [ # # ]: 0 : if (!(RTL_R32(hw, PHYOCP) & OCPR_Flag))
112 : : break;
113 : : }
114 : 0 : }
115 : :
116 : : void
117 : 0 : rtl_mdio_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
118 : : {
119 : 0 : rtl_mdio_real_direct_write_phy_ocp(hw, RegAddr, value);
120 : 0 : }
121 : :
122 : : void
123 : 0 : rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value)
124 : : {
125 : : u16 ocp_addr;
126 : :
127 [ # # ]: 0 : ocp_addr = rtl_map_phy_ocp_addr(PageNum, RegAddr);
128 : :
129 : 0 : rtl_mdio_direct_write_phy_ocp(hw, ocp_addr, value);
130 : 0 : }
131 : :
132 : : static void
133 : : rtl_mdio_real_write(struct rtl_hw *hw, u32 RegAddr, u32 value)
134 : : {
135 : 0 : if (RegAddr == 0x1F) {
136 : 0 : hw->cur_page = value;
137 : 0 : return;
138 : : }
139 : 0 : rtl_mdio_real_write_phy_ocp(hw, hw->cur_page, RegAddr, value);
140 : : }
141 : :
142 : : void
143 [ # # ]: 0 : rtl_mdio_write(struct rtl_hw *hw, u32 RegAddr, u32 value)
144 : : {
145 : : rtl_mdio_real_write(hw, RegAddr, value);
146 : 0 : }
147 : :
148 : : void
149 : 0 : rtl_clear_and_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
150 : : u16 setmask)
151 : : {
152 : : u16 val;
153 : :
154 : 0 : val = rtl_mdio_direct_read_phy_ocp(hw, addr);
155 : 0 : val &= ~clearmask;
156 : 0 : val |= setmask;
157 : 0 : rtl_mdio_direct_write_phy_ocp(hw, addr, val);
158 : 0 : }
159 : :
160 : : void
161 : 0 : rtl_clear_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
162 : : {
163 : 0 : rtl_clear_and_set_eth_phy_ocp_bit(hw, addr, mask, 0);
164 : 0 : }
165 : :
166 : : void
167 : 0 : rtl_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
168 : : {
169 : 0 : rtl_clear_and_set_eth_phy_ocp_bit(hw, addr, 0, mask);
170 : 0 : }
171 : :
172 : : static u8
173 : 0 : rtl8168_check_ephy_addr(struct rtl_hw *hw, int addr)
174 : : {
175 [ # # ]: 0 : if (hw->mcfg != CFG_METHOD_35 && hw->mcfg != CFG_METHOD_36)
176 : 0 : goto exit;
177 : :
178 [ # # ]: 0 : if (addr & (BIT_6 | BIT_5))
179 : 0 : rtl8168_clear_and_set_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0),
180 : 0 : (addr >> 5) & (BIT_1 | BIT_0));
181 : :
182 : 0 : addr &= 0x1F;
183 : :
184 : 0 : exit:
185 : 0 : return addr;
186 : : }
187 : :
188 : : static void
189 : 0 : _rtl_ephy_write(struct rtl_hw *hw, int addr, int value, unsigned int mask)
190 : : {
191 : : int i;
192 : :
193 : 0 : RTL_W32(hw, EPHYAR, EPHYAR_Write | (addr & mask) << EPHYAR_Reg_shift |
194 : : (value & EPHYAR_Data_Mask));
195 : :
196 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
197 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
198 : :
199 : : /* Check if the NIC has completed EPHY write */
200 [ # # ]: 0 : if (!(RTL_R32(hw, EPHYAR) & EPHYAR_Flag))
201 : : break;
202 : : }
203 : :
204 : 0 : rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
205 : 0 : }
206 : :
207 : : static void
208 : : rtl8127_set_ephy_ext_addr(struct rtl_hw *hw, int addr)
209 : : {
210 : 0 : _rtl_ephy_write(hw, EPHYAR_EXT_ADDR, addr, EPHYAR_Reg_Mask_v2);
211 : : }
212 : :
213 : : static int
214 : : rtl8127_check_ephy_ext_addr(struct rtl_hw *hw, int addr)
215 : : {
216 : : int data;
217 : :
218 : 0 : data = ((u16)addr >> 12);
219 : :
220 : : rtl8127_set_ephy_ext_addr(hw, data);
221 : :
222 : 0 : return (addr & 0xfff);
223 : : }
224 : :
225 : : void
226 : 0 : rtl_ephy_write(struct rtl_hw *hw, int addr, int value)
227 : : {
228 : : unsigned int mask;
229 : :
230 [ # # ]: 0 : if (!rtl_is_8125(hw)) {
231 : : mask = EPHYAR_Reg_Mask;
232 : 0 : addr = rtl8168_check_ephy_addr(hw, addr);
233 [ # # ]: 0 : } else if (hw->mcfg >= CFG_METHOD_91) {
234 : : mask = EPHYAR_Reg_Mask_v2;
235 : : addr = rtl8127_check_ephy_ext_addr(hw, addr);
236 : : } else {
237 : : mask = EPHYAR_Reg_Mask_v2;
238 : : }
239 : :
240 : 0 : _rtl_ephy_write(hw, addr, value, mask);
241 : 0 : }
242 : :
243 : : static u16
244 : 0 : _rtl_ephy_read(struct rtl_hw *hw, int addr, unsigned int mask)
245 : : {
246 : : int i;
247 : : u16 value = 0xffff;
248 : :
249 : 0 : RTL_W32(hw, EPHYAR, EPHYAR_Read | (addr & mask) << EPHYAR_Reg_shift);
250 : :
251 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
252 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
253 : :
254 : : /* Check if the NIC has completed EPHY read */
255 [ # # ]: 0 : if (RTL_R32(hw, EPHYAR) & EPHYAR_Flag) {
256 : 0 : value = (u16)(RTL_R32(hw, EPHYAR) & EPHYAR_Data_Mask);
257 : 0 : break;
258 : : }
259 : : }
260 : :
261 : 0 : rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
262 : :
263 : 0 : return value;
264 : : }
265 : :
266 : : u16
267 : 0 : rtl_ephy_read(struct rtl_hw *hw, int addr)
268 : : {
269 : : unsigned int mask;
270 : :
271 [ # # ]: 0 : if (!rtl_is_8125(hw)) {
272 : : mask = EPHYAR_Reg_Mask;
273 : 0 : addr = rtl8168_check_ephy_addr(hw, addr);
274 [ # # ]: 0 : } else if (hw->mcfg >= CFG_METHOD_91) {
275 : : mask = EPHYAR_Reg_Mask_v2;
276 : : addr = rtl8127_check_ephy_ext_addr(hw, addr);
277 : : } else {
278 : : mask = EPHYAR_Reg_Mask_v2;
279 : : }
280 : :
281 : 0 : return _rtl_ephy_read(hw, addr, mask);
282 : : }
283 : :
284 : : void
285 : 0 : rtl_clear_and_set_pcie_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
286 : : u16 setmask)
287 : : {
288 : : u16 ephy_value;
289 : :
290 : 0 : ephy_value = rtl_ephy_read(hw, addr);
291 : 0 : ephy_value &= ~clearmask;
292 : 0 : ephy_value |= setmask;
293 : 0 : rtl_ephy_write(hw, addr, ephy_value);
294 : 0 : }
295 : :
296 : : void
297 : 0 : rtl_clear_pcie_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
298 : : {
299 : 0 : rtl_clear_and_set_pcie_phy_bit(hw, addr, mask, 0);
300 : 0 : }
301 : :
302 : : void
303 : 0 : rtl_set_pcie_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
304 : : {
305 : 0 : rtl_clear_and_set_pcie_phy_bit(hw, addr, 0, mask);
306 : 0 : }
307 : :
308 : : bool
309 : 0 : rtl_set_phy_mcu_patch_request(struct rtl_hw *hw)
310 : : {
311 : : u16 gphy_val;
312 : : u16 wait_cnt;
313 : : bool bool_success = TRUE;
314 : :
315 [ # # ]: 0 : if (rtl_is_8125(hw)) {
316 : 0 : rtl_set_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
317 : :
318 : : wait_cnt = 0;
319 : : do {
320 : 0 : gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
321 : 0 : rte_delay_us(100);
322 : 0 : wait_cnt++;
323 [ # # # # ]: 0 : } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
324 : :
325 [ # # # # ]: 0 : if (!(gphy_val & BIT_6) && wait_cnt == 1000)
326 : : bool_success = FALSE;
327 : : } else {
328 : 0 : rtl_mdio_write(hw, 0x1f, 0x0B82);
329 : 0 : rtl_set_eth_phy_bit(hw, 0x10, BIT_4);
330 : :
331 : 0 : rtl_mdio_write(hw, 0x1f, 0x0B80);
332 : : wait_cnt = 0;
333 : : do {
334 : 0 : gphy_val = rtl_mdio_read(hw, 0x10);
335 : 0 : rte_delay_us(100);
336 : 0 : wait_cnt++;
337 [ # # # # ]: 0 : } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
338 : :
339 [ # # # # ]: 0 : if (!(gphy_val & BIT_6) && wait_cnt == 1000)
340 : : bool_success = FALSE;
341 : :
342 : 0 : rtl_mdio_write(hw, 0x1f, 0x0000);
343 : : }
344 : :
345 [ # # ]: 0 : if (!bool_success)
346 : 0 : PMD_INIT_LOG(NOTICE, "%s fail.", __func__);
347 : :
348 : 0 : return bool_success;
349 : : }
350 : :
351 : : bool
352 : 0 : rtl_clear_phy_mcu_patch_request(struct rtl_hw *hw)
353 : : {
354 : : u16 gphy_val;
355 : : u16 wait_cnt;
356 : : bool bool_success = TRUE;
357 : :
358 [ # # ]: 0 : if (rtl_is_8125(hw)) {
359 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
360 : :
361 : : wait_cnt = 0;
362 : : do {
363 : 0 : gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
364 : 0 : rte_delay_us(100);
365 : 0 : wait_cnt++;
366 [ # # # # ]: 0 : } while ((gphy_val & BIT_6) && (wait_cnt < 1000));
367 : :
368 [ # # # # ]: 0 : if ((gphy_val & BIT_6) && wait_cnt == 1000)
369 : : bool_success = FALSE;
370 : : } else {
371 : 0 : rtl_mdio_write(hw, 0x1f, 0x0B82);
372 : 0 : rtl_clear_eth_phy_bit(hw, 0x10, BIT_4);
373 : :
374 : 0 : rtl_mdio_write(hw, 0x1f, 0x0B80);
375 : : wait_cnt = 0;
376 : : do {
377 : 0 : gphy_val = rtl_mdio_read(hw, 0x10);
378 : 0 : rte_delay_us(100);
379 : 0 : wait_cnt++;
380 [ # # # # ]: 0 : } while ((gphy_val & BIT_6) && (wait_cnt < 1000));
381 : :
382 [ # # # # ]: 0 : if ((gphy_val & BIT_6) && wait_cnt == 1000)
383 : : bool_success = FALSE;
384 : :
385 : 0 : rtl_mdio_write(hw, 0x1f, 0x0000);
386 : : }
387 : :
388 [ # # ]: 0 : if (!bool_success)
389 : 0 : PMD_INIT_LOG(NOTICE, "%s fail.", __func__);
390 : :
391 : 0 : return bool_success;
392 : : }
393 : :
394 : : void
395 : 0 : rtl_set_phy_mcu_ram_code(struct rtl_hw *hw, const u16 *ramcode, u16 codesize)
396 : : {
397 : : u16 i;
398 : : u16 addr;
399 : : u16 val;
400 : :
401 [ # # # # ]: 0 : if (ramcode == NULL || codesize % 2)
402 : 0 : goto out;
403 : :
404 [ # # ]: 0 : for (i = 0; i < codesize; i += 2) {
405 : 0 : addr = ramcode[i];
406 : 0 : val = ramcode[i + 1];
407 [ # # ]: 0 : if (addr == 0xFFFF && val == 0xFFFF)
408 : : break;
409 : 0 : rtl_mdio_direct_write_phy_ocp(hw, addr, val);
410 : : }
411 : :
412 : 0 : out:
413 : 0 : return;
414 : : }
415 : :
416 : : static u8
417 : 0 : rtl_is_phy_disable_mode_enabled(struct rtl_hw *hw)
418 : : {
419 : : u8 phy_disable_mode_enabled = FALSE;
420 : :
421 [ # # # ]: 0 : switch (hw->HwSuppCheckPhyDisableModeVer) {
422 : 0 : case 1:
423 [ # # ]: 0 : if (rtl_mac_ocp_read(hw, 0xDC20) & BIT_1)
424 : : phy_disable_mode_enabled = TRUE;
425 : : break;
426 : 0 : case 2:
427 : : case 3:
428 [ # # ]: 0 : if (RTL_R8(hw, 0xF2) & BIT_5)
429 : : phy_disable_mode_enabled = TRUE;
430 : : break;
431 : : }
432 : :
433 : 0 : return phy_disable_mode_enabled;
434 : : }
435 : :
436 : : static u8
437 : 0 : rtl_is_gpio_low(struct rtl_hw *hw)
438 : : {
439 : : u8 gpio_low = FALSE;
440 : :
441 [ # # # ]: 0 : switch (hw->HwSuppCheckPhyDisableModeVer) {
442 : 0 : case 1:
443 : : case 2:
444 [ # # ]: 0 : if (!(rtl_mac_ocp_read(hw, 0xDC04) & BIT_9))
445 : : gpio_low = TRUE;
446 : : break;
447 : 0 : case 3:
448 [ # # ]: 0 : if (!(rtl_mac_ocp_read(hw, 0xDC04) & BIT_13))
449 : : gpio_low = TRUE;
450 : : break;
451 : : }
452 : :
453 : 0 : return gpio_low;
454 : : }
455 : :
456 : : static u8
457 : 0 : rtl_is_in_phy_disable_mode(struct rtl_hw *hw)
458 : : {
459 : : u8 in_phy_disable_mode = FALSE;
460 : :
461 [ # # # # ]: 0 : if (rtl_is_phy_disable_mode_enabled(hw) && rtl_is_gpio_low(hw))
462 : : in_phy_disable_mode = TRUE;
463 : :
464 : 0 : return in_phy_disable_mode;
465 : : }
466 : :
467 : : static void
468 : 0 : rtl_wait_phy_ups_resume(struct rtl_hw *hw, u16 PhyState)
469 : : {
470 : : u16 tmp_phy_state;
471 : : int i = 0;
472 : :
473 [ # # # ]: 0 : switch (hw->mcfg) {
474 : 0 : case CFG_METHOD_29:
475 : : case CFG_METHOD_30:
476 : : case CFG_METHOD_31:
477 : : case CFG_METHOD_32:
478 : : case CFG_METHOD_33:
479 : : case CFG_METHOD_34:
480 : : case CFG_METHOD_35:
481 : : case CFG_METHOD_36:
482 : : do {
483 : 0 : tmp_phy_state = rtl_mdio_real_read_phy_ocp(hw, 0x0A42, 0x10);
484 : 0 : tmp_phy_state &= 0x7;
485 : : rte_delay_ms(1);
486 : 0 : i++;
487 [ # # ]: 0 : } while ((i < 100) && (tmp_phy_state != PhyState));
488 : : break;
489 : 0 : case CFG_METHOD_48:
490 : : case CFG_METHOD_49:
491 : : case CFG_METHOD_50:
492 : : case CFG_METHOD_51:
493 : : case CFG_METHOD_52:
494 : : case CFG_METHOD_53:
495 : : case CFG_METHOD_54:
496 : : case CFG_METHOD_55:
497 : : case CFG_METHOD_56:
498 : : case CFG_METHOD_57:
499 : : case CFG_METHOD_58:
500 : : case CFG_METHOD_69:
501 : : case CFG_METHOD_70:
502 : : case CFG_METHOD_71:
503 : : case CFG_METHOD_91:
504 : : do {
505 : 0 : tmp_phy_state = rtl_mdio_direct_read_phy_ocp(hw, 0xA420);
506 : 0 : tmp_phy_state &= 0x7;
507 : : rte_delay_ms(1);
508 : 0 : i++;
509 [ # # ]: 0 : } while ((i < 100) && (tmp_phy_state != PhyState));
510 : : break;
511 : : }
512 : 0 : }
513 : :
514 : : static void
515 : 0 : rtl_phy_power_up(struct rtl_hw *hw)
516 : : {
517 [ # # ]: 0 : if (rtl_is_in_phy_disable_mode(hw))
518 : : return;
519 : :
520 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
521 : :
522 : 0 : rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE);
523 : :
524 : : /* Wait mdc/mdio ready */
525 [ # # ]: 0 : switch (hw->mcfg) {
526 : : case CFG_METHOD_23:
527 : : case CFG_METHOD_27:
528 : : case CFG_METHOD_28:
529 : : rte_delay_ms(10);
530 : : break;
531 : : }
532 : :
533 : : /* Wait ups resume (phy state 3) */
534 : 0 : rtl_wait_phy_ups_resume(hw, 3);
535 : : }
536 : :
537 : : void
538 : 0 : rtl_powerup_pll(struct rtl_hw *hw)
539 : : {
540 [ # # ]: 0 : switch (hw->mcfg) {
541 : 0 : case CFG_METHOD_21:
542 : : case CFG_METHOD_22:
543 : : case CFG_METHOD_24:
544 : : case CFG_METHOD_25:
545 : : case CFG_METHOD_26:
546 : : case CFG_METHOD_27:
547 : : case CFG_METHOD_28:
548 : : case CFG_METHOD_29:
549 : : case CFG_METHOD_30:
550 : : case CFG_METHOD_31:
551 : : case CFG_METHOD_32:
552 : : case CFG_METHOD_33:
553 : : case CFG_METHOD_34:
554 : : case CFG_METHOD_35:
555 : : case CFG_METHOD_36:
556 : : case CFG_METHOD_48:
557 : : case CFG_METHOD_49:
558 : : case CFG_METHOD_50:
559 : : case CFG_METHOD_51:
560 : : case CFG_METHOD_52:
561 : : case CFG_METHOD_53:
562 : : case CFG_METHOD_54:
563 : : case CFG_METHOD_55:
564 : : case CFG_METHOD_56:
565 : : case CFG_METHOD_57:
566 : : case CFG_METHOD_58:
567 : : case CFG_METHOD_69:
568 : : case CFG_METHOD_70:
569 : : case CFG_METHOD_71:
570 : : case CFG_METHOD_91:
571 : 0 : RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) | BIT_7 | BIT_6);
572 : : break;
573 : : }
574 : :
575 : 0 : rtl_phy_power_up(hw);
576 : 0 : }
577 : :
578 : : static void
579 : 0 : rtl_phy_power_down(struct rtl_hw *hw)
580 : : {
581 : : u32 csi_tmp;
582 : :
583 : : /* MCU PME intr masks */
584 [ # # # ]: 0 : switch (hw->mcfg) {
585 : 0 : case CFG_METHOD_21:
586 : : case CFG_METHOD_22:
587 : : case CFG_METHOD_23:
588 : : case CFG_METHOD_24:
589 : 0 : csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
590 : 0 : csi_tmp &= ~(BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
591 : 0 : rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
592 : 0 : break;
593 : 0 : case CFG_METHOD_25:
594 : : case CFG_METHOD_27:
595 : : case CFG_METHOD_28:
596 : : case CFG_METHOD_29:
597 : : case CFG_METHOD_30:
598 : : case CFG_METHOD_31:
599 : : case CFG_METHOD_32:
600 : : case CFG_METHOD_33:
601 : : case CFG_METHOD_34:
602 : : case CFG_METHOD_35:
603 : : case CFG_METHOD_36:
604 : : case CFG_METHOD_37:
605 : 0 : csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
606 : 0 : csi_tmp &= ~(BIT_3 | BIT_6);
607 : 0 : rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
608 : 0 : break;
609 : : }
610 : :
611 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
612 : :
613 [ # # ]: 0 : switch (hw->mcfg) {
614 : 0 : case CFG_METHOD_21:
615 : : case CFG_METHOD_22:
616 : : case CFG_METHOD_23:
617 : : case CFG_METHOD_24:
618 : : case CFG_METHOD_29:
619 : : case CFG_METHOD_30:
620 : : case CFG_METHOD_35:
621 : : case CFG_METHOD_36:
622 : : case CFG_METHOD_37:
623 : : case CFG_METHOD_48:
624 : : case CFG_METHOD_49:
625 : : case CFG_METHOD_50:
626 : : case CFG_METHOD_51:
627 : : case CFG_METHOD_52:
628 : : case CFG_METHOD_53:
629 : : case CFG_METHOD_54:
630 : : case CFG_METHOD_55:
631 : : case CFG_METHOD_56:
632 : : case CFG_METHOD_57:
633 : : case CFG_METHOD_58:
634 : : case CFG_METHOD_69:
635 : : case CFG_METHOD_70:
636 : : case CFG_METHOD_71:
637 : : case CFG_METHOD_91:
638 : 0 : rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
639 : 0 : break;
640 : 0 : default:
641 : 0 : rtl_mdio_write(hw, MII_BMCR, BMCR_PDOWN);
642 : 0 : break;
643 : : }
644 : 0 : }
645 : :
646 : : void
647 : 0 : rtl_powerdown_pll(struct rtl_hw *hw)
648 : : {
649 [ # # ]: 0 : if (hw->DASH)
650 : : return;
651 : :
652 : 0 : rtl_phy_power_down(hw);
653 : :
654 [ # # ]: 0 : if (!hw->HwIcVerUnknown) {
655 [ # # ]: 0 : switch (hw->mcfg) {
656 : 0 : case CFG_METHOD_21:
657 : : case CFG_METHOD_22:
658 : : case CFG_METHOD_24:
659 : : case CFG_METHOD_25:
660 : : case CFG_METHOD_26:
661 : : case CFG_METHOD_27:
662 : : case CFG_METHOD_28:
663 : : case CFG_METHOD_29:
664 : : case CFG_METHOD_30:
665 : : case CFG_METHOD_31:
666 : : case CFG_METHOD_32:
667 : : case CFG_METHOD_33:
668 : : case CFG_METHOD_34:
669 : : case CFG_METHOD_35:
670 : : case CFG_METHOD_36:
671 : : case CFG_METHOD_48:
672 : : case CFG_METHOD_49:
673 : : case CFG_METHOD_50:
674 : : case CFG_METHOD_51:
675 : : case CFG_METHOD_52:
676 : : case CFG_METHOD_53:
677 : : case CFG_METHOD_54:
678 : : case CFG_METHOD_55:
679 : : case CFG_METHOD_56:
680 : : case CFG_METHOD_57:
681 : : case CFG_METHOD_58:
682 : : case CFG_METHOD_69:
683 : : case CFG_METHOD_70:
684 : : case CFG_METHOD_71:
685 : 0 : RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7);
686 : : break;
687 : : }
688 : : }
689 : :
690 [ # # # ]: 0 : switch (hw->mcfg) {
691 : 0 : case CFG_METHOD_21:
692 : : case CFG_METHOD_22:
693 : : case CFG_METHOD_23:
694 : : case CFG_METHOD_24:
695 : : case CFG_METHOD_25:
696 : : case CFG_METHOD_26:
697 : : case CFG_METHOD_27:
698 : : case CFG_METHOD_28:
699 : : case CFG_METHOD_29:
700 : : case CFG_METHOD_30:
701 : : case CFG_METHOD_31:
702 : : case CFG_METHOD_32:
703 : : case CFG_METHOD_33:
704 : : case CFG_METHOD_34:
705 : : case CFG_METHOD_35:
706 : : case CFG_METHOD_36:
707 : 0 : RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_6);
708 : 0 : RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6);
709 : : break;
710 : 0 : case CFG_METHOD_48:
711 : : case CFG_METHOD_49:
712 : : case CFG_METHOD_50:
713 : : case CFG_METHOD_51:
714 : : case CFG_METHOD_52:
715 : : case CFG_METHOD_53:
716 : : case CFG_METHOD_54:
717 : : case CFG_METHOD_55:
718 : : case CFG_METHOD_56:
719 : : case CFG_METHOD_57:
720 : : case CFG_METHOD_58:
721 : : case CFG_METHOD_69:
722 : : case CFG_METHOD_70:
723 : : case CFG_METHOD_71:
724 : : case CFG_METHOD_91:
725 : 0 : RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6);
726 : : break;
727 : : }
728 : : }
729 : :
730 : : void
731 : 0 : rtl_hw_ephy_config(struct rtl_hw *hw)
732 : : {
733 : 0 : hw->hw_ops.hw_ephy_config(hw);
734 : 0 : }
735 : :
736 : : static int
737 : 0 : rtl_wait_phy_reset_complete(struct rtl_hw *hw)
738 : : {
739 : : int i, val;
740 : :
741 [ # # ]: 0 : for (i = 0; i < 2500; i++) {
742 : 0 : val = rtl_mdio_read(hw, MII_BMCR) & BMCR_RESET;
743 [ # # ]: 0 : if (!val)
744 : : return 0;
745 : :
746 : : rte_delay_ms(1);
747 : : }
748 : :
749 : : return -1;
750 : : }
751 : :
752 : : static void
753 : 0 : rtl_xmii_reset_enable(struct rtl_hw *hw)
754 : : {
755 : : u32 val;
756 : :
757 [ # # ]: 0 : if (rtl_is_in_phy_disable_mode(hw))
758 : : return;
759 : :
760 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
761 : :
762 : 0 : val = rtl_mdio_read(hw, MII_ADVERTISE);
763 : 0 : val &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF |
764 : : ADVERTISE_100FULL);
765 : 0 : rtl_mdio_write(hw, MII_ADVERTISE, val);
766 : :
767 : 0 : val = rtl_mdio_read(hw, MII_CTRL1000);
768 : 0 : val &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
769 : 0 : rtl_mdio_write(hw, MII_CTRL1000, val);
770 : :
771 [ # # ]: 0 : if (rtl_is_8125(hw)) {
772 : 0 : val = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4);
773 : 0 : val &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL |
774 : : RTK_ADVERTISE_10000FULL);
775 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, val);
776 : : }
777 : :
778 : 0 : rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
779 : :
780 [ # # ]: 0 : if (rtl_wait_phy_reset_complete(hw))
781 : 0 : PMD_INIT_LOG(NOTICE, "PHY reset failed.");
782 : : }
783 : :
784 : : static void
785 : 0 : rtl8125_set_hw_phy_before_init_phy_mcu(struct rtl_hw *hw)
786 : : {
787 : : u16 val;
788 : :
789 [ # # ]: 0 : switch (hw->mcfg) {
790 : 0 : case CFG_METHOD_50:
791 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xBF86, 0x9000);
792 : :
793 : 0 : rtl_set_eth_phy_ocp_bit(hw, 0xC402, BIT_10);
794 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xC402, BIT_10);
795 : :
796 : 0 : val = rtl_mdio_direct_read_phy_ocp(hw, 0xBF86);
797 : 0 : val &= (BIT_1 | BIT_0);
798 [ # # ]: 0 : if (val != 0)
799 : 0 : PMD_INIT_LOG(NOTICE, "PHY watch dog not clear, value = 0x%x",
800 : : val);
801 : :
802 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xBD86, 0x1010);
803 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xBD88, 0x1010);
804 : :
805 : 0 : rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBD4E, (BIT_11 | BIT_10), BIT_11);
806 : 0 : rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBF46, (BIT_11 | BIT_10 | BIT_9 | BIT_8),
807 : : (BIT_10 | BIT_9 | BIT_8));
808 : 0 : break;
809 : : }
810 : 0 : }
811 : :
812 : : static u16
813 : 0 : rtl_get_hw_phy_mcu_code_ver(struct rtl_hw *hw)
814 : : {
815 : : u16 hw_ram_code_ver = ~0;
816 : :
817 [ # # ]: 0 : if (rtl_is_8125(hw)) {
818 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E);
819 : 0 : hw_ram_code_ver = rtl_mdio_direct_read_phy_ocp(hw, 0xA438);
820 : : } else {
821 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
822 : 0 : rtl_mdio_write(hw, 0x13, 0x801E);
823 : 0 : hw_ram_code_ver = rtl_mdio_read(hw, 0x14);
824 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
825 : : }
826 : :
827 : 0 : return hw_ram_code_ver;
828 : : }
829 : :
830 : : static int
831 : : rtl_check_hw_phy_mcu_code_ver(struct rtl_hw *hw)
832 : : {
833 : : int ram_code_ver_match = 0;
834 : :
835 : 0 : hw->hw_ram_code_ver = rtl_get_hw_phy_mcu_code_ver(hw);
836 : :
837 [ # # ]: 0 : if (hw->hw_ram_code_ver == hw->sw_ram_code_ver) {
838 : : ram_code_ver_match = 1;
839 : 0 : hw->HwHasWrRamCodeToMicroP = TRUE;
840 : : } else {
841 : 0 : hw->HwHasWrRamCodeToMicroP = FALSE;
842 : : }
843 : :
844 : : return ram_code_ver_match;
845 : : }
846 : :
847 : : static void
848 : 0 : rtl_write_hw_phy_mcu_code_ver(struct rtl_hw *hw)
849 : : {
850 [ # # ]: 0 : if (rtl_is_8125(hw)) {
851 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E);
852 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xA438, hw->sw_ram_code_ver);
853 : 0 : hw->hw_ram_code_ver = hw->sw_ram_code_ver;
854 : : } else {
855 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
856 : 0 : rtl_mdio_write(hw, 0x13, 0x801E);
857 : 0 : rtl_mdio_write(hw, 0x14, hw->sw_ram_code_ver);
858 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
859 : 0 : hw->hw_ram_code_ver = hw->sw_ram_code_ver;
860 : : }
861 : 0 : }
862 : :
863 : : static void
864 : 0 : rtl_enable_phy_disable_mode(struct rtl_hw *hw)
865 : : {
866 [ # # # ]: 0 : switch (hw->HwSuppCheckPhyDisableModeVer) {
867 : 0 : case 1:
868 : 0 : rtl_mac_ocp_write(hw, 0xDC20, rtl_mac_ocp_read(hw, 0xDC20) |
869 : : BIT_1);
870 : 0 : break;
871 : 0 : case 2:
872 : : case 3:
873 : 0 : RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_5);
874 : : break;
875 : : }
876 : 0 : }
877 : :
878 : : static void
879 : 0 : rtl_disable_phy_disable_mode(struct rtl_hw *hw)
880 : : {
881 [ # # # ]: 0 : switch (hw->HwSuppCheckPhyDisableModeVer) {
882 : 0 : case 1:
883 : 0 : rtl_mac_ocp_write(hw, 0xDC20, rtl_mac_ocp_read(hw, 0xDC20) &
884 : : ~BIT_1);
885 : 0 : break;
886 : 0 : case 2:
887 : : case 3:
888 : 0 : RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_5);
889 : : break;
890 : : }
891 : :
892 : : rte_delay_ms(1);
893 : 0 : }
894 : :
895 : : static int
896 : 0 : rtl8168_phy_ram_code_check(struct rtl_hw *hw)
897 : : {
898 : : u16 val;
899 : : int retval = TRUE;
900 : :
901 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_21) {
902 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A40);
903 : 0 : val = rtl_mdio_read(hw, 0x10);
904 : 0 : val &= ~BIT_11;
905 : 0 : rtl_mdio_write(hw, 0x10, val);
906 : :
907 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A00);
908 : 0 : val = rtl_mdio_read(hw, 0x10);
909 : 0 : val &= ~(BIT_12 | BIT_13 | BIT_14 | BIT_15);
910 : 0 : rtl_mdio_write(hw, 0x10, val);
911 : :
912 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A43);
913 : 0 : rtl_mdio_write(hw, 0x13, 0x8010);
914 : 0 : val = rtl_mdio_read(hw, 0x14);
915 : 0 : val &= ~BIT_11;
916 : 0 : rtl_mdio_write(hw, 0x14, val);
917 : :
918 : 0 : retval = rtl_set_phy_mcu_patch_request(hw);
919 : :
920 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A40);
921 : 0 : rtl_mdio_write(hw, 0x10, 0x0140);
922 : :
923 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A4A);
924 : 0 : val = rtl_mdio_read(hw, 0x13);
925 : 0 : val &= ~BIT_6;
926 : 0 : val |= BIT_7;
927 : 0 : rtl_mdio_write(hw, 0x13, val);
928 : :
929 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A44);
930 : 0 : val = rtl_mdio_read(hw, 0x14);
931 : 0 : val |= BIT_2;
932 : 0 : rtl_mdio_write(hw, 0x14, val);
933 : :
934 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A50);
935 : 0 : val = rtl_mdio_read(hw, 0x11);
936 : 0 : val |= (BIT_11 | BIT_12);
937 : 0 : rtl_mdio_write(hw, 0x11, val);
938 : :
939 : 0 : retval = rtl_clear_phy_mcu_patch_request(hw);
940 : :
941 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A40);
942 : 0 : rtl_mdio_write(hw, 0x10, 0x1040);
943 : :
944 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A4A);
945 : 0 : val = rtl_mdio_read(hw, 0x13);
946 : 0 : val &= ~(BIT_6 | BIT_7);
947 : 0 : rtl_mdio_write(hw, 0x13, val);
948 : :
949 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A44);
950 : 0 : val = rtl_mdio_read(hw, 0x14);
951 : 0 : val &= ~BIT_2;
952 : 0 : rtl_mdio_write(hw, 0x14, val);
953 : :
954 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A50);
955 : 0 : val = rtl_mdio_read(hw, 0x11);
956 : 0 : val &= ~(BIT_11 | BIT_12);
957 : 0 : rtl_mdio_write(hw, 0x11, val);
958 : :
959 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A43);
960 : 0 : rtl_mdio_write(hw, 0x13, 0x8010);
961 : 0 : val = rtl_mdio_read(hw, 0x14);
962 : 0 : val |= BIT_11;
963 : 0 : rtl_mdio_write(hw, 0x14, val);
964 : :
965 : 0 : retval = rtl_set_phy_mcu_patch_request(hw);
966 : :
967 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A20);
968 : 0 : val = rtl_mdio_read(hw, 0x13);
969 : : if (val & BIT_11) {
970 : : if (val & BIT_10)
971 : : retval = FALSE;
972 : : }
973 : :
974 : 0 : retval = rtl_clear_phy_mcu_patch_request(hw);
975 : :
976 : : rte_delay_ms(2);
977 : : }
978 : :
979 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
980 : :
981 : 0 : return retval;
982 : : }
983 : :
984 : : static void
985 : 0 : rtl8168_set_phy_ram_code_check_fail_flag(struct rtl_hw *hw)
986 : : {
987 : : u16 tmp_ushort;
988 : :
989 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_21) {
990 : 0 : tmp_ushort = rtl_mac_ocp_read(hw, 0xD3C0);
991 : 0 : tmp_ushort |= BIT_0;
992 : 0 : rtl_mac_ocp_write(hw, 0xD3C0, tmp_ushort);
993 : : }
994 : 0 : }
995 : :
996 : : static void
997 : 0 : rtl_init_hw_phy_mcu(struct rtl_hw *hw)
998 : : {
999 : : u8 require_disable_phy_disable_mode = FALSE;
1000 : :
1001 [ # # ]: 0 : if (hw->NotWrRamCodeToMicroP)
1002 : : return;
1003 : :
1004 : : if (rtl_check_hw_phy_mcu_code_ver(hw))
1005 : 0 : return;
1006 : :
1007 [ # # # # ]: 0 : if (!rtl_is_8125(hw) && !rtl8168_phy_ram_code_check(hw)) {
1008 : 0 : rtl8168_set_phy_ram_code_check_fail_flag(hw);
1009 : 0 : return;
1010 : : }
1011 : :
1012 [ # # # # ]: 0 : if (HW_SUPPORT_CHECK_PHY_DISABLE_MODE(hw) && rtl_is_in_phy_disable_mode(hw))
1013 : : require_disable_phy_disable_mode = TRUE;
1014 : :
1015 : : if (require_disable_phy_disable_mode)
1016 : 0 : rtl_disable_phy_disable_mode(hw);
1017 : :
1018 : 0 : hw->hw_ops.hw_phy_mcu_config(hw);
1019 : :
1020 [ # # ]: 0 : if (require_disable_phy_disable_mode)
1021 : 0 : rtl_enable_phy_disable_mode(hw);
1022 : :
1023 : 0 : rtl_write_hw_phy_mcu_code_ver(hw);
1024 : :
1025 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1026 : :
1027 : 0 : hw->HwHasWrRamCodeToMicroP = TRUE;
1028 : : }
1029 : :
1030 : : static void
1031 : 0 : rtl_disable_aldps(struct rtl_hw *hw)
1032 : : {
1033 : : u16 tmp_ushort;
1034 : : u32 timeout = 0;
1035 : : u32 wait_cnt = 200;
1036 : :
1037 [ # # ]: 0 : if (rtl_is_8125(hw)) {
1038 : 0 : tmp_ushort = rtl_mdio_real_direct_read_phy_ocp(hw, 0xA430);
1039 [ # # ]: 0 : if (tmp_ushort & BIT_2) {
1040 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2);
1041 : :
1042 : : do {
1043 : 0 : rte_delay_us(100);
1044 : 0 : tmp_ushort = rtl_mac_ocp_read(hw, 0xE908);
1045 : 0 : timeout++;
1046 [ # # # # ]: 0 : } while (!(tmp_ushort & BIT_7) && timeout < wait_cnt);
1047 : : }
1048 : : } else {
1049 : 0 : tmp_ushort = rtl_mdio_real_direct_read_phy_ocp(hw, 0xA430);
1050 [ # # ]: 0 : if (tmp_ushort & BIT_2)
1051 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2);
1052 : : }
1053 : 0 : }
1054 : :
1055 : : static bool
1056 : 0 : rtl_is_adv_eee_enabled(struct rtl_hw *hw)
1057 : : {
1058 : : bool enabled = false;
1059 : :
1060 [ # # # ]: 0 : switch (hw->mcfg) {
1061 : 0 : case CFG_METHOD_25:
1062 : : case CFG_METHOD_26:
1063 : : case CFG_METHOD_27:
1064 : : case CFG_METHOD_28:
1065 : : case CFG_METHOD_29:
1066 : : case CFG_METHOD_30:
1067 : : case CFG_METHOD_31:
1068 : : case CFG_METHOD_32:
1069 : : case CFG_METHOD_33:
1070 : : case CFG_METHOD_34:
1071 : : case CFG_METHOD_35:
1072 : : case CFG_METHOD_36:
1073 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
1074 [ # # ]: 0 : if (rtl_mdio_read(hw, 0x10) & BIT_15)
1075 : : enabled = true;
1076 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1077 : 0 : break;
1078 : 0 : case CFG_METHOD_48:
1079 : : case CFG_METHOD_49:
1080 : : case CFG_METHOD_50:
1081 : : case CFG_METHOD_51:
1082 : : case CFG_METHOD_52:
1083 : : case CFG_METHOD_53:
1084 : : case CFG_METHOD_54:
1085 : : case CFG_METHOD_55:
1086 : : case CFG_METHOD_58:
1087 : : case CFG_METHOD_69:
1088 : : case CFG_METHOD_70:
1089 : : case CFG_METHOD_71:
1090 : : case CFG_METHOD_91:
1091 [ # # ]: 0 : if (rtl_mdio_direct_read_phy_ocp(hw, 0xA430) & BIT_15)
1092 : : enabled = true;
1093 : : break;
1094 : : default:
1095 : : break;
1096 : : }
1097 : :
1098 : 0 : return enabled;
1099 : : }
1100 : :
1101 : : static void
1102 : 0 : _rtl_disable_adv_eee(struct rtl_hw *hw)
1103 : : {
1104 : : bool lock;
1105 : : u16 data;
1106 : :
1107 [ # # ]: 0 : if (rtl_is_adv_eee_enabled(hw))
1108 : : lock = true;
1109 : : else
1110 : : lock = false;
1111 : :
1112 : : if (lock)
1113 : 0 : rtl_set_phy_mcu_patch_request(hw);
1114 : :
1115 [ # # # # : 0 : switch (hw->mcfg) {
# # ]
1116 : 0 : case CFG_METHOD_25:
1117 : 0 : rtl_eri_write(hw, 0x1EA, 1, 0x00, ERIAR_ExGMAC);
1118 : :
1119 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A42);
1120 : 0 : data = rtl_mdio_read(hw, 0x16);
1121 : 0 : data &= ~BIT_1;
1122 : 0 : rtl_mdio_write(hw, 0x16, data);
1123 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1124 : 0 : break;
1125 : 0 : case CFG_METHOD_26:
1126 : 0 : data = rtl_mac_ocp_read(hw, 0xE052);
1127 : 0 : data &= ~BIT_0;
1128 : 0 : rtl_mac_ocp_write(hw, 0xE052, data);
1129 : :
1130 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A42);
1131 : 0 : data = rtl_mdio_read(hw, 0x16);
1132 : 0 : data &= ~BIT_1;
1133 : 0 : rtl_mdio_write(hw, 0x16, data);
1134 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1135 : 0 : break;
1136 : 0 : case CFG_METHOD_27:
1137 : : case CFG_METHOD_28:
1138 : 0 : data = rtl_mac_ocp_read(hw, 0xE052);
1139 : 0 : data &= ~BIT_0;
1140 : 0 : rtl_mac_ocp_write(hw, 0xE052, data);
1141 : 0 : break;
1142 : 0 : case CFG_METHOD_29:
1143 : : case CFG_METHOD_30:
1144 : : case CFG_METHOD_31:
1145 : : case CFG_METHOD_32:
1146 : : case CFG_METHOD_33:
1147 : : case CFG_METHOD_34:
1148 : : case CFG_METHOD_35:
1149 : : case CFG_METHOD_36:
1150 : 0 : data = rtl_mac_ocp_read(hw, 0xE052);
1151 : 0 : data &= ~BIT_0;
1152 : 0 : rtl_mac_ocp_write(hw, 0xE052, data);
1153 : :
1154 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
1155 : 0 : data = rtl_mdio_read(hw, 0x10) & ~(BIT_15);
1156 : 0 : rtl_mdio_write(hw, 0x10, data);
1157 : :
1158 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
1159 : 0 : data = rtl_mdio_read(hw, 0x11) & ~(BIT_12 | BIT_13 | BIT_14);
1160 : 0 : rtl_mdio_write(hw, 0x11, data);
1161 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1162 : 0 : break;
1163 : 0 : case CFG_METHOD_48:
1164 : : case CFG_METHOD_49:
1165 : : case CFG_METHOD_50:
1166 : : case CFG_METHOD_51:
1167 : : case CFG_METHOD_52:
1168 : : case CFG_METHOD_53:
1169 : : case CFG_METHOD_54:
1170 : : case CFG_METHOD_55:
1171 : : case CFG_METHOD_56:
1172 : : case CFG_METHOD_57:
1173 : : case CFG_METHOD_58:
1174 : : case CFG_METHOD_69:
1175 : : case CFG_METHOD_70:
1176 : : case CFG_METHOD_71:
1177 : : case CFG_METHOD_91:
1178 : 0 : rtl_clear_mac_ocp_bit(hw, 0xE052, BIT_0);
1179 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA442, (BIT_12 | BIT_13));
1180 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_15);
1181 : 0 : break;
1182 : : }
1183 : :
1184 [ # # ]: 0 : if (lock)
1185 : 0 : rtl_clear_phy_mcu_patch_request(hw);
1186 : 0 : }
1187 : :
1188 : : static void
1189 : 0 : rtl_disable_adv_eee(struct rtl_hw *hw)
1190 : : {
1191 [ # # ]: 0 : if (hw->mcfg < CFG_METHOD_25 || hw->mcfg == CFG_METHOD_37)
1192 : : return;
1193 : :
1194 : 0 : rtl_oob_mutex_lock(hw);
1195 : :
1196 : 0 : _rtl_disable_adv_eee(hw);
1197 : :
1198 : 0 : rtl_oob_mutex_unlock(hw);
1199 : : }
1200 : :
1201 : : static void
1202 : 0 : rtl_disable_eee(struct rtl_hw *hw)
1203 : : {
1204 : : u16 data;
1205 : : u16 mask;
1206 : : u32 csi_tmp;
1207 : :
1208 [ # # # # : 0 : switch (hw->mcfg) {
# ]
1209 : 0 : case CFG_METHOD_21:
1210 : : case CFG_METHOD_22:
1211 : : case CFG_METHOD_23:
1212 : : case CFG_METHOD_24:
1213 : : case CFG_METHOD_25:
1214 : : case CFG_METHOD_26:
1215 : : case CFG_METHOD_27:
1216 : : case CFG_METHOD_28:
1217 : : case CFG_METHOD_29:
1218 : : case CFG_METHOD_30:
1219 : : case CFG_METHOD_31:
1220 : : case CFG_METHOD_32:
1221 : : case CFG_METHOD_33:
1222 : : case CFG_METHOD_34:
1223 : : case CFG_METHOD_35:
1224 : : case CFG_METHOD_36:
1225 : 0 : csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC);
1226 : 0 : csi_tmp &= ~(BIT_1 | BIT_0);
1227 : 0 : rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
1228 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
1229 : 0 : data = rtl_mdio_read(hw, 0x11);
1230 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_36)
1231 : 0 : rtl_mdio_write(hw, 0x11, data | BIT_4);
1232 : : else
1233 : 0 : rtl_mdio_write(hw, 0x11, data & ~BIT_4);
1234 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A5D);
1235 : 0 : rtl_mdio_write(hw, 0x10, 0x0000);
1236 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1237 : 0 : break;
1238 : 0 : case CFG_METHOD_48:
1239 : : case CFG_METHOD_49:
1240 : : case CFG_METHOD_52:
1241 : 0 : rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0));
1242 : 0 : rtl_clear_mac_ocp_bit(hw, 0xEB62, (BIT_2 | BIT_1));
1243 : :
1244 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA432, BIT_4);
1245 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA5D0, (BIT_2 | BIT_1));
1246 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA6D4, BIT_0);
1247 : :
1248 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA6D8, BIT_4);
1249 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_7);
1250 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA4A2, BIT_9);
1251 : 0 : break;
1252 : 0 : case CFG_METHOD_50:
1253 : : case CFG_METHOD_51:
1254 : : case CFG_METHOD_53:
1255 : : case CFG_METHOD_54:
1256 : : case CFG_METHOD_55:
1257 : : case CFG_METHOD_56:
1258 : : case CFG_METHOD_57:
1259 : : case CFG_METHOD_58:
1260 : 0 : rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0));
1261 : :
1262 : 0 : rtl_set_eth_phy_ocp_bit(hw, 0xA432, BIT_4);
1263 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA5D0, (BIT_2 | BIT_1));
1264 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA6D4, BIT_0);
1265 : :
1266 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA6D8, BIT_4);
1267 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_7);
1268 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA4A2, BIT_9);
1269 : 0 : break;
1270 : 0 : case CFG_METHOD_69:
1271 : : case CFG_METHOD_70:
1272 : : case CFG_METHOD_71:
1273 : : case CFG_METHOD_91:
1274 : 0 : rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0));
1275 : :
1276 [ # # ]: 0 : if (HW_SUPP_PHY_LINK_SPEED_10000M(hw))
1277 : : mask = MDIO_EEE_100TX | MDIO_EEE_1000T | MDIO_EEE_10GT;
1278 : : else
1279 : : mask = MDIO_EEE_100TX | MDIO_EEE_1000T;
1280 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA5D0, mask);
1281 : :
1282 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA6D4, MDIO_EEE_2_5GT | MDIO_EEE_5GT);
1283 : :
1284 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA6D8, BIT_4);
1285 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_7);
1286 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA4A2, BIT_9);
1287 : 0 : break;
1288 : : default:
1289 : : /* Not support EEE */
1290 : : break;
1291 : : }
1292 : :
1293 [ # # ]: 0 : switch (hw->mcfg) {
1294 : 0 : case CFG_METHOD_29:
1295 : : case CFG_METHOD_30:
1296 : : case CFG_METHOD_35:
1297 : : case CFG_METHOD_36:
1298 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A42);
1299 : 0 : rtl_clear_eth_phy_bit(hw, 0x14, BIT_7);
1300 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A4A);
1301 : 0 : rtl_clear_eth_phy_bit(hw, 0x11, BIT_9);
1302 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1303 : 0 : break;
1304 : : }
1305 : :
1306 : : /* Advanced EEE */
1307 : 0 : rtl_disable_adv_eee(hw);
1308 : 0 : }
1309 : :
1310 : : void
1311 : 0 : rtl_hw_phy_config(struct rtl_hw *hw)
1312 : : {
1313 : 0 : rtl_xmii_reset_enable(hw);
1314 : :
1315 [ # # ]: 0 : if (HW_DASH_SUPPORT_TYPE_3(hw) && hw->HwPkgDet == 0x06)
1316 : : return;
1317 : :
1318 : 0 : rtl8125_set_hw_phy_before_init_phy_mcu(hw);
1319 : :
1320 : 0 : rtl_init_hw_phy_mcu(hw);
1321 : :
1322 : 0 : hw->hw_ops.hw_phy_config(hw);
1323 : :
1324 : 0 : rtl_disable_aldps(hw);
1325 : :
1326 : : /* Legacy force mode (chap 22) */
1327 [ # # ]: 0 : if (rtl_is_8125(hw))
1328 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA5B4, BIT_15);
1329 : :
1330 [ # # ]: 0 : if (HW_FIBER_MODE_ENABLED(hw))
1331 : 0 : rtl8127_hw_fiber_phy_config(hw);
1332 : :
1333 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1334 : :
1335 [ # # ]: 0 : if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw))
1336 : 0 : rtl_disable_eee(hw);
1337 : : }
1338 : :
1339 : : static void
1340 : 0 : rtl_phy_restart_nway(struct rtl_hw *hw)
1341 : : {
1342 [ # # ]: 0 : if (rtl_is_in_phy_disable_mode(hw))
1343 : : return;
1344 : :
1345 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1346 [ # # ]: 0 : if (rtl_is_8125(hw))
1347 : 0 : rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
1348 : : else
1349 : 0 : rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE |
1350 : : BMCR_ANRESTART);
1351 : : }
1352 : :
1353 : : static void
1354 : 0 : rtl_phy_setup_force_mode(struct rtl_hw *hw, u32 speed, u8 duplex)
1355 : : {
1356 : : u16 bmcr_true_force = 0;
1357 : :
1358 [ # # ]: 0 : if (rtl_is_in_phy_disable_mode(hw))
1359 : : return;
1360 : :
1361 [ # # ]: 0 : if (speed == SPEED_10 && duplex == DUPLEX_HALF)
1362 : : bmcr_true_force = BMCR_SPEED10;
1363 [ # # ]: 0 : else if (speed == SPEED_10 && duplex == DUPLEX_FULL)
1364 : : bmcr_true_force = BMCR_SPEED10 | BMCR_FULLDPLX;
1365 [ # # ]: 0 : else if (speed == SPEED_100 && duplex == DUPLEX_HALF)
1366 : : bmcr_true_force = BMCR_SPEED100;
1367 [ # # ]: 0 : else if (speed == SPEED_100 && duplex == DUPLEX_FULL)
1368 : : bmcr_true_force = BMCR_SPEED100 | BMCR_FULLDPLX;
1369 : : else
1370 : : return;
1371 : :
1372 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1373 : 0 : rtl_mdio_write(hw, MII_BMCR, bmcr_true_force);
1374 : : }
1375 : :
1376 : : static int
1377 : 0 : rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u64 adv)
1378 : : {
1379 : : u16 mask = 0;
1380 : : int auto_nego = 0;
1381 : : int giga_ctrl = 0;
1382 : : int ctrl_2500 = 0;
1383 : : int rc = -EINVAL;
1384 : :
1385 : : /* Disable giga lite */
1386 [ # # # # : 0 : switch (hw->mcfg) {
# # ]
1387 : 0 : case CFG_METHOD_29:
1388 : : case CFG_METHOD_30:
1389 : : case CFG_METHOD_35:
1390 : : case CFG_METHOD_36:
1391 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A42);
1392 : 0 : rtl_clear_eth_phy_bit(hw, 0x14, BIT_9);
1393 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A40);
1394 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1395 : 0 : break;
1396 : 0 : case CFG_METHOD_31:
1397 : : case CFG_METHOD_32:
1398 : : case CFG_METHOD_33:
1399 : : case CFG_METHOD_34:
1400 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A42);
1401 : 0 : rtl_clear_eth_phy_bit(hw, 0x14, BIT_9 | BIT_7);
1402 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A40);
1403 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
1404 : 0 : break;
1405 : 0 : case CFG_METHOD_91:
1406 : : mask |= BIT_2;
1407 : : /* Fall through */
1408 : 0 : case CFG_METHOD_69:
1409 : : case CFG_METHOD_70:
1410 : : case CFG_METHOD_71:
1411 : 0 : mask |= BIT_1;
1412 : : /* Fall through */
1413 : 0 : case CFG_METHOD_48:
1414 : : case CFG_METHOD_49:
1415 : : case CFG_METHOD_50:
1416 : : case CFG_METHOD_51:
1417 : : case CFG_METHOD_52:
1418 : : case CFG_METHOD_53:
1419 : : case CFG_METHOD_54:
1420 : : case CFG_METHOD_55:
1421 : : case CFG_METHOD_56:
1422 : : case CFG_METHOD_57:
1423 : : case CFG_METHOD_58:
1424 : 0 : mask |= BIT_0;
1425 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9);
1426 : 0 : rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, mask);
1427 : 0 : break;
1428 : : }
1429 : :
1430 [ # # ]: 0 : if (!rtl_is_speed_mode_valid(hw, speed)) {
1431 : 0 : speed = hw->HwSuppMaxPhyLinkSpeed;
1432 : : duplex = DUPLEX_FULL;
1433 : 0 : adv |= hw->advertising;
1434 : : }
1435 : :
1436 [ # # ]: 0 : if (HW_FIBER_MODE_ENABLED(hw))
1437 : 0 : goto set_speed;
1438 : :
1439 : 0 : giga_ctrl = rtl_mdio_read(hw, MII_CTRL1000);
1440 : 0 : giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
1441 [ # # ]: 0 : if (rtl_is_8125(hw)) {
1442 : 0 : ctrl_2500 = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4);
1443 : 0 : ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL |
1444 : : RTK_ADVERTISE_10000FULL);
1445 : : }
1446 : :
1447 [ # # ]: 0 : if (autoneg == AUTONEG_ENABLE) {
1448 : : /* N-way force */
1449 : 0 : auto_nego = rtl_mdio_read(hw, MII_ADVERTISE);
1450 : 0 : auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
1451 : : ADVERTISE_100HALF | ADVERTISE_100FULL |
1452 : : ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
1453 : :
1454 [ # # ]: 0 : if (adv & ADVERTISE_10_HALF)
1455 : 0 : auto_nego |= ADVERTISE_10HALF;
1456 [ # # ]: 0 : if (adv & ADVERTISE_10_FULL)
1457 : 0 : auto_nego |= ADVERTISE_10FULL;
1458 [ # # ]: 0 : if (adv & ADVERTISE_100_HALF)
1459 : 0 : auto_nego |= ADVERTISE_100HALF;
1460 [ # # ]: 0 : if (adv & ADVERTISE_100_FULL)
1461 : 0 : auto_nego |= ADVERTISE_100FULL;
1462 [ # # ]: 0 : if (adv & ADVERTISE_1000_HALF)
1463 : 0 : giga_ctrl |= ADVERTISE_1000HALF;
1464 [ # # ]: 0 : if (adv & ADVERTISE_1000_FULL)
1465 : 0 : giga_ctrl |= ADVERTISE_1000FULL;
1466 [ # # ]: 0 : if (adv & ADVERTISE_2500_FULL)
1467 : 0 : ctrl_2500 |= RTK_ADVERTISE_2500FULL;
1468 [ # # ]: 0 : if (adv & ADVERTISE_5000_FULL)
1469 : 0 : ctrl_2500 |= RTK_ADVERTISE_5000FULL;
1470 [ # # ]: 0 : if (adv & ADVERTISE_10000_FULL)
1471 : 0 : ctrl_2500 |= RTK_ADVERTISE_10000FULL;
1472 : :
1473 : : /* Flow control */
1474 [ # # ]: 0 : if (hw->fcpause == rtl_fc_full)
1475 : 0 : auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
1476 : :
1477 : 0 : rtl_mdio_write(hw, 0x1f, 0x0000);
1478 : 0 : rtl_mdio_write(hw, MII_ADVERTISE, auto_nego);
1479 : 0 : rtl_mdio_write(hw, MII_CTRL1000, giga_ctrl);
1480 [ # # ]: 0 : if (rtl_is_8125(hw))
1481 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, ctrl_2500);
1482 : 0 : rtl_phy_restart_nway(hw);
1483 : : rte_delay_ms(20);
1484 : : } else {
1485 : : /* True force */
1486 [ # # ]: 0 : if (speed == SPEED_10 || speed == SPEED_100)
1487 : 0 : rtl_phy_setup_force_mode(hw, speed, duplex);
1488 : : else
1489 : 0 : goto out;
1490 : : }
1491 : :
1492 : 0 : set_speed:
1493 : 0 : hw->autoneg = autoneg;
1494 : 0 : hw->speed = speed;
1495 : 0 : hw->duplex = duplex;
1496 : 0 : hw->advertising = adv;
1497 : :
1498 [ # # ]: 0 : if (HW_FIBER_MODE_ENABLED(hw))
1499 : 0 : rtl8127_hw_fiber_phy_config(hw);
1500 : :
1501 : : rc = 0;
1502 : 0 : out:
1503 : 0 : return rc;
1504 : : }
1505 : :
1506 : : int
1507 : 0 : rtl_set_speed(struct rtl_hw *hw)
1508 : : {
1509 : : int ret;
1510 : :
1511 : 0 : ret = rtl_set_speed_xmii(hw, hw->autoneg, hw->speed, hw->duplex,
1512 : : hw->advertising);
1513 : :
1514 : 0 : return ret;
1515 : : }
1516 : :
1517 : : void
1518 : 0 : rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
1519 : : u16 setmask)
1520 : : {
1521 : : u16 val;
1522 : :
1523 : 0 : val = rtl_mdio_read(hw, addr);
1524 : 0 : val &= ~clearmask;
1525 : 0 : val |= setmask;
1526 : 0 : rtl_mdio_write(hw, addr, val);
1527 : 0 : }
1528 : :
1529 : : void
1530 : 0 : rtl_clear_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
1531 : : {
1532 : 0 : rtl_clear_and_set_eth_phy_bit(hw, addr, mask, 0);
1533 : 0 : }
1534 : :
1535 : : void
1536 : 0 : rtl_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
1537 : : {
1538 : 0 : rtl_clear_and_set_eth_phy_bit(hw, addr, 0, mask);
1539 : 0 : }
1540 : :
1541 : : void
1542 : 0 : rtl8127_clear_ephy_ext_addr(struct rtl_hw *hw)
1543 : : {
1544 : : rtl8127_set_ephy_ext_addr(hw, 0x0000);
1545 : 0 : }
|