blob: 453177520631cbf31c39ddc189468bfc52b8bc9a [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>
hj.shaof72d6ff2025-06-10 04:34:26 -070015#include <linux/miscdevice.h>
16#include <linux/uaccess.h>
17#include <linux/gpio/consumer.h>
18#include <linux/of_gpio.h>
19//#LYNQ_MODFIY modify for task-1618 2025/6/10 start
20
21#define DEVICE_NAME "mdio_misc"
22
23struct rtl9000bf_mdio_dev {
24 struct phy_device *phydev;
25 struct mutex lock;
26 int rst_gpio;
27};
28struct mdio_reg_op {
29 uint32_t reg;
30 uint32_t val;
31};
32static struct rtl9000bf_mdio_dev *s_rtl9000bf_mdio_dev;
33static u16 param_check[27] = {0, 0x8017, 0xFB03, 0, 0x8092, 0x6000, 0, 0x80AF, 0x6000, \
34 0, 0x807D, 0x4443, 0, 0x809A, 0x4443, \
35 0, 0x81A3, 0x0F00, 0x0A81, 0x12, 0x0004, 0, \
36 0x83C8, 0x0005, 0x0A5C, 0x12, 0x0003};
37
38static u16 param_check2[5] = {0x401C, 0xA610, 0x8520, 0xA510, 0x21F4};
39static u16 param_check3[3] = {0, 0xA000, 0x11EF};
40
41#define RTL9000BF_INIT_TIMES_OUT 10
42#define RTL9000BF_ACCESS_TIMES_OUT 10
43//#LYNQ_MODFIY modify for task-1618 2025/6/10 end
b.liue9582032025-04-17 19:18:16 +080044
45#define RTL821x_PHYSR 0x11
46#define RTL821x_PHYSR_DUPLEX BIT(13)
47#define RTL821x_PHYSR_SPEED GENMASK(15, 14)
48
49#define RTL821x_INER 0x12
50#define RTL8211B_INER_INIT 0x6400
51#define RTL8211E_INER_LINK_STATUS BIT(10)
52#define RTL8211F_INER_LINK_STATUS BIT(4)
53
54#define RTL821x_INSR 0x13
55
56#define RTL821x_EXT_PAGE_SELECT 0x1e
57#define RTL821x_PAGE_SELECT 0x1f
58
59#define RTL8211F_INSR 0x1d
60
61#define RTL8211F_TX_DELAY BIT(8)
62#define RTL8211E_TX_DELAY BIT(1)
63#define RTL8211E_RX_DELAY BIT(2)
64#define RTL8211E_MODE_MII_GMII BIT(3)
65
66#define RTL8201F_ISR 0x1e
67#define RTL8201F_IER 0x13
68
69#define RTL8366RB_POWER_SAVE 0x15
70#define RTL8366RB_POWER_SAVE_ON BIT(12)
71
72#define RTL_SUPPORTS_5000FULL BIT(14)
73#define RTL_SUPPORTS_2500FULL BIT(13)
74#define RTL_SUPPORTS_10000FULL BIT(0)
75#define RTL_ADV_2500FULL BIT(7)
76#define RTL_LPADV_10000FULL BIT(11)
77#define RTL_LPADV_5000FULL BIT(6)
78#define RTL_LPADV_2500FULL BIT(5)
79
80#define RTLGEN_SPEED_MASK 0x0630
81
82#define RTL_GENERIC_PHYID 0x001cc800
83
84MODULE_DESCRIPTION("Realtek PHY driver");
85MODULE_AUTHOR("Johnson Leung");
86MODULE_LICENSE("GPL");
87
88static int rtl821x_read_page(struct phy_device *phydev)
89{
90 return __phy_read(phydev, RTL821x_PAGE_SELECT);
91}
92
93static int rtl821x_write_page(struct phy_device *phydev, int page)
94{
95 return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
96}
97
98static int rtl8201_ack_interrupt(struct phy_device *phydev)
99{
100 int err;
101
102 err = phy_read(phydev, RTL8201F_ISR);
103
104 return (err < 0) ? err : 0;
105}
106
107static int rtl821x_ack_interrupt(struct phy_device *phydev)
108{
109 int err;
110
111 err = phy_read(phydev, RTL821x_INSR);
112
113 return (err < 0) ? err : 0;
114}
115
116static int rtl8211f_ack_interrupt(struct phy_device *phydev)
117{
118 int err;
119
120 err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
121
122 return (err < 0) ? err : 0;
123}
124
125static int rtl8201_config_intr(struct phy_device *phydev)
126{
127 u16 val;
128
129 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
130 val = BIT(13) | BIT(12) | BIT(11);
131 else
132 val = 0;
133
134 return phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
135}
136
137static int rtl8211b_config_intr(struct phy_device *phydev)
138{
139 int err;
140
141 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
142 err = phy_write(phydev, RTL821x_INER,
143 RTL8211B_INER_INIT);
144 else
145 err = phy_write(phydev, RTL821x_INER, 0);
146
147 return err;
148}
149
150static int rtl8211e_config_intr(struct phy_device *phydev)
151{
152 int err;
153
154 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
155 err = phy_write(phydev, RTL821x_INER,
156 RTL8211E_INER_LINK_STATUS);
157 else
158 err = phy_write(phydev, RTL821x_INER, 0);
159
160 return err;
161}
162
163static int rtl8211f_config_intr(struct phy_device *phydev)
164{
165 u16 val;
166
167 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
168 val = RTL8211F_INER_LINK_STATUS;
169 else
170 val = 0;
171
172 return phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
173}
174
175static int rtl8211_config_aneg(struct phy_device *phydev)
176{
177 int ret;
178
179 ret = genphy_config_aneg(phydev);
180 if (ret < 0)
181 return ret;
182
183 /* Quirk was copied from vendor driver. Unfortunately it includes no
184 * description of the magic numbers.
185 */
186 if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
187 phy_write(phydev, 0x17, 0x2138);
188 phy_write(phydev, 0x0e, 0x0260);
189 } else {
190 phy_write(phydev, 0x17, 0x2108);
191 phy_write(phydev, 0x0e, 0x0000);
192 }
193
194 return 0;
195}
196
197static int rtl8211c_config_init(struct phy_device *phydev)
198{
199 /* RTL8211C has an issue when operating in Gigabit slave mode */
200 return phy_set_bits(phydev, MII_CTRL1000,
201 CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
202}
203
204static int rtl8211f_config_init(struct phy_device *phydev)
205{
206 struct device *dev = &phydev->mdio.dev;
207 u16 val;
208 int ret;
209
210 /* enable TX-delay for rgmii-{id,txid}, and disable it for rgmii and
211 * rgmii-rxid. The RX-delay can be enabled by the external RXDLY pin.
212 */
213 switch (phydev->interface) {
214 case PHY_INTERFACE_MODE_RGMII:
215 case PHY_INTERFACE_MODE_RGMII_RXID:
216 val = 0;
217 break;
218 case PHY_INTERFACE_MODE_RGMII_ID:
219 case PHY_INTERFACE_MODE_RGMII_TXID:
220 val = RTL8211F_TX_DELAY;
221 break;
222 default: /* the rest of the modes imply leaving delay as is. */
223 return 0;
224 }
225
226 ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
227 val);
228 if (ret < 0) {
229 dev_err(dev, "Failed to update the TX delay register\n");
230 return ret;
231 } else if (ret) {
232 dev_dbg(dev,
233 "%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
234 val ? "Enabling" : "Disabling");
235 } else {
236 dev_dbg(dev,
237 "2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
238 val ? "enabled" : "disabled");
239 }
240
241 return 0;
242}
243
244static int rtl8211e_config_init(struct phy_device *phydev)
245{
246 int ret = 0, oldpage;
247 u16 val;
248
249 /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
250 switch (phydev->interface) {
251 case PHY_INTERFACE_MODE_RGMII:
252 val = 0;
253 break;
254 case PHY_INTERFACE_MODE_RGMII_ID:
255 val = RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
256 break;
257 case PHY_INTERFACE_MODE_RGMII_RXID:
258 val = RTL8211E_RX_DELAY;
259 break;
260 case PHY_INTERFACE_MODE_RGMII_TXID:
261 val = RTL8211E_TX_DELAY;
262 break;
263 default: /* the rest of the modes imply leaving delays as is. */
264 return 0;
265 }
266
267 /* According to a sample driver there is a 0x1c config register on the
268 * 0xa4 extension page (0x7) layout. It can be used to disable/enable
269 * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins. It can
270 * also be used to customize the whole configuration register:
271 * 8:6 = PHY Address, 5:4 = Auto-Negotiation, 3 = Interface Mode Select,
272 * 2 = RX Delay, 1 = TX Delay, 0 = SELRGV (see original PHY datasheet
273 * for details).
274 */
275 oldpage = phy_select_page(phydev, 0x7);
276 if (oldpage < 0)
277 goto err_restore_page;
278
279 ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
280 if (ret)
281 goto err_restore_page;
282
283 ret = __phy_modify(phydev, 0x1c, RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
284 val);
285
286err_restore_page:
287 return phy_restore_page(phydev, oldpage, ret);
288}
289
290static int rtl8211b_suspend(struct phy_device *phydev)
291{
292 phy_write(phydev, MII_MMD_DATA, BIT(9));
293
294 return genphy_suspend(phydev);
295}
296
297static int rtl8211b_resume(struct phy_device *phydev)
298{
299 phy_write(phydev, MII_MMD_DATA, 0);
300
301 return genphy_resume(phydev);
302}
303
304static int rtl8366rb_config_init(struct phy_device *phydev)
305{
306 int ret;
307
308 ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
309 RTL8366RB_POWER_SAVE_ON);
310 if (ret) {
311 dev_err(&phydev->mdio.dev,
312 "error enabling power management\n");
313 }
314
315 return ret;
316}
317
318/* get actual speed to cover the downshift case */
319static int rtlgen_get_speed(struct phy_device *phydev)
320{
321 int val;
322
323 if (!phydev->link)
324 return 0;
325
326 val = phy_read_paged(phydev, 0xa43, 0x12);
327 if (val < 0)
328 return val;
329
330 switch (val & RTLGEN_SPEED_MASK) {
331 case 0x0000:
332 phydev->speed = SPEED_10;
333 break;
334 case 0x0010:
335 phydev->speed = SPEED_100;
336 break;
337 case 0x0020:
338 phydev->speed = SPEED_1000;
339 break;
340 case 0x0200:
341 phydev->speed = SPEED_10000;
342 break;
343 case 0x0210:
344 phydev->speed = SPEED_2500;
345 break;
346 case 0x0220:
347 phydev->speed = SPEED_5000;
348 break;
349 default:
350 break;
351 }
352
353 return 0;
354}
355
356static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
357{
358 int ret;
359
360 if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
361 rtl821x_write_page(phydev, 0xa5c);
362 ret = __phy_read(phydev, 0x12);
363 rtl821x_write_page(phydev, 0);
364 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
365 rtl821x_write_page(phydev, 0xa5d);
366 ret = __phy_read(phydev, 0x10);
367 rtl821x_write_page(phydev, 0);
368 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
369 rtl821x_write_page(phydev, 0xa5d);
370 ret = __phy_read(phydev, 0x11);
371 rtl821x_write_page(phydev, 0);
372 } else {
373 ret = -EOPNOTSUPP;
374 }
375
376 return ret;
377}
378
379static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
380 u16 val)
381{
382 int ret;
383
384 if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
385 rtl821x_write_page(phydev, 0xa5d);
386 ret = __phy_write(phydev, 0x10, val);
387 rtl821x_write_page(phydev, 0);
388 } else {
389 ret = -EOPNOTSUPP;
390 }
391
392 return ret;
393}
394
395static int rtl8125_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
396{
397 int ret = rtlgen_read_mmd(phydev, devnum, regnum);
398
399 if (ret != -EOPNOTSUPP)
400 return ret;
401
402 if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
403 rtl821x_write_page(phydev, 0xa6e);
404 ret = __phy_read(phydev, 0x16);
405 rtl821x_write_page(phydev, 0);
406 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
407 rtl821x_write_page(phydev, 0xa6d);
408 ret = __phy_read(phydev, 0x12);
409 rtl821x_write_page(phydev, 0);
410 } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
411 rtl821x_write_page(phydev, 0xa6d);
412 ret = __phy_read(phydev, 0x10);
413 rtl821x_write_page(phydev, 0);
414 }
415
416 return ret;
417}
418
419static int rtl8125_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
420 u16 val)
421{
422 int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
423
424 if (ret != -EOPNOTSUPP)
425 return ret;
426
427 if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
428 rtl821x_write_page(phydev, 0xa6d);
429 ret = __phy_write(phydev, 0x12, val);
430 rtl821x_write_page(phydev, 0);
431 }
432
433 return ret;
434}
435
436static int rtl8125_get_features(struct phy_device *phydev)
437{
438 int val;
439
440 val = phy_read_paged(phydev, 0xa61, 0x13);
441 if (val < 0)
442 return val;
443
444 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
445 phydev->supported, val & RTL_SUPPORTS_2500FULL);
446 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
447 phydev->supported, val & RTL_SUPPORTS_5000FULL);
448 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
449 phydev->supported, val & RTL_SUPPORTS_10000FULL);
450
451 return genphy_read_abilities(phydev);
452}
453
454static int rtl8125_config_aneg(struct phy_device *phydev)
455{
456 int ret = 0;
457
458 if (phydev->autoneg == AUTONEG_ENABLE) {
459 u16 adv2500 = 0;
460
461 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
462 phydev->advertising))
463 adv2500 = RTL_ADV_2500FULL;
464
465 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
466 RTL_ADV_2500FULL, adv2500);
467 if (ret < 0)
468 return ret;
469 }
470
471 return __genphy_config_aneg(phydev, ret);
472}
473
474static int rtl8125_read_status(struct phy_device *phydev)
475{
476 if (phydev->autoneg == AUTONEG_ENABLE) {
477 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
478
479 if (lpadv < 0)
480 return lpadv;
481
482 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
483 phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
484 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
485 phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
486 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
487 phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
488 }
489
490 return genphy_read_status(phydev);
491}
492
493static int rtl822x_config_init(struct phy_device *phydev)
494{
495 struct device *dev = &phydev->mdio.dev;
496 int ret;
497 int reg;
498
499 switch (phydev->interface) {
500 case PHY_INTERFACE_MODE_SGMII:
501 case PHY_INTERFACE_MODE_2500BASEX:
502 break;
503 default:
504 return 0;
505 }
506
507 /* set serdes mode */
508 reg = phy_read_mmd(phydev, 30, 0x697a);
509 dev_info(dev, "MMD30:0x697a = 0x%x\n", reg);
510
511 /* change to 2500Base-X + SGMII mode*/
512 phy_modify_mmd_changed(phydev, 30, 0x75F3, 0x1, 0);
513 ret = phy_modify_mmd_changed(phydev, 30, 0x697a, 0x1f, 0x0);
514 if (ret < 0) {
515 dev_err(dev, "Failed to update serdes option mode\n");
516 return ret;
517 } else if (ret) {
518 dev_info(dev, "serdes option mode set\n");
519
520 /* make changes take effect */
521 phy_modify_mmd_changed(phydev, 31, 0xA400, 0x1 << 14, 0x1 << 14);
522 do {
523 reg = phy_read_mmd(phydev, 31, 0xA434);
524 if (reg & (0x1 << 2))
525 break;
526 } while(1);
527 phy_modify_mmd_changed(phydev, 31, 0xA400, 0x1 << 14, 0);
528
529 } else {
530 dev_info(dev, "serdes option mode already set\n");
531 }
532
533 /* disabled hisgmii auto-negotiation */
534 phy_write_mmd(phydev, 30, 0x7588, 0x2);
535 phy_write_mmd(phydev, 30, 0x7589, 0x71d0);
536 phy_write_mmd(phydev, 30, 0x7587, 0x3);
537
538 dev_info(dev, "start to wait disable hisgmii AN finish\n");
539 do {
540 reg = phy_read_mmd(phydev, 30, 0x7587);
541 if ((reg & 0x1) == 0)
542 break;
543 } while(1);
544
545 return 0;
546}
547
548static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
549{
550 int ret;
551
552 if (devnum == MDIO_MMD_VEND2) {
553 int page, regad;
554
555 page = regnum >> 4;
556 regad = 16 + (regnum % 16) / 2;
557
558 rtl821x_write_page(phydev, page);
559 ret = __phy_read(phydev, regad);
560 rtl821x_write_page(phydev, 0);
561 } else {
562 /* Write the desired MMD Devad */
563 __phy_write(phydev, MII_MMD_CTRL, devnum);
564 /* Write the desired MMD register address */
565 __phy_write(phydev, MII_MMD_DATA, regnum);
566 /* Select the Function : DATA with no post increment */
567 __phy_write(phydev, MII_MMD_CTRL, devnum | MII_MMD_CTRL_NOINCR);
568 /* Read the content of the MMD's selected register */
569 ret = __phy_read(phydev, MII_MMD_DATA);
570 }
571
572 return ret;
573}
574
575static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
576 u16 val)
577{
578 int ret;
579
580 if (devnum == MDIO_MMD_VEND2) {
581 int page, regad;
582
583 page = regnum >> 4;
584 regad = 16 + (regnum % 16) / 2;
585
586 rtl821x_write_page(phydev, page);
587 ret = __phy_write(phydev, regad, val);
588 rtl821x_write_page(phydev, 0);
589 } else {
590 /* Write the desired MMD Devad */
591 __phy_write(phydev, MII_MMD_CTRL, devnum);
592 /* Write the desired MMD register address */
593 __phy_write(phydev, MII_MMD_DATA, regnum);
594 /* Select the Function : DATA with no post increment */
595 __phy_write(phydev, MII_MMD_CTRL, devnum | MII_MMD_CTRL_NOINCR);
596 /* Write the data into MMD's selected register */
597 ret = __phy_write(phydev, MII_MMD_DATA, val);
598 }
599
600 return ret;
601}
602
603static int rtl822x_get_features(struct phy_device *phydev)
604{
605 int val;
606
607 val = phy_read_paged(phydev, 0xa61, 0x13);
608 if (val < 0)
609 return val;
610
611 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
612 phydev->supported, val & RTL_SUPPORTS_2500FULL);
613 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
614 phydev->supported, val & RTL_SUPPORTS_5000FULL);
615 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
616 phydev->supported, val & RTL_SUPPORTS_10000FULL);
617
618 return genphy_read_abilities(phydev);
619}
620
621static int rtl822x_config_aneg(struct phy_device *phydev)
622{
623 int ret = 0;
624
625 if (phydev->autoneg == AUTONEG_ENABLE) {
626 u16 adv2500 = 0;
627
628 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
629 phydev->advertising))
630 adv2500 = RTL_ADV_2500FULL;
631
632 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
633 RTL_ADV_2500FULL, adv2500);
634 if (ret < 0)
635 return ret;
636 }
637
638 return __genphy_config_aneg(phydev, ret);
639}
640
641static int rtlgen_get_serdes_mode(struct phy_device *phydev)
642{
643 struct device *dev = &phydev->mdio.dev;
644 int ret;
645
646 ret = phy_read_mmd(phydev, 30, 0x7580);
647 if (ret < 0)
648 return ret;
649
650 switch (ret & 0x1f) {
651 case 0x2:
652 phydev->interface = PHY_INTERFACE_MODE_SGMII;
653 dev_dbg(dev, "==> Serdes mode: SGMII\n");
654 break;
655 case 0x12:
656 phydev->interface = PHY_INTERFACE_MODE_NA;
657 dev_dbg(dev, "==> Serdes mode: HiSGMII\n");
658 break;
659 case 0x16:
660 phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
661 dev_dbg(dev, "==> Serdes mode: 2500BASE-X\n");
662 break;
663 case 0x1f:
664 dev_dbg(dev, "==> Serdes mode: off\n");
665 break;
666 default:
667 break;
668 }
669
670 return 0;
671}
672
673static int rtl822x_read_status(struct phy_device *phydev)
674{
675 int ret;
676
677 if (phydev->autoneg == AUTONEG_ENABLE) {
678 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
679
680 if (lpadv < 0)
681 return lpadv;
682
683 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
684 phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
685 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
686 phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
687 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
688 phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
689 }
690
691 ret = genphy_read_status(phydev);
692 if (ret < 0)
693 return ret;
694
695 ret = rtlgen_get_serdes_mode(phydev);
696 if (ret < 0)
697 return ret;
698
699 return rtlgen_get_speed(phydev);
700}
701
702static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
703{
704 int val;
705
706 phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
707 val = phy_read(phydev, 0x13);
708 phy_write(phydev, RTL821x_PAGE_SELECT, 0);
709
710 return val >= 0 && val & RTL_SUPPORTS_2500FULL;
711}
712
713static int rtlgen_match_phy_device(struct phy_device *phydev)
714{
715 return phydev->phy_id == RTL_GENERIC_PHYID &&
716 !rtlgen_supports_2_5gbps(phydev);
717}
718
719static int rtl8125_match_phy_device(struct phy_device *phydev)
720{
721 return phydev->phy_id == RTL_GENERIC_PHYID &&
722 rtlgen_supports_2_5gbps(phydev);
723}
724
725static int rtlgen_resume(struct phy_device *phydev)
726{
727 int ret = genphy_resume(phydev);
728
729 /* Internal PHY's from RTL8168h up may not be instantly ready */
730 msleep(20);
731
732 return ret;
733}
hj.shaof72d6ff2025-06-10 04:34:26 -0700734//#LYNQ_MODFIY modify for task-1618 2025/6/10 start
735
736static int mdio_misc_open(struct inode *inode, struct file *file)
737{
738 return 0;
739}
740
741static ssize_t mdio_misc_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
742{
743 struct rtl9000bf_mdio_dev *dev = s_rtl9000bf_mdio_dev;
744 struct mdio_reg_op reg_op;
745
746 if (count < sizeof(struct mdio_reg_op))
747 return -EINVAL;
748
749 if (copy_from_user(&reg_op, buf, sizeof(struct mdio_reg_op)))
750 return -EFAULT;
751
752
753 mutex_lock(&dev->lock);
754 reg_op.val = __phy_read(dev->phydev, reg_op.reg);
755 mutex_unlock(&dev->lock);
756
757 if (copy_to_user(buf, &reg_op, sizeof(struct mdio_reg_op)))
758 return -EFAULT;
759
760 return sizeof(reg_op);
761}
762
763static ssize_t mdio_misc_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
764{
765 struct rtl9000bf_mdio_dev *dev = s_rtl9000bf_mdio_dev;
766 struct mdio_reg_op reg_op;
767 int ret;
768
769 if (count < sizeof(struct mdio_reg_op))
770 return -EINVAL;
771
772 if (copy_from_user(&reg_op, buf, sizeof(struct mdio_reg_op)))
773 return -EFAULT;
774
775
776 mutex_lock(&dev->lock);
777 ret = __phy_write(dev->phydev, reg_op.reg, reg_op.val);
778 mutex_unlock(&dev->lock);
779
780 *f_pos += count;
781 return ret ? ret : count;
782
783}
784
785static const struct file_operations mdio_misc_fops = {
786 .owner = THIS_MODULE,
787 .open = mdio_misc_open,
788 .read = mdio_misc_read,
789 .write = mdio_misc_write,
790};
791
792static struct miscdevice mdio_misc_device = {
793 .minor = MISC_DYNAMIC_MINOR,
794 .name = DEVICE_NAME,
795 .fops = &mdio_misc_fops,
796};
797
798static int mdio_misc_init(struct phy_device *phydev)
799{
800 s_rtl9000bf_mdio_dev->phydev = phydev;
801 mutex_init(&s_rtl9000bf_mdio_dev->lock);
802 return misc_register(&mdio_misc_device);
803}
804
805static s16 RTL9000Bx_Initial_Configuration(struct phy_device *phydev)
806{
807 u16 reg_data = 0;
808 u32 timer = 2000; // set a 2ms timer
809
810 //power down
811 __phy_write(phydev, 0, 0x800);
812 mdelay(10);
813
814 __phy_write(phydev, 27, 0x8017);
815 __phy_write(phydev, 28, 0xFB03);
816 __phy_write(phydev, 27, 0x8092);
817 __phy_write(phydev, 28, 0x6000);
818 __phy_write(phydev, 27, 0x80AF);
819 __phy_write(phydev, 28, 0x6000);
820 __phy_write(phydev, 27, 0x807D);
821 __phy_write(phydev, 28, 0x4443);
822 __phy_write(phydev, 27, 0x809A);
823 __phy_write(phydev, 28, 0x4443);
824 __phy_write(phydev, 27, 0x81A3);
825 __phy_write(phydev, 28, 0x0F00);
826 __phy_write(phydev, 31, 0x0a81);
827 __phy_write(phydev, 18, 0x0004);
828 __phy_write(phydev, 27, 0x83c8);
829 __phy_write(phydev, 28, 0x0005);
830 __phy_write(phydev, 31, 0x0a5c);
831 __phy_write(phydev, 18, 0x0003);
832 __phy_write(phydev, 27, 0xB820);
833 __phy_write(phydev, 28, 0x0010);
834 __phy_write(phydev, 27, 0xB830);
835 __phy_write(phydev, 28, 0x8000);
836
837 __phy_write(phydev, 27, 0xB800);
838 do {
839 reg_data = ((u16)__phy_read(phydev, 28) & 0x0040);
840 timer--;
841 if (timer == 0)
842 {
843 return -1;
844 }
845 } while (reg_data != 0x0040);
846
847 __phy_write(phydev, 27, 0x8020);
848 __phy_write(phydev, 28, 0x3300);
849 __phy_write(phydev, 27, 0xb82e);
850 __phy_write(phydev, 28, 0x0001);
851 __phy_write(phydev, 27, 0xb820);
852 __phy_write(phydev, 28, 0x0290);
853 __phy_write(phydev, 27, 0xa012);
854 __phy_write(phydev, 28, 0x0000);
855 __phy_write(phydev, 27, 0xa014);
856 __phy_write(phydev, 28, 0x401c);
857 __phy_write(phydev, 28, 0xa610);
858 __phy_write(phydev, 28, 0x8520);
859 __phy_write(phydev, 28, 0xa510);
860 __phy_write(phydev, 28, 0x21f4);
861 __phy_write(phydev, 27, 0xa01a);
862 __phy_write(phydev, 28, 0x0000);
863 __phy_write(phydev, 27, 0xa000);
864 __phy_write(phydev, 28, 0x11ef);
865 __phy_write(phydev, 27, 0xb820);
866 __phy_write(phydev, 28, 0x0210);
867 __phy_write(phydev, 27, 0xb82e);
868 __phy_write(phydev, 28, 0x0000);
869 __phy_write(phydev, 27, 0x8020);
870 __phy_write(phydev, 28, 0x0000);
871 __phy_write(phydev, 27, 0xb820);
872 __phy_write(phydev, 28, 0x0000);
873
874 __phy_write(phydev, 27, 0xb800);
875 timer = 2000; // set a 2ms timer
876 do {
877 reg_data = ((u16)__phy_read(phydev, 28) & 0x0040);
878 timer--;
879 if (timer == 0) {
880 return -1;
881 }
882 } while (reg_data != 0x0000);
883
884 __phy_write(phydev, 0, 0x2100); //power on
885
886 return 0;
887}
888
889static s16 RTL9000Bx_Initial_Configuration_Check(struct phy_device *phydev)
890{
891 u16 reg_data = 0, reg_data_temp;
892 u16 reg_data_chk = 0;
893 u32 timer = 2000; // set a 2ms timer
894
895 u16 page;
896 u16 reg, i, param_address;
897
898 for (i = 0; i < 27; i = i + 3) {
899 page = param_check[i];
900 reg = param_check[i + 1];
901 reg_data_chk = param_check[i + 2];
902
903 if (page == 0) {
904 __phy_write(phydev, 27, reg);
905 reg_data = __phy_read(phydev, 28);
906 }
907 else {
908 __phy_write(phydev, 31, page);
909 reg_data = __phy_read(phydev, reg);
910 }
911 if (reg_data_chk != reg_data) {
912 printk(KERN_ERR "%dth param error page=0x%04X reg=0x%04X data=0x%04X\r\n", i / 3, page, reg, reg_data);
913 return -1;
914 }
915 }
916
917 __phy_write(phydev, 27, 0xB820);
918 __phy_write(phydev, 28, 0x0010);
919 __phy_write(phydev, 27, 0xB830);
920 __phy_write(phydev, 28, 0x8000);
921
922 __phy_write(phydev, 27, 0xB800);
923 do {
924 reg_data = ((u16)__phy_read(phydev, 28) & 0x0040);
925 timer--;
926 if (timer == 0){
927 return -1;
928 }
929 } while (reg_data != 0x0040);
930
931 __phy_write(phydev, 27, 0x8020);
932 __phy_write(phydev, 28, 0x3300);
933 __phy_write(phydev, 27, 0xB82E);
934 __phy_write(phydev, 28, 0x0001);
935
936 param_address = 0;
937 for (i = 0; i < 5; i++) {
938 __phy_write(phydev, 31, 0xA01);
939 reg_data_temp = __phy_read(phydev, 17);
940 reg_data_temp &= ~(0x1ff);
941 param_address &= 0x1FF;
942 __phy_write(phydev, 17, (reg_data_temp | param_address));
943 __phy_write(phydev, 31, 0xA01);
944 reg_data = __phy_read(phydev, 18);
945 reg_data_chk = param_check2[i];
946 if (reg_data_chk != reg_data){
947 printk(KERN_ERR "%dth param error data=0x%04X expected_data=0x%04X\r\n", i, reg_data, reg_data_chk);
948 return -1;
949 }
950 param_address++;
951 }
952 for (i = 0; i < 3; i = i + 3) {
953 page = param_check3[i];
954 reg = param_check3[i + 1];
955 reg_data_chk = param_check3[i + 2];
956
957 if (page == 0) {
958 __phy_write(phydev, 27, reg);
959 reg_data = __phy_read(phydev, 28);
960 }
961 else {
962 __phy_write(phydev, 31, page);
963 reg_data = __phy_read(phydev, reg);
964 }
965 if (reg_data_chk != reg_data) {
966 printk(KERN_ERR "%dth param error page=0x%04X reg=0x%04X data=0x%04X\r\n", i / 3, page, reg, reg_data);
967 return -1;
968 }
969 }
970 __phy_write(phydev, 27, 0xB82E);
971 __phy_write(phydev, 28, 0x0000);
972 __phy_write(phydev, 27, 0x8020);
973 __phy_write(phydev, 28, 0x0000);
974 __phy_write(phydev, 27, 0xB820);
975 __phy_write(phydev, 28, 0x0000);
976
977 __phy_write(phydev, 27, 0xB800);
978 timer = 2000; // set a 2ms timer
979 do {
980 reg_data = ((u16)__phy_read(phydev, 28) & 0x0040);
981 timer--;
982 if (timer == 0){
983 return -1;
984 }
985 } while (reg_data != 0x0000);
986
987 return 0;
988}
b.liue9582032025-04-17 19:18:16 +0800989
hj.shaofe1632a2025-06-05 00:19:33 -0700990static int rtl9000Bf_config_init(struct phy_device *phydev)
991{
hj.shaofe1632a2025-06-05 00:19:33 -0700992 u32 mdio_data = 0;
hj.shaof72d6ff2025-06-10 04:34:26 -0700993 u32 ret;
994 int times= 1;
995 struct device_node *np;
996
997 np = phydev->mdio.dev.of_node;
998 if (!np) {
999 dev_err(&phydev->mdio.dev, "No device tree node found\n");
1000 return -ENODEV;
1001 }
1002
1003 if (!s_rtl9000bf_mdio_dev) {
1004 s_rtl9000bf_mdio_dev = kzalloc(sizeof(*s_rtl9000bf_mdio_dev), GFP_KERNEL);
1005 if (!s_rtl9000bf_mdio_dev)
1006 return -ENOMEM;
hj.shaofe1632a2025-06-05 00:19:33 -07001007
hj.shaof72d6ff2025-06-10 04:34:26 -07001008 s_rtl9000bf_mdio_dev->rst_gpio = of_get_named_gpio(np, "rst-gpio", 0);
1009 if (s_rtl9000bf_mdio_dev->rst_gpio < 0) {
1010 dev_err(&phydev->mdio.dev, "Failed to get reset gpio: %d\n", s_rtl9000bf_mdio_dev->rst_gpio);
1011 kfree(s_rtl9000bf_mdio_dev);
1012 s_rtl9000bf_mdio_dev = NULL;
1013 return s_rtl9000bf_mdio_dev->rst_gpio;
hj.shaofe1632a2025-06-05 00:19:33 -07001014 }
hj.shaof72d6ff2025-06-10 04:34:26 -07001015 ret = mdio_misc_init(phydev);
1016 if(ret){
1017 goto err;
hj.shaofe1632a2025-06-05 00:19:33 -07001018 }
hj.shaof72d6ff2025-06-10 04:34:26 -07001019 }
1020
1021 gpio_request(s_rtl9000bf_mdio_dev->rst_gpio, "phy-reset");
1022 gpio_direction_output(s_rtl9000bf_mdio_dev->rst_gpio, 0);
1023 mdelay(20);
1024 gpio_set_value(s_rtl9000bf_mdio_dev->rst_gpio, 1);
1025 mdelay(20);
hj.shaofe1632a2025-06-05 00:19:33 -07001026
hj.shaof72d6ff2025-06-10 04:34:26 -07001027 //check PHY accessible
1028 while(times <= RTL9000BF_ACCESS_TIMES_OUT) {
1029 mdio_data = phy_read(phydev, 0x10);
1030 mdio_data = mdio_data & 0x0007;
1031 if(mdio_data == 0x0003) {
1032 printk(KERN_INFO "phy_info: phy is accessible \n");
1033 break;
1034 } else {
1035 printk(KERN_INFO "phy_info: phy is not accessible times:%d \n", times);
1036 gpio_direction_output(s_rtl9000bf_mdio_dev->rst_gpio, 0);
1037 mdelay(30);
1038 gpio_set_value(s_rtl9000bf_mdio_dev->rst_gpio, 1);
1039 mdelay(20);
1040 }
1041 times++;
1042 mdelay(1000);
1043 }
1044
1045 if(times >= RTL9000BF_ACCESS_TIMES_OUT) {
1046 printk(KERN_ERR "phy_info: phy init error times:%d \n", times);
1047 ret = -1;
1048 goto err;
1049 }
1050
1051 times = 1;
1052
1053 //init phy init and check phy init
1054 while(times <= RTL9000BF_INIT_TIMES_OUT) {
1055 ret = RTL9000Bx_Initial_Configuration(phydev);
1056 if(0 == ret) {
1057 printk(KERN_INFO "phy_info: phy init success times:%d \n", times);
1058 ret = RTL9000Bx_Initial_Configuration_Check(phydev);
1059 if(0 == ret) {
1060 printk(KERN_INFO "phy_info: phy init_check success times:%d \n", times);
1061 break;
1062 } else {
1063 printk(KERN_INFO "phy_info: phy init_check error times:%d \n", times);
1064 }
1065 } else {
1066 printk(KERN_INFO "phy_info: phy init error times:%d \n", times);
1067 //phy hard reset
1068 gpio_set_value(s_rtl9000bf_mdio_dev->rst_gpio, 0);
1069 mdelay(30);
1070 gpio_set_value(s_rtl9000bf_mdio_dev->rst_gpio, 1);
1071 mdelay(20);
1072 }
1073 times++;
1074 }
1075
1076 if(times >= RTL9000BF_INIT_TIMES_OUT) {
1077 printk(KERN_ERR "phy_info: phy init error times:%d \n", times);
1078 ret = -1;
1079 goto err;
1080 }
1081
hj.shaofe1632a2025-06-05 00:19:33 -07001082 /* I/O Power Sllection */
hj.shaof72d6ff2025-06-10 04:34:26 -07001083 //change page to default value
1084 __phy_write(phydev, 0x1F, 0x0A4C);
hj.shaofe1632a2025-06-05 00:19:33 -07001085 mdio_data = __phy_read(phydev, 0x12);
1086 mdio_data &= 0xC7FF;
1087 mdio_data |= 4 << 11;
1088 __phy_write(phydev, 0x12, mdio_data);
hj.shaof72d6ff2025-06-10 04:34:26 -07001089 printk(KERN_INFO "phy_info: set rgmii driving strengths is 1.8v \n");
hj.shaofe1632a2025-06-05 00:19:33 -07001090
1091 phydev->autoneg = AUTONEG_DISABLE;
1092 phydev->duplex = DUPLEX_FULL;
1093
hj.shaofe1632a2025-06-05 00:19:33 -07001094 return 0;
hj.shaof72d6ff2025-06-10 04:34:26 -07001095
1096err:
1097 gpio_free(s_rtl9000bf_mdio_dev->rst_gpio);
1098 kfree(s_rtl9000bf_mdio_dev);
1099 s_rtl9000bf_mdio_dev = NULL;
1100 return ret;
1101}
1102
1103static void rtl9000Bf_remove(struct phy_device *phydev)
1104{
1105 if (s_rtl9000bf_mdio_dev && s_rtl9000bf_mdio_dev->phydev == phydev) {
1106 misc_deregister(&mdio_misc_device);
1107 gpio_free(s_rtl9000bf_mdio_dev->rst_gpio);
1108 kfree(s_rtl9000bf_mdio_dev);
1109 s_rtl9000bf_mdio_dev = NULL;
1110 }
1111
hj.shaofe1632a2025-06-05 00:19:33 -07001112}
1113
1114static int rtl9000Bf_read_status(struct phy_device *phydev)
1115{
hj.shaofe1632a2025-06-05 00:19:33 -07001116 phydev->duplex = DUPLEX_FULL;
1117 phydev->speed = SPEED_100;
1118 phydev->pause = 0;
1119 phydev->asym_pause = 0;
1120 phydev->link = 1;
1121
1122 return 0;
1123}
hj.shaof72d6ff2025-06-10 04:34:26 -07001124static int rtl9000Bf_soft_reset(struct phy_device *phydev)
1125{
1126 return 0;
1127}
1128
1129//#LYNQ_MODFIY modify for task-1618 2025/6/10 end
hj.shaofe1632a2025-06-05 00:19:33 -07001130
b.liue9582032025-04-17 19:18:16 +08001131static struct phy_driver realtek_drvs[] = {
1132 {
1133 PHY_ID_MATCH_EXACT(0x00008201),
1134 .name = "RTL8201CP Ethernet",
1135 }, {
1136 PHY_ID_MATCH_EXACT(0x001cc816),
1137 .name = "RTL8201F Fast Ethernet",
1138 .ack_interrupt = &rtl8201_ack_interrupt,
1139 .config_intr = &rtl8201_config_intr,
1140 .suspend = genphy_suspend,
1141 .resume = genphy_resume,
1142 .read_page = rtl821x_read_page,
1143 .write_page = rtl821x_write_page,
1144 }, {
1145 PHY_ID_MATCH_MODEL(0x001cc880),
1146 .name = "RTL8208 Fast Ethernet",
1147 .read_mmd = genphy_read_mmd_unsupported,
1148 .write_mmd = genphy_write_mmd_unsupported,
1149 .suspend = genphy_suspend,
1150 .resume = genphy_resume,
1151 .read_page = rtl821x_read_page,
1152 .write_page = rtl821x_write_page,
1153 }, {
1154 PHY_ID_MATCH_EXACT(0x001cc910),
1155 .name = "RTL8211 Gigabit Ethernet",
1156 .config_aneg = rtl8211_config_aneg,
1157 .read_mmd = &genphy_read_mmd_unsupported,
1158 .write_mmd = &genphy_write_mmd_unsupported,
1159 .read_page = rtl821x_read_page,
1160 .write_page = rtl821x_write_page,
1161 }, {
1162 PHY_ID_MATCH_EXACT(0x001cc912),
1163 .name = "RTL8211B Gigabit Ethernet",
1164 .ack_interrupt = &rtl821x_ack_interrupt,
1165 .config_intr = &rtl8211b_config_intr,
1166 .read_mmd = &genphy_read_mmd_unsupported,
1167 .write_mmd = &genphy_write_mmd_unsupported,
1168 .suspend = rtl8211b_suspend,
1169 .resume = rtl8211b_resume,
1170 .read_page = rtl821x_read_page,
1171 .write_page = rtl821x_write_page,
1172 }, {
1173 PHY_ID_MATCH_EXACT(0x001cc913),
1174 .name = "RTL8211C Gigabit Ethernet",
1175 .config_init = rtl8211c_config_init,
1176 .read_mmd = &genphy_read_mmd_unsupported,
1177 .write_mmd = &genphy_write_mmd_unsupported,
1178 .read_page = rtl821x_read_page,
1179 .write_page = rtl821x_write_page,
1180 }, {
1181 PHY_ID_MATCH_EXACT(0x001cc914),
1182 .name = "RTL8211DN Gigabit Ethernet",
1183 .ack_interrupt = rtl821x_ack_interrupt,
1184 .config_intr = rtl8211e_config_intr,
1185 .suspend = genphy_suspend,
1186 .resume = genphy_resume,
1187 .read_page = rtl821x_read_page,
1188 .write_page = rtl821x_write_page,
1189 }, {
1190 PHY_ID_MATCH_EXACT(0x001cc915),
1191 .name = "RTL8211E Gigabit Ethernet",
1192 .config_init = &rtl8211e_config_init,
1193 .ack_interrupt = &rtl821x_ack_interrupt,
1194 .config_intr = &rtl8211e_config_intr,
1195 .suspend = genphy_suspend,
1196 .resume = genphy_resume,
1197 .read_page = rtl821x_read_page,
1198 .write_page = rtl821x_write_page,
1199 }, {
1200 PHY_ID_MATCH_EXACT(0x001cc916),
1201 .name = "RTL8211F Gigabit Ethernet",
1202 .config_init = &rtl8211f_config_init,
1203 .ack_interrupt = &rtl8211f_ack_interrupt,
1204 .config_intr = &rtl8211f_config_intr,
1205 .suspend = genphy_suspend,
1206 .resume = genphy_resume,
1207 .read_page = rtl821x_read_page,
1208 .write_page = rtl821x_write_page,
1209 }, {
1210 .name = "Generic FE-GE Realtek PHY",
1211 .match_phy_device = rtlgen_match_phy_device,
1212 .suspend = genphy_suspend,
1213 .resume = genphy_resume,
1214 .read_page = rtl821x_read_page,
1215 .write_page = rtl821x_write_page,
1216 .read_mmd = rtlgen_read_mmd,
1217 .write_mmd = rtlgen_write_mmd,
1218 }, {
1219 .name = "RTL8125 2.5Gbps internal",
1220 .match_phy_device = rtl8125_match_phy_device,
1221 .get_features = rtl8125_get_features,
1222 .config_aneg = rtl8125_config_aneg,
1223 .read_status = rtl8125_read_status,
1224 .suspend = genphy_suspend,
1225 .resume = genphy_resume,
1226 .read_page = rtl821x_read_page,
1227 .write_page = rtl821x_write_page,
1228 .read_mmd = rtl8125_read_mmd,
1229 .write_mmd = rtl8125_write_mmd,
1230 }, {
1231 PHY_ID_MATCH_EXACT(0x001cc961),
1232 .name = "RTL8366RB Gigabit Ethernet",
1233 .config_init = &rtl8366rb_config_init,
1234 /* These interrupts are handled by the irq controller
1235 * embedded inside the RTL8366RB, they get unmasked when the
1236 * irq is requested and ACKed by reading the status register,
1237 * which is done by the irqchip code.
1238 */
1239 .ack_interrupt = genphy_no_ack_interrupt,
1240 .config_intr = genphy_no_config_intr,
1241 .suspend = genphy_suspend,
1242 .resume = genphy_resume,
1243 }, {
1244 PHY_ID_MATCH_EXACT(0x001cc849),
1245 .name = "RTL8221B-VB-CG 2.5Gbps PHY",
1246 .config_init = &rtl822x_config_init,
1247 .get_features = rtl822x_get_features,
1248 .config_aneg = rtl822x_config_aneg,
1249 .read_status = rtl822x_read_status,
1250 .suspend = genphy_suspend,
1251 .resume = rtlgen_resume,
1252 .read_page = rtl821x_read_page,
1253 .write_page = rtl821x_write_page,
1254 .read_mmd = rtl822x_read_mmd,
1255 .write_mmd = rtl822x_write_mmd,
1256 }, {
1257 PHY_ID_MATCH_EXACT(0x001cc84a),
1258 .name = "RTL8221B-VM-CG 2.5Gbps PHY",
1259 .config_init = &rtl822x_config_init,
1260 .get_features = rtl822x_get_features,
1261 .config_aneg = rtl822x_config_aneg,
1262 .read_status = rtl822x_read_status,
1263 .suspend = genphy_suspend,
1264 .resume = rtlgen_resume,
1265 .read_page = rtl821x_read_page,
1266 .write_page = rtl821x_write_page,
1267 .read_mmd = rtl822x_read_mmd,
1268 .write_mmd = rtl822x_write_mmd,
hj.shaof72d6ff2025-06-10 04:34:26 -07001269 },
1270//#LYNQ_MODFIY modify for task-1618 2025/6/10 start
1271 {
hj.shaofe1632a2025-06-05 00:19:33 -07001272 PHY_ID_MATCH_EXACT(0x001ccb00),
1273 .name = "RTL90000Bf PHY",
1274 .config_init = &rtl9000Bf_config_init,
hj.shaof72d6ff2025-06-10 04:34:26 -07001275 .remove = &rtl9000Bf_remove,
hj.shaofe1632a2025-06-05 00:19:33 -07001276 .read_status = rtl9000Bf_read_status,
1277 .suspend = genphy_suspend,
1278 .resume = rtlgen_resume,
hj.shaof72d6ff2025-06-10 04:34:26 -07001279 .soft_reset = rtl9000Bf_soft_reset,
hj.shaofe1632a2025-06-05 00:19:33 -07001280 },
hj.shaof72d6ff2025-06-10 04:34:26 -07001281//#LYNQ_MODFIY modify for task-1618 2025/6/10 end
hj.shaofe1632a2025-06-05 00:19:33 -07001282
b.liue9582032025-04-17 19:18:16 +08001283};
1284
hj.shaofe1632a2025-06-05 00:19:33 -07001285
1286
b.liue9582032025-04-17 19:18:16 +08001287module_phy_driver(realtek_drvs);
1288
1289static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
1290 { PHY_ID_MATCH_VENDOR(0x001cc800) },
hj.shaof72d6ff2025-06-10 04:34:26 -07001291//#LYNQ_MODFIY modify for task-1618 2025/6/10 start
1292
hj.shaofe1632a2025-06-05 00:19:33 -07001293 { 0x001ccb00, 0x001fffff },
hj.shaof72d6ff2025-06-10 04:34:26 -07001294
1295//#LYNQ_MODFIY modify for task-1618 2025/6/10 end
b.liue9582032025-04-17 19:18:16 +08001296 { }
1297};
1298
1299MODULE_DEVICE_TABLE(mdio, realtek_tbl);
hj.shaof72d6ff2025-06-10 04:34:26 -07001300