Merge tag 'x86-apic-2024-03-10' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / net / phy / realtek.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /* drivers/net/phy/realtek.c
3  *
4  * Driver for Realtek PHYs
5  *
6  * Author: Johnson Leung <r58129@freescale.com>
7  *
8  * Copyright (c) 2004 Freescale Semiconductor, Inc.
9  */
10 #include <linux/bitops.h>
11 #include <linux/of.h>
12 #include <linux/phy.h>
13 #include <linux/module.h>
14 #include <linux/delay.h>
15 #include <linux/clk.h>
16
17 #define RTL821x_PHYSR                           0x11
18 #define RTL821x_PHYSR_DUPLEX                    BIT(13)
19 #define RTL821x_PHYSR_SPEED                     GENMASK(15, 14)
20
21 #define RTL821x_INER                            0x12
22 #define RTL8211B_INER_INIT                      0x6400
23 #define RTL8211E_INER_LINK_STATUS               BIT(10)
24 #define RTL8211F_INER_LINK_STATUS               BIT(4)
25
26 #define RTL821x_INSR                            0x13
27
28 #define RTL821x_EXT_PAGE_SELECT                 0x1e
29 #define RTL821x_PAGE_SELECT                     0x1f
30
31 #define RTL8211F_PHYCR1                         0x18
32 #define RTL8211F_PHYCR2                         0x19
33 #define RTL8211F_INSR                           0x1d
34
35 #define RTL8211F_TX_DELAY                       BIT(8)
36 #define RTL8211F_RX_DELAY                       BIT(3)
37
38 #define RTL8211F_ALDPS_PLL_OFF                  BIT(1)
39 #define RTL8211F_ALDPS_ENABLE                   BIT(2)
40 #define RTL8211F_ALDPS_XTAL_OFF                 BIT(12)
41
42 #define RTL8211E_CTRL_DELAY                     BIT(13)
43 #define RTL8211E_TX_DELAY                       BIT(12)
44 #define RTL8211E_RX_DELAY                       BIT(11)
45
46 #define RTL8211F_CLKOUT_EN                      BIT(0)
47
48 #define RTL8201F_ISR                            0x1e
49 #define RTL8201F_ISR_ANERR                      BIT(15)
50 #define RTL8201F_ISR_DUPLEX                     BIT(13)
51 #define RTL8201F_ISR_LINK                       BIT(11)
52 #define RTL8201F_ISR_MASK                       (RTL8201F_ISR_ANERR | \
53                                                  RTL8201F_ISR_DUPLEX | \
54                                                  RTL8201F_ISR_LINK)
55 #define RTL8201F_IER                            0x13
56
57 #define RTL8366RB_POWER_SAVE                    0x15
58 #define RTL8366RB_POWER_SAVE_ON                 BIT(12)
59
60 #define RTL_SUPPORTS_5000FULL                   BIT(14)
61 #define RTL_SUPPORTS_2500FULL                   BIT(13)
62 #define RTL_SUPPORTS_10000FULL                  BIT(0)
63 #define RTL_ADV_2500FULL                        BIT(7)
64 #define RTL_LPADV_10000FULL                     BIT(11)
65 #define RTL_LPADV_5000FULL                      BIT(6)
66 #define RTL_LPADV_2500FULL                      BIT(5)
67
68 #define RTL9000A_GINMR                          0x14
69 #define RTL9000A_GINMR_LINK_STATUS              BIT(4)
70
71 #define RTLGEN_SPEED_MASK                       0x0630
72
73 #define RTL_GENERIC_PHYID                       0x001cc800
74 #define RTL_8211FVD_PHYID                       0x001cc878
75
76 MODULE_DESCRIPTION("Realtek PHY driver");
77 MODULE_AUTHOR("Johnson Leung");
78 MODULE_LICENSE("GPL");
79
80 struct rtl821x_priv {
81         u16 phycr1;
82         u16 phycr2;
83         bool has_phycr2;
84         struct clk *clk;
85 };
86
87 static int rtl821x_read_page(struct phy_device *phydev)
88 {
89         return __phy_read(phydev, RTL821x_PAGE_SELECT);
90 }
91
92 static int rtl821x_write_page(struct phy_device *phydev, int page)
93 {
94         return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
95 }
96
97 static int rtl821x_probe(struct phy_device *phydev)
98 {
99         struct device *dev = &phydev->mdio.dev;
100         struct rtl821x_priv *priv;
101         u32 phy_id = phydev->drv->phy_id;
102         int ret;
103
104         priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
105         if (!priv)
106                 return -ENOMEM;
107
108         priv->clk = devm_clk_get_optional_enabled(dev, NULL);
109         if (IS_ERR(priv->clk))
110                 return dev_err_probe(dev, PTR_ERR(priv->clk),
111                                      "failed to get phy clock\n");
112
113         ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1);
114         if (ret < 0)
115                 return ret;
116
117         priv->phycr1 = ret & (RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF);
118         if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
119                 priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
120
121         priv->has_phycr2 = !(phy_id == RTL_8211FVD_PHYID);
122         if (priv->has_phycr2) {
123                 ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
124                 if (ret < 0)
125                         return ret;
126
127                 priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
128                 if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
129                         priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
130         }
131
132         phydev->priv = priv;
133
134         return 0;
135 }
136
137 static int rtl8201_ack_interrupt(struct phy_device *phydev)
138 {
139         int err;
140
141         err = phy_read(phydev, RTL8201F_ISR);
142
143         return (err < 0) ? err : 0;
144 }
145
146 static int rtl821x_ack_interrupt(struct phy_device *phydev)
147 {
148         int err;
149
150         err = phy_read(phydev, RTL821x_INSR);
151
152         return (err < 0) ? err : 0;
153 }
154
155 static int rtl8211f_ack_interrupt(struct phy_device *phydev)
156 {
157         int err;
158
159         err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
160
161         return (err < 0) ? err : 0;
162 }
163
164 static int rtl8201_config_intr(struct phy_device *phydev)
165 {
166         u16 val;
167         int err;
168
169         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
170                 err = rtl8201_ack_interrupt(phydev);
171                 if (err)
172                         return err;
173
174                 val = BIT(13) | BIT(12) | BIT(11);
175                 err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
176         } else {
177                 val = 0;
178                 err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
179                 if (err)
180                         return err;
181
182                 err = rtl8201_ack_interrupt(phydev);
183         }
184
185         return err;
186 }
187
188 static int rtl8211b_config_intr(struct phy_device *phydev)
189 {
190         int err;
191
192         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
193                 err = rtl821x_ack_interrupt(phydev);
194                 if (err)
195                         return err;
196
197                 err = phy_write(phydev, RTL821x_INER,
198                                 RTL8211B_INER_INIT);
199         } else {
200                 err = phy_write(phydev, RTL821x_INER, 0);
201                 if (err)
202                         return err;
203
204                 err = rtl821x_ack_interrupt(phydev);
205         }
206
207         return err;
208 }
209
210 static int rtl8211e_config_intr(struct phy_device *phydev)
211 {
212         int err;
213
214         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
215                 err = rtl821x_ack_interrupt(phydev);
216                 if (err)
217                         return err;
218
219                 err = phy_write(phydev, RTL821x_INER,
220                                 RTL8211E_INER_LINK_STATUS);
221         } else {
222                 err = phy_write(phydev, RTL821x_INER, 0);
223                 if (err)
224                         return err;
225
226                 err = rtl821x_ack_interrupt(phydev);
227         }
228
229         return err;
230 }
231
232 static int rtl8211f_config_intr(struct phy_device *phydev)
233 {
234         u16 val;
235         int err;
236
237         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
238                 err = rtl8211f_ack_interrupt(phydev);
239                 if (err)
240                         return err;
241
242                 val = RTL8211F_INER_LINK_STATUS;
243                 err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
244         } else {
245                 val = 0;
246                 err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
247                 if (err)
248                         return err;
249
250                 err = rtl8211f_ack_interrupt(phydev);
251         }
252
253         return err;
254 }
255
256 static irqreturn_t rtl8201_handle_interrupt(struct phy_device *phydev)
257 {
258         int irq_status;
259
260         irq_status = phy_read(phydev, RTL8201F_ISR);
261         if (irq_status < 0) {
262                 phy_error(phydev);
263                 return IRQ_NONE;
264         }
265
266         if (!(irq_status & RTL8201F_ISR_MASK))
267                 return IRQ_NONE;
268
269         phy_trigger_machine(phydev);
270
271         return IRQ_HANDLED;
272 }
273
274 static irqreturn_t rtl821x_handle_interrupt(struct phy_device *phydev)
275 {
276         int irq_status, irq_enabled;
277
278         irq_status = phy_read(phydev, RTL821x_INSR);
279         if (irq_status < 0) {
280                 phy_error(phydev);
281                 return IRQ_NONE;
282         }
283
284         irq_enabled = phy_read(phydev, RTL821x_INER);
285         if (irq_enabled < 0) {
286                 phy_error(phydev);
287                 return IRQ_NONE;
288         }
289
290         if (!(irq_status & irq_enabled))
291                 return IRQ_NONE;
292
293         phy_trigger_machine(phydev);
294
295         return IRQ_HANDLED;
296 }
297
298 static irqreturn_t rtl8211f_handle_interrupt(struct phy_device *phydev)
299 {
300         int irq_status;
301
302         irq_status = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
303         if (irq_status < 0) {
304                 phy_error(phydev);
305                 return IRQ_NONE;
306         }
307
308         if (!(irq_status & RTL8211F_INER_LINK_STATUS))
309                 return IRQ_NONE;
310
311         phy_trigger_machine(phydev);
312
313         return IRQ_HANDLED;
314 }
315
316 static int rtl8211_config_aneg(struct phy_device *phydev)
317 {
318         int ret;
319
320         ret = genphy_config_aneg(phydev);
321         if (ret < 0)
322                 return ret;
323
324         /* Quirk was copied from vendor driver. Unfortunately it includes no
325          * description of the magic numbers.
326          */
327         if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
328                 phy_write(phydev, 0x17, 0x2138);
329                 phy_write(phydev, 0x0e, 0x0260);
330         } else {
331                 phy_write(phydev, 0x17, 0x2108);
332                 phy_write(phydev, 0x0e, 0x0000);
333         }
334
335         return 0;
336 }
337
338 static int rtl8211c_config_init(struct phy_device *phydev)
339 {
340         /* RTL8211C has an issue when operating in Gigabit slave mode */
341         return phy_set_bits(phydev, MII_CTRL1000,
342                             CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
343 }
344
345 static int rtl8211f_config_init(struct phy_device *phydev)
346 {
347         struct rtl821x_priv *priv = phydev->priv;
348         struct device *dev = &phydev->mdio.dev;
349         u16 val_txdly, val_rxdly;
350         int ret;
351
352         ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1,
353                                        RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF,
354                                        priv->phycr1);
355         if (ret < 0) {
356                 dev_err(dev, "aldps mode  configuration failed: %pe\n",
357                         ERR_PTR(ret));
358                 return ret;
359         }
360
361         switch (phydev->interface) {
362         case PHY_INTERFACE_MODE_RGMII:
363                 val_txdly = 0;
364                 val_rxdly = 0;
365                 break;
366
367         case PHY_INTERFACE_MODE_RGMII_RXID:
368                 val_txdly = 0;
369                 val_rxdly = RTL8211F_RX_DELAY;
370                 break;
371
372         case PHY_INTERFACE_MODE_RGMII_TXID:
373                 val_txdly = RTL8211F_TX_DELAY;
374                 val_rxdly = 0;
375                 break;
376
377         case PHY_INTERFACE_MODE_RGMII_ID:
378                 val_txdly = RTL8211F_TX_DELAY;
379                 val_rxdly = RTL8211F_RX_DELAY;
380                 break;
381
382         default: /* the rest of the modes imply leaving delay as is. */
383                 return 0;
384         }
385
386         ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
387                                        val_txdly);
388         if (ret < 0) {
389                 dev_err(dev, "Failed to update the TX delay register\n");
390                 return ret;
391         } else if (ret) {
392                 dev_dbg(dev,
393                         "%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
394                         val_txdly ? "Enabling" : "Disabling");
395         } else {
396                 dev_dbg(dev,
397                         "2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
398                         val_txdly ? "enabled" : "disabled");
399         }
400
401         ret = phy_modify_paged_changed(phydev, 0xd08, 0x15, RTL8211F_RX_DELAY,
402                                        val_rxdly);
403         if (ret < 0) {
404                 dev_err(dev, "Failed to update the RX delay register\n");
405                 return ret;
406         } else if (ret) {
407                 dev_dbg(dev,
408                         "%s 2ns RX delay (and changing the value from pin-strapping RXD0 or the bootloader)\n",
409                         val_rxdly ? "Enabling" : "Disabling");
410         } else {
411                 dev_dbg(dev,
412                         "2ns RX delay was already %s (by pin-strapping RXD0 or bootloader configuration)\n",
413                         val_rxdly ? "enabled" : "disabled");
414         }
415
416         if (priv->has_phycr2) {
417                 ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
418                                        RTL8211F_CLKOUT_EN, priv->phycr2);
419                 if (ret < 0) {
420                         dev_err(dev, "clkout configuration failed: %pe\n",
421                                 ERR_PTR(ret));
422                         return ret;
423                 }
424
425                 return genphy_soft_reset(phydev);
426         }
427
428         return 0;
429 }
430
431 static int rtl821x_suspend(struct phy_device *phydev)
432 {
433         struct rtl821x_priv *priv = phydev->priv;
434         int ret = 0;
435
436         if (!phydev->wol_enabled) {
437                 ret = genphy_suspend(phydev);
438
439                 if (ret)
440                         return ret;
441
442                 clk_disable_unprepare(priv->clk);
443         }
444
445         return ret;
446 }
447
448 static int rtl821x_resume(struct phy_device *phydev)
449 {
450         struct rtl821x_priv *priv = phydev->priv;
451         int ret;
452
453         if (!phydev->wol_enabled)
454                 clk_prepare_enable(priv->clk);
455
456         ret = genphy_resume(phydev);
457         if (ret < 0)
458                 return ret;
459
460         msleep(20);
461
462         return 0;
463 }
464
465 static int rtl8211e_config_init(struct phy_device *phydev)
466 {
467         int ret = 0, oldpage;
468         u16 val;
469
470         /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
471         switch (phydev->interface) {
472         case PHY_INTERFACE_MODE_RGMII:
473                 val = RTL8211E_CTRL_DELAY | 0;
474                 break;
475         case PHY_INTERFACE_MODE_RGMII_ID:
476                 val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
477                 break;
478         case PHY_INTERFACE_MODE_RGMII_RXID:
479                 val = RTL8211E_CTRL_DELAY | RTL8211E_RX_DELAY;
480                 break;
481         case PHY_INTERFACE_MODE_RGMII_TXID:
482                 val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY;
483                 break;
484         default: /* the rest of the modes imply leaving delays as is. */
485                 return 0;
486         }
487
488         /* According to a sample driver there is a 0x1c config register on the
489          * 0xa4 extension page (0x7) layout. It can be used to disable/enable
490          * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins.
491          * The configuration register definition:
492          * 14 = reserved
493          * 13 = Force Tx RX Delay controlled by bit12 bit11,
494          * 12 = RX Delay, 11 = TX Delay
495          * 10:0 = Test && debug settings reserved by realtek
496          */
497         oldpage = phy_select_page(phydev, 0x7);
498         if (oldpage < 0)
499                 goto err_restore_page;
500
501         ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
502         if (ret)
503                 goto err_restore_page;
504
505         ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY
506                            | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
507                            val);
508
509 err_restore_page:
510         return phy_restore_page(phydev, oldpage, ret);
511 }
512
513 static int rtl8211b_suspend(struct phy_device *phydev)
514 {
515         phy_write(phydev, MII_MMD_DATA, BIT(9));
516
517         return genphy_suspend(phydev);
518 }
519
520 static int rtl8211b_resume(struct phy_device *phydev)
521 {
522         phy_write(phydev, MII_MMD_DATA, 0);
523
524         return genphy_resume(phydev);
525 }
526
527 static int rtl8366rb_config_init(struct phy_device *phydev)
528 {
529         int ret;
530
531         ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
532                            RTL8366RB_POWER_SAVE_ON);
533         if (ret) {
534                 dev_err(&phydev->mdio.dev,
535                         "error enabling power management\n");
536         }
537
538         return ret;
539 }
540
541 /* get actual speed to cover the downshift case */
542 static int rtlgen_get_speed(struct phy_device *phydev)
543 {
544         int val;
545
546         if (!phydev->link)
547                 return 0;
548
549         val = phy_read_paged(phydev, 0xa43, 0x12);
550         if (val < 0)
551                 return val;
552
553         switch (val & RTLGEN_SPEED_MASK) {
554         case 0x0000:
555                 phydev->speed = SPEED_10;
556                 break;
557         case 0x0010:
558                 phydev->speed = SPEED_100;
559                 break;
560         case 0x0020:
561                 phydev->speed = SPEED_1000;
562                 break;
563         case 0x0200:
564                 phydev->speed = SPEED_10000;
565                 break;
566         case 0x0210:
567                 phydev->speed = SPEED_2500;
568                 break;
569         case 0x0220:
570                 phydev->speed = SPEED_5000;
571                 break;
572         default:
573                 break;
574         }
575
576         return 0;
577 }
578
579 static int rtlgen_read_status(struct phy_device *phydev)
580 {
581         int ret;
582
583         ret = genphy_read_status(phydev);
584         if (ret < 0)
585                 return ret;
586
587         return rtlgen_get_speed(phydev);
588 }
589
590 static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
591 {
592         int ret;
593
594         if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
595                 rtl821x_write_page(phydev, 0xa5c);
596                 ret = __phy_read(phydev, 0x12);
597                 rtl821x_write_page(phydev, 0);
598         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
599                 rtl821x_write_page(phydev, 0xa5d);
600                 ret = __phy_read(phydev, 0x10);
601                 rtl821x_write_page(phydev, 0);
602         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
603                 rtl821x_write_page(phydev, 0xa5d);
604                 ret = __phy_read(phydev, 0x11);
605                 rtl821x_write_page(phydev, 0);
606         } else {
607                 ret = -EOPNOTSUPP;
608         }
609
610         return ret;
611 }
612
613 static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
614                             u16 val)
615 {
616         int ret;
617
618         if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
619                 rtl821x_write_page(phydev, 0xa5d);
620                 ret = __phy_write(phydev, 0x10, val);
621                 rtl821x_write_page(phydev, 0);
622         } else {
623                 ret = -EOPNOTSUPP;
624         }
625
626         return ret;
627 }
628
629 static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
630 {
631         int ret = rtlgen_read_mmd(phydev, devnum, regnum);
632
633         if (ret != -EOPNOTSUPP)
634                 return ret;
635
636         if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
637                 rtl821x_write_page(phydev, 0xa6e);
638                 ret = __phy_read(phydev, 0x16);
639                 rtl821x_write_page(phydev, 0);
640         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
641                 rtl821x_write_page(phydev, 0xa6d);
642                 ret = __phy_read(phydev, 0x12);
643                 rtl821x_write_page(phydev, 0);
644         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
645                 rtl821x_write_page(phydev, 0xa6d);
646                 ret = __phy_read(phydev, 0x10);
647                 rtl821x_write_page(phydev, 0);
648         }
649
650         return ret;
651 }
652
653 static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
654                              u16 val)
655 {
656         int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
657
658         if (ret != -EOPNOTSUPP)
659                 return ret;
660
661         if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
662                 rtl821x_write_page(phydev, 0xa6d);
663                 ret = __phy_write(phydev, 0x12, val);
664                 rtl821x_write_page(phydev, 0);
665         }
666
667         return ret;
668 }
669
670 static int rtl822x_get_features(struct phy_device *phydev)
671 {
672         int val;
673
674         val = phy_read_paged(phydev, 0xa61, 0x13);
675         if (val < 0)
676                 return val;
677
678         linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
679                          phydev->supported, val & RTL_SUPPORTS_2500FULL);
680         linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
681                          phydev->supported, val & RTL_SUPPORTS_5000FULL);
682         linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
683                          phydev->supported, val & RTL_SUPPORTS_10000FULL);
684
685         return genphy_read_abilities(phydev);
686 }
687
688 static int rtl822x_config_aneg(struct phy_device *phydev)
689 {
690         int ret = 0;
691
692         if (phydev->autoneg == AUTONEG_ENABLE) {
693                 u16 adv2500 = 0;
694
695                 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
696                                       phydev->advertising))
697                         adv2500 = RTL_ADV_2500FULL;
698
699                 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
700                                                RTL_ADV_2500FULL, adv2500);
701                 if (ret < 0)
702                         return ret;
703         }
704
705         return __genphy_config_aneg(phydev, ret);
706 }
707
708 static int rtl822x_read_status(struct phy_device *phydev)
709 {
710         int ret;
711
712         if (phydev->autoneg == AUTONEG_ENABLE) {
713                 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
714
715                 if (lpadv < 0)
716                         return lpadv;
717
718                 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
719                         phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
720                 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
721                         phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
722                 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
723                         phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
724         }
725
726         ret = genphy_read_status(phydev);
727         if (ret < 0)
728                 return ret;
729
730         return rtlgen_get_speed(phydev);
731 }
732
733 static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
734 {
735         int val;
736
737         phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
738         val = phy_read(phydev, 0x13);
739         phy_write(phydev, RTL821x_PAGE_SELECT, 0);
740
741         return val >= 0 && val & RTL_SUPPORTS_2500FULL;
742 }
743
744 static int rtlgen_match_phy_device(struct phy_device *phydev)
745 {
746         return phydev->phy_id == RTL_GENERIC_PHYID &&
747                !rtlgen_supports_2_5gbps(phydev);
748 }
749
750 static int rtl8226_match_phy_device(struct phy_device *phydev)
751 {
752         return phydev->phy_id == RTL_GENERIC_PHYID &&
753                rtlgen_supports_2_5gbps(phydev);
754 }
755
756 static int rtlgen_resume(struct phy_device *phydev)
757 {
758         int ret = genphy_resume(phydev);
759
760         /* Internal PHY's from RTL8168h up may not be instantly ready */
761         msleep(20);
762
763         return ret;
764 }
765
766 static int rtl9000a_config_init(struct phy_device *phydev)
767 {
768         phydev->autoneg = AUTONEG_DISABLE;
769         phydev->speed = SPEED_100;
770         phydev->duplex = DUPLEX_FULL;
771
772         return 0;
773 }
774
775 static int rtl9000a_config_aneg(struct phy_device *phydev)
776 {
777         int ret;
778         u16 ctl = 0;
779
780         switch (phydev->master_slave_set) {
781         case MASTER_SLAVE_CFG_MASTER_FORCE:
782                 ctl |= CTL1000_AS_MASTER;
783                 break;
784         case MASTER_SLAVE_CFG_SLAVE_FORCE:
785                 break;
786         case MASTER_SLAVE_CFG_UNKNOWN:
787         case MASTER_SLAVE_CFG_UNSUPPORTED:
788                 return 0;
789         default:
790                 phydev_warn(phydev, "Unsupported Master/Slave mode\n");
791                 return -EOPNOTSUPP;
792         }
793
794         ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl);
795         if (ret == 1)
796                 ret = genphy_soft_reset(phydev);
797
798         return ret;
799 }
800
801 static int rtl9000a_read_status(struct phy_device *phydev)
802 {
803         int ret;
804
805         phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
806         phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
807
808         ret = genphy_update_link(phydev);
809         if (ret)
810                 return ret;
811
812         ret = phy_read(phydev, MII_CTRL1000);
813         if (ret < 0)
814                 return ret;
815         if (ret & CTL1000_AS_MASTER)
816                 phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
817         else
818                 phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
819
820         ret = phy_read(phydev, MII_STAT1000);
821         if (ret < 0)
822                 return ret;
823         if (ret & LPA_1000MSRES)
824                 phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
825         else
826                 phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
827
828         return 0;
829 }
830
831 static int rtl9000a_ack_interrupt(struct phy_device *phydev)
832 {
833         int err;
834
835         err = phy_read(phydev, RTL8211F_INSR);
836
837         return (err < 0) ? err : 0;
838 }
839
840 static int rtl9000a_config_intr(struct phy_device *phydev)
841 {
842         u16 val;
843         int err;
844
845         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
846                 err = rtl9000a_ack_interrupt(phydev);
847                 if (err)
848                         return err;
849
850                 val = (u16)~RTL9000A_GINMR_LINK_STATUS;
851                 err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
852         } else {
853                 val = ~0;
854                 err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
855                 if (err)
856                         return err;
857
858                 err = rtl9000a_ack_interrupt(phydev);
859         }
860
861         return phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
862 }
863
864 static irqreturn_t rtl9000a_handle_interrupt(struct phy_device *phydev)
865 {
866         int irq_status;
867
868         irq_status = phy_read(phydev, RTL8211F_INSR);
869         if (irq_status < 0) {
870                 phy_error(phydev);
871                 return IRQ_NONE;
872         }
873
874         if (!(irq_status & RTL8211F_INER_LINK_STATUS))
875                 return IRQ_NONE;
876
877         phy_trigger_machine(phydev);
878
879         return IRQ_HANDLED;
880 }
881
882 static struct phy_driver realtek_drvs[] = {
883         {
884                 PHY_ID_MATCH_EXACT(0x00008201),
885                 .name           = "RTL8201CP Ethernet",
886                 .read_page      = rtl821x_read_page,
887                 .write_page     = rtl821x_write_page,
888         }, {
889                 PHY_ID_MATCH_EXACT(0x001cc816),
890                 .name           = "RTL8201F Fast Ethernet",
891                 .config_intr    = &rtl8201_config_intr,
892                 .handle_interrupt = rtl8201_handle_interrupt,
893                 .suspend        = genphy_suspend,
894                 .resume         = genphy_resume,
895                 .read_page      = rtl821x_read_page,
896                 .write_page     = rtl821x_write_page,
897         }, {
898                 PHY_ID_MATCH_MODEL(0x001cc880),
899                 .name           = "RTL8208 Fast Ethernet",
900                 .read_mmd       = genphy_read_mmd_unsupported,
901                 .write_mmd      = genphy_write_mmd_unsupported,
902                 .suspend        = genphy_suspend,
903                 .resume         = genphy_resume,
904                 .read_page      = rtl821x_read_page,
905                 .write_page     = rtl821x_write_page,
906         }, {
907                 PHY_ID_MATCH_EXACT(0x001cc910),
908                 .name           = "RTL8211 Gigabit Ethernet",
909                 .config_aneg    = rtl8211_config_aneg,
910                 .read_mmd       = &genphy_read_mmd_unsupported,
911                 .write_mmd      = &genphy_write_mmd_unsupported,
912                 .read_page      = rtl821x_read_page,
913                 .write_page     = rtl821x_write_page,
914         }, {
915                 PHY_ID_MATCH_EXACT(0x001cc912),
916                 .name           = "RTL8211B Gigabit Ethernet",
917                 .config_intr    = &rtl8211b_config_intr,
918                 .handle_interrupt = rtl821x_handle_interrupt,
919                 .read_mmd       = &genphy_read_mmd_unsupported,
920                 .write_mmd      = &genphy_write_mmd_unsupported,
921                 .suspend        = rtl8211b_suspend,
922                 .resume         = rtl8211b_resume,
923                 .read_page      = rtl821x_read_page,
924                 .write_page     = rtl821x_write_page,
925         }, {
926                 PHY_ID_MATCH_EXACT(0x001cc913),
927                 .name           = "RTL8211C Gigabit Ethernet",
928                 .config_init    = rtl8211c_config_init,
929                 .read_mmd       = &genphy_read_mmd_unsupported,
930                 .write_mmd      = &genphy_write_mmd_unsupported,
931                 .read_page      = rtl821x_read_page,
932                 .write_page     = rtl821x_write_page,
933         }, {
934                 PHY_ID_MATCH_EXACT(0x001cc914),
935                 .name           = "RTL8211DN Gigabit Ethernet",
936                 .config_intr    = rtl8211e_config_intr,
937                 .handle_interrupt = rtl821x_handle_interrupt,
938                 .suspend        = genphy_suspend,
939                 .resume         = genphy_resume,
940                 .read_page      = rtl821x_read_page,
941                 .write_page     = rtl821x_write_page,
942         }, {
943                 PHY_ID_MATCH_EXACT(0x001cc915),
944                 .name           = "RTL8211E Gigabit Ethernet",
945                 .config_init    = &rtl8211e_config_init,
946                 .config_intr    = &rtl8211e_config_intr,
947                 .handle_interrupt = rtl821x_handle_interrupt,
948                 .suspend        = genphy_suspend,
949                 .resume         = genphy_resume,
950                 .read_page      = rtl821x_read_page,
951                 .write_page     = rtl821x_write_page,
952         }, {
953                 PHY_ID_MATCH_EXACT(0x001cc916),
954                 .name           = "RTL8211F Gigabit Ethernet",
955                 .probe          = rtl821x_probe,
956                 .config_init    = &rtl8211f_config_init,
957                 .read_status    = rtlgen_read_status,
958                 .config_intr    = &rtl8211f_config_intr,
959                 .handle_interrupt = rtl8211f_handle_interrupt,
960                 .suspend        = rtl821x_suspend,
961                 .resume         = rtl821x_resume,
962                 .read_page      = rtl821x_read_page,
963                 .write_page     = rtl821x_write_page,
964                 .flags          = PHY_ALWAYS_CALL_SUSPEND,
965         }, {
966                 PHY_ID_MATCH_EXACT(RTL_8211FVD_PHYID),
967                 .name           = "RTL8211F-VD Gigabit Ethernet",
968                 .probe          = rtl821x_probe,
969                 .config_init    = &rtl8211f_config_init,
970                 .read_status    = rtlgen_read_status,
971                 .config_intr    = &rtl8211f_config_intr,
972                 .handle_interrupt = rtl8211f_handle_interrupt,
973                 .suspend        = rtl821x_suspend,
974                 .resume         = rtl821x_resume,
975                 .read_page      = rtl821x_read_page,
976                 .write_page     = rtl821x_write_page,
977                 .flags          = PHY_ALWAYS_CALL_SUSPEND,
978         }, {
979                 .name           = "Generic FE-GE Realtek PHY",
980                 .match_phy_device = rtlgen_match_phy_device,
981                 .read_status    = rtlgen_read_status,
982                 .suspend        = genphy_suspend,
983                 .resume         = rtlgen_resume,
984                 .read_page      = rtl821x_read_page,
985                 .write_page     = rtl821x_write_page,
986                 .read_mmd       = rtlgen_read_mmd,
987                 .write_mmd      = rtlgen_write_mmd,
988         }, {
989                 .name           = "RTL8226 2.5Gbps PHY",
990                 .match_phy_device = rtl8226_match_phy_device,
991                 .get_features   = rtl822x_get_features,
992                 .config_aneg    = rtl822x_config_aneg,
993                 .read_status    = rtl822x_read_status,
994                 .suspend        = genphy_suspend,
995                 .resume         = rtlgen_resume,
996                 .read_page      = rtl821x_read_page,
997                 .write_page     = rtl821x_write_page,
998                 .read_mmd       = rtl822x_read_mmd,
999                 .write_mmd      = rtl822x_write_mmd,
1000         }, {
1001                 PHY_ID_MATCH_EXACT(0x001cc840),
1002                 .name           = "RTL8226B_RTL8221B 2.5Gbps PHY",
1003                 .get_features   = rtl822x_get_features,
1004                 .config_aneg    = rtl822x_config_aneg,
1005                 .read_status    = rtl822x_read_status,
1006                 .suspend        = genphy_suspend,
1007                 .resume         = rtlgen_resume,
1008                 .read_page      = rtl821x_read_page,
1009                 .write_page     = rtl821x_write_page,
1010                 .read_mmd       = rtl822x_read_mmd,
1011                 .write_mmd      = rtl822x_write_mmd,
1012         }, {
1013                 PHY_ID_MATCH_EXACT(0x001cc838),
1014                 .name           = "RTL8226-CG 2.5Gbps PHY",
1015                 .get_features   = rtl822x_get_features,
1016                 .config_aneg    = rtl822x_config_aneg,
1017                 .read_status    = rtl822x_read_status,
1018                 .suspend        = genphy_suspend,
1019                 .resume         = rtlgen_resume,
1020                 .read_page      = rtl821x_read_page,
1021                 .write_page     = rtl821x_write_page,
1022         }, {
1023                 PHY_ID_MATCH_EXACT(0x001cc848),
1024                 .name           = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
1025                 .get_features   = rtl822x_get_features,
1026                 .config_aneg    = rtl822x_config_aneg,
1027                 .read_status    = rtl822x_read_status,
1028                 .suspend        = genphy_suspend,
1029                 .resume         = rtlgen_resume,
1030                 .read_page      = rtl821x_read_page,
1031                 .write_page     = rtl821x_write_page,
1032         }, {
1033                 PHY_ID_MATCH_EXACT(0x001cc849),
1034                 .name           = "RTL8221B-VB-CG 2.5Gbps PHY",
1035                 .get_features   = rtl822x_get_features,
1036                 .config_aneg    = rtl822x_config_aneg,
1037                 .read_status    = rtl822x_read_status,
1038                 .suspend        = genphy_suspend,
1039                 .resume         = rtlgen_resume,
1040                 .read_page      = rtl821x_read_page,
1041                 .write_page     = rtl821x_write_page,
1042         }, {
1043                 PHY_ID_MATCH_EXACT(0x001cc84a),
1044                 .name           = "RTL8221B-VM-CG 2.5Gbps PHY",
1045                 .get_features   = rtl822x_get_features,
1046                 .config_aneg    = rtl822x_config_aneg,
1047                 .read_status    = rtl822x_read_status,
1048                 .suspend        = genphy_suspend,
1049                 .resume         = rtlgen_resume,
1050                 .read_page      = rtl821x_read_page,
1051                 .write_page     = rtl821x_write_page,
1052         }, {
1053                 PHY_ID_MATCH_EXACT(0x001cc961),
1054                 .name           = "RTL8366RB Gigabit Ethernet",
1055                 .config_init    = &rtl8366rb_config_init,
1056                 /* These interrupts are handled by the irq controller
1057                  * embedded inside the RTL8366RB, they get unmasked when the
1058                  * irq is requested and ACKed by reading the status register,
1059                  * which is done by the irqchip code.
1060                  */
1061                 .config_intr    = genphy_no_config_intr,
1062                 .handle_interrupt = genphy_handle_interrupt_no_ack,
1063                 .suspend        = genphy_suspend,
1064                 .resume         = genphy_resume,
1065         }, {
1066                 PHY_ID_MATCH_EXACT(0x001ccb00),
1067                 .name           = "RTL9000AA_RTL9000AN Ethernet",
1068                 .features       = PHY_BASIC_T1_FEATURES,
1069                 .config_init    = rtl9000a_config_init,
1070                 .config_aneg    = rtl9000a_config_aneg,
1071                 .read_status    = rtl9000a_read_status,
1072                 .config_intr    = rtl9000a_config_intr,
1073                 .handle_interrupt = rtl9000a_handle_interrupt,
1074                 .suspend        = genphy_suspend,
1075                 .resume         = genphy_resume,
1076                 .read_page      = rtl821x_read_page,
1077                 .write_page     = rtl821x_write_page,
1078         }, {
1079                 PHY_ID_MATCH_EXACT(0x001cc942),
1080                 .name           = "RTL8365MB-VC Gigabit Ethernet",
1081                 /* Interrupt handling analogous to RTL8366RB */
1082                 .config_intr    = genphy_no_config_intr,
1083                 .handle_interrupt = genphy_handle_interrupt_no_ack,
1084                 .suspend        = genphy_suspend,
1085                 .resume         = genphy_resume,
1086         },
1087 };
1088
1089 module_phy_driver(realtek_drvs);
1090
1091 static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
1092         { PHY_ID_MATCH_VENDOR(0x001cc800) },
1093         { }
1094 };
1095
1096 MODULE_DEVICE_TABLE(mdio, realtek_tbl);