blob: 2b797a20edf8494bee55184193be3ccf7a4bb0f8 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * drivers/net/phy/realtek.c
4 *
5 * Driver for Realtek PHYs
6 *
7 * Author: Johnson Leung <r58129@freescale.com>
8 *
9 * Copyright (c) 2004 Freescale Semiconductor, Inc.
10 */
11#include <linux/bitops.h>
12#include <linux/phy.h>
13#include <linux/module.h>
14#include <linux/delay.h>
15
16#define RTL821x_PHYSR 0x11
17#define RTL821x_PHYSR_DUPLEX BIT(13)
18#define RTL821x_PHYSR_SPEED GENMASK(15, 14)
19
20#define RTL821x_INER 0x12
21#define RTL8211B_INER_INIT 0x6400
22#define RTL8211E_INER_LINK_STATUS BIT(10)
23#define RTL8211F_INER_LINK_STATUS BIT(4)
24
25#define RTL821x_INSR 0x13
26
27#define RTL821x_EXT_PAGE_SELECT 0x1e
28#define RTL821x_PAGE_SELECT 0x1f
29
30#define RTL8211F_INSR 0x1d
31
32#define RTL8211F_TX_DELAY BIT(8)
33#define RTL8211E_TX_DELAY BIT(1)
34#define RTL8211E_RX_DELAY BIT(2)
35#define RTL8211E_MODE_MII_GMII BIT(3)
36
37#define RTL8201F_ISR 0x1e
38#define RTL8201F_IER 0x13
39
40#define RTL8366RB_POWER_SAVE 0x15
41#define RTL8366RB_POWER_SAVE_ON BIT(12)
42
43#define RTL_SUPPORTS_5000FULL BIT(14)
44#define RTL_SUPPORTS_2500FULL BIT(13)
45#define RTL_SUPPORTS_10000FULL BIT(0)
46#define RTL_ADV_2500FULL BIT(7)
47#define RTL_LPADV_10000FULL BIT(11)
48#define RTL_LPADV_5000FULL BIT(6)
49#define RTL_LPADV_2500FULL BIT(5)
50
51#define RTLGEN_SPEED_MASK 0x0630
52
53#define RTL_GENERIC_PHYID 0x001cc800
54
55MODULE_DESCRIPTION("Realtek PHY driver");
56MODULE_AUTHOR("Johnson Leung");
57MODULE_LICENSE("GPL");
58
59static int rtl821x_read_page(struct phy_device *phydev)
60{
61 return __phy_read(phydev, RTL821x_PAGE_SELECT);
62}
63
64static int rtl821x_write_page(struct phy_device *phydev, int page)
65{
66 return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
67}
68
69static int rtl8201_ack_interrupt(struct phy_device *phydev)
70{
71 int err;
72
73 err = phy_read(phydev, RTL8201F_ISR);
74
75 return (err < 0) ? err : 0;
76}
77
78static int rtl821x_ack_interrupt(struct phy_device *phydev)
79{
80 int err;
81
82 err = phy_read(phydev, RTL821x_INSR);
83
84 return (err < 0) ? err : 0;
85}
86
87static int rtl8211f_ack_interrupt(struct phy_device *phydev)
88{
89 int err;
90
91 err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
92
93 return (err < 0) ? err : 0;
94}
95
96static int rtl8201_config_intr(struct phy_device *phydev)
97{
98 u16 val;
99
100 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
101 val = BIT(13) | BIT(12) | BIT(11);
102 else
103 val = 0;
104
105 return phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
106}
107
108static int rtl8211b_config_intr(struct phy_device *phydev)
109{
110 int err;
111
112 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
113 err = phy_write(phydev, RTL821x_INER,
114 RTL8211B_INER_INIT);
115 else
116 err = phy_write(phydev, RTL821x_INER, 0);
117
118 return err;
119}
120
121static int rtl8211e_config_intr(struct phy_device *phydev)
122{
123 int err;
124
125 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
126 err = phy_write(phydev, RTL821x_INER,
127 RTL8211E_INER_LINK_STATUS);
128 else
129 err = phy_write(phydev, RTL821x_INER, 0);
130
131 return err;
132}
133
134static int rtl8211f_config_intr(struct phy_device *phydev)
135{
136 u16 val;
137
138 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
139 val = RTL8211F_INER_LINK_STATUS;
140 else
141 val = 0;
142
143 return phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
144}
145
146static int rtl8211_config_aneg(struct phy_device *phydev)
147{
148 int ret;
149
150 ret = genphy_config_aneg(phydev);
151 if (ret < 0)
152 return ret;
153
154 /* Quirk was copied from vendor driver. Unfortunately it includes no
155 * description of the magic numbers.
156 */
157 if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
158 phy_write(phydev, 0x17, 0x2138);
159 phy_write(phydev, 0x0e, 0x0260);
160 } else {
161 phy_write(phydev, 0x17, 0x2108);
162 phy_write(phydev, 0x0e, 0x0000);
163 }
164
165 return 0;
166}
167
168static int rtl8211c_config_init(struct phy_device *phydev)
169{
170 /* RTL8211C has an issue when operating in Gigabit slave mode */
171 return phy_set_bits(phydev, MII_CTRL1000,
172 CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
173}
174
175static int rtl8211f_config_init(struct phy_device *phydev)
176{
177 struct device *dev = &phydev->mdio.dev;
178 u16 val;
179 int ret;
180
181 /* enable TX-delay for rgmii-{id,txid}, and disable it for rgmii and
182 * rgmii-rxid. The RX-delay can be enabled by the external RXDLY pin.
183 */
184 switch (phydev->interface) {
185 case PHY_INTERFACE_MODE_RGMII:
186 case PHY_INTERFACE_MODE_RGMII_RXID:
187 val = 0;
188 break;
189 case PHY_INTERFACE_MODE_RGMII_ID:
190 case PHY_INTERFACE_MODE_RGMII_TXID:
191 val = RTL8211F_TX_DELAY;
192 break;
193 default: /* the rest of the modes imply leaving delay as is. */
194 return 0;
195 }
196
197 ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
198 val);
199 if (ret < 0) {
200 dev_err(dev, "Failed to update the TX delay register\n");
201 return ret;
202 } else if (ret) {
203 dev_dbg(dev,
204 "%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
205 val ? "Enabling" : "Disabling");
206 } else {
207 dev_dbg(dev,
208 "2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
209 val ? "enabled" : "disabled");
210 }
211
212 return 0;
213}
214
215static int rtl8211e_config_init(struct phy_device *phydev)
216{
217 int ret = 0, oldpage;
218 u16 val;
219
220 /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
221 switch (phydev->interface) {
222 case PHY_INTERFACE_MODE_RGMII:
223 val = 0;
224 break;
225 case PHY_INTERFACE_MODE_RGMII_ID:
226 val = RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
227 break;
228 case PHY_INTERFACE_MODE_RGMII_RXID:
229 val = RTL8211E_RX_DELAY;
230 break;
231 case PHY_INTERFACE_MODE_RGMII_TXID:
232 val = RTL8211E_TX_DELAY;
233 break;
234 default: /* the rest of the modes imply leaving delays as is. */
235 return 0;
236 }
237
238 /* According to a sample driver there is a 0x1c config register on the
239 * 0xa4 extension page (0x7) layout. It can be used to disable/enable
240 * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins. It can
241 * also be used to customize the whole configuration register:
242 * 8:6 = PHY Address, 5:4 = Auto-Negotiation, 3 = Interface Mode Select,
243 * 2 = RX Delay, 1 = TX Delay, 0 = SELRGV (see original PHY datasheet
244 * for details).
245 */
246 oldpage = phy_select_page(phydev, 0x7);
247 if (oldpage < 0)
248 goto err_restore_page;
249
250 ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
251 if (ret)
252 goto err_restore_page;
253
254 ret = __phy_modify(phydev, 0x1c, RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
255 val);
256
257err_restore_page:
258 return phy_restore_page(phydev, oldpage, ret);
259}
260
261static int rtl8211b_suspend(struct phy_device *phydev)
262{
263 phy_write(phydev, MII_MMD_DATA, BIT(9));
264
265 return genphy_suspend(phydev);
266}
267
268static int rtl8211b_resume(struct phy_device *phydev)
269{
270 phy_write(phydev, MII_MMD_DATA, 0);
271
272 return genphy_resume(phydev);
273}
274
275static int rtl8366rb_config_init(struct phy_device *phydev)
276{
277 int ret;
278
279 ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
280 RTL8366RB_POWER_SAVE_ON);
281 if (ret) {
282 dev_err(&phydev->mdio.dev,
283 "error enabling power management\n");
284 }
285
286 return ret;
287}
288
289/* get actual speed to cover the downshift case */
290static int rtlgen_get_speed(struct phy_device *phydev)
291{
292 int val;
293
294 if (!phydev->link)
295 return 0;
296
297 val = phy_read_paged(phydev, 0xa43, 0x12);
298 if (val < 0)
299 return val;
300
301 switch (val & RTLGEN_SPEED_MASK) {
302 case 0x0000:
303 phydev->speed = SPEED_10;
304 break;
305 case 0x0010:
306 phydev->speed = SPEED_100;
307 break;
308 case 0x0020:
309 phydev->speed = SPEED_1000;
310 break;
311 case 0x0200:
312 phydev->speed = SPEED_10000;
313 break;
314 case 0x0210:
315 phydev->speed = SPEED_2500;
316 break;
317 case 0x0220:
318 phydev->speed = SPEED_5000;
319 break;
320 default:
321 break;
322 }
323
324 return 0;
325}
326
327static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
328{
329 int ret;
330
331 if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
332 rtl821x_write_page(phydev, 0xa5c);
333 ret = __phy_read(phydev, 0x12);
334 rtl821x_write_page(phydev, 0);
335 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
336 rtl821x_write_page(phydev, 0xa5d);
337 ret = __phy_read(phydev, 0x10);
338 rtl821x_write_page(phydev, 0);
339 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
340 rtl821x_write_page(phydev, 0xa5d);
341 ret = __phy_read(phydev, 0x11);
342 rtl821x_write_page(phydev, 0);
343 } else {
344 ret = -EOPNOTSUPP;
345 }
346
347 return ret;
348}
349
350static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
351 u16 val)
352{
353 int ret;
354
355 if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
356 rtl821x_write_page(phydev, 0xa5d);
357 ret = __phy_write(phydev, 0x10, val);
358 rtl821x_write_page(phydev, 0);
359 } else {
360 ret = -EOPNOTSUPP;
361 }
362
363 return ret;
364}
365
366static int rtl8125_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
367{
368 int ret = rtlgen_read_mmd(phydev, devnum, regnum);
369
370 if (ret != -EOPNOTSUPP)
371 return ret;
372
373 if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
374 rtl821x_write_page(phydev, 0xa6e);
375 ret = __phy_read(phydev, 0x16);
376 rtl821x_write_page(phydev, 0);
377 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
378 rtl821x_write_page(phydev, 0xa6d);
379 ret = __phy_read(phydev, 0x12);
380 rtl821x_write_page(phydev, 0);
381 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
382 rtl821x_write_page(phydev, 0xa6d);
383 ret = __phy_read(phydev, 0x10);
384 rtl821x_write_page(phydev, 0);
385 }
386
387 return ret;
388}
389
390static int rtl8125_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
391 u16 val)
392{
393 int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
394
395 if (ret != -EOPNOTSUPP)
396 return ret;
397
398 if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
399 rtl821x_write_page(phydev, 0xa6d);
400 ret = __phy_write(phydev, 0x12, val);
401 rtl821x_write_page(phydev, 0);
402 }
403
404 return ret;
405}
406
407static int rtl8125_get_features(struct phy_device *phydev)
408{
409 int val;
410
411 val = phy_read_paged(phydev, 0xa61, 0x13);
412 if (val < 0)
413 return val;
414
415 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
416 phydev->supported, val & RTL_SUPPORTS_2500FULL);
417 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
418 phydev->supported, val & RTL_SUPPORTS_5000FULL);
419 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
420 phydev->supported, val & RTL_SUPPORTS_10000FULL);
421
422 return genphy_read_abilities(phydev);
423}
424
425static int rtl8125_config_aneg(struct phy_device *phydev)
426{
427 int ret = 0;
428
429 if (phydev->autoneg == AUTONEG_ENABLE) {
430 u16 adv2500 = 0;
431
432 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
433 phydev->advertising))
434 adv2500 = RTL_ADV_2500FULL;
435
436 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
437 RTL_ADV_2500FULL, adv2500);
438 if (ret < 0)
439 return ret;
440 }
441
442 return __genphy_config_aneg(phydev, ret);
443}
444
445static int rtl8125_read_status(struct phy_device *phydev)
446{
447 if (phydev->autoneg == AUTONEG_ENABLE) {
448 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
449
450 if (lpadv < 0)
451 return lpadv;
452
453 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
454 phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
455 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
456 phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
457 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
458 phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
459 }
460
461 return genphy_read_status(phydev);
462}
463
464static int rtl822x_config_init(struct phy_device *phydev)
465{
466 struct device *dev = &phydev->mdio.dev;
467 int ret;
468 int reg;
469
470 switch (phydev->interface) {
471 case PHY_INTERFACE_MODE_SGMII:
472 case PHY_INTERFACE_MODE_2500BASEX:
473 break;
474 default:
475 return 0;
476 }
477
478 /* set serdes mode */
479 reg = phy_read_mmd(phydev, 30, 0x697a);
480 dev_info(dev, "MMD30:0x697a = 0x%x\n", reg);
481
482 /* change to 2500Base-X + SGMII mode*/
483 phy_modify_mmd_changed(phydev, 30, 0x75F3, 0x1, 0);
484 ret = phy_modify_mmd_changed(phydev, 30, 0x697a, 0x1f, 0x0);
485 if (ret < 0) {
486 dev_err(dev, "Failed to update serdes option mode\n");
487 return ret;
488 } else if (ret) {
489 dev_info(dev, "serdes option mode set\n");
490
491 /* make changes take effect */
492 phy_modify_mmd_changed(phydev, 31, 0xA400, 0x1 << 14, 0x1 << 14);
493 do {
494 reg = phy_read_mmd(phydev, 31, 0xA434);
495 if (reg & (0x1 << 2))
496 break;
497 } while(1);
498 phy_modify_mmd_changed(phydev, 31, 0xA400, 0x1 << 14, 0);
499
500 } else {
501 dev_info(dev, "serdes option mode already set\n");
502 }
503
504 /* disabled hisgmii auto-negotiation */
505 phy_write_mmd(phydev, 30, 0x7588, 0x2);
506 phy_write_mmd(phydev, 30, 0x7589, 0x71d0);
507 phy_write_mmd(phydev, 30, 0x7587, 0x3);
508
509 dev_info(dev, "start to wait disable hisgmii AN finish\n");
510 do {
511 reg = phy_read_mmd(phydev, 30, 0x7587);
512 if ((reg & 0x1) == 0)
513 break;
514 } while(1);
515
516 return 0;
517}
518
519static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
520{
521 int ret;
522
523 if (devnum == MDIO_MMD_VEND2) {
524 int page, regad;
525
526 page = regnum >> 4;
527 regad = 16 + (regnum % 16) / 2;
528
529 rtl821x_write_page(phydev, page);
530 ret = __phy_read(phydev, regad);
531 rtl821x_write_page(phydev, 0);
532 } else {
533 /* Write the desired MMD Devad */
534 __phy_write(phydev, MII_MMD_CTRL, devnum);
535 /* Write the desired MMD register address */
536 __phy_write(phydev, MII_MMD_DATA, regnum);
537 /* Select the Function : DATA with no post increment */
538 __phy_write(phydev, MII_MMD_CTRL, devnum | MII_MMD_CTRL_NOINCR);
539 /* Read the content of the MMD's selected register */
540 ret = __phy_read(phydev, MII_MMD_DATA);
541 }
542
543 return ret;
544}
545
546static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
547 u16 val)
548{
549 int ret;
550
551 if (devnum == MDIO_MMD_VEND2) {
552 int page, regad;
553
554 page = regnum >> 4;
555 regad = 16 + (regnum % 16) / 2;
556
557 rtl821x_write_page(phydev, page);
558 ret = __phy_write(phydev, regad, val);
559 rtl821x_write_page(phydev, 0);
560 } else {
561 /* Write the desired MMD Devad */
562 __phy_write(phydev, MII_MMD_CTRL, devnum);
563 /* Write the desired MMD register address */
564 __phy_write(phydev, MII_MMD_DATA, regnum);
565 /* Select the Function : DATA with no post increment */
566 __phy_write(phydev, MII_MMD_CTRL, devnum | MII_MMD_CTRL_NOINCR);
567 /* Write the data into MMD's selected register */
568 ret = __phy_write(phydev, MII_MMD_DATA, val);
569 }
570
571 return ret;
572}
573
574static int rtl822x_get_features(struct phy_device *phydev)
575{
576 int val;
577
578 val = phy_read_paged(phydev, 0xa61, 0x13);
579 if (val < 0)
580 return val;
581
582 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
583 phydev->supported, val & RTL_SUPPORTS_2500FULL);
584 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
585 phydev->supported, val & RTL_SUPPORTS_5000FULL);
586 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
587 phydev->supported, val & RTL_SUPPORTS_10000FULL);
588
589 return genphy_read_abilities(phydev);
590}
591
592static int rtl822x_config_aneg(struct phy_device *phydev)
593{
594 int ret = 0;
595
596 if (phydev->autoneg == AUTONEG_ENABLE) {
597 u16 adv2500 = 0;
598
599 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
600 phydev->advertising))
601 adv2500 = RTL_ADV_2500FULL;
602
603 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
604 RTL_ADV_2500FULL, adv2500);
605 if (ret < 0)
606 return ret;
607 }
608
609 return __genphy_config_aneg(phydev, ret);
610}
611
612static int rtlgen_get_serdes_mode(struct phy_device *phydev)
613{
614 struct device *dev = &phydev->mdio.dev;
615 int ret;
616
617 ret = phy_read_mmd(phydev, 30, 0x7580);
618 if (ret < 0)
619 return ret;
620
621 switch (ret & 0x1f) {
622 case 0x2:
623 phydev->interface = PHY_INTERFACE_MODE_SGMII;
624 dev_dbg(dev, "==> Serdes mode: SGMII\n");
625 break;
626 case 0x12:
627 phydev->interface = PHY_INTERFACE_MODE_NA;
628 dev_dbg(dev, "==> Serdes mode: HiSGMII\n");
629 break;
630 case 0x16:
631 phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
632 dev_dbg(dev, "==> Serdes mode: 2500BASE-X\n");
633 break;
634 case 0x1f:
635 dev_dbg(dev, "==> Serdes mode: off\n");
636 break;
637 default:
638 break;
639 }
640
641 return 0;
642}
643
644static int rtl822x_read_status(struct phy_device *phydev)
645{
646 int ret;
647
648 if (phydev->autoneg == AUTONEG_ENABLE) {
649 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
650
651 if (lpadv < 0)
652 return lpadv;
653
654 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
655 phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
656 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
657 phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
658 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
659 phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
660 }
661
662 ret = genphy_read_status(phydev);
663 if (ret < 0)
664 return ret;
665
666 ret = rtlgen_get_serdes_mode(phydev);
667 if (ret < 0)
668 return ret;
669
670 return rtlgen_get_speed(phydev);
671}
672
673static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
674{
675 int val;
676
677 phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
678 val = phy_read(phydev, 0x13);
679 phy_write(phydev, RTL821x_PAGE_SELECT, 0);
680
681 return val >= 0 && val & RTL_SUPPORTS_2500FULL;
682}
683
684static int rtlgen_match_phy_device(struct phy_device *phydev)
685{
686 return phydev->phy_id == RTL_GENERIC_PHYID &&
687 !rtlgen_supports_2_5gbps(phydev);
688}
689
690static int rtl8125_match_phy_device(struct phy_device *phydev)
691{
692 return phydev->phy_id == RTL_GENERIC_PHYID &&
693 rtlgen_supports_2_5gbps(phydev);
694}
695
696static int rtlgen_resume(struct phy_device *phydev)
697{
698 int ret = genphy_resume(phydev);
699
700 /* Internal PHY's from RTL8168h up may not be instantly ready */
701 msleep(20);
702
703 return ret;
704}
705
hj.shaofe1632a2025-06-05 00:19:33 -0700706static int rtl9000Bf_config_init(struct phy_device *phydev)
707{
708 printk("phy_debug:func:%s,line:%d\n", __FUNCTION__, __LINE__);
709 u32 mdio_data = 0;
710 u32 io_data = 0;
711 int timer = 2000;
712
713 __phy_write(phydev, 0, 0x8000); // PHY soft-reset
714 mdelay(30);
715#if 0
716 //phy power down
717 phy_write(phydev, 0, 0x800);
718 mdelay(10);
719#endif
720 //sample_code 04
721 //phy_write(phydev, 0x1F, 0x0A43);
722 __phy_write(phydev, 0x1B, 0x8017);
723 __phy_write(phydev, 0x1C, 0xFB03); // PHY patch request
724 __phy_write(phydev, 0x1B, 0x8092);
725 __phy_write(phydev, 0x1C, 0x6000);
726 __phy_write(phydev, 0x1B, 0x80AF);
727 __phy_write(phydev, 0x1C, 0x6000);
728 __phy_write(phydev, 0x1B, 0x807D);
729 __phy_write(phydev, 0x1C, 0x4443);
730 __phy_write(phydev, 0x1B, 0x809A);
731 __phy_write(phydev, 0x1C, 0x4443);
732 __phy_write(phydev, 0x1B, 0x81A3);
733 __phy_write(phydev, 0x1C, 0x0F00);
734 __phy_write(phydev, 0x1F, 0x0A81);
735 __phy_write(phydev, 0x12, 0x0004);
736 __phy_write(phydev, 0x1B, 0x83C8);
737 __phy_write(phydev, 0x1C, 0x0005);
738 __phy_write(phydev, 0x1F, 0x0A5C);
739 __phy_write(phydev, 0x12, 0x0003);
740 __phy_write(phydev, 0x1B, 0xB820);
741 __phy_write(phydev, 0x1C, 0x0010);
742 __phy_write(phydev, 0x1B, 0xB830);
743 __phy_write(phydev, 0x1C, 0x8000);
744 //__phy_write(phydev, 0x1B, 0xB800);
745 do {
746 __phy_write(phydev, 0x1B, 0xB800);
747 io_data = (__phy_read(phydev, 0x1C)) & 0x40;
748 timer--;
749 if (timer == 0) {
750 timer = 2000;
751 printk("phy_debug: phy init error func:%s,line:%d\n", __FUNCTION__, __LINE__);
752
753 break;
754 }
755 } while (io_data == 0);
756
757 __phy_write(phydev, 0x1B, 0x8020);
758 __phy_write(phydev, 0x1C, 0x3300);
759 __phy_write(phydev, 0x1B, 0xB82E);
760 __phy_write(phydev, 0x1C, 0x0001);
761 __phy_write(phydev, 0x1B, 0xB820);
762 __phy_write(phydev, 0x1C, 0x0290);
763 __phy_write(phydev, 0x1B, 0xA012);
764 __phy_write(phydev, 0x1C, 0x0000);
765 __phy_write(phydev, 0x1B, 0xA014);
766 __phy_write(phydev, 0x1C, 0x401C);
767 __phy_write(phydev, 0x1C, 0xA610);
768 __phy_write(phydev, 0x1C, 0x8520);
769 __phy_write(phydev, 0x1C, 0xA510);
770 __phy_write(phydev, 0x1C, 0x21F4);
771 __phy_write(phydev, 0x1B, 0xA01A);
772 __phy_write(phydev, 0x1C, 0x0000);
773 __phy_write(phydev, 0x1B, 0xA000);
774 __phy_write(phydev, 0x1C, 0x11EF);
775 __phy_write(phydev, 0x1B, 0xB820);
776 __phy_write(phydev, 0x1C, 0x0210);
777 __phy_write(phydev, 0x1B, 0xB82E);
778 __phy_write(phydev, 0x1C, 0x0000);
779 __phy_write(phydev, 0x1B, 0x8020);
780 __phy_write(phydev, 0x1C, 0x0000);
781 __phy_write(phydev, 0x1B, 0xB820);
782 __phy_write(phydev, 0x1C, 0x0000);
783 //__phy_write(phydev, 0x1B, 0xB800);
784 do {
785 __phy_write(phydev, 0x1B, 0xB800);
786 io_data = (__phy_read(phydev, 0x1C)) & 0x40;
787 timer--;
788 if (timer == 0) {
789 printk("phy_debug: phy init error func:%s,line:%d\n", __FUNCTION__, __LINE__);
790
791 break;
792 }
793 } while (io_data != 0);
794
795 printk("phy_debug phy init success\n");
796
797 /* I/O Power Sllection */
798 __phy_write(phydev, 0x1F, 0x0A4C);//change page to default value
799 mdio_data = __phy_read(phydev, 0x12);
800 mdio_data &= 0xC7FF;
801 mdio_data |= 4 << 11;
802 __phy_write(phydev, 0x12, mdio_data);
803
804
805 printk("phy_debug set rgmii driving strengths is 1.8v\n");
806
807 phydev->autoneg = AUTONEG_DISABLE;
808 phydev->duplex = DUPLEX_FULL;
809
810#if 0
811//phy power on
812 __phy_write(phydev, 0, 0x2100);
813#endif
814 //mdio_misc_init(phydev);
815 return 0;
816}
817
818static int rtl9000Bf_read_status(struct phy_device *phydev)
819{
820 //printk("phy_debug:func:%s,line:%d\n", __FUNCTION__, __LINE__);
821
822 phydev->duplex = DUPLEX_FULL;
823 phydev->speed = SPEED_100;
824 phydev->pause = 0;
825 phydev->asym_pause = 0;
826 phydev->link = 1;
827
828 return 0;
829}
830
b.liue9582032025-04-17 19:18:16 +0800831static struct phy_driver realtek_drvs[] = {
832 {
833 PHY_ID_MATCH_EXACT(0x00008201),
834 .name = "RTL8201CP Ethernet",
835 }, {
836 PHY_ID_MATCH_EXACT(0x001cc816),
837 .name = "RTL8201F Fast Ethernet",
838 .ack_interrupt = &rtl8201_ack_interrupt,
839 .config_intr = &rtl8201_config_intr,
840 .suspend = genphy_suspend,
841 .resume = genphy_resume,
842 .read_page = rtl821x_read_page,
843 .write_page = rtl821x_write_page,
844 }, {
845 PHY_ID_MATCH_MODEL(0x001cc880),
846 .name = "RTL8208 Fast Ethernet",
847 .read_mmd = genphy_read_mmd_unsupported,
848 .write_mmd = genphy_write_mmd_unsupported,
849 .suspend = genphy_suspend,
850 .resume = genphy_resume,
851 .read_page = rtl821x_read_page,
852 .write_page = rtl821x_write_page,
853 }, {
854 PHY_ID_MATCH_EXACT(0x001cc910),
855 .name = "RTL8211 Gigabit Ethernet",
856 .config_aneg = rtl8211_config_aneg,
857 .read_mmd = &genphy_read_mmd_unsupported,
858 .write_mmd = &genphy_write_mmd_unsupported,
859 .read_page = rtl821x_read_page,
860 .write_page = rtl821x_write_page,
861 }, {
862 PHY_ID_MATCH_EXACT(0x001cc912),
863 .name = "RTL8211B Gigabit Ethernet",
864 .ack_interrupt = &rtl821x_ack_interrupt,
865 .config_intr = &rtl8211b_config_intr,
866 .read_mmd = &genphy_read_mmd_unsupported,
867 .write_mmd = &genphy_write_mmd_unsupported,
868 .suspend = rtl8211b_suspend,
869 .resume = rtl8211b_resume,
870 .read_page = rtl821x_read_page,
871 .write_page = rtl821x_write_page,
872 }, {
873 PHY_ID_MATCH_EXACT(0x001cc913),
874 .name = "RTL8211C Gigabit Ethernet",
875 .config_init = rtl8211c_config_init,
876 .read_mmd = &genphy_read_mmd_unsupported,
877 .write_mmd = &genphy_write_mmd_unsupported,
878 .read_page = rtl821x_read_page,
879 .write_page = rtl821x_write_page,
880 }, {
881 PHY_ID_MATCH_EXACT(0x001cc914),
882 .name = "RTL8211DN Gigabit Ethernet",
883 .ack_interrupt = rtl821x_ack_interrupt,
884 .config_intr = rtl8211e_config_intr,
885 .suspend = genphy_suspend,
886 .resume = genphy_resume,
887 .read_page = rtl821x_read_page,
888 .write_page = rtl821x_write_page,
889 }, {
890 PHY_ID_MATCH_EXACT(0x001cc915),
891 .name = "RTL8211E Gigabit Ethernet",
892 .config_init = &rtl8211e_config_init,
893 .ack_interrupt = &rtl821x_ack_interrupt,
894 .config_intr = &rtl8211e_config_intr,
895 .suspend = genphy_suspend,
896 .resume = genphy_resume,
897 .read_page = rtl821x_read_page,
898 .write_page = rtl821x_write_page,
899 }, {
900 PHY_ID_MATCH_EXACT(0x001cc916),
901 .name = "RTL8211F Gigabit Ethernet",
902 .config_init = &rtl8211f_config_init,
903 .ack_interrupt = &rtl8211f_ack_interrupt,
904 .config_intr = &rtl8211f_config_intr,
905 .suspend = genphy_suspend,
906 .resume = genphy_resume,
907 .read_page = rtl821x_read_page,
908 .write_page = rtl821x_write_page,
909 }, {
910 .name = "Generic FE-GE Realtek PHY",
911 .match_phy_device = rtlgen_match_phy_device,
912 .suspend = genphy_suspend,
913 .resume = genphy_resume,
914 .read_page = rtl821x_read_page,
915 .write_page = rtl821x_write_page,
916 .read_mmd = rtlgen_read_mmd,
917 .write_mmd = rtlgen_write_mmd,
918 }, {
919 .name = "RTL8125 2.5Gbps internal",
920 .match_phy_device = rtl8125_match_phy_device,
921 .get_features = rtl8125_get_features,
922 .config_aneg = rtl8125_config_aneg,
923 .read_status = rtl8125_read_status,
924 .suspend = genphy_suspend,
925 .resume = genphy_resume,
926 .read_page = rtl821x_read_page,
927 .write_page = rtl821x_write_page,
928 .read_mmd = rtl8125_read_mmd,
929 .write_mmd = rtl8125_write_mmd,
930 }, {
931 PHY_ID_MATCH_EXACT(0x001cc961),
932 .name = "RTL8366RB Gigabit Ethernet",
933 .config_init = &rtl8366rb_config_init,
934 /* These interrupts are handled by the irq controller
935 * embedded inside the RTL8366RB, they get unmasked when the
936 * irq is requested and ACKed by reading the status register,
937 * which is done by the irqchip code.
938 */
939 .ack_interrupt = genphy_no_ack_interrupt,
940 .config_intr = genphy_no_config_intr,
941 .suspend = genphy_suspend,
942 .resume = genphy_resume,
943 }, {
944 PHY_ID_MATCH_EXACT(0x001cc849),
945 .name = "RTL8221B-VB-CG 2.5Gbps PHY",
946 .config_init = &rtl822x_config_init,
947 .get_features = rtl822x_get_features,
948 .config_aneg = rtl822x_config_aneg,
949 .read_status = rtl822x_read_status,
950 .suspend = genphy_suspend,
951 .resume = rtlgen_resume,
952 .read_page = rtl821x_read_page,
953 .write_page = rtl821x_write_page,
954 .read_mmd = rtl822x_read_mmd,
955 .write_mmd = rtl822x_write_mmd,
956 }, {
957 PHY_ID_MATCH_EXACT(0x001cc84a),
958 .name = "RTL8221B-VM-CG 2.5Gbps PHY",
959 .config_init = &rtl822x_config_init,
960 .get_features = rtl822x_get_features,
961 .config_aneg = rtl822x_config_aneg,
962 .read_status = rtl822x_read_status,
963 .suspend = genphy_suspend,
964 .resume = rtlgen_resume,
965 .read_page = rtl821x_read_page,
966 .write_page = rtl821x_write_page,
967 .read_mmd = rtl822x_read_mmd,
968 .write_mmd = rtl822x_write_mmd,
hj.shaofe1632a2025-06-05 00:19:33 -0700969 }, {
970 PHY_ID_MATCH_EXACT(0x001ccb00),
971 .name = "RTL90000Bf PHY",
972 .config_init = &rtl9000Bf_config_init,
973// .remove = &rtl900Bf_remove,
974 .read_status = rtl9000Bf_read_status,
975 .suspend = genphy_suspend,
976 .resume = rtlgen_resume,
977 },
978
b.liue9582032025-04-17 19:18:16 +0800979};
980
hj.shaofe1632a2025-06-05 00:19:33 -0700981
982
b.liue9582032025-04-17 19:18:16 +0800983module_phy_driver(realtek_drvs);
984
985static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
986 { PHY_ID_MATCH_VENDOR(0x001cc800) },
hj.shaofe1632a2025-06-05 00:19:33 -0700987 { 0x001ccb00, 0x001fffff },
b.liue9582032025-04-17 19:18:16 +0800988 { }
989};
990
991MODULE_DEVICE_TABLE(mdio, realtek_tbl);